aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/lisp-gpe
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/lisp-gpe')
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe.api16
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe.h1
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_api.c33
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c23
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_fwd_entry.h2
5 files changed, 74 insertions, 1 deletions
diff --git a/src/vnet/lisp-gpe/lisp_gpe.api b/src/vnet/lisp-gpe/lisp_gpe.api
index f79d18c1a60..7af153355b7 100644
--- a/src/vnet/lisp-gpe/lisp_gpe.api
+++ b/src/vnet/lisp-gpe/lisp_gpe.api
@@ -87,6 +87,20 @@ autoreply define gpe_add_del_iface
u32 vni;
};
+define gpe_fwd_entry_vnis_get
+{
+ u32 client_index;
+ u32 context;
+};
+
+manual_print manual_endian define gpe_fwd_entry_vnis_get_reply
+{
+ u32 context;
+ i32 retval;
+ u32 count;
+ u32 vnis[count];
+};
+
define gpe_fwd_entries_get
{
u32 client_index;
@@ -103,6 +117,8 @@ typeonly manual_print manual_endian define gpe_fwd_entry
u8 reid_prefix_len;
u8 leid[16];
u8 reid[16];
+ u32 vni;
+ u8 action;
};
manual_print manual_endian define gpe_fwd_entries_get_reply
diff --git a/src/vnet/lisp-gpe/lisp_gpe.h b/src/vnet/lisp-gpe/lisp_gpe.h
index 38d76997ce3..d86a225f5f8 100644
--- a/src/vnet/lisp-gpe/lisp_gpe.h
+++ b/src/vnet/lisp-gpe/lisp_gpe.h
@@ -271,6 +271,7 @@ typedef struct
u32 fwd_entry_index;
u32 dp_table;
u32 vni;
+ u8 action;
dp_address_t leid;
dp_address_t reid;
} lisp_api_gpe_fwd_entry_t;
diff --git a/src/vnet/lisp-gpe/lisp_gpe_api.c b/src/vnet/lisp-gpe/lisp_gpe_api.c
index f6bd5440a6d..9edffa18ad4 100644
--- a/src/vnet/lisp-gpe/lisp_gpe_api.c
+++ b/src/vnet/lisp-gpe/lisp_gpe_api.c
@@ -57,6 +57,7 @@ _(GPE_FWD_ENTRIES_GET, gpe_fwd_entries_get) \
_(GPE_FWD_ENTRY_PATH_DUMP, gpe_fwd_entry_path_dump) \
_(GPE_ENABLE_DISABLE, gpe_enable_disable) \
_(GPE_ADD_DEL_IFACE, gpe_add_del_iface) \
+_(GPE_FWD_ENTRY_VNIS_GET, gpe_fwd_entry_vnis_get) \
_(GPE_SET_ENCAP_MODE, gpe_set_encap_mode) \
_(GPE_GET_ENCAP_MODE, gpe_get_encap_mode)
@@ -200,6 +201,8 @@ gpe_fwd_entries_copy (vl_api_gpe_fwd_entry_t * dst,
memset (dst, 0, sizeof (*dst));
dst[i].dp_table = src->dp_table;
dst[i].fwd_entry_index = src->fwd_entry_index;
+ dst[i].vni = src->vni;
+ dst[i].action = src->action;
switch (fid_addr_type (&e->leid))
{
case FID_ADDR_IP_PREF:
@@ -242,6 +245,7 @@ gpe_entry_t_host_to_net (vl_api_gpe_fwd_entry_t * e)
{
e->fwd_entry_index = clib_host_to_net_u32 (e->fwd_entry_index);
e->dp_table = clib_host_to_net_u32 (e->dp_table);
+ e->vni = clib_host_to_net_u32 (e->vni);
}
static void
@@ -260,6 +264,31 @@ static void
}
static void
+vl_api_gpe_fwd_entry_vnis_get_t_handler (vl_api_gpe_fwd_entry_vnis_get_t * mp)
+{
+ vl_api_gpe_fwd_entry_vnis_get_reply_t *rmp = 0;
+ hash_pair_t *p;
+ u32 i = 0;
+ int rv = 0;
+
+ u32 *vnis = vnet_lisp_gpe_get_fwd_entry_vnis ();
+ u32 size = hash_elts (vnis) * sizeof (u32);
+
+ /* *INDENT-OFF* */
+ REPLY_MACRO4 (VL_API_GPE_FWD_ENTRY_VNIS_GET_REPLY, size,
+ {
+ rmp->count = clib_host_to_net_u32 (hash_elts (vnis));
+ hash_foreach_pair (p, vnis,
+ ({
+ rmp->vnis[i++] = clib_host_to_net_u32 (p->key);
+ }));
+ });
+ /* *INDENT-ON* */
+
+ hash_free (vnis);
+}
+
+static void
vl_api_gpe_fwd_entries_get_t_handler (vl_api_gpe_fwd_entries_get_t * mp)
{
lisp_api_gpe_fwd_entry_t *e;
@@ -315,7 +344,7 @@ vl_api_gpe_add_del_fwd_entry_t_handler (vl_api_gpe_add_del_fwd_entry_t * mp)
}
pairs = unformat_gpe_loc_pairs (mp->locs, mp->loc_num / 2);
- if (rv || 0 == pairs)
+ if (rv)
goto send_reply;
a->is_add = mp->is_add;
@@ -323,6 +352,8 @@ vl_api_gpe_add_del_fwd_entry_t_handler (vl_api_gpe_add_del_fwd_entry_t * mp)
a->dp_table = mp->dp_table;
a->vni = mp->vni;
a->action = mp->action;
+ if (mp->loc_num == 0)
+ a->is_negative = 1;
rv = vnet_lisp_gpe_add_del_fwd_entry (a, 0);
vec_free (pairs);
diff --git a/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c b/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c
index 6d400f75489..1c34e6e4eee 100644
--- a/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c
+++ b/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c
@@ -495,6 +495,10 @@ add_ip_fwd_entry (lisp_gpe_main_t * lgm,
{
lisp_gpe_fwd_entry_mk_paths (lfe, a);
}
+ else
+ {
+ lfe->action = a->action;
+ }
create_fib_entries (lfe);
return (0);
@@ -1438,6 +1442,23 @@ lisp_gpe_fwd_entry_init (vlib_main_t * vm)
return (error);
}
+u32 *
+vnet_lisp_gpe_get_fwd_entry_vnis (void)
+{
+ lisp_gpe_main_t *lgm = vnet_lisp_gpe_get_main ();
+ lisp_gpe_fwd_entry_t *lfe;
+ u32 *vnis = 0;
+
+ /* *INDENT-OFF* */
+ pool_foreach (lfe, lgm->lisp_fwd_entry_pool,
+ ({
+ hash_set (vnis, lfe->key->vni, 0);
+ }));
+ /* *INDENT-ON* */
+
+ return vnis;
+}
+
lisp_api_gpe_fwd_entry_t *
vnet_lisp_gpe_fwd_entries_get_by_vni (u32 vni)
{
@@ -1453,6 +1474,8 @@ vnet_lisp_gpe_fwd_entries_get_by_vni (u32 vni)
memset (&e, 0, sizeof (e));
e.dp_table = lfe->eid_table_id;
e.vni = lfe->key->vni;
+ if (lfe->type == LISP_GPE_FWD_ENTRY_TYPE_NEGATIVE)
+ e.action = lfe->action;
e.fwd_entry_index = lfe - lgm->lisp_fwd_entry_pool;
memcpy (&e.reid, &lfe->key->rmt, sizeof (e.reid));
memcpy (&e.leid, &lfe->key->lcl, sizeof (e.leid));
diff --git a/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.h b/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.h
index b9d9c98359b..1580351611c 100644
--- a/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.h
+++ b/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.h
@@ -217,6 +217,8 @@ vnet_lisp_gpe_del_fwd_counters (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
extern void
vnet_lisp_gpe_add_fwd_counters (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
u32 fwd_entry_index);
+extern u32 *vnet_lisp_gpe_get_fwd_entry_vnis (void);
+
#endif
/*