Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
[powerpc.git] / net / ipv6 / udp.c
index 5a64027..f52a5c3 100644 (file)
@@ -248,7 +248,7 @@ out:
 
 static __inline__ void udpv6_err(struct sk_buff *skb,
                                 struct inet6_skb_parm *opt, int type,
-                                int code, int offset, __u32 info     )
+                                int code, int offset, __be32 info     )
 {
        return __udp6_lib_err(skb, opt, type, code, offset, info, udp_hash);
 }
@@ -298,8 +298,8 @@ drop:
 }
 
 static struct sock *udp_v6_mcast_next(struct sock *sk,
-                                     u16 loc_port, struct in6_addr *loc_addr,
-                                     u16 rmt_port, struct in6_addr *rmt_addr,
+                                     __be16 loc_port, struct in6_addr *loc_addr,
+                                     __be16 rmt_port, struct in6_addr *rmt_addr,
                                      int dif)
 {
        struct hlist_node *node;
@@ -383,9 +383,10 @@ static inline int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh)
                skb->ip_summed = CHECKSUM_UNNECESSARY;
 
        if (skb->ip_summed != CHECKSUM_UNNECESSARY)
-               skb->csum = ~csum_ipv6_magic(&skb->nh.ipv6h->saddr,
-                                            &skb->nh.ipv6h->daddr,
-                                            skb->len, IPPROTO_UDP, 0);
+               skb->csum = ~csum_unfold(csum_ipv6_magic(&skb->nh.ipv6h->saddr,
+                                                        &skb->nh.ipv6h->daddr,
+                                                        skb->len, IPPROTO_UDP,
+                                                        0));
 
        return (UDP_SKB_CB(skb)->partial_cov = 0);
 }
@@ -504,14 +505,15 @@ static void udp_v6_flush_pending_frames(struct sock *sk)
  *     Sending
  */
 
