netdev: introduce ndo_set_rx_headroom
This method allows the controlling device (i.e. the bridge) to specify additional headroom to be allocated for skb head on frame reception. Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
46d5efa9a6
Коммит
871b642ade
|
@ -1093,6 +1093,12 @@ struct tc_to_netdev {
|
||||||
* This function is used to get egress tunnel information for given skb.
|
* This function is used to get egress tunnel information for given skb.
|
||||||
* This is useful for retrieving outer tunnel header parameters while
|
* This is useful for retrieving outer tunnel header parameters while
|
||||||
* sampling packet.
|
* sampling packet.
|
||||||
|
* void (*ndo_set_rx_headroom)(struct net_device *dev, int needed_headroom);
|
||||||
|
* This function is used to specify the headroom that the skb must
|
||||||
|
* consider when allocation skb during packet reception. Setting
|
||||||
|
* appropriate rx headroom value allows avoiding skb head copy on
|
||||||
|
* forward. Setting a negative value reset the rx headroom to the
|
||||||
|
* default value.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
struct net_device_ops {
|
struct net_device_ops {
|
||||||
|
@ -1278,6 +1284,8 @@ struct net_device_ops {
|
||||||
bool proto_down);
|
bool proto_down);
|
||||||
int (*ndo_fill_metadata_dst)(struct net_device *dev,
|
int (*ndo_fill_metadata_dst)(struct net_device *dev,
|
||||||
struct sk_buff *skb);
|
struct sk_buff *skb);
|
||||||
|
void (*ndo_set_rx_headroom)(struct net_device *dev,
|
||||||
|
int needed_headroom);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1315,6 +1323,8 @@ struct net_device_ops {
|
||||||
* @IFF_L3MDEV_SLAVE: device is enslaved to an L3 master device
|
* @IFF_L3MDEV_SLAVE: device is enslaved to an L3 master device
|
||||||
* @IFF_TEAM: device is a team device
|
* @IFF_TEAM: device is a team device
|
||||||
* @IFF_RXFH_CONFIGURED: device has had Rx Flow indirection table configured
|
* @IFF_RXFH_CONFIGURED: device has had Rx Flow indirection table configured
|
||||||
|
* @IFF_PHONY_HEADROOM: the headroom value is controlled by an external
|
||||||
|
* entity (i.e. the master device for bridged veth)
|
||||||
*/
|
*/
|
||||||
enum netdev_priv_flags {
|
enum netdev_priv_flags {
|
||||||
IFF_802_1Q_VLAN = 1<<0,
|
IFF_802_1Q_VLAN = 1<<0,
|
||||||
|
@ -1343,6 +1353,7 @@ enum netdev_priv_flags {
|
||||||
IFF_L3MDEV_SLAVE = 1<<23,
|
IFF_L3MDEV_SLAVE = 1<<23,
|
||||||
IFF_TEAM = 1<<24,
|
IFF_TEAM = 1<<24,
|
||||||
IFF_RXFH_CONFIGURED = 1<<25,
|
IFF_RXFH_CONFIGURED = 1<<25,
|
||||||
|
IFF_PHONY_HEADROOM = 1<<26,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IFF_802_1Q_VLAN IFF_802_1Q_VLAN
|
#define IFF_802_1Q_VLAN IFF_802_1Q_VLAN
|
||||||
|
@ -1937,6 +1948,26 @@ struct netdev_queue *netdev_pick_tx(struct net_device *dev,
|
||||||
struct sk_buff *skb,
|
struct sk_buff *skb,
|
||||||
void *accel_priv);
|
void *accel_priv);
|
||||||
|
|
||||||
|
/* returns the headroom that the master device needs to take in account
|
||||||
|
* when forwarding to this dev
|
||||||
|
*/
|
||||||
|
static inline unsigned netdev_get_fwd_headroom(struct net_device *dev)
|
||||||
|
{
|
||||||
|
return dev->priv_flags & IFF_PHONY_HEADROOM ? 0 : dev->needed_headroom;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void netdev_set_rx_headroom(struct net_device *dev, int new_hr)
|
||||||
|
{
|
||||||
|
if (dev->netdev_ops->ndo_set_rx_headroom)
|
||||||
|
dev->netdev_ops->ndo_set_rx_headroom(dev, new_hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set the device rx headroom to the dev's default */
|
||||||
|
static inline void netdev_reset_rx_headroom(struct net_device *dev)
|
||||||
|
{
|
||||||
|
netdev_set_rx_headroom(dev, -1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Net namespace inlines
|
* Net namespace inlines
|
||||||
*/
|
*/
|
||||||
|
|
Загрузка…
Ссылка в новой задаче