Index: trunk/src_plugins/lib_netmap/pstklib.c =================================================================== --- trunk/src_plugins/lib_netmap/pstklib.c (revision 35183) +++ trunk/src_plugins/lib_netmap/pstklib.c (revision 35184) @@ -52,9 +52,17 @@ long n; for(n = 0; n < data->ps_protos.used; n++) { pcb_pstk_proto_t *proto = &data->ps_protos.array[n]; + pcb_pstklib_entry_t *pe; if (!proto->in_use) continue; + if (htprp_has(&ctx->protos, proto)) continue; + pe = calloc(sizeof(pcb_pstklib_entry_t) + ctx->extra_size, 1); + pcb_pstk_proto_copy(&pe->proto, proto); + pe->id = ctx->next_id++; + htprp_set(&ctx->protos, proto, pe); + if (ctx->on_new_entry != NULL) + ctx->on_new_entry(ctx, pe); } } Index: trunk/src_plugins/lib_netmap/pstklib.h =================================================================== --- trunk/src_plugins/lib_netmap/pstklib.h (revision 35183) +++ trunk/src_plugins/lib_netmap/pstklib.h (revision 35184) @@ -9,6 +9,7 @@ pcb_pstk_proto_t proto; /* copy of a proto */ long id; /* unique ID counted from 1 by pcb_pstklib_build */ void *user_data; + char extra[1]; /* as big as ctx->extra_size */ } pcb_pstklib_entry_t; typedef struct pcb_pstklib_s pcb_pstklib_t; @@ -17,8 +18,11 @@ pcb_board_t *pcb; long next_id; + /* user configuration */ + void (*on_new_entry)(pcb_pstklib_t *ctx, pcb_pstklib_entry_t *pe); /* optional: if set, called after a new entry is inserted */ void (*on_free_entry)(pcb_pstklib_t *ctx, pcb_pstklib_entry_t *pe); /* optional: if set, called before freeing an entry on uninit */ void *user_data; + int extra_size; }; void pcb_pstklib_init(pcb_pstklib_t *ctx, pcb_board_t *pcb);