]> git.ipfire.org Git - thirdparty/iw.git/blame - keys.c
iw: fix attribute size mismatch
[thirdparty/iw.git] / keys.c
CommitLineData
cc660ccb
RM
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(key);
11
12static int print_keys(struct nl_msg *msg, void *arg)
13{
14 struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
15 struct nlattr *tb[NL80211_ATTR_MAX + 1];
16
17 nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
18 genlmsg_attrlen(gnlh, 0), NULL);
19
20 if (!tb[NL80211_ATTR_KEY_IDX]) {
21 fprintf(stderr, "KEY_IDX missing!\n");
22 return NL_SKIP;
23 }
24
25 if (!tb[NL80211_ATTR_KEY_DATA]) {
26 fprintf(stderr, "ATTR_KEY_DATA missing!\n");
27 return NL_SKIP;
28 }
29
30 iw_hexdump("Key", nla_data(tb[NL80211_ATTR_KEY_DATA]),
31 nla_len(tb[NL80211_ATTR_KEY_DATA]));
32
33 if (!tb[NL80211_ATTR_KEY_SEQ]) {
34 fprintf(stderr, "ATTR_KEY_SEQ missing!\n");
35 return NL_SKIP;
36 }
37
38 iw_hexdump("Key seq", nla_data(tb[NL80211_ATTR_KEY_SEQ]),
39 nla_len(tb[NL80211_ATTR_KEY_SEQ]));
40
41 return NL_OK;
42}
43
44static int handle_get_key(struct nl80211_state *state,
45 struct nl_msg *msg, int argc, char **argv,
46 enum id_input id)
47{
48 char *end;
49 unsigned char mac[6];
50
51 /* key index */
52 if (argc) {
53 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, strtoul(argv[0], &end, 10));
54 if (*end != '\0')
55 return -EINVAL;
56 argv++;
57 argc--;
58 }
59
60 /* mac */
61 if (argc) {
62 if (mac_addr_a2n(mac, argv[0]) == 0) {
63 NLA_PUT(msg, NL80211_ATTR_MAC, 6, mac);
64 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE,
65 NL80211_KEYTYPE_PAIRWISE);
66 argv++;
67 argc--;
68 } else {
69 return -EINVAL;
70 }
71 } else {
72 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, NL80211_KEYTYPE_GROUP);
73 }
74
75 register_handler(print_keys, NULL);
76 return 0;
77
78 nla_put_failure:
79 return -ENOSPC;
80}
81COMMAND(key, get, "<key index> <MAC address>",
82 NL80211_CMD_GET_KEY, 0, CIB_NETDEV, handle_get_key,
83 "Retrieve a key and key sequence.\n");