LCOV - code coverage report
Current view: top level - plugins/lisp/lisp-cp - control.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 2 4 50.0 %
Date: 2023-07-05 22:20:52 Functions: 1 2 50.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2016 Cisco and/or its affiliates.
       3             :  * Licensed under the Apache License, Version 2.0 (the "License");
       4             :  * you may not use this file except in compliance with the License.
       5             :  * You may obtain a copy of the License at:
       6             :  *
       7             :  *     http://www.apache.org/licenses/LICENSE-2.0
       8             :  *
       9             :  * Unless required by applicable law or agreed to in writing, software
      10             :  * distributed under the License is distributed on an "AS IS" BASIS,
      11             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12             :  * See the License for the specific language governing permissions and
      13             :  * limitations under the License.
      14             :  */
      15             : 
      16             : #ifndef VNET_CONTROL_H_
      17             : #define VNET_CONTROL_H_
      18             : 
      19             : #include <vnet/vnet.h>
      20             : #include <lisp/lisp-cp/gid_dictionary.h>
      21             : #include <lisp/lisp-cp/lisp_types.h>
      22             : #include <vppinfra/timing_wheel.h>
      23             : #include <vppinfra/tw_timer_1t_3w_1024sl_ov.h>
      24             : 
      25             : #define NUMBER_OF_RETRIES                   1
      26             : #define PENDING_MREQ_EXPIRATION_TIME        3.0 /* seconds */
      27             : #define PENDING_MREQ_QUEUE_LEN              5
      28             : 
      29             : #define RLOC_PROBING_INTERVAL               60.0
      30             : 
      31             : /* when map-registration is enabled "quick registration" takes place first.
      32             :    In this mode ETR sends map-register messages at an increased frequency
      33             :    until specified message count is reached */
      34             : #define QUICK_MAP_REGISTER_MSG_COUNT        5
      35             : #define QUICK_MAP_REGISTER_INTERVAL         3.0
      36             : 
      37             : /* normal map-register period */
      38             : #define MAP_REGISTER_INTERVAL               60.0
      39             : 
      40             : /* how many tries until next map-server election */
      41             : #define MAX_EXPIRED_MAP_REGISTERS_DEFAULT   3
      42             : 
      43             : #define PENDING_MREG_EXPIRATION_TIME        3.0 /* seconds */
      44             : 
      45             : /* 24 hours */
      46             : #define MAP_REGISTER_DEFAULT_TTL            86400
      47             : 
      48             : typedef struct
      49             : {
      50             :   gid_address_t src;
      51             :   gid_address_t dst;
      52             :   u32 retries_num;
      53             :   f64 time_to_expire;
      54             :   u8 is_smr_invoked;
      55             :   u64 *nonces;
      56             :   u8 to_be_removed;
      57             : } pending_map_request_t;
      58             : 
      59             : typedef struct
      60             : {
      61             :   f64 time_to_expire;
      62             : } pending_map_register_t;
      63             : 
      64             : typedef struct
      65             : {
      66             :   gid_address_t leid;
      67             :   gid_address_t reid;
      68             :   u8 is_src_dst;
      69             :   locator_pair_t *locator_pairs;
      70             : } fwd_entry_t;
      71             : 
      72             : typedef struct
      73             : {
      74             :   gid_address_t leid;
      75             :   gid_address_t reid;
      76             : } lisp_adjacency_t;
      77             : 
      78             : typedef enum
      79             : {
      80             :   IP4_MISS_PACKET,
      81             :   IP6_MISS_PACKET
      82             : } miss_packet_type_t;
      83             : 
      84             : /* map-server/map-resolver structure */
      85             : typedef struct
      86             : {
      87             :   u8 is_down;
      88             :   f64 last_update;
      89             :   ip_address_t address;
      90             :   char *key;
      91             : } lisp_msmr_t;
      92             : 
      93             : typedef struct
      94             : {
      95             :   /* headers */
      96             :   u8 data[100];
      97             :   u32 length;
      98             :   miss_packet_type_t type;
      99             : } miss_packet_t;
     100             : 
     101             : typedef struct
     102             : {
     103             :   u8 mac[6];
     104             :   u32 ip4;
     105             : } lisp_api_l2_arp_entry_t;
     106             : 
     107             : typedef struct
     108             : {
     109             :   u8 mac[6];
     110             :   u8 ip6[16];
     111             : } lisp_api_ndp_entry_t;
     112             : 
     113             : typedef enum
     114             : {
     115             :   MR_MODE_DST_ONLY = 0,
     116             :   MR_MODE_SRC_DST,
     117             :   _MR_MODE_MAX
     118             : } map_request_mode_t;
     119             : 
     120             : #define foreach_lisp_flag_bit       \
     121             :   _(USE_PETR, "Use Proxy-ETR")                    \
     122             :   _(XTR_MODE, "ITR/ETR mode")                     \
     123             :   _(PETR_MODE, "Proxy-ETR mode")                   \
     124             :   _(PITR_MODE, "Proxy-ITR mode")                  \
     125             :   _(STATS_ENABLED, "Statistics enabled")
     126             : 
     127             : typedef enum lisp_flag_bits
     128             : {
     129             : #define _(sym, str) LISP_FLAG_BIT_##sym,
     130             :   foreach_lisp_flag_bit
     131             : #undef _
     132             : } lisp_flag_bits_e;
     133             : 
     134             : typedef enum lisp_flags
     135             : {
     136             : #define _(sym, str) LISP_FLAG_##sym = 1 << LISP_FLAG_BIT_##sym,
     137             :   foreach_lisp_flag_bit
     138             : #undef _
     139             : } lisp_flags_e;
     140             : 
     141             : typedef struct
     142             : {
     143             :   ip_address_t addr;
     144             :   u32 bd;
     145             : } lisp_l2_arp_key_t;
     146             : 
     147             : typedef enum
     148             : {
     149             :   LISP_TRANSPORT_PROTOCOL_UDP = 1,
     150             :   LISP_TRANSPORT_PROTOCOL_API
     151             : } lisp_transport_protocol_t;
     152             : 
     153             : typedef struct
     154             : {
     155             :   u64 nonce;
     156             :   u8 is_rloc_probe;
     157             :   mapping_t *mappings;
     158             :   volatile u8 is_free;
     159             : } map_records_arg_t;
     160             : 
     161             : typedef struct
     162             : {
     163             :   u32 flags;
     164             : 
     165             :   /* LISP feature status */
     166             :   u8 is_enabled;
     167             : 
     168             :   /* eid table */
     169             :   gid_dictionary_t mapping_index_by_gid;
     170             : 
     171             :   /* pool of mappings */
     172             :   mapping_t *mapping_pool;
     173             : 
     174             :   /* hash map of secret keys by mapping index */
     175             :   u8 *key_by_mapping_index;
     176             : 
     177             :   /* pool of locators */
     178             :   locator_t *locator_pool;
     179             : 
     180             :   /* pool of locator-sets */
     181             :   locator_set_t *locator_set_pool;
     182             : 
     183             :   /* vector of locator-set vectors composed of and indexed by locator index */
     184             :   u32 **locator_to_locator_sets;
     185             : 
     186             :   /* hash map of locators by name */
     187             :   uword *locator_set_index_by_name;
     188             : 
     189             :   /* vector of eid index vectors supported and indexed by locator-set index */
     190             :   u32 **locator_set_to_eids;
     191             : 
     192             :   /* vectors of indexes for local locator-sets and mappings */
     193             :   u32 *local_mappings_indexes;
     194             :   u32 *local_locator_set_indexes;
     195             : 
     196             :   /* hash map of forwarding entries by mapping index */
     197             :   u32 *fwd_entry_by_mapping_index;
     198             : 
     199             :   /* pool of vectors of rmts per lcl mapping in adjacencies */
     200             :   u32 **lcl_to_rmt_adjacencies;
     201             : 
     202             :   /* hash of pool positions of vectors of rmts by lcl mapping index */
     203             :   u32 *lcl_to_rmt_adjs_by_lcl_idx;
     204             : 
     205             :   /* forwarding entries pool */
     206             :   fwd_entry_t *fwd_entry_pool;
     207             : 
     208             :   /* hash map keyed by nonce of pending map-requests */
     209             :   uword *pending_map_requests_by_nonce;
     210             : 
     211             :   /* pool of pending map requests */
     212             :   pending_map_request_t *pending_map_requests_pool;
     213             : 
     214             :   /* pool of pending map registers */
     215             :   pending_map_register_t *pending_map_registers_pool;
     216             : 
     217             :   /* hash map of sent map register messages */
     218             :   uword *map_register_messages_by_nonce;
     219             : 
     220             :   /* vector of map-resolvers */
     221             :   lisp_msmr_t *map_resolvers;
     222             : 
     223             :   /* vector of map-servers */
     224             :   lisp_msmr_t *map_servers;
     225             : 
     226             :   /* map resolver address currently being used for sending requests.
     227             :    * This has to be an actual address and not an index to map_resolvers vector
     228             :    * since the vector may be modified during request resend/retry procedure
     229             :    * and break things :-) */
     230             :   ip_address_t active_map_resolver;
     231             :   ip_address_t active_map_server;
     232             : 
     233             :   u8 do_map_resolver_election;
     234             :   u8 do_map_server_election;
     235             : 
     236             :   /* map-request  locator set index */
     237             :   u32 mreq_itr_rlocs;
     238             : 
     239             :   /* vni to vrf hash tables */
     240             :   uword *table_id_by_vni;
     241             :   uword *vni_by_table_id;
     242             : 
     243             :   /* vni to bd-index hash tables */
     244             :   uword *bd_id_by_vni;
     245             :   uword *vni_by_bd_id;
     246             : 
     247             :   /* track l2 and l3 interfaces that have been created for vni */
     248             :   uword *l2_dp_intf_by_vni;
     249             : 
     250             :   /* Proxy ITR map index */
     251             :   u32 pitr_map_index;
     252             : 
     253             :   /** Proxy ETR map index used for 'use-petr'.
     254             :    *  Not related to PETR tunnel mode  */
     255             :   u32 petr_map_index;
     256             : 
     257             :   /* mapping index for NSH */
     258             :   u32 nsh_map_index;
     259             : 
     260             :   /* map request mode */
     261             :   u8 map_request_mode;
     262             : 
     263             :   /* enable/disable map registering */
     264             :   u8 map_registering;
     265             : 
     266             :   /* enable/disable rloc-probing */
     267             :   u8 rloc_probing;
     268             : 
     269             :   /* timing wheel for mapping timeouts */
     270             :     TWT (tw_timer_wheel) wheel;
     271             : 
     272             :   /** Per thread pool of records shared with thread0 */
     273             :   map_records_arg_t **map_records_args_pool;
     274             : 
     275             :   /* TTL used for all mappings when registering */
     276             :   u32 map_register_ttl;
     277             : 
     278             :   /* control variables for map server election */
     279             :   u32 max_expired_map_registers;
     280             :   u32 expired_map_registers;
     281             : 
     282             :   /** either UDP based or binary API. Default is UDP */
     283             :   lisp_transport_protocol_t transport_protocol;
     284             : 
     285             :   /** Retry service node index */
     286             :   u32 retry_service_index;
     287             : 
     288             :   /* commodity */
     289             :   ip4_main_t *im4;
     290             :   ip6_main_t *im6;
     291             :   vlib_main_t *vlib_main;
     292             :   vnet_main_t *vnet_main;
     293             : } lisp_cp_main_t;
     294             : 
     295             : /* lisp-gpe control plane */
     296             : extern lisp_cp_main_t lisp_control_main;
     297             : 
     298             : extern vlib_node_registration_t lisp_cp_input_node;
     299             : extern vlib_node_registration_t lisp_cp_lookup_ip4_node;
     300             : extern vlib_node_registration_t lisp_cp_lookup_ip6_node;
     301             : 
     302             : clib_error_t *lisp_cp_init (vlib_main_t *);
     303             : 
     304             : always_inline lisp_cp_main_t *
     305         613 : vnet_lisp_cp_get_main ()
     306             : {
     307         613 :   return &lisp_control_main;
     308             : }
     309             : 
     310             : void
     311             : get_src_and_dst_eids_from_buffer (lisp_cp_main_t * lcm, vlib_buffer_t * b,
     312             :                                   gid_address_t * src, gid_address_t * dst,
     313             :                                   u16 type);
     314             : 
     315             : typedef struct
     316             : {
     317             :   u8 is_add;
     318             :   union
     319             :   {
     320             :     u8 *name;
     321             :     u32 index;
     322             :   };
     323             :   locator_t *locators;
     324             :   u8 local;
     325             : } vnet_lisp_add_del_locator_set_args_t;
     326             : 
     327             : int
     328             : vnet_lisp_add_del_locator_set (vnet_lisp_add_del_locator_set_args_t * a,
     329             :                                u32 * ls_index);
     330             : int
     331             : vnet_lisp_add_del_locator (vnet_lisp_add_del_locator_set_args_t * a,
     332             :                            locator_set_t * ls, u32 * ls_index);
     333             : 
     334             : typedef struct
     335             : {
     336             :   u8 is_add;
     337             :   gid_address_t eid;
     338             :   u32 locator_set_index;
     339             : 
     340             :   u32 ttl;
     341             :   u8 action;
     342             :   u8 authoritative;
     343             : 
     344             :   u8 local;
     345             :   u8 is_static;
     346             :   u8 *key;
     347             :   u8 key_id;
     348             : } vnet_lisp_add_del_mapping_args_t;
     349             : 
     350             : int
     351             : vnet_lisp_map_cache_add_del (vnet_lisp_add_del_mapping_args_t * a,
     352             :                              u32 * map_index);
     353             : int
     354             : vnet_lisp_add_del_local_mapping (vnet_lisp_add_del_mapping_args_t * a,
     355             :                                  u32 * map_index_result);
     356             : 
     357             : int
     358             : vnet_lisp_add_mapping (vnet_lisp_add_del_mapping_args_t * a,
     359             :                        locator_t * rlocs, u32 * res_map_index,
     360             :                        u8 * is_changed);
     361             : 
     362             : int vnet_lisp_del_mapping (gid_address_t * eid, u32 * res_map_index);
     363             : 
     364             : typedef struct
     365             : {
     366             :   gid_address_t reid;
     367             :   gid_address_t leid;
     368             :   u8 is_add;
     369             : } vnet_lisp_add_del_adjacency_args_t;
     370             : 
     371             : int vnet_lisp_add_del_adjacency (vnet_lisp_add_del_adjacency_args_t * a);
     372             : 
     373             : typedef struct
     374             : {
     375             :   u8 is_add;
     376             :   ip_address_t address;
     377             : } vnet_lisp_add_del_map_resolver_args_t;
     378             : 
     379             : int
     380             : vnet_lisp_add_del_map_resolver (vnet_lisp_add_del_map_resolver_args_t * a);
     381             : int vnet_lisp_add_del_map_server (ip_address_t * addr, u8 is_add);
     382             : 
     383             : clib_error_t *vnet_lisp_enable_disable (u8 is_enabled);
     384             : u8 vnet_lisp_enable_disable_status (void);
     385             : void vnet_lisp_create_retry_process (lisp_cp_main_t * lcm);
     386             : 
     387             : int vnet_lisp_pitr_set_locator_set (u8 * locator_set_name, u8 is_add);
     388             : int vnet_lisp_use_petr (ip_address_t * ip, u8 is_add);
     389             : 
     390             : typedef struct
     391             : {
     392             :   u8 is_add;
     393             :   u8 *locator_set_name;
     394             : } vnet_lisp_add_del_mreq_itr_rloc_args_t;
     395             : 
     396             : int
     397             : vnet_lisp_add_del_mreq_itr_rlocs (vnet_lisp_add_del_mreq_itr_rloc_args_t * a);
     398             : 
     399             : int vnet_lisp_clear_all_remote_adjacencies (void);
     400             : 
     401             : int vnet_lisp_eid_table_map (u32 vni, u32 vrf, u8 is_l2, u8 is_add);
     402             : int vnet_lisp_add_del_map_table_key (gid_address_t * eid, char *key,
     403             :                                      u8 is_add);
     404             : int vnet_lisp_set_map_request_mode (u8 mode);
     405             : u8 vnet_lisp_get_map_request_mode (void);
     406             : lisp_adjacency_t *vnet_lisp_adjacencies_get_by_vni (u32 vni);
     407             : int vnet_lisp_rloc_probe_enable_disable (u8 is_enable);
     408             : int vnet_lisp_map_register_enable_disable (u8 is_enable);
     409             : u8 vnet_lisp_map_register_state_get (void);
     410             : u8 vnet_lisp_rloc_probe_state_get (void);
     411             : int vnet_lisp_add_del_l2_arp_ndp_entry (gid_address_t * key, u8 * mac,
     412             :                                         u8 is_add);
     413             : u32 *vnet_lisp_l2_arp_bds_get (void);
     414             : lisp_api_l2_arp_entry_t *vnet_lisp_l2_arp_entries_get_by_bd (u32 bd);
     415             : int vnet_lisp_nsh_set_locator_set (u8 * locator_set_name, u8 is_add);
     416             : int vnet_lisp_map_register_set_ttl (u32 ttl);
     417             : u32 vnet_lisp_map_register_get_ttl (void);
     418             : int vnet_lisp_map_register_fallback_threshold_set (u32 value);
     419             : u32 vnet_lisp_map_register_fallback_threshold_get (void);
     420             : u32 *vnet_lisp_ndp_bds_get (void);
     421             : lisp_api_ndp_entry_t *vnet_lisp_ndp_entries_get_by_bd (u32 bd);
     422             : u32 vnet_lisp_set_transport_protocol (u8 protocol);
     423             : lisp_transport_protocol_t vnet_lisp_get_transport_protocol (void);
     424             : 
     425             : extern int vnet_lisp_enable_disable_xtr_mode (u8 is_enabled);
     426             : extern int vnet_lisp_enable_disable_pitr_mode (u8 is_enabled);
     427             : extern int vnet_lisp_enable_disable_petr_mode (u8 is_enabled);
     428             : extern u8 vnet_lisp_get_xtr_mode (void);
     429             : extern u8 vnet_lisp_get_pitr_mode (void);
     430             : extern u8 vnet_lisp_get_petr_mode (void);
     431             : 
     432             : map_records_arg_t *parse_map_reply (vlib_buffer_t * b);
     433             : 
     434             : always_inline mapping_t *
     435           0 : lisp_get_petr_mapping (lisp_cp_main_t * lcm)
     436             : {
     437           0 :   return pool_elt_at_index (lcm->mapping_pool, lcm->petr_map_index);
     438             : }
     439             : 
     440             : #endif /* VNET_CONTROL_H_ */
     441             : 
     442             : /*
     443             :  * fd.io coding-style-patch-verification: ON
     444             :  *
     445             :  * Local Variables:
     446             :  * eval: (c-set-style "gnu")
     447             :  * End:
     448             :  */

Generated by: LCOV version 1.14