From ef3c11ca93b651611af33ab3e5d64217504d221d Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Mon, 14 Oct 2019 11:26:15 -0400 Subject: mactime: add the "mactime.json" builtin URL If the http static server plugin is enabled, register the name "mactime.json" with the server. Visiting /mactime.json produces a json brain-dump of the mactime table. Type: feature Signed-off-by: Dave Barach Change-Id: Ie39b0c776675864a85251b8c07fbf719d399f6de --- src/plugins/mactime/CMakeLists.txt | 1 + src/plugins/mactime/builtins.c | 172 +++++++++++++++++++++++++++++++++++++ src/plugins/mactime/mactime.c | 7 ++ src/plugins/mactime/mactime.h | 1 + src/plugins/mactime/mactime_test.c | 1 - 5 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 src/plugins/mactime/builtins.c diff --git a/src/plugins/mactime/CMakeLists.txt b/src/plugins/mactime/CMakeLists.txt index 5477674f22a..debf033f71e 100644 --- a/src/plugins/mactime/CMakeLists.txt +++ b/src/plugins/mactime/CMakeLists.txt @@ -14,6 +14,7 @@ add_vpp_plugin(mactime SOURCES mactime.c + builtins.c node.c API_FILES diff --git a/src/plugins/mactime/builtins.c b/src/plugins/mactime/builtins.c new file mode 100644 index 00000000000..a0d7b5f731e --- /dev/null +++ b/src/plugins/mactime/builtins.c @@ -0,0 +1,172 @@ +#include +#include +#include +#include +#include + +static int +handle_get_mactime (u8 * request, http_session_t * hs) +{ + mactime_main_t *mm = &mactime_main; + mactime_device_t *dp; + u8 *macstring = 0; + char *status_string; + u32 *pool_indices = 0; + int current_status = 99; + int i, j; + f64 now; + vlib_counter_t allow, drop; + ethernet_arp_ip4_entry_t *n, *pool; + char *q = "\""; + u8 *s = 0; + int need_comma = 0; + + vec_reset_length (mm->arp_cache_copy); + pool = ip4_neighbors_pool (); + + pool_foreach (n, pool, ( + { + vec_add1 (mm->arp_cache_copy, n[0]);})); + + now = clib_timebase_now (&mm->timebase); + + if (PREDICT_FALSE ((now - mm->sunday_midnight) > 86400.0 * 7.0)) + mm->sunday_midnight = clib_timebase_find_sunday_midnight (now); + + /* *INDENT-OFF* */ + pool_foreach (dp, mm->devices, + ({ + vec_add1 (pool_indices, dp - mm->devices); + })); + /* *INDENT-ON* */ + + s = format (s, "{%smactime%s: [\n", q, q); + + for (i = 0; i < vec_len (pool_indices); i++) + { + dp = pool_elt_at_index (mm->devices, pool_indices[i]); + + /* Check dynamic ranges */ + for (j = 0; j < vec_len (dp->ranges); j++) + { + clib_timebase_range_t *r = dp->ranges + j; + f64 start0, end0; + + start0 = r->start + mm->sunday_midnight; + end0 = r->end + mm->sunday_midnight; + + if (now >= start0 && now <= end0) + { + if (dp->flags & MACTIME_DEVICE_FLAG_DYNAMIC_ALLOW) + current_status = 3; + else if (dp->flags & MACTIME_DEVICE_FLAG_DYNAMIC_ALLOW_QUOTA) + current_status = 5; + else + current_status = 2; + goto print; + } + } + if (dp->flags & MACTIME_DEVICE_FLAG_STATIC_DROP) + current_status = 0; + if (dp->flags & MACTIME_DEVICE_FLAG_STATIC_ALLOW) + current_status = 1; + if (dp->flags & MACTIME_DEVICE_FLAG_DYNAMIC_ALLOW) + current_status = 2; + if (dp->flags & MACTIME_DEVICE_FLAG_DYNAMIC_DROP) + current_status = 3; + if (dp->flags & MACTIME_DEVICE_FLAG_DYNAMIC_ALLOW_QUOTA) + current_status = 4; + + print: + vec_reset_length (macstring); + + macstring = format (0, "%U", format_mac_address, dp->mac_address); + + if (need_comma) + s = format (s, "},\n"); + + need_comma = 1; + s = format (s, "{%smac_address%s: %s%s%s, ", q, q, q, macstring, q); + + switch (current_status) + { + case 0: + status_string = "static drop"; + break; + case 1: + status_string = "static allow"; + break; + case 2: + status_string = "dynamic drop"; + break; + case 3: + status_string = "dynamic allow"; + break; + case 4: + status_string = "d-quota inact"; + break; + case 5: + status_string = "d-quota activ"; + break; + default: + status_string = "code bug!"; + break; + } + vlib_get_combined_counter (&mm->allow_counters, dp - mm->devices, + &allow); + vlib_get_combined_counter (&mm->drop_counters, dp - mm->devices, &drop); + s = format (s, "%sname%s: %s%s%s, %sstatus%s: %s%s%s,", + q, q, q, dp->device_name, q, q, q, q, status_string, q); + s = format (s, "%sallow_pkts%s: %lld,", q, q, allow.packets); + s = format (s, "%sallow_bytes%s: %lld,", q, q, allow.bytes); + s = format (s, "%sdrop_pkts%s: %lld", q, q, drop.packets); + + 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))) + { + s = format (s, ", %sip4_address%s: %s%U%s", q, q, + q, format_ip4_address, &n->ip4_address, q); + break; + } + } + } + if (need_comma) + s = format (s, "}\n"); + s = format (s, "]}\n"); + vec_free (macstring); + vec_free (pool_indices); + + hs->data = s; + hs->data_offset = 0; + hs->cache_pool_index = ~0; + hs->free_data = 1; + return 0; +} + +void +mactime_url_init (vlib_main_t * vm) +{ + void (*fp) (void *, char *, int); + + /* Look up the builtin URL registration handler */ + fp = vlib_get_plugin_symbol ("http_static_plugin.so", + "http_static_server_register_builtin_handler"); + + if (fp == 0) + { + clib_warning ("http_static_plugin.so not loaded..."); + return; + } + + (*fp) (handle_get_mactime, "mactime.json", HTTP_BUILTIN_METHOD_GET); +} + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/src/plugins/mactime/mactime.c b/src/plugins/mactime/mactime.c index 06fa7084f99..cd2f5091c7b 100644 --- a/src/plugins/mactime/mactime.c +++ b/src/plugins/mactime/mactime.c @@ -64,6 +64,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 +82,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; } diff --git a/src/plugins/mactime/mactime.h b/src/plugins/mactime/mactime.h index 2ce1cf97c72..61160f87fd0 100644 --- a/src/plugins/mactime/mactime.h +++ b/src/plugins/mactime/mactime.h @@ -89,6 +89,7 @@ extern vlib_node_registration_t mactime_node; extern vlib_node_registration_t mactime_tx_node; void mactime_send_create_entry_message (u8 * mac_address); +void mactime_url_init (vlib_main_t * vm); /* Periodic function events */ #define MACTIME_EVENT1 1 diff --git a/src/plugins/mactime/mactime_test.c b/src/plugins/mactime/mactime_test.c index 40a9da08442..b47cc211435 100644 --- a/src/plugins/mactime/mactime_test.c +++ b/src/plugins/mactime/mactime_test.c @@ -432,7 +432,6 @@ vl_api_mactime_details_t_handler (vl_api_mactime_details_t * mp) clib_warning ("WARNING: stub called..."); } - #include /* -- cgit 1.2.3-korg