diff options
-rw-r--r-- | include/linux/tcp.h | 2 | ||||
-rw-r--r-- | include/net/inet_connection_sock.h | 26 | ||||
-rw-r--r-- | include/net/tcp.h | 50 | ||||
-rw-r--r-- | include/net/transp_v6.h | 2 | ||||
-rw-r--r-- | net/ipv4/syncookies.c | 4 | ||||
-rw-r--r-- | net/ipv4/tcp.c | 8 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 11 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 11 | ||||
-rw-r--r-- | net/ipv4/tcp_minisocks.c | 8 | ||||
-rw-r--r-- | net/ipv4/tcp_output.c | 17 | ||||
-rw-r--r-- | net/ipv6/ipv6_sockglue.c | 2 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 28 |
12 files changed, 71 insertions, 98 deletions
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 0e1da6602e05..4e1434007f44 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
@@ -295,8 +295,6 @@ struct tcp_sock { | |||
295 | 295 | ||
296 | struct sk_buff_head out_of_order_queue; /* Out of order segments go here */ | 296 | struct sk_buff_head out_of_order_queue; /* Out of order segments go here */ |
297 | 297 | ||
298 | struct tcp_func *af_specific; /* Operations which are AF_INET{4,6} specific */ | ||
299 | |||
300 | __u32 rcv_wnd; /* Current receiver window */ | 298 | __u32 rcv_wnd; /* Current receiver window */ |
301 | __u32 rcv_wup; /* rcv_nxt on last window update sent */ | 299 | __u32 rcv_wup; /* rcv_nxt on last window update sent */ |
302 | __u32 write_seq; /* Tail(+1) of data held in tcp send buffer */ | 300 | __u32 write_seq; /* Tail(+1) of data held in tcp send buffer */ |
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h index ccc81a1c550c..9e20d201e951 100644 --- a/include/net/inet_connection_sock.h +++ b/include/net/inet_connection_sock.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #ifndef _INET_CONNECTION_SOCK_H | 15 | #ifndef _INET_CONNECTION_SOCK_H |
16 | #define _INET_CONNECTION_SOCK_H | 16 | #define _INET_CONNECTION_SOCK_H |
17 | 17 | ||
18 | #include <linux/compiler.h> | ||
18 | #include <linux/ip.h> | 19 | #include <linux/ip.h> |
19 | #include <linux/string.h> | 20 | #include <linux/string.h> |
20 | #include <linux/timer.h> | 21 | #include <linux/timer.h> |
@@ -29,6 +30,29 @@ struct inet_bind_bucket; | |||
29 | struct inet_hashinfo; | 30 | struct inet_hashinfo; |
30 | struct tcp_congestion_ops; | 31 | struct tcp_congestion_ops; |
31 | 32 | ||
33 | /* | ||
34 | * Pointers to address related TCP functions | ||
35 | * (i.e. things that depend on the address family) | ||
36 | */ | ||
37 | struct inet_connection_sock_af_ops { | ||
38 | int (*queue_xmit)(struct sk_buff *skb, int ipfragok); | ||
39 | void (*send_check)(struct sock *sk, int len, | ||
40 | struct sk_buff *skb); | ||
41 | int (*rebuild_header)(struct sock *sk); | ||
42 | int (*conn_request)(struct sock *sk, struct sk_buff *skb); | ||
43 | struct sock *(*syn_recv_sock)(struct sock *sk, struct sk_buff *skb, | ||
44 | struct request_sock *req, | ||
45 | struct dst_entry *dst); | ||
46 | int (*remember_stamp)(struct sock *sk); | ||
47 | __u16 net_header_len; | ||
48 | int (*setsockopt)(struct sock *sk, int level, int optname, | ||
49 | char __user *optval, int optlen); | ||
50 | int (*getsockopt)(struct sock *sk, int level, int optname, | ||
51 | char __user *optval, int __user *optlen); | ||
52 | void (*addr2sockaddr)(struct sock *sk, struct sockaddr *); | ||
53 | int sockaddr_len; | ||
54 | }; | ||
55 | |||
32 | /** inet_connection_sock - INET connection oriented sock | 56 | /** inet_connection_sock - INET connection oriented sock |
33 | * | 57 | * |
34 | * @icsk_accept_queue: FIFO of established children | 58 | * @icsk_accept_queue: FIFO of established children |
@@ -37,6 +61,7 @@ struct tcp_congestion_ops; | |||
37 | * @icsk_retransmit_timer: Resend (no ack) | 61 | * @icsk_retransmit_timer: Resend (no ack) |
38 | * @icsk_rto: Retransmit timeout | 62 | * @icsk_rto: Retransmit timeout |
39 | * @icsk_ca_ops Pluggable congestion control hook | 63 | * @icsk_ca_ops Pluggable congestion control hook |
64 | * @icsk_af_ops Operations which are AF_INET{4,6} specific | ||
40 | * @icsk_ca_state: Congestion control state | 65 | * @icsk_ca_state: Congestion control state |
41 | * @icsk_retransmits: Number of unrecovered [RTO] timeouts | 66 | * @icsk_retransmits: Number of unrecovered [RTO] timeouts |
42 | * @icsk_pending: Scheduled timer event | 67 | * @icsk_pending: Scheduled timer event |
@@ -55,6 +80,7 @@ struct inet_connection_sock { | |||
55 | struct timer_list icsk_delack_timer; | 80 | struct timer_list icsk_delack_timer; |
56 | __u32 icsk_rto; | 81 | __u32 icsk_rto; |
57 | struct tcp_congestion_ops *icsk_ca_ops; | 82 | struct tcp_congestion_ops *icsk_ca_ops; |
83 | struct inet_connection_sock_af_ops *icsk_af_ops; | ||
58 | __u8 icsk_ca_state; | 84 | __u8 icsk_ca_state; |
59 | __u8 icsk_retransmits; | 85 | __u8 icsk_retransmits; |
60 | __u8 icsk_pending; | 86 | __u8 icsk_pending; |
diff --git a/include/net/tcp.h b/include/net/tcp.h index d78025f9fbea..83b117a25c2a 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -225,53 +225,6 @@ extern atomic_t tcp_sockets_allocated; | |||
225 | extern int tcp_memory_pressure; | 225 | extern int tcp_memory_pressure; |
226 | 226 | ||
227 | /* | 227 | /* |
228 | * Pointers to address related TCP functions | ||
229 | * (i.e. things that depend on the address family) | ||
230 | */ | ||
231 | |||
232 | struct tcp_func { | ||
233 | int (*queue_xmit) (struct sk_buff *skb, | ||
234 | int ipfragok); | ||
235 | |||
236 | void (*send_check) (struct sock *sk, | ||
237 | struct tcphdr *th, | ||
238 | int len, | ||
239 | struct sk_buff *skb); | ||
240 | |||
241 | int (*rebuild_header) (struct sock *sk); | ||
242 | |||
243 | int (*conn_request) (struct sock *sk, | ||
244 | struct sk_buff *skb); | ||
245 | |||
246 | struct sock * (*syn_recv_sock) (struct sock *sk, | ||
247 | struct sk_buff *skb, | ||
248 | struct request_sock *req, | ||
249 | struct dst_entry *dst); | ||
250 | |||
251 | int (*remember_stamp) (struct sock *sk); | ||
252 | |||
253 | __u16 net_header_len; | ||
254 | |||
255 | int (*setsockopt) (struct sock *sk, | ||
256 | int level, | ||
257 | int optname, | ||
258 | char __user *optval, | ||
259 | int optlen); | ||
260 | |||
261 | int (*getsockopt) (struct sock *sk, | ||
262 | int level, | ||
263 | int optname, | ||
264 | char __user *optval, | ||
265 | int __user *optlen); | ||
266 | |||
267 | |||
268 | void (*addr2sockaddr) (struct sock *sk, | ||
269 | struct sockaddr *); | ||
270 | |||
271 | int sockaddr_len; | ||
272 | }; | ||
273 | |||
274 | /* | ||
275 | * The next routines deal with comparing 32 bit unsigned ints | 228 | * The next routines deal with comparing 32 bit unsigned ints |
276 | * and worry about wraparound (automatic with unsigned arithmetic). | 229 | * and worry about wraparound (automatic with unsigned arithmetic). |
277 | */ | 230 | */ |
@@ -405,8 +358,7 @@ extern void tcp_parse_options(struct sk_buff *skb, | |||
405 | * TCP v4 functions exported for the inet6 API | 358 | * TCP v4 functions exported for the inet6 API |
406 | */ | 359 | */ |
407 | 360 | ||
408 | extern void tcp_v4_send_check(struct sock *sk, | 361 | extern void tcp_v4_send_check(struct sock *sk, int len, |
409 | struct tcphdr *th, int len, | ||
410 | struct sk_buff *skb); | 362 | struct sk_buff *skb); |
411 | 363 | ||
412 | extern int tcp_v4_conn_request(struct sock *sk, | 364 | extern int tcp_v4_conn_request(struct sock *sk, |
diff --git a/include/net/transp_v6.h b/include/net/transp_v6.h index 4e86f2de6638..61f724c1036f 100644 --- a/include/net/transp_v6.h +++ b/include/net/transp_v6.h | |||
@@ -44,7 +44,7 @@ extern int datagram_send_ctl(struct msghdr *msg, | |||
44 | /* | 44 | /* |
45 | * address family specific functions | 45 | * address family specific functions |
46 | */ | 46 | */ |
47 | extern struct tcp_func ipv4_specific; | 47 | extern struct inet_connection_sock_af_ops ipv4_specific; |
48 | 48 | ||
49 | extern int inet6_destroy_sock(struct sock *sk); | 49 | extern int inet6_destroy_sock(struct sock *sk); |
50 | 50 | ||
diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c index a34e60ea48a1..e20be3331f67 100644 --- a/net/ipv4/syncookies.c +++ b/net/ipv4/syncookies.c | |||
@@ -173,10 +173,10 @@ static inline struct sock *get_cookie_sock(struct sock *sk, struct sk_buff *skb, | |||
173 | struct request_sock *req, | 173 | struct request_sock *req, |
174 | struct dst_entry *dst) | 174 | struct dst_entry *dst) |
175 | { | 175 | { |
176 | struct tcp_sock *tp = tcp_sk(sk); | 176 | struct inet_connection_sock *icsk = inet_csk(sk); |
177 | struct sock *child; | 177 | struct sock *child; |
178 | 178 | ||
179 | child = tp->af_specific->syn_recv_sock(sk, skb, req, dst); | 179 | child = icsk->icsk_af_ops->syn_recv_sock(sk, skb, req, dst); |
180 | if (child) | 180 | if (child) |
181 | inet_csk_reqsk_queue_add(sk, req, child); | 181 | inet_csk_reqsk_queue_add(sk, req, child); |
182 | else | 182 | else |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index ef98b14ac56d..eacfe6a3442c 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -1696,8 +1696,8 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval, | |||
1696 | int err = 0; | 1696 | int err = 0; |
1697 | 1697 | ||
1698 | if (level != SOL_TCP) | 1698 | if (level != SOL_TCP) |
1699 | return tp->af_specific->setsockopt(sk, level, optname, | 1699 | return icsk->icsk_af_ops->setsockopt(sk, level, optname, |
1700 | optval, optlen); | 1700 | optval, optlen); |
1701 | 1701 | ||
1702 | /* This is a string value all the others are int's */ | 1702 | /* This is a string value all the others are int's */ |
1703 | if (optname == TCP_CONGESTION) { | 1703 | if (optname == TCP_CONGESTION) { |
@@ -1939,8 +1939,8 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval, | |||
1939 | int val, len; | 1939 | int val, len; |
1940 | 1940 | ||
1941 | if (level != SOL_TCP) | 1941 | if (level != SOL_TCP) |
1942 | return tp->af_specific->getsockopt(sk, level, optname, | 1942 | return icsk->icsk_af_ops->getsockopt(sk, level, optname, |
1943 | optval, optlen); | 1943 | optval, optlen); |
1944 | 1944 | ||
1945 | if (get_user(len, optlen)) | 1945 | if (get_user(len, optlen)) |
1946 | return -EFAULT; | 1946 | return -EFAULT; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index bf2e23086bce..7de6184d4bd8 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -4071,8 +4071,10 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, | |||
4071 | mb(); | 4071 | mb(); |
4072 | tcp_set_state(sk, TCP_ESTABLISHED); | 4072 | tcp_set_state(sk, TCP_ESTABLISHED); |
4073 | 4073 | ||
4074 | icsk = inet_csk(sk); | ||
4075 | |||
4074 | /* Make sure socket is routed, for correct metrics. */ | 4076 | /* Make sure socket is routed, for correct metrics. */ |
4075 | tp->af_specific->rebuild_header(sk); | 4077 | icsk->icsk_af_ops->rebuild_header(sk); |
4076 | 4078 | ||
4077 | tcp_init_metrics(sk); | 4079 | tcp_init_metrics(sk); |
4078 | 4080 | ||
@@ -4098,8 +4100,6 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, | |||
4098 | sk_wake_async(sk, 0, POLL_OUT); | 4100 | sk_wake_async(sk, 0, POLL_OUT); |
4099 | } | 4101 | } |
4100 | 4102 | ||
4101 | icsk = inet_csk(sk); | ||
4102 | |||
4103 | if (sk->sk_write_pending || | 4103 | if (sk->sk_write_pending || |
4104 | icsk->icsk_accept_queue.rskq_defer_accept || | 4104 | icsk->icsk_accept_queue.rskq_defer_accept || |
4105 | icsk->icsk_ack.pingpong) { | 4105 | icsk->icsk_ack.pingpong) { |
@@ -4220,6 +4220,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
4220 | struct tcphdr *th, unsigned len) | 4220 | struct tcphdr *th, unsigned len) |
4221 | { | 4221 | { |
4222 | struct tcp_sock *tp = tcp_sk(sk); | 4222 | struct tcp_sock *tp = tcp_sk(sk); |
4223 | struct inet_connection_sock *icsk = inet_csk(sk); | ||
4223 | int queued = 0; | 4224 | int queued = 0; |
4224 | 4225 | ||
4225 | tp->rx_opt.saw_tstamp = 0; | 4226 | tp->rx_opt.saw_tstamp = 0; |
@@ -4236,7 +4237,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
4236 | goto discard; | 4237 | goto discard; |
4237 | 4238 | ||
4238 | if(th->syn) { | 4239 | if(th->syn) { |
4239 | if(tp->af_specific->conn_request(sk, skb) < 0) | 4240 | if (icsk->icsk_af_ops->conn_request(sk, skb) < 0) |
4240 | return 1; | 4241 | return 1; |
4241 | 4242 | ||
4242 | /* Now we have several options: In theory there is | 4243 | /* Now we have several options: In theory there is |
@@ -4349,7 +4350,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
4349 | /* Make sure socket is routed, for | 4350 | /* Make sure socket is routed, for |
4350 | * correct metrics. | 4351 | * correct metrics. |
4351 | */ | 4352 | */ |
4352 | tp->af_specific->rebuild_header(sk); | 4353 | icsk->icsk_af_ops->rebuild_header(sk); |
4353 | 4354 | ||
4354 | tcp_init_metrics(sk); | 4355 | tcp_init_metrics(sk); |
4355 | 4356 | ||
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 2aa19c89a94a..704cf2105795 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -86,8 +86,7 @@ int sysctl_tcp_low_latency; | |||
86 | /* Socket used for sending RSTs */ | 86 | /* Socket used for sending RSTs */ |
87 | static struct socket *tcp_socket; | 87 | static struct socket *tcp_socket; |
88 | 88 | ||
89 | void tcp_v4_send_check(struct sock *sk, struct tcphdr *th, int len, | 89 | void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb); |
90 | struct sk_buff *skb); | ||
91 | 90 | ||
92 | struct inet_hashinfo __cacheline_aligned tcp_hashinfo = { | 91 | struct inet_hashinfo __cacheline_aligned tcp_hashinfo = { |
93 | .lhash_lock = RW_LOCK_UNLOCKED, | 92 | .lhash_lock = RW_LOCK_UNLOCKED, |
@@ -645,10 +644,10 @@ out: | |||
645 | } | 644 | } |
646 | 645 | ||
647 | /* This routine computes an IPv4 TCP checksum. */ | 646 | /* This routine computes an IPv4 TCP checksum. */ |
648 | void tcp_v4_send_check(struct sock *sk, struct tcphdr *th, int len, | 647 | void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb) |
649 | struct sk_buff *skb) | ||
650 | { | 648 | { |
651 | struct inet_sock *inet = inet_sk(sk); | 649 | struct inet_sock *inet = inet_sk(sk); |
650 | struct tcphdr *th = skb->h.th; | ||
652 | 651 | ||
653 | if (skb->ip_summed == CHECKSUM_HW) { | 652 | if (skb->ip_summed == CHECKSUM_HW) { |
654 | th->check = ~tcp_v4_check(th, len, inet->saddr, inet->daddr, 0); | 653 | th->check = ~tcp_v4_check(th, len, inet->saddr, inet->daddr, 0); |
@@ -1383,7 +1382,7 @@ int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw) | |||
1383 | return 0; | 1382 | return 0; |
1384 | } | 1383 | } |
1385 | 1384 | ||
1386 | struct tcp_func ipv4_specific = { | 1385 | struct inet_connection_sock_af_ops ipv4_specific = { |
1387 | .queue_xmit = ip_queue_xmit, | 1386 | .queue_xmit = ip_queue_xmit, |
1388 | .send_check = tcp_v4_send_check, | 1387 | .send_check = tcp_v4_send_check, |
1389 | .rebuild_header = inet_sk_rebuild_header, | 1388 | .rebuild_header = inet_sk_rebuild_header, |
@@ -1434,7 +1433,7 @@ static int tcp_v4_init_sock(struct sock *sk) | |||
1434 | sk->sk_write_space = sk_stream_write_space; | 1433 | sk->sk_write_space = sk_stream_write_space; |
1435 | sock_set_flag(sk, SOCK_USE_WRITE_QUEUE); | 1434 | sock_set_flag(sk, SOCK_USE_WRITE_QUEUE); |
1436 | 1435 | ||
1437 | tp->af_specific = &ipv4_specific; | 1436 | icsk->icsk_af_ops = &ipv4_specific; |
1438 | 1437 | ||
1439 | sk->sk_sndbuf = sysctl_tcp_wmem[1]; | 1438 | sk->sk_sndbuf = sysctl_tcp_wmem[1]; |
1440 | sk->sk_rcvbuf = sysctl_tcp_rmem[1]; | 1439 | sk->sk_rcvbuf = sysctl_tcp_rmem[1]; |
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 1b66a2ac4321..9c029683a626 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c | |||
@@ -274,18 +274,18 @@ kill: | |||
274 | void tcp_time_wait(struct sock *sk, int state, int timeo) | 274 | void tcp_time_wait(struct sock *sk, int state, int timeo) |
275 | { | 275 | { |
276 | struct inet_timewait_sock *tw = NULL; | 276 | struct inet_timewait_sock *tw = NULL; |
277 | const struct inet_connection_sock *icsk = inet_csk(sk); | ||
277 | const struct tcp_sock *tp = tcp_sk(sk); | 278 | const struct tcp_sock *tp = tcp_sk(sk); |
278 | int recycle_ok = 0; | 279 | int recycle_ok = 0; |
279 | 280 | ||
280 | if (tcp_death_row.sysctl_tw_recycle && tp->rx_opt.ts_recent_stamp) | 281 | if (tcp_death_row.sysctl_tw_recycle && tp->rx_opt.ts_recent_stamp) |
281 | recycle_ok = tp->af_specific->remember_stamp(sk); | 282 | recycle_ok = icsk->icsk_af_ops->remember_stamp(sk); |
282 | 283 | ||
283 | if (tcp_death_row.tw_count < tcp_death_row.sysctl_max_tw_buckets) | 284 | if (tcp_death_row.tw_count < tcp_death_row.sysctl_max_tw_buckets) |
284 | tw = inet_twsk_alloc(sk, state); | 285 | tw = inet_twsk_alloc(sk, state); |
285 | 286 | ||
286 | if (tw != NULL) { | 287 | if (tw != NULL) { |
287 | struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw); | 288 | struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw); |
288 | const struct inet_connection_sock *icsk = inet_csk(sk); | ||
289 | const int rto = (icsk->icsk_rto << 2) - (icsk->icsk_rto >> 1); | 289 | const int rto = (icsk->icsk_rto << 2) - (icsk->icsk_rto >> 1); |
290 | 290 | ||
291 | tw->tw_rcv_wscale = tp->rx_opt.rcv_wscale; | 291 | tw->tw_rcv_wscale = tp->rx_opt.rcv_wscale; |
@@ -456,7 +456,6 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb, | |||
456 | struct request_sock **prev) | 456 | struct request_sock **prev) |
457 | { | 457 | { |
458 | struct tcphdr *th = skb->h.th; | 458 | struct tcphdr *th = skb->h.th; |
459 | struct tcp_sock *tp = tcp_sk(sk); | ||
460 | u32 flg = tcp_flag_word(th) & (TCP_FLAG_RST|TCP_FLAG_SYN|TCP_FLAG_ACK); | 459 | u32 flg = tcp_flag_word(th) & (TCP_FLAG_RST|TCP_FLAG_SYN|TCP_FLAG_ACK); |
461 | int paws_reject = 0; | 460 | int paws_reject = 0; |
462 | struct tcp_options_received tmp_opt; | 461 | struct tcp_options_received tmp_opt; |
@@ -613,7 +612,8 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb, | |||
613 | * ESTABLISHED STATE. If it will be dropped after | 612 | * ESTABLISHED STATE. If it will be dropped after |
614 | * socket is created, wait for troubles. | 613 | * socket is created, wait for troubles. |
615 | */ | 614 | */ |
616 | child = tp->af_specific->syn_recv_sock(sk, skb, req, NULL); | 615 | child = inet_csk(sk)->icsk_af_ops->syn_recv_sock(sk, skb, |
616 | req, NULL); | ||
617 | if (child == NULL) | 617 | if (child == NULL) |
618 | goto listen_overflow; | 618 | goto listen_overflow; |
619 | 619 | ||
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index b7325e0b406a..af1946c52c37 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -371,7 +371,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, | |||
371 | TCP_ECN_send(sk, tp, skb, tcp_header_size); | 371 | TCP_ECN_send(sk, tp, skb, tcp_header_size); |
372 | } | 372 | } |
373 | 373 | ||
374 | tp->af_specific->send_check(sk, th, skb->len, skb); | 374 | icsk->icsk_af_ops->send_check(sk, skb->len, skb); |
375 | 375 | ||
376 | if (likely(tcb->flags & TCPCB_FLAG_ACK)) | 376 | if (likely(tcb->flags & TCPCB_FLAG_ACK)) |
377 | tcp_event_ack_sent(sk, tcp_skb_pcount(skb)); | 377 | tcp_event_ack_sent(sk, tcp_skb_pcount(skb)); |
@@ -381,7 +381,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, | |||
381 | 381 | ||
382 | TCP_INC_STATS(TCP_MIB_OUTSEGS); | 382 | TCP_INC_STATS(TCP_MIB_OUTSEGS); |
383 | 383 | ||
384 | err = tp->af_specific->queue_xmit(skb, 0); | 384 | err = icsk->icsk_af_ops->queue_xmit(skb, 0); |
385 | if (unlikely(err <= 0)) | 385 | if (unlikely(err <= 0)) |
386 | return err; | 386 | return err; |
387 | 387 | ||
@@ -638,12 +638,11 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len) | |||
638 | unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu) | 638 | unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu) |
639 | { | 639 | { |
640 | struct tcp_sock *tp = tcp_sk(sk); | 640 | struct tcp_sock *tp = tcp_sk(sk); |
641 | int mss_now; | ||
642 | |||
643 | /* Calculate base mss without TCP options: | 641 | /* Calculate base mss without TCP options: |
644 | It is MMS_S - sizeof(tcphdr) of rfc1122 | 642 | It is MMS_S - sizeof(tcphdr) of rfc1122 |
645 | */ | 643 | */ |
646 | mss_now = pmtu - tp->af_specific->net_header_len - sizeof(struct tcphdr); | 644 | int mss_now = (pmtu - inet_csk(sk)->icsk_af_ops->net_header_len - |
645 | sizeof(struct tcphdr)); | ||
647 | 646 | ||
648 | /* Clamp it (mss_clamp does not include tcp options) */ | 647 | /* Clamp it (mss_clamp does not include tcp options) */ |
649 | if (mss_now > tp->rx_opt.mss_clamp) | 648 | if (mss_now > tp->rx_opt.mss_clamp) |
@@ -705,9 +704,9 @@ unsigned int tcp_current_mss(struct sock *sk, int large_allowed) | |||
705 | xmit_size_goal = mss_now; | 704 | xmit_size_goal = mss_now; |
706 | 705 | ||
707 | if (doing_tso) { | 706 | if (doing_tso) { |
708 | xmit_size_goal = 65535 - | 707 | xmit_size_goal = (65535 - |
709 | tp->af_specific->net_header_len - | 708 | inet_csk(sk)->icsk_af_ops->net_header_len - |
710 | tp->ext_header_len - tp->tcp_header_len; | 709 | tp->ext_header_len - tp->tcp_header_len); |
711 | 710 | ||
712 | if (tp->max_window && | 711 | if (tp->max_window && |
713 | (xmit_size_goal > (tp->max_window >> 1))) | 712 | (xmit_size_goal > (tp->max_window >> 1))) |
@@ -1422,7 +1421,7 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | |||
1422 | (sysctl_tcp_retrans_collapse != 0)) | 1421 | (sysctl_tcp_retrans_collapse != 0)) |
1423 | tcp_retrans_try_collapse(sk, skb, cur_mss); | 1422 | tcp_retrans_try_collapse(sk, skb, cur_mss); |
1424 | 1423 | ||
1425 | if(tp->af_specific->rebuild_header(sk)) | 1424 | if (inet_csk(sk)->icsk_af_ops->rebuild_header(sk)) |
1426 | return -EHOSTUNREACH; /* Routing failure or similar. */ | 1425 | return -EHOSTUNREACH; /* Routing failure or similar. */ |
1427 | 1426 | ||
1428 | /* Some Solaris stacks overoptimize and ignore the FIN on a | 1427 | /* Some Solaris stacks overoptimize and ignore the FIN on a |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 3620718defe6..b6b63fa8454c 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -170,7 +170,7 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname, | |||
170 | sock_prot_inc_use(&tcp_prot); | 170 | sock_prot_inc_use(&tcp_prot); |
171 | local_bh_enable(); | 171 | local_bh_enable(); |
172 | sk->sk_prot = &tcp_prot; | 172 | sk->sk_prot = &tcp_prot; |
173 | tp->af_specific = &ipv4_specific; | 173 | inet_csk(sk)->icsk_af_ops = &ipv4_specific; |
174 | sk->sk_socket->ops = &inet_stream_ops; | 174 | sk->sk_socket->ops = &inet_stream_ops; |
175 | sk->sk_family = PF_INET; | 175 | sk->sk_family = PF_INET; |
176 | tcp_sync_mss(sk, tp->pmtu_cookie); | 176 | tcp_sync_mss(sk, tp->pmtu_cookie); |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index c2472d771664..8ce8a1359d2b 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -68,14 +68,14 @@ | |||
68 | 68 | ||
69 | static void tcp_v6_send_reset(struct sk_buff *skb); | 69 | static void tcp_v6_send_reset(struct sk_buff *skb); |
70 | static void tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req); | 70 | static void tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req); |
71 | static void tcp_v6_send_check(struct sock *sk, struct tcphdr *th, int len, | 71 | static void tcp_v6_send_check(struct sock *sk, int len, |
72 | struct sk_buff *skb); | 72 | struct sk_buff *skb); |
73 | 73 | ||
74 | static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb); | 74 | static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb); |
75 | static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok); | 75 | static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok); |
76 | 76 | ||
77 | static struct tcp_func ipv6_mapped; | 77 | static struct inet_connection_sock_af_ops ipv6_mapped; |
78 | static struct tcp_func ipv6_specific; | 78 | static struct inet_connection_sock_af_ops ipv6_specific; |
79 | 79 | ||
80 | int inet6_csk_bind_conflict(const struct sock *sk, | 80 | int inet6_csk_bind_conflict(const struct sock *sk, |
81 | const struct inet_bind_bucket *tb) | 81 | const struct inet_bind_bucket *tb) |
@@ -107,9 +107,7 @@ static int tcp_v6_get_port(struct sock *sk, unsigned short snum) | |||
107 | static void tcp_v6_hash(struct sock *sk) | 107 | static void tcp_v6_hash(struct sock *sk) |
108 | { | 108 | { |
109 | if (sk->sk_state != TCP_CLOSE) { | 109 | if (sk->sk_state != TCP_CLOSE) { |
110 | struct tcp_sock *tp = tcp_sk(sk); | 110 | if (inet_csk(sk)->icsk_af_ops == &ipv6_mapped) { |
111 | |||
112 | if (tp->af_specific == &ipv6_mapped) { | ||
113 | tcp_prot.hash(sk); | 111 | tcp_prot.hash(sk); |
114 | return; | 112 | return; |
115 | } | 113 | } |
@@ -417,14 +415,14 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
417 | sin.sin_port = usin->sin6_port; | 415 | sin.sin_port = usin->sin6_port; |
418 | sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3]; | 416 | sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3]; |
419 | 417 | ||
420 | tp->af_specific = &ipv6_mapped; | 418 | inet_csk(sk)->icsk_af_ops = &ipv6_mapped; |
421 | sk->sk_backlog_rcv = tcp_v4_do_rcv; | 419 | sk->sk_backlog_rcv = tcp_v4_do_rcv; |
422 | 420 | ||
423 | err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin)); | 421 | err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin)); |
424 | 422 | ||
425 | if (err) { | 423 | if (err) { |
426 | tp->ext_header_len = exthdrlen; | 424 | tp->ext_header_len = exthdrlen; |
427 | tp->af_specific = &ipv6_specific; | 425 | inet_csk(sk)->icsk_af_ops = &ipv6_specific; |
428 | sk->sk_backlog_rcv = tcp_v6_do_rcv; | 426 | sk->sk_backlog_rcv = tcp_v6_do_rcv; |
429 | goto failure; | 427 | goto failure; |
430 | } else { | 428 | } else { |
@@ -751,10 +749,10 @@ static int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb) | |||
751 | } | 749 | } |
752 | 750 | ||
753 | 751 | ||
754 | static void tcp_v6_send_check(struct sock *sk, struct tcphdr *th, int len, | 752 | static void tcp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb) |
755 | struct sk_buff *skb) | ||
756 | { | 753 | { |
757 | struct ipv6_pinfo *np = inet6_sk(sk); | 754 | struct ipv6_pinfo *np = inet6_sk(sk); |
755 | struct tcphdr *th = skb->h.th; | ||
758 | 756 | ||
759 | if (skb->ip_summed == CHECKSUM_HW) { | 757 | if (skb->ip_summed == CHECKSUM_HW) { |
760 | th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, 0); | 758 | th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, 0); |
@@ -1070,7 +1068,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1070 | 1068 | ||
1071 | ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr); | 1069 | ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr); |
1072 | 1070 | ||
1073 | newtp->af_specific = &ipv6_mapped; | 1071 | inet_csk(newsk)->icsk_af_ops = &ipv6_mapped; |
1074 | newsk->sk_backlog_rcv = tcp_v4_do_rcv; | 1072 | newsk->sk_backlog_rcv = tcp_v4_do_rcv; |
1075 | newnp->pktoptions = NULL; | 1073 | newnp->pktoptions = NULL; |
1076 | newnp->opt = NULL; | 1074 | newnp->opt = NULL; |
@@ -1084,7 +1082,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1084 | */ | 1082 | */ |
1085 | 1083 | ||
1086 | /* It is tricky place. Until this moment IPv4 tcp | 1084 | /* It is tricky place. Until this moment IPv4 tcp |
1087 | worked with IPv6 af_tcp.af_specific. | 1085 | worked with IPv6 icsk.icsk_af_ops. |
1088 | Sync it now. | 1086 | Sync it now. |
1089 | */ | 1087 | */ |
1090 | tcp_sync_mss(newsk, newtp->pmtu_cookie); | 1088 | tcp_sync_mss(newsk, newtp->pmtu_cookie); |
@@ -1631,7 +1629,7 @@ static int tcp_v6_remember_stamp(struct sock *sk) | |||
1631 | return 0; | 1629 | return 0; |
1632 | } | 1630 | } |
1633 | 1631 | ||
1634 | static struct tcp_func ipv6_specific = { | 1632 | static struct inet_connection_sock_af_ops ipv6_specific = { |
1635 | .queue_xmit = tcp_v6_xmit, | 1633 | .queue_xmit = tcp_v6_xmit, |
1636 | .send_check = tcp_v6_send_check, | 1634 | .send_check = tcp_v6_send_check, |
1637 | .rebuild_header = tcp_v6_rebuild_header, | 1635 | .rebuild_header = tcp_v6_rebuild_header, |
@@ -1650,7 +1648,7 @@ static struct tcp_func ipv6_specific = { | |||
1650 | * TCP over IPv4 via INET6 API | 1648 | * TCP over IPv4 via INET6 API |
1651 | */ | 1649 | */ |
1652 | 1650 | ||
1653 | static struct tcp_func ipv6_mapped = { | 1651 | static struct inet_connection_sock_af_ops ipv6_mapped = { |
1654 | .queue_xmit = ip_queue_xmit, | 1652 | .queue_xmit = ip_queue_xmit, |
1655 | .send_check = tcp_v4_send_check, | 1653 | .send_check = tcp_v4_send_check, |
1656 | .rebuild_header = inet_sk_rebuild_header, | 1654 | .rebuild_header = inet_sk_rebuild_header, |
@@ -1700,7 +1698,7 @@ static int tcp_v6_init_sock(struct sock *sk) | |||
1700 | 1698 | ||
1701 | sk->sk_state = TCP_CLOSE; | 1699 | sk->sk_state = TCP_CLOSE; |
1702 | 1700 | ||
1703 | tp->af_specific = &ipv6_specific; | 1701 | icsk->icsk_af_ops = &ipv6_specific; |
1704 | icsk->icsk_ca_ops = &tcp_init_congestion_ops; | 1702 | icsk->icsk_ca_ops = &tcp_init_congestion_ops; |
1705 | sk->sk_write_space = sk_stream_write_space; | 1703 | sk->sk_write_space = sk_stream_write_space; |
1706 | sock_set_flag(sk, SOCK_USE_WRITE_QUEUE); | 1704 | sock_set_flag(sk, SOCK_USE_WRITE_QUEUE); |