5 #include <netlink/genl/genl.h>
6 #include <netlink/genl/family.h>
7 #include <netlink/genl/ctrl.h>
8 #include <netlink/msg.h>
9 #include <netlink/attr.h>
16 static int print_survey_handler(struct nl_msg
*msg
, void *arg
)
18 struct nlattr
*tb
[NL80211_ATTR_MAX
+ 1];
19 struct genlmsghdr
*gnlh
= nlmsg_data(nlmsg_hdr(msg
));
20 struct nlattr
*sinfo
[NL80211_SURVEY_INFO_MAX
+ 1];
23 static struct nla_policy survey_policy
[NL80211_SURVEY_INFO_MAX
+ 1] = {
24 [NL80211_SURVEY_INFO_FREQUENCY
] = { .type
= NLA_U32
},
25 [NL80211_SURVEY_INFO_NOISE
] = { .type
= NLA_U8
},
28 nla_parse(tb
, NL80211_ATTR_MAX
, genlmsg_attrdata(gnlh
, 0),
29 genlmsg_attrlen(gnlh
, 0), NULL
);
31 if_indextoname(nla_get_u32(tb
[NL80211_ATTR_IFINDEX
]), dev
);
32 printf("Survey data from %s\n", dev
);
34 if (!tb
[NL80211_ATTR_SURVEY_INFO
]) {
35 fprintf(stderr
, "survey data missing!\n");
39 if (nla_parse_nested(sinfo
, NL80211_SURVEY_INFO_MAX
,
40 tb
[NL80211_ATTR_SURVEY_INFO
],
42 fprintf(stderr
, "failed to parse nested attributes!\n");
46 if (sinfo
[NL80211_SURVEY_INFO_FREQUENCY
])
47 printf("\tfrequency:\t\t\t%u MHz%s\n",
48 nla_get_u32(sinfo
[NL80211_SURVEY_INFO_FREQUENCY
]),
49 sinfo
[NL80211_SURVEY_INFO_IN_USE
] ? " [in use]" : "");
50 if (sinfo
[NL80211_SURVEY_INFO_NOISE
])
51 printf("\tnoise:\t\t\t\t%d dBm\n",
52 (int8_t)nla_get_u8(sinfo
[NL80211_SURVEY_INFO_NOISE
]));
53 if (sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME
])
54 printf("\tchannel active time:\t\t%llu ms\n",
55 (unsigned long long)nla_get_u64(sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME
]));
56 if (sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY
])
57 printf("\tchannel busy time:\t\t%llu ms\n",
58 (unsigned long long)nla_get_u64(sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY
]));
59 if (sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY
])
60 printf("\textension channel busy time:\t%llu ms\n",
61 (unsigned long long)nla_get_u64(sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY
]));
62 if (sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_RX
])
63 printf("\tchannel receive time:\t\t%llu ms\n",
64 (unsigned long long)nla_get_u64(sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_RX
]));
65 if (sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_TX
])
66 printf("\tchannel transmit time:\t\t%llu ms\n",
67 (unsigned long long)nla_get_u64(sinfo
[NL80211_SURVEY_INFO_CHANNEL_TIME_TX
]));
71 static int handle_survey_dump(struct nl80211_state
*state
,
74 int argc
, char **argv
,
77 nl_cb_set(cb
, NL_CB_VALID
, NL_CB_CUSTOM
, print_survey_handler
, NULL
);
80 COMMAND(survey
, dump
, NULL
,
81 NL80211_CMD_GET_SURVEY
, NLM_F_DUMP
, CIB_NETDEV
, handle_survey_dump
,
82 "List all gathered channel survey data");