aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2009-08-31 17:08:19 -0400
committerDavid S. Miller <davem@davemloft.net>2009-09-11 15:54:55 -0400
commit384912ed194e43c03ad1cdaa09b0b1e488c34d46 (patch)
treebdaae15252819543cff0900941238d2b99bb2300
parentf510c35de0e63e1066db83d2fdce99e6dbde0c80 (diff)
net: Add DEVTYPE support for Ethernet based devices
The Ethernet framing is used for a lot of devices these days. Most prominent are WiFi and WiMAX based devices. However for userspace application it is important to classify these devices correctly and not only see them as Ethernet devices. The daemons like HAL, DeviceKit or even NetworkManager with udev support tries to do the classification in userspace with a lot trickery and extra system calls. This is not good and actually reaches its limitations. Especially since the kernel does know the type of the Ethernet device it is pretty stupid. To solve this problem the underlying device type needs to be set and then the value will be exported as DEVTYPE via uevents and available within udev. # cat /sys/class/net/wlan0/uevent DEVTYPE=wlan INTERFACE=wlan0 IFINDEX=5 This is similar to subsystems like USB and SCSI that distinguish between hosts, devices, disks, partitions etc. The new SET_NETDEV_DEVTYPE() is a convenience helper to set the actual device type. All device types are free form, but for convenience the same strings as used with RFKILL are choosen. Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/usb/hso.c5
-rw-r--r--drivers/net/wimax/i2400m/sdio.c5
-rw-r--r--drivers/net/wimax/i2400m/usb.c5
-rw-r--r--include/linux/netdevice.h6
-rw-r--r--net/bluetooth/bnep/core.c5
-rw-r--r--net/bridge/br_if.c6
-rw-r--r--net/mac80211/iface.c5
7 files changed, 37 insertions, 0 deletions
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index 3f9c92a2afcb..fa4e58196c21 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -2535,6 +2535,10 @@ static void hso_create_rfkill(struct hso_device *hso_dev,
2535 } 2535 }
2536} 2536}
2537 2537
2538static struct device_type hso_type = {
2539 .name = "wwan",
2540};
2541
2538/* Creates our network device */ 2542/* Creates our network device */
2539static struct hso_device *hso_create_net_device(struct usb_interface *interface, 2543static struct hso_device *hso_create_net_device(struct usb_interface *interface,
2540 int port_spec) 2544 int port_spec)
@@ -2575,6 +2579,7 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,
2575 goto exit; 2579 goto exit;
2576 } 2580 }
2577 SET_NETDEV_DEV(net, &interface->dev); 2581 SET_NETDEV_DEV(net, &interface->dev);
2582 SET_NETDEV_DEVTYPE(net, &hso_type);
2578 2583
2579 /* registering our net device */ 2584 /* registering our net device */
2580 result = register_netdev(net); 2585 result = register_netdev(net);
diff --git a/drivers/net/wimax/i2400m/sdio.c b/drivers/net/wimax/i2400m/sdio.c
index ea7b29034aab..2981e211e04f 100644
--- a/drivers/net/wimax/i2400m/sdio.c
+++ b/drivers/net/wimax/i2400m/sdio.c
@@ -371,6 +371,10 @@ error:
371} 371}
372 372
373 373
374static struct device_type i2400ms_type = {
375 .name = "wimax",
376};
377
374/* 378/*
375 * Probe a i2400m interface and register it 379 * Probe a i2400m interface and register it
376 * 380 *
@@ -412,6 +416,7 @@ int i2400ms_probe(struct sdio_func *func,
412 goto error_alloc_netdev; 416 goto error_alloc_netdev;
413 } 417 }
414 SET_NETDEV_DEV(net_dev, dev); 418 SET_NETDEV_DEV(net_dev, dev);
419 SET_NETDEV_DEVTYPE(net_dev, &i2400ms_type);
415 i2400m = net_dev_to_i2400m(net_dev); 420 i2400m = net_dev_to_i2400m(net_dev);
416 i2400ms = container_of(i2400m, struct i2400ms, i2400m); 421 i2400ms = container_of(i2400m, struct i2400ms, i2400m);
417 i2400m->wimax_dev.net_dev = net_dev; 422 i2400m->wimax_dev.net_dev = net_dev;
diff --git a/drivers/net/wimax/i2400m/usb.c b/drivers/net/wimax/i2400m/usb.c
index cfdaf69da9d1..7eadd11c815b 100644
--- a/drivers/net/wimax/i2400m/usb.c
+++ b/drivers/net/wimax/i2400m/usb.c
@@ -351,6 +351,10 @@ error:
351} 351}
352 352
353 353
354static struct device_type i2400mu_type = {
355 .name = "wimax",
356};
357
354/* 358/*
355 * Probe a i2400m interface and register it 359 * Probe a i2400m interface and register it
356 * 360 *
@@ -388,6 +392,7 @@ int i2400mu_probe(struct usb_interface *iface,
388 goto error_alloc_netdev; 392 goto error_alloc_netdev;
389 } 393 }
390 SET_NETDEV_DEV(net_dev, dev); 394 SET_NETDEV_DEV(net_dev, dev);
395 SET_NETDEV_DEVTYPE(net_dev, &i2400mu_type);
391 i2400m = net_dev_to_i2400m(net_dev); 396 i2400m = net_dev_to_i2400m(net_dev);
392 i2400mu = container_of(i2400m, struct i2400mu, i2400m); 397 i2400mu = container_of(i2400m, struct i2400mu, i2400m);
393 i2400m->wimax_dev.net_dev = net_dev; 398 i2400m->wimax_dev.net_dev = net_dev;
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index a44118b1b56c..65ee1929b2b1 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -998,6 +998,12 @@ static inline void *netdev_priv(const struct net_device *dev)
998 */ 998 */
999#define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev)) 999#define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev))
1000 1000
1001/* Set the sysfs device type for the network logical device to allow
1002 * fin grained indentification of different network device types. For
1003 * example Ethernet, Wirelss LAN, Bluetooth, WiMAX etc.
1004 */
1005#define SET_NETDEV_DEVTYPE(net, devtype) ((net)->dev.type = (devtype))
1006
1001/** 1007/**
1002 * netif_napi_add - initialize a napi context 1008 * netif_napi_add - initialize a napi context
1003 * @dev: network device 1009 * @dev: network device
diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c
index 52a6ce0d772b..cafe9f54d841 100644
--- a/net/bluetooth/bnep/core.c
+++ b/net/bluetooth/bnep/core.c
@@ -533,6 +533,10 @@ static struct device *bnep_get_device(struct bnep_session *session)
533 return conn ? &conn->dev : NULL; 533 return conn ? &conn->dev : NULL;
534} 534}
535 535
536static struct device_type bnep_type = {
537 .name = "bluetooth",
538};
539
536int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) 540int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
537{ 541{
538 struct net_device *dev; 542 struct net_device *dev;
@@ -586,6 +590,7 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
586#endif 590#endif
587 591
588 SET_NETDEV_DEV(dev, bnep_get_device(s)); 592 SET_NETDEV_DEV(dev, bnep_get_device(s));
593 SET_NETDEV_DEVTYPE(dev, &bnep_type);
589 594
590 err = register_netdev(dev); 595 err = register_netdev(dev);
591 if (err) { 596 if (err) {
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index e486f1fc3632..142ebac14176 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -264,6 +264,10 @@ static struct net_bridge_port *new_nbp(struct net_bridge *br,
264 return p; 264 return p;
265} 265}
266 266
267static struct device_type br_type = {
268 .name = "bridge",
269};
270
267int br_add_bridge(struct net *net, const char *name) 271int br_add_bridge(struct net *net, const char *name)
268{ 272{
269 struct net_device *dev; 273 struct net_device *dev;
@@ -280,6 +284,8 @@ int br_add_bridge(struct net *net, const char *name)
280 goto out_free; 284 goto out_free;
281 } 285 }
282 286
287 SET_NETDEV_DEVTYPE(dev, &br_type);
288
283 ret = register_netdevice(dev); 289 ret = register_netdevice(dev);
284 if (ret) 290 if (ret)
285 goto out_free; 291 goto out_free;
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index f6005adcbf90..b8295cbd7e8f 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -754,6 +754,10 @@ int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
754 return 0; 754 return 0;
755} 755}
756 756
757static struct device_type wiphy_type = {
758 .name = "wlan",
759};
760
757int ieee80211_if_add(struct ieee80211_local *local, const char *name, 761int ieee80211_if_add(struct ieee80211_local *local, const char *name,
758 struct net_device **new_dev, enum nl80211_iftype type, 762 struct net_device **new_dev, enum nl80211_iftype type,
759 struct vif_params *params) 763 struct vif_params *params)
@@ -785,6 +789,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
785 789
786 memcpy(ndev->dev_addr, local->hw.wiphy->perm_addr, ETH_ALEN); 790 memcpy(ndev->dev_addr, local->hw.wiphy->perm_addr, ETH_ALEN);
787 SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy)); 791 SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy));
792 SET_NETDEV_DEVTYPE(ndev, &wiphy_type);
788 793
789 /* don't use IEEE80211_DEV_TO_SUB_IF because it checks too much */ 794 /* don't use IEEE80211_DEV_TO_SUB_IF because it checks too much */
790 sdata = netdev_priv(ndev); 795 sdata = netdev_priv(ndev);