/* 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;
/* 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.
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);
}
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 */
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 { \
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);
}
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;
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;
}
} \
} 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))
{
(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;
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:
+ */