diff options
-rw-r--r-- | include/linux/nl80211.h | 6 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 27 |
2 files changed, 33 insertions, 0 deletions
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index f33aa08dd9b3..3700d927e245 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h | |||
@@ -349,6 +349,10 @@ enum nl80211_commands { | |||
349 | * @NL80211_ATTR_REG_TYPE: indicates the type of the regulatory domain currently | 349 | * @NL80211_ATTR_REG_TYPE: indicates the type of the regulatory domain currently |
350 | * set. This can be one of the nl80211_reg_type (%NL80211_REGDOM_TYPE_*) | 350 | * set. This can be one of the nl80211_reg_type (%NL80211_REGDOM_TYPE_*) |
351 | * | 351 | * |
352 | * @NL80211_ATTR_SUPPORTED_COMMANDS: wiphy attribute that specifies | ||
353 | * an array of command numbers (i.e. a mapping index to command number) | ||
354 | * that the driver for the given wiphy supports. | ||
355 | * | ||
352 | * @NL80211_ATTR_MAX: highest attribute number currently defined | 356 | * @NL80211_ATTR_MAX: highest attribute number currently defined |
353 | * @__NL80211_ATTR_AFTER_LAST: internal use | 357 | * @__NL80211_ATTR_AFTER_LAST: internal use |
354 | */ | 358 | */ |
@@ -426,6 +430,8 @@ enum nl80211_attrs { | |||
426 | NL80211_ATTR_REG_INITIATOR, | 430 | NL80211_ATTR_REG_INITIATOR, |
427 | NL80211_ATTR_REG_TYPE, | 431 | NL80211_ATTR_REG_TYPE, |
428 | 432 | ||
433 | NL80211_ATTR_SUPPORTED_COMMANDS, | ||
434 | |||
429 | /* add attributes here, update the policy in nl80211.c */ | 435 | /* add attributes here, update the policy in nl80211.c */ |
430 | 436 | ||
431 | __NL80211_ATTR_AFTER_LAST, | 437 | __NL80211_ATTR_AFTER_LAST, |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index ab9d8f14e151..58ee1b1aff89 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -131,6 +131,7 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags, | |||
131 | struct nlattr *nl_freqs, *nl_freq; | 131 | struct nlattr *nl_freqs, *nl_freq; |
132 | struct nlattr *nl_rates, *nl_rate; | 132 | struct nlattr *nl_rates, *nl_rate; |
133 | struct nlattr *nl_modes; | 133 | struct nlattr *nl_modes; |
134 | struct nlattr *nl_cmds; | ||
134 | enum ieee80211_band band; | 135 | enum ieee80211_band band; |
135 | struct ieee80211_channel *chan; | 136 | struct ieee80211_channel *chan; |
136 | struct ieee80211_rate *rate; | 137 | struct ieee80211_rate *rate; |
@@ -242,6 +243,32 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags, | |||
242 | } | 243 | } |
243 | nla_nest_end(msg, nl_bands); | 244 | nla_nest_end(msg, nl_bands); |
244 | 245 | ||
246 | nl_cmds = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_COMMANDS); | ||
247 | if (!nl_cmds) | ||
248 | goto nla_put_failure; | ||
249 | |||
250 | i = 0; | ||
251 | #define CMD(op, n) \ | ||
252 | do { \ | ||
253 | if (dev->ops->op) { \ | ||
254 | i++; \ | ||
255 | NLA_PUT_U32(msg, i, NL80211_CMD_ ## n); \ | ||
256 | } \ | ||
257 | } while (0) | ||
258 | |||
259 | CMD(add_virtual_intf, NEW_INTERFACE); | ||
260 | CMD(change_virtual_intf, SET_INTERFACE); | ||
261 | CMD(add_key, NEW_KEY); | ||
262 | CMD(add_beacon, NEW_BEACON); | ||
263 | CMD(add_station, NEW_STATION); | ||
264 | CMD(add_mpath, NEW_MPATH); | ||
265 | CMD(set_mesh_params, SET_MESH_PARAMS); | ||
266 | CMD(change_bss, SET_BSS); | ||
267 | CMD(set_mgmt_extra_ie, SET_MGMT_EXTRA_IE); | ||
268 | |||
269 | #undef CMD | ||
270 | nla_nest_end(msg, nl_cmds); | ||
271 | |||
245 | return genlmsg_end(msg, hdr); | 272 | return genlmsg_end(msg, hdr); |
246 | 273 | ||
247 | nla_put_failure: | 274 | nla_put_failure: |