diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/netdevice.h | 1 | ||||
-rw-r--r-- | include/linux/skbuff.h | 3 | ||||
-rw-r--r-- | include/net/sock.h | 3 | ||||
-rw-r--r-- | include/net/tcp_ecn.h | 6 |
4 files changed, 9 insertions, 4 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index efd1e2af0bf3..aa2d3c12c4d8 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -316,6 +316,7 @@ struct net_device | |||
316 | #define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT) | 316 | #define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT) |
317 | #define NETIF_F_UFO (SKB_GSO_UDPV4 << NETIF_F_GSO_SHIFT) | 317 | #define NETIF_F_UFO (SKB_GSO_UDPV4 << NETIF_F_GSO_SHIFT) |
318 | #define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT) | 318 | #define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT) |
319 | #define NETIF_F_TSO_ECN (SKB_GSO_TCPV4_ECN << NETIF_F_GSO_SHIFT) | ||
319 | 320 | ||
320 | #define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) | 321 | #define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) |
321 | #define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM) | 322 | #define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM) |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 5fb72da7da03..e74c294929a0 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -175,6 +175,9 @@ enum { | |||
175 | 175 | ||
176 | /* This indicates the skb is from an untrusted source. */ | 176 | /* This indicates the skb is from an untrusted source. */ |
177 | SKB_GSO_DODGY = 1 << 2, | 177 | SKB_GSO_DODGY = 1 << 2, |
178 | |||
179 | /* This indicates the tcp segment has CWR set. */ | ||
180 | SKB_GSO_TCPV4_ECN = 1 << 3, | ||
178 | }; | 181 | }; |
179 | 182 | ||
180 | /** | 183 | /** |
diff --git a/include/net/sock.h b/include/net/sock.h index 2d8d6adf1616..7136bae48c2f 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -383,7 +383,6 @@ enum sock_flags { | |||
383 | SOCK_USE_WRITE_QUEUE, /* whether to call sk->sk_write_space in sock_wfree */ | 383 | SOCK_USE_WRITE_QUEUE, /* whether to call sk->sk_write_space in sock_wfree */ |
384 | SOCK_DBG, /* %SO_DEBUG setting */ | 384 | SOCK_DBG, /* %SO_DEBUG setting */ |
385 | SOCK_RCVTSTAMP, /* %SO_TIMESTAMP setting */ | 385 | SOCK_RCVTSTAMP, /* %SO_TIMESTAMP setting */ |
386 | SOCK_NO_LARGESEND, /* whether to sent large segments or not */ | ||
387 | SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */ | 386 | SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */ |
388 | SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */ | 387 | SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */ |
389 | }; | 388 | }; |
@@ -1033,7 +1032,7 @@ static inline void sk_setup_caps(struct sock *sk, struct dst_entry *dst) | |||
1033 | if (sk->sk_route_caps & NETIF_F_GSO) | 1032 | if (sk->sk_route_caps & NETIF_F_GSO) |
1034 | sk->sk_route_caps |= NETIF_F_TSO; | 1033 | sk->sk_route_caps |= NETIF_F_TSO; |
1035 | if (sk->sk_route_caps & NETIF_F_TSO) { | 1034 | if (sk->sk_route_caps & NETIF_F_TSO) { |
1036 | if (sock_flag(sk, SOCK_NO_LARGESEND) || dst->header_len) | 1035 | if (dst->header_len) |
1037 | sk->sk_route_caps &= ~NETIF_F_TSO; | 1036 | sk->sk_route_caps &= ~NETIF_F_TSO; |
1038 | else | 1037 | else |
1039 | sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM; | 1038 | sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM; |
diff --git a/include/net/tcp_ecn.h b/include/net/tcp_ecn.h index c6b84397448d..7bb366f70934 100644 --- a/include/net/tcp_ecn.h +++ b/include/net/tcp_ecn.h | |||
@@ -31,10 +31,9 @@ static inline void TCP_ECN_send_syn(struct sock *sk, struct tcp_sock *tp, | |||
31 | struct sk_buff *skb) | 31 | struct sk_buff *skb) |
32 | { | 32 | { |
33 | tp->ecn_flags = 0; | 33 | tp->ecn_flags = 0; |
34 | if (sysctl_tcp_ecn && !(sk->sk_route_caps & NETIF_F_TSO)) { | 34 | if (sysctl_tcp_ecn) { |
35 | TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_ECE|TCPCB_FLAG_CWR; | 35 | TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_ECE|TCPCB_FLAG_CWR; |
36 | tp->ecn_flags = TCP_ECN_OK; | 36 | tp->ecn_flags = TCP_ECN_OK; |
37 | sock_set_flag(sk, SOCK_NO_LARGESEND); | ||
38 | } | 37 | } |
39 | } | 38 | } |
40 | 39 | ||
@@ -56,6 +55,9 @@ static inline void TCP_ECN_send(struct sock *sk, struct tcp_sock *tp, | |||
56 | if (tp->ecn_flags&TCP_ECN_QUEUE_CWR) { | 55 | if (tp->ecn_flags&TCP_ECN_QUEUE_CWR) { |
57 | tp->ecn_flags &= ~TCP_ECN_QUEUE_CWR; | 56 | tp->ecn_flags &= ~TCP_ECN_QUEUE_CWR; |
58 | skb->h.th->cwr = 1; | 57 | skb->h.th->cwr = 1; |
58 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) | ||
59 | skb_shinfo(skb)->gso_type |= | ||
60 | SKB_GSO_TCPV4_ECN; | ||
59 | } | 61 | } |
60 | } else { | 62 | } else { |
61 | /* ACK or retransmitted segment: clear ECT|CE */ | 63 | /* ACK or retransmitted segment: clear ECT|CE */ |