X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fsrv6-ad%2Fnode.c;h=e2111d65431cc7b7bb8bd163c7d69fa5417b145d;hb=380e3daaaffd309febfc4764731982af08aa2dce;hp=4bc110d8a1cecc699fd9c4723c286a9e94311798;hpb=537eeeca36dcc08a3c337a7cfd1c1c426d43f563;p=vpp.git diff --git a/src/plugins/srv6-ad/node.c b/src/plugins/srv6-ad/node.c index 4bc110d8a1c..e2111d65431 100644 --- a/src/plugins/srv6-ad/node.c +++ b/src/plugins/srv6-ad/node.c @@ -160,8 +160,12 @@ end_ad_processing (vlib_buffer_t * b0, 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); @@ -332,11 +336,11 @@ srv6_ad4_rewrite_fn (vlib_main_t * vm, 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); @@ -348,7 +352,7 @@ srv6_ad4_rewrite_fn (vlib_main_t * vm, 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); } @@ -465,11 +469,11 @@ srv6_ad6_rewrite_fn (vlib_main_t * vm, 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); @@ -477,7 +481,7 @@ srv6_ad6_rewrite_fn (vlib_main_t * vm, 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); }