o80211s: (nl80211) support for mesh interfaces and set_mesh_cfg command
PATCH 2/4 o80211s: (nl80211) support for mesh interfaces and set_mesh_cfg command
This command allows to set the mesh ID for a (pre) 802.11s interface. In the future it will also allow to set other parameters such as path selection protocol, metric, default mesh ttl and other mesh parameters.
--- include/linux/ieee80211.h | 4 ++++ include/linux/nl80211.h | 10 +++++++++- include/net/cfg80211.h | 14 ++++++++++++++ net/wireless/nl80211.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 70 insertions(+), 2 deletions(-)
include/linux/ieee80211.h +4 -0
@@ -95,6 +95,7 @@#define IEEE80211_MAX_FRAME_LEN 2352#define IEEE80211_MAX_SSID_LEN 32 +#define IEEE80211_MAX_MESH_ID_LEN 32struct ieee80211_hdr {__le16 frame_control;
@@ -319,6 +320,9 @@ enum ieee80211_eid {WLAN_EID_HP_PARAMS =8 ,WLAN_EID_HP_TABLE =9 ,WLAN_EID_REQUEST =10 , +/* 802.11s */ +WLAN_EID_MESH_CONFIG =22 ,/* Pending IEEE 802.11 ANA approval */ +WLAN_EID_MESH_ID =23 ,/* Pending IEEE 802.11 ANA approval */ /* 802.11h */ WLAN_EID_PWR_CONSTRAINT =32 , WLAN_EID_PWR_CAPABILITY = 33,
include/linux/nl80211.h +9 -1
@@ -36,6 +36,7 @@* %NL80211_ATTR_IFINDEX and %NL80211_ATTR_WIPHY. Can also be sent from * userspace to request deletion of a virtual interface, then requires * attribute %NL80211_ATTR_IFINDEX. +* @NL80211_CMD_SET_MESH_CFG: start mesh operation * * @NL80211_CMD_MAX: highest used command number * @__NL80211_CMD_AFTER_LAST: internal use
@@ -56,6 +57,8 @@ enum nl80211_commands {/* add commands here */ +NL80211_CMD_SET_MESH_CFG , +/* used to define NL80211_CMD_MAX below */ __NL80211_CMD_AFTER_LAST,NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST -1
@@ -75,13 +78,14 @@ enum nl80211_commands {* @NL80211_ATTR_IFNAME: network interface name * @NL80211_ATTR_IFTYPE: type of virtual interface, see &enum nl80211_iftype * +* @NL80211_ATTR_MESH_ID: mesh id (1-32 bytes) +* * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use */ enum nl80211_attrs {/* don't change the order or add anything inbetween, this is ABI! */ NL80211_ATTR_UNSPEC , -NL80211_ATTR_WIPHY ,NL80211_ATTR_WIPHY_NAME ,
@@ -91,6 +95,8 @@ enum nl80211_attrs {/* add attributes here, update the policy in nl80211.c */ +NL80211_ATTR_MESH_ID , + __NL80211_ATTR_AFTER_LAST, NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1 };
@@ -105,6 +111,7 @@ enum nl80211_attrs {* @NL80211_IFTYPE_AP_VLAN: VLAN interface for access points * @NL80211_IFTYPE_WDS: wireless distribution interface * @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames +* @NL80211_IFTYPE_MESH: mesh point * @NL80211_IFTYPE_MAX: highest interface type number currently defined * @__NL80211_IFTYPE_AFTER_LAST: internal use *
@@ -120,6 +127,7 @@ enum nl80211_iftype {NL80211_IFTYPE_AP_VLAN ,NL80211_IFTYPE_WDS ,NL80211_IFTYPE_MONITOR , +NL80211_IFTYPE_MESH ,/* keep last */ __NL80211_IFTYPE_AFTER_LAST,
include/net/cfg80211.h +14 -0
@@ -12,6 +12,16 @@* Copyright 2006, 2007 Johannes Berg <[email protected]> */ +/* +* struct mesh_params - describes mesh parameters +* @mesh_id: mesh ID to use +* @mesh_id_len: length of the mesh ID +*/ +struct mesh_params { +u8 *mesh_id; +int mesh_id_len; +}; +/* Radiotap header iteration * implemented in net/wireless/radiotap.c * docs in Documentation/networking/radiotap-headers.txt
@@ -71,6 +81,8 @@ struct wiphy;* * @change_virtual_intf: change type of virtual interface * +* @set_mesh_cfg: set mesh parameters (by now, just mesh id) +* */ struct cfg80211_ops { int (*add_virtual_intf)(struct wiphy *wiphy, char *name,
@@ -78,6 +90,8 @@ struct cfg80211_ops {int (*del_virtual_intf)(struct wiphy *wiphy,int ifindex);int (*change_virtual_intf)(struct wiphy *wiphy,int ifindex,enum nl80211_iftype type); +int (*set_mesh_cfg)(struct wiphy *wiphy,struct net_device *dev, + struct mesh_params *params); };#endif /* __NET_CFG80211_H */
net/wireless/nl80211.c +43 -1
68 lines not on this page · raw message
Signature · 1 line
1.5.2.5
Johannes Berg
maintainerinclude/linux/nl80211.h line 39
Quoted 6 lines
include/linux/nl80211.h +1
-0@@ -36,6 +36,7 @@* %NL80211_ATTR_IFINDEX and %NL80211_ATTR_WIPHY. Can also be sent from * userspace to request deletion of a virtual interface, then requires * attribute %NL80211_ATTR_IFINDEX. +* @NL80211_CMD_SET_MESH_CFG: start mesh operation
So if I bring up a mesh interface and don't use SET_MESH_CFG, it won't operate at all?
I think I'd prefer if the MESH_ID attribute would be given as part of SET_INTERFACE/NEW_INTERFACE instead of a new command. I'm attempting to keep nl80211 as object oriented as possible and this single command doesn't really fit the picture.
In fact, you could deny creating a MESH type interface when no mesh ID is given, that would be more obvious to the user imho than to deny bringing it up later.
johannes
Quoted 2 lines · Johannes Berg
So if I bring up a mesh interface and don't use
SET_MESH_CFG, it won't operate at all?
Yes it would, it would use the wild card, zero-length mesh ID.
Quoted 4 lines
I think I'd prefer if the
MESH_IDattribute would be given as part of SET_INTERFACE/NEW_INTERFACE instead of a new command. I'm attempting to keep nl80211 as object oriented as possible and this single command doesn't really fit the picture.
Will that be the way to specify the SSID for the STA interfaces? If so, I agree it would be better to use that command instead of an additional mesh specific command. As by now it's just used to set the interface type I was not sure it was appropriate to add the mesh configuration there.
Signature · 2 lines
Luis Carlos Cobo Rus GnuPG ID: 44019B60 cozybit Inc.
Johannes Berg
maintainerQuoted 4 lines · Luis Carlos Cobo
Quoted 2 lines
So if I bring up a mesh interface and don't use
SET_MESH_CFG, it won't operate at all?Yes it would, it would use the wild card, zero-length mesh ID.
Oh ok, need to give it more thought then.
Quoted 6 lines
Quoted 4 lines
I think I'd prefer if the
MESH_IDattribute would be given as part of SET_INTERFACE/NEW_INTERFACE instead of a new command. I'm attempting to keep nl80211 as object oriented as possible and this single command doesn't really fit the picture.Will that be the way to specify the SSID for the STA interfaces?
No, see below.
Quoted 5 lines
If so,
I agree it would be better to use that command instead of an additional mesh specific command. As by now it's just used to set the interface type I was not sure it was appropriate to add the mesh configuration there.
The way I've been trying to do things is work in an object oriented fashion. If you look at the beacon and sta commands I did, basically you can add/del a sta or beacon. With association, the way I would want it to work is that we have a virtual "association" object (of which you can have zero or one). Deleting this association object would cause the MLME to disassociate.
I don't see any object-oriented way to do the mesh stuff because as you said one *always* has a mesh ID. Is this really what one wants though? Is the broadcast mesh ID actually useful? I think I need to understand more about this to be able to give a good recommendation.
johannes