示例#1
0
文件: thread.c 项目: tidatida/lagopus
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;
}
示例#2
0
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);
}