blob: 1c0938a60dc23384d79dc9dce1efff8b1dc09a24 [file] [log] [blame]
#include <stdbool.h>
#include <errno.h>
#include <net/if.h>
#include <netlink/genl/genl.h>
#include <netlink/genl/family.h>
#include <netlink/genl/ctrl.h>
#include <netlink/msg.h>
#include <netlink/attr.h>
#include "nl80211.h"
#include "iw.h"
static int handle_name(struct nl80211_state *state,
struct nl_cb *cb,
struct nl_msg *msg,
int argc, char **argv)
{
if (argc != 1)
return 1;
NLA_PUT_STRING(msg, NL80211_ATTR_WIPHY_NAME, *argv);
return 0;
nla_put_failure:
return -ENOBUFS;
}
COMMAND(set, name, "<new name>", NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_name,
"Rename this wireless device.");
static int handle_freqchan(struct nl_msg *msg, bool chan,
int argc, char **argv)
{
static const struct {
const char *name;
unsigned int val;
} htmap[] = {
{ .name = "HT20", .val = NL80211_CHAN_HT20, },
{ .name = "HT40+", .val = NL80211_CHAN_HT40PLUS, },
{ .name = "HT40-", .val = NL80211_CHAN_HT40MINUS, },
};
unsigned int htval = NL80211_CHAN_NO_HT;
unsigned int freq;
int i;
if (!argc || argc > 2)
return 1;
if (argc == 2) {
for (i = 0; i < ARRAY_SIZE(htmap); i++) {
if (strcasecmp(htmap[i].name, argv[1]) == 0) {
htval = htmap[i].val;
break;
}
}
if (htval == NL80211_CHAN_NO_HT)
return 1;
}
freq = strtoul(argv[0], NULL, 10);
if (chan)
freq = ieee80211_channel_to_frequency(freq);
NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, htval);
return 0;
nla_put_failure:
return -ENOBUFS;
}
static int handle_freq(struct nl80211_state *state,
struct nl_cb *cb, struct nl_msg *msg,
int argc, char **argv)
{
return handle_freqchan(msg, false, argc, argv);
}
COMMAND(set, freq, "<freq> [HT20|HT40+|HT40-]",
NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_freq,
"Set frequency/channel the hardware is using, including HT\n"
"configuration.");
COMMAND(set, freq, "<freq> [HT20|HT40+|HT40-]",
NL80211_CMD_SET_WIPHY, 0, CIB_NETDEV, handle_freq, NULL);
static int handle_chan(struct nl80211_state *state,
struct nl_cb *cb, struct nl_msg *msg,
int argc, char **argv)
{
return handle_freqchan(msg, true, argc, argv);
}
COMMAND(set, channel, "<channel> [HT20|HT40+|HT40-]",
NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_chan, NULL);
COMMAND(set, channel, "<channel> [HT20|HT40+|HT40-]",
NL80211_CMD_SET_WIPHY, 0, CIB_NETDEV, handle_chan, NULL);