]> git.hungrycats.org Git - linux/commitdiff
[IPV6] put ipv6_rcv_saddr_equal() common place
authorHideaki Yoshifuji <yoshfuji@linux-ipv6.org>
Tue, 1 Jul 2003 12:00:33 +0000 (22:00 +1000)
committerJames Morris <jmorris@kernel.bkbits.net>
Tue, 1 Jul 2003 12:00:33 +0000 (22:00 +1000)
include/net/addrconf.h
net/ipv6/addrconf.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c

index ff3cf48bf7eea76aa4dbd814704d1d0f4c34a11b..6c653f98fca13f45d28106de6763c357f049a139 100644 (file)
@@ -68,6 +68,8 @@ extern int                    ipv6_dev_get_saddr(struct net_device *dev,
                                               struct in6_addr *saddr,
                                               int onlink);
 extern int                     ipv6_get_lladdr(struct net_device *dev, struct in6_addr *);
+extern int                     ipv6_rcv_saddr_equal(const struct sock *sk, 
+                                                     const struct sock *sk2);
 extern void                    addrconf_join_solict(struct net_device *dev,
                                        struct in6_addr *addr);
 extern void                    addrconf_leave_solict(struct net_device *dev,
index e610a4a6023befddacf2b31124dc63b39d52a12b..c78959ee6847ac08bfbf3fd39d3acc5369bd193e 100644 (file)
@@ -66,6 +66,7 @@
 #include <net/ndisc.h>
 #include <net/ip6_route.h>
 #include <net/addrconf.h>
+#include <net/tcp.h>
 #include <net/ip.h>
 #include <linux/if_tunnel.h>
 #include <linux/rtnetlink.h>
@@ -969,6 +970,43 @@ struct inet6_ifaddr * ipv6_get_ifaddr(struct in6_addr *addr, struct net_device *
        return ifp;
 }
 
+int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2)
+{
+       struct ipv6_pinfo *np = inet6_sk(sk);
+       int addr_type = ipv6_addr_type(&np->rcv_saddr);
+
+       if (!inet_sk(sk2)->rcv_saddr && !ipv6_only_sock(sk))
+               return 1;
+
+       if (sk2->sk_family == AF_INET6 &&
+           ipv6_addr_any(&inet6_sk(sk2)->rcv_saddr) &&
+           !(ipv6_only_sock(sk2) && addr_type == IPV6_ADDR_MAPPED))
+               return 1;
+
+       if (addr_type == IPV6_ADDR_ANY &&
+           (!ipv6_only_sock(sk) ||
+            !(sk2->sk_family == AF_INET6 ?
+              (ipv6_addr_type(&inet6_sk(sk2)->rcv_saddr) == IPV6_ADDR_MAPPED) :
+               1)))
+               return 1;
+
+       if (sk2->sk_family == AF_INET6 &&
+           !ipv6_addr_cmp(&np->rcv_saddr,
+                          (sk2->sk_state != TCP_TIME_WAIT ?
+                           &inet6_sk(sk2)->rcv_saddr :
+                           &tcptw_sk(sk)->tw_v6_rcv_saddr)))
+               return 1;
+
+       if (addr_type == IPV6_ADDR_MAPPED &&
+           !ipv6_only_sock(sk2) &&
+           (!inet_sk(sk2)->rcv_saddr ||
+            !inet_sk(sk)->rcv_saddr ||
+            inet_sk(sk)->rcv_saddr == inet_sk(sk2)->rcv_saddr))
+               return 1;
+
+       return 0;
+}
+
 /* Gets referenced address, destroys ifaddr */
 
 void addrconf_dad_failure(struct inet6_ifaddr *ifp)
index b5d18871ecd3c08d2a945ad86b1dac06068ad933..d22230f166ad405b9d54f96b1f01e454f0d7ac97 100644 (file)
@@ -93,43 +93,6 @@ static __inline__ int tcp_v6_sk_hashfn(struct sock *sk)
        return tcp_v6_hashfn(laddr, lport, faddr, fport);
 }
 
