From 6829308d4f625b5d0a03550597e5b3be20932346 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Tue, 2 Feb 2010 20:51:42 +0100 Subject: [PATCH] add off-channel command --- Makefile | 2 +- event.c | 11 +++++++++++ offch.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 offch.c diff --git a/Makefile b/Makefile index 2a6fc9a..bae1bfb 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ CFLAGS += -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing OBJS = iw.o genl.o event.o info.o phy.o \ interface.o ibss.o station.o survey.o util.o \ mesh.o mpath.o scan.o reg.o version.o \ - reason.o status.o connect.o link.o + reason.o status.o connect.o link.o offch.o OBJS += sections.o ALL = iw diff --git a/event.c b/event.c index 445db5f..01a325c 100644 --- a/event.c +++ b/event.c @@ -302,6 +302,17 @@ static int print_event(struct nl_msg *msg, void *arg) get_reason_str(nla_get_u16(tb[NL80211_ATTR_REASON_CODE]))); printf("\n"); break; + case NL80211_CMD_REMAIN_ON_CHANNEL: + printf("remain on freq %d (%dms, cookie %llx)\n", + nla_get_u32(tb[NL80211_ATTR_WIPHY_FREQ]), + nla_get_u32(tb[NL80211_ATTR_DURATION]), + (unsigned long long)nla_get_u64(tb[NL80211_ATTR_COOKIE])); + break; + case NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL: + printf("done with remain on freq %d (cookie %llx)\n", + nla_get_u32(tb[NL80211_ATTR_WIPHY_FREQ]), + (unsigned long long)nla_get_u64(tb[NL80211_ATTR_COOKIE])); + break; default: printf("unknown event %d\n", gnlh->cmd); break; diff --git a/offch.c b/offch.c new file mode 100644 index 0000000..b40a523 --- /dev/null +++ b/offch.c @@ -0,0 +1,43 @@ +#include + +#include +#include +#include +#include +#include + +#include "nl80211.h" +#include "iw.h" + +static int offchannel(struct nl80211_state *state, struct nl_cb *cb, + struct nl_msg *msg, int argc, char **argv) +{ + char *end; + + /* freq */ + NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, + strtoul(argv[0], &end, 10)); + if (*end != '\0') + return 1; + argv++; + argc--; + + /* duration */ + NLA_PUT_U32(msg, NL80211_ATTR_DURATION, + strtoul(argv[0], &end, 10)); + if (*end != '\0') + return 1; + argv++; + argc--; + + if (argc) + return 1; + + return 0; + nla_put_failure: + return -ENOSPC; +} + +TOPLEVEL(offchannel, " ", NL80211_CMD_REMAIN_ON_CHANNEL, 0, + CIB_NETDEV, offchannel, + "Leave operating channel and go to the given channel for a while."); -- 2.39.2