Home | History | Annotate | Download | only in examples
      1 import netlink.capi as nl
      2 import netlink.genl.capi as genl
      3 import nl80211
      4 import sys
      5 import traceback
      6 
      7 class test_class:
      8 	def __init__(self):
      9 		self.done = 1;
     10 
     11 def msg_handler(m, a):
     12 	try:
     13 		e, attr = genl.py_genlmsg_parse(nl.nlmsg_hdr(m), 0,
     14 						nl80211.NL80211_ATTR_MAX, None)
     15 		if nl80211.NL80211_ATTR_WIPHY in attr:
     16 			thiswiphy = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_WIPHY])
     17 			print("phy#%d" % thiswiphy)
     18 		if nl80211.NL80211_ATTR_IFNAME in attr:
     19 			print("\tinterface %s" % nl.nla_get_string(attr[nl80211.NL80211_ATTR_IFNAME]));
     20 		if nl80211.NL80211_ATTR_IFINDEX in attr:
     21 			print("\tifindex %d" % nl.nla_get_u32(attr[nl80211.NL80211_ATTR_IFINDEX]))
     22 		if nl80211.NL80211_ATTR_WDEV in attr:
     23 			print("\twdev 0x%lx" % nl.nla_get_u64(attr[nl80211.NL80211_ATTR_WDEV]))
     24 		if nl80211.NL80211_ATTR_MAC in attr:
     25 			print("\tmac %02x:%02x:%02x:%02x:%02x:%02x" % tuple(nl.nla_data(attr[nl80211.NL80211_ATTR_MAC])))
     26 		if nl80211.NL80211_ATTR_SSID in attr:
     27 			print("\tssid ", nl.nla_data(attr[nl80211.NL80211_ATTR_SSID]))
     28 		if nl80211.NL80211_ATTR_IFTYPE in attr:
     29 			iftype = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_IFTYPE])
     30 			print("\ttype %s" % nl80211.nl80211_iftype2str[iftype])
     31 		if nl80211.NL80211_ATTR_WIPHY_FREQ in attr:
     32 			freq = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_WIPHY_FREQ])
     33 
     34 			sys.stdout.write("\tfreq %d MHz" % freq);
     35 
     36 			if nl80211.NL80211_ATTR_CHANNEL_WIDTH in attr:
     37 				chanw = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_CHANNEL_WIDTH])
     38 				sys.stdout.write(", width: %s" % nl80211.nl80211_chan_width2str[chanw])
     39 				if nl80211.NL80211_ATTR_CENTER_FREQ1 in attr:
     40 					sys.stdout.write(", center1: %d MHz" %
     41 						nl.nla_get_u32(attr[nl80211.NL80211_ATTR_CENTER_FREQ1]))
     42 				if nl80211.NL80211_ATTR_CENTER_FREQ2 in attr:
     43 					sys.stdout.write(", center2: %d MHz" %
     44 						nl.nla_get_u32(attr[nl80211.NL80211_ATTR_CENTER_FREQ2]))
     45 			elif nl80211.NL80211_ATTR_WIPHY_CHANNEL_TYPE in attr:
     46 				channel_type = nl.nla_get_u32(attr[nl80211.NL80211_ATTR_WIPHY_CHANNEL_TYPE])
     47 				sys.stdout.write(" %s" % nl80211.nl80211_channel_type2str(channel_type));
     48 
     49 			sys.stdout.write("\n");
     50 		return nl.NL_SKIP;
     51 	except Exception as e:
     52 		(t,v,tb) = sys.exc_info()
     53 		print v.message
     54 		traceback.print_tb(tb)
     55 
     56 def error_handler(err, a):
     57 	a.done = err.error
     58 	return nl.NL_STOP
     59 
     60 def finish_handler(m, a):
     61 	return nl.NL_SKIP
     62 
     63 def ack_handler(m, a):
     64 	a.done = 0
     65 	return nl.NL_STOP
     66 
     67 try:
     68 	cbd = test_class()
     69 	tx_cb = nl.nl_cb_alloc(nl.NL_CB_DEFAULT)
     70 	rx_cb = nl.nl_cb_clone(tx_cb)
     71 	s = nl.nl_socket_alloc_cb(tx_cb)
     72 	nl.py_nl_cb_err(rx_cb, nl.NL_CB_CUSTOM, error_handler, cbd);
     73 	nl.py_nl_cb_set(rx_cb, nl.NL_CB_FINISH, nl.NL_CB_CUSTOM, finish_handler, cbd);
     74 	nl.py_nl_cb_set(rx_cb, nl.NL_CB_ACK, nl.NL_CB_CUSTOM, ack_handler, cbd);
     75 	nl.py_nl_cb_set(rx_cb, nl.NL_CB_VALID, nl.NL_CB_CUSTOM, msg_handler, cbd);
     76 
     77 	genl.genl_connect(s)
     78 	family = genl.genl_ctrl_resolve(s, 'nl80211')
     79 	m = nl.nlmsg_alloc()
     80 	genl.genlmsg_put(m, 0, 0, family, 0, 0, nl80211.NL80211_CMD_GET_INTERFACE, 0)
     81 	nl.nla_put_u32(m, nl80211.NL80211_ATTR_IFINDEX, nl.if_nametoindex('wlan0'))
     82 
     83 	err = nl.nl_send_auto_complete(s, m);
     84 	if err < 0:
     85 		nl.nlmsg_free(msg)
     86 
     87 	while cbd.done > 0 and not err < 0:
     88 		err = nl.nl_recvmsgs(s, rx_cb)
     89 
     90 except Exception as e:
     91 	(t, v, tb) = sys.exc_info()
     92 	print v.message
     93 	traceback.print_tb(tb)
     94