diff options
Diffstat (limited to 'vpp/api/api.c')
-rw-r--r-- | vpp/api/api.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/vpp/api/api.c b/vpp/api/api.c index 24f7d9c0e19..0d5f224118e 100644 --- a/vpp/api/api.c +++ b/vpp/api/api.c @@ -326,6 +326,7 @@ _(LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver) \ _(LISP_GPE_ENABLE_DISABLE, lisp_gpe_enable_disable) \ _(LISP_ENABLE_DISABLE, lisp_enable_disable) \ _(LISP_GPE_ADD_DEL_IFACE, lisp_gpe_add_del_iface) \ +_(LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping) \ _(LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump) \ _(LISP_LOCAL_EID_TABLE_DUMP, lisp_local_eid_table_dump) \ _(LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump) \ @@ -4823,6 +4824,13 @@ vl_api_lisp_gpe_add_del_iface_t_handler( REPLY_MACRO(VL_API_LISP_GPE_ADD_DEL_IFACE_REPLY); } +/** 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; + static void send_lisp_locator_set_details_set_address (vl_api_lisp_locator_set_details_t *rmp, @@ -4841,6 +4849,62 @@ send_lisp_locator_set_details_set_address } static void +vl_api_lisp_add_del_remote_mapping_t_handler ( + vl_api_lisp_add_del_remote_mapping_t *mp) +{ + u32 i; + ip_address_t rloc, * rlocs = 0; + vl_api_lisp_add_del_remote_mapping_reply_t * rmp; + int rv = 0; + gid_address_t _seid, * seid = &_seid; + gid_address_t _deid, * deid = &_deid; + ip_prefix_t * seid_pref = &gid_address_ippref(seid); + ip_prefix_t * deid_pref = &gid_address_ippref(deid); + + gid_address_type(seid) = GID_ADDR_IP_PREFIX; + gid_address_type(deid) = GID_ADDR_IP_PREFIX; + ip_address_t * seid_addr = &ip_prefix_addr(seid_pref); + ip_address_t * deid_addr = &ip_prefix_addr(deid_pref); + ip_prefix_len(seid_pref) = mp->seid_len; + ip_prefix_len(deid_pref) = mp->deid_len; + gid_address_set_vni (seid, ntohl (mp->vni)); + gid_address_set_vni (deid, ntohl (mp->vni)); + + if (mp->eid_is_ip4) { + ip_prefix_version(seid_pref) = IP4; + ip_prefix_version(deid_pref) = IP4; + clib_memcpy (&ip_addr_v4(seid_addr), + mp->seid, sizeof (ip_addr_v4(seid_addr))); + clib_memcpy (&ip_addr_v4(deid_addr), + mp->deid, sizeof (ip_addr_v4(deid_addr))); + } else { + ip_prefix_version(seid_pref) = IP6; + ip_prefix_version(deid_pref) = IP6; + clib_memcpy (&ip_addr_v6(seid_addr), + mp->seid, sizeof (ip_addr_v6(seid_addr))); + clib_memcpy (&ip_addr_v6(deid_addr), + mp->deid, sizeof (ip_addr_v6(deid_addr))); + } + + for (i = 0; i < mp->rloc_num; i++) { + rloc_t * r = &((rloc_t *) mp->rlocs)[i]; + if (r->is_ip4) { + clib_memcpy (&ip_addr_v4(&rloc), &r->addr, sizeof (rloc_t)); + ip_addr_version (&rloc) = IP4; + } else { + clib_memcpy (&ip_addr_v6(&rloc), &r->addr, sizeof (rloc_t)); + ip_addr_version (&rloc) = IP6; + } + vec_add1 (rlocs, rloc); + } + + rv = vnet_lisp_add_del_remote_mapping (deid, seid, rlocs, + mp->action, mp->is_add); + vec_free (rlocs); + REPLY_MACRO(VL_API_LISP_GPE_ADD_DEL_IFACE_REPLY); +} + +static void send_lisp_locator_set_details (lisp_cp_main_t *lcm, locator_set_t *lsit, unix_shared_memory_queue_t *q, |