diff options
author | Arend van Spriel <arend@broadcom.com> | 2013-09-05 12:11:30 (GMT) |
---|---|---|
committer | Thomas Graf <tgraf@suug.ch> | 2013-09-05 15:46:00 (GMT) |
commit | 9828326c7ff9018e21610eb4a8d5e29eb27ff5b4 (patch) | |
tree | ec8e3a744f5c58afd4542832c8cc28073e58bade /python/examples/wiphy.py | |
parent | db08ef44afca0aba4b6dcb3d0463a4d2b49572e6 (diff) | |
download | libnl-9828326c7ff9018e21610eb4a8d5e29eb27ff5b4.zip libnl-9828326c7ff9018e21610eb4a8d5e29eb27ff5b4.tar.gz libnl-9828326c7ff9018e21610eb4a8d5e29eb27ff5b4.tar.bz2 |
add python examples using swig provided api
using the nl80211 family to show use of generic netlink api and
attribute parsing.
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Thomas Graf <tgraf@suug.ch>
Diffstat (limited to 'python/examples/wiphy.py')
-rw-r--r-- | python/examples/wiphy.py | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/python/examples/wiphy.py b/python/examples/wiphy.py new file mode 100644 index 0000000..fc22205 --- /dev/null +++ b/python/examples/wiphy.py @@ -0,0 +1,141 @@ +import netlink.capi as nl +import netlink.genl.capi as genl +import nl80211 +import sys +import traceback + +class test_class: + def __init__(self): + self.done = 1; + +def freq_to_ch(freq): + if freq == 2484: + return 14; + + if freq < 2484: + return (freq - 2407) / 5; + + # FIXME: dot11ChannelStartingFactor (802.11-2007 17.3.8.3.2) + if freq < 45000: + return freq/5 - 1000; + + if freq >= 58320 and freq <= 64800: + return (freq - 56160) / 2160; + + return 0; + +def handle_freq(attr, pol): + e, fattr = nl.py_nla_parse_nested(nl80211.NL80211_FREQUENCY_ATTR_MAX, attr, pol) + if nl80211.NL80211_FREQUENCY_ATTR_FREQ in fattr: + freq = nl.nla_get_u32(fattr[nl80211.NL80211_FREQUENCY_ATTR_FREQ]) + sys.stdout.write("\t\tfreq %d MHz [%d]" % (freq, freq_to_ch(freq))) + if nl80211.NL80211_FREQUENCY_ATTR_MAX_TX_POWER in fattr and not (nl80211.NL80211_FREQUENCY_ATTR_DISABLED in fattr): + sys.stdout.write(" (%.1f dBm)" % (0.01 * nl.nla_get_u32(fattr[nl80211.NL80211_FREQUENCY_ATTR_MAX_TX_POWER]))) + if nl80211.NL80211_FREQUENCY_ATTR_DISABLED in fattr: + sys.stdout.write(" (disabled)") + sys.stdout.write("\n") + +def handle_band(attr, fpol): + e, battr = nl.py_nla_parse_nested(nl80211.NL80211_BAND_ATTR_MAX, attr, None) + print("\tband %d:" % nl.nla_type(attr)) + if nl80211.NL80211_BAND_ATTR_FREQS in battr: + for fattr in nl.nla_get_nested(battr[nl80211.NL80211_BAND_ATTR_FREQS]): + handle_freq(fattr, fpol) + +def cipher_name(suite): + suite_val = '%02x%02x%02x%02x' % tuple(reversed(suite)) + if suite_val == '000fac01': + return "WEP40 (00-0f-ac:1)" + elif suite_val == '000fac05': + return "WEP104 (00-0f-ac:5)" + elif suite_val == '000fac02': + return "TKIP (00-0f-ac:2)" + elif suite_val == '000fac04': + return "CCMP (00-0f-ac:4)" + elif suite_val == '000fac06': + return "CMAC (00-0f-ac:6)" + elif suite_val == '000fac08': + return "GCMP (00-0f-ac:8)" + elif suite_val == '00147201': + return "WPI-SMS4 (00-14-72:1)" + else: + return suite_val + +def msg_handler(m, a): + try: + e, attr = genl.py_genlmsg_parse(nl.nlmsg_hdr(m), 0, + nl80211.NL80211_ATTR_MAX, None) + if nl80211.NL80211_ATTR_WIPHY_NAME in attr: + print('wiphy %s' % nl.nla_get_string(attr[nl80211.NL80211_ATTR_WIPHY_NAME])) + if nl80211.NL80211_ATTR_WIPHY_BANDS in attr: + fpol = nl.nla_policy_array(nl80211.NL80211_FREQUENCY_ATTR_MAX + 1) + fpol[nl80211.NL80211_FREQUENCY_ATTR_FREQ].type = nl.NLA_U32 + fpol[nl80211.NL80211_FREQUENCY_ATTR_DISABLED].type = nl.NLA_FLAG + fpol[nl80211.NL80211_FREQUENCY_ATTR_PASSIVE_SCAN].type = nl.NLA_FLAG + fpol[nl80211.NL80211_FREQUENCY_ATTR_NO_IBSS].type = nl.NLA_FLAG + fpol[nl80211.NL80211_FREQUENCY_ATTR_RADAR].type = nl.NLA_FLAG + fpol[nl80211.NL80211_FREQUENCY_ATTR_MAX_TX_POWER].type = nl.NLA_U32 + + nattrs = nl.nla_get_nested(attr[nl80211.NL80211_ATTR_WIPHY_BANDS]) + for nattr in nattrs: + handle_band(nattr, fpol) + if nl80211.NL80211_ATTR_CIPHER_SUITES in attr: + ciphers = nl.nla_data(attr[nl80211.NL80211_ATTR_CIPHER_SUITES]) + num = len(ciphers) / 4 + if num > 0: + print("\tSupported Ciphers:"); + for i in range(0, num, 4): + print("\t\t* %s" % cipher_name(ciphers[i:i+4])) + if nl80211.NL80211_ATTR_SUPPORTED_IFTYPES in attr: + print("\tSupported interface modes:") + ifattr = nl.nla_get_nested(attr[nl80211.NL80211_ATTR_SUPPORTED_IFTYPES]) + for nl_mode in ifattr: + print("\t\t* %s" % nl80211.nl80211_iftype2str[nl.nla_type(nl_mode)]) + if nl80211.NL80211_ATTR_SOFTWARE_IFTYPES in attr: + print("\tsoftware interface modes (can always be added):") + ifattr = nl.nla_get_nested(attr[nl80211.NL80211_ATTR_SOFTWARE_IFTYPES]) + for nl_mode in ifattr: + print("\t\t* %s" % nl80211.nl80211_iftype2str[nl.nla_type(nl_mode)]) + return nl.NL_SKIP + except Exception as e: + (t,v,tb) = sys.exc_info() + print v.message + traceback.print_tb(tb) + +def error_handler(err, a): + a.done = err.error + return nl.NL_STOP + +def finish_handler(m, a): + return nl.NL_SKIP + +def ack_handler(m, a): + a.done = 0 + return nl.NL_STOP + +try: + cbd = test_class() + tx_cb = nl.nl_cb_alloc(nl.NL_CB_DEFAULT) + rx_cb = nl.nl_cb_clone(tx_cb) + s = nl.nl_socket_alloc_cb(tx_cb) + nl.py_nl_cb_err(rx_cb, nl.NL_CB_CUSTOM, error_handler, cbd); + nl.py_nl_cb_set(rx_cb, nl.NL_CB_FINISH, nl.NL_CB_CUSTOM, finish_handler, cbd); + nl.py_nl_cb_set(rx_cb, nl.NL_CB_ACK, nl.NL_CB_CUSTOM, ack_handler, cbd); + nl.py_nl_cb_set(rx_cb, nl.NL_CB_VALID, nl.NL_CB_CUSTOM, msg_handler, cbd); + + genl.genl_connect(s) + family = genl.genl_ctrl_resolve(s, 'nl80211') + m = nl.nlmsg_alloc() + genl.genlmsg_put(m, 0, 0, family, 0, 0, nl80211.NL80211_CMD_GET_WIPHY, 0) + nl.nla_put_u32(m, nl80211.NL80211_ATTR_WIPHY, 0) + + err = nl.nl_send_auto_complete(s, m); + if err < 0: + nl.nlmsg_free(msg) + + while cbd.done > 0 and not err < 0: + err = nl.nl_recvmsgs(s, rx_cb) +except Exception as e: + (t, v, tb) = sys.exc_info() + print v.message + traceback.print_tb(tb) |