blob: 7021882ab3616905bddd334b3e43c76b9f0447e3 [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001import netlink.capi as nl
2import netlink.genl.capi as genl
3import nl80211
4import sys
5import traceback
6
7class test_class:
8 def __init__(self):
9 self.done = 1;
10
11def msg_handler(m, a):
12 try:
13 e, attr = genl.py_genlmsg_parse(nl.nlmsg_hdr(m), 0,
14 nl80211.NL80211_ATTR_MAX, None)
15 if nl80211.NL80211_ATTR_WIPHY in attr:
16 thiswiphy = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_WIPHY])
17 print("phy#%d" % thiswiphy)
18 if nl80211.NL80211_ATTR_IFNAME in attr:
19 print("\tinterface %s" % nl.nla_get_string(attr[nl80211.NL80211_ATTR_IFNAME]));
20 if nl80211.NL80211_ATTR_IFINDEX in attr:
21 print("\tifindex %d" % nl.nla_get_u32(attr[nl80211.NL80211_ATTR_IFINDEX]))
22 if nl80211.NL80211_ATTR_WDEV in attr:
23 print("\twdev 0x%lx" % nl.nla_get_u64(attr[nl80211.NL80211_ATTR_WDEV]))
24 if nl80211.NL80211_ATTR_MAC in attr:
25 print("\tmac %02x:%02x:%02x:%02x:%02x:%02x" % tuple(nl.nla_data(attr[nl80211.NL80211_ATTR_MAC])))
26 if nl80211.NL80211_ATTR_SSID in attr:
27 print("\tssid ", nl.nla_data(attr[nl80211.NL80211_ATTR_SSID]))
28 if nl80211.NL80211_ATTR_IFTYPE in attr:
29 iftype = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_IFTYPE])
30 print("\ttype %s" % nl80211.nl80211_iftype2str[iftype])
31 if nl80211.NL80211_ATTR_WIPHY_FREQ in attr:
32 freq = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_WIPHY_FREQ])
33
34 sys.stdout.write("\tfreq %d MHz" % freq);
35
36 if nl80211.NL80211_ATTR_CHANNEL_WIDTH in attr:
37 chanw = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_CHANNEL_WIDTH])
38 sys.stdout.write(", width: %s" % nl80211.nl80211_chan_width2str[chanw])
39 if nl80211.NL80211_ATTR_CENTER_FREQ1 in attr:
40 sys.stdout.write(", center1: %d MHz" %
41 nl.nla_get_u32(attr[nl80211.NL80211_ATTR_CENTER_FREQ1]))
42 if nl80211.NL80211_ATTR_CENTER_FREQ2 in attr:
43 sys.stdout.write(", center2: %d MHz" %
44 nl.nla_get_u32(attr[nl80211.NL80211_ATTR_CENTER_FREQ2]))
45 elif nl80211.NL80211_ATTR_WIPHY_CHANNEL_TYPE in attr:
46 channel_type = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_WIPHY_CHANNEL_TYPE])
47 sys.stdout.write(" %s" % nl80211.nl80211_channel_type2str(channel_type));
48
49 sys.stdout.write("\n");
50 return nl.NL_SKIP;
51 except Exception as e:
52 (t,v,tb) = sys.exc_info()
53 print v.message
54 traceback.print_tb(tb)
55
56def error_handler(err, a):
57 a.done = err.error
58 return nl.NL_STOP
59
60def finish_handler(m, a):
61 return nl.NL_SKIP
62
63def ack_handler(m, a):
64 a.done = 0
65 return nl.NL_STOP
66
67try:
68 cbd = test_class()
69 tx_cb = nl.nl_cb_alloc(nl.NL_CB_DEFAULT)
70 rx_cb = nl.nl_cb_clone(tx_cb)
71 s = nl.nl_socket_alloc_cb(tx_cb)
72 nl.py_nl_cb_err(rx_cb, nl.NL_CB_CUSTOM, error_handler, cbd);
73 nl.py_nl_cb_set(rx_cb, nl.NL_CB_FINISH, nl.NL_CB_CUSTOM, finish_handler, cbd);
74 nl.py_nl_cb_set(rx_cb, nl.NL_CB_ACK, nl.NL_CB_CUSTOM, ack_handler, cbd);
75 nl.py_nl_cb_set(rx_cb, nl.NL_CB_VALID, nl.NL_CB_CUSTOM, msg_handler, cbd);
76
77 genl.genl_connect(s)
78 family = genl.genl_ctrl_resolve(s, 'nl80211')
79 m = nl.nlmsg_alloc()
80 genl.genlmsg_put(m, 0, 0, family, 0, 0, nl80211.NL80211_CMD_GET_INTERFACE, 0)
81 nl.nla_put_u32(m, nl80211.NL80211_ATTR_IFINDEX, nl.if_nametoindex('wlan0'))
82
83 err = nl.nl_send_auto_complete(s, m);
84 if err < 0:
85 nl.nlmsg_free(msg)
86
87 while cbd.done > 0 and not err < 0:
88 err = nl.nl_recvmsgs(s, rx_cb)
89
90except Exception as e:
91 (t, v, tb) = sys.exc_info()
92 print v.message
93 traceback.print_tb(tb)