Hi all,
I am facing some -I think- strange problem with IPV6 and QinQ in a Linux host, and may be someone has faced similar problem (or could provide a hint).
I have some VMs running in a host (KVM), and every time any VM sends an ICMP6 Router Advertisement, we get the following log in syslog:
Aug 10 11:18:36 Hostname kernel: [1722430.045240] IPv6 header not found
For the traffic, I use QinQ (802.1Q in both tags), the inner tag is set with OVS in the tap(or bridge, no difference), and the outer is set with a veth of vlan type, in the following way:
+-------------------------------------------------------+
| +-----------+ HOST |
| | | Unbuntu 16.04 |
| | VM-1 | 4.4.0-62-generic
| | | |
| +----+------+ |
| | |
| |TAG=1 |
| +-----------------------+ |
| | OVS | |
| +---------+-------------+ |
| | veth1.203 |
| | |
| | |
| +veth0 |
| +---------------------+ |
| | Bridge | |
| +-------+-------------+ |
| | |
| | |
| +--+----+ |
| |ens11f1| |
+-------------------------------------------------------+
'Regular traffic' (non ICMP6) seems to work fine, the problem happens apparently only with the Router Advertisement or Neighbour Discovery.
I checked the code writing that log, and I think it's in 'kernel/net/ipv6/exthdrs_core.c'
if (*offset) {
struct ipv6hdr _ip6, *ip6;
ip6 = skb_header_pointer(skb, *offset, sizeof(_ip6), &_ip6);
if (!ip6 || (ip6->version != 6)) {
printk(KERN_ERR "IPv6 header not found\n");
return -EBADMSG;
}
start = *offset + sizeof(struct ipv6hdr);
nexthdr = ip6->nexthdr;
}
but both the protocol and protocol version seem right in tcpdump:
11:28:38.675686 02:00:40:00:21:31 > 33:33:00:00:00:01, ethertype 802.1Q (0x8100), length 158: vlan 203, p 0, ethertype 802.1Q, vlan 49, p 0, ethertype IPv6, fe80::40ff:fe00:2131 > ff02::1: ICMP6, router advertisement, length 96
`....`:...........@...!1................... @...............@.!1..........@.... ........*.. ..!1................*.. ..!1............. '.
11:28:39.300076 02:00:40:00:23:2a > 33:33:00:00:00:01, ethertype 802.1Q (0x8100), length 158: vlan 204, p 0, ethertype 802.1Q, vlan 193, p 0, ethertype IPv6, fe80::40ff:fe00:232a > ff02::1: ICMP6, router advertisement, length 96
`....`:...........@...#*...................%@...............@.#*..........@.... ........*.. ..#*................*.. ..#*.............
I already disabled (just in case) all the offloading features in the ethernet card (Intel Corporation Ethernet Controller XL710 for 40GbE QSFP+ (rev 02)).
sysadmin@olnmpep02318n002:~/andres$ ethtool -k enp2s0f1
Features for enp2s0f1:
rx-checksumming: off
tx-checksumming: off
tx-checksum-ipv4: off
tx-checksum-ip-generic: off [fixed]
tx-checksum-ipv6: off
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off
scatter-gather: off
tx-scatter-gather: off
tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: off
tx-tcp-segmentation: off
tx-tcp-ecn-segmentation: off
tx-tcp6-segmentation: off
udp-fragmentation-offload: off [fixed]
generic-segmentation-offload: off [requested on]
generic-receive-offload: on
large-receive-offload: off [fixed]
rx-vlan-offload: off
tx-vlan-offload: off
ntuple-filters: on
receive-hashing: on
highdma: on
rx-vlan-filter: off
vlan-challenged: off [fixed]
tx-lockless: off [fixed]
netns-local: off [fixed]
tx-gso-robust: off [fixed]
tx-fcoe-segmentation: off [fixed]
tx-gre-segmentation: on
tx-ipip-segmentation: off [fixed]
tx-sit-segmentation: off [fixed]
tx-udp_tnl-segmentation: on
fcoe-mtu: off [fixed]
tx-nocache-copy: off
loopback: off [fixed]
rx-fcs: off [fixed]
rx-all: off [fixed]
tx-vlan-stag-hw-insert: off [fixed]
rx-vlan-stag-hw-parse: off [fixed]
rx-vlan-stag-filter: off [fixed]
l2-fwd-offload: off [fixed]
busy-poll: off [fixed]
hw-tc-offload: off [fixed]
Any help/hint is trully appreciated!
Regards,
Andrés