1054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartimport netlink.capi as nl 2054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartimport netlink.genl.capi as genl 3054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartimport nl80211 4054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartimport sys 5054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartimport traceback 6054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 7054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartclass test_class: 8054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart def __init__(self): 9054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart self.done = 1; 10054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 11054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartdef msg_handler(m, a): 12054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart try: 13054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart e, attr = genl.py_genlmsg_parse(nl.nlmsg_hdr(m), 0, 14054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl80211.NL80211_ATTR_MAX, None) 15054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if nl80211.NL80211_ATTR_WIPHY in attr: 16054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart thiswiphy = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_WIPHY]) 17054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart print("phy#%d" % thiswiphy) 18054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if nl80211.NL80211_ATTR_IFNAME in attr: 19054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart print("\tinterface %s" % nl.nla_get_string(attr[nl80211.NL80211_ATTR_IFNAME])); 20054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if nl80211.NL80211_ATTR_IFINDEX in attr: 21054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart print("\tifindex %d" % nl.nla_get_u32(attr[nl80211.NL80211_ATTR_IFINDEX])) 22054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if nl80211.NL80211_ATTR_WDEV in attr: 23054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart print("\twdev 0x%lx" % nl.nla_get_u64(attr[nl80211.NL80211_ATTR_WDEV])) 24054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if nl80211.NL80211_ATTR_MAC in attr: 25054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart print("\tmac %02x:%02x:%02x:%02x:%02x:%02x" % tuple(nl.nla_data(attr[nl80211.NL80211_ATTR_MAC]))) 26054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if nl80211.NL80211_ATTR_SSID in attr: 27054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart print("\tssid ", nl.nla_data(attr[nl80211.NL80211_ATTR_SSID])) 28054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if nl80211.NL80211_ATTR_IFTYPE in attr: 29054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart iftype = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_IFTYPE]) 30054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart print("\ttype %s" % nl80211.nl80211_iftype2str[iftype]) 31054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if nl80211.NL80211_ATTR_WIPHY_FREQ in attr: 32054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart freq = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_WIPHY_FREQ]) 33054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 34054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart sys.stdout.write("\tfreq %d MHz" % freq); 35054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 36054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if nl80211.NL80211_ATTR_CHANNEL_WIDTH in attr: 37054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart chanw = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_CHANNEL_WIDTH]) 38054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart sys.stdout.write(", width: %s" % nl80211.nl80211_chan_width2str[chanw]) 39054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if nl80211.NL80211_ATTR_CENTER_FREQ1 in attr: 40054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart sys.stdout.write(", center1: %d MHz" % 41054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl.nla_get_u32(attr[nl80211.NL80211_ATTR_CENTER_FREQ1])) 42054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if nl80211.NL80211_ATTR_CENTER_FREQ2 in attr: 43054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart sys.stdout.write(", center2: %d MHz" % 44054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl.nla_get_u32(attr[nl80211.NL80211_ATTR_CENTER_FREQ2])) 45054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart elif nl80211.NL80211_ATTR_WIPHY_CHANNEL_TYPE in attr: 46054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart channel_type = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_WIPHY_CHANNEL_TYPE]) 47054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart sys.stdout.write(" %s" % nl80211.nl80211_channel_type2str(channel_type)); 48054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 49054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart sys.stdout.write("\n"); 50054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart return nl.NL_SKIP; 51054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart except Exception as e: 52054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart (t,v,tb) = sys.exc_info() 53054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart print v.message 54054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart traceback.print_tb(tb) 55054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 56054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartdef error_handler(err, a): 57054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart a.done = err.error 58054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart return nl.NL_STOP 59054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 60054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartdef finish_handler(m, a): 61054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart return nl.NL_SKIP 62054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 63054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartdef ack_handler(m, a): 64054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart a.done = 0 65054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart return nl.NL_STOP 66054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 67054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewarttry: 68054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart cbd = test_class() 69054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart tx_cb = nl.nl_cb_alloc(nl.NL_CB_DEFAULT) 70054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart rx_cb = nl.nl_cb_clone(tx_cb) 71054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart s = nl.nl_socket_alloc_cb(tx_cb) 72054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl.py_nl_cb_err(rx_cb, nl.NL_CB_CUSTOM, error_handler, cbd); 73054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl.py_nl_cb_set(rx_cb, nl.NL_CB_FINISH, nl.NL_CB_CUSTOM, finish_handler, cbd); 74054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl.py_nl_cb_set(rx_cb, nl.NL_CB_ACK, nl.NL_CB_CUSTOM, ack_handler, cbd); 75054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl.py_nl_cb_set(rx_cb, nl.NL_CB_VALID, nl.NL_CB_CUSTOM, msg_handler, cbd); 76054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 77054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart genl.genl_connect(s) 78054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart family = genl.genl_ctrl_resolve(s, 'nl80211') 79054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart m = nl.nlmsg_alloc() 80054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart genl.genlmsg_put(m, 0, 0, family, 0, 0, nl80211.NL80211_CMD_GET_INTERFACE, 0) 81054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl.nla_put_u32(m, nl80211.NL80211_ATTR_IFINDEX, nl.if_nametoindex('wlan0')) 82054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 83054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart err = nl.nl_send_auto_complete(s, m); 84054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if err < 0: 85054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl.nlmsg_free(msg) 86054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 87054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart while cbd.done > 0 and not err < 0: 88054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart err = nl.nl_recvmsgs(s, rx_cb) 89054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 90054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartexcept Exception as e: 91054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart (t, v, tb) = sys.exc_info() 92054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart print v.message 93054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart traceback.print_tb(tb) 94