}
}
+/**
+ * mgre_tunnel_stack
+ *
+ * 'stack' (resolve the recursion for) the tunnel's midchain adjacency
+ */
+static void
+mgre_tunnel_stack (adj_index_t ai)
+{
+ gre_main_t *gm = &gre_main;
+ const ip_adjacency_t *adj;
+ const gre_tunnel_t *gt;
+ u32 sw_if_index;
+
+ adj = adj_get (ai);
+ sw_if_index = adj->rewrite_header.sw_if_index;
+
+ if ((vec_len (gm->tunnel_index_by_sw_if_index) <= sw_if_index) ||
+ (~0 == gm->tunnel_index_by_sw_if_index[sw_if_index]))
+ return;
+
+ gt = pool_elt_at_index (gm->tunnels,
+ gm->tunnel_index_by_sw_if_index[sw_if_index]);
+
+ if ((vnet_hw_interface_get_flags (vnet_get_main (), gt->hw_if_index) &
+ VNET_HW_INTERFACE_FLAG_LINK_UP) == 0)
+ {
+ adj_midchain_delegate_unstack (ai);
+ }
+ else
+ {
+ const teib_entry_t *ne;
+
+ ne = teib_entry_find_46 (sw_if_index, adj->ia_nh_proto,
+ &adj->sub_type.nbr.next_hop);
+ if (NULL != ne)
+ teib_entry_adj_stack (ne, ai);
+ }
+}
+
/**
* @brief Call back when restacking all adjacencies on a GRE interface
*/
return (ADJ_WALK_RC_CONTINUE);
}
+static adj_walk_rc_t
+mgre_adj_walk_cb (adj_index_t ai, void *ctx)
+{
+ mgre_tunnel_stack (ai);
+
+ return (ADJ_WALK_RC_CONTINUE);
+}
static void
gre_tunnel_restack (gre_tunnel_t * gt)
*/
FOR_EACH_FIB_IP_PROTOCOL (proto)
{
- adj_nbr_walk (gt->sw_if_index, proto, gre_adj_walk_cb, NULL);
+ switch (gt->mode)
+ {
+ case TUNNEL_MODE_P2P:
+ adj_nbr_walk (gt->sw_if_index, proto, gre_adj_walk_cb, NULL);
+ break;
+ case TUNNEL_MODE_MP:
+ adj_nbr_walk (gt->sw_if_index, proto, mgre_adj_walk_cb, NULL);
+ break;
+ }
}
}
}
/**
- * An NHRP entry has been added
+ * An TEIB entry has been added
*/
static void
gre_teib_entry_added (const teib_entry_t * ne)
u32 outer_table_id = 0;
gre_tunnel_type_t t_type = GRE_TUNNEL_TYPE_L3;
tunnel_mode_t t_mode = TUNNEL_MODE_P2P;
+ tunnel_encap_decap_flags_t flags = TUNNEL_ENCAP_DECAP_FLAG_NONE;
u32 session_id = 0;
int rv;
u8 is_add = 1;
t_type = GRE_TUNNEL_TYPE_TEB;
else if (unformat (line_input, "erspan %d", &session_id))
t_type = GRE_TUNNEL_TYPE_ERSPAN;
+ else
+ if (unformat
+ (line_input, "flags %U", unformat_tunnel_encap_decap_flags,
+ &flags))
+ ;
else
{
error = clib_error_return (0, "unknown input `%U'",
a->session_id = session_id;
a->is_ipv6 = !ip46_address_is_ip4 (&src);
a->instance = instance;
+ a->flags = flags;
clib_memcpy (&a->src, &src, sizeof (a->src));
clib_memcpy (&a->dst, &dst, sizeof (a->dst));
if (~0 == ti)
{
/* *INDENT-OFF* */
- pool_foreach (t, gm->tunnels,
- ({
+ pool_foreach (t, gm->tunnels)
+ {
vlib_cli_output (vm, "%U", format_gre_tunnel, t);
- }));
+ }
/* *INDENT-ON* */
}
else