X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Ftep_termination%2Fvxlan_setup.c;h=1ad4ca3cd27625399161a972f3d1c5449d0af9f4;hb=842ee032e41e678568ffbce29172b346dc09c82b;hp=a1cd218c0349230d5d1762729525f617c97cc240;hpb=2bb43bd4350a6f5060add5436b1f44e08b936508;p=dpdk.git diff --git a/examples/tep_termination/vxlan_setup.c b/examples/tep_termination/vxlan_setup.c index a1cd218c03..1ad4ca3cd2 100644 --- a/examples/tep_termination/vxlan_setup.c +++ b/examples/tep_termination/vxlan_setup.c @@ -49,7 +49,7 @@ #include #include "main.h" -#include "rte_virtio_net.h" +#include "rte_vhost.h" #include "vxlan.h" #include "vxlan_setup.h" @@ -102,7 +102,7 @@ static const struct rte_eth_conf port_conf = { .hw_ip_checksum = 0, /**< IP checksum offload disabled */ .hw_vlan_filter = 0, /**< VLAN filtering disabled */ .jumbo_frame = 0, /**< Jumbo Frame Support disabled */ - .hw_strip_crc = 0, /**< CRC stripped by hardware */ + .hw_strip_crc = 1, /**< CRC stripped by hardware */ }, .txmode = { .mq_mode = ETH_MQ_TX_NONE, @@ -129,14 +129,14 @@ const uint16_t tenant_id_conf[] = { * coming from the mbuf_pool passed as parameter */ int -vxlan_port_init(uint8_t port, struct rte_mempool *mbuf_pool) +vxlan_port_init(uint16_t port, struct rte_mempool *mbuf_pool) { int retval; uint16_t q; struct rte_eth_dev_info dev_info; uint16_t rx_rings, tx_rings = (uint16_t)rte_lcore_count(); - const uint16_t rx_ring_size = RTE_TEST_RX_DESC_DEFAULT; - const uint16_t tx_ring_size = RTE_TEST_TX_DESC_DEFAULT; + uint16_t rx_ring_size = RTE_TEST_RX_DESC_DEFAULT; + uint16_t tx_ring_size = RTE_TEST_TX_DESC_DEFAULT; struct rte_eth_udp_tunnel tunnel_udp; struct rte_eth_rxconf *rxconf; struct rte_eth_txconf *txconf; @@ -166,6 +166,11 @@ vxlan_port_init(uint8_t port, struct rte_mempool *mbuf_pool) if (retval != 0) return retval; + retval = rte_eth_dev_adjust_nb_rx_tx_desc(port, &rx_ring_size, + &tx_ring_size); + if (retval != 0) + return retval; + /* Setup the queues. */ for (q = 0; q < rx_rings; q++) { retval = rte_eth_rx_queue_setup(port, q, rx_ring_size, @@ -191,13 +196,13 @@ vxlan_port_init(uint8_t port, struct rte_mempool *mbuf_pool) /* Configure UDP port for UDP tunneling */ tunnel_udp.udp_port = udp_port; tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN; - retval = rte_eth_dev_udp_tunnel_add(port, &tunnel_udp); + retval = rte_eth_dev_udp_tunnel_port_add(port, &tunnel_udp); if (retval < 0) return retval; rte_eth_macaddr_get(port, &ports_eth_addr[port]); RTE_LOG(INFO, PORT, "Port %u MAC: %02"PRIx8" %02"PRIx8" %02"PRIx8 " %02"PRIx8" %02"PRIx8" %02"PRIx8"\n", - (unsigned)port, + port, ports_eth_addr[port].addr_bytes[0], ports_eth_addr[port].addr_bytes[1], ports_eth_addr[port].addr_bytes[2], @@ -218,13 +223,20 @@ vxlan_port_init(uint8_t port, struct rte_mempool *mbuf_pool) static int vxlan_rx_process(struct rte_mbuf *pkt) { - return decapsulation(pkt); + int ret = 0; + + if (rx_decap) + ret = decapsulation(pkt); + + return ret; } static void vxlan_tx_process(uint8_t queue_id, struct rte_mbuf *pkt) { - encapsulation(pkt, queue_id); + if (tx_encap) + encapsulation(pkt, queue_id); + return; } @@ -237,17 +249,16 @@ vxlan_link(struct vhost_dev *vdev, struct rte_mbuf *m) { int i, ret; struct ether_hdr *pkt_hdr; - struct virtio_net *dev = vdev->dev; - uint64_t portid = dev->device_fh; + uint64_t portid = vdev->vid; struct ipv4_hdr *ip; struct rte_eth_tunnel_filter_conf tunnel_filter_conf; - if (unlikely(portid > VXLAN_N_PORTS)) { + if (unlikely(portid >= VXLAN_N_PORTS)) { RTE_LOG(INFO, VHOST_DATA, - "(%"PRIu64") WARNING: Not configuring device," + "(%d) WARNING: Not configuring device," "as already have %d ports for VXLAN.", - dev->device_fh, VXLAN_N_PORTS); + vdev->vid, VXLAN_N_PORTS); return -1; } @@ -255,9 +266,9 @@ vxlan_link(struct vhost_dev *vdev, struct rte_mbuf *m) pkt_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *); if (is_same_ether_addr(&(pkt_hdr->s_addr), &vdev->mac_address)) { RTE_LOG(INFO, VHOST_DATA, - "(%"PRIu64") WARNING: This device is using an existing" + "(%d) WARNING: This device is using an existing" " MAC address and has not been registered.\n", - dev->device_fh); + vdev->vid); return -1; } @@ -271,11 +282,11 @@ vxlan_link(struct vhost_dev *vdev, struct rte_mbuf *m) memset(&tunnel_filter_conf, 0, sizeof(struct rte_eth_tunnel_filter_conf)); - tunnel_filter_conf.outer_mac = &ports_eth_addr[0]; + ether_addr_copy(&ports_eth_addr[0], &tunnel_filter_conf.outer_mac); tunnel_filter_conf.filter_type = tep_filter_type[filter_idx]; /* inner MAC */ - tunnel_filter_conf.inner_mac = &vdev->mac_address; + ether_addr_copy(&vdev->mac_address, &tunnel_filter_conf.inner_mac); tunnel_filter_conf.queue_id = vdev->rx_q; tunnel_filter_conf.tenant_id = tenant_id_conf[vdev->rx_q]; @@ -359,8 +370,8 @@ vxlan_unlink(struct vhost_dev *vdev) memset(&tunnel_filter_conf, 0, sizeof(struct rte_eth_tunnel_filter_conf)); - tunnel_filter_conf.outer_mac = &ports_eth_addr[0]; - tunnel_filter_conf.inner_mac = &vdev->mac_address; + ether_addr_copy(&ports_eth_addr[0], &tunnel_filter_conf.outer_mac); + ether_addr_copy(&vdev->mac_address, &tunnel_filter_conf.inner_mac); tunnel_filter_conf.tenant_id = tenant_id_conf[vdev->rx_q]; tunnel_filter_conf.filter_type = tep_filter_type[filter_idx]; @@ -403,7 +414,7 @@ vxlan_unlink(struct vhost_dev *vdev) /* Transmit packets after encapsulating */ int -vxlan_tx_pkts(uint8_t port_id, uint16_t queue_id, +vxlan_tx_pkts(uint16_t port_id, uint16_t queue_id, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) { int ret = 0; uint16_t i; @@ -418,8 +429,7 @@ vxlan_tx_pkts(uint8_t port_id, uint16_t queue_id, /* Check for decapsulation and pass packets directly to VIRTIO device */ int -vxlan_rx_pkts(struct virtio_net *dev, struct rte_mbuf **pkts_burst, - uint32_t rx_count) +vxlan_rx_pkts(int vid, struct rte_mbuf **pkts_burst, uint32_t rx_count) { uint32_t i = 0; uint32_t count = 0; @@ -427,6 +437,16 @@ vxlan_rx_pkts(struct virtio_net *dev, struct rte_mbuf **pkts_burst, struct rte_mbuf *pkts_valid[rx_count]; for (i = 0; i < rx_count; i++) { + if (enable_stats) { + rte_atomic64_add( + &dev_statistics[vid].rx_bad_ip_csum, + (pkts_burst[i]->ol_flags & PKT_RX_IP_CKSUM_BAD) + != 0); + rte_atomic64_add( + &dev_statistics[vid].rx_bad_ip_csum, + (pkts_burst[i]->ol_flags & PKT_RX_L4_CKSUM_BAD) + != 0); + } ret = vxlan_rx_process(pkts_burst[i]); if (unlikely(ret < 0)) continue; @@ -435,6 +455,6 @@ vxlan_rx_pkts(struct virtio_net *dev, struct rte_mbuf **pkts_burst, count++; } - ret = rte_vhost_enqueue_burst(dev, VIRTIO_RXQ, pkts_valid, count); + ret = rte_vhost_enqueue_burst(vid, VIRTIO_RXQ, pkts_valid, count); return ret; }