aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/nl80211.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/wireless/nl80211.c')
-rw-r--r--net/wireless/nl80211.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 59eb2cf42e5f..47542ee01c57 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -87,6 +87,10 @@ static struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] __read_mostly = {
87 [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY, 87 [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
88 .len = IEEE80211_MAX_MESH_ID_LEN }, 88 .len = IEEE80211_MAX_MESH_ID_LEN },
89 [NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 }, 89 [NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 },
90
91 [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
92 [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
93 [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
90}; 94};
91 95
92/* message building helper */ 96/* message building helper */
@@ -1525,6 +1529,48 @@ static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
1525 return err; 1529 return err;
1526} 1530}
1527 1531
1532static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
1533{
1534 struct cfg80211_registered_device *drv;
1535 int err;
1536 struct net_device *dev;
1537 struct bss_parameters params;
1538
1539 memset(&params, 0, sizeof(params));
1540 /* default to not changing parameters */
1541 params.use_cts_prot = -1;
1542 params.use_short_preamble = -1;
1543 params.use_short_slot_time = -1;
1544
1545 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
1546 params.use_cts_prot =
1547 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
1548 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE])
1549 params.use_short_preamble =
1550 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
1551 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME])
1552 params.use_short_slot_time =
1553 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
1554
1555 err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
1556 if (err)
1557 return err;
1558
1559 if (!drv->ops->change_bss) {
1560 err = -EOPNOTSUPP;
1561 goto out;
1562 }
1563
1564 rtnl_lock();
1565 err = drv->ops->change_bss(&drv->wiphy, dev, &params);
1566 rtnl_unlock();
1567
1568 out:
1569 cfg80211_put_dev(drv);
1570 dev_put(dev);
1571 return err;
1572}
1573
1528static struct genl_ops nl80211_ops[] = { 1574static struct genl_ops nl80211_ops[] = {
1529 { 1575 {
1530 .cmd = NL80211_CMD_GET_WIPHY, 1576 .cmd = NL80211_CMD_GET_WIPHY,
@@ -1656,6 +1702,12 @@ static struct genl_ops nl80211_ops[] = {
1656 .policy = nl80211_policy, 1702 .policy = nl80211_policy,
1657 .flags = GENL_ADMIN_PERM, 1703 .flags = GENL_ADMIN_PERM,
1658 }, 1704 },
1705 {
1706 .cmd = NL80211_CMD_SET_BSS,
1707 .doit = nl80211_set_bss,
1708 .policy = nl80211_policy,
1709 .flags = GENL_ADMIN_PERM,
1710 },
1659}; 1711};
1660 1712
1661/* multicast groups */ 1713/* multicast groups */