]> git.hungrycats.org Git - linux/commitdiff
[ATM]: [ioctl][7/8] Use new code for clip (from levon@movementarian.org)
authorChas Williams <chas@cmf.nrl.navy.mil>
Thu, 25 Sep 2003 14:14:22 +0000 (07:14 -0700)
committerDavid S. Miller <davem@nuts.ninka.net>
Thu, 25 Sep 2003 14:14:22 +0000 (07:14 -0700)
include/net/atmclip.h
net/atm/clip.c
net/atm/ioctl.c
net/atm/protocols.h

index a9ec5e4fed6627ea03dad88b36df4141baf12cf9..394eb72b523415d84a68f26747bb2d23ce232848 100644 (file)
@@ -56,29 +56,7 @@ struct clip_priv {
 
 
 #ifdef __KERNEL__
-struct atm_clip_ops {
-       int (*clip_create)(int number);
-       int (*clip_mkip)(struct atm_vcc *vcc,int timeout);
-       int (*clip_setentry)(struct atm_vcc *vcc,u32 ip);
-       int (*clip_encap)(struct atm_vcc *vcc,int mode);
-       void (*clip_push)(struct atm_vcc *vcc,struct sk_buff *skb);
-       int (*atm_init_atmarp)(struct atm_vcc *vcc);
-       struct module *owner;
-};
-
-void atm_clip_ops_set(struct atm_clip_ops *);
-#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
-int try_atm_clip_ops(void);
-#else
-static inline int try_atm_clip_ops(void)
-{
-       return 0;
-}
-#endif
-
-
 extern struct neigh_table *clip_tbl_hook;
-extern struct atm_clip_ops *atm_clip_ops;
 #endif
 
 #endif
index b06268b2ea1bf8e088ec94c605c4da6111f050a5..c6d295c6c2f8b20d3abbf855b41f0d0e2ea65a71 100644 (file)
@@ -762,14 +762,51 @@ static int atm_init_atmarp(struct atm_vcc *vcc)
        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
+static int clip_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
+{
+       struct atm_vcc *vcc = ATM_SD(sock);
+       int err = 0;
+
+       switch (cmd) {
+               case SIOCMKCLIP:
+               case ATMARPD_CTRL:
+               case ATMARP_MKIP:
+               case ATMARP_SETENTRY:
+               case ATMARP_ENCAP:
+                       if (!capable(CAP_NET_ADMIN))
+                               return -EPERM;
+                       break;
+               default:
+                       return -ENOIOCTLCMD;
+       }
+
+       switch (cmd) {
+               case SIOCMKCLIP:
+                       err = clip_create(arg);
+                       break;
+               case ATMARPD_CTRL:
+                       err = atm_init_atmarp(vcc);
+                       if (!err) {
+                               sock->state = SS_CONNECTED;
+                               __module_get(THIS_MODULE);
+                       }
+                       break;
+               case ATMARP_MKIP:
+                       err = clip_mkip(vcc ,arg);
+                       break;
+               case ATMARP_SETENTRY:
+                       err = clip_setentry(vcc, arg);
+                       break;
+               case ATMARP_ENCAP:
+                       err = clip_encap(vcc, arg);
+                       break;
+       }
+       return err;
+}
+
+static struct atm_ioctl clip_ioctl_ops = {
+       .owner  = THIS_MODULE,
+       .ioctl  = clip_ioctl,
 };
 
 #ifdef CONFIG_PROC_FS
@@ -942,13 +979,10 @@ static int arp_seq_open(struct inode *inode, struct file *file)
        struct seq_file *seq;
        int rc = -EAGAIN;
 
-       if (!try_atm_clip_ops())
-               goto out;
-
        state = kmalloc(sizeof(*state), GFP_KERNEL);
        if (!state) {
                rc = -ENOMEM;
-               goto out_put;
+               goto out_kfree;
        }
 
        rc = seq_open(file, &arp_seq_ops);
@@ -960,8 +994,6 @@ static int arp_seq_open(struct inode *inode, struct file *file)
 out:
        return rc;
 
-out_put:
-       module_put(atm_clip_ops->owner);
 out_kfree:
        kfree(state);
        goto out;
@@ -969,7 +1001,6 @@ out_kfree:
 
 static int arp_seq_release(struct inode *inode, struct file *file)
 {
-       module_put(atm_clip_ops->owner);
        return seq_release_private(inode, file);
 }
 
@@ -1004,7 +1035,7 @@ static int __init atm_clip_init(void)
        skb_queue_head_init(&clip_tbl.proxy_queue);
 
        clip_tbl_hook = &clip_tbl;
-       atm_clip_ops_set(&__atm_clip_ops);
+       register_atm_ioctl(&clip_ioctl_ops);
 
        return 0;
 }
@@ -1015,7 +1046,7 @@ static void __exit atm_clip_exit(void)
 
        remove_proc_entry("arp", atm_proc_root);
 
-       atm_clip_ops_set(NULL);
+       deregister_atm_ioctl(&clip_ioctl_ops);
 
        neigh_ifdown(&clip_tbl, NULL);
        dev = clip_devs;
