| /* |
| * Copyright (c) 2019 The Linux Foundation. All rights reserved. |
| * |
| * Permission to use, copy, modify, and/or distribute this software for |
| * any purpose with or without fee is hereby granted, provided that the |
| * above copyright notice and this permission notice appear in all |
| * copies. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL |
| * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE |
| * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL |
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR |
| * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
| * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
| * PERFORMANCE OF THIS SOFTWARE. |
| */ |
| #ifndef __HAL_FLOW_H |
| #define __HAL_FLOW_H |
| |
| #define HAL_SET_FLD_SM(block, field, value) \ |
| (((value) << (block ## _ ## field ## _LSB)) & \ |
| (block ## _ ## field ## _MASK)) |
| |
| #define HAL_SET_FLD_MS(block, field, value) \ |
| (((value) & (block ## _ ## field ## _MASK)) >> \ |
| (block ## _ ## field ## _LSB)) |
| |
| #define HAL_CLR_FLD(desc, block, field) \ |
| do { \ |
| uint32_t val; \ |
| typeof(desc) desc_ = desc; \ |
| val = *((uint32_t *)((uint8_t *)(desc_) + \ |
| HAL_OFFSET(block, field))); \ |
| val &= ~(block ## _ ## field ## _MASK); \ |
| HAL_SET_FLD(desc_, block, field) = val; \ |
| } while (0) |
| |
| #define HAL_GET_FLD(desc, block, field) \ |
| ((*((uint32_t *)((uint8_t *)(desc) + HAL_OFFSET(block, field))) & \ |
| (block ## _ ## field ## _MASK)) >> (block ## _ ## field ## _LSB)) |
| |
| /** |
| * struct hal_flow_tuple_info - Hal Flow 5-tuple |
| * @dest_ip_127_96: Destination IP address bits 96-127 |
| * @dest_ip_95_64: Destination IP address bits 64-95 |
| * @dest_ip_63_32: Destination IP address bits 32-63 |
| * @dest_ip_31_0: Destination IP address bits 0-31 |
| * @src_ip_127_96: Source IP address bits 96-127 |
| * @src_ip_95_64: Source IP address bits 64-95 |
| * @src_ip_63_32: Source IP address bits 32-63 |
| * @src_ip_31_0: Source IP address bits 0-31 |
| * @dest_port: Destination Port |
| * @src_port: Source Port |
| * @l4_protocol: Layer-4 protocol type (TCP/UDP) |
| */ |
| struct hal_flow_tuple_info { |
| uint32_t dest_ip_127_96; |
| uint32_t dest_ip_95_64; |
| uint32_t dest_ip_63_32; |
| uint32_t dest_ip_31_0; |
| uint32_t src_ip_127_96; |
| uint32_t src_ip_95_64; |
| uint32_t src_ip_63_32; |
| uint32_t src_ip_31_0; |
| uint16_t dest_port; |
| uint16_t src_port; |
| uint16_t l4_protocol; |
| }; |
| |
| /** |
| * key_bitwise_shift_left() - Bitwise left shift (in place) an array of bytes |
| * @key: Pointer to array to key bytes |
| * @len: size of array (number of key bytes) |
| * @shift: number of shift operations to be performed |
| * |
| * Return: |
| */ |
| static inline void |
| key_bitwise_shift_left(uint8_t *key, int len, int shift) |
| { |
| int i; |
| int next; |
| |
| while (shift--) { |
| for (i = len - 1; i >= 0 ; i--) { |
| if (i > 0) |
| next = (key[i - 1] & 0x80 ? 1 : 0); |
| else |
| next = 0; |
| key[i] = (key[i] << 1) | next; |
| } |
| } |
| } |
| |
| /** |
| * key_reverse() - Reverse the key buffer from MSB to LSB |
| * @dest: pointer to the destination key |
| * @src: pointer to the source key which should be shifted |
| * @len: size of key in bytes |
| * |
| * Return: |
| */ |
| static inline void |
| key_reverse(uint8_t *dest, uint8_t *src, int len) |
| { |
| int i, j; |
| |
| for (i = 0, j = len - 1; i < len; i++, j--) |
| dest[i] = src[j]; |
| } |
| #endif /* HAL_FLOW_H */ |