Revision: 464
http://vde.svn.sourceforge.net/vde/?rev=464&view=rev
Author: rd235
Date: 2011-01-26 16:59:50 +0000 (Wed, 26 Jan 2011)
Log Message:
-----------
port to 2.6.37: mutex changed into semaphore and netdev_rx_handler management
Modified Paths:
--------------
trunk/ipn/README
trunk/ipn/af_ipn.c
trunk/ipn/af_ipn.h
trunk/ipn/ipn_chrdev.c
trunk/ipn/ipn_netdev.c
trunk/ipn/ipn_netdev.h
Modified: trunk/ipn/README
===================================================================
--- trunk/ipn/README 2011-01-25 17:29:57 UTC (rev 463)
+++ trunk/ipn/README 2011-01-26 16:59:50 UTC (rev 464)
@@ -169,6 +169,12 @@
We are studying some way to register/deregister grabbing services,
I feel this would be the cleanest way.
++-----
+|Note (2011 January): This issue seems to have been solved in 2.6.37
+| the new interface netdev_rx_handler_{register,unregister} can
+| be effectively used for ipn.
++-----
+
WHERE?
------
There is an experimental version in the VDE svn tree.
Modified: trunk/ipn/af_ipn.c
===================================================================
--- trunk/ipn/af_ipn.c 2011-01-25 17:29:57 UTC (rev 463)
+++ trunk/ipn/af_ipn.c 2011-01-26 16:59:50 UTC (rev 464)
@@ -47,6 +47,9 @@
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)
#define IPN_PRE2632
#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)
+#define IPN_PRE2637
+#endif
/*extension of RCV_SHUTDOWN defined in include/net/sock.h
* when the bit is set recv fails */
@@ -59,7 +62,11 @@
/* Global MUTEX: this is locked to add/delete/modify networks
* this is *not* locked just to send/receive msgs */
+#ifdef IPN_PRE2637
static DECLARE_MUTEX(ipn_glob_mutex);
+#else
+static DEFINE_SEMAPHORE(ipn_glob_mutex);
+#endif
/* Network table and hash */
struct hlist_head ipn_network_table[IPN_HASH_SIZE + 1];
/* slab(s) for fast data structure allocation */
@@ -690,7 +697,7 @@
ipnn->dentry=nd.dentry;
ipnn->mnt=nd.mnt;
#endif
- init_MUTEX(&ipnn->ipnn_mutex);
+ sema_init(&ipnn->ipnn_mutex,1);
ipnn->sunaddr_len=addr_len;
ipnn->protocol=ipn_node->protocol;
if (ipnn->protocol < 0) ipnn->protocol = 0;
Modified: trunk/ipn/af_ipn.h
===================================================================
--- trunk/ipn/af_ipn.h 2011-01-25 17:29:57 UTC (rev 463)
+++ trunk/ipn/af_ipn.h 2011-01-26 16:59:50 UTC (rev 464)
@@ -1,12 +1,15 @@
#ifndef __LINUX_NET_AFIPN_H
#define __LINUX_NET_AFIPN_H
#include <linux/socket.h>
+#include <linux/version.h>
#ifdef IPN_STEALING
/* AF_NETBEUI seems to be unused */
#define AF_IPN AF_NETBEUI
#define PF_IPN AF_IPN
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)
#define ipn_handle_frame_hook br_handle_frame_hook
+#endif
#else
#ifndef AF_IPN
/* waiting for the official assigment of our AF */
Modified: trunk/ipn/ipn_chrdev.c
===================================================================
--- trunk/ipn/ipn_chrdev.c 2011-01-25 17:29:57 UTC (rev 463)
+++ trunk/ipn/ipn_chrdev.c 2011-01-26 16:59:50 UTC (rev 464)
@@ -28,9 +28,13 @@
#include <linux/device.h>
#include <linux/cdev.h>
#include <linux/string.h>
+#include <linux/version.h>
#include "af_ipn.h"
#include "ipn_chrdev.h"
#include "ipn_msgbuf.h"
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)
+#define IPN_PRE2637
+#endif
#define IPN_CHRDEV_PERSISTENT 1
/* struct ipn_chrdev:
@@ -113,7 +117,11 @@
return ipn_node_poll(ipn_node,filp,wait);
}
+#ifdef IPN_PRE2637
static int ipn_chrdev_ioctl(struct inode *ino, struct file *filp, unsigned
int cmd, unsigned long arg)
+#else
+static long ipn_chrdev_ioctl(struct file *filp, unsigned int cmd, unsigned
long arg)
+#endif
{
struct ipn_node *ipn_node=filp->private_data;
return ipn_node_ioctl(ipn_node,cmd,arg);
@@ -126,7 +134,11 @@
.read = ipn_chrdev_read,
.release = ipn_chrdev_release,
.poll = ipn_chrdev_poll,
+#ifdef IPN_PRE2637
.ioctl = ipn_chrdev_ioctl
+#else
+ .unlocked_ioctl = ipn_chrdev_ioctl
+#endif
};
/* init a struct ipn_chrdev and add the cdev */
Modified: trunk/ipn/ipn_netdev.c
===================================================================
--- trunk/ipn/ipn_netdev.c 2011-01-25 17:29:57 UTC (rev 463)
+++ trunk/ipn/ipn_netdev.c 2011-01-26 16:59:50 UTC (rev 464)
@@ -36,9 +36,15 @@
#define DRV_NAME "ipn"
#define DRV_VERSION "0.3.1"
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+#define IPN_PRE2624
+#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
#define IPN_PRE2629
#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)
+#define IPN_PRE2637
+#endif
static const struct ethtool_ops ipn_ethtool_ops;
@@ -93,11 +99,18 @@
return 0;
}
+#ifdef IPN_PRE2637
/* receive from a GRAB via interface hook */
struct sk_buff *ipn_handle_hook(struct ipn_node *ipn_node, struct sk_buff *skb)
+#else
+static struct sk_buff *ipn_handle_frame(struct sk_buff *skb)
+#endif
{
char *data=(skb->data)-(skb->mac_len);
int len=skb->len+skb->mac_len;
+#ifndef IPN_PRE2637
+ struct ipn_node *ipn_node=ipn_netdev2node(skb->dev);
+#endif
if (ipn_node &&
((ipn_node->flags & IPN_NODEFLAG_DEVMASK) ==
IPN_NODEFLAG_GRAB) &&
@@ -161,6 +174,7 @@
random_ether_addr(dev->dev_addr);
break;
case IPN_NODEFLAG_GRAB:
+#ifdef IPN_PRE2637
#ifdef IPN_STEALING
/* only if bridge is not working */
if (ipn_handle_frame_hook != (void *) ipn_handle_hook) {
@@ -168,7 +182,8 @@
return NULL;
}
#endif
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
+#endif
+#ifdef IPN_PRE2624
dev=dev_get_by_name(name);
#else
dev=dev_get_by_name(net,name);
@@ -176,8 +191,13 @@
if (dev) {
if (dev->flags & IFF_LOOPBACK)
*err= -EINVAL;
+#ifdef IPN_PRE2637
else if (rcu_dereference(dev->ipn_port) != NULL)
*err= -EBUSY;
+#else
+ else if (rcu_dereference(dev->rx_handler) !=
NULL)
+ *err= -EBUSY;
+#endif
if (*err)
dev=NULL;
}
@@ -195,12 +215,19 @@
struct ipntap
*ipntap=netdev_priv(ipn_node->netdev);
ipntap->ipn_node=ipn_node;
rtnl_lock();
- if ((rv=register_netdevice(ipn_node->netdev))
== 0)
+ if ((rv=register_netdevice(ipn_node->netdev))
== 0) {
+#ifdef IPN_PRE2637
rcu_assign_pointer(ipn_node->netdev->ipn_port,
#ifdef IPN_STEALING
(void *)
#endif
ipn_node);
+#else
+
netdev_rx_handler_register(ipn_node->netdev,
+ ipn_handle_frame,
+ ipn_node);
+#endif
+ }
rtnl_unlock();
if (rv) {/* error! */
ipn_node->flags &=
~IPN_NODEFLAG_DEVMASK;
@@ -210,11 +237,17 @@
break;
case IPN_NODEFLAG_GRAB:
rtnl_lock();
+#ifdef IPN_PRE2637
rcu_assign_pointer(ipn_node->netdev->ipn_port,
#ifdef IPN_STEALING
(void *)
#endif
ipn_node);
+#else
+ netdev_rx_handler_register(ipn_node->netdev,
+ ipn_handle_frame,
+ ipn_node);
+#endif
dev_set_promiscuity(ipn_node->netdev,1);
rtnl_unlock();
rv=0;
@@ -229,7 +262,11 @@
case IPN_NODEFLAG_TAP:
ipn_node->flags &= ~IPN_NODEFLAG_DEVMASK;
rtnl_lock();
+#ifdef IPN_PRE2637
rcu_assign_pointer(ipn_node->netdev->ipn_port, NULL);
+#else
+ netdev_rx_handler_unregister(ipn_node->netdev);
+#endif
unregister_netdevice(ipn_node->netdev);
rtnl_unlock();
free_netdev(ipn_node->netdev);
@@ -237,7 +274,11 @@
case IPN_NODEFLAG_GRAB:
ipn_node->flags &= ~IPN_NODEFLAG_DEVMASK;
rtnl_lock();
+#ifdef IPN_PRE2637
rcu_assign_pointer(ipn_node->netdev->ipn_port, NULL);
+#else
+ netdev_rx_handler_unregister(ipn_node->netdev);
+#endif
dev_set_promiscuity(ipn_node->netdev,-1);
rtnl_unlock();
break;
@@ -313,6 +354,7 @@
int ipn_netdev_init(void)
{
+#ifdef IPN_PRE2637
#ifdef IPN_STEALING
if (ipn_handle_frame_hook != NULL)
printk (KERN_WARNING "IPN interface GRAB disabled (stealing
mode) if bridge is loaded\n");
@@ -323,15 +365,18 @@
(void *)
#endif
ipn_handle_hook;
+#endif
return 0;
}
void ipn_netdev_fini(void)
{
+#ifdef IPN_PRE2637
#ifdef IPN_STEALING
/* only if bridge is not working */
if (ipn_handle_frame_hook == (void *) ipn_handle_hook)
#endif
ipn_handle_frame_hook=NULL;
+#endif
}
Modified: trunk/ipn/ipn_netdev.h
===================================================================
--- trunk/ipn/ipn_netdev.h 2011-01-25 17:29:57 UTC (rev 463)
+++ trunk/ipn/ipn_netdev.h 2011-01-26 16:59:50 UTC (rev 464)
@@ -30,13 +30,16 @@
#include <linux/mount.h>
#include <linux/etherdevice.h>
#include <linux/if_bridge.h>
+#include <linux/version.h>
#include <net/sock.h>
/*#include <net/af_ipn.h>*/
#include "af_ipn.h"
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)
#ifdef IPN_STEALING
#define ipn_port br_port
#endif
+#endif
struct net_device *ipn_netdev_alloc(struct net *net,int type, char *name, int
*err);
int ipn_netdev_activate(struct ipn_node *ipn_node);
@@ -47,7 +50,11 @@
static inline struct ipn_node *ipn_netdev2node(struct net_device *dev)
{
- return (struct ipn_node *)rcu_dereference(dev->ipn_port);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)
+ return (struct ipn_node *) rcu_dereference(dev->ipn_port);
+#else
+ return (struct ipn_node *) rcu_dereference(dev->rx_handler_data);
+#endif
}
static inline void ipn_netdevsync(void)
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires
February 28th, so secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
vde-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/vde-users