Skip to content

Instantly share code, notes, and snippets.

@apoz
Created August 24, 2018 06:58
Show Gist options
  • Save apoz/637a75d8c56e40111a8e9899bb1f9218 to your computer and use it in GitHub Desktop.
Save apoz/637a75d8c56e40111a8e9899bb1f9218 to your computer and use it in GitHub Desktop.
"IPV6 header not found" issue
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, 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.
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.
Questions:
Is there any way I can verify which packets are dropped? (which packets are causing the 'header not found' log)
Is QinQ supported in the kernel? Is there any config param I should change to enable?
Any hint what could be the reason? QinQ with ICMP6?
Any help/hint is trully appreciated!
Regards.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment