1 /* SPDX-License-Identifier: (BSD-3-Clause OR LGPL-2.1) */ 2 /* 3 * Copyright(c) 2007-2014 Intel Corporation. 4 */ 5 6 #ifndef _RTE_KNI_COMMON_H_ 7 #define _RTE_KNI_COMMON_H_ 8 9 #ifdef __cplusplus 10 extern "C" { 11 #endif 12 13 #ifdef __KERNEL__ 14 #include <linux/if.h> 15 #include <asm/barrier.h> 16 #define RTE_STD_C11 17 #else 18 #include <rte_common.h> 19 #include <rte_config.h> 20 #endif 21 22 /* 23 * KNI name is part of memzone name. Must not exceed IFNAMSIZ. 24 */ 25 #define RTE_KNI_NAMESIZE 16 26 27 #define RTE_CACHE_LINE_MIN_SIZE 64 28 29 /* 30 * Request id. 31 */ 32 enum rte_kni_req_id { 33 RTE_KNI_REQ_UNKNOWN = 0, 34 RTE_KNI_REQ_CHANGE_MTU, 35 RTE_KNI_REQ_CFG_NETWORK_IF, 36 RTE_KNI_REQ_CHANGE_MAC_ADDR, 37 RTE_KNI_REQ_CHANGE_PROMISC, 38 RTE_KNI_REQ_CHANGE_ALLMULTI, 39 RTE_KNI_REQ_MAX, 40 }; 41 42 /* 43 * Structure for KNI request. 44 */ 45 struct rte_kni_request { 46 uint32_t req_id; /**< Request id */ 47 RTE_STD_C11 48 union { 49 uint32_t new_mtu; /**< New MTU */ 50 uint8_t if_up; /**< 1: interface up, 0: interface down */ 51 uint8_t mac_addr[6]; /**< MAC address for interface */ 52 uint8_t promiscusity;/**< 1: promisc mode enable, 0: disable */ 53 uint8_t allmulti; /**< 1: all-multicast mode enable, 0: disable */ 54 }; 55 int32_t async : 1; /**< 1: request is asynchronous */ 56 int32_t result; /**< Result for processing request */ 57 } __attribute__((__packed__)); 58 59 /* 60 * Fifo struct mapped in a shared memory. It describes a circular buffer FIFO 61 * Write and read should wrap around. Fifo is empty when write == read 62 * Writing should never overwrite the read position 63 */ 64 struct rte_kni_fifo { 65 #ifdef RTE_USE_C11_MEM_MODEL 66 unsigned write; /**< Next position to be written*/ 67 unsigned read; /**< Next position to be read */ 68 #else 69 volatile unsigned write; /**< Next position to be written*/ 70 volatile unsigned read; /**< Next position to be read */ 71 #endif 72 unsigned len; /**< Circular buffer length */ 73 unsigned elem_size; /**< Pointer size - for 32/64 bit OS */ 74 void *volatile buffer[]; /**< The buffer contains mbuf pointers */ 75 }; 76 77 /* 78 * The kernel image of the rte_mbuf struct, with only the relevant fields. 79 * Padding is necessary to assure the offsets of these fields 80 */ 81 struct rte_kni_mbuf { 82 void *buf_addr __attribute__((__aligned__(RTE_CACHE_LINE_SIZE))); 83 uint64_t buf_iova; 84 uint16_t data_off; /**< Start address of data in segment buffer. */ 85 char pad1[2]; 86 uint16_t nb_segs; /**< Number of segments. */ 87 char pad4[2]; 88 uint64_t ol_flags; /**< Offload features. */ 89 char pad2[4]; 90 uint32_t pkt_len; /**< Total pkt len: sum of all segment data_len. */ 91 uint16_t data_len; /**< Amount of data in segment buffer. */ 92 char pad3[14]; 93 void *pool; 94 95 /* fields on second cache line */ 96 __attribute__((__aligned__(RTE_CACHE_LINE_MIN_SIZE))) 97 void *next; /**< Physical address of next mbuf in kernel. */ 98 }; 99 100 /* 101 * Struct used to create a KNI device. Passed to the kernel in IOCTL call 102 */ 103 104 struct rte_kni_device_info { 105 char name[RTE_KNI_NAMESIZE]; /**< Network device name for KNI */ 106 107 phys_addr_t tx_phys; 108 phys_addr_t rx_phys; 109 phys_addr_t alloc_phys; 110 phys_addr_t free_phys; 111 112 /* Used by Ethtool */ 113 phys_addr_t req_phys; 114 phys_addr_t resp_phys; 115 phys_addr_t sync_phys; 116 void * sync_va; 117 118 /* mbuf mempool */ 119 void * mbuf_va; 120 phys_addr_t mbuf_phys; 121 122 uint16_t group_id; /**< Group ID */ 123 uint32_t core_id; /**< core ID to bind for kernel thread */ 124 125 __extension__ 126 uint8_t force_bind : 1; /**< Flag for kernel thread binding */ 127 128 /* mbuf size */ 129 unsigned mbuf_size; 130 unsigned int mtu; 131 unsigned int min_mtu; 132 unsigned int max_mtu; 133 uint8_t mac_addr[6]; 134 uint8_t iova_mode; 135 }; 136 137 #define KNI_DEVICE "kni" 138 139 #define RTE_KNI_IOCTL_TEST _IOWR(0, 1, int) 140 #define RTE_KNI_IOCTL_CREATE _IOWR(0, 2, struct rte_kni_device_info) 141 #define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3, struct rte_kni_device_info) 142 143 #ifdef __cplusplus 144 } 145 #endif 146 147 #endif /* _RTE_KNI_COMMON_H_ */ 148