int VIFHYPER_CREATE(const char *devstr, struct virtif_sc *vif_sc, uint8_t *enaddr, struct virtif_user **viup) { struct rte_eth_conf portconf; struct rte_eth_link link; struct ether_addr ea; struct virtif_user *viu; int rv = EINVAL; /* XXX: not very accurate ;) */ viu = malloc(sizeof(*viu)); memset(viu, 0, sizeof(*viu)); viu->viu_devstr = strdup(devstr); viu->viu_virtifsc = vif_sc; /* this is here only for simplicity */ if ((rv = globalinit(viu)) != 0) goto out; memset(&portconf, 0, sizeof(portconf)); if ((rv = rte_eth_dev_configure(IF_PORTID, NQUEUE, NQUEUE, &portconf)) < 0) OUT("configure device"); if ((rv = rte_eth_rx_queue_setup(IF_PORTID, 0, NDESCRX, 0, &rxconf, mbpool_rx)) <0) OUT("rx queue setup"); if ((rv = rte_eth_tx_queue_setup(IF_PORTID, 0, NDESCTX, 0, &txconf)) < 0) OUT("tx queue setup"); if ((rv = rte_eth_dev_start(IF_PORTID)) < 0) OUT("device start"); rte_eth_link_get(IF_PORTID, &link); if (!link.link_status) { ifwarn(viu, "link down"); } rte_eth_promiscuous_enable(IF_PORTID); rte_eth_macaddr_get(IF_PORTID, &ea); memcpy(enaddr, ea.addr_bytes, ETHER_ADDR_LEN); rv = pthread_create(&viu->viu_rcvpt, NULL, receiver, viu); out: /* XXX: well this isn't much of an unrolling ... */ if (rv != 0) free(viu); else *viup = viu; return rumpuser_component_errtrans(-rv); }
int VIFHYPER_CREATE(const char *devstr, struct virtif_sc *vif_sc, uint8_t *enaddr, struct virtif_user **viup) { struct rte_eth_conf portconf; struct rte_eth_link link; struct ether_addr ea; struct virtif_user *viu; unsigned long tmp; char *ep; int rv = EINVAL; /* XXX: not very accurate ;) */ viu = malloc(sizeof(*viu)); memset(viu, 0, sizeof(*viu)); viu->viu_devstr = strdup(devstr); viu->viu_virtifsc = vif_sc; tmp = strtoul(devstr, &ep, 10); if (*ep != '\0') OUT("invalid dev string"); if (tmp > 255) OUT("DPDK port id out of range"); viu->viu_port_id = tmp; if (viu->viu_port_id >= rte_eth_dev_count()) { rv = -ENODEV; OUT("DPDK port not initialized"); } memset(&portconf, 0, sizeof(portconf)); if ((rv = rte_eth_dev_configure(viu->viu_port_id, NQUEUE, NQUEUE, &portconf)) < 0) OUT("configure device"); if ((rv = rte_eth_rx_queue_setup(viu->viu_port_id, 0, NDESCRX, 0, &rxconf, mbpool_rx)) <0) OUT("rx queue setup"); if ((rv = rte_eth_tx_queue_setup(viu->viu_port_id, 0, NDESCTX, 0, &txconf)) < 0) OUT("tx queue setup"); if ((rv = rte_eth_dev_start(viu->viu_port_id)) < 0) OUT("device start"); rte_eth_link_get(viu->viu_port_id, &link); if (!link.link_status) { ifwarn(viu, "link down"); } rte_eth_promiscuous_enable(viu->viu_port_id); rte_eth_macaddr_get(viu->viu_port_id, &ea); memcpy(enaddr, ea.addr_bytes, ETHER_ADDR_LEN); rv = pthread_create(&viu->viu_rcvpt, NULL, receiver, viu); out: /* XXX: well this isn't much of an unrolling ... */ if (rv != 0) free(viu); else *viup = viu; return rumpuser_component_errtrans(-rv); }