blob: 74cc1764e81d8863e01acebffd1b56b825e7cb15 [file] [log] [blame]
Johannes Berg379f8392008-12-08 12:53:58 +01001#include <stdbool.h>
Johannes Berg0f55e0b2008-09-16 17:40:48 +02002#include <errno.h>
Johannes Berg0f55e0b2008-09-16 17:40:48 +02003#include <net/if.h>
4
5#include <netlink/genl/genl.h>
6#include <netlink/genl/family.h>
7#include <netlink/genl/ctrl.h>
8#include <netlink/msg.h>
9#include <netlink/attr.h>
10
Johannes Bergf408e012008-09-18 19:32:11 +020011#include "nl80211.h"
Johannes Berg0f55e0b2008-09-16 17:40:48 +020012#include "iw.h"
13
Johannes Berg70391cc2008-09-16 18:35:06 +020014static int handle_name(struct nl_cb *cb,
Johannes Berg0f55e0b2008-09-16 17:40:48 +020015 struct nl_msg *msg,
16 int argc, char **argv)
17{
Johannes Berg0f55e0b2008-09-16 17:40:48 +020018 if (argc != 1)
Johannes Berg5e75fd02008-09-16 18:13:12 +020019 return 1;
Johannes Berg0f55e0b2008-09-16 17:40:48 +020020
21 NLA_PUT_STRING(msg, NL80211_ATTR_WIPHY_NAME, *argv);
22
Johannes Berg70391cc2008-09-16 18:35:06 +020023 return 0;
Johannes Berg0f55e0b2008-09-16 17:40:48 +020024 nla_put_failure:
Johannes Berg70391cc2008-09-16 18:35:06 +020025 return -ENOBUFS;
Johannes Berg0f55e0b2008-09-16 17:40:48 +020026}
27COMMAND(set, name, "<new name>", NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_name);
Johannes Bergb822cda2008-12-08 12:43:42 +010028
Johannes Berg379f8392008-12-08 12:53:58 +010029static int handle_freqchan(struct nl_msg *msg, bool chan,
30 int argc, char **argv)
Johannes Bergb822cda2008-12-08 12:43:42 +010031{
32 static const struct {
33 const char *name;
34 unsigned int val;
35 } htmap[] = {
36 { .name = "HT20", .val = NL80211_SEC_CHAN_DISABLED, },
37 { .name = "HT40+", .val = NL80211_SEC_CHAN_ABOVE, },
38 { .name = "HT40-", .val = NL80211_SEC_CHAN_BELOW, },
39 };
40 unsigned int htval = NL80211_SEC_CHAN_NO_HT;
41 unsigned int freq;
42 int i;
43
44 if (!argc || argc > 2)
45 return 1;
46
47 if (argc == 2) {
Johannes Berg7d736012008-12-08 12:59:16 +010048 for (i = 0; i < ARRAY_SIZE(htmap); i++) {
Johannes Bergb822cda2008-12-08 12:43:42 +010049 if (strcasecmp(htmap[i].name, argv[1]) == 0) {
50 htval = htmap[i].val;
51 break;
52 }
53 }
54 if (htval == NL80211_SEC_CHAN_NO_HT)
55 return 1;
56 }
57
58 freq = strtoul(argv[0], NULL, 10);
Johannes Berg379f8392008-12-08 12:53:58 +010059 if (chan)
60 freq = ieee80211_channel_to_frequency(freq);
Johannes Bergb822cda2008-12-08 12:43:42 +010061
62 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
63 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET, htval);
64
65 return 0;
66 nla_put_failure:
67 return -ENOBUFS;
68}
Johannes Berg379f8392008-12-08 12:53:58 +010069
70static int handle_freq(struct nl_cb *cb, struct nl_msg *msg,
71 int argc, char **argv)
72{
73 return handle_freqchan(msg, false, argc, argv);
74}
Johannes Bergb822cda2008-12-08 12:43:42 +010075COMMAND(set, freq, "<freq> [HT20|HT40+|HT40-]",
76 NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_freq);
77COMMAND(set, freq, "<freq> [HT20|HT40+|HT40-]",
78 NL80211_CMD_SET_WIPHY, 0, CIB_NETDEV, handle_freq);
Johannes Berg379f8392008-12-08 12:53:58 +010079
80static int handle_chan(struct nl_cb *cb, struct nl_msg *msg,
81 int argc, char **argv)
82{
83 return handle_freqchan(msg, true, argc, argv);
84}
85COMMAND(set, channel, "<channel> [HT20|HT40+|HT40-]",
86 NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_chan);
87COMMAND(set, channel, "<channel> [HT20|HT40+|HT40-]",
88 NL80211_CMD_SET_WIPHY, 0, CIB_NETDEV, handle_chan);