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