Add no-append flag to vlib_frame_t
Change-Id: I01c4f5755d579282773ac227b0bc24f8ddbb2bd1 Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:

committed by
Florin Coras

parent
67f935ec6e
commit
296988d358
@ -425,6 +425,7 @@ no_more_desc:
|
||||
|
||||
if ((or_qw1 & AVF_RXD_ERROR_IPE) == 0)
|
||||
f->flags |= ETH_INPUT_FRAME_F_IP4_CKSUM_OK;
|
||||
vlib_frame_no_append (f);
|
||||
}
|
||||
|
||||
n_left_to_next -= n_rx_packets;
|
||||
|
@ -390,6 +390,7 @@ dpdk_device_input (vlib_main_t * vm, dpdk_main_t * dm, dpdk_device_t * xd,
|
||||
if (xd->flags & DPDK_DEVICE_FLAG_RX_IP4_CKSUM &&
|
||||
(or_flags & PKT_RX_IP_CKSUM_BAD) == 0)
|
||||
f->flags |= ETH_INPUT_FRAME_F_IP4_CKSUM_OK;
|
||||
vlib_frame_no_append (f);
|
||||
}
|
||||
n_left_to_next -= n_rx_packets;
|
||||
vlib_put_next_frame (vm, node, next_index, n_left_to_next);
|
||||
|
@ -370,6 +370,7 @@ memif_device_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
ef = vlib_frame_scalar_args (f);
|
||||
ef->sw_if_index = mif->sw_if_index;
|
||||
ef->hw_if_index = mif->hw_if_index;
|
||||
vlib_frame_no_append (f);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -233,7 +233,7 @@ vlib_frame_free (vlib_main_t * vm, vlib_node_runtime_t * r, vlib_frame_t * f)
|
||||
ASSERT (nf->frame_index != frame_index);
|
||||
}
|
||||
|
||||
f->frame_flags &= ~VLIB_FRAME_IS_ALLOCATED;
|
||||
f->frame_flags &= ~(VLIB_FRAME_IS_ALLOCATED | VLIB_FRAME_NO_APPEND);
|
||||
|
||||
vec_add1 (fs->free_frame_indices, frame_index);
|
||||
ASSERT (fs->n_alloc_frames > 0);
|
||||
@ -387,9 +387,11 @@ vlib_get_next_frame_internal (vlib_main_t * vm,
|
||||
f->flags = 0;
|
||||
}
|
||||
|
||||
/* Allocate new frame if current one is already full. */
|
||||
/* Allocate new frame if current one is marked as no-append or
|
||||
it is already full. */
|
||||
n_used = f->n_vectors;
|
||||
if (n_used >= VLIB_FRAME_SIZE || (allocate_new_next_frame && n_used > 0))
|
||||
if (n_used >= VLIB_FRAME_SIZE || (allocate_new_next_frame && n_used > 0) ||
|
||||
(f->frame_flags & VLIB_FRAME_NO_APPEND))
|
||||
{
|
||||
/* Old frame may need to be freed after dispatch, since we'll have
|
||||
two redundant frames from node -> next node. */
|
||||
@ -1370,7 +1372,7 @@ dispatch_pending_node (vlib_main_t * vm, uword pending_frame_index,
|
||||
VLIB_NODE_STATE_POLLING,
|
||||
f, last_time_stamp);
|
||||
|
||||
f->frame_flags &= ~VLIB_FRAME_PENDING;
|
||||
f->frame_flags &= ~(VLIB_FRAME_PENDING | VLIB_FRAME_NO_APPEND);
|
||||
|
||||
/* Frame is ready to be used again, so restore it. */
|
||||
if (restore_frame_index != ~0)
|
||||
|
@ -417,6 +417,9 @@ typedef struct
|
||||
#define VLIB_FRAME_NO_FREE_AFTER_DISPATCH \
|
||||
VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH
|
||||
|
||||
/* Don't append this frame */
|
||||
#define VLIB_FRAME_NO_APPEND (1 << 14)
|
||||
|
||||
/* This next frame owns enqueue to node
|
||||
corresponding to node_runtime_index. */
|
||||
#define VLIB_FRAME_OWNER (1 << 15)
|
||||
|
@ -242,6 +242,12 @@ vlib_get_frame (vlib_main_t * vm, uword frame_index)
|
||||
return f;
|
||||
}
|
||||
|
||||
always_inline void
|
||||
vlib_frame_no_append (vlib_frame_t * f)
|
||||
{
|
||||
f->frame_flags |= VLIB_FRAME_NO_APPEND;
|
||||
}
|
||||
|
||||
always_inline u32
|
||||
vlib_frame_index (vlib_main_t * vm, vlib_frame_t * f)
|
||||
{
|
||||
|
@ -403,6 +403,7 @@ vhost_user_if_input (vlib_main_t * vm,
|
||||
ef = vlib_frame_scalar_args (f);
|
||||
ef->sw_if_index = vui->sw_if_index;
|
||||
ef->hw_if_index = vui->hw_if_index;
|
||||
vlib_frame_no_append (f);
|
||||
}
|
||||
|
||||
while (n_left > 0)
|
||||
|
@ -1575,6 +1575,7 @@ pg_generate_packets (vlib_node_runtime_t * node,
|
||||
pi = pool_elt_at_index (pg->interfaces, s->pg_if_index);
|
||||
ef->sw_if_index = pi->sw_if_index;
|
||||
ef->hw_if_index = pi->hw_if_index;
|
||||
vlib_frame_no_append (f);
|
||||
}
|
||||
else
|
||||
vlib_get_next_frame (vm, node, next_index, to_next, n_left);
|
||||
|
Reference in New Issue
Block a user