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