lagopus_result_t dataplane_initialize(int argc, const char *const argv[], __UNUSED void *extarg, lagopus_thread_t **thdptr) { #ifdef HAVE_DPDK static struct dataplane_arg dparg; #endif /* HAVE_DPDK */ static struct dataplane_arg sockarg; static struct dataplane_arg timerarg; lagopus_result_t nb_ports; nb_ports = lagopus_dataplane_init(argc, argv); if (nb_ports < 0) { lagopus_msg_fatal("lagopus_dataplane_init failed\n"); return nb_ports; } dp_api_init(); #ifdef HAVE_DPDK if (rawsocket_only_mode != true) { dparg.threadptr = &dpdk_thread; dparg.lock = &dpdk_lock; lagopus_thread_create(&dpdk_thread, dpdk_thread_loop, dp_finalproc, dp_freeproc, "dataplane", &dparg); if (lagopus_mutex_create(&dpdk_lock) != LAGOPUS_RESULT_OK) { lagopus_exit_fatal("lagopus_mutex_create"); } } #endif /* HAVE_DPDK */ lagopus_meter_init(); lagopus_register_action_hook = lagopus_set_action_function; lagopus_register_instruction_hook = lagopus_set_instruction_function; flowinfo_init(); timerarg.threadptr = &timer_thread; timerarg.lock = &timer_lock; timerarg.running = NULL; timerthread_initialize(&timerarg); sockarg.threadptr = &sock_thread; sockarg.lock = &sock_lock; sockarg.running = NULL; sockthread_initialize(&sockarg); *thdptr = &sock_thread; return LAGOPUS_RESULT_OK; }
void test_flowdb_flow_add(void) { struct table **tablep; struct ofp_flow_mod flow_mod; struct match_list match_list; struct instruction_list instruction_list; struct ofp_error error; TAILQ_INIT(&match_list); TAILQ_INIT(&instruction_list); flowinfo_init(); flow_mod.table_id = 0; flow_mod.priority = 1; flow_mod.flags = 0; flow_mod.cookie = 0; flow_mod.out_port = OFPP_ANY; flow_mod.out_group = OFPG_ANY; TABLE_GET(tablep, flowdb, flow_mod.table_id); /* Add. */ TEST_ASSERT_FLOW_ADD_OK(bridge, &flow_mod, &match_list, &instruction_list, &error); TEST_ASSERT_TABLE_NFLOW(tablep, MISC_FLOWS, 1); /* Add (overriden) */ TEST_ASSERT_FLOW_ADD_OK(bridge, &flow_mod, &match_list, &instruction_list, &error); TEST_ASSERT_TABLE_NFLOW(tablep, MISC_FLOWS, 1); /* Add (overriden, CHECK_OVERLAP) */ flow_mod.flags = OFPFF_CHECK_OVERLAP; TEST_ASSERT_FLOW_ADD_NG(bridge, &flow_mod, &match_list, &instruction_list, &error); TEST_ASSERT_TABLE_NFLOW(tablep, MISC_FLOWS, 1); /* Add (different priority, not overlap) */ flow_mod.priority = 2; flow_mod.flags = 0; TEST_ASSERT_FLOW_ADD_OK(bridge, &flow_mod, &match_list, &instruction_list, &error); TEST_ASSERT_TABLE_NFLOW(tablep, MISC_FLOWS, 2); /* Add with match */ add_port_match(&match_list, 1); TEST_ASSERT_FLOW_ADD_OK(bridge, &flow_mod, &match_list, &instruction_list, &error); TEST_ASSERT_TABLE_NFLOW(tablep, MISC_FLOWS, 3); /* Add with match (overriden) */ add_port_match(&match_list, 1); TEST_ASSERT_FLOW_ADD_OK(bridge, &flow_mod, &match_list, &instruction_list, &error); TEST_ASSERT_TABLE_NFLOW(tablep, MISC_FLOWS, 3); /* Add with match (overriden, CHECK_OVERLAP) */ add_port_match(&match_list, 1); flow_mod.flags = OFPFF_CHECK_OVERLAP; TEST_ASSERT_FLOW_ADD_NG(bridge, &flow_mod, &match_list, &instruction_list, &error); TEST_ASSERT_TABLE_NFLOW(tablep, MISC_FLOWS, 3); #if 0 flow_mod.table_id = 1; TEST_ASSERT_FLOW_ADD_NG(bridge, &flow_mod, &match_list, &instruction_list, &error); TEST_ASSERT_TABLE_NFLOW(tablep, MISC_FLOWS, 1); #endif /* 0 */ FLOWDB_DUMP(flowdb, "After addition", stdout); /* Cleanup. */ TEST_ASSERT_FLOW_DELETE_OK(bridge, &flow_mod, &match_list, &error); TEST_ASSERT_TABLE_NFLOW(tablep, MISC_FLOWS, 0); FLOWDB_DUMP(flowdb, "After cleanup", stdout); }