void test_lagopus_receive_packet(void) { struct lagopus_packet pkt; struct dpmgr *my_dpmgr; struct port nport, *port; struct bridge *bridge; OS_MBUF *m; lagopus_result_t rv; my_dpmgr = dpmgr_alloc(); TEST_ASSERT_NOT_NULL_MESSAGE(my_dpmgr, "alloc error"); rv = dpmgr_bridge_add(my_dpmgr, "br0", 0); TEST_ASSERT_EQUAL_MESSAGE(rv, LAGOPUS_RESULT_OK, "bridge add error\n"); nport.type = LAGOPUS_PORT_TYPE_NULL; /* for test */ nport.ifindex = 0; nport.ofp_port.hw_addr[0] = 1; dpmgr_port_add(my_dpmgr, &nport); nport.ifindex = 1; dpmgr_port_add(my_dpmgr, &nport); rv = dpmgr_bridge_port_add(my_dpmgr, "br0", 0, 1); TEST_ASSERT_EQUAL(rv, LAGOPUS_RESULT_OK); rv = dpmgr_bridge_port_add(my_dpmgr, "br0", 1, 2); TEST_ASSERT_EQUAL(rv, LAGOPUS_RESULT_OK); bridge = dpmgr_bridge_lookup(my_dpmgr, "br0"); TEST_ASSERT_NOT_NULL(bridge); /* prepare packet */ m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "m: calloc error."); m->data = &m->dat[128]; m->data[12] = 0x08; m->data[13] = 0x00; m->data[14] = 0x45; m->data[23] = IPPROTO_TCP; m->refcnt = 2; pkt.cache = NULL; pkt.table_id = 0; pkt.flags = 0; port = port_lookup(bridge->ports, 1); TEST_ASSERT_NOT_NULL_MESSAGE(port, "port lookup error."); lagopus_set_in_port(&pkt, port); TEST_ASSERT_EQUAL_MESSAGE(pkt.in_port, port, "port error."); TEST_ASSERT_EQUAL(pkt.in_port->bridge, bridge); lagopus_packet_init(&pkt, m); lagopus_receive_packet(port, &pkt); TEST_ASSERT_NOT_EQUAL_MESSAGE(pkt.in_port, NULL, "port error."); TEST_ASSERT_EQUAL_MESSAGE(m->refcnt, 1, "m->refcnt error."); dpmgr_free(my_dpmgr); }
void test_lagopus_match_and_action(void) { struct action_list action_list; struct dpmgr *my_dpmgr; struct bridge *bridge; struct table *table; struct action *action; struct ofp_action_output *action_set; struct port nport, *port; struct lagopus_packet pkt; OS_MBUF *m; /* setup bridge and port */ my_dpmgr = dpmgr_alloc(); dpmgr_bridge_add(my_dpmgr, "br0", 0); nport.type = LAGOPUS_PORT_TYPE_NULL; /* for test */ nport.ifindex = 0; nport.ofp_port.hw_addr[0] = 1; dpmgr_port_add(my_dpmgr, &nport); nport.ifindex = 1; dpmgr_port_add(my_dpmgr, &nport); dpmgr_bridge_port_add(my_dpmgr, "br0", 0, 1); dpmgr_bridge_port_add(my_dpmgr, "br0", 1, 2); bridge = dpmgr_bridge_lookup(my_dpmgr, "br0"); TEST_ASSERT_NOT_NULL(bridge); flowdb_switch_mode_set(bridge->flowdb, SWITCH_MODE_OPENFLOW); table = table_get(bridge->flowdb, 0); table->userdata = new_flowinfo_eth_type(); TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action_set = (struct ofp_action_output *)&action->ofpat; action_set->type = OFPAT_OUTPUT; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; m->refcnt = 2; port = port_lookup(bridge->ports, 1); TEST_ASSERT_NOT_NULL(port); lagopus_set_in_port(&pkt, port); TEST_ASSERT_EQUAL(pkt.in_port, port); TEST_ASSERT_EQUAL(pkt.in_port->bridge, bridge); pkt.table_id = 0; lagopus_packet_init(&pkt, m); lagopus_match_and_action(&pkt); TEST_ASSERT_EQUAL_MESSAGE(m->refcnt, 1, "match_and_action refcnt error."); free(m); dpmgr_free(my_dpmgr); }
void tearDown(void) { struct table_features *f; struct table_property *p; struct next_table_id *n; struct oxm_id *o; struct experimenter_data *e; TEST_ASSERT_NOT_NULL(dpmgr); TEST_ASSERT_NOT_NULL(bridge); TEST_ASSERT_NOT_NULL(flowdb); /* * Inline expansion from outside dpmgr. * * Stolen form: src/agent/ofp_table_features_handler.c */ while ((f = TAILQ_FIRST(&features_list)) != NULL) { while ((p = TAILQ_FIRST(&f->table_property_list)) != NULL) { instruction_list_entry_free(&p->instruction_list); /* next_table_id_list_entry_free(&p->next_table_id_list); */ while ((n = TAILQ_FIRST(&p->next_table_id_list)) != NULL) { TAILQ_REMOVE(&p->next_table_id_list, n, entry); free(n); } action_list_entry_free(&p->action_list); /* oxm_id_list_entry_free(&p->oxm_id_list); */ while ((o = TAILQ_FIRST(&p->oxm_id_list)) != NULL) { TAILQ_REMOVE(&p->oxm_id_list, o, entry); free(o); } /* experimenter_data_list_entry_free(&p->experimenter_data_list); */ while ((e = TAILQ_FIRST(&p->experimenter_data_list)) != NULL) { TAILQ_REMOVE(&p->experimenter_data_list, e, entry); free(e); } TAILQ_REMOVE(&f->table_property_list, p, entry); free(p); } TAILQ_REMOVE(&features_list, f, entry); free(f); } TAILQ_INIT(&features_list); TEST_ASSERT_TRUE(LAGOPUS_RESULT_OK == dpmgr_bridge_delete(dpmgr, bridge_name)); dpmgr_free(dpmgr); flowdb = NULL; bridge = NULL; dpmgr = NULL; }
void tearDown(void) { TEST_ASSERT_NOT_NULL(dpmgr); TEST_ASSERT_NOT_NULL(bridge); TEST_ASSERT_TRUE(LAGOPUS_RESULT_OK == dpmgr_bridge_delete(dpmgr, bridge_name)); dpmgr_free(dpmgr); bridge = NULL; dpmgr = NULL; }
static void s_destroy_static_data(void) { channel_mgr_finalize(); if (s_bridge != NULL) { bridge_free(s_bridge); s_bridge = NULL; } if (s_dpmgr != NULL) { port_delete(s_dpmgr->ports, 0); dpmgr_free(s_dpmgr); s_dpmgr = NULL; } if (s_event_manager != NULL) { event_manager_free(s_event_manager); s_event_manager = NULL; } }
void tearDown(void) { TEST_ASSERT_NOT_NULL(dpmgr); TEST_ASSERT_NOT_NULL(bridge); TEST_ASSERT_NOT_NULL(flowdb); TEST_ASSERT_NOT_NULL(ports); TEST_ASSERT_NOT_NULL(group_table); TEST_ASSERT_TRUE(LAGOPUS_RESULT_OK == dpmgr_bridge_delete(dpmgr, bridge_name)); ports_free(ports); group_table_free(group_table); dpmgr_free(dpmgr); ports = NULL; group_table = NULL; flowdb = NULL; bridge = NULL; dpmgr = NULL; }
void test_action_OUTPUT(void) { struct action_list action_list; struct dpmgr *my_dpmgr; struct bridge *bridge; struct port *port; struct action *action; struct ofp_action_output *action_set; struct port nport; struct lagopus_packet pkt; OS_MBUF *m; /* setup bridge and port */ my_dpmgr = dpmgr_alloc(); dpmgr_bridge_add(my_dpmgr, "br0", 0); nport.type = LAGOPUS_PORT_TYPE_NULL; /* for test */ nport.ofp_port.port_no = 1; nport.ifindex = 0; nport.ofp_port.hw_addr[0] = 1; dpmgr_port_add(my_dpmgr, &nport); port = port_lookup(my_dpmgr->ports, 0); TEST_ASSERT_NOT_NULL(port); port->ofp_port.hw_addr[0] = 0xff; nport.ofp_port.port_no = 2; nport.ifindex = 1; dpmgr_port_add(my_dpmgr, &nport); port = port_lookup(my_dpmgr->ports, 1); TEST_ASSERT_NOT_NULL(port); port->ofp_port.hw_addr[0] = 0xff; dpmgr_bridge_port_add(my_dpmgr, "br0", 0, 1); dpmgr_bridge_port_add(my_dpmgr, "br0", 1, 2); TAILQ_INIT(&action_list); action = calloc(1, sizeof(*action) + 64); action_set = (struct ofp_action_output *)&action->ofpat; action_set->type = OFPAT_OUTPUT; lagopus_set_action_function(action); TAILQ_INSERT_TAIL(&action_list, action, entry); memset(&pkt, 0, sizeof(pkt)); m = calloc(1, sizeof(*m)); TEST_ASSERT_NOT_NULL_MESSAGE(m, "calloc error."); m->data = &m->dat[128]; bridge = dpmgr_bridge_lookup(my_dpmgr, "br0"); TEST_ASSERT_NOT_NULL(bridge); lagopus_set_in_port(&pkt, port_lookup(bridge->ports, 1)); TEST_ASSERT_NOT_NULL(pkt.in_port); lagopus_packet_init(&pkt, m); /* output action always decrement reference count. */ m->refcnt = 2; action_set->port = 1; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->refcnt, 1, "OUTPUT refcnt error."); m->refcnt = 2; action_set->port = 2; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->refcnt, 1, "OUTPUT refcnt error."); m->refcnt = 2; action_set->port = OFPP_ALL; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->refcnt, 1, "OUTPUT refcnt error."); m->refcnt = 2; action_set->port = OFPP_NORMAL; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->refcnt, 1, "OUTPUT refcnt error."); m->refcnt = 2; action_set->port = OFPP_IN_PORT; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->refcnt, 1, "OUTPUT refcnt error."); m->refcnt = 2; action_set->port = OFPP_CONTROLLER; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->refcnt, 1, "OUTPUT refcnt error."); m->refcnt = 2; action_set->port = OFPP_FLOOD; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->refcnt, 1, "OUTPUT refcnt error."); m->refcnt = 2; action_set->port = OFPP_LOCAL; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->refcnt, 1, "OUTPUT refcnt error."); m->refcnt = 2; action_set->port = 0; execute_action(&pkt, &action_list); TEST_ASSERT_EQUAL_MESSAGE(m->refcnt, 1, "OUTPUT refcnt error."); free(m); dpmgr_free(my_dpmgr); }