diff options
author | 2016-06-27 13:09:20 +0200 | |
---|---|---|
committer | 2016-06-29 18:54:02 +0000 | |
commit | 006eb2689b901b4700f4360cc0417c6c0d93cc46 (patch) | |
tree | 62f2005841fa85d7050ff0444ddf07ac7e45e619 /vpp-api-test | |
parent | 71fb06fba05ff74390f4ff013ff14ea1086ab631 (diff) |
Add support for ethernet address in LISP API
Change-Id: I9f1522f55bdd11602784a421fd850b839a1070e6
Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
Diffstat (limited to 'vpp-api-test')
-rw-r--r-- | vpp-api-test/vat/api_format.c | 138 |
1 files changed, 90 insertions, 48 deletions
diff --git a/vpp-api-test/vat/api_format.c b/vpp-api-test/vat/api_format.c index b00dcccd..a4fbf0d0 100644 --- a/vpp-api-test/vat/api_format.c +++ b/vpp-api-test/vat/api_format.c @@ -1984,12 +1984,21 @@ vl_api_lisp_local_eid_table_details_t_handler ( { vat_main_t *vam = &vat_main; u8 *prefix; + u8 * (*format_eid)(u8 *, va_list *) = 0; - prefix = format(0, "[&d] %U/%d", + switch (mp->eid_type) + { + case 0: format_eid = format_ip4_address; break; + case 1: format_eid = format_ip6_address; break; + case 2: format_eid = format_ethernet_address; break; + default: + errmsg ("unknown EID type %d!", mp->eid_type); + return; + } + + prefix = format(0, "[%d] %U/%d", clib_net_to_host_u32 (mp->vni), - mp->eid_is_ipv6 ? format_ip6_address : format_ip4_address, - mp->eid_ip_address, - mp->eid_prefix_len); + format_eid, mp->eid, mp->eid_prefix_len); fformat(vam->ofp, "%=20s%=30s\n", mp->locator_set_name, prefix); @@ -2005,6 +2014,7 @@ vl_api_lisp_local_eid_table_details_t_handler_json ( vat_json_node_t *node = NULL; struct in6_addr ip6; struct in_addr ip4; + u8 * s = 0; if (VAT_JSON_ARRAY != vam->json_tree.type) { ASSERT(VAT_JSON_NONE == vam->json_tree.type); @@ -2014,15 +2024,27 @@ vl_api_lisp_local_eid_table_details_t_handler_json ( vat_json_init_object(node); vat_json_object_add_string_copy(node, "locator-set", mp->locator_set_name); - if (mp->eid_is_ipv6) { - clib_memcpy(&ip6, mp->eid_ip_address, sizeof(ip6)); - vat_json_object_add_ip6(node, "eid address", ip6); - } else { - clib_memcpy(&ip4, mp->eid_ip_address, sizeof(ip4)); - vat_json_object_add_ip4(node, "eid address", ip4); - } + switch (mp->eid_type) + { + case 0: + clib_memcpy(&ip4, mp->eid, sizeof(ip4)); + vat_json_object_add_ip4(node, "eid-address", ip4); + case 1: + clib_memcpy(&ip6, mp->eid, sizeof(ip6)); + vat_json_object_add_ip6(node, "eid-address", ip6); + break; + case 2: + s = format (0, "%U", format_ethernet_address, mp->eid); + vec_add1(s, 0); + vat_json_object_add_string_copy(node, "eid-address", s); + vec_free(s); + break; + default: + errmsg ("unknown EID type %d!", mp->eid_type); + return; + } vat_json_object_add_uint(node, "vni", clib_net_to_host_u32 (mp->vni)); - vat_json_object_add_uint(node, "eid prefix len", mp->eid_prefix_len); + vat_json_object_add_uint(node, "eid-prefix-len", mp->eid_prefix_len); } static u8 * @@ -10086,8 +10108,10 @@ api_lisp_add_del_local_eid(vat_main_t * vam) u8 is_add = 1; u8 eidv4_set = 0; u8 eidv6_set = 0; + u8 eid_type = (u8)~0; ip4_address_t eidv4; ip6_address_t eidv6; + u8 mac[6] = {0}; u8 tmp_eid_lenght = ~0; u8 eid_lenght = ~0; u8 *locator_set_name = NULL; @@ -10104,10 +10128,14 @@ api_lisp_add_del_local_eid(vat_main_t * vam) &eidv4, &tmp_eid_lenght)) { eid_lenght = tmp_eid_lenght; eidv4_set = 1; + eid_type = 0; /* ipv4 type */ } else if (unformat(input, "eid %U/%d", unformat_ip6_address, &eidv6, &tmp_eid_lenght)) { eid_lenght = tmp_eid_lenght; eidv6_set = 1; + eid_type = 1; /* ipv6 type */ + } else if (unformat(input, "eid %U", unformat_ethernet_address, mac)) { + eid_type = 2; /* mac type */ } else if (unformat(input, "locator-set %s", &locator_set_name)) { locator_set_name_set = 1; } else @@ -10119,6 +10147,12 @@ api_lisp_add_del_local_eid(vat_main_t * vam) return -99; } + if ((u8)~0 == eid_type) { + errmsg ("EID address not set!"); + vec_free(locator_set_name); + return -99; + } + if (vec_len(locator_set_name) > 64) { errmsg ("locator-set name too long\n"); vec_free(locator_set_name); @@ -10132,12 +10166,6 @@ api_lisp_add_del_local_eid(vat_main_t * vam) return -99; } - if (!eidv4_set && !eidv6_set) { - errmsg ("eid addresses not set\n"); - vec_free(locator_set_name); - return -99; - } - if (eidv4_set && eid_lenght > 32) { errmsg ("eid prefix to big\n"); vec_free(locator_set_name); @@ -10154,13 +10182,18 @@ api_lisp_add_del_local_eid(vat_main_t * vam) M(LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid); mp->is_add = is_add; - if (eidv6_set) { - mp->is_ipv6 = 1; - clib_memcpy(mp->ip_address, &eidv6, sizeof(eidv6)); - } else { - mp->is_ipv6 = 0; - clib_memcpy(mp->ip_address, &eidv4, sizeof(eidv4)); + switch (eid_type) { + case 0: /* ipv4 */ + clib_memcpy (mp->eid, &eidv4, sizeof(eidv4)); + break; + case 1: /* ipv6 */ + clib_memcpy (mp->eid, &eidv6, sizeof(eidv6)); + break; + case 2: /* mac */ + clib_memcpy (mp->eid, mac, 6); + break; } + mp->eid_type = eid_type; mp->prefix_len = eid_lenght; mp->vni = clib_host_to_net_u32(vni); clib_memcpy(mp->locator_set_name, locator_set_name, @@ -10545,15 +10578,18 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam) 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; + u8 deid_mac[6] = {0}; + u8 seid_mac[6] = {0}; + u8 deid_type, seid_type; u32 seid_len = 0, deid_len = 0, len; - u8 deid_is_ip4 = 0, seid_is_ip4 = 0; u8 is_add = 1, del_all = 0; u32 action = ~0; rloc_t * rlocs = 0, rloc; + seid_type = deid_type = (u8)~0; + /* Parse args required to build the message */ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat(input, "del-all")) { @@ -10564,24 +10600,26 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam) is_add = 1; } else if (unformat(input, "deid %U/%d", unformat_ip4_address, &deid4, &len)) { - deid_set = 1; - deid_is_ip4 = 1; + deid_type = 0; /* ipv4 */ deid_len = len; } else if (unformat(input, "deid %U/%d", unformat_ip6_address, &deid6, &len)) { - deid_set = 1; - deid_is_ip4 = 0; + deid_type = 1; /* ipv6 */ deid_len = len; + } else if (unformat(input, "deid %U", unformat_ethernet_address, + deid_mac)) { + deid_type = 2; /* mac */ } else if (unformat(input, "seid %U/%d", unformat_ip4_address, &seid4, &len)) { - seid_set = 1; - seid_is_ip4 = 1; + seid_type = 0; /* ipv4 */ seid_len = len; } else if (unformat(input, "seid %U/%d", unformat_ip6_address, &seid6, &len)) { - seid_set = 1; - seid_is_ip4 = 0; + seid_type = 1; /* ipv6 */ seid_len = len; + } else if (unformat(input, "seid %U", unformat_ethernet_address, + seid_mac)) { + seid_type = 2; /* mac */ } else if (unformat(input, "vni %d", &vni)) { ; } else if (unformat(input, "rloc %U", unformat_ip4_address, &rloc4)) { @@ -10600,13 +10638,13 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam) } } - if (!seid_set || !deid_set) { + if ((u8)~0 == deid_type) { errmsg ("missing params!"); return -99; } - if (seid_is_ip4 != deid_is_ip4) { - errmsg ("source and destination EIDs are not in " "same IP family!"); + if (seid_type != deid_type) { + errmsg ("source and destination EIDs are of different types!"); return -99; } @@ -10623,20 +10661,24 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam) mp->action = (u8) action; mp->deid_len = deid_len; mp->del_all = del_all; - 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)); - } + mp->eid_type = deid_type; - if (deid_is_ip4) { - mp->eid_is_ip4 = 1; + switch (mp->eid_type) { + case 0: + clib_memcpy (mp->seid, &seid4, sizeof (seid4)); clib_memcpy (mp->deid, &deid4, sizeof (deid4)); - } else { - mp->eid_is_ip4 = 0; + break; + case 1: + clib_memcpy (mp->seid, &seid6, sizeof (seid6)); clib_memcpy (mp->deid, &deid6, sizeof (deid6)); + break; + case 2: + clib_memcpy (mp->seid, seid_mac, 6); + clib_memcpy (mp->deid, deid_mac, 6); + break; + default: + errmsg ("unknown EID type %d!", mp->eid_type); + return 0; } mp->rloc_num = vec_len (rlocs); |