Welcome! Log In Create A New Profile

Advanced

"IPV6 header not found" error in syslog for double vlan tagged ICMP6 packets

Posted by apoz 
"IPV6 header not found" error in syslog for double vlan tagged ICMP6 packets
August 17, 2017 07:32AM
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, 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 packets.

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"winking smiley;
    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 and tried to investigate further the issue, tracing with systemtap the function printing the value of the params in the function call.

The stap program I used:

probe kernel.statement("*@net/ipv6/exthdrs_core.c:200"winking smiley {
        printf("Function call %s -> %s\n", thread_indent(1), ppfunc());
	      printf("%s\n", $$parms$);
        printf("%s\n",$$locals$$);
        printf("\nIP6->%s\n",$_ip6$$)
    }


The result is the following:
Function call 1999283 vhost-38719(38729):   -> ipv6_find_hdr
_ip6={.priority=8, .version=4, .flow_lbl="...", .payload_len=34832, .nexthdr='\377', .hop_limit='\377', .saddr={.in6_u={.u6_addr8="F... ", .u6_addr16=[60998, ...], .u6_addr32=[2171792966, ...]}}, .daddr={.in6_u={.u6_addr8="#...", .u6_addr16=[35619, ...], .u6_addr32=[2171702051, ...]}}} ip6={.priority=?, .version=?, .flow_lbl=?, .payload_len=?, .nexthdr=?, .hop_limit=?, .saddr={.in6_u={.u6_addr8=?, .u6_addr16=[?, ...], .u6_addr32=[?, ...]}}, .daddr={.in6_u={.u6_addr8=?, .u6_addr16=[?, .

IP6->{.priority=8, .version=4, .flow_lbl="9... ", .payload_len=34832, .nexthdr='\377', .hop_limit='\377', .saddr={.in6_u={.u6_addr8="F... ", .u6_addr16=[60998, ...], .u6_addr32=[2171792966, ...]}}, .daddr={.in6_u={.u6_addr8="#....", .u6_addr16=[35619, ...], .u6_addr32=[2171702051, ...]}}}



It looks like the problem is in ipv6 header having version=4?
Has anyone experienced similar problem?

Any hint that could help me solve this issue would be really appreciated!

Thanks!
this seems to be a difficult issue and it's not as easy as paying for research papers here and would like to know whether you've found a solution
This is a difficult task, but write an essay on a topic gun control argumentative essay is not so easy too.
Hi there!
Cool post! Thank you for providing the information. Also, I found one good website that is called http://papers-land.com
Author:

Your Email:


Subject:


Spam prevention:
Please, solve the mathematical question and enter the answer in the input field below. This is for blocking bots that try to post this form automatically.
Question: how much is 15 plus 5?
Message: