#include <vlib/vlib.h>
#include <vnet/pg/pg.h>
#include <vnet/vnet.h>
-
-#if DPDK==1
-#include <vnet/devices/dpdk/dpdk.h>
-#endif
-
-static inline void
-pg_set_mbuf_metadata (pg_main_t * pg, u32 * buffers, u32 n_alloc)
-{
-#if DPDK == 1
- vlib_main_t *vm = vlib_get_main ();
- vlib_buffer_t *b;
- struct rte_mbuf *mb;
- i16 delta;
- u16 new_data_len;
- u16 new_pkt_len;
-
- int i;
-
- for (i = 0; i < n_alloc; i++)
- {
- b = vlib_get_buffer (vm, buffers[i]);
- mb = rte_mbuf_from_vlib_buffer (b);
-
- delta = vlib_buffer_length_in_chain (vm, b) - (i16) mb->pkt_len;
- new_data_len = (u16) ((i16) mb->data_len + delta);
- new_pkt_len = (u16) ((i16) mb->pkt_len + delta);
-
- mb->data_len = new_data_len;
- mb->pkt_len = new_pkt_len;
- mb->data_off = (u16) ((RTE_PKTMBUF_HEADROOM) + b->current_data);
- }
-#endif
-}
+#include <vnet/feature/feature.h>
+#include <vnet/devices/devices.h>
static int
validate_buffer_data2 (vlib_buffer_t * b, pg_stream_t * s,
u32 n_bits,
u32 byte_offset, u32 is_net_byte_order, u64 v_min, u64 v_max)
{
- vlib_main_t *vm = pg->vlib_main;
+ vlib_main_t *vm = vlib_get_main ();
while (n_buffers >= 4)
{
u32 is_net_byte_order,
u32 want_sum, u64 * sum_result, u64 v_min, u64 v_max, u64 v)
{
- vlib_main_t *vm = pg->vlib_main;
+ vlib_main_t *vm = vlib_get_main ();
u64 sum = 0;
ASSERT (v >= v_min && v <= v_max);
u32 is_net_byte_order,
u32 want_sum, u64 * sum_result, u64 v_min, u64 v_max)
{
- vlib_main_t *vm = pg->vlib_main;
+ vlib_main_t *vm = vlib_get_main ();
u64 v_diff = v_max - v_min + 1;
u64 r_mask = max_pow2 (v_diff) - 1;
u64 v0, v1;
u32 n_bits,
u32 byte_offset, u64 v_min, u64 v_max, u64 mask, u32 shift)
{
- vlib_main_t *vm = pg->vlib_main;
+ vlib_main_t *vm = vlib_get_main ();
while (n_buffers >= 4)
{
u32 byte_offset,
u64 v_min, u64 v_max, u64 v, u64 mask, u32 shift)
{
- vlib_main_t *vm = pg->vlib_main;
+ vlib_main_t *vm = vlib_get_main ();
ASSERT (v >= v_min && v <= v_max);
u32 n_bits,
u32 byte_offset, u64 v_min, u64 v_max, u64 mask, u32 shift)
{
- vlib_main_t *vm = pg->vlib_main;
+ vlib_main_t *vm = vlib_get_main ();
u64 v_diff = v_max - v_min + 1;
u64 r_mask = max_pow2 (v_diff) - 1;
u64 v0, v1;
si->sw_if_index, n_buffers, length_sum);
}
- pg_set_mbuf_metadata (pg, buffers, n_buffers);
}
static void
pg_stream_t * s,
u32 * buffers, u32 n_buffers)
{
- vlib_main_t *vm = pg->vlib_main;
+ vlib_main_t *vm = vlib_get_main ();
pg_buffer_index_t *pbi;
uword n_bytes_left;
static u32 *unused_buffers = 0;
pg_stream_t * s,
u32 * buffers, u32 * next_buffers, u32 n_buffers)
{
- vlib_main_t *vm = pg->vlib_main;
+ vlib_main_t *vm = vlib_get_main ();
while (n_buffers >= 4)
{
pg_buffer_index_t * bi,
u32 * buffers, u32 * next_buffers, u32 n_alloc)
{
- vlib_main_t *vm = pg->vlib_main;
+ vlib_main_t *vm = vlib_get_main ();
vlib_buffer_free_list_t *f;
uword is_start_of_packet = bi == s->buffer_indices;
u32 n_allocated;
last_start = start;
/* Verify that pkts in the fifo are properly allocated */
-#if DPDK == 1
- if (CLIB_DEBUG > 0)
- {
- u32 *bi0;
- vlib_main_t *vm = vlib_get_main ();
- /* *INDENT-OFF* */
- clib_fifo_foreach (bi0, bi->buffer_fifo,
- ({
- vlib_buffer_t * b;
- struct rte_mbuf *mb;
-
- b = vlib_get_buffer(vm, bi0[0]);
- mb = rte_mbuf_from_vlib_buffer(b);
- ASSERT(rte_mbuf_refcnt_read(mb) == 1);
- }));
- /* *INDENT-ON* */
- }
-#endif
}
return n_in_fifo + n_added;
vlib_node_runtime_t * node,
pg_stream_t * s, u32 * buffers, u32 n_buffers)
{
- vlib_main_t *vm = pg->vlib_main;
+ vlib_main_t *vm = vlib_get_main ();
u32 *b, n_left, stream_index, next_index;
n_left = n_buffers;
pg_main_t * pg,
pg_stream_t * s, uword n_packets_to_generate)
{
- vlib_main_t *vm = pg->vlib_main;
+ vlib_main_t *vm = vlib_get_main ();
u32 *to_next, n_this_frame, n_left, n_trace, n_packets_in_fifo;
uword n_packets_generated;
pg_buffer_index_t *bi, *bi0;
+ u32 next_index = s->next_index;
+ vnet_feature_main_t *fm = &feature_main;
+ vnet_feature_config_main_t *cm;
+ u8 feature_arc_index = fm->device_input_feature_arc_index;
+ cm = &fm->feature_config_mains[feature_arc_index];
+ u32 current_config_index = ~(u32) 0;
+ int i;
bi0 = s->buffer_indices;
n_packets_to_generate = clib_min (n_packets_in_fifo, n_packets_to_generate);
n_packets_generated = 0;
+ if (PREDICT_FALSE
+ (vnet_have_features (feature_arc_index, s->sw_if_index[VLIB_RX])))
+ {
+ current_config_index =
+ vec_elt (cm->config_index_by_sw_if_index, s->sw_if_index[VLIB_RX]);
+ vnet_get_config_data (&cm->config_main, ¤t_config_index,
+ &next_index, 0);
+ }
+
while (n_packets_to_generate > 0)
{
u32 *head, *start, *end;
- vlib_get_next_frame (vm, node, s->next_index, to_next, n_left);
+ vlib_get_next_frame (vm, node, next_index, to_next, n_left);
n_this_frame = n_packets_to_generate;
if (n_this_frame > n_left)
vec_foreach (bi, s->buffer_indices)
clib_fifo_advance_head (bi->buffer_fifo, n_this_frame);
+ if (current_config_index != ~(u32) 0)
+ for (i = 0; i < n_this_frame; i++)
+ {
+ vlib_buffer_t *b;
+ b = vlib_get_buffer (vm, to_next[i]);
+ vnet_buffer (b)->device_input_feat.saved_next_index =
+ s->next_index;
+ vnet_buffer (b)->device_input_feat.buffer_advance = 0;
+ b->current_config_index = current_config_index;
+ b->feature_arc_index = feature_arc_index;
+ }
+
n_trace = vlib_get_trace_count (vm, node);
if (n_trace > 0)
{
n_packets_to_generate -= n_this_frame;
n_packets_generated += n_this_frame;
n_left -= n_this_frame;
- vlib_put_next_frame (vm, node, s->next_index, n_left);
+ vlib_put_next_frame (vm, node, next_index, n_left);
}
return n_packets_generated;
static uword
pg_input_stream (vlib_node_runtime_t * node, pg_main_t * pg, pg_stream_t * s)
{
- vlib_main_t *vm = pg->vlib_main;
+ vlib_main_t *vm = vlib_get_main ();
uword n_packets;
f64 time_now, dt;
uword i;
pg_main_t *pg = &pg_main;
uword n_packets = 0;
+ u32 worker_index = 0;
+
+ if (vlib_num_workers ())
+ worker_index = vlib_get_current_worker_index ();
/* *INDENT-OFF* */
- clib_bitmap_foreach (i, pg->enabled_streams, ({
- n_packets += pg_input_stream (node, pg, vec_elt_at_index (pg->streams, i));
+ clib_bitmap_foreach (i, pg->enabled_streams[worker_index], ({
+ pg_stream_t *s = vec_elt_at_index (pg->streams, i);
+ n_packets += pg_input_stream (node, pg, s);
}));
/* *INDENT-ON* */
VLIB_REGISTER_NODE (pg_input_node) = {
.function = pg_input,
.name = "pg-input",
+ .sibling_of = "device-input",
.type = VLIB_NODE_TYPE_INPUT,
.format_trace = format_pg_input_trace,