3 #include <netlink/genl/genl.h>
4 #include <netlink/genl/family.h>
5 #include <netlink/genl/ctrl.h>
6 #include <netlink/msg.h>
7 #include <netlink/attr.h>
14 static int print_survey_handler(struct nl_msg
*msg
, void *arg
)
16 struct nlattr
*tb
[NL80211_ATTR_MAX
+ 1];
17 struct genlmsghdr
*gnlh
= nlmsg_data(nlmsg_hdr(msg
));
18 struct nlattr
*sinfo
[NL80211_SURVEY_INFO_MAX
+ 1];
21 static struct nla_policy survey_policy
[NL80211_SURVEY_INFO_MAX
+ 1] = {
22 [NL80211_SURVEY_INFO_FREQUENCY
] = { .type
= NLA_U32
},
23 [NL80211_SURVEY_INFO_NOISE
] = { .type
= NLA_U8
},
26 nla_parse(tb
, NL80211_ATTR_MAX
, genlmsg_attrdata(gnlh
, 0),
27 genlmsg_attrlen(gnlh
, 0), NULL
);
29 if_indextoname(nla_get_u32(tb
[NL80211_ATTR_IFINDEX
]), dev
);
30 printf("Survey data from %s\n", dev
);
32 if (!tb
[NL80211_ATTR_SURVEY_INFO
]) {
33 fprintf(stderr
, "survey data missing!\n");
37 if (nla_parse_nested(sinfo
, NL80211_SURVEY_INFO_MAX
,
38 tb
[NL80211_ATTR_SURVEY_INFO
],
40 fprintf(stderr
, "failed to parse nested attributes!\n");
44 if (sinfo
[NL80211_SURVEY_INFO_FREQUENCY
])
45 printf("\tfrequency:\t\t\t%u MHz%s\n",
46 nla_get_u32(sinfo
[NL80211_SURVEY_INFO_FREQUENCY
]),
47 sinfo
[NL80211_SURVEY_INFO_IN_USE
] ? " [in use]" : "");
48 if (sinfo
[NL80211_SURVEY_INFO_NOISE
])
49 printf("\tnoise:\t\t\t\t%d dBm\n",
50 (int8_t)nla_get_u8(sinfo
[NL80211_SURVEY_INFO_NOISE
]));
51 if (sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME
])
52 printf("\tchannel active time:\t\t%llu ms\n",
53 (unsigned long long)nla_get_u64(sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME
]));
54 if (sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY
])
55 printf("\tchannel busy time:\t\t%llu ms\n",
56 (unsigned long long)nla_get_u64(sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY
]));
57 if (sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY
])
58 printf("\textension channel busy time:\t%llu ms\n",
59 (unsigned long long)nla_get_u64(sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY
]));
60 if (sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_RX
])
61 printf("\tchannel receive time:\t\t%llu ms\n",
62 (unsigned long long)nla_get_u64(sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_RX
]));
63 if (sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_TX
])
64 printf("\tchannel transmit time:\t\t%llu ms\n",
65 (unsigned long long)nla_get_u64(sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_TX
]));
69 static int handle_survey_dump(struct nl80211_state
*state
,
71 int argc
, char **argv
,
75 return HANDLER_RET_USAGE
;
78 if (!strcmp(argv
[0], "--radio"))
79 nla_put_flag(msg
, NL80211_ATTR_SURVEY_RADIO_STATS
);
81 return HANDLER_RET_USAGE
;
84 register_handler(print_survey_handler
, NULL
);
87 COMMAND(survey
, dump
, "[--radio]",
88 NL80211_CMD_GET_SURVEY
, NLM_F_DUMP
, CIB_NETDEV
, handle_survey_dump
,
89 "List all gathered channel survey data");