1/* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2019 Intel Corporation 3 */ 4 5#ifndef _IPN3KE_FLOW_H_ 6#define _IPN3KE_FLOW_H_ 7 8/** 9 * Expand the length to DWORD alignment with 'Unused' field. 10 * 11 * FLOW KEY: 12 * | Unused |Ruler id (id) | Key1 Key2 … (data) | 13 * |--------+---------------+--------------------| 14 * | 17bits | 3 bits | Total 108 bits | 15 * MSB ---> LSB 16 * 17 * Note: And the MSb of key data is filled to 0 when it is less 18 * than 108 bit. 19 */ 20#define IPN3KE_FLOW_KEY_UNUSED_BITS 17 21#define IPN3KE_FLOW_KEY_ID_BITS 3 22#define IPN3KE_FLOW_KEY_DATA_BITS 108 23 24#define IPN3KE_FLOW_KEY_TOTAL_BITS \ 25 (IPN3KE_FLOW_KEY_UNUSED_BITS + \ 26 IPN3KE_FLOW_KEY_ID_BITS + \ 27 IPN3KE_FLOW_KEY_DATA_BITS) 28 29#define IPN3KE_FLOW_KEY_ID_OFFSET \ 30 (IPN3KE_FLOW_KEY_UNUSED_BITS) 31 32#define IPN3KE_FLOW_KEY_DATA_OFFSET \ 33 (IPN3KE_FLOW_KEY_ID_OFFSET + IPN3KE_FLOW_KEY_ID_BITS) 34 35/** 36 * Expand the length to DWORD alignment with 'Unused' field. 37 * 38 * FLOW RESULT: 39 * | Unused | enable (acl) | uid | 40 * |---------+--------------+--------------| 41 * | 15 bits | 1 bit | 16 bits | 42 * MSB ---> LSB 43 */ 44 45#define IPN3KE_FLOW_RESULT_UNUSED_BITS 15 46#define IPN3KE_FLOW_RESULT_ACL_BITS 1 47#define IPN3KE_FLOW_RESULT_UID_BITS 16 48 49#define IPN3KE_FLOW_RESULT_TOTAL_BITS \ 50 (IPN3KE_FLOW_RESULT_UNUSED_BITS + \ 51 IPN3KE_FLOW_RESULT_ACL_BITS + \ 52 IPN3KE_FLOW_RESULT_UID_BITS) 53 54#define IPN3KE_FLOW_RESULT_ACL_OFFSET \ 55 (IPN3KE_FLOW_RESULT_UNUSED_BITS) 56 57#define IPN3KE_FLOW_RESULT_UID_OFFSET \ 58 (IPN3KE_FLOW_RESULT_ACL_OFFSET + IPN3KE_FLOW_RESULT_ACL_BITS) 59 60#define IPN3KE_FLOW_RESULT_UID_MAX \ 61 ((1UL << IPN3KE_FLOW_RESULT_UID_BITS) - 1) 62 63#ifndef BITS_PER_BYTE 64#define BITS_PER_BYTE 8 65#endif 66#define BITS_TO_BYTES(bits) \ 67 (((bits) + BITS_PER_BYTE - 1) / BITS_PER_BYTE) 68 69struct ipn3ke_flow_rule { 70 uint8_t key[BITS_TO_BYTES(IPN3KE_FLOW_KEY_TOTAL_BITS)]; 71 uint8_t result[BITS_TO_BYTES(IPN3KE_FLOW_RESULT_TOTAL_BITS)]; 72}; 73 74struct rte_flow { 75 TAILQ_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. */ 76 77 struct ipn3ke_flow_rule rule; 78}; 79 80TAILQ_HEAD(ipn3ke_flow_list, rte_flow); 81 82static inline uint16_t ipn3ke_swap16(uint16_t x) 83{ 84 return ((x & 0xff) << 8) | ((x >> 8) & 0xff); 85} 86 87static inline uint32_t ipn3ke_swap32(uint32_t x) 88{ 89 uint32_t high, low; 90 uint32_t high1, low1; 91 92 high = (x >> 16) & 0xffff; 93 low = x & 0xffff; 94 high1 = ipn3ke_swap16(low); 95 high1 = high1 << 16; 96 low1 = ipn3ke_swap16(high); 97 low1 = low1 & 0xffff; 98 99 return high1 | low1; 100} 101 102extern const struct rte_flow_ops ipn3ke_flow_ops; 103 104int ipn3ke_flow_init(void *dev); 105 106#endif /* _IPN3KE_FLOW_H_ */ 107