LISP: make TTL for map register messages configurable 76/7876/2
authorFilip Tehlar <ftehlar@cisco.com>
Wed, 2 Aug 2017 10:45:07 +0000 (12:45 +0200)
committerFlorin Coras <florin.coras@gmail.com>
Wed, 2 Aug 2017 17:10:14 +0000 (17:10 +0000)
Change-Id: I38e1c6a6b033e12ef3f4345a1deff73fa4adbea0
Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
src/vat/api_format.c
src/vnet/lisp-cp/control.c
src/vnet/lisp-cp/control.h
src/vnet/lisp-cp/one.api
src/vnet/lisp-cp/one_api.c
src/vnet/lisp-cp/one_cli.c

index 6a2d36d..bbd97ba 100644 (file)
@@ -3850,6 +3850,42 @@ static void
   vam->result_ready = 1;
 }
 
+static void
+  vl_api_show_one_map_register_ttl_reply_t_handler
+  (vl_api_show_one_map_register_ttl_reply_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  i32 retval = ntohl (mp->retval);
+
+  vl_api_show_one_map_register_ttl_reply_t_endian (mp);
+
+  if (0 <= retval)
+    {
+      print (vam->ofp, "ttl: %u", mp->ttl);
+    }
+
+  vam->retval = retval;
+  vam->result_ready = 1;
+}
+
+static void
+  vl_api_show_one_map_register_ttl_reply_t_handler_json
+  (vl_api_show_one_map_register_ttl_reply_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  vat_json_node_t node;
+
+  vl_api_show_one_map_register_ttl_reply_t_endian (mp);
+  vat_json_init_object (&node);
+  vat_json_object_add_uint (&node, "ttl", mp->ttl);
+
+  vat_json_print (vam->ofp, &node);
+  vat_json_free (&node);
+
+  vam->retval = ntohl (mp->retval);
+  vam->result_ready = 1;
+}
+
 static void
 vl_api_show_one_pitr_reply_t_handler (vl_api_show_one_pitr_reply_t * mp)
 {
@@ -4601,6 +4637,7 @@ _(one_add_del_map_server_reply)                         \
 _(one_enable_disable_reply)                             \
 _(one_rloc_probe_enable_disable_reply)                  \
 _(one_map_register_enable_disable_reply)                \
+_(one_map_register_set_ttl_reply)                       \
 _(one_pitr_set_locator_set_reply)                       \
 _(one_map_request_mode_reply)                           \
 _(one_add_del_map_request_itr_rlocs_reply)              \
@@ -4825,6 +4862,7 @@ _(ONE_ADD_DEL_MAP_SERVER_REPLY, one_add_del_map_server_reply)           \
 _(ONE_ENABLE_DISABLE_REPLY, one_enable_disable_reply)                   \
 _(ONE_MAP_REGISTER_ENABLE_DISABLE_REPLY,                                \
   one_map_register_enable_disable_reply)                                \
+_(ONE_MAP_REGISTER_SET_TTL_REPLY, one_map_register_set_ttl_reply)       \
 _(ONE_RLOC_PROBE_ENABLE_DISABLE_REPLY,                                  \
   one_rloc_probe_enable_disable_reply)                                  \
 _(ONE_PITR_SET_LOCATOR_SET_REPLY, one_pitr_set_locator_set_reply)       \
@@ -4871,6 +4909,7 @@ _(SHOW_ONE_MAP_REQUEST_MODE_REPLY, show_one_map_request_mode_reply)     \
 _(SHOW_ONE_RLOC_PROBE_STATE_REPLY, show_one_rloc_probe_state_reply)     \
 _(SHOW_ONE_MAP_REGISTER_STATE_REPLY,                                    \
   show_one_map_register_state_reply)                                    \
+_(SHOW_ONE_MAP_REGISTER_TTL_REPLY, show_one_map_register_ttl_reply)     \
 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply)                       \
 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply)                       \
 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply)                         \
@@ -16051,6 +16090,60 @@ api_lisp_gpe_add_del_iface (vat_main_t * vam)
   return ret;
 }
 
