Skip to content

Commit

Permalink
net: Add Software fallback infrastructure for socket dependent offloads
Browse files Browse the repository at this point in the history
With socket dependent offloads we rely on the netdev to transform
the transmitted packets before sending them to the wire.
When a packet from an offloaded socket is rerouted to a different
device we need to detect it and do the transformation in software.

Signed-off-by: Ilya Lesokhin <[email protected]>
Signed-off-by: Boris Pismenny <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Ilya Lesokhin authored and davem330 committed May 1, 2018
1 parent 08303c1 commit ebf4e80
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 0 deletions.
21 changes: 21 additions & 0 deletions include/net/sock.h
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,11 @@ struct sock {
void (*sk_error_report)(struct sock *sk);
int (*sk_backlog_rcv)(struct sock *sk,
struct sk_buff *skb);
#ifdef CONFIG_SOCK_VALIDATE_XMIT
struct sk_buff* (*sk_validate_xmit_skb)(struct sock *sk,
struct net_device *dev,
struct sk_buff *skb);
#endif
void (*sk_destruct)(struct sock *sk);
struct sock_reuseport __rcu *sk_reuseport_cb;
struct rcu_head sk_rcu;
Expand Down Expand Up @@ -2332,6 +2337,22 @@ static inline bool sk_fullsock(const struct sock *sk)
return (1 << sk->sk_state) & ~(TCPF_TIME_WAIT | TCPF_NEW_SYN_RECV);
}

/* Checks if this SKB belongs to an HW offloaded socket
* and whether any SW fallbacks are required based on dev.
*/
static inline struct sk_buff *sk_validate_xmit_skb(struct sk_buff *skb,
struct net_device *dev)
{
#ifdef CONFIG_SOCK_VALIDATE_XMIT
struct sock *sk = skb->sk;

if (sk && sk_fullsock(sk) && sk->sk_validate_xmit_skb)
skb = sk->sk_validate_xmit_skb(sk, dev, skb);
#endif

return skb;
}

/* This helper checks if a socket is a LISTEN or NEW_SYN_RECV
* SYNACK messages can be attached to either ones (depending on SYNCOOKIE)
*/
Expand Down
3 changes: 3 additions & 0 deletions net/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,9 @@ config GRO_CELLS
bool
default n

config SOCK_VALIDATE_XMIT
bool

config NET_DEVLINK
tristate "Network physical/parent device Netlink interface"
help
Expand Down
4 changes: 4 additions & 0 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -3112,6 +3112,10 @@ static struct sk_buff *validate_xmit_skb(struct sk_buff *skb, struct net_device
if (unlikely(!skb))
goto out_null;

skb = sk_validate_xmit_skb(skb, dev);
if (unlikely(!skb))
goto out_null;

if (netif_needs_gso(skb, features)) {
struct sk_buff *segs;

Expand Down

0 comments on commit ebf4e80

Please sign in to comment.