Add support for multiple microarchitectures in single binary
[vpp.git] / vnet / vnet / devices / af_packet / node.c
index eadb592..0c608ea 100644 (file)
@@ -94,11 +94,6 @@ buffer_add_to_chain(vlib_main_t *vm, u32 bi, u32 first_bi, u32 prev_bi)
   vlib_buffer_t * b = vlib_get_buffer (vm, bi);
   vlib_buffer_t * first_b = vlib_get_buffer (vm, first_bi);
   vlib_buffer_t * prev_b = vlib_get_buffer (vm, prev_bi);
-#if DPDK > 0
-  struct rte_mbuf * mbuf = ((struct rte_mbuf *) b) - 1;
-  struct rte_mbuf * first_mbuf = ((struct rte_mbuf *) first_b) - 1;
-  struct rte_mbuf * prev_mbuf = ((struct rte_mbuf *) prev_b) - 1;
-#endif
 
   /* update first buffer */
   first_b->total_length_not_including_first_buffer +=  b->current_length;
@@ -111,6 +106,9 @@ buffer_add_to_chain(vlib_main_t *vm, u32 bi, u32 first_bi, u32 prev_bi)
   b->next_buffer = 0;
 
 #if DPDK > 0
+  struct rte_mbuf * mbuf = rte_mbuf_from_vlib_buffer(b);
+  struct rte_mbuf * first_mbuf = rte_mbuf_from_vlib_buffer(first_b);
+  struct rte_mbuf * prev_mbuf = rte_mbuf_from_vlib_buffer(prev_b);
   first_mbuf->nb_segs++;
   prev_mbuf->next = mbuf;
   mbuf->data_len = b->current_length;
@@ -124,7 +122,7 @@ af_packet_device_input_fn  (vlib_main_t * vm, vlib_node_runtime_t * node,
                            vlib_frame_t * frame, u32 device_idx)
 {
   af_packet_main_t * apm = &af_packet_main;
-  af_packet_if_t * apif = vec_elt_at_index(apm->interfaces, device_idx);
+  af_packet_if_t * apif = pool_elt_at_index(apm->interfaces, device_idx);
   struct tpacket2_hdr *tph;
   u32 next_index = AF_PACKET_INPUT_NEXT_ETHERNET_INPUT;
   u32 block = 0;
@@ -142,6 +140,9 @@ af_packet_device_input_fn  (vlib_main_t * vm, vlib_node_runtime_t * node,
     VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX);
   u32 min_bufs = apif->rx_req->tp_frame_size / n_buffer_bytes;
 
+  if (apif->per_interface_next_index != ~0)
+      next_index = apif->per_interface_next_index;
+
   n_free_bufs = vec_len (apm->rx_buffers);
   if (PREDICT_FALSE(n_free_bufs < VLIB_FRAME_SIZE))
     {
@@ -155,7 +156,7 @@ af_packet_device_input_fn  (vlib_main_t * vm, vlib_node_runtime_t * node,
   while ((tph->tp_status & TP_STATUS_USER) && (n_free_bufs > min_bufs))
     {
       vlib_buffer_t * b0, * first_b0 = 0;
-      u32 next0 = AF_PACKET_INPUT_NEXT_ETHERNET_INPUT;
+      u32 next0 = next_index;
 
       u32 n_left_to_next;
       vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
@@ -164,7 +165,7 @@ af_packet_device_input_fn  (vlib_main_t * vm, vlib_node_runtime_t * node,
        {
          u32 data_len = tph->tp_snaplen;
          u32 offset = 0;
-         u32 bi0, first_bi0 = 0, prev_bi0;
+         u32 bi0 = 0, first_bi0 = 0, prev_bi0;
 
          while (data_len)
            {
@@ -179,7 +180,7 @@ af_packet_device_input_fn  (vlib_main_t * vm, vlib_node_runtime_t * node,
              /* copy data */
              u32 bytes_to_copy = data_len > n_buffer_bytes ? n_buffer_bytes : data_len;
              b0->current_data = 0;
-             memcpy (vlib_buffer_get_current (b0), (u8 *) tph + tph->tp_mac + offset, bytes_to_copy);
+             clib_memcpy (vlib_buffer_get_current (b0), (u8 *) tph + tph->tp_mac + offset, bytes_to_copy);
 
              /* fill buffer header */
              b0->clone_count = 0;
@@ -187,6 +188,11 @@ af_packet_device_input_fn  (vlib_main_t * vm, vlib_node_runtime_t * node,
 
              if (offset == 0)
                {
+#if DPDK > 0
+                 struct rte_mbuf * mb = rte_mbuf_from_vlib_buffer(b0);
+                 rte_pktmbuf_data_len (mb) = b0->current_length;
+                 rte_pktmbuf_pkt_len (mb) = b0->current_length;
+#endif
                  b0->total_length_not_including_first_buffer = 0;
                  b0->flags = VLIB_BUFFER_TOTAL_LENGTH_VALID;
                  vnet_buffer(b0)->sw_if_index[VLIB_RX] = apif->sw_if_index;
@@ -216,7 +222,7 @@ af_packet_device_input_fn  (vlib_main_t * vm, vlib_node_runtime_t * node,
              tr = vlib_add_trace (vm, node, first_b0, sizeof (*tr));
              tr->next_index = next0;
              tr->hw_if_index = apif->hw_if_index;
-             memcpy(&tr->tph, tph, sizeof(struct tpacket2_hdr));
+             clib_memcpy(&tr->tph, tph, sizeof(struct tpacket2_hdr));
            }
          /* enque and take next packet */
          vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
@@ -254,14 +260,13 @@ af_packet_input_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
 
   clib_bitmap_foreach (i, apm->pending_input_bitmap,
     ({
-      clib_bitmap_set (apm->pending_input_bitmap, i, 1);
+      clib_bitmap_set (apm->pending_input_bitmap, i, 0);
       n_rx_packets += af_packet_device_input_fn(vm, node, frame, i);
     }));
 
   return n_rx_packets;
 }
 
-
 VLIB_REGISTER_NODE (af_packet_input_node) = {
   .function = af_packet_input_fn,
   .name = "af-packet-input",
@@ -277,3 +282,6 @@ VLIB_REGISTER_NODE (af_packet_input_node) = {
     [AF_PACKET_INPUT_NEXT_ETHERNET_INPUT] = "ethernet-input",
   },
 };
+
+VLIB_NODE_FUNCTION_MULTIARCH (af_packet_input_node, af_packet_input_fn)
+