dpdk: Add support for Mellanox ConnectX-4 devices
[vpp.git] / vnet / vnet / rewrite.h
index 2e5b7f4..00c1efb 100644 (file)
@@ -46,6 +46,7 @@
 /* Consider using vector types for speed? */
 typedef uword vnet_rewrite_data_t;
 
+/* *INDENT-OFF* */
 typedef CLIB_PACKED (struct {
   /* Interface to mark re-written packets with. */
   u32 sw_if_index;
@@ -66,13 +67,14 @@ typedef CLIB_PACKED (struct {
   /* Rewrite string starting at end and going backwards. */
   u8 data[0];
 }) vnet_rewrite_header_t;
+/* *INDENT-ON* */
 
 /*
   Helper macro for declaring rewrite string w/ given max-size.
 
   Typical usage:
     typedef struct {
-      // User data.
+      //
       int a, b;
 
       // Total adjacency is 64 bytes.
@@ -86,18 +88,26 @@ struct {                                                            \
   u8 rewrite_data[(total_bytes) - sizeof (vnet_rewrite_header_t)];     \
 }
 
+always_inline void
+vnet_rewrite_clear_data_internal (vnet_rewrite_header_t * rw, int max_size)
+{
+  /* Sanity check values carefully for this memset operation */
+  ASSERT ((max_size > 0) && (max_size < VLIB_BUFFER_PRE_DATA_SIZE));
+
+  rw->data_bytes = 0;
+  memset (rw->data, 0xfe, max_size);
+}
+
 always_inline void
 vnet_rewrite_set_data_internal (vnet_rewrite_header_t * rw,
-                               int max_size,
-                               void * data,
-                               int data_bytes)
+                               int max_size, void *data, int data_bytes)
 {
-  /* Sanity check values carefully for this memset operation*/
+  /* Sanity check values carefully for this memset operation */
   ASSERT ((max_size > 0) && (max_size < VLIB_BUFFER_PRE_DATA_SIZE));
   ASSERT ((data_bytes >= 0) && (data_bytes < max_size));
 
   rw->data_bytes = data_bytes;
-  memcpy (rw->data + max_size - data_bytes, data, data_bytes);
+  clib_memcpy (rw->data + max_size - data_bytes, data, data_bytes);
   memset (rw->data, 0xfe, max_size - data_bytes);
 }
 
@@ -118,30 +128,30 @@ vnet_rewrite_get_data_internal (vnet_rewrite_header_t * rw, int max_size)
   vnet_rewrite_get_data_internal (&((rw).rewrite_header), sizeof ((rw).rewrite_data))
 
 always_inline void
-vnet_rewrite_copy_one (vnet_rewrite_data_t * p0, vnet_rewrite_data_t * rw0, int i)
+vnet_rewrite_copy_one (vnet_rewrite_data_t * p0, vnet_rewrite_data_t * rw0,
+                      int i)
 {
   p0[-i] = rw0[-i];
 }
 
 void vnet_rewrite_copy_slow_path (vnet_rewrite_data_t * p0,
                                  vnet_rewrite_data_t * rw0,
-                                 word n_left,
-                                 uword most_likely_size);
+                                 word n_left, uword most_likely_size);
 
+/* *INDENT-OFF* */
 typedef CLIB_PACKED (struct {
   u64 a;
   u32 b;
   u16 c;
 }) eh_copy_t;
