diff options
Diffstat (limited to 'include/net')
| -rw-r--r-- | include/net/af_unix.h | 6 | ||||
| -rw-r--r-- | include/net/ip6_route.h | 2 | ||||
| -rw-r--r-- | include/net/irda/irda_device.h | 2 | ||||
| -rw-r--r-- | include/net/pkt_sched.h | 18 | ||||
| -rw-r--r-- | include/net/protocol.h | 9 | ||||
| -rw-r--r-- | include/net/scm.h | 17 | ||||
| -rw-r--r-- | include/net/sock.h | 16 | ||||
| -rw-r--r-- | include/net/tcp.h | 4 | ||||
| -rw-r--r-- | include/net/tcp_ecn.h | 4 |
9 files changed, 60 insertions, 18 deletions
diff --git a/include/net/af_unix.h b/include/net/af_unix.h index 795f81f9ec7f..5ba72d95280c 100644 --- a/include/net/af_unix.h +++ b/include/net/af_unix.h | |||
| @@ -53,10 +53,16 @@ struct unix_address { | |||
| 53 | struct unix_skb_parms { | 53 | struct unix_skb_parms { |
| 54 | struct ucred creds; /* Skb credentials */ | 54 | struct ucred creds; /* Skb credentials */ |
| 55 | struct scm_fp_list *fp; /* Passed files */ | 55 | struct scm_fp_list *fp; /* Passed files */ |
| 56 | #ifdef CONFIG_SECURITY_NETWORK | ||
| 57 | char *secdata; /* Security context */ | ||
| 58 | u32 seclen; /* Security length */ | ||
| 59 | #endif | ||
| 56 | }; | 60 | }; |
| 57 | 61 | ||
| 58 | #define UNIXCB(skb) (*(struct unix_skb_parms*)&((skb)->cb)) | 62 | #define UNIXCB(skb) (*(struct unix_skb_parms*)&((skb)->cb)) |
| 59 | #define UNIXCREDS(skb) (&UNIXCB((skb)).creds) | 63 | #define UNIXCREDS(skb) (&UNIXCB((skb)).creds) |
| 64 | #define UNIXSECDATA(skb) (&UNIXCB((skb)).secdata) | ||
| 65 | #define UNIXSECLEN(skb) (&UNIXCB((skb)).seclen) | ||
| 60 | 66 | ||
| 61 | #define unix_state_rlock(s) spin_lock(&unix_sk(s)->lock) | 67 | #define unix_state_rlock(s) spin_lock(&unix_sk(s)->lock) |
| 62 | #define unix_state_runlock(s) spin_unlock(&unix_sk(s)->lock) | 68 | #define unix_state_runlock(s) spin_unlock(&unix_sk(s)->lock) |
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index a398ae5e30f9..ab29dafb1a6a 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h | |||
| @@ -146,7 +146,7 @@ static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst, | |||
| 146 | struct rt6_info *rt = (struct rt6_info *) dst; | 146 | struct rt6_info *rt = (struct rt6_info *) dst; |
| 147 | 147 | ||
| 148 | write_lock(&sk->sk_dst_lock); | 148 | write_lock(&sk->sk_dst_lock); |
| 149 | __sk_dst_set(sk, dst); | 149 | sk_setup_caps(sk, dst); |
| 150 | np->daddr_cache = daddr; | 150 | np->daddr_cache = daddr; |
| 151 | np->dst_cookie = rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0; | 151 | np->dst_cookie = rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0; |
| 152 | write_unlock(&sk->sk_dst_lock); | 152 | write_unlock(&sk->sk_dst_lock); |
diff --git a/include/net/irda/irda_device.h b/include/net/irda/irda_device.h index 0575c59a5c96..bca19ca7bdd4 100644 --- a/include/net/irda/irda_device.h +++ b/include/net/irda/irda_device.h | |||
| @@ -160,7 +160,7 @@ typedef struct { | |||
| 160 | int irq, irq2; /* Interrupts used */ | 160 | int irq, irq2; /* Interrupts used */ |
| 161 | int dma, dma2; /* DMA channel(s) used */ | 161 | int dma, dma2; /* DMA channel(s) used */ |
| 162 | int fifo_size; /* FIFO size */ | 162 | int fifo_size; /* FIFO size */ |
| 163 | int irqflags; /* interrupt flags (ie, SA_SHIRQ|SA_INTERRUPT) */ | 163 | int irqflags; /* interrupt flags (ie, IRQF_SHARED|IRQF_DISABLED) */ |
| 164 | int direction; /* Link direction, used by some FIR drivers */ | 164 | int direction; /* Link direction, used by some FIR drivers */ |
| 165 | int enabled; /* Powered on? */ | 165 | int enabled; /* Powered on? */ |
| 166 | int suspended; /* Suspended by APM */ | 166 | int suspended; /* Suspended by APM */ |
diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index 75b5b9333fc7..1925c65e617b 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h | |||
| @@ -169,17 +169,23 @@ psched_tod_diff(int delta_sec, int bound) | |||
| 169 | 169 | ||
| 170 | #define PSCHED_TADD2(tv, delta, tv_res) \ | 170 | #define PSCHED_TADD2(tv, delta, tv_res) \ |
| 171 | ({ \ | 171 | ({ \ |
| 172 | int __delta = (tv).tv_usec + (delta); \ | 172 | int __delta = (delta); \ |
| 173 | (tv_res).tv_sec = (tv).tv_sec; \ | 173 | (tv_res) = (tv); \ |
| 174 | if (__delta > USEC_PER_SEC) { (tv_res).tv_sec++; __delta -= USEC_PER_SEC; } \ | 174 | while(__delta >= USEC_PER_SEC){ \ |
| 175 | (tv_res).tv_sec++; \ | ||
| 176 | __delta -= USEC_PER_SEC; \ | ||
| 177 | } \ | ||
| 175 | (tv_res).tv_usec = __delta; \ | 178 | (tv_res).tv_usec = __delta; \ |
| 176 | }) | 179 | }) |
| 177 | 180 | ||
| 178 | #define PSCHED_TADD(tv, delta) \ | 181 | #define PSCHED_TADD(tv, delta) \ |
| 179 | ({ \ | 182 | ({ \ |
| 180 | (tv).tv_usec += (delta); \ | 183 | int __delta = (delta); \ |
| 181 | if ((tv).tv_usec > USEC_PER_SEC) { (tv).tv_sec++; \ | 184 | while(__delta >= USEC_PER_SEC){ \ |
| 182 | (tv).tv_usec -= USEC_PER_SEC; } \ | 185 | (tv).tv_sec++; \ |
| 186 | __delta -= USEC_PER_SEC; \ | ||
| 187 | } \ | ||
| 188 | (tv).tv_usec = __delta; \ | ||
| 183 | }) | 189 | }) |
| 184 | 190 | ||
| 185 | /* Set/check that time is in the "past perfect"; | 191 | /* Set/check that time is in the "past perfect"; |
diff --git a/include/net/protocol.h b/include/net/protocol.h index 3b6dc15c68a5..a225d6371cb1 100644 --- a/include/net/protocol.h +++ b/include/net/protocol.h | |||
| @@ -36,7 +36,8 @@ | |||
| 36 | struct net_protocol { | 36 | struct net_protocol { |
| 37 | int (*handler)(struct sk_buff *skb); | 37 | int (*handler)(struct sk_buff *skb); |
| 38 | void (*err_handler)(struct sk_buff *skb, u32 info); | 38 | void (*err_handler)(struct sk_buff *skb, u32 info); |
| 39 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, int sg); | 39 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, |
| 40 | int features); | ||
| 40 | int no_policy; | 41 | int no_policy; |
| 41 | }; | 42 | }; |
| 42 | 43 | ||
| @@ -49,11 +50,17 @@ struct inet6_protocol | |||
| 49 | struct inet6_skb_parm *opt, | 50 | struct inet6_skb_parm *opt, |
| 50 | int type, int code, int offset, | 51 | int type, int code, int offset, |
| 51 | __u32 info); | 52 | __u32 info); |
| 53 | |||
| 54 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, | ||
| 55 | int features); | ||
| 56 | |||
| 52 | unsigned int flags; /* INET6_PROTO_xxx */ | 57 | unsigned int flags; /* INET6_PROTO_xxx */ |
| 53 | }; | 58 | }; |
| 54 | 59 | ||
| 55 | #define INET6_PROTO_NOPOLICY 0x1 | 60 | #define INET6_PROTO_NOPOLICY 0x1 |
| 56 | #define INET6_PROTO_FINAL 0x2 | 61 | #define INET6_PROTO_FINAL 0x2 |
| 62 | /* This should be set for any extension header which is compatible with GSO. */ | ||
| 63 | #define INET6_PROTO_GSO_EXTHDR 0x4 | ||
| 57 | #endif | 64 | #endif |
| 58 | 65 | ||
| 59 | /* This is used to register socket interfaces for IP protocols. */ | 66 | /* This is used to register socket interfaces for IP protocols. */ |
diff --git a/include/net/scm.h b/include/net/scm.h index 540619cb7160..02daa097cdcd 100644 --- a/include/net/scm.h +++ b/include/net/scm.h | |||
| @@ -19,6 +19,10 @@ struct scm_cookie | |||
| 19 | { | 19 | { |
| 20 | struct ucred creds; /* Skb credentials */ | 20 | struct ucred creds; /* Skb credentials */ |
| 21 | struct scm_fp_list *fp; /* Passed files */ | 21 | struct scm_fp_list *fp; /* Passed files */ |
| 22 | #ifdef CONFIG_SECURITY_NETWORK | ||
| 23 | char *secdata; /* Security context */ | ||
| 24 | u32 seclen; /* Security length */ | ||
| 25 | #endif | ||
| 22 | unsigned long seq; /* Connection seqno */ | 26 | unsigned long seq; /* Connection seqno */ |
| 23 | }; | 27 | }; |
| 24 | 28 | ||
| @@ -48,6 +52,17 @@ static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, | |||
| 48 | return __scm_send(sock, msg, scm); | 52 | return __scm_send(sock, msg, scm); |
| 49 | } | 53 | } |
| 50 | 54 | ||
| 55 | #ifdef CONFIG_SECURITY_NETWORK | ||
| 56 | static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm) | ||
| 57 | { | ||
| 58 | if (test_bit(SOCK_PASSSEC, &sock->flags) && scm->secdata != NULL) | ||
| 59 | put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, scm->seclen, scm->secdata); | ||
| 60 | } | ||
| 61 | #else | ||
| 62 | static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm) | ||
| 63 | { } | ||
| 64 | #endif /* CONFIG_SECURITY_NETWORK */ | ||
| 65 | |||
| 51 | static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg, | 66 | static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg, |
| 52 | struct scm_cookie *scm, int flags) | 67 | struct scm_cookie *scm, int flags) |
| 53 | { | 68 | { |
| @@ -62,6 +77,8 @@ static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg, | |||
| 62 | if (test_bit(SOCK_PASSCRED, &sock->flags)) | 77 | if (test_bit(SOCK_PASSCRED, &sock->flags)) |
| 63 | put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(scm->creds), &scm->creds); | 78 | put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(scm->creds), &scm->creds); |
| 64 | 79 | ||
| 80 | scm_passec(sock, msg, scm); | ||
| 81 | |||
| 65 | if (!scm->fp) | 82 | if (!scm->fp) |
| 66 | return; | 83 | return; |
| 67 | 84 | ||
diff --git a/include/net/sock.h b/include/net/sock.h index 2d8d6adf1616..7b3d6b856946 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -140,6 +140,7 @@ struct sock_common { | |||
| 140 | * @sk_flags: %SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE, %SO_OOBINLINE settings | 140 | * @sk_flags: %SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE, %SO_OOBINLINE settings |
| 141 | * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets | 141 | * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets |
| 142 | * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO) | 142 | * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO) |
| 143 | * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4) | ||
| 143 | * @sk_lingertime: %SO_LINGER l_linger setting | 144 | * @sk_lingertime: %SO_LINGER l_linger setting |
| 144 | * @sk_backlog: always used with the per-socket spinlock held | 145 | * @sk_backlog: always used with the per-socket spinlock held |
| 145 | * @sk_callback_lock: used with the callbacks in the end of this struct | 146 | * @sk_callback_lock: used with the callbacks in the end of this struct |
| @@ -211,6 +212,7 @@ struct sock { | |||
| 211 | gfp_t sk_allocation; | 212 | gfp_t sk_allocation; |
| 212 | int sk_sndbuf; | 213 | int sk_sndbuf; |
| 213 | int sk_route_caps; | 214 | int sk_route_caps; |
| 215 | int sk_gso_type; | ||
| 214 | int sk_rcvlowat; | 216 | int sk_rcvlowat; |
| 215 | unsigned long sk_flags; | 217 | unsigned long sk_flags; |
| 216 | unsigned long sk_lingertime; | 218 | unsigned long sk_lingertime; |
| @@ -383,7 +385,6 @@ enum sock_flags { | |||
| 383 | SOCK_USE_WRITE_QUEUE, /* whether to call sk->sk_write_space in sock_wfree */ | 385 | SOCK_USE_WRITE_QUEUE, /* whether to call sk->sk_write_space in sock_wfree */ |
| 384 | SOCK_DBG, /* %SO_DEBUG setting */ | 386 | SOCK_DBG, /* %SO_DEBUG setting */ |
| 385 | SOCK_RCVTSTAMP, /* %SO_TIMESTAMP setting */ | 387 | 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 */ | 388 | SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */ |
| 388 | SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */ | 389 | SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */ |
| 389 | }; | 390 | }; |
| @@ -1026,15 +1027,20 @@ extern struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie); | |||
| 1026 | 1027 | ||
| 1027 | extern struct dst_entry *sk_dst_check(struct sock *sk, u32 cookie); | 1028 | extern struct dst_entry *sk_dst_check(struct sock *sk, u32 cookie); |
| 1028 | 1029 | ||
| 1030 | static inline int sk_can_gso(const struct sock *sk) | ||
| 1031 | { | ||
| 1032 | return net_gso_ok(sk->sk_route_caps, sk->sk_gso_type); | ||
| 1033 | } | ||
| 1034 | |||
| 1029 | static inline void sk_setup_caps(struct sock *sk, struct dst_entry *dst) | 1035 | static inline void sk_setup_caps(struct sock *sk, struct dst_entry *dst) |
| 1030 | { | 1036 | { |
| 1031 | __sk_dst_set(sk, dst); | 1037 | __sk_dst_set(sk, dst); |
| 1032 | sk->sk_route_caps = dst->dev->features; | 1038 | sk->sk_route_caps = dst->dev->features; |
| 1033 | if (sk->sk_route_caps & NETIF_F_GSO) | 1039 | if (sk->sk_route_caps & NETIF_F_GSO) |
| 1034 | sk->sk_route_caps |= NETIF_F_TSO; | 1040 | sk->sk_route_caps |= NETIF_F_GSO_MASK; |
| 1035 | if (sk->sk_route_caps & NETIF_F_TSO) { | 1041 | if (sk_can_gso(sk)) { |
| 1036 | if (sock_flag(sk, SOCK_NO_LARGESEND) || dst->header_len) | 1042 | if (dst->header_len) |
| 1037 | sk->sk_route_caps &= ~NETIF_F_TSO; | 1043 | sk->sk_route_caps &= ~NETIF_F_GSO_MASK; |
| 1038 | else | 1044 | else |
| 1039 | sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM; | 1045 | sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM; |
| 1040 | } | 1046 | } |
diff --git a/include/net/tcp.h b/include/net/tcp.h index ca3d38dfc00b..3cd803b0d7a5 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -751,7 +751,7 @@ static inline int tcp_is_cwnd_limited(const struct sock *sk, u32 in_flight) | |||
| 751 | if (in_flight >= tp->snd_cwnd) | 751 | if (in_flight >= tp->snd_cwnd) |
| 752 | return 1; | 752 | return 1; |
| 753 | 753 | ||
| 754 | if (!(sk->sk_route_caps & NETIF_F_TSO)) | 754 | if (!sk_can_gso(sk)) |
| 755 | return 0; | 755 | return 0; |
| 756 | 756 | ||
| 757 | left = tp->snd_cwnd - in_flight; | 757 | left = tp->snd_cwnd - in_flight; |
| @@ -1086,7 +1086,7 @@ extern struct request_sock_ops tcp_request_sock_ops; | |||
| 1086 | 1086 | ||
| 1087 | extern int tcp_v4_destroy_sock(struct sock *sk); | 1087 | extern int tcp_v4_destroy_sock(struct sock *sk); |
| 1088 | 1088 | ||
| 1089 | extern struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int sg); | 1089 | extern struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features); |
| 1090 | 1090 | ||
| 1091 | #ifdef CONFIG_PROC_FS | 1091 | #ifdef CONFIG_PROC_FS |
| 1092 | extern int tcp4_proc_init(void); | 1092 | extern int tcp4_proc_init(void); |
diff --git a/include/net/tcp_ecn.h b/include/net/tcp_ecn.h index c6b84397448d..4629d77173f2 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,7 @@ 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 | skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_ECN; | ||
| 59 | } | 59 | } |
| 60 | } else { | 60 | } else { |
| 61 | /* ACK or retransmitted segment: clear ECT|CE */ | 61 | /* ACK or retransmitted segment: clear ECT|CE */ |