+static int
+api_one_map_register_set_ttl (vat_main_t * vam)
+{
+  unformat_input_t *input = vam->input;
+  vl_api_one_map_register_set_ttl_t *mp;
+  u32 ttl = 0;
+  u8 is_set = 0;
+  int ret;
+
+  /* Parse args required to build the message */
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (input, "%u", &ttl))
+       is_set = 1;
+      else
+       {
+         clib_warning ("parse error '%U'", format_unformat_error, input);
+         return -99;
+       }
+    }
+
+  if (!is_set)
+    {
+      errmsg ("TTL value missing!");
+      return -99;
+    }
+
+  M (ONE_MAP_REGISTER_SET_TTL, mp);
+  mp->ttl = clib_host_to_net_u32 (ttl);
+
+  /* send it... */
+  S (mp);
+
+  /* Wait for a reply... */
+  W (ret);
+  return ret;
+}
+
+static int
+api_show_one_map_register_ttl (vat_main_t * vam)
+{
+  vl_api_show_one_map_register_ttl_t *mp;
+  int ret;
+
+  M (SHOW_ONE_MAP_REGISTER_TTL, mp);
+
+  /* send it... */
+  S (mp);
+
+  /* Wait for a reply... */
+  W (ret);
+  return ret;
+}
+
 /**
  * Add/del map request itr rlocs from ONE control plane and updates
  *
@@ -19984,10 +20077,12 @@ _(show_one_status, "")                                                  \
 _(one_stats_dump, "")                                                   \
 _(one_stats_flush, "")                                                  \
 _(one_get_map_request_itr_rlocs, "")                                    \
+_(one_map_register_set_ttl, "<ttl>")                                    \
 _(show_one_nsh_mapping, "")                                             \
 _(show_one_pitr, "")                                                    \
 _(show_one_use_petr, "")                                                \
 _(show_one_map_request_mode, "")                                        \
+_(show_one_map_register_ttl, "")                                        \
 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
                             " sw_if_index <sw_if_index> p <priority> "  \
                             "w <weight>] [del]")                        \
index fc860e1..a85656b 100644 (file)
@@ -2074,6 +2074,21 @@ vnet_lisp_add_del_map_resolver (vnet_lisp_add_del_map_resolver_args_t * a)
   return 0;
 }
 
+int
+vnet_lisp_map_register_set_ttl (u32 ttl)
+{
+  lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
+  lcm->map_register_ttl = ttl;
+  return 0;
+}
+
+u32
+vnet_lisp_map_register_get_ttl (void)
+{
+  lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
+  return lcm->map_register_ttl;
+}
+
 int
 vnet_lisp_add_del_mreq_itr_rlocs (vnet_lisp_add_del_mreq_itr_rloc_args_t * a)
 {
@@ -4005,6 +4020,7 @@ lisp_cp_init (vlib_main_t * vm)
   u64 now = clib_cpu_time_now ();
   timing_wheel_init (&lcm->wheel, now, vm->clib_time.clocks_per_second);
   lcm->nsh_map_index = ~0;
+  lcm->map_register_ttl = MAP_REGISTER_DEFAULT_TTL;
   return 0;
 }
 
index 0e63b3c..d030e58 100644 (file)
@@ -238,6 +238,9 @@ typedef struct
   /** Per thread pool of records shared with thread0 */
   map_records_arg_t **map_records_args_pool;
 
+  /* TTL used for all mappings when registering */
+  u32 map_register_ttl;
+
   /* commodity */
   ip4_main_t *im4;
   ip6_main_t *im6;
@@ -362,6 +365,8 @@ int vnet_lisp_add_del_l2_arp_entry (gid_address_t * key, u8 * mac, u8 is_add);
 u32 *vnet_lisp_l2_arp_bds_get (void);
 lisp_api_l2_arp_entry_t *vnet_lisp_l2_arp_entries_get_by_bd (u32 bd);
 int vnet_lisp_nsh_set_locator_set (u8 * locator_set_name, u8 is_add);
+int vnet_lisp_map_register_set_ttl (u32 ttl);
+u32 vnet_lisp_map_register_get_ttl (void);
 
 map_records_arg_t *parse_map_reply (vlib_buffer_t * b);
 
index 31811a3..5087c63 100644 (file)
@@ -102,6 +102,40 @@ autoreply define one_add_del_local_eid
   u8 key[64];
 };
 
