upgrade to linux 2.6.10-1.12_FC2
[linux-2.6.git] / net / ipv6 / tcp_ipv6.c
index 4f77617..3a5fd62 100644 (file)
@@ -262,7 +262,7 @@ static struct sock *tcp_v6_lookup_listener(struct in6_addr *daddr, unsigned shor
                        
                        score = 1;
                        if (!ipv6_addr_any(&np->rcv_saddr)) {
-                               if (ipv6_addr_cmp(&np->rcv_saddr, daddr))
+                               if (!ipv6_addr_equal(&np->rcv_saddr, daddr))
                                        continue;
                                score++;
                        }
@@ -321,8 +321,8 @@ static inline struct sock *__tcp_v6_lookup_established(struct in6_addr *saddr, u
 
                if(*((__u32 *)&(tw->tw_dport))  == ports        &&
                   sk->sk_family                == PF_INET6) {
-                       if(!ipv6_addr_cmp(&tw->tw_v6_daddr, saddr)      &&
-                          !ipv6_addr_cmp(&tw->tw_v6_rcv_saddr, daddr)  &&
+                       if(ipv6_addr_equal(&tw->tw_v6_daddr, saddr)     &&
+                          ipv6_addr_equal(&tw->tw_v6_rcv_saddr, daddr) &&
                           (!sk->sk_bound_dev_if || sk->sk_bound_dev_if == dif))
                                goto hit;
                }
@@ -364,6 +364,8 @@ inline struct sock *tcp_v6_lookup(struct in6_addr *saddr, u16 sport,
        return sk;
 }
 
+EXPORT_SYMBOL_GPL(tcp_v6_lookup);
+
 
 /*
  * Open request hash tables.
@@ -404,8 +406,8 @@ static struct open_request *tcp_v6_search_req(struct tcp_opt *tp,
             prev = &req->dl_next) {
                if (req->rmt_port == rport &&
                    req->class->family == AF_INET6 &&
-                   !ipv6_addr_cmp(&req->af.v6_req.rmt_addr, raddr) &&
-                   !ipv6_addr_cmp(&req->af.v6_req.loc_addr, laddr) &&
+                   ipv6_addr_equal(&req->af.v6_req.rmt_addr, raddr) &&
+                   ipv6_addr_equal(&req->af.v6_req.loc_addr, laddr) &&
                    (!req->af.v6_req.iif || req->af.v6_req.iif == iif)) {
                        BUG_TRAP(req->sk == NULL);
                        *prevp = prev;
@@ -461,8 +463,8 @@ static int tcp_v6_check_established(struct sock *sk)
 
                if(*((__u32 *)&(tw->tw_dport))  == ports        &&
                   sk2->sk_family               == PF_INET6     &&
-                  !ipv6_addr_cmp(&tw->tw_v6_daddr, saddr)      &&
-                  !ipv6_addr_cmp(&tw->tw_v6_rcv_saddr, daddr)  &&
+                  ipv6_addr_equal(&tw->tw_v6_daddr, saddr)     &&
+                  ipv6_addr_equal(&tw->tw_v6_rcv_saddr, daddr) &&
                   sk2->sk_bound_dev_if == sk->sk_bound_dev_if) {
                        struct tcp_opt *tp = tcp_sk(sk);
 
@@ -608,7 +610,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
        }
 
        if (tp->ts_recent_stamp &&
-           ipv6_addr_cmp(&np->daddr, &usin->sin6_addr)) {
+           !ipv6_addr_equal(&np->daddr, &usin->sin6_addr)) {
                tp->ts_recent = 0;
                tp->ts_recent_stamp = 0;
                tp->write_seq = 0;
@@ -1835,6 +1837,7 @@ static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok)
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct flowi fl;
        struct dst_entry *dst;
+       struct in6_addr *final_p = NULL, final;
 
        memset(&fl, 0, sizeof(fl));
        fl.proto = IPPROTO_TCP;
@@ -1848,7 +1851,9 @@ static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok)
 
        if (np->opt && np->opt->srcrt) {
                struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
+               ipv6_addr_copy(&final, &fl.fl6_dst);
                ipv6_addr_copy(&fl.fl6_dst, rt0->addr);
+               final_p = &final;
        }
 
        dst = __sk_dst_check(sk, np->dst_cookie);
@@ -1861,6 +1866,9 @@ static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok)
                        return err;
                }
 
+               if (final_p)
+                       ipv6_addr_copy(&fl.fl6_dst, final_p);
+
                if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
                        sk->sk_route_caps = 0;
                        dst_release(dst);
@@ -2157,6 +2165,7 @@ void tcp6_proc_exit(void)
 
 struct proto tcpv6_prot = {
        .name                   = "TCPv6",
+       .owner                  = THIS_MODULE,
        .close                  = tcp_close,
        .connect                = tcp_v6_connect,
        .disconnect             = tcp_disconnect,