X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fpcap%2Frte_eth_pcap.c;h=7655b3a7a5faa37b516055027be0e67bc08b5fba;hb=6d13ea8e8e49ab957deae2bba5ecf4a4bfe747d1;hp=c37cfbad551272d508fbd26bd56940b045571b85;hpb=0ecfb6c04d548d3f873a6f3116639aa3587b9b3a;p=dpdk.git diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c index c37cfbad55..7655b3a7a5 100644 --- a/drivers/net/pcap/rte_eth_pcap.c +++ b/drivers/net/pcap/rte_eth_pcap.c @@ -11,7 +11,7 @@ #include #include -#if defined(RTE_EXEC_ENV_BSDAPP) +#if defined(RTE_EXEC_ENV_FREEBSD) #include #include #endif @@ -77,7 +77,8 @@ struct pcap_tx_queue { struct pmd_internals { struct pcap_rx_queue rx_queue[RTE_PMD_PCAP_MAX_QUEUES]; struct pcap_tx_queue tx_queue[RTE_PMD_PCAP_MAX_QUEUES]; - struct ether_addr eth_addr; + char devargs[ETH_PCAP_ARG_MAXLEN]; + struct rte_ether_addr eth_addr; int if_index; int single_iface; int phy_mac; @@ -952,7 +953,7 @@ pmd_init_internals(struct rte_vdev_device *vdev, * derived from: 'locally administered':'p':'c':'a':'p':'iface_idx' * where the middle 4 characters are converted to hex. */ - (*internals)->eth_addr = (struct ether_addr) { + (*internals)->eth_addr = (struct rte_ether_addr) { .addr_bytes = { 0x02, 0x70, 0x63, 0x61, 0x70, iface_idx++ } }; (*internals)->phy_mac = 0; @@ -968,6 +969,9 @@ pmd_init_internals(struct rte_vdev_device *vdev, */ (*eth_dev)->dev_ops = &ops; + strlcpy((*internals)->devargs, rte_vdev_device_args(vdev), + ETH_PCAP_ARG_MAXLEN); + return 0; } @@ -975,7 +979,7 @@ static int eth_pcap_update_mac(const char *if_name, struct rte_eth_dev *eth_dev, const unsigned int numa_node) { -#if defined(RTE_EXEC_ENV_LINUXAPP) +#if defined(RTE_EXEC_ENV_LINUX) void *mac_addrs; struct ifreq ifr; int if_fd = socket(AF_INET, SOCK_DGRAM, 0); @@ -1004,7 +1008,7 @@ eth_pcap_update_mac(const char *if_name, struct rte_eth_dev *eth_dev, return 0; -#elif defined(RTE_EXEC_ENV_BSDAPP) +#elif defined(RTE_EXEC_ENV_FREEBSD) void *mac_addrs; struct if_msghdr *ifm; struct sockaddr_dl *sdl; @@ -1080,8 +1084,8 @@ eth_from_pcaps_common(struct rte_vdev_device *vdev, struct devargs_queue *queue = &rx_queues->queue[i]; pp->rx_pcap[i] = queue->pcap; - snprintf(rx->name, sizeof(rx->name), "%s", queue->name); - snprintf(rx->type, sizeof(rx->type), "%s", queue->type); + strlcpy(rx->name, queue->name, sizeof(rx->name)); + strlcpy(rx->type, queue->type, sizeof(rx->type)); } for (i = 0; i < nb_tx_queues; i++) { @@ -1090,8 +1094,8 @@ eth_from_pcaps_common(struct rte_vdev_device *vdev, pp->tx_dumper[i] = queue->dumper; pp->tx_pcap[i] = queue->pcap; - snprintf(tx->name, sizeof(tx->name), "%s", queue->name); - snprintf(tx->type, sizeof(tx->type), "%s", queue->type); + strlcpy(tx->name, queue->name, sizeof(tx->name)); + strlcpy(tx->type, queue->type, sizeof(tx->type)); } return 0; @@ -1147,7 +1151,8 @@ pmd_pcap_probe(struct rte_vdev_device *dev) struct rte_kvargs *kvlist; struct pmd_devargs pcaps = {0}; struct pmd_devargs dumpers = {0}; - struct rte_eth_dev *eth_dev; + struct rte_eth_dev *eth_dev = NULL; + struct pmd_internals *internal; int single_iface = 0; int ret; @@ -1164,16 +1169,18 @@ pmd_pcap_probe(struct rte_vdev_device *dev) PMD_LOG(ERR, "Failed to probe %s", name); return -1; } - /* TODO: request info from primary to set up Rx and Tx */ - eth_dev->dev_ops = &ops; - eth_dev->device = &dev->device; - rte_eth_dev_probing_finish(eth_dev); - return 0; - } - kvlist = rte_kvargs_parse(rte_vdev_device_args(dev), valid_arguments); - if (kvlist == NULL) - return -1; + internal = eth_dev->data->dev_private; + + kvlist = rte_kvargs_parse(internal->devargs, valid_arguments); + if (kvlist == NULL) + return -1; + } else { + kvlist = rte_kvargs_parse(rte_vdev_device_args(dev), + valid_arguments); + if (kvlist == NULL) + return -1; + } /* * If iface argument is passed we open the NICs and use them for @@ -1238,6 +1245,46 @@ pmd_pcap_probe(struct rte_vdev_device *dev) goto free_kvlist; create_eth: + if (rte_eal_process_type() == RTE_PROC_SECONDARY) { + struct pmd_process_private *pp; + unsigned int i; + + internal = eth_dev->data->dev_private; + pp = (struct pmd_process_private *) + rte_zmalloc(NULL, + sizeof(struct pmd_process_private), + RTE_CACHE_LINE_SIZE); + + if (pp == NULL) { + PMD_LOG(ERR, + "Failed to allocate memory for process private"); + ret = -1; + goto free_kvlist; + } + + eth_dev->dev_ops = &ops; + eth_dev->device = &dev->device; + + /* setup process private */ + for (i = 0; i < pcaps.num_of_queue; i++) + pp->rx_pcap[i] = pcaps.queue[i].pcap; + + for (i = 0; i < dumpers.num_of_queue; i++) { + pp->tx_dumper[i] = dumpers.queue[i].dumper; + pp->tx_pcap[i] = dumpers.queue[i].pcap; + } + + eth_dev->process_private = pp; + eth_dev->rx_pkt_burst = eth_pcap_rx; + if (is_tx_pcap) + eth_dev->tx_pkt_burst = eth_pcap_tx_dumper; + else + eth_dev->tx_pkt_burst = eth_pcap_tx; + + rte_eth_dev_probing_finish(eth_dev); + goto free_kvlist; + } + ret = eth_from_pcaps(dev, &pcaps, pcaps.num_of_queue, &dumpers, dumpers.num_of_queue, single_iface, is_tx_pcap);