#include #include #include #include #include static int handle_get_mactime (http_builtin_method_type_t reqtype, 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 (); /* *INDENT-OFF* */ pool_foreach (n, pool, ({ vec_add1 (mm->arp_cache_copy, n[0]);})); /* *INDENT-ON* */ 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: */