index 2810eb32f22be07868d55782f13cdf48b1781739..b818429fca94460e3e3dce534932bfea1effc120 100644 (file)
 #include <linux/sonet.h>       /* for ioctls */
 #include <linux/atmsvc.h>
 #include <linux/atmmpc.h>
+#include <net/atmclip.h>
 #include <asm/ioctls.h>
 
-#ifdef CONFIG_ATM_CLIP
-#include <net/atmclip.h>       /* for clip_create */
-#endif
 #include "resources.h"
 #include "signaling.h"         /* for WAITING and sigd_attach */
 
@@ -63,36 +61,6 @@ EXPORT_SYMBOL(atm_tcp_ops);
 #endif
 #endif
 
-#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
-#include <net/atmclip.h>
-struct atm_clip_ops *atm_clip_ops;
-static DECLARE_MUTEX(atm_clip_ops_mutex);
-
-void atm_clip_ops_set(struct atm_clip_ops *hook)
-{
-       down(&atm_clip_ops_mutex);
-       atm_clip_ops = hook;
-       up(&atm_clip_ops_mutex);
-}
-
-int try_atm_clip_ops(void)
-{
-       down(&atm_clip_ops_mutex);
-       if (atm_clip_ops && try_module_get(atm_clip_ops->owner)) {
-               up(&atm_clip_ops_mutex);
-               return 1;
-       }
-       up(&atm_clip_ops_mutex);
-       return 0;
-}
-
-#ifdef CONFIG_ATM_CLIP_MODULE
-EXPORT_SYMBOL(atm_clip_ops);
-EXPORT_SYMBOL(try_atm_clip_ops);
-EXPORT_SYMBOL(atm_clip_ops_set);
-#endif
-#endif
-
 static DECLARE_MUTEX(ioctl_mutex);
 static LIST_HEAD(ioctl_list);
 
@@ -177,68 +145,6 @@ int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                        if (!error)
                                sock->state = SS_CONNECTED;
                        goto done;
-#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
-               case SIOCMKCLIP:
-                       if (!capable(CAP_NET_ADMIN)) {
-                               error = -EPERM;
-                               goto done;
-                       }
-                       if (try_atm_clip_ops()) {
-                               error = atm_clip_ops->clip_create(arg);
-                               module_put(atm_clip_ops->owner);
-                       } else
-                               error = -ENOSYS;
-                       goto done;
-               case ATMARPD_CTRL:
-                       if (!capable(CAP_NET_ADMIN)) {
-                               error = -EPERM;
-                               goto done;
-                       }
-#if defined(CONFIG_ATM_CLIP_MODULE)
-                       if (!atm_clip_ops)
-                               request_module("clip");
-#endif
-                       if (try_atm_clip_ops()) {
-                               error = atm_clip_ops->atm_init_atmarp(vcc);
-                               if (!error)
-                                       sock->state = SS_CONNECTED;
-                       } else
-                               error = -ENOSYS;
-                       goto done;
-               case ATMARP_MKIP:
-                       if (!capable(CAP_NET_ADMIN)) {
-                               error = -EPERM;
-                               goto done;
-                       }
-                       if (try_atm_clip_ops()) {
-                               error = atm_clip_ops->clip_mkip(vcc, arg);
-                               module_put(atm_clip_ops->owner);
-                       } else
-                               error = -ENOSYS;
-                       goto done;
-               case ATMARP_SETENTRY:
-                       if (!capable(CAP_NET_ADMIN)) {
-                               error = -EPERM;
-                               goto done;
-                       }
-                       if (try_atm_clip_ops()) {
-                               error = atm_clip_ops->clip_setentry(vcc, arg);
-                               module_put(atm_clip_ops->owner);
-                       } else
-                               error = -ENOSYS;
-                       goto done;
-               case ATMARP_ENCAP:
-                       if (!capable(CAP_NET_ADMIN)) {
-                               error = -EPERM;
-                               goto done;
-                       }
-                       if (try_atm_clip_ops()) {
-                               error = atm_clip_ops->clip_encap(vcc, arg);
-                               module_put(atm_clip_ops->owner);
-                       } else
-                               error = -ENOSYS;
-                       goto done;
-#endif
 #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)
                 case ATMLEC_CTRL:
                         if (!capable(CAP_NET_ADMIN)) {
@@ -329,6 +235,8 @@ int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 
        if (cmd == ATMMPC_CTRL || cmd == ATMMPC_DATA)
                request_module("mpoa");
+       if (cmd == ATMARPD_CTRL)
+               request_module("clip");
 
        error = -ENOIOCTLCMD;
 
index 6a65b34352ef311af3df9ff00b514046ea7596d6..0d658fa8a611c56ed063edd06fd0b47f7894f662 100644 (file)
@@ -11,6 +11,5 @@ void atm_push_raw(struct atm_vcc *vcc,struct sk_buff *skb);
 int atm_init_aal0(struct atm_vcc *vcc);        /* "raw" AAL0 */
 int atm_init_aal34(struct atm_vcc *vcc);/* "raw" AAL3/4 transport */
 int atm_init_aal5(struct atm_vcc *vcc);        /* "raw" AAL5 transport */
-int atm_init_atmarp(struct atm_vcc *vcc);/* ATM ARP */
 
 #endif