- vlib_buffer_advance (p, sizeof (*ip4) - sizeof (*ip6));
- ip6 = vlib_buffer_get_current (p);
+ if (PREDICT_FALSE (ip4->flags_and_fragment_offset &
+ clib_host_to_net_u16 (IP4_HEADER_FLAG_MORE_FRAGMENTS)))
+ {
+ vlib_buffer_advance (p, sizeof (*ip4) - sizeof (*ip6) -
+ sizeof (*outer_frag));
+ ip6 = vlib_buffer_get_current (p);
+ outer_frag = (ip6_frag_hdr_t *) (ip6 + 1);
+ outer_frag_id = frag_id_4to6 (ip4->fragment_id);
+ }
+ else
+ {
+ vlib_buffer_advance (p, sizeof (*ip4) - sizeof (*ip6));
+ ip6 = vlib_buffer_get_current (p);
+ }