Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e734419 authored by David S. Miller's avatar David S. Miller
Browse files

ipv4: Use inet_csk_route_child_sock() in DCCP and TCP.



Operation order is now transposed, we first create the child
socket then we try to hook up the route.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 77357a95
Loading
Loading
Loading
Loading
+10 −9
Original line number Original line Diff line number Diff line
@@ -396,15 +396,10 @@ struct sock *dccp_v4_request_recv_sock(struct sock *sk, struct sk_buff *skb,
	if (sk_acceptq_is_full(sk))
	if (sk_acceptq_is_full(sk))
		goto exit_overflow;
		goto exit_overflow;


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

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


	sk_setup_caps(newsk, dst);

	newinet		   = inet_sk(newsk);
	newinet		   = inet_sk(newsk);
	ireq		   = inet_rsk(req);
	ireq		   = inet_rsk(req);
	newinet->inet_daddr	= ireq->rmt_addr;
	newinet->inet_daddr	= ireq->rmt_addr;
@@ -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->mc_ttl	   = ip_hdr(skb)->ttl;
	newinet->inet_id   = jiffies;
	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));
	dccp_sync_mss(newsk, dst_mtu(dst));


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


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


EXPORT_SYMBOL_GPL(dccp_v4_request_recv_sock);
EXPORT_SYMBOL_GPL(dccp_v4_request_recv_sock);
+10 −8
Original line number Original line Diff line number Diff line
@@ -1421,15 +1421,11 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
	if (sk_acceptq_is_full(sk))
	if (sk_acceptq_is_full(sk))
		goto exit_overflow;
		goto exit_overflow;


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

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


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


	newtp		      = tcp_sk(newsk);
	newtp		      = tcp_sk(newsk);
	newinet		      = inet_sk(newsk);
	newinet		      = inet_sk(newsk);
@@ -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;
		inet_csk(newsk)->icsk_ext_hdr_len = inet_opt->opt.optlen;
	newinet->inet_id = newtp->write_seq ^ jiffies;
	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_mtup_init(newsk);
	tcp_sync_mss(newsk, dst_mtu(dst));
	tcp_sync_mss(newsk, dst_mtu(dst));
	newtp->advmss = dst_metric_advmss(dst);
	newtp->advmss = dst_metric_advmss(dst);
@@ -1474,10 +1475,8 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
	}
	}
#endif
#endif


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


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