]> Pileus Git - ~andy/linux/blobdiff - net/ipv4/tcp_ipv4.c
inet: Create and use rt{,6}_get_peer_create().
[~andy/linux] / net / ipv4 / tcp_ipv4.c
index a43b87dfe800c043c7fcc65af316b4d193ab3455..833e8d96a63618ada21e9dc1dc387cdbcee6a338 100644 (file)
@@ -824,7 +824,8 @@ static void tcp_v4_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
  */
 static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst,
                              struct request_sock *req,
-                             struct request_values *rvp)
+                             struct request_values *rvp,
+                             u16 queue_mapping)
 {
        const struct inet_request_sock *ireq = inet_rsk(req);
        struct flowi4 fl4;
@@ -840,13 +841,13 @@ static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst,
        if (skb) {
                __tcp_v4_send_check(skb, ireq->loc_addr, ireq->rmt_addr);
 
+               skb_set_queue_mapping(skb, queue_mapping);
                err = ip_build_and_send_pkt(skb, sk, ireq->loc_addr,
                                            ireq->rmt_addr,
                                            ireq->opt);
                err = net_xmit_eval(err);
        }
 
-       dst_release(dst);
        return err;
 }
 
@@ -854,7 +855,7 @@ static int tcp_v4_rtx_synack(struct sock *sk, struct request_sock *req,
                              struct request_values *rvp)
 {
        TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS);
-       return tcp_v4_send_synack(sk, NULL, req, rvp);
+       return tcp_v4_send_synack(sk, NULL, req, rvp, 0);
 }
 
 /*
@@ -1422,7 +1423,8 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
        tcp_rsk(req)->snt_synack = tcp_time_stamp;
 
        if (tcp_v4_send_synack(sk, dst, req,
-                              (struct request_values *)&tmp_ext) ||
+                              (struct request_values *)&tmp_ext,
+                              skb_get_queue_mapping(skb)) ||
            want_cookie)
                goto drop_and_free;
 
@@ -1822,16 +1824,15 @@ struct inet_peer *tcp_v4_get_peer(struct sock *sk, bool *release_it)
 {
        struct rtable *rt = (struct rtable *) __sk_dst_get(sk);
        struct inet_sock *inet = inet_sk(sk);
+       struct net *net = sock_net(sk);
        struct inet_peer *peer;
 
        if (!rt ||
            inet->cork.fl.u.ip4.daddr != inet->inet_daddr) {
-               peer = inet_getpeer_v4(inet->inet_daddr, 1);
+               peer = inet_getpeer_v4(net, inet->inet_daddr, 1);
                *release_it = true;
        } else {
-               if (!rt->peer)
-                       rt_bind_peer(rt, inet->inet_daddr, 1);
-               peer = rt->peer;
+               peer = rt_get_peer_create(rt, inet->inet_daddr);
                *release_it = false;
        }
 
@@ -1842,8 +1843,9 @@ EXPORT_SYMBOL(tcp_v4_get_peer);
 void *tcp_v4_tw_get_peer(struct sock *sk)
 {
        const struct inet_timewait_sock *tw = inet_twsk(sk);
+       struct net *net = sock_net(sk);
 
-       return inet_getpeer_v4(tw->tw_daddr, 1);
+       return inet_getpeer_v4(net, tw->tw_daddr, 1);
 }
 EXPORT_SYMBOL(tcp_v4_tw_get_peer);