X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vnet%2Fvnet%2Flisp-cp%2Fcontrol.c;h=f966b3645defdad4c39a55caee4441eff10c13c0;hb=438109d576bd47a2095f2889b708306d37067d50;hp=fb4c8397d2dff0650d23d8e2bd612ecd82107d40;hpb=d983118bf6a5c5f09941946083e654f994b579fb;p=vpp.git diff --git a/vnet/vnet/lisp-cp/control.c b/vnet/vnet/lisp-cp/control.c index fb4c8397d2d..f966b3645de 100644 --- a/vnet/vnet/lisp-cp/control.c +++ b/vnet/vnet/lisp-cp/control.c @@ -795,7 +795,8 @@ vnet_lisp_add_del_mapping (gid_address_t * eid, locator_t * rlocs, u8 action, vnet_lisp_add_del_locator_set (ls_args, 0); /* return old mapping index */ - res_map_index[0] = mi; + if (res_map_index) + res_map_index[0] = mi; } /* success */ @@ -924,11 +925,10 @@ lisp_add_del_remote_mapping_command_fn (vlib_main_t * vm, unformat_input_t _line_input, * line_input = &_line_input; u8 is_add = 1, del_all = 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; + ip_prefix_t * eid_ippref; + gid_address_t eid; + u8 * dmac = gid_address_mac (&eid); + u8 eid_set = 0; u8 * s = 0; u32 vni, action = ~0, p, w; int rv; @@ -937,12 +937,10 @@ lisp_add_del_remote_mapping_command_fn (vlib_main_t * vm, if (! unformat_user (input, unformat_line_input, line_input)) return 0; - memset(&deid, 0, sizeof(deid)); - memset(&seid, 0, sizeof(seid)); + memset(&eid, 0, sizeof(eid)); memset(&rloc, 0, sizeof(rloc)); - seid_ippref = &gid_address_ippref(&seid); - deid_ippref = &gid_address_ippref(&deid); + eid_ippref = &gid_address_ippref(&eid); while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { @@ -952,34 +950,21 @@ lisp_add_del_remote_mapping_command_fn (vlib_main_t * vm, is_add = 0; else if (unformat (line_input, "add")) ; - else if (unformat (line_input, "deid %U", - unformat_ip_prefix, deid_ippref)) + else if (unformat (line_input, "eid %U", + unformat_ip_prefix, eid_ippref)) { - gid_address_type (&deid) = GID_ADDR_IP_PREFIX; - deid_set = 1; + gid_address_type (&eid) = GID_ADDR_IP_PREFIX; + eid_set = 1; } - else if (unformat (line_input, "deid %U", + else if (unformat (line_input, "eid %U", unformat_mac_address, dmac)) { - gid_address_type (&deid) = GID_ADDR_MAC; - deid_set = 1; + gid_address_type (&eid) = GID_ADDR_MAC; + eid_set = 1; } else if (unformat (line_input, "vni %u", &vni)) { - gid_address_vni (&seid) = vni; - gid_address_vni (&deid) = vni; - } - else if (unformat (line_input, "seid %U", - unformat_ip_prefix, seid_ippref)) - { - gid_address_type (&seid) = GID_ADDR_IP_PREFIX; - seid_set = 1; - } - else if (unformat (line_input, "seid %U", - unformat_mac_address, smac)) - { - gid_address_type (&seid) = GID_ADDR_MAC; - seid_set = 1; + gid_address_vni (&eid) = vni; } else if (unformat (line_input, "p %d w %d", &p, &w)) { @@ -1020,31 +1005,15 @@ lisp_add_del_remote_mapping_command_fn (vlib_main_t * vm, } } - if (!del_all) + if (!eid_set) { - if (!deid_set) - { - clib_warning ("missing deid!"); - goto done; - } + clib_warning ("missing eid!"); + goto done; + } - if (GID_ADDR_IP_PREFIX == gid_address_type (&deid)) - { - /* if seid not set, make sure the ip version is the same as that - * of the deid. This ensures the seid to be configured will be - * either 0/0 or ::/0 */ - if (!seid_set) - ip_prefix_version(seid_ippref) = ip_prefix_version(deid_ippref); + if (!del_all) + { - if (is_add && - (ip_prefix_version (deid_ippref) - != ip_prefix_version(seid_ippref))) - { - clib_warning ("source and destination EIDs are not" - " in the same IP family!"); - goto done; - } - } if (is_add && (~0 == action) && 0 == vec_len (rlocs)) @@ -1065,15 +1034,17 @@ lisp_add_del_remote_mapping_command_fn (vlib_main_t * vm, if (!is_add) { lisp_cp_main_t * lcm = vnet_lisp_cp_get_main (); - rv = lisp_add_del_adjacency (lcm, 0, &deid, /* is_add */ 0); - } - else - { - /* add as static remote mapping, i.e., not authoritative and infinite - * ttl */ - rv = vnet_lisp_add_del_mapping (&deid, rlocs, action, 0, ~0, is_add, 0); + rv = lisp_add_del_adjacency (lcm, 0, &eid, /* is_add */ 0); + if (rv) + { + goto done; + } } + /* add as static remote mapping, i.e., not authoritative and infinite + * ttl */ + rv = vnet_lisp_add_del_mapping (&eid, rlocs, action, 0, ~0, is_add, 0); + if (rv) clib_warning("failed to %s remote mapping!", is_add ? "add" : "delete"); @@ -1087,8 +1058,8 @@ done: VLIB_CLI_COMMAND (lisp_add_del_remote_mapping_command) = { .path = "lisp remote-mapping", - .short_help = "lisp remote-mapping add|del [del-all] vni " - "deid seid [action [action ] rloc [rloc ... ]", .function = lisp_add_del_remote_mapping_command_fn, }; @@ -2441,6 +2412,7 @@ build_itr_rloc_list (lisp_cp_main_t * lcm, locator_set_t * loc_set) addr = ip_interface_address_get_address (&lcm->im4->lookup_main, ia); ip_address_set (rloc, addr, IP4); ip_prefix_len (ippref) = 32; + ip_prefix_normalize (ippref); vec_add1 (rlocs, gid[0]); })); @@ -2451,6 +2423,7 @@ build_itr_rloc_list (lisp_cp_main_t * lcm, locator_set_t * loc_set) addr = ip_interface_address_get_address (&lcm->im6->lookup_main, ia); ip_address_set (rloc, addr, IP6); ip_prefix_len (ippref) = 128; + ip_prefix_normalize (ippref); vec_add1 (rlocs, gid[0]); })); }