Skip to content

Commit

Permalink
ipv4: Use inet_csk_route_child_sock() in DCCP and TCP.
Browse files Browse the repository at this point in the history
Operation order is now transposed, we first create the child
socket then we try to hook up the route.

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed May 8, 2011
1 parent 77357a9 commit 0e73441
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 17 deletions.
19 changes: 10 additions & 9 deletions net/dccp/ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -396,15 +396,10 @@ struct sock *dccp_v4_request_recv_sock(struct sock *sk, struct sk_buff *skb,
if (sk_acceptq_is_full(sk))
goto exit_overflow;

if (dst == NULL && (dst = inet_csk_route_req(sk, req)) == NULL)
goto exit;

newsk = dccp_create_openreq_child(sk, req, skb);
if (newsk == NULL)
goto exit_nonewsk;

sk_setup_caps(newsk, dst);

newinet = inet_sk(newsk);
ireq = inet_rsk(req);
newinet->inet_daddr = ireq->rmt_addr;
Expand All @@ -416,12 +411,15 @@ struct sock *dccp_v4_request_recv_sock(struct sock *sk, struct sk_buff *skb,
newinet->mc_ttl = ip_hdr(skb)->ttl;
newinet->inet_id = jiffies;

if (dst == NULL && (dst = inet_csk_route_child_sock(sk, newsk, req)) == NULL)
goto put_and_exit;

sk_setup_caps(newsk, dst);

dccp_sync_mss(newsk, dst_mtu(dst));

if (__inet_inherit_port(sk, newsk) < 0) {
sock_put(newsk);
goto exit;
}
if (__inet_inherit_port(sk, newsk) < 0)
goto put_and_exit;
__inet_hash_nolisten(newsk, NULL);

return newsk;
Expand All @@ -433,6 +431,9 @@ struct sock *dccp_v4_request_recv_sock(struct sock *sk, struct sk_buff *skb,
exit:
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
return NULL;
put_and_exit:
sock_put(newsk);
goto exit;
}

EXPORT_SYMBOL_GPL(dccp_v4_request_recv_sock);
Expand Down
18 changes: 10 additions & 8 deletions net/ipv4/tcp_ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -1421,15 +1421,11 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
if (sk_acceptq_is_full(sk))
goto exit_overflow;

if (!dst && (dst = inet_csk_route_req(sk, req)) == NULL)
goto exit;

newsk = tcp_create_openreq_child(sk, req, skb);
if (!newsk)
goto exit_nonewsk;

newsk->sk_gso_type = SKB_GSO_TCPV4;
sk_setup_caps(newsk, dst);

newtp = tcp_sk(newsk);
newinet = inet_sk(newsk);
Expand All @@ -1447,6 +1443,11 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
inet_csk(newsk)->icsk_ext_hdr_len = inet_opt->opt.optlen;
newinet->inet_id = newtp->write_seq ^ jiffies;

if (!dst && (dst = inet_csk_route_child_sock(sk, newsk, req)) == NULL)
goto put_and_exit;

sk_setup_caps(newsk, dst);

tcp_mtup_init(newsk);
tcp_sync_mss(newsk, dst_mtu(dst));
newtp->advmss = dst_metric_advmss(dst);
Expand Down Expand Up @@ -1474,10 +1475,8 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
}
#endif

if (__inet_inherit_port(sk, newsk) < 0) {
sock_put(newsk);
goto exit;
}
if (__inet_inherit_port(sk, newsk) < 0)
goto put_and_exit;
__inet_hash_nolisten(newsk, NULL);

return newsk;
Expand All @@ -1489,6 +1488,9 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
exit:
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
return NULL;
put_and_exit:
sock_put(newsk);
goto exit;
}
EXPORT_SYMBOL(tcp_v4_syn_recv_sock);

Expand Down

0 comments on commit 0e73441

Please sign in to comment.