numam-dpdk/drivers/net/nfp/nfp_flow.h
Chaoyong He 8891d6700c net/nfp: prepare for IPv4 GRE tunnel decap flow action
Add the related data structure and logics, prepare for
the decap action of IPv4 GRE tunnel.

Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>
2022-10-25 10:53:33 +02:00

234 lines
7.1 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) 2022 Corigine, Inc.
* All rights reserved.
*/
#ifndef _NFP_FLOW_H_
#define _NFP_FLOW_H_
#include <sys/queue.h>
#include <rte_bitops.h>
#include <ethdev_driver.h>
#define NFP_FLOWER_LAYER_EXT_META RTE_BIT32(0)
#define NFP_FLOWER_LAYER_PORT RTE_BIT32(1)
#define NFP_FLOWER_LAYER_MAC RTE_BIT32(2)
#define NFP_FLOWER_LAYER_TP RTE_BIT32(3)
#define NFP_FLOWER_LAYER_IPV4 RTE_BIT32(4)
#define NFP_FLOWER_LAYER_IPV6 RTE_BIT32(5)
#define NFP_FLOWER_LAYER_CT RTE_BIT32(6)
#define NFP_FLOWER_LAYER_VXLAN RTE_BIT32(7)
#define NFP_FLOWER_LAYER2_GRE RTE_BIT32(0)
#define NFP_FLOWER_LAYER2_QINQ RTE_BIT32(4)
#define NFP_FLOWER_LAYER2_GENEVE RTE_BIT32(5)
#define NFP_FLOWER_LAYER2_GENEVE_OP RTE_BIT32(6)
#define NFP_FLOWER_LAYER2_TUN_IPV6 RTE_BIT32(7)
/* Compressed HW representation of TCP Flags */
#define NFP_FL_TCP_FLAG_FIN RTE_BIT32(0)
#define NFP_FL_TCP_FLAG_SYN RTE_BIT32(1)
#define NFP_FL_TCP_FLAG_RST RTE_BIT32(2)
#define NFP_FL_TCP_FLAG_PSH RTE_BIT32(3)
#define NFP_FL_TCP_FLAG_URG RTE_BIT32(4)
#define NFP_FL_META_FLAG_MANAGE_MASK RTE_BIT32(7)
#define NFP_FLOWER_MASK_VLAN_CFI RTE_BIT32(12)
#define NFP_MASK_TABLE_ENTRIES 1024
/* The maximum action list size (in bytes) supported by the NFP. */
#define NFP_FL_MAX_A_SIZ 1216
/* The firmware expects lengths in units of long words */
#define NFP_FL_LW_SIZ 2
#define NFP_FL_SC_ACT_DROP 0x80000000
#define NFP_FL_SC_ACT_USER 0x7D000000
#define NFP_FL_SC_ACT_POPV 0x6A000000
#define NFP_FL_SC_ACT_NULL 0x00000000
/* GRE Tunnel flags */
#define NFP_FL_GRE_FLAG_KEY (1 << 2)
/* Action opcodes */
#define NFP_FL_ACTION_OPCODE_OUTPUT 0
#define NFP_FL_ACTION_OPCODE_PUSH_VLAN 1
#define NFP_FL_ACTION_OPCODE_POP_VLAN 2
#define NFP_FL_ACTION_OPCODE_PUSH_MPLS 3
#define NFP_FL_ACTION_OPCODE_POP_MPLS 4
#define NFP_FL_ACTION_OPCODE_USERSPACE 5
#define NFP_FL_ACTION_OPCODE_SET_TUNNEL 6
#define NFP_FL_ACTION_OPCODE_SET_ETHERNET 7
#define NFP_FL_ACTION_OPCODE_SET_MPLS 8
#define NFP_FL_ACTION_OPCODE_SET_IPV4_ADDRS 9
#define NFP_FL_ACTION_OPCODE_SET_IPV4_TTL_TOS 10
#define NFP_FL_ACTION_OPCODE_SET_IPV6_SRC 11
#define NFP_FL_ACTION_OPCODE_SET_IPV6_DST 12
#define NFP_FL_ACTION_OPCODE_SET_IPV6_TC_HL_FL 13
#define NFP_FL_ACTION_OPCODE_SET_UDP 14
#define NFP_FL_ACTION_OPCODE_SET_TCP 15
#define NFP_FL_ACTION_OPCODE_PRE_LAG 16
#define NFP_FL_ACTION_OPCODE_PRE_TUNNEL 17
#define NFP_FL_ACTION_OPCODE_PRE_GS 18
#define NFP_FL_ACTION_OPCODE_GS 19
#define NFP_FL_ACTION_OPCODE_PUSH_NSH 20
#define NFP_FL_ACTION_OPCODE_POP_NSH 21
#define NFP_FL_ACTION_OPCODE_SET_QUEUE 22
#define NFP_FL_ACTION_OPCODE_CONNTRACK 23
#define NFP_FL_ACTION_OPCODE_METER 24
#define NFP_FL_ACTION_OPCODE_CT_NAT_EXT 25
#define NFP_FL_ACTION_OPCODE_PUSH_GENEVE 26
#define NFP_FL_ACTION_OPCODE_NUM 32
#define NFP_FL_OUT_FLAGS_LAST RTE_BIT32(15)
/* Tunnel ports */
#define NFP_FL_PORT_TYPE_TUN 0x50000000
enum nfp_flower_tun_type {
NFP_FL_TUN_NONE = 0,
NFP_FL_TUN_GRE = 1,
NFP_FL_TUN_VXLAN = 2,
NFP_FL_TUN_GENEVE = 4,
};
enum nfp_flow_type {
NFP_FLOW_COMMON,
NFP_FLOW_ENCAP,
NFP_FLOW_DECAP,
};
struct nfp_fl_key_ls {
uint32_t key_layer_two;
uint8_t key_layer;
int key_size;
int act_size;
uint32_t port;
uint16_t vlan;
enum nfp_flower_tun_type tun_type;
};
struct nfp_fl_rule_metadata {
uint8_t key_len;
uint8_t mask_len;
uint8_t act_len;
uint8_t flags;
rte_be32_t host_ctx_id;
rte_be64_t host_cookie __rte_packed;
rte_be64_t flow_version __rte_packed;
rte_be32_t shortcut;
};
struct nfp_fl_payload {
struct nfp_fl_rule_metadata *meta;
char *unmasked_data;
char *mask_data;
char *action_data;
};
struct nfp_fl_tun {
LIST_ENTRY(nfp_fl_tun) next;
uint8_t ref_cnt;
struct nfp_fl_tun_entry {
uint8_t v6_flag;
uint8_t dst_addr[RTE_ETHER_ADDR_LEN];
uint8_t src_addr[RTE_ETHER_ADDR_LEN];
union {
rte_be32_t dst_ipv4;
uint8_t dst_ipv6[16];
} dst;
union {
rte_be32_t src_ipv4;
uint8_t src_ipv6[16];
} src;
} payload;
};
#define CIRC_CNT(head, tail, size) (((head) - (tail)) & ((size) - 1))
#define CIRC_SPACE(head, tail, size) CIRC_CNT((tail), ((head) + 1), (size))
struct circ_buf {
uint32_t head;
uint32_t tail;
char *buf;
};
#define NFP_FLOWER_MASK_ENTRY_RS 256
#define NFP_FLOWER_MASK_ELEMENT_RS sizeof(uint8_t)
struct nfp_fl_mask_id {
struct circ_buf free_list;
uint8_t init_unallocated;
};
#define NFP_FL_STATS_ELEM_RS sizeof(uint32_t)
struct nfp_fl_stats_id {
struct circ_buf free_list;
uint32_t init_unallocated;
};
#define NFP_FL_STAT_ID_MU_NUM 0xffc00000
#define NFP_FL_STAT_ID_STAT 0x003fffff
struct nfp_fl_stats {
uint64_t pkts;
uint64_t bytes;
};
struct nfp_ipv4_addr_entry {
LIST_ENTRY(nfp_ipv4_addr_entry) next;
rte_be32_t ipv4_addr;
int ref_count;
};
struct nfp_ipv6_addr_entry {
LIST_ENTRY(nfp_ipv6_addr_entry) next;
uint8_t ipv6_addr[16];
int ref_count;
};
#define NFP_TUN_PRE_TUN_RULE_LIMIT 32
struct nfp_flow_priv {
uint32_t hash_seed; /**< Hash seed for hash tables in this structure. */
uint64_t flower_version; /**< Flow version, always increase. */
/* mask hash table */
struct nfp_fl_mask_id mask_ids; /**< Entry for mask hash table */
struct rte_hash *mask_table; /**< Hash table to store mask ids. */
/* flow hash table */
struct rte_hash *flow_table; /**< Hash table to store flow rules. */
/* flow stats */
uint32_t active_mem_unit; /**< The size of active mem units. */
uint32_t total_mem_units; /**< The size of total mem units. */
uint32_t stats_ring_size; /**< The size of stats id ring. */
struct nfp_fl_stats_id stats_ids; /**< The stats id ring. */
struct nfp_fl_stats *stats; /**< Store stats of flow. */
rte_spinlock_t stats_lock; /** < Lock the update of 'stats' field. */
/* pre tunnel rule */
uint16_t pre_tun_cnt; /**< The size of pre tunnel rule */
uint8_t pre_tun_bitmap[NFP_TUN_PRE_TUN_RULE_LIMIT]; /**< Bitmap of pre tunnel rule */
struct rte_hash *pre_tun_table; /**< Hash table to store pre tunnel rule */
/* IPv4 off */
LIST_HEAD(, nfp_ipv4_addr_entry) ipv4_off_list; /**< Store ipv4 off */
rte_spinlock_t ipv4_off_lock; /**< Lock the ipv4 off list */
/* IPv6 off */
LIST_HEAD(, nfp_ipv6_addr_entry) ipv6_off_list; /**< Store ipv6 off */
rte_spinlock_t ipv6_off_lock; /**< Lock the ipv6 off list */
/* neighbor next */
LIST_HEAD(, nfp_fl_tun)nn_list; /**< Store nn entry */
};
struct rte_flow {
struct nfp_fl_payload payload;
struct nfp_fl_tun tun;
size_t length;
uint32_t hash_key;
bool install_flag;
enum nfp_flow_type type;
};
int nfp_flow_priv_init(struct nfp_pf_dev *pf_dev);
void nfp_flow_priv_uninit(struct nfp_pf_dev *pf_dev);
int nfp_net_flow_ops_get(struct rte_eth_dev *dev, const struct rte_flow_ops **ops);
#endif /* _NFP_FLOW_H_ */