diff options
Diffstat (limited to 'net/ipv4/inet_connection_sock.c')
-rw-r--r-- | net/ipv4/inet_connection_sock.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 0c1ae68ee84b..bd1278a2d828 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -30,20 +30,22 @@ EXPORT_SYMBOL(inet_csk_timer_bug_msg); | |||
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | /* | 32 | /* |
33 | * This array holds the first and last local port number. | 33 | * This struct holds the first and last local port number. |
34 | */ | 34 | */ |
35 | int sysctl_local_port_range[2] = { 32768, 61000 }; | 35 | struct local_ports sysctl_local_ports __read_mostly = { |
36 | DEFINE_SEQLOCK(sysctl_port_range_lock); | 36 | .lock = SEQLOCK_UNLOCKED, |
37 | .range = { 32768, 61000 }, | ||
38 | }; | ||
37 | 39 | ||
38 | void inet_get_local_port_range(int *low, int *high) | 40 | void inet_get_local_port_range(int *low, int *high) |
39 | { | 41 | { |
40 | unsigned seq; | 42 | unsigned seq; |
41 | do { | 43 | do { |
42 | seq = read_seqbegin(&sysctl_port_range_lock); | 44 | seq = read_seqbegin(&sysctl_local_ports.lock); |
43 | 45 | ||
44 | *low = sysctl_local_port_range[0]; | 46 | *low = sysctl_local_ports.range[0]; |
45 | *high = sysctl_local_port_range[1]; | 47 | *high = sysctl_local_ports.range[1]; |
46 | } while (read_seqretry(&sysctl_port_range_lock, seq)); | 48 | } while (read_seqretry(&sysctl_local_ports.lock, seq)); |
47 | } | 49 | } |
48 | EXPORT_SYMBOL(inet_get_local_port_range); | 50 | EXPORT_SYMBOL(inet_get_local_port_range); |
49 | 51 | ||
@@ -335,6 +337,7 @@ struct dst_entry* inet_csk_route_req(struct sock *sk, | |||
335 | .saddr = ireq->loc_addr, | 337 | .saddr = ireq->loc_addr, |
336 | .tos = RT_CONN_FLAGS(sk) } }, | 338 | .tos = RT_CONN_FLAGS(sk) } }, |
337 | .proto = sk->sk_protocol, | 339 | .proto = sk->sk_protocol, |
340 | .flags = inet_sk_flowi_flags(sk), | ||
338 | .uli_u = { .ports = | 341 | .uli_u = { .ports = |
339 | { .sport = inet_sk(sk)->sport, | 342 | { .sport = inet_sk(sk)->sport, |
340 | .dport = ireq->rmt_port } } }; | 343 | .dport = ireq->rmt_port } } }; |
@@ -515,6 +518,8 @@ struct sock *inet_csk_clone(struct sock *sk, const struct request_sock *req, | |||
515 | newicsk->icsk_bind_hash = NULL; | 518 | newicsk->icsk_bind_hash = NULL; |
516 | 519 | ||
517 | inet_sk(newsk)->dport = inet_rsk(req)->rmt_port; | 520 | inet_sk(newsk)->dport = inet_rsk(req)->rmt_port; |
521 | inet_sk(newsk)->num = ntohs(inet_rsk(req)->loc_port); | ||
522 | inet_sk(newsk)->sport = inet_rsk(req)->loc_port; | ||
518 | newsk->sk_write_space = sk_stream_write_space; | 523 | newsk->sk_write_space = sk_stream_write_space; |
519 | 524 | ||
520 | newicsk->icsk_retransmits = 0; | 525 | newicsk->icsk_retransmits = 0; |