-static int udp_v6_push_pending_frames(struct sock *sk, struct udp_sock *up)
+static int udp_v6_push_pending_frames(struct sock *sk)
 {
        struct sk_buff *skb;
        struct udphdr *uh;
+       struct udp_sock  *up = udp_sk(sk);
        struct inet_sock *inet = inet_sk(sk);
        struct flowi *fl = &inet->cork.fl;
        int err = 0;
-       u32 csum = 0;
+       __wsum csum = 0;
 
        /* Grab the skbuff where UDP header space exists. */
        if ((skb = skb_peek(&sk->sk_write_queue)) == NULL)
@@ -535,7 +537,7 @@ static int udp_v6_push_pending_frames(struct sock *sk, struct udp_sock *up)
        uh->check = csum_ipv6_magic(&fl->fl6_src, &fl->fl6_dst,
                                    up->len, fl->proto, csum   );
        if (uh->check == 0)
-               uh->check = -1;
+               uh->check = CSUM_MANGLED_0;
 
        err = ip6_push_pending_frames(sk);
 out:
@@ -781,7 +783,7 @@ do_append_data:
        if (err)
                udp_v6_flush_pending_frames(sk);
        else if (!corkreq)
-               err = udp_v6_push_pending_frames(sk, up);
+               err = udp_v6_push_pending_frames(sk);
        else if (unlikely(skb_queue_empty(&sk->sk_write_queue)))
                up->pending = 0;
 
@@ -843,72 +845,12 @@ int udpv6_destroy_sock(struct sock *sk)
 /*
  *     Socket option code for UDP
  */
-static int do_udpv6_setsockopt(struct sock *sk, int level, int optname,
-                         char __user *optval, int optlen)
-{
-       struct udp_sock *up = udp_sk(sk);
-       int val;
-       int err = 0;
-
-       if(optlen<sizeof(int))
-               return -EINVAL;
-
-       if (get_user(val, (int __user *)optval))
-               return -EFAULT;
-
-       switch(optname) {
-       case UDP_CORK:
-               if (val != 0) {
-                       up->corkflag = 1;
-               } else {
-                       up->corkflag = 0;
-                       lock_sock(sk);
-                       udp_v6_push_pending_frames(sk, up);
-                       release_sock(sk);
-               }
-               break;
-       case UDP_ENCAP:
-               switch (val) {
-               case 0:
-                       up->encap_type = val;
-                       break;
-               default:
-                       err = -ENOPROTOOPT;
-                       break;
-               }
-               break;
-
-       case UDPLITE_SEND_CSCOV:
-               if (!up->pcflag)         /* Disable the option on UDP sockets */
-                       return -ENOPROTOOPT;
-               if (val != 0 && val < 8) /* Illegal coverage: use default (8) */
-                       val = 8;
-               up->pcslen = val;
-               up->pcflag |= UDPLITE_SEND_CC;
-               break;
-
-       case UDPLITE_RECV_CSCOV:
-               if (!up->pcflag)         /* Disable the option on UDP sockets */
-                       return -ENOPROTOOPT;
-               if (val != 0 && val < 8) /* Avoid silly minimal values.       */
-                       val = 8;
-               up->pcrlen = val;
-               up->pcflag |= UDPLITE_RECV_CC;
-               break;
-
-       default:
-               err = -ENOPROTOOPT;
-               break;
-       };
-
-       return err;
-}
-
 int udpv6_setsockopt(struct sock *sk, int level, int optname,
                     char __user *optval, int optlen)
 {
        if (level == SOL_UDP  ||  level == SOL_UDPLITE)
-               return do_udpv6_setsockopt(sk, level, optname, optval, optlen);
+               return udp_lib_setsockopt(sk, level, optname, optval, optlen,
+                                         udp_v6_push_pending_frames);
        return ipv6_setsockopt(sk, level, optname, optval, optlen);
 }
 
@@ -917,58 +859,17 @@ int compat_udpv6_setsockopt(struct sock *sk, int level, int optname,
                            char __user *optval, int optlen)
 {
        if (level == SOL_UDP  ||  level == SOL_UDPLITE)
-               return do_udpv6_setsockopt(sk, level, optname, optval, optlen);
+               return udp_lib_setsockopt(sk, level, optname, optval, optlen,
+                                         udp_v6_push_pending_frames);
        return compat_ipv6_setsockopt(sk, level, optname, optval, optlen);
 }
 #endif
 
-static int do_udpv6_getsockopt(struct sock *sk, int level, int optname,
-                         char __user *optval, int __user *optlen)
-{
-       struct udp_sock *up = udp_sk(sk);
-       int val, len;
-
-       if(get_user(len,optlen))
-               return -EFAULT;
-
-       len = min_t(unsigned int, len, sizeof(int));
-       
-       if(len < 0)
-               return -EINVAL;
-
-       switch(optname) {
-       case UDP_CORK:
-               val = up->corkflag;
-               break;
-
-       case UDP_ENCAP:
-               val = up->encap_type;
-               break;
-
-       case UDPLITE_SEND_CSCOV:
-               val = up->pcslen;
-               break;
-
-       case UDPLITE_RECV_CSCOV:
-               val = up->pcrlen;
-               break;
-
-       default:
-               return -ENOPROTOOPT;
-       };
-
-       if(put_user(len, optlen))
-               return -EFAULT;
-       if(copy_to_user(optval, &val,len))
-               return -EFAULT;
-       return 0;
-}
-
 int udpv6_getsockopt(struct sock *sk, int level, int optname,
                     char __user *optval, int __user *optlen)
 {
        if (level == SOL_UDP  ||  level == SOL_UDPLITE)
-               return do_udpv6_getsockopt(sk, level, optname, optval, optlen);
+               return udp_lib_getsockopt(sk, level, optname, optval, optlen);
        return ipv6_getsockopt(sk, level, optname, optval, optlen);
 }
 
@@ -977,7 +878,7 @@ int compat_udpv6_getsockopt(struct sock *sk, int level, int optname,
                            char __user *optval, int __user *optlen)
 {
        if (level == SOL_UDP  ||  level == SOL_UDPLITE)
-               return do_udpv6_getsockopt(sk, level, optname, optval, optlen);
+               return udp_lib_getsockopt(sk, level, optname, optval, optlen);
        return compat_ipv6_getsockopt(sk, level, optname, optval, optlen);
 }
 #endif