Example #1
0
    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());
    }
Example #2
0
//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;
}