]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
Support network namespaces introduced in the current net-2.6.24 GIT tree:
authorhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Thu, 13 Sep 2007 17:41:34 +0000 (17:41 +0000)
committerhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Thu, 13 Sep 2007 17:41:34 +0000 (17:41 +0000)
David Miller's 2.6.24 networking tree
http://git.kernel.org/?p=linux/kernel/git/davem/net-2.6.24.git;a=summary

[NET]: Make the device list and device lookups per namespace.
http://git.kernel.org/?p=linux/kernel/git/davem/net-2.6.24.git;a=commitdiff;h=19dcccd778b49378287317c6c31ee763ebe08bd0

[NET]: Make socket creation namespace safe.
http://git.kernel.org/?p=linux/kernel/git/davem/net-2.6.24.git;a=commitdiff;h=07fee2eb642a99726ba71111bcad7180ba5479f0

[NET]: Make packet reception network namespace safe
http://git.kernel.org/?p=linux/kernel/git/davem/net-2.6.24.git;a=commitdiff;h=6de5b5062e26475050ebd88b33d3c056faa72c3f

TODO: Repair the current procfs support.

git-svn-id: svn://svn.berlios.de//socketcan/trunk@458 030b6a49-0b11-0410-94ab-b0dab22257f2

kernel/2.6/net/can/af_can.c
kernel/2.6/net/can/bcm.c
kernel/2.6/net/can/raw.c

index 76b7874c4ac49be5dd68231c039c3fcdc4f81967..641f1b24092116a2968c29c244e15de46bb51e2b 100644 (file)
@@ -64,6 +64,9 @@
 #include <linux/skbuff.h>
 #include <linux/can.h>
 #include <linux/can/core.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+#include <net/net_namespace.h>
+#endif
 #include <net/sock.h>
 
 #include "af_can.h"
@@ -150,7 +153,11 @@ static void can_sock_destruct(struct sock *sk)
                kfree(sk->sk_protinfo);
 }
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+static int can_create(struct net *net, struct socket *sock, int protocol)
+#else
 static int can_create(struct socket *sock, int protocol)
