diff options
| author | David S. Miller <davem@davemloft.net> | 2011-05-18 18:32:03 -0400 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-05-18 18:32:03 -0400 | 
| commit | 6bd023f3dddfc7c5f660089598c10e1f4167083b (patch) | |
| tree | 925a7a31d3db434cfda8679cb46e466697ef8bdd | |
| parent | 6882f933ccee5c3a86443ffc7621ce888b93ab6b (diff) | |
| download | olio-linux-3.10-6bd023f3dddfc7c5f660089598c10e1f4167083b.tar.xz olio-linux-3.10-6bd023f3dddfc7c5f660089598c10e1f4167083b.zip  | |
ipv4: Make caller provide flowi4 key to inet_csk_route_req().
This way the caller can get at the fully resolved fl4->{daddr,saddr}
etc.
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | include/net/inet_connection_sock.h | 1 | ||||
| -rw-r--r-- | net/dccp/ipv4.c | 3 | ||||
| -rw-r--r-- | net/ipv4/inet_connection_sock.c | 10 | ||||
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 6 | 
4 files changed, 12 insertions, 8 deletions
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h index 96546cae1cb..e6db62e756d 100644 --- a/include/net/inet_connection_sock.h +++ b/include/net/inet_connection_sock.h @@ -249,6 +249,7 @@ extern int inet_csk_bind_conflict(const struct sock *sk,  extern int inet_csk_get_port(struct sock *sk, unsigned short snum);  extern struct dst_entry* inet_csk_route_req(struct sock *sk, +					    struct flowi4 *fl4,  					    const struct request_sock *req);  extern struct dst_entry* inet_csk_route_child_sock(struct sock *sk,  						   struct sock *newsk, diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index 46b15e9e9b5..8c36adfd191 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c @@ -497,8 +497,9 @@ static int dccp_v4_send_response(struct sock *sk, struct request_sock *req,  	int err = -1;  	struct sk_buff *skb;  	struct dst_entry *dst; +	struct flowi4 fl4; -	dst = inet_csk_route_req(sk, req); +	dst = inet_csk_route_req(sk, &fl4, req);  	if (dst == NULL)  		goto out; diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 3a2ba5632df..61fac4cabc7 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c @@ -350,24 +350,24 @@ void inet_csk_reset_keepalive_timer(struct sock *sk, unsigned long len)  EXPORT_SYMBOL(inet_csk_reset_keepalive_timer);  struct dst_entry *inet_csk_route_req(struct sock *sk, +				     struct flowi4 *fl4,  				     const struct request_sock *req)  {  	struct rtable *rt;  	const struct inet_request_sock *ireq = inet_rsk(req);  	struct ip_options_rcu *opt = inet_rsk(req)->opt;  	struct net *net = sock_net(sk); -	struct flowi4 fl4; -	flowi4_init_output(&fl4, sk->sk_bound_dev_if, sk->sk_mark, +	flowi4_init_output(fl4, sk->sk_bound_dev_if, sk->sk_mark,  			   RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE,  			   sk->sk_protocol, inet_sk_flowi_flags(sk),  			   (opt && opt->opt.srr) ? opt->opt.faddr : ireq->rmt_addr,  			   ireq->loc_addr, ireq->rmt_port, inet_sk(sk)->inet_sport); -	security_req_classify_flow(req, flowi4_to_flowi(&fl4)); -	rt = ip_route_output_flow(net, &fl4, sk); +	security_req_classify_flow(req, flowi4_to_flowi(fl4)); +	rt = ip_route_output_flow(net, fl4, sk);  	if (IS_ERR(rt))  		goto no_route; -	if (opt && opt->opt.is_strictroute && fl4.daddr != rt->rt_gateway) +	if (opt && opt->opt.is_strictroute && fl4->daddr != rt->rt_gateway)  		goto route_err;  	return &rt->dst; diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index f67fb34e16e..7e0bc604ebd 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -769,11 +769,12 @@ static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst,  			      struct request_values *rvp)  {  	const struct inet_request_sock *ireq = inet_rsk(req); +	struct flowi4 fl4;  	int err = -1;  	struct sk_buff * skb;  	/* First, grab a route. */ -	if (!dst && (dst = inet_csk_route_req(sk, req)) == NULL) +	if (!dst && (dst = inet_csk_route_req(sk, &fl4, req)) == NULL)  		return -1;  	skb = tcp_make_synack(sk, dst, req, rvp); @@ -1338,6 +1339,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)  		req->cookie_ts = tmp_opt.tstamp_ok;  	} else if (!isn) {  		struct inet_peer *peer = NULL; +		struct flowi4 fl4;  		/* VJ's idea. We save last timestamp seen  		 * from the destination in peer table, when entering @@ -1350,7 +1352,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)  		 */  		if (tmp_opt.saw_tstamp &&  		    tcp_death_row.sysctl_tw_recycle && -		    (dst = inet_csk_route_req(sk, req)) != NULL && +		    (dst = inet_csk_route_req(sk, &fl4, req)) != NULL &&  		    (peer = rt_get_peer((struct rtable *)dst)) != NULL &&  		    peer->daddr.addr.a4 == saddr) {  			inet_peer_refcheck(peer);  |