| diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h |
| --- a/include/linux/netdevice.h |
| +++ b/include/linux/netdevice.h |
| @@ -829,6 +829,59 @@ typedef u16 (*select_queue_fallback_t)(s |
| struct sk_buff *skb, |
| struct net_device *sb_dev); |
| |
| +enum net_device_path_type { |
| + DEV_PATH_ETHERNET = 0, |
| + DEV_PATH_VLAN, |
| + DEV_PATH_BRIDGE, |
| + DEV_PATH_PPPOE, |
| + DEV_PATH_DSA, |
| +}; |
| + |
| +struct net_device_path { |
| + enum net_device_path_type type; |
| + const struct net_device *dev; |
| + union { |
| + struct { |
| + u16 id; |
| + __be16 proto; |
| + u8 h_dest[ETH_ALEN]; |
| + } encap; |
| + struct { |
| + enum { |
| + DEV_PATH_BR_VLAN_KEEP, |
| + DEV_PATH_BR_VLAN_TAG, |
| + DEV_PATH_BR_VLAN_UNTAG, |
| + DEV_PATH_BR_VLAN_UNTAG_HW, |
| + } vlan_mode; |
| + u16 vlan_id; |
| + __be16 vlan_proto; |
| + } bridge; |
| + struct { |
| + int port; |
| + u16 proto; |
| + } dsa; |
| + }; |
| +}; |
| + |
| +#define NET_DEVICE_PATH_STACK_MAX 5 |
| +#define NET_DEVICE_PATH_VLAN_MAX 2 |
| + |
| +struct net_device_path_stack { |
| + int num_paths; |
| + struct net_device_path path[NET_DEVICE_PATH_STACK_MAX]; |
| +}; |
| + |
| +struct net_device_path_ctx { |
| + const struct net_device *dev; |
| + const u8 *daddr; |
| + |
| + int num_vlans; |
| + struct { |
| + u16 id; |
| + __be16 proto; |
| + } vlan[NET_DEVICE_PATH_VLAN_MAX]; |
| +}; |
| + |
| enum tc_setup_type { |
| TC_SETUP_QDISC_MQPRIO, |
| TC_SETUP_CLSU32, |
| @@ -844,6 +897,7 @@ enum tc_setup_type { |
| TC_SETUP_ROOT_QDISC, |
| TC_SETUP_QDISC_GRED, |
| TC_SETUP_QDISC_TAPRIO, |
| + TC_SETUP_FT, |
| }; |
| |
| /* These structures hold the attributes of bpf state that are being passed |
| @@ -1258,6 +1312,8 @@ enum flow_offload_type { |
| * Get devlink port instance associated with a given netdev. |
| * Called with a reference on the netdevice and devlink locks only, |
| * rtnl_lock is not held. |
| + * int (*ndo_fill_forward_path)(struct net_device_path_ctx *ctx, struct net_device_path *path); |
| + * Get the forwarding path to reach the real device from the HW destination address |
| */ |
| struct net_device_ops { |
| int (*ndo_init)(struct net_device *dev); |
| @@ -1460,6 +1516,8 @@ struct net_device_ops { |
| int (*ndo_xsk_wakeup)(struct net_device *dev, |
| u32 queue_id, u32 flags); |
| struct devlink_port * (*ndo_get_devlink_port)(struct net_device *dev); |
| + int (*ndo_fill_forward_path)(struct net_device_path_ctx *ctx, |
| + struct net_device_path *path); |
| }; |
| |
| /** |
| @@ -2684,6 +2742,8 @@ void dev_remove_offload(struct packet_of |
| |
| int dev_get_iflink(const struct net_device *dev); |
| int dev_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb); |
| +int dev_fill_forward_path(const struct net_device *dev, const u8 *daddr, |
| + struct net_device_path_stack *stack); |
| struct net_device *__dev_get_by_flags(struct net *net, unsigned short flags, |
| unsigned short mask); |
| struct net_device *dev_get_by_name(struct net *net, const char *name); |