/* 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); } }
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; }
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; }