/* Broadcom NetXtreme-C/E network driver. * * Copyright (c) 2017 Broadcom Limited * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation. */ #ifndef BNXT_TC_H #define BNXT_TC_H #ifdef CONFIG_BNXT_FLOWER_OFFLOAD /* Structs used for storing the filter/actions of the TC cmd. */ struct bnxt_tc_l2_key { u8 dmac[ETH_ALEN]; u8 smac[ETH_ALEN]; __be16 inner_vlan_tpid; __be16 inner_vlan_tci; __be16 ether_type; u8 num_vlans; }; struct bnxt_tc_l3_key { union { struct { struct in_addr daddr; struct in_addr saddr; } ipv4; struct { struct in6_addr daddr; struct in6_addr saddr; } ipv6; }; }; struct bnxt_tc_l4_key { u8 ip_proto; union { struct { __be16 sport; __be16 dport; } ports; struct { u8 type; u8 code; } icmp; }; }; struct bnxt_tc_actions { u32 flags; #define BNXT_TC_ACTION_FLAG_FWD BIT(0) #define BNXT_TC_ACTION_FLAG_FWD_VXLAN BIT(1) #define BNXT_TC_ACTION_FLAG_PUSH_VLAN BIT(3) #define BNXT_TC_ACTION_FLAG_POP_VLAN BIT(4) #define BNXT_TC_ACTION_FLAG_DROP BIT(5) u16 dst_fid; struct net_device *dst_dev; __be16 push_vlan_tpid; __be16 push_vlan_tci; }; struct bnxt_tc_flow_stats { u64 packets; u64 bytes; }; struct bnxt_tc_flow { u32 flags; #define BNXT_TC_FLOW_FLAGS_ETH_ADDRS BIT(1) #define BNXT_TC_FLOW_FLAGS_IPV4_ADDRS BIT(2) #define BNXT_TC_FLOW_FLAGS_IPV6_ADDRS BIT(3) #define BNXT_TC_FLOW_FLAGS_PORTS BIT(4) #define BNXT_TC_FLOW_FLAGS_ICMP BIT(5) /* flow applicable to pkts ingressing on this fid */ u16 src_fid; struct bnxt_tc_l2_key l2_key; struct bnxt_tc_l2_key l2_mask; struct bnxt_tc_l3_key l3_key; struct bnxt_tc_l3_key l3_mask; struct bnxt_tc_l4_key l4_key; struct bnxt_tc_l4_key l4_mask; struct bnxt_tc_actions actions; /* updated stats accounting for hw-counter wrap-around */ struct bnxt_tc_flow_stats stats; /* previous snap-shot of stats */ struct bnxt_tc_flow_stats prev_stats; unsigned long lastused; /* jiffies */ }; /* L2 hash table * This data-struct is used for L2-flow table. * The L2 part of a flow is stored in a hash table. * A flow that shares the same L2 key/mask with an * already existing flow must refer to it's flow handle. */ struct bnxt_tc_l2_node { /* hash key: first 16b of key */ #define BNXT_TC_L2_KEY_LEN 16 struct bnxt_tc_l2_key key; struct rhash_head node; /* a linked list of flows that share the same l2 key */ struct list_head common_l2_flows; /* number of flows sharing the l2 key */ u16 refcount; struct rcu_head rcu; }; struct bnxt_tc_flow_node { /* hash key: provided by TC */ unsigned long cookie; struct rhash_head node; struct bnxt_tc_flow flow; __le16 flow_handle; /* L2 node in l2 hashtable that shares flow's l2 key */ struct bnxt_tc_l2_node *l2_node; /* for the shared_flows list maintained in l2_node */ struct list_head l2_list_node; struct rcu_head rcu; }; int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid, struct tc_cls_flower_offload *cls_flower); int bnxt_init_tc(struct bnxt *bp); void bnxt_shutdown_tc(struct bnxt *bp); #else /* CONFIG_BNXT_FLOWER_OFFLOAD */ static inline int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid, struct tc_cls_flower_offload *cls_flower) { return -EOPNOTSUPP; } static inline int bnxt_init_tc(struct bnxt *bp) { return 0; } static inline void bnxt_shutdown_tc(struct bnxt *bp) { } #endif /* CONFIG_BNXT_FLOWER_OFFLOAD */ #endif /* BNXT_TC_H */