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
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.
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
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.