-static inline int ipv6_rcv_saddr_equal(struct sock *sk, struct sock *sk2)
-{
-       struct ipv6_pinfo *np = inet6_sk(sk);
-       int addr_type = ipv6_addr_type(&np->rcv_saddr);
-
-       if (!inet_sk(sk2)->rcv_saddr && !ipv6_only_sock(sk))
-               return 1;
-
-       if (sk2->sk_family == AF_INET6 &&
-           ipv6_addr_any(&inet6_sk(sk2)->rcv_saddr) &&
-           !(ipv6_only_sock(sk2) && addr_type == IPV6_ADDR_MAPPED))
-               return 1;
-
-       if (addr_type == IPV6_ADDR_ANY &&
-           (!ipv6_only_sock(sk) ||
-            !(sk2->sk_family == AF_INET6 ?
-              (ipv6_addr_type(&inet6_sk(sk2)->rcv_saddr) == IPV6_ADDR_MAPPED) :
-               1)))
-               return 1;
-
-       if (sk2->sk_family == AF_INET6 &&
-           !ipv6_addr_cmp(&np->rcv_saddr,
-                          (sk2->sk_state != TCP_TIME_WAIT ?
-                           &inet6_sk(sk2)->rcv_saddr :
-                           &((struct tcp_tw_bucket *)sk)->tw_v6_rcv_saddr)))
-               return 1;
-
-       if (addr_type == IPV6_ADDR_MAPPED &&
-           !ipv6_only_sock(sk2) &&
-           (!inet_sk(sk2)->rcv_saddr ||
-            !inet_sk(sk)->rcv_saddr ||
-            inet_sk(sk)->rcv_saddr == inet_sk(sk2)->rcv_saddr))
-               return 1;
-
-       return 0;
-}
-
 static inline int tcp_v6_bind_conflict(struct sock *sk,
                                       struct tcp_bind_bucket *tb)
 {
index e797bd8f69137df7dad1b4c727aab77495699f53..cd81b99b27c09597a618d38f67a6dc52a3cccdcd 100644 (file)
 
 DEFINE_SNMP_STAT(struct udp_mib, udp_stats_in6);
 
-/* XXX This is identical to tcp_ipv6.c:ipv6_rcv_saddr_equal, put
- * XXX it somewhere common. -DaveM
- */
-static __inline__ int udv6_rcv_saddr_equal(struct sock *sk, struct sock *sk2)
-{
-       struct ipv6_pinfo *np = inet6_sk(sk);
-       int addr_type = ipv6_addr_type(&np->rcv_saddr);
-
-       if (!inet_sk(sk2)->rcv_saddr && !ipv6_only_sock(sk))
-               return 1;
-
-       if (sk2->sk_family == AF_INET6 && 
-           ipv6_addr_any(&inet6_sk(sk2)->rcv_saddr) &&
-           !(ipv6_only_sock(sk2) && addr_type == IPV6_ADDR_MAPPED))
-               return 1;
-
-       if (addr_type == IPV6_ADDR_ANY && 
-           (!ipv6_only_sock(sk) || 
-            !(sk2->sk_family == AF_INET6 ?
-              (ipv6_addr_type(&inet6_sk(sk2)->rcv_saddr) == IPV6_ADDR_MAPPED) : 1)))
-               return 1;
-
-       if (sk2->sk_family == AF_INET6 && 
-           !ipv6_addr_cmp(&inet6_sk(sk)->rcv_saddr,
-                          &inet6_sk(sk2)->rcv_saddr))
-               return 1;
-
-       if (addr_type == IPV6_ADDR_MAPPED &&
-           !ipv6_only_sock(sk2) &&
-           (!inet_sk(sk2)->rcv_saddr || 
-            !inet_sk(sk)->rcv_saddr ||
-            inet_sk(sk)->rcv_saddr == inet_sk(sk2)->rcv_saddr))
-               return 1;
-
-       return 0;
-}
-
 /* Grrr, addr_type already calculated by caller, but I don't want
  * to add some silly "cookie" argument to this method just for that.
  */
@@ -151,7 +114,7 @@ gotit:
                            sk2 != sk &&
                            sk2->sk_bound_dev_if == sk->sk_bound_dev_if &&
                            (!sk2->sk_reuse || !sk->sk_reuse) &&
-                           udv6_rcv_saddr_equal(sk, sk2))
+                           ipv6_rcv_saddr_equal(sk, sk2))
                                goto fail;
                }
        }