#include <vnet/vnet.h>
#include <vnet/ip/lookup.h>
-void
-vnet_rewrite_copy_slow_path (vnet_rewrite_data_t * p0,
- vnet_rewrite_data_t * rw0,
- word n_left, uword most_likely_size)
+u8 *
+format_vnet_rewrite_flags (u8 *s, va_list *ap)
{
- uword n_done =
- round_pow2 (most_likely_size, sizeof (rw0[0])) / sizeof (rw0[0]);
-
- p0 -= n_done;
- rw0 -= n_done;
+ vnet_rewrite_flags_t f = va_arg (*ap, int);
- /* As we enter the cleanup loop, p0 and rw0 point to the last chunk written
- by the fast path. Hence, the constant 1, which the
- vnet_rewrite_copy_one macro renders as p0[-1] = rw0[-1]. */
+ if (f & VNET_REWRITE_HAS_FEATURES)
+ s = format (s, "features ");
+ if (f & VNET_REWRITE_FIXUP_IP4_O_4)
+ s = format (s, "fixup-ip4o4 ");
+ if (f & VNET_REWRITE_FIXUP_FLOW_HASH)
+ s = format (s, "fixup-flow-hash ");
- while (n_left > 0)
- {
- vnet_rewrite_copy_one (p0, rw0, 1);
- p0--;
- rw0--;
- n_left--;
- }
+ return (s);
}
u8 *
CLIB_UNUSED (u32 indent) = va_arg (*args, u32);
vnet_main_t *vnm = vnet_get_main ();
+ ASSERT (rw->data_bytes <= max_data_bytes);
+
if (rw->sw_if_index != ~0)
{
vnet_sw_interface_t *si;
- si = vnet_get_sw_interface_safe (vnm, rw->sw_if_index);
+ si = vnet_get_sw_interface_or_null (vnm, rw->sw_if_index);
if (NULL != si)
s = format (s, "%U:", format_vnet_sw_interface_name, vnm, si);
else
s = format (s, "DELETED:%d", rw->sw_if_index);
}
+ s = format (s, " mtu:%d next:%d", rw->max_l3_packet_bytes, rw->next_index);
+ s = format (s, " flags:[%U]", format_vnet_rewrite_flags, rw->flags);
+
/* Format rewrite string. */
if (rw->data_bytes > 0)
- s = format (s, " %U",
- format_hex_bytes,
- rw->data + max_data_bytes - rw->data_bytes, rw->data_bytes);
+ s = format (s, " %U", format_hex_bytes, rw->data, rw->data_bytes);
return s;
}
void
vnet_rewrite_init (vnet_main_t * vnm,
u32 sw_if_index,
+ vnet_link_t linkt,
u32 this_node, u32 next_node, vnet_rewrite_header_t * rw)
{
rw->sw_if_index = sw_if_index;
rw->next_index = vlib_node_add_next (vnm->vlib_main, this_node, next_node);
rw->max_l3_packet_bytes =
- vnet_sw_interface_get_mtu (vnm, sw_if_index, VLIB_TX);
+ vnet_sw_interface_get_mtu (vnm, sw_if_index, vnet_link_to_mtu (linkt));
}
void
-vnet_rewrite_update_mtu (vnet_main_t * vnm, vnet_rewrite_header_t * rw)
+vnet_rewrite_update_mtu (vnet_main_t * vnm, vnet_link_t linkt,
+ vnet_rewrite_header_t * rw)
{
rw->max_l3_packet_bytes =
- vnet_sw_interface_get_mtu (vnm, rw->sw_if_index, VLIB_TX);
+ vnet_sw_interface_get_mtu (vnm, rw->sw_if_index,
+ vnet_link_to_mtu (linkt));
}
void
vnet_get_hw_interface_class (vnm, hw->hw_class_index);
u8 *rewrite = NULL;
- vnet_rewrite_init (vnm, sw_if_index, node_index,
+ vnet_rewrite_init (vnm, sw_if_index, link_type, node_index,
vnet_tx_node_index_for_sw_interface (vnm, sw_if_index),
rw);
vec_free (rewrite);
}
-void
-vnet_rewrite_for_tunnel (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)
-{
- ip_adjacency_t *adj = 0;
- /*
- * Installed into vnet_buffer(b)->sw_if_index[VLIB_TX] e.g.
- * by ip4_rewrite_inline. If the post-rewrite node injects into
- * ipX-forward, this will be interpreted as a FIB number.
- */
- rw->sw_if_index = tx_sw_if_index;
- rw->next_index = vlib_node_add_next (vnm->vlib_main, rewrite_node_index,
- post_rewrite_node_index);
- rw->max_l3_packet_bytes = (u16) ~ 0; /* we can't know at this point */
-
- ASSERT (rewrite_length < sizeof (adj->rewrite_data));
- /* Leave room for ethernet + VLAN tag */
- vnet_rewrite_set_data_internal (rw, sizeof (adj->rewrite_data),
- rewrite_data, rewrite_length);
-}
-
void
serialize_vnet_rewrite (serialize_main_t * m, va_list * va)
{