vlan missing with AF_PACKET and auxdata

4 messages, 2 authors, 2018-10-02 · open the first message on its own page

vlan missing with AF_PACKET and auxdata

From: Michael Walle <hidden>
Date: 2018-09-24 18:03:49

Hi,

I'm using the AF_PACKET socket with setsockopt(PACKET_AUXDATA) to get 
the incoming VLAN tag. Correct me if I'm wrong, but as far as I see the 
first VLAN tag is always stripped - either in hardware or in 
net/core/dev.c in __netif_receive_skb_core() - and stored in 
skb->vlan_tci. Therefore, it won't be in the packet data anymore.

If I use the socket with ETH_P_ALL as protocol, everything works as 
expected. But if I'm using an actual protocol number, instead of the 
catch all, the tp_vlan_tci field inside the auxdata will be zero. I've 
traced this to commit d4b812dea4a236f729526facf97df1a9d18e191c (vlan: 
mask vlan prio bits):

+       if (unlikely(vlan_tx_tag_present(skb))) {
+               if (vlan_tx_tag_get_id(skb))
+                       skb->pkt_type = PACKET_OTHERHOST;
+               /* Note: we might in the future use prio bits
+                * and set skb->priority like in vlan_do_receive()
+                * For the time being, just ignore Priority Code Point
+                */
+               skb->vlan_tci = 0;
+       }

The ptype_all callbacks (which are working as expected) are before this 
code and the ptype_specific callbacks (which are not working) are after 
this piece of code. I don't know it this is a bug or not, I guess it is 
one, at least from the AF_PACKET socket point of view. If not, how I'm 
supposed to get the original VLAN tag with socket(AF_PACKET, 
my_protocol)?

I also don't understand the commit (message) as the subject suggesets 
only the prio bits should be masked, but with "skb->vlan_tci = 0" 
everything is masked. Therefore, I've put the original (hopefully the 
mail addresses are still valid) authors in CC.

Thanks,
-michael

Re: vlan missing with AF_PACKET and auxdata

From: Jan Grashöfer <hidden>
Date: 2018-09-24 18:24:12

Hi Michael,

On 24/09/2018 14:01, Michael Walle wrote:
I'm using the AF_PACKET socket with setsockopt(PACKET_AUXDATA) to get 
the incoming VLAN tag. Correct me if I'm wrong, but as far as I see the 
first VLAN tag is always stripped - either in hardware or in 
net/core/dev.c in __netif_receive_skb_core() - and stored in 
skb->vlan_tci. Therefore, it won't be in the packet data anymore.
although the documentation says "SOCK_RAW packets are passed to and from 
the device driver without any changes in the packet data." [1] that's 
correct and was discussed here: 
https://www.spinics.net/lists/netdev/msg440313.html

Result of the discussion: Won't fix, too complicated.

Jan

[1] http://man7.org/linux/man-pages/man7/packet.7.html

Re: vlan missing with AF_PACKET and auxdata

From: Michael Walle <hidden>
Date: 2018-09-24 20:27:28

Am 2018-09-24 14:22, schrieb Jan Grashöfer:
Hi Michael,

On 24/09/2018 14:01, Michael Walle wrote:
quoted
I'm using the AF_PACKET socket with setsockopt(PACKET_AUXDATA) to get 
the incoming VLAN tag. Correct me if I'm wrong, but as far as I see 
the first VLAN tag is always stripped - either in hardware or in 
net/core/dev.c in __netif_receive_skb_core() - and stored in 
skb->vlan_tci. Therefore, it won't be in the packet data anymore.
although the documentation says "SOCK_RAW packets are passed to and
from the device driver without any changes in the packet data." [1]
that's correct and was discussed here:
https://www.spinics.net/lists/netdev/msg440313.html

Result of the discussion: Won't fix, too complicated.
Hi Jan,

thanks for the pointer. I'm fine with this decision, because the VLAN 
tag should be available through metadata. And this was my original 
question, because the metadata is only available in case of proto == 
ETH_P_ALL, but not for proto != ETH_P_ALL because of the commit in 
question.

-michael

Re: vlan missing with AF_PACKET and auxdata

From: Michael Walle <hidden>
Date: 2018-10-02 14:55:37

Am 2018-09-24 14:01, schrieb Michael Walle:
Hi,

I'm using the AF_PACKET socket with setsockopt(PACKET_AUXDATA) to get
the incoming VLAN tag. Correct me if I'm wrong, but as far as I see
the first VLAN tag is always stripped - either in hardware or in
net/core/dev.c in __netif_receive_skb_core() - and stored in
skb->vlan_tci. Therefore, it won't be in the packet data anymore.

If I use the socket with ETH_P_ALL as protocol, everything works as
expected. But if I'm using an actual protocol number, instead of the
catch all, the tp_vlan_tci field inside the auxdata will be zero. I've
traced this to commit d4b812dea4a236f729526facf97df1a9d18e191c (vlan:
mask vlan prio bits):

+       if (unlikely(vlan_tx_tag_present(skb))) {
+               if (vlan_tx_tag_get_id(skb))
+                       skb->pkt_type = PACKET_OTHERHOST;
+               /* Note: we might in the future use prio bits
+                * and set skb->priority like in vlan_do_receive()
+                * For the time being, just ignore Priority Code Point
+                */
+               skb->vlan_tci = 0;
+       }

The ptype_all callbacks (which are working as expected) are before
this code and the ptype_specific callbacks (which are not working) are
after this piece of code. I don't know it this is a bug or not, I
guess it is one, at least from the AF_PACKET socket point of view. If
not, how I'm supposed to get the original VLAN tag with
socket(AF_PACKET, my_protocol)?

I also don't understand the commit (message) as the subject suggesets
only the prio bits should be masked, but with "skb->vlan_tci = 0"
everything is masked. Therefore, I've put the original (hopefully the
mail addresses are still valid) authors in CC.
ping? :)

-michael
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help