+#endif
 {
        struct sock *sk;
        struct can_proto *cp;
@@ -189,13 +196,22 @@ static int can_create(struct socket *sock, int protocol)
        if (!cp || cp->type != sock->type)
                return -EPROTONOSUPPORT;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+       if (net != &init_net)
+               return -EAFNOSUPPORT;
+#endif
+
        if (cp->capability >= 0 && !capable(cp->capability))
                return -EPERM;
 
        sock->ops = cp->ops;
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+       sk = sk_alloc(net, PF_CAN, GFP_KERNEL, cp->prot, 1);
+#else
        sk = sk_alloc(PF_CAN, GFP_KERNEL, cp->prot, 1);
+#endif
        if (!sk)
                return -ENOMEM;
 #else
@@ -679,7 +695,11 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev,
        DBG_FRAME("af_can: can_rcv: received CAN frame",
                  (struct can_frame *)skb->data);
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+       if ((dev->type != ARPHRD_CAN) || (dev->nd_net != &init_net)) {
+#else
        if (dev->type != ARPHRD_CAN) {
+#endif
                kfree_skb(skb);
                return 0;
        }
@@ -795,6 +815,11 @@ static int can_notifier(struct notifier_block *nb, unsigned long msg,
        DBG("msg %ld for dev %p (%s idx %d)\n",
            msg, dev, dev->name, dev->ifindex);
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+       if (dev->nd_net != &init_net)
+               return NOTIFY_DONE;
+#endif
+
        if (dev->type != ARPHRD_CAN)
                return NOTIFY_DONE;
 
index 60bf548e005c5855da0554909325029a2eedfa30..9eb283ca5b1ba79f2c25372d880a91ddbbe14f14 100644 (file)
@@ -58,6 +58,9 @@
 #include <linux/can/core.h>
 #include <linux/can/bcm.h>
 #include <net/sock.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+#include <net/net_namespace.h>
+#endif
 
 #include <linux/can/version.h> /* for RCSID. Removed by mkpatch script */
 RCSID("$Id$");
@@ -224,7 +227,11 @@ static char *bcm_proc_getifname(int ifindex)
        if (!ifindex)
                return "any";
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+       dev = __dev_get_by_index(&init_net, ifindex); /* no usage counting */
+#else
        dev = __dev_get_by_index(ifindex); /* no usage counting */
+#endif
        if (dev)
                return dev->name;
 
@@ -333,8 +340,11 @@ static void bcm_can_tx(struct bcm_op *op)
        if (!op->ifindex)
                return;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+       dev = dev_get_by_index(&init_net, op->ifindex);
+#else
        dev = dev_get_by_index(op->ifindex);
-
+#endif
        if (!dev) {
                /* RFC: should this bcm_op remove itself here? */
                return;
@@ -866,7 +876,12 @@ static int bcm_delete_rx_op(struct list_head *ops, canid_t can_id, int ifindex)
                                if (op->rx_reg_dev) {
                                        struct net_device *dev;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+                                       dev = dev_get_by_index(&init_net,
+                                                              op->ifindex);
+#else
                                        dev = dev_get_by_index(op->ifindex);
+#endif
                                        if (dev) {
                                                bcm_rx_unreg(dev, op);
                                                dev_put(dev);
@@ -1326,8 +1341,13 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
                    "rx_op is %p\n", op->can_id, op);
 
                if (ifindex) {
-                       struct net_device *dev = dev_get_by_index(ifindex);
+                       struct net_device *dev;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+                       dev = dev_get_by_index(&init_net, ifindex);
+#else
+                       dev = dev_get_by_index(ifindex);
+#endif
                        if (dev) {
                                can_rx_register(dev, op->can_id,
                                                REGMASK(op->can_id),
@@ -1372,7 +1392,11 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk)
        DBG_FRAME("BCM: TX_SEND: sending frame",
                  (struct can_frame *)skb->data);
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+       dev = dev_get_by_index(&init_net, ifindex);
+#else
        dev = dev_get_by_index(ifindex);
+#endif
        if (!dev) {
                kfree_skb(skb);
                return -ENODEV;
@@ -1416,8 +1440,13 @@ static int bcm_sendmsg(struct kiocb *iocb, struct socket *sock,
                ifindex = addr->can_ifindex; /* ifindex from sendto() */
 
                if (ifindex) {
-                       struct net_device *dev = dev_get_by_index(ifindex);
+                       struct net_device *dev;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+                       dev = dev_get_by_index(&init_net, ifindex);
+#else
+                       dev = dev_get_by_index(ifindex);
+#endif
                        if (!dev) {
                                DBG("device %d not found\n", ifindex);
                                return -ENODEV;
@@ -1517,6 +1546,11 @@ static int bcm_notifier(struct notifier_block *nb, unsigned long msg,
        DBG("msg %ld for dev %p (%s idx %d) sk %p bo->ifindex %d\n",
            msg, dev, dev->name, dev->ifindex, sk, bo->ifindex);
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+       if (dev->nd_net != &init_net)
+               return NOTIFY_DONE;
+#endif
+
        if (dev->type != ARPHRD_CAN)
                return NOTIFY_DONE;
 
@@ -1621,7 +1655,11 @@ static int bcm_release(struct socket *sock)
                        if (op->rx_reg_dev) {
                                struct net_device *dev;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+                               dev = dev_get_by_index(&init_net, op->ifindex);
+#else
                                dev = dev_get_by_index(op->ifindex);
+#endif
                                if (dev) {
                                        bcm_rx_unreg(dev, op);
                                        dev_put(dev);
@@ -1663,8 +1701,13 @@ static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len,
 
        /* bind a device to this socket */
        if (addr->can_ifindex) {
-               struct net_device *dev = dev_get_by_index(addr->can_ifindex);
+               struct net_device *dev;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+               dev = dev_get_by_index(&init_net, addr->can_ifindex);
+#else
+               dev = dev_get_by_index(addr->can_ifindex);
+#endif
                if (!dev) {
                        DBG("could not find device index %d\n",
                            addr->can_ifindex);
index a8a4c9b9efa7c9d420fae41664f2441f3ce5e9b0..ebc04024c20de1af0975bd2922e279e95b130ae9 100644 (file)
@@ -56,6 +56,9 @@
 #include <linux/can/core.h>
 #include <linux/can/raw.h>
 #include <net/sock.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+#include <net/net_namespace.h>
+#endif
 
 #include <linux/can/version.h> /* for RCSID. Removed by mkpatch script */
 RCSID("$Id$");
@@ -215,6 +218,11 @@ static int raw_notifier(struct notifier_block *nb,
        DBG("msg %ld for dev %p (%s idx %d) sk %p ro->ifindex %d\n",
            msg, dev, dev->name, dev->ifindex, sk, ro->ifindex);
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+       if (dev->nd_net != &init_net)
+               return NOTIFY_DONE;
+#endif
+
        if (dev->type != ARPHRD_CAN)
                return NOTIFY_DONE;
 
@@ -297,7 +305,13 @@ static int raw_release(struct socket *sock)
        /* remove current filters & unregister */
        if (ro->bound) {
                if (ro->ifindex) {
-                       struct net_device *dev = dev_get_by_index(ro->ifindex);
+                       struct net_device *dev;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+                       dev = dev_get_by_index(&init_net, ro->ifindex);
+#else
+                       dev = dev_get_by_index(ro->ifindex);
+#endif
                        if (dev) {
                                raw_disable_filters(dev, sk);
                                raw_disable_errfilter(dev, sk);
@@ -340,7 +354,13 @@ static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
        if (ro->bound) {
                /* unregister current filters for this device */
                if (ro->ifindex) {
-                       struct net_device *dev = dev_get_by_index(ro->ifindex);
+                       struct net_device *dev;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+                       dev = dev_get_by_index(&init_net, ro->ifindex);
+#else
+                       dev = dev_get_by_index(ro->ifindex);
+#endif
                        if (dev) {
                                raw_disable_filters(dev, sk);
                                raw_disable_errfilter(dev, sk);
@@ -357,7 +377,13 @@ static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
        }
 
        if (addr->can_ifindex) {
-               struct net_device *dev = dev_get_by_index(addr->can_ifindex);
+               struct net_device *dev;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+               dev = dev_get_by_index(&init_net, addr->can_ifindex);
+#else
+               dev = dev_get_by_index(addr->can_ifindex);
+#endif
                if (!dev) {
                        DBG("could not find device %d\n", addr->can_ifindex);
                        err = -ENODEV;
@@ -475,7 +501,11 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
                lock_sock(sk);
 
                if (ro->bound && ro->ifindex)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+                       dev = dev_get_by_index(&init_net, ro->ifindex);
+#else
                        dev = dev_get_by_index(ro->ifindex);
+#endif
 
                /* remove current filters & unregister */
                if (ro->bound)
@@ -516,7 +546,11 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
                lock_sock(sk);
 
                if (ro->bound && ro->ifindex)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+                       dev = dev_get_by_index(&init_net, ro->ifindex);
+#else
                        dev = dev_get_by_index(ro->ifindex);
+#endif
 
                /* remove current error mask */
                if (ro->bound)
@@ -646,7 +680,11 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
        } else
                ifindex = ro->ifindex;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+       dev = dev_get_by_index(&init_net, ifindex);
+#else
        dev = dev_get_by_index(ifindex);
+#endif
        if (!dev) {
                DBG("device %d not found\n", ifindex);
                return -ENXIO;