+/* *INDENT-ON* */
 
 always_inline void
 _vnet_rewrite_one_header (vnet_rewrite_header_t * h0,
-                         void * packet0,
-                         int max_size,
-                         int most_likely_size)
+                         void *packet0, int max_size, int most_likely_size)
 {
-  vnet_rewrite_data_t * p0 = packet0;
-  vnet_rewrite_data_t * rw0 = (vnet_rewrite_data_t *) (h0->data + max_size);
+  vnet_rewrite_data_t *p0 = packet0;
+  vnet_rewrite_data_t *rw0 = (vnet_rewrite_data_t *) (h0->data + max_size);
   word n_left0;
 
   /* 0xfefe => poisoned adjacency => crash */
@@ -149,13 +159,13 @@ _vnet_rewrite_one_header (vnet_rewrite_header_t * h0,
 
   if (PREDICT_TRUE (h0->data_bytes == sizeof (eh_copy_t)))
     {
-      eh_copy_t * s, * d;
-      s = (eh_copy_t *)(h0->data + max_size - sizeof (eh_copy_t));
-      d = (eh_copy_t *)(((u8 *)packet0) - sizeof (eh_copy_t));
-      __builtin_memcpy (d, s, sizeof (eh_copy_t));
+      eh_copy_t *s, *d;
+      s = (eh_copy_t *) (h0->data + max_size - sizeof (eh_copy_t));
+      d = (eh_copy_t *) (((u8 *) packet0) - sizeof (eh_copy_t));
+      clib_memcpy (d, s, sizeof (eh_copy_t));
       return;
     }
-      
+
 
 #define _(i)                                                           \
   do {                                                                 \
@@ -163,16 +173,16 @@ _vnet_rewrite_one_header (vnet_rewrite_header_t * h0,
       vnet_rewrite_copy_one (p0, rw0, (i));                            \
   } while (0)
 
-  _ (4);
-  _ (3);
-  _ (2);
-  _ (1);
+  _(4);
+  _(3);
+  _(2);
+  _(1);
 
 #undef _
-    
+
   n_left0 = (int)
-      (((int) h0->data_bytes - most_likely_size) + (sizeof(rw0[0])-1))
-      / (int) sizeof (rw0[0]);
+    (((int) h0->data_bytes - most_likely_size) + (sizeof (rw0[0]) - 1))
+    / (int) sizeof (rw0[0]);
   if (PREDICT_FALSE (n_left0 > 0))
     vnet_rewrite_copy_slow_path (p0, rw0, n_left0, most_likely_size);
 }
@@ -180,15 +190,13 @@ _vnet_rewrite_one_header (vnet_rewrite_header_t * h0,
 always_inline void
 _vnet_rewrite_two_headers (vnet_rewrite_header_t * h0,
                           vnet_rewrite_header_t * h1,
-                          void * packet0,
-                          void * packet1,
-                          int max_size,
-                          int most_likely_size)
+                          void *packet0,
+                          void *packet1, int max_size, int most_likely_size)
 {
-  vnet_rewrite_data_t * p0 = packet0;
-  vnet_rewrite_data_t * p1 = packet1;
-  vnet_rewrite_data_t * rw0 = (vnet_rewrite_data_t *) (h0->data + max_size);
-  vnet_rewrite_data_t * rw1 = (vnet_rewrite_data_t *) (h1->data + max_size);
+  vnet_rewrite_data_t *p0 = packet0;
+  vnet_rewrite_data_t *p1 = packet1;
+  vnet_rewrite_data_t *rw0 = (vnet_rewrite_data_t *) (h0->data + max_size);
+  vnet_rewrite_data_t *rw1 = (vnet_rewrite_data_t *) (h1->data + max_size);
   word n_left0, n_left1;
   int slow_path;
 
@@ -202,13 +210,13 @@ _vnet_rewrite_two_headers (vnet_rewrite_header_t * h0,
 
   if (PREDICT_TRUE (slow_path == 0))
     {
-      eh_copy_t * s0, * d0, * s1, * d1;
-      s0 = (eh_copy_t *)(h0->data + max_size - sizeof (eh_copy_t));
-      d0 = (eh_copy_t *)(((u8 *)packet0) - sizeof (eh_copy_t));
-      __builtin_memcpy (d0, s0, sizeof (eh_copy_t));
-      s1 = (eh_copy_t *)(h1->data + max_size - sizeof (eh_copy_t));
-      d1 = (eh_copy_t *)(((u8 *)packet1) - sizeof (eh_copy_t));
-      __builtin_memcpy (d1, s1, sizeof (eh_copy_t));
+      eh_copy_t *s0, *d0, *s1, *d1;
+      s0 = (eh_copy_t *) (h0->data + max_size - sizeof (eh_copy_t));
+      d0 = (eh_copy_t *) (((u8 *) packet0) - sizeof (eh_copy_t));
+      clib_memcpy (d0, s0, sizeof (eh_copy_t));
+      s1 = (eh_copy_t *) (h1->data + max_size - sizeof (eh_copy_t));
+      d1 = (eh_copy_t *) (((u8 *) packet1) - sizeof (eh_copy_t));
+      clib_memcpy (d1, s1, sizeof (eh_copy_t));
       return;
     }
 
@@ -221,19 +229,19 @@ _vnet_rewrite_two_headers (vnet_rewrite_header_t * h0,
       }                                                                        \
   } while (0)
 
-  _ (4);
-  _ (3);
-  _ (2);
-  _ (1);
+  _(4);
+  _(3);
+  _(2);
+  _(1);
 
 #undef _
-    
+
   n_left0 = (int)
-      (((int) h0->data_bytes - most_likely_size) + (sizeof(rw0[0])-1))
-      / (int) sizeof (rw0[0]);
+    (((int) h0->data_bytes - most_likely_size) + (sizeof (rw0[0]) - 1))
+    / (int) sizeof (rw0[0]);
   n_left1 = (int)
-      (((int) h1->data_bytes - most_likely_size) + (sizeof(rw1[0])-1))
-      / (int) sizeof (rw1[0]);
+    (((int) h1->data_bytes - most_likely_size) + (sizeof (rw1[0]) - 1))
+    / (int) sizeof (rw1[0]);
 
   if (PREDICT_FALSE (n_left0 > 0 || n_left1 > 0))
     {
@@ -254,21 +262,29 @@ _vnet_rewrite_two_headers (vnet_rewrite_header_t * h0,
                             (most_likely_size))
 
 #define VNET_REWRITE_FOR_SW_INTERFACE_ADDRESS_BROADCAST ((void *) 0)
-void vnet_rewrite_for_sw_interface (struct vnet_main_t * vnm,
-                                   vnet_l3_packet_type_t packet_type,
+/** Deprecated */
+void vnet_rewrite_for_sw_interface (struct vnet_main_t *vnm,
+                                   vnet_link_t packet_type,
                                    u32 sw_if_index,
                                    u32 node_index,
-                                   void * dst_address,
+                                   void *dst_address,
                                    vnet_rewrite_header_t * rw,
                                    u32 max_rewrite_bytes);
 
-void vnet_rewrite_for_tunnel (struct vnet_main_t * vnm,
-                              u32 tx_sw_if_index,
-                              u32 rewrite_node_index,
-                              u32 post_rewrite_node_index,
-                              vnet_rewrite_header_t * rw,
-                              u8 *rewrite_data,
-                              u32 rewrite_length);
+u32 vnet_tx_node_index_for_sw_interface (struct vnet_main_t *vnm,
+                                        u32 sw_if_index);
+
+void vnet_rewrite_init (struct vnet_main_t *vnm,
+                       u32 sw_if_index,
+                       u32 this_node,
+                       u32 next_node, vnet_rewrite_header_t * rw);
+
+u8 *vnet_build_rewrite_for_sw_interface (struct vnet_main_t *vnm,
+                                        u32 sw_if_index,
+                                        vnet_link_t packet_type,
+                                        const void *dst_address);
+void vnet_update_adjacency_for_sw_interface (struct vnet_main_t *vnm,
+                                            u32 sw_if_index, u32 ai);
 
 /* Parser for unformat header & rewrite string. */
 unformat_function_t unformat_vnet_rewrite;
@@ -279,3 +295,11 @@ format_function_t format_vnet_rewrite_header;
 serialize_function_t serialize_vnet_rewrite, unserialize_vnet_rewrite;
 
 #endif /* included_vnet_rewrite_h */
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */