Skip to content

Commit

Permalink
netdev-linux: double tagged packets should use 0x88a8
Browse files Browse the repository at this point in the history
We need to check if a packet is double tagged. If so make sure to push
0x88a8 instead of 0x8100. Without this a simple port redirect of 802.1ad
frames means the outer tag gets translated from 0x88a8 to 0x8100 by the
userspace datapath.

This only affected kernels that don't use TP_STATUS_VLAN_TPID_VALID,
which is kernels < 3.14.

Signed-off-by: Eric Garver <e@erig.me>
Signed-off-by: Ben Pfaff <blp@ovn.org>
  • Loading branch information
erig0 authored and blp committed Oct 4, 2016
1 parent 47d5c1e commit 1ebdc7e
Showing 1 changed file with 11 additions and 3 deletions.
14 changes: 11 additions & 3 deletions lib/netdev-linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -995,12 +995,14 @@ netdev_linux_rxq_dealloc(struct netdev_rxq *rxq_)
}

static ovs_be16
auxdata_to_vlan_tpid(const struct tpacket_auxdata *aux)
auxdata_to_vlan_tpid(const struct tpacket_auxdata *aux, bool double_tagged)
{
if (aux->tp_status & TP_STATUS_VLAN_TPID_VALID) {
return htons(aux->tp_vlan_tpid);
} else if (double_tagged) {
return htons(ETH_TYPE_VLAN_8021AD);
} else {
return htons(ETH_TYPE_VLAN);
return htons(ETH_TYPE_VLAN_8021Q);
}
}

Expand Down Expand Up @@ -1060,11 +1062,17 @@ netdev_linux_rxq_recv_sock(int fd, struct dp_packet *buffer)

aux = ALIGNED_CAST(struct tpacket_auxdata *, CMSG_DATA(cmsg));
if (auxdata_has_vlan_tci(aux)) {
struct eth_header *eth;
bool double_tagged;

if (retval < ETH_HEADER_LEN) {
return EINVAL;
}

eth_push_vlan(buffer, auxdata_to_vlan_tpid(aux),
eth = dp_packet_data(buffer);
double_tagged = eth->eth_type == htons(ETH_TYPE_VLAN_8021Q);

eth_push_vlan(buffer, auxdata_to_vlan_tpid(aux, double_tagged),
htons(aux->tp_vlan_tci));
break;
}
Expand Down

0 comments on commit 1ebdc7e

Please sign in to comment.