diff options
Diffstat (limited to 'src/plugins/mactime/builtins.c')
-rw-r--r-- | src/plugins/mactime/builtins.c | 172 |
1 files changed, 172 insertions, 0 deletions
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 <vnet/vnet.h> +#include <builtinurl/builtinurl.h> +#include <http_static/http_static.h> +#include <mactime/mactime.h> +#include <vlib/unix/plugin.h> + +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: + */ |