summaryrefslogtreecommitdiffstats
path: root/vpp-api-test
diff options
context:
space:
mode:
authorFilip Tehlar <ftehlar@cisco.com>2016-05-13 17:37:35 +0200
committerFlorin Coras <florin.coras@gmail.com>2016-05-15 15:02:51 +0000
commit195bceec5685cb367519e37f22b36f5f99819827 (patch)
treec2b2a67bf18647986d36bf81d46e7434b392ba04 /vpp-api-test
parent75a37b372efc2b4a324aa38b53487b8168358a63 (diff)
ONE-13: Add CLI/API for LISP static remote mappings
Change-Id: Ic4c717af9629541bac0a0e6c65d0157619c8f578 Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
Diffstat (limited to 'vpp-api-test')
-rw-r--r--vpp-api-test/vat/api_format.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/vpp-api-test/vat/api_format.c b/vpp-api-test/vat/api_format.c
index 496b2d60d76..bf1a3931b0b 100644
--- a/vpp-api-test/vat/api_format.c
+++ b/vpp-api-test/vat/api_format.c
@@ -9810,6 +9810,132 @@ api_lisp_enable_disable (vat_main_t * vam)
return 0;
}
+/** Used for transferring locators via VPP API */
+typedef CLIB_PACKED(struct
+{
+ u8 is_ip4; /**< is locator an IPv4 address? */
+ u8 addr[16]; /**< IPv4/IPv6 address */
+}) rloc_t;
+
+/**
+ * Add/del remote mapping from LISP control plane and updates
+ * forwarding entries in data-plane accordingly.
+ *
+ * @param vam vpp API test context
+ * @return return code
+ */
+static int
+api_lisp_add_del_remote_mapping (vat_main_t * vam)
+{
+ unformat_input_t * input = vam->input;
+ vl_api_lisp_add_del_remote_mapping_t *mp;
+ f64 timeout = ~0;
+ u32 vni = 0;
+ u8 seid_set = 0, deid_set = 0;
+ ip4_address_t seid4, deid4, rloc4;
+ ip6_address_t seid6, deid6, rloc6;
+ u32 seid_len = 0, deid_len = 0, len;
+ u8 deid_is_ip4 = 0, seid_is_ip4 = 0;
+ u8 is_add = 1;
+ u32 action = ~0;
+ rloc_t * rlocs = 0, rloc;
+
+ /* Parse args required to build the message */
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
+ if (unformat(input, "del")) {
+ is_add = 0;
+ } else if (unformat(input, "add")) {
+ is_add = 1;
+ } else if (unformat(input, "deid %U/%d", unformat_ip4_address,
+ &deid4, &len)) {
+ deid_set = 1;
+ deid_is_ip4 = 1;
+ deid_len = len;
+ } else if (unformat(input, "deid %U/%d", unformat_ip6_address,
+ &deid6, &len)) {
+ deid_set = 1;
+ deid_is_ip4 = 0;
+ deid_len = len;
+ } else if (unformat(input, "seid %U/%d", unformat_ip4_address,
+ &seid4, &len)) {
+ seid_set = 1;
+ seid_is_ip4 = 1;
+ seid_len = len;
+ } else if (unformat(input, "seid %U/%d", unformat_ip6_address,
+ &seid6, &len)) {
+ seid_set = 1;
+ seid_is_ip4 = 0;
+ seid_len = len;
+ } else if (unformat(input, "vni %d", &vni)) {
+ ;
+ } else if (unformat(input, "rloc %U", unformat_ip4_address, &rloc4)) {
+ rloc.is_ip4 = 1;
+ clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
+ vec_add1 (rlocs, rloc);
+ } else if (unformat(input, "rloc %U", unformat_ip6_address, &rloc6)) {
+ rloc.is_ip4 = 0;
+ clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
+ vec_add1 (rlocs, rloc);
+ } else if (unformat(input, "action %d", &action)) {
+ ;
+ } else {
+ clib_warning ("parse error '%U'", format_unformat_error, input);
+ return -99;
+ }
+ }
+
+ if (!seid_set || !deid_set) {
+ errmsg ("missing params!");
+ return -99;
+ }
+
+ if (seid_is_ip4 != deid_is_ip4) {
+ errmsg ("source and destination EIDs are not in " "same IP family!");
+ return -99;
+ }
+
+ if (is_add && (~0 == action)
+ && 0 == vec_len (rlocs)) {
+ errmsg ("no action set for negative map-reply!");
+ return -99;
+ }
+
+ M(LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping);
+ mp->is_add = is_add;
+ mp->vni = htonl (vni);
+ mp->seid_len = seid_len;
+ mp->action = (u8) action;
+ mp->deid_len = deid_len;
+ if (seid_is_ip4) {
+ mp->eid_is_ip4 = 1;
+ clib_memcpy (mp->seid, &seid4, sizeof (seid4));
+ } else {
+ mp->eid_is_ip4 = 0;
+ clib_memcpy (mp->seid, &seid6, sizeof (seid6));
+ }
+
+ if (deid_is_ip4) {
+ mp->eid_is_ip4 = 1;
+ clib_memcpy (mp->deid, &deid4, sizeof (deid4));
+ } else {
+ mp->eid_is_ip4 = 0;
+ clib_memcpy (mp->deid, &deid6, sizeof (deid6));
+ }
+
+ mp->rloc_num = vec_len (rlocs);
+ clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
+ vec_free (rlocs);
+
+ /* send it... */
+ S;
+
+ /* Wait for a reply... */
+ W;
+
+ /* NOTREACHED */
+ return 0;
+}
+
static int
api_lisp_gpe_add_del_iface(vat_main_t * vam)
{
@@ -10556,6 +10682,9 @@ _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
_(lisp_gpe_enable_disable, "enable|disable") \
_(lisp_enable_disable, "enable|disable") \
_(lisp_gpe_add_del_iface, "up|down") \
+_(lisp_add_del_remote_mapping, "add|del vni <vni> deid <dest-eid> seid" \
+ " <src-eid> rloc <locator> " \
+ "[rloc <loc> ... ]") \
_(lisp_locator_set_dump, "") \
_(lisp_local_eid_table_dump, "") \
_(lisp_gpe_tunnel_dump, "") \