1*92022041SSam Saccone #include <errno.h>
2*92022041SSam Saccone #include <string.h>
3*92022041SSam Saccone #include <strings.h>
4*92022041SSam Saccone
5*92022041SSam Saccone #include "nl80211.h"
6*92022041SSam Saccone #include "iw.h"
7*92022041SSam Saccone
8*92022041SSam Saccone SECTION(ibss);
9*92022041SSam Saccone
join_ibss(struct nl80211_state * state,struct nl_msg * msg,int argc,char ** argv,enum id_input id)10*92022041SSam Saccone static int join_ibss(struct nl80211_state *state,
11*92022041SSam Saccone struct nl_msg *msg,
12*92022041SSam Saccone int argc, char **argv,
13*92022041SSam Saccone enum id_input id)
14*92022041SSam Saccone {
15*92022041SSam Saccone char *end;
16*92022041SSam Saccone struct chandef chandef;
17*92022041SSam Saccone unsigned char abssid[6];
18*92022041SSam Saccone unsigned char rates[NL80211_MAX_SUPP_RATES];
19*92022041SSam Saccone int n_rates = 0;
20*92022041SSam Saccone char *value = NULL, *sptr = NULL;
21*92022041SSam Saccone float rate;
22*92022041SSam Saccone int bintval;
23*92022041SSam Saccone int parsed, err;
24*92022041SSam Saccone
25*92022041SSam Saccone if (argc < 2)
26*92022041SSam Saccone return 1;
27*92022041SSam Saccone
28*92022041SSam Saccone /* SSID */
29*92022041SSam Saccone NLA_PUT(msg, NL80211_ATTR_SSID, strlen(argv[0]), argv[0]);
30*92022041SSam Saccone argv++;
31*92022041SSam Saccone argc--;
32*92022041SSam Saccone
33*92022041SSam Saccone err = parse_freqchan(&chandef, false, argc, argv, &parsed);
34*92022041SSam Saccone if (err)
35*92022041SSam Saccone return err;
36*92022041SSam Saccone
37*92022041SSam Saccone argv += parsed;
38*92022041SSam Saccone argc -= parsed;
39*92022041SSam Saccone
40*92022041SSam Saccone err = put_chandef(msg, &chandef);
41*92022041SSam Saccone if (err)
42*92022041SSam Saccone return err;
43*92022041SSam Saccone
44*92022041SSam Saccone if (argc && strcmp(argv[0], "fixed-freq") == 0) {
45*92022041SSam Saccone NLA_PUT_FLAG(msg, NL80211_ATTR_FREQ_FIXED);
46*92022041SSam Saccone argv++;
47*92022041SSam Saccone argc--;
48*92022041SSam Saccone }
49*92022041SSam Saccone
50*92022041SSam Saccone if (argc) {
51*92022041SSam Saccone if (mac_addr_a2n(abssid, argv[0]) == 0) {
52*92022041SSam Saccone NLA_PUT(msg, NL80211_ATTR_MAC, 6, abssid);
53*92022041SSam Saccone argv++;
54*92022041SSam Saccone argc--;
55*92022041SSam Saccone }
56*92022041SSam Saccone }
57*92022041SSam Saccone
58*92022041SSam Saccone if (argc > 1 && strcmp(argv[0], "beacon-interval") == 0) {
59*92022041SSam Saccone argv++;
60*92022041SSam Saccone argc--;
61*92022041SSam Saccone bintval = strtoul(argv[0], &end, 10);
62*92022041SSam Saccone if (*end != '\0')
63*92022041SSam Saccone return 1;
64*92022041SSam Saccone NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, bintval);
65*92022041SSam Saccone argv++;
66*92022041SSam Saccone argc--;
67*92022041SSam Saccone }
68*92022041SSam Saccone
69*92022041SSam Saccone /* basic rates */
70*92022041SSam Saccone if (argc > 1 && strcmp(argv[0], "basic-rates") == 0) {
71*92022041SSam Saccone argv++;
72*92022041SSam Saccone argc--;
73*92022041SSam Saccone
74*92022041SSam Saccone value = strtok_r(argv[0], ",", &sptr);
75*92022041SSam Saccone
76*92022041SSam Saccone while (value && n_rates < NL80211_MAX_SUPP_RATES) {
77*92022041SSam Saccone rate = strtod(value, &end);
78*92022041SSam Saccone rates[n_rates] = rate * 2;
79*92022041SSam Saccone
80*92022041SSam Saccone /* filter out suspicious values */
81*92022041SSam Saccone if (*end != '\0' || !rates[n_rates] ||
82*92022041SSam Saccone rate*2 != rates[n_rates])
83*92022041SSam Saccone return 1;
84*92022041SSam Saccone
85*92022041SSam Saccone n_rates++;
86*92022041SSam Saccone value = strtok_r(NULL, ",", &sptr);
87*92022041SSam Saccone }
88*92022041SSam Saccone
89*92022041SSam Saccone NLA_PUT(msg, NL80211_ATTR_BSS_BASIC_RATES, n_rates, rates);
90*92022041SSam Saccone
91*92022041SSam Saccone argv++;
92*92022041SSam Saccone argc--;
93*92022041SSam Saccone }
94*92022041SSam Saccone
95*92022041SSam Saccone /* multicast rate */
96*92022041SSam Saccone if (argc > 1 && strcmp(argv[0], "mcast-rate") == 0) {
97*92022041SSam Saccone argv++;
98*92022041SSam Saccone argc--;
99*92022041SSam Saccone
100*92022041SSam Saccone rate = strtod(argv[0], &end);
101*92022041SSam Saccone if (*end != '\0')
102*92022041SSam Saccone return 1;
103*92022041SSam Saccone
104*92022041SSam Saccone NLA_PUT_U32(msg, NL80211_ATTR_MCAST_RATE, (int)(rate * 10));
105*92022041SSam Saccone argv++;
106*92022041SSam Saccone argc--;
107*92022041SSam Saccone }
108*92022041SSam Saccone
109*92022041SSam Saccone if (!argc)
110*92022041SSam Saccone return 0;
111*92022041SSam Saccone
112*92022041SSam Saccone if (strcmp(*argv, "key") != 0 && strcmp(*argv, "keys") != 0)
113*92022041SSam Saccone return 1;
114*92022041SSam Saccone
115*92022041SSam Saccone argv++;
116*92022041SSam Saccone argc--;
117*92022041SSam Saccone
118*92022041SSam Saccone return parse_keys(msg, &argv, &argc);
119*92022041SSam Saccone nla_put_failure:
120*92022041SSam Saccone return -ENOSPC;
121*92022041SSam Saccone }
122*92022041SSam Saccone
leave_ibss(struct nl80211_state * state,struct nl_msg * msg,int argc,char ** argv,enum id_input id)123*92022041SSam Saccone static int leave_ibss(struct nl80211_state *state,
124*92022041SSam Saccone struct nl_msg *msg,
125*92022041SSam Saccone int argc, char **argv,
126*92022041SSam Saccone enum id_input id)
127*92022041SSam Saccone {
128*92022041SSam Saccone return 0;
129*92022041SSam Saccone }
130*92022041SSam Saccone COMMAND(ibss, leave, NULL,
131*92022041SSam Saccone NL80211_CMD_LEAVE_IBSS, 0, CIB_NETDEV, leave_ibss,
132*92022041SSam Saccone "Leave the current IBSS cell.");
133*92022041SSam Saccone COMMAND(ibss, join,
134*92022041SSam Saccone "<SSID> <freq in MHz> [NOHT|HT20|HT40+|HT40-|5MHz|10MHz|80MHz] [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
135*92022041SSam Saccone " [basic-rates <rate in Mbps,rate2,...>] [mcast-rate <rate in Mbps>] "
136*92022041SSam Saccone "[key d:0:abcde]",
137*92022041SSam Saccone NL80211_CMD_JOIN_IBSS, 0, CIB_NETDEV, join_ibss,
138*92022041SSam Saccone "Join the IBSS cell with the given SSID, if it doesn't exist create\n"
139*92022041SSam Saccone "it on the given frequency. When fixed frequency is requested, don't\n"
140*92022041SSam Saccone "join/create a cell on a different frequency. When a fixed BSSID is\n"
141*92022041SSam Saccone "requested use that BSSID and do not adopt another cell's BSSID even\n"
142*92022041SSam Saccone "if it has higher TSF and the same SSID. If an IBSS is created, create\n"
143*92022041SSam Saccone "it with the specified basic-rates, multicast-rate and beacon-interval.");
144