+send_reply:
+ REPLY_MACRO(VL_API_LISP_ADD_DEL_REMOTE_MAPPING_REPLY);
+}
+
+static void
+vl_api_lisp_add_del_adjacency_t_handler (
+ vl_api_lisp_add_del_adjacency_t *mp)
+{
+ u32 i;
+ locator_t rloc;
+ vl_api_lisp_add_del_adjacency_reply_t * rmp;
+ vnet_lisp_add_del_adjacency_args_t _a, * a = &_a;
+
+ int rv = 0;
+ memset(a, 0, sizeof(a[0]));
+
+ ip_prefix_t * seid_pref = &gid_address_ippref(&a->seid);
+ ip_prefix_t * deid_pref = &gid_address_ippref(&a->deid);
+
+ 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;
+ u8 * seid_mac = gid_address_mac (&a->seid);
+ u8 * deid_mac = gid_address_mac (&a->deid);
+ gid_address_vni(&a->seid) = ntohl (mp->vni);
+ gid_address_vni(&a->deid) = ntohl (mp->vni);
+
+ switch (mp->eid_type)
+ {
+ case 0: /* ipv4 */
+ gid_address_type(&a->seid) = GID_ADDR_IP_PREFIX;
+ gid_address_type(&a->deid) = GID_ADDR_IP_PREFIX;
+ ip_address_set (seid_addr, mp->seid, IP4);
+ ip_address_set (deid_addr, mp->deid, IP4);
+ break;
+ case 1: /* ipv6 */
+ gid_address_type(&a->seid) = GID_ADDR_IP_PREFIX;
+ gid_address_type(&a->deid) = GID_ADDR_IP_PREFIX;
+ ip_address_set (seid_addr, mp->seid, IP6);
+ ip_address_set (deid_addr, mp->deid, IP6);
+ break;
+ case 2: /* l2 mac */
+ gid_address_type(&a->seid) = GID_ADDR_MAC;
+ gid_address_type(&a->deid) = GID_ADDR_MAC;
+ clib_memcpy (seid_mac, mp->seid, 6);
+ clib_memcpy (deid_mac, mp->deid, 6);
+ break;
+ default:
+ rv = VNET_API_ERROR_INVALID_EID_TYPE;
+ goto send_reply;
+ }
+
+ for (i = 0; i < mp->rloc_num; i++) {
+ rloc_t * r = &((rloc_t *) mp->rlocs)[i];
+ memset(&rloc, 0, sizeof(rloc));
+ ip_address_set(&gid_address_ip(&rloc.address), &r->addr,
+ 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;
+ vec_add1 (a->locators, rloc);
+ }
+
+ a->action = mp->action;
+ a->is_add = mp->is_add;
+
+ /* NOTE: the remote mapping is static, i.e., not authoritative and
+ * ttl is infinite. */
+ a->authoritative = 0;
+ a->ttl = ~0;
+
+ rv = vnet_lisp_add_del_adjacency (a);
+
+ vec_free (a->locators);
+send_reply:
+ REPLY_MACRO(VL_API_LISP_ADD_DEL_ADJACENCY_REPLY);