From: Dave Barach Date: Wed, 8 Apr 2020 18:31:45 +0000 (-0400) Subject: misc: fix error handling in punt_replicate X-Git-Tag: v20.09-rc0~242 X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commitdiff_plain;h=1adc7e78ad3eb7e800d0ce3ace56f53ab7aebffe misc: fix error handling in punt_replicate If vlib_buffer_clone (...) fails due to a buffer allocation error, update *n_dispatched with the actual number of clones, not the requested number of clones. Punt_replicate(...) should not set *to_next[0] = bi0. The original buffer is enqueued separately in punt_dispatch_node(...) Type: fix Signed-off-by: Dave Barach Change-Id: I774ad8f8c1a0633de4cf8ae5530629201c229347 --- diff --git a/src/vlib/punt_node.c b/src/vlib/punt_node.c index e341e4007cc..de721046057 100644 --- a/src/vlib/punt_node.c +++ b/src/vlib/punt_node.c @@ -120,11 +120,16 @@ punt_replicate (vlib_main_t * vm, * so there's no need to check if the to_next frame * is full */ } - *n_dispatched = *n_dispatched + n_clones0; + *n_dispatched = *n_dispatched + n_cloned0; /* The original buffer is the first clone */ next0 = punt_dp_db[pr0][0]; - *to_next[0] = bi0; + /* + * Note: the original buffer is enqueued in punt_dispatch_node. + * Don't do it here. + * + * *to_next[0] = bi0; + */ return next0; } diff --git a/src/vnet/ip/punt_node.c b/src/vnet/ip/punt_node.c index b48af84475c..0306d597293 100644 --- a/src/vnet/ip/punt_node.c +++ b/src/vnet/ip/punt_node.c @@ -596,6 +596,7 @@ punt_socket_rx_fd (vlib_main_t * vm, vlib_node_runtime_t * node, u32 fd) return 1; error: + vlib_put_next_frame (vm, node, next, n_left_to_next); vlib_node_increment_counter (vm, punt_socket_rx_node.index, error, 1); return 0; }