summaryrefslogtreecommitdiffstats
path: root/src/vnet/lisp-cp/lisp_api.c
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2017-01-24 11:38:18 -0800
committerDamjan Marion <dmarion.lists@gmail.com>2017-01-26 08:21:51 +0000
commitba888e46f799a1ae209c51fffdd6159d75b20cdd (patch)
treebd07381021852decd23fd417ed102bc9491e4822 /src/vnet/lisp-cp/lisp_api.c
parent2d6b2d6d1bbb130921ec525a1cc6e88f42717c79 (diff)
Add option to use LISP Proxy-ETR
When enabled, destinations with negative mappings or those not reachable via underlay have their traffic forwarded to the PETR. Change-Id: I1056b0959736144f27fcca7b79263f921e7a8bd9 Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vnet/lisp-cp/lisp_api.c')
-rw-r--r--src/vnet/lisp-cp/lisp_api.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/vnet/lisp-cp/lisp_api.c b/src/vnet/lisp-cp/lisp_api.c
index d3fc4627c5f..6e07a5c7000 100644
--- a/src/vnet/lisp-cp/lisp_api.c
+++ b/src/vnet/lisp-cp/lisp_api.c
@@ -73,6 +73,8 @@ _(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS, \
_(LISP_GET_MAP_REQUEST_ITR_RLOCS, lisp_get_map_request_itr_rlocs) \
_(SHOW_LISP_PITR, show_lisp_pitr) \
_(SHOW_LISP_MAP_REQUEST_MODE, show_lisp_map_request_mode) \
+_(LISP_USE_PETR, lisp_use_petr) \
+_(SHOW_LISP_USE_PETR, show_lisp_use_petr) \
/** Used for transferring locators via VPP API */
/* *INDENT-OFF* */
@@ -399,6 +401,53 @@ vl_api_lisp_pitr_set_locator_set_t_handler (vl_api_lisp_pitr_set_locator_set_t
}
static void
+vl_api_lisp_use_petr_t_handler (vl_api_lisp_use_petr_t * mp)
+{
+ vl_api_lisp_use_petr_reply_t *rmp;
+ int rv = 0;
+ ip_address_t addr;
+
+ ip_address_set (&addr, &mp->address, mp->is_ip4 ? IP4 : IP6);
+ rv = vnet_lisp_use_petr (&addr, mp->is_add);
+
+ REPLY_MACRO (VL_API_LISP_USE_PETR_REPLY);
+}
+
+static void
+vl_api_show_lisp_use_petr_t_handler (vl_api_show_lisp_use_petr_t * mp)
+{
+ unix_shared_memory_queue_t *q = NULL;
+ vl_api_show_lisp_use_petr_reply_t *rmp = NULL;
+ lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
+ mapping_t *m;
+ locator_set_t *ls = 0;
+ int rv = 0;
+ locator_t *loc;
+
+ q = vl_api_client_index_to_input_queue (mp->client_index);
+ if (q == 0)
+ {
+ return;
+ }
+
+ rmp->status = lcm->flags & LISP_FLAG_USE_PETR;
+ if (rmp->status)
+ {
+ m = pool_elt_at_index (lcm->mapping_pool, lcm->petr_map_index);
+ if (~0 != m->locator_set_index)
+ {
+ ls =
+ pool_elt_at_index (lcm->locator_set_pool, m->locator_set_index);
+ loc = pool_elt_at_index (lcm->locator_pool, ls->locator_indices[0]);
+ gid_address_put (rmp->address, &loc->address);
+ rmp->is_ip4 = (gid_address_ip_version (&loc->address) == IP4);
+ }
+ }
+
+ REPLY_MACRO (VL_API_SHOW_LISP_USE_PETR_REPLY);
+}
+
+static void
vl_api_lisp_add_del_map_request_itr_rlocs_t_handler
(vl_api_lisp_add_del_map_request_itr_rlocs_t * mp)
{