#include <vlibapi/api.h>
#include <vlibmemory/api.h>
#include <vnet/ip/ip.h>
+#include <vnet/ip/ip_neighbor.h>
#include <vnet/l2/l2_input.h>
#include <vnet/l2tp/l2tp.h>
#include <vnet/vxlan/vxlan.h>
_(modify_vhost_user_if_reply) \
_(delete_vhost_user_if_reply) \
_(ip_probe_neighbor_reply) \
+_(ip_scan_neighbor_enable_disable_reply) \
_(want_ip4_arp_events_reply) \
_(want_ip6_nd_events_reply) \
_(want_l2_macs_events_reply) \
_(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
_(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
_(IP_PROBE_NEIGHBOR_REPLY, ip_probe_neighbor_reply) \
+_(IP_SCAN_NEIGHBOR_ENABLE_DISABLE_REPLY, ip_scan_neighbor_enable_disable_reply) \
_(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
_(IP4_ARP_EVENT, ip4_arp_event) \
_(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
show_one_map_register_fallback_threshold_reply) \
_(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
_(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
+_(AF_PACKET_DETAILS, af_packet_details) \
_(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
_(POLICER_DETAILS, policer_details) \
_(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
M (PROXY_ARP_ADD_DEL, mp);
- mp->vrf_id = ntohl (vrf_id);
+ mp->proxy.vrf_id = ntohl (vrf_id);
mp->is_add = is_add;
- clib_memcpy (mp->low_address, &lo, sizeof (mp->low_address));
- clib_memcpy (mp->hi_address, &hi, sizeof (mp->hi_address));
+ clib_memcpy (mp->proxy.low_address, &lo, sizeof (mp->proxy.low_address));
+ clib_memcpy (mp->proxy.hi_address, &hi, sizeof (mp->proxy.hi_address));
S (mp);
W (ret);
return ret;
}
+static int
+api_ip_scan_neighbor_enable_disable (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_ip_scan_neighbor_enable_disable_t *mp;
+ u8 mode = IP_SCAN_V46_NEIGHBORS;
+ u32 interval = 0, time = 0, update = 0, delay = 0, stale = 0;
+ int ret;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "ip4"))
+ mode = IP_SCAN_V4_NEIGHBORS;
+ else if (unformat (i, "ip6"))
+ mode = IP_SCAN_V6_NEIGHBORS;
+ if (unformat (i, "both"))
+ mode = IP_SCAN_V46_NEIGHBORS;
+ else if (unformat (i, "disable"))
+ mode = IP_SCAN_DISABLED;
+ else if (unformat (i, "interval %d", &interval))
+ ;
+ else if (unformat (i, "max-time %d", &time))
+ ;
+ else if (unformat (i, "max-update %d", &update))
+ ;
+ else if (unformat (i, "delay %d", &delay))
+ ;
+ else if (unformat (i, "stale %d", &stale))
+ ;
+ else
+ break;
+ }
+
+ if (interval > 255)
+ {
+ errmsg ("interval cannot exceed 255 minutes.");
+ return -99;
+ }
+ if (time > 255)
+ {
+ errmsg ("max-time cannot exceed 255 usec.");
+ return -99;
+ }
+ if (update > 255)
+ {
+ errmsg ("max-update cannot exceed 255.");
+ return -99;
+ }
+ if (delay > 255)
+ {
+ errmsg ("delay cannot exceed 255 msec.");
+ return -99;
+ }
+ if (stale > 255)
+ {
+ errmsg ("stale cannot exceed 255 minutes.");
+ return -99;
+ }
+
+ M (IP_SCAN_NEIGHBOR_ENABLE_DISABLE, mp);
+ mp->mode = mode;
+ mp->scan_interval = interval;
+ mp->max_proc_time = time;
+ mp->max_update = update;
+ mp->scan_int_delay = delay;
+ mp->stale_threshold = stale;
+
+ S (mp);
+ W (ret);
+ return ret;
+}
+
static int
api_want_ip4_arp_events (vat_main_t * vam)
{
return ret;
}
+static void vl_api_af_packet_details_t_handler
+ (vl_api_af_packet_details_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+
+ print (vam->ofp, "%-16s %d",
+ mp->host_if_name, clib_net_to_host_u32 (mp->sw_if_index));
+}
+
+static void vl_api_af_packet_details_t_handler_json
+ (vl_api_af_packet_details_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+ vat_json_node_t *node = NULL;
+
+ if (VAT_JSON_ARRAY != vam->json_tree.type)
+ {
+ ASSERT (VAT_JSON_NONE == vam->json_tree.type);
+ vat_json_init_array (&vam->json_tree);
+ }
+ node = vat_json_array_add (&vam->json_tree);
+
+ vat_json_init_object (node);
+ vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
+ vat_json_object_add_string_copy (node, "dev_name", mp->host_if_name);
+}
+
+static int
+api_af_packet_dump (vat_main_t * vam)
+{
+ vl_api_af_packet_dump_t *mp;
+ vl_api_control_ping_t *mp_ping;
+ int ret;
+
+ print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index");
+ /* Get list of tap interfaces */
+ M (AF_PACKET_DUMP, mp);
+ S (mp);
+
+ /* Use a control ping for synchronization */
+ MPING (CONTROL_PING, mp_ping);
+ S (mp_ping);
+
+ W (ret);
+ return ret;
+}
+
static int
api_policer_add_del (vat_main_t * vam)
{
"<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
" [l2-table <nn>] [del]") \
_(ip_probe_neighbor, "(<intc> | sw_if_index <nn>) address <ip4|ip6-addr>") \
+_(ip_scan_neighbor_enable_disable, "[ip4|ip6|both|disable] [interval <n-min>]\n" \
+ " [max-time <n-usec>] [max-update <n>] [delay <n-msec>] [stale <n-min>]") \
_(want_ip4_arp_events, "address <ip4-address> [del]") \
_(want_ip6_nd_events, "address <ip6-address> [del]") \
_(want_l2_macs_events, "[disable] [learn-limit <n>] [scan-delay <n>] [max-entries <n>]") \
_(show_lisp_map_request_mode, "") \
_(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
_(af_packet_delete, "name <host interface name>") \
+_(af_packet_dump, "") \
_(policer_add_del, "name <policer name> <params> [del]") \
_(policer_dump, "[name <policer name>]") \
_(policer_classify_set_interface, \