]>
Commit | Line | Data |
---|---|---|
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 | ||
10 | SECTION(key); | |
11 | ||
12 | static 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 | ||
44 | static 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 | } | |
81 | COMMAND(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"); |