From: Filip Tehlar Date: Thu, 7 Jul 2016 13:40:36 +0000 (+0200) Subject: Add locator prority and weight to LISP API X-Git-Tag: v16.09-rc1~181 X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commitdiff_plain;h=4d5cabde54f847bccd365c64682e428aead30550 Add locator prority and weight to LISP API Change-Id: Ifa9bcd9a9c5dbda00ff8096909ccbc822445b8cb Signed-off-by: Filip Tehlar --- diff --git a/vnet/vnet/lisp-cp/control.c b/vnet/vnet/lisp-cp/control.c index f536560eae9..c4cdaa98c17 100644 --- a/vnet/vnet/lisp-cp/control.c +++ b/vnet/vnet/lisp-cp/control.c @@ -918,14 +918,14 @@ lisp_add_del_remote_mapping_command_fn (vlib_main_t * vm, clib_error_t * error = 0; unformat_input_t _line_input, * line_input = &_line_input; u8 is_add = 1, del_all = 0; - locator_t rloc, * rlocs = 0; + locator_t rloc, * rlocs = 0, * curr_rloc = 0; ip_prefix_t * deid_ippref, * seid_ippref; gid_address_t seid, deid; u8 * dmac = gid_address_mac (&deid); u8 * smac = gid_address_mac (&seid); u8 deid_set = 0, seid_set = 0; u8 * s = 0; - u32 vni, action = ~0; + u32 vni, action = ~0, p, w; int rv; /* Get a line of input. */ @@ -976,8 +976,22 @@ lisp_add_del_remote_mapping_command_fn (vlib_main_t * vm, gid_address_type (&seid) = GID_ADDR_MAC; seid_set = 1; } - else if (unformat (line_input, "rloc %U", unformat_ip_address, &rloc.address)) - vec_add1 (rlocs, rloc); + else if (unformat (line_input, "p %d w %d", &p, &w)) + { + if (!curr_rloc) + { + clib_warning ("No RLOC configured for setting priority/weight!"); + goto done; + } + curr_rloc->priority = p; + curr_rloc->weight = w; + } + else if (unformat (line_input, "rloc %U", unformat_ip_address, + &rloc.address)) + { + vec_add1 (rlocs, rloc); + curr_rloc = &rlocs[vec_len (rlocs) - 1]; + } else if (unformat (line_input, "action %s", &s)) { if (!strcmp ((char *)s, "no-action")) @@ -1062,6 +1076,7 @@ lisp_add_del_remote_mapping_command_fn (vlib_main_t * vm, clib_warning("failed to %s remote mapping!", is_add ? "add" : "delete"); done: + vec_free (rlocs); unformat_free (line_input); if (s) vec_free (s); @@ -2073,7 +2088,7 @@ lisp_cp_show_locator_sets_command_fn (vlib_main_t * vm, loc->weight); else msg = format (msg, "%16U%16d%16d\n", format_ip_address, - gid_address_ip(&loc->address), loc->priority, + &gid_address_ip(&loc->address), loc->priority, loc->weight); next_line = 1; } diff --git a/vpp-api-test/vat/api_format.c b/vpp-api-test/vat/api_format.c index 5ba7fbf2b2a..5e2b3275f48 100644 --- a/vpp-api-test/vat/api_format.c +++ b/vpp-api-test/vat/api_format.c @@ -10533,6 +10533,8 @@ api_lisp_enable_disable (vat_main_t * vam) typedef CLIB_PACKED(struct { u8 is_ip4; /**< is locator an IPv4 address? */ + u8 priority; /**< locator priority */ + u8 weight; /**< locator weight */ u8 addr[16]; /**< IPv4/IPv6 address */ }) rloc_t; @@ -10655,8 +10657,8 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam) u8 deid_type, seid_type; u32 seid_len = 0, deid_len = 0, len; u8 is_add = 1, del_all = 0; - u32 action = ~0; - rloc_t * rlocs = 0, rloc; + u32 action = ~0, p, w; + rloc_t * rlocs = 0, rloc, * curr_rloc = 0; seid_type = deid_type = (u8)~0; @@ -10692,14 +10694,23 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam) seid_type = 2; /* mac */ } else if (unformat(input, "vni %d", &vni)) { ; + } else if (unformat(input, "p %d w %d", &p, &w)) { + if (!curr_rloc) { + errmsg ("No RLOC configured for setting priority/weight!"); + return -99; + } + curr_rloc->priority = p; + curr_rloc->weight = w; } 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); + curr_rloc = &rlocs[vec_len (rlocs) - 1]; } 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); + curr_rloc = &rlocs[vec_len (rlocs) - 1]; } else if (unformat(input, "action %d", &action)) { ; } else { @@ -10786,10 +10797,9 @@ api_lisp_add_del_adjacency (vat_main_t * vam) u8 deid_type, seid_type; u32 seid_len = 0, deid_len = 0, len; u8 is_add = 1; - u32 action = ~0; - rloc_t * rlocs = 0, rloc; + u32 action = ~0, p, w; + rloc_t * rlocs = 0, rloc, * curr_rloc = 0; - memset(mp, 0, sizeof(mp[0])); seid_type = deid_type = (u8)~0; /* Parse args required to build the message */ @@ -10822,18 +10832,27 @@ api_lisp_add_del_adjacency (vat_main_t * vam) seid_type = 2; /* mac */ } else if (unformat(input, "vni %d", &vni)) { ; + } else if (unformat(input, "p %d w %d", &p, &w)) { + if (!curr_rloc) { + errmsg ("No RLOC configured for setting priority/weight!"); + return -99; + } + curr_rloc->priority = p; + curr_rloc->weight = w; } 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); + curr_rloc = &rlocs[vec_len (rlocs) - 1]; } 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); + curr_rloc = &rlocs[vec_len (rlocs) - 1]; } else if (unformat(input, "action %d", &action)) { ; } else { - clib_warning ("parse error '%U'", format_unformat_error, input); + errmsg ("parse error '%U'", format_unformat_error, input); return -99; } } @@ -12429,11 +12448,12 @@ _(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 deid seid" \ - " rloc " \ - "[rloc ... ] action ") \ -_(lisp_add_del_adjacency, "add|del vni deid seid" \ - " rloc " \ - "[rloc ... ] action ") \ + " rloc p " \ + "w [rloc ... ] " \ + "action ") \ +_(lisp_add_del_adjacency, "add|del vni deid seid " \ + " rloc p w "\ + "[rloc ... ] action ") \ _(lisp_pitr_set_locator_set, "locator-set | del") \ _(lisp_add_del_map_request_itr_rlocs, " [del]") \ _(lisp_eid_table_add_del_map, "[del] vni vrf ") \ diff --git a/vpp/vpp-api/api.c b/vpp/vpp-api/api.c index 330222fb2b6..f7338af5db1 100644 --- a/vpp/vpp-api/api.c +++ b/vpp/vpp-api/api.c @@ -5013,6 +5013,8 @@ vl_api_lisp_add_del_map_request_itr_rlocs_t_handler typedef CLIB_PACKED(struct { u8 is_ip4; /**< is locator an IPv4 address */ + u8 priority; /**< locator priority */ + u8 weight; /**< locator weight */ u8 addr[16]; /**< IPv4/IPv6 address */ }) rloc_t; @@ -5090,9 +5092,8 @@ vl_api_lisp_add_del_remote_mapping_t_handler ( r->is_ip4 ? IP4 : IP6); gid_address_ippref_len(&rloc.address) = r->is_ip4 ? 32: 128; gid_address_type(&rloc.address) = GID_ADDR_IP_PREFIX; - /* TODO fix API to pass priority and weight */ - rloc.priority = 1; - rloc.weight = 1; + rloc.priority = r->priority; + rloc.weight = r->weight; vec_add1 (rlocs, rloc); } @@ -5184,9 +5185,8 @@ vl_api_lisp_add_del_adjacency_t_handler ( r->is_ip4 ? IP4 : IP6); gid_address_ippref_len(&rloc.address) = r->is_ip4 ? 32: 128; gid_address_type(&rloc.address) = GID_ADDR_IP_PREFIX; - /* TODO fix API to pass priority and weight */ - rloc.priority = 1; - rloc.weight = 1; + rloc.priority = r->priority; + rloc.weight = r->weight; vec_add1 (a->locators, rloc); }