28 #include <openssl/evp.h> 31 #define MAX_VALUE_U24 0xffffff 34 #define TIME_UNTIL_REFETCH_OR_DELETE 20 35 #define MAPPING_TIMEOUT (((m->ttl) * 60) - TIME_UNTIL_REFETCH_OR_DELETE) 81 u8 smr_invoked,
u8 is_resend);
93 vec_elt ((lm)->if_address_pool_index_by_sw_if_index, (sw_if_index)) :
137 memcpy (&prefix->
fp_addr.ip4, &addr->
ip.ip4,
144 memcpy (&prefix->
fp_addr.ip6, &addr->
ip.ip6,
147 prefix->___fp___pad = 0;
212 u8 with_default_route)
223 return VNET_API_ERROR_INVALID_VALUE;
231 clib_warning (
"vni %d not associated to a bridge domain!", vni);
232 return VNET_API_ERROR_INVALID_VALUE;
297 u32 i, limitp = 0, li, found = 0, esi;
329 if ((found && lp->
priority == limitp)
330 || (!found && lp->
priority >= limitp))
348 if ((
u32) ~ 0 == esi)
431 uword *feip = 0, *dpid, *rmts_stored_idxp = 0;
446 if (lcm->
flags & LISP_FLAG_PITR_MODE)
458 lcl_eid = &lcl_map->
eid;
464 rmt_eid = &rmt_map->
eid;
521 if (rv == 0 && (lcm->
flags & LISP_FLAG_USE_PETR))
561 if (!rmts_stored_idxp)
570 rmts_idx = (
u32) (*rmts_stored_idxp);
601 (
u8 *) & a,
sizeof (a));
623 if (gid_address_vni (&fwd->reid) != vni)
626 gid_address_copy (&adj.reid, &fwd->reid);
627 gid_address_copy (&adj.leid, &fwd->leid);
628 vec_add1 (adjs, adj);
677 return VNET_API_ERROR_LISP_DISABLED;
720 u32 * map_index_result)
723 u32 mi, *map_indexp, map_index,
i;
724 u32 **rmts = 0, *remote_idxp, rmts_itr, remote_idx;
734 return VNET_API_ERROR_INVALID_ARGUMENT;
739 return VNET_API_ERROR_INVALID_ARGUMENT;
752 return VNET_API_ERROR_VALUE_EXIST;
772 clib_warning (
"Locator set with index %d doesn't exist",
774 return VNET_API_ERROR_INVALID_VALUE;
781 vec_add1 (eid_indexes[0], map_index);
788 map_index_result[0] = map_index;
796 return VNET_API_ERROR_INVALID_VALUE;
802 for (i = 0; i <
vec_len (eid_indexes[0]); i++)
805 if (map_indexp[0] == mi)
833 if (lm_indexp[0] == mi)
846 vec_foreach_index (rmts_itr, rmts[0])
848 remote_idx = vec_elt (rmts[0], rmts_itr);
849 if (mi == remote_idx)
851 vec_del1 (rmts[0], rmts_itr);
873 u32 * map_index_result)
884 return VNET_API_ERROR_LISP_DISABLED;
898 return VNET_API_ERROR_INVALID_VALUE;
911 return (BIHASH_WALK_CONTINUE);
913 u32 bd = (
u32) (kvp->key[0] >> 32);
915 return (BIHASH_WALK_CONTINUE);
935 return (BIHASH_WALK_CONTINUE);
937 u32 bd = (
u32) (kvp->key[0] >> 32);
939 return (BIHASH_WALK_CONTINUE);
967 return (BIHASH_WALK_CONTINUE);
969 u32 bd = (
u32) (kvp->key[0] >> 32);
973 mac_copy (e.mac, (
void *) &kvp->value);
974 e.ip4 = (
u32) kvp->key[1];
977 return (BIHASH_WALK_CONTINUE);
1003 return (BIHASH_WALK_CONTINUE);
1005 u32 bd = (
u32) (kvp->key[0] >> 32);
1009 mac_copy (e.mac, (
void *) &kvp->value);
1013 return (BIHASH_WALK_CONTINUE);
1037 return VNET_API_ERROR_LISP_DISABLED;
1049 return VNET_API_ERROR_ENTRY_ALREADY_EXISTS;
1059 clib_warning (
"ONE entry %U not found - cannot delete!",
1074 uword *dp_idp, *vnip, **dp_table_by_vni, **vni_by_dp_table;
1079 return VNET_API_ERROR_LISP_DISABLED;
1085 if (!is_l2 && (vni == 0 || dp_id == 0))
1087 clib_warning (
"can't add/del default vni-vrf mapping!");
1091 dp_idp =
hash_get (dp_table_by_vni[0], vni);
1092 vnip =
hash_get (vni_by_dp_table[0], dp_id);
1098 clib_warning (
"vni %d or vrf %d already used in vrf/vni " 1099 "mapping!", vni, dp_id);
1102 hash_set (dp_table_by_vni[0], vni, dp_id);
1103 hash_set (vni_by_dp_table[0], dp_id, vni);
1111 if (!dp_idp || !vnip)
1113 clib_warning (
"vni %d or vrf %d not used in any vrf/vni! " 1114 "mapping!", vni, dp_id);
1138 for (i = 0; i <
vec_len (new_locators); i++)
1140 old_li =
vec_elt (old_ls_indexes, i);
1267 u32 * res_map_index,
u8 * is_updated)
1271 u32 mi, ls_index = 0, dst_map_index;
1278 return VNET_API_ERROR_LISP_DISABLED;
1282 res_map_index[0] = ~0;
1300 return VNET_API_ERROR_LISP_RLOC_LOCAL;
1311 clib_warning (
"mapping %U rejected due to collision with local " 1321 if (old_map->
action != a->
action && NULL != is_updated)
1339 res_map_index[0] = mi;
1349 ls_args->
index = ~0;
1359 res_map_index[0] = dst_map_index;
1385 res_map_index[0] = ~0;
1416 res_map_index[0] = mi;
1426 u32 mi, *map_indices = 0, *map_indexp;
1434 vec_add1 (map_indices, mi);
1477 u32 local_mi, remote_mi = ~0;
1482 return VNET_API_ERROR_LISP_DISABLED;
1489 clib_warning (
"Remote eid %U not found. Cannot add adjacency!",
1499 if (lcm->
flags & LISP_FLAG_PITR_MODE)
1529 clib_warning (
"Local eid %U not found. Cannot add adjacency!",
1552 return VNET_API_ERROR_LISP_DISABLED;
1555 if (mode >= _MR_MODE_MAX)
1557 clib_warning (
"Invalid LISP map request mode %d!", mode);
1558 return VNET_API_ERROR_INVALID_ARGUMENT;
1570 u32 locator_set_index = ~0;
1577 return VNET_API_ERROR_LISP_DISABLED;
1587 clib_warning (
"locator-set %v doesn't exist", locator_set_name);
1590 locator_set_index = p[0];
1620 u32 locator_set_index = ~0;
1627 return VNET_API_ERROR_LISP_DISABLED;
1633 clib_warning (
"locator-set %v doesn't exist", locator_set_name);
1636 locator_set_index = p[0];
1661 return VNET_API_ERROR_INVALID_ARGUMENT;
1695 return VNET_API_ERROR_LISP_DISABLED;
1710 ls_args->
index = ~0;
1720 lcm->
flags |= LISP_FLAG_USE_PETR;
1735 lcm->
flags &= ~LISP_FLAG_USE_PETR;
1746 u32 i, j, *loc_indexp, *ls_indexp, **ls_indexes, *to_be_deleted = 0;
1753 for (j = 0; j <
vec_len (ls_indexes[0]); j++)
1756 if (ls_indexp[0] == lsi)
1764 if (vec_len (ls_indexes[0]) == 0)
1773 for (i = 0; i <
vec_len (to_be_deleted); i++)
1782 static inline uword *
1821 return VNET_API_ERROR_VALUE_EXIST;
1830 u32 mapping_index,
u8 remove_only)
1834 uword *fei = 0, *rmts_idxp = 0;
1835 u32 **rmts = 0, *remote_idxp = 0, *rmts_copy = 0;
1848 rmts_copy =
vec_dup (rmts[0]);
1893 u32 ls_index,
u8 remove_only)
1903 for (i = 0; i <
vec_len (eid_indexes[0]); i++)
1912 u32 ls_index,
u32 loc_id)
1915 u32 **ls_indexes = NULL;
1923 vec_del1 (ls_indexes[0], ls_index);
1933 u32 loc_index = ~0, ls_index = ~0, *locit = NULL, **ls_indexes = NULL;
1942 return VNET_API_ERROR_LISP_DISABLED;
1949 return VNET_API_ERROR_INVALID_ARGUMENT;
1957 clib_warning (
"locator-set %d to be overwritten doesn't exist!",
1959 return VNET_API_ERROR_INVALID_ARGUMENT;
1966 ls_result[0] = p[0];
2007 else if (0 == loc->
local &&
2044 return VNET_API_ERROR_LISP_DISABLED;
2052 if (p && p[0] != (
u32) ~ 0)
2057 clib_warning (
"locator-set %d to be overwritten doesn't exist!",
2072 ls_result[0] = p[0];
2102 ls_result[0] = ls_index;
2123 clib_warning (
"locator-set with index %d doesn't exists", p[0]);
2129 clib_warning (
"Can't delete the locator-set used to constrain " 2130 "the itr-rlocs in map-requests!");
2137 if (
vec_len (eid_indexes[0]) != 0)
2140 (
"Can't delete a locator that supports a mapping!");
2216 dp_add_del_iface(lcm, vni, 0, 1,
2217 with_default_route);
2220 dp_add_del_iface(lcm, vni, 1, 1,
2221 with_default_route);
2252 a->
is_en = is_enable;
2257 a->
is_en ?
"enable" :
"disable");
2262 if (lcm->
flags & LISP_FLAG_XTR_MODE)
2276 if (lcm->
flags & LISP_FLAG_PETR_MODE)
2279 if (!(lcm->
flags & LISP_FLAG_XTR_MODE))
2288 if (lcm->
flags & LISP_FLAG_PITR_MODE)
2327 return VNET_API_ERROR_LISP_DISABLED;
2389 return VNET_API_ERROR_LISP_DISABLED;
2398 return VNET_API_ERROR_INVALID_ARGUMENT;
2412 #define foreach_lisp_cp_lookup_error \ 2414 _(MAP_REQUESTS_SENT, "map-request sent") \ 2415 _(ARP_REPLY_TX, "ARP replies sent") \ 2416 _(NDP_NEIGHBOR_ADVERTISEMENT_TX, \ 2417 "neighbor advertisement sent") 2420 #define _(sym,string) string, 2427 #define _(sym,str) LISP_CP_LOOKUP_ERROR_##sym, 2453 s =
format (s,
"LISP-CP-LOOKUP: map-resolver: %U destination eid %U",
2486 clib_warning (
"Can't find map-resolver and local interface ip!");
2516 addr = ip_interface_address_get_address (&lcm->im4->lookup_main, ia);
2517 ip_address_set (rloc, addr, AF_IP4);
2518 ip_prefix_len (ippref) = 32;
2519 ip_prefix_normalize (ippref);
2520 vec_add1 (rlocs, gid[0]);
2527 addr = ip_interface_address_get_address (&lcm->im6->lookup_main, ia);
2528 ip_address_set (rloc, addr, AF_IP6);
2529 ip_prefix_len (ippref) = 128;
2530 ip_prefix_normalize (ippref);
2531 vec_add1 (rlocs, gid[0]);
2550 clib_warning (
"Can't allocate buffer for Map-Request!");
2577 u64 * nonce_res,
u32 * bi_res)
2586 clib_warning (
"Can't allocate buffer for Map-Request!");
2635 #define foreach_msmr \ 2641 elect_map_ ## name (lisp_cp_main_t * lcm) \ 2644 vec_foreach (mr, lcm->map_ ## name ## s) \ 2648 ip_address_copy (&lcm->active_map_ ##name, &mr->address); \ 2649 lcm->do_map_ ## name ## _election = 0; \ 2689 addr = ip_interface_address_get_address (&lcm->im4->lookup_main,
2691 ip_address_set (new_ip, addr, AF_IP4);
2698 addr = ip_interface_address_get_address (&lcm->im6->lookup_main,
2700 ip_address_set (new_ip, addr, AF_IP6);
2724 add_locators (lcm, &rec, m->locator_set_index, NULL);
2725 vec_add1 (recs, rec);
2738 return VNET_CRYPTO_ALG_HMAC_SHA1;
2740 return VNET_CRYPTO_ALG_HMAC_SHA256;
2742 clib_warning (
"unsupported encryption key type: %d!", key_id);
2754 return VNET_CRYPTO_OP_SHA1_HMAC;
2756 return VNET_CRYPTO_OP_SHA256_HMAC;
2758 clib_warning (
"unsupported encryption key type: %d!", key_id);
2767 u16 auth_data_len,
u32 msg_len)
2770 MREG_KEY_ID (map_reg_hdr) = clib_host_to_net_u16 (key_id);
2778 op->
src = (
u8 *) map_reg_hdr;
2802 u32 bi, auth_data_len = 0, msg_len = 0;
2807 clib_warning (
"Can't allocate buffer for Map-Register!");
2818 auth_data_len, nonce_res,
2834 get_egress_map_ ##name## _ip (lisp_cp_main_t * lcm, ip_address_t * ip) \ 2837 while (lcm->do_map_ ## name ## _election \ 2838 | (0 == ip_fib_get_first_egress_ip_for_dst \ 2839 (lcm, &lcm->active_map_ ##name, ip))) \ 2841 if (0 == elect_map_ ## name (lcm)) \ 2845 vec_foreach (mr, lcm->map_ ## name ## s) mr->is_down = 0; \ 2855 #define foreach_lisp_cp_output_error \ 2856 _(MAP_REGISTERS_SENT, "map-registers sent") \ 2857 _(MAP_REQUESTS_SENT, "map-requests sent") \ 2858 _(RLOC_PROBES_SENT, "rloc-probes sent") 2860 #define _(sym,string) string, 2867 #define _(sym,str) LISP_CP_OUTPUT_ERROR_##sym, 2884 .name =
"lisp-cp-output",
2885 .vector_size =
sizeof (
u32),
2890 .error_strings = lisp_cp_output_error_strings,
2910 u32 next_index, *to_next;
2944 u32 si, rloc_probes_sent = 0;
2949 if (vec_len (e->locator_pairs) == 0)
2952 si = gid_dictionary_lookup (&lcm->mapping_index_by_gid, &e->leid);
2955 clib_warning (
"internal error: cannot find local eid %U in " 2956 "map-cache!", format_gid_address, &e->leid);
2967 if (lp->priority != lprio)
2971 send_rloc_probe (lcm, &e->reid, lm->locator_set_index, &lp->lcl_loc,
2979 LISP_CP_OUTPUT_ERROR_RLOC_PROBES_SENT,
2988 u32 bi, map_registers_sent = 0;
2993 u32 next_index, *to_next;
2996 if (get_egress_map_server_ip (lcm, &sloc) < 0)
3015 for (k = r + 1; k <
vec_end (records); k++)
3028 want_map_notif, group, key_id, key, &bi);
3045 map_registers_sent++;
3056 LISP_CP_OUTPUT_ERROR_MAP_REGISTERS_SENT,
3057 map_registers_sent);
3062 #define send_encapsulated_map_request(lcm, seid, deid, smr) \ 3063 _send_encapsulated_map_request(lcm, seid, deid, smr, 0) 3065 #define resend_encapsulated_map_request(lcm, seid, deid, smr) \ 3066 _send_encapsulated_map_request(lcm, seid, deid, smr, 1) 3071 u8 is_smr_invoked,
u8 is_resend)
3073 u32 next_index, bi = 0, *to_next, map_index;
3088 if (!gid_address_cmp (&pmr->src, seid)
3089 && !gid_address_cmp (&pmr->dst, deid))
3091 duplicate_pmr = pmr;
3097 if (!is_resend && duplicate_pmr)
3103 u8 pitr_mode = lcm->flags & LISP_FLAG_PITR_MODE;
3109 if (map_index == ~0)
3111 clib_warning (
"No local mapping found in eid-table for %U!",
3121 (
"Mapping found for src eid %U is not marked as local!",
3125 ls_index = map->locator_set_index;
3131 if (lcm->pitr_map_index != ~0)
3135 ls_index = map->locator_set_index;
3144 if (lcm->nsh_map_index == (
u32) ~ 0)
3152 ls_index = map->locator_set_index;
3158 if (~0 != lcm->mreq_itr_rlocs)
3160 ls_index = lcm->mreq_itr_rlocs;
3165 if (get_egress_map_resolver_ip (lcm, &sloc) < 0)
3168 duplicate_pmr->to_be_removed = 1;
3174 &lcm->active_map_resolver,
3175 &sloc, is_smr_invoked, &nonce, &bi);
3194 LISP_CP_OUTPUT_ERROR_MAP_REQUESTS_SENT, 1);
3204 hash_unset (lcm->pending_map_requests_by_nonce, nonce_del[0]);
3209 hash_set (lcm->pending_map_requests_by_nonce, nonce,
3210 duplicate_pmr - lcm->pending_map_requests_pool);
3215 pool_get (lcm->pending_map_requests_pool, pmr);
3220 pmr->is_smr_invoked = is_smr_invoked;
3222 hash_set (lcm->pending_map_requests_by_nonce, nonce,
3223 pmr - lcm->pending_map_requests_pool);
3285 return bd_config->
bd_id;
3299 clib_warning (
"bridge domain %d is not mapped to any vni!", bd);
3311 icmp6_neighbor_discovery_ethernet_link_layer_address_option_t *opt;
3345 if (clib_net_to_host_u16 (eh->
type) == ETHERNET_TYPE_ARP)
3350 if (clib_net_to_host_u16 (ah->
opcode)
3351 != ETHERNET_ARP_OPCODE_request)
3366 if (clib_net_to_host_u16 (eh->
type) == ETHERNET_TYPE_IP6)
3371 if (IP_PROTOCOL_ICMP6 == ip->
protocol)
3373 icmp6_neighbor_solicitation_or_advertisement_header_t *ndh;
3375 if (ndh->icmp.type == ICMP6_neighbor_solicitation)
3380 opt = (
void *) (ndh + 1);
3381 if ((opt->header.type !=
3382 ICMP6_NEIGHBOR_DISCOVERY_OPTION_source_link_layer_address)
3383 || (opt->header.n_data_u64s != 1))
3397 &ndh->target_address,
AF_IP6);
3420 if (clib_net_to_host_u16 (eh->
type) == ETHERNET_TYPE_NSH)
3439 icmp6_neighbor_discovery_ethernet_link_layer_address_option_t *opt;
3443 uword n_left_from, n_left_to_next;
3450 while (n_left_from > 0)
3454 while (n_left_from > 0 && n_left_to_next > 0)
3456 u32 pi0, sw_if_index0, next0;
3464 icmp6_neighbor_solicitation_or_advertisement_header_t *ndh;
3472 n_left_to_next -= 1;
3494 arp0->
opcode = clib_host_to_net_u16 (ETHERNET_ARP_OPCODE_reply);
3503 clib_memcpy (eth0->dst_address, eth0->src_address, 6);
3506 b0->
error = node->
errors[LISP_CP_LOOKUP_ERROR_ARP_REPLY_TX];
3526 opt = (
void *) (ndh + 1);
3528 ICMP6_NEIGHBOR_DISCOVERY_OPTION_target_link_layer_address;
3530 ndh->icmp.type = ICMP6_neighbor_advertisement;
3531 ndh->advertisement_flags = clib_host_to_net_u32
3534 ndh->icmp.checksum = 0;
3535 ndh->icmp.checksum =
3542 [LISP_CP_LOOKUP_ERROR_NDP_NEIGHBOR_ADVERTISEMENT_TX];
3586 b0->
error = node->
errors[LISP_CP_LOOKUP_ERROR_DROP];
3603 n_left_to_next, pi0, next0);
3643 .name =
"lisp-cp-lookup-ip4",
3644 .vector_size =
sizeof (
u32),
3663 .name =
"lisp-cp-lookup-ip6",
3664 .vector_size =
sizeof (
u32),
3683 .name =
"lisp-cp-lookup-l2",
3684 .vector_size =
sizeof (
u32),
3703 .name =
"lisp-cp-lookup-nsh",
3704 .vector_size =
sizeof (
u32),
3721 #define foreach_lisp_cp_input_error \ 3723 _(RLOC_PROBE_REQ_RECEIVED, "rloc-probe requests received") \ 3724 _(RLOC_PROBE_REP_RECEIVED, "rloc-probe replies received") \ 3725 _(MAP_NOTIFIES_RECEIVED, "map-notifies received") \ 3726 _(MAP_REPLIES_RECEIVED, "map-replies received") 3729 #define _(sym,string) string, 3736 #define _(sym,str) LISP_CP_INPUT_ERROR_##sym, 3756 s =
format (s,
"LISP-CP-INPUT: TODO");
3780 f64 expiration_time)
3785 u64 exp_clock_time = now + expiration_time * cpu_cps;
3878 u32 dst_map_index = 0;
3909 if (dst_map_index == (
u32) ~ 0)
3935 hash_unset(lcm->pending_map_requests_by_nonce, noncep[0]);
3957 u8 out[EVP_MAX_MD_SIZE] = { 0, };
3960 if ((
u16) ~ 0 == auth_data_len)
3962 clib_warning (
"invalid length for key_id %d!", key_id);
3989 result = memcmp (out, auth_data, auth_data_len);
4005 clib_warning (
"No pending map-register entry with nonce %lu!",
4040 u32 key_id,
u8 ** key_out)
4050 key_out[0] = m->
key;
4052 for (i = 1; i <
len; i++)
4079 for (i = 0; i <
count; i++)
4126 u16 auth_data_len = 0;
4160 - (
u8 *) mnotif_hdr, key_id, key))
4162 clib_warning (
"Map-notify auth data verification failed for nonce " 4163 "0x%lx!", a->
nonce);
4181 clib_warning (
"Can't allocate buffer for Map-Register!");
4208 u32 next_index, *to_next;
4226 b =
build_map_reply (lcm, &src, dst, nonce, probe_bit, records, dst_port,
4250 if (start < 0 && start < -
sizeof (b->
pre_data))
4256 *ip_hdr = b->
data + start;
4271 u32 i,
len = 0, rloc_probe_recv = 0;
4278 (
"Only SMR Map-Requests and RLOC probe supported for now!");
4333 src_port, &probed_loc);
4339 LISP_CP_INPUT_ERROR_RLOC_PROBE_REQ_RECEIVED,
4411 u32 n_left_from, *from, *to_next_drop, rloc_probe_rep_recv = 0,
4412 map_notifies_recv = 0;
4421 while (n_left_from > 0)
4423 u32 n_left_to_next_drop;
4426 to_next_drop, n_left_to_next_drop);
4427 while (n_left_from > 0 && n_left_to_next_drop > 0)
4435 to_next_drop[0] = bi0;
4437 n_left_to_next_drop -= 1;
4449 rloc_probe_rep_recv++;
4460 map_notifies_recv++;
4465 clib_warning (
"Unsupported LISP message type %d", type);
4469 b0->
error = node->
errors[LISP_CP_INPUT_ERROR_DROP];
4478 n_left_to_next_drop);
4481 LISP_CP_INPUT_ERROR_RLOC_PROBE_REP_RECEIVED,
4482 rloc_probe_rep_recv);
4484 LISP_CP_INPUT_ERROR_MAP_NOTIFIES_RECEIVED,
4492 .name =
"lisp-cp-input",
4493 .vector_size =
sizeof (
u32),
4498 .error_strings = lisp_cp_input_error_strings,
4551 lcm->
flags |= LISP_FLAG_XTR_MODE;
4597 if (lisp_stats_api_fill (lcm, lgm, &stat, key, index))
4598 vec_add1 (stats, stat);
4621 u8 smr_invoked,
u8 is_resend)
4631 (
u8 *) & a,
sizeof (a));
4654 clib_warning (
"Map resolver %U not found - probably deleted " 4660 clib_warning (
"map resolver %U is unreachable, ignoring",
4670 elect_map_resolver (lcm);
4694 u32 *to_be_removed = 0, *pmr_index;
4699 if (pmr->to_be_removed)
4701 clib_fifo_foreach (nonce, pmr->nonces, ({
4702 hash_unset (lcm->pending_map_requests_by_nonce, nonce[0]);
4705 vec_add1 (to_be_removed, pmr - lcm->pending_map_requests_pool);
4750 clib_warning (
"Map server %U not found - probably deleted " 4756 clib_warning (
"map server %U is unreachable, ignoring",
4765 elect_map_server (lcm);
4784 u32 *to_be_removed = 0, *pmr_index;
4786 static u64 mreg_sent_counter = 0;
4797 if (!update_pending_map_register (pmr, dt, &del_all))
4801 vec_add1 (to_be_removed, pmr - lcm->pending_map_registers_pool);
4810 pool_free (lcm->pending_map_registers_pool);
4811 hash_free (lcm->map_register_messages_by_nonce);
4831 mreg_sent_counter++;
4857 if (!pmr->to_be_removed)
4858 update_pending_request (pmr, period);
4876 _vec_len (expired) = 0;
4890 return VNET_API_ERROR_LISP_DISABLED;
4893 lcm->
flags |= LISP_FLAG_STATS_ENABLED;
4895 lcm->
flags &= ~LISP_FLAG_STATS_ENABLED;
4906 return VNET_API_ERROR_LISP_DISABLED;
4908 return lcm->
flags & LISP_FLAG_STATS_ENABLED;
4918 "lisp-retry-service",
4930 return VNET_API_ERROR_INVALID_ARGUMENT;
4947 u8 pitr_mode = lcm->
flags & LISP_FLAG_PITR_MODE;
4948 u8 xtr_mode = lcm->
flags & LISP_FLAG_XTR_MODE;
4949 u8 petr_mode = lcm->
flags & LISP_FLAG_PETR_MODE;
4951 if (pitr_mode && is_enabled)
4952 return VNET_API_ERROR_INVALID_ARGUMENT;
4954 if (is_enabled && xtr_mode)
4956 if (!is_enabled && !xtr_mode)
4966 lcm->
flags |= LISP_FLAG_XTR_MODE;
4975 lcm->
flags &= ~LISP_FLAG_XTR_MODE;
4984 u8 xtr_mode = lcm->
flags & LISP_FLAG_XTR_MODE;
4985 u8 pitr_mode = lcm->
flags & LISP_FLAG_PITR_MODE;
4987 if (xtr_mode && is_enabled)
4988 return VNET_API_ERROR_INVALID_VALUE;
4990 if (is_enabled && pitr_mode)
4992 if (!is_enabled && !pitr_mode)
4999 lcm->
flags |= LISP_FLAG_PITR_MODE;
5004 lcm->
flags &= ~LISP_FLAG_PITR_MODE;
5013 u8 xtr_mode = lcm->
flags & LISP_FLAG_XTR_MODE;
5014 u8 petr_mode = lcm->
flags & LISP_FLAG_PETR_MODE;
5016 if (is_enabled && petr_mode)
5018 if (!is_enabled && !petr_mode)
5027 lcm->
flags |= LISP_FLAG_PETR_MODE;
5035 lcm->
flags &= ~LISP_FLAG_PETR_MODE;
5044 return (lcm->
flags & LISP_FLAG_XTR_MODE);
5051 return (lcm->
flags & LISP_FLAG_PITR_MODE);
5058 return (lcm->
flags & LISP_FLAG_PETR_MODE);
u32 vnet_crypto_process_ops(vlib_main_t *vm, vnet_crypto_op_t ops[], u32 n_ops)
void lisp_gpe_tenant_l2_iface_unlock(u32 vni)
Release the lock held on the tenant's L3 interface.
#define ICMP6_NEIGHBOR_ADVERTISEMENT_FLAG_SOLICITED
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
#define QUICK_MAP_REGISTER_INTERVAL
#define MNOTIFY_REC_COUNT(h_)
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index, VLIB_BUFFER_IS_TRACED: trace this buffer.
fib_protocol_t fp_proto
protocol type
const lisp_gpe_tunnel_t * lisp_gpe_tunnel_get(index_t lgti)
#define MREQ_ITR_RLOC_COUNT(h_)
static uword lisp_cp_input(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
#define gid_address_ip_version(_a)
#define vec_foreach_index(var, v)
Iterate over vector indices.
map_records_arg_t ** map_records_args_pool
Per thread pool of records shared with thread0.
void * lisp_msg_put_mreq(lisp_cp_main_t *lcm, vlib_buffer_t *b, gid_address_t *seid, gid_address_t *deid, gid_address_t *rlocs, u8 is_smr_invoked, u8 rloc_probe_set, u64 *nonce)
void TW() tw_timer_wheel_init(TWT(tw_timer_wheel) *tw, void *expired_timer_callback, f64 timer_interval_in_seconds, u32 max_expirations)
Initialize a tw timer wheel template instance.
void * lisp_msg_put_map_register(vlib_buffer_t *b, mapping_t *records, u8 want_map_notify, u16 auth_data_len, u64 *nonce, u32 *msg_len)
#define MREP_REC_COUNT(h_)
static int send_map_register(lisp_cp_main_t *lcm, u8 want_map_notif)
#define hash_set(h, key, value)
l2_input_config_t * configs
static u8 * vlib_buffer_get_tail(vlib_buffer_t *b)
Get pointer to the end of buffer's data.
#define clib_fifo_head(v)
u8 vnet_lisp_get_pitr_mode(void)
#define gid_address_type(_a)
vlib_node_registration_t lisp_cp_lookup_ip4_node
(constructor) VLIB_REGISTER_NODE (lisp_cp_lookup_ip4_node)
map_records_arg_t * parse_map_reply(vlib_buffer_t *b)
static void mapping_start_expiration_timer(lisp_cp_main_t *lcm, u32 mi, f64 expiration_time)
static f64 vlib_process_wait_for_event_or_clock(vlib_main_t *vm, f64 dt)
Suspend a cooperative multi-tasking thread Waits for an event, or for the indicated number of seconds...
#define hash_unset(h, key)
u32 * lcl_to_rmt_adjs_by_lcl_idx
#define ip_prefix_addr(_a)
void process_map_request(vlib_main_t *vm, vlib_node_runtime_t *node, lisp_cp_main_t *lcm, vlib_buffer_t *b)
void ip_address_set(ip_address_t *dst, const void *src, u8 version)
lisp_api_l2_arp_entry_t * vnet_lisp_l2_arp_entries_get_by_bd(u32 bd)
#define SHA256_AUTH_DATA_LEN
static uword clib_fifo_elts(void *v)
ip_address_t active_map_resolver
vnet_main_t * vnet_get_main(void)
static vnet_hw_interface_t * vnet_get_sup_hw_interface(vnet_main_t *vnm, u32 sw_if_index)
#define RLOC_PROBING_INTERVAL
u32 bd_id
bridge domain id
lisp_msmr_t * map_resolvers
u32 vnet_lisp_set_transport_protocol(u8 protocol)
void ip_prefix_to_fib_prefix(const ip_prefix_t *ip_prefix, fib_prefix_t *fib_prefix)
convert from a LISP to a FIB prefix
#define MREQ_REC_COUNT(h_)
static vlib_buffer_t * build_encapsulated_map_request(lisp_cp_main_t *lcm, gid_address_t *seid, gid_address_t *deid, locator_set_t *loc_set, ip_address_t *mr_ip, ip_address_t *sloc, u8 is_smr_invoked, u64 *nonce_res, u32 *bi_res)
static void lisp_cp_register_dst_port(vlib_main_t *vm)
locator_pair_t * locator_pairs
static void queue_map_notify_for_processing(map_records_arg_t *a)
void lisp_gpe_tenant_l3_iface_unlock(u32 vni)
Release the lock held on the tenant's L3 interface.
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
u32 retry_service_index
Retry service node index.
clib_error_t * vnet_lisp_gpe_enable_disable(vnet_lisp_gpe_enable_disable_args_t *a)
Enable/disable LISP-GPE.
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
#define foreach_lisp_cp_input_error
static uword lisp_cp_lookup_nsh(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
u32 * local_mappings_indexes
static f64 vlib_time_now(vlib_main_t *vm)
static void update_adjacencies_by_map_index(lisp_cp_main_t *lcm, u32 mapping_index, u8 remove_only)
u32 vnet_lisp_gpe_add_nsh_iface(lisp_gpe_main_t *lgm)
Add LISP-GPE NSH interface.
static void lisp_cp_enable_l2_l3_ifaces(lisp_cp_main_t *lcm, u8 with_default_route)
lisp_cp_enable_l2_l3_ifaces
#define PENDING_MREQ_QUEUE_LEN
u8 vnet_lisp_get_map_request_mode(void)
vlib_node_registration_t lisp_cp_lookup_nsh_node
(constructor) VLIB_REGISTER_NODE (lisp_cp_lookup_nsh_node)
void ip_address_to_fib_prefix(const ip_address_t *addr, fib_prefix_t *prefix)
convert from a LISP address to a FIB prefix
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
static uword lisp_cp_output(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
static u64 clib_cpu_time_now(void)
static int add_l2_arp_entry(BVT(clib_bihash_kv) *kvp, void *arg)
static void dp_del_fwd_entry(lisp_cp_main_t *lcm, u32 dst_map_index)
Combined counter to hold both packets and byte differences.
#define QUICK_MAP_REGISTER_MSG_COUNT
u32 ip_fib_get_egress_iface_for_dst(lisp_cp_main_t *lcm, ip_address_t *dst)
Find the sw_if_index of the interface that would be used to egress towards dst.
#define hash_set_mem(h, key, value)
static char * lisp_cp_input_error_strings[]
ip_lookup_main_t lookup_main
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
void vnet_lisp_gpe_add_fwd_counters(vnet_lisp_gpe_add_del_fwd_entry_args_t *a, u32 fwd_entry_index)
#define SHA1_AUTH_DATA_LEN
static void remove_dead_pending_map_requests(lisp_cp_main_t *lcm)
vnet_api_error_t vnet_lisp_stats_enable_disable(u8 enable)
int vnet_lisp_add_mapping(vnet_lisp_add_del_mapping_args_t *a, locator_t *rlocs, u32 *res_map_index, u8 *is_updated)
Adds/updates mapping.
static lisp_msmr_t * get_map_server(ip_address_t *a)
vlib_error_t * errors
Vector of errors for this node.
static int update_pending_map_register(pending_map_register_t *r, f64 dt, u8 *del_all)
#define ip_addr_version(_a)
static void * send_map_request_thread_fn(void *arg)
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
u8 vnet_lisp_stats_enable_disable_state(void)
void gid_dictionary_init(gid_dictionary_t *db)
u8 vnet_lisp_map_register_state_get(void)
static int send_map_reply(lisp_cp_main_t *lcm, u32 mi, ip_address_t *dst, u8 probe_bit, u64 nonce, u16 dst_port, ip_address_t *probed_loc)
void gid_address_from_ip(gid_address_t *g, ip_address_t *ip)
u8 vnet_lisp_get_petr_mode(void)
int vnet_lisp_set_map_request_mode(u8 mode)
static int is_local_ip(lisp_cp_main_t *lcm, ip_address_t *addr)
static void clean_locator_to_locator_set(lisp_cp_main_t *lcm, u32 lsi)
int vnet_lisp_add_del_adjacency(vnet_lisp_add_del_adjacency_args_t *a)
Adds adjacency or removes forwarding entry associated to remote mapping.
static char * lisp_cp_output_error_strings[]
#define NUMBER_OF_RETRIES
vlib_node_registration_t ip4_lookup_node
(constructor) VLIB_REGISTER_NODE (ip4_lookup_node)
#define clib_memcpy(d, s, n)
#define MNOTIFY_NONCE(h_)
static int update_map_register_auth_data(map_register_hdr_t *map_reg_hdr, lisp_key_type_t key_id, u8 *key, u16 auth_data_len, u32 msg_len)
lisp_msmr_t * map_servers
lisp_transport_protocol_t vnet_lisp_get_transport_protocol(void)
int vnet_lisp_enable_disable_petr_mode(u8 is_enabled)
static lisp_gpe_main_t * vnet_lisp_gpe_get_main()
vl_api_ip_proto_t protocol
static void reset_pending_mr_counters(pending_map_request_t *r)
u32 ** locator_to_locator_sets
u32 gid_dictionary_add_del(gid_dictionary_t *db, gid_address_t *key, u64 value, u8 is_add)
int vnet_lisp_enable_disable_pitr_mode(u8 is_enabled)
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
vl_api_interface_index_t sw_if_index
#define VLIB_INIT_FUNCTION(x)
static uword vlib_process_get_events(vlib_main_t *vm, uword **data_vector)
Return the first event type which has occurred and a vector of per-event data of that type...
int ip_fib_get_first_egress_ip_for_dst(lisp_cp_main_t *lcm, ip_address_t *dst, ip_address_t *result)
Find first IP of the interface that would be used to egress towards dst.
#define ICMP6_NEIGHBOR_ADVERTISEMENT_FLAG_OVERRIDE
gid_address_t * eids_to_be_deleted
vlib_combined_counter_main_t counters
static int dp_add_fwd_entry_from_mt(u32 si, u32 di)
#define hash_foreach(key_var, value_var, h, body)
static_always_inline void vnet_crypto_op_init(vnet_crypto_op_t *op, vnet_crypto_op_id_t type)
#define gid_address_sd_src(_a)
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
void vnet_lisp_gpe_del_fwd_counters(vnet_lisp_gpe_add_del_fwd_entry_args_t *a, u32 fwd_entry_index)
Aggregate type for a prefix.
vlib_frame_t * vlib_get_frame_to_node(vlib_main_t *vm, u32 to_node_index)
u32 * fwd_entry_by_mapping_index
#define clib_error_return(e, args...)
u32 expired_map_registers
void vl_api_rpc_call_main_thread(void *fp, u8 *data, u32 data_length)
static mapping_t * get_mapping(lisp_cp_main_t *lcm, gid_address_t *e)
int vnet_lisp_eid_table_map(u32 vni, u32 dp_id, u8 is_l2, u8 is_add)
static u32 get_locator_pairs(lisp_cp_main_t *lcm, mapping_t *lcl_map, mapping_t *rmt_map, locator_pair_t **locator_pairs)
Finds first remote locator with best (lowest) priority that has a local peer locator with an underlyi...
lisp_api_ndp_entry_t * vnet_lisp_ndp_entries_get_by_bd(u32 bd)
#define vec_end(v)
End (last data address) of vector.
u32 lisp_gpe_tenant_l2_iface_add_or_lock(u32 vni, u32 bd_id)
Add/create and lock a new or find and lock the existing L2 interface for the tenant.
static lisp_cp_main_t * vnet_lisp_cp_get_main()
u16 fp_len
The mask length.
#define vlib_call_init_function(vm, x)
u8 do_map_server_election
u32 vnet_crypto_key_add(vlib_main_t *vm, vnet_crypto_alg_t alg, u8 *data, u16 length)
u8 delete_after_expiration
fib_node_index_t fib_table_lookup(u32 fib_index, const fib_prefix_t *prefix)
Perfom a longest prefix match in the non-forwarding table.
u32 petr_map_index
Proxy ETR map index used for 'use-petr'.
void gid_to_dp_address(gid_address_t *g, dp_address_t *d)
static void update_pending_request(pending_map_request_t *r, f64 dt)
Take an action with a pending map request depending on expiration time and re-try counters...
vl_api_fib_path_type_t type
clib_error_t * vnet_lisp_enable_disable(u8 is_enable)
vlib_error_t error
Error code for buffers to be enqueued to error handler.
#define MAX_EXPIRED_MAP_REGISTERS_DEFAULT
vlib_node_registration_t lisp_cp_lookup_ip6_node
(constructor) VLIB_REGISTER_NODE (lisp_cp_lookup_ip6_node)
static void add_locators(lisp_cp_main_t *lcm, mapping_t *m, u32 locator_set_index, ip_address_t *probed_loc)
void vnet_lisp_gpe_del_nsh_iface(lisp_gpe_main_t *lgm)
Del LISP-GPE NSH interface.
#define MREQ_RLOC_PROBE(h_)
int vnet_lisp_pitr_set_locator_set(u8 *locator_set_name, u8 is_add)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
u8 vnet_lisp_rloc_probe_state_get(void)
static void queue_map_reply_for_processing(map_records_arg_t *a)
#define hash_unset_mem(h, key)
Common utility functions for IPv4, IPv6 and L2 LISP-GPE tunnels.
counter_t packets
packet counter
u8 do_map_resolver_election
#define clib_fifo_sub1(f, e)
u32 table_id
table (vrf) id
#define gid_address_arp_ndp_ip(_a)
static void * vlib_buffer_make_headroom(vlib_buffer_t *b, u8 size)
Make head room, typically for packet headers.
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
void gid_dict_foreach_subprefix(gid_dictionary_t *db, gid_address_t *eid, foreach_subprefix_match_cb_t cb, void *arg)
#define gid_address_mac(_a)
static u16 auth_data_len_by_key_id(lisp_key_type_t key_id)
u32 lisp_gpe_tenant_l3_iface_add_or_lock(u32 vni, u32 table_id, u8 with_default_route)
Add/create and lock a new or find and lock the existing L3 interface for the tenant.
int get_mr_and_local_iface_ip(lisp_cp_main_t *lcm, ip_address_t *mr_ip, ip_address_t *sloc)
int vnet_lisp_map_cache_add_del(vnet_lisp_add_del_mapping_args_t *a, u32 *map_index_result)
Add/remove mapping to/from map-cache.
u32 vlib_process_create(vlib_main_t *vm, char *name, vlib_node_function_t *f, u32 log2_n_stack_bytes)
Create a vlib process.
int vnet_lisp_add_del_local_mapping(vnet_lisp_add_del_mapping_args_t *a, u32 *map_index_result)
Add/update/delete mapping to/in/from map-cache.
u32 lisp_msg_parse_addr(vlib_buffer_t *b, gid_address_t *eid)
void vnet_crypto_key_del(vlib_main_t *vm, vnet_crypto_key_index_t index)
vlib_node_registration_t lisp_cp_input_node
(constructor) VLIB_REGISTER_NODE (lisp_cp_input_node)
void vlib_put_frame_to_node(vlib_main_t *vm, u32 to_node_index, vlib_frame_t *f)
#define MNOTIFY_KEY_ID(h_)
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
void gid_address_free(gid_address_t *a)
u32 *TW() tw_timer_expire_timers_vec(TWT(tw_timer_wheel) *tw, f64 now, u32 *vec)
vlib_node_registration_t lisp_cp_lookup_l2_node
(constructor) VLIB_REGISTER_NODE (lisp_cp_lookup_l2_node)
#define pool_put(P, E)
Free an object E in pool P.
#define gid_address_sd_dst_type(_a)
#define vec_dup(V)
Return copy of vector (no header, no alignment)
static void cleanup(void)
lisp_api_stats_t * vnet_lisp_get_stats(void)
static void remove_expired_mapping(lisp_cp_main_t *lcm, u32 mi)
u32 * local_locator_set_indexes
static int map_record_integrity_check(lisp_cp_main_t *lcm, mapping_t *maps, u32 key_id, u8 **key_out)
When map-notify is received it is necessary that all EIDs in the record list share common key...
uword unformat_gid_address(unformat_input_t *input, va_list *args)
vnet_sw_interface_flags_t flags
#define vec_del1(v, i)
Delete the element at index I.
u8 * format_gid_address(u8 *s, va_list *args)
static uword lisp_cp_lookup_ip4(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
static u8 compare_locators(lisp_cp_main_t *lcm, u32 *old_ls_indexes, locator_t *new_locators)
#define foreach_lisp_cp_lookup_error
u8 vnet_lisp_get_xtr_mode(void)
static_always_inline void mac_address_from_u64(mac_address_t *mac, u64 u)
static void lisp_cp_unregister_dst_port(vlib_main_t *vm)
vlib_node_registration_t lisp_cp_output_node
(constructor) VLIB_REGISTER_NODE (lisp_cp_output_node)
u32 node_index
Node index.
#define MAX_LISP_MSG_ENCAP_LEN
#define vlib_validate_buffer_enqueue_x1(vm, node, next_index, to_next, n_left_to_next, bi0, next0)
Finish enqueueing one buffer forward in the graph.
#define vlib_get_next_frame(vm, node, next_index, vectors, n_vectors_left)
Get pointer to next frame vector data by (vlib_node_runtime_t, next_index).
ip_address_t map_resolver_ip
#define hash_foreach_mem(key_var, value_var, h, body)
#define TIME_UNTIL_REFETCH_OR_DELETE
#define MREG_AUTH_DATA_LEN(h_)
void * pkt_push_udp_and_ip(vlib_main_t *vm, vlib_buffer_t *b, u16 sp, u16 dp, ip_address_t *sip, ip_address_t *dip, u8 csum_offload)
#define clib_fifo_foreach(v, f, body)
vl_api_tunnel_mode_t mode
static void process_map_notify(map_records_arg_t *a)
static int queue_map_request(gid_address_t *seid, gid_address_t *deid, u8 smr_invoked, u8 is_resend)
static void vlib_node_increment_counter(vlib_main_t *vm, u32 node_index, u32 counter_index, u64 increment)
static void remove_locator_from_locator_set(locator_set_t *ls, u32 *locit, u32 ls_index, u32 loc_id)
#define gid_address_ippref(_a)
lisp_adjacency_t * vnet_lisp_adjacencies_get_by_vni(u32 vni)
Returns vector of adjacencies.
u32 fib_entry_get_resolving_interface(fib_node_index_t entry_index)
u8 is_negative
type of mapping
static int is_locator_in_locator_set(lisp_cp_main_t *lcm, locator_set_t *ls, locator_t *loc)
#define pool_free(p)
Free a pool.
u32 lisp_msg_parse_itr_rlocs(vlib_buffer_t *b, gid_address_t **rlocs, u8 rloc_count)
clib_error_t * lisp_cp_init(vlib_main_t *vm)
u32 * vnet_lisp_ndp_bds_get(void)
u32 vni
VNI/tenant id in HOST byte order.
u8 * format_lisp_cp_input_trace(u8 *s, va_list *args)
static vlib_buffer_t * build_map_reply(lisp_cp_main_t *lcm, ip_address_t *sloc, ip_address_t *dst, u64 nonce, u8 probe_bit, mapping_t *records, u16 dst_port, u32 *bi_res)
#define VLIB_REGISTER_NODE(x,...)
static uword lisp_cp_lookup_l2(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
uword * pending_map_requests_by_nonce
static void dp_add_fwd_entry(lisp_cp_main_t *lcm, u32 src_map_index, u32 dst_map_index)
int vnet_lisp_add_del_mreq_itr_rlocs(vnet_lisp_add_del_mreq_itr_rloc_args_t *a)
static_always_inline uword vlib_get_thread_index(void)
static lisp_msmr_t * get_map_resolver(ip_address_t *a)
static void vlib_get_combined_counter(const vlib_combined_counter_main_t *cm, u32 index, vlib_counter_t *result)
Get the value of a combined counter, never called in the speed path Scrapes the entire set of per-thr...
#define MAP_REC_ACTION(h)
int gid_address_cmp(gid_address_t *a1, gid_address_t *a2)
#define gid_address_arp_bd
static void update_fwd_entries_by_locator_set(lisp_cp_main_t *lcm, u32 ls_index, u8 remove_only)
sll srl srl sll sra u16x4 i
#define vec_free(V)
Free vector's memory (no header).
#define gid_address_ippref_len(_a)
void udp_unregister_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u8 is_ip4)
static map_records_arg_t * parse_map_notify(vlib_buffer_t *b)
u32 lisp_msg_parse_mapping_record(vlib_buffer_t *b, gid_address_t *eid, locator_t **locs, locator_t *probed_)
static void remove_mapping_if_needed(u32 mi, void *arg)
Callback invoked when a sub-prefix is found.
#define clib_warning(format, args...)
u8 * format_ip_address(u8 *s, va_list *args)
void * lisp_msg_push_ecm(vlib_main_t *vm, vlib_buffer_t *b, int lp, int rp, gid_address_t *la, gid_address_t *ra)
u32 locator_cmp(locator_t *l1, locator_t *l2)
static void update_map_register(lisp_cp_main_t *lcm, f64 dt)
int vnet_lisp_map_register_enable_disable(u8 is_enable)
u32 vnet_lisp_map_register_fallback_threshold_get(void)
u32 fib_node_index_t
A typedef of a node index.
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
void * lisp_msg_put_map_reply(vlib_buffer_t *b, mapping_t *records, u64 nonce, u8 probe_bit)
void vlib_put_next_frame(vlib_main_t *vm, vlib_node_runtime_t *r, u32 next_index, u32 n_vectors_left)
Release pointer to next frame vector data.
static int send_rloc_probe(lisp_cp_main_t *lcm, gid_address_t *deid, u32 local_locator_set_index, ip_address_t *sloc, ip_address_t *rloc)
lisp_transport_protocol_t
#define PENDING_MREG_EXPIRATION_TIME
#define gid_address_nsh_si(_a)
#define vec_is_equal(v1, v2)
Compare two vectors, not NULL-pointer tolerant.
void * ip_interface_get_first_address(ip_lookup_main_t *lm, u32 sw_if_index, u8 version)
vlib_main_t vlib_node_runtime_t * node
enum fib_entry_flag_t_ fib_entry_flag_t
static void * ip6_next_header(ip6_header_t *i)
#define gid_address_arp_ndp_bd(_a)
lisp_gpe_tunnel_key_t * key
RLOC pair and rloc fib_index.
u32 unnumbered_sw_if_index
#define fid_addr_ippref(_a)
int vnet_lisp_gpe_add_del_fwd_entry(vnet_lisp_gpe_add_del_fwd_entry_args_t *a, u32 *hw_if_indexp)
Forwarding entry create/remove dispatcher.
u8 vnet_lisp_enable_disable_status(void)
int vnet_lisp_enable_disable_xtr_mode(u8 is_enabled)
u16 ip6_tcp_udp_icmp_compute_checksum(vlib_main_t *vm, vlib_buffer_t *p0, ip6_header_t *ip0, int *bogus_lengthp)
vlib_node_registration_t ip6_lookup_node
(constructor) VLIB_REGISTER_NODE (ip6_lookup_node)
static uword send_map_resolver_service(vlib_main_t *vm, vlib_node_runtime_t *rt, vlib_frame_t *f)
struct _gid_address_t gid_address_t
u32 fib_table_get_table_id_for_sw_if_index(fib_protocol_t proto, u32 sw_if_index)
Get the Table-ID of the FIB bound to the interface.
void vnet_lisp_create_retry_process(lisp_cp_main_t *lcm)
u16 cached_next_index
Next frame index that vector arguments were last enqueued to last time this node ran.
#define pool_put_index(p, i)
Free pool element with given index.
int ip_interface_get_first_ip_address(lisp_cp_main_t *lcm, u32 sw_if_index, u8 version, ip_address_t *result)
int vnet_lisp_add_del_map_server(ip_address_t *addr, u8 is_add)
#define fid_addr_type(_a)
static lisp_msg_type_e lisp_msg_type(void *b)
manual_print typedef address
static int send_rloc_probes(lisp_cp_main_t *lcm)
u8 pre_data[VLIB_BUFFER_PRE_DATA_SIZE]
Space for inserting data before buffer start.
int vnet_lisp_clear_all_remote_adjacencies(void)
ip_lookup_main_t lookup_main
#define gid_address_sd_dst(_a)
#define MAP_REGISTER_INTERVAL
static void get_src_and_dst_ip(void *hdr, ip_address_t *src, ip_address_t *dst)
lisp_transport_protocol_t transport_protocol
either UDP based or binary API.
clib_error_t * lisp_gpe_init(vlib_main_t *vm)
LISP-GPE init function.
gid_dictionary_t mapping_index_by_gid
ip_interface_address_t * ip_interface_get_first_interface_address(ip_lookup_main_t *lm, u32 sw_if_index, u8 loop)
u32 gid_dictionary_sd_lookup(gid_dictionary_t *db, gid_address_t *dst, gid_address_t *src)
static u32 lisp_get_vni_from_buffer_ip(lisp_cp_main_t *lcm, vlib_buffer_t *b, u8 version)
locator_set_t * locator_set_pool
ip_address_family_t version
u32 vnet_crypto_key_index_t
static void gid_address_sd_to_flat(gid_address_t *dst, gid_address_t *src, fid_address_t *fid)
#define gid_address_ndp_bd
int vnet_lisp_rloc_probe_enable_disable(u8 is_enable)
u32 ** locator_set_to_eids
static vnet_crypto_op_id_t lisp_key_type_to_crypto_op(lisp_key_type_t key_id)
#define LISP_CONTROL_PORT
static u64 mac_to_u64(u8 *m)
int ip_address_cmp(const ip_address_t *ip1, const ip_address_t *ip2)
#define vec_cmp(v1, v2)
Compare two vectors (only applicable to vectors of signed numbers).
gid_address_t rmt_eid
remote eid
u64 gid_dictionary_lookup(gid_dictionary_t *db, gid_address_t *key)
#define foreach_lisp_cp_output_error
#define clib_fifo_free(f)
pending_map_register_t * pending_map_registers_pool
fwd_entry_t * fwd_entry_pool
static vlib_main_t * vlib_get_main(void)
static void * vlib_add_trace(vlib_main_t *vm, vlib_node_runtime_t *r, vlib_buffer_t *b, u32 n_data_bytes)
#define vec_elt(v, i)
Get vector value at index i.
int vnet_lisp_map_register_fallback_threshold_set(u32 value)
pending_map_request_t * pending_map_requests_pool
void gid_dict_foreach_l2_arp_ndp_entry(gid_dictionary_t *db, cb, void *ht)
int vnet_lisp_add_del_locator_set(vnet_lisp_add_del_locator_set_args_t *a, u32 *ls_result)
#define gid_address_ip(_a)
negative_fwd_actions_e action
action for negative mappings
#define clib_fifo_add1(f, e)
static u32 lisp_get_bd_from_buffer_eth(vlib_buffer_t *b)
static u8 vlib_buffer_has_space(vlib_buffer_t *b, word l)
Check if there is enough space in buffer to advance.
#define gid_address_vni(_a)
#define hash_create_vec(elts, key_bytes, value_bytes)
static u32 lisp_get_vni_from_buffer_eth(lisp_cp_main_t *lcm, vlib_buffer_t *b)
static vlib_buffer_t * build_map_register(lisp_cp_main_t *lcm, ip_address_t *sloc, ip_address_t *ms_ip, u64 *nonce_res, u8 want_map_notif, mapping_t *records, lisp_key_type_t key_id, u8 *key, u32 *bi_res)
static uword * get_locator_set_index(vnet_lisp_add_del_locator_set_args_t *a, uword *p)
void locator_free(locator_t *l)
ip_address_t active_map_server
static void remove_overlapping_sub_prefixes(lisp_cp_main_t *lcm, gid_address_t *eid, u8 is_negative)
This function searches map cache and looks for IP prefixes that are subset of the provided one...
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static char * lisp_cp_lookup_error_strings[]
#define GID_LOOKUP_MISS_L2
#define foreach_ip_interface_address(lm, a, sw_if_index, loop, body)
VLIB buffer representation.
static void * vlib_frame_vector_args(vlib_frame_t *f)
Get pointer to frame vector data.
#define gid_address_nsh_spi(_a)
int vnet_lisp_del_mapping(gid_address_t *eid, u32 *res_map_index)
Removes a mapping.
u32 * vnet_lisp_l2_arp_bds_get(void)
int vnet_lisp_add_del_locator(vnet_lisp_add_del_locator_set_args_t *a, locator_set_t *ls, u32 *ls_result)
locator_pair_t * locator_pairs
vector of locator pairs
static mapping_t * lisp_get_petr_mapping(lisp_cp_main_t *lcm)
u8 ip_address_max_len(u8 version)
uword * locator_set_index_by_name
int vnet_lisp_nsh_set_locator_set(u8 *locator_set_name, u8 is_add)
static map_records_arg_t * map_record_args_get()
static gid_address_t * build_itr_rloc_list(lisp_cp_main_t *lcm, locator_set_t *loc_set)
l2_bridge_domain_t * bd_configs
void gid_address_copy(gid_address_t *dst, gid_address_t *src)
A collection of combined counters.
static vlib_buffer_t * build_map_request(lisp_cp_main_t *lcm, gid_address_t *deid, ip_address_t *sloc, ip_address_t *rloc, gid_address_t *itr_rlocs, u64 *nonce_res, u32 *bi_res)
#define hash_get_mem(h, key)
void mac_copy(void *dst, void *src)
u32 lisp_msg_parse_eid_rec(vlib_buffer_t *b, gid_address_t *eid)
static int add_ndp_entry(BVT(clib_bihash_kv) *kvp, void *arg)
static void map_records_arg_free(map_records_arg_t *a)
void ip_address_copy(ip_address_t *dst, const ip_address_t *src)
void get_src_and_dst_eids_from_buffer(lisp_cp_main_t *lcm, vlib_buffer_t *b, gid_address_t *src, gid_address_t *dst, u16 type)
int vnet_lisp_add_del_map_resolver(vnet_lisp_add_del_map_resolver_args_t *a)
ip4_main_t ip4_main
Global ip4 main structure.
int vnet_lisp_gpe_get_fwd_stats(vnet_lisp_gpe_add_del_fwd_entry_args_t *a, vlib_counter_t *c)
u32 TW() tw_timer_start(TWT(tw_timer_wheel) *tw, u32 user_id, u32 timer_id, u64 interval)
Start a Tw Timer.
int vnet_lisp_add_del_l2_arp_ndp_entry(gid_address_t *key, u8 *mac, u8 is_add)
u32 ** lcl_to_rmt_adjacencies
static vlib_thread_main_t * vlib_get_thread_main()
static void find_ip_header(vlib_buffer_t *b, u8 **ip_hdr)
static void process_expired_mapping(lisp_cp_main_t *lcm, u32 mi)
#define vec_foreach(var, vec)
Vector iterator.
static void * vlib_buffer_pull(vlib_buffer_t *b, u8 size)
Retrieve bytes from buffer head.
save_rewrite_length must be aligned so that reass doesn t overwrite it
static int add_l2_arp_bd(BVT(clib_bihash_kv) *kvp, void *arg)
uword * map_register_messages_by_nonce
static void update_rloc_probing(lisp_cp_main_t *lcm, f64 dt)
lisp_cp_main_t lisp_control_main
void udp_register_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u32 node_index, u8 is_ip4)
#define gid_address_arp_ip4(_a)
void * process_map_reply(map_records_arg_t *a)
static int parse_map_records(vlib_buffer_t *b, map_records_arg_t *a, u8 count)
uword * lisp_stats_index_by_key
#define pool_foreach_index(i, v, body)
Iterate pool by index.
static int dp_add_del_iface(lisp_cp_main_t *lcm, u32 vni, u8 is_l2, u8 is_add, u8 with_default_route)
u32 max_expired_map_registers
static void lisp_cp_disable_l2_l3_ifaces(lisp_cp_main_t *lcm)
int vnet_lisp_map_register_set_ttl(u32 ttl)
static u32 vlib_buffer_alloc(vlib_main_t *vm, u32 *buffers, u32 n_buffers)
Allocate buffers into supplied array.
u32 vnet_lisp_map_register_get_ttl(void)
static void * dp_add_fwd_entry_thread_fn(void *arg)
void build_src_dst(gid_address_t *sd, gid_address_t *src, gid_address_t *dst)
static uword lisp_cp_lookup_ip6(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
int vnet_lisp_use_petr(ip_address_t *ip, u8 is_add)
Configure Proxy-ETR.
gid_address_t lcl_eid
local eid
static vnet_crypto_alg_t lisp_key_type_to_crypto_alg(lisp_key_type_t key_id)
static vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
static foreach_msmr void free_map_register_records(mapping_t *maps)
#define send_encapsulated_map_request(lcm, seid, deid, smr)
void TW() tw_timer_stop(TWT(tw_timer_wheel) *tw, u32 handle)
Stop a tw timer.
#define MREP_RLOC_PROBE(h_)
static int is_auth_data_valid(map_notify_hdr_t *h, u32 msg_len, lisp_key_type_t key_id, u8 *key)
static mapping_t * build_map_register_record_list(lisp_cp_main_t *lcm)
u8 * format_lisp_cp_lookup_trace(u8 *s, va_list *args)
#define MAP_REGISTER_DEFAULT_TTL
#define resend_encapsulated_map_request(lcm, seid, deid, smr)
#define PENDING_MREQ_EXPIRATION_TIME
static int lisp_stats_api_fill(lisp_cp_main_t *lcm, lisp_gpe_main_t *lgm, lisp_api_stats_t *stat, lisp_stats_key_t *key, u32 stats_index)
static uword lisp_cp_lookup_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame, int overlay)
static int add_ndp_bd(BVT(clib_bihash_kv) *kvp, void *arg)
fib_entry_flag_t fib_entry_get_flags(fib_node_index_t fib_entry_index)