static void SetUpTestCase(void) { mac = MacAddress("00:F2:F2:F2:F2:F2"); LOGG(TEST_INFO, FRAMEWORK, "init mac %s\n", mac.to_string().c_str()); LOGG(TEST_INFO, FRAMEWORK, "sai_api_initialize\n"); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_api_initialize(0, (service_method_table_t *)&test_services)); LOGG(TEST_INFO, FRAMEWORK, "sai_api_query SAI_API_SWITCH, SAI_API_PORT, ...\n"); //query API methods of all types ASSERT_EQ(SAI_STATUS_SUCCESS, sai_api_query(SAI_API_SWITCH, (void**)&sai_switch_api)); ASSERT_TRUE(sai_switch_api != NULL); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_api_query(SAI_API_PORT, (void**)&sai_port_api)); ASSERT_TRUE(sai_port_api != NULL); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_api_query(SAI_API_VLAN, (void**)&sai_vlan_api)); ASSERT_TRUE(sai_vlan_api != NULL); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_api_query(SAI_API_VIRTUAL_ROUTER, (void**)&sai_vr_api)); ASSERT_TRUE(sai_vr_api != NULL); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_api_query(SAI_API_ROUTER_INTERFACE, (void**)&sai_rif_api)); ASSERT_TRUE(sai_rif_api != NULL); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_api_query(SAI_API_HOST_INTERFACE, (void**)&sai_hif_api)); ASSERT_TRUE(sai_hif_api != NULL); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_api_query(SAI_API_NEIGHBOR, (void**)&sai_neighbor_api)); ASSERT_TRUE(sai_neighbor_api != NULL); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_api_query(SAI_API_ROUTE, (void**)&sai_route_api)); ASSERT_TRUE(sai_route_api != NULL); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_api_query(SAI_API_NEXT_HOP, (void**)&sai_next_hop_api)); ASSERT_TRUE(sai_next_hop_api != NULL); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_api_query(SAI_API_NEXT_HOP_GROUP, (void**)&sai_next_hop_group_api)); ASSERT_TRUE(sai_next_hop_group_api != NULL); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_api_query(SAI_API_FDB, (void**)&sai_fdb_api)); ASSERT_TRUE(sai_fdb_api != NULL); LOGG(TEST_INFO, FRAMEWORK, "sai_log_set SAI_API_SWITCH, SAI_API_PORT, ...\n"); //set log ASSERT_EQ(SAI_STATUS_SUCCESS, sai_log_set(SAI_API_SWITCH, SAI_LOG_DEBUG)); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_log_set(SAI_API_PORT, SAI_LOG_DEBUG)); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_log_set(SAI_API_VLAN, SAI_LOG_DEBUG)); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_log_set(SAI_API_VIRTUAL_ROUTER, SAI_LOG_DEBUG)); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_log_set(SAI_API_ROUTER_INTERFACE, SAI_LOG_DEBUG)); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_log_set(SAI_API_HOST_INTERFACE, SAI_LOG_DEBUG)); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_log_set(SAI_API_NEIGHBOR, SAI_LOG_DEBUG)); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_log_set(SAI_API_ROUTE, SAI_LOG_DEBUG)); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_log_set(SAI_API_NEXT_HOP, SAI_LOG_DEBUG)); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_log_set(SAI_API_NEXT_HOP_GROUP, SAI_LOG_DEBUG)); LOGG(TEST_INFO, FRAMEWORK, "sai_switch_api->initialize_switch \n"); ASSERT_TRUE(sai_switch_api->initialize_switch); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_switch_api->initialize_switch(0, "0xb850", "", &plat_switch_notification_handlers)); sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_SRC_MAC_ADDRESS; memcpy(attr.value.mac, mac.to_bytes(), 6); ASSERT_TRUE(sai_switch_api->set_switch_attribute != NULL); LOGG(TEST_INFO, FRAMEWORK, "sai_switch_api->set_switch_attribute SAI_SWITCH_ATTR_SRC_MAC_ADDRESS %s\n", mac.to_string().c_str()); ASSERT_EQ(SAI_STATUS_SUCCESS, sai_switch_api->set_switch_attribute(&attr)); LOGG(TEST_INFO, FRAMEWORK, "Create neighbor_mgr, nexthopgrp_mgr and route_mgr\n"); nexthop_mgr = new NextHopMgr(); neighbor_mgr = new NeighborMgr(nexthop_mgr); nexthopgrp_mgr = new NextHopGrpMgr(neighbor_mgr); route_mgr = new RouteMgr(neighbor_mgr, nexthopgrp_mgr); fdb_mgr = new FdbMgr(); LOGG(TEST_INFO, FRAMEWORK, "Set Up L3 Interfaces\n"); ASSERT_EQ(true, basic_router_setup()); }
//L3 Interface Initialization static bool setup_one_l3_interface(sai_vlan_id_t vlanid, int port_count, const sai_object_id_t *port_list, const MacAddress mac, const IpAddress ipaddr, const IpAddress ipmask, sai_object_id_t &rif_id) { LOGG(TEST_INFO, SETL3, "sai_vlan_api->create_vlan, create vlan %hu.\n", vlanid); sai_status_t status = sai_vlan_api->create_vlan(vlanid); if (status != SAI_STATUS_SUCCESS && status != SAI_STATUS_ITEM_ALREADY_EXISTS) { LOGG(TEST_ERR, SETL3, "fail to create vlan %hu. status=0x%x\n", vlanid, -status); return false; } std::vector<sai_vlan_port_t> vlan_port_list; for (int i = 0; i < port_count; ++i) { sai_vlan_port_t vlan_port; vlan_port.port_id = port_list[i]; vlan_port.tagging_mode = SAI_VLAN_PORT_UNTAGGED; vlan_port_list.push_back(vlan_port); } LOGG(TEST_INFO, SETL3, "sai_vlan_api->add_ports_to_vlan, add ports to vlan %d.\n", vlanid); status = sai_vlan_api->add_ports_to_vlan(vlanid, port_count, vlan_port_list.data()); if (status != SAI_STATUS_SUCCESS) { LOGG(TEST_ERR, SETL3, "fail to add ports to vlan %hu. status=0x%x\n", vlanid, -status); return false; } sai_attribute_t attr; attr.id = SAI_PORT_ATTR_PORT_VLAN_ID; attr.value.u16 = vlanid; for (int i = 0; i < port_count; ++i) { LOGG(TEST_INFO, SETL3, "sai_port_api->set_port_attribute SAI_PORT_ATTR_PORT_VLAN_ID %hu to port 0x%lx\n", vlanid, port_list[i]); status = sai_port_api->set_port_attribute(port_list[i], &attr); if (status != SAI_STATUS_SUCCESS) { LOGG(TEST_ERR, SETL3, "fail to set port %lu untagged vlan %hu. status=0x%x\n", port_list[i], vlanid, -status); return false; } } // create router interface std::vector<sai_attribute_t> rif_attrs; sai_attribute_t rif_attr; rif_attr.id = SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID; rif_attr.value.oid = g_vr_id; rif_attrs.push_back(rif_attr); rif_attr.id = SAI_ROUTER_INTERFACE_ATTR_TYPE; rif_attr.value.s32 = SAI_ROUTER_INTERFACE_TYPE_VLAN; rif_attrs.push_back(rif_attr); rif_attr.id = SAI_ROUTER_INTERFACE_ATTR_SRC_MAC_ADDRESS; memcpy(rif_attr.value.mac, mac.to_bytes(), sizeof(sai_mac_t)); rif_attrs.push_back(rif_attr); rif_attr.id = SAI_ROUTER_INTERFACE_ATTR_VLAN_ID; rif_attr.value.u16 = vlanid; rif_attrs.push_back(rif_attr); LOGG(TEST_INFO, SETL3, "sai_rif_api->create_router_interface\n"); status = sai_rif_api->create_router_interface(&rif_id, rif_attrs.size(), rif_attrs.data()); if (status != SAI_STATUS_SUCCESS) { LOGG(TEST_ERR, SETL3, "fail to create router interface. status=0x%x\n", -status); return false; } if (!SAI_OID_TYPE_CHECK(rif_id, SAI_OBJECT_TYPE_ROUTER_INTERFACE)) { LOGG(TEST_ERR, SETL3, "router interface oid generated is not the right type\n"); return false; } LOGG(TEST_DEBUG, SETL3, "router_interface created, rif_id 0x%lx\n", rif_id); // add interface ip to l3 host table LOGG(TEST_INFO, SETL3, "sai_route_api->create_route, SAI_ROUTE_ATTR_PACKET_ACTION, SAI_PACKET_ACTION_TRAP\n"); sai_unicast_route_entry_t unicast_route_entry; unicast_route_entry.vr_id = g_vr_id; unicast_route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4; unicast_route_entry.destination.addr.ip4 = ipaddr.addr(); unicast_route_entry.destination.mask.ip4 = 0xffffffff; sai_attribute_t route_attr; route_attr.id = SAI_ROUTE_ATTR_PACKET_ACTION; route_attr.value.s32 = SAI_PACKET_ACTION_TRAP; status = sai_route_api->create_route(&unicast_route_entry, 1, &route_attr); if (status != SAI_STATUS_SUCCESS) { LOGG(TEST_ERR, SETL3, "fail to add route for l3 interface to cpu. status=0x%x\n", -status); return false; } // by default, drop all the traffic destined to the the ip subnet. // if we learn some of the neighbors, add them explicitly to the l3 host table. LOGG(TEST_INFO, SETL3, "sai_route_api->create_route, SAI_ROUTE_ATTR_PACKET_ACTION, SAI_PACKET_ACTION_DROP\n"); unicast_route_entry.vr_id = g_vr_id; unicast_route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4; unicast_route_entry.destination.addr.ip4 = ipaddr.addr() & ipmask.addr(); unicast_route_entry.destination.mask.ip4 = ipmask.addr(); route_attr.id = SAI_ROUTE_ATTR_PACKET_ACTION; route_attr.value.s32 = SAI_PACKET_ACTION_DROP; status = sai_route_api->create_route(&unicast_route_entry, 1, &route_attr); if (status != SAI_STATUS_SUCCESS) { LOGG(TEST_ERR, SETL3, "fail to add l3 intf subnet to blackhole. status=0x%x", -status); return false; } return true; }