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