+/** \brief Set TTL for map register messages
+    @param client_index - opaque cookie to identify the sender
+    @param context - sender context, to match reply w/ request
+    @param ttl - time to live
+*/
+autoreply define one_map_register_set_ttl
+{
+  u32 client_index;
+  u32 context;
+  u32 ttl;
+};
+
+/** \brief Get TTL for map register messages
+    @param client_index - opaque cookie to identify the sender
+    @param context - sender context, to match reply w/ request
+*/
+define show_one_map_register_ttl
+{
+  u32 client_index;
+  u32 context;
+};
+
+/** \brief Contains current TTL for map register messages
+    @param client_index - opaque cookie to identify the sender
+    @param retval - return code
+    @param ttl - time to live
+*/
+define show_one_map_register_ttl_reply
+{
+  u32 context;
+  i32 retval;
+  u32 ttl;
+};
+
 /** \brief Add/delete map server
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
index cac3313..2922993 100644 (file)
@@ -101,9 +101,11 @@ _(ONE_MAP_SERVER_DUMP, one_map_server_dump)                             \
 _(ONE_EID_TABLE_MAP_DUMP, one_eid_table_map_dump)                       \
 _(ONE_EID_TABLE_VNI_DUMP, one_eid_table_vni_dump)                       \
 _(ONE_ADJACENCIES_GET, one_adjacencies_get)                             \
+_(ONE_MAP_REGISTER_SET_TTL, one_map_register_set_ttl)                   \
 _(SHOW_ONE_NSH_MAPPING, show_one_nsh_mapping)                           \
 _(SHOW_ONE_RLOC_PROBE_STATE, show_one_rloc_probe_state)                 \
 _(SHOW_ONE_MAP_REGISTER_STATE, show_one_map_register_state)             \
+_(SHOW_ONE_MAP_REGISTER_TTL, show_one_map_register_ttl)                 \
 _(SHOW_ONE_STATUS, show_one_status)                                     \
 _(ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS,                                    \
   one_add_del_map_request_itr_rlocs)                                    \
@@ -143,6 +145,35 @@ unformat_one_locs (vl_api_one_remote_locator_t * rmt_locs, u32 rloc_num)
   return locs;
 }
 
+static void
+vl_api_one_map_register_set_ttl_t_handler (vl_api_one_map_register_set_ttl_t *
+                                          mp)
+{
+  vl_api_one_map_register_set_ttl_reply_t *rmp;
+  int rv = 0;
+
+  vl_api_one_map_register_set_ttl_t_endian (mp);
+  rv = vnet_lisp_map_register_set_ttl (mp->ttl);
+
+  REPLY_MACRO (VL_API_ONE_MAP_REGISTER_SET_TTL_REPLY);
+}
+
+static void
+  vl_api_show_one_map_register_ttl_t_handler
+  (vl_api_show_one_map_register_ttl_t * mp)
+{
+  vl_api_show_one_map_register_ttl_reply_t *rmp;
+  int rv = 0;
+
+  u32 ttl = vnet_lisp_map_register_get_ttl ();
+  /* *INDENT-OFF* */
+  REPLY_MACRO2 (VL_API_SHOW_ONE_MAP_REGISTER_TTL_REPLY,
+  ({
+    rmp->ttl = clib_host_to_net_u32 (ttl);
+  }));
+  /* *INDENT-ON* */
+}
+
 static void
 vl_api_one_add_del_locator_set_t_handler (vl_api_one_add_del_locator_set_t *
                                          mp)
index e3fbf5a..3b41189 100644 (file)
@@ -1081,6 +1081,73 @@ VLIB_CLI_COMMAND (one_cp_enable_disable_command) = {
 };
 /* *INDENT-ON* */
 
+static clib_error_t *
+lisp_map_register_set_ttl_command_fn (vlib_main_t * vm,
+                                     unformat_input_t * input,
+                                     vlib_cli_command_t * cmd)
+{
+  unformat_input_t _line_input, *line_input = &_line_input;
+  u32 ttl = 0;
+  u8 is_set = 0;
+  clib_error_t *error = NULL;
+
+  /* Get a line of input. */
+  if (!unformat_user (input, unformat_line_input, line_input))
+    return 0;
+
+  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (line_input, "%u", &ttl))
+       is_set = 1;
+      else
+       {
+         vlib_cli_output (vm, "parse error: '%U'", format_unformat_error,
+                          line_input);
+         goto done;
+       }
+    }
+
+  if (!is_set)
+    {
+      vlib_cli_output (vm, "expected integer value for TTL!");
+      goto done;
+    }
+
+  vnet_lisp_map_register_set_ttl (ttl);
+
+done:
+  unformat_free (line_input);
+  return error;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_map_register_set_ttl_command) = {
+    .path = "one map-register ttl",
+    .short_help = "one map-register ttl",
+    .function = lisp_map_register_set_ttl_command_fn,
+};
+/* *INDENT-ON* */
+
+static clib_error_t *
+lisp_map_register_show_ttl_command_fn (vlib_main_t * vm,
+                                      unformat_input_t * input,
+                                      vlib_cli_command_t * cmd)
+{
+  u32 ttl = vnet_lisp_map_register_get_ttl ();
+
+  vlib_cli_output (vm, "map-register TTL: %u", ttl);
+  return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (one_map_register_show_ttl_command) = {
+    .path = "show one map-register ttl",
+    .short_help = "show one map-register ttl",
+    .function = lisp_map_register_show_ttl_command_fn,
+};
+
+/* *INDENT-ON* */
+
 static clib_error_t *
 lisp_map_register_enable_disable_command_fn (vlib_main_t * vm,
                                             unformat_input_t * input,