X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=ibss.c;h=84f1e956b80e9e71c79538bbd33c294d1472e43e;hb=f3c9666902dd88d68cd018d1f56a3812f9e5369a;hp=65016d12a15947b706e50a7c8fe8dc07f27dd3e0;hpb=01ae06f9e9d2bf3e7e998bcbda06fd916c92f34e;p=thirdparty%2Fiw.git diff --git a/ibss.c b/ibss.c index 65016d1..84f1e95 100644 --- a/ibss.c +++ b/ibss.c @@ -1,21 +1,26 @@ #include - -#include -#include -#include -#include -#include +#include +#include #include "nl80211.h" #include "iw.h" +SECTION(ibss); + static int join_ibss(struct nl80211_state *state, - struct nl_cb *cb, struct nl_msg *msg, - int argc, char **argv) + int argc, char **argv, + enum id_input id) { char *end; + struct chandef chandef; unsigned char abssid[6]; + unsigned char rates[NL80211_MAX_SUPP_RATES]; + int n_rates = 0; + char *value = NULL, *sptr = NULL; + float rate; + int bintval; + int parsed, err; if (argc < 2) return 1; @@ -25,13 +30,16 @@ static int join_ibss(struct nl80211_state *state, argv++; argc--; - /* freq */ - NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, - strtoul(argv[0], &end, 10)); - if (*end != '\0') - return 1; - argv++; - argc--; + err = parse_freqchan(&chandef, false, argc, argv, &parsed); + if (err) + return err; + + argv += parsed; + argc -= parsed; + + put_chandef(msg, &chandef); + if (err) + return err; if (argc && strcmp(argv[0], "fixed-freq") == 0) { NLA_PUT_FLAG(msg, NL80211_ATTR_FREQ_FIXED); @@ -40,29 +48,96 @@ static int join_ibss(struct nl80211_state *state, } if (argc) { - if (mac_addr_a2n(abssid, argv[0])) + if (mac_addr_a2n(abssid, argv[0]) == 0) { + NLA_PUT(msg, NL80211_ATTR_MAC, 6, abssid); + argv++; + argc--; + } + } + + if (argc > 1 && strcmp(argv[0], "beacon-interval") == 0) { + argv++; + argc--; + bintval = strtoul(argv[0], &end, 10); + if (*end != '\0') return 1; - NLA_PUT(msg, NL80211_ATTR_MAC, 6, abssid); + NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, bintval); argv++; argc--; } - if (argc) + /* basic rates */ + if (argc > 1 && strcmp(argv[0], "basic-rates") == 0) { + argv++; + argc--; + + value = strtok_r(argv[0], ",", &sptr); + + while (value && n_rates < NL80211_MAX_SUPP_RATES) { + rate = strtod(value, &end); + rates[n_rates] = rate * 2; + + /* filter out suspicious values */ + if (*end != '\0' || !rates[n_rates] || + rate*2 != rates[n_rates]) + return 1; + + n_rates++; + value = strtok_r(NULL, ",", &sptr); + } + + NLA_PUT(msg, NL80211_ATTR_BSS_BASIC_RATES, n_rates, rates); + + argv++; + argc--; + } + + /* multicast rate */ + if (argc > 1 && strcmp(argv[0], "mcast-rate") == 0) { + argv++; + argc--; + + rate = strtod(argv[0], &end); + if (*end != '\0') + return 1; + + NLA_PUT_U32(msg, NL80211_ATTR_MCAST_RATE, (int)(rate * 10)); + argv++; + argc--; + } + + if (!argc) + return 0; + + if (strcmp(*argv, "key") != 0 && strcmp(*argv, "keys") != 0) return 1; - return 0; + argv++; + argc--; + + return parse_keys(msg, argv, argc); nla_put_failure: return -ENOSPC; } static int leave_ibss(struct nl80211_state *state, - struct nl_cb *cb, struct nl_msg *msg, - int argc, char **argv) + int argc, char **argv, + enum id_input id) { return 0; } COMMAND(ibss, leave, NULL, - NL80211_CMD_LEAVE_IBSS, 0, CIB_NETDEV, leave_ibss, NULL); -COMMAND(ibss, join, " [fixed-freq] []", - NL80211_CMD_JOIN_IBSS, 0, CIB_NETDEV, join_ibss, NULL); + NL80211_CMD_LEAVE_IBSS, 0, CIB_NETDEV, leave_ibss, + "Leave the current IBSS cell."); +COMMAND(ibss, join, + " [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] [fixed-freq] [] [beacon-interval ]" + " [basic-rates ] [mcast-rate ] " + "[key d:0:abcde]", + NL80211_CMD_JOIN_IBSS, 0, CIB_NETDEV, join_ibss, + "Join the IBSS cell with the given SSID, if it doesn't exist create\n" + "it on the given frequency. When fixed frequency is requested, don't\n" + "join/create a cell on a different frequency. When a fixed BSSID is\n" + "requested use that BSSID and do not adopt another cell's BSSID even\n" + "if it has higher TSF and the same SSID. If an IBSS is created, create\n" + "it with the specified basic-rates, multicast-rate and beacon-interval.");