u8 * do_handoff)
{
ip6_sv_reass_t *reass = NULL;
- f64 now = vlib_time_now (rm->vlib_main);
+ f64 now = vlib_time_now (vm);
- if (!clib_bihash_search_48_8
- (&rm->hash, (clib_bihash_kv_48_8_t *) kv, (clib_bihash_kv_48_8_t *) kv))
+ if (!clib_bihash_search_48_8 (&rm->hash, &kv->kv, &kv->kv))
{
if (vm->thread_index != kv->v.thread_index)
{
if (rt->reass_n >= rm->max_reass_n)
{
- reass = pool_elt_at_index (rt->pool, rt->lru_last);
+ reass = pool_elt_at_index (rt->pool, rt->lru_first);
ip6_sv_reass_free (vm, rm, rt, reass);
}
rt->lru_first = rt->lru_last = reass - rt->pool;
}
- reass->key.as_u64[0] = ((clib_bihash_kv_48_8_t *) kv)->key[0];
- reass->key.as_u64[1] = ((clib_bihash_kv_48_8_t *) kv)->key[1];
- reass->key.as_u64[2] = ((clib_bihash_kv_48_8_t *) kv)->key[2];
- reass->key.as_u64[3] = ((clib_bihash_kv_48_8_t *) kv)->key[3];
- reass->key.as_u64[4] = ((clib_bihash_kv_48_8_t *) kv)->key[4];
- reass->key.as_u64[5] = ((clib_bihash_kv_48_8_t *) kv)->key[5];
+ reass->key.as_u64[0] = kv->kv.key[0];
+ reass->key.as_u64[1] = kv->kv.key[1];
+ reass->key.as_u64[2] = kv->kv.key[2];
+ reass->key.as_u64[3] = kv->kv.key[3];
+ reass->key.as_u64[4] = kv->kv.key[4];
+ reass->key.as_u64[5] = kv->kv.key[5];
kv->v.reass_index = (reass - rt->pool);
kv->v.thread_index = vm->thread_index;
reass->last_heard = now;
- if (clib_bihash_add_del_48_8 (&rm->hash, (clib_bihash_kv_48_8_t *) kv, 1))
+ if (clib_bihash_add_del_48_8 (&rm->hash, &kv->kv, 1))
{
ip6_sv_reass_free (vm, rm, rt, reass);
reass = NULL;
&(vnet_buffer (b0)->ip.reass.tcp_seq_number)))
{
error0 = IP6_ERROR_REASS_UNSUPP_IP_PROTO;
+ b0->error = node->errors[error0];
next0 = IP6_SV_REASSEMBLY_NEXT_DROP;
goto packet_enqueue;
}
- ASSERT (vnet_buffer (b0)->ip.save_rewrite_length < (2 << 14));
- vnet_buffer (b0)->ip.reass.save_rewrite_length =
- vnet_buffer (b0)->ip.save_rewrite_length;
vnet_buffer (b0)->ip.reass.is_non_first_fragment = 0;
next0 = IP6_SV_REASSEMBLY_NEXT_INPUT;
if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
{
next0 = IP6_SV_REASSEMBLY_NEXT_DROP;
error0 = IP6_ERROR_REASS_LIMIT_REACHED;
+ b0->error = node->errors[error0];
goto packet_enqueue;
}
if (reass->is_complete)
{
- ASSERT (vnet_buffer (b0)->ip.save_rewrite_length < (2 << 14));
- vnet_buffer (b0)->ip.reass.save_rewrite_length =
- vnet_buffer (b0)->ip.save_rewrite_length;
vnet_buffer (b0)->ip.reass.is_non_first_fragment =
! !ip6_frag_hdr_offset (frag_hdr);
vnet_buffer (b0)->ip.reass.ip_proto = reass->ip_proto;
vnet_buffer (b0)->ip.reass.l4_src_port = reass->l4_src_port;
vnet_buffer (b0)->ip.reass.l4_dst_port = reass->l4_dst_port;
next0 = IP6_SV_REASSEMBLY_NEXT_INPUT;
- error0 = IP6_ERROR_NONE;
if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
{
ip6_sv_reass_add_trace (vm, node, rm, reass, bi0,
break;
}
- b0->error = node->errors[error0];
-
if (reass->is_complete)
{
u32 idx;
frag_hdr =
vlib_buffer_get_current (b0) +
vnet_buffer (b0)->ip.reass.ip6_frag_hdr_offset;
- ASSERT (vnet_buffer (b0)->ip.save_rewrite_length < (2 << 14));
- vnet_buffer (b0)->ip.reass.save_rewrite_length =
- vnet_buffer (b0)->ip.save_rewrite_length;
vnet_buffer (b0)->ip.reass.is_non_first_fragment =
! !ip6_frag_hdr_offset (frag_hdr);
vnet_buffer (b0)->ip.reass.ip_proto = reass->ip_proto;
vec_reset_length (pool_indexes_to_free);
/* *INDENT-OFF* */
- pool_foreach_index (index, rt->pool, ({
+ pool_foreach_index (index, rt->pool) {
reass = pool_elt_at_index (rt->pool, index);
if (now > reass->last_heard + rm->timeout)
{
vec_add1 (pool_indexes_to_free, index);
}
- }));
+ }
/* *INDENT-ON* */
int *i;
/* *INDENT-OFF* */
if (details)
{
/* *INDENT-OFF* */
- pool_foreach (reass, rt->pool, {
+ pool_foreach (reass, rt->pool) {
vlib_cli_output (vm, "%U", format_ip6_sv_reass, vm, reass);
- });
+ }
/* *INDENT-ON* */
}
sum_reass_n += rt->reass_n;
vlib_cli_output (vm, "---------------------");
vlib_cli_output (vm, "Current IP6 reassemblies count: %lu\n",
(long unsigned) sum_reass_n);
- vlib_cli_output (vm, "Maximum configured concurrent IP6 reassemblies per "
- "worker-thread: %lu\n", (long unsigned) rm->max_reass_n);
+ vlib_cli_output (vm,
+ "Maximum configured concurrent shallow virtual IP6 reassemblies per worker-thread: %lu\n",
+ (long unsigned) rm->max_reass_n);
+ vlib_cli_output (vm,
+ "Maximum configured shallow virtual IP6 reassembly timeout: %lums\n",
+ (long unsigned) rm->timeout_ms);
+ vlib_cli_output (vm,
+ "Maximum configured shallow virtual IP6 reassembly expire walk interval: %lums\n",
+ (long unsigned) rm->expire_walk_interval_ms);
vlib_cli_output (vm, "Buffers in use: %lu\n",
(long unsigned) sum_buffers_n);
return 0;