X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fipv4%2Fipmr.c;h=2568fe28dcd55da32d69a9a6ecb7d62a31abd8fd;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=ca7e1e57e44b4e95dc062fa86e61753af675e726;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index ca7e1e57e..2568fe28d 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c @@ -73,7 +73,7 @@ static struct sock *mroute_socket; Note that the changes are semaphored via rtnl_lock. */ -static rwlock_t mrt_lock = RW_LOCK_UNLOCKED; +static DEFINE_RWLOCK(mrt_lock); /* * Multicast router control variables @@ -93,7 +93,7 @@ static struct mfc_cache *mfc_unres_queue; /* Queue of unresolved entries */ static atomic_t cache_resolve_queue_len; /* Size of unresolved */ /* Special spinlock for queue of unresolved entries */ -static spinlock_t mfc_unres_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(mfc_unres_lock); /* We return to original Alan's scheme. Hash table of resolved entries is changed only in process context and protected @@ -109,7 +109,9 @@ static int ip_mr_forward(struct sk_buff *skb, struct mfc_cache *cache, int local static int ipmr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert); static int ipmr_fill_mroute(struct sk_buff *skb, struct mfc_cache *c, struct rtmsg *rtm); -static struct inet_protocol pim_protocol; +#ifdef CONFIG_IP_PIMSM_V2 +static struct net_protocol pim_protocol; +#endif static struct timer_list ipmr_expire_timer; @@ -844,7 +846,7 @@ static void mrtsock_destruct(struct sock *sk) * MOSPF/PIM router set up we can clean this up. */ -int ip_mroute_setsockopt(struct sock *sk,int optname,char *optval,int optlen) +int ip_mroute_setsockopt(struct sock *sk,int optname,char __user *optval,int optlen) { int ret; struct vifctl vif; @@ -925,7 +927,7 @@ int ip_mroute_setsockopt(struct sock *sk,int optname,char *optval,int optlen) case MRT_ASSERT: { int v; - if(get_user(v,(int *)optval)) + if(get_user(v,(int __user *)optval)) return -EFAULT; mroute_do_assert=(v)?1:0; return 0; @@ -934,7 +936,7 @@ int ip_mroute_setsockopt(struct sock *sk,int optname,char *optval,int optlen) case MRT_PIM: { int v, ret; - if(get_user(v,(int *)optval)) + if(get_user(v,(int __user *)optval)) return -EFAULT; v = (v)?1:0; rtnl_lock(); @@ -970,7 +972,7 @@ int ip_mroute_setsockopt(struct sock *sk,int optname,char *optval,int optlen) * Getsock opt support for the multicast routing system. */ -int ip_mroute_getsockopt(struct sock *sk,int optname,char *optval,int *optlen) +int ip_mroute_getsockopt(struct sock *sk,int optname,char __user *optval,int __user *optlen) { int olr; int val; @@ -1008,7 +1010,7 @@ int ip_mroute_getsockopt(struct sock *sk,int optname,char *optval,int *optlen) * The IP multicast ioctl support routines. */ -int ipmr_ioctl(struct sock *sk, int cmd, unsigned long arg) +int ipmr_ioctl(struct sock *sk, int cmd, void __user *arg) { struct sioc_sg_req sr; struct sioc_vif_req vr; @@ -1018,7 +1020,7 @@ int ipmr_ioctl(struct sock *sk, int cmd, unsigned long arg) switch(cmd) { case SIOCGETVIFCNT: - if (copy_from_user(&vr,(void *)arg,sizeof(vr))) + if (copy_from_user(&vr,arg,sizeof(vr))) return -EFAULT; if(vr.vifi>=maxvif) return -EINVAL; @@ -1031,14 +1033,14 @@ int ipmr_ioctl(struct sock *sk, int cmd, unsigned long arg) vr.obytes=vif->bytes_out; read_unlock(&mrt_lock); - if (copy_to_user((void *)arg,&vr,sizeof(vr))) + if (copy_to_user(arg,&vr,sizeof(vr))) return -EFAULT; return 0; } read_unlock(&mrt_lock); return -EADDRNOTAVAIL; case SIOCGETSGCNT: - if (copy_from_user(&sr,(void *)arg,sizeof(sr))) + if (copy_from_user(&sr,arg,sizeof(sr))) return -EFAULT; read_lock(&mrt_lock); @@ -1049,7 +1051,7 @@ int ipmr_ioctl(struct sock *sk, int cmd, unsigned long arg) sr.wrong_if = c->mfc_un.res.wrong_if; read_unlock(&mrt_lock); - if (copy_to_user((void *)arg,&sr,sizeof(sr))) + if (copy_to_user(arg,&sr,sizeof(sr))) return -EFAULT; return 0; } @@ -1105,17 +1107,14 @@ static void ip_encap(struct sk_buff *skb, u32 saddr, u32 daddr) skb->h.ipiph = skb->nh.iph; skb->nh.iph = iph; memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); -#ifdef CONFIG_NETFILTER - nf_conntrack_put(skb->nfct); - skb->nfct = NULL; -#endif + nf_reset(skb); } static inline int ipmr_forward_finish(struct sk_buff *skb) { struct ip_options * opt = &(IPCB(skb)->opt); - IP_INC_STATS_BH(IpForwDatagrams); + IP_INC_STATS_BH(IPSTATS_MIB_OUTFORWDATAGRAMS); if (unlikely(opt->optlen)) ip_forward_options(skb); @@ -1178,7 +1177,7 @@ static void ipmr_queue_xmit(struct sk_buff *skb, struct mfc_cache *c, int vifi) to blackhole. */ - IP_INC_STATS_BH(IpFragFails); + IP_INC_STATS_BH(IPSTATS_MIB_FRAGFAILS); ip_rt_put(rt); goto out_free; } @@ -1461,10 +1460,7 @@ int pim_rcv_v1(struct sk_buff * skb) skb->dst = NULL; ((struct net_device_stats*)reg_dev->priv)->rx_bytes += skb->len; ((struct net_device_stats*)reg_dev->priv)->rx_packets++; -#ifdef CONFIG_NETFILTER - nf_conntrack_put(skb->nfct); - skb->nfct = NULL; -#endif + nf_reset(skb); netif_rx(skb); dev_put(reg_dev); return 0; @@ -1520,10 +1516,7 @@ static int pim_rcv(struct sk_buff * skb) ((struct net_device_stats*)reg_dev->priv)->rx_bytes += skb->len; ((struct net_device_stats*)reg_dev->priv)->rx_packets++; skb->dst = NULL; -#ifdef CONFIG_NETFILTER - nf_conntrack_put(skb->nfct); - skb->nfct = NULL; -#endif + nf_reset(skb); netif_rx(skb); dev_put(reg_dev); return 0; @@ -1711,7 +1704,7 @@ static struct file_operations ipmr_vif_fops = { .open = ipmr_vif_open, .read = seq_read, .llseek = seq_lseek, - .release = seq_release, + .release = seq_release_private, }; struct ipmr_mfc_iter { @@ -1746,6 +1739,9 @@ static struct mfc_cache *ipmr_mfc_seq_idx(struct ipmr_mfc_iter *it, loff_t pos) static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos) { + struct ipmr_mfc_iter *it = seq->private; + it->cache = NULL; + it->ct = 0; return *pos ? ipmr_mfc_seq_idx(seq->private, *pos - 1) : SEQ_START_TOKEN; } @@ -1855,7 +1851,6 @@ static int ipmr_mfc_open(struct inode *inode, struct file *file) if (rc) goto out_kfree; - memset(s, 0, sizeof(*s)); seq = file->private_data; seq->private = s; out: @@ -1871,12 +1866,12 @@ static struct file_operations ipmr_mfc_fops = { .open = ipmr_mfc_open, .read = seq_read, .llseek = seq_lseek, - .release = seq_release, + .release = seq_release_private, }; #endif #ifdef CONFIG_IP_PIMSM_V2 -static struct inet_protocol pim_protocol = { +static struct net_protocol pim_protocol = { .handler = pim_rcv, }; #endif