patch-2.4.22 linux-2.4.22/net/atm/clip.c
Next file: linux-2.4.22/net/atm/common.c
Previous file: linux-2.4.22/net/atm/br2684.c
Back to the patch index
Back to the overall index
- Lines: 217
- Date:
2003-08-25 04:44:44.000000000 -0700
- Orig file:
linux-2.4.21/net/atm/clip.c
- Orig date:
2003-06-13 07:51:39.000000000 -0700
diff -urN linux-2.4.21/net/atm/clip.c linux-2.4.22/net/atm/clip.c
@@ -7,6 +7,8 @@
#include <linux/string.h>
#include <linux/errno.h>
#include <linux/kernel.h> /* for UINT_MAX */
+#include <linux/module.h>
+#include <linux/init.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/wait.h>
@@ -45,6 +47,7 @@
struct net_device *clip_devs = NULL;
struct atm_vcc *atmarpd = NULL;
+static struct neigh_table clip_tbl;
static struct timer_list idle_timer;
static int start_timer = 1;
@@ -127,6 +130,8 @@
struct atmarp_entry *entry = NEIGH2ENTRY(n);
struct clip_vcc *clip_vcc;
+ write_lock(&n->lock);
+
for (clip_vcc = entry->vccs; clip_vcc;
clip_vcc = clip_vcc->next)
if (clip_vcc->idle_timeout &&
@@ -141,6 +146,7 @@
if (entry->vccs ||
time_before(jiffies, entry->expires)) {
np = &n->next;
+ write_unlock(&n->lock);
continue;
}
if (atomic_read(&n->refcnt) > 1) {
@@ -152,11 +158,13 @@
NULL)
dev_kfree_skb(skb);
np = &n->next;
+ write_unlock(&n->lock);
continue;
}
*np = n->next;
DPRINTK("expired neigh %p\n",n);
n->dead = 1;
+ write_unlock(&n->lock);
neigh_release(n);
}
}
@@ -182,7 +190,7 @@
}
-void clip_push(struct atm_vcc *vcc,struct sk_buff *skb)
+static void clip_push(struct atm_vcc *vcc,struct sk_buff *skb)
{
struct clip_vcc *clip_vcc = CLIP_VCC(vcc);
@@ -218,6 +226,7 @@
clip_vcc->last_use = jiffies;
PRIV(skb->dev)->stats.rx_packets++;
PRIV(skb->dev)->stats.rx_bytes += skb->len;
+ memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data));
netif_rx(skb);
}
@@ -319,7 +328,7 @@
}
-struct neigh_table clip_tbl = {
+static struct neigh_table clip_tbl = {
NULL, /* next */
AF_INET, /* family */
sizeof(struct neighbour)+sizeof(struct atmarp_entry), /* entry_size */
@@ -365,7 +374,7 @@
*/
-int clip_encap(struct atm_vcc *vcc,int mode)
+static int clip_encap(struct atm_vcc *vcc,int mode)
{
CLIP_VCC(vcc)->encap = mode;
return 0;
@@ -427,7 +436,6 @@
((u16 *) here)[3] = skb->protocol;
}
atomic_add(skb->truesize,&vcc->sk->wmem_alloc);
- ATM_SKB(skb)->iovcnt = 0;
ATM_SKB(skb)->atm_options = vcc->atm_options;
entry->vccs->last_use = jiffies;
DPRINTK("atm_skb(%p)->vcc(%p)->dev(%p)\n",skb,vcc,vcc->dev);
@@ -463,7 +471,7 @@
}
-int clip_mkip(struct atm_vcc *vcc,int timeout)
+static int clip_mkip(struct atm_vcc *vcc,int timeout)
{
struct clip_vcc *clip_vcc;
struct sk_buff_head copy;
@@ -503,7 +511,7 @@
}
-int clip_setentry(struct atm_vcc *vcc,u32 ip)
+static int clip_setentry(struct atm_vcc *vcc,u32 ip)
{
struct neighbour *neigh;
struct atmarp_entry *entry;
@@ -575,7 +583,7 @@
}
-int clip_create(int number)
+static int clip_create(int number)
{
struct net_device *dev;
struct clip_priv *clip_priv;
@@ -695,28 +703,24 @@
"pending\n");
skb_queue_purge(&vcc->sk->receive_queue);
DPRINTK("(done)\n");
+ MOD_DEC_USE_COUNT;
}
static struct atmdev_ops atmarpd_dev_ops = {
- close: atmarpd_close,
+ .close = atmarpd_close,
};
static struct atm_dev atmarpd_dev = {
- &atmarpd_dev_ops,
- NULL, /* no PHY */
- "arpd", /* type */
- 999, /* dummy device number */
- NULL,NULL, /* pretend not to have any VCCs */
- NULL,NULL, /* no data */
- { 0 }, /* no flags */
- NULL, /* no local address */
- { 0 } /* no ESI, no statistics */
+ .ops = &atmarpd_dev_ops,
+ .type = "arpd",
+ .number = 999,
+ .lock = SPIN_LOCK_UNLOCKED
};
-int atm_init_atmarp(struct atm_vcc *vcc)
+static int atm_init_atmarp(struct atm_vcc *vcc)
{
struct net_device *dev;
@@ -743,13 +747,61 @@
for (dev = clip_devs; dev; dev = PRIV(dev)->next)
if (dev->flags & IFF_UP)
(void) to_atmarpd(act_up,PRIV(dev)->number,0);
+ MOD_INC_USE_COUNT;
return 0;
}
+static struct atm_clip_ops __atm_clip_ops = {
+ .clip_create = clip_create,
+ .clip_mkip = clip_mkip,
+ .clip_setentry = clip_setentry,
+ .clip_encap = clip_encap,
+ .clip_push = clip_push,
+ .atm_init_atmarp = atm_init_atmarp,
+ .owner = THIS_MODULE
+};
-void atm_clip_init(void)
+static int __init atm_clip_init(void)
{
+ /* we should use neigh_table_init() */
clip_tbl.lock = RW_LOCK_UNLOCKED;
clip_tbl.kmem_cachep = kmem_cache_create(clip_tbl.id,
clip_tbl.entry_size, 0, SLAB_HWCACHE_ALIGN, NULL, NULL);
+
+ /* so neigh_ifdown() doesn't complain */
+ clip_tbl.proxy_timer.data = 0;
+ clip_tbl.proxy_timer.function = 0;
+ init_timer(&clip_tbl.proxy_timer);
+ skb_queue_head_init(&clip_tbl.proxy_queue);
+
+ clip_tbl_hook = &clip_tbl;
+ atm_clip_ops_set(&__atm_clip_ops);
+
+ return 0;
}
+
+static void __exit atm_clip_exit(void)
+{
+ struct net_device *dev, *next;
+
+ atm_clip_ops_set(NULL);
+
+ neigh_ifdown(&clip_tbl, NULL);
+ dev = clip_devs;
+ while (dev) {
+ next = PRIV(dev)->next;
+ unregister_netdev(dev);
+ kfree(dev);
+ dev = next;
+ }
+ if (start_timer == 0) del_timer(&idle_timer);
+
+ kmem_cache_destroy(clip_tbl.kmem_cachep);
+
+ clip_tbl_hook = NULL;
+}
+
+module_init(atm_clip_init);
+module_exit(atm_clip_exit);
+
+MODULE_LICENSE("GPL");
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)