blob: 0f5d05f0f4a9379c9822c842c8bf9072e8f6c50d [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 Berg7c37a242009-04-08 13:13:28 +020014static int handle_name(struct nl80211_state *state,
15 struct nl_cb *cb,
Johannes Berg0f55e0b2008-09-16 17:40:48 +020016 struct nl_msg *msg,
17 int argc, char **argv)
18{
Johannes Berg0f55e0b2008-09-16 17:40:48 +020019 if (argc != 1)
Johannes Berg5e75fd02008-09-16 18:13:12 +020020 return 1;
Johannes Berg0f55e0b2008-09-16 17:40:48 +020021
22 NLA_PUT_STRING(msg, NL80211_ATTR_WIPHY_NAME, *argv);
23
Johannes Berg70391cc2008-09-16 18:35:06 +020024 return 0;
Johannes Berg0f55e0b2008-09-16 17:40:48 +020025 nla_put_failure:
Johannes Berg70391cc2008-09-16 18:35:06 +020026 return -ENOBUFS;
Johannes Berg0f55e0b2008-09-16 17:40:48 +020027}
Johannes Berg01ae06f2009-05-05 14:48:16 +020028COMMAND(set, name, "<new name>", NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_name, NULL);
Johannes Bergb822cda2008-12-08 12:43:42 +010029
Johannes Berg379f8392008-12-08 12:53:58 +010030static int handle_freqchan(struct nl_msg *msg, bool chan,
31 int argc, char **argv)
Johannes Bergb822cda2008-12-08 12:43:42 +010032{
33 static const struct {
34 const char *name;
35 unsigned int val;
36 } htmap[] = {
Johannes Berg68632dc2008-12-12 22:40:45 +010037 { .name = "HT20", .val = NL80211_CHAN_HT20, },
38 { .name = "HT40+", .val = NL80211_CHAN_HT40PLUS, },
39 { .name = "HT40-", .val = NL80211_CHAN_HT40MINUS, },
Johannes Bergb822cda2008-12-08 12:43:42 +010040 };
Johannes Berg68632dc2008-12-12 22:40:45 +010041 unsigned int htval = NL80211_CHAN_NO_HT;
Johannes Bergb822cda2008-12-08 12:43:42 +010042 unsigned int freq;
43 int i;
44
45 if (!argc || argc > 2)
46 return 1;
47
48 if (argc == 2) {
Johannes Berg7d736012008-12-08 12:59:16 +010049 for (i = 0; i < ARRAY_SIZE(htmap); i++) {
Johannes Bergb822cda2008-12-08 12:43:42 +010050 if (strcasecmp(htmap[i].name, argv[1]) == 0) {
51 htval = htmap[i].val;
52 break;
53 }
54 }
Johannes Berg68632dc2008-12-12 22:40:45 +010055 if (htval == NL80211_CHAN_NO_HT)
Johannes Bergb822cda2008-12-08 12:43:42 +010056 return 1;
57 }
58
59 freq = strtoul(argv[0], NULL, 10);
Johannes Berg379f8392008-12-08 12:53:58 +010060 if (chan)
61 freq = ieee80211_channel_to_frequency(freq);
Johannes Bergb822cda2008-12-08 12:43:42 +010062
63 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
Johannes Berg68632dc2008-12-12 22:40:45 +010064 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, htval);
Johannes Bergb822cda2008-12-08 12:43:42 +010065
66 return 0;
67 nla_put_failure:
68 return -ENOBUFS;
69}
Johannes Berg379f8392008-12-08 12:53:58 +010070
Johannes Berg7c37a242009-04-08 13:13:28 +020071static int handle_freq(struct nl80211_state *state,
72 struct nl_cb *cb, struct nl_msg *msg,
Johannes Berg379f8392008-12-08 12:53:58 +010073 int argc, char **argv)
74{
75 return handle_freqchan(msg, false, argc, argv);
76}
Johannes Bergb822cda2008-12-08 12:43:42 +010077COMMAND(set, freq, "<freq> [HT20|HT40+|HT40-]",
Johannes Berg00c448b2009-05-05 15:04:19 +020078 NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_freq,
79 "Set frequency/channel the hardware is using, including HT\n"
80 "configuration.");
Johannes Bergb822cda2008-12-08 12:43:42 +010081COMMAND(set, freq, "<freq> [HT20|HT40+|HT40-]",
Johannes Berg01ae06f2009-05-05 14:48:16 +020082 NL80211_CMD_SET_WIPHY, 0, CIB_NETDEV, handle_freq, NULL);
Johannes Berg379f8392008-12-08 12:53:58 +010083
Johannes Berg7c37a242009-04-08 13:13:28 +020084static int handle_chan(struct nl80211_state *state,
85 struct nl_cb *cb, struct nl_msg *msg,
Johannes Berg379f8392008-12-08 12:53:58 +010086 int argc, char **argv)
87{
88 return handle_freqchan(msg, true, argc, argv);
89}
90COMMAND(set, channel, "<channel> [HT20|HT40+|HT40-]",
Johannes Berg01ae06f2009-05-05 14:48:16 +020091 NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_chan, NULL);
Johannes Berg379f8392008-12-08 12:53:58 +010092COMMAND(set, channel, "<channel> [HT20|HT40+|HT40-]",
Johannes Berg01ae06f2009-05-05 14:48:16 +020093 NL80211_CMD_SET_WIPHY, 0, CIB_NETDEV, handle_chan, NULL);