Hello,
The patch enables the user to set the network device into the
promiscuous mode.
It's based on the patch http://perso.hurdfr.org/mmenal/promisc.patch.
Here is the patch.
Needed for GNU Mach 1.2
Based on the patch in http://perso.hurdfr.org/mmenal/promisc.patch
2008-07-29 Zheng Da <[EMAIL PROTECTED]>
*include/device/net_status.h: add a new marco value.
*linux/dev/glue/net.c: handle NET_FLAGS in device_get_status() and
device_set_status().
*linux/dev/net/core/dev.c: add the function dev_change_flags
to change the flags of device.
diff -ur gnumach.old/include/device/net_status.h
gnumach/include/device/net_status.h
--- gnumach.old/include/device/net_status.h 2006-04-27
02:56:34.570000000 +0200
+++ gnumach/include/device/net_status.h 2008-07-12 05:53:02.240000000
+0200
@@ -72,6 +72,7 @@
#define NET_DSTADDR (('n'<<16) + 3)
+#define NET_FLAGS (('n'<<16) + 4)
/*
* Input packet filter definition
diff -ur gnumach.old/linux/dev/glue/net.c gnumach/linux/dev/glue/net.c
--- gnumach.old/linux/dev/glue/net.c 2007-10-09 09:44:17.200000000 +0200
+++ gnumach/linux/dev/glue/net.c 2008-07-30 06:43:48.410000000 +0200
@@ -533,6 +533,17 @@
device_get_status (void *d, dev_flavor_t flavor, dev_status_t status,
mach_msg_type_number_t *count)
{
+ if (flavor == NET_FLAGS)
+ {
+ struct net_data *net = (struct net_data *) d;
+
+ if (*count != sizeof(short))
+ return D_INVALID_SIZE;
+
+ *(short *) status = net->dev->flags;
+ return D_SUCCESS;
+ }
+
if(flavor >= SIOCIWFIRST && flavor <= SIOCIWLAST)
{
/* handle wireless ioctl */
@@ -592,6 +603,21 @@
device_set_status(void *d, dev_flavor_t flavor, dev_status_t status,
mach_msg_type_number_t count)
{
+ if (flavor == NET_FLAGS)
+ {
+ if (count != sizeof(short))
+ return D_INVALID_SIZE;
+
+ short flags = *(short *) status;
+ struct net_data *net = (struct net_data *) d;
+
+ dev_change_flags (net->dev, flags);
+
+ /* Change the flags of the Mach device, too. */
+ net->ifnet.if_flags = net->dev->flags;
+ return D_SUCCESS;
+ }
+
if(flavor < SIOCIWFIRST || flavor > SIOCIWLAST)
return D_INVALID_OPERATION;
diff -ur gnumach.old/linux/dev/include/linux/netdevice.h
gnumach/linux/dev/include/linux/netdevice.h
--- gnumach.old/linux/dev/include/linux/netdevice.h 1999-04-26
07:47:56.630000000 +0200
+++ gnumach/linux/dev/include/linux/netdevice.h 2008-07-12
05:52:01.630000000 +0200
@@ -271,6 +271,7 @@
extern void dev_tint(struct linux_device *dev);
#endif
+extern int dev_change_flags(struct linux_device *dev, short flags);
extern int dev_get_info(char *buffer, char **start, off_t
offset, int length, int dummy);
extern int dev_ioctl(unsigned int cmd, void *);
diff -ur gnumach.old/linux/dev/net/core/dev.c
gnumach/linux/dev/net/core/dev.c
--- gnumach.old/linux/dev/net/core/dev.c 1999-04-26
07:50:13.810000000 +0200
+++ gnumach/linux/dev/net/core/dev.c 2008-07-12 05:16:32.810000000 +0200
@@ -1618,3 +1618,31 @@
init_bh(NET_BH, net_bh);
return 0;
}
+
+/*
+ * Change the flags of device DEV to FLAGS.
+ */
+int dev_change_flags (struct device *dev, short flags)
+{
+ if (securelevel > 0)
+ flags &= ~IFF_PROMISC;
+
+ /*
+ * Set the flags on our device.
+ */
+
+ dev->flags = (flags &
+ (IFF_BROADCAST | IFF_DEBUG | IFF_LOOPBACK |
+ IFF_POINTOPOINT | IFF_NOTRAILERS | IFF_RUNNING |
+ IFF_NOARP | IFF_PROMISC | IFF_ALLMULTI | IFF_SLAVE
+ | IFF_MASTER | IFF_MULTICAST))
+ | (dev->flags & (IFF_SOFTHEADERS|IFF_UP));
+
+ /* The flags are taken into account (multicast, promiscuous, ...)
+ in the set_multicast_list handler. */
+ if ((dev->flags & IFF_UP) && dev->set_multicast_list != NULL)
+ dev->set_multicast_list (dev);
+
+ return 0;
+}
+