コード例 #1
0
/* Update device bond info */
static void
dpdk_ethdev_bond_info_update(struct vr_dpdk_ethdev *ethdev)
{
    int i, slave_port_id;
    int port_id = ethdev->ethdev_port_id;
    uint16_t mtu = 0;
    struct rte_pci_addr *pci_addr;
    struct ether_addr bond_mac, mac_addr;
    struct ether_addr lacp_mac = { .addr_bytes = {0x01, 0x80, 0xc2, 0, 0, 0x02} };

    if (rte_eth_bond_mode_get(port_id) == -1) {
        ethdev->ethdev_nb_slaves = -1;
    } else {
        ethdev->ethdev_nb_slaves = rte_eth_bond_slaves_get(port_id,
            ethdev->ethdev_slaves, sizeof(ethdev->ethdev_slaves));

        memset(&mac_addr, 0, sizeof(bond_mac));
        rte_eth_macaddr_get(port_id, &bond_mac);
        RTE_LOG(INFO, VROUTER, "    bond eth device %" PRIu8
            " configured MAC " MAC_FORMAT "\n",
            port_id, MAC_VALUE(bond_mac.addr_bytes));
        /* log out and configure bond members */
        for (i = 0; i < ethdev->ethdev_nb_slaves; i++) {
            slave_port_id = ethdev->ethdev_slaves[i];
            if (!rte_eth_devices[port_id].data->mtu) {
                rte_eth_dev_get_mtu(slave_port_id, &mtu);
                rte_eth_devices[port_id].data->mtu = mtu;
            }
            memset(&mac_addr, 0, sizeof(mac_addr));
            rte_eth_macaddr_get(slave_port_id, &mac_addr);
            pci_addr = &rte_eth_devices[slave_port_id].pci_dev->addr;
            RTE_LOG(INFO, VROUTER, "    bond member eth device %" PRIu8
                " PCI " PCI_PRI_FMT " MAC " MAC_FORMAT "\n",
                slave_port_id, pci_addr->domain, pci_addr->bus,
                pci_addr->devid, pci_addr->function,
                MAC_VALUE(mac_addr.addr_bytes));

            /* try to add bond mac and LACP multicast MACs */
            if (rte_eth_dev_mac_addr_add(slave_port_id, &bond_mac, 0) == 0
                && rte_eth_dev_set_mc_addr_list(slave_port_id, &lacp_mac, 1) == 0) {
                /* disable the promisc mode enabled by default */
                rte_eth_promiscuous_disable(ethdev->ethdev_port_id);
                RTE_LOG(INFO, VROUTER, "    bond member eth device %" PRIu8
                    " promisc mode disabled\n", slave_port_id);
            } else {
                RTE_LOG(INFO, VROUTER, "    bond member eth device %" PRIu8
                    ": unable to add MAC addresses\n", slave_port_id);
            }
        }
        /* In LACP mode all the bond members are in the promisc mode
         * by default (see bond_mode_8023ad_activate_slave()
         * But we need also to put the bond interface in promisc to get
         * the broadcasts. Seems to be a bug in bond_ethdev_rx_burst_8023ad()?
         */
        rte_eth_promiscuous_enable(port_id);
    }
}
コード例 #2
0
ファイル: vif.c プロジェクト: rombie/contrail-vrouter
void
vr_interface_req_process(void *s)
{
    char name[50];
    vr_interface_req *req = (vr_interface_req *)s;

    if (add_set)
        vr_ifindex = req->vifr_idx;

    if (!get_set && !list_set)
        return;

    printf("vif%d/%d\tOS: %s", req->vifr_rid, req->vifr_idx,
           req->vifr_os_idx ? if_indextoname(req->vifr_os_idx, name): "NULL");
    if (req->vifr_speed >= 0) {
        printf(" (Speed %d,", req->vifr_speed);
        if (req->vifr_duplex >= 0)
            printf(" Duplex %d", req->vifr_duplex);
        printf(")");
    }
    printf("\n");

    printf("\tType:%s HWaddr:"MAC_FORMAT" IPaddr:%x\n",
           vr_get_if_type_string(req->vifr_type),
           MAC_VALUE((uint8_t *)req->vifr_mac), req->vifr_ip);
    printf("\tVrf:%d Flags:%s MTU:%d Ref:%d\n", req->vifr_vrf,
           req->vifr_flags ? vr_if_flags(req->vifr_flags) : "NULL" ,
           req->vifr_mtu, req->vifr_ref_cnt);
    printf("\tRX packets:%" PRId64 "  bytes:%" PRId64 " errors:%" PRId64 "\n",
           req->vifr_ipackets,
           req->vifr_ibytes, req->vifr_ierrors);
    printf("\tTX packets:%" PRId64 "  bytes:%" PRId64 " errors:%" PRId64 "\n",
           req->vifr_opackets,
           req->vifr_obytes, req->vifr_oerrors);
    printf("\n");

    if (list_set)
        dump_marker = req->vifr_idx;

    if (get_set && req->vifr_flags & VIF_FLAG_SERVICE_IF) {
        vr_vrf_assign_dump = true;
        printf("VRF table(vlan:vrf):\n");
        vr_ifindex = req->vifr_idx;
    }

    return;
}
コード例 #3
0
ファイル: vif.c プロジェクト: Juniper/contrail-dev-vrouter
void
vr_interface_req_process(void *s)
{
    char name[50];
    vr_interface_req *req = (vr_interface_req *)s;
    unsigned int printed = 0;

    if (add_set)
        vr_ifindex = req->vifr_idx;

    if (!get_set && !list_set)
        return;

    printed = printf("vif%d/%d", req->vifr_rid, req->vifr_idx);
    for (; printed < 12; printed++)
        printf(" ");
    printf("OS: %s", req->vifr_os_idx ?
        if_indextoname(req->vifr_os_idx, name): "NULL");

    if (req->vifr_type == VIF_TYPE_PHYSICAL) {
        if (req->vifr_speed >= 0) {
            printf(" (Speed %d,", req->vifr_speed);
            if (req->vifr_duplex >= 0)
                printf(" Duplex %d", req->vifr_duplex);
            printf(")");
        }
    } else if (req->vifr_type == VIF_TYPE_VIRTUAL_VLAN) {
        printf(" Vlan(o/i)(,S): %d/%d", req->vifr_ovlan_id, req->vifr_vlan_id);
        if (req->vifr_src_mac_size && req->vifr_src_mac)
            printf(", "MAC_FORMAT, MAC_VALUE((uint8_t *)req->vifr_src_mac));
        printf(" Bridge Index: %d", req->vifr_bridge_idx);
    }

    if (req->vifr_parent_vif_idx >= 0)
        printf(" Parent:vif0/%d", req->vifr_parent_vif_idx);

    printf("\n");

    vr_interface_print_header();
    printf("Type:%s HWaddr:"MAC_FORMAT" IPaddr:%x\n",
            vr_get_if_type_string(req->vifr_type),
            MAC_VALUE((uint8_t *)req->vifr_mac), req->vifr_ip);
    vr_interface_print_header();
    printf("Vrf:%d Flags:%s MTU:%d Ref:%d\n", req->vifr_vrf,
            req->vifr_flags ? vr_if_flags(req->vifr_flags) : "NULL" ,
            req->vifr_mtu, req->vifr_ref_cnt);
    vr_interface_print_header();
    printf("RX packets:%" PRId64 "  bytes:%" PRId64 " errors:%" PRId64 "\n",
            req->vifr_ipackets,
            req->vifr_ibytes, req->vifr_ierrors);
    vr_interface_print_header();
    printf("TX packets:%" PRId64 "  bytes:%" PRId64 " errors:%" PRId64 "\n",
            req->vifr_opackets,
            req->vifr_obytes, req->vifr_oerrors);
    printf("\n");

    if (list_set)
        dump_marker = req->vifr_idx;

    if (get_set && req->vifr_flags & VIF_FLAG_SERVICE_IF) {
        vr_vrf_assign_dump = true;
        printf("VRF table(vlan:vrf):\n");
        vr_ifindex = req->vifr_idx;
    }

    return;
}