X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fmactime%2Fmactime.c;h=a2219bebe9a5e92f781c282f4dae5fdabdeb9b43;hb=04161c8f201f95c8354fc583d67e808440d33b9d;hp=502ac98b7233d433ca4526a4dc88836c89ea4dd8;hpb=2c41a61d5fc87737b9b46b88cb9271d0f987721e;p=vpp.git diff --git a/src/plugins/mactime/mactime.c b/src/plugins/mactime/mactime.c index 502ac98b723..a2219bebe9a 100644 --- a/src/plugins/mactime/mactime.c +++ b/src/plugins/mactime/mactime.c @@ -24,6 +24,7 @@ #include /* define message IDs */ +#include #include #include @@ -32,9 +33,12 @@ #define REPLY_MSG_ID_BASE mm->msg_id_base #include +#include + mactime_main_t mactime_main; -/** \file time-base src-mac filter device-input feature arc implementation +/** \file mactime.c + * time-base src-mac filter device-input feature arc implementation */ static void @@ -47,7 +51,8 @@ feature_init (mactime_main_t * mm) mm->lookup_table_num_buckets, mm->lookup_table_memory_size); clib_timebase_init (&mm->timebase, mm->timezone_offset, - CLIB_TIMEBASE_DAYLIGHT_USA); + CLIB_TIMEBASE_DAYLIGHT_USA, + &(mm->vlib_main->clib_time)); mm->allow_counters.name = "allow"; mm->allow_counters.stat_segment_name = "/mactime/allow"; mm->drop_counters.name = "drop"; @@ -64,6 +69,7 @@ mactime_enable_disable (mactime_main_t * mm, u32 sw_if_index, { vnet_sw_interface_t *sw; int rv = 0; + static u8 url_init_done; feature_init (mm); @@ -81,6 +87,12 @@ mactime_enable_disable (mactime_main_t * mm, u32 sw_if_index, sw_if_index, enable_disable, 0, 0); vnet_feature_enable_disable ("interface-output", "mactime-tx", sw_if_index, enable_disable, 0, 0); + if (url_init_done == 0) + { + mactime_url_init (mm->vlib_main); + url_init_done = 1; + } + return rv; } @@ -183,8 +195,8 @@ vl_api_mactime_dump_t_handler (vl_api_mactime_dump_t * mp) } /* *INDENT-OFF* */ - pool_foreach (dev, mm->devices, - ({ + pool_foreach (dev, mm->devices) + { message_size = sizeof(*ep) + vec_len(dev->device_name) + vec_len(dev->ranges) * sizeof(ep->ranges[0]); @@ -192,6 +204,7 @@ vl_api_mactime_dump_t_handler (vl_api_mactime_dump_t * mp) memset (ep, 0, message_size); ep->_vl_msg_id = clib_host_to_net_u16 (VL_API_MACTIME_DETAILS + mm->msg_id_base); + ep->context = mp->context; /* Index is the key for the stats segment combined counters */ ep->pool_index = clib_host_to_net_u32 (dev - mm->devices); @@ -217,7 +230,7 @@ vl_api_mactime_dump_t_handler (vl_api_mactime_dump_t * mp) name_len); ep->device_name [ARRAY_LEN(ep->device_name) -1] = 0; vl_api_send_msg (rp, (u8 *)ep); - })); + } /* *INDENT-OFF* */ send_reply: @@ -240,7 +253,7 @@ mactime_send_create_entry_message (u8 * mac_address) u8 *name; vl_api_mactime_add_del_range_t *mp; - am = &api_main; + am = vlibapi_get_main (); shmem_hdr = am->shmem_hdr; mp = vl_msg_api_alloc_as_if_client (sizeof (*mp)); clib_memset (mp, 0, sizeof (*mp)); @@ -416,7 +429,12 @@ mactime_init (vlib_main_t * vm) return 0; } -VLIB_INIT_FUNCTION (mactime_init); +/* *INDENT-OFF* */ +VLIB_INIT_FUNCTION (mactime_init) = +{ + .runs_after = VLIB_INITS("ip_neighbor_init"), +}; +/* *INDENT-ON* */ static clib_error_t * mactime_config (vlib_main_t * vm, unformat_input_t * input) @@ -510,6 +528,16 @@ format_bytes_with_width (u8 * s, va_list * va) return s; } +static walk_rc_t +mactime_ip_neighbor_copy (index_t ipni, void *ctx) +{ + mactime_main_t *mm = ctx; + + vec_add1 (mm->arp_cache_copy, ipni); + + return (WALK_CONTINUE); +} + static clib_error_t * show_mactime_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) @@ -524,17 +552,16 @@ show_mactime_command_fn (vlib_main_t * vm, int i, j; f64 now; vlib_counter_t allow, drop; - ethernet_arp_ip4_entry_t *n, *pool; + ip_neighbor_t *ipn; - vec_reset_length (mm->arp_cache_copy); - pool = ip4_neighbors_pool (); + if (mm->feature_initialized == 0) + return clib_error_return + (0, + "Feature not initialized, suggest 'help mactime enable-disable'..."); - /* *INDENT-OFF* */ - pool_foreach (n, pool, - ({ - vec_add1 (mm->arp_cache_copy, n[0]); - })); - /* *INDENT-ON* */ + vec_reset_length (mm->arp_cache_copy); + /* Walk all ip4 neighbours on all interfaces */ + ip_neighbor_walk (AF_IP4, ~0, mactime_ip_neighbor_copy, mm); now = clib_timebase_now (&mm->timebase); @@ -551,10 +578,10 @@ show_mactime_command_fn (vlib_main_t * vm, vlib_cli_output (vm, "Time now: %U", format_clib_timebase_time, now); /* *INDENT-OFF* */ - pool_foreach (dp, mm->devices, - ({ + pool_foreach (dp, mm->devices) + { vec_add1 (pool_indices, dp - mm->devices); - })); + } /* *INDENT-ON* */ vlib_cli_output (vm, "%-15s %18s %14s %10s %11s %13s", @@ -651,11 +678,12 @@ show_mactime_command_fn (vlib_main_t * vm, /* This is really only good for small N... */ for (j = 0; j < vec_len (mm->arp_cache_copy); j++) { - n = mm->arp_cache_copy + j; - if (!memcmp (dp->mac_address, n->mac.bytes, sizeof (n->mac))) + ipn = ip_neighbor_get (mm->arp_cache_copy[j]); + if (!memcmp + (dp->mac_address, ipn->ipn_mac.bytes, sizeof (ipn->ipn_mac))) { - vlib_cli_output (vm, "%17s%U", " ", format_ip4_address, - &n->ip4_address); + vlib_cli_output (vm, "%17s%U", " ", format_ip46_address, + ip_neighbor_get_ip (ipn), IP46_TYPE_IP4); } } } @@ -681,7 +709,9 @@ clear_mactime_command_fn (vlib_main_t * vm, mactime_main_t *mm = &mactime_main; if (mm->feature_initialized == 0) - return clib_error_return (0, "feature not enabled"); + return clib_error_return + (0, + "Feature not initialized, suggest 'help mactime enable-disable'..."); vlib_clear_combined_counters (&mm->allow_counters); vlib_clear_combined_counters (&mm->drop_counters);