LISP: improve DP speed
Change-Id: I5bd0721b70dfc240fa9225df3704774f6b0ede81
Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
diff --git a/src/vnet/lisp-cp/control.c b/src/vnet/lisp-cp/control.c
index 47badeb..3fda6ac 100644
--- a/src/vnet/lisp-cp/control.c
+++ b/src/vnet/lisp-cp/control.c
@@ -489,6 +489,7 @@
gid_address_copy (&a->rmt_eid, rmt_eid);
a->vni = gid_address_vni (&a->rmt_eid);
+ a->is_src_dst = is_src_dst;
/* get vrf or bd_index associated to vni */
type = gid_address_type (&a->rmt_eid);
diff --git a/src/vnet/lisp-gpe/lisp_gpe.h b/src/vnet/lisp-gpe/lisp_gpe.h
index be44702..e1e5620 100644
--- a/src/vnet/lisp-gpe/lisp_gpe.h
+++ b/src/vnet/lisp-gpe/lisp_gpe.h
@@ -226,6 +226,8 @@
/** */
typedef struct
{
+ u8 is_src_dst;
+
u8 is_add;
/** type of mapping */
diff --git a/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c b/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c
index f458a14..6e6885a 100644
--- a/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c
+++ b/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c
@@ -284,6 +284,14 @@
{
dpo_proto_t dproto;
+ if (!lfe->is_src_dst)
+ {
+ /* install normal destination route if not src/dst and be done */
+ ip_src_fib_add_route (lfe->eid_fib_index,
+ &lfe->key->rmt.ippref, lfe->paths);
+ return;
+ }
+
dproto = (ip_prefix_version (&lfe->key->rmt.ippref) == IP4 ?
DPO_PROTO_IP4 : DPO_PROTO_IP6);
@@ -324,9 +332,18 @@
static void
delete_fib_entries (lisp_gpe_fwd_entry_t * lfe)
{
- ip_src_dst_fib_del_route (lfe->src_fib_index,
- &lfe->key->lcl.ippref,
- lfe->eid_fib_index, &lfe->key->rmt.ippref);
+ fib_prefix_t dst_fib_prefix;
+
+ if (lfe->is_src_dst)
+ ip_src_dst_fib_del_route (lfe->src_fib_index,
+ &lfe->key->lcl.ippref,
+ lfe->eid_fib_index, &lfe->key->rmt.ippref);
+ else
+ {
+ ip_prefix_to_fib_prefix (&lfe->key->rmt.ippref, &dst_fib_prefix);
+ fib_table_entry_delete (lfe->src_fib_index, &dst_fib_prefix,
+ FIB_SOURCE_LISP);
+ }
}
static lisp_gpe_fwd_entry_t *
@@ -435,6 +452,7 @@
lfe->eid_table_id = a->table_id;
lfe->eid_fib_index = fib_table_find_or_create_and_lock (fproto,
lfe->eid_table_id);
+ lfe->is_src_dst = a->is_src_dst;
if (LISP_GPE_FWD_ENTRY_TYPE_NEGATIVE != lfe->type)
{
@@ -442,7 +460,6 @@
}
create_fib_entries (lfe);
-
return (0);
}
diff --git a/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.h b/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.h
index 618f7b5..92e1852 100644
--- a/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.h
+++ b/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.h
@@ -75,6 +75,11 @@
typedef struct lisp_gpe_fwd_entry_t_
{
/**
+ * Follows src/dst or dst only forwarding policy
+ */
+ u8 is_src_dst;
+
+ /**
* This object joins the FIB control plane graph to receive updates to
* for changes to the graph.
*/