xref: /aosp_15_r20/external/iw/ibss.c (revision 92022041c981f431db0b590d0c3272306d0ea2a2)
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