typedef struct
{
+ u8 error;
ip6_address_t src, dst;
} srv6_ad_rewrite_trace_t;
CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
srv6_ad_rewrite_trace_t *t = va_arg (*args, srv6_ad_rewrite_trace_t *);
+ if (PREDICT_FALSE (t->error != 0))
+ {
+ return format (s, "SRv6-AD-rewrite: cache is empty");
+ }
+
return format (s, "SRv6-AD-rewrite: src %U dst %U",
format_ip6_address, &t->src, format_ip6_address, &t->dst);
}
ls0_mem = ls0->plugin_mem;
/* Cache IP header and extensions */
- vec_validate (ls0_mem->rewrite, total_size - 1);
+ if (PREDICT_FALSE (total_size > ls0_mem->rw_len))
+ {
+ vec_validate (ls0_mem->rewrite, total_size - 1);
+ }
clib_memcpy (ls0_mem->rewrite, ip0, total_size);
+ ls0_mem->rw_len = total_size;
/* Remove IP header and extensions */
vlib_buffer_advance (b0, total_size);
n_left_from = frame->n_vectors;
next_index = node->cached_next_index;
- u32 thread_index = vlib_get_thread_index ();
+ u32 thread_index = vm->thread_index;
while (n_left_from > 0)
{
else
{
ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (ls0_mem->rewrite) + b0->current_data));
+ (ls0_mem->rw_len + b0->current_data));
- clib_memcpy (((u8 *) ip0_encap) - vec_len (ls0_mem->rewrite),
- ls0_mem->rewrite, vec_len (ls0_mem->rewrite));
- vlib_buffer_advance (b0, -(word) vec_len (ls0_mem->rewrite));
+ clib_memcpy (((u8 *) ip0_encap) - ls0_mem->rw_len,
+ ls0_mem->rewrite, ls0_mem->rw_len);
+ vlib_buffer_advance (b0, -(word) ls0_mem->rw_len);
ip0 = vlib_buffer_get_current (b0);
ip0_encap->checksum = checksum0;
/* Update outer IPv6 length (in case it has changed) */
- new_l0 = vec_len (ls0_mem->rewrite) - sizeof (ip6_header_t) +
+ new_l0 = ls0_mem->rw_len - sizeof (ip6_header_t) +
clib_net_to_host_u16 (ip0_encap->length);
ip0->payload_length = clib_host_to_net_u16 (new_l0);
}
{
srv6_ad_rewrite_trace_t *tr =
vlib_add_trace (vm, node, b0, sizeof *tr);
- clib_memcpy (tr->src.as_u8, ip0->src_address.as_u8,
- sizeof tr->src.as_u8);
- clib_memcpy (tr->dst.as_u8, ip0->dst_address.as_u8,
- sizeof tr->dst.as_u8);
+ tr->error = 0;
+
+ if (next0 == SRV6_AD_REWRITE_NEXT_ERROR)
+ {
+ tr->error = 1;
+ }
+ else
+ {
+ clib_memcpy (tr->src.as_u8, ip0->src_address.as_u8,
+ sizeof tr->src.as_u8);
+ clib_memcpy (tr->dst.as_u8, ip0->dst_address.as_u8,
+ sizeof tr->dst.as_u8);
+ }
}
vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
else
{
ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (ls0_mem->rewrite) + b0->current_data));
+ (ls0_mem->rw_len + b0->current_data));
- clib_memcpy (((u8 *) ip0_encap) - vec_len (ls0_mem->rewrite),
- ls0_mem->rewrite, vec_len (ls0_mem->rewrite));
- vlib_buffer_advance (b0, -(word) vec_len (ls0_mem->rewrite));
+ clib_memcpy (((u8 *) ip0_encap) - ls0_mem->rw_len,
+ ls0_mem->rewrite, ls0_mem->rw_len);
+ vlib_buffer_advance (b0, -(word) ls0_mem->rw_len);
ip0 = vlib_buffer_get_current (b0);
ip0_encap->hop_limit -= 1;
/* Update outer IPv6 length (in case it has changed) */
- new_l0 = vec_len (ls0_mem->rewrite) +
+ new_l0 = ls0_mem->rw_len +
clib_net_to_host_u16 (ip0_encap->payload_length);
ip0->payload_length = clib_host_to_net_u16 (new_l0);
}
{
srv6_ad_rewrite_trace_t *tr =
vlib_add_trace (vm, node, b0, sizeof *tr);
- clib_memcpy (tr->src.as_u8, ip0->src_address.as_u8,
- sizeof tr->src.as_u8);
- clib_memcpy (tr->dst.as_u8, ip0->dst_address.as_u8,
- sizeof tr->dst.as_u8);
+ tr->error = 0;
+
+ if (next0 == SRV6_AD_REWRITE_NEXT_ERROR)
+ {
+ tr->error = 1;
+ }
+ else
+ {
+ clib_memcpy (tr->src.as_u8, ip0->src_address.as_u8,
+ sizeof tr->src.as_u8);
+ clib_memcpy (tr->dst.as_u8, ip0->dst_address.as_u8,
+ sizeof tr->dst.as_u8);
+ }
}
vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,