1acfe2bd4SOlivier Matz /* SPDX-License-Identifier: BSD-3-Clause 2cf564366SPascal Mazon * Copyright 2017 6WIND S.A. 35feecc57SShahaf Shuler * Copyright 2017 Mellanox Technologies, Ltd 4cf564366SPascal Mazon */ 5cf564366SPascal Mazon 6cf564366SPascal Mazon #ifndef _RTE_ETH_TAP_H_ 7cf564366SPascal Mazon #define _RTE_ETH_TAP_H_ 8cf564366SPascal Mazon 9268483dcSPascal Mazon #include <sys/queue.h> 100781f576SPascal Mazon #include <sys/uio.h> 11cf564366SPascal Mazon #include <inttypes.h> 124810d3afSThomas Monjalon #include <net/if.h> 13cf564366SPascal Mazon 140781f576SPascal Mazon #include <linux/if_tun.h> 150781f576SPascal Mazon 16df96fd0dSBruce Richardson #include <ethdev_driver.h> 17cf564366SPascal Mazon #include <rte_ether.h> 18050316a8SOphir Munk #include <rte_gso.h> 197c391c6bSStephen Hemminger 201b3b7caeSStephen Hemminger #include "tap_log.h" 21cf564366SPascal Mazon 22947d949dSPascal Mazon #ifdef IFF_MULTI_QUEUE 23fb847dcfSOphir Munk #define RTE_PMD_TAP_MAX_QUEUES TAP_MAX_QUEUES 24947d949dSPascal Mazon #else 25947d949dSPascal Mazon #define RTE_PMD_TAP_MAX_QUEUES 1 26947d949dSPascal Mazon #endif 27050316a8SOphir Munk #define MAX_GSO_MBUFS 64 28cf564366SPascal Mazon 29d1883bf1SVipin Varghese enum rte_tuntap_type { 30d1883bf1SVipin Varghese ETH_TUNTAP_TYPE_UNKNOWN, 31d1883bf1SVipin Varghese ETH_TUNTAP_TYPE_TUN, 32d1883bf1SVipin Varghese ETH_TUNTAP_TYPE_TAP, 33d1883bf1SVipin Varghese ETH_TUNTAP_TYPE_MAX, 34d1883bf1SVipin Varghese }; 35d1883bf1SVipin Varghese 36cf564366SPascal Mazon struct pkt_stats { 37cf564366SPascal Mazon uint64_t opackets; /* Number of output packets */ 38cf564366SPascal Mazon uint64_t ipackets; /* Number of input packets */ 39cf564366SPascal Mazon uint64_t obytes; /* Number of bytes on output */ 40cf564366SPascal Mazon uint64_t ibytes; /* Number of bytes on input */ 41cf564366SPascal Mazon uint64_t errs; /* Number of TX error packets */ 420781f576SPascal Mazon uint64_t ierrors; /* Number of RX error packets */ 430781f576SPascal Mazon uint64_t rx_nombuf; /* Nb of RX mbuf alloc failures */ 44cf564366SPascal Mazon }; 45cf564366SPascal Mazon 46cf564366SPascal Mazon struct rx_queue { 47cf564366SPascal Mazon struct rte_mempool *mp; /* Mempool for RX packets */ 48cf564366SPascal Mazon uint32_t trigger_seen; /* Last seen Rx trigger value */ 49cf564366SPascal Mazon uint16_t in_port; /* Port ID */ 5048b9dcd6SRaslan Darawsheh uint16_t queue_id; /* queue ID*/ 51cf564366SPascal Mazon struct pkt_stats stats; /* Stats for this RX queue */ 520781f576SPascal Mazon uint16_t nb_rx_desc; /* max number of mbufs available */ 530781f576SPascal Mazon struct rte_eth_rxmode *rxmode; /* RX features */ 540781f576SPascal Mazon struct rte_mbuf *pool; /* mbufs pool for this queue */ 550781f576SPascal Mazon struct iovec (*iovecs)[]; /* descriptors for this queue */ 560781f576SPascal Mazon struct tun_pi pi; /* packet info for iovecs */ 57cf564366SPascal Mazon }; 58cf564366SPascal Mazon 59cf564366SPascal Mazon struct tx_queue { 60d1883bf1SVipin Varghese int type; /* Type field - TUN|TAP */ 615025409cSPascal Mazon uint16_t *mtu; /* Pointer to MTU from dev_data */ 62818fe14aSMoti Haimovsky uint16_t csum:1; /* Enable checksum offloading */ 63cf564366SPascal Mazon struct pkt_stats stats; /* Stats for this TX queue */ 64050316a8SOphir Munk struct rte_gso_ctx gso_ctx; /* GSO context */ 6548b9dcd6SRaslan Darawsheh uint16_t out_port; /* Port ID */ 6648b9dcd6SRaslan Darawsheh uint16_t queue_id; /* queue ID*/ 67cf564366SPascal Mazon }; 68cf564366SPascal Mazon 69cf564366SPascal Mazon struct pmd_internals { 70f46900d0SOphir Munk struct rte_eth_dev *dev; /* Ethernet device. */ 712bc06869SPascal Mazon char remote_iface[RTE_ETH_NAME_MAX_LEN]; /* Remote netdevice name */ 72cf564366SPascal Mazon char name[RTE_ETH_NAME_MAX_LEN]; /* Internal Tap device name */ 73d1883bf1SVipin Varghese int type; /* Type field - TUN|TAP */ 747c391c6bSStephen Hemminger int persist; /* 1 if keep link up, else 0 */ 756d13ea8eSOlivier Matz struct rte_ether_addr eth_addr; /* Mac address of the device port */ 764810d3afSThomas Monjalon struct ifreq remote_initial_flags;/* Remote netdevice flags on init */ 772bc06869SPascal Mazon int remote_if_index; /* remote netdevice IF_INDEX */ 78cf564366SPascal Mazon int if_index; /* IF_INDEX for the port */ 79cf564366SPascal Mazon int ioctl_sock; /* socket for ioctl calls */ 807c391c6bSStephen Hemminger 817c391c6bSStephen Hemminger #ifdef HAVE_TCA_FLOWER 82de96fe68SPascal Mazon int nlsk_fd; /* Netlink socket fd */ 83f503d269SPascal Mazon int flow_isolate; /* 1 if flow isolation is enabled */ 84*2bb2f755SStephen Hemminger 85*2bb2f755SStephen Hemminger struct tap_rss *rss; /* BPF program */ 86801fee5cSStephen Hemminger 87268483dcSPascal Mazon LIST_HEAD(tap_flows, rte_flow) flows; /* rte_flow rules */ 882bc06869SPascal Mazon /* implicit rte_flow rules set when a remote device is active */ 892bc06869SPascal Mazon LIST_HEAD(tap_implicit_flows, rte_flow) implicit_flows; 907c391c6bSStephen Hemminger #endif 917c391c6bSStephen Hemminger 92cf564366SPascal Mazon struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */ 93cf564366SPascal Mazon struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */ 94d61138d4SHarman Kalra struct rte_intr_handle *intr_handle; /* LSC interrupt handle. */ 953101191cSOphir Munk int ka_fd; /* keep-alive file descriptor */ 9605a8e4a3SYunjian Wang struct rte_mempool *gso_ctx_mp; /* Mempool for GSO packets */ 97cf564366SPascal Mazon }; 98cf564366SPascal Mazon 99ed8132e7SRaslan Darawsheh struct pmd_process_private { 10072ab1dc1SStephen Hemminger int fds[RTE_PMD_TAP_MAX_QUEUES]; 101ed8132e7SRaslan Darawsheh }; 102ed8132e7SRaslan Darawsheh 1034870a8cdSMoti Haimovsky /* tap_intr.c */ 1044870a8cdSMoti Haimovsky 1054870a8cdSMoti Haimovsky int tap_rx_intr_vec_set(struct rte_eth_dev *dev, int set); 1064870a8cdSMoti Haimovsky 107cf564366SPascal Mazon #endif /* _RTE_ETH_TAP_H_ */ 108