]> git.ipfire.org Git - thirdparty/iw.git/blame - ap.c
iw: ap: add support for passing a proper chandef
[thirdparty/iw.git] / ap.c
CommitLineData
60b6c638
IP
1#include <errno.h>
2#include <netlink/genl/genl.h>
3#include <netlink/genl/family.h>
4#include <netlink/genl/ctrl.h>
5#include <netlink/msg.h>
6#include <netlink/attr.h>
7#include "nl80211.h"
8#include "iw.h"
9
10SECTION(ap);
11
12static int handle_start_ap(struct nl80211_state *state,
13 struct nl_msg *msg, int argc, char **argv,
14 enum id_input id)
15{
26cab677
ST
16 struct chandef chandef;
17 int res, parsed;
60b6c638
IP
18 char *end;
19 int val, len;
20 char buf[2304];
21
22 if (argc < 6)
23 return 1;
24
25 /* SSID */
26 NLA_PUT(msg, NL80211_ATTR_SSID, strlen(argv[0]), argv[0]);
27 argv++;
28 argc--;
29
26cab677
ST
30 /* chandef */
31 res = parse_freqchan(&chandef, false, argc, argv, &parsed);
32 if (res)
33 return res;
34 argc -= parsed;
35 argv += parsed;
36 res = put_chandef(msg, &chandef);
37 if (res)
38 return res;
60b6c638
IP
39
40 /* beacon interval */
41 val = strtoul(argv[0], &end, 10);
42 if (*end != '\0')
43 return -EINVAL;
44
45 NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, val);
46 argv++;
47 argc--;
48
49 /* dtim */
50 val = strtoul(argv[0], &end, 10);
51 if (*end != '\0')
52 return -EINVAL;
53
54 NLA_PUT_U32(msg, NL80211_ATTR_DTIM_PERIOD, val);
55 argv++;
56 argc--;
57
58 /* beacon head must be provided */
59 if (strcmp(argv[0], "head") != 0)
60 return -1;
61 argv++;
62 argc--;
63
64 len = strlen(argv[0]);
65 if (!len || (len % 2))
66 return -EINVAL;
67
68 if (!hex2bin(&argv[0][0], buf))
69 return -EINVAL;
70
71 NLA_PUT(msg, NL80211_ATTR_BEACON_HEAD, (len / 2), &buf);
72 argv++;
73 argc--;
74
75 if (!argc)
76 return 0;
77
78 /* tail is optional */
79 if (strcmp(argv[0], "tail") == 0) {
80 argv++;
81 argc--;
82
83 if (!argc)
84 return -EINVAL;
85
86 len = strlen(argv[0]);
87 if (!len || (len % 2))
88 return -EINVAL;
89
90 if (!hex2bin(&argv[0][0], buf))
91 return -EINVAL;
92
93 NLA_PUT(msg, NL80211_ATTR_BEACON_TAIL, (len / 2), &buf);
94 argv++;
95 argc--;
96 }
97
98 if (!argc)
99 return 0;
100
101 if (strcmp(*argv, "key") != 0 && strcmp(*argv, "keys") != 0)
102 return 1;
103
104 argv++;
105 argc--;
106
107 return parse_keys(msg, argv, argc);
108 nla_put_failure:
109 return -ENOSPC;
110}
111COMMAND(ap, start, "",
112 NL80211_CMD_NEW_BEACON, 0, CIB_NETDEV, handle_start_ap,
26cab677
ST
113 "<SSID> <control freq> [5|10|20|40|80|80+80|160] [<center1_freq> [<center2_freq>]]"
114 " <beacon interval in TU> <DTIM period> head"
115 " <beacon head in hexadecimal> [tail <beacon tail in hexadecimal>]"
60b6c638
IP
116 " [key0:abcde d:1:6162636465]\n");
117
118static int handle_stop_ap(struct nl80211_state *state,
119 struct nl_msg *msg,
120 int argc, char **argv,
121 enum id_input id)
122{
123 return 0;
124}
125COMMAND(ap, stop, "",
126 NL80211_CMD_DEL_BEACON, 0, CIB_NETDEV, handle_stop_ap,
127 "Stop AP functionality\n");