diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/net/ethernet/sfc/tc.h | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/net/ethernet/sfc/tc.h')
| -rw-r--r-- | drivers/net/ethernet/sfc/tc.h | 41 | 
1 files changed, 41 insertions, 0 deletions
diff --git a/drivers/net/ethernet/sfc/tc.h b/drivers/net/ethernet/sfc/tc.h index 418ce8c13a06..04cced6a2d39 100644 --- a/drivers/net/ethernet/sfc/tc.h +++ b/drivers/net/ethernet/sfc/tc.h @@ -18,8 +18,20 @@  #define IS_ALL_ONES(v)	(!(typeof (v))~(v)) +#ifdef CONFIG_IPV6 +static inline bool efx_ipv6_addr_all_ones(struct in6_addr *addr) +{ +	return !memchr_inv(addr, 0xff, sizeof(*addr)); +} +#endif +  struct efx_tc_action_set { +	u16 vlan_push:2; +	u16 vlan_pop:2; +	u16 decap:1;  	u16 deliver:1; +	__be16 vlan_tci[2]; /* TCIs for vlan_push */ +	__be16 vlan_proto[2]; /* Ethertypes for vlan_push */  	struct efx_tc_counter_index *count;  	u32 dest_mport;  	u32 fw_id; /* index of this entry in firmware actions table */ @@ -44,11 +56,38 @@ struct efx_tc_match_fields {  	/* L4 */  	__be16 l4_sport, l4_dport; /* Ports (UDP, TCP) */  	__be16 tcp_flags; +	/* Encap.  The following are *outer* fields.  Note that there are no +	 * outer eth (L2) fields; this is because TC doesn't have them. +	 */ +	__be32 enc_src_ip, enc_dst_ip; +	struct in6_addr enc_src_ip6, enc_dst_ip6; +	u8 enc_ip_tos, enc_ip_ttl; +	__be16 enc_sport, enc_dport; +	__be32 enc_keyid; /* e.g. VNI, VSID */ +}; + +static inline bool efx_tc_match_is_encap(const struct efx_tc_match_fields *mask) +{ +	return mask->enc_src_ip || mask->enc_dst_ip || +	       !ipv6_addr_any(&mask->enc_src_ip6) || +	       !ipv6_addr_any(&mask->enc_dst_ip6) || mask->enc_ip_tos || +	       mask->enc_ip_ttl || mask->enc_sport || mask->enc_dport; +} + +struct efx_tc_encap_match { +	__be32 src_ip, dst_ip; +	struct in6_addr src_ip6, dst_ip6; +	__be16 udp_dport; +	struct rhash_head linkage; +	enum efx_encap_type tun_type; +	refcount_t ref; +	u32 fw_id; /* index of this entry in firmware encap match table */  };  struct efx_tc_match {  	struct efx_tc_match_fields value;  	struct efx_tc_match_fields mask; +	struct efx_tc_encap_match *encap;  };  struct efx_tc_action_set_list { @@ -78,6 +117,7 @@ enum efx_tc_rule_prios {   * @mutex: Used to serialise operations on TC hashtables   * @counter_ht: Hashtable of TC counters (FW IDs and counter values)   * @counter_id_ht: Hashtable mapping TC counter cookies to counters + * @encap_match_ht: Hashtable of TC encap matches   * @match_action_ht: Hashtable of TC match-action rules   * @reps_mport_id: MAE port allocated for representor RX   * @reps_filter_uc: VNIC filter for representor unicast RX (promisc) @@ -101,6 +141,7 @@ struct efx_tc_state {  	struct mutex mutex;  	struct rhashtable counter_ht;  	struct rhashtable counter_id_ht; +	struct rhashtable encap_match_ht;  	struct rhashtable match_action_ht;  	u32 reps_mport_id, reps_mport_vport_id;  	s32 reps_filter_uc, reps_filter_mc;  |