brintos

brintos / linux-shallow public Read only

0
0
Text · 6.5 KiB · 10c62b0 Raw
256 lines · c
1/* Broadcom NetXtreme-C/E network driver.2 *3 * Copyright (c) 2017 Broadcom Limited4 *5 * This program is free software; you can redistribute it and/or modify6 * it under the terms of the GNU General Public License as published by7 * the Free Software Foundation.8 */9 10#ifndef BNXT_TC_H11#define BNXT_TC_H12 13#ifdef CONFIG_BNXT_FLOWER_OFFLOAD14 15#include <net/ip_tunnels.h>16 17/* Structs used for storing the filter/actions of the TC cmd.18 */19struct bnxt_tc_l2_key {20	u8		dmac[ETH_ALEN];21	u8		smac[ETH_ALEN];22	__be16		inner_vlan_tpid;23	__be16		inner_vlan_tci;24	__be16		ether_type;25	u8		num_vlans;26	u8		dir;27#define BNXT_DIR_RX	128#define BNXT_DIR_TX	029};30 31struct bnxt_tc_l3_key {32	union {33		struct {34			struct in_addr daddr;35			struct in_addr saddr;36		} ipv4;37		struct {38			struct in6_addr daddr;39			struct in6_addr saddr;40		} ipv6;41	};42};43 44struct bnxt_tc_l4_key {45	u8  ip_proto;46	union {47		struct {48			__be16 sport;49			__be16 dport;50		} ports;51		struct {52			u8 type;53			u8 code;54		} icmp;55	};56};57 58struct bnxt_tc_tunnel_key {59	struct bnxt_tc_l2_key	l2;60	struct bnxt_tc_l3_key	l3;61	struct bnxt_tc_l4_key	l4;62	__be32			id;63};64 65#define bnxt_eth_addr_key_mask_invalid(eth_addr, eth_addr_mask)		\66	((is_wildcard(&(eth_addr)[0], ETH_ALEN) &&			\67	 is_wildcard(&(eth_addr)[ETH_ALEN / 2], ETH_ALEN)) ||		\68	(is_wildcard(&(eth_addr_mask)[0], ETH_ALEN) &&			\69	 is_wildcard(&(eth_addr_mask)[ETH_ALEN / 2], ETH_ALEN)))70 71struct bnxt_tc_actions {72	u32				flags;73#define BNXT_TC_ACTION_FLAG_FWD			BIT(0)74#define BNXT_TC_ACTION_FLAG_FWD_VXLAN		BIT(1)75#define BNXT_TC_ACTION_FLAG_PUSH_VLAN		BIT(3)76#define BNXT_TC_ACTION_FLAG_POP_VLAN		BIT(4)77#define BNXT_TC_ACTION_FLAG_DROP		BIT(5)78#define BNXT_TC_ACTION_FLAG_TUNNEL_ENCAP	BIT(6)79#define BNXT_TC_ACTION_FLAG_TUNNEL_DECAP	BIT(7)80#define BNXT_TC_ACTION_FLAG_L2_REWRITE		BIT(8)81#define BNXT_TC_ACTION_FLAG_NAT_XLATE		BIT(9)82 83	u16				dst_fid;84	struct net_device		*dst_dev;85	__be16				push_vlan_tpid;86	__be16				push_vlan_tci;87 88	/* tunnel encap */89	struct ip_tunnel_key		tun_encap_key;90#define	PEDIT_OFFSET_SMAC_LAST_4_BYTES		0x891	__be16				l2_rewrite_dmac[3];92	__be16				l2_rewrite_smac[3];93	struct {94		bool src_xlate;  /* true => translate src,95				  * false => translate dst96				  * Mutually exclusive, i.e cannot set both97				  */98		bool l3_is_ipv4; /* false means L3 is ipv6 */99		struct bnxt_tc_l3_key l3;100		struct bnxt_tc_l4_key l4;101	} nat;102};103 104struct bnxt_tc_flow {105	u32				flags;106#define BNXT_TC_FLOW_FLAGS_ETH_ADDRS		BIT(1)107#define BNXT_TC_FLOW_FLAGS_IPV4_ADDRS		BIT(2)108#define BNXT_TC_FLOW_FLAGS_IPV6_ADDRS		BIT(3)109#define BNXT_TC_FLOW_FLAGS_PORTS		BIT(4)110#define BNXT_TC_FLOW_FLAGS_ICMP			BIT(5)111#define BNXT_TC_FLOW_FLAGS_TUNL_ETH_ADDRS	BIT(6)112#define BNXT_TC_FLOW_FLAGS_TUNL_IPV4_ADDRS	BIT(7)113#define BNXT_TC_FLOW_FLAGS_TUNL_IPV6_ADDRS	BIT(8)114#define BNXT_TC_FLOW_FLAGS_TUNL_PORTS		BIT(9)115#define BNXT_TC_FLOW_FLAGS_TUNL_ID		BIT(10)116#define BNXT_TC_FLOW_FLAGS_TUNNEL	(BNXT_TC_FLOW_FLAGS_TUNL_ETH_ADDRS | \117					 BNXT_TC_FLOW_FLAGS_TUNL_IPV4_ADDRS | \118					 BNXT_TC_FLOW_FLAGS_TUNL_IPV6_ADDRS |\119					 BNXT_TC_FLOW_FLAGS_TUNL_PORTS |\120					 BNXT_TC_FLOW_FLAGS_TUNL_ID)121 122	/* flow applicable to pkts ingressing on this fid */123	u16				src_fid;124	struct bnxt_tc_l2_key		l2_key;125	struct bnxt_tc_l2_key		l2_mask;126	struct bnxt_tc_l3_key		l3_key;127	struct bnxt_tc_l3_key		l3_mask;128	struct bnxt_tc_l4_key		l4_key;129	struct bnxt_tc_l4_key		l4_mask;130	struct ip_tunnel_key		tun_key;131	struct ip_tunnel_key		tun_mask;132 133	struct bnxt_tc_actions		actions;134 135	/* updated stats accounting for hw-counter wrap-around */136	struct bnxt_tc_flow_stats	stats;137	/* previous snap-shot of stats */138	struct bnxt_tc_flow_stats	prev_stats;139	unsigned long			lastused; /* jiffies */140	/* for calculating delta from prev_stats and141	 * updating prev_stats atomically.142	 */143	spinlock_t			stats_lock;144};145 146/* Tunnel encap/decap hash table147 * This table is used to maintain a list of flows that use148 * the same tunnel encap/decap params (ip_daddrs, vni, udp_dport)149 * and the FW returned handle.150 * A separate table is maintained for encap and decap151 */152struct bnxt_tc_tunnel_node {153	struct ip_tunnel_key		key;154	struct rhash_head		node;155 156	/* tunnel l2 info */157	struct bnxt_tc_l2_key		l2_info;158 159#define	INVALID_TUNNEL_HANDLE		cpu_to_le32(0xffffffff)160	/* tunnel handle returned by FW */161	__le32				tunnel_handle;162 163	u32				refcount;164	struct rcu_head			rcu;165};166 167/* L2 hash table168 * The same data-struct is used for L2-flow table and L2-tunnel table.169 * The L2 part of a flow or tunnel is stored in a hash table.170 * A flow that shares the same L2 key/mask with an171 * already existing flow/tunnel must refer to it's flow handle or172 * decap_filter_id respectively.173 */174struct bnxt_tc_l2_node {175	/* hash key: first 16b of key */176#define BNXT_TC_L2_KEY_LEN			16177	struct bnxt_tc_l2_key	key;178	struct rhash_head	node;179 180	/* a linked list of flows that share the same l2 key */181	struct list_head	common_l2_flows;182 183	/* number of flows/tunnels sharing the l2 key */184	u16			refcount;185 186	struct rcu_head		rcu;187};188 189struct bnxt_tc_flow_node {190	/* hash key: provided by TC */191	unsigned long			cookie;192	struct rhash_head		node;193 194	struct bnxt_tc_flow		flow;195 196	__le64				ext_flow_handle;197	__le16				flow_handle;198	__le32				flow_id;199 200	/* L2 node in l2 hashtable that shares flow's l2 key */201	struct bnxt_tc_l2_node		*l2_node;202	/* for the shared_flows list maintained in l2_node */203	struct list_head		l2_list_node;204 205	/* tunnel encap related */206	struct bnxt_tc_tunnel_node	*encap_node;207 208	/* tunnel decap related */209	struct bnxt_tc_tunnel_node	*decap_node;210	/* L2 node in tunnel-l2 hashtable that shares flow's tunnel l2 key */211	struct bnxt_tc_l2_node		*decap_l2_node;212	/* for the shared_flows list maintained in tunnel decap l2_node */213	struct list_head		decap_l2_list_node;214 215	struct rcu_head			rcu;216};217 218int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid,219			 struct flow_cls_offload *cls_flower);220int bnxt_init_tc(struct bnxt *bp);221void bnxt_shutdown_tc(struct bnxt *bp);222void bnxt_tc_flow_stats_work(struct bnxt *bp);223 224static inline bool bnxt_tc_flower_enabled(struct bnxt *bp)225{226	return bp->tc_info && bp->tc_info->enabled;227}228 229#else /* CONFIG_BNXT_FLOWER_OFFLOAD */230 231static inline int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid,232				       struct flow_cls_offload *cls_flower)233{234	return -EOPNOTSUPP;235}236 237static inline int bnxt_init_tc(struct bnxt *bp)238{239	return 0;240}241 242static inline void bnxt_shutdown_tc(struct bnxt *bp)243{244}245 246static inline void bnxt_tc_flow_stats_work(struct bnxt *bp)247{248}249 250static inline bool bnxt_tc_flower_enabled(struct bnxt *bp)251{252	return false;253}254#endif /* CONFIG_BNXT_FLOWER_OFFLOAD */255#endif /* BNXT_TC_H */256