vserver 1.9.5.x5
[linux-2.6.git] / net / ipv6 / raw.c
index c73d720..be23939 100644 (file)
@@ -56,7 +56,7 @@
 #include <linux/seq_file.h>
 
 struct hlist_head raw_v6_htable[RAWV6_HTABLE_SIZE];
-rwlock_t raw_v6_lock = RW_LOCK_UNLOCKED;
+DEFINE_RWLOCK(raw_v6_lock);
 
 static void raw_v6_hash(struct sock *sk)
 {
@@ -90,11 +90,11 @@ struct sock *__raw_v6_lookup(struct sock *sk, unsigned short num,
                        struct ipv6_pinfo *np = inet6_sk(sk);
 
                        if (!ipv6_addr_any(&np->daddr) &&
-                           ipv6_addr_cmp(&np->daddr, rmt_addr))
+                           !ipv6_addr_equal(&np->daddr, rmt_addr))
                                continue;
 
                        if (!ipv6_addr_any(&np->rcv_saddr)) {
-                               if (!ipv6_addr_cmp(&np->rcv_saddr, loc_addr))
+                               if (ipv6_addr_equal(&np->rcv_saddr, loc_addr))
                                        goto found;
                                if (is_multicast &&
                                    inet6_mc_check(sk, loc_addr, rmt_addr))
@@ -115,10 +115,10 @@ found:
 static __inline__ int icmpv6_filter(struct sock *sk, struct sk_buff *skb)
 {
        struct icmp6hdr *icmph;
-       struct raw6_opt *opt = raw6_sk(sk);
+       struct raw6_sock *rp = raw6_sk(sk);
 
        if (pskb_may_pull(skb, sizeof(struct icmp6hdr))) {
-               __u32 *data = &opt->filter.data[0];
+               __u32 *data = &rp->filter.data[0];
                int bit_nr;
 
                icmph = (struct icmp6hdr *) skb->data;
@@ -178,7 +178,7 @@ out:
 /* This cleans up af_inet6 a bit. -DaveM */
 static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 {
-       struct inet_opt *inet = inet_sk(sk);
+       struct inet_sock *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct sockaddr_in6 *addr = (struct sockaddr_in6 *) uaddr;
        __u32 v4addr = 0;
@@ -253,7 +253,7 @@ void rawv6_err(struct sock *sk, struct sk_buff *skb,
               struct inet6_skb_parm *opt,
               int type, int code, int offset, u32 info)
 {
-       struct inet_opt *inet = inet_sk(sk);
+       struct inet_sock *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
        int err;
        int harderr;
@@ -314,15 +314,15 @@ static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb)
  */
 int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
 {
-       struct inet_opt *inet = inet_sk(sk);
-       struct raw6_opt *raw_opt = raw6_sk(sk);
+       struct inet_sock *inet = inet_sk(sk);
+       struct raw6_sock *rp = raw6_sk(sk);
 
         if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) {
                 kfree_skb(skb);
                 return NET_RX_DROP;
         }
 
-       if (!raw_opt->checksum)
+       if (!rp->checksum)
                skb->ip_summed = CHECKSUM_UNNECESSARY;
 
        if (skb->ip_summed != CHECKSUM_UNNECESSARY) {
@@ -451,21 +451,22 @@ csum_copy_err:
        goto out_free;
 }
 
-static int rawv6_push_pending_frames(struct sock *sk, struct flowi *fl, struct raw6_opt *opt, int len)
+static int rawv6_push_pending_frames(struct sock *sk, struct flowi *fl,
+                                    struct raw6_sock *rp, int len)
 {
        struct sk_buff *skb;
        int err = 0;
        u16 *csum;
        u32 tmp_csum;
 
-       if (!opt->checksum)
+       if (!rp->checksum)
                goto send;
 
        if ((skb = skb_peek(&sk->sk_write_queue)) == NULL)
                goto out;
 
-       if (opt->offset + 1 < len)
-               csum = (u16 *)(skb->h.raw + opt->offset);
+       if (rp->offset + 1 < len)
+               csum = (u16 *)(skb->h.raw + rp->offset);
        else {
                err = -EINVAL;
                goto out;
@@ -505,7 +506,7 @@ static int rawv6_send_hdrinc(struct sock *sk, void *from, int length,
                        struct flowi *fl, struct rt6_info *rt, 
                        unsigned int flags)
 {
-       struct inet_opt *inet = inet_sk(sk);
+       struct inet_sock *inet = inet_sk(sk);
        struct ipv6hdr *iph;
        struct sk_buff *skb;
        unsigned int hh_len;
@@ -607,9 +608,9 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
        struct ipv6_txoptions opt_space;
        struct sockaddr_in6 * sin6 = (struct sockaddr_in6 *) msg->msg_name;
        struct in6_addr *daddr, *final_p = NULL, final;
-       struct inet_opt *inet = inet_sk(sk);
+       struct inet_sock *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
-       struct raw6_opt *raw_opt = raw6_sk(sk);
+       struct raw6_sock *rp = raw6_sk(sk);
        struct ipv6_txoptions *opt = NULL;
        struct ip6_flowlabel *flowlabel = NULL;
        struct dst_entry *dst = NULL;
@@ -639,7 +640,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
                        return -EINVAL;
 
                if (sin6->sin6_family && sin6->sin6_family != AF_INET6) 
-                       return(-EINVAL);
+                       return(-EAFNOSUPPORT);
 
                /* port is the proto value [0..255] carried in nexthdr */
                proto = ntohs(sin6->sin6_port);
@@ -668,7 +669,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
                 * sk->sk_dst_cache.
                 */
                if (sk->sk_state == TCP_ESTABLISHED &&
-                   !ipv6_addr_cmp(daddr, &np->daddr))
+                   ipv6_addr_equal(daddr, &np->daddr))
                        daddr = &np->daddr;
 
                if (addr_len >= sizeof(struct sockaddr_in6) &&
@@ -771,11 +772,11 @@ back_from_confirm:
                if (err)
                        ip6_flush_pending_frames(sk);
                else if (!(msg->msg_flags & MSG_MORE))
-                       err = rawv6_push_pending_frames(sk, &fl, raw_opt, len);
+                       err = rawv6_push_pending_frames(sk, &fl, rp, len);
        }
 done:
        ip6_dst_store(sk, dst,
-                     !ipv6_addr_cmp(&fl.fl6_dst, &np->daddr) ?
+                     ipv6_addr_equal(&fl.fl6_dst, &np->daddr) ?
                      &np->daddr : NULL);
        if (err > 0)
                err = np->recverr ? net_xmit_errno(err) : 0;
@@ -838,7 +839,7 @@ static int rawv6_geticmpfilter(struct sock *sk, int level, int optname,
 static int rawv6_setsockopt(struct sock *sk, int level, int optname, 
                            char __user *optval, int optlen)
 {
-       struct raw6_opt *opt = raw6_sk(sk);
+       struct raw6_sock *rp = raw6_sk(sk);
        int val;
 
        switch(level) {
@@ -868,10 +869,10 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname,
                        if (val > 0 && (val&1))
                                return(-EINVAL);
                        if (val < 0) {
-                               opt->checksum = 0;
+                               rp->checksum = 0;
                        } else {
-                               opt->checksum = 1;
-                               opt->offset = val;
+                               rp->checksum = 1;
+                               rp->offset = val;
                        }
 
                        return 0;
@@ -885,7 +886,7 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname,
 static int rawv6_getsockopt(struct sock *sk, int level, int optname, 
                            char __user *optval, int __user *optlen)
 {
-       struct raw6_opt *opt = raw6_sk(sk);
+       struct raw6_sock *rp = raw6_sk(sk);
        int val, len;
 
        switch(level) {
@@ -910,10 +911,10 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname,
 
        switch (optname) {
        case IPV6_CHECKSUM:
-               if (opt->checksum == 0)
+               if (rp->checksum == 0)
                        val = -1;
                else
-                       val = opt->offset;
+                       val = rp->offset;
                break;
 
        default:
@@ -966,15 +967,16 @@ static void rawv6_close(struct sock *sk, long timeout)
 static int rawv6_init_sk(struct sock *sk)
 {
        if (inet_sk(sk)->num == IPPROTO_ICMPV6) {
-               struct raw6_opt *opt = raw6_sk(sk);
-               opt->checksum = 1;
-               opt->offset = 2;
+               struct raw6_sock *rp = raw6_sk(sk);
+               rp->checksum = 1;
+               rp->offset   = 2;
        }
        return(0);
 }
 
 struct proto rawv6_prot = {
        .name =         "RAW",
+       .owner =        THIS_MODULE,
        .close =        rawv6_close,
        .connect =      ip6_datagram_connect,
        .disconnect =   udp_disconnect,