X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fipv6%2Fraw.c;h=be23939b8f8e78516421d61b6dad84f322da3554;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=c73d720114fa9721608b68d02b51f7b0008aa1c6;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index c73d72011..be23939b8 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -56,7 +56,7 @@ #include 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,