mirror of https://gitee.com/openkylin/linux.git
159 lines
3.5 KiB
C
159 lines
3.5 KiB
C
/* 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 */
|