xref: /aosp_15_r20/external/libnl/python/examples/iface.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 msg_handler(m, a):
15*4dc78e53SAndroid Build Coastguard Worker    try:
16*4dc78e53SAndroid Build Coastguard Worker        e, attr = genl.py_genlmsg_parse(
17*4dc78e53SAndroid Build Coastguard Worker            nl.nlmsg_hdr(m), 0, nl80211.NL80211_ATTR_MAX, None
18*4dc78e53SAndroid Build Coastguard Worker        )
19*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_WIPHY in attr:
20*4dc78e53SAndroid Build Coastguard Worker            thiswiphy = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_WIPHY])
21*4dc78e53SAndroid Build Coastguard Worker            print("phy#%d" % thiswiphy)
22*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_IFNAME in attr:
23*4dc78e53SAndroid Build Coastguard Worker            print(
24*4dc78e53SAndroid Build Coastguard Worker                "\tinterface %s" % nl.nla_get_string(attr[nl80211.NL80211_ATTR_IFNAME])
25*4dc78e53SAndroid Build Coastguard Worker            )
26*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_IFINDEX in attr:
27*4dc78e53SAndroid Build Coastguard Worker            print("\tifindex %d" % nl.nla_get_u32(attr[nl80211.NL80211_ATTR_IFINDEX]))
28*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_WDEV in attr:
29*4dc78e53SAndroid Build Coastguard Worker            print("\twdev 0x%lx" % nl.nla_get_u64(attr[nl80211.NL80211_ATTR_WDEV]))
30*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_MAC in attr:
31*4dc78e53SAndroid Build Coastguard Worker            print(
32*4dc78e53SAndroid Build Coastguard Worker                "\tmac %02x:%02x:%02x:%02x:%02x:%02x"
33*4dc78e53SAndroid Build Coastguard Worker                % tuple(nl.nla_data(attr[nl80211.NL80211_ATTR_MAC]))
34*4dc78e53SAndroid Build Coastguard Worker            )
35*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_SSID in attr:
36*4dc78e53SAndroid Build Coastguard Worker            print("\tssid ", nl.nla_data(attr[nl80211.NL80211_ATTR_SSID]))
37*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_IFTYPE in attr:
38*4dc78e53SAndroid Build Coastguard Worker            iftype = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_IFTYPE])
39*4dc78e53SAndroid Build Coastguard Worker            print("\ttype %s" % nl80211.nl80211_iftype2str[iftype])
40*4dc78e53SAndroid Build Coastguard Worker        if nl80211.NL80211_ATTR_WIPHY_FREQ in attr:
41*4dc78e53SAndroid Build Coastguard Worker            freq = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_WIPHY_FREQ])
42*4dc78e53SAndroid Build Coastguard Worker
43*4dc78e53SAndroid Build Coastguard Worker            sys.stdout.write("\tfreq %d MHz" % freq)
44*4dc78e53SAndroid Build Coastguard Worker
45*4dc78e53SAndroid Build Coastguard Worker            if nl80211.NL80211_ATTR_CHANNEL_WIDTH in attr:
46*4dc78e53SAndroid Build Coastguard Worker                chanw = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_CHANNEL_WIDTH])
47*4dc78e53SAndroid Build Coastguard Worker                sys.stdout.write(", width: %s" % nl80211.nl80211_chan_width2str[chanw])
48*4dc78e53SAndroid Build Coastguard Worker                if nl80211.NL80211_ATTR_CENTER_FREQ1 in attr:
49*4dc78e53SAndroid Build Coastguard Worker                    sys.stdout.write(
50*4dc78e53SAndroid Build Coastguard Worker                        ", center1: %d MHz"
51*4dc78e53SAndroid Build Coastguard Worker                        % nl.nla_get_u32(attr[nl80211.NL80211_ATTR_CENTER_FREQ1])
52*4dc78e53SAndroid Build Coastguard Worker                    )
53*4dc78e53SAndroid Build Coastguard Worker                if nl80211.NL80211_ATTR_CENTER_FREQ2 in attr:
54*4dc78e53SAndroid Build Coastguard Worker                    sys.stdout.write(
55*4dc78e53SAndroid Build Coastguard Worker                        ", center2: %d MHz"
56*4dc78e53SAndroid Build Coastguard Worker                        % nl.nla_get_u32(attr[nl80211.NL80211_ATTR_CENTER_FREQ2])
57*4dc78e53SAndroid Build Coastguard Worker                    )
58*4dc78e53SAndroid Build Coastguard Worker            elif nl80211.NL80211_ATTR_WIPHY_CHANNEL_TYPE in attr:
59*4dc78e53SAndroid Build Coastguard Worker                channel_type = nl.nla_get_u32(
60*4dc78e53SAndroid Build Coastguard Worker                    attr[nl80211.NL80211_ATTR_WIPHY_CHANNEL_TYPE]
61*4dc78e53SAndroid Build Coastguard Worker                )
62*4dc78e53SAndroid Build Coastguard Worker                sys.stdout.write(" %s" % nl80211.nl80211_channel_type2str(channel_type))
63*4dc78e53SAndroid Build Coastguard Worker
64*4dc78e53SAndroid Build Coastguard Worker            sys.stdout.write("\n")
65*4dc78e53SAndroid Build Coastguard Worker        return nl.NL_SKIP
66*4dc78e53SAndroid Build Coastguard Worker    except Exception:
67*4dc78e53SAndroid Build Coastguard Worker        (t, v, tb) = sys.exc_info()
68*4dc78e53SAndroid Build Coastguard Worker        print(v.message)
69*4dc78e53SAndroid Build Coastguard Worker        traceback.print_tb(tb)
70*4dc78e53SAndroid Build Coastguard Worker
71*4dc78e53SAndroid Build Coastguard Worker
72*4dc78e53SAndroid Build Coastguard Workerdef error_handler(err, a):
73*4dc78e53SAndroid Build Coastguard Worker    a.done = err.error
74*4dc78e53SAndroid Build Coastguard Worker    return nl.NL_STOP
75*4dc78e53SAndroid Build Coastguard Worker
76*4dc78e53SAndroid Build Coastguard Worker
77*4dc78e53SAndroid Build Coastguard Workerdef finish_handler(m, a):
78*4dc78e53SAndroid Build Coastguard Worker    return nl.NL_SKIP
79*4dc78e53SAndroid Build Coastguard Worker
80*4dc78e53SAndroid Build Coastguard Worker
81*4dc78e53SAndroid Build Coastguard Workerdef ack_handler(m, a):
82*4dc78e53SAndroid Build Coastguard Worker    a.done = 0
83*4dc78e53SAndroid Build Coastguard Worker    return nl.NL_STOP
84*4dc78e53SAndroid Build Coastguard Worker
85*4dc78e53SAndroid Build Coastguard Worker
86*4dc78e53SAndroid Build Coastguard Workertry:
87*4dc78e53SAndroid Build Coastguard Worker    cbd = test_class()
88*4dc78e53SAndroid Build Coastguard Worker    tx_cb = nl.nl_cb_alloc(nl.NL_CB_DEFAULT)
89*4dc78e53SAndroid Build Coastguard Worker    rx_cb = nl.nl_cb_clone(tx_cb)
90*4dc78e53SAndroid Build Coastguard Worker    s = nl.nl_socket_alloc_cb(tx_cb)
91*4dc78e53SAndroid Build Coastguard Worker    nl.py_nl_cb_err(rx_cb, nl.NL_CB_CUSTOM, error_handler, cbd)
92*4dc78e53SAndroid Build Coastguard Worker    nl.py_nl_cb_set(rx_cb, nl.NL_CB_FINISH, nl.NL_CB_CUSTOM, finish_handler, cbd)
93*4dc78e53SAndroid Build Coastguard Worker    nl.py_nl_cb_set(rx_cb, nl.NL_CB_ACK, nl.NL_CB_CUSTOM, ack_handler, cbd)
94*4dc78e53SAndroid Build Coastguard Worker    nl.py_nl_cb_set(rx_cb, nl.NL_CB_VALID, nl.NL_CB_CUSTOM, msg_handler, cbd)
95*4dc78e53SAndroid Build Coastguard Worker
96*4dc78e53SAndroid Build Coastguard Worker    genl.genl_connect(s)
97*4dc78e53SAndroid Build Coastguard Worker    family = genl.genl_ctrl_resolve(s, "nl80211")
98*4dc78e53SAndroid Build Coastguard Worker    m = nl.nlmsg_alloc()
99*4dc78e53SAndroid Build Coastguard Worker    genl.genlmsg_put(m, 0, 0, family, 0, 0, nl80211.NL80211_CMD_GET_INTERFACE, 0)
100*4dc78e53SAndroid Build Coastguard Worker    nl.nla_put_u32(m, nl80211.NL80211_ATTR_IFINDEX, nl.if_nametoindex("wlan0"))
101*4dc78e53SAndroid Build Coastguard Worker
102*4dc78e53SAndroid Build Coastguard Worker    err = nl.nl_send_auto_complete(s, m)
103*4dc78e53SAndroid Build Coastguard Worker    if err < 0:
104*4dc78e53SAndroid Build Coastguard Worker        nl.nlmsg_free(m)
105*4dc78e53SAndroid Build Coastguard Worker
106*4dc78e53SAndroid Build Coastguard Worker    while cbd.done > 0 and not err < 0:
107*4dc78e53SAndroid Build Coastguard Worker        err = nl.nl_recvmsgs(s, rx_cb)
108*4dc78e53SAndroid Build Coastguard Worker
109*4dc78e53SAndroid Build Coastguard Workerexcept Exception:
110*4dc78e53SAndroid Build Coastguard Worker    (t, v, tb) = sys.exc_info()
111*4dc78e53SAndroid Build Coastguard Worker    print(v.message)
112*4dc78e53SAndroid Build Coastguard Worker    traceback.print_tb(tb)
113