xref: /aosp_15_r20/external/libnl/python/examples/wiphy.py (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Workerfrom __future__ import print_function
2*4dc78e53SAndroid Build Coastguard Workerimport netlink.capi as nl
3*4dc78e53SAndroid Build Coastguard Workerimport netlink.genl.capi as genl
4*4dc78e53SAndroid Build Coastguard Workerimport nl80211
5*4dc78e53SAndroid Build Coastguard Workerimport sys
6*4dc78e53SAndroid Build Coastguard Workerimport traceback
7*4dc78e53SAndroid Build Coastguard Worker
8*4dc78e53SAndroid Build Coastguard Worker
9*4dc78e53SAndroid Build Coastguard Workerclass test_class:
10*4dc78e53SAndroid Build Coastguard Worker    def __init__(self):
11*4dc78e53SAndroid Build Coastguard Worker        self.done = 1
12*4dc78e53SAndroid Build Coastguard Worker
13*4dc78e53SAndroid Build Coastguard Worker
14*4dc78e53SAndroid Build Coastguard Workerdef freq_to_ch(freq):
15*4dc78e53SAndroid Build Coastguard Worker    if freq == 2484:
16*4dc78e53SAndroid Build Coastguard Worker        return 14
17*4dc78e53SAndroid Build Coastguard Worker
18*4dc78e53SAndroid Build Coastguard Worker    if freq < 2484:
19*4dc78e53SAndroid Build Coastguard Worker        return (freq - 2407) / 5
20*4dc78e53SAndroid Build Coastguard Worker
21*4dc78e53SAndroid Build Coastguard Worker    # FIXME: dot11ChannelStartingFactor (802.11-2007 17.3.8.3.2)
22*4dc78e53SAndroid Build Coastguard Worker    if freq < 45000:
23*4dc78e53SAndroid Build Coastguard Worker        return freq / 5 - 1000
24*4dc78e53SAndroid Build Coastguard Worker
25*4dc78e53SAndroid Build Coastguard Worker    if freq >= 58320 and freq <= 64800:
26*4dc78e53SAndroid Build Coastguard Worker        return (freq - 56160) / 2160
27*4dc78e53SAndroid Build Coastguard Worker
28*4dc78e53SAndroid Build Coastguard Worker    return 0
29*4dc78e53SAndroid Build Coastguard Worker
30*4dc78e53SAndroid Build Coastguard Worker
31*4dc78e53SAndroid Build Coastguard Workerdef handle_freq(attr, pol):
32*4dc78e53SAndroid Build Coastguard Worker    e, fattr = nl.py_nla_parse_nested(nl80211.NL80211_FREQUENCY_ATTR_MAX, attr, pol)
33*4dc78e53SAndroid Build Coastguard Worker    if nl80211.NL80211_FREQUENCY_ATTR_FREQ in fattr:
34*4dc78e53SAndroid Build Coastguard Worker        freq = nl.nla_get_u32(fattr[nl80211.NL80211_FREQUENCY_ATTR_FREQ])
35*4dc78e53SAndroid Build Coastguard Worker        sys.stdout.write("\t\tfreq %d MHz [%d]" % (freq, freq_to_ch(freq)))
36*4dc78e53SAndroid Build Coastguard Worker    if nl80211.NL80211_FREQUENCY_ATTR_MAX_TX_POWER in fattr and not (
37*4dc78e53SAndroid Build Coastguard Worker        nl80211.NL80211_FREQUENCY_ATTR_DISABLED in fattr
38*4dc78e53SAndroid Build Coastguard Worker    ):
39*4dc78e53SAndroid Build Coastguard Worker        sys.stdout.write(
40*4dc78e53SAndroid Build Coastguard Worker            " (%.1f dBm)"
41*4dc78e53SAndroid Build Coastguard Worker            % (
42*4dc78e53SAndroid Build Coastguard Worker                0.01
43*4dc78e53SAndroid Build Coastguard Worker                * nl.nla_get_u32(fattr[nl80211.NL80211_FREQUENCY_ATTR_MAX_TX_POWER])
44*4dc78e53SAndroid Build Coastguard Worker            )
45*4dc78e53SAndroid Build Coastguard Worker        )
46*4dc78e53SAndroid Build Coastguard Worker    if nl80211.NL80211_FREQUENCY_ATTR_DISABLED in fattr:
47*4dc78e53SAndroid Build Coastguard Worker        sys.stdout.write(" (disabled)")
48*4dc78e53SAndroid Build Coastguard Worker    sys.stdout.write("\n")
49*4dc78e53SAndroid Build Coastguard Worker
50*4dc78e53SAndroid Build Coastguard Worker
51*4dc78e53SAndroid Build Coastguard Workerdef handle_band(attr, fpol):
52*4dc78e53SAndroid Build Coastguard Worker    e, battr = nl.py_nla_parse_nested(nl80211.NL80211_BAND_ATTR_MAX, attr, None)
53*4dc78e53SAndroid Build Coastguard Worker    print("\tband %d:" % nl.nla_type(attr))
54*4dc78e53SAndroid Build Coastguard Worker    if nl80211.NL80211_BAND_ATTR_FREQS in battr:
55*4dc78e53SAndroid Build Coastguard Worker        for fattr in nl.nla_get_nested(battr[nl80211.NL80211_BAND_ATTR_FREQS]):
56*4dc78e53SAndroid Build Coastguard Worker            handle_freq(fattr, fpol)
57*4dc78e53SAndroid Build Coastguard Worker
58*4dc78e53SAndroid Build Coastguard Worker
59*4dc78e53SAndroid Build Coastguard Workerdef cipher_name(suite):
60*4dc78e53SAndroid Build Coastguard Worker    suite_val = "%02x%02x%02x%02x" % tuple(reversed(suite))
61*4dc78e53SAndroid Build Coastguard Worker    if suite_val == "000fac01":
62*4dc78e53SAndroid Build Coastguard Worker        return "WEP40 (00-0f-ac:1)"
63*4dc78e53SAndroid Build Coastguard Worker    elif suite_val == "000fac05":
64*4dc78e53SAndroid Build Coastguard Worker        return "WEP104 (00-0f-ac:5)"
65*4dc78e53SAndroid Build Coastguard Worker    elif suite_val == "000fac02":
66*4dc78e53SAndroid Build Coastguard Worker        return "TKIP (00-0f-ac:2)"
67*4dc78e53SAndroid Build Coastguard Worker    elif suite_val == "000fac04":
68*4dc78e53SAndroid Build Coastguard Worker        return "CCMP (00-0f-ac:4)"
69*4dc78e53SAndroid Build Coastguard Worker    elif suite_val == "000fac06":
70*4dc78e53SAndroid Build Coastguard Worker        return "CMAC (00-0f-ac:6)"
71*4dc78e53SAndroid Build Coastguard Worker    elif suite_val == "000fac08":
72*4dc78e53SAndroid Build Coastguard Worker        return "GCMP (00-0f-ac:8)"
73*4dc78e53SAndroid Build Coastguard Worker    elif suite_val == "00147201":
74*4dc78e53SAndroid Build Coastguard Worker        return "WPI-SMS4 (00-14-72:1)"
75*4dc78e53SAndroid Build Coastguard Worker    else:
76*4dc78e53SAndroid Build Coastguard Worker        return suite_val
77*4dc78e53SAndroid Build Coastguard Worker
78*4dc78e53SAndroid Build Coastguard Worker
79*4dc78e53SAndroid Build Coastguard Workerdef msg_handler(m, a):
80*4dc78e53SAndroid Build Coastguard Worker    try:
81*4dc78e53SAndroid Build Coastguard Worker        e, attr = genl.py_genlmsg_parse(
82*4dc78e53SAndroid Build Coastguard Worker            nl.nlmsg_hdr(m), 0, nl80211.NL80211_ATTR_MAX, None
83*4dc78e53SAndroid Build Coastguard Worker        )
84*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_WIPHY_NAME in attr:
85*4dc78e53SAndroid Build Coastguard Worker            print("wiphy %s" % nl.nla_get_string(attr[nl80211.NL80211_ATTR_WIPHY_NAME]))
86*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_WIPHY_BANDS in attr:
87*4dc78e53SAndroid Build Coastguard Worker            fpol = nl.nla_policy_array(nl80211.NL80211_FREQUENCY_ATTR_MAX + 1)
88*4dc78e53SAndroid Build Coastguard Worker            fpol[nl80211.NL80211_FREQUENCY_ATTR_FREQ].type = nl.NLA_U32
89*4dc78e53SAndroid Build Coastguard Worker            fpol[nl80211.NL80211_FREQUENCY_ATTR_DISABLED].type = nl.NLA_FLAG
90*4dc78e53SAndroid Build Coastguard Worker            fpol[nl80211.NL80211_FREQUENCY_ATTR_PASSIVE_SCAN].type = nl.NLA_FLAG
91*4dc78e53SAndroid Build Coastguard Worker            fpol[nl80211.NL80211_FREQUENCY_ATTR_NO_IBSS].type = nl.NLA_FLAG
92*4dc78e53SAndroid Build Coastguard Worker            fpol[nl80211.NL80211_FREQUENCY_ATTR_RADAR].type = nl.NLA_FLAG
93*4dc78e53SAndroid Build Coastguard Worker            fpol[nl80211.NL80211_FREQUENCY_ATTR_MAX_TX_POWER].type = nl.NLA_U32
94*4dc78e53SAndroid Build Coastguard Worker
95*4dc78e53SAndroid Build Coastguard Worker            nattrs = nl.nla_get_nested(attr[nl80211.NL80211_ATTR_WIPHY_BANDS])
96*4dc78e53SAndroid Build Coastguard Worker            for nattr in nattrs:
97*4dc78e53SAndroid Build Coastguard Worker                handle_band(nattr, fpol)
98*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_CIPHER_SUITES in attr:
99*4dc78e53SAndroid Build Coastguard Worker            ciphers = nl.nla_data(attr[nl80211.NL80211_ATTR_CIPHER_SUITES])
100*4dc78e53SAndroid Build Coastguard Worker            num = len(ciphers) / 4
101*4dc78e53SAndroid Build Coastguard Worker            if num > 0:
102*4dc78e53SAndroid Build Coastguard Worker                print("\tSupported Ciphers:")
103*4dc78e53SAndroid Build Coastguard Worker                for i in range(0, num, 4):
104*4dc78e53SAndroid Build Coastguard Worker                    print("\t\t* %s" % cipher_name(ciphers[i : i + 4]))
105*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_SUPPORTED_IFTYPES in attr:
106*4dc78e53SAndroid Build Coastguard Worker            print("\tSupported interface modes:")
107*4dc78e53SAndroid Build Coastguard Worker            ifattr = nl.nla_get_nested(attr[nl80211.NL80211_ATTR_SUPPORTED_IFTYPES])
108*4dc78e53SAndroid Build Coastguard Worker            for nl_mode in ifattr:
109*4dc78e53SAndroid Build Coastguard Worker                print("\t\t* %s" % nl80211.nl80211_iftype2str[nl.nla_type(nl_mode)])
110*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_SOFTWARE_IFTYPES in attr:
111*4dc78e53SAndroid Build Coastguard Worker            print("\tsoftware interface modes (can always be added):")
112*4dc78e53SAndroid Build Coastguard Worker            ifattr = nl.nla_get_nested(attr[nl80211.NL80211_ATTR_SOFTWARE_IFTYPES])
113*4dc78e53SAndroid Build Coastguard Worker            for nl_mode in ifattr:
114*4dc78e53SAndroid Build Coastguard Worker                print("\t\t* %s" % nl80211.nl80211_iftype2str[nl.nla_type(nl_mode)])
115*4dc78e53SAndroid Build Coastguard Worker        return nl.NL_SKIP
116*4dc78e53SAndroid Build Coastguard Worker    except Exception:
117*4dc78e53SAndroid Build Coastguard Worker        (t, v, tb) = sys.exc_info()
118*4dc78e53SAndroid Build Coastguard Worker        print(v.message)
119*4dc78e53SAndroid Build Coastguard Worker        traceback.print_tb(tb)
120*4dc78e53SAndroid Build Coastguard Worker
121*4dc78e53SAndroid Build Coastguard Worker
122*4dc78e53SAndroid Build Coastguard Workerdef error_handler(err, a):
123*4dc78e53SAndroid Build Coastguard Worker    a.done = err.error
124*4dc78e53SAndroid Build Coastguard Worker    return nl.NL_STOP
125*4dc78e53SAndroid Build Coastguard Worker
126*4dc78e53SAndroid Build Coastguard Worker
127*4dc78e53SAndroid Build Coastguard Workerdef finish_handler(m, a):
128*4dc78e53SAndroid Build Coastguard Worker    return nl.NL_SKIP
129*4dc78e53SAndroid Build Coastguard Worker
130*4dc78e53SAndroid Build Coastguard Worker
131*4dc78e53SAndroid Build Coastguard Workerdef ack_handler(m, a):
132*4dc78e53SAndroid Build Coastguard Worker    a.done = 0
133*4dc78e53SAndroid Build Coastguard Worker    return nl.NL_STOP
134*4dc78e53SAndroid Build Coastguard Worker
135*4dc78e53SAndroid Build Coastguard Worker
136*4dc78e53SAndroid Build Coastguard Workertry:
137*4dc78e53SAndroid Build Coastguard Worker    cbd = test_class()
138*4dc78e53SAndroid Build Coastguard Worker    tx_cb = nl.nl_cb_alloc(nl.NL_CB_DEFAULT)
139*4dc78e53SAndroid Build Coastguard Worker    rx_cb = nl.nl_cb_clone(tx_cb)
140*4dc78e53SAndroid Build Coastguard Worker    s = nl.nl_socket_alloc_cb(tx_cb)
141*4dc78e53SAndroid Build Coastguard Worker    nl.py_nl_cb_err(rx_cb, nl.NL_CB_CUSTOM, error_handler, cbd)
142*4dc78e53SAndroid Build Coastguard Worker    nl.py_nl_cb_set(rx_cb, nl.NL_CB_FINISH, nl.NL_CB_CUSTOM, finish_handler, cbd)
143*4dc78e53SAndroid Build Coastguard Worker    nl.py_nl_cb_set(rx_cb, nl.NL_CB_ACK, nl.NL_CB_CUSTOM, ack_handler, cbd)
144*4dc78e53SAndroid Build Coastguard Worker    nl.py_nl_cb_set(rx_cb, nl.NL_CB_VALID, nl.NL_CB_CUSTOM, msg_handler, cbd)
145*4dc78e53SAndroid Build Coastguard Worker
146*4dc78e53SAndroid Build Coastguard Worker    genl.genl_connect(s)
147*4dc78e53SAndroid Build Coastguard Worker    family = genl.genl_ctrl_resolve(s, "nl80211")
148*4dc78e53SAndroid Build Coastguard Worker    m = nl.nlmsg_alloc()
149*4dc78e53SAndroid Build Coastguard Worker    genl.genlmsg_put(m, 0, 0, family, 0, 0, nl80211.NL80211_CMD_GET_WIPHY, 0)
150*4dc78e53SAndroid Build Coastguard Worker    nl.nla_put_u32(m, nl80211.NL80211_ATTR_WIPHY, 7)
151*4dc78e53SAndroid Build Coastguard Worker
152*4dc78e53SAndroid Build Coastguard Worker    err = nl.nl_send_auto_complete(s, m)
153*4dc78e53SAndroid Build Coastguard Worker    if err < 0:
154*4dc78e53SAndroid Build Coastguard Worker        nl.nlmsg_free(m)
155*4dc78e53SAndroid Build Coastguard Worker
156*4dc78e53SAndroid Build Coastguard Worker    while cbd.done > 0 and not err < 0:
157*4dc78e53SAndroid Build Coastguard Worker        err = nl.nl_recvmsgs(s, rx_cb)
158*4dc78e53SAndroid Build Coastguard Workerexcept Exception:
159*4dc78e53SAndroid Build Coastguard Worker    (t, v, tb) = sys.exc_info()
160*4dc78e53SAndroid Build Coastguard Worker    print(v.message)
161*4dc78e53SAndroid Build Coastguard Worker    traceback.print_tb(tb)
162