af-packet: Add flag to distinguish VID 0 from no-vlan.
Currently, user-space cannot determine if a 0 tcp_vlan_tci means there is no VLAN tag or the VLAN ID was zero. Add flag to make this explicit. User-space can check for TP_STATUS_VLAN_VALID || tp_vlan_tci > 0, which will be backwards compatible. Older could would have just checked for tp_vlan_tci, so it will work no worse than before. Signed-off-by: Ben Greear <greearb@candelatech.com> Acked-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
41be5a4a36
commit
a3bcc23e89
@ -70,6 +70,7 @@ struct tpacket_auxdata {
|
||||
#define TP_STATUS_COPY 0x2
|
||||
#define TP_STATUS_LOSING 0x4
|
||||
#define TP_STATUS_CSUMNOTREADY 0x8
|
||||
#define TP_STATUS_VLAN_VALID 0x10 /* auxdata has valid tp_vlan_tci */
|
||||
|
||||
/* Tx ring - header status */
|
||||
#define TP_STATUS_AVAILABLE 0x0
|
||||
|
@ -798,7 +798,12 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
getnstimeofday(&ts);
|
||||
h.h2->tp_sec = ts.tv_sec;
|
||||
h.h2->tp_nsec = ts.tv_nsec;
|
||||
h.h2->tp_vlan_tci = vlan_tx_tag_get(skb);
|
||||
if (vlan_tx_tag_present(skb)) {
|
||||
h.h2->tp_vlan_tci = vlan_tx_tag_get(skb);
|
||||
status |= TP_STATUS_VLAN_VALID;
|
||||
} else {
|
||||
h.h2->tp_vlan_tci = 0;
|
||||
}
|
||||
hdrlen = sizeof(*h.h2);
|
||||
break;
|
||||
default:
|
||||
@ -1725,8 +1730,12 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
aux.tp_snaplen = skb->len;
|
||||
aux.tp_mac = 0;
|
||||
aux.tp_net = skb_network_offset(skb);
|
||||
aux.tp_vlan_tci = vlan_tx_tag_get(skb);
|
||||
|
||||
if (vlan_tx_tag_present(skb)) {
|
||||
aux.tp_vlan_tci = vlan_tx_tag_get(skb);
|
||||
aux.tp_status |= TP_STATUS_VLAN_VALID;
|
||||
} else {
|
||||
aux.tp_vlan_tci = 0;
|
||||
}
|
||||
put_cmsg(msg, SOL_PACKET, PACKET_AUXDATA, sizeof(aux), &aux);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user