diff options
| author | Ilya Lesokhin <ilyal@mellanox.com> | 2018-04-30 03:16:12 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2018-05-01 09:42:46 -0400 |
| commit | ebf4e808fa0b22e551baf862e17c26c325c068f4 (patch) | |
| tree | b2e673a3847e61d60a6ce2e50860bdba771202e5 /include | |
| parent | 08303c189581c985e60f588ad92a041e46b6e307 (diff) | |
net: Add Software fallback infrastructure for socket dependent offloads
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 <ilyal@mellanox.com>
Signed-off-by: Boris Pismenny <borisp@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
| -rw-r--r-- | include/net/sock.h | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/include/net/sock.h b/include/net/sock.h index 74d725fdbe0f..3c568b36ee36 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -481,6 +481,11 @@ struct sock { | |||
| 481 | void (*sk_error_report)(struct sock *sk); | 481 | void (*sk_error_report)(struct sock *sk); |
| 482 | int (*sk_backlog_rcv)(struct sock *sk, | 482 | int (*sk_backlog_rcv)(struct sock *sk, |
| 483 | struct sk_buff *skb); | 483 | struct sk_buff *skb); |
| 484 | #ifdef CONFIG_SOCK_VALIDATE_XMIT | ||
| 485 | struct sk_buff* (*sk_validate_xmit_skb)(struct sock *sk, | ||
| 486 | struct net_device *dev, | ||
| 487 | struct sk_buff *skb); | ||
| 488 | #endif | ||
| 484 | void (*sk_destruct)(struct sock *sk); | 489 | void (*sk_destruct)(struct sock *sk); |
| 485 | struct sock_reuseport __rcu *sk_reuseport_cb; | 490 | struct sock_reuseport __rcu *sk_reuseport_cb; |
| 486 | struct rcu_head sk_rcu; | 491 | struct rcu_head sk_rcu; |
| @@ -2332,6 +2337,22 @@ static inline bool sk_fullsock(const struct sock *sk) | |||
| 2332 | return (1 << sk->sk_state) & ~(TCPF_TIME_WAIT | TCPF_NEW_SYN_RECV); | 2337 | return (1 << sk->sk_state) & ~(TCPF_TIME_WAIT | TCPF_NEW_SYN_RECV); |
| 2333 | } | 2338 | } |
| 2334 | 2339 | ||
| 2340 | /* Checks if this SKB belongs to an HW offloaded socket | ||
| 2341 | * and whether any SW fallbacks are required based on dev. | ||
| 2342 | */ | ||
| 2343 | static inline struct sk_buff *sk_validate_xmit_skb(struct sk_buff *skb, | ||
| 2344 | struct net_device *dev) | ||
| 2345 | { | ||
| 2346 | #ifdef CONFIG_SOCK_VALIDATE_XMIT | ||
| 2347 | struct sock *sk = skb->sk; | ||
| 2348 | |||
| 2349 | if (sk && sk_fullsock(sk) && sk->sk_validate_xmit_skb) | ||
| 2350 | skb = sk->sk_validate_xmit_skb(sk, dev, skb); | ||
| 2351 | #endif | ||
| 2352 | |||
| 2353 | return skb; | ||
| 2354 | } | ||
| 2355 | |||
| 2335 | /* This helper checks if a socket is a LISTEN or NEW_SYN_RECV | 2356 | /* This helper checks if a socket is a LISTEN or NEW_SYN_RECV |
| 2336 | * SYNACK messages can be attached to either ones (depending on SYNCOOKIE) | 2357 | * SYNACK messages can be attached to either ones (depending on SYNCOOKIE) |
| 2337 | */ | 2358 | */ |
