stats_rt_notify(struct proto *P UNUSED, struct channel *src_ch, const net_addr *n UNUSED, rte *new, const rte *old)
{
struct stats_channel *ch = (void *) src_ch;
- log(L_INFO "stats_rt_notify() %u", ch->max_generation);
if (old)
{
+ ch->counters[old->generation]--;
if (old->generation < ch->max_generation)
- {
- ch->counters[old->generation]--;
- log(L_INFO "channel %s counter %u was decreased", src_ch->name, old->generation);
- }
- else
- {
- log(L_WARN "Stats: Maximum generation reached in channel %s, route is dropped.",
- src_ch->name
- );
- }
+ ch->sum--;
}
if (new)
{
+ ch->counters[new->generation]++;
if (new->generation < ch->max_generation)
- {
- ch->counters[new->generation]++;
- log(L_INFO "channel %s counter %u was increased", src_ch->name, new->generation);
- }
- else
- {
- log(L_WARN "Stats: Maximum generation reached in channel %s, route is dropped.",
- src_ch->name
- );
- }
+ ch->sum++;
}
}
static void
stats_configure_channels(struct proto *P, struct proto_config *CF)
{
- log(L_INFO "stats_configure_channels()");
-
struct channel_config *cc;
WALK_LIST(cc, CF->channels)
{
{
struct proto *P = proto_new(CF);
struct stats_proto *p = (void *) P;
- log(L_INFO "stats_init()");
P->rt_notify = stats_rt_notify;
P->reload_routes = stats_reload_routes;
static int
stats_start(struct proto *P UNUSED)
{
- log(L_INFO "stats_start()");
-
return PS_UP;
}
{
struct stats_proto *p = (void *) P;
struct stats_config *new = (void *) CF;
- log(L_INFO "stats_reconfigure()");
struct channel *c;
WALK_LIST(c, p->p.channels)
struct stats_channel *sc = (void *) c;
struct stats_channel_config *scc = (void *) cc;
- sc->counters = mb_realloc(sc->counters, scc->max_generation);
+ sc->max_generation = scc->max_generation;
- if (sc->max_generation < scc->max_generation)
- /* zero newly created counters */
- memset(sc->counters + sc->max_generation, 0, scc->max_generation - sc->max_generation);
+ /* recalculate sum */
+ sc->sum = 0;
+ for (u8 i = 0; i < sc->max_generation; i++)
+ sc->sum += sc->counters[i];
- sc->max_generation = scc->max_generation;
c->stale = 0;
}
}
return 1;
}
-static void
-stats_copy_config(struct proto_config *dest UNUSED, struct proto_config *src UNUSED)
-{
- /* Just a shallow copy, not many items here */
-}
-
-/* NO NEED TO PRINT ANYTHING BEFORE protocol header
-
-static void
-stats_get_status(struct proto *P, byte *buf)
-{
- struct stats_proto *p = (void *) P;
-
- cli_msg(-1006, " another super informative message ");
-}
-*/
-
static void
stats_show_proto_info(struct proto *P)
{
struct stats_proto *p = (void *) P;
- log(L_INFO "stats_show_proto_info() ");
+ /* indexes of non-zero counters */
u32 *arr = mb_alloc(p->p.pool, 256 * sizeof(u32));
struct stats_channel *sc;
for (u8 i = 0; i < sc->max_generation; i++)
if (sc->counters[i])
{
- log(L_INFO "found non-zero %u in counter %u", sc->counters[i], i);
arr[len] = i;
len++;
}
cli_msg(-1006, " Channel %s", sc->c.name);
cli_msg(-1006, " Max generation: %3u", sc->max_generation);
+ cli_msg(-1006, " Exports: %10u", sc->sum);
cli_msg(-1006, " Counter exported");
for (u8 i = 0; i < len; i++)
}
void
-stats_update_debug(struct proto *P UNUSED)
+stats_update_debug(struct proto *P)
{
-
- //p->c->debug = p->p.debug;
+ struct channel *c;
+ WALK_LIST(c, P->channels)
+ {
+ c->debug = P->debug;
+ }
}
static int
{
struct stats_channel *c = (void *) C;
struct stats_proto *p = (void *) C->proto;
- log(L_INFO "stats_channel_start() %s", C->name);
c->pool = p->p.pool;
- c->counters = mb_allocz(c->pool, c->max_generation * sizeof(u32));
+ c->counters = mb_allocz(c->pool, 256 * sizeof(u32));
+ c->sum = 0;
return 0;
}
stats_channel_shutdown(struct channel *C)
{
struct stats_channel *c = (void *) C;
- log(L_INFO "stats_channel_shutdown() %s", C->name);
mb_free(c->counters);
.init = stats_init,
.start = stats_start,
.reconfigure = stats_reconfigure,
- .copy_config = stats_copy_config,
- //.get_status = stats_get_status,
.show_proto_info = stats_show_proto_info
};