static void vr_flow_table_reset(struct vrouter *router) { unsigned int start, end, i; struct vr_flow_entry *fe; struct vr_forwarding_md fmd; struct vr_flow_md flmd; start = end = 0; if (router->vr_flow_table) end = vr_btable_entries(router->vr_flow_table); if (router->vr_oflow_table) { if (!end) start = vr_flow_entries; end += vr_btable_entries(router->vr_oflow_table); } if (end) { vr_init_forwarding_md(&fmd); flmd.flmd_action = VR_FLOW_ACTION_DROP; for (i = start; i < end; i++) { fe = vr_get_flow_entry(router, i); if (fe) { flmd.flmd_index = i; flmd.flmd_flags = fe->fe_flags; fe->fe_action = VR_FLOW_ACTION_DROP; vr_flush_entry(router, fe, &flmd, &fmd); vr_reset_flow_entry(router, fe, i); } } } vr_flow_table_info_reset(router); return; }
static struct vr_timer * fragment_table_scanner_init(struct vrouter *router, struct vr_btable *table) { unsigned int num_entries; struct vr_timer *vtimer; struct scanner_params *scanner; if (!table) return NULL; num_entries = vr_btable_entries(table); scanner = vr_zalloc(sizeof(*scanner), VR_FRAGMENT_SCANNER_OBJECT); if (!scanner) { vr_module_error(-ENOMEM, __FUNCTION__, __LINE__, num_entries); return NULL; } scanner->sp_router = router; scanner->sp_fragment_table = table; scanner->sp_num_entries = num_entries; scanner->sp_last_scanned_entry = -1; vtimer = vr_malloc(sizeof(*vtimer), VR_TIMER_OBJECT); if (!vtimer) { vr_module_error(-ENOMEM, __FUNCTION__, __LINE__, num_entries); goto fail_init; } vtimer->vt_timer = fragment_table_scanner; vtimer->vt_vr_arg = scanner; vtimer->vt_msecs = 1000; if (vr_create_timer(vtimer)) { vr_module_error(-ENOMEM, __FUNCTION__, __LINE__, num_entries); goto fail_init; } return vtimer; fail_init: if (scanner) vr_free(scanner, VR_FRAGMENT_SCANNER_OBJECT); return NULL; }