123 lines
2.4 KiB
C
123 lines
2.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* Copyright (C) 2023, Intel Corporation. */
|
|
|
|
#ifndef _ICE_ESWITCH_BR_H_
|
|
#define _ICE_ESWITCH_BR_H_
|
|
|
|
#include <linux/rhashtable.h>
|
|
#include <linux/workqueue.h>
|
|
|
|
struct ice_esw_br_fdb_data {
|
|
unsigned char addr[ETH_ALEN];
|
|
u16 vid;
|
|
};
|
|
|
|
struct ice_esw_br_flow {
|
|
struct ice_rule_query_data *fwd_rule;
|
|
struct ice_rule_query_data *guard_rule;
|
|
};
|
|
|
|
enum {
|
|
ICE_ESWITCH_BR_FDB_ADDED_BY_USER = BIT(0),
|
|
};
|
|
|
|
struct ice_esw_br_fdb_entry {
|
|
struct ice_esw_br_fdb_data data;
|
|
struct rhash_head ht_node;
|
|
struct list_head list;
|
|
|
|
int flags;
|
|
|
|
struct net_device *dev;
|
|
struct ice_esw_br_port *br_port;
|
|
struct ice_esw_br_flow *flow;
|
|
|
|
unsigned long last_use;
|
|
};
|
|
|
|
enum ice_esw_br_port_type {
|
|
ICE_ESWITCH_BR_UPLINK_PORT = 0,
|
|
ICE_ESWITCH_BR_VF_REPR_PORT = 1,
|
|
};
|
|
|
|
struct ice_esw_br_port {
|
|
struct ice_esw_br *bridge;
|
|
struct ice_vsi *vsi;
|
|
enum ice_esw_br_port_type type;
|
|
u16 vsi_idx;
|
|
u16 pvid;
|
|
u32 repr_id;
|
|
struct xarray vlans;
|
|
};
|
|
|
|
enum {
|
|
ICE_ESWITCH_BR_VLAN_FILTERING = BIT(0),
|
|
};
|
|
|
|
struct ice_esw_br {
|
|
struct ice_esw_br_offloads *br_offloads;
|
|
struct xarray ports;
|
|
|
|
struct rhashtable fdb_ht;
|
|
struct list_head fdb_list;
|
|
|
|
int ifindex;
|
|
u32 flags;
|
|
unsigned long ageing_time;
|
|
};
|
|
|
|
struct ice_esw_br_offloads {
|
|
struct ice_pf *pf;
|
|
struct ice_esw_br *bridge;
|
|
struct notifier_block netdev_nb;
|
|
struct notifier_block switchdev_blk;
|
|
struct notifier_block switchdev_nb;
|
|
|
|
struct workqueue_struct *wq;
|
|
struct delayed_work update_work;
|
|
};
|
|
|
|
struct ice_esw_br_fdb_work {
|
|
struct work_struct work;
|
|
struct switchdev_notifier_fdb_info fdb_info;
|
|
struct net_device *dev;
|
|
unsigned long event;
|
|
};
|
|
|
|
struct ice_esw_br_vlan {
|
|
u16 vid;
|
|
u16 flags;
|
|
};
|
|
|
|
#define ice_nb_to_br_offloads(nb, nb_name) \
|
|
container_of(nb, \
|
|
struct ice_esw_br_offloads, \
|
|
nb_name)
|
|
|
|
#define ice_work_to_br_offloads(w) \
|
|
container_of(w, \
|
|
struct ice_esw_br_offloads, \
|
|
update_work.work)
|
|
|
|
#define ice_work_to_fdb_work(w) \
|
|
container_of(w, \
|
|
struct ice_esw_br_fdb_work, \
|
|
work)
|
|
|
|
static inline bool ice_eswitch_br_is_vid_valid(u16 vid)
|
|
{
|
|
/* In trunk VLAN mode, for untagged traffic the bridge sends requests
|
|
* to offload VLAN 1 with pvid and untagged flags set. Since these
|
|
* flags are not supported, add a MAC filter instead.
|
|
*/
|
|
return vid > 1;
|
|
}
|
|
|
|
void
|
|
ice_eswitch_br_offloads_deinit(struct ice_pf *pf);
|
|
int
|
|
ice_eswitch_br_offloads_init(struct ice_pf *pf);
|
|
void ice_eswitch_br_fdb_flush(struct ice_esw_br *bridge);
|
|
|
|
#endif /* _ICE_ESWITCH_BR_H_ */
|