{
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];
};
else
{
pool_get (rt->pool, reass);
- memset (reass, 0, sizeof (*reass));
+ clib_memset (reass, 0, sizeof (*reass));
reass->id =
((u64) os_get_thread_index () * 1000000000) + rt->id_counter;
++rt->id_counter;
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);
#undef _
};
-always_inline uword
+static uword
ip6_reassembly (vlib_main_t * vm, vlib_node_runtime_t * node,
vlib_frame_t * frame)
{
VLIB_NODE_FUNCTION_MULTIARCH (ip6_reass_node, ip6_reassembly);
-always_inline uword
+static uword
ip6_reassembly_feature (vlib_main_t * vm,
vlib_node_runtime_t * node, vlib_frame_t * frame)
{
if (ip6_reass_main.max_reass_n > 0 && new_nbuckets > old_nbuckets)
{
clib_bihash_48_8_t new_hash;
- memset (&new_hash, 0, sizeof (new_hash));
+ clib_memset (&new_hash, 0, sizeof (new_hash));
ip6_rehash_cb_ctx ctx;
ctx.failure = 0;
ctx.new_hash = &new_hash;
else
{
clib_bihash_free_48_8 (&ip6_reass_main.hash);
- clib_memcpy (&ip6_reass_main.hash, &new_hash,
- sizeof (ip6_reass_main.hash));
+ clib_memcpy_fast (&ip6_reass_main.hash, &new_hash,
+ sizeof (ip6_reass_main.hash));
}
}
return 0;
rm->vlib_main = vm;
rm->vnet_main = vnet_get_main ();
- vec_validate (rm->per_thread_data, vlib_num_workers () + 1);
+ vec_validate (rm->per_thread_data, vlib_num_workers ());
ip6_reass_per_thread_t *rt;
vec_foreach (rt, rm->per_thread_data)
{
uword thread_index = 0;
int index;
- const uword nthreads = os_get_nthreads ();
+ const uword nthreads = vlib_num_workers () + 1;
u32 *vec_icmp_bi = NULL;
for (thread_index = 0; thread_index < nthreads; ++thread_index)
{
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);
}
u64 sum_buffers_n = 0;
ip6_reass_t *reass;
uword thread_index;
- const uword nthreads = os_get_nthreads ();
+ const uword nthreads = vlib_num_workers () + 1;
for (thread_index = 0; thread_index < nthreads; ++thread_index)
{
ip6_reass_per_thread_t *rt = &rm->per_thread_data[thread_index];