{
ip6_address_t src;
ip6_address_t dst;
- // align by making this 4 octets even though its a 2 octets field
u32 xx_id;
- // align by making this 4 octets even though its a 2 octets field
u32 frag_id;
- // align by making this 4 octets even though its a 1 octet field
- u32 proto;
- u32 unused;
+ u8 unused[7];
+ u8 proto;
};
u64 as_u64[6];
};
int consumed = 0;
vlib_buffer_t *fb = vlib_get_buffer (vm, *bi0);
vnet_buffer_opaque_t *fvnb = vnet_buffer (fb);
+ reass->next_index = fvnb->ip.reass.next_index; // store next_index before it's overwritten
fvnb->ip.reass.ip6_frag_hdr_offset =
(u8 *) frag_hdr - (u8 *) vlib_buffer_get_current (fb);
ip6_header_t *fip = vlib_buffer_get_current (fb);
(u8 *) frag_hdr - (u8 *) ip0;
ip6_reass_key_t k;
- k.src.as_u64[0] = ip0->src_address.as_u64[0];
- k.src.as_u64[1] = ip0->src_address.as_u64[1];
- k.dst.as_u64[0] = ip0->dst_address.as_u64[0];
- k.dst.as_u64[1] = ip0->dst_address.as_u64[1];
- k.xx_id = vnet_buffer (b0)->sw_if_index[VLIB_RX];
- k.frag_id = frag_hdr->identification;
- k.proto = ip0->protocol;
- k.unused = 0;
+ k.as_u64[0] = ip0->src_address.as_u64[0];
+ k.as_u64[1] = ip0->src_address.as_u64[1];
+ k.as_u64[2] = ip0->dst_address.as_u64[0];
+ k.as_u64[3] = ip0->dst_address.as_u64[1];
+ k.as_u64[4] =
+ (u64) vnet_buffer (b0)->
+ sw_if_index[VLIB_RX] << 32 | frag_hdr->identification;
+ k.as_u64[5] = ip0->protocol;
ip6_reass_t *reass =
ip6_reass_find_or_create (vm, node, rm, rt, &k, &icmp_bi,
&vec_timeout);
n_left_to_next -= 1;
if (is_feature && IP6_ERROR_NONE == error0)
{
- vnet_feature_next (vnet_buffer (b0)->sw_if_index[VLIB_RX],
- &next0, b0);
+ b0 = vlib_get_buffer (vm, bi0);
+ vnet_feature_next (&next0, b0);
}
vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
n_left_to_next, bi0, next0);
to_next += 1;
n_left_to_next -= 1;
}
- f->flags |= (trace_frame * VLIB_FRAME_TRACE);
+ f->frame_flags |= (trace_frame * VLIB_FRAME_TRACE);
vlib_put_frame_to_node (vm, rm->ip6_drop_idx, f);
}
to_next += 1;
n_left_to_next -= 1;
}
- f->flags |= (trace_frame * VLIB_FRAME_TRACE);
+ f->frame_flags |= (trace_frame * VLIB_FRAME_TRACE);
vlib_put_frame_to_node (vm, rm->ip6_icmp_error_idx, f);
}