diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2010-09-20 21:18:30 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2010-09-20 21:23:23 +0200 |
commit | e58f5b6e2ef7ec859b799ba3d58914443ae47efe (patch) | |
tree | 3f7422f1423c3ccf039c92ab1c309454d2deb446 | |
parent | 8e5239628b427facba761194ad655c1c908e146b (diff) |
Add support for setting actual device flags
* pfinet/ethernet.c (ethernet_change_flags): New function.
* pfinet/pfinet.h (ethernet_change_flags): New declaration.
* pfinet/iioctl-ops.c (S_iioctl_siocsifflags): Also call
`ethernet_change_flags' after calling `dev_change_flags'.
-rw-r--r-- | pfinet/ethernet.c | 16 | ||||
-rw-r--r-- | pfinet/iioctl-ops.c | 6 | ||||
-rw-r--r-- | pfinet/pfinet.h | 1 |
3 files changed, 22 insertions, 1 deletions
diff --git a/pfinet/ethernet.c b/pfinet/ethernet.c index d37b90dd..dab5c56f 100644 --- a/pfinet/ethernet.c +++ b/pfinet/ethernet.c @@ -199,6 +199,22 @@ ethernet_xmit (struct sk_buff *skb, struct device *dev) return 0; } +/* Set device flags (e.g. promiscuous) */ +int +ethernet_change_flags (struct device *dev, short flags) +{ + error_t err = 0; +#ifdef NET_FLAGS + int status = flags; + struct ether_device *edev = (struct ether_device *) dev->priv; + err = device_set_status (edev->ether_port, NET_FLAGS, &status, 1); + if (err == D_INVALID_OPERATION) + /* Not supported, ignore. */ + err = 0; +#endif + return err; +} + void setup_ethernet_device (char *name, struct device **device) { diff --git a/pfinet/iioctl-ops.c b/pfinet/iioctl-ops.c index 637e9f5b..c0dd6d5f 100644 --- a/pfinet/iioctl-ops.c +++ b/pfinet/iioctl-ops.c @@ -188,7 +188,11 @@ S_iioctl_siocsifflags (io_t port, else if (!dev) err = ENODEV; else - err = dev_change_flags(dev, flags); + { + err = dev_change_flags (dev, flags); + if (!err) + err = ethernet_change_flags (dev, flags); + } __mutex_unlock (&global_lock); end_using_socket_port (user); diff --git a/pfinet/pfinet.h b/pfinet/pfinet.h index 77027b22..050ba6f7 100644 --- a/pfinet/pfinet.h +++ b/pfinet/pfinet.h @@ -67,6 +67,7 @@ uid_t pfinet_group; void ethernet_initialize (void); int ethernet_demuxer (mach_msg_header_t *, mach_msg_header_t *); +int ethernet_change_flags (struct device *, short); void setup_ethernet_device (char *, struct device **); void setup_dummy_device (char *, struct device **); void setup_tunnel_device (char *, struct device **); |