From c4f791e685fc12dc00731ea43327157b40883d95 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Mon, 30 May 2016 11:19:51 -0600 Subject: [PATCH 001/121] 0.0.8 --- MANIFEST.in | 2 +- PyRIC.pdf | Bin 264424 -> 267191 bytes README.md | 34 ++++--- examples/{device.py => device_details.py} | 4 +- pyric/__init__.py | 7 +- pyric/channels.py | 11 ++- pyric/docs/res/PyRIC.tex | 78 ++++++++++++++-- pyric/lib/libnl.py | 9 +- pyric/net/if_h.py | 6 +- pyric/net/wireless/__init__.py | 7 +- pyric/net/wireless/nl80211_c.py | 108 ++++++++++++++++++++++ pyric/net/wireless/nl80211_h.py | 1 + pyric/pyw.py | 76 +++++++-------- setup.py | 17 +++- 14 files changed, 275 insertions(+), 85 deletions(-) rename examples/{device.py => device_details.py} (97%) diff --git a/MANIFEST.in b/MANIFEST.in index a2cc026..cca40ba 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,5 @@ # Include license, README, channels, device, pyw and user guide -include LICENSE README.md __init__.py channels.py device.py pyw.py PyRIC.pdf +include LICENSE README.md __init__.py channels.py device.py pyw.py PyRIC.pdf TODO RFI # Include subdirectories recursive-include lib net examples docs diff --git a/PyRIC.pdf b/PyRIC.pdf index 034fe816020e89b1bef28500db0cea95a2d184b9..9969f1bf9bf2104ae42c8ac679e84ccb184f13e0 100644 GIT binary patch delta 29806 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 delta 27180 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 diff --git a/README.md b/README.md index 7adfdf6..837c0a8 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,16 @@ ## 1 DESCRIPTION: BLUF: Why use subprocess.Popen, regular expressions and str.find to interact with your Wireless Network Interface Card. PyRIC provides the ability to -manipuate, identify and enumerate your system's cards. It is a pure python port -of a subset the functionality provided by iw, ifconfig and iwconfig. PyRIC is: +manipuate, identify and enumerate your system's wireless cards. It is a pure +python port of a subset of the functionality provided by iw, ifconfig and iwconfig. +PyRIC is: * Pythonic: No ctypes, SWIG etc. PyRIC redefines C header files as Python and -uses sockets to communicate with kernel. +uses netlink (or ioctl) sockets to communicate directly with the kernel. * Self-sufficient: No third-party files used, PyRIC is completely self-contained * Fast: (relatively speaking) PyRIC is faster than using iw through subprocess.Popen -* Parse(less): Get the output you without parsing output from iw. Never worry about -iw updates and rewriting your parsers. +* Small: PyRIC is roughly 420kB +* Parseless: Get the output you want without parsing output from iw. Never worry +about iw updates and rewriting your parsers. * Easy: If you can use iw, you can use PyRIC ### a. Background @@ -65,12 +67,12 @@ that need to access the wireless nic repeatedly as shown in the table below. | persistent | 257.8293 | 0.0257 | 0.0354 | 0.0004 | The table shows benchmarks for hop time on a Alfa AWUS036NH 10000 times. Note that -there is no implication (explicit or implicit) that PyRIC is faster than iw. Rather, -the table shows that PyRIC is faster than using Popen to execute iw. Using one-time -sockets, there is a difference of 28 seconds over Popen and iw with a small -decrease in the average hoptime. Not a big difference. However, the performance -increased dramatically when persistent netlink sockets are used with the total -time and average hop time nearly halved. +there is no implication that PyRIC is faster than iw. Rather, the table shows that +PyRIC is faster than using Popen to execute iw. Using one-time sockets, there is +a difference of 28 seconds over Popen and iw with a small decrease in the average +hoptime. Not a big difference. However, the performance increased dramatically when +persistent netlink sockets are used with the total time and average hop time nearly +halved. ### c. Current State ATT, PyRIC accomplish my core needs but it is still a work in progress. It provides @@ -95,6 +97,10 @@ the nl80211 header file and may be vague. ### d. What is PyRIC? +To avoid confusion, PyRIC is the system as a whole, including all header files +and "libraries" that are required to communicate with the kernel. pyw is a +interface to these libraries providing specific funtions. + What it does - defines programmatic access to a small subset of iw and ifconfig. What it does not do - handle multicast messages, callbacks or dumps or non nl80211 @@ -342,20 +348,22 @@ Extending PyRIC is fun and easy too, see the user guide PyRIC.pdf. - \_\_init\_\_.py initialize distrubution PyRIC module - examples example folder + pentest.py create wireless pentest environment example + + device_details.py display device information - setup.py install file - setup.cfg used by setup.py - MANIFEST.in used by setup.py - README.md this file - LICENSE GPLv3 License + + TODO todos for PyRIC + + RFI comments and observations - PyRIC.pdf User Guide + - pyw_unittest.py unittest for pyw - pyric package directory + \_\_init\_\_.py initialize pyric module + pyw.py wireless nic functionality + radio.py consolidate pyw in a class + channels.py 802.11 ISM/UNII freqs. & channels + device.py device/chipset utility functions - + TODO todos for PyRIC - + RFI comments and observations + net linux header ports * \_\_init\_\_.py initialize net subpackage * if_h.py inet/ifreq definition diff --git a/examples/device.py b/examples/device_details.py similarity index 97% rename from examples/device.py rename to examples/device_details.py index abf2b50..613c41d 100644 --- a/examples/device.py +++ b/examples/device_details.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -""" device.py +""" device_details.py Example for displaying device details """ @@ -67,7 +67,7 @@ def execute(dev): try: dev = args.dev if dev is None: - print "usage: python device.py -d " + print "usage: python device_details.py -d " else: execute(dev) except pyric.error as e: diff --git a/pyric/__init__.py b/pyric/__init__.py index 7187d9e..3bd6062 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -104,7 +104,12 @@ - annotated (in comments) if fcts needed root privileges - added functions to get/set ip address, netmask and broadcast - fixed PEP8 errors - - made worked around for pulling supported freqs out NL80211_ATTR_WIPHY_BANDS + - added function pulling supported freqs out NL80211_ATTR_WIPHY_BANDS + * ATT using _getfreqs_ which attempts to find the packed version of every + freq + * nl80211_c.nl80211_parse_freqs works but is slower than _getfreqs_ and + uses several hacks which may make it invalid for certain cards + - added 4.9GHz frequencies to channels.py """ __name__ = 'pyric' diff --git a/pyric/channels.py b/pyric/channels.py index a742848..a4b40c0 100644 --- a/pyric/channels.py +++ b/pyric/channels.py @@ -20,7 +20,8 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. -Defines ISM 2.4Ghz and UNII 5Ghz frequencies and channels +Defines ISM 2.4Ghz, UNII 5Ghz and 4.9GHz frequencies and channels + """ __name__ = 'channels' @@ -54,16 +55,16 @@ 5220:44,5230:46,5745:149,5620:124,5240:48,5500:100} # UNII 4 Bands -#UNII_4_C2F={183:4915,184:4920,185:4925,187:4935,188:4940,189:4945,192:4960,196:4980} -#UNII_4_F2C={4960:192,4935:187,4940:188,4945:189,4915:183,4980:196,4920:184,4925:185} +UNII_4_C2F={183:4915,184:4920,185:4925,187:4935,188:4940,189:4945,192:4960,196:4980} +UNII_4_F2C={4960:192,4935:187,4940:188,4945:189,4915:183,4980:196,4920:184,4925:185} def channels(): """ :returns: list of all channels """ - return sorted(ISM_24_C2F.keys() + UNII_5_C2F.keys()) + return sorted(ISM_24_C2F.keys() + UNII_5_C2F.keys() + UNII_4_C2F.keys()) def freqs(): """ :returns: list of frequencies """ - return sorted(ISM_24_F2C.keys() + UNII_5_F2C.keys()) + return sorted(ISM_24_F2C.keys() + UNII_5_F2C.keys()+ UNII_4_F2C.keys()) def ch2rf(c): """ diff --git a/pyric/docs/res/PyRIC.tex b/pyric/docs/res/PyRIC.tex index 8e8e707..bb92be1 100644 --- a/pyric/docs/res/PyRIC.tex +++ b/pyric/docs/res/PyRIC.tex @@ -81,7 +81,7 @@ \section{About PyRIC}\label{sec:About} PyRIC is a python port of (a subset of) iw and by extension a python port of -Netlink\cite{spae} (w.r.t nl80211 functions). The goal of PyRIc is to provide +Netlink\cite{spae} (w.r.t nl80211 functions). The goal of PyRIC is to provide a simple interface to the underlying nl80211 kernel support that handles the complex operations of Netlink seamlessy while maintaining a minimum of "code walking" to understand, modify and extend. PyRIC will only work on Linux @@ -112,12 +112,27 @@ \section{About PyRIC}\label{sec:About} functionality by creating additional commands.\\ Currently, PyRIC does handle multicast messages i.e. events or dumps although -plans for future versions include adding the ability to process dumps. +plans for future versions include adding the ability to process dumps. \\ + +There are other Python implementations but many have not been maintained and most +attempt to provide a full implementation of Netlink with nl80211 functionality +as a side-project. Unlike those, PyRIC is: +\begin{itemize} +\item Pythonic: No ctypes, SWIG etc. PyRIC redefines C header files as Python and +uses sockets to communicate directly with the kernel, +\item Self-sufficient: No third-party files used, PyRIC is completely self-contained, +\item Fast: (relatively speaking) PyRIC is faster than using iw through +subprocess.Popen, +\item Small: PyRIC is roughly 420kB, +\item Parseless: Get the output you want without parsing output from iw. Never worry +about iw updates and rewriting your parsers, and +\item Easy: If you can use iw, you can use PyRIC. +\end{itemize} \subsection{Naming Conventions} The terms interface, device and radio are all used interchangeably throughout to -refer to a network interface card (NIC) wireless or Ethernet. The following terms -will always have one one meaning: +refer to a network interface card (NIC). The following terms will always have one +meaning: \begin{itemize} \item \textbf{dev} - the device name i.e. wlan0 or eth0 of a NIC, \item \textbf{phy} - the physical index of a NIC i.e. the 0 in phy0, @@ -154,6 +169,44 @@ \subsection{Cards} usb is disconnected and reconnected) will have the same dev but the phy and ifindex will be different. +\subsection{Benchmarks} +PyRIC makes use of several "extensions" to speed up pyw functions: +\begin{enumerate} +\item \textbf{Persistent sockets}: pyw provides the caller with functions and +the ability to pass their own netlink (or ioctl socket) to pyw functions +\item \textbf{One-time request for the nl80211 family id}: pyw stores the family +id in a global variable +\item \textbf{Consolidation} different "reference" values are consolidated in one +class (see the previous section) +\end{enumerate} + +\begin{table} +\begin{center} +\begin{tabular}{| l | r | r | r | r|} +\hline +chset & Total & Avg & Longest & Shortest \\ +\hline +Popen(iw) & 588.3059 & 0.0588 & 0.0682 & 0.0021 \\ +\hline +one-time & 560.3559 & 0.0560 & 0.0645 & 0.0003 \\ +\hline +persistent & 257.8293 & 0.0257 & 0.0354 & 0.0004 \\ +\hline +\end{tabular} +\caption{Benchmark: Popen(iw) vs pyw} +\end{center} +\label{tab:benchmark} +\end{table} + +While small, these change improve the performance of any programs using pyw. +Table 1 shows benchmarks for hop time on a Alfa AWUS036NH conducted 10000 times. +Note that we are not implying that PyRIC is faster than iw. Rather, the table +shows that PyRIC is faster than using Popen to execute iw. Using one-time sockets, +there is a difference of 28 seconds over Popen and iw with a small decrease in +the average hoptime. Not a big difference. However, the performance increased +dramatically when persistent netlink sockets are used with the total time and +average hop time nearly halved. + \subsection{Hierarchy/Architecture} PyRIC's hierarchy is briefly discussed next. @@ -166,20 +219,23 @@ \subsection{Hierarchy/Architecture} \item \textbf{MANIFEST.in}: used by setup.py \item \textbf{LICENSE}: GPLv3 License \item \textbf{PyRIC.pdf}: this file +\item \textbf{TODO}: lists any outstanding TODOs, ideas for future revisions +\item \textbf{RFI}: comments and observations about netlinks, nl80211 etc \item \textbf{examples}: examples directory \begin{enumerate} \item \textbf{pentest.py}: create wireless pentest environment +\item \textbf{device\_details.py}: display device information \end{enumerate} \item \textbf{pyric} package directory \begin{enumerate} \item \textbf{\_\_init\_\_.py}: Initialize pyric defines the EUNDEF error code (PyRIC uses errno for all errorcodes adding EUNDEF) and the common exception class, 'error' - all submodules use this class for any exceptions. -\item \textbf{TODO}: lists any outstanding TODOs, ideas for future revisions -\item \textbf{RFI}: comments and observations about netlinks, nl80211 etc -\item \textbf{channels.py}: ISM and UNII frequencies and channels, with conversion functions +\item \textbf{channels.py}: ISM and UNII frequencies and channels, with conversion +functions \item \textbf{device.py}: device and chipset utility functions -\item \textbf{pyw.py}: this is the interface, providing wireless interface manipulation functions +\item \textbf{pyw.py}: this is the interface, providing wireless interface +manipulation functions \item \textbf{lib}: lib subpackage \begin{enumerate} \item \textbf{\_\_init\_\_.py}: initialize lib subpackage @@ -257,7 +313,7 @@ \section{Installing PyRIC}\label{sec:installing} \begin{table} \begin{center} -\begin{tabular}{| l | r | r | r | } +\begin{tabular}{| l | r | r | r |} \hline Source & Stability & Recency & Installation \\ \hline @@ -280,7 +336,9 @@ \section{Using PyRIC}\label{sec:using} system's radio(s) and the ability to interact directly with the kernel through netlink and ioctl sockets. \\ -It is helpful if the reader has a basic knowledge of netlinks. For a review, see "Communicating between the kernel and user-space in Linux using Netlink sockets". +It is helpful if the reader has a basic knowledge of netlinks. For a review, see +"Communicating between the kernel and user-space in Linux using Netlink Sockets" +\cite{spae}. \subsection{Interacting with the Wireless Core and Wireless NICs: pyw.py} If you can use iw, you can use pyw.py. The easist way to explain how to use pyw diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index b87d821..8166465 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -472,9 +472,11 @@ def nla_parse(msg,l,mtype,stream,idx): dt = nla_datatype(pol,atype) # attr datatype # Note: we use unpack_from which will ignore the null bytes in numeric - # datatypes & for strings & unspec we just strip trailing null bytes - if dt == nlh.NLA_STRING or dt == nlh.NLA_UNSPEC: a = _nla_strip_(a) - if dt == nlh.NLA_NESTED: a = nla_parse_nested(a) + # datatypes & for strings, strip trailing null bytes + #if dt == nlh.NLA_STRING or dt == nlh.NLA_UNSPEC: a = _nla_strip_(a) + # dt == nlh.NLA_UNSPEC: ignore + if dt == nlh.NLA_STRING: a = _nla_strip_(a) + elif dt == nlh.NLA_NESTED: a = nla_parse_nested(a) elif dt == nlh.NLA_U8: a = struct.unpack_from("B",a,0)[0] elif dt == nlh.NLA_U16: a = struct.unpack_from("H",a,0)[0] elif dt == nlh.NLA_U32: a = struct.unpack_from("I",a,0)[0] @@ -616,7 +618,6 @@ def _nla_strip_(v): except IndexError: return v - def _attrpack_(a,v,d): """ :param a: attribute type diff --git a/pyric/net/if_h.py b/pyric/net/if_h.py index c4ed7ad..1f8f9f2 100644 --- a/pyric/net/if_h.py +++ b/pyric/net/if_h.py @@ -158,10 +158,10 @@ # char sa_data[14]; /* 14 bytes of protocol address */ #}; # NOTE: -# 1) for our purposes, we use only characters, 6 octets for a hw addr and 4 -# octets for an ip4 addr. +# 1) for our purposes, we use only 6 characters, 6 octets for a hw addr and 4 +# octets for an ip4 addr. # 2) For whatever reason, all ioctl calls accept and return ip4 addresses -# prefixed by two null bytes +# prefixed by two null bytes AF_UNSPEC = 0 # from socket.h sa_family unspecified ARPHRD_ETHER = 1 # from net/if_arp.h sa_family ethernet a.k.a AF_LOCAL diff --git a/pyric/net/wireless/__init__.py b/pyric/net/wireless/__init__.py index d598680..94c2ff4 100644 --- a/pyric/net/wireless/__init__.py +++ b/pyric/net/wireless/__init__.py @@ -23,15 +23,14 @@ includes: nl80211_h 0.0.2 nl80211_c 0.0.1 changes: o added nl80211_c to handle attribute policies - + - added nl80211_parse_freqs to parse out supported frequencies """ __name__ = 'wireless' __license__ = 'GPLv3' -__version__ = '0.0.1' +__version__ = '0.0.2' __date__ = 'April 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' - +__status__ = 'Development' \ No newline at end of file diff --git a/pyric/net/wireless/nl80211_c.py b/pyric/net/wireless/nl80211_c.py index d9b96a2..8b4edfc 100644 --- a/pyric/net/wireless/nl80211_c.py +++ b/pyric/net/wireless/nl80211_c.py @@ -285,3 +285,111 @@ # nl80211h.NL80211_SCHED_SCAN_PLAN_INTERVAL:nlh.NLA_U32, # nl80211h.NL80211_SCHED_SCAN_PLAN_ITERATIONS:nlh.NLA_U32 #} + + +""" +Parsing NL80211_ATTR_WIPHY_BANDS + +A hack for extracting supported frequencies from the NL80211_ATTR_WIPHY_BANDS +libnl.nla_parse_nested does not parse the bands structure correctly + + 1) Each band( or frequency list) begins with < n > \x01 (\x01 = NL80211_BAND_ATTR_FREQS) + where n (starting at 1) appears to be the band number + - the first one seems to happen at 209 (on alfa, intel and rosewill cards at + least) + - there may be erroneous band delimiters + o if valid, the first freq is directly following the band delimiter + - rosewill card skips \x02\x01, \x03\x01 and uses \x04\x01 for UNII 5 and 4 GHz + + 2) Each freq structure appears to be listed as + + +-------+-----+-------+-------+-----------+-----+ + | buff1 | RF | [unk] | buff2 | freq data | pad | + +-------+-----+-------+-------+-----------+-----+ + 9 4 7 4 2 + + where + + - buff1 = + + +------+-----+------+-----+----------------------+ + | \x00 | | \x00 | cnt | \x00\x08\x00\x01\x00 | + +------+-----+------+-----+----------------------+ + + such that l is the length in bytes of the complete freq.structure to include + the first and last null byte.and cnt is the number (starting at 0) of the + current freq in this band. + + - RF is a 4-octet frequency + + - unk = \x04\x00\x03\x00\x04\x00\x04 if present + + - buff2 = \x08\x00\x06\x00 + + - pad = < n > \x00 where < n > has been seen as \x05 and \x07 + + 3) we can determine where to start identifying frequencies + - find the band marker + - if there is buff1 with cnt = 0 4 bytes after the start of the marker + o 2 bytes for the band marker and 2 bytes for the null byte and flag + + 4) we need to identify something other than band markers to determine where + to pull frequencies from + +""" +fSz = 'B' +iSz = 1 +fCnt = 'B' +iCnt = 3 +fFreq = 'I' +iFreq = 9 +first = '\x00{0}\x00\x08\x00\x01\x00'.format(struct.pack(fCnt,0)) +lFirst = len(first) +def nl80211_parse_freqs(bands): + """ + extracts frequencies from bands + :param bands: packed bytes containing band data + :returns: list of frequencies found in bands + """ + # get the band markers + # for each possible bandmarker determine validity by identifying if there is + # a freq structure w/ count = 9 following immediately after the bandmarker + # we have to skip the length portion as well of the freq structure. If so + # append the index (the end) of the bandmarker + bandmarkers = [] + #for i in _bandmarkers_('\x01\x01',bands) + _bandmarkers_('\x02\x01',bands): + # if bands[i+4:i+4+len(first)] == first: bandmarkers.append(i+2) + + # this works but, how do we know which band number to stop trying? + for i in xrange(10): + for j in _bandmarkers_(struct.pack('B',i) + '\x01',bands): + if bands[j+4:j+4+lFirst] == first: + bandmarkers.append(j+2) + break + + l = len(bands) + rfs = [] + for bm in bandmarkers: + # get freq structure length and parse out freq + idx = bm + cnt = 0 + while idx < l: + try: + sz = struct.unpack_from(fSz,bands,idx+iSz)[0] + if cnt != struct.unpack_from(fCnt,bands,idx+iCnt)[0]: break + rfs.append(struct.unpack_from(fFreq,bands,idx+iFreq)[0]) + except (struct.error,IndexError): + break + cnt += 1 + idx += sz + return rfs + +def _bandmarkers_(marker,bands): + ms = [] + idx = 0 + while idx < len(bands): + idx = bands.find(marker,idx) + if idx == -1: break + ms.append(idx) + idx += 2 + return ms \ No newline at end of file diff --git a/pyric/net/wireless/nl80211_h.py b/pyric/net/wireless/nl80211_h.py index e84f4af..449da5f 100644 --- a/pyric/net/wireless/nl80211_h.py +++ b/pyric/net/wireless/nl80211_h.py @@ -48,6 +48,7 @@ NOTE: 1. Most of these constants are not used but are left for possible future use 2. Have removed *_AFTER_LAST and only kept MAX_* for enums for those nums + """ __name__ = 'nl80211_h' diff --git a/pyric/pyw.py b/pyric/pyw.py index 5af35e0..cbcca42 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -97,7 +97,7 @@ def _nlstub_(fct,*argv): or a ifindex is needed. The only exception to this is devinfo which by necessity will accept a Card or a device name 2) All functions allow pyric errors to pass through. - 3) sets the tx/rx buffer depending on the function + """ __name__ = 'pyw' @@ -109,20 +109,21 @@ def _nlstub_(fct,*argv): __email__ = 'wraith.wireless@yandex.com' __status__ = 'Development' -import struct # ioctl unpacking -import pyric # pyric exception -import errno # error codes -import re # check addr validity -from pyric import device # device related -from pyric import channels # channel related -from pyric.docs.nlhelp import cmdbynum # get command name -import pyric.net.netlink_h as nlh # netlink definition -import pyric.net.genetlink_h as genlh # genetlink definition -import pyric.net.wireless.nl80211_h as nl80211h # 802.11 definition -import pyric.net.sockios_h as sioch # sockios constants -import pyric.net.if_h as ifh # ifreq structure -import pyric.lib.libnl as nl # netlink functions -import pyric.lib.libio as io # ioctl functions +import struct # ioctl unpacking +import pyric # pyric exception +import errno # error codes +import re # check addr validity +from pyric import device # device related +from pyric import channels # channel related +from pyric.docs.nlhelp import cmdbynum # get command name +import pyric.net.netlink_h as nlh # netlink definition +import pyric.net.genetlink_h as genlh # genetlink definition +import pyric.net.wireless.nl80211_h as nl80211h # 802.11 definition +#from pyric.net.wireless.nl80211_c import nl80211_parse_freqs # WIPHY_BANDS +import pyric.net.sockios_h as sioch # sockios constants +import pyric.net.if_h as ifh # ifreq structure +import pyric.lib.libnl as nl # netlink functions +import pyric.lib.libio as io # ioctl functions _FAM80211ID_ = None @@ -739,11 +740,10 @@ def phyinfo(card, *argv): rmsg = nl.nl_recvmsg(nlsock) # pull out attributes - info = {'scan_ssids':None, 'modes':None, 'bands':None, 'retry_short':None, + info = {'scan_ssids':None, 'modes':None, 'freqs':None, 'retry_short':None, 'retry_long':None, 'frag_thresh':None, 'rts_thresh':None, 'cov_class':None, 'swmodes':None, 'commands':None} # singular attributes - info['freqs'] = _getfreqs_(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_BANDS)) info['generation'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_GENERATION) info['retry_short'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_SHORT) info['retry_long'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_LONG) @@ -752,7 +752,10 @@ def phyinfo(card, *argv): info['rts_thresh'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RTS_THRESHOLD) info['cov_class'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_COVERAGE_CLASS) info['scan_ssids'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS) - # nested attributes (for whatever reason, these use big-endian) + # nested attributes + bands = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_BANDS) + #info['freqs'] = nl80211_parse_freqs(bands) + info['freqs'] = _getfreqs_(bands) modes = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_IFTYPES) info['modes'] = [_iftypes_(struct.unpack('>H', mode)[0]) for mode in modes] modes = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SOFTWARE_IFTYPES) @@ -978,8 +981,8 @@ def devdel(card, *argv): :param card: Card object :param argv: netlink socket at argv[0] (or empty) :returns: True on success - NOTE: the original card is no longer valid (i.e. the phy will still be present but - the device name and ifindex are no longer 'present' in the system + NOTE: the original card is no longer valid (i.e. the phy will still be present + but the device name and ifindex are no longer 'present' in the system """ try: nlsock = argv[0] @@ -1060,6 +1063,20 @@ def _unsetf_(flags, flag): """ return flags & ~flag +def _getfreqs_(band): + """ + extract list of supported freqs packed byte stream band + :param band: packed byte string from NL80211_ATTR_WIPHY_BANDS + :returns: list of supported frequencies + + NOTE: this is actually faster than nl80211_c.nl80211_parse_freqs + """ + rfs = [] + for freq in channels.freqs(): + if band.find(struct.pack("I", freq)) != -1: + rfs.append(freq) + return rfs + def _familyid_(nlsock): """ extended version: get the family id @@ -1164,21 +1181,6 @@ def _iftypes_(i): except IndexError: return "Unknown mode ({0})".format(i) -def _getfreqs_(band): - """ - extract list of supported freqs packed byte stream band - :param band: packed byte string from NL80211_ATTR_WIPHY_BANDS - :returns: list of supported frequencies - - NOTE: this is an inefficient hack until I can get the parsing of the - *_WIPHY_BANDS functional - """ - rfs = [] - for freq in channels.freqs(): - if band.find(struct.pack("I", freq)) != -1: - rfs.append(freq) - return rfs - #### TRANSLATION FUNCTIONS #### def _iostub_(fct, *argv): @@ -1214,7 +1216,7 @@ def _nlstub_(fct, *argv): finally: if nlsock: nl.nl_socket_free(nlsock) -#### NOT USED #### +#### PENDING #### def _fut_chset(card, ch, chw, *argv): """ @@ -1242,4 +1244,4 @@ def _fut_chset(card, ch, chw, *argv): nl.nla_put_u32(msg, channels.CHWIDTHS.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) - return True + return True \ No newline at end of file diff --git a/setup.py b/setup.py index a340626..58cdf97 100644 --- a/setup.py +++ b/setup.py @@ -36,11 +36,18 @@ long_desc = """ -A simple interface to the underlying nl80211 kernel support that handles the -complex operations of netlink seamlessy while maintaining a minimum of "code -walking" to understand, modify and add future operations. Not a full blown port -of iw (and ifconfig, iwconfig) functionality to Python but sufficient to -programmatically create a wireless pentest environment""" + PyRIC provides the ability to +manipuate, identify and enumerate your system's wireless cards. It is a pure +python port of a subset of the functionality provided by iw, ifconfig and iwconfig. +PyRIC is: +* Pythonic: No ctypes, SWIG etc. PyRIC redefines C header files as Python and +uses sockets to communicate with kernel. +* Self-sufficient: No third-party files used, PyRIC is completely self-contained +* Fast: (relatively speaking) PyRIC is faster than using iw through subprocess.Popen +* Parse(less): Get the output you without parsing output from iw. Never worry about +iw updates and rewriting your parsers. +* Easy: If you can use iw, you can use PyRIC +""" setup(name='PyRIC', version=pyric.__version__, From 85ffe8fa304a91bfd78c5d40c3a1ef650c357365 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Mon, 30 May 2016 11:59:28 -0600 Subject: [PATCH 002/121] 0.0.8 --- .gitignore | 93 +++++++++++++++++++++++++++++++++++++++++++ MANIFEST.in | 1 + README.md | 2 + tests/pyw.unittest.py | 89 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 185 insertions(+) create mode 100644 .gitignore create mode 100644 tests/pyw.unittest.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dd2f702 --- /dev/null +++ b/.gitignore @@ -0,0 +1,93 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg +PyRIC.egg-info + +# PyCharm +.idea +.git + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# IPython Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# dotenv +.env + +# virtualenv +venv/ +ENV/ + +# Spyder project settings +.spyderproject + +# Rope project settings +.ropeproject \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in index cca40ba..1ab476e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,5 +2,6 @@ include LICENSE README.md __init__.py channels.py device.py pyw.py PyRIC.pdf TODO RFI # Include subdirectories +# NOTE: we do not include test folder in installation recursive-include lib net examples docs recursive-include docs *.help \ No newline at end of file diff --git a/README.md b/README.md index 837c0a8..ecbb60a 100644 --- a/README.md +++ b/README.md @@ -349,6 +349,8 @@ Extending PyRIC is fun and easy too, see the user guide PyRIC.pdf. - examples example folder + pentest.py create wireless pentest environment example + device_details.py display device information + - tests test folder + + pyw.unittest.py unit test for pyw functions - setup.py install file - setup.cfg used by setup.py - MANIFEST.in used by setup.py diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py new file mode 100644 index 0000000..65743ea --- /dev/null +++ b/tests/pyw.unittest.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python +""" pyw_unittest.py: utility functions + +Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +Redistribution and use in source and binary forms, with or without modifications, +are permitted provided that the following conditions are met: + o Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + o Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + o Neither the name of the orginal author Dale V. Patterson nor the names of any + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +Define unittest functions for pyw +""" + +#__name__ = 'pyw_unittest' +__license__ = 'GPLv3' +__version__ = '0.0.1' +__date__ = 'May 2016' +__author__ = 'Dale Patterson' +__maintainer__ = 'Dale Patterson' +__email__ = 'wraith.wireless@yandex.com' +__status__ = 'Production' + +import unittest +import time +from pyric import pyw + +# modify below to fit your system +nics = ['alfa0','rose0','eth0','lo','wlan0'] +enics = ['eth0','lo'] +wnics = ['alfa0','rose0','wlan0'] +inics = ['foo0','bar0'] +regdom = '00' +regdomnew = 'BO' + +# test functions interfaces and isinterface +class InterfaceTestCase(unittest.TestCase): + def testEnum(self): + self.assertEqual(nics,pyw.interfaces()) + def testIs(self): + for n in nics: + self.assertTrue(pyw.isinterface(n)) + def testNotIs(self): + for i in inics: + self.assertFalse(pyw.isinterface(i)) + def testIn(self): + for n in nics: + self.assertIn(n,pyw.interfaces()) + +# test functions winterfaces and iswireless +class WInterfaceTestCase(unittest.TestCase): + def testEnum(self): + self.assertEqual(wnics,pyw.winterfaces()) + def testIs(self): + for w in wnics: + self.assertTrue(pyw.iswireless(w)) + def testNotIs(self): + for i in inics + enics: + self.assertFalse(pyw.iswireless(i)) + def testIn(self): + for w in wnics: + self.assertIn(w,pyw.winterfaces()) + +# test regget, regset +class RegDomTestCase(unittest.TestCase): + def testIs(self): + self.assertEqual(regdom,pyw.regget()) + def testNotIs(self): + self.assertFalse('US'==pyw.regget()) + def testSet(self): + self.assertTrue(pyw.regset(regdomnew)) + time.sleep(0.25) # give sleep time + self.assertEqual(regdomnew,pyw.regget()) + self.assertTrue(pyw.regset(regdom)) + time.sleep(0.25) # give sleep time + self.assertEqual(regdom, pyw.regget()) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file From 6e6c3d208acb516e882e426327f712a9195063fc Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Mon, 30 May 2016 15:41:45 -0600 Subject: [PATCH 003/121] 0.0.8 --- pyric/channels.py | 57 +++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/pyric/channels.py b/pyric/channels.py index a4b40c0..7357e82 100644 --- a/pyric/channels.py +++ b/pyric/channels.py @@ -1,17 +1,17 @@ #!/usr/bin/env python -""" channels.py: 802.11 channel/freq utilities +""" channels.py:802.11 channel/freq utilities Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) -This program is free software: you can redistribute it and/or modify it under +This program is free software:you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software -Foundation, either version 3 of the License, or (at your option) any later +Foundation,either version 3 of the License,or (at your option) any later version. -Redistribution and use in source and binary forms, with or without modifications, +Redistribution and use in source and binary forms,with or without modifications, are permitted provided that the following conditions are met: - o Redistributions of source code must retain the above copyright notice, this + o Redistributions of source code must retain the above copyright notice,this list of conditions and the following disclaimer. o Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation @@ -20,7 +20,7 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. -Defines ISM 2.4Ghz, UNII 5Ghz and 4.9GHz frequencies and channels +Defines ISM 2.4Ghz,UNII 5Ghz and 4.9GHz frequencies and channels """ @@ -45,45 +45,54 @@ 2447:8,2417:2,2452:9,2422:3,2457:10,2427:4,2462:11} # UNII 5 Bands -UNII_5_C2F={36:5180,38:5190,40:5200,42:5210,44:5220,46:5230,48:5240,52:5260, - 56:5280,60:5300,64:5320,100:5500,104:5520,108:5540,112:5560,116:5580, - 120:5600,124:5620,128:5640,132:5660,136:5680,140:5700,149:5745, - 153:5765,157:5785,161:5805,165:5825} -UNII_5_F2C={5765:153,5640:128,5260:52,5520:104,5785:157,5660:132,5280:56, - 5540:108,5805:161,5680:136,5300:60,5560:112,5180:36,5825:165, - 5700:140,5190:38,5320:64,5580:116,5200:40,5210:42,5600:120, - 5220:44,5230:46,5745:149,5620:124,5240:48,5500:100} +UNII_5_C2F={34:5170,36:5180,38:5190,40:5200,42:5210,44:5220,46:5230,48:5240,50:5250, + 52:5260,54:5270,56:5280,58:5280,60:5300,62:5310,64:5320,100:5500, + 102:5510,104:5520,106:5530,108:5540,110:5550,112:5560,114:5570,116:5580, + 118:5590,120:5600,122:5610,124:5620,126:5630,128:5640,132:5660,136:5680, + 138:5690,140:5700,142:5710,144:5720,149:5745,151:5755,153:5765,155:5775, + 157:5785,159:5795,161:5805,165:5825} +UNII_5_F2C={5250:50,5765:153,5510:102,5640:128,5260:52,5775:155,5520:104,5270:54, + 5785:157,5530:106,5660:132,5280:58,5795:159,5540:108,5805:161,5550:110, + 5680:136,5170:34,5300:60,5560:112,5690:138,5180:36,5310:62,5825:165, + 5570:114,5700:140,5190:38,5320:64,5580:116,5710:142,5200:40,5590:118, + 5720:144,5210:42,5600:120,5220:44,5610:122,5230:46,5745:149,5620:124, + 5240:48,5755:151,5500:100,5630:126} # UNII 4 Bands UNII_4_C2F={183:4915,184:4920,185:4925,187:4935,188:4940,189:4945,192:4960,196:4980} UNII_4_F2C={4960:192,4935:187,4940:188,4945:189,4915:183,4980:196,4920:184,4925:185} +# US high powered backhaul +#131 3657.5 132 36622.5 ? 132 3660.0 133 3667.5 133 3665.0 +#134 3672.5 134 3670.0 135 3677.5 136 3682.5 136 3680.0 +#137 3687.5 137 3685.0 138 3689.5 138 3690.0 + def channels(): - """ :returns: list of all channels """ + """ :returns:list of all channels """ return sorted(ISM_24_C2F.keys() + UNII_5_C2F.keys() + UNII_4_C2F.keys()) def freqs(): - """ :returns: list of frequencies """ + """ :returns:list of frequencies """ return sorted(ISM_24_F2C.keys() + UNII_5_F2C.keys()+ UNII_4_F2C.keys()) def ch2rf(c): """ channel to frequency conversion - :param c: channel - :returns: frequency in MHz corresponding to channel + :param c:channel + :returns:frequency in MHz corresponding to channel """ - if c in ISM_24_C2F: return ISM_24_C2F[c] - if c in UNII_5_C2F: return UNII_5_C2F[c] + if c in ISM_24_C2F:return ISM_24_C2F[c] + if c in UNII_5_C2F:return UNII_5_C2F[c] return None def rf2ch(f): """ frequency to channel conversion - :param f: frequency (in MHz) - :returns: channel number corresponding to frequency + :param f:frequency (in MHz) + :returns:channel number corresponding to frequency """ - if f in ISM_24_F2C: return ISM_24_F2C[f] - if f in UNII_5_F2C: return UNII_5_F2C[f] + if f in ISM_24_F2C:return ISM_24_F2C[f] + if f in UNII_5_F2C:return UNII_5_F2C[f] return None \ No newline at end of file From 03042beb99c07bb72019f5f6fd6fee36a024b36a Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Tue, 31 May 2016 19:03:13 -0600 Subject: [PATCH 004/121] 0.0.8 --- PyRIC.pdf | Bin 267191 -> 267318 bytes README.md | 6 + TODO | 5 +- pyric/__init__.py | 3 + pyric/docs/res/PyRIC.tex | 18 +- pyric/pyw.py | 226 +++++++++++++++---------- tests/pyw.unittest.py | 345 +++++++++++++++++++++++++++++++++------ 7 files changed, 462 insertions(+), 141 deletions(-) diff --git a/PyRIC.pdf b/PyRIC.pdf index 9969f1bf9bf2104ae42c8ac679e84ccb184f13e0..1fe4aa4af830cc7f0426af40ff014f8238233f5c 100644 GIT binary patch delta 14822 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 delta 14683 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 diff --git a/README.md b/README.md index ecbb60a..a82b951 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ # PyRIC: Python Radio Interface Controller ## Pythonic iw +[![License: GPLv3](https://img.shields.io/pypi/l/PyRIC.svg)](https://github.com/wraith-wireless/PyRIC/blob/master/LICENSE) +[![Current version at PyPI](https://img.shields.io/pypi/v/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) +[![Downloads per month on PyPI](https://img.shields.io/pypi/dm/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) +![Supported Python Versions](https://img.shields.io/pypi/pyversions/PyRIC.svg) +![Software status](https://img.shields.io/pypi/status/PyRIC.svg) + ## 1 DESCRIPTION: BLUF: Why use subprocess.Popen, regular expressions and str.find to interact with your Wireless Network Interface Card. PyRIC provides the ability to diff --git a/TODO b/TODO index eb85b2c..21fed68 100644 --- a/TODO +++ b/TODO @@ -1,13 +1,14 @@ 1) overall - o look at iw dev wlan0 link o make a cli as well 2) libnl.py o see (1) in RFI 4) pyw + o look at iw dev wlan0 link - has information about the AP connected to o add txget from iw i.e. netlink perspective o find a better way to find the supported standards of a card o for now, using ioctl to set ip addresses - - move everything to netlink + - move to netlink (using ip ?) or is better to keep as ioctl since this + allows us to set erroneous values for netmask, broadcast o Can we find the current channel of a radio in monitor mode that is actively scanning? o parse NL80211_ATTR_WIPHY_BANDS (have workaround currently in place) \ No newline at end of file diff --git a/pyric/__init__.py b/pyric/__init__.py index 3bd6062..cd56b38 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -110,6 +110,9 @@ * nl80211_c.nl80211_parse_freqs works but is slower than _getfreqs_ and uses several hacks which may make it invalid for certain cards - added 4.9GHz frequencies to channels.py + - fixed _validmac_ to validate both uppercase & lowercase hex characters + - added devfreqs, devchs + o unittest completed 61 tests ran in 5.360s """ __name__ = 'pyric' diff --git a/pyric/docs/res/PyRIC.tex b/pyric/docs/res/PyRIC.tex index bb92be1..918e325 100644 --- a/pyric/docs/res/PyRIC.tex +++ b/pyric/docs/res/PyRIC.tex @@ -226,6 +226,10 @@ \subsection{Hierarchy/Architecture} \item \textbf{pentest.py}: create wireless pentest environment \item \textbf{device\_details.py}: display device information \end{enumerate} +\item \textbf{tests}: test directory +\begin{enumerate} +\item \textbf{pyw.unittest.py}: pyw unittesting +\end{enumerate} \item \textbf{pyric} package directory \begin{enumerate} \item \textbf{\_\_init\_\_.py}: Initialize pyric defines the EUNDEF error code @@ -773,12 +777,16 @@ \subsection{Functions} \item inetset(card,ipaddr,netmask,broadcast,[iosock]): (ifconfig card/ netmask broadcast ), type: ioctl, set the interface addresses of the card -\item ipset(card,ipaddr,[iosock]): (ifconfig card. ), type: ioctl, +\item ip4set(card,ipaddr,[iosock]): (ifconfig card. ), type: ioctl, set the card's ip4 address -\item ipset(card,ipaddr,[iosock]): (ifconfig card. ), type: ioctl, -set the card's netmask -\item ipset(card,ipaddr,[iosock]): (ifconfig card. ), type: ioctl, -set the card's broadcast address +\item netmaskset(card,netmask,[iosock]): (ifconfig card. netmask ), +type: ioctl, set the card's netmask +\item broadcastset(card,broadcast,[iosock]): (ifconfig card. broadcast +), type: ioctl, set the card's broadcast address +\item devfreqs(card,[nlsock]): (iw phy card.phy info), type: netlink, get card's +supported frequencies +\item devchs(card,[nlsock]): (iw phy card.phy info), type: netlink, get card's +supported channels \item devstds(card,[iosock]): (iwconfig card. | grep IEEE), type: ioctl, get list of card's 802.11 supported standards \item devmodes(card,[nlsock]): (iw phy card.phy info | grep interface), type: diff --git a/pyric/pyw.py b/pyric/pyw.py index cbcca42..2ac9cf1 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -252,6 +252,8 @@ def regset(rd, *argv): #### WIRELESS INTERFACE FUNCTIONS #### ################################################################################ +#### CARD RELATED #### + class Card(tuple): """ A wireless network interface card - Wrapper around a tuple @@ -301,6 +303,8 @@ def validcard(card, *argv): if e.errno == errno.ENODEV: return False else: raise +#### ADDRESS RELATED #### + def macget(card, *argv): """ gets the interface's hw address (APX ifconfig | grep HWaddr) @@ -564,6 +568,8 @@ def broadcastset(card, broadcast, *argv): except struct.error as e: raise pyric.error(pyric.EUNDEF, "ifreq error: {0}".format(e)) +#### ON/OFF #### + def up(card, *argv): """ REQUIRES ROOT PRIVILEGES @@ -577,10 +583,12 @@ def up(card, *argv): except IndexError: return _iostub_(up, card) - dev = card.dev - flags = _flagsget_(dev, iosock) - if not _issetf_(flags, ifh.IFF_UP): - _flagsset_(dev, _setf_(flags, ifh.IFF_UP), iosock) + try: + flags = _flagsget_(card.dev, iosock) + if not _issetf_(flags, ifh.IFF_UP): + _flagsset_(card.dev, _setf_(flags, ifh.IFF_UP), iosock) + except AttributeError as e: + raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) return True def down(card, *argv): @@ -596,18 +604,50 @@ def down(card, *argv): except IndexError: return _iostub_(down, card) - dev = card.dev - flags = _flagsget_(dev, iosock) - if _issetf_(flags, ifh.IFF_UP): - _flagsset_(dev, _unsetf_(flags, ifh.IFF_UP), iosock) + try: + flags = _flagsget_(card.dev, iosock) + if _issetf_(flags, ifh.IFF_UP): + _flagsset_(card.dev, _unsetf_(flags, ifh.IFF_UP), iosock) + except AttributeError as e: + raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) return True +#### INFO RELATED #### + +def devfreqs(card,*argv): + """ + returns card's supported frequencies + :param card: Card object + :param argv: netlink socket at argv[0] (or empty) + :returns: list of supported frequencies + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(devfreqs,card) + + return phyinfo(card,nlsock)['freqs'] + +def devchs(card,*argv): + """ + returns card's supported channels + :param card: Card object + :param argv: netlink socket at argv[0] (or empty) + :returns: list of supported channels + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(devchs,card) + + return map(channels.rf2ch,phyinfo(card,nlsock)['freqs']) + def devstds(card, *argv): """ gets card's wireless standards (iwconfig | grep IEEE :param card: Card object :param argv: ioctl socket at argv[0] (or empty) - :returns: returns a list standards (letter designators) + :returns: list of standards (letter designators) """ try: iosock = argv[0] @@ -718,13 +758,6 @@ def phyinfo(card, *argv): cov_class -> coverage class swmodes -> supported software modes commands -> supported commands - - NOTE: function is still in experimental stage, still working through how - the nested attributes should be treated. ATT have found that: - modes,swmodes are big-endian unsigned shorts corresponding to nl80211_iftype - commands are a tuple of big-endian unsigned shorts t=(idx,cmd) where - idx is the current index in the list of supported commands and - cmd correpsonds to nl80211_commands """ try: nlsock = argv[0] @@ -732,12 +765,15 @@ def phyinfo(card, *argv): return _nlstub_(phyinfo, card) # iw sends a @NL80211_ATTR_SPLIT_WIPHY_DUMP, we don't & get full return at once - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_GET_WIPHY, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_GET_WIPHY, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nl_sendmsg(nlsock, msg) + rmsg = nl.nl_recvmsg(nlsock) + except AttributeError as e: + raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) # pull out attributes info = {'scan_ssids':None, 'modes':None, 'freqs':None, 'retry_short':None, @@ -771,31 +807,14 @@ def phyinfo(card, *argv): info['commands'].append("unknown cmd ({0})".format(cmd)) return info -def ifaces(card, *argv): - """ - returns all interfaces sharing the same phy as card (APX iw dev | grep phy#) - :param card: Card object - :param argv: netlink socket at argv[0] (or empty) - :returns: a list of tuples t = (Card,mode) for each device having the same - phyiscal index as that of card - """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(ifaces, card) - - ifs = [] - for dev in winterfaces(): - info = devinfo(dev, nlsock) - if info['card'].phy == card.phy: ifs.append((info['card'], info['mode'])) - return ifs +#### TX/RX RELATED #### def txget(card, *argv): """ gets the device's transimission power (iwconfig | grep Tx-Power) :param card: Card object :param argv: ioctl socket at argv[0] (or empty) - :returns: transmission power + :returns: transmission power in dBm """ try: iosock = argv[0] @@ -818,16 +837,16 @@ def chget(card, *argv): gets the current channel for device (iw dev info | grep channel) :param card: Card object :param argv: netlink socket at argv[0] (or empty) - NOTE: - o ATT will only work if dev is associated w/ AP + NOTE: will only work if dev is associated w/ AP or device is in monitor mode + and has had chset previously """ try: nlsock = argv[0] except IndexError: return _nlstub_(chget, card) - return channels.rf2ch(devinfo(card.dev, nlsock)['RF']) + return channels.rf2ch(devinfo(card, nlsock)['RF']) -def chset(card, ch, chw, *argv): +def chset(card, ch, chw=None, *argv): """ REQUIRES ROOT PRIVILEGES sets current channel on device (iw phy set channel ) @@ -869,17 +888,22 @@ def freqset(card, rf, chw=None, *argv): except IndexError: return _nlstub_(freqset, card, rf, chw) - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_WIPHY, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nla_put_u32(msg, rf, nl80211h.NL80211_ATTR_WIPHY_FREQ) - nl.nla_put_u32(msg, channels.CHWIDTHS.index(chw), - nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) - nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_SET_WIPHY, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nla_put_u32(msg, rf, nl80211h.NL80211_ATTR_WIPHY_FREQ) + nl.nla_put_u32(msg, channels.CHWIDTHS.index(chw), + nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) + nl.nl_sendmsg(nlsock, msg) + nl.nl_recvmsg(nlsock) + except AttributeError as e: + raise pyric.error(errno.EINVAL,"Invalid paramter {0}".format(e)) return True +#### INTERFACE & MODE RELATED #### + def modeget(card, *argv): """ get current mode of card @@ -911,8 +935,7 @@ def modeset(card, mode, flags=None, *argv): if mode not in IFTYPES: raise pyric.error(errno.EINVAL, 'Invalid mode') if flags: if mode != 'monitor': - raise pyric.error(errno.EINVAL, - 'Can only set flags in monitor mode') + raise pyric.error(errno.EINVAL, 'Can only set flags in monitor mode') for flag in flags: if flag not in MNTRFLAGS: raise pyric.error(errno.EINVAL, 'Invalid flag: {0}', format(flag)) @@ -923,17 +946,44 @@ def modeset(card, mode, flags=None, *argv): except IndexError: return _nlstub_(modeset, card, mode, flags) - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_INTERFACE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) - for flag in flags: - nl.nla_put_u32(msg, MNTRFLAGS.index(flag), nl80211h.NL80211_ATTR_MNTR_FLAGS) - nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_SET_INTERFACE, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) + for flag in flags: + nl.nla_put_u32(msg, MNTRFLAGS.index(flag), + nl80211h.NL80211_ATTR_MNTR_FLAGS) + nl.nl_sendmsg(nlsock, msg) + nl.nl_recvmsg(nlsock) + except AttributeError as e: + raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) return True +def ifaces(card, *argv): + """ + returns all interfaces sharing the same phy as card (APX iw dev | grep phy#) + :param card: Card object + :param argv: netlink socket at argv[0] (or empty) + :returns: a list of tuples t = (Card,mode) for each device having the same + phyiscal index as that of card + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(ifaces, card) + + ifs = [] + for dev in winterfaces(): + info = devinfo(dev, nlsock) + try: + if info['card'].phy == card.phy: + ifs.append((info['card'], info['mode'])) + except AttributeError as e: + raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + return ifs + def devadd(card, vdev, mode, flags=None, *argv): """ REQUIRES ROOT PRIVILEGES @@ -943,8 +993,9 @@ def devadd(card, vdev, mode, flags=None, *argv): :param vdev: device name of new interface :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} - :param flags: list of monitor flags (can only be used if vnic is being created in - monitor mode) + :param flags: list of monitor flags (can only be used if vnic is being created + in monitor mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' + |'cook'|'active'} :param argv: netlink socket at argv[0] (or empty) :returns: the new Card """ @@ -962,16 +1013,20 @@ def devadd(card, vdev, mode, flags=None, *argv): except IndexError: return _nlstub_(devadd, card, vdev, mode, flags) - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_NEW_INTERFACE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nla_put_string(msg, vdev, nl80211h.NL80211_ATTR_IFNAME) - nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) - for flag in flags: - nl.nla_put_u32(msg, MNTRFLAGS.index(flag), nl80211h.NL80211_ATTR_MNTR_FLAGS) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_NEW_INTERFACE, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nla_put_string(msg, vdev, nl80211h.NL80211_ATTR_IFNAME) + nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) + for flag in flags: + nl.nla_put_u32(msg, MNTRFLAGS.index(flag), + nl80211h.NL80211_ATTR_MNTR_FLAGS) + nl.nl_sendmsg(nlsock, msg) + rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes + except AttributeError as e: + raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) return Card(card.phy, vdev, nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) def devdel(card, *argv): @@ -989,12 +1044,15 @@ def devdel(card, *argv): except IndexError: return _nlstub_(devdel, card) - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_DEL_INTERFACE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_DEL_INTERFACE, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nl_sendmsg(nlsock, msg) + nl.nl_recvmsg(nlsock) + except AttributeError as e: + raise pyric.error(errno.EINVAL,"Invalid paramter {0}".format(e)) return True ################################################################################ @@ -1010,7 +1068,7 @@ def _hex2ip4_(v): return '.'.join([str(ord(c)) for c in v]) IPADDR = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") # re for ip addr -MACADDR = re.compile("^([0-9A-F]{2}:){5}([0-9A-F]{2})$") # re for mac addr (capital letters only) +MACADDR = re.compile("^([0-9a-fA-F]{2}:){5}([0-9a-fA-F]{2})$") # re for mac addr def _validip4_(addr): """ diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 65743ea..ba9cac1 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -1,31 +1,31 @@ #!/usr/bin/env python -""" pyw_unittest.py: utility functions - -Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) - -This program is free software: you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation, either version 3 of the License, or (at your option) any later -version. - -Redistribution and use in source and binary forms, with or without modifications, -are permitted provided that the following conditions are met: - o Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - o Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - o Neither the name of the orginal author Dale V. Patterson nor the names of any - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - +""" pyw.unittest.py: unittest Define unittest functions for pyw + +Assumptions: + o user has root privileges + o user has set up global variables to system + o private functions are tested via methods + o persistent sockets are tested via one-time methods that is, one-time socket + calls result in netlink socket creation, usage and deletion + +usage: + sudo python pyw.unittest.py -v + +Results as of 31-May-15 +sudo python pyw.unittest.py +............................................................. +---------------------------------------------------------------------- +Ran 61 tests in 5.360s + +OK + """ -#__name__ = 'pyw_unittest' +#__name__ = 'pyw.unittest' __license__ = 'GPLv3' __version__ = '0.0.1' -__date__ = 'May 2016' +__date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' @@ -33,57 +33,302 @@ import unittest import time +from pyric import error +from pyric.channels import ISM_24_F2C,rf2ch from pyric import pyw # modify below to fit your system +pri = {'dev':'alfa0', + 'mac':'00:c0:ca:59:af:a6', + 'ifindex':5, + 'phy':2, + 'mode':'managed', + 'tx':20, + 'freqs':sorted(ISM_24_F2C.keys()), + 'stds':['b','g','n'], + 'ip':'192.168.3.23', + 'bcast':'192.168.3.63', + 'mask':'255.255.255.192'} +newhw = '00:c0:ca:60:b0:a7' +newip = '192.168.3.30' +newbcast = '192.168.3.255' +newmask = '255.255.255.0' nics = ['alfa0','rose0','eth0','lo','wlan0'] enics = ['eth0','lo'] wnics = ['alfa0','rose0','wlan0'] inics = ['foo0','bar0'] regdom = '00' -regdomnew = 'BO' +newregdom = 'BO' # test functions interfaces and isinterface class InterfaceTestCase(unittest.TestCase): - def testEnum(self): + def test_enuminterfaces(self): self.assertEqual(nics,pyw.interfaces()) - def testIs(self): - for n in nics: - self.assertTrue(pyw.isinterface(n)) - def testNotIs(self): - for i in inics: - self.assertFalse(pyw.isinterface(i)) - def testIn(self): - for n in nics: - self.assertIn(n,pyw.interfaces()) + def test_isinterface(self): + for nic in nics: + self.assertTrue(pyw.isinterface(nic)) + def test_not_isinterface(self): + for inic in inics: + self.assertFalse(pyw.isinterface(inic)) + def test_ininterfaces(self): + for nic in nics: + self.assertIn(nic,pyw.interfaces()) # test functions winterfaces and iswireless class WInterfaceTestCase(unittest.TestCase): - def testEnum(self): + def test_enumwinterfaces(self): self.assertEqual(wnics,pyw.winterfaces()) - def testIs(self): - for w in wnics: - self.assertTrue(pyw.iswireless(w)) - def testNotIs(self): - for i in inics + enics: - self.assertFalse(pyw.iswireless(i)) - def testIn(self): - for w in wnics: - self.assertIn(w,pyw.winterfaces()) + def test_iswinterface(self): + for wnic in wnics: + self.assertTrue(pyw.iswireless(wnic)) + def test_not_iswinterface(self): + for nic in inics + enics: + self.assertFalse(pyw.iswireless(nic)) + def test_inwinterfaces(self): + for wnic in wnics: + self.assertIn(wnic,pyw.winterfaces()) # test regget, regset class RegDomTestCase(unittest.TestCase): - def testIs(self): + def test_regget(self): self.assertEqual(regdom,pyw.regget()) - def testNotIs(self): - self.assertFalse('US'==pyw.regget()) - def testSet(self): - self.assertTrue(pyw.regset(regdomnew)) + def test_regset(self): + self.assertTrue(pyw.regset(newregdom)) time.sleep(0.25) # give sleep time - self.assertEqual(regdomnew,pyw.regget()) + self.assertEqual(newregdom,pyw.regget()) self.assertTrue(pyw.regset(regdom)) time.sleep(0.25) # give sleep time self.assertEqual(regdom, pyw.regget()) +# test getcard,validcard +class GetCardTestCase(unittest.TestCase): + def test_getcard(self): + for wnic in wnics: + self.assertIsNotNone(pyw.getcard(wnic)) + def test_notacard(self): + for enic in enics: + self.assertRaises(error,pyw.getcard,enic) + def test_validcard(self): + for wnic in wnics: + self.assertTrue(pyw.validcard(pyw.getcard(wnic))) + +# super class for test cases requiring a Card object +class CardTestCase(unittest.TestCase): + def setUp(self): self.card = pyw.getcard(pri['dev']) + def tearDown(self): pass + +# test macget +class MacGetTestCase(CardTestCase): + def test_macget(self): + self.assertEquals(pri['mac'],pyw.macget(self.card)) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.macget,'bad0') + +# test macset +class MacSetTestCase(CardTestCase): + def setUp(self): + CardTestCase.setUp(self) + pyw.down(self.card) + def tearDown(self): + pyw.up(self.card) + def test_macset(self): + self.assertEqual(newhw,pyw.macset(self.card,newhw)) + self.assertEqual(pri['mac'],pyw.macset(self.card,pri['mac'])) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.macset,'bad0',newhw) + def test_invalidmacarg(self): + self.assertRaises(error,pyw.macset,self.card,'00:0A') + +# test inetget/inetset +# testing both together as the test card alfa0 is never associated thus +# never has an ip etc +# NOTE: through inetset, we get the side-effect of testing ip4set, netmaskset, +# broadcastset +class InetGetSetTestCase(CardTestCase): + def test_inetgetset(self): + self.assertTrue(pyw.inetset(self.card,pri['ip'],pri['mask'],pri['bcast']), + "InetGetSetTestCase.inetgetset->inetset Failed") + self.assertEqual(pri['ip'],pyw.inetget(self.card)[0], + "InetGetSetTestCase.inetgetset->inetget Failed") + def test_invalidcardarg(self): + self.assertRaises(error,pyw.inetget,'bad0') + self.assertRaises(error,pyw.inetset,'bad0',pri['ip'], + pri['mask'],pri['bcast']) + def test_invalidiparg(self): + self.assertRaises(error,pyw.inetset,self.card,'192.168',pri['mask'],pri['bcast']) + def test_invalidmaskarg(self): + self.assertRaises(error,pyw.inetset,self.card,pri['ip'],'255.255',pri['bcast']) + def test_invalidbcastarg(self): + self.assertRaises(error,pyw.inetset,self.card,pri['ip'],pri['mask'],'192.168') + +# test up +class UpTestCase(CardTestCase): + def test_up(self): self.assertTrue(pyw.up(self.card)) + def test_invalidcardarg(self): self.assertRaises(error,pyw.up,'bad0') + +# test down +class DownTestCase(CardTestCase): + def test_down(self): self.assertTrue(pyw.down(self.card)) + def test_invalidcardarg(self): self.assertRaises(error,pyw.down,'bad0') + +# test get freqs +class DevFreqsTestCase(CardTestCase): + def test_devfreqs(self): + self.assertItemsEqual(pri['freqs'],pyw.devfreqs(self.card)) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.devfreqs,'bad0') + +# test get chs +class DevCHsTestCase(CardTestCase): + def test_devchs(self): + self.assertItemsEqual(map(rf2ch,pri['freqs']),pyw.devchs(self.card)) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.devchs,'bad0') + +# test get stds +class DevSTDsTestCase(CardTestCase): + def test_devchs(self): + self.assertItemsEqual(pri['stds'],pyw.devstds(self.card)) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.devstds,'bad0') + +# test get modes +class DevModesTestCase(CardTestCase): + def test_devmodes(self): + self.assertIn('managed',pyw.devmodes(self.card)) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.devmodes,'bad0') + +# test get cmds +class DevCMDsTestCase(CardTestCase): + def test_devcmds(self): + self.assertIsInstance(pyw.devmodes(self.card),list) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.devmodes,'bad0') + +# test devinfo +class DevInfoTestCase(CardTestCase): + def test_devinfobycard(self): + self.assertIsInstance(pyw.devinfo(self.card),dict) + def test_devinfobydev(self): + self.assertIsInstance(pyw.devinfo(pri['dev']),dict) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.devinfo,'bad0') + +# test phyinfo +class PhyInfoTestCase(CardTestCase): + def test_phyinfo(self): + self.assertIsInstance(pyw.phyinfo(self.card),dict) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.phyinfo,'bad0') + +# test txget +class TXGetTestCase(CardTestCase): + def test_txget(self): + self.assertEquals(pri['tx'],pyw.txget(self.card)) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.txget,'bad0') + +# test chget/chset +# since we are using a non-associated card, we will get None for chget +# testing chset simulatenously allows us to test chset then chget +# NOTE: we don't test for specific ch in chget, just in the infitesimal chance +# that somehow the ch was reset etc +class CHGetSetTestCase(CardTestCase): + def test_chsetget(self): + pyw.down(self.card) + pyw.modeset(self.card,'monitor') + pyw.up(self.card) + self.assertTrue(pyw.chset(self.card,1)) + self.assertIsInstance(pyw.chget(self.card),int) + pyw.down(self.card) + pyw.modeset(self.card,'managed') + pyw.up(self.card) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.chset,pri['dev'],1) + self.assertRaises(error,pyw.chget,'bad0') + def test_invalidcharg(self): + self.assertRaises(error,pyw.chset,self.card,0,None) + def test_invalidchwarg(self): + self.assertRaises(error,pyw.chget,self.card,1,'HT30+') + +# test freqset +# because freqset was already tested in chgetset, we only test invalid args +class FreqSetTestCase(CardTestCase): + def test_invalidrfarg(self): + # we test both an invalid RF and an RF the card does not support + self.assertRaises(error,pyw.freqset,self.card,2410) + self.assertRaises(error,pyw.freqset,self.card,5250) + +# test modeget +class ModeGetTestCase(CardTestCase): + def test_modeget(self): + self.assertEquals('managed',pyw.modeget(self.card)) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.modeget,'bad0') + +# test modeset +class ModeSetTestCase(CardTestCase): + def test_modeset(self): + pyw.down(self.card) + self.assertTrue(pyw.modeset(self.card,'monitor')) + self.assertTrue(pyw.modeset(self.card,'managed')) + pyw.up(self.card) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.modeset,'bad0','monitor') + def test_invalidmodearg(self): + self.assertRaises(error,pyw.modeset,self.card,'foobar') + def test_invalidmonitorflagarg(self): + self.assertRaises(error,pyw.modeset,self.card,'monitor','bad') + self.assertRaises(error,pyw.modeset,self.card,'managed','fcsfail') + +# test ifaces +class IfacesTestCase(CardTestCase): + def test_ifaces(self): + self.assertIsInstance(pyw.ifaces(self.card),list) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.ifaces,'b0b0') + +# test devadd/devdel +class DevAddDelTestCase(CardTestCase): + def test_devadddel(self): + card = pyw.devadd(self.card,'test0','monitor') + self.assertTrue(pyw.devdel(card)) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.devadd,'bad0','test0','monitor') + self.assertRaises(error,pyw.devdel,'bad0') + card = pyw.devadd(self.card,'test0','monitor') + pyw.devdel(card) + self.assertRaises(error,pyw.devdel,card) + def test_invalidmodearg(self): + self.assertRaises(error,pyw.devadd,self.card,'test0','foobar') + def test_invalidflagsarg(self): + self.assertRaises(error,pyw.devadd,self.card,'test0','monitor','foobar') + self.assertRaises(error,pyw.devadd,self.card,'test0','managed','fcsfail') + if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() + + + + + + + + + + + + + + + + + + + + + + + + From 09f8b44b231a1302c7b5c9af2fb3c955114759a6 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Tue, 31 May 2016 19:04:16 -0600 Subject: [PATCH 005/121] 0.0.8 --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index a82b951..72b3f8d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # PyRIC: Python Radio Interface Controller -## Pythonic iw - -[![License: GPLv3](https://img.shields.io/pypi/l/PyRIC.svg)](https://github.com/wraith-wireless/PyRIC/blob/master/LICENSE) +## Pythonic iw [![License: GPLv3](https://img.shields.io/pypi/l/PyRIC.svg)](https://github.com/wraith-wireless/PyRIC/blob/master/LICENSE) [![Current version at PyPI](https://img.shields.io/pypi/v/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) [![Downloads per month on PyPI](https://img.shields.io/pypi/dm/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) ![Supported Python Versions](https://img.shields.io/pypi/pyversions/PyRIC.svg) From ea3b7a20d197d3d93b47603984c79472967aa9b1 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Tue, 31 May 2016 19:05:24 -0600 Subject: [PATCH 006/121] 0.0.8 --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 72b3f8d..a82b951 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # PyRIC: Python Radio Interface Controller -## Pythonic iw [![License: GPLv3](https://img.shields.io/pypi/l/PyRIC.svg)](https://github.com/wraith-wireless/PyRIC/blob/master/LICENSE) +## Pythonic iw + +[![License: GPLv3](https://img.shields.io/pypi/l/PyRIC.svg)](https://github.com/wraith-wireless/PyRIC/blob/master/LICENSE) [![Current version at PyPI](https://img.shields.io/pypi/v/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) [![Downloads per month on PyPI](https://img.shields.io/pypi/dm/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) ![Supported Python Versions](https://img.shields.io/pypi/pyversions/PyRIC.svg) From 536a840608cb5bcfe5622c50858acda58a8cd8e8 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Wed, 1 Jun 2016 03:11:20 -0600 Subject: [PATCH 007/121] 0.0.8 --- TODO | 3 ++- pyric/lib/libnl.py | 1 - pyric/net/wireless/nl80211_c.py | 1 + setup.py | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/TODO b/TODO index 21fed68..531fe12 100644 --- a/TODO +++ b/TODO @@ -8,7 +8,8 @@ o find a better way to find the supported standards of a card o for now, using ioctl to set ip addresses - move to netlink (using ip ?) or is better to keep as ioctl since this - allows us to set erroneous values for netmask, broadcast + allows us to set erroneous values for netmask, broadcast whereas ip forces + validity o Can we find the current channel of a radio in monitor mode that is actively scanning? o parse NL80211_ATTR_WIPHY_BANDS (have workaround currently in place) \ No newline at end of file diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 8166465..02e0184 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -436,7 +436,6 @@ def nlmsg_fromstream(stream): if t == nlh.NLMSG_ERROR or l == nlh.NLMSGACKLEN: # have an (possible) ack/nack i.e. error msg e = struct.unpack_from(nlh.nl_nlmsgerr,stream,nlh.NLMSGHDRLEN)[0] - # here is a big problem report NLE_* or errno? raise pyric.error(abs(e),strerror(abs(e))) c,_,_ = struct.unpack_from(genlh.genl_genlmsghdr,stream,nlh.NLMSGHDRLEN) except struct.error as e: diff --git a/pyric/net/wireless/nl80211_c.py b/pyric/net/wireless/nl80211_c.py index 8b4edfc..6dba580 100644 --- a/pyric/net/wireless/nl80211_c.py +++ b/pyric/net/wireless/nl80211_c.py @@ -183,6 +183,7 @@ nl80211h.NL80211_ATTR_SUPPORTED_COMMANDS:nlh.NLA_NESTED, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS:nlh.NLA_U8, nl80211h.NL80211_ATTR_GENERATION: nlh.NLA_U8, + #nl80211h.NL80211_ATTR_MAC:nlh.NLA_STRING, #Not defined in nl80211_h #nl80211h.NL80211_ATTR_OPMODE_NOTIF:nlh.NLA_U8, #nl80211h.NL80211_ATTR_VENDOR_ID:nlh.NLA_U32, diff --git a/setup.py b/setup.py index 58cdf97..223f887 100644 --- a/setup.py +++ b/setup.py @@ -69,7 +69,8 @@ 'Topic :: System :: Networking', 'Topic :: Utilities', 'Operating System :: POSIX :: Linux', - 'Programming Language :: Python' + 'Programming Language :: Python', + 'Programming Language :: Python :: 2.7' ], keywords='nl80211 iw developement wireless pentest', packages=find_packages(), From 026929d308300a0e0fd12704c84eff327df50a96 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Wed, 1 Jun 2016 17:19:48 -0600 Subject: [PATCH 008/121] 0.0.8 --- README.md | 3 + pyric/__init__.py | 2 + pyric/net/wireless/nl80211_h.py | 1 - pyric/rfkill.py | 129 ++++++++++++++++++++++++++++++++ 4 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 pyric/rfkill.py diff --git a/README.md b/README.md index a82b951..3ad4474 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,8 @@ the following: * get/set regulatory domain * get/set mode * add/delete interfaces +* enumerate ISM and UNII channels +* block/unblock rfkill devices (still working on it) It also provides limited help functionality concerning nl80211 commands/attributes (for those who wish to add additional commands). However, it pulls directly from @@ -372,6 +374,7 @@ Extending PyRIC is fun and easy too, see the user guide PyRIC.pdf. + radio.py consolidate pyw in a class + channels.py 802.11 ISM/UNII freqs. & channels + device.py device/chipset utility functions + + rfkill.py rfkill port + net linux header ports * \_\_init\_\_.py initialize net subpackage * if_h.py inet/ifreq definition diff --git a/pyric/__init__.py b/pyric/__init__.py index cd56b38..669d409 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -113,6 +113,8 @@ - fixed _validmac_ to validate both uppercase & lowercase hex characters - added devfreqs, devchs o unittest completed 61 tests ran in 5.360s + o added rfkill (still working on it) + """ __name__ = 'pyric' diff --git a/pyric/net/wireless/nl80211_h.py b/pyric/net/wireless/nl80211_h.py index 449da5f..141d5ee 100644 --- a/pyric/net/wireless/nl80211_h.py +++ b/pyric/net/wireless/nl80211_h.py @@ -1,5 +1,4 @@ #!/usr/bin/env python - """ nl80211_h.py: 802.11 netlink interface public header /* diff --git a/pyric/rfkill.py b/pyric/rfkill.py new file mode 100644 index 0000000..1fd9ad5 --- /dev/null +++ b/pyric/rfkill.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python +""" rfkill.py: rfkill port + +/usr/include/linux +/* + * Copyright (C) 2006 - 2007 Ivo van Doorn + * Copyright (C) 2007 Dmitry Torokhov + * Copyright 2009 Johannes Berg + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +Redistribution and use in source and binary forms, with or without modifications, +are permitted provided that the following conditions are met: + o Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + o Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + o Neither the name of the orginal author Dale V. Patterson nor the names of any + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +Implements userspace program rfkill in Python + +""" + +__name__ = 'rfkill' +__license__ = 'GPLv3' +__version__ = '0.0.1' +__date__ = 'June 2016' +__author__ = 'Dale Patterson' +__maintainer__ = 'Dale Patterson' +__email__ = 'wraith.wireless@yandex.com' +__status__ = 'Development' + +import os +import struct +import fcntl + +RFKILL_STATE_SOFT_BLOCKED = 0 +RFKILL_STATE_UNBLOCKED = 1 +RFKILL_STATE_HARD_BLOCKED = 2 + +""" +/** + * enum rfkill_type - type of rfkill switch. + * + * @RFKILL_TYPE_ALL: toggles all switches (requests only - not a switch type) + * @RFKILL_TYPE_WLAN: switch is on a 802.11 wireless network device. + * @RFKILL_TYPE_BLUETOOTH: switch is on a bluetooth device. + * @RFKILL_TYPE_UWB: switch is on a ultra wideband device. + * @RFKILL_TYPE_WIMAX: switch is on a WiMAX device. + * @RFKILL_TYPE_WWAN: switch is on a wireless WAN device. + * @RFKILL_TYPE_GPS: switch is on a GPS device. + * @RFKILL_TYPE_FM: switch is on a FM radio device. + * @RFKILL_TYPE_NFC: switch is on an NFC device. + * @NUM_RFKILL_TYPES: number of defined rfkill types + */ +""" +RFKILL_TYPE_ALL = 0 +RFKILL_TYPE_WLAN = 1 +RFKILL_TYPE_BLUETOOTH = 2 +RFKILL_TYPE_UWB = 3 +RFKILL_TYPE_WIMAX = 4 +RFKILL_TYPE_WWAN = 5 +RFKILL_TYPE_GPS = 6 +RFKILL_TYPE_FM = 7 +RFKILL_TYPE_NFC = 8 +NUM_RFKILL_TYPES = 9 + +""" +/** + * enum rfkill_operation - operation types + * @RFKILL_OP_ADD: a device was added + * @RFKILL_OP_DEL: a device was removed + * @RFKILL_OP_CHANGE: a device's state changed -- userspace changes one device + * @RFKILL_OP_CHANGE_ALL: userspace changes all devices (of a type, or all) + */ + """ +RFKILL_OP_ADD = 0 +RFKILL_OP_DEL = 1 +RFKILL_OP_CHANGE = 2 +RFKILL_OP_CHANGE_ALL = 3 + +""" +/** + * struct rfkill_event - events for userspace on /dev/rfkill + * @idx: index of dev rfkill + * @type: type of the rfkill struct + * @op: operation code + * @hard: hard state (0/1) + * @soft: soft state (0/1) + * + * Structure used for userspace communication on /dev/rfkill, + * used for events from the kernel and control to the kernel. + */ +""" +rfk_rfkill_event = "IBBBB" +RFKILLEVENTLEN = struct.calcsize(rfk_rfkill_event) +def rfkill_event(idx,rtype,op,hard=0,soft=0): + """ + create a rkfill event structure + :param idx: index of dev rfkill i.e. 0,1 + :param rtype: type of rfkill + :param op: op code + :param hard: hard state one of {0=unbloacked|1=blocked} + :param soft: soft state one of {0=unblocked|1=blocked} + :returns: a rfkill event structure + """ + return struct.pack(rfk_rfkill_event,idx,rtype,op,hard,soft) + From 5bbbbd51c16e77476f901f90811958421ff097ad Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Wed, 1 Jun 2016 17:33:23 -0600 Subject: [PATCH 009/121] 0.0.8 --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3ad4474..9c6e164 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # PyRIC: Python Radio Interface Controller -## Pythonic iw +## Pythonic iw (and more) for the Wireless Pentester [![License: GPLv3](https://img.shields.io/pypi/l/PyRIC.svg)](https://github.com/wraith-wireless/PyRIC/blob/master/LICENSE) [![Current version at PyPI](https://img.shields.io/pypi/v/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) @@ -10,7 +10,7 @@ ## 1 DESCRIPTION: BLUF: Why use subprocess.Popen, regular expressions and str.find to interact with your Wireless Network Interface Card. PyRIC provides the ability to -manipuate, identify and enumerate your system's wireless cards. It is a pure +manipulate, identify and enumerate your system's wireless cards. It is a pure python port of a subset of the functionality provided by iw, ifconfig and iwconfig. PyRIC is: * Pythonic: No ctypes, SWIG etc. PyRIC redefines C header files as Python and @@ -22,6 +22,13 @@ uses netlink (or ioctl) sockets to communicate directly with the kernel. about iw updates and rewriting your parsers. * Easy: If you can use iw, you can use PyRIC +Python is primarliy and originally a port of a subset of iw but has evolved in +an attempt to meet the needs of wireless pentesting as it relates to wireless +network cards. In addition to providing iw related functions, PyRIC implements: +* ifconfig functionality such as mac address, ip address, netmask and broadcast +setting and getting +* rfkill list, block and unblock + ### a. Background PyRIC arose out of a need in Wraith (https://github.com/wraith-wireless/wraith) for Python nl80211/netlink and ioctl functionality. Originally, Wraith used From 4fef466c849fb5b2c6d32151a7218fb7cad83017 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Wed, 1 Jun 2016 18:58:42 -0600 Subject: [PATCH 010/121] 0.0.8 --- pyric/pyw.py | 1 - pyric/rfkill.py | 99 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 98 insertions(+), 2 deletions(-) diff --git a/pyric/pyw.py b/pyric/pyw.py index 2ac9cf1..8dbc7e1 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -119,7 +119,6 @@ def _nlstub_(fct,*argv): import pyric.net.netlink_h as nlh # netlink definition import pyric.net.genetlink_h as genlh # genetlink definition import pyric.net.wireless.nl80211_h as nl80211h # 802.11 definition -#from pyric.net.wireless.nl80211_c import nl80211_parse_freqs # WIPHY_BANDS import pyric.net.sockios_h as sioch # sockios constants import pyric.net.if_h as ifh # ifreq structure import pyric.lib.libnl as nl # netlink functions diff --git a/pyric/rfkill.py b/pyric/rfkill.py index 1fd9ad5..148faba 100644 --- a/pyric/rfkill.py +++ b/pyric/rfkill.py @@ -38,10 +38,21 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. -Implements userspace program rfkill in Python +Implements userspace program rfkill in Python to query the state of rfkill switches """ +""" + rfkill writes and reads rfkill_event structures to /dev/rfkill using fcntl + Results and useful information can be found in /sys/class/rfkill which contains + one or more rfkill directories where n is the index of each 'wireless' + device. In each rfkill are several files some of which are: + o type: type of device i.e. wlan, bluetooth etc + o name: in the case of 802.11 cards this is the physical name +""" +dpath = '/dev/rfkill' +spath = '/sys/class/rfkill' + __name__ = 'rfkill' __license__ = 'GPLv3' __version__ = '0.0.1' @@ -54,6 +65,8 @@ import os import struct import fcntl +import pyric +import errno RFKILL_STATE_SOFT_BLOCKED = 0 RFKILL_STATE_UNBLOCKED = 1 @@ -75,6 +88,7 @@ * @NUM_RFKILL_TYPES: number of defined rfkill types */ """ +RFKILL_TYPES = ['all','wlan','bluetooth','uwb','wimax','wwan','gps','fm','nfc'] RFKILL_TYPE_ALL = 0 RFKILL_TYPE_WLAN = 1 RFKILL_TYPE_BLUETOOTH = 2 @@ -127,3 +141,86 @@ def rfkill_event(idx,rtype,op,hard=0,soft=0): """ return struct.pack(rfk_rfkill_event,idx,rtype,op,hard,soft) +def rfkill_list(): + """ + list rfkill event structures (rfkill list) + :returns: a dict of dicts name -> {idx,type,soft,hard} + """ + rfks = {} + fin = open(dpath,'r') + flags = fcntl.fcntl(fin.fileno(),fcntl.F_GETFL) + fcntl.fcntl(fin.fileno(),fcntl.F_SETFL,flags|os.O_NONBLOCK) + while True: + try: + idx,t,op,s,h = struct.unpack(rfk_rfkill_event,fin.read(RFKILLEVENTLEN)) + if op == RFKILL_OP_ADD: + rfks[getname(idx)] = {'idx':idx, + 'type':RFKILL_TYPES[t], + 'soft':s, + 'hard':h} + except IOError: + break + fin.close() + return rfks + +def rfkill_block(idx): + """ + blocks the device at index + :param idx: rkill index + """ + fout = None + try: + rfke = rfkill_event(idx,RFKILL_TYPE_ALL,RFKILL_OP_CHANGE,1,0) + fout = open(dpath, 'w') + fout.write(rfke) + except struct.error as e: + raise pyric.error(pyric.EUNDEF,"Error packing rfkill event {0}".format(e)) + except IOError as e: + raise pyric.error(e.errno,e.message) + finally: + if fout: fout.close() + +def rfkill_unblock(idx): + """ + unblocks the device at index + :param idx: rkill index + """ + pass + +def rfkill_unblockby(rtype): + """ + blocks the device of type + :param rtype: rfkill type one of {'all'|'wlan'|'bluetooth'|'uwb'|'wimax' + |'wwan'|'gps'|'fm'|'nfc'} + """ + pass + +def getname(idx): + """ + returns the phyical name of the device + :param idx: rfkill index + :returns: the name of the device + """ + fin = None + try: + fin = open(os.path.join(spath,"rfkill{0}".format(idx),'name'),'r') + return fin.read().strip() + except IOError: + raise pyric.error(errno.EINVAL,"No such device") + finally: + if fin: fin.close() + +def gettype(idx): + """ + returns the type of the device + :param idx: rfkill index + :returns: the type of the device + """ + fin = None + try: + fin = open(os.path.join(spath,"rfkill{0}".format(idx),'type'),'r') + return fin.read().strip() + except IOError: + raise pyric.error(errno.EINVAL,"No such device") + finally: + if fin: fin.close() \ No newline at end of file From 33a1d365eb0197c6de18d32072ac60a0e5713ed3 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Thu, 2 Jun 2016 16:10:37 -0600 Subject: [PATCH 011/121] 0.1.0 Initial Production Release --- .gitignore | 22 ++ LICENSE | 2 +- MANIFEST.in | 13 +- PyRIC.pdf | Bin 267318 -> 383056 bytes README.md | 38 ++-- RFI | 1 + TODO | 1 + __init__.py | 4 +- examples/device_details.py | 5 +- examples/pentest.py | 1 + {pyric/docs/res => guide}/PyRIC.bib | 3 +- {pyric/docs/res => guide}/PyRIC.tex | 320 +++++++++++++++++----------- guide/nlsend.png | Bin 0 -> 90242 bytes guide/nlsock.png | Bin 0 -> 123683 bytes pyric/__init__.py | 6 +- pyric/channels.py | 4 +- pyric/device.py | 3 +- pyric/docs/__init__.py | 2 +- pyric/docs/attributes.help | 4 +- pyric/docs/commands.help | 4 +- pyric/docs/nlhelp.py | 2 +- pyric/lib/__init__.py | 2 +- pyric/lib/libio.py | 8 +- pyric/lib/libnl.py | 2 +- pyric/net/__init__.py | 2 +- pyric/net/genetlink_h.py | 1 - pyric/net/if_h.py | 1 - pyric/net/netlink_h.py | 2 +- pyric/net/policy.py | 2 +- pyric/net/sockios_h.py | 2 +- pyric/net/wireless/__init__.py | 2 +- pyric/net/wireless/nl80211_c.py | 2 +- pyric/net/wireless/nl80211_h.py | 2 +- pyric/pyw.py | 20 +- pyric/rfkill.py | 100 ++++++++- setup.cfg | 1 + setup.py | 35 +-- tests/pyw.unittest.py | 1 + 38 files changed, 404 insertions(+), 216 deletions(-) rename {pyric/docs/res => guide}/PyRIC.bib (99%) rename {pyric/docs/res => guide}/PyRIC.tex (86%) create mode 100644 guide/nlsend.png create mode 100644 guide/nlsock.png diff --git a/.gitignore b/.gitignore index dd2f702..677c41a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,25 @@ +# modified from https://github.com/github/gitignore/blob/master/Python.gitignore +#Copyright (c) 2016 GitHub, Inc. +# +#Permission is hereby granted, free of charge, to any person obtaining a +#copy of this software and associated documentation files (the "Software"), +#to deal in the Software without restriction, including without limitation +#the rights to use, copy, modify, merge, publish, distribute, sublicense, +#and/or sell copies of the Software, and to permit persons to whom the +#Software is furnished to do so, subject to the following conditions: +# +#The above copyright notice and this permission notice shall be included in +#all copies or substantial portions of the Software. +# +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +#FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# +#DEALINGS IN THE SOFTWARE. + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/LICENSE b/LICENSE index aff0830..80fa603 100644 --- a/LICENSE +++ b/LICENSE @@ -37,4 +37,4 @@ software in furtherance of or with intent to commit any fraudulent or other ille activities, or otherwise in violation of any applicable law, regulation or legal agreement. -See for a copy of the GNU General Public License. \ No newline at end of file +See for a copy of the GNU General Public License. diff --git a/MANIFEST.in b/MANIFEST.in index 1ab476e..68fde43 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,7 +1,10 @@ -# Include license, README, channels, device, pyw and user guide -include LICENSE README.md __init__.py channels.py device.py pyw.py PyRIC.pdf TODO RFI +# Include license, README, channels, device, rfkill, pyw and user guide +include LICENSE README.md __init__.py channels.py device.py rfkill.py pyw.py PyRIC.pdf TODO RFI # Include subdirectories -# NOTE: we do not include test folder in installation -recursive-include lib net examples docs -recursive-include docs *.help \ No newline at end of file +# device_details.py was not being included without the below recursive include +recursive-include lib net examples docs tests guide +recursive-include examples *.py +recursive-include docs *.help +recursive-include tests *.py +recursive-include guide *.tex *.bib *.png \ No newline at end of file diff --git a/PyRIC.pdf b/PyRIC.pdf index 1fe4aa4af830cc7f0426af40ff014f8238233f5c..017a61b8c7b9c6aaab27a5d6b9088f923f8774b2 100644 GIT binary patch delta 249256 zcmV)TK(W8Js1VSw7my?ZG&h&gumdT7Sxr;pMi9O8D|8%Ht%m9OlC-B7vm|UPKqcPf zu*pH#+C@RgE=dOb@6)Z3Z0t2)r&wyiTs-!Sx_k7d`*rtNcwar?{k$jc84m_~`$rIZ z5ON7ddxI~Y6qd(AdDa@PW$X<`-e-0;`~A4@2MQFs796;E?*|$p_NhusH~m|GQuxxc zX_EW@3_haL$OGW9F_M%Ti8`$pD1mlborg)DqAUvi$!QGPnU5byU8iL=E=Y|RNXsP& zg5t3bo#0KGWc3BV$;vcOtLmp&BUX&kTRt3LHF6p^sT7K9F0FK8AE!lYPrh^ZqyX!7 zi|+}VD{Y(I2DrdOg=V$oN-8IR-^V>EV0DUvV0GmrmGD5|%f&#FqA{sr>qNj0Vkubf zob0jjw8k-l7R_d#77f`L<(lVZi=DlzGte4OB90mmjA=D<)D5_Qc9L9W#aC2}7HEqy zV%G#n+I+3EaZ&k!Rf-|VMu?po5Yf52d!GX^B4lcLRyb&N++izQZ2L)nIYRVekdNDf zT?P2bP**ML2Wc@R55Blc%1eY_$1lZs;RiulFU_u!Q~*e-AuLmsbX0X*RCSW)j#1`R zh3qBch?$17I*x1ESUJH@)r!m-dNYsHTjvdG&Tq#B`2yyIWLURE2kZtDfTO(nB6U-L zwdtT^!ZLN=5+7KBy4Yxc-E$|${fcs#mTW?NIlJK#vNyxGip=*vE6eQiEJ7RWZ^3Bb z02Q&*A`R;7s(tC}_BGCE@0d2TiqaF|<<|cg`vI;DY5B6r3YfQo2s8JKiSU^(;mbs6?VGry04xSVN)HC%f*583A=DNY6^Ik zKv;k-=aDd(*88V_(|Xbr?~59{F2}i>_*)o}wLDwr_zQ?(!ax9{#Flzp zZPBx}1Iw5%E)BtO0a(YIh}-V}E?9c@!(i_}@X)UTQ}BU}K2NJ#N-MN?m3N))uK%@!(<0~J zx@1C)hx>O8=7m#WY(L>2-9r*Z>hDVNr6&F~h%t=O zx_37Z_y6qH5V^|#OO=0B^&(KnrsTyqW+Q9VfRW+9%kEYZeQx2xpmF{G=qe`c_jniGPTViBRztOxRUz*DF z$Uh3FVa7JE&2C@iy}kkhG?8!zpJP^_054D35;$Py9$DMDa&!wj`NShKntjXbx+93O z{klU%&kM;(_%MI*og!~b8YBuKrmvj$8xa^e`%dod_Dj^8 zIvg;i`)?gW&yAyUobpO zaVfRJ%=Ld%Vpjs9halJkDh5zea72jhI<%b%oOkcv+%aGGg^N4FL3|)Wz-Y1(#vBra zzR`K9TOK37viw}WET+)N#xMZ43cKTYD$v%_wQ>$EM2B%0vTGoPAcP@SanBwsKq)zO z5Fgdnx;lf?g&1*ScmE}Jf2XU}qT7SAabW-+Fl2u&`5^HDiL zo1I8J*$;F96O~s?AEF3?vJ(q5+g+u5UCGuCg_8JdIB;{w+44;J6skn#i}KP81TRtk zcAiDx+KURqp)pXV3jgFq9%Kg~+(&ZBAh3jA{sg`x=&IMSRT z*(-nMIoJhlvtMtRh|qzHS_w6QkA&ePL5QDPDTv+3%cda`z9=;@DDt*rRJfF%shb7i z$W#fK>JA@lAyi+gVmN>rN|Nt|A+UoJpMt%y9EhaOpcRmV+bm<%Hd`K<1D28uVofvSQ@~Wt&Q>U_+fa>$ z(XS?}#B1~tPu%3)@nWn-FbvOP_04J`tcCNMsa%RMBB{s)(r_7nJuEgRY@|{ z<27|1Xyg=%^w(I*(**If?XR#B#zV~qvgvqX&eI*C1_Ns-4H1aa_RMZpOvdDs9gu$n zogT3hN=+rFALMlO9uk(eXTT2VxrbiR@Kwo3g5)GYA}!fif(xbgLHE!}Jbeg$#)=$} zdL?a_l^As4)ns<7o*5)&r8{6>nZQc7!V9*8&R+ zDekFC!GtOcd@WD_3;Qc3=KSdlVlID=hvs0F7y6Q_cwp%JlFL56fuK%SM@~|h*PtkA ziIY>g;(52<4FMV&zljaZ}(QXp5I0ZKXzjB8GcWIb!J4W!C@w_ za~R1DPL`w$;bnhsGmyo=O{u^om~Tq427sdc@?Mk}Dg4?M0-nwlo^ zr`EEI^uz%^qI2Vc%jt9gV%t~Z#fo(~?(nYt?2aTQNZ zFJHu`tseg6f;4{b$pL?0WeSA@V+&>qXAfP~@V7EuFYA}p31pR z$$#zr$(ozTSN{bZ?toO6ks|^Wm+}w;69P9fl`#P+f6Z7+bK5o$zWZ13R%ynD3BK8x z9$HV+Ne`K}@h!=LCLs$o9|{Os(ZBCL09th9IMYnrUPN#K?0dgmDhzIeF!=2(eDwU~ z`t0&m90f8IWmwAKdJ`0dh_fWf!%~C^P@3S~>U}8l^@r=<=X;m0WOjUsm#{_0Rlkmk z)zm3de_6G@h~sFbiDZ@8RJ9tJR`m@p_S&dcjYO7oG@p;2Ka#st_QDCih@>dXf2HiL zvX`T>EZeBtsjci_4y;)-bd~O3R);N`zvp$;fQwMA@r50scPKYG=eJ(jt{U$aVUw#H zGgM7ojn>hd2KD^jYU)ODg6Pe`If><)s?oy_e=dn?JhIih*`PVu8l&$q7nS+$9<`I{ zolteJYsH!j{pIjJjN_LGC`%kMmeUSG3Qie}Rn8To1+P@58UK4#>Y?jEng4+%-9VH^ zy`U~s?GTTD=w-5Lq~X7I^#oKP=|3FMgqM1Oa&040|Vw1m^$wW?%~_Ii)O+Z;sZrQ5R%*2my&j znz{&E-QUiALo*Wx-3|(bzXl!)%YyG+O~yFee6DLW%W7TIN`d$b?0?-N85sQ@0~h0=)-v0Ud9*&dadBe`~AW zUD^0Mn+dvsI`%~3a?*995nM3(bg$c~Q4j86S4kHTBtp0!T#h>fZ(!a~V!ClEVr9vf zP#|$2p%~IM!dwSEl1QY|C7~3M3Q|Vt>P^+L$UI$L0pb9c`!xswZ=fhrl=v-c2SXK# zw2YbGH7Og?DA%DfVYZy@Fm&=5fBd*b!VPZLu%MpqXht!Qs%@D972%G}_(1izMTS*> zt1viRtp~p9YGIhH)6DTUYNL!h;>Ga;CLd(E$DhI6or<5gX^n+WqG46LK-JJ*d4*N? z=Jgd;oZy&U`)F>4wx!zI&qd*V2FLcA492Lpq(?<@ce`79;~e5sL+=KSe@<0BF#Pe0 zC@C`<_ZM(<0wv?{X_N%uJCzPmB+6nwbm4K)DfciDMXSE*9F^-YN#L6RYAAFD8QxTO z>nWSXY{{!PYff0$Pj()xt?NhoBLKV|-+;=jWFXKaDu3FGWrY@v!g6-DUF zS>{hc&M{&xImIF>5`X6E2~Ke+@<$Fy*uvOH7~XG2YbxrVG|!|28$E9hfLdv~`dihO z2@dLDrQMMo_4z%&_&z-H>!=hjTohuDF!_uyc!;j>P?AIS=lP;Te{<(T)bRy7)<*B} z&dF}_FxV8L%;ugFxt@Z~`kJosGqkTLX5YdJ3?7-%DWed_ab59aPv6GqH=3Gxlt&<^ zGXV8HlAFaHJMC~9K+cvaKk)fF@=HLXt|+5vh3z2mJWf&Mso z9~TpFGVK9ff1-c9e^Iv8Jr0qe6M#fJ@^TzHWp$_At5F{(O+7I3frZ76KNUQ>pub3M zTxZB)jkrm0Ld)^d{TYT~P3G}MZorR~V3SU@K#vd9($k~lg#P}JoSZdDkc%=8U1`Rm zlu-b`spBP2B}pNqgh~GBn62)7&y$QFGIUvkgk=Q*VZYUWe>k9_gU2K_QpA3+eE-46 za0ElaBRA~OSOCPko*VT^ru^3g3?k$YnkXcVW>jNP27q01={YEDKLhwKSMh%r{N|nK zIsuFf#*cu;!Rcn0j354VSDAzF{+0$I_c`moOWb!PjOE88I1|x*%W2`)>$8t%5|#ji zK^_HVERrawf4j4HAHtvkDx`vlp|kGkOc%%^7qUd~YlF9Ef4V;y%OHi2=NW}E5eei# zk%>Gj79o$*0HFh>5$q~LrWo)d^kp(&y(R_Ef4De8J)+mO+W9m50E5#*lZq7-0yZ&~F##!mtyxKP+eQ|?>sO$B30P$!yZA1X@Lx!F-&> zfsQja!mo(=`fjm=!Bu~%NEJu;Uq9;t7ZJsTA)qjsiW0#iSrui^d%$IQX9)x$JLRq5 z0n+q&{9lB#4dWm&=@ZUzYM#gcWjKS*nNFT?Rz^RM{+Dxqo&&B1A)>EDf070|N-l(c zu&XhKO;A^E*%f>DJlZe8dO-V_bp%$7x`akWC;_zG;iLa}@^u=PR9yNHG9^ zEQN^xktVZ$XMleZ-aYWgya5Ej{tWOh!Fd4wBhEGo&j9}-oO|Fu;;dA72KX=LJdfFz z)%AUoF!yp=!&VRs&|~9pR3GOzrCThmHNO6Cu?$1w|KKXF+V^>LD>Nu+5-w?yX-PvT z?^_%-I0JlsIFenS>tMX4HcKh-Q#ez(J?Of!F7kSZ`M zDwGv}Zlcw3=Ni|4*wi1tLGyisJ3a}u<&kfKE5%Ac8d)h=EMpz}*SmiE2Cq0&tFEXk z;Z&5=c6m#YcPVfusk{7^?8(-31+Z%-249^X2dvzT9?tk+n@3g`8&1q_ztHT97<^(q zkEtYx!?T#G+>zHkxHOwBCbK;Oiw28`)Dd5Q8h(k?#U@|5c243b4HBK6lemPuC5GNG zr90e}gl{ms?3Eqg^9J;O)bI7arsTJFeI$SbySyo?tsL9Q1Go9!Nrc!@h>*9Qib777 z5Z`Ke>3~6$MnQ%k8o%%x2u(Wl+hXl_mj9`&B_|GbM8Mhb^w5$_xCaGqd0MpmwcF)? z9aHu>W$*`H)f*m34cu6{t}Losrmpg`l#3eo*P&?Kqum8a6IN^Y8NCHO>3SzSh7W@n zsG^#B$fiD2h@cp~x~UJ_9WJ!k6sU(*CiHGF7W^8ku6&Jz#NWHT;($v4po3B!S9g@4ub9!wk%U9LIfu%Hm9L3$qh!apM}z1#`8)SXZBTO=M zFq)+&Mc9||$SN0>H=OndIS3sP)AF)FqpTSQVFzp4ZO}qGHS~oattvz5$70AlF=FW3F5hs1N&TpEiS;GlhXsWSoJ4=8+y(y$WBpO z_R}Tg(Yc@uWy{;1o7^-+cG3Z}Ki}#0IlRM+1^8s9DLatUW&WG8t;xkQh;JxpMoFN+ z^hSHB^4#!TE-?L8&F+`UBNQ!Qtb%kv>H(Fb1WX`+^j{e5c!`LdjbapGe#A*jA`_{Y zbaUv&+C?Mf(8qh9<3v|~Nl`Eg8%Sr~I2&Az(qBOdt-aE7Yg*sP$@uKcN~SA zyyP9P+-GQlTZHT@DFJHPDy@T)s_t+%?HFhQct=4Q^WRO2C9o}jbaazi=|wHWuV{;* zO_!P`Qj`X<-bB(Z?dfI>mBm45;{G=5ia_&|^eV(4MUfF=U&|B*fr_YBpjZaPBjpvO zj@%oU436=!{H7?2uE!4$$ePG1Z{-l|E#zY2eq>i$intSp8_E}a0Cc2UYVK3zAVr+4 zkuxKpJ5_l7i{6ocTvG0yRQdbD{6+oHfBPR3mljGYNvpizG^!;TBc&=+1&ywJ&i4hS zS1iS5%Xx#2W0LWkYI}N9X!iZKs~ZYENz_NWaJU(X#ahOSzvaB#mi0|uG6_;8JY`c* zqdhf`32mUw6xA>4Ti$}n>#~3hjE&cfjtMkh(V*g^fC37C+suE}xDAq4?iCVJ5x6{{ z;<%=~gOk<3jq<&fqQqkEa!go3&?x(?+;Z5V9f-Hq$wgcvTXdi$hGXoc3$7iw7+#9p z{5D6snUbvJk6V6{PKaD7Ano@3YhhYNos5y zH#vmzX4qKC*CYKnq5a=;tRJzuRedLl8|CLNn6|s#x?jqRpLFJJrhfp$A5tWC!#MOF zxL|1^fd0YgKw5nYd9ZpKi_yg7S*V+)dbR1VYkAChIJx^uHc;k<(WG)aRzhnzRiE0v zhADG@dSIHGQMtfO5D)1srch|(2;H!c2_=76J8T`feGMsu;3$o4=#RS3Cf^DXu#7fA ztcA*dhqdg$BlK^Itz13QSoZ#0OGldceYt|IK+=N(M111YbNW>*G&Pq{nt@|O(8a|5 zz?9?8RXm&flK_1f5-=`il5ERgxXw?puI<@J9inO{&1NGa z5d*?pAVho57po}T6<&sZHm%geuFS;_6;WY3S+SN{iYl2`$kv3>#* zlbaqC0y#L7QEn-JwOC7Y+cprs`&aN*Y9@jRfY030Op0h*L)d7Q8(0t;YY`1Sz?-kleC@2-L;zW-ct_y!*Lcp9@W4i z18)P1@4bM@EcK3N>)sPGWl0plc;|h(`hAK?5VIf>mzcnRcFCeJvpjyixmvyDvBv|J z1sV5lZatm}7K1(k<2>FU|l|aYk-9l!wP*H;Yh_B`kmqBeBt=P@6@j3{w^e zK9(sT2iYt_L)efd@sox+Y&~D-6f8K%kA4zcNy>PX%z~{{Fd+ol{^9iD`U1G-klKT5 zDE9)m=8)NgYbf&)xaJVrgKH=>ya29e3!TD6!m=oT{Yh}eArnD13%KHxi6nI3`gr|% zv6NEye=bt#tMvt_&7ngNwV@W_<4~JJW)HQeWICwLA+(3u6GD5aJzMBBN`AIEi=%)+ zk24F>qL4`ulj-kDy~XyZyM(YgWcLUgN|%o#Yz~<{!iF-V3kaJ-XpgWb4DAv2Y@yTW z2rlz~IER>fOiW!>5U>bZ$yf#~ib0E=LW^ydzPI@0efK*e zKIlx(A2+MFBJ-e`mLb>!$}G7^jW)|LV$gk%He#{lJO~`SvbqEIacmPO@IALF@RkCY zM*YK}(dLkd6aR=YU`F534Ar!#oFRZ)S^NTj#!2Suts-Kpo37AZW2aw&C}@?Pd{Tw( zPjmdl{x)xEULgBzUfrn;5p+%8+q^(0=Gt;OW=r=81Y7+T7)C<>8FZ{OkUeRb@R&_(eP5C8% zka5xNbg3*))gI7CzA8$%jS~@%TUF60*IMll_qsUtCEebXCFoQm5U``@S}H=&-$v(F z(@cY%u$R-$y3=jBQM6X*Ie=jAMFH6fqQ%JmZH@B2mvz^IEvfKdSXo;O zewDXiy4B!_=`$bT-&h9=&N@TvD>~4BTf1-D)ZN|It$(ixO?q%nmf z0#zh(eAlmTwQ3#$2y%)wQ~j%do4l|=nO7EAO;=qEtMoxwoj^@)QY}tfrMm+=oM>jE z0#+$!Jr-g%RIf4rgc%?Tv^Aj?1(3Z=-T?9u$q*n2M536)fnVkJI3U0fQX3i?Nn?Iu z%^yi8ioHQTeyCN;+_Y z-A^bwx@2s&cdcs2l{!1GV$h#iNiafND^#3Xk#tahU}Brt#0DIHP;9^@_W_smVUt*I zAZdtjnBE&sLMTErsPMN$v5=(+^$C^9h)%rO9}F@CP^oCbAm420BwXTz+g-L8#D&Qi z7Q-+;=*^0O(W)wP?La-Rj)NhMxmd# zZMRnwDX}A;)u{2)kkW_%eQUV0jY^g8 zUGvdjD?8||L#-Rtl|2BD3^mm)PAM~mRdWYn0@0KY6Dm@)i546=4Gp!X@2YE?)vjEx zC?xQH1xr?&venD+LqYXisCj|d)3sUJG&Gg9oqkZoC?iD5zE-|@lbIUM3G^%gurD^H=cG<2|p@a8> zJ)K)7O4EP}jP!52$`nYujS7@RThSxRb|FBqD1yy>^!ecJegF0t=>il=R=d*}--A^AjjB_nb`#H&N@>9Vx3lJ|tWEL;w(dzl zIe}n>>@?-=zK8ULU~+*ZcYG#&nuaeLm}T>S@Fz3j-B@wNgKm%>;A5(G3bIX9Ql zumdT79m#SdxAm^CU?m4PD;A7>nW|i3&v;47NoL07!*~u1)f%xZQ3^>(R=M);c?+6k zQxru?Y;Y!-3()9BHg=nrMp|vKekp?Z_o07 z?RqdBO=o<4i&X~rr8{nCc9|>vc6B}&3Dn{8&1iCeIlicQ zlmx{iKxfx$65X48=&js&{q51qw@3dzQZN&;r;t3o3Brcd8(tjYJsYh^CiIMeY3ohu z-s#al=LEjZ_nW%yMywRx2W;fsd)YgI`v44KQtaJQt&4fXvUlElgKh56);4ul2CapK z##aUnX;jY{bhn+>N;q>5Qpm)ATzXEgnQyyZ6v=yw+%P#2yn+_3h&nK_Amg^Kdcm01 zYp(u!)O&XvU8qL=&pC=a%UeGIWf<4-tOs$F-_RDO>o14+ABlFmUWMjx5Z^)_@4cn=yqs^j!EQ@wa6NuTAvznjH zwiKT!R9|gZRfAAMAb^lXXj_Ihly10GH_wXFRE(gx>w+}p61oqVq-;r&IyTZ&VAko# zc%Tj8fhOAwOJgqOtmd2NT$*m~qT5K3Zk<}J8U^!|`>E&s#M0RYQq0=werU}zHU<=9 z`;aumen82?@$ch*dxnJ+Nd7a<2IOEOC_yP_HQzknkFZP(1x@V7a3fH<;Zn_|374i^ z8m+ugl!ikPLE4fu9HDB;K0ntY;;zT)y$IHo9BYt58qH(%%~%036>@VnbUZO}2Za9T zJPV-TBUZ)S>Y|txP!Kd12m7Fwo5h#>A(WrbcsF_SZY8vfOQ)?HU-C-980@VWUtg3;nnN1_)%FQ_G5|hOH{ll1}CzpfPNz7X*z7LOIW% zNn7Y+DG&u|rB*ZslKydpDQ@^s2;_50BsG(|r*S`^YB8>8zanI@XWDE@+XfW;Lh?$p z1z7^1QYe$4MK8cASvYk;Rg|1F)e%c_<&tMGYD$V4TpKkO*toUOh= z<&m{-$tsuRj!5PQ^lbaDZryeO#r1bU-GGw?>3_OtBnI1H=(LmXM`C(OttY8HH3BO6 z4U-@lPJwMC-_YgBZa}vxRbO^98J@gd(vp%6Sx1Ny$tDe?i-m3)i8``v;aAPH{e7RY zU+s*4{k#sdLhGnys!)kd97lUcj9N-w9+1R$AiLmfz}Y?9S%4*X7Kv?I#Y~}m1f;i!P#c9 zx}}1%%>u+%Ms>1@4exTmw#kUb($BCqpEak?n$zAIagm8FH5TfGGl~h2q(|ivWK+I5 z-BFzaWB9W=wXHhkx>Bdo^VF&MBz4L^Tb;7^)u~A8l#DG;jebl_Xs60)RW`7%ub`xV zh*}u0TB5?XL`By__UKWwC5If8u(B;3-4@a@CUa=v=vDQ4X`M(`A2_?_?3}X!XEV+& zIh$~H*9ofw8ulrTdEH8kMxisVKoU^;#X5N5q z`=T2kgk8fSgGOEzv}=2Z9eIakUb5qV0h&Na0HqIHs<|}7^YTjfAu z*@apV6gCNHrUiiyzAW&7%V8PFT{mlOoOiNa~u0)1>z;nj1KF*hE62MpLbMCn;Ma@6dDDF_oC zg!An+lr)D)Y67`pW512KbhBi?(K8QLD-x$$%L;SUh*^Z+5z|CruYxL36>ybrt z^v$yy&g%Iyo$NNi1D1-YVccQ4tRinqL8vM(yj%){US1gkJvBTY9>{tEt3^Jj4Zt-I z1GjNa%f>Z-J>=3EXW7kh#ic1{*-^PEl$j@!`HisGD4))+V2St8n!RRXpKnqA$1A%)-u^8Sp7` z?nurQ4rr-lxRh_E`!^NY`A`b2*BzH^t7b0w9hE*{ZTFQvl?o!9X9c_OwM(70-f0_DV!$T0?dV8Vl^Ir1&dew{F$GpiOe*5u*=cEomLI$FXE}TRfLo_EFz>0QjYXgVIp;@`G^uDY4zO5W>?3EOE;X= zd~>pEl)dkWrMOf;i~tRO&5Iv-M zI^3ma76dTzU!`~21_@S9NyE>ukES3yGfBi|L!w@By>E)}@(;(sLlck7IJ3Qs3s04Q zaVFdPdz5kHia+)qmmQQ=Tkm*MZs$Qbq61500O@$?`U9mkr8}-LXz2RdVHGmFG&`#b zVz`D|#oYuIT@Ey7Jrc<@L>2zP>*L5%BLzL*viWF|Ziwu!W zLb!9*O@r>^63@QtkSd)G?}qmWCcwCV*yl}E7L^Zb8bSN7`=FA%+LclJ$BiN2)MoDG z?3l$Wa*h||uqucY+AB+o^+Ka$6AN)5!1@HbJT4=BN9oVI?$G&2OkK$?`hswkK}fZ9 z{!44c@Y6DNJv;kA4Sa){osGJ~dD>hc5C;OWe=>+^GU5g%q{}fOop{-%923&X3+Y=tNPXr( zds;dmUx+4a0@916bU^8tQd<7*s0+$IS&Pxr1e05L{hfy7Y4#)Yis60CIifKV^ z6P-{}wb+gRG}#T?ve5A}N^d)VAzwp#U?L$})H$7WqcFKoiBrti17%njI%7yR2z1s< zATAsfqEnz9jDgo>qTD4Gl}1yJGy^Y#6(r4Ig|fOunr81ia0t@~IEwcm#wHk|>j`!2 zh%Y#y-UwjltqCm}f}<^aW(yA4X`!`k4S5lQ6BStue5!({v#P!0qs?T0hew-f$!8`~ zgNaU_r85&TmAmdZ@`aB!15QT1pMo&7N&sJO!O(BBVkP~?b5*fQUJeXglaHChY{*%? z@%t)1c+NnuGH=Ri9iz7EDIE{TsIH2FP>hB(`-lp{-$-FrEW)s~ogLF|{mc)~dvsY`KX9mL!_3uJ)cIe|>a+ip@E|XPo7; ze)BdT42`jJPKz|%EV`o3HsPeP42`1L8|4g2YGB?}0`~eNJ|k}lIV_svg$p7zD8Qry z7lcLh!Uoj>M$zqmIx4UdTyV(238!>x$ScQ4J$TZ$+RsVfCSs5y%J{$U<8%0PtT%lZ zs<)W@gvl#T_VIBLc;EGt#{awM>NQ`LRO*#y6}upYcq^Q1b0|}kC>(2*1&8d6aLKlY zY#(FFPf=r~S(1F@K}z;elFzX6Sa6oD7T&nlEW4tJrCEo6DL7=Kgb%(oWWUR43Qtqd zImV;;`_`iyA#fY^V_UR&0b||ymicE||BDf(2UuqTo*{~EH&t4Sph62pL(%P~9{~y} z3OptB_p3kHdlYqa_&5Rrlw@tTAnwQ{f{QKOiBB{NmEEx6yCeZhC2ULw`D16RBPoK3 zue<$SDzsr-*p0CD-%^)xqWx!Mh5skfzK3r#M%B_^Yjvew@ULv&)U(B}Y*&6u`*Z8J zwEw_=&aVEI_9gyhnf^xG`ZMi{x}QlA>|@ZMb?+FIkLXhK^OWVffC2vnEH?=bm$AwM z6q8mi5(G0bGBKC21Oh348OxH}xbZ$;p_{4Hh)eLz+;&~-#Hn4|Sx;3CwhxpDX%JJS zmVic{e0}-_l9D;Qsa!;$0W=!@?pCxqtfJN5?jrgA^lx~NZS_RGe z%fmn5^&6FhSz7Tc34e@edq6b6L{-6QfR|-i@Nd0y_qZMh|5}%EFx199eoDUxjNT91 zO=n%*;Uk=>on~Nv&3G?n(5<$XfuEx+Dx)}53Py@|Sl!uv;PGbKw)e1_Vf!<^2mtLU zm{@p>*ZI{GiUOFq@YXqNqY5t8Joxc+T5sT#?i%xrK|cw7Fx>Fx0#BE7ySnR;Zz?!2 zWCz@>PY9@Cw8epGjWgPY>rI-Zpi7;WTLmkN5eBg!eeBPFErJxhxV_*bYI=zr+cJeb zG2N~`H(D^%cImMo&1YCo)4&}0dHvuRz#0PsR=k0<2Bvx#i0Lq7^2RL}o{S8{XMt|v zvv?)>?kdZWMn9RIY`Q$cO@QuEP=l6{Jpi|mWsSBs^qKt*dGJWfC#&83p&7rEDNSP7 z+zjRk_mdib17t4mL`^$|Y#61yazi#im;~4{>|>^Zr@Owx*%K132Mfq~zrQN<6vjmu zRV9=77B{I96qmIChB2M@X zz&$f#E9JfOdy7Ej47$2Fj(D-=>FausgZ*}N1B>>5MA{Oi!7C!}6;3jy4uHEsgEMG& zBI=I%;K27;-ddwp7eRk^Jm-hQE<;>)df3*e zGT)JZeg-rgI|Mb!)4FRl5_*2^kp(I0D>)xv{}KI-BlGBC)ZsGInR-If86l|avjR0S=0zfNvWGGI!Yk#5Z>S>Se8vl;_0 zUwL;-Y$Cl%g@f>&^a_C;e~*1<96K+VtdSjmh@#Obo+1g}n1Q15?1+~l43nI{;`IPf z+>0Niu)?Q^S)`G4OtC(sUf?jW@CF{89?5SmJ(LtV&NCpc)%XzD^TV4YT@_(fM3jnT zNmzl@;Wv{*G4Hy`Si(F`R-4&2i4yzX-$BeG8R3iw#X+Ypo(7c1J(?lJ7*L7B_nUWr zu7Cuy2SK)`v4;~HHExiZZj0@Nm&D+D@>G6ZJQ zZAqv?$TpM$!rym#;|ytM2{c>&epmxq3}e=Tu^|Nv|A>hlSQ>)9uHj1U?2-cFeNmWI z319d?{-yww-!LIMo?4lcYk}`CKGaJBmlg{1AzXs|)-s?UNkzErDMV1-@RfppyOVvG zBzD?~zxm2Q;w4=v=Uj`K9C(2;ha~n zgdR6v3_8seVm1(bCQ1>^(FmaX`e@o`2AW1-_(rJBf;mQnV+q08EKsP$}Cw?zj@VRShf74Ze1Tg|QauzS> zm^2Ws;D@3M{8>HT=VKG3#)qLkTJLpg=WmqPVFYXiE0%`K1pusP5u``1B}wAM>H%FS zYDZOqTiD4apa~rvz7{e*6eU61p6n9GBfcADC|DWNs^CPIb{sw08qN#S5rM%hr=zq? ze`63OW%El$PoG6Eq-ULf){RemCDkpMaLR-!aN|;Ids%}N!Hg=T{YlBGM}NWdUF{J# zIX-AN810pg&d|G)BKYw9+uPR+)2%t0j?7CEZB3OsAwYHU1W*dMGd?ljzL+nFt4fNT z67-@74sE}s&;_8Ub%wdI5gh^u=@9Jlg)mJ-gYo#6oj(MG*ev-VF!f(;prwi_9th2Do(-y z7`I0NAgQB|X;YrP6i6tDjy)lWrtv(wsXR>b6zHtNq|BMn&ygx_4_$>|9>NlBpM~8t z=dh|UtSStv@k?QUwZcp=_BcL*LbWwjT8iHrVbBUW?S9~bNBM|BuAT#rczJUD&Ts2R zX8@B0x6TU~TYI_E$R@IkU9lDYOFoC&dL^laeFU2)#L@%!2&Bg48UJ- zS+Ngtm()_L=mHH-D|KjWY@VfyP6$QT8fWL%Z${Eb4!5s9eC9; z2|$`vlt?;5a6(~aw&$Y@E{ZpB6~|X`^+mSkDZ7#v6)e2BO1avvlEBY734?)G5nQ}* z7VGOZT!vNdOW5(;kvF3j5dv~AJnpI7hehu<5O{=tIKy33TvDKLS}bWtT+FN$_x6X*{AbEIv3a)VFBG}bz>mEH z1T3C^Ukt{$Y&iPI-0q`0z0o2zL2%{tVg5qS2R!&dzQbC|tN?#NfWKbKvL!fQhTgjh z$F4;AfGrzXo?PUDkCeh!f_*K`R_aqPc3R)PfB5;Y{POpmuz;Y`Usjl@pTYx zbACi4ZWhGSXN@ICL?r%y0y%`Kp1YRT$aoUbneN_Re;s0Z!FQ}vc>g4Ya*5kk*!|YM z*jNCcRyR+^vcDIavQl!RtejQWIGdXi9+fY%YwXj{R+!)(M9sNo=JReCSov#9M46R7 z7|pNWPk6ph(Xw(Wrpnb=9)53RW720tF?PP|=bQMo^9>idbgY}G%kp(h8j^Uz#u0B! zl@=B4f5Er>TFkMeI+Nyr{3`(N1=~`49*R#3PqT6m9pDoWqfmu^k^h{q4#eKcQEJ$+ z3iNfSmt5T%=OZ$0@IC!`Pm-UN%Cq2m8LP>+(on@xXUS|eP~jT|Hyz3}3(Gv7cPNvk z*qMe!qOLlW_x>*!{~sPU(Y<*~L(IDK)_%7ye-4uCWZ~zByWj5=3?caAzqcw%!=$KI zyW`!bFVU(2IJ_xLKxP-(bzG^k2o=ThcJ=Y@pZqs)Qmr747DbK}muZ;7OCgOd;^M0J znq;dota8jk@L?*$ca@R63sR_xn-K{_Ae>C?36NM%l^-s$QXvL`UW0{D4Q>N;zU{Y$ja_rZjM$XYbF){yNfbsxSHGlg`;EBb40PD1|N37tOlhQQjB*+dt2K zxIFvoOXG?tlJ~Z_yeg6uGFX^}2hK>v<*ayB&dx8C4rRsU>iqTPPpe*wR~IoF$h=S{ zl~X1ie-JB)K&oPL!Vx*VHzazey({BY7;2p={{+j-F6ppur2M=`@wcLAiqR ztfCsOW_yex;@OO-hq%ZLXRZA*sF& z^q&&;4^QYHM*JNHmh@dPJsoWMEwAB``RK>Xe=SyuS}3be!Aeqic*9Eh^}*6zR#Tvo zQZO)02TROr_oo4KJ!KqVNCzu?OWS)#&+ZtV!Ukif%s+|vCx!feL+=&6cl4|%r#Z&J z(GvqHXGmIrESSuh%m!sBNzV3VOD6SE<`J@FKHL}7HXwE|39ZzY!g%WFkv`FR6jpeC ze>`j&%3Bt@V@$!S@){OYIZ|oLBM%^{hP|I!s)G_Ln&&bQ3T(WJI1MXoP%O3`n+9AD zy}dWEaysd;RGydMf!O0O&Yp!ZRv7DGNF$umybv`SGR@Xamn{>NLSxuC>hk^hg?FL+ z4v4lp#v+liNV0r|7EqOv$?I`e&nBV0e|t{Wk_ilg)55uI5lGZR`GG}k%Bd`Wx18#B zJQC~5e_)xW4NDH7WO?05 zmLofTkp(=WJykmOW%bUwOH;l9^_+0oy+kp9_m-X=J@4rGmYz^k`H;OmZ2~!wf0~`h ze#q35JdYbr-7;Bl=4893)$HuCS^SI#xvv~tGz(Vi1=*AJH+jz$nvmbju8IGXG7^k!>_+ zsAD*(*07``(s4%isVS%Km}E(re{*Wdsd`*5Mv~J%hMiVM=m2(FMiErt?G${{B$9xP zA*`TU$zys>$1MezMi9Zpr)&A7==7uDlvOclnP9uX#}i0(ec32$8d(Sl;s z)EjhzkE+Yik1YaN2uZ7Fv=<&Wf6R~+(|1^|HeBUMuIFh zu9}Kp=PlDZH`(*qf)NSrcDJKnrkoXe`;$!?eeDT zu6ZM|0?x0W>4Y>8@C|*TTY+rIfb}K=Zp|Ez2@2H^R-}mnrA3Fj$Oo_F>lZmUGi=o~ z%Z9V==ZghrzNKC(&Tc02mOc{-W_Qg>Mm84uP<^+p!)yW_ro)LNNb!g_rG zTK*}pobeACMhD9+m_MiEI3B4M+87wpiKzS&kR#`O`7>GutN|{3P4Cq>3+0t?K0P=7 zXuTEDg|7^Mv<{AAYE1aiIwN9=Pk|qSY&I~126|rua=&ni7YI^ve|#-Q&Sb}569S|( zkFGfcp?P#5@42kvR5xfa8T7K)Xijs{eia$Cc07p1nk3-E$J$b9!T4G5#7+84G|_7Z z8^T<^D>NAhz&(Pa+MG$tWCtrn$1W>+86Hx{-q`XlKp3CKVCo)@GrJ6=Qy2-twmO14 zuAdu9wML2bMQ3a_f4V`^Dh9%AbnvSP+?L&Sz@*wfXm_nW(D073RVs*J%yUN@tX4v5 z^###}kZ(0auslR?S507i4bLNBq7CXwL&3re1$wj@kmV|6V1$uOm1Otv870L>Sbi8# zdc77ESj`EOITKVWK5a)?KLvq$a9oc9)_SFw0Vqg^q+^mZf3J@+2%Lfce3Xt72eLdX z8d!t{lbo7xS=(ohiS?Sqe(p00I`FxH1n?JPJS`lBgLp<# zj(}uq?LpB%uO4P;!X7BwWGMUPc{H0?wJzV(3xqY_Y~$3g0ML6yC0KXD>K< zydD(F43o)Xk-^)Hgkm0(HH?X!?ge16*Nn2}wp~Aqe`Pa&H?JoPP9b;KOKf+~8Ta$< zdhci(sA`WJ?-`pte@00&@YxY|US-g9R<&KTM7;H5+m}}d!L!}d!BX(3gz+bivlwuZ z+}DGZ!g&imPyMm5QXPY^T90vl1~(&k1~2&?@?nkr%sj(to?kRblJ0?1%~5Wj`bXS8 zRgOGfOK`W1N4i`Q_&NoAF8T)2(g#9n#;NKkJErko8l1*|Jy%keKjZ7)=#_F`9`^ld z&!yKB`z;#X1#iZbbMTZxAF$Sk2s+;}3nbQoe?&Z>&~FR3kp~IQCzOfYP$vEmWfBzL zEY~oY0+am(iX+5ikEA!8A`cplI!h+U5n@Y=1Bdzh<8+s3mfjJZ2Bc}qQ*e9~A!W$Lj43!PAk5}#LJX1tdHdP%V|uJm#l$0k ze(`gFQal4A~_!NG5hmZKpWnc~wzNGjTV)l!x;Uwd|n%`)HjgVcgkb57Nq zdVd@jfP%@&^6A;~>Dkih8A-*YW73W*UvPqR){QA&E{JGMe;H^~zE1tE7S3{~xR~(i zZ?$mb4jCMB{kM|%JqWIteX&J1fP>N?lWA2CCe>gv=w-1Tn$$-1sF32Ol7B-5eaa9h1&g7=Qdd>tz2Ev{ZhxrD`5%qGG`L1;Qi){r)u2 zFV5g8AJ-MaoZswV$A*7cU=NiJ4Ia~Y9Ho`;r?}biX^zq`gv&Qz!U3L00{`Kbtq8J( zN%{>9KUIya!9~2btvh^Oory-B+fZ`Y{ukPMX{fasNHBf_aXdG*#EktKVt0W}KA+ z0E#;KCSSd7?{4|ymQB}Rp}yhom{qOlhtNUDl!y4W#eNj**T?R9SyNAnZhxt&@@~H9 zI7t(MO4rrmmfx=6yY8AQS6}AxTZ&QKb7mi~X}OH9eFJT)ip#&xldbaYd?@>YOXzOB z!nj9QH8=A*Pw}2so+{8dx5P=gaCvoLv}NGj1ypaJqz%pAA@m zheN*t>g9^{cPhZM3;0{Nt5yO8&l+2#D7-U+A2bZqycNLv7e++cvjcuiDyJRBq3{Ga zSu9#U>Mwhy=HGOn)vmcxjwErSo!sQNn@P=|zI`BOx=#ZHX$$Z(MKHRzIa^Ehf2ykR zmq8r@69F`rVJQO?0yi_0QEn=KT3d75x)FZ&ui&IF)HG&rOzjrSnEy+BN(~~Ie3$OqI>|*ilVi%GKmVpSK9|>Ro?d0geGpz$D zqs&?roGgMw1&PQaVPtSp1Rp{jsoAlV%7%|-T82e2lVRDHO`TV>W1ZN4@MMRDXOR2p7gf}|<|NmGrxGeU-Muim|U?8meXj`~~{ z&M%e^laHalX?t!q3oiz3{yuIS_bGK`O~(72<3gxW6v4qZDkL5Nu|T55u1}lcBaNDa zZdE2iSL58x+O;`rNM({0j$ipOxRaTb7oF?xV^0O zSY_esrggklSudJ)J#qmYt!25YSJ;vUPOa4+>W~BycO* zglpGz`4ZQX`g+hs-ga~fMw%U4#8J$}s|dc&oAsK2TbFZxnhx^DV8f3(Fejd}Xq)vm zi*e~`c(IH)NTt%-paY4zo=v33p2@9u_ZhjMQNlV*FFPJxm3?3NzS`jtAcYPH>wFH! z>qo-mvgPhA7lX}BU5%rzkYls)GFD_jK#@hkXZLH5#sHg`*r4}G=uFheBL@jb9|bzJ znF1Z+7#Vhd^kparT1BC5470B#=@T%wBsl82RQqT zmG5~C9#*mkNCyu9L=79>-m2xDc5cp)ARAO!AWfuAJU9fcqeLklYS0~kRX-gycdX;s zyXoICVOY#F`X_1)k3)mn*10!8Y~Zy*VrM9B-ZRC2CVI(@qTy|J+^icvsDZhfl$#;k z*3Ne?hSjJ;?;T+}aK1twgG`7yv)_sUzPQFhi(zN zpV7g$TZzhd)cWS2S^7&=mMo~I@ca| z7x~-|EWPGm@h!6X)ej>JWe7m?4ey7iyr1xYY4`Zk2mSHZd(~fMCX)VMeT&yBY6jfg zc&9$T!)^Ges@SOCUiGWSTlxhF2BA>L?ZK}+W{0ryXNz5Eah2=t@6s1LBCkPYMtZWQMcnlo7N3$)x|J=&;N0HAalr8@OhTFqDxrF-xX@Zj)?20duY!wpHNHQgNn~KJt1Kf@21|^@pOJtyM(O4 zLv-&9AQ9NK^~fmSJu~t!#kex(P3#trC$RDgLa=cu>!+<6TzmCgQ;)B$rj4+iRI|FB|% zG|FO3Ocy~0=OrXak&K}wx)aL@DpYu%T1}U@MK|QX?OA;aLjb+0!TcY}HI*HeODe(N zq!#Zgpkd7fR{7VR;r%uHzhMd%P%6x~SMW_`LOdU(NeV1uumb;5bvl!O85bKYG!_a1 z<0K`G3DTG(jS12iUBy735?vAPh{jyY#Nl5Kqc@|#&)b9Q&Dh9jHK{j=MGSh26VwAf zO8|-l>J8|Q=q1soME6u)QO^a@m<(%sDD7#uCDZtz+S4X7iM~~Pi6HI46ndzWq(7`W zu9jS#a)nQLA{$2LJ45h)Ss*zW79m_$Dmkb&6$F{m-fqKyEzo8{R+^9vCyKC0HVozI zR*$3d6QVFVl-@)ZsW?5T-lT%yJpO{-V$vId5Og@&FqESWv)w{jQdu0*dS#ZvwU`}3 zZ*T!CNN|;qkdXSQ`rlw;=5Tw3s8FRpBx>3fB+a7CeBY2&g1V)D`KpL@`{Z_?5tIUy z05h2+;CRhc&hU_5t$lLvek++7vw)pQ3Zko+*2D)26Z;V2(U2i*EiTcWQZIc`@c^%q)DgZ?r(f@Rz`|V@_!=PkVZ#BXa8TxhSVw&2e}Tw zmSY1;Ya8j=lq)I=>W7pe7AE|w2dPbQQ&H;Wx^BMX zM~EZ|@9kLD7pF+2!heopiYqMs1`ZfoRIqTk>zV*<{V5~7KJ)KhWlsjpMdV=YsB8r5(` zVkck(LsQPAu;n{D?ku_W8@K2eu{8WeSb-hs4g^mLYI~sMl~S<}N+?@i0v3~pxvJqn zWvqYTTY-RUPD&ja9~k4WD*OXFR*M_Y0*cZNNc?Ym7BJV(0uYQ0XJbOhDt1dWir?KNzbh-t}eKu_jUe>Y3P5AI2NXQ_r{~m7|cLRci7++?{Peo>U=fKnBA3P-gW{nlv zuF8gQ^$mPv$t^bTpPMw>e1bNw;2bcUr=PwO{NV_H>2tJ0I~uhj6V_zHnr<3;oJx%E zSyS0jxukMMWkF-`T~s$LWQp6KU9zaaVv(bulckZZFrR{=o&JcIae zO%SdK!j9YP?EZ2lvdEe= zIM#8btj|lcoiT8t{{bP%3@n!+9|IGY0TBWf0W_CUsR1c}l~~=6+qe;b&tKuUXo0L( zpO)0err98Enme>x6vf?PK})p7Mjt+sT4(RC?|f0VHx80M7$RqeoZ)chH$%s({VHC) ze-*#@{`uk6-F>oICGonB>tyw?Tb1dmjO%rr!>nEX68*c=$0Ofqr&->4J2!r|+A+(>w^L)=>sI8g8iAff2W3GgXz=|r zv$i*B8OgXe+p%A>1-v_Kvark)SXCOWZ+?6DD;)GT$<{?)UmU2)BK^hdv1QAvJen+% zo7wqkFnz|f0lt;cg(4H6FUCgeU`0~WL+0UiuVh9ru90F zWzT$_g3FV%h(3&m+28#%d-%Y1Wf8rd#+wZ9W$KymYh1);f^ix(zK2=D8ZILUHN@+p z&RD~L&(Ht(@D|p@Rdlcu8uw&c3 zoCw#ECE!JoRlS>dy%`R@9wdT9&$3FUb{a&*u9-%>nmu#SmsebGj<{P8UBks?MfAV{ zj?0>982B1s(&No0k+3|N1$Q;|q`QV(Fn!N|teKbBkzpBdD$mi;7>=~Q6Cv~-N%6Eb zRyTgK&v*}HQ6AmnwTFfJi$YHXKaChMUfZ2&v_l2q{=!)cKC0EKMN`WxxT#E|*LSQP zPI?DHc-QKu*DQm_LkX+BHTntNq?x1Wm@sh9&THA|(hR1t<3RBE4I@d4odr@x3?XNK z0fQ}oyhYueZg7jwqHTBWGBJbm0#fqHG@8c*Nbo&^Q+w?k__G98UgiV}KnReDloLdN zW6I)AQFJ3;ww*>oFc@vgW=+roQ#ed38oNM)i?*`vhldVrqPbljl{I5JV34-tbzTRuvEW)VA9p2 zi0>e1{cFd-{-S6glRb@*ZT0Uz2Jo2x{3k9R4CRt@P<{F;P7}P<9|7~fh#TjCuL^C0 zooaACeaoN+n}Z}5MZji73CkE+1Et=ZX6}_0aZE&H5SWADU`8{jo{7pak(>bYE#aY- z{q-K|f3G2sHhGNT%)(7SyW6XOu>&wO(?z3CumQl>!v=s4*=nBh34q_LlXNE1IR(#I zu>lGlt_l%>m7eMtkKHueM(EyZ%}WOLIiyo1H4Qf!4qQ8&qb)G~dEvxg#zc@L&ycMl zG)a~9R{)+2&o_~sR6D2xCSFy9(&1;o5sj#YA`jg((AF@1Zxt-WS|9{}XT1I;{f#GG z5Yt}(UmA_r4<(TO!klJ0!J}0mwb#rD22p2+Nm#_fsPMko9Is`8qQx_2SBbm-n3F>%? zFhiUq;A^7>(X+I&W%S*DGo@9{PQk&_Zr}t=6|(2RMTGB}0??xx;hrr3wRk;ey&^ax zg(O-|j&cJQfIU`e)_Gnykg}v7PFmv}^dq``p-hdcfBr+a%h}R$9oH3~?W6XLbhNLa z9+X%I9inBR16ZWQpQH7R)N&E!C1%k;7!vBeXAuf+!LLAy8{&sT< zZY+`#n?Cq%qC@u_3uRmsA%h?r>0Uc8BL4YsL%knPh6%tM3dA>n^~@9Z23`V=Z9P-QHDpp z-LY?OzsTJ2H;-$7ux@ki*>dsh=F+p}g=b;enREYd&xT$!DY|l*w@l+!gzK|`<_Ps zY@n?aYffDUP3VeY&zZyBEK>Z^xPlwwDU~-=PO)xt{lXi6_snRZ-RBaHGex-$*k$%z z4?j+=mWf7$?#-Th861=4u-$*~xh(*JvW*g9idGzW=^T^DvxvHCStXX0D)fqD5 z%;_b%@=8t$(&232Hla+XzTLjqaXgjTn(qW3n)H&QJHdOd@j=AmAqG%7dGn1IGc+MJ z-$sSj{5}IpGP;CXhJ&3N4D}l*+zO4F>I%%FdQ-)J=}ph*yGXX_Ri5E{$x^=&qe@3NN*DHJCph zp7+~-8Q@q7gXJkIV=;w>|rhYN2wWQx`dQ?c`1*ltUIgD3%oGO+EMr4L5T1_ zE1n70CINMlv*rfklf23_`m&}Z{5k4n#^K$6$ZQAogtGp~i3g;??H>&z0T!ZUsXv?O z?G*l2Wd(GzN%(^%!Cu(;OVg%Hqm;<8Ngdqk*Y6L$e#`%6K-XDt*?})r82ElP0u(qY zMTQzm7=R5y-1C>(-a223Ax(DFQijk%v9ZUaV> zB2OeC@<`v2cJ=Q&k0r&2q>8b1j=#*z?Q3>tW@l%2P8Q=r7C)ZJ1N{EX>I9T5v~@+$ zg$+(fsfywJ?AxE_s(8LQ`*qv;ALnP^zEr+YQY4vFaeh^39fVJ*u+D!8=WKC4D&Cea zr{i@~_4>x>QhnF!TdT|0)oM1audz^-?V{J$u^jdQT=#S+s})xan`*F{F6!R9^Pi6< z3tU~X0lH|$#X-rNAJ1N#!Yr!D+rC$} zyz2FXFB^gjg7ZC#g=W#na@p%E6U!S!0h{C3l+h3jUYb$>g57^HgTfG~4$$R8{9}^X zE+Nl;a>yjnEE3HK;Ob~D$q#74d;Mqw)oBlPG}vd>{NXk= z33kx&Hhn_no8(1;J$r}p``$a00xrKol!XyMvVHG#`7F!CMO=Z1c@DRqZ%FJ8?BXx` zp6vg1QD73kD`S68?4?!tUob;i8iMll?tg@-&P-*OOx0J&RDTjvMR0IhcO4V@7OnP> zmVaO-IMmmu=)wze@+Y)aHKQignORb#vqd zB|?l{Dhy-m;2x>4PGsP5&!kRdkl>!6fTI-(t`H=H8Y2xfIe>G56nmh_MORLU9udUY zDQPyL2Vx_%V+?eRCF25AAI3r|(Kc|Yv;-rx1F8S@p<$JaXr4++jO9|Im@5H`!?9sJ z9$ORiICg)4vB|QpFt~FZ>NyIw0F4>7=$svOmZd{h3cD$<$R3oU^(bAwM?p|SkcuK` z33`Htpx!Bo1jA0b#Bn1HA89E{dWs7Hjc_`a{6xgzeZuBIC!!j%+k| zxEwkoK;>+spdhdqkUp4SP4tZ5oJv}vxy^)1Mnr#uy=qV)yF9d;VJ||Lgw^2ro?+CF zN&(oN91W~gsV)SW;POkF(?X@hf<%M&lJ?OpYS_l7{B_A_z1O5-1d=u&x$n9WmFAma z2cm+VE+E1J?Eub)IogbMo3-9^4P*&{8@gc&yU!~yx(s~h3+&wv zzi5Bp$R2`D^eAB{P=e`335suM9VtP=jyGC@G8Aj!1A5#%p zIoRvcB4rXr=jRdiBqnJ;n@PG(w4f75a2=YYPEivSA5IF2Bk-V}CY zuR3y^*P*>?2(zusE>u5>y}GZ=h3deOOqYN58oaR9o#aA&H^T5ysNlcItN6i0EZjWP z)8-_QN#g76qjM4uqRKCy)Rb_E~*!+=`gpQwz+IJZ^wU= zQIk8NmEA1KLss1R8P{kJo7n_Yew<8)*lNP%iz~*%#ky&a#*R`e#UEFL`E+)}V@^i` z-&r(F9c;YJ-I{7McNi4b4Qqz0sc?CjD_W-YyHkd*;bPA7UDQ>L6I&s7aA~s&A572( z!Nmw=;|Ak4f3?;7ObzN0kF%U+V$gqNJ`<>$Rk`#M)pf)4YRWROSy&~v!db+v!tu`#^i zd_=tP>_jmwDQj7AE0pjZiyjSDgM-!<6Pt?$?0}0Fs2eOq14cZp5otbQb>R zCsSp1qTer!fzg6k#^hNloD-6ned zV-mey+VXV|BhFU<6ZlZ1FNl6lG?$$3)H3}aqJJUyf=YhtBq&q5vwMHS#-#MlHQ@`I zluvwtus9Z?;U@k5piTHwZ6ZQ6Q1e`7j3$h#y~1TT>Q;Cm=`u?O#&vriIn471_c+mj z(lja!ANYqo%+v%>9{#9-ryp+a0M{DM;J{g&pMCj>S9STut0cd;es=jjoN>MLDIJ1( zVC;mAIo-29G4E_``OSZcU3B^PUJT#^Bf3DKB2p45jg-m&Jupx|AoVY#o^Q*j?+g6= zH&Pc!{j{w($Ill?y+P_FQr{!>19v+uOKr^23ZK?K5F`l2GyGU6np&-xLFBtxvg5Gg6q&y?gmjrJJ)>OVGdd|Q1}X#D8Dx?wL2|m zu?gJU@I4pNyDhSk=9C}^zqh+pyeduUi=?36t{RRWxnvSnnF2&EY|7hMsl7g6p#KBp zEp4Zl5hnu_mkx&kF%B|03NJ`yX=iA3ATl&HmraKOD3>k`0Sgs1G9WM@QVK6jWo~D5 zXdp2#GBPtXmyw|XCV%W*1%MPsy5@4pMef}@$%_Yv-I?~0^_lfqcX#(?g~dG(Tmr!* zNU#usTX1(@92U3WE{iPls@l7!XN8cwdzUHxOnPd1ySu8s`s)Ax`m372DV56J(a|w5 zFfcqkJj|AC$(C&C50+FamC0l>xEb_1JxP!hLGeQ3B*+m9fqxS~NcgJ;2sq${phc9U zVT6Ff{Y28Ik??@|Y9Shm5(Io@GT|L5je?NOIU431*~5qhCn$^{F@nGdydFaEg0lxW zU3Bn2HW89U@&ap#Byn*LT{Ku~_OZ2$Fpo{qi7!6=ClvRGB>aVBkD0_AbC;Fm(?W<2 z>XAUbfVu@wMt=+ah@e(s>uX32IEF$}VpJ$%gTUVmHpqrygGGo860d~~qT$%U>wyi@ z3O1-(v7u4I1|`D=*X~5^*pNNLuf+!O8rUE>Y-q&TAgp792gdJ)4G#|wcXxMKG)kkT zv>I0EV^CO<{i0pAN zvV7{b5>qPn-r#^KB&CIS;Eow#s!1!shQ>NJG!4Oq#u6JE@kQ!`4W&BQSiuIxVFO%B zh7FR&hJOSGS_@!U#fC;18`|Fw8~mpLOwH?KL#N?xX^9OE7$CFZ*x(>hD>g_eHpqHm z<8?^G&(9AKHLC+~!l{KUds8?Cg~=glKBvEO!@ANak5i1`B7r&Vu*jUxj$GoAkr$r5 znX=PO2}A;WNqH$+0K7%&7C)L1ObO^>F-2i%kbkLQ{y?Kq68MuwBN_vFIu&(xS#wb0 z1Fb?wrk`IcLb!6`dX`)hW)l57qd%~^1CL=w8Q_nlY6E-BoKBB=@G0ra(lDP|77`jJ zhZVvS8yW!{pxSH0hPEEq;B|xl18m?TrRI%cLsJ(vlz^dx4NX0M24I5|oh3aA*wBbs9hQz}W*sDR*b#JE zQb&Jkq0m2RDK>{alNI5ZVno8{tWd0~uihaAyF(9y1K1m7<7+ zI@3NhGI@AIMrT@y>Dd~t0R^FGy_@Gr4Sy+g21?v3gzmxNP7r38(`YF%)Y+j`&j~*^ z>BR##|H+T=Y)O@pxJSqzQKPAQyr)qO9}6Nu#~?um+Lz7|hI4N8O!$^siyy|5t##%p3jG>+7b4ZRj9-+EXyEfjD} zf7NSYj-JkBju`jux#T4mt-G8`?Utp;y9&-WoQv4aJ5=Co>Z1daE59wE=_1hDLyamcmeV%jV6R z+o@1Wj0X`gl(9i#DCH3xlb96e>jZkFRcr{@{@t-*iG+q=LuUmWdNDTme1C=^g?3lK zhW-s=gJV3aq)~rtuusm=JG7&jPZsSw=j-T9naC}1`jIq(gOMHhD6##ZBx2|=YCOa0 zV%*kW1WzfYAp~QN9ocbGHoimkoELbSd|pTpCEu)A0T3LpVt0}-NLh7a@HsMzMnUVV z#denIgqnIMEyIKm#;~FFuz&RdbS$tzS;K~22^+dMgbfN;*|liWxN+kqyfgvQthJq* z)HDzwVr+1n1`ber)U#y7^ciEj$GBh!gAh`J4MG7MAPd8^(PP(cSpLJP`?jvkc?=!1Cg-aPJfN$f#pcna2`tu z#-#H#{G<%+EFv|Q<~)B6RU22KYt5YDf9L%@vPopt;Uk{Blg)EO+e0g;M-=A+A+3uH8&vJs(9{bXq!Knr zQfCb5I(PH>)hlIb;eW_f9ZK@bfJSO#O4L7@nLzuu1Z)rp>fK@0;UkqhHx7%_*kdH2 zv5F8WBrsf`GWY1w?MtWS8xb}BI@qABVWW04!~z@4>DI6z^BC738?*q~~|hUPcr4H6>-!6mv8h7v$X+HVPlI@*a1-G7)eXQpT#U+UWga1uE@ zMaKjqmQ(pmrlrXbzM?3GVK^h;SUj@JX2Zo5C~je#Rt0fV@Xm5M1Uuq0r?H_8LVdHd zI?SbrT7`4la>7MrkX)FMs3}DyrDUNIJU%UhE|kI^gkTAAv<5Cp7@fq&;)J6(C^iME zKnw<%;4-~gBYzVGY!D5_2C0AzoOJX}7`pz{$)krV4<6XRZ{NQC2P+R9I#gM?d1@Bb zvQ_KWEkSB+uLgyni3NJ=>|3`2nJrqjva?4}6jj?XXMwZr>{TlETPt7#W6(MvaFt3I z-L~JrZaH2QVsCH9oDBZFwY^GBKzM)$Le>0LTQPS7^?!otlYcyXWZROdc?Pu#t3NP) zQ*02H*kJJRYp_AUfV1Bo8yMLDY>0Tnnyb)qh*9PZW)@f~plHqx&a-CD8Z&wfu;26Y z@>i`~m6e&rvV%MdOVX?y)Jg7BCWK5x@pUAZLy4z>z-M4!(CO2s4<0;NSy>4_tE#Gu zMt7N~lz)FP(H~Mc8>z)c0I~x67R`Rvg&i0zO=EG)mN2&R_@wHq56FKK&q~%S)#BwA z5A@gx~R@qrM4(jE1VQ>IK=ym;}lWy_WWGRgB?5_v;>Y~T2tpA51cr-ebv&%%YNRt|Jd=B{nK2u7=Nlw z`tj(o%Dp=`u3fWX`K02wxE@m%?y5YvWBtk%>o)BMW9fl?Ti35yvtir*<0sb)$@g?X zTceRv_a4~2X<@lL?w|ejx)aC189%RDy>aKh%A@-yrn{<8T;mzuY4Xa|OBXF!v1Z%e zLnrr5O>v`m8q7DS)f|{**x;;t&3|u$4NX0}5`Xl?v2p z0tiYU%S2@l3=K6cDqzow1f@T5vBArYN3gKWSMUjF@Z7m`efsoy`|Y>Kj(;5sG(%Tc zH?B^E;C&2})D`$^41N-@OqN23MD&$c9Wk6ADCyc3uM{AJ<`Bjv(N~ek1}wRKL^ro( zk`K+yS6P%lbAl{OmO#xiRV}u3P=$ms7+_#Ppd>9UHsp20oC5|G+Jq6r0vl*u*boU; zJ2up<>{n4VJlMewkly zICE@XuMAz&rs2bu?b=tlZ9+T>Y-t43xqA2ohlIwqnXq*IffJj1g@5P}K^wHUN3CN6 zwv942B#Mn38^pg2Hi$Qk4P1l`{8wT_Od33I@J*o9E4kWW8HQlAB0>(|d{a3?UqZiGd{;mRPK?#oOoGql6N9>amnKmhb4CM4zLlqh8tx+32Avf_D^vusvzei zl$gVUO)VKZNd(C0= zAf#%vrB9)r*udz;X_!QKV6fQWon1g1tt-EyT(uE5bfHB*mWh)DJu4Ij*$dMvgq`|?#;C~8LRaF-+UIZKnK8;3qxod?| zGL3m2qZIfJXL~cj+wLOYAP-ns%#7e%5oZwmJPMaDZ;RT5u$;Q(J==t|b}UUKapb?k z!cca|6T8Quo{VGSE`hTSaA6vWq%6aUM8eOT@{7Ltl|gl4L!d{gR;*MlTpdy*W+xcM zUXEJugMWMSxPw)I(x$dg3JvfN2#$gl8r*Yy@0cV5hPriJ zLDOIyi2xd0e)#mdz7d{04K6BoCpa1`^aM0m3TbfHtPB!!OdYiO{IRv;dL_H)0{i^1 zV&Ac?fCfqu1M4Sz6R z^1^t{5SWP}IHE!kHHrc&md=MvfpC;Ti`agrzhVf2F`o$db12Y+x3g2VZf!@4J%0{; zfb#af*fqhqEHFMi2ApYUXD=4$ui*Ru)&yJt2m_EB*8ARjZ} zekw88wN|TJ+IjVvyZXeXoWc;dl@Lv~-kv~o}zFSNO#T?lo;Y@R-`1bn z`RhD)I)wIX`&;rGEfW;w^olI2KzD$*gt$D=Z*JASjN=eVbN=e{##r+C|`V zj1VJ=10#-NB673fJwe3VY6)Kjg%DHrMH3>IwZa%w$5uwTUjawg`mS z+sWkc&yOn?iWYWSke&ttbp~kAI;)GveOX*|!-`|UpX@QGv$3j$sBJkK#8C{hpg}1y zGS$URi&*-l6#=g}oniS`^#Ha&Nxvt_+LKikf*bh>`dH!*=g=>h=l>?yP^?n1FUu-62&>q@UJDztO;-Oiup#rO*Ap9-aRT+j z2BnORx`0s&HfkAG>V*wqpJn=K88T-WURZP?zdON2%HiCq3><%xKwV_03d4acu1}^c zSy7+JT4QO%e{0okB0!yPUe59r#}l&pA?F9RbjDio%Mc<0#|c8-K(Z3yir}mry_RdB zWPVgx*n=!bcEFw{Q)}o0xtW7Yv4Q<`8XKOclCM}x~^*CmraD4S;$ zz}#$+c-qL41BGL`3yAlJu_Bm4(y4h&0%_dB|7;O_Bb@@aobMCm5VFf!3-uSp{G+1T zF_a&{xv_r$RU8q7lbIz0g5R6bb>K0a6l3T6FxC?;T^H~xv4JXLLxK~uA=s#w|NOPE zf!7BcxOHrB(+~~A2LD$U{P`PW1AX(@!0W^YW*r-71F#`hdQpB(2dib&vx*JqBSts` z&~Y*t!psYEWFbr{2>5_snK@bUJUB*A4Z}}PM6-V+Jd@K0?2v6q4g!9x%z@W{H6 zw-_LlA_f_EDS`>pCe6`G!Z zT-17Eu^}v;qA`K-QA8MxbI@`C4>%B<0S1o^qygB#F-2@JApEu1;MwO*Vgqj=HrTn- z{}X>~V0B_cObcjTN#G4dY_N005E~ee4Wtfih*?4r8@LP`Y>5=G!Q_i;6-6<{D*Cn9 zU`ZZhN-A-PaBfnOoz6`;p*&F7=o41eq?u3me@Tl^Ufuz@uQ8w4FREG`1GpoR4mOXtrpHg11_ z5U=~jaLb@Xc_5N>=_2!upER#yf}2-j#iC>ZVX|MD1E$gI&<*$%@dPf{8~Kr1VOfgc zSLb(fP~1g_iH8@h39?w;Ofqg;cx<&JaFvOmV#rG(ykr$F^?}QcDM_dU7c_;V?DPO@ z2eL~_*__wF2Hp^Ca0Pwi*g&md1FL^8Hi*~72Di%xZXFx=uf_%@#RekL^(0|{*#9jy z@LI5e)rk#G(<7|J%Dz4}gbgC-*l*DqYI^nrW2k|B8!O$<`8DIDWy?ySE-Hrb$(D*g zSr%T4i9Mo9hG9b%mHHcDL%;(wlPSf9nD-in4Fq{zY~TvmVAqVuupwH3AjgLC z{((Z-Q7hOGxlBb$l=9SAeXxHaBMlz^1j3X>Aa<@eY(o;#WxCe%QfU(?xT&p%uk&M; zgsb_4)?38qBbEb!bO8?UHYB*M?Qm;5@k&swF!bY?e28Zc=ui1Jl58fyZG6tHm*;&o zlAwNRXM+|4LzR|JesS+W;HRvL1y2>rHH;yEiHrg|#2FQ11Gk0^_9A~c(J*WvwP2&R zHH`lb*ud(*hN4=CY~C7F2+Hf z9`s)u8%pkIIX2MO#RhmZRE7=oH^2t2hz(0ErGD7pm1H?KB)dQT&e#zBEuYyyY!Ftl z!BvFP^E4bAI9AK-QmwpEe;Q7NN zqLjB4my=6|D@&uE&>DTiVmzGSA}pNLQWVKKmI({((b9=+&HpSJvgwhR!6`-QbtEOM zpRy8Y&kDPxn^;6!?eWN$zGlK=_cKDWCk*QbQQ8zvw*Q0D0#LrrLHRX?@RU$LM=;7t z1Fdk;gqJYT3rK%p(2lXQ8X|-UIN^dwFkxXo2YZn}rxtABIDB6ZA;$)eTi-DQL)02W zWL9*D0j+g(vlc%iJs-6;H-RFQb3j5=q`yu>aM)l&eFgdLv0=H-jBKj}%joDjv7xxf zp!kA>WHJgFi z+{MKWh`Y1F-PsAQY8R=0n8rCczNjS7NZ8wHyb?<@(!+ElXdj)Me}tzqDP3uZvsQtn z?}fMF2ugqJVsvoO;anTSv72&qHW&f_X$>I>MWw;MdRQ{Kbz>P~&rgxy(s+1Wv~8O- zNS^Hlw9{MT=;-S1V)Sq^7@eFPG!)5?%VPUQV#}!2jAsWCIeDaxao#1>Mpj zUEoeZ;?Nq#VB!^G76Tj@)U*Kh!$`d|0D!^S6@Y)iKpz;LU0f+l2(%FSUzEJtRrjPmINR{h*Fuq=T!IqgL>&;gr_VRj*$knI%b0EqD`Ek?Le9R)M zqI`0D6t=BM$!U|ETauDrmJk!}tRbCz!c5*S&~u^jj40{=XpmJiP`VB1R#2F)l&kLI zeV7RX)tT~o!h7YGz-_V&q=Y-FTHA@Q zCfibphBv|r0zaAfEmCU?%50mO*Cw^7Q(pUSnT2I3uz@m+B!a47#egT^^(dTvNLUGK zgo`AhpGoMNYObF$zf#U704HbG3BiAbN6;1!w`(7cb3L5dR}DuXdA3WB@gxLP&S+6O?lxQYSXJpF}i>u|eAirXsyFJ7;GEXbBDT7HRlu zY6N%i4Dd2Kz~-SmA__Z1o3wzVKy?#(gGXRwKzOvt&s$Hb8Skqs+E+R=CDMo08t<$w z+3EgTl779jMhDCQ*o9Q6#?^n&kBH?{;t)pkKr-v&+JDz`qXcnsuNkZqD zl2KkBW-@B^4mxLdgS!hwFdRrYcm(=|#RPhD3hO$Uc-2>alKcdmr)NX5EukrL8g#s_~#)Z z24@}94Jfw&|L|CF1^)m)CmjjLB$dvWra|y{K*fbp56_R<4l{owRpev^63kczGAWOs zl=7G`69uc6MjE(#Sd_P?fx^H@LK$fq)WP~9bVfh#U;ytZzu;hls~$s{F_GmV#LE1v zI6_$z=7%Bmzy=?MYq|BMa4GKg3?-^Xv?nm3S{TIT3~BkK+~W%ISR!DcG8$y|(Ub57 zzhF$fw;hV1;w677*0wf8P)n_q=M79b<_%{(hHRueilRIN)E^s69Wup%5t1mkoDaT5 ziKf9652R&l`dvyY6kb#7lin^X$xj3LS3}dFpB{3cgLiOpL40aPSX^3MUU__600lQ{ zWJ@9TmZ0noMv}JyV&Jk_U9wU<)vfHHR%2&R@AZn3#>jt|ytYYcnGp%;F`1>Ag#`fy zLS;vKCYENV2J7Hx=@DJhH7zYUBswW5z|WCn$7xKuJCo&PIw&9M=o?wsE-J(WS3v}+ zGyw^vonlN{pxJ5Mg5nBGgS{xw8E}`Nh|J=+q|~sujQG6Ls4y>5=M|pQHZsJMKkAf#LgoVZ>hsCBuXO<-=$GVW9o-pT-w3Phfn8ehugfu@_LXDCx z!Rd*4ZDJGCA`(;m-5pRw4`?tuKRY}wEi$bzB`<%^-^&>nV@(vU%DMr0VZ!p$4pV56$nGo(Y? z9+*tipjt&3B4cxkV-r)t60#HWib4b3QG1f1K|KYk#KAASLsnjPWI|e0dQoz2UVxVi zE(-b<^>|dWQcpqyoUT+aY>2i+k}O2Q6?cD0MbwCF0;oPZA!i+|Qxpo-X_ zcN7)74N(G>zAOY5gOIE|wA|E-k84IHAxPXL8^;^atzfY^55Kztw?T$%egUf$8>r}H zNzvFTaul-%G}tM(q%}rEEz8^LSi=RfrP_1uPXK=5?tRf)EIXM9)BaS%wXSB;q z4t3ON2@)t;QHh1cfkpzr*CW0-EjdUFcj@+sDFNK2Ls5eF_0kn+8IOdET&y(GC}*$e zHmRv`&J;wEHYh*4O@^Ber%lzsn7n`DATLUV=zUX4lVbyDH3ZlDB&QYSdFUOy;|h{u zL-e>kW=zg(+dU^YTB}AW7yoGRS8&cqwxy(KlSw{Cf)+yO?w?wg*`_2WHqz*<#Tc8L zaE~bJ6c^xxfFS{M@k=U-j|$Y{j1B|sTEZzHrm#H3gRpCj89-M}i*VG^{wseBB^>=? z3)@Box<}pTN;wAqDz(Nd zHmNYr$5jt$kno5s>J;PWh^g!m!Vr|&CO+Jx!F2vPozmmIH3WRi0|391e_~P&U`Q>f zQP-%_+_GGQp2R7=Avi5HC&Pck30~DFts*1dhXN?jc}5hrj|p-nNlNP$7GKyl(&WZ& z77xv3!pRh$n3L_}N~%>X4H6l zKP?zvonzA5cFlh-rYp0sBCDcjR${mVp+X%^!O3~a1#MIF%QB1Gg!*diT0t62O$LfF z3udinYI;GghgR?ts?08ps~QPW>(Y#??j z(laKhAlKVP3#bosj?Jj(n#De0yX75)i)9L&)_At^K2=zt-r z)|f|jPI;ai2DM(TM|ga0j*ly5-L+Ggh`d;9u(FcJ_O zo7*lr*b9Hx_{SA?%x+V`RCq>7*POf@FCA%!&Pz)PbI?E<3@Yf76y`)b4iSw{OkzQv zkGlhIEo7sXRm^z(u~FN$&~h8RAqll=yz|;&{jnjC2E!XD|H*p`thf!hhY=K5)~!q% z@^ao_966}+Bna#GVEoWbY6vzM-ryXA2ony$YzTjgt4SYV6sP%;YLtDA85kJU6r{lf zUl>ZZNu|jNQAUHo$<^TG20mSNl-xfjcaI8s8bp>CFp5)s;fh6O>;})P z4U8{p7vZ62W{OFtz}Wm^=o_>n-GMfk6sUo_)dHiqQ;d&Br4sf?k}Y1Y%@M8l3QjMJ z3H5)`8e&q4+n7Kf2jdAvLT!+tL9Hn|uU&jZfQ!N1*Y^nP!YwQ=C)eBP8=6xT z=;~_9?G*3t;ucYqloU)sCm|sYz?Zz0Qh5KMbWdPl{dpy%w5bU5)Z?xR8RhN5ecT*e zjZSV*9P|{bF+~@2NJ)$^7~NfbBjSq6!c2c!J3E}F!4T-bf~W=hYG!(VwueT|O;dp? zaRAz2YNQKYIT~X~MsiA=E2S1DvIH+Tii=(aA#4c*YG0+|wLt;})RdG_UJ>T)=EP3! z8=axEPX}o*+Q6*Jhx!|!!K@T_7~`ZujTt%R1x5<=5KQX)EBNwM>e0O@uZ zZ4?KRjC}>NHJ(8!<~L;kam>y`XnU8Sw=xCvtlid$~xBMT0{}CwlHE98we_U zi6$3Ph1Evr^6+mfJKxmC8|=b5T>7?`T9!{*!3N5$DHcM)xL_uXKq#LqK!YX{LAfb> zjQ0POXC#_5Ks(iXMFOKZK(9vhKC$^3nK7;oghGf4`xXyIr|G<>|n1sUg zyd)P5p${p^%1a8*EDbm507if0AQy+!GB58F+&=tkOi@(p7oFcJF~9}a`6ZNfP6%-n zmB#lwX{fko;LY0#a5Yd3Ws;eZBBfD;j|Z+g4*IAD$98V7GcgV6yFbU2e6 zLxWmxphFgVz^PnH?-3D8{}rOr`2iY?^C6{csl+pY7IT823JD{m!C(^Q_MX>z1*ewB zg!zz!F`}SjIxs3k>tlaVMCSo$Fg3yvj4^~8LxXgWA)JF#)AG}dE*eV@7m8We2}L-x z1`H`S_&2HH%zB+#Rbz4sX69%3`33oy z{G0(|QDLuIOuT=rL;MOxZv~@o(B02BiY)6 zeJuq2$t~hlsR0cp0~&-LF_1|bV@k71N+ZKUyiCFVA%XO~xy~;K(4Y|(n0_k~LxVsY zq-iiSr)_^BPlNHfG@;Qnm=W&{EkWWy!w-0D#(j_c2y|^II$AtjZR?sy&KQn(YIM_QZDX|cS*=Q*YlP#jcgjb;O z+jFt=sKTCA^~8oKy?H{}`_oRpW8Tb7z%l8~0_Yji*vFSnX>2~3L3E(Q6CDRF-W zCoN(RG|=EMrYhh>aIA+5Zf}P<1t&*G`BFIVUQwf@lV@aR0=#B%WPkxW9FhuwmZh?@ zw^!j#zA=%Jp$>Fp4V-SFV*n5!pp{kd6H(bCOb);U2Mo2H9k_dBN|M2mVm&`7We84* z%PFIuFxt(LP^(Cfgo2o0C)!5?9|V8aTYRLe9z|4ksB>Imc8W6&Lm5d|Q)ptMyEAHU zj~iohV#AEEktnx-l-wXs4Rq8Xj;8pWNHF3cfUBaTvp_wRCFd5$#Dux%arme@zu=VO zxKI}eF&bZTN0eo_lp1%5%1Mm(CHNo=%3zAl4hit0X#L*NHzq2h1h#T!rayn6L16Cb zJpJMe5@LJ^XcTwN%F2kzDof2RhzRx5Q5J7{#p)yV$3`tXLr4shPV z3lvb+D~rM+BHZ(F)r)^Hf5Nz)q5m3XCll#;7TOVnLR>LbL>HO`8>|X@M7HWcaxBF^ z9MNFisS$4PeL5bU1`U(L;}=pjT`>raO8Ctwu%Js~h}N!kD_Hq3US6_j3B`q%S0f74 z$8B058-tsG1G|9J>-8dP{am3t-#xo!ko8= zHxw6#N}^?yHV9YR{$2J4H@R1WpWhbM5?UuVPzeFj@fy5}%WApOMMBc0h>BiTNfYpX zPFWBXCf>N5;P)#=*)8%#jV@XrE!$X9HWP(d#AJ#hqr^KpGBaSpkP1Fkpl1Q@L73Su zHuO>)eF=vbAqRh`gQ$Ew&QBSfE-6i$x?a)outju-dVKiLoKst4Haz1q3$^^RG{k`?u@FhUJuKUD!a? z0ye+^;22cgBQ;D9N1u9OL#FGX4ZsF!i4D{WHqhS<8+d$N8=`$AXI3tn)^yTb%}=hkXs z!v3^eEHwWT5v#8wuXEpZUXkIZ#BqLII4%U+(*2BUX8zp*^u|`A{n%Nz4<-`Ss{cpP z{6S>Kj;Mcen1~ZrtCy{9Lb%1>!b${KLE_j0>E^?dfH9FR#4dB=+a1mTsuA(d_?GXB zWnDv-d%e{g8>rHb0Ag$quZa!ZIyUMQqAqM`oJ}DfZWOC!@YrCF>xm8g&0s@_479`s zAMz|L2YC%_us^;QHsmW;aYbxkzYZHjgRz0tjSYXngcn=)lC7L2)-@lA$@^TDqLakU z#cpgSejS)(KXYC?l{bv&GMvgKERPcVM$|}Mdn=*zXoiYMWYN&fuKH)T{bnDSo-JT% zLCw8JfZ63w%`g=gXfOIoJCa4d@mhpeL~9YN#X*(2fO12K;mvq`B#CkRpp1uyjUeT6 zL~eg!Wo)2t1RJOv8%XWgK$Wn8{+8GPMYm^`5=*dw)(ab=D>ob)>R*QqP){2d$ZwP-I zO*VNrW;2peBY;87Pg8jFEpfejkeir5f0qqIF6OH0()T8k@Vqp9VY zV$!G`8xL&BmTbwE{@BTEOSWW7wq#4P^s4&7-P^Zr+_?Ab)vvnDi>HqsJ$_aL4qrUH zbL%=xH}5@qPG7VJ{Pv{!#VcEF+fsl1Q_b^-cW>XgapU%bY8!HF>99kKu;8Utqsu!F*nABfANv|cV%yu>|js~CIJ+*&(?V_K4 zTD_cfyO+ zJh@-ZT(51VH%c#;!TTzV16rHeLZOAi3iUmXWV~Uo}ZXEdcw$I zQ#K!&;`$Gt1vcc^(wj@K?o=(wbo7}D*~|Q*`uPjmV<*sH_1S5?(zAQ72IP2uX2_S3 zv+q1RJAnF!SHGqEPhEwo;N4|u9*%(-9S02`(JQgVhn~}chIf72tkQ(^pMK%*a%1&( z!+Uki2#;#N>N;!UOi6zZDVek9;Y(W+*pj*C>7661W_~w$%2b#pfA{^0^N*w+ldC^v zB^8YyKd^oOA&Q;t=4Sm&1r)VFK%jQ(DvK`zdX73_-Qrt{%uY9%xUUFW*DCH zb#_v_*#LfL`nrF$$Xj;*`J?N%;W?K#e3u!X_|wTf?E`~4FRWs~di=y)$Z-c3cgaYc zc#P5eP9C{NkL=Hm_BMVVKIJCk>ggRGGjQdRr?xpiTcYC%Zk|0-S$T*~m6eCj++Kj^Bd%S#{-L*Uvs~ zaG!*W}kojr9SJYy(pa`>^wHsILO{{zhKn>nQGSL3U!m@Y@gbu1k*_uOM!McI-q+0uV*x_4^R zwrwYGD1`>Ty0vq|w!>%c*hX|)vL#!xC0nv3Te2lvvL&D&|K@*SOSWW7{|4#i_8*p= zqJv&v-Z`}PhmnH@jbB>%@TEnEesp5l%u#~|3><$rXz__%c~n^jT<>;{Jgz)%`fjCUNwEh;KAQaoVWkVWAn=!+vZIi zGGM@GFg6E)jfj|I*rNpi)-XUTWN1`ZxGcgxj>^aY=vUp4ice*FiJ|6#*bIE!^}@9NFRuipCuEh>9AGE z_v+J2Usa!4T4Dcj%lPig0S#{YIwdT>+c!fyMHynIov%K(W?-Cue9z%SOJm}@Ejakp zT)nn)phsed{(}a8JMpIzFrxFxroMmKd1E)+uKt4n=*594T@o|f^dHha#wBFL(Wka9 zWlL|&7<>8j$n?DMq@03+!t(Nrlx{y>ynB3Le(#;2C%=5OZ*tp#Yp)(%Kch!sX^#$B zQJDj`-+Xp`Nkwco_I%*Nr1z%j8(K9Qj_cFkG7l(S-<*#{gWl`Jo0Y|}4fSv|^z2FGf zv7avvY7w^dzWMRRjXh&MP`l<1{%P&UuDt@(vD0%a62e2nqYC;hzHT;O-#xEOT1042 zU|jp}s~!PGX_4_C+VYNR!Qp=yLlz!=Wq!1J(!d2CG#cwa-a?A3f1do{!BW2Z@Ht4|ElwMgF&GS18|OwO6PZgI9p z#OVES9mA%ArewGM$Ch;riX3_iXtMJQT~kLNyIFT^?~`lW`X@!Dw#k1k>a)7$<>q9^ z(D8?%p1D51nYQz`jblRm%QitqpOa@Sn0e{UOz&o)3-5A@Z4EtSoE;w!{?(2vkNyw_ z^0Nay5@LJKI{^+WJJ`1@+iUB*w)Dnm@WsQ8J#~iSNrTEG^1JrSOzZXY-i2W;gBIO* zZhn66=eFADDOH;$lz4xIl&?HB>1@MQ4vW`QYy5V@FP1zIo~Aa^J|QRWuzjbnI zj=n`J75zHB)-CYVRli6#IJ&+lH>G%F?-ZBd{u`$l|L!)+7HnlpZ;%GJ^z%%fv}^9D zP6MW_>{rnFr!BL>?ZOrV8hmkYReQ(ysZ|@k>(!>y6rk!{9~a`#W9yM&PR>J5on28F zTD0`%S;K#N4PAV4=k&Z_cNaHT;^VimuZ~GF`I9W)P0$? zgYK{Q_I=YXp<>9Qtw(>ku`=-!#}R<{Ufex8)c>yz;u4F zdq8=5&uLK8d@v^rDO^u0n$N1%4T%nDv-axkZ9~%hN~fHpcatzbt?X`4WzA(=k*}UT zdGhf3?!G>F?CeW-Rs?_UI{wU!BYW1(?NX9Eq+f|=P^Z*L- z!}XKLM@O|!E*!ibFz7F%ebgnJAPs&Rv;}hC-ofoMdrUbDmCzqTk-~M*+$niF zyj76q1MjU^a)z7V|zMsdexVfjT3he^dLZ4pTHY;!9>~YcF z8FLR`2TyQp0Nyfv?cR9>fk~5rvRl2TopaRC16Lv4)>PlSedn>Fs&-_6?*0Gzt#$LFgD>HpW=nqu2848C zmVn>*Ho(1N)!F|58hn2J@W`-F{`{A}{tcx6diT%&@LPCUs!>1KR2G*yeCaVz2bV_a zKZ#psn=7}aH>(Y%OxZJUbhp8P2J_p^-nO!nlUtvizudom;47!kVrHHJG+5RJ(%_8= zA-b-cj|_Em8GicQ%94mSKLdXn?9(PLIJwJ@+b%qLaq`>eJxS)=KN zCr=l}q8_6T@f`BG@;SiK?1-l5yN3lHwzx_D~;o~;{3_Q-$lI&N>Z`PwA^ zPe0FF4`|ToosUb_-nzAWMsaHT`0cPm-JczzE?5g`u;%fhpNidm+V8wyeQaWuWAxCY zH!gi2(+n$Lef!D%J9qCtxqt1%;T;Fh+k&)QVgR{b~T z4bIK)y&81#G2w>fN!zbq+u4z5UbOAGx%$q9lNaw@+tDk;J!A6DXEjGlamT*9uHQMg zV_B=$)U6LCq29)*Rx_$ZgxZ-^ebOgwrYY!`l^w#}2!x0pumu+I*{!V;3td{Za7gI4 z{UW2rJX@9eCEjjltvb-v529c5r`8j3Y_vU6a0A#KZzU-}#ka#+YL_|0q+%<~utFXZca~s(>!b@7cPpE&U&P zZ|Zs8g`J~pk;-yTz=YH=6B!b@A&Hd_g~0Qc*p$S zTaSeczDHm1E%RUAdJ2E~^JAF*uKC?RKdDCznBV&gxc(zr!1FwTcYg;QJpJ=u%yiM7 zz59Xr&+G}XfN#I^5+48A{Qh5_DO^x^_?mzB|7xbI;wi}d;IHOC!>c`i_x&27ZX4D7 z1=j5Y`r(jN{L^XlDqUkE3>V}AcFw#eK?!~)KL3I6a; z>>a_^7w^7TBW@IM$G^M{?pXcyyG%*Vf0Z=KlRv!!ssfh%z4u?yS1`Z-t{4*4@4SC+ zep{%+I_sRN$ye{c_k#NhTKQ!o;R)eQLCgNRQT>r@fm;S1@0j0t>uICczm84*{RJ={ z^BF-OfuhsFeT z+`DIC=I5Hp2d;s8G3S`?J~rI)`=k|N2d_!Z2$4g=N9x%bW7fL<<_1KL19G`u3o#a(EnrCvgOb2-Fk4c^3?Jf z{j(E>e}DM-`c7^wLgwwe2v@5^g@M`-^iZTh*VTc?z|yANMfWxjLj(8hnNM@!>WSf5{R zU*Fru$LQ0m>ZYv7x1OKh@r~=38Q<k^_nk zT)VM3-w@R9r$-l;Cj5(>eexc>&aGSKhqsOoN{PuEap}sDZ^@=@=2cZ6njGKKf5X+M z^a;1kPp+*`Ry$`+zjJ^6=JRv=_OCnf>h5i;bq?-$_vY=LTTbnmli$i=%;qzo0v{h+ z)(&aau0W4RXqkR`|#n}Zj`CdKJ)!rE@f3-Tt0d6=q2-mD|`E-#H4?<|J1G8 zU|^H~&tiV|tU5K7XF`SspMUVd?0^0J{ibf+e}v06t}pH2)bxLgFTQB(Q8a_z*WlLX z32mHOeewCH&4Y*St**H+Sl6oSar2!W6Vt;IryhR(s%mbYH`?U$kDE9aEWh^b!qPmV z@t6Pn+do^N`lunxF3|BK7sj~Qw_&1!?=2l#k=bti1#oy}B>s8in%k%P5{*j_S@T{# z+BY@mlP}{tbQ^zjx@uBTM6aDy>tnvqkG&wBB0W3O$FFqxQF<%a$2)Uc;=^TctJsn9 zKe}%&*T8U@os)t-`y#GmuSw@ljx|LM-u6?<7y3cl=I5%_S?lWa!n4cYnGBipj^1MD zcc0(gG$ztFYd(w?+}+I~p#Q;x6CD1>djUUzaeGsbHaUNNdUpDMO^S90K5E|S6EPukzjE^-#w#?1O zwZ&VNmZg8)JJ?^}Dp~ZRuB!vw9ZJ?*WMdScUS2pbD!O7twb}e?OB;LdVP|iy4gQyI zns{RD*{*g`XMPO&^7#G>nAIM?R>sF(a^}3;{~YeutRsjZLe%> z@8UT~9*}T$FoAacb?-2Kw0U4=Xz7SbTV&#YbgF;O$$9kl+hQ67U#oNTA%8r3Wqz_U zsEOOC(|}~IjtyxRIpfC7wco@><}8HRsy=t--m6y^25Xz8PoGif8}RL3&@B$Mk4);f z=n&{k=fCr89Q8Bg&0TXlX0%x^tO~83@AFac&rewz9M(3qc=)l$PxlS={n(-Z=_ge^ zTQq-a^tVqw`S8PLrsAKDJ(tnoo~cnr{~m*ecAq@GUvNzCou@Y?fARPCKm7QUk3arG z?cQzGgND-J_DL~bf!+EJ={;j+Z@<_f+ZN<}`QexUdix!hVW;ak8NR5U_h*fQU42G})^ClK%kA+k2 z7X=!8erHFy=5PN(1B?58zw>g=W}9+-<^qvNz$-Zts;f!5_T!?*Dx9$wwbG zc8L0RJG}M1`57O-qyFYF z6v@i;RX0O@yUg0nEQmDM>`nVpJ6V4zAmPLy(-$9q^2w*4e)`GB|NI!u9lX?n=U!ae z{hh~uH)_-}blm2vwpA*BG#ada@7*mrr>>Ki?Y~-MKHkmVvES*ZHRhUUm6Lp&vRADA zzE@tw*b5@vrN8=5?|jb6=E%@QYBlFACy@_TW&RW$5cTbKq<;__ZeBm@z7A(>b8r(J^D!BN^`QMEgSZbo8hHqbx`N_Y0Mz5O?(!z20(YiOuVmipv zi~AOi?-J1XzXL`e+%U|?w{(9i%&i*g=G|%Cl7cUrNhczmoU=G5uH)m1?sI?k1hU{`0h zi8i$Q)NjOYz==Q`3{pjH7npy94ozKo_4R4+%xu#?zKmT5DtXsX|IniO2N{m9>Z)$t z{e;3_KEHqM5|=Jsx^nBj)&1IkPE0QL&*;1Tsx2b(k41xz|MK3oP(!aIZ?BHCFCPC^ zixzEzn0m6lm)_WU=iVRtq~-QIL@!o&0bk#FaS-)s(%j1F#lES-_rJV3KQXN6$3ss< z98q(5^NjN3{8hs0_s2hYeHzJbV0CZF(02LVW(Zvp&>-Hp^k6MC7~xfaxbg1cd0i7e zdq>lK&lzA8J5Ib-D-E_HN8gm5urK{1{V14MbARiE2>-GzcMkl}DgLu}9QyB=4~*hr zS3w^eAC9{Bs$`aB+&i{v>6)rLPhKfK(wztF+KoHYoj&rNvtwS4Z`_32pl(-|=_9{6 zc4leB=Xn2vEJ3}zytZ3^VaDJk*J}3n)v04=9Jkni=HeJn&vrY&-#=cTi<8|qUq3J_ zqxr{FU_@ky(-$9wjz7JBkhYcHA!Fs4wV91^pVG-R#a|F;u%`O%ZH7_qtZb83FlpLA zf2YJBPQnJ**~Ly>xarV}-eE!IJLy(>_S{^vBkg1D$Xn)`J;OqObU}lUTWk#W;M8}f zmOejTr!_2S#$W31?pVHwSF>*aJR&(Pe-?nr!})3IhzXbPtPB27KTEXV!G-yq{8NS= zKK?@l7BcBXb@ipWLH6OBgx~k%;`+{On6awn@k4sC(W497R6;SXL){kS=F`0KlAomqrrze#``&> zu7zZg+N#k9ncL2+3;+A4!QF;_JN%nr-%eP_?EidvsEaXw@ge$+pO3aB{P+95-A0Wb zF>LTRQ??v`J+XVu;;}{l%idQ9RF$oLbKh^$nX$W@kTfXi?(XhRX%M8lTT(Gh;8qPTTSlXrJw$1Q4c&cxJbXf5XC|5|i&#d1c^fLsDK9WOG<|Ra zM}5fdD`)kA-1BUbL0~QwL^V!wTK$623AC)6MfWghd zL`$Q8Cmy~&PKF91YR;A8Q;GTl0$SEyo|a5fdKqVitEr^-mzEyJfp6MDl`l?dGjEH_e$*gY^ zkkq%n)Z`$$e*ajmw#2_G99aVM z>7bw^$sSIA;V-Lp+1;g*7q6-(hH`@fa%YgpmEoM|=-M5Hz&kJqU+PE1t4&Gau8#KLvO75WN0+UjHhT)A-ED2$pBGK619!z_inlAc z>KtEy{l$y$mzG`{^`Yl~_v@Vb$E2f2E)I2f^p1XeC3e(6h>>ggfra;=eG?3VmSQEP zzx#Jl+l!F(FRGol`s)i`hKEJGY0sX&Dj)l2Rp3ER1`G(6HE&PRKWa*-X5q zX~GZ$`fm>iHq}%0DlFvfkRl?U=M8*^=!)80SlBqQ@E)}PWEk9kCn>|B+Z*fa8-KP< z=s(S5huGTKcss-O_4Und81frVFA}=G0Y&}=#~y`%LpR@B^Nnrz0h}DP0~kDL2koF8 zwEr>~R95~B+c8>_mQ>UP`9|4vC7A50Z0T1S-eAp68=FF*!_`D&*X!Pp93q6|izyEfMP&l*_=wLwS^5sX( zpVV8TV6*8aOqY%wJ%08EyGdj(0=-t@$whGG?8%e(!oIyQ&91U^odjFF5VL~FIh(;dsB2+@Xj9j<1&MJ)gCHLWdAD@>YL}zoIQQ* zp6H8#`Mf8$eKm3+J!h<#o=QK%=^xBnW@~;kUDAPoBZy z32a-R%ND(Va^DT~FY1kw;8%>U9gP#Z@zXEA9|zjWa}@H4`|&0ja^typ;R2;@!3G+= zF`C48EJ=$i|OKL9}fdV80Tb&x{>F(+6ADh9HG{_{-hh3!A;!mJBr7?P&CWXpl68LeS7kj{!EeN$V$JaHHYTwX2#K z10-T$VRmbyUW1(4G=CB}Rne?R$$UpwI%1?AGWcLzA1BARwyPA+k+=@8jwP8eQp-JG zMnmJwRdv0x-iJD9MF2OaQT@L5Y}oPIX>p9tG_W~Cv#Z0w8bWf;*#P|INnOUaZ2Itj z97AFl2?U<^VSaF_yLWmz-}x@q&oocsM$m(H_tY^;; zk_@`^jM?G-&Yw3?B#ZOV3p9fFy_6GEkEt7Z$xAGj^N!E@KFm`64m@nW)jP9B!q=8C z3q0^lk44g=Y_PwgZV2;L>!a&`h~~Y2ynRkmdke% z*LN0}XRTSy<>nF5h^`-hu1hjy z!M%QskdjwO`bpk661ALVz;K_Albcu6$U7Y%r>+;~yiD{g%+zEwaxnuiG;F>sM2nS% zj+vQN+%|0rwir%}t6DiXoaZgaDdbbVFkAmZgPV$up5_6WfOqu*dNCFk>kkf9Z6$Fb z8I#cV;kpPHHOf;<*gNjxs z9}EFT&%dHRO&wmAqQ%7P{%3q^liGPaP0vS^H<-OJv1$u377DylMlUjd^RhEC%la_x zGTU=G9&D^S#rslx4mjVvDG*dp*V#V_vSE;1J!x^5B(Tm2vViXolE4pK#nE%G1RnC) zy~t_k7y?;EXoReKAtA7jCVR#wGw4$xLu&}Is6ueBcoOM-A+!8b59&Iz?{xajihhmRa!%lFO=&WK5k!_nZSIQ{g&1xn+H)a;C8R|R5H)iU6- zPCp}E@1(gm@|Gp;Y4Mnj8OR!l2^%F!%!2Mk;E`%JzIs8mW@S7_g_1U)7xP=|z=gjY z!ElRCTZ#S-TWBAD$Zmw2%P81n1HU!xM|(jceGQUCdF0*;;CQdqIcSJjC4y%C5tP(sC&Iw}08g3)+$3C@m-`E+wO^?^!fFSL8@Zqg@St zGaA4^rn%|+R`gr(%QoL|*XS6h=Ynw1ZKgKl?A+1%%dtP{gU7-eJs z^oefPK6B^-!9AP@YC9#?A@No+B={77+Uk!uk2DP}T{kUi*3&L@tk( zT1&B0G4Ps3R6=&A4XqE5pyG4w-et#74X(00rq72q(TFn9!{>SR40ToIB*c`g^2fJ^ zGF+wj_{4=ds2P=>cdUIi46an$iAukiM)#*^amz%1y_vwolY93b*Dvk$`12=*I@*|~ zrLAutm<{=0i3@m+-}Np_)Rxh3bF~!F@NPfAmhTz{w|@Dh?jC`Hj){N4$VRo=1$;%{ z&=8=7MnTN7z`V>PmjS8p9L*^C|Y0n9OK_nY(zGkvU zfo;G;u{`AJx#Os}%E^K-bxGBX4>J2hhl0cjM8c-Opc&kiY-hUa@_Zz&5@;5b2eZ+t z@4nh^Zfq;UyN$nEe`=_(N`R7hZ~81;q8!I>FWM2vcX_ zd6fQ^pWm#v5Er+JYXbN#RK3daBRo04zqWgPG+0z^gY;zO+%tzkc>8%;iI~P^&qAqJ6 zvkNzz5rAyikYZH0u52?H{sx;UJz%VXDg(WR!=tyzP-vXYU1k^vn5Ne`-vGMVd;B#J|~y(YjE1m-e)R!P8_MkI0)if8>P z>OpGb4CG~_F$rK$t0O}@pDijIlanyYa(ndaJ^eYMMcz; zduL;Li3Ab`-}BFzt8g>a4lV43?gIv)i$fEb87$`7GI4994?suaO@)=5OW%nef)scN zOX#OzB1+Ip@pNZcG63>_f%W^UFsa!Es0#_$r-Ms8<$334hQvK#aI?~!Q_!hzPX%v( zNoq<;QrvS#EqcO-x&;F}3~9F-K8=6R9_iIK2dmN&Vq;@sW5NH#Wfr%8XcdAaFdlyp z1-v?vp~1=KUJE_ImhW3Pc<502#k1ICT$XVS>u7jegbouq86_2eB_*S0rcAYp?(VpOD*R21ZNvet0`dJQF8^U#n}k`oits;7-3(D23D=LRff_sPf} z@;y$Pgh2xDo|7zDMZ>3)OzEj)Lt9%?^|;CI-y_0*AQsZNgkDM_|Mem(A2ZoqQa=5V zPK>xR6R&=kgp!$mO~Aemb9iQ}oQ+hRQ!wcdCtk`i-ov|tkBdXds^r~_d44m`nDDMt zatCA&CI#9V{D}WPAt4DdJ_(h0X!{mozS&2P0_Qe1_FZ1rY~ZX9YM;gW@d_Rx0X`l9 zxy=IXMO;u8>)5R))UJt>|;FV#dSGT$S>yN&ZuHD&lCE9F+RhbqTiLZZ9G z1os)_qnk&6GF{o&^eTa)8zOWK>y%kTs=&Xnj$jiL-=*R)39s9Rb=rv#96frGfS3UH z4u!_czU}p%V0mg_&Uc8Yl)V6Xa5IwbD$C3McVQ6P6v9i*>XtQv+y@LUR9eyE0V|G! zO~7dMtbSuQndj;cSbtn5AR;8ZN2{9z+$pm!OvHqL^g@PrttH!a-jbw5_wGG-z^dR< zzqHj6`q`UcxroST`Ro|#|SM4*tHka>)S8GLX7 zvW`H))|ckNuNPKfz{g8TG#3Plm(~|%=a$x?Z}jQwkh$5}x!o55k+d|(+SDOx6tpaF z0-a9*ZF+WbZRcxPiIswqOZ?d0p%3tl=YTc~Sp!E5n!h1H7t{00TcEcDVs#$V zA=qXXmNz~)*C@o+(%dxogEMo>8@n^XOc3k3$YSLPoR=J{VDC_$^y^<@PjiDU`fFxhOR=uG0iT2 z?irZ_-&tXx%`L9MQK;?prKMGH>cB?M%&)<>mw~~8-2rx?fW>GibnBeBM zMR18`7go36pbW4$zqIx4Pr+NC*{bO}HLiTdQq0ZbUAcqNz<7b-PJ#=xxB*21o49~k zKyX#3XBNRFM{KSxFRyJO|D5zHhDv6CA*6jh2S*4})%@z#K~}Es9|r$#-KUolsm=?1(QyPh z+nkwS+&jNFy`hjuB|p*H4c zAn)s2kSkODL&FfzK)BjdU7VADot=|g+%mkcnm)*tvBt83yxg4p(#CPn^bK1WYAnpk z%CG8}1J#+EeN|QcYo7}xSRHLH%E`{jE2`_6SO;w%(=8Q6c{zENU2~Y%P}@smjiq_n zSvln$Gh2&Y<+URib__A!UtixjIzHT4oSg*>IXf$}pmBV-CNC2heok(GUS4))W?tRE z%+{CU7@#wqWqCO{dHLmyyu*=2rI1&UaQ+_V4J>5X;j8?XB%SUG)V(_rMZWcFe=jFi1yL119m`#&ld2VJ_Zbj3;8t5S~*-}*k>|#-E-!iBxM6Aztl@^pV z^-SzPeH#j~Ib2&*+cAwH$Mu2Mp1F;0&!&c08LTeI%`dI#pW8lv0G96^2EhWIYU-bP zWjHk?AgTNli1S5oTn->PCsF)$$$Tqq^!(f36-A*P@h&=#{hGl+^abcENlJ)|3i9xZ zn&vNjv9sxPM@=CCVQEjof$w=`t(8|V)pwMfB@wPIYyrPog!ZMDf)A^#mT(cfQ zqgPs^)wwxLBC~=_#IUas^GHZbiis$D6lL1Ti-_=3VITVKB9*X&qGNLH!sl-ZXs3@H zHUWqC<*3u3K8V;T z@zLey5s+7wbhX?T!gl2-u}}!c8DKtIS=cDK8;bn4 zleCy_$U@C6B`G2(XByFa;4kx?!{F90zf|A5t8MLnlin}_V!=##kgd6ishM+R83eiB zQyQ#HLqfzL@W{$JssT(&zucDKU~Fh)ZX23f2cE$B#%OnI69WUgs2U7%q1GpBBOHMb z%sdhsR?*8~Ofgsnawf~qDZYIJy**JF-UgTRHftJppPkr1x{1VDXk=y+_ zac+WtmroGNm^eForVL;%>*ZD-b4~l`E)a83(9IoQ1kt36drqV3OB0@rW+4@e?ZW^K z3Np90-V&!y%kDIZMz5u6kqWzY&3Ar2rg*JP_UtXI9k_+VplC>j2pN}e9e9#TG%nuO zuOF-S<)aZx$GE_4tfLXNO6Tr*4-O>jakJ@vJ!=CvpI9?BgMh*hc%||HE>6R`eeGGN z!Kt$v-Mh^7%I0#bvyzZb5IFPhC-~=N3qCx8qdpI*4QnwO!k;nx@xZ-rxWI*vSuqcD z_}5lY=y4x{i*mKVk}URys?%$SZp=ego?tT|#@$?)?v^ z!YNO)WP?=46$56q=A(F}#LG412OZPzle@NlVSEXxl_XVvVF_j9p*GhwIXjs%JvbYyFYh zoMI-yi3!n>Y0b+>NEq!M&FaC|W`d%|k*%|f^|5xc(wc#BFCTMLOGfr07UPM3uudpF zFU*N_*3vRbZXWGz%`m)olf@?T_3P{gOm_IymSkfknXvY^*Y=RFJU2Bp8HZ-%;1{KB zSc{ziB^kS{wco2c(5ARj=t@VUR*d0Syl5EoiU;dIA4Re~7|ML%Dw~G=v#ci2->lD( zoX((l5ELpQDa>a`y>em|7%?S(nRZ)~=J`u>%y&)_8&_dQ42idrzH@_snTL;?gG=*8 zKPG?0*96lorit9VMk8bD7h5azcD=R zt_YFjP>6ab4r0vi&UNEXBy>1mpM~qyP@lIFEj}>~KMy?t9+PwR@_e3uH1=B<6vYJ7 ziQ!+m&&b2e%P%D3TDqTd&L2dPpq7U7A90csKje85+wdpc%p1JADW&0ba5GYLJZ zm_Q@zRn8Hb2HUGj%4mA0cfmnlbZ;pRMm8qO2aGze$9I7L>tc%ggG7bx^2!smIN!z; zqwA#cIi3&g5sFu>tQ**OfGyuQ zH~8~U%?#{Gofrj2pDpegY(_yqeiLV>#GzKt1&_6-zNTC3*zSp)_NO|GE#sC{(!Kzk z=cP1BF6C#{pu^i_$b-}TIWvQaQj~%_RbUZt3`4?n^~#;|r|%elwgNpsdxFelbv!GP zV15sQ^XxAdA&JzdnDcABB3sTPHf?SW&o!lxq5)5eMsojn%nv zP7+LlVf|lL2(6B{W<2+`(iNk`rLr!aD0QZy(b|bA_Gh3|&-+qLF&eosT%Q%{YA(x3 z&!G`emv2qMWLh?V1aiKMS={G{ZIU8H8D(PLi7D1P^$WI?sRYRbU5q2pLX3r?u!?O) zbwf>6b<5cL*T)pYW;#n=_}S}7bJ4M>C6=Y>%e;*#mOX)O^LaR zvS3W{XsiGcgJV)vbxloeL*G378(Sai*TNubFj#=k4OpnY z6dhjK=r_NAIO9S=qF)KwgL7P-9_sJiX+6Dt!yi>-*e>8bao4ZAH#0Ui+1pG&!@J`E zTfTFl_}30{Tv2u=Y2VVhN{uTI-8!ab=72W8u)GdzKBC%HSKaw-Ofh;3GFX}zWFW!H zD(BiZkSHObm(n-~(E9pohU0XJV|_1#DCKJ2ktrj8Y0p2fjB#eZA^ZY@Ms)a^$QTE< zfM=sd_AFJ{+(IJFSsw8D^%ig7tKjyXm}0d*V~SDZMG=~k%4r{zZQ7nqF(Bo1+6l2k z!r_R|>3EQ^&CSi8V9Lu}@#RtcbaH7RKhfs!kj0{Av}r#v#RwR5ttVMuMa|F4n4U>H z8&gPsZu&XJS*DlO>5rJX?EgHBjVfpHt-IG|;uWyT^-6(>#h9t8JI24qPJ9f5CjnSB!CIE`uFY_S8OjPk^OkaumO;CGxWp+T?+sLM`Z{R^T+>r=+;_NOqFFr+c5`b zzNxBj5yK&s>XBZTO~wdV?e3H~G=Vkad$1|%{bestlH!bp-#n2d#nr{ zizk>FX1%*@610xOnl*0X^03i>0x7c9T29jTMIG=HkXKwsaP8Z=yeV%>RspPhv8S+v zUe+iimgl3G;^72o8d8&(#;tw8;O0b4{U~trAUmGv(eoP?O>LB$(UWR_r@jk7L$9m^ zWFkvlS{_~i$|0JO~2*-0=NJxw$f<2Hz@2g|eTT|X&SfZPiPm*W|KJR#G(CpUf8<6Zq!P{b2&Eti2eg; z`MzNgcIZ&-kw1>#7Y!z2EJb1t^)T$%B435XvW zmSaeCwaw2;%O(nABAJSnBE59v@R1`YZi+bM?`WA8k{?m98Ws)h<>w6V3)5r0dg{cf z6UVXHEUVVQGnr<^ap|{T&yp!7v;l}ZYDIGT=Rb}fJ9_kwW0%=AB0u0dVPgqW#Agp5 zK7Q)TT~+@gV1$T&)-aK~*G``}d0!<4!{crC<+*a;o%!RpG59yFU(t7z<)%GAbQg1HRaQo=O$PXLvD-9Lln1#yNfX zw-XO^lc&MpHE5y2`IC4$pjr;z<*i0_?3dq996Njho5#O-4UJeVaNxaqKMtIerXS z^W$f4Nj(RDR&naNrILnY(%bG9@+~MXojG?Em)8u;F}_^&RE+e-1%Pa542pJR$2Th9 zhru@ETc-t+KbLw9v04|aEg&EH#zbQFfIoO-;~Vp;&*qywICK0gHnmx75Apz6zH=B{ z`{4(qhQ{9JFwkiBS)1U$AHoI((}}i!+9Zeh1JMzG?`z{4(YH6}0j=<~bdE2B{4Ygz zqW*@?mS0K=dUtRB9}HkWTe!y)@Xo|QC+`V6G|F6h?x}9$zX_ng$J%F$S82mqvB3Ucb6|w34;$s_Qjcx5?d)80? zD^US|wY|PLK0Gu$vfGA-N2b^Qc6j}_E)&$&%;@kt10EiqUxob#9PRmBUkyoK8RzQ1 zrA`NOd!)=$oKxKHO(wvvUPI(mS#bws6MldR2Qc^_6HNCX65x(ln(Qh_OHF_Mrln_8 zjs0f_=pyE;Gt=J=I6XBjzj=5S_J6*gsQ*5H;yGylBp5_}cVvkAi%u)*?>*zFZ+jl~ zzp?IrDQx}oVCjp?^X2tJePxH=_s#SV;0BQ+&(w62mpi>OM?JX~z-vfj-z?;9;P z`rlv|2EG#%5#SM4f0EJFljNa)W*l9%0Cd>nqij_^-QuBRR|-yixjo#`=2`LJ zx5T(E7d|$7*7bgFn$4bquxGK2Gasr2wx-&n%_O;5#r*R-*LSqHBPk}5LZb4zp=F@e zXtOuZMORLQPf$Cs8rV`4e68`hxg- zMN(8;);T`)SLl`BzRM_J?0<{S^U!`XXFxGS3<(U?5$#1U-`EWaAW4vPx^+In5)_?890X zzdZtawc~}ZFrS$Ela!XFe;5p|{qO@yL-V~m2+^ID-TehoaI)N9Rm5{Q_jt1|jbLOy zNbj4F?!1hG>Y9Qe4I!Z?F$4QaQia^=O4DKBaHyG>U;j2$&2X56(v!r0;+DageWs5? zj&--R4=jSj2V3axuJ<87!jX^I_vN`9!gHVS$XnO7#dwAdgOli>|z?-;X4k6O?8#!m5n`vU7bx0%@qN3zg$sIt*okR zXs*h6D#EU?m@O}Aoqu0fhH3~`(=xc=Sl#Fe;UMA+u4>JH_0|(mawzYpkBNBs zx}dx?(?^7u(&6tbXY|QU{34mmKjo(o_Rg#-dZtLh;5UpM&GwO(P>U+gv*n~yN$f)+ z`fRE26{1RWBJE_v^^4bF1y<6crh$c($(ncX8rN+?Ckk|#=&jRB!yie@IwVY^7J_+6 zMSQcX3L+F9vILEPB8Sr5Wu>)Vl;k~OrBO{CLcx2isqmGeOS3|s$VeF$K+szYQw{#? zxYDW1`@_MN!IpwJSDrg$CaJBPU_rusU+uv;-tf3P2k?s@{r?H@M>)mEGGN zmQ+OQF=gp~W->}vWsCnP7=#@lcMfs4PO+qfH5xn=dauo2zUM*m9(7d%QSKEp*>jib~C#M2p zv*nd6vqH`eHwN#DQD(Y_e+TCdm3Gx8dTYGgf*t?njT?CMDzOdIAHn2CeX5rr!Kp(h zuiqo167gt%+J+7XNj$i93mcD=(m+-k= z5_{gz10sj#9CrccujNJ`D+8ZYj92!AKP{E@9#K+@FIi|GCpz4_r2z&7&o;zs@QNjU zDyVd^+(DNM`xLWB;m}5<)G3O{*~QoFmsyHFc&u7~@&t(&CW9zqsQ9Tgw^IK5tn^$W z{RQSkaEOrNCt6&%r zyscb)LI#WCbYE2k^E7~wT8iSkEtxvsZi9P8xfR@)YI{XNhvx};!cxA4Ae+}?d*`xZ z#Yl-EHKWrE=&tI-Dd|*Q;YW!rkq3s)tY_*Gvsx7;x~r(zWCHgnB!cUvgoY4Gs}v|<)~ z#OpqpWfv5+ziZ*WPq*7F@7&Vr0sb|bZ6G7=nY;K;g2DA4e%w}5883Eam$E6v#ENXS znBYC|#CXK5WP59}h*`J5(M?8Fv_5TrTZ2CLFL0+r;DZ@QD6!&H^{O3Nhhyr$4-bOjUW@f{M!I@oK^6k~kxi)zm+m=r4~8>;Ja_`S znXR>WnrhocG`|5=SoT{OM6cz!8ED!@O`y@;=A;jt8*0q&9r@$vaiASL^6L>ov-swT zMA>^98S}mFgg3x4?u)JQ0!Oj1em{Qn*F!k!u_LSRj}TJ&9P$Nu>JBCAnmAI6@4Q7LhPcqh;UHnJ9}F_n;)n;pq; zWy&_7wSG#ZJO)vohP2qHjvYIWX{QNUpJ3$J*$_>cT^OvCJVoS^(EY*zmNPW9kdQSF zvt~a}Y+Cf3`WVHthD3pTbY|8%d}^watP<9lQF1pa9Si&@kKD0;ObcbD5cCalR@9J} zW9Cqe@?bej6VjW-cbdpK$(8mlqn?$Sgh4QfHvkFVzGw3_>1)R9-@@ST60g-p8}f@j zY1!?hUFjBi;P4(o*F>n~?eiyh_V~#0OH7IZQy)mgIlN~{9Ag~lsW`L@9?4qo)JXdW z=?0;yTIlUu2|?|DxY}vZ?YG11&MpitXZTs_nMVP*KNrG%->hmnjqwD1Dsav>yK=4M zMSSW3=-7(mzb~FN@cxyxRqiOxq7~4w_@#>sKIq1B>5mHxp+mbL^aRP@qhMFJ^iF96 z6Dw@Zwgjj!kr3S_zH;~^ms|7n9!5}Dg$=j5Z{s9pr{ObyX%_tV35iK?uU?{-^K~+m zc1iB9vLIxQU0lxKA;4U?TOGa@y6?asJe&J145GK|gXA=9OS{We?{kLtuY$SV|7^f? zHWDPLMI!50*IM;%Tr=-Rt+phna|_3QD&-fX^s$zj->X<{G0T)t<`X;I;3cM<58(W3 zV9;1i<7v`=D|NxgX%WoFDFGPdId+Q4%+r92$GB!cnNDE2bf;Jgfxe*AnLgs8re)w* z=AW}Nn(x5iSPb2DfdcRrEDBIoGfwY^q2F7DouSW$XuN^JD#=rX?jswcovp1etvMu} z+gG~cR2lKF-Dc9!B|b)$L@(w#@`@XOWb|OvQ>%5x_ixIl?L*5n79%aG z`?3PORhu<$-Sq@$WveyKj88OR_o5weAf~WtU4jBEQFk~kk#t5`vYUp^yD*qWeTt(T zWGe@v?WMK68~YQCs3{p0OxzRdCIRLMg?xW{9mcosTeeR1Hg(OlgwT@k2820Fs@Z4t zLAFp4{ZSg#K~d z%xW(0InscM?U}*GY-ijFsX?A$Lva;yIA*W7~H6k zKZk7t;>l>PxrU0H?IUT|lz|#6BG$O2l`LL-B~TFs>-KxB=kTl*`Bo_AJ;#;%meTq? zv>w^2lHQStoq@xfo=}}XckwdNE?qc(eTmj3!dZ;=?#&yw@a_=coI7;argNz)S)EfL zdh*jSsHy0YIo9o^AR>4BH&P4?US!OKehvm@c$5p@w-(JO0YY&SMkp>YR#o=Po9uFv z7LvpMgB%o!Z?e4F+U|0fVUTq$-hof#a(_e9;NILJJdf@eRRX|b!zPm*`9v&#F(KfP z7i>%x)fl08B9RlDHw)Bj7WygbSU&SIVC$CPyH3vMFbux15T+$-5S$Bg>cg&g zF3MB`gIj9%R$@?(`m?rFrv)Ldano2T*Dcl<5c?+LWQ65Iie^w79d2Ai{Gr3|*sUOg z-CYxl8+)+(Q;G5tn$JqXo4H(n{u;>+45mL8l8)TP&=HUO_a9Y*`48aD-sE>x^DC2G zHM9c(7@P^_zyBzAZ7H4lC{6kXXuJut5LWd7L+%g@{lzgBPr8I*y7pq0DUi~=@7G77bm$ZD_f-l%RL*) zaZ@T|q22n8Ei4-grNKe(ivkNytEZTjdM!bJsL7o7;ybCtmwoXc>dSM{_}}1doc> zrW3`;L?fzO^25yN$ymG_K^UA4lmKyM^-p2xz%e>%IEM*BO?ldP)pqWt{Q<}pmbGrB_fcRaUU z7%U3lxkvAiUQt$*pI6j0x3Sn&T^?_N`#ZjQep~O%NS={@lAK%WG&ke%M-zJIh^O|NN?SFC89foAUndK)%c8c-;yrN{foi z+9oj;_s$TOJA`KO?R(sFsNv8@^6ECB#Z{?VIKL2LV6ZvWlt(P|%~9-r!p5i>no(L5 zZ_G?#RJ=S|5Tqfk8Q0VvErD}YB?BWA9}|6ARGR32r!FoPT(>mdT2oY5*3eSwL{Fex z`tcRL6e>h1=#o^J87xb|95{>`%k`BPQwqsUf6PXwmeh|#^xMsECeENBA^hZmZYhPY17)e$LPk-;86L6{ zYT;RbX=cnc>Z!vhc&{xDfm}##vcI{sv~l5%a8a-Fu5J)DRcgd?oyRg~PnI9PGCSB1 zBYF3(sC8gg{mk}asV3eb0?k)7wWY;1?UO4QQdm!-$CfT$LG8xzGtiDdiNUrTUr3+pQqsygMpmI&eeLCGF^LuHps~d3 z$*WF)UMF%~wROzxo|s#CJuM!=tSuyli$bSl5iH+1+Z3TAA;8NgBx@8Fj=!aQ?Z#%Sk9kOQf4;qzijty& zl9IBv7g;O14|?NqQchQ3tTuuwq9|8LQIO^=4ZMe<1;35fLGNeg(VCW{hChAFOGavy-1} zp|{XlieErTSVWkgN8GkXVYr*Q#{3$|02v8kA8^EGm= z0HFjikse_0o6-oJ>Oz^@BxV(R`$oX>7|u|d+UhGQs@g?2K+zkusX?Y%iZU{a8d@4A ze}OGffL%_q*VePJw=^^lN@|jBn&^((4e?z^Sll-2Ry=9q^18G+3iV6yf77_K}te5&y zd`xu=Y<-;cjbC)ZR?=xskONazP}Fo!Yy}9VFFV9YOuj(+EwbmYGt1T@mZWOWWFf&{ds39UKe`gk4 zH;x(RY@wsNtfY*J+YXUIr;8)4fezK(vvQ(Uw-qUFCWSc>{xx zrX+1{Ztse{Gr@247JF-p2#JdWn<8paG~X94FC-x?BOxp(AYtHLGyu~1Oq2+PUe4OL zdJwL5#2843NNd}^@xb{J|<@nDw*Yn;>^D?g>_UMYY2^m95Z6l}cOUzk?d zC8gp&AYx;qw=(V#7n6*4{_NJ*`B|X8c?rMCv-QK5-uru_HX^(n@`-L?84nJzl>dE8 z_${+ROf-}hRJ1I8;@ySD+^7Jb0DlK%Zuu7@@GmXhM;~q^-#x@$_xDZde=m2R284q0 z6enqFPS={vT{RtYX}GoEb;0DfM@r7dnV84)E~EeJ+us#Tw=vc?{q4b{h%HEKL25=t z+uRqTz}DJJ^U_k^w3L+Bh1G-0f30`?_IO9>t5-SQv+Li~?`lg?cG{ln8)70qscimxnlWO!tvoF?zYFr$)q6s& zj*Kk8kO$Eu-+O^h_|ok3#Q2|WVrG5~_8&Du*wW0@_L#|emr!8%f1n^PfydenkZAM>$jxBs}{bE zRa?$gA-#DGhe#rLcwf&$;srR(iZBBFMz=rvo!d9@sa?OKj1Rm>?(~rxsx26CsVPXC z`0)Sy`umZ?zyExKfAXUWm7{^wSC8|?^a8@;R0=1aU|L6|2M!k2Pk$Ua{Ob>=INd$D zagQB6a`=~@e*XFAL%*G(QZ%-Fq^;$dH1THfwq`PUPX6%Ik3atSuODwI2Da4uJ-l+9 zKYkDx{CFZK0e58TQ)wy7a&Ruik4ecCQwP6kfBS6k@4J3re_)>s7H6`_UD*EcTuf$p z3F7~bg>}un9i!TUuQf(0;vGADkxVMG8nldeg(?$XzIgG%H7;w=L1c5V$dZ@v{E1^{ z2t*^>mQhQk26Wec|M}3dt5oK3-H884R+?nCjFO9M;EmJLS7Qd9MA0^_!r5BDf{njkdf5f5#5}cKGxi#lQw|K%4EMX6#4) z2hX#1Cs90VX&_01|4H{ZFWG#xlQiY!V@L2LgNHVe|0WD>$SZ6EU%}v@+5idP-U8b; z6prb4qtroN(Ke!c8NO5J0fm5KzTbkvFn=QvQ1FG#E$D7VcN7v1Jh8dCwGDa@u7CwP z%U8i-e;V7{z#B*e47$Ay1>b@0^atPV5BL@dzKiK@=ZS5w%Xj*FV=_aGgwT^1VrT`n zva-Aep5K)y)+-bNo%>pgwI(-16`QEtGCC*(?Cq3Mm>L^zN3@q71-w@0U$S14$=Ss4 zW~g`G2L=eP&-U&Vwsyu0OnPIwvtxAmO}H^~f4M(Mg#7VNEG-JY4Sn-N;3C2I_)S>7 z;x$}uCNk3oaQ4+MYT{2K2R{YiBYw0ue*gJ_*C-S{oydHXC%LKEM@+!{17e#?VY$kh zi21FJG*dYR=lJn=?-2M*sw0PxRU`QCVNc2{zx_(?2hi?#Jj-piu%tjSam&h;?r?4@ ze*wSBeJJZth;4vCfQ<*Hig8Z{7kOp4spX9uD7eYnz=Vc<1!yd@KY~Hj;$ZK{NTDna zrAHfhf>#C;h4AQJE~5LwAMt5;x3vY5VGAWqz|n{yce-0zr8A`gs=Nw5(*V}m(c`G3 z&QDb(=Yg@J(-r=Fl&rz~xPX9N1*sZCe~C~8W}jdH>4KBkAzg5zH^B#B;6VY%82CSO zXFq{GM4`ZQv@_-10x8HhWU{?iKFG~7$@90J2GOf^k+NLkiQ}`O;>)}?(&?E!baD-bZ_0#sa!*^HyYo^HmzT&4bm4;^%z9M;sx$7e+G9V z)=DHU;J6N>mnuV~d1ce4rh^3O=tf6L4x{isOhn;Q zJk2HHvi;*po9>AfVti${8Fl36&>4dkO%2G75T)ltBb~v)YOC_H~>)M3i#YadQA&<|fS6dSwvk=|7bqkNl=+!uMF`O1xrDAcZJx-OL#-^Y@f74f+`VNJ- zIODCGtbR=kXxMOoI62-Od;$_0HJ`%a5*H4pdw6Hh5^`};>V#e0S3JqBZaq)0*9|-wY zPLGE%o*<+ny?By{o8unAebr|pD@}=}9Oto4N#zXensc`2yZwdVz~IQ%vPQgu#um zL_0PCbBt$ozY{fwmK^?lr;e?u1P}&Og2lM_G$na>E%tQt`>3t-2jgI!WE0_Mpk>$g z&jVPQfnYrzisM)}f9xlBP_FZ}KJ)D>xDVNh&fuElOwUY=4DYs~;nCT}9dlK$+MOL3 zM2%%B5>dMhLf0pYy+ov~(!&*RQQ38Zu5lZAx;PIEYudBi6y+?6hK7^0*#&$m-=@x8 z>C86dX7y0=JyvzLh4fBqLP9L0qo#hbWqow9BepU%ETSL!P?&IAdBDqT| zWZMoyug{DOz1iiV@#U2|?aQ~!dN&tF8glG4CG7kHW%-q#7uNMot`GU&J;RsXm8txY z!)IuFb2|44f3v7lRqkUvTJZnlOorG|EMP0{~fo15-ORn==iPJTjSFtVn zwjiVRudUQ&T!Z|?xm04x8ha+z2K-3Q31qdUE7S7&4{dMFWSi6RTbB=l&Kzr59G7|W zzX}Gaf_vUA&XD4uqh=K~@yRzW%a5a`r1`jZ^VoBsw3uKn;MT35C?LYqv|qrEGN_8PNi zQO96kTdWZoxdvFsveVyK*E?y~%7*ANx^-E99r z;$UN1?9-R%O-shV97_h@TI@*kRFF{)D%x>Tf1R`^xGa}3wz&;QBDUdZ)EZ=Fpu1;q zd@xz&`t2tT$i1`}$YkC-diA@zyty>g*)=dWSonmC%-~gxCnKR*=Vq0}b=qg`Es^rl zLEu#f%MjrXTDAPy)ml9q ze{$dP)vf>@IwOFQY4KCPd+FSr`{bl|A4o=i6w@@|Ov&L={FI+ay=W+v4S>P6GFSXx z4&#tfk`fbh*yYV(#D}kd!9M#3Z0=>Dd_?NS11ap->=EhS4}Zk^1uYxcdZ+cttu z(y?vZwr$(CtxD3dS+Q*!6+5NxoT?_56m@*>`4LAe96i{&Gt0CfWze)V?kE8@@_X7MgQVnV2C63`1tmNuz?WDCp;y<2m1Ya zC9UgbCcQ`>NoS4j9>7t^qrJuce;93MGIDC{DwDHWRzWy^A@nW^6Jiy%a4q^_<-8Liyny}Vyn7HlxPXF>Q45H!FO>y$< zinSj&ry=%NiYz(K6@i#WxnN@B9c6@7TWTuWnJ6<0+Ly;Me@_&$_Rk%PPqehQYW>7b zBir+oZ$0MGGcg7qbDO|)e^60d-YL*|*b$;GBBx_&?HExwus@d~%x{o~aR5FlVg7+C zeR?E8fLyWTt@CFb01f5HD%rTzV(L3Qz8 z7}x!ldjV>1vE5Ugnq1JZX!3M(8A~!2m(w=2wDydxT0YtB$n;c`lvdL-Qla_fmU{I^ z+0JGX$5VC8_J%rH=t$NR6;aeS)Zl#nP%aMY!9?ygwAG~fN+5r@BUVMq8yxp~Iv=~~ zdoXByR;C=)U`QYke>FYmL-t&|8-bi_%1zIJWPwj+dUoB)evjU*Z>a2JqrHvjo>K%* zqk4SQC7n_hFB;;w8yS;B&qBQ>k$`U)+jBnfP%I&0`(BxjKLmrX7@P){pc;gH-k}`0 z9MRdn9E>u~{ua_a+My%czio%u9*<+jQ39i6H%qi+)WS-pf5CYev3*YH4zj`B(Rdpk zd2bNUmjVQ6?Mfy)E3&grpG-)8Q~&JoyD&Hf5yWAQ22kptH(FdoGqrtZzdzGTT~SHP z!PAVATsb!{L|NQ0=LB3Sfd>Lnb6}9|L0hb$fS^I~((lld7UkOvk;}(O6mqXv>A7GA zh7B6(xW>0&e+BFWDshb@65Mom`a&&4O+rhYx|6PRnE+BpRN$Uj_0|AhHp(adg)78IywjoXk@gE zt?Z-MQz(C;PwRk)Qh+sX(MKKLY=ZWc8LId2EC=^De^=MG8hvP}rNe{lWDWg6r=a6f z(Q9<^Qx#%2UV1O15!(}W&N|W#uC{zUS~;B)%X{dxWQv~|Qd`o+Xe3gB29MiZ8Mw?U zhQX}{2`iR)_K@8mpmFP80)wd0Y#V+S+2l7C^!H#8vCx*L#wD5iK}-q?zCYcR_eK%2 zDyO#Jf3=lt)?2GcIVQBMA<>8VTt8C9ZT_=tPvpx!8|`((KPo2 zbLacQM9FzP#?U9lewK!IsX&KULfHt+TVPefe?Pnk1b3dPLM>r2XGZ`AGeH<+OWoWq z=6xa-pP@-F7;{SU;0Of9e;>knmAmi&%k6e{wy{$>Xh(QevJmV$;$Wo2%PqX>LZ-6U z?yMv4ls1JO5eNnFwcgTT!Do2xt(_j4;+9DuzwI-^zpq*I8!&jXQ5DEbr(6ljdz>P< ze^N{x0E3>xTTNQ$FbER<<2+$*o2Ik;rN?W-LBho5-EWY~j*&&0>prC?00mnuaW?t} z#-_kyVx(^w(_L$L{}#8YgPpB~p%gEbLRep0khYj*^BBHnJ-b9Re&^{o(kHZ(69U>uV*MZ)v z(V%D0N$$huZCY*cwQ|daeVh%(P~2n!(^So*NQtP%HDH8(-UXM~52I}hnQqcDHjTi) zx-A$;+<6E&Xh#IzicncE(yxwdl%W0q6;VUiaUJTk_>*Q{|a2Q-44550; zUk-G3IGB^)Airk~oNC0zaDA-kf4$p=(1pe*D+5Cl>?#{t#SM=|P+noq2l_Hype-mE zTGMF7!)2KVZVkoa*YF&N78{)zDYSu|b0brqN#3u2EQjM3bvPKKvlz_#STer9z(Yma zG!5uzj~VfE!}`6M2#Tw$ML-9}vekveqM`MsY#cVlpkNn>UL$ZBo~?6Wf2K76_9j@0 zCY`)b*D^Q{dsQO0=+obz&2nvkYXEe56Zv~#5LxPFr0bH2y)&CFaFLbJ&zySuB=sH) zo=nz9Nponle6R?}qs_K>+jB+GGYx26dN=$9IUS)Zsp1YMDQVGu_SCc$@lU|u(HCFT zynHFf`3hIww|fm%<|M<(eWMn==8bOpX1OmJPYb{Bm-5ur%V zZ5$oyVWwpk2dKf4FXeshnw^$1iAEWhMT6eB$Het7c_9RUfK8q*^RbIoO zfr~EmM(myw8#T z9^HSz!Y3>w$S0)eKM3n|5~9bw{rT6|NR>j$r(3L^zA|lHfumQ`sV`mnfjJ`Ghl^7e zME;e0{pZj5V!(RV$Y$dk-%y2rltk=IL=%2>i%&&an2kl!Hg$SqD&5CHU*g%NOZakz zW`0?tv+YSbf5HNqme%t4-(FM8fqkHL+l?tU$_$q;{m(sGHW|mJ{lm#xiE29K z4S?g`P3QgUwsO2DXmsgnz$n-oG&%LipW1K@}wdCMH?8{N>|~d?y__1tldpaehAS zqK^dRZsZv;lQ9eMadFFACC>tQ0kIY2<`EHMr=nNSTS6h$djl2eY1w(083b(8JND6t zW)E>{e-=S8Ax=&)$F?K%R!5qi2n!c4Cl!@sRQCoz>|Pr(0S)qU@hI7)&jZ_Ix+NbM z*dR57M!^aivD)RQKu^cc!$dFOkky6F54TgqcALNEjajeS^x0G1EMC^5BX!9y&{DI5qw->24QbmxB zm!E@@N+xmS547=-)C!;d112R_S-*A6x+xW+0RN$-q?PsqLhno{U zEv+5BgMIDoU`l~GYiev8gkidcJXoJ>tF3Mt znBKt58Z3zNSE;;@^1F?JmhPp)Q-kux+|c0I!tCV8^zy+)<2#(|?wi>GvqBtAf3-kc zhSvAD=US_)s;aB2t17CR$1$$}M%vffw}zQ8#K!D!a}D?&_(XNX;MUQ4PiJ#; zRl~sC&NkTKE_l6pIN1Vi9bADe4i8OXhL2e5ZEl|e_&8$Po#>7Z^y9&hI}>pXk45wP zx*HlhCf5K+*_-U|YHhBst7~X(e{CO_*#p#JZn(3xt*f`AseNh#{(;sVuTFF{RM*ti z0zHKGfLeL5Is)_=+BUed3rgwcSVtW&1ZdmDI{07I@%D6IOI=NMUF*;qaF*JeXsD^H zg8~Dps%`F>1^a%SCqpe1RKElN_^sN>=KOG9e}8YC6a6DC&^B!Y1bV1whQ4Q?+CHda^FcaCkG3DZ^_ z$#sc_^By(W%ZXdXjb9vu+@t-H<}9lS@@QweqXv+hnwrY0mZ_c1sTM%$p|v&D)iw2P zV{2Gz}7IMat3JH2m2}8N}}FU^_76=Aq@2KjM4%e<2JWfAv-FjVsSt zl_F~@k20`}J$GPp=s z-`77RyI2R?-#Mx96VRFVjoST_YWy#S!M{#S@qeHHKL36G`~0WCAPRoCy#d=f{*&7s za(`oO=MWRLa=11>Gd(>$Gq<$4|GNYBP{$ifa|_F-Hj@8{t@LPjV|xed;CZyU0*q;P ze)SL&W^=T=f4%^EI?pV^_7JB`V}E^h8~$7EEzQrb?fzMoh&o(foSU0pSlj)5vx?YV zUfwvu1_m8(FVD}-FRtvs|H$vb=H?c$)@1bY4r~EjRq&Zv+J1kP;M+^{b88rT6nuYm z33hONxV11nh57i@%*yum@*McZ>6safXe_}tH`mvJf797HQ9;7@muG;_gYV~IyC=un zOLKFu!?On0cK3E*>)XfJ#aLK`9U%VHB%T1@eZTXFoz>;7qmML)Jlt4Wn4OtfTtD~^ zC4tC;_2v25nc1a{Lu^>f(JrWbbIa=oSjKy@vob$BJ2$_!gE1AMPIlIp=4NI9Da6hn z;&5{jfB62w$~HD03URQ$^j3o?V`Y}IJRZ$|4u;^ZuF}%MHK5^kyH1;q5DyOz_a%+8YtHQNRN2LJ zp8Jp3RPD=P|0xnSmf@sf7upS8ts|NpMM^-w$Vh;T^ZY3ulYZgM z0T?tf`dX7yrQ#E=S*S&bqbxZdwQ2s~?w^b1o(y7qLBhf(YMt}@EL%Hy@=~51%b;Co zcO*`hj`Z2HS1u!ez_JugdFk_Cg{nY#hu7K&+`WAH2|f`a0WP^@{QJhAQHMMKa|z$8 ze;bgV@i?+u9GOjd<~J{WcAtQl5brs;dP2Mk6Coktvn!V_{p}hKA*H;tkGTZDl-KL? zLNt4e<;sM2E`N3Df4{uN=A1v(Vsq=#B|^V`6dE}cLvfehKgyX$)Vc}yV56TT0h4L% z(w{QIPy4cPN4|G^Kkr71V_Lrb!Ntl-e{G;73l#IhX2E)q<EyUXf8!l5=T9PlAcyb4^5PNQm(8=(Y1F z_t41gYFECOxJ1O1tU7^}zz~|&7RTF^Ne-6Yb zkrM$8Qt)cW&7jdUHSsDG4@h;BC%68M2jQh~Hm;!e5~!c3s=fz<2cLgF#KaJtQ`R;C zUf`m)hDtM2l9E$iR}bz1BOU9m$}g%c$w|$D&S7#|Z4XzZ#3!YOx@)P(1(f!+Li5v; zAmxo!uTzqW`*$#f+$+)(;^UL^e>$eXThZg$W=KMO3Z%HUrsOoDdM#g0*f_rra|@3= zz%rzR=1@UKp6K6aQ{Hcoze^DZe*JK{ui)itd0s~H>o!dFh^YohVnSj{R(0nT z=$*1QP@IvJlwMR!}!*u(Eo(%k14ftxK`r9FYSMEO!;=bm8NMN?~+r%*4V^~LF@!&^*8J5Ly zn_f$fR;w5^GuK#4O9qr*c;hzaM*95mjb}#Phv?~4795e+jrkt(f2#iPfd?#?{h2^1 zcK6QI7F7%=TzTg{YbDc(U&$8}L^I|@`1tY77bd+&sPSZ0e4g+GUl}#WlEx$>HbL{M z#oxU8Lmh366{qEtm*!{ZRrb$=9+Vs1)p;3FA<3Pmmf(Zc?g~h9W?{NE*(=+c5AO8G z9eLUG(!s@j&2xpwe|P$K2=Pj1d1gXVc101Spmz-*NGF^9MY+(Hn*5CP+@_($}|$lZ%ZWY*b)vk<~ag2Gy|fg;Kuje}sPE`&kd>C#t#Qg)U0c z7GM>yW_4VAyY|DyM22g$IRFd~r78$Yr}cDLFfy2xfk_n7*)LNDPtDc3a?tAnBC`}J zPpc6#vslb?l`sJGDV}g;ex{O-nX_qc24Ro3ncp_Aqu>W~fYfK?6ciT~=4EEpjskoD zzTBAyC_-v_e|}Xj=$g1Y*HoC6kdj+f0x9hO$lkL()KmhA3XE$x^@)Y=O}7;%WMmF9 zG6J~wHVhtq@kKj1shP81R`VnRy_9OMsb}Nt?&fHuD(g`;Q5LL8PR#2P?x#virI|Yg z-)=N#CKJ%MG*c0zV3G6-vga2TRpujlKqYOe!-mU~f3N`SbQ7VMHg|QfanEU=MWH7A z#2C4ijjYTynI2vh%Lb=n4PwlrAKZPG_Y=7{9BZv3BQC6Ln>_aWHf?x0{|#EOG8A&M z)KZ3ug`Jgzo>x;~>)O>Jr-$Fu=xOueka9`#2y28EG#3Qe z7@FI=mTUuIS9&6X2LXhF^H(IKx_+(?XX)9BKf0j$v$=$`pFESq(z-&ul2-rhcJpn$O z+7AiwR^#g=XW=_Pl4*JQ2SM65b{9M2JsjP=-A$y$OkNL<`IG)gXJ{_;=n;d0l7hH~ zPuu29XO;`+&kxjU=TDQ(0wU-w&ftQD!Oa{#0-;1OYcZHJ1bLDkJp3ym=qV|$xM&AvoQL+m8$gt4DOD^T5`%bV&m{J*zVe8SyyWE32eNB7aoRjIy)WZyk? z#Z)HR@5}R&;^ft~u~i_t^38eqzr3tz*)D zPmYHq7oWDZjqHmrel@J#N20eot!{lzpzG!D;o_TH56$+_7L`#mx6~7&W^-=Ze_HMg zVf1S6Tl&%mD}rF zPex{?C_h^zV@nUenBw+mmY*3?e`c$tZsI!BL!*PdeNA+fJ$)Uxx%D$Mye+-Tx*|!h zv1T--OEd7eWaecSgsPAWc(vrK-F{)!3=On)%YwKvu$W*XY$tu`xb54Pf1A@H_vSNo zo<3oa=3}D~mf|B|wrg3MhbYr?={mZ*y7-3YE~Af{V=P7a#SCn%B_I6lf0lLEhmFD- z^CB#$zPe|Pi5-A1b!F)AvWc5nwZ6gwaPJ*9_>a#rRX=7T+m`hj$*VXXD_~);bX5Tnj{qkHhvcDps~2>U>wAT4PgNUd z8}wd15cezTo5chG4q4pCe=+L;r1yB#gYkh>E_mi@b5oXZOdLPEmPhQ*6h--%Ye~x( z1a<#*i0W>Qza9s{bLnKzTM0f{=3--*h5V+?zk z*qdof^05bcD3AZue;u=qkE>Y<%TwLcSI674Wl^qxKB&>%zNePe?oC7BIJ#3WPr#em z*%+y=8UZ5dZaOFPX@So7VGx)jBPwS9J`{Yw>?OWy-@#&YZhA&0ro$QOSv5bmP~E}-pCXuiko+zJ)@QkteJuT9vJKkr+*<1 zI;qblh>Pn(+Ay2Tq#e#HFHmCkN207mwdEq=@lM)e~FuDpz#cFE8&jF;eM zZz<$W53Bmi?U;Ftvod^)-77}3=zb!NtV`mf5)8`8e@o4eHK6Brs7MgGLG000?`!Ow zUlztrC*}0FW%x9jL?QP^%F#@6c zg*>7vo}XSc5b`>`I8K+6+o?8L=-Ml6{1WZtxxP5Tow7%zS_Qt7NM=kDvIf9jsx-{?rpk+QK}%=1*P6N#E@&5!c7 zl;YwwPVL>Sleln0{z-wgc#B)#kOVp=xJJnS9SH57!y3!s~_+tV+b1U&C!>)Dusmlc)?A#-3s6-ws93)c2FFv)xI|2Hht92mh?#~26+VTsL-b*Ns4_1d z6%{r3(9rTK_>G_J_oUc}N@=IIpXTw~f0?LHkMy(B66cq3Y==$7+iL1M#MX5773t$V z)NT5xon<|a@v&wD_zJPrnr12{?Nrp+U*pE}N-ML)gO=25Y`tESQmnAME<#H+7}WH) z>J*>CpcsSOxovRLmxRKhtz6{=L-@+kQnnEbF)60UROG~Tx((C$++SY$`4t1rf2(KL z?o#>nAGSKlin>8AteP=whfnJ~xH;iZN227wN+J#%iruAToZn3n@dsg$+I4h$!jJZq zf;|U0e?)?(kfd#4Q?v>>uYKp*@o&RmeZUrc&*5EDUb-1e*!z zgo4U6@5N5(0__f#rNJ&4H5D0+e~5>V5g)&50u&VL)o7B-oW;Lk{MzX7F%~tB0#R(% zm66oG9)!VO7fN!c)2P*jL_t3NTuik7VKLJW)EQGF@xt_mV4?a72SL4%p@k~W+w4W# zC^Yh@H&uj6GVc(*(N&ff?5xd6#pl<(HXJNTMS<-iB`J+~K#&0|n_6b)e;m-m#c-ml z+<9HuaP{CIwCua*oZL#Ir!8*mJ^;`Y6Pahfsi?`d6e<;Ds=Mm`qE)2@H zAyC_xdTwnlGMwg#)8kRZcZ7?C@-iIj|1Yhm$#T16$ZjBUX zfdf&m^Yoc4^x_g8dzBLR89^F`{167W_g2?10e2-qvSO-*Llv^L!eJc%A(^px z{15Vom5;(8*u(t=e~2NSa!7%Pk)mT7Xd-znc>A^vbikXGJ`e+gmZgwj4?k~n0ZKO8 z3asb+YX2Y@7PV0yr=y~gG5(ef8(t%Dm#G3P(PjQ}3TF8uZ<{5L2Fm;-_$)wM(mrf% zYGVBKnV6cxc-wE*S!rqdy`I7}xWBjpD)R1BwILm;YaP^9e@)r90MyP5&MUWc8h--@ zkCyVig#^vOd^pW!OiyK#T0Gx@K~2>V5Wf#II9ctw&T#r@vD-(I)~4;vK|6sL_wlXk zQbjx9-P_{i*ci6MW8<@1uoBU$M4r9#vonMBK_)y3p3rJHMNy~J3rkajFzC>?g<8!K zzWl@Y`0@o!fBEh*^6qn=fLFGKSi&};V{`kXBgyPYO zK9Y*A0N0xJWG7(pXgb7X1ndiEC1CfM|Cr9L^#v2%pojxFV5=9WkWs-P=BK9ZaY+L) zPVEb+uBxi`;ChzG;NqB9!d7O_*KBNJZg+RsOPEz5e-a?V`w^5s(ZyrLY_mT^i&?>? z=p#vKPi7KqW#w#&K#MW&gQw=Tr!Yw2dEZnT{(ut)ol5cm zplZQne?Ks%tgN+%aFdGH0(*$BG?Q-3%x0_X&Bqo!Km)xN{BRihpgBU4Pww^9gc~chY6h@%Yy^`2z?QbU+!Vk~DcgWX_q&TR8YC@j zHA`IwIu7QTF{OBBfTg(;zD$BH&9i5cakO6Hf6Bxt7q$A^FsPQ%Gd_pe2>0jeO{iZw zwvUGDN*RO#6#XEK=I3Y5J*bafCarkm6MJIXKWI%gWaV)JElnD7yYJ^4{5tiAZ@!l<_|nt%MD`GCu(8t3M*s45C*pPd!^}`;jcpg{QIl#zyJ2juU=ZVe_(DJ z)~my%MJ*aH9N|{IjgGc&_5|hwOJO1ex9;4#ckd~;2?T~lcEy{sQ;{=sib^y7{3{mg zKD3HN)7(|9$Gn0sv?R(>;Zm>)OEcfOqm1QDvJO=x7R>9a4cAdH4+}PB!ujQI zm%e}W;suRn1t!?bdg;Bi^U5Pu`}SQl zYHKt~f#4n?~WH3SD$q(OOc}!!T45k!2?u!;BesJybWdgZ4Fs01iY_<*iEucXX z`LvD|;195JOR}3+uKxOv-@g2GFBtV=67_7G*+28rnv0Wu!eG&i`q-g3*N$B~smjmZ zE-t^^fKxeZpes!Lf7R`~fFe9*H%MCsxl^n(#lt&KY4}MlezX*HyENs_QSOsDVKi)aPI?$8I}J-f4aRRBnoxBJ>bDc?s}T_cNd~5>rl|W z|M8QQdEKYnJdS!SaPh6jf2WJ#!4W1e&1wY06V2BDf1{iFqlRERE8n!=>F{%~ z+~q658#()lPjtI!t2o5A?4kcd9#pFVE}nh=U)N(6c{t=mO%uL!(V;ksgH&(gU;2ad z&6(!%y44qiNFq*7PL4oNib4fC8OSL74?Ds@Iq&h7?EJ-6VXxARLDsK(@$@Qmf2rA) zoj2`Iy1juJf4@(_0G0!YAdyVT${%nDRZ;mjN0GEzaS;)dk(1M?hV{H5DQ6KY;^oOua|%Ov!fBZER@6~gakbH)dy(Q!Or&1`Ln&Vcl0mv<=h;oZ0wlb z{5_78sJ-Qm*ZISr{3v3oGE9b^MkB3j`!}E!vA^@qf3th|FR#Hk;vq@-kjkiW8};X; z^_?DW|6la*pLD!K!A4S~xojr?jonyp&Cp}P!^6d;QH>hk`4f@tEwbbaRa<|dGOH)U z1^yzm>{hS)b`k#?XUL`UFa?H}FY$2cb<&oOPY&K!gbPCt{y$fy`!`p|`rtKucOpM7 zIyV0Fe~FEb$?04=`Ab#o{Qw0Q%aUTxM-&$wlK~yxJo-1z@NbL%d`Uvg+da%|9N+oR z%;JIi%LD=cx8&mo?0cy!DK73@%wl3P>IOHC{s0UftE&C^$wmE#FV}zN<-b$--{-&2 zyWBxd^}Q>Sy?=bZ&rMy|(>;nwLbe1=_jR;ze{_o)t{m<|+$|+QvSaBz@2LTEG!+uAx%5`6Ztu1gA1RKqt(h-A6qL+OKX?J+F3v> zd&`2YOwBE=tZl6=9g+vP#Rx{QV|)D#yse-D4sJ$`>U zJH*4$-YKeT?p(7hTmo8184kaACyM0gt1la`Tr+Tu8vs=fIh^9-Xe0CBGyIfO_r{Z+ z7z=ghq_K;=9S4kv9!NT*Ll;kB@MJc_T~$cJI&WYRyejNax=N8gQ7ZIIpcakZ%yrdL zu}YjnT|hVxU!Ha)xX{O}Zn9Ln~Tmr-^N z_LQY&wQq!>kH>xaNk#2~-HcQeOe01&ddyk4ooiTN2{r&+p< z9?x=>l~r>O@sOcpb!^=}7>(k5Ayjm5A=TPn9?tX9X2v6ua)Dsn?P2kf6kMi(A)Y1@ zLi&}fOG!rZx&g&&7k1#F*i48=*EJ&4UWAe_dKTDPatwrdjC}mHd3cSo1`k(q`0g{E z2l}EuXaK(5@5VV(A_d5)zS6wu(G#NwAQV_ZUK6Gy-@> zl(~eWo^Pm|1R0B4_daU7$Aynl);Y*dO-9u%dvT*lorKk=XY1lK>CS5n8ajFVz~GSR z^x{dZs*QQG37ABsLMr+;RyzZE$P~^BBz(AtyQL9U3K|h_e{Lt>4Se5Rm-mYb4~fjG z=sQ79cuR?zr?u@~IEVB3u@S++!GT_u5)AyIgFEx>nIQqek#WJw&whMrQMWyl%ypkF zW9!02TpQ~1lbH) z;TI~xNS?2vw1RVxmpl!tEp+uA%`yxb+UU38;B~B+IJs~RH1$w-0#jzDq0 zR}nI~m|>x$?VY!BVFwP&ti*V=ox%Y{px}v^22H?#X3wI4$=6@K<1q8(KVok( zSVE>xXJ_vKzF*CIl{D=f_m*?yrA%@?1Js?V{=HuGikph3ZI=RGi73P zUIsS!5>t9fkFIs}m>z^a7RSO! ze&s6xHFrKjj#MeEHo{a+KN!sDJK;=xPo?GrP*QVpj`L#eN1d+f=GcnoZLUJ9$#YnH zTD+;6j(-OPy!~1Ze|3Yu3=mh;bg&GWa_T0$-B(!2vG&X#Wq%??O9u3Gh7T3GIR`d& zXNeH=#f*R$QKf#L*s85PU7uej3|P(l$s~?t&6y$$$ttPbs67^vl~8Gfu?{t=n1qvk>a2i zT~+6zAYq*b`nL~SzPP8^0_(IVBhUlcTSthfgns@wYB7cvSEcZjqae52U;8`w!@F=_wNGe2#AKGe=jQ)#3!9`CaP0=XMP#E!VdD^a zChZSHi&3-T%y>$`)Fb*+HC1#{+P2S7D}P&E$ObHKve+JGZ=TYJKyTE0s0*<&(y__= z^&FvRtL)jB-?_w@@TYsOUV}J0fmOtMc*TK&JRh$m>)*0>v<1T?R@rV#QR3!{96lV* zbdlm=Wnp3zv&vlst1tD3=yDsRot5_5sWK2TtpS6UH;NqOUGm!#Y!x)z!D5}WUVqdN zRI1+AEFB5);Fgok9Az@a#06~TYSi&0G~CQAehE}5KRwU<`O!$STYQ+3K`XIxuVjLu zaaIa%G)uYi7`Y7;6SyXqe&qZIJk0f z3b`BAYWPnq`_QQNKyfA8iqTUfJ%5}^)06}wpAe&Ep3c5?ov$Ux`6K(m9@J{yducU- z)vQP-libfPAHNHO$DeVc^341ec_9oxQO1pz2;3xaO!X1u6Vuby zmUqnr4uiegM2!AJr(EN3zR6Qp#?sAKM^VMMWbU|K?Z!)&swj@(S5}l_>@*1r~AWtl7Fd+HWmikl&;~s zR7P^(GT29Za`9OLy0YLWDQc6`h0U;yJXp-N;pEkgiE>fW@M_o}^Pyz4%nRbaN8wf- zM{}PwrXWg^S3plwUDMy5{~5D$*9siHQ7H0|IdkXStl=Xd<6M?$LQbt$Hg~j?%lm-D zF49FzR$g67Q6~l3Xn#(6=f>ST_n%T}M06vuDB^9TX%jztiWLX#KJ0{2sdXtz>IZuy(+!(rgygnFDdg;>751*5Z*jG=yp`~qR&+$#ME)&biCMt$O zMW?JDu~qBJN~M^TAFd=~kiCVR3eeK_$Y_{@t#=2plW0`+LWG_WX=w7kddaAq&^iyA z8V;+$DzIl3rtR)zRYjAeSX&M@O-SE)IhUheh_!%#Nq@@$dU;}UdTt4}IhQ3zAe6NM zu3Cn(f}-o-=||xMVf?tFsol9Mlso}bYh6CZa)z3U971L}K}?saV#iAbZk%bBp}wqL z3V`|j`lQUheW%lNwAALSCuQR7Z>XZ|nLl&VsdbaUxhjhNDUDNV02haxuZxwM#hGUP zNFD)ne1CH=L6ls&`s|*3K1+*SETX4K6Q9DeZEd4IOpuAo$XHj^%~F_29N&n_d*W2z+qH62+sMS8xf8{*PCrIRS);dGt+_*Fh5K&_chXxsg2>z+FUz51!o66 z7JqJ|!lt^4w$;Tz>`qF)D zrL(5Kzu1SJOUBj8P|-Q6xM2vkQN;TLaevqvI8D;--a~*qjJuG~nAY_* zmbWZTrqJAB2+s`_7SPVsSKzM|hh(5t;RQUVPMGnADx0Ub-|a0)M!& zkj3$UA!-6PF;Ek$BBK;mIx;=Iu)eduK9nx?;FeM)rZ{0&tg?#XIjcv*7vqJl{fw_( z2eiGGrzWWwoLOGm3tP`;{f;DdAdmYgOY{V6a;PRkPC_}V5@aCL{uGbZ8_o|f3uPV* zx9=%NHh|Gs^^#xw?YVR7=GI8D5r03UIi`H$VSyrv8f5w4OleoT0(ALIGtWutL7C>$ zFRyTAf<9Ecl`%H5%Dx~u8@9uvwC~?s9UYq6-dpd^v}LE^i^A}N^)yKWg^bnH{TsD2 zTB1pKl}0P}yp;IS!2xVESM3#^X(RSetC4cNs*%;$q>3o`PK6~IoBO%@Du1%mo&Dz@ z$O6HNKIoG}*!bA;{_a$oJ{O&OP#^Y8dekU$`-S%zN8E?H3n)6*ow0iO?sx$EmD{vt z?ZB!oCW}x$d5T9yOGi&lbng*cNM$VjPY*=%7Ei_#wQ0p%nlUv?huvR2*LxFGK9y-q zaP5g<&cN9up*DxIl^K{l8-GFGy;vC}!%R+0N{VykGd#ypi~*_4Mnl%;O%&+XYq>jL z-xezbdb`u&rYmk1P|!RATQ3p$g**~agzIOTWveA-od6DeIhx~{Qt|n@7S@p@_Uu<4 zdyFGnyYlsyZX-*b)%8Oa{;VvL9uB4oc4wOP6LIhg=sGr^X-p>>c7N_c3vaX}`{qab zn8{;+AXNu&u_&buEG*7dT97hZK&N)WMcLb#ZHt$urt|CuWoM_@kX|9=jMbwLS32xz ze|aI`J^;+Xq$ef4aaC7+dCT%l8qE!s*O)yM_E8u-{>NvzY_f67pMb&5czJ&9q$Xf0 zdu>R*{p#Cqzx(dHZ-2l3$JdWkeM`WSU8e7_LDX`ClbVQi`uxR)j!9P`VaI}gYm|C4Z3>n;*~*kSbKsWIpWJ6U9+C?Av*CBZ72)B)<pG>L z2E8Iioyf1>d`Jx@zJd?<=*pM`)dADG7R~spaPexp;j`zapecDQS5H>PuM~3>h&_hMJUfBVwf$WWwmDEUVJb$+<9oOnSBC^7UMJz_^DVar7 zoR$~b@3DA!`7S&No&*MIAH_8rGq7?fA>0|jc-0guwI_bl<$@m#ZuEUO6w`>S2*gv>#M*f~cmwI>VT z`1+N+TieDPV;KsuUt>i;Zi=z+OeTo%s3bL>*}&1rmEJf}YQ_4~wl~t%81DaYQ=|Bu z3er1e4jke(RpX%CZszg=d-PkO=Tn{%V)kdO{(pF_QTOTh52>X=gUwtduYhqu-#HIG z9?Vvu<_ZLbZ!(yj+aSLObECOcB>0du=Tueq>-{wdzyDD%tZ@soJsvJMnla#OWMOs+ zSe7WWR2USTk^$@IIF{I~85;%O#@aRsr>q<~?n3$N&3hEyz;NNiK}ItAK2^Y;2a9F7 zC4XGF_LgQD%Sm_?V&)LpEc1juY6iO~CllpC?7w_XZ4fnl00uI?xUbX#<_KHLG^7-= z%MGzmc%xZ@c^L3K9;*(N;x+C(-FjAH#E5QPerQ++41BjaUYSii5)i(lG6OO}@9srx zwpcLvOqv0epeNSbeb|zP$D?ig$+Nzp| z^?l+FXgf=lLMdi)8-Y5SPgTI<^lEQOGZc~wm_!~{S}@~^`gBaqFMyeok5~IMWPfS7 zqI#!uj75d*)2B~29(c1AA+-~@lnW&u;)-@Pt?3e!0)fpdh=Vq*7thUVW;#-xBqa^& zwzm^yS;T!yre^Am@gAr{&vuR0a5-huJn&j*w?dcTl||c1yAuPYZp*=OW3Zu^x@*&P zzXv_8Sk^phzeNKF$Et3oHNjRw#($*ZjD1XbkUY@^qv5uPi!EeCd~(ZOlqAg)0Q{S< zeEC>0XJo29O__!%Z2Gv_Uq?*at97Q&jpn&{&glg!e4*7xOVB2N4P+5+T%@`s>m&YD zPegN;P@s4GW}m;hxU5B3*D_cD+#K(ba_-n9}C9k4kA-t3l;n3NsYJL1ChHXd7_2E*SGMU2@2?{Ji{#EOz6$H0SO~`os zL2^5pX3V7$*w-7+iN_Z;uzd`xQF%!W5RSS)12IjH)|tt!{*mdq#o7LBC7g$9Rj1Io zU+KW3+^{?7mgy~-P(Ah&drMpT?OW%Y!woR893(o0YYXjl zU6Tt7)2$E}erDmAGjr5(2-8#bGC*Yym)gB$7z`4i@it1D9>pt*?ZwdUskw#e{yZ(> zCrV(hJXB|Z2Ct@1*V_p+c4kxc85H6`Y#EABpw~#69SWy^!k;{GaInhp z<%LmbVeS0tXtolgSo*})V7v~Kq-)bGRvnS;)&%7C;Eu6a?klZeS>BW>Lo49dun6BD zaG|?KZQroIy}AV3N6e;53LB=?Pi$@U+P?VvW9!opzoU*AfPd9PdcfQwRr*9k=B;a8 z&h(_3jr+%~k!E7b4)xOm-pu%78PlkPHqCR*lF%zTBTh43@YV%Uyxmyk~yUG-XmQwM>OJSv(LjwCF}1$zRw1~`Xc2rk#R&D zmYRrjN6M}k1;s4YT9u7BGYKKFm}kRV zZZ31-ntw7Tu}y2;{@en-;J$*`tq)Yt4DLrGCK4^hDR6Pwj3LXIDg&!f4<15XQcjh) z#<%VX4$4Fx(#KElbS0Z;I$%WRMZe*SeWoq_k|IS4)lg=}2CY%lc!CXUD5GVVZO} z&uNtcx>wFk4~V7C2vH^t=xmR_g=Ks-NHX^dG?~=10X8&O?#S^Hhm21TRFDIxwHOV~ zi+|@Y@M$$8I^S}08Fv!~kbHQf)rE~e2*iSe#XJu+tKbEnM2XCQce}EHL>a(T%z0*L>$JYbH~W( zI8l=4PoCqxqL&J)cq@eivR?WLZOG`sbb+a)PByp(V>zbAo|VuHOG$csTwGjyYW3hI zOw!!h6gLZxl!kZ1*8o=UEhS>pIR&-Rw#n-SjUww1MP{wMkrp@R=MNq}!KIO~uYVrL zd}%9Bl0m)p{R~_KW{eyz(51}=TXvBM@cSEsaSpmZMN8=Q23G|xS{e#+DsHRXC9s@g ziZKfj9wDb~7Js7k^;poor4O|2Xrx0d%bBUYBr_dT=hn)X#2D*B9P;W^0Xwxl&q#Hn2l#| zDB)erI%D;=|Bt=543Fzd@`t_qpX^SOnSkS%VwM?X*^(@_7%XOHW@ct)W`72YnVFfH znW%t$PpG?^M+(kX7>=8p~6cwXL23XnY}2ip`)Lir#LH z)~0>(kV@JOaC%E34=h}UR34bm>B}lt`3HIGPFu3>kZ%6N4^$1VuIo>~Uzctd$J+XZG zWE-hLQz`-_ue_GSi)+MUj<24yf_?Gm%13hhEhd{Ar4A#$)gRI$4Hh*-YT^M+_$j>77 z=mh)n8rBNjEfZRPhesEz(@)K@cJEUiK%Mljoz5)Z@Z{c&uV2K8P*ubHl}~oyq<=t{ z`qKhjvd2DYYJOr3OQ}}IDFd*tB?J_FtKL_~rv>(*sJNP}!^m z^wos0KVBal6jU|$^?x0hi_JuD&8NTl1}?=r1zKM`E}lCYwKFw7y|n%@ zu-IsL?dfFenK6Du4O=tq37$^jm4hex!~SuO38;VTYkwvmi~m2(A?hzbho_797b1k? zeTo$n|H2#Tw49dHa$0^r4894ifcmUM`tuL(FFxi`e=z3${(m9-ix{1MVFyqj{f_$G z^?l;^f8W9Qm2>#%*HEAM;dk#t)E~Y4e|FdYKX`<{b3C7pFf)-LN%8bCK8ZXoF4peY zYbznbTQ|uRBPRCHdyNLv!YLoqBEYvg60|7rZam{LEg8XHO(0)oXb8j26j*Xf&uIP?PfhwM&=o zuw(CBW(u^pHA+raSMT)~xij6peCgsw**MD;Y*?9kNLJEcDj>wDe-O) za2Xchk}teRS>R?b*T9@aS4r)p@%2vz+(E1jz7~9Z<sy4Q8K;704e8gHu*S59M+uLGx8wg!ndnkiG;Us8@ zIPkS_F(xs;@)c08<RCtbf;fvaWKsN%8JO>yFKlY&S7s&5F&9C=q(G zpqe#Mj|KiUx$0eTPl_ssc=m}oPj)LjHH9@idpBqN86NVc%)pnb;xpP-ch>5|_1XAz zsy4w1B8;jT1JDzZbj0A{ZROI1_2FC<%9noQdvzXa!aDu~plKhPdwgm0$gLLL=YKDJ zXHT5N`Q~^DYG$w6m~SdiOf?n-+v)cYmly>np^MQS|AgNM)}E+b>S-mL-XKm(0EOR z6a#xu*L+)TW$Vbw9;iw0!6n}8b@*b1CM84EiP0tzp!NC5nRO_1Hdcs;&a+_`2^lTT z&CB;=C%|P=-p5Fi+;yU8bLRGbKMZ~YS5ufQbmmg>?r3&@ z{y?E_V`q1Jv&@W`RyQxnRbIswFe=|n)lcDL4wOo-{N$I%;wT7L@aVHNWSE<}@| zjQ4nRx6nJ?shZ+4(M5?8tTJ&;6Wd7is5|}@@p`~ItjPJ*!%OGSU!~Fo(p&5l2;F!U ze_(xum`k=%QnE>1L8BWD$%#!H*4uRM+&2Oecn#+pDaiQ6h6ppuCbduRAkf3EPp(Tf zp^;N@RzfPihxR<18Gl^&SR$w3$jyFFK{CzQ3V$ORWB*Fb`Mny&aEUwX2(VYHA{2zA z5+=~-Hlt^3UL&|P>d3v`EDK&<>wXN|8zRS`5jW9pbN7}?2L!&iHl3_bEn=PSX&`G6 zT8qJqm2jGi+`0Q`cvmPprAp-iyzSSi({Z}i%p%bnDI&KSJ%2k}QZ#vGfizesBoZe( zE#w(d+`N40D&9*OZy*ckc$Bc1QFix%KjL=3FB5@8IRw346(B8bP*4}mPNkSXwhl)i z5V*LLNN`888O`0x7tUX!w=7(Rqt`OH@HkTsZ7@dz)FpKTE4I+c3Ke`JtG0uyG9PfrDiXG`NyTF_|GVXlwx{5jDPB|Gnntd^Z+2$mj-FG5cKqG75vMW zE?>RHq?5dk-br^(htPL?L%O!=#^FI```} z0)GkDqAm1URNac)RH3hUa#p#4>i(^Eule$y}Qh%L$YMm9zOeR~6L9SwJC1uyt*~68eNs}gF zG?tJ8wn6|yJEQOtwQz-&s|oygL`YMmZYRZm%U{q9IO3ubmab@DtYM2Rr=>*{+JBTA>pF2`qci zywIsUv?1J?e(fMHCoRt}WsuniLAS|WBy_{f;crA1@%}uVl8zQes@B>fM6|lOVe~%| z1+8L$Yq~^@nl15&ndx?>X0c56V1IqYo3Ml4s_biK66~ui`95-j>~^P z^DAfIBm^~+^6Cz`t*NXX6*bj>BAn^PunFaj@4o;3 zg--EdFX!Eb-@qVZyG8psX~2=0#z+_spGk}ph7iJ5(5QhJRsvdcJAWNMHC0JwQLDU2 ziCYxT2b2}TL?luE<*XBIyf*OVPiOx2Kp?8|$oU>QUt>c{{ARwQTMC}8+jcMKyZVCwh?G(zs>!t5-k{lE3~Jj;En7< zyw5-n7HZH@Is)dO=zrzKJ@k4i^?AyOMWEvz91mraM{*qHxU|DCKMd(TCG@~bBj9dZ z2KuNYi}IZurVG~<3UT&J+wJKljLc?Zn0XJAAeIUkTtj>u2KRZ8x%@JyH%I01x%0pMcZB zE1HW`5U6Uq)#DYPb!n2^4Fb!-t);2iwMOrkq)I@L8T4Q%zlce};O42 zOZhGn`z@jORt8F~HDsKejak^V^1DYSSCPw!6z6eyw3q80v}7IA$Bzu=3WUBt^Ales zpvP;lRTZ-gubbUN?-la=LJl~9qmkPkudRjnH1ZBjn}49Ca(7>a&L6(N)fLZi;X8I` ztnE~X@}|=A-3oH@J7^ z3|Z195ag}ckqnR8bPyx`X2?F|3GPYb`Nug*K~W(=0e)U#dB-@c2VSQW9gkhpp&AGd z>bE5L?|+-z9>9`M`w;(jSHBck&kD6GchnjND!j$`%?96{!^s%-XOj6xT*zdIzz=8e zT)N*8bZ0Xyxx`GWyV7_FIKu}qlm^X_y-sL_Rd`P4XvwRGR~^m4-fQ;%`L7#t&F?g_ zmB9HMvB$_l4$pnYh-FMSyJDn86eBBv17Igt2!D_5C_)B$z0#fJpFc^(w7)Iiz(zAw zm}wobX7BKYDq}`Ul|z?HGgmnV6=oAvF?Ne7!!Uyz z=`YW}0s_wLb!VF>$%J>oK16AL2DLY?{(n7M*9hH#{Q=vo_GNyhTafHwX5pEQIph}o z=MG9TnTvzL?MmWA72v*l&{)EhV6uL1vJUl$KxPQ1J zB((d@H}8a2`1ZT98yD!6t@B1;=ICfsQ6Ddd5% zd9*i2^VFI7UgIQ>)fy`a5fNq*9!CreqbG_@XsJym0DlA{21(EEo>d3-tX97M(6n!3I7RX$Zzj%v z5r#nGq&#Ss0TGcaj<9!zqs^2AX^2^klBOV-gTS5enn(k1I%lYfN=26Dt1xhT)B^2R zDqVYg;19ds5Nx7o95jeUQrJ+OB+V-!UKTAN_48bqo`i}^F{W#S)8iU$Gs&}B-%?ABI@>9@^M z{$wqQYFowP*bXT<7N%fL^g z{?C8o%*U?5PLZvWqDwl?{(QGPOoWnAK!DdGa}v-L>>uFkkj;a0Vt-Yu-40~ia8gSLcEW+k20J(^U5eni!56cLb-~-8P3I#JYMkvrgn5o~2E-yyZc1z_6n6&JEd?>w^k2Tv8L zGjPV^B%`%@TWL`dCK4|Da?DK6RG7UaH^8vlyG0f(k}hps@r-z^hm>`X&2Ro#-Pdw= z=Ih+fon!yE55~D3ZVFrFK~55iQH#~FvBh(+ zV_}es!nGINtp1ceXL2B3hQ|)zbCJ6SJMs1c%16eJWNeJfJgufKD7A8jW8fLS&IcVWzg~) z7-W8-S+|DmKYtwD5GBhj9tZd_RvQp=JGIYaeuo!uU0^GEOU>;e#^#i>f(v_8CUKi0 z=q+!zK{YCYm>$4AwcYeFiA_tDs~{Z%3pFQa!L3`+Z@)c+!9A?`^#7m~c}k*81yp_e zLF>7?Y)tZI_LgcqEQ)#S=;gXd6(N32b0a}&cKfQigMV0~dyCl)LXyrH26-|68gJ5h7kwy(qY z$5NE2X{{?(XRAEL_%w3I)|&m*c%(FKY_vJZc*8LK8h9+xM1W7p(%sF;EumrQFq_Lr zBrhp&-+u}&_f{3w3?5k-@DXDaajyYGr$a=@*wm~Hl_X^hLq<{PW=};fDQ#O!h2(q@ zM|WnEnJUs6am{O}wMs)q3gy&!=uE0S1BYkr!gz_loQSBtr6C^$yK5^5IuS+xj^;aw@@wRe&VT0GN(mUmP4BIyD$z13TH2Z@3-Ie# zZKJ1h-K9k&46O`!$l2Z64g~I|Q~avOo5z`ZfD^lV;@D+3u;!V(s> z^M9))wsK+`W=<~F3M|w*n0>k46{II5reWjm=IEZ>3Bt*N$o&?7US^##Bzh&&N>bP? zb#b%Pf%BzAVEa-}sJ@Pgjg7ggFprpN%;-vwn*_U%hPktog$yIDUe@6%4n_zF8WxW1 zz~}QdX()7Zm%$ieicLJCydgK%(Ztl+)_+o)myFi9bQQVX?=DEer){YzCamI`K7B~0 z%gF){c@r?e-H~7>B4yn$GZC-FD`;CVHxOrPU}|M!ZKx{AFK$vkH5sQ$^dlafmW7?I zwQbOmI%2uOK|{_tYYM&FYR63@6ElWfFI1zUHB0O2Eb%nZx3IG@6rrV8jqBb+BY!8e zJoQyMu6%b@#4)b&(4h}nru=}}55r$BHwH<*5{c?sY7Es8RQ2oV%67B0w8V_SNST{K zFk}FUUK=V3)uX(5?Ky|IX-G2&=M=fWQs68gV%LZ{aH2K&M4igFz)hx%k(yTAAc8i8U@=bRKIkdKKPh;%1HP^qpz-xsjZEv94D)^ zThYo&wbK2+eM_qB?B;0i;-A~Md#D?9tT|aXxSc?E=4Yvvon!7I*25VI?7Bb=@_2OV z<9$)0tj5*7wIMD}J^}8k^bAIoE69y1UAmWYHl7X|{AA4H(S7gh24U+%v46$_0?JrY zO=<)0j`|4E3Ftez*y@XO%O;O6Cs}FgIs%OKoZE|A+I27>9Q1gY7$K9UM@)YGH0C_r zN}_xyUv+R{1Yhh*QRiUQuy@wx=aBO&$NfCy&qlyu;1iYHjNJu$bsqeJ(uNk!i9KM% zX0r`9orJNohqJAvclyX;n}0kJdwAyp3dpN?6m-3vhi@&C_l0om;Pzxmbbm57ApHJvdqsZ3 z$Tk`_TbUXe;Oqao78j!$wY%Jx7aJTH81lMm2n0Fk17x{chl0$dWqF{!v~d6+Ow?p? zbY>SuV1djv#QXaMMrX9oVE4xURC#hlfL}mz-P~Ktzf)o^CTyQEHC`8+*ogIeh0iu+ zWH&AWimKA&U~li};(r0m`3qYp5Aya84D$2#^z=_G9bSDS16dQ|sg`f7_7&$=P5{WV z+?tVFKZiNJHoMY8{R4udOR*mHXxM5;aZ-@CPfW?s{+k}a2GX6RWX&pv`f@U=XLo>V zw|mlJi!fC|XWH^2{Jj05bNiODEWk=fdU#M^a7cJ!e$V33S%1FhNB>APZEkm>I6ec& z8;jnWsx2w$nuVZuM+@UIF9by8bbxTT9W!ki(U>_5O>LMwj3|oQ9L`Z=U=8VS~dt?PjOE>oh1hPCUn9mS>1 z*yWz9P0Hz5Tkgn+@bmKW_6?4&9s;3JOLh72f&Tt}zCPYw-tmn`r|Eukke-;1Z|7)R zN^*L{_*tvDU5Fq9n zqZPQNQhLWL3o3?}fw4jdG9z<_plHG zj&(HwAY7=Z#Y*N_+z6n`8VnbU+hYT#pSjm_Oa4(Hw8oYW?) zdJ_p<>M4i}2u>_*1q568M1Dry;{GAK4c{4W$O!fG4NfW>KaBQ|+#1LV^$SVNIe-(? zT5EnnNI-D*ATVz`6Ez9J{sDm@vANC5J8ShhrNiq01+6xxWOi?Vf!*Ne73A*PSYOxl z?|(>>x;NI`IJWuKW{@Z(bg{RgcjfEtD4`1j?L)IWh_4^QW?yylEcB}_IuW3S!Ty28 z-{H%N0iA}4?XNdTh3?GswhXWT4l~s0u9lHy=+`d-a;>+feF6T}a|mCX>>2oii`Eaz z)<8|;)ZSNj0J*m@-q$$^{v+&z;aj84ZGVejxgilVO{u!96ufrnQwO?B%+Mml=t#+# z3=ae9z~|aqzbYB%fexV5RFFqlOn_g^B(U^%>>AX6+{pXiouKoyoR-t_?-1iPzQhgag`s`ewd;j_4b!9tKhH( z)bH~7Jgn}ZLex?H$kR9!r{%Q#AB92qh(GPsD-S6-Z8G}mlXQu{`>&fC5kuR5Oy#hd zN*htqTNlpZF+NudvC;aW~5C8c2KBq(L8uWA%o|e<{7lJ_)Yb!PO!s!QcXalQ&H^5psNI#3p3aW$!HJRHk<|~C5Py)xsflv4 zyT6I$FKw)DV6Ow#;|#qvYs^8jkhL658q!xn!Xnb<0RpxKB!|p z-qt{j^r!D1@~atGL^l98YSSSa!uE$S2%m}9mlPHg6XFw8wv8Qy?0?n!C^OQ~bBjoF z+&uHdXAZsD}wz&^)?Vt<26}f3CDJi%< zWEXcFcS*R>obx)w-G4xoPd)cd*#4a)*1JrRW2c+&w49bdBMd4ioB)IMUKVPhnX$4` zwhaRXe9x6@H->B;o#Tsan_j{uzgo)_Vv-1J-bACpp_D%m1-u_e`yjh=IK>mwH}3IM zZ^IxOI$ocboR|>qsKLS}8c`4@%q$h%f%)HN5cv-z!Sj3Ld4Gy82#s@xR=@zS2x^RT zurxCTiixqAU1*@YiGiH4iKV7#SX~0gSt1`GZ5RqNT4KXOF6f!xw)9CEv_(-;dy}DQDp*6rA!Y~*gYfADX%-3l zu(&8U0|8;Vz%c7qLbf$n`_B%wTcm*tXyjURikFqCzJI)ws&B>cOhuT9uBHaIsA(E{ z`+At`%a{ZLiE<#hJm+bnfv77e$XL1KD>4C}((aW{+6wd=T)SsH42NuQt`^%;F&beb z7NJ2=0`$shy&vXM+3n5sFw<01SI70i*fHhAa8WyhzT!ku(SXCiQn|M%uY5?;^63sd zEvMyA2!DgnZ~vZl>8VLvvD*$`&t;R53W}TKd zY;C(O^DE=_V}p{xD!9)-aht$AG+<48U!@TD(4++uhfCEM>;qjSY-zBzSKo;|0OvQ1w?qlXg>=?Mu)Xt)Gk{6ZQye{7>u z9uKdmzNM*KD$(a5eQ*a~GI<%rJ$U%&DTi*-0gf-ladVlLjeM1p%XFj=*@K(6@NV6D%%K%E2^tMjdVJ>0 zHh{n2AN{hWSIKYyMN4)orJ!Ee7k{hWSIKc}Dnn;$e3y8HO?9x3U+ z`$IyqPfh_PC&PXvgHlq$si@$Tl!w23&Ifo4MnM4~CHW8Z|CkYx?vas0$$!cBv43Mm zhaC~cKDK+9uP{m~%r7ts>;t&|1Al+4^Vqj2p=4xV)g_XHi3MgA+r3XePyVKRWaKd5 z-7lM72*u%$u`>Xp0)~v8hoe!y)fOccj0`(WG71<4**+OL{OEZKatHzoJv`c|5HeEiT;bN85{8>PQZn2^9Bm9>ZYhE1p}6Nis1R~gA?Z66V%LHcyG%gk z`~TKa1B>{P7XO2?IbwgdbpwIb^}(B)DpSkKGaI@Gzr<;yue-6RXMcS5Por%>qQSkZ zAlzl}#^OLhRe5g92rjth8fdztraZZ%vTSM>cA#PT;WI_BMq>g)i1K!LyNiqx{I ziplx@>8Tzt{75+rNAFfwmZnu!Wt5i{On|n~Yn4q6?byqwo!#N8(XF}7$*zN_gbStZ z%$w)pZ=+)zh3^Ra1XCe{dbT0Uj@` ztjOz`J&Xbiu4}Bxu4`^N+%uC?J-L+?MPpl#gNuO0vg*q0*8b6h@xwa1o3g8GDi;na zT;CiktSry#ojX*-gK8UUvg=#gusZRry_K5Arp7hIzt?tlxwvg<_xDwS`hs6Szrw9N zV+r->Mi7P&w%c4(B@VM}0hZ`5zVHY`-i}Zy%@%(X}SPa=Uw$z4fvxjH# zxE0it<)ziVN{T)76_peP$^UWYES0pXwtHfdy*Q7Ud)CsS73lt2yN4Vn@tq$p-eWa- z-L}$Ub?v{-+%kV{LZFd@k>oe&e8U~NgsofA=!qCz9ws^8t}l%>g&W^`nzljqd!1i$ zr+s2v27VvvkOPSpf`Vcys^W|71gz4#_R;%gW}LJFO6rQD zykgc(d+4>^a!)C862*w&wLc^z7wWVAzn!P6pY{oZUDW1m{;uAzTv8Hi2lgNDsCrP%AMtEuXEmd=7Y{LDfIus<)=7bmC0#D<61>!}<0#0FSt zsk;_o-q;;1@Y7dOQqr`|Xq^Hg&2}XiD=TT4xP}J1C-z`Zm8k>~5%ZG44Q%)o8187; zZwlgL;EMV@SF^na*;^Dbz*K@pilVKwv`pQDy={LDG%S-x;AqrpOSFlqvWk{zaAxZ^ zX89*dT=mt|44lJ!EPU!e#LdYt3zw*HA151Ahlo1N^DAA2UM8AqD$4qvdGj#zN}02+ zg{`Hrg=c`1iDOjT5~k6%2s=YfbyYp*%mXA_Yjn`n@Xo?{${=@E)Tl45!qH)m2msyo;8Oq3?}~gkWR#^M8M;=;Gy*(z>y?)DdZ|rK+r~Z6Dvaf!JyaG_|ug z(K7al_AxVc&L4s84OT?hsz_)@k8BTeqwYExNI+rMJ~RD^Vs;RbF)+O)E-F$X`Q%3MOsuk1wV8FeBhBzu4-UA>K-PGWj2nAMQ$Dy!uCUSj#B z43_&m1-J=F(GZgJ&0l_}#`)K_+;Sd6I9w$pAb)g6wsr?Sp1}N+GbGMiTE!~)wX=T$ zzq)_d<|iXSp>`JQTy!nGJ?+iy{EK^mBtCPwLAEB!ik8I(zVD#%9A9HK9UDjC$ImRQ zKHx6;OgK0#b0;x>)yQ3aXfg0<8r~eu^fpvhv+#8`amb&5qR{*E#V*$2uS4t&3~b^n z26tE6!|e>zm6c3_f$Xl}*@keRj8%UibxuKeTFnw@G~C+J&)e16!P+&t0WiAQo-7Kp z(@|4a*70mu{Ln_WLyMlx9-F_QT%QqKYbJUV%m&`c)TWd59~ybhaD^@&I5Ss* z`5#F}b*9b5aG>qz)uxJ7?3)?EU*)etRv?;fXbUUgYf_0&?Mt(by)dU;)SNw_J$ zO4Q8WP?o;5m{~wtQC@OF`P|-!$8$V|ZXn`)rJb6XrHuifoW8dy>n&2vm?#ZmTJPcc zIx`Md`|SFP{DRhrbu_d^i<(v=I6WuHnf3a4(QIJ*%*SbS8wB^R9rS-1w$W(FO!Sb5 zM$NB!p`w@15Cwgh;k)tGKQ2kfRMr&4=yJUB8bEAK_tunEG`7`8Dlp4r&I~y} zyebgjr$b32WT>HO9GHKS>u;#%7@1XFUz=jZ&g}whcu+%(rlRWWkvHpr+$i9gJw^GfMlcj!AEqYAOwYi;$jHdR$RwbQwL#yhGf|NDJV4n+e->i- z=!&|EvhvDi00xJ>@I+v>t)>7_G1wAI|7?C;7pczT)Bx2%7rwrgf*XMMc3sIP%&v$ts@qq=*tFNF-y{rO8R+>7Bb| zw2bsL464Z=c$$9?*$}bVg-GFZB`nXUGCvl~ZY{KZ^3z3PdS?2UFNMA8LD)ocV+jm* zInuF^3rbS|00y^*qs-VO9k5y11}z8}?Zc$;xf7RXl3AW|h9!A0UjE1B>vWpA!=IDM z8@bZs`}m&^E%RGSe6__513Ffa+hbjokph>WxL_9yR2P3^CM>KKTbOQ0e(An>b$6&D z)4`h2(=bVRdT4SA>qUC0vP*?DMv?zallCdOZ?ihmL{v;Ct{_#9@W<;0mAgnZxYO#! z-|uYNqw>t9%3 zp5-LXVp@N;F_G(~s-zoTTvL>pKd=QG36W)>#r2Smnn@X=)5usViEwI|>M*fc*3AwFu#(6{mDN?2 zl~*)xA~$l~G{lvyk_(em?|pO2y6Zz2+?g6`N)W$v-x{mlfsWUNNU@9fWassh3s5NjN>jQ%r`7M@H_A;8^71qlp(Mh8LCelBAjp3~ zaUG8{0Yhd}xxR{WdT+-iN37?+3xoT`hOcO}lV)~t;u2!IK1PvS7GO0Xpr!fQnZvTM zyuLhKq(XQVU)ZkkKxMO?$oA_MF4M^DdfX`r9x8EA;>Yxm>dODSrq^;TO9_f)xTn!{ za0ado#hXj8v$E3O`Qfr$YO6ank<)+hMy&!dUq(l5sH$=Za8_<4ykan|pFgmjd*?+pUHL%gJ7i5j=i1ZeLPqXXlgf@SnAMc$#Pv!!vwNh!yL)gBCvkoe44QvErgrad zcOfHltW4p2&J`AKNBQ6d4H-3$RaW2r=fGfJCe7- z2r&~-a>tzi=pGX)BFoD4wZ%7UHov~zAI#6Ik&vAhmp440MfW3V+$X>n+~aQ~tlQg(m!;A|fMInvPK zJhn?DfrH~!1sRD}I&${bnv7hAdF2_=*+bK5)W4F4RmAYniAObbw|D27P;uB-CkkAA z?m94%ADh-x?88W_R*U2D;}l}9ve^OxOj!r zBs{Yg02ffTsj{>~GJt<@P0A0RI`tecTg|xOKX(AwbohE@h!lrXCa@nG4W6^R4s5O^ zu-(Hp25v|;5mQPykVjgTu2FaluWf=sATW3v2HPkOFj3I)pM1O4WUgmINk!3$k~Xb7 z?Ork%Ijg~rm^E<&T*!G}8nco1mj+AY9EHe;#r$elYUF>T4qtykppcN26e)c141mg7 zofJgvSAk{P!uB}8_+vZ zCiqyaavKE)Pd8)+YVp%DEBf|z`Z91^*Ny}2HYnU65B?Bm8#u197GYp=cRo#*Mj@g$ z!ctDdwO|2;8gYN4y02T;=Rrc}H`0@-BV$&a7Ub!!Mfa55s=R*zGeIEm*7hC{Y-}>u zPf1RvWbGsvM6`KJ(@MFwE$+V=Ze6qjw|qGay;Eqz`0&Cn=g$2KlnW1OO-2BXX_SJb zVtDnzRzd77cNE3jt8$XjD3r|&dTU7=_?It1k%Nve?rMKG9y?L%(e!uK>XF#huL@J( zk_p2cMsu-J6k2J`uGA#%BkOf)6vBC3HKFQC0RW}1#xm2t4TBvR7<4+)4X(vf6Y7>E z^WEpp*xH*26TJTY4`+e?{_^AZ7r6`i23>Zj6vm0_<#Kdji&7}N=Fi3?F1eW7jA9Lw5k@JSedWgt6HBRU0 z6VYl{&m6G0NCXrDJ@)N2<{0q71Rs_lpfQr zEEG<)&DJl^|AJkzbHDuXD}lC!IxnwcMD;kPgL8lW&(HH!;D!K)L1FOYg6(d0cpD1q zg#jcyVNdtMrVfC?9!Cl?hXbSkg#-a^t&Dac-SBn}-C5eSso_|GLm1=*V6cMyDpU44 z5{=yNisPe{$ipzihTjC(!3Dpb^wp}-&%fk6^@jTt4scW0&P-P>wiPz<0g zXB(5V+F~=JY-9>E%SYFZZ5^%y5)OsJ5U77+U~nPVo>M2W%Fn?ruAtnITPeAB5w^e5 zRg&PS!9_|bTQFE_sV47{1xQ0fM$eu(_Z|;}6OK=CFbG{O^B3aMDg%h3&ytYIzGDTw zmMeG+4DOfm;SpOmtOMGTmBEg|jrlSkQ9k+CeHeP)o*3J}^c}L4$9w4xmmn9Ql8RQg-&NwYB6VzKzm3zE42E-WSK^XLb5tzv0(zP@G{ zj732&9tPgvc3{`TiiN-bk)s@ZqULP3MhcHMeh<+5eE@?X(B#-E=FRzva3x9Ag0Tj5 zMjnrd}8F1QmLjDA@rCi??G~E?(8Bc?SmlUA%oAWat=m z()u7sGy*hO*9zb^xH(>1StW7sjba@B1_qI%Ddrr)MkQl!J0I`&6u61-+m4^e^VV8w zs(WW*6Uw8u#zp`D*qLp#V4-xWt+&@u@dVNVgTiQjzM|Ri2^fSd75In>8rOeedQz-T zd0QgB*$o4OqgWWse-{Q#>JNot=wgqrG_6tj5mN)p7rXz zo@oyJ5;jGpPVz$bNt1gg!r)VC+n!DIR+aqOzy0qM+5Dzl7f~^r0pu6Mpu`&(v>(_) zgDPZx`rCH|qLFc)qOuMcDQtf$TJYHmx zplG)HERmzg?P~FB51fC85%VS9qI}B5E6agA)RK{H5cs&=)AJ%lTkGu+0#t&zoA4TQ zem3*e707@F9-c-G7`9lcLGsKR=S@56&LHU8GQE3vHL;Ro@bD3*@AAno=zjo%%Bejg zBO@z-Q`=&z72^xX&Z%evDGkrkJ@lg6i=Xa0bbky6fm3a_Gt+;PogHwp9dH*QQ;h+* z=B)~xP~4hnr=**9v{I1vK)&a9Zr!9BV-HT`#e5v`K1S47Rv42&HXqm5Y(8Hq12}zPxqi>NPwviKs>(A?93)+Ou1CpOLW& zuo5Zb0v9Z$N{D}&oz{UX+jrIapzh~f*C12DLlW6rLXy*gjvC&o<0#3804_~f~1(_nuf6Ia++f4-T9Lq&F|yH{KT zcsx^u9{9$M#$@Nt{`BL|KmPM7iMmT_pfSzafBf|8 zdCaN&BauZ5HgWh$v6qm9bI*w)0jM4WgP!SQ*eO_w5GT2XcjxXs0x{VEz7cNuj=7O>J1vUN>56=E{lU^%t0Jsl_b^Eg3yL#ouV+kMZ)NOY8 ztI*v%`}1S5z_D%Mf^4qPi1^~Us|0MW`BPZQFjJZK(bbE;QR^1~XFO!3!dvYA*`I%I zG3pf!0|x=5)0^eal`A*#W&GO@ScD;0dLg&gLl}gECqsoEa=P{%vn0EV#U5g2>Gffr z?kS};))EEcW3Wk`w_$ zz~sNYspGcU*XMrEtNEI>pe1AKyRus4+Xh0Y&phKgM3Ec7&WZa?9&1iHPsI6bqn zF&-<$rc*TeW|cp8v^C6EIm-S>3p~`9QTM0&`ToX*?t%y7R2h|n`wydT?yYqC$g7on zrBxpavbnY}GrO`r63R!XSNngbj^Nbmr!FKSCN3f4kogu7ZT3`l&F&q??|mM)Zj`#K z%W6AStbO{~=`?30NfA*&L7j+hIC^(xWO(GL3=dDO?fx-|l6I%s`-YabKF44TwYNT4 zQ$P3dXO`MCEfr-Q3Wq+CNg1^}H#+k6h$fam&_CF0Z7R}8l3mtsVE=#X@L*?l^qo1M zSO&xXV_D3O-Crosbg`9g$o#*i#pC(?-V#?OK0aPPS;yQr3Ch2q^jXW>M4G@_z{f~uaGZP>qYhCjXiS6fQn^so@q z!@l|5KW9o?)L$lb;AxJ-4`yV&t+ePZLMW{4p4x)`{$22Sd*TyMq5iLL?2|h1*P*zR zhwyJD`md54P+#BP{}uE={bdLN^{?$WY@#k9A--i1sCewPog{xd4J(g9!-4K_y*xfX zw`S-gO0W4O6Ja4C^?;s34iq|Bm!K;mWS-Wxj$yPWf)&ggmb*N4JOHl#s5?S|jfqprFu4tDaDtjjwUc{APs6}tRIvsbDRQ<9 z?*7>O`xBY&8oYmuj1tbp8(5XiMn{-DDmx z7SXVQDF1+*=B1ByV7%)425qrCs_(H(hGkW#|(qfs3AW|y@H*O?Kk9N zLx4031DB$0;Q&^fwpL{?C&0nZV-Pop89_sun@8f%M^yv^u~rJ)%*=9LwSeLWg_x`L zm11V#R(2>GgP|8wwM<^me4HcPtap}Xp?t|AXBjt!dk`@eXC^1WFQ5}Qw%F*R<=lKS zA?$URCHa2`7rgOex)O@`BYT_RtBIjvG7P( z#x#|t_(m2?eF+gDmfGXgxv5F1_+1J|cE(~93^IS$P8MWPpmrY>9vUhdR#C&$jt`9V z5c|W$&Sw5yA8QaYmE)zw%g7+^Sg?wX!+u0rDV;m$%`z*Sn4X1?>h)%`4FowjcqN>3 zr{AY66yQfIXI}j=u@wRC%CHk=r03TU>jBh>sDUUG;a4;~V%F_|A8vnKkbg$QM@@}4 z>Rf-6g*e%`w4-_fzt)~~13^Yga#|tdm>~=)js(gX792hbu8MNdvxuDqrW83|n39_A zLiQ6;(xEbWHp5!hD!g~~#7)<4K>FM?t#4-g;EDaQ7&}Ep z5;A5D`{)`o9y&$O(x#5)srC}nJi4K+EKHW3J9Yul5n?E+YFpf1X-
Y3C$#Q`uQo@^afyW2H~Wjfk_>Cw*=bd~_uO^j#M2hK-l#+V z!nB}0+eK4c$9D(@iWa68@-FCVO;>**B)02=jOV(`Nt(5ss4Cnmbx;!4^RDVFGkoz> zwF-n-uhXU=wJ2=QuvZl~3>n>-uzN{m*0^@^dA}0Ga)-e>x3jCQrLAKg2R9vNFC_w6 zh9(v^p`g)p88WVP&`EQ+T^eDfs2TpoLPYC~6>l3|f4**TFATB9t*(HQ48&_6<_fL)U<>ua7*}>tRWF2*>UlS_LP^Xv8HI7dA6!5j<0`bU?+88GggXG z&@HQ@JxlG`GxLtU^?}^T_~Ndfat9u&S1#qCoeuSTj}P8iZu2peuu46!S3+Vo#$E;I z1(MfCcWR&#MIr6i&2uN=cE2G7bwKwUSlH%%wVM>wD&7I@|BS^3tklqucc1T`j<_W2(?VMmi|{wLH6QT*t~A zzF=b@%$Q#@{Lp)OGfUvPPzHuF_NF2f81xcrf=y)g{cA7{EeC(oTowKQ*n118IMZxx zlylCU9_yK&c9(d^1p)+jcXxLuxCaj&2$0|e2=49#cXun?igNe5-&X}B>6y+*|L5F) z?(J`7tpHW^)+_tj_HJo~Px;)q`Vf5gT8*=jQA#g~^2+g!M*2y~13F=@F4WLCZiC6( zFLYIQFWQ`mzWINH$pCOPq}>8XLBptqr=Dg$>4U(#4^jlb(QPI%iGy+CBA%nC%3r^$ zynfmwup#6Y+q?27x3Ne0URI9Ltd#Jr*z4b!4%5LI=GX}sr5`a@)3uEJTNY1F2)mG~ zEZ{H#s9+;69PRyE`d=vW8kDob6i587-E!<6D705I2U~wR<7=$$YCc=XGIw$$F6p

0nJV{GJB-IOMK-=G@IU||gUT)XSBz{CuN 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

-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�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 bD>si@ZZ_8`#ib-qo|K~G set txpower [] phy set txpower [] Specify transmit power level and setting type. + diff --git a/TODO b/TODO index 531fe12..9be6027 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,6 @@ 1) overall o make a cli as well + o determine if rfkill issue is related only to ubuntu 2) libnl.py o see (1) in RFI 4) pyw diff --git a/__init__.py b/__init__.py index 98ed3e0..0321a1a 100644 --- a/__init__.py +++ b/__init__.py @@ -1 +1,3 @@ -# root Distribution directory +# PyRIC root Distribution directory +# Do not import from this directory i.e from PyRIC import foobar +# use pip to install or import from pyric diff --git a/examples/device_details.py b/examples/device_details.py index 613c41d..a115b40 100644 --- a/examples/device_details.py +++ b/examples/device_details.py @@ -1,7 +1,8 @@ #!/usr/bin/env python -""" device_details.py +""" details.py Example for displaying device details + """ import argparse as ap @@ -67,7 +68,7 @@ def execute(dev): try: dev = args.dev if dev is None: - print "usage: python device_details.py -d " + print "usage: python details.py -d " else: execute(dev) except pyric.error as e: diff --git a/examples/pentest.py b/examples/pentest.py index 3a8c99e..422f0ca 100644 --- a/examples/pentest.py +++ b/examples/pentest.py @@ -2,6 +2,7 @@ """ pentest.py Example for setting up a wireless environment - must be done as root + """ import argparse as ap diff --git a/pyric/docs/res/PyRIC.bib b/guide/PyRIC.bib similarity index 99% rename from pyric/docs/res/PyRIC.bib rename to guide/PyRIC.bib index d4b702d..d159770 100644 --- a/pyric/docs/res/PyRIC.bib +++ b/guide/PyRIC.bib @@ -1,3 +1,4 @@ + @Misc{libnl, Title = {Netlink Library (libnl)}, Author = {Thomas Graf}, @@ -44,4 +45,4 @@ @Misc{gplv3 Shorthand = {GPL}, Url = {http://www.gnu.org/licenses/gpl.html}, Version = {3} -} \ No newline at end of file +} diff --git a/pyric/docs/res/PyRIC.tex b/guide/PyRIC.tex similarity index 86% rename from pyric/docs/res/PyRIC.tex rename to guide/PyRIC.tex index 918e325..e6009a3 100644 --- a/pyric/docs/res/PyRIC.tex +++ b/guide/PyRIC.tex @@ -19,12 +19,12 @@ % % __name__ = 'User Guide' %__license__ = 'GPLv3' -%__version__ = '0.0.2' -%__date__ = 'May 2016' +%__version__ = '0.0.3' +%__date__ = 'June 2016' %__author__ = 'Dale Patterson' %__maintainer__ = 'Dale Patterson' %__email__ = 'wraith.wireless@yandex.com' -%__status__ = 'Development' +%__status__ = 'Production' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \documentclass[11pt]{article} @@ -72,7 +72,7 @@ basicstyle=\footnotesize } -\title{PyRIC v0.0.8: User Manual} +\title{PyRIC v0.1.0: User Manual} \author{Dale V. Patterson\\ wraith.wireless@yandex.com} \begin{document} @@ -80,20 +80,41 @@ \tableofcontents \section{About PyRIC}\label{sec:About} -PyRIC is a python port of (a subset of) iw and by extension a python port of -Netlink\cite{spae} (w.r.t nl80211 functions). The goal of PyRIC is to provide -a simple interface to the underlying nl80211 kernel support that handles the -complex operations of Netlink seamlessy while maintaining a minimum of "code -walking" to understand, modify and extend. PyRIC will only work on Linux -with Netlink support.\\ - -While users can utilize libnl(.py) and libio(.py) to communicate directly with -the kernel, the true utility of PyRIC is pyw(.py). Like iw, pyw provides an -interface/buffer between the caller and the kernel, handling all message -construction, parsing and transfer transparently and without requiring any -Netlink knowledge or experience. \\ - -At this time, PyRIC (through pyw functions) can: +PyRIC provides wireless pentesters the ability to manipulate, identify and +enumerate your system's wireless cards programmatically in Python. PyRIC provides +functionality offered by command line tools like iw, ifconfig, iwconfig and rfkill. +Why use subprocess.Popen, regular expressions and str.find to interact with your +wireless cards? PyRIC is: +\begin{enumerate} +\item \textbf{Pythonic}: No ctypes, SWIG etc. PyRIC redefines C header files as +Python and uses sockets to communicate with kernel. +\item \textbf{Self-sufficient}: No third-party files used, PyRIC is completely self- +contained +\item \textbf{Fast}: (relatively speaking) PyRIC is faster than using iw through +subprocess.Popen +\item \textbf{Parseless}: Get the output you without parsing output from iw. Never +worry about iw updates and rewriting your parsers. +\item \textbf{Easy}: If you can use iw, you can use PyRIC +\end{enumerate} + +At it's heart, PyRIC is a python port of (a subset of) iw and by extension a +python port of Netlink\cite{spae} (w.r.t nl80211 functions). The original goal +of PyRIC was to provide a simple interface to the underlying nl80211 kernel +support, handling the complex operations of Netlink seamlessy while maintaining +a minimum of "code walking" to understand, modify and extend. PyRIC will only work +on Linux with Netlink support.\\ + +While users can utilize libnl(.py) to communicate directly with the kernel, the +true utility of PyRIC is pyw(.py). Like iw, pyw provides an interface/buffer +between the caller and the kernel, handling all message construction, parsing +and transfer transparently and without requiring any Netlink knowledge or +experience. \\ + +PyRIC does more though, via fcntl it implements rfkill, allowing users to list, +block and unblock devices as well as implement libio(.py) for ioctl communication +with the kernel providing users the ability to turn cards on/off and set addresses. + +At this time, PyRIC (through pyw, rfkill and device) can: \begin{itemize} \item enumerate interfaces and wireless interfaces, \item get/set regulatory domain, @@ -105,8 +126,9 @@ \section{About PyRIC}\label{sec:About} \item get supported commands, \item get supported modes, \item get dev/phy info on device, -\item get/set mode, and -\item add/delete interfaces. +\item get/set mode, +\item add/delete interfaces, and +\item block/unblock devices through rfkill. \end{itemize} It also provides users with the ability, through libnl(.py) to extend the above functionality by creating additional commands.\\ @@ -114,21 +136,6 @@ \section{About PyRIC}\label{sec:About} Currently, PyRIC does handle multicast messages i.e. events or dumps although plans for future versions include adding the ability to process dumps. \\ -There are other Python implementations but many have not been maintained and most -attempt to provide a full implementation of Netlink with nl80211 functionality -as a side-project. Unlike those, PyRIC is: -\begin{itemize} -\item Pythonic: No ctypes, SWIG etc. PyRIC redefines C header files as Python and -uses sockets to communicate directly with the kernel, -\item Self-sufficient: No third-party files used, PyRIC is completely self-contained, -\item Fast: (relatively speaking) PyRIC is faster than using iw through -subprocess.Popen, -\item Small: PyRIC is roughly 420kB, -\item Parseless: Get the output you want without parsing output from iw. Never worry -about iw updates and rewriting your parsers, and -\item Easy: If you can use iw, you can use PyRIC. -\end{itemize} - \subsection{Naming Conventions} The terms interface, device and radio are all used interchangeably throughout to refer to a network interface card (NIC). The following terms will always have one @@ -162,11 +169,11 @@ \subsection{Cards} created and two messages have to be sent, received and parsed in order to execute the command. With Cards, the ifindex is requested for only once. \\ -Keep in mind that any identifier (phy,dev,ifindex) can be invalidated outside of -your control. Another program can rename your interface, that is change the dev -without your knowledge. Depending on what functions are being used this may not -be noticed right away as the phy will remain the same. Also, usb devices (if the -usb is disconnected and reconnected) will have the same dev but the phy and +Keep in mind that any identifier (phy, dev, ifindex) can be invalidated outside +of your control. Another program can rename your interface, that is change the +dev without your knowledge. Depending on what functions are being used this may +not be noticed right away as the phy will remain the same. Also, usb devices (if +the usb is disconnected and reconnected) will have the same dev but the phy and ifindex will be different. \subsection{Benchmarks} @@ -198,8 +205,8 @@ \subsection{Benchmarks} \label{tab:benchmark} \end{table} -While small, these change improve the performance of any programs using pyw. -Table 1 shows benchmarks for hop time on a Alfa AWUS036NH conducted 10000 times. +While small, these changes can improve the performance of any programs using pyw. +Table 1 shows benchmarks for hop time on an Alfa AWUS036NH conducted 10000 times. Note that we are not implying that PyRIC is faster than iw. Rather, the table shows that PyRIC is faster than using Popen to execute iw. Using one-time sockets, there is a difference of 28 seconds over Popen and iw with a small decrease in @@ -207,73 +214,6 @@ \subsection{Benchmarks} dramatically when persistent netlink sockets are used with the total time and average hop time nearly halved. -\subsection{Hierarchy/Architecture} -PyRIC's hierarchy is briefly discussed next. - -\begin{enumerate} -\item \textbf{\_\_init\_\_.py}: Initialize PyRIC, the root distribution directory -use for PyPI packaging -\item \textbf{README.md}: self-descriptive -\item \textbf{setup.py}: install file -\item \textbf{setup.cfg}: used by setup.py -\item \textbf{MANIFEST.in}: used by setup.py -\item \textbf{LICENSE}: GPLv3 License -\item \textbf{PyRIC.pdf}: this file -\item \textbf{TODO}: lists any outstanding TODOs, ideas for future revisions -\item \textbf{RFI}: comments and observations about netlinks, nl80211 etc -\item \textbf{examples}: examples directory -\begin{enumerate} -\item \textbf{pentest.py}: create wireless pentest environment -\item \textbf{device\_details.py}: display device information -\end{enumerate} -\item \textbf{tests}: test directory -\begin{enumerate} -\item \textbf{pyw.unittest.py}: pyw unittesting -\end{enumerate} -\item \textbf{pyric} package directory -\begin{enumerate} -\item \textbf{\_\_init\_\_.py}: Initialize pyric defines the EUNDEF error code -(PyRIC uses errno for all errorcodes adding EUNDEF) and the common exception -class, 'error' - all submodules use this class for any exceptions. -\item \textbf{channels.py}: ISM and UNII frequencies and channels, with conversion -functions -\item \textbf{device.py}: device and chipset utility functions -\item \textbf{pyw.py}: this is the interface, providing wireless interface -manipulation functions -\item \textbf{lib}: lib subpackage -\begin{enumerate} -\item \textbf{\_\_init\_\_.py}: initialize lib subpackage -\item \textbf{libnl.py}: netlink API -\item \textbf{libio.py}: ioctl API -\end{enumerate} -\item \textbf{net}: net subpackage -\begin{enumerate} -\item \textbf{\_\_init\_\_.py}: initialize net subpackage -\item \textbf{if\_h.py}: inet/ifreq definition -\item \textbf{sockios\_h.py}: socket-level I/O control call flags -\item \textbf{netlink\_h.py}: port of netlink.h -\item \textbf{genetlink\_h.py}: port of genetlink.h -\item \textbf{policy.py}: defines attribute datatypes -\item \textbf{wireless}: wireless subpackage -\begin{enumerate} -\item \textbf{\_\_init\_\_.py}: initialize lib subpackage -\item \textbf{nl80211\_h.py}: port of nl80211 (commands \& attributes) -\item \textbf{nl80211\_c.py}: nl80211 attribute datatypes/policies -\end{enumerate} -\end{enumerate} -\item \textbf{docs}: docs subpackage -\item \textbf{\_\_init\_\_.py}: initialize docs subpackage -\item \textbf{nlhelp.py}: functions to search display nl80211 constants -\item \textbf{commands.help}: nl80211 commands help data (json) -\item \textbf{attributes.help}: nl80211 attributes help data (json) -\item \textbf{res}:resource subpackage -\begin{enumerate} -\item \textbf{PyRIC.tex}: LaTeX for user guide -\item \textbf{PyRIC.bib}: bibliography for user guide -\end{enumerate} -\end{enumerate} -\end{enumerate} - \section{Installing PyRIC}\label{sec:installing} Starting with version 0.0.6, the structure (see Section \ref{sec:About} has changed to facilitate packaging on PyPI. This restructing has of course led @@ -282,10 +222,7 @@ \section{Installing PyRIC}\label{sec:installing} Obviously, the easiest way to install PyRIC is through PyPI:\\ - \texttt{sudo pip install --pre PyRIC}\\ - -Note the use of the '--pre' flag. Without it, pip will not install PyRIC since -it is still in the developmental stage.\\ + \texttt{sudo pip install PyRIC}\\ You can also install PyRIC from source. The tarball can be downloaded from: @@ -338,16 +275,12 @@ \section{Installing PyRIC}\label{sec:installing} \section{Using PyRIC}\label{sec:using} As stated previously, PyRIC provides a set of functions to interact with your system's radio(s) and the ability to interact directly with the kernel through -netlink and ioctl sockets. \\ - -It is helpful if the reader has a basic knowledge of netlinks. For a review, see -"Communicating between the kernel and user-space in Linux using Netlink Sockets" -\cite{spae}. +netlink and ioctl sockets. \subsection{Interacting with the Wireless Core and Wireless NICs: pyw.py} -If you can use iw, you can use pyw.py. The easist way to explain how to use pyw -is with an example. Imagine your wireless network is on ch 6 has been experiencing -difficulites lately and you want to capture some traffic to analyse it. Listing +If you can use iw, you can use pyw. The easist way to explain how to use pyw is +with an example. Imagine your wireless network, on ch 6, has been experiencing +difficulties lately and you want to capture some traffic to analyse it. Listing \ref{lst:pentest} shows how to set up a wireless pentest environment. \\ \begin{lstlisting}[caption={Setting up a Wireless Pentest Environment}, @@ -517,8 +450,12 @@ \subsubsection{One-time vs Persistent Sockets} modes. \\ Use Python's built in help features on pyw functions or see Appendex \ref{sec:pywapi} -to determine what type of -socket is needed. +to determine what type of socket is needed. + +\subsection{Additional Tools: channels.py, device.py and rfkill.py} +In addition to ifconfig and iw related functions found in pyw.py, PyRIC provides +a port of rfkill, channel/frequency enumeration and device chipset, driver +retrieval. More information can be found in the Appendices. \subsection{Interacting with the Kernel: libnl.py and libio.py} The kernel interfaces, libnl.py and libio.py are located in the lib directory. @@ -530,7 +467,11 @@ \subsection{Interacting with the Kernel: libnl.py and libio.py} \section{Extending PyRIC}\label{sec:extending} You may find that pyw does not offer some of the functionality you need. Using -libnl.py and/or libnl.io, additional functionality can be added to your program. +libnl.py and/or libnl.io, additional functionality can be added to your program.\\ + +It is helpful if the reader has a basic knowledge of netlinks. For a review, see +"Communicating between the kernel and user-space in Linux using Netlink Sockets" +\cite{spae}. \subsection{Porting C} All Python ports of C header files can be found in the net directory. C Enums @@ -712,6 +653,51 @@ \subsection{Netlink and nl80211} Everything else is handled behind the scenes by libnl.py. \begin{appendices} +\section{Hierarchy/Architecture} +PyRIC's hierarchy is briefly discussed next. + +\begin{enumerate} +\item \textbf{pyric} package directory +\begin{enumerate} +\item \textbf{\_\_init\_\_.py}: Initialize pyric defines the EUNDEF error code +(PyRIC uses errno for all errorcodes adding EUNDEF) and the common exception +class, 'error' - all submodules use this class for any exceptions. +\item \textbf{pyw.py}: this is the interface, providing wireless interface +manipulation functions +\item \textbf{channels.py}: ISM and UNII frequencies and channels, with conversion +functions +\item \textbf{device.py}: device and chipset utility functions +\item \textbf{rfkill.py}: Python port of command line tool rfkill +\item \textbf{lib}: lib subpackage +\begin{enumerate} +\item \textbf{\_\_init\_\_.py}: initialize lib subpackage +\item \textbf{libnl.py}: netlink API +\item \textbf{libio.py}: ioctl API +\end{enumerate} +\item \textbf{net}: net subpackage +\begin{enumerate} +\item \textbf{\_\_init\_\_.py}: initialize net subpackage +\item \textbf{if\_h.py}: inet/ifreq definition +\item \textbf{sockios\_h.py}: socket-level I/O control call flags +\item \textbf{netlink\_h.py}: port of netlink.h +\item \textbf{genetlink\_h.py}: port of genetlink.h +\item \textbf{policy.py}: defines attribute datatypes +\item \textbf{wireless}: wireless subpackage +\begin{enumerate} +\item \textbf{\_\_init\_\_.py}: initialize lib subpackage +\item \textbf{nl80211\_h.py}: port of nl80211 (commands \& attributes) +\item \textbf{nl80211\_c.py}: nl80211 attribute datatypes/policies +\end{enumerate} +\end{enumerate} +\item \textbf{docs}: docs subpackage +\item \textbf{\_\_init\_\_.py}: initialize docs subpackage +\item \textbf{nlhelp.py}: functions to search display nl80211 constants +\item \textbf{commands.help}: nl80211 commands help data (json) +\item \textbf{attributes.help}: nl80211 attributes help data (json) +\item \textbf{res}:resource subpackage +\end{enumerate} +\end{enumerate} + \section{API: pyw.py}\label{sec:pywapi} \subsection{Constants} @@ -840,6 +826,78 @@ \subsection{Functions} \end{itemize} \end{itemize} +\section{API: channels.py}\label{sec:channels.api} +Channel, Frequency enumeration and conversions can be found in channels.py. + +\subsection{Constants} +\begin{enumerate} +\item \textbf{CHWIDTHS}: imported channel widths from nl80211\_h +\item \textbf{ISM\_24\_C2F}: Dict containing ISM channel (key) to frequency (value) +pairs +\item \textbf{ISM\_24\_F2C}: Dict containing ISM frequency (key) to channel (value) +pairs +\item \textbf{UNII\_5\_C2F}: Dict containing UNII 5Ghz channel (key) to frequency +(value) pairs +\item \textbf{UNII\_5\_F2C}: Dict containing UNII 5Ghz frequency (key) to channel +(value) pairs +\item \textbf{UNII\_4\_C2F}: Dict containing UNII upper 4Ghz channel (key) to +frequency (value) pairs +\item \textbf{UNII\_4\_F2C}: Dict containing UNII upper 4Ghz frequency (key) to +channel (value) pairs +\end{enumerate} + +\subsection{Functions} +\begin{enumerate} +\item channels(): returns a list of all channels +\item freqs(): returns a list of all frequencies +\item ch2rf(c): convert channel c to frequency +\item rf2ch(f): convert frequency f to channel +\end{enumerate} + +\section{API: device.py}\label{sec:deviceapi} +Retrieval of the driver and chipset of a given card is found in device.py. + +\subsection{Constants} +\begin{enumerate} +\item \textbf{dpath}: path to system device details +\item \textbf{drvpath}: path to device drivers +\end{enumerate} + +\subsection{Functions} +\begin{enumerate} +\item ifcard(dev): returns the device driver and chipset +\item ifdriver(dev): returns the device driver +\item ifchipset(driver): returns the chipset associated with driver +\end{enumerate} + +\section{API: rfkill.py}\label{sec:rfkillapi} +A port of the command line tool rfkill, rfkill.py writes and reads rfkill\_event +structures to /dev/rfkill using fcntl provding functionality to block and unblock +devices. + +\subsection{Constants} +\begin{enumerate} +\item \textbf{RFKILL\_TYPES}: list of strings corresponding to the types of devices +supported by rfkill +\end{enumerate} + +\subsection{Functions} +\begin{enumerate} +\item rfkill\_list(): corresponds to rkill list, returns a dict of dicts name -> +\{idx, type, soft, hard\}. If type is 'wireless', then name will be of the form +phy such that n is the physical index of the wireless card +\item rfkill\_block(idx): soft blocks the device at rfkill index idx +\item rfkill\_blockby(rtype): soft blocks all devices of type rtype +\item rfkill\_unblock(idx): turns off the soft block at rfkill index idx +\item rfkill\_unblockby(rtype): turns off the soft blocks of all devices of type +rtype +\item soft\_blocked{idx}: determines soft block state of device at rfkill index idx +\item hard\_blocked{idx}: determines hard block state of device at rfkill index idx +\item getidx(phy): returns the rfkill index of the device with physical index phy +\item getname(idx): returns the name of the device at rfkill index idx +\item gettype(idx): returns the type of the device at rfkill index idx +\end{enumerate} + \section{API: libnl.py}\label{sec:libnlapi} Providing libnl similar functionality, libnl.py provides the interface between pyw and the underlying nl80211 core. It relates similarily to libnl by providing @@ -977,8 +1035,20 @@ \subsection{Functions}\label{sec:libnlfct} \end{itemize} \end{itemize} +\section{API: libio.py}\label{sec:libioapi} +A very basic interface to ioctl, libio provides socket creation, deletion and +transfer. + +\subsection{Functions} +\begin{enumerate} +\item io\_socket\_alloc(): returns an ioctl socket +\item io\_socket\_free(iosock): closes the ioctl socket iosock +\item io\_transfer\_(iosock,flag,ifreq): sends the ifreq structure with sockios +control call flag to the kernel and returns the received ifreq structure +\end{enumerate} + \section{Copyright and License}\label{sec:copy} -PYRIC: Python Radio Interface Controller v0.0.5\\ +PYRIC: Python Radio Interface Controller v0.1.0\\ Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com)\\ diff --git a/guide/nlsend.png b/guide/nlsend.png new file mode 100644 index 0000000000000000000000000000000000000000..c31e5b6a4098319276f1d39192176ac0d0681c72 GIT binary patch literal 90242 zcmafaWl$YWur`6~ zrfPe(r)zrl=}2WoX=DTf1PBNSWLX&rRS1YLHUH}Ma4`SMP8-(2e-9W_IcW)q&;PFc zuCnBR68Il7I<629h?xJ~Um!BG@%{;6fwBscu-h<@*d(xZ=+YPeMEF2SZJ@Z5gM)=5 z5JKF=!USkxPUc|)v?i05RZ!LnLcxWAAcK&V5LNeFJ5c@>j)*jSD7nPUs zIoL%OCAcicKVNyvl%^)f-L;m0TSgmtZI!vAb)@|DAKo6>e{BCY4V3t{ zqZtNg8Wch==lMOXe2H8x-NWg;oere%ckfZ6rIb20@|C64`mO&TK5p>>V{#DK z?1mWtYJ1q;HyWy9B8PNjOB2bF& zUvstSS^TCIJN$D%MF`rr(r@y5s0UB^~gwQMji~2cYZNJ{nI;YWzJE2d1;h-(i zgkltflZI<(?-|2p#{CD-rDQWePA*oR&O#?GR2`6iEULf_Ys03oKC@~_9ojytrLv@J zi~a@X%UFskVhEavR`vgA)2%c^ha4&fphX(PO)0IwCjihKd!``V(J{G05`t>V9iuF{ zEl(s(2>efGZ1L5sE;4>-y*hOX+;LI+KDq~B(C^Y~^CN8Wk zmGQ90zJiVx_)bwUTzWq+60vY`9~$-Q&}JZ;!CLl~p(Ioha8mPlfOKxgxY0eOh_T%% zyb(WS=F%5h*4}dVp8|r{ZkT`lt>N8Z$RLU=_5cnFg>?eHz@Il`JU?MeBn2|C8zl58 zvlb(@>kyjw&^XljEF=mYG{418alme%=+YJSc)%KjN zYnZ8vIq%qf*A$k|pQ^an_`7=p#o~~h$t zPcny2Z@qU_7?aLeRw+EA80WMM)G)?dsG@`Slqx&juhx;7-%n%xVM%=sGJk?NCvu?~ zgM`W&uY>Z`UZZ>3asKSXDvg0t)fXP$X9&(}tGDgfbTO0^PE_jI+8NT0pJ(6|l!itS z0}bo%zkg->1lyf{cz6^n>rZVJpM~~laQAIu3*H_)N^LHCq>db$Y~Aa+zskQGx!t;* zvKvVW8Zr417FHsR?tK9S35mR0&e-DBLs8foV#aU17Rw;rCN#IIy~doEMMWV2#B9#* zQLQR||3;{Myn2VsAb?{Af@S`f>JxSn5eF$b?;e_Xbn3cSyJl;d?rE8i$xo3?ZN!OQ(^PY3T`nu zw>=?vc_TZ`|M5n7OtYe|$OF4EJc#^Aiy>(2pm&qbr z%m@g|f_V2eQQ|vRf)N^8I?+LF`9yFB19E?-tPZF0CP3Ud0XdT(LC|O1+)vm=1J92B z(vJKr=zCkN`6dlzkbwo#!PtfyQdvHeE3^f}Xh0c4{lL{u-@@DT?U(RYNvEr$EkkpQ z@%*VLwRF#I_Yi?F7rukrRm95(O_gHr*yUJJ3&4Qx(#SnyVzpVSC4Cf>&7AVea;d^d z>4StEU-D)#p=IUP@1RXvBX11{zb)L(KS?X#ZDvUk4;DjBYg4 zDzJp|rdn!^63agQiKTOZ$C|=COYIPLyaYiI@riI!=RocW6-riPhjG&?r zES}|2br{~pxB~eJDrz?*g>N${6|%O31OW;63HG{SJ(dsvT68DF+5uWB@ChcbC+K~l zO>b*!on93XSu1Z*qVBM{%?ll-IYy{Z^?QuWN&g-awI9TtF6o7Sf>E;jhBF#KG91u0 zW=G30toz51ndM-lQ^Wyc5ppbu@;95Y;B*>ye>>#$3C6btHG_L~D=*e-EPZioWhiwh zY_A~Xzo%k-v?j1>Nb~ewbfQ2ISJ~x4qL1>kZk1I>KHH;bt`6=Rj8Q(Ky=%nFG zsu&U9MHP*oh!hUKhgl$6@QbmRpwVEBnjv_ApB)7rw&F8o{!7`*U^&o*I_q<+)}h&^~jZY9fjPWf)`Q#xA8sJI2e<|*zJhU z>kmE#*aL_qcygiVQbSGd1_X$*FPJy`vWLh$ixW?7p(&=&g~nKLDRsYnPMG9#gV8{n zjQtA+#YYFU5s(EbUf1?hh+6FR2--Qg4F|r%EQycq;P8Vpu`ifnG$rcD%1Tx}ioD8M zkEMW{9yJxwCpKlYUJh?G;+Z~9tOtq}-}bsO+N(hc?(0Rw%~Su}UcMP`w9+~TO(VHx zu#ZuOe40E{Rk1{cy{cQtngvg065eL^)+}-Hxw)#1-jUQGOKkPj%?>II{MR?Uu$jUX zZ$8l21XR*6P|;?y+R?+hS1WOGc0%>ZE=jj^0Y}qDm*+TpdOX`w7bT;7_NN;L*-Uqc z$V&dFYysaTch7#BkJINaw~h-3w}3KTaLfChgerbmg^xX~+A-KfrxZSH=k}B?3;pRQ zc+@;04OS08R8XvLOp&Ti16xw8Dx(abCFdkhRTn!JyRI_IyZ-6OVP4W(pBdVUC1 ziWxr}76M(MJ=f16vv;kf0a|JOUi`z0n%Ip~k>ldRHuLMV3PP#j=@wgZiR(6CCh~99 zZ6Wghy-%q=Q=%WN^>&;2RERMZG|L`dnC-#cnfgJ0n!)huO7F~tuoUYC+1?mcy@JoT ztp|d&4{xWI#uU>@0nACbOJe`r;Hv!}PIoW$g=ZFHEt-0^p43CZx?RU$4NqeGk~d#T zC27ZjrVIZKqY{m8tv8z<6uQ$Z$C(qBBdc)|fjJ75);`(;b2@|*DJ1daocl7zJO~PH z$O>(Yd8lJIG;!c8bo}Aq4tw7`NwP1ew8sh! z{$`DsCw#Qz2e1+9n|HHV16X@2%4CQSH>-OChV@rfbOFX?C9{n*85&|uiE%X?eKY2Y ze3`UvHgeL|sx*|)agCwjx06C@kn3)rM!dILJ#Te&RVnIE9HNS}@n4E|2|>h7-GZ#j zC%IB{^`ndd)3|p&$YWOUYTO(K`DkK6%7t^ubdZDluhhMbg3*SK7OMDbcizfz60{{O zz`kcEyxW^Iqq_ZJBg5_iAL$(L4xamZBB$<6i41I9(1uIAI-Q#t-?98WuxYqnV9+B4 zkT~hIRXjs+v%AZPM$_>-aMUq3nC?o`Wn=S_7E$@sM2Xu;!oH7wdDTkSFkka>oYi012F^!S5CHG}i9SzMI2184%-KA`O z53L>|c2s~~GdP6aYHeASHbvc?uf+5^9k5SS0pG`pq+lcF*1E*0u+Nui9&T7`E9VDC zwDF_22Jl!npHG=HVks}~ggC^OVcKKs7+qnWxU_<$6d6%5hEj2)92_!LL`^JhE>1qy zfTR#w3FD~p$1W`ZaQV>}fE9eV$+)+2-g%tk_TJCZ-*9>T@_yK0T_pY8m86d=+7C<> z#oARuP^nH=BabkOG^clV`&tPkhr*a}BFLn2)uH92V04Kz*VTcq8}3iyW#7FWmRX!J z3ll|>L1_LiX2DTlg+02+k(i92Hy2Wbh7mIVbv98f1FWheUCthGKNc|d>g_sud*-@s zvL#F0y>7~0FiL|}i|$?O*SlVUdim7AW&e9vw`$eM5Vw+su~Ff-0rwK{-rZt{X!1(t2;t%HK04?NG5r!Shaf zi4vziJ5xfb42RC4Pm_LO$jqC9KiZpnQHKNcxm!ulh1lbtMg~HEwe+?%+#Cj;6O2s? zBWA=uQ;w*5Pw3Bjq7wWFeJK)OcOx}X{zZSDbm45BSlHq9z^toMJUjvbEytWR&5>j> zuWIDijBF@y=>DVWGdcin++J#I1tX*uXdu4CL1`{l68o)d9CpPV5-9qOf-YqEC~mgO zmjpYqWFj-)sHLP>!w_SXllMqcw9iJ9Ms9UBusU~=9BHDIF?&R}6lghRqnRo>!2{^4 zDyul>&Q6uXo%Yy%5SA%e<+vxKLkWO3ZZe(_Y+}B&a$ofKyD8C?Uc5A#)x^PD4+ppY zS{b`KLWb1HX}E7R9;OjROo8#M6iC$+nlO8EJ1)1UJC{)~A1R#$pnexi!&F)xNQ`1* zJfo?pnYVJYZkPYQb2MZ8JBvl&Lw$O*bgAZKSQEv5T*rq0keS)px73WAQRf^l_C0lZ zI+L^QGFid@sr`2G#zN6@($og|g8qEbol?X`!(vpY6T@sAF4f0}Yw*|1GU=rB<(3}r zX(rl$sKgvq{rRPQeF}ggBuF)?Y^@&Ux{Vb4Hn&n#q(Cnk_p(yGH%J9MN*!M_fA08!Jmm<1%wT6N>#w!EjNC3iJH#Ld^1P}-qxewMoe zNM4Ldo#zTjF8Cj5-NA0?6f^Z6XH)YlPAunpc`loynTW#WqIM&s^&Pt)3wVT%%#kJnA0;e!TlH{7>(O(Y)n1o{&SIA*=fQ zk<+#ME^8%7+I*?}7k)KqlC!wLG;|~xiQE(K*FcVS6Y52@WM|$jDyVq0}> zTe_6;ww5ZoikQ2 z);0LfNFMA3_yBx7Z0Hl!6W*D+Vx!x9!r4)LLi|X5!unQ8_8a*R>$g&qc^gVeJ7VYt zjaY-7`Lzn~?cY$o;y|jUs0M7l$=)I{^_(d#pTg9>dj+Hm%HH$U1alwi7r`K;Ooyr> zgord;v%03AV^cOxH zOz+fmObASq-2Xm^;e~ML**1kPuM(+51v>wIj!WiuPF=p=5H;=1VJw3d%Y8M@cikN5 zs9)Pxy4elWk!R|Pibs9$APD;+UNL86wtu$rT`InadL^lX9 z_)qR`%mnj~5%JWwYYbuPyoA5}7i8x)(V0?h&>}voNH2wVo$(EN20Ghv{}Q`>V;2%6+`Cp=zAez=bq!(@QJ=<7GSh>&rAk z2jj&T&;(*St@_-3sOPmE`jgvXX|vFJP!)aD9hP!lM^}Z++1jd;IzU-TR}>W$?OQ2f zleX0etV>qRfM1)X8w=KTW~!ieMbK-5OVv=;BPwfIQ2jXbzJIvkyKdTXV9?GixjSs} zOtyH+!In3wC-8giqNyq`ZsrNmYMt(OA+~XX_Zx%WG>*v6rCe+dvfpEQ;h5J<4Ua-C zCuld&@$Qp%ttGnp1ILa%g$3IPm)J6{&t<3vV$_(?_YoJ?IcOe`t*eRXq!45uF5;qy38GTZ)4smZt|Zf6YoM2x&|l`(FIccx^@Y?7T~EI za`!0+5@70aFu9cYLs3^OMvk_DX&TCOKaX)(GDHeII971cse50k5*@lg3rjizAI~5g zB#y0mN_cJ-F}HR;%@JCLY`rVgg*-gBWUN`+N~LN<9_;9 z*FAuW6v-cf#XM+eWo~re!FYbOT6b$1W=yl~4|9?BlfS1cj|nk+yKOifxW0Phc{sE& znXLA;-OSDsm6D6_4*%A!&3N-^{Y!BYBWnKFDWSXvqJdF2e2=m+8E zf9u9Gw|^vyFreKH)rk&fE?a*59=FT?>*BIev8SRel?vT)aO($>1qA=SctHJ6PcXs$ zTfJahLO4l*Kf9tK;H zI$KGkFB2O$Yv+!M)#@m3F{)im&EB;?} zhGALkxHrjk|?x|=9- zveeTvPfoEC?~*$0s+*yHE4kF84g+Qri(S+E(fz^-@p>CGc4YC#?I&W`C`0q(Ys2oa>b7*39+4;Cukt^S2B~(P!;O1XJHbIT z6S4k>-DT2s{BIWpuX>D1^8WY9R$-_YW@)Dmle#PXhYG%QxN8(S#Hz0Q0IOeTxO(Hk zo<#x|gRFo~WH}+D-u!|sN0=jWi=3%fs^zJ>Se_E92Fv=5I~_^a>yW~o67bR?5}U_a z&YTfKxJ|Sp8OCK_ut%xM+N;YBZQqp)&BiJ6YETP+!ls8CU4^d4l%q@{~ySGB)k@Wp9S6{-9xi-fp^-AKVwO*BnJohj4{ZY zeaH>mEAwglI|07Kmx_3D5uda%kV=)W97?8yo2#t?`JYvF=h9k1fuX|cine`_g=dk^ zD+Jj$tWS)n-x?ygL4SVzNh%GsyRvT+cFWR*ixG<2%4I`Ju-7K-lj-RNrxHr)T5BJt zBX~%_!Pth5TS!zo6h&DT^cICQzCAHws(G<+5R-@0o=Pb%-Q9x$K25w`8?#9(z{QS{ zB8wtbJalr2+36odC3~!)OYn=2go!_=n*sad=ssNNuRH&Z}{LB;ZG~ zsB;m6GIyv`?UMl^!^LYFG}@zxO798=0TT;ZQ%yNRR_ERt`dqv9jUNs(C*VzQ1+wg# zRNjtNDUE&8ol$j-eEqhj0g@i!@+AD8A~X0tr?k|t=7gzfHrlT%six1ivFNW0(Km6} z<9QA0A+KjrHoFu!{Q#b~d^W?bXNqxRX6o;Ior3#9mar&0!A+>8icrO06`*`2viMlW zkb?{H2#IOL2Pn*&(cD_FWyrdZR4zX4sV_Qffy_Nf4v$%TT?5^_Ldikt?JgN<$WGMZ zOVHVOU}E+9LTxW@B#ohX($VYRZ*93R?qB89;nl|uwjO^{JK_gy%_UNNV*$@1+$&hQ zr0MW4+tuorN<}MSxV2-i?oM%UpXrF&s4&Bv0m%;YxKRRSd@@amHQ)9K44s}Bt&o=c zQ(zD4-}{MK+uT2nFmk=GOmts~$85r5i-&mi04L>$_?^j7OZMh~Y%<37S_Thr}a}whi8L~>v2v%_@6v!3q^fB&W;dR$g z(rHrzey6OS{5()UpQ6NFoW@e&Ic4NPh7^tdoLPA6_xR5AiAjG$VBiocl|r?@Ls|2bFReFYv#C;i|=Z_?s3;0R7{<}rQk`IbDY z^o0(K0Zcn?7k$jONAJt;``j~0z1 zFXxm#>#~yF3R=UCwVf6xUNIgByis>vFK2dSXsIdKv{lM5f;WLl8RBpyF(_e$vdK%6 z<;mR*(W1nhg`<);8RG0qo)3|skkG{Z7Cvon(1)JM1P!nx+VJ`qLG0HU%C(cMuK#>4 z1A&OVj*gNv?CdI01*-!jPx;DP3yi!ji?wI19W0_ zG>T6nWhCsJ>}D35J>be*U>mj+I~re;te##O+oH6k`Mv85(s_1_U+(PoZuFQB6ZqF6 zy-@dGFbQqEE{UiNy-_E(SA5^*7qrc&oQFu21|I)rWPeFqP;V%dGicT&E$d?LUoWrXs&@>S@0E)TD5E%p0?a&32j{1jvvn*;@V z;S3yr!{uh7>}ClnV1NRXvToB2vSaErwhYK&W!TN!1%q`9+EUyLh8l7PDPa)tBof9| z>_^&tE7uMyq);?{Di*%Z%z?D$V*H4>_1KD*4(7$E3{qoyhbki#K%&Pj63jM@1`hqD z)BKLb`Lngml)iMD=5k7CC~rhdM{uf|bi!mP?&8ht`dclSeiS|YTm%9aR97*crM77i zcT`HH+bdfiRZ&qzPGe}cwb|yf$p6R&u$U3onAZrM&fz$pm;ionk}1I~uP)YQ@(3MHr@U%?y4VB_S(%qg#ws#>XU?cGwKwkJcUps+w&0K(6t5uNMIMB@|dmsm1S z7XwC2`e}>sM?|1y4H@w_s% zKutBWamo$tp`aPz)}zW*JkdbaNcm>p$<^>{^Utgg!IdgVEm2;Vc5 zGJt5dtIzlLlWJ2SvHS3>|L}IItT9~N4HzQVHzQMWTvrID87fuKq4UCk`_H+uzIQZsX_cTW!A^c(&6Z5^^!RXz~t!~|uN z%oprXZ$ROex5;`JJNYLL7U9JAj>@I-y_TW0x$ zISu|BN7=dZ)?xFBs62qr@B&`+3JG;t{+uRaLJK)P1fT*r@&4a3_r_2vqL2j0?_x3q z#bVZ@Y2ao70+RSPxnjT(k)+{N8pY_?5fP$FKQ5*qPHC!pEYoE!6J4MiP;sh}>eCx4 z=eW8CdUt{Irwi9-Pgf8OAA1BC1~Kix$U|Xd*6*VJf?}=13c>G_#|8tRxMz!j<~Ih@ z%Q5G?A~;Y)!|w!vhQ6%r z<{+M@Wf#-&UX}e|W~IM|zH_$v@Mlqebl3Ss^etCPlqY5gk5FXh7a!cN{cQbER@;6*zbB#HQMQmY;E*Dmny8tW}$y!EiRCO z``YfAWqllY5{7`ZlJP`y*GXM@nxjKq8}%MBG7Yxnt>SV|NQ5crYO}HyAFjc{1qpb& zx!r3dQz^V?qS{Wq!{TndFqpnV;p-NBQ4nxhjqF^0{7S`fz(1r;$bKo9{2uS00RHLU ztLO*l2E5pnVS{YmZ*iHf^aXe?M!0&8K8^dxK96<`KZA$rZai>;FRJafDJVlr`x(w`nE5KDg#2OqE;DzYm_s%!t1k&YJi-I|fgv z@pL2YVY$`In5Ag`vT1ND0$A*R!C6Gp@H21X-U&kI~=h(2*NkeB*kkjcV6FqQQ z>O$;iO3pi|F0jdcdnPfxfwhVnLRrs>zx2&$w~IGljw3IgW!0HTSu-4}Y_qnBLOW{X zmX^npA_L_YQ7BAKCbkfVXh^w*23f-Sie28-E_+)gY4FD+*Mfs2{wmpD>4Zcn2wZMV zOx!+h--d!z=I+QpFK17^_7zCStXi55i?cGCJ&>CwNyeRWg~RulNF;t7O(Hq@rh<%g zN4qh@-y--P4Y~;|VqOPYvVj`Vd@2{j8k3xLhLfVysbG!0T`?1vpeWYM5})UQ&rg@dsb5(>r4Ie9Q0n(2{lhuo6oy@CRfZ0f9UsuOop+ZK zm8S_aRB3gQbJ+Z^cQc0#aRTX;wJf@)hn-wzObZ<(y^8lF#V?t2+BPIFXD{^E9Y*m> z5Bz_>zSj$$0vG-Ary zp1hvV9rHM$10F@5ov(^KA9!)R=P*KYk3h`Sxwe9DTiQB*dbOcCkWj#>N4qzaN{DE= zY+;wJ+(X13-?1TXC-)u#x`(V4tWt5To(oIn)vI^zc9O80O0S*e!W1sMCVLG}+vNpE zX&Kg}0cTmb-OEu_@XN^llVmi~aPYUwv6xZarY&r&&Sv7T=(UqUeP?Xj@cq8o{IyRmQhQKv zNmxWJkD~o#cO!DWJ#eoO#hneQq^lt?yC)*aRH+zAJMQgTrW3cJQ~$p zr^y8>o>5+f?VaS|5?g{Mvgm6jRkxv{hYDlRlRldt({^=(D9$@&u*MwkY7_7g3jZUX zF#Uc;-<_1D)wO}3DMA%dMg|xkG|Ias(3ylm`E_;aT#fD3byOkVSws&3-(WJ?V{78I`xI|gU14BDH!OU3uG&=@ z*U{pFPnj1`*0_%yCG8M7kGWB$rh*ycG}xb0PIKT!`jHiw4oZz)zs5bRcR=5uE zMW;i|-W`+=>wBr$%4b4kCoWylFjh!d&HyLu)Imbd0%DzX;8OI|X`hwX4fIIkMKaZ>M~=weQg@2K{`>GsvjLc&v*q>b;!pgK!)~Jx z4LVfeT+yn{{hClakz>!!XIBK|jVt3LJ#Lg0i5P_%800>WRm&>whHVR`^MC-dw}J(^)nH8kvV#4Y2SoGJF*)wPW6!O)Mx<-wYruowgV zZs8fomJ2sS>y3;)DeO-l)XO$USnh#s8?(pDEVu z|4T&g@U7uoo_{m|J2224{zr7)jap0tb`In*^JE$2awK+ud|%1$$IGTzy-tu8`@0jU zDEm6!!jpL}nVryZAw@COE?)>QYnGe$zqv6n32PQMwZ9h5@$RJWwI4aBFfw{U-H6`W;LeFatN+VN zb-^BW9)@Ikm$<~r-Gf!A`+;)VM)%^>17%@=c~&C4y=te+d+*_cu5R?Cu}0d&oCq?q zFp-{pAJF&zYq+>3@Sc$;j>4ZV=q{WoD;&vgaZ~2l_3IZ9x8};K&UvVYnf>L(L#O-A z!0~MbB_w9jqOuiftY$w*kEFzAXzO+|b6?+TqYs|jPmxI|5B5_3ciooG$PF*^RXC=5 z0na0O@}zI*#>Wjp9<%N+#jC>MovScJzSkc*jNU@9lMV>$W|Q)826%8!q)I-5o!ji~ zAw?y$`+g74t-gEnlcMWQ;iEo)F-V!#Vt+pc6b8ph)Hg1HYUF4n>r;-t)oeyf_yWrZ zqk*p147pY#g^QbSOi*@znl@(}W4tSbO=f(xUGpYA#Lx&V_oOj*>QGZ>9i>x!8<2P>`3=G;EF?`i1!i+H}CPiQdL?MKzNOs9y!BNvsy zb3+fyCrt-&UmwgsReX3-%@XJD@7`F&TH<% z`!xZnYz7La)Nss3iD@UFcgp!NulC@MTlg@yNg(}x=*QZeR)g9|8uf!ViL!I!Gu7YH zk{azqt>@$AS6TOJbID)1!W&>H?%WPi^4X9%s(%3oHUo&1C_}^P7IYghut8eZAdjpb zmmMHn>U%d0IwWB@RnjoiFq;DttDe<9yjcB(Q8VZ*+cCgTb>t_L@3&5VZFDuA(Ww zJBfJcLP{=6#b;ccSQ&Jr80*WN;e)gInlYd8i@4^YPA37Lju3Oj8E{QY}s zDcHyE(8X)pJ9)Qy(uP$hz>?AGJmfO|+jKoO^nVg#K$3RDXq*A_G_zS;4u&>QucG2( zElom@lmi1#Uf2$yofE|X2IxhkpE+3iTF3jg9 zR4@FW&xDa+f%Bb!ckQ8TcqILM=E}6&Ub3~BFpS+sGLV=oOi@PGa*;9*uh%QzU^WnXZY>~P*!(sbm-RaBP=^p!=K95JulydKz&(A~2jeSY z`b!xmp8CbmO$wX)?4CUkf{h{PnXD%ZIHaXd>5Vz{v7;?@M>@h=SN-QBt<$jmf;A3L zS#Gb~@A;j*#^@8`)X8d`Nvny5QFLGX_MzoW$4KGxo%&`z%t@1qx+M`76>i4qZGi#y zt4?W76EmlOv~hXFzdR)vk_Y9fD(!#=pOb1d>K^nj_rFPPUR5^ zQ^iZHs4hc6EuK*1kfpy_6d0<)@-}`@IV}1KWH^fkmBMorH1#da z*?esKRtidHb5Wo){>1kno-Dw0+F6Yb_`?}swCoiiaP3MUoipUKrHV%RFcW&#{MZ%Z z^JIUlVYc!-mFLuDh%4NCUG%D^WiXa|_!&JM-=BVfBY!ZQ7(2hP*mNmbhXxzLxJL?- z&u^fS*$V<)KV8Cky}ivV28{OUxDZ(x@7icY}875=dJlL$m<|#VQHvXRWcEVny#o9W%kR^;nJnZT zpj)7ZZq~wupuUp||6tvF;kaq)5T-Ku^a!o}8$5>JdON}4)N)_m&7iwt9`obZ&$u5k z%^T1CH2jhbL{vm^XmXYbG>sMCueD=58N_%p#|c?NbE42A2O=qFmjU@Mw5lU`i9bTL z*%Ud5sB#kn&#v{^FsavPM89KD;U>~ zKD`=wy%LVc;u&6X;au zSrR4_$+4{vjpcS_C=CjajkedhzN2Hy@QVwqK7a0LBj^Q<_rpmS{X6}xeD#>&Dkz)jodz^W;MAiG@s32Lplveh~k zfhd~*|F{TCGG&^D_Jb@-YmP2wc-ReNmqWP#%eKNg@>TatZ5}ZJ97+s@gc0F9ce=Q_ zSCD-7`_*It4TNHv1cMku7G;K8D|)ZdKub?&@-BU8Q^B*DKieLMVgT=UKrto$QUV?J9kfv7T$I#JcRWEoP$D~PWD^%sz0 zz@f-Jd1GReX2Ut|M5S?O%oeFX}NhTcOP}lM@#!<|Y=DFoOY*t6fFyE9KG?Sn( z`4&kObb2SuIpUB!zHbt{0#B5TSjSy6(Y^GgDPIae+!DuPT| zn(I_?vgcJYQf3*m)w(-k&vH%FGpfO`B&x5BHhzke2b|UhkPq<_$Q19tEOpr(tkZ-v z>GMIW=%hUa)x(>1YL#)vJb}LUAv37dlhBoG7^vNz{&ZzfVJIBG9;9@&dg*o{aL7QC zktce4w|CazXttXU!EE6E{ZL>{%*_BAJlwdp;N;Th8GRKU-(-6vio|%FEhNq^SAHd_ zeZO)zu8UsOxdcboGlEuYPf!iPx9$7lL1o}iNIDt4jn5V`n&wqa^Z{{8x*BN%BI?_( z8@PJ5hy812j=T6Ugz zvIg}X<#{Tr{iGXL8#GQH?S9w@TUYdwYjVb0f?5=v=^Q2AT-o*OwGK3MIk)!weqPte zy0=|H)W_SlF{ttmRBhTc&u9zoB7FVZL?_4*vl2T!yC74+x2J0GVy73DcD!V0P?)tI-&1+RD>tSPAI(F%!-(;q9HDpX(N~X3jGCJ zln;&uaM|_qP6UoJ_AWQo+~S^>6eG%Uqkf8a$!F3h=iOIsQFm(N^WRZufMx6C;jNqW z2#XH-6xFy+TY6kjK-qLzz2&UDJ4q~M%U=rbyBe|Eomus{$Um-4zg5OqV*nYCdaeY`gY&FPJgo_@ek^jy+;0~DWfx+;&g({u z=za?N^t)@+e%iu_QDHIpo~-ZV6=J=SI>57lSgM>Z&mTr3YkA}ODyukD%z|-$ET!;Q zb4s!f@`bNCjT~E>{(^LV*^?@c-EQ!5EM>$A{rurm2GxBaz~IlA(PYntT~}xIMqL## z;$b}3IoNBkHPe3+0n3Y%GD^L7^DSy4Te)*&y`H0X^SVsD2d%Z1f27Yce)=n?XqK7` z@D^^C>wD6|9SpUB59zOn=^AMulASLOO zq}T~zIBGeVk)eQtkVJ( zb5*ml-S~t6E8$x!zsaCi7(lR|%lEC|rG_1)khGk$Cp^azXcm)ODHzR}f@y1&G6sw7 z812oqhD^;D;6t_HaFj;foLC)o=PjP5;w9iE<>YQXOX^Ze?)gNDdU9|=vcZ+>CpWG! zCiG^ku;pnl@jRXeNUaQpwRwYC|LlS8(M2qy(~Z%O-cH#XNJHw|n_i=GCL=g`O8bg8 zYsLj|!-pHlRie(<{q1@t3L9F1`)upv+@1Y@T!3|~IIQrS$$r%G?a2Tj%N{e4)l}|R zvHu5LK%>82k46btMR2J(l%FOPG2shm)}I{1kotRw$@S&TiG1E!eTo@%Tu^DXs4`bG z;YSCbp1Dgm|2SsWY{;#DiXT&`adr2m*{7=+t-Z=S{m2P(d;BtD$-Aa4i>FGO?Ii2&$5Qdy1khE zVJjYQKSGu!3?FZoGDwxj?B8^gCg1+S*G+uT>Qtx@)NO|HS?%uFwZg@zZJD}x0v#ts z{EeR|oKfFyq~F>^8b4Ua@AE2@;c|W}#xJOfMXx4y;X8b?^)|nIxKXpu3O2t!m!Ug4 zF@8uI7cX7Hefn6wdsENNcIl}8oztnxL_UgW$cnRttZkCX>D?(b8(p6p%RgfEH4_?* z5{1~X>RxBwhRI~^JWu$rc{FfY!^vGo$fOEdz3_0y*Gxa_gGQm{wF&E3*va>AHApK_ z3>p{D2j85bej^PE6lm0DZtvf~$BE}~vRVimu!0|lRsUbhbRl+ZiV6%Em%ylHXL$8> z4N9dNwc#dPw%kY8{3ELRI{n8UW`#mSP`wV!-1r^!F3seP#fRwLD4N$kTF2q8v#2++ zytbb4CL6Y$Cw%xewhybu+SXw#Q94N8^A*!}rlZm*QHUM0suBY`6ku?#fa2;BhW*-z z9|n73&CJ9GFE9!D5_HP)9xHM34WiGAEws`Dru}q#J(fN@ zE-<31j>E%382xo`HZ^g<#l?&QP-vZTbJC(zsBw1orQ=tdm=v1MmMH^Sxup{WvM*9n zvmeVR45ve<{*(IFZ=#ToIGxK+k+VLn5)zR9-(Jh2>2!C*0g;SS%;z0aGKP1uVHF=QuUbZ<%a zo*8_xwOj(QziXc4ArmP#)`*|L8QXGHNNmb@8QkPj%Ve zvZr%&_byT@P2tM#y@~&>J6>mV&^Mn_zF$N|V6`{s)aC@oSIyy;E`XN9#?e0gG>I<3 z6kp!U?`8*5xfky?_8@7mH&p^$Q3CoPFC@=MQR*$MRTmHflmu3wT2vwqTPaTN3d~A( zynKC7+0(^aI=t6s$01h7+R1ZTba zIYzz`uc&q`Ki-alV+$F!dOgQptwy(M`j-}3373v=^oEJZE`jA%9VI#!1$K=qZeCuf z9XgyT29FxN^L}f7+VDBkcY08(^Dy3Vx=n6aQ|h?bfGAqM;m<9b;~(AlN|%bf<_Bat z(0jUJ%!}vLj?Mgfy%6u<07^@h*m8?-gs9QGYXBcyRPN{%4oVZwlc@K{bn7U)Z!1yw zy~CI$0SHiHvY}FG(7wc}&pEr2NsI5(^P3-O;RA=)+&5ReN`epV~sy z_(W8Oj5to8yh*8VEj-6pN8Vh|w}Dwn-5KlI*01IZ2^wOv;@9y*8Z7#l-4#61DIJ(C&a@agpZT-i z#_fM6NyKKuzrzITFPg)i2!FH+2WCR(^Tl{7-CD<|E9__N zFr4z@DKJ?O^b{AHpJ{@IObS%)LMM@E8-#J&CKRr&FE6wU)5z0!Q7ga?(9yI(2+N<8o=`gzQt1s|dvg5K?vUwQk9uBZ zXY$pKRVY{&kEyv51&T7ERlYey9N6Oo}Dcd*uC;RDmO2*Ihm;HjAO^Nn&^Jti_*mno!%9-#+$AaKcY{}dfrMlc)xi6vgXjE*8RcFIj=CIbZ~3x1)|=z)q&Dr0k2V$|0z_i2fs zQu@(z>Nl)hIGP&qJ6N{&3dVrf2o@bJrp{#6?AgrzXcX=0grK(Bush1C3O}K%I|Ww7 zIpYo%z*3w~Ms_LB>X|5>l|6RYQF?^abLuy&SU8HRaa;Ii|8>j(wQx^5%OgN-OXK!^ z0}53cum%UHDJUq#R&Ii|8B)k9cS)!Y!@)JM=UhHHX==XEAHqWO_BL zgaYvPbi!sS#c2BT4)An$L8H>*R&Eu_zp{yW>+jL@lT}Qt|GY|S!C*9@P`l%;1G~B8 zsXwZqpn&{>0tyTkd@D6(#<$}M$xkBTalzC6MfIJ}nibP|tEQGy>%Qgat@CUU8?B8|zMIeQs(!>KI#WF~`Z2ccDz+4UA?8v_%K`2l- zN=eInObS3^GDS}Axayox0B){2)M}?P!RzgZn?fiymR(HZALU^cuo(@1n%BJCJS={% zQPq5lbLmd_x|%q*D}l&XwaT5#x7hgAr))a)ZwOUxez@C;$to;kl-!8P!uk{h6`)i- zTW_BVc<0|Cwz$kPbN_52uGPYD5kVa0av7LUNvRbSN+^lrOgx~mll3qSrJoP(71}Um z-V#2a)(@9or!)7W0fos>b|#)5S73dr8UNsPrW?L)M$Yd^B&tJ0!o7njeS8NKkZ|D< z&Q(M4uhD^Onfp0esKvu6pV(UlB3iemiZYM8DJA%*;NtHO2y0c7z=${SOFhOtz@DCp z0X@MDJ5jUfA}2H5@pU(HVP7&)9U2kg;` z?->bwCA{1gx0BtL9(?!X7jzFV2Z_>jPOSZy#hWiu@-l2%d3F{ZHX-8Od8}D6gSTIG z;oOf4IZ_&ipE;A%Vhdp6kDEFFhy_p9P3fvbrPi12Ef;rOHEQxRld%D**ORf9I?yY$ zPt1c3^0Kb*_1KTOZBbK{6-w)xLAX>K&GKQRnBBS~uC8iuji&#^_i$KCF`COAaHc{E zj27JMjA2;lM0yRqLvYqvt}C0<$y`EFsTGHXEguVo)tsB0c)AZ7*laRM)x{&e)T+?mW<(c zxDWaFGBLQ>u$LB6thHgmNU6<&z9Kp&Qj+|F11IAolPUhu`64J(qzHAPA}?KZ-lAVKDNyp z#l;YJavtVV9Q5y4Is5YrMkiFle(?@jmF?I|3o)qe*eynij8-fb zD~{4fZ2NH$R}TEd#q$@@lCguocUl5pY(4|uyYN@jC3V> zdN7B6_XdqOP5XUF)4%lR@LPS*4Y|d{5fy+;+^0|C`1uoP^GYZ-+g=|4-1{R`K2JD7H@aw_S zIloeO*huPM+D1?JB5v*3z&>q*f13wUsa8__@D%g=_9Xvd9`#3lMRm73EFQm-Kkgmi z$_Y>Uj(tFfZo_!DYYo0!H=Pg82a$atk-W+dLR*etTFZZZ@5~P`F?Loj+N(^I=tr<{ zK$(@pmKMYQ-AAby{x1LMWpS%R-%eHeY}IhO{2GZ{s`1%9*lNUJD1Aoy@#x5`!H4){ zWOsJxtrVKuGxw*ugqP&tSNI7-hZayd7FNdH%Y_l`cQd|W zGjuvnnhl*s?JA9!IrTS2jqboPtp$tcNEY?0M2)mg)IR(ZHRCR^z9zT5iJr{5O z&h3j%4Eo?c4cm-kK(~%uoU?=u9hOrdA#Ahii9%4+s$5xaDV5mo-6QS(T?`fn3cVL$ zVS%{mR7hzy35i*hiUO6^m4J{y6h(PhHE#HLxnR#tAlV*7MSmT}tVA9cIMAvbIP{+Q zIoT+5xD(`3Ok$Q3QK1Ubl8W&Tb|Ei01%t(b(#f09umIe&D$Ir1AEXjh=txe*i^g13tXDCEb+bvZZVJnK68zffqU zANzm~U)15k@ew##^2sO^++BpMTos|gYSQ8h@Qw1tkQh&nSx{7J`Q@i`1NAM4>^eHe=F-5vtB4 zM;VAGg_Poo(p-$v%?nR;3CT$rWfWDV4xf-n0^C$U2J6PmA+^PD#`UaUcI$n7kNA8W zN+mdyE(8R4;wZ@_&tNWNmI>$sqp9q#!w`3jtLZJ|^bLbxWAG(ri{<&jzJikFialSL3)DTRh2%r*sTjS7ux2o-`|06WFG z>7=ITqx1p!JWUf_pIu8Coh-@IhrWlKLnaySqQm zN)zaO@blDxEtiM)^YN-w5vSaX%bU=8}+{ zMX6oTxQ9?7)B}~>L~eQtIYuQ;T00hf7?r$E(K2!=V@|K2rp=7TE0~Btcg*?eq-Ew~ zwmVR|22vs17wtc-yS0GigfxmQ;Orksl)p2G6+>1ksaXba3nVhs4=1$(Da|H6J`FIXP7Ugj}yo=I#8%Ic=(4B;_ZaJ)IeT- zG2&!l_ginWZ^}J>>+mDfNe%Z_>F&azdMaMQ}&l2hLW=*M8ql(mh=Nq|OWc%L$ zJNu-eM|(M8{eNKxnB?-B>C*a@hBEHgSTQ{}eRi8gjKwAYThDd;rkT>YVQqP}W>sl0 zaFxVc{@31D5)vX(S}IR9E$-d>Z^-rkd{`WYj9dJ^^(c8N?Nc?_VRI1Bd;opw`20UR zGj`)ce)(}1=?cxWd9m8@e7zgJ->87||4$1=S&QQM<)^)5{$*U=4d3FOhT-V`nDjcOrcaq!;^9A;?BbN+C{O{`k0Q zU(kw~jE4_ND=5W*3iqIjR1R@RAyx`9l1NS~0FO{AM+KrcC37d$h3e5hFOkPeFc&=L z!J{l}&OU@kgyZe30&5sOJg z;bnGgQ~qNf#%E!3_9Y@J0xv}-vB?T5RP;xud@;MkVN543E*+EF8UL^fgm`MfUPMZK zGC4)%ZH0MY$x9%q$cHKsFAi|Cmllwgm_TNcf`I5Mgm^mr{k&Q8NlY=~6&Qer(@UsO zmK+|&rBGy7;vQU?ivCXEFq4~_L`qf>O0RILMERjEPULQeJ2fhMzc>e=I4H?YCO#<# zhpRtPk)gQjtfbt%M`mdmkwWX@M|70{iZU{>>HG=ud5KU7n}OsIEmflZUP$M*7bS4(UM_ZpqKpx#_a;0t3O}bJk{%?H zXSCrIP>HG`E)?e^k!kXyVyNqjI!a!8CMK0D0sbD(d_49d9^Hx~&kmr*D=2~}KL-hq zEd+%H;PRq6bz&qr_C8rg8w#ZkpRh_q`a(w1BT}+WpirPt2rBPrs{7>eFx!)A6+K_D zUV^zOoA~=l6bp#x39DL#Ky?-|v6+}1{;LBh^ z32BK*WEGgu_*I}v`OXjKo`+#l2*Rtl*Dc^xfy6>@sziFcxUXU%FD;438HFf3!-$RwKv$Z?t=Md=D9YAL>p@7M2Nt6RcfSBU zU&fqb$>m|(V~Xrb+=41oDWDt+(vnEYG@z{TD&ckoc0GQA|)?uB~eyS9U`6EwUxH5noFxL zAIhN|5p&{6nLDVpv~1H_-fY%izQ3F;=GggCJ8Gz$E`14mdvT&{p3p`bHE$=aTJ?|_ z>&}TmMDF}FT3Wa1Bt5#eme##KlPh^Sa$w1D={sSIWWI!b_VMAbWk9#~(xp>NY1DG8 z>`S+bqc~nRjB71#G;b#@TlJJVTW?57%0_8jtFQc;Y_wUZ7VI!V8=E9J2z zRn|@)EFb_Dxywek*CxvW+xt-dnyr5HF^L z71E&c06F*)K2qb2h0>!{8)@IMy)>y6A#Rnr$eNo*N&bC~bnDPjx_4{Eo5Z9gyZA)!KHJwrzXKr|Zv2Y5oD})1;5Axtbv_ zoLXCq%pcTU+O=&fty{E|9`7xdYZ>wK`;uYOu4P;4)U};d0r47jL9#DRlRB?Vl3Op~ z$G&@DfxN1BlX~qsNQ>5kWy{TMvBs~Ffn7RE`}Xanb(1>c?-ecMH=U5L#}1YmKV5i9 zAMD@kjf@-e!^E!Aq)9Vr(yW&(IhQV`dtb^cQA6b9OB}D_hudUC`{vT3Wea(uNoSez z<4MW-JN&a`$$_QsN$*h`B;zIem3r)38Qi^{bnetr8nqZLdr~bTC4a%4jaQ{Ob*r?0 zwXbZCf0-F5mJ^?MlZMSYO6QIpWx%wJk|ZJ-N51(p?xa~H>) z`?r?XZCgpBrUPZojeIfPT_*3eZzt_Lw3imIR}=4$#xj5BKKba~0rKVESTViW=`1(D zA1=*Xb&?)k+erI9^W~aZr1UEtck96KreC{Lpv(U=BAfJw#AS?Df zEZ@X7DM(3`%(VT|qhcG``#i|sm@lpSEs>j9FGl_=?^TgzKNmdVN|Ynv37I@%jI276 z{>%k@Zm2}J{Y9?t9x5HjUlkFNTjRf#o6qfz()9DPY0V+Y77=^Ob=kA$u*78* zi}9&r@v(edNhduIiy)hh}cdplpg(O$(h(A(yv+*S#nQA#3&oOgh+?A*hqT`T1SRyZyDa zs69xoiHP~g=hCJBOgWS7kUyrsDUHAQPnkOl8{lgT^Ew&an%!BXps`ywUxW!ZpcGWDS0xlFa@ zO25fl#3Ujy(;G^y$;YKsisZLJ)usE|^yk(qRgP}kDVLKA%MSj*m9qL&nk1f{Cv6*# zlY1gkxMPB}8v2dg%ef)%Rc$N#|FSPLjxCpAAIy+LkDhsm?Ri&Z{mNaEDk75iNRIE> zD|eDE%H-DVWcHD=G46TGU+OKoFON^pm3A#A$paC|+cHX;4_hX&B{n%d_7!RJRqS(T zvOsQ~*e6FWJrb*kT5|f-I0k+TgxY>$`~WR_w<+gUnh$r z>!QpZ)J?uT^W62#7$cjP?~sQ!5wRD`&E0F|@Vx}tI`2anK4_dQS@xwY_~D==n?&pd zN2PC#UJ~<{Ik>%`@+W+I001BWNkl4HpD_L^4M8uXQ8wb25gSO>92jq#eXWcJyBd6>- zleBMzY`B;qaVJ*Em|=^g@Sg-t{5BcfdYGIMk<8!bNbhk=0zJupzSc`g8bLbVD|L`>Q01h?Hi_rQJWv`M6uMWbj)ue(g085ji<1 zTxxuJM+)!$1$X*RmE#!>xi-6*H2M6ZJl(Mlqs0GlSoR#gC8Z)#{Kv1d_V7b7Wo(wF zK22o1Swspi$h2;)Wx>&FvSeV7zu-=+h$&uH4rnYB_dT}?=KJ!?svUB-xJ(Y*-}}An zxRM~pz8fdKKUgIO5xM_)OL=v|Udey%#*=w@l?;1(s$3V5q%|K%r^y>6zR>oRC}&7M zBU?8fmpl=%#-Ep8_g$3i%!AT1>P`7JQADIbe(W46z1GFai4|j{&$x9`A|jXOb&@O< zVlidPpKJmJcVoz~DhR3)Rc`)K;Smyyx5kFe@t0uASK3o4;Vf6uixBL@ZJ5M>{(~4i zWC%kB52Wv)sqDCvfP=E%*-Fc^9z1!8O0e5(*sRZ@H8s&ASUjyh5p_l|Wnd%#VcmOB zA^9?=Vjp9DPR&m|zLW(&oo4T^tNHb88t7ecQf2Y;oKf`dHh?pAK4yA7E05DtQ7a9s zU$KVUdOe1FiR2XNXf=H_wv}_a_$1gvrAL!>k|oP`5p!)F6Fxskp-P1@@hq7hRY=*f zgym;*&}wXCT-wiF?*g#5PdrFO+Xx;XI!l7df|vCk^S|0acBB_sm+w&`VD6Is99_}p9Mfb zla^FhWODJ+jb{OsDh>G;zG23)^ISOeJwNVCLJDJfsINx#lw}N^vV)+G6-YjGjkJur zlsdU{X8j8GrdhCNXOo%Xpvm-csDJ!|cnYywFeO;SGea?iyBEw7(96gA)P9ad?W^iUv(NatVG=Jzw$IUw8jN{%u2?7ah~Lh z%b2tBI=DKav1M~JJ`0o9ox%g3F?n4ac5GzF?Pbi+k&K`HJ?9dP0Mr~g9H0GbIh;`* z)~isUv}AMUw^eN3eUR^d*us^>B2YWwqD*Y;z2-5S7W~9bqbs3d zA=s}jVb=H8$+25OYt^Gpgflmf93%HB z7C2$LzLW_IE^zP6au#m7hnSN|#E+=los5~i4VPx&q#TbSBk2NJ&*6?nSxRbr39n5W zjqBELIF$b!78n!Qvt>PdkM3f@((T0M+p#=4%02%!1RejB313_#@D(3YjvwW|I+RM! zGLZfBI>KuK`3fs7qHn$e?1F>3S}#*gk#qsjq)hnQ+;rHFw$tx`zx<2qtMot?->AF!Yy&1-ciT#N# z3!~<>4sX-HcWeC8FK{K<1P&8Qj}W3NM-vw8iNb8eVzZ#GIDqkQTwwm1tn${~czx(J z-U~j%h(SLPFlHVTn)+ieG2n3ZCn%~4m7@I6I&7GW^RcM(xCBH~qgn)>t{QB`ML-}O znpGq-?h-c=%SEhHRfc~#kJ_h4GIVJc?|wd$2EjH=HbLi8fojz%;Op&#qof#rq{g1bW55+#}TJ# zwO|SFL~Ea}+n)k!m0tL3(>T3vABRsI=jgdB+dYhS8(i zasQifY%i?K=nq=rrzyswcE&BR3N@;Q1f zhe0*Z^3BgrPOB$P$A88U-B#Wnu$ihemoT=G7nYJDa0?`~LKUJSd{A4B6q$S(ynHpY z2KS-;D-L#iG=d)<0GevN)5?eI7p@SWU3T!4?yoRn?sNk8e8A)#FmTo=YIvJ5i4rH@ zN>r~Ng}0|3dvOsavk}~a2&-6ysBj{7F;XKD~ zmPxkPf5#ISuw9vz04C)L%}+c>I|C7i15pd9Wh!saox>X;c1%`5 z>k~!QY8CPGcE(XsjM-HD7u+ew0*|+u(=nF0-#sDDX$f!ApV1xNSU+VB3AG0?;jL(# ztp;p*54=OGQY|_JXH6Lvm{6eo3+`A@Q}MNSyy|?G9jBgPK@dIXE~ZDy96Ag?PV)ud z@J>w~CSxf|&rm8xS0*&b1BJ<0R!st-Bklxc5(}O!aF0|m}`NSFOLX}1>=-O`zp*o=5*M%C#`r`S`-P!OzRkU)Tyz0|&KE5IpbZSf32=(2MZH%d zc)0(!XEki}5jbbwBj)a7G@+h^+zQKuDL~R7yI}>3h#Kd7V!%l6ad(8Aa%Q0B3KUO$C@k+A?lP zJ=E!iXoG@rclAN#Q1g1@)-(!r0<8fBg8FCXXjB_7W0r$71sI!s*E& zvl)rMvXgkV!#nZ(YEF zr^ic&vtCE;-57EeTAcLdomF^HyJbiE4Sb)D;dl9USGiDryq&EXHR)YH1Wh@jXgtGd z)S)RE+gCr+sD49;xbhoEpVQ>^UjA4f-61L8jI%dTkW4{vH>S^=!L*M)V%|@uIk~D6E}CF! z)M`T4R?QhaxEd*!Ze`h9F`K7Xdk6%dnu~@r=3rmqXHDgxSY?f|_!7Lz_91bs;O~Humd{`ribt_L|C`#Z)Lb)Pt zPvFGSRJ>|M6BQPXCE*Nlz^PsL33@XcuX1LaXXUr(U*kMq?&n^F z*GSGSGj&}5BkK08OK`=uL}c#bNFl^u zjl=BWM`%PjqbH~jpR~KmobSqt!I|#uX4TOg-e31MnjPQs+wB4r)qB&pXgeDpfHn64 zx9-`f-m?ddoH95alZt{owyjB^Zoj%^7Zar~jT_cRop+Iwx63wF;+Hw;jdeF*#gpD_>Xn4f_T{+Yp(1sem-ef$uN;-B9Y`stAjx}*tDnOwo zq$8o`|C#Xs@{L=Pw&ImDQ?xBf{AkaCN#Demg zZHBv?zFI;^HNWzUYF);4w6lHp4f2c*z{0t?L%7iOH@@#Hte*J`Mz2;haem0bTRCXS zVEa!=)F0T0@Q4O@rX1vw32vT@LtiPJ0G~3pm?p9hlbT%O^EG9KElaMfX4zFA7XJDv z>5JyG_i3;*W$?rQudz1@mf86ixNmGS9;Ro<47{7@eU|Y zPU_W@xt;GYd*#D25@`Arw)}jIMqjO__JciaJCT4n=N6aCO^VjSM_m3R508kl_`}-kl-fZa&n~=57plG5jH6MnpAqzut6PMi!N~VMi~|)uk6K_0pD?ZUmMoHHJvzB1XaVs zF+93RB5?GVI3inC$5W$1?CBg^b&iT7`tqlwCNAyxv}-c+e!N>wnoeTRci-YNWix$U zZ?JL0RS4@&OUH3G-LRlh#Itv2Hm?tCO*KD%avokG1>xB5@e~zPR>$p6M2y_iGH1d> zS+O_qDPQ8s#8$W#o!`Wgo;Yl2*OGlAD0IqC*_CCLI52wn;VZHsGbg339{(d3SX8NH&Gn#CdWo-Mt^23!( zDLg$vs??rV=KRgMCEt$fBxBb+5J%P#`LIJR32^t2T7%Y0s!c?!2D$XZ0IB5aEdPVO zvka?p+xq?wus}cr1u?zE;|lE+U1CI7yd=cV#8>6@Y!V}?BPnIi*+Z_=^5s^=~W!~W4^4r-cF?>2HgBz6-`+{~-XVmd* z1{8I?TwBpoobsDX(S{@B)T^ZL{FVG_y|imEK?2i5Wy7x?GIi?%$r6#ogT2J1^EQdn zizGc;CQYh&$)j&Nfid*346I*P>dfunxyFx_68(Hi%SeBoAD;ZDciEGvI@^U2ZFsa(9D=bQyj`(nLgcbB?s=xm5fgY?AI(93+2!E3vk7k$%f=WEW59U&@T` z-DK{G=YL<}YfO;y8z#%>IVUAC;-LJ}Y?z!0P8AWOyj+q(s?C(kb26V3? z?bdu-;Pq4{cJ41*9>z$z-z2F}b*j8Jh)Bv?**>O&jM)B8j7h#S?U!m&#M)Xa57;A- zS`pD@%Co=0oo{1H_i?ARsOTmBibOfJu)lcDx+s|5_LgazZ%gXijnb&jD7h7vC1O;`-Fc0r@q{~~(}u~O zaV@1-esd|+VZQjss>CQF>d^I4-?`^MW){gfDQ(KQ$)!}CygTSAjk<1;coES(-6Fkv z{VJz|GDZDzgS0E>D1{wLN~d|ZvMXOxU&}V{=29%bg_QExEbq;2Mbv8fyOQ@uTjtBW zt*0gGzogvI$^C`HW$LjIUG5izF{`kESn?0q+Dql(a6PRYcyw#X4m%JOx@C(Xs zKm5@{KWsPg@@g41XR|y_{BucT9#5<%UG~TR6T19Z*UaFXvV6iQ*&p=h>KeSXi~O?T z#Wz6y@5h#287)V>+sf2inxC-2&%ZC`$TS)7+ffNu{FxTe$=$JarT5X4f68A!`ir#3 zJ~DIaY`GBeFGu}9{Pgwg7SeHh*q@38nuH+PIo3^$;Y zQJHeZyP*s|r}$H`AnDo$88d60Jc|2s{q=Nm1Nmid^uJ|S)gRJ0WrW}tW}sX-mmE^o ze{{+&frt0wC{@LUq6L3^F!RHnv5Y?(iDSEEY#m+U%f^0`-$7QaKZ~{35@xn5kA>NP zc@FXCH{1S2`O{wU-=V8~dtcOlpnPM4{|0mX@A21PvGo@g{4e#_e; z#xoH2cn{f64^fh||m()Sp4#v+;S7oUNg zf1v>76Si#f;l(G#&-p9qHp|C&;W>B|Yc5A->!OR}_Wp$obMM2Lb=OJKgC=Mz6PDcn z2gfJ=ff%z0_uaynzP%YbZ!ZCHS=lqCgj*~fJqXXi-mJeC0}{g(pIw}~7xQzvW(Kf( z-dF~C3}n{fpzOnvMirqqHsS5wn_=@05SR=^9%0gN*U0$EzNvWY!;}Gi88l%D7Xts_ zK4F8J;9HwnbLidA#g_IHm$%Jkh`T%Ew%j8lCv?&S4>Q@r9j}SYxe}ZOX}&C5eTuM@ zte;ah<_Zgk55#lW1h(If`)(o{b$SuQMs4Js3KTClGj;V7j6b8RA%j=v*D%VxHzSrD zCoEO>_qcN}33MU&?A_1JfTSNZXadPMSvt{+KD~R>r%zuzJcly-Xw;WbPxU{{4DSW_ zMySw-?Pc6=zNmlFU&;^HSTx*?U%C%w`H82fNax(rNqD&Trca+f3>>|lFs+Ig7q_wV zT=D{LfefspFulH{peVqQ~OjE?6X$~5F=FvaJ}7j5k2}vYK>eKUTMqLy;wO7T@?BPr9gL^fNLF3^n1co1;Lg6sq-B|* zdb$4dpk?w0qjWUu2F)P2h6e-M6vJ=DRL&$Dd9i;h$Aa_n%dp9UQ+J+_ zT?(QD001BWNklBwlOZX#{9mzcZh z78$ms$v7~B-7$Zl>o>n-B|T>CjNRnvI-I6vuh_NcI3JA}9Q<`Q4;ID4G`S4ozBM)V9Yuy@7Cph9ZtQ+brBbno`#4MKy7KKVuq@a=Kcb{gT z#c?cy_RMm2yixwdj3k`ZgXa;|*o$7Z@^X32B78IT++Dkhb15b1J**3gO~aY)_`8Gy~@#mu`BiK&A#$@^#U zd(w~Rl4;?0*s%Nz_PvKuGwB-Z58oh}B(@Ek&WrMHc=fEp%cY~(7io=U!aJ^BxlFkJ zN4hFGH-9l#jaBg&(w?N%gIN%uMHO+IjcYDZwC^yg#$I6U;TxnBEJxPSd2A0g{CE0gAAm;fcw(WjEIgcTf4f>tsr=OuF=6l>(K8Z8Q zg|P_pwy%3oV~oCjlbXHeSA8(ij^bt z_ZjSp`Y{&h74O(QW(I+!`!i{DZ|aq^BQL4kJN1CV?fNld!L<8ipvf=%qrCe10D7MTn zFYH1a_mNDRJdk3K)-mJcJ9LJ>!JX9$@KqHf?~Ah>dGO}Tr0I`iE16v*XYkmmD}(#g z;?2?#Z2u&Dy6N);cPuV1LzfaqZu^osCGX{mOTgW&GGgp@i58LA!xNog*E_qpKUM2?|`@T9J)^wB9eJ>u+-@PyF>;olPVAz3LO(^L-^bXpvMZIYeHFh$KIeB}2N&g8iptN?#9IbM<|8 zmE6KAQgY}c5kssTpWQ(QtpA24Q*m8}wj3lUWAq}DCTGUBkP-Wz$f?!CWytJvq7jkg zyuCH86&nEgk_iJ_OxZsu?UpY)hEW9LI5lPzBLCW+yCFw@J1gvQy zb;kLBQ|k3n77ZF9Tkd6-7eAcZP&%xAEg@GYN{bFFB|$`VzVoC_|JCyR(R!&{rk~u% z%;q*bHKvAiS`#Jm>6nZdIzf&+PX4Bpc%Qg69xV?=L>GEZ7L1!9M{l2!!R`9Vj>p-& zl&@x2kg_B1%eyNRq;;3Ik|ZM98#AQ2`*L}fAQH2$os{*s{FNV0A1xG0_Tn+GxJwQQN( zQzjkw@XfK2bJDNjAi0<(BI-yvFs8H2Ja$jEPVJ>Z7ZKIjky5AsUWs_Q;(Oc~-dG0jO%i#tS$cZTlba!5 zE9Mk$w@dFfljWs|sGlB^iQ{I;`FG#&{Y9>qI%S5)Q=^E8Qv8qYkkzxiq*ZG#*?0e= z7(^s|Ycr`Z*!LSO2$LPtewAg%o{2_80_L}p*2@DV@#SyQsO}8;z7R4@Ce`mKzejyf zIjoDkEepmDk`)(Xz9Hs2D!u9rmYZ23lK4tCdH0s3H`Bf;4L>AJ%l4IPsmAZB@Pf9F zk&a&Ts#QA9rN93sEWJ}(JhPKszG=)w%?(qmN) z*>a5R7&Be=9`u%S&co!fI{Uc9>ACI1ef7I~{Cu+BvNg-cnKFCG4j%f9Wd4W# zEbd*9)O01Lk!R@EWh7^lG-O7`lKklfi8f^jU)`Jv!7;-fjP5Z?291Th! zo4LgdN7tTouJoFPV-~UKd>ECRcA#>u_axd@!SwgW*t)L3SfvPQuLDWY8_E6QC>=YF z=2C_MMMNYSI#bH`ok`_8^S);Cd8#pScyW%c@xk}t06ZUdVZ+FBsA9rUX%ksD#*HZ_ zL(u8eq`ZGhd?8m%_BFS~OY?MV;*03|xm(k27{r~Y3u`CKLXF}r^><9lu3;OT>W zu-?q^DOox?wbfu2o|0uv(bL1dwFu$g?G_Y3_Xm>~fPFnM(1lb2#Joj8{QV zn4(_Dki#ipSB`qMYm?!3=xZi#)0x%dvY60!JGYNdWk;F^(>vxPIm?thZ#Pk|#W)`2 z%8erQBS}%ONUT z1r;4Tx1yN(9SL@>Xtp(`SiP-Kp%BXGSd#n>;cwwY;|5i+GL!7tzL`0dyN{;$?PXsx z`FstSJI00$(|+fH&p<}K?9JLCCCEsKL6;uDq=5ri`#7Gg)Kroqo)Z5J?%-leTG%J3 z=uTT>5LaKmBQvKf zbJw0Y=QCgw!3a1H_>G2sv)KDNlh0KK&wiD8cIGS>cMiqFw+X98xuW~{{qze63-6spkRlFvR%R2Dk;l;0+ynSz0j80{&+g2`|TE->m z$LN+{uLJq8bt`f02GhvK1TYf!>HsaQOsKp#gti{Tsb>iVdd{WYs}<}F%W2fqh6XKL zVViN69g8M2`m!~{+#6t*H)owBGl6HPuaW;34@v+rM>q1MOcUBxFGZfu3vA|gRB!8s z#hndbGx_{2Svo#9^M>!@kuW;MS19-*;oE+k;967p##zpggSzIhssv+$fq~LSl{TD}AwOPmZid$(oD3RZejio4B z3ap~HFss!WJ|Uzxb=l<$gD(5#&#*ni8aS@b{|0VGI=mH5ll?;QGL`Qj<0jWMw6A@ zF*R9OG?~M>lk=!yo%_pPZ0XANsO}WYxieqaMr^z6WJ{?fG#sH~@sT0e88zs2T5^@| z#o9gVaI4{nnHaN+Kuyi5?R^NJRoy9|$-*cGpeWNOYzM5iTJrG9MOzm{&U_BjK%khf4HJl(R`wLa*J zuI3G9v$4)a+7Ah1+QCVb&11x1G-6t~IwO|vVMgETb{qoM@HbN(_j!I zU`dZ&F1&yAoOhpcK-(lYRXo?zFLf5PE;}=MW_?TzTJ#zNHZJh{qHC^lZp><@Vd?Daw3;@8diJJYV!7GGL+n}5 z0ZWYra^)iP=`Ot5HKKOi=1jfviG+w0ATQPH*TNxpIJbNgzO-AU_g>Z%noY}Tru??2 zH&%KLdTkbYst;%H;T5zl{gtJ{Bwry~O*zDl*=@1ZXfTQnD9yBqcI;i@%jca)GrKDE z?bVWSpB*S%yU?Y+4W<|ogWx>y0GIa-qOeYfG2tP5eWP%y(3tYJU@+>@YW09A1xqyK zmu6`k+8y?FC9LHtwpH0hqd{>jI5v*rCOY&617^jWGh@>>Mzt+RZez~u!D#Y5?idY# zErYzAd2sd-pHj6s?y{!-z`4{9UC8d>>WmsymoGz>{sAkFS}=T670@Se-}e;nEPBwj zq8S>k9<5H7y*HV^F%w3buw}{9uUJrZILn#^GyGS7JlBn-nw1F#T^8vvVYEK-jl%J|oB`-m;|G$PK(VCUcK6}ti!m?ox?%f2vnrD|fI`kI)0 zrKsX$Mq*?Z1xsa;qy8%2ha_qM!w-gdI2mAp9qcu94cV1iXaMSYF4l$ z`gIaE&bDMkhhSQ=E+v4UWg4pR+Ax0KTDi)F>5?pMMHi*iaz96`IT}N)*aR)~96hl`Mu` ziRu(ec}-HjVw87)lq3T-#j*)pEV|63edsp!ec6Z85clyt$r=kp@sWr`phy)QGJ=WB z1 zw9!51@{6yTyec|?SMhcfH;?3H2w+zldtD;2h9cA`V?j(n0yb4#C~RAj+-cF6=eHui zQUTVs6v&?^2b>mD-){~FKaVexNI;khM>{QV10%@LLte+K*ro)Lp3i~OHhL6l3kvHl zGhx+RdTzPJ)5niFm$Vn$eP5XB#bSB*R0&pvDVWC; zh02ujj(JHBPQrum-cGJtccQmTft>m;E!l3*jceV?Sg4YTjm{2y`+-Yo=|7J>pT6$rhrCb5 z+#I69BS`$5hKio>OWO#qI+|ZBKp(HbB=H&xhqR(<+hv4&ILN^6iwFfw?aETSPHhx^ zhY9?Q1*%v0hS*ZWDIUK^*>q$^gN|%iv!z2PXFfg*Lu>E)9qyzg=&>oDO_OHcX*wOk zceDS^=T567;ZrE_YD-L29|=zY94h0W2qDt6EHx{c6Z0koTi43in_G~TgFD)&RCF4_ z@(cH%=!kiDmR%P<;c?_Foinbp`M@0%#oX|831H)nD_pyH2ER|mY1g+M%_|k={o{+A zzHyRuC!nWS^&F1DJh)V?M@9QjT)G+qByn!WuUxOSmisp*@p0C0cD@!|YBZs6@)h=7 zxXk8bvD9i^0sE@`@htm-4Lh!I^};#)V@uJt{b$xOXC`?U;n>z&BpN^!>BshEdnvK} zI*XcRacI>}BJ#DuqiP~Yj-1E$+VAYYQ;0sp>r=wPiL5urId=achxP|ixOznj=Wq|2 z7jD9UPD=Le2n4e5-@K5cCfzuGdmW}*r?TdD43?F9(%izA%}1_t;N%PPmMBa4X6|@Y zj^W^;3;13=#6iEp^d8{yIp4&+w+nCY`4bYSK{DU4Yy1>qM_l2|qB>lgH61@iMLN~8 z;>GQYT)26Rb!YO@XJ|D*L;S1TJb3wz4QR&*?Gic3k89`K!FkEJf2EUFcLfH~u#-a_OcI8_wp#eQ32D zT`j2FuqHP85bium24Xlm!J7wde&@mYp#)AF$&oNiYSyfVG2${uuAFDXu?$*uuY_&I zez=!>#JZi=Id|?l;o7n^Y5bXWtUNQv*|K}(buxgox7XOQ{TdCoUSUk}Fm`V_L43hq z7+58ooqNyWd&!5>&mHJCs5!MOxS$EWjL+3`tUIoxZJ%mbnwkKn6e`t-_H~l+IT8ja z@Le*UGeyR6?am_7mwL1QQ5p_aJ5kkmo$V*DvGaH^#jCqevR*$1RSIGI-t*kLbd2+_ ziqfr@Q;x2V4EJ*4&dGa3Dh%k8pRr@wZy2UrXU~XYoL#t>mxem@tYP5#g$rE2d5|p^ zt>`$y_AP|iHxvI*lojci^07|;{svz`N=%Cqk39*SRB z#o9}u;L?ZgMf_O5?*_-u+$A|*IcnD_O;LMm6k#uU{qhR?&xMlpC0DYhO*>cApI-6w ztpaor>>E3V0JqcJKG2;<)5dZ>#*wDAoQVs##EI*tS$9HD*8x?qb?Hs#!uQy){{}}- z`;lQ?o|@G@6Czh-?s!YKEV+&bh<|*NT_=O-eefJ^+B9tv#_)Y2Z2@}9RBw)B+Ew4&7{DNb42 zSZ-Xs!nK>Xxp8J2yB|ByvD4?+vcs)sdEWa!;cavlDBrPr+(bSNxy*%?jkq~$2G^nm z$l&BQf1J9tpp<3yq(>2Yj=hI3arf>O_8hrSR>4w~Dq)qATGe6J*gR}n>WdNK!}a~_ zxvyiwnd3AH_F?16C#37as0`rXwhy%UwF9O=u8Q4RdEz<2?*a*Wwt#XahH&BLJj!LG zAvNpP#=$I%TYiZ^9LFblbGOA_9$p;9yXhm@9}q+M^RxJzypG@9Gps!nN##bRC{VHA z_qd}fL$hW%+@6$U#; zbL@!&JqI_VM)^u#aA)gT6&Y$1EC4eHJG=R#3@XCfH6g>c6GJ-HqP~lfN3Sv|Q>`H# z+n3TtIIj*L=I%!mT8x@c z|0-Xv7SB_$A|IDd=W*3u)KT8RSKWh!!|PJ6q#Y?S(TH6wy17**`qBw5J^V=7p(~l* ztSI&+T(C-g!r7D82(@a-jA`yvw9A`4GcwDKxi$Fh_90K*ibTKH(y~WqYLu%%hlt-~iS0_x>src_($%$YCHkKOR zh8U<+vkJv*vaM@Vp(IZi%p}7n0&a5l@(XO;m$ImH$uC!nn-sK1_u3cV2m@6d;<*q~jo)Uqp^$A& z>N^B+Ew}`3y&7Vte8+j8>u8#cVP3!5Smh~1y~g%DIdBO7w1RXVJ(VtHzg{hFUbP~j zb0-l{uP?4?w|SM@jVb-=;9A;(u&^X-oa)lGTRGmJI>ObLNmLuLoH2E5DCq1=fy}p@ zKY9awi}B3wR|~6L*`RHb*PPtO6z-nBL!oMgc^#6U{$8CZTf7DxTp~E(Z$qb!jj2>L zlk59W5?P`>zYgh2X{!R%X<3@k6GyoII+YqDm*HLK>s~^xGA_h#Tf+U4ZE2wQ7PKo$-U7ubTSURN1E+~`{)O>_J5$ys z*O#(m>r!_3uUvz&Ni*~xV<_FE8?9^Aq-~{S&O9)sVeITM}+W>Bhf1AggLiXflE_=ag|H0n3Js#<+> z@-vONl>F3eSdBt?a+W^xTVs+K%x%9=oXVMSFQf$H$F--ZeGOWd4(0T7d%AaRgtJ8) zmkypIrHVV#2DQY&ydVu)e2Y5^80h--U3n^0Byz<}{44jQp87i1GrO~BWIf6hw?~l> zjo6l_tW5+r-V|og&^8py`!}WB>I@Q7OekHY5+&>`va!H47Z$d;xWD}XX7#HQAFiTt zmoC()P=gMYVmR?2AFbLpp{`37SN0s{QA!~?4;e+*sv55E+snyocX{?EliFieF{@?a zuUJsrnY5GJxRb9M_44?0^g}z=&1_8J!WAfH8bYwbnL6b%c=XnU)?Hgs!9G8xfF|iB zr}iD@(w!H?Th(IZxFIwyY5t{Mn~KgnpEsMR=3TLk3B<&u2Yp)Bq*(#R;N6c znF07kS7i9mdf5KmN!?UpQwvbHMGXq(fPslkAq?;C;~T7|l4CNLL#i-;Mq3Km)u2() zcU*r{kaE@`oIG%XYj*>Yx9F+2gw5_Rd?y*v@8eYo;Gfhr?bFs@!f3Y2ulHYTOA!jy;PoVZs)m0sQS598`lTXS&*IzLg*UL`-^gmTsUDA8GeeQ(# z$Nu|#Xx~c8?LD&dJ5thrKemiIg}gqqUCxFW{s|lW`18zwOLFMib4k+vx&HceZk_CV zuKXAJ*B^5bYN7(<@`Xzhl>F!Fns{xiY`>rQhlVr$3ntbp6XeO6eRAW2{HYj|;eSl_ z-3%6`@!w^g{7zd5JF`&^zy4QvE&uq9>ahEA`qCZwp!jqB6?<`m?0A&+Z}E_-ivJP! z;9v5W{3Ux#qB9trWT`i1%dJbGe(YO+m#4@hI!BM zZZ~e#ohjy6g4Q#yqXM!%`te)OY816Ah(qNb?0Atu*5mP%Z@huHpRtf$$&39%sZ`LK zVs-nn%P$5nLH}k4-Cdn1R`Hvi!QwAJzNyG;H}BuhVru<)0jJ3N8Goe*v2$E&oNTNq+jSW)ld?}BW(Mu1XN3Zo<+Z2j zh;6)&yv*?alR5b`{-^wTGX~HkaeG5QTx_f;(PShibGYiVp0A;8*e|&vvtuVaAQp$$`!DpL^E&B2BiQd$cwR5=x~Do~)UVkwy*<_@6gVF|e}otazjlgCuOi7Z{9mS(*ZOYm@Fx3A~Yd|I3`_x^y1x z@T7u`HN_ivap*}Bm?$_ot`n7tJaSC1C2 z#fK!~+x=mKMpR0*=tab+*NQqzFCt+wt4=i;c{x@@-pj)3j^cGaUi|ltk&b{B|eXAR4t=G`eg$8+}%$C^ZIAd^jmR%QumOsUqROPm^v# z7t71kFqv7?RYqS=5Rp)sU!#}|y_+Qow|B~DuL*MfyZvFUs4`XAmkS#8qETx^BwqFm z?IIp)u8CUGWJ?2kY3CC!s!wNRKm*TgI+U+OHL|}`4Hbp%!oikC@wR9rMK;zeEbWgciZ1?vOmE#%wtRP| zrcP8!m1vDQ?@%j6XHbaW&S~Q2xk!S=DChdul$PtCiAM8E#+P=GfoHOJ*i{*ck|kQX zHmR3*ZoV!_-|Pi$PBHt|~1zy%e3{gDkDCC*97bNb>WY(xYK-xtb;Nd`UlPKV^@Eszl`ZXerzJl!RUP zlm>(D|4SR!>DQ)8hdynjxU;vs5u*g1nIg@aPnHl7iQDZZ^*q+etAy-Z1(SW6NGW%} zziA;-X1DGxTl_!DKXvz@(I~pCOi^TJic+Z*r7}}8Ra!9^MU1*EQ7RPK->Eg(MJooK zsFj(bP$)&E%P4f<6on!)+Xq>Hq?b_)B9e02L#lWjlqiKp3^~}W{qR7Rdv=ixq2FLkmP#@+6{1jN ziZV-=-R9rEOOyRBqfRZEitN8tWoiHL{mE|+OV6t9&P`=k zM{=7MWyqq&+?cbUFC46f2=+`K%(#s=NY=)2*t0I3*1sYB{bfSzI#DlADrQBCVy;o} z@zxP;nlz=iQxdO3^3$P@1O7+eQn+zFO4};9e^AWX{cCq(Tac3UH)ojKzdxHV z-sh#dFb$mY@IK0nPJ^6ydhi)pxlGU~5(o~BAu=ifr8b+jVc^1+_%A=q`_CzXF^&8C zW-@r}M&7Cv+??H&P7807^y(OQE!}W)h~cBUFqJCiA?V~O9;l1b#L0}%$Xs;xa^mUl z&&g$9g?8N?xw-YmSGIfgJ$`M`iKTbr(5Aj%MbE}~9}FZiIRV?^<&YFLbvio{b}fYD z*ZVn_XE0M5YlsN{h(fH$OK#eXYDVmZTLi{u=CGU?h<&t?z8%MKBS}Nh{>k*2u#Lb+ zr?{EB9eqp15EyPn>#l`)df*yC$*DM$a7LG$MT2fm1YdYXI;9viyAIdpAL0uKtL`mp z2KQy^!KY+uKC;`rCf&D&kQ(Vnf_)2I3<~Tjmp~hpNX-4i+{oR5{-t6F`e04VP6c^# zG6Lsc8ex<95&uUKU$QMj)Dhh4cIUwRED|2>W%Qu29J_IoM|v09IcW*}ke4oACGp?) zkjPK|q}n&7v`&FTwGybpB1uRzB9>*TQ?(H0Hsz^N-uj=Pji%jX);0@f{aOnP0l@^D zA{8iYnLep>VvleaWJ8nClfVex`@oZ6pTFtuBtELT=mjwRtDp2e#77lDr zgGNnh*`_P=t|Vhfc*5GjEvQwkI@KGwv++(881K`;wmbvIdE?Q&Egc4|n%*(WxnX zdLKea$mgF>K8A%778y#eV%4xrS5diDDWdNMlcxUJoL9%w1r;gi+Ll)JtJAzg6I|O) z=5lBzA5To7ZQ~}iXwiZWeHRfZpm=kUshw+4wSEVB)Gk7WX;(w$cFcGiW*D(~a zA}jg>3bTBeMVw^(*p0l;ofmCFJSuYG)N~lN;&yQ4GjmJc`mEmBn~-hmST}bZ=Uq1A zGrR=K)KrX_p=_JCfJ@;S7*q<<6T(pyC`Rh}i42){6QhGASqbrA>&Czm5uCpNh8z|r z3RE7!s+lF&JIITrH?@l&nO>MMQzX|q~ln*7G+GIFw3ngvmRQ~ zs!nMvOu@S4Tn4Duv-as{KEE=Ioacq*n~Q81H-K%{^Eo}G3Wmf;G`WPkTc)t)Tqu%T z$czm~Xr?4F;T*c61<=IB zf_XE#mxCvd9}$^DPGDAYAiFnK=g81eEIa;yQoZKWyQ+@N+_sp$T!+WVeWchIKo=WB zdS)_ueGen^3g&3^q@%@=vbWr*LWYVXQ}vq>*EOFfk(! z;NVn^nnlC;tydSOTvk%EMrG_QvY|ImvAPubc#IQIgGto>yX!Y5R1w6<9!DS}Z(BXgmFuq!M?!SM}(@9qB+jW)bG$R%k`Kdd552r31roZ`l_Plb& zZSwDI9^8>W^LB94_cAM576JhiOvr0%PoFL4xc~4pzcx)^{*plY9DdCIVehP?tGu>; z{k+?<)yks%yC-F*u}BstNTZBYkpj^o&2y-tlE8;wf(c0 z{qbQ6NZNdcvXe{MubtvqNuZYgsnw4hPhR{H1b6tSb-`?J{hLtkq4`-WquPq1cWKm{`}r}og9tonH!Yu7HO zZO(FLZ+}4asRQKHSw#GUC_boL6&tw(sVRwrKi{UskEgkM@eCX048$(>6f3`)%m?Gk z=rVD_1SZee$n&CHjHo&B!>9asIsp+aDs`Enl6yA9H*F7FE5>%vkb)^^DCY9!T1vu(#`)UlQ#wXj46ShA-q!*-YT-qbJ<@L}1avgCrO0LE_KgDRnrzVDqoJ66dyz3XSKRl`(Xk)D=5GFtbLc zaH7Z5wJaD}2f5CO+|mxIDj%yZKM}QOEUv|+2o`0R=^{Eb#yTgK>vs}gS??ANKVcAS zSa8sa0mJ=4FMzfbS>34|*fW)CG82NO6}Aq|Sbp&)(dVPtI?9dHJ9l#{Ne?(MVs>jT z&H0&^`UT4%I@NU~de?b8+q59S8YD^^(!?v({VK*#_)JU!DkZVei)&HEsd#4a0 z7?4<6AqAWRYf?L0M)aO5yxJon6PfI^na{shGh#*q&=?R9k@$9D(VDO58fb^qOo_t6 z3Uc#kw`?!R_k2ZQ=6*IGP6Ev7^Kn~Ze%{5Sm+zBEEs1E-0p*=t#F<6VI9v`g3#6q5 z*!TRIbK6JYP*{RsWsAaOL{haU%ht`JgP#pDr3G?9L~0R4?_nXF`(e+k9(j25W_-XE zzF3ybpy^#O7xkd9KxPxbh*`_|q(>++6UZ&?kd@}+*k?WGwhqI-uoS_f?4oAF{>{FRw!w_~dMT4T z2O<}x$feRh3XC^N5;ZCYL;>8gBk;_q>2^E!?dwcx|vUWi5k3tL};C18-sks%^;t4Wu> zgBUz`FoOmSV({RB^z2XvJJAI0&6vG(0RwBfA(JVPOaA#r5F}ERc5*Ot#LChJGou={ z-j425-^2dOW)?2^l9@{m^Snq!X=yPIzSR+cnvp)(TgoahN6Mg5=`iX_DS9n2D2nA5 z_+QdM7sH-q-?4b*dNyx8$YYHHLs~ldY7I_4VF1*w>4UAgfKlShfN29L-9Dc$zxtYG zJFimY6iUnP19^8y8C?bq9?ZaAjd50(A+hjez_gXj99SK>5oEIRh=FS@f{a(#vF{wu zRez_n1PM^g>9e=+>Cy|?{j*$tu7!ZMgk+x}D$g8y+aey`%)`4)O9EwT;!_K8l)$Yc zad@-{#~Q%Qks1x#U40o3ELuL==eB{P2)Amp(bH>fp7emTJR6y#D7bpWf za0%}~NY-(p3Y6Ge7xMUC5ni=?%LWM?#yF2ltT>TWZnWxnbZ9N{Awy~9@Qg#J(!jSF z)k<#?on?cwjfN{nlJIF32!&Z_q~<69OItHk*@bA!nwH_#Vj>+%SF`f&%Vhf@RzLP* z>bM%5_;wSCBG~vf!YTC}&j2wajbfCz*Y8MJ(KVv8Y;m^LaP?R+J}s)1jp5pocS5v8 zUAjd^IpMR9%woH844-yYv*pLz;824=X)ce_v^dG(+JQJcTZN;f^i^2V(#jHKU@P_5@utGtpy-6!(1uBs4G{~;p3U;c#v<7WtMM(0P9|PZArC)3!Klf#mS+Rn`hGSZQlexD+{tyl28Co&c@+THwYW401^d$&EBI{&IY!W zUnvx0wy^wp17?31z^<8_$PmnN^oqnHNSU5UyY#FUqvGgB|JDVmpMP3{p&|6%R4FyFFPxX zCQLd#9`DRy!^$ri(!!J5OFv;-whPV@4LOBn%{%Wu&PHdd$gOmyhDRaM*V11JPj!J2 zrL_a^=ZKL0UK zOUi^{+~q{9g3H=KNu(k=oe`P*w_;E#GomUf|IyY3TXPR;^%%pfS+kivdk#~EG{ROi zVG_kMW3+rurqWzelM+Zs`1M~(o&h@-AG9ft(E>@=o?{v6hn-p3q%)!xF!ifF{M~bw zuNEXyMh}e!`wo-&>8Ck-(7!$@OUAG?&H^WED@wD<1a5qMCdC@#8yhMT37AYqUPY7> zcd+oZBU6?y;@fX#)7nOlL1BrdQb|d6nduxGmqn?@h-eh4`tCx0`RQ|dR+Djd46ttt@<9_h7b7ct2Ov6eV4DNY-UQ&j_k5DqO3ZM`CTG# zuy4WT@8{9s*lhAOt@vtM@GIuKh1H?D-&w96yG6IYxs3n#7$K8Z@Oc|GHt!B*=yyJB z9MYSHr=~Hm)hYCPSBA{3jf1BvUr*k_)NUQwZfU|QXarxie%Z#!f}S6DVcv)hJm^0k z*UNMHc&&zsJ62QU!D6PY{T4r;FZuN2NG46`#YHm>#qtr%8y<3Gl z(s|TqysXN0timRk&izA~y>bt#<>9QF_Y0*FZe(D?fG@hRV9ZKl`^-Xe zWIhWHDfw*EV%$#8VCv!}_${2w%uj=uG^`UREOhAYMlru%FaginbNcILbZ@(k5={tG zSJc3~+(NbX2&Z{VSGI0B#jt7i%$czZ>&`RzY@j`!!+JAlh7bEbd51pXV;R+=4N}pT z4wFXW>le=KsXO^_NGFb2>M%NvVs4L@efP|0Go~ZojNH%tfeonfVi6ryRwhCwVC9*Bq7jjlnH7}25)5|bUBKW>G;qpaen)8mtD z*!>*eKEo^gjNGd}eTLO9`{6}43xCdH=!j0ZJSd^&uJ7s4c?Xih5^BBk1tD%_EtW-X zDT0mD-{-5eMcm!DhP|>HOs!B*n$W3>QR(!k)oQeQJ*pBlqL9adPo}dk#emG9!c?<6 zO+u?<+a{EmtH#mmm>=eeMVRVVG_W20XO83g+%M^I#u6)~1rbB$^FfPV)I2hmUR@7j zDlpM?QcJvS(LSL>hwWY=7`CWnP?W&Wtd=>*wx>4uDMSR-O3Zq_4QIYyrL%^;h z(}o;p&V+Z^Z($&}s5M`$2?xNjMlJmI%;k%2ovAy1KCdMm`TzhR07*naRI__l$6Br= z?435mPif7N4(%EG(PYLAZpc@wCemZO1%h6Wd$;fSwxgcn!qPIOWzbMuScD?HJEPv| z`6tDLcHBGlHT_#3MXPgT_=5U4m`ea7FAgnZ?d`9b`Q={}JF1H))*8{9RH!t1G%5{p zp@?(eOlHsB3tRvgeux@oC8ds;=0Kz~$zwg&o7|XzhhZ)zrEegSk7Nb8WqKdqH9~UFo zIrI7n(#1uyb$2xH^_)nfa%-ooBZgq2=)q00GX?y;Y!OP*h{*s?Uk@zwnZ(4TqC$bA zX8=AP9s` zON!DHNJuRJ8xI2g+^~>K5Y-vP#H67T%y9Ay!29K+Fy)ECojq!>rrTML_YsN7v?L_Z z8Hu)lq_hIeoxN~2E8=-fA_Y3Iat|cP-4fBDA}i?yY58hUI^a{)2M49}l?hWAdy=_R z7UA~Ac80hYgPj}B)(T8{u{_Lmpjx0K#{49nJTEQvxLSi1)j z=x+I&MC$p;9hmPngKZ=INX=9bQq3K?QAoCW#=jt|NQ=U`DxuzX7>kp6 z5|fTbl%TM3!pGMOdvocp@*;E1=I6%-}$C{sbzs%|LM>BKxs zLoKzy)vGF1>=j@vCM7|!lu&H;pY+rDB-0f&LCi)Y-(RX>hFKiJg#3Y)mr6MhUhaK~!}$2a|@JltfapijmlR6YS@V*{iUM ziOg$T`D)Q|>Q7%nE9+7$-8`^2mtn|x#*;!P!m8S%$w?qCAs3UC3x2*;uvJPyo6WPB z6iSRz?5YIf?_&O&MEueB8nUSNdJes7OMIF+A)&6w45ehGW@57O!ox;QQfwl*rFxXE z0fczkAc#gvauRu-n1{*A6@R}f*i@L)F%Ug-1goX(`FhGgd@cV;ZY6`qaR&UuJW(38 zx|0)yPdI8yR;2vRwAUcq?V8p%t2L2_mZqJflF9b ztW8?-GLlhQ`r&CO1#KQLUZhd16|wdS!Ou>Hwj`63EEzujPQS__RTj^lr=v26DC~U* z_OUPDn>zASlSs}eLg5iefSWZk0Zf`~VxK0VQQA|*&mSjQDd`D`WEE>Mi85?F1M#!d zkPu&lM~F9Os$5d?wAeVgW2^j=u%D=>AU%P^v_i10QYPbM0vKK}zkVC?etODx_2d=0 zSnA9;GGv}O3Hg*5t&!_X5Ui}AAf42F6($jsj=ltX*#$j{0`ErT1=2C}yHLbi`; zfK>(dlc_L?*diOMRKYn60^a{hX7AU^yzUV6`4>-rO4z4MC+>f+Z)Nv z$U-BBYoGMx=SC~oJv^ME7cr!jm=L52?A?9wcDAS>DsDoZn?zhf4n~XL$~e`QM))0^ zPv(y1ujX{~hbb&e3*ggl$K&VeiFsVy%aZrtx7ugQq*IASMaAOF$57uE^u@ViUg_H% z)MV6)rG@!o$y@H@W+*KX^GmdEp@ZFTOGY(?xnhCl?T%{Hl!%4JrJ~OGc4?q1$`SKa zZ+B3WK`WLN6^bhTTjp0uo|sqqmN&ugc&9BX5{qA!iocx>eB$Q!+lsa7cNdr3f9;Ne z>Y=!HdNkmgE;UV%ZZ#9#Le zEXm6g-{!H%zkfvhv|X4O79J)>cK%E}{k-r$Hv7EW`^Bkk!^H52Ffp>rbn#qb(OZyl z1>)Y1dWdyuw-@JMFaFJ$(Ulg9#pTy!UY5L9_8zQ6CH^;eFL)W^5rp4ZwiW&UKhe(M z*C>;KU`l4+sy!qcB(J=Alfj5}SSz|WuYr@Yl4t+XeSm-6UB`Q&gN>t*%9xs*FZ=#+h*-4~i6e3!=;N$6n zg`YMRH71< zs6;u+OWr}Pie>e*;fxwTp5gC(#QG}Hm#CDm8e7|Dp85wD=kwgPp=%{d`>gAM@6x_uaV6=qRA*S zf_WV#jg_$?UimtG7hmOxrALh`}pJ-Zmg#9;)Dmhe% zN>ri}m3W1+=$l?mZsv1L3U>~#Uyqw8qx5+y`6?YgHs&}sdk4pP8@Nde{`?w-k=U(Y z@Xgs=WHJeeMzo?U-A0Y1b6sB)zx%W)_c15V+`+YOC+fvq!(`BbZ3pIlyo1Hv-{qjS z8m<2brna)F}cJtEz0vpkyzMbA%A&QR6rt_ zFjg2JG!nbzGe&GmL!pp>Xh3c9W&EOrjO!Hfn*t6~X)X^At>A}!=A7B8BQ7SHory}E zX6LXvsTJ49_r*(-h#_$l`}RI$a9Cs|mnu<-N>ri}uPH5s6;=EqktUwwq1YGGu^1d` zHOJAqEU;%%B@?glVW3;Z!$eNq%eC<)UY6~PNHDjw#O(JznY9lCmfffOVmao8M|p49 zE*gJ6g{IycFiXC~Lp69Aib;Hui&-nXN)A<`5|yY#C4Q&0P!e3f4}q~wd?OVyAN>ri}m8it8DkLH>P`nTD_z9@gAeVwk4;me!C?E(qZ0pyD7hgp& zE!2c)d`sUfiXg}klrqri5RD>&LJ10K+5a=>K&LOeZ7&FwoT@}6Dp865Ulo;|9V#y` zEMB}Q_q5{UDUnxP@X%Y3B0b|sF;J;KDp83_RH739Q;;E*!oY#ZjTO64B4B_&l&)8z z5|yY#B`WcM1ENX=QYkVN3fQ#i4+RsIs6-_yQHe_Yw?XRa;xcRO*s=fh6D_&$6F)t7 zqpq(lhP)g6@bPCX-Mok6*OIaJ4Z+Xx%{wFN3!k!i?re5EEXFM?9GCxvuB7(fUN+uS zF3B=$lfw-2o4+wYdLar+S-8>`YN+yyCm(w|)7=!ryp zs{8x{qea8RLqD_lr=29b)ug(s1(LTBD=xXqsu{Ccck&kbwza74`G)3G-f_N|caM;! zp;${ySP;4u4l?BKE~n0m@6 zrcYl@PDDGZ+h~Z1TEq6JLb9J<j54ZLueZ6@c)JsExgW;v*)vB$6=mOjmE+D zU?||up`VyP|3{9$P!JyBkF7$2G36L@KV86fWZvGwSJS^|@9iuc{j1?+Cx?QoET1`_wY!cHBUGbNkR2HExVisF<}dh(lZi^I zNBCo{kYGqU!kkYRu;uh^RE{+Wuc9RG%ocuF{0p(Rp+tDvmhZ3s5>G012cLYCNd4A9 zf7$0&@-Gbi*X^7{@$D`IfH;0w6a^M?1OX&+Yl52g;=N)0s4d)Q^{P$W&VTc<^B-(r z-Ki#M5+_>X@rR=lXUfDE>8Izw8%4!In_gh8~%JIIEsI}VX#0t^LYX|1Wz zrZ4XesL9j$!X1k|UFr`4Zt9Pv&03i?Y6SpK{o zBS-Y5X@L2glfWT}`gQ!UkN|=NEB6{Sjc_I7`bi!Z{%d^Hl|Ez3w`(|dVkc3#00v@@ z@8zaN4Z8Oo$iRUE>D4OW&%@=p7uoRBGNv!Q4uXM<`v*C2;RVlbUFDg|k#+-yGI;P1 z-f134NZY;)?$?cKit9ut1u^jbcj;8ymH4B(IUAdULHzZYS~`c)rE>(OsZUY6w4iH) zK&%R)S+{a2UwnT9BzjWs9p>PvJ6ykXiW>$s!XsRxf2&yg6YP--ENXh#cZ22opZKL=+ixdM{`H9B0(hc>OR)& zxJOX0-q@U5!rY@V7{o+=7%`2Qh+cFGmvVIBEKcMJct$j%eZVt*TyvRxt?_@5#(yNY z;989ab-e#J4fU(+F=laU^L)ni9m)HHI#9pM#ui1dUpKm7_0f7Rd zSAIyVdXdzOY{Z!DiKHDKPRA+N$}0VeZ?I_Y0@i#zfdNCi(>S~#Lp~o(`#QB5@k<&Q zlGrn=FLlF0390oC>u#iA1d_IoqfXTj8ny1jsPUs&c3p=67_Y43xJ3&(1v?@EWY$4+ z>EDwM?Yhw>%%0+`G>Y|aPFF)|20E8Uvgwg4{hk%OP z>qgTsG=yrkIxutVRZ0bc!ZUMdS3Q)P&HFK7SVtxvDgM(UN5OEFVRbt)`J-WU>)4)Q zUmvDOfX6%M(5p!;A|t|SHgYY`bp{?R?Lb76j&y3@k-q)g(PZ#rf*y zlGekQ^R%4FV$4a-7dlY0S|~PB05ih+jAmG$X1FQ@FafeEwCL8KAp^S6zT0@-^?1hd z+j#)k`GpYRW5(?xm(cyKqm@gJ$%z^bni1ioL=YhL@Mp9LuSP`e=8XJ$4|xLI-!y}+ zjcZY}dIT*;Z!A-se*%F-mX8}qyNUaFa`|Uw&;Fi$_X^0mwUyCrY7!Avje30-aI4Tn z>Mwn$)wU~b8Z>9%xPCP6G?txDbYva+o{=59@WH}Un;a9&cow{_ONlj1O0~*t{ zWi!IOys%Nqkx3=56+HBe-jA?z-*UWAj#4g1A(tXI zx5YelH)F?a#^e33nbx;9cK^7sjE?xrtLas@HA4q?qh;3#?6{kOD8Su$gJ|1+C=0ef z^Nx^@04ZmfJ-9V>BEt!9G=?*|6>Q|v zGixrw`}u^m=tb`i1DVoY#g;Yq$cfv}nW7d<8q$eT{cE9m5kpM$PBz|kX2`Jq zwCg;QAq`U5w)zr}p5CU!y)z@b_h3ptd!i0LChzf9HpJ9q@&{e$(YHI{mNA?>m4(v9 zo5n2yFyyN+zM+F*%6rPTFWOMOR!e#h?N7IswP^my2?|V*esmfwBf^NN-Hi8U?jTbT z(BI#}h*pt=H|WI&{TuPlFKHDC17enqqg%TH%=q~R>Q@Hfeb!9sOk{vRHG6%{jeN*I zIp#H`C739Bew`bo&J0<2fT+`}>1K0^A@AR0=z&|@Kfje;X1kfU<~b?*7V=HBC7=Cr zmdh8mF)GXo+v=^6om$Ryp!Cjd;&av5*c-^Q9mwjheK>uhD&KA#MaC~1xOC$p=VM%$ zf8h!DPcEiwm?zSl%?$n|mIo+aAnX{~;w?wsJS?KAYFZGV;_@ z9-ZIBgw8dvRGs4esnK*;eVV9k!znx!O+sk}8$eW({P+zMFVcF zCh*Jg%iO+ygXzX^7_m9C0_uA+X4xiIkF7yK@9){Q^+!HvZjaKx9kaJy;QpgWtPDBB zr&}ITnwx;S+9xa+V@FDUGlq8a=JAP3SazMl+GWFV(yCwcO2B9`mffg$`HRqAL_S%~ z=6F5m^SQPCFd82@%X;}>W9Njkiwn+9cG!CN<$Q^Oq+^E=dJd;?fG62k&Z0$*(%Qti zG4*hCcE;J+o8BAK|Gbn|G+?x9#Dsq7EZUHO)Jy_MP?{C9cSc`4oLz9Vv7`RiH_8OR z!HCf$BAQH;*}bNU?R|fH=*#T?UX3Sgi3keR@us+fa$B0>|BHSr_{2bFiot80j2ffaeeoVwc7IBBYXcXj)WFu( zv3yQ;MWA_D<`@;2&;cQi$X|y+MXU zIOe-sVjuA}h8i9e-hV`vx&%q)IfnKf#g>E;ROwmdB-|p?K9sB_EePwf1&N;xg-PXS z(b54)Rs#9ro3+Rj^(yl9E_5H-6I+8513n&u&DHb772Id(CkJV@^F9wQ9_ITAt#Q^p zWbXXEI1K%fi>JQ8?D}MKRi8ruvMp_HmgFQQ#=dDPG-fa z7*uj|h&#c3hYobB=7Nn!6Z*GyLo`%${7gu#!)YIBft9TzPL2`^vo&a+9pK}4T2iNO zVNezZ zSStTXaN`Awdwz^Kb1RdpzLa8eY%P@-_4#C#g44jCxb-}ptgK8jGqcFfOy=VDiRhz# zqD{RCr1(S<5o}-XqkB-VMhQQS8OygjqDeD3VlK!~KibZO9?hv!w<(hjJtHNyqHvLb zOe)1(Aw?oLMW8!!^29BQC(Oj zIL*zF{p~%zU?z{0v3}(}N^&l+>rMz0CwFDa-UJHsv&qWLBr7|gg2bJ)Fi+(0o;(`% zsf~}L50cEw+%|$yC86o!vm|F_lbxN!o}um)TcidFp~F5vv0(}K4Q9v$6B?}*UBB2s zOm-HzMFm`&QI~%|#UvscrGyR}hit=A?i&{rQVC3th*eK&h%zunk1I^ z_=FMZ3{DNJL0lXeMQQ}O91Er5S6!VO&vUgIA=T>OY#vPCHh!3iGV0B}N#0AkX5~_x zd4Xx~)Iq5(!M4L9j_;aGfYgZTO$`0)7~<4cgoo9_*&>v_ZT(QbOsdK(@eON7#~?GL z<`$57jeCmvbPo5x%G#f@ID&3>^IR60YEf@Z4J8Bu|e+WhEI?KsW+4GuI@_g zzU9oAwV0D>O6=qcnk>9aK|xOWy7DN=Jj;h2!%?V9ap<~~lRGBjD;O|}A||5&sb70$ ztys#tO?{D@jEJI$D98vMwvpY-`r)9}U=&4+IyK4$Q`x?4CiR?^WhYoPA+hnJ_ZRD! zKeiDTIvpm_gi)u(soM%pZXb^~`ttA6Bdyw*IY0ftz=mGPOs2AzfCUBNBR8_+hj*~o zYJP3Q7ciDd9-FD$Na&OyxxF;midU^UXCA5d)H z>h;uwh#*rSS15U9m`Mc8!#?6j)CDd?U*^`;Q+)qH6Rh+)v^w1@BAAROqzVV>^sCF0 zML%*WBMXP{R(P8kF$n^KM2bX^A`v8DG+#EQW#9R8pS!#6yjSWqH0sLHgg zs7Leaq{*;02aV3~YLkmbJ!Lw=jPQEZvDN31l2n$!Fcl^6@KG|Vza+i~WA?>ycb<|B z-(Pv@yp=um{MuY4q5-M37h?}T96Cp5^34^ z08%-!tdo4TG>Wi~c5>^+4GvC-Kx!-tZy}K&NTdizkzhg;4G6x&*n0jV7owxNeDwy0 z7Ii=dm?@-~jC%CO-)=0aL_k2`Riws{!j{n^IMH}HJ4OZlMxpBTMg)l&mX?sa{R8R+ zc~PZG6{=LJf_oJ|S`1o_S@W@+zPuRElm|SHf0-z++5rh)8!S695RUuaVMCy z;3)7mLU9o zt)daRM-Sc)KE<+gMVQGDUn2xZ?3NF-(dEdh|qkO>lma#|ZiKx*X1jQTjgqN^MB9?e;JE+0#MCh3AVbwg}O zf0%=9uy5Ho`eIUF#F3V-s+c|!8B$Cbjb)$EXpO(7O#}%trPZ%SfK-9Zs6kUcm{z4n zs+1!E1hH&q7_^2m4_6StprS}qb{_O<4SJ&lzs@r`acDgwYZvl;%Sa|%&f)rJb#QWe zxh_}iJX*8jh8Am03TYC5>Q=KR{ZTIVVIjC!*<&m&#?`?RA*%qHs|ya^kvQi)B+J5= z2wxdFsTv%r)xb?uk*BjE($}1v$Jy8f`{U>ujAed2qJrUTldbP6n*(6x~hUV$!{?w63CrvqCBAW|56gG)Cak)EH%oog=$ z3srLUyWz}!UW57l72LUe84IsSYIs?ISWJ3B0W#Y4$hi$UG_?*ip|^e~3S5v}~GUEKpSz+^O_ ze_gqoG^9Pc$t9OU%p@SQa3?s(hSaOKh)+&M^6(nBvwW#xEIU_7Y-sR)I}%!L!((ha zOa>k5qGBw2E@VNCNXE?A&$*QY@HFOdbY@GYr+vYVLt}8Lz?zn#=Ec)196Wu8kc-z* zhV{h9Mo;{shonDBCO=2uPV5UpY>~=@w7Z1p@0fp+>#B1W95!vi~p_t~|mJ+=8Y7 zHYgNUnCnv!19~&KMO9=a*<>k$sqZT#OYKja#&+aq$p{HEBWm3WwjDfAqI*ZC3~htA zOEp@C6|(=AV?0SKMJm@)rPUCcdI(tf2%K6GgU1lpOQ&A!F9pMGZV$*UyE!g+tv zSX%j8046RkTFAY2^O@epi@yuy7snr9%Vl5Q9~6#ES457~9cnc9 z=E26rtUq*trv@M188V25{(&@$gtNPjaO1fOrS=81m_V;U*`MaL(vpnS>D(A6qn3gq z6%Mug(W7c1mo8r5)`KkE>IPFKxE0O4)o5KC5aDP<;ZPM1Yp@S($EX3pJleH|gV9&H z{j3=8`mKoYP@r&?arfX=3{`@O@OMOtiP+6wGXG#Ac0N|b-buvD&XWA%JXEyO!ZJO71MLuaf2-yjD zi9QvFnHa;R+)yS?9zsp06t*o{%h?z$_BJZwo+YDqY{tO$RYPdr58 z=8Svw)^rRnW$Wrkga_quHYyg^_8;+a_W<(l9%swuZ5%mvfr17fF@JCktp1emW<<8A zO2Yol>^&cg-^j&$(ZU%kcOTq@=j{1;54n-U`0~BxI4K=z)WVf(KmW{`7Xqz5m`VQ- z8@wX}(A_`Hj@=hf_MXQ#eX61`_aGw3$nljMd1zjnQDcTu)5(UKE&O@DXA}D_#8Y+D zVx~29!n%qN&W2~~S+|e;I-{65v~G7a!Z0jJu#L*c=KSA_bg}4!3*4d zp`zA+j~H0XkDAqNiHSPN`Fpu2iyxEUXaeumu>6y86WPD&XO7%0!oglg!n0WN%<9p* zdnEFdE9}~OkVL z4a$O(Pi^H`f(pTq#hvpRbX~QSj&}bx)!vu~u{*zKzqBF4yEMY_jjlKu$arvuU565A z{qbn3{au2^_>3Q?e#dP?6*`ZfME4-OKi<>&cb53J$n&S;q;h!mMs{yGhU?cS_@th6BZHPUaQUDok49;A{X{t!fVJtLMqI`Yq)px2WI|gWbNVUIQ_>LZ6x#l zRqkdA)N0cR=f7Bc!Q+dZy7GWRQO)f`cd5N_6(a)8{|%V~=#Nm(ei@5Pj??&mV&lHa zod5K*Z}R;HQf{4P@5*mD?lYaOpR~YEApt~+)1GkUVjMxeyWuN+JDknAb&?ZzUZ4?+ zxpC+rO;&7Ru-Cso?!Tn8{xdLTdb3TrR61 zl2gQ!3ukz0aHn3g26(=~Mbw-dM>!o=2naZYwV|1R30KbCp;#h&wS`2Zh+RZWnpL&_ z&yh`+O+ua=cPCrSWWpQKTUC@pUa2LX?w0@TM#_s@T)g=LoBHi(>}CCrE*G1$>0CN_ zjl7q+C_prtuneqElMpw|r2iMTmYB`OeaDHHR-;Gv+StB@Ar0zOE}yziz99R}x~zg5 z(KOikuf4JVY8WXkC|EA4}aJBr88fHZ?SBSdzoMN4bWne41)RA)K=oRviz9u70 zSO(Oiai}}We<%z7i~~4B@}c{Kz0K?^ z!^Ph6?@P{$)WdeYy(^ww*#$ znS71^ssX6yXa<-1!{MVV%|V28?4Pp)r+t&YtfU|UA{MrUL!A~Fx}m&tl;Qc_AJL(H z6HL1r4JAa-1kFP8LAMb3U>1fhiGfJ_8p~$S$B`$gUmt`B6>f~E47;YkBDLHXC!d{z z#?{<$I#Lc@$O3%ZeLwQPY6+!6#M$X+TG0Wn9mnE?e-0oLL5M#NuNHMsqk3)hU-JSw zL4q6Gr{Tw~f&Vd`_(RI^#*!heQL|Ddw4Qzuc?4ik;LWM2XyRlK*Ul4gHcSD${~d0< zHy}p-b&?+i&woXyYR;(sZC5P05MSC!vmfE-0WIO`?2NXvt{`6!ka%q}dQP|n?bmct zc`S}E_zra(?eWdft%xi#0@CML(5*IXEUi(geow5slMWQ!!_={haWhQvRrbniyV38P8mL~Y5k~F^fuMhfgTKzgnv+rZDlwb%o0#d|1g_Izo5iIO%U~1I@+x)Vji(ZXpE>5s_aDcs?Ev%|{#Daa-uyM&k z?7x=`;ok*8LlOLs&qga3ONcC+V!3xFlp%}oZMVJ1{TgIRy@3g>TwrNtg{o~v0vKQbn|ydJeh9f5n}X!EzvV54!jH4H43>i>)ep zwHlqPS4QS8*iw3b?jLYR08(yFMz=9Hp!w>fv1FWDG#E`>tD(c9$0*hd00b0- z?LqIF&Zz(09Gts-5p$<4#+9I)ueVq3HT=-n6?I#=He)a`9bz)bv5dB)aeWqND6u_HF}a-e~znKk82Z1W#lDJ=`)09 zQ}cOt%0Q0Y<3lwIxVwF24!B-GeXbuD_v*z%spXAQR#&0441-QfqoCmHV@o-F!f%YD zfj56>O^>}{R7w1K!#j}%k{Qo_=iu(1ypW^k^IwK@;(=!@(Eh<*T3u;f4SH(zBpJu~ z4Zq<}zH(9(&LwRc@RwjYLy!K#;ZwITk$PSm-kiM-L{M)?;f8h%xh$f5U5(UfwbUDh zkM`2)^~?!7Nw4-pct=5oZ=Jvai%u|I8Oyo#>vP^~1z8fxU)na}(l8y9FRkbF1zY$= zR=#QV)M~V)eM>ME z7>anHTO&??@mZ!c=ylZTOUH^)uc1a~{A@U+K0e42P`mr!UDlS ztwv3?T1|~sPg2k1r~ByDZ79#ZBWWmPu3Sqpmpj_m1h-M8cC)f>cHC50zQ0JX%7wBPOqtJ=^dvi{Xw6^&sJKxxL_nG45-$q zDM~pxW^nE3hUQf*|K-MFn?3_!>;DXq`K7ZoO<@L7Qc{qbnu^ra6ueK#gjD%y9VQqJ ze>@a`AU1=kNc?fOVq#MdEx)Y@E2nyBRJ)Ynn^^GCW6NWYV5r+T+?5!R zdUrF%Oj(JiX#`}C@XKCDY*^A7W*_2Sj5)Y_=PewnwMLf~4xrHhBdTE9`c8Pf;tYyD z&Lop@Wc~!q-S-SdhJ0L}&>FpW#6b4`0TP@Bz|B^H3bks$QX@y&vx|6&t{7Qgj)XKv z3>aA%ffwRYxl4Q0agxFBQS7JHR{k}NXxk~_cy(e4Cj7V;30f7N zuN;W)RzF8UnsV0KXgu&FM8Txv< z!25s?KF-^eFEOi2KWz5TgRVFd+lRKtjMGs_FOa~|wIR$(jOaY14&FV8K#5}~eD6^o zVgS}obx_w)fV9{YJ!W@D);%A@NED@Zr4d;HyD+@Z9Qa5Lh(Gf)hW&H^QGqw`RQw&r z)GNfhtcv(G{a=JC7%({V=wE0p4X-M6Ur32)dqv zx`W(cr$|FkVCu)!mNDZzyjpqUT$&#Ffu}HQ{48AZeu_Z-H|SfRNX)W<=OkAIo(w=n zS^$b%x}%{;1J^b+p?sH$j2uTy-PjF2tIp!1(wZ?Bx3SLTMoz3w=w{PK`TT0`vT-<=R=_t091h2;_iq! zeg_E({l{~MxCiU;!-$m#QRwhy*CY&Bcp6CxJGi=-AV2**V&dOJV^<5c%LjVBKa7LY zUYOC=4zTeQX56;`2UYfg=7GhISf_Te${gJlu})lb7Ogss=gF ze#aP(&gjs-Ejsm^gX@Wf$ViC<8hWBjr95Qj5q1?!0k~lLhR%4h;tW1&w-{4!@|Q{Y zY1bnZ7z%K0Qd@Xzi-bj0Hw^6R3cv&|Rb1h0NkCMBXPc*@ms>}4>ewE=$8JHW$^^CA zv_XR^D)`=u{)7buH!!k!UmS{4Ly`CZOGXaG@3;LCp|nT)I(Ep(v%sKELRs^Q7rr=PGu^$K&k_s2%xT1JS{Td-G!wXKI?Zx<|X6MoY5G&{Vg)?%|qYs$71v2EF`@?jwv&L$J09}uxMN# z4BO%lrKs-b+k?69CC~^Ks9f`NO0ZG*lf6ZYW@u%afZ!|z2qO~CEW)^P6EShpButt( z0b?dE#?_$rf3o#L=#>SCc>D@!3Nb2HwlB+?FmJXDmv;6*1Gi<^KCfZvo@UKq7+WnF zxBO#2isITgoq-+8s^aMQ$=LK%0{00E(WkZyx7VD2^YSI=;vfbghB<)TfTws{WC6F~ z{ZI)4OwCFoYSs)ZcKm>%d*`rk=_DMfxDB@#d<$)U4s?bhTwT8ahhJvGNG(colc98| z3C+WK@SJrGy6O(l=H>uaJ>XeiKuAa+GRx3aTyp|W>~4ZHlV)SQQ3m z1X1W#cuhEhLKl1Jva?XED1wV~|#HfG#H+MpQ?K zww+-Te+|C*WiQ$f#D%lHaDU+n?B2Z<2_1H0W8Z4f6cqxUe#EtqcZmK)j#X=)p~Tb< z)vC&|cl;m>95xy2&-$T20MKL}W?J9E?iXd7Ev+*7-E5gAU$?mFG}2wiW{-F>3Xgg$~&Va4z`+UUb0rL&Fe% zWIy(;o`s7w_u$&p`mnIDhC%WgD@OLmz>y1ZCMW~i4@x__T)a5@8ucfRDh+n6;fWt= zWa7Sm6pG8{!#3Z}!0uJ9I5vJNHa$*5r}4|szs7US{^co}Ej);8H*aENmp54U%R|U@ z8Hfpeh&9v4V&t%i*mx%nN&{fyu?FK+JF(+UnJX06#k3U@VVCe2`{#|pPP1jWwXDS_ z##?a|ZoP^{rRF`*%-I$##;nGP3zu=}%1I0>*@GoliU7Oj=-IqB@**E1^25Hi^Ke`| z)frc3{fr&Q&Oqt09Sc3oP{Il@i9dmflXoG_#tORJ9LS_u(3Zm;!OQ?14m8`!t3>$uy^Ax@cwomPX15}wcAg?`Ah5JHFgdT z-Fc1c%R0fTLJRzM>p9LXXpe4-?&1E)4H(u`1k@ad$(2HI#y1680f5K^Roc$Ps_8a3 zJZ?NT28b|n>Lj#usgK$FF5uqE_GmQzJRaRVhoyb1qrTe|T)40ro@3_Y=zTw2ThbZU zVo`agWrSLz14ZVr{Hk~*OH{Hppg^GqAwsq8k*;~Kg>6WGUI$FVDKP*fa&JGUO;{-g8oj+7(j@m<8EMB&k$7f4eX0F(Nd@N+9X-E`s8 z-hbu3nAJ2H8}`NH`(Hfa2mlr~Ftu>T_e)M<+w^uY*BW7JZ4a@s7?8FY@E~@=6a%3pVkS}*LKIt-%cXy<5IT~26k|U@0FLR^<7UiumePvcCaw& z(0Iy4-1vP6tV+}n+t|ZQQv%bDEAZgfVtgwyLS$_XF#zWVteP zrvEwxwMxGhBY)|M*kjiar}_W_HfYg(04juCLZU@;bZu@9m{x#TC4-aKDfnKUj*2n` zL^gIX7mP5e?}hzm)}w!2`;P*^Vyi|NHn{=3cin{ILtSf(z=DSUSh_P46V?ua6?K5A zB~0xaVA^kouykl+m>B^xD|?u#icx9AX}r8V6;3h*U|Aa9;5MoowBf-BfB$JE@7!|% z`js5R(SRx#KD-)WG=WGhheeM~@VWgn>gu%+S=+$e)B<9M#+beF02U4U24*yYsTcsN zV)|+~JX?1PAN&g(+G9)`JK$sR8G2RGQb;RH{0AK+VwG5U$x8lX^ zg{ZC5Kx9=K=25#{JJhi+#_OjsA6Hu@tyW;Z{ShoZ2uxev27nSeu?spjt_~Xj_TAc{ zLQ*V>tlDD7>$eE>3&8!=Ziu~k1P`Kh0PHa7*PaO3aTbXm8o;6ox^`)c+^4spt=|!C zKHQIG+8Apegd#EUEZRl@Z$Oa0ufpn^Wg|!P0tfvZFtUFGSc*jeM6h;liarBf@a(Af zrxj)0DOg&at^_0oAXOwr&Z}!Ue)KqA8v9~;KWAtZ zI#j6H8tbnSE&Jws^YX+^2I>XAjJ1o{p^tVli;R5LEoQV$8;! z1A7pNj+i>N4;-0@dxy7S^Nu|@c<4Mr<)#n{6#ztN=FtiE@)QJxep<;}c3OccrU$X+ ziWMfz{-z8IR4{G(Gj88piWU}tiIp|XEv!Gs9i0HNsR)20rmgJ(-}NW)!N0(|KKgg6 zj-YE#QMrdZzI6mlENo$_)1cwxOSrRlD6HiwnAq6ERIB(LcdV>o3ZP=$7U zXALtG(?1Ba%8@RwfSQgL5P?u;#3DRA9B(5c5b-t~VQ=G*Emi%=L8S@oYj?qlW51!D zc@AP?zTyb9;S|ht@x=k}jI#Xnh`oOb$qmM!yW=}Nc%BVS#qO9hu{DhO*~rM1L$8-Z zQYhe?j)Ty*wJB1Qa-h_dpdhaZnljm-Dm~}nJJ}%|{=g4Oe}H4LH8Fo$6FlB=0qF$n zYj;Matd~dzAj->u9G0lszAqZfgW;F&h{_Hc1V7F|&2HbKEK>~sMva&LZy+g~y%#** zfXil6u&}=p7mq{$6lIP}7<00rG`EAZOKDV* zMfVk$Av%mrFG}5up)eZv0ww4)qBmr|-guLx23&jMTZJ!zOU&UQmLfGx57%z)XdvVw zI@gHGmO${`WYlnPR(fZRO>MZfYXxoWT?Cd1Kd^|-sy2psRtO3J$lhgum0eKLz7$~Xdo9OU-2vzxi zQ~Lgf!|I7xF;R@OoBaUTz(SBBAwvos07J|>XsgwPtzHG840WvS9AITi=*vVaMeP=2 zPK7hr_^50pug=CxpCDBB7y`?8zVLrn0;=zZd9=zxpPm5J7Cve8dPxM{B^KFVh$`;O&W{ zPz;`jPUYvb4JKlG)j%A6mR6>HYDB{QV~DLY7QL$^#m*6W=f&v7g~i z(^3@?D_3;r&;f|Q1-~-!aee4c>@6ID)pPA}X3aw={vGm5(;xAp(|zoCQU)+a1;QWQ zfV|ZxG%-ZrX+X|@{(8akL=0o{Z7!TMpC|o_KK_<)a3%+MG^Yj3*vxAl_ua`T{iE;# z`}g{pK54QKXJ-E)5yS0d=I1|3eYkkmd>*`?`o;H2l2IGjrt=C$X-Ub8b?n<^B5$Ut znR0-{IdIkustgI-J!2TB z|Ne|JZ3fRw>cAdLp0Ze-#xt|s*}2yM_U<)=i;ulzG0BL7)7kU8!5sGeck~#tf`0OH zWu;%>@Imu@4tr`x&rzfT*&DQ4=^kvh4(j2{X> z*|*J5o{CemAov(34IR(p!4f83Uq#RU13A>QH@ozj%SU;nAupV}CcCp+?|$sj-HYpQ zMX;n?)27~-%FbRVC}S=!tsKv>%PulYoyVK=d$HTRo6I+mMbQV@t9Cb@&;N9=o^W9a z2lX3BFVEiW+It=!mp{yxJmK7Nvv}Muhx(MW^lHnYvHHIx4 zb>I&Zf1pQ)o?QAchsv0}9QoaM>^Go4d%5@LtgW}0R_=gY?Khu|J8xnJbqqhdfP;sx zVsKFjgZED1cT*2B`pq%U7(SQ-2MuPw-X0u0VI5x;kYqBq4C&5s`+O+X|6$B3l6Y$M z6fW2sOug&{=k@E)CD#*aRL5|aR~ve6e8C9swH(r`H~aVR%`RQNxamP0l>*6v>-^5H zKDVd*2^K_eVSBe_j8K#LzU$ey^Eh5hQ8VMoR*oDom$zfm>9>C_J%W2wj ze>OO zoQ#^dLmb$$Kli**P?dCx^M(xKhDYhlc)pk8hxFx;!M)k3+caKJ(~-*eJoOpwykLGg zERcH7V)LH6m`4SD_RQq4sk<0gQcRz9UhFaB6w}pGdavxy4(@|FWMF@eS#*NQB(olF zVuW+=P{d)vsH}0w3LHKujI4jQbI?@&L*rfJ>;`@ zbpe|>XyPh*CwyY!ea;?a97lQ?SY zUFN91>~cb;G+@_@#h{e@2XxGBGZR`3h}0Cn>Nv;Q@ah*oQlV3z_{snYqQKBiWD_%a9le z^(55=$$azLkAdL{%quA~vNn%#Z-N*Q5X6{_l0Vc{%cpaDvd@+mEX+@0=-UixNz$OE zBqf$fIV#d9XIg9+1776OlzdN$N_NnH0~o0xfBfGC4Ao0saAu zNGUGuLxO?woCJpW`7tQ+J*Dc;nY5aMP_FT4#icK#EXqh?nxym_g~E3Xjme=#AoV2~ zjEYF+XEo9lF)1RXw5-(PKTPWM4B9w`gI8Q&a&`*CKJ;_JKxuk3sNf`>&L)1amQ!FUqWzPou?)ZD^q=^iV&MCzLO%dO} zOJt7BKxzy4?rjKzf`S+n@|G!udXhR8rpGeG-;e%p;wVw*KEnc8vNsp^@5!x!h0IAw zVz#stL5%sOSfDIUWPq)L`KG!VS!4* zg!p9UD@yyKRuavK)X&GJpvYljN)~11%KDe!Vr|khTu(4Zmo9FoY5!NcCb@WcE&z@l zyP{qFN?#PFjat$Uz3+UR(#!HtEOvsk zjVb=FM57)`xg4~v2wU^NEn65Bg^&t1aI&-bFUwAm1VI?}I%pI!7|b1DV__ zh$2wX8z6`T=+#>2DT0NSwaCiC)I>yxL}F8sxtZxd4f;>|C;gNDJ0>FlnEn}M?`xEF zME?mVBQh~9ck6KZ-%TJkG5N<7|G~t91i-S3_Qd8igFrzrK&LYb27_ME==9X8)N*zq?tD&Zg4NNFNtH?)go&u;~ zi;9&h!CIt5u|fn}y9yLhAOs@~2BToms#&5`7)#`GL$OS5P$(2erAlki>M597SQu@s zEoo(8LP0GPWxh`^i#D+~cdqVgUcHKwnS+hBnYp=0Y!unUrBVfaX}v6H6)4EfL6J%X zCs$WgviXZGPeTcE^0lyYa)kBQ>@DbJ$jr!xS`fjyVhvPtv;e4sEMJ0rsR|~xE^w{t z0I@n3X+>73UBm7x+^hhNOoD8Q9D=1Is#bA^wYdTLsp%-v8UTo3YUu!1S4XIdieNN% zM8&V!3oF~Z!jI%+ywK|}#+nFKi!IRq<5RI5@MRzf~f^UP4g)!~bSOHkz? zIbHsd)dzE1xKybM2MZM>nWbe}I95kZ=L%5Eav{|@pqg`qFHT0~g+Ho= z3R%hNC=o;e#jvg9f+`L~u0)TDE{?D?{nAL#ATKQwQjHNXF@wExbyTqjiX_>{FV=qC znK7|*MQuA7GK+0ctGewM>_zBR#iiH+fHX(tnl<4hmLerh3Vj)~Ph?sF4o(gb8?+Ex zIl$rH-WL|2kryCWQUtZp9F<&MQPD(-v;vE-!U92G0!d~rWEvyH73|?sr3?%H<+BV> z6c<2A2e>%>n^^Ei+^JFpb|zA!OMoiX9AW+yiw0_nke*oporwh;oU6gv*6dHqGM3~Z zM`4GWUvt|7^(ZNjAg@RX*i?pVRY#cVBuGvx{z&T=nc1MClMM`7J*@2=VPpAqSdf*G z4^=rVpiv9Cv=B0dPB5`@fJ-F@saTsQ`U4T;&y(DL3EMR2Os|4#i=CC>Ic;opq zuAMrbYtFx+>Wdks@X*|m?BUjlojSB<56|U%DJ6C3e%w5%Cp&fOz&2ec@I+Vi#`foeyRS$;68b>CvqRJ$kya*O={$EY9b>9g{ic z=c_FEiqFq|xt|jU^q_n9j_lZfDSdL))XLuT>Pk;~^z6ft6Xx>7lXwGEJMw<4eYK_U0#laoGQP%DBIQLwmc^qen+}9I%ppGSXNW!y|J%*uFz2w(mNU zJD;Xgm$ZwmznRQu#b3@-8M>Ce+jpc}S2wn<=R(Um19>!D#hgd$>FME45BHAjG-wqA zic}0cJDq(-9AwrPbCvMOq8XgO`4$!BkJyVIum`|eow~7Or@mZzcoy6+~_%LKcn-KczNR}c5c^+-FkFpEr52@{g~(fGh4J;#<(xm zRma$eo7hZj!EZZvVVe%ac`7WAy2JzYa_>sFE^h4Dx)B}h8}O%-Pq=N)M6Ns)OeO!l zq|J}!$;F=R*rqjGw(id@ud=C*S&#BwJh|#pBvqMb z*sIle-b__|MXoCPZyUyT?Ypsuy9dYrdWBge3tsK#gaPjC*}VhX^&S8h{ z8~##C>oZ@F=*_j`deW_P2e#=pndhSA)I@FN0JqL`>*B_CO={Dosv9?6xy41J#&gGm zcxt}_3*t`AX7?`c{LZ5r2T$9}s1gGu5f8X->JSd}^iqwOut<3=ULGtDTpaSzY2_xo z<|FS2sz|EieR$(}980wM^t*Y9TSir7wZZ%8?H9mzk`iVmg!0njZmijLHVUc{1uc;4DPncdv`aly8Wd=j2boj#ww zH!g6~$ZB-;JV0;1ASTOn;C%iotm7ih>8f4`o4IUbNB9@M;thK#P{g2 zgAccF{r&3xV@FRPJ+$x8&TU(F@7lM2*X|v=_8-0R_(Vu};PqQORy|#P?$w*<&=;vk z)~qN#7FJ>)_0((iq$-K`FFat9x|B(j{PaBU#gx#XR!}96<;Ic2x%_gO(-P#2xOlb851rgV75?VZR0%P%wY1MP@L$}@s_=T;zPB=u>*y#G9svce}ETC+WOrIoT) z_x7#Jv6mA0bk}T-UU-Hol5c-$&lXExP(vB7{LqNQ&X@(eEp z=43+FBdpKp*3VNrOV`&yg@cLPAN=ULe zjs8!cF)1sQOFVjW+2c~-zZ-*{*?w0NGkrI)Z})kOCz*d{2HmIaWrE7UXEU17eb2jc zeM`=`03Z6kO{amREaW;b_-3#?-X%TwowH_b=X*^&7j^5&l|H54dTmf8cG{OoW3E5f zjT^!pf#o={>IB|8^MI)al13%to?fM2avCpgSjg$q7W2rd!#sHY1+%rK+JmE;3}e(E z+92$=LG)PrlrnwUj6l#aFVUY5ABR&(Qj_q4H=jpSs#5YJflcnqna%5Q(P!-Bbgt^$ zgIl5$q#>6lN44aXo8>&WK7&uMJz%V~bUKsibA~s<^BC`Qm~*CV`^$-gF6}y}dQ9YV zfy}wOk|XEuVwmJp%V`V3c=OT=7LXM3;^^c3f{9X+CGmWC{x}aGI>?hZgDIt+k=NJK zbI>mg|4=2PKvKv1;~TQik&JToDq@(AH-p~gQ6O39f05_?CDh838B-P~kbZF~`wW{; z?`$121Ml+G(Zf7)_y{jQFP*SS-`?P&$&+~|svKl1VtD=3LuQhsrjX%J?=mbUhPx&X z<(y-sjrnwR4K~{tPkH=)_WX7P{Yh${ZKCIxC48PIFlb3vx^D^P#~v%FnI83uPkrO4 zA*qad$SbeXsLj7jcc+d#uOcb+<1d3exb;N@ca8VtyfdXDo{vUWXUom+D5#RSZ%kJ% z_AVVuf{{= z&ukEuEZbxB&y^NM9GNTWy877_g|X=B#}%$`UBG zVwmU(kdc)KnZ^jCP6dTZfLKsKlAVd%VjWD(T+nOE0AwCLfaDKh$);vdN1wy5+aDn@ zct4hGdW=Gt!h}Ys)kX+L9c200$SzRAC>Wqtlt8I9fk<0`%&c4#%0#H;H3T(Mg7GRY z^P>uYpp)UvwXN8GF$hnt9m45{aZrh^VQpG~TU(c6+W1)rXucQ=TI!LWlL0d`Ev}!s zgk*ag6vw2XKyHaXE2crQXA?p{9pyn0e-Aqk+``*8SFw5Pc?72wqd4&;vh5n9_|73* zid4YTRF7=`2Z(d*j8<6(v3zR)>JMrObyxyWqcNJ-b3k%n0J2K7(3IpOBRdbtKKt?8 z0Ut!ZzJ$X89ZE6)03ZNKL_t*NU*dgAEYeM@;v0=GHtxIwd$;;1c@u}Mv=|7kO=t+c zgAj=+D_6EBOJuaDRZlRN7YI^CiBVcqWGE`i)8$Dd>fD?hg;ZKtTvSj{pw=04O*Dn+ za-}v^FV9QLEmX%-Y#wW4Z53f*$~U^~cOijqa|0Zk)C;iH=z}2^hgYdrDIqr?I4h5) zY7qnoMlB?-cH`%r{*Xi-!s6fVAx|)c*wPvmY#m_^2MT-*M#jYg|2j1UCY*ph|gx=!za_^KKL7{`v~_`_@A0 z{a1Le*20PD*mv+66yH>WBp?A&gB|)T8jr$#+YtSse6bjcsEb&&>j^UA&S1gv%Scrj zAkPRxiETB+Tt9^;5(9*yLgW=FU{JoV{8)t-FJ&hMqLMO>X zPA<`NY=sX|enta;b(Rpve6}urAUf&WhaYnBh zLy&!BFA_gIU@C?@^cWWJcn(S2F)aM`IaB@41HG4fO5}91oM-H$eZSO6_Mqb6zU(X>y zu7|m8T{Ny~0YHxer2q#K?AYUSbRv<_vLJu#;{%FFXMO(D2Wr^^|&msNrK_&t+ z9&g0YyWb$`^&xCL^cvEl_eeoy)K@&l(k*x3xPa=_<`Wm^8%}{jj2u_E|U@lT2 zD@ld+i)X;}>>fP(AmbwvL7x|ii^opjk?#}i+HvWMDCUINFgBT_0Xy{ki0&GWxITk^7a(g zZNH88c?FOZ7s19%j*F*nA-{GF=o3;QRp>yy28!Yw1bN?wqQwZb1Wuo@$>jDu(zm;USprHc zMhr&Vn)YyQ+7(lVcSP-$eKC3V9E^5zfe2z$ZSIAhPS1GmxmpC^o>Et3_`rd+#wWdw znvfRrVnR}t;nRO;Sz!)s8?PTVyvzGe9ol2y_<5M%Q6HA(RnU9fbd2xe3fC?ZF>%CT zv~v{!=AAI3mmW9og+r<-9p)9PyJOz+(I`AP6FbAJVCwvdXyO0>7O2yz6S{S33R~$r zB;{#Ag9aj-ig0jrghNFeh%`!Q4LX=LoPv36USiw1f>Ng~IHL2I*%;#Z2HStT3cKNR zII6iV4F*#>RjEi5qn3J88`{}eP(%?Ot5v7Hg+LuFX;--_D_aXx>de`=>9;ghq%tKv zpCt+<)p~n&9zKNCk}mU%Pa)fWKbQ?IwKTJ`A}CO=RZ?YEnKkS*fY`$qQZAD!G&-$JRiZ2w**X>0sP2;Q;%Jd; zZc{C@UUi!^6OkxYr!Gv+$&tSkJ2!}J+obYaMQ(O*fl~WgWa{w3xklAz)to9mH^~nP z2uajNnV6a6>rCr$^smd&DS8ct&wGltYxZDLQ_GL%0W2T7Zc-67o%MJh8G)FX2)y=x zjj#j_VD%jqdgS5A#b{_q048wwra$KW*b`A(=HPr`OU#+w7gfv^(3#o5+SUn96&+z? zV+Osv7#f2CVjCwoIyu3?$p%y@pc4q&#^W&l8z1bt{$aFMLZ4q&W4Q4G#*9CXsta~w zNe^e}6>`AF3AT3juyb;NwO9v*+7Y8RZ^773El}UN7`HYp$N6LjA+)+O@+^>*u1vm04JFU58Q2=cAR24jP)m!o~?sPL8m1u!ONh4vj_$SXYF-gA*Jp z*+Fd3K&Mp!H6~$2*VkBk?4zh7nh&3YsZF!6Zu)u@_g#$To(;-w-4#%f9);j2pzGjz zfKm#bi3KceoZ#f-1lzK*46sA{jvZhleT8SyWsq&w05f)OMBBjm7_lS>?rXPWP@M`; ztIg4NuR0_ahD3*I9V*AOs58ee; z+782={y>K|SDmD}cF+SmJV%BV}xIp9J43>}3#w_@|w9oV*h0X|<^2%sSb_i2gp zJ?3Ht;ChUovIplr^e6^2VT2uq8K3XOWG_^86(ZpZC~qnfl9G{< znh1j}L?cx|${0K_U>zQNqedNYp=tliaorFP-oEW_Y;Juy?!2Ted{zZ)PZInIDM(38 zg2zpWR+Pfgb+~Uk7wWudI39989eux`5#gGY6Q2v;HK?uChi9encD zHdI*=IF18vqyD(|`oY-s+|8I#&<+!?Js0)O2n@d;%q9#|hXVm!hFC&KTSg<5!AM0! zPb~_Ve85s_U#-}q2Z;eMiZ-rCxhsHx@7PySTS3{!Kf@(zIZ!gz;TpKonxglaz39i= zZv7U(7{7}?s`tW0@2y*S&-?wxfB4bLch3HB!^$o5m#y3W)!suDZxo^aemhcqeA0vS z^J}#lHy)Wke1L^{$Ld=7>NSMgy&k#cjHHa3z-$1W29LmH*FB7zyKlx{rtOBAm;f@f zFnq)ibWYNtCnUqG1CA5GX*XU8XV&xBYy**sQWS>-+?ql(qH$J(0EbITm6Oy~wap2r zdd<43cFh~A%(OI>kkwXoXyjL}tR8YekNV1V=g6E4LxqDOr2-kMfe-5N{ynO&tWs4R zDUgMsfXd1UNS8ZFr6+5uI_gsm8l)?4N=wzFbA3gWrJ6VLvYyaVHO>yGgzRQAD=k5K zTrNjRsIoj54o9o3U{!T-!IA2SCpny!loCz$%jnkKR!QqK zFFbtd&`yWk#XItjDBr<@>sIbRXm;Fl#f0;BG%1+3>65jQ)yZj%zi-#0`}`bt`DZJ? z{qD0OsV@|onM>)-&`=)0PaBJo+A8g@q=N!#=d+mj#18bjauOz8IT~lQ^1%+rq)o>g zu1E5xuVBFuc~lSvQtBbNZ9VcW0||)$0-5ks9tPTv$GsDKfD0<&%4&ds5K#Wsxb)%y zXr?RZDXH)XfLs|k?XnR#GVKNIKB~PpK}KXhR$bJxX;y5^5SNQqXh6CAjW}n=v$F z4Q72DuYQ+52Q%~9;No5lj_&g_lXGzD*{9;*?6;29$aA$oM%51dxN08~S~rL_zd;vV zFyV4sF!~1EdtoNlFWH2WU`(czt$Z0@iZK}1{@BuMG4={%uKXB_YFYB$j2vLkdh9Nh zNX`OKvKM7pLvh1(S7ZG63ApXKukiItL*Ugi(5ihuTsUGlZoH~B_AXtAf~qKh1oWSD zC4#R#dCZa*S*WLqv2pDV7)=_)N*w{PkF3UX54{K;dM~a&t1+nT6Wspr*GL|439gxV zJuW*V15Q;;e%0%DCR)qGShafn(Q5Z1qYaYsS7YstG9))K0K*5D6Na5}IwoD+7s-`D z80qy8NXUd~S!mbyLY&vV9#|Uicw(*Scjv9pUw;%o)VQ7~fE160gX=aRl#l|y4roaY z;HfM?pxb!dctLB(QVZVfCaC8Y(6amB((_M&X(w@umTAm(gd<4gR$be2^@gRKTNdQX zl043@_H%~1lIv%dcr}zBWhOg+6=uy@hSMj%h^Fi2;-jVef8E0j zYeV?a@r(jOS)-g$;n6GAw-l0ThpW2a{Uw#q?K~qB^)An-0`y;dxm8eI5d> znxRR9maz9N!!7{J=kG(4zO9g83dm>>qQP*C?zk22f3XkM!D8(E?h`DHv{9q4IE_n| zt>(OvJmlF;xn*iGZ_lmZiV!$G-NV(C#od~O)tYTK(!Gb(*20G9-YTr}3c_4g5$2R+ z;)8jW94X$e)*KM|_JNzh7f)T@r7 zCGnjjSw)RI%k?EYH}8~z)V%0{Ed`qj%p+O#>J>E&F3I!P1~2LQ(&nWz`{KRvlaIM~;DyW3VY)r=1CWJlu?;;iyh|%IN+Imq zTnJUO(=~B89vQj=kG;7grZHFT!{=|lj-=b)#4xPHyR)|djYr}P>ub#1tY8}ZG5^yd zbQv=kZBmnPc=tLK16c6>4m2Io9tnZ~GEl$$Fbqszf~gB)uC4OVZo?Cmmt)ZvWAN34 zJFy~UBDvXVXcAe0HF=f1cXu_{Z`VvE>*cbbqS7fYEVZht3#?*l8g1Q3k3_1f!X?}| zIHI>6T)yUDsJi@c@Nl^u+4;d_d*|?XS_xQHTV1RX%>$uotBO3cgwfr(;*7Rqw~4czx3&dAZ1|6i7^u zXN#qc#$#u$!~L)AjqzyVI=nyoTlDzj%V@XbbA0&yepscO@zcRrn^o`t)~zprFFOeU zu=U-q5$S$9I%g*x%N7)VwCUO(t+XF7XGQG1BeN#pad98k%pZnX=ih-%4A_66WtT5uzK4;5W<){ zbr(8a+!dKEhM>vePw;IOaA?y`RJ&8qpmB2CEjAVp5BL%HzaA?RXyq=zTl4qh(pRRy z^Tk{EbYnTt<^uGqnuA$80jqouw&xOB4Lk##>uG%8Kpt0A9pd#nlX$>@3@$xlDZ9E@ zDQ^RnfPA%k`%bmxU{FPOFHnoEf%4YtJE*One6RL}B1!}rO0O)C1r=q^zJ0>()W4Y} z^N&Qs9*!P4z~PQVx`lnAs&I8E9JVS8!+DV=kzw7ctoe)f+U3Ouo!tF-&bo#3rSHQwI-9$88Nsa1fMyi8BG|EmZuCO@z<$WEWAfXmX#rJ8f(rgldFk$M)uA#sH z3$(fEW@MiJ66Rmu4V{+Xfk%Ei8y|do8S1TLOq%i@KFaEhRa2kE2dfI8*oQ8czl^u9 zYK*M15g5MYPK<5T5Z>O`;@KNdfmd0GS|L`Ozdv;(|0uMv7Rmt0h3!cS$Kmlr{zhnS*4DlP~r_GhADs;R=&VbU}ygXQI{ zJZ|OlyQGw18425x!xeT^bJ@<3{Z4suhO|reDw)(=^y=3Qn*NIC{Y78Dz3$u8iiTi;B) zx@8z{zV%~Fd$c#7)o(do8+Wlv?bw%3@8@=M*Dr9sTd>M5*0ZB6n`hfi`duC!(Zy$n ztE+6MI^-nu9O86%e>pENXl0x(KXpH~Yl!d3r-yqp^D}&VUzzQC`Ku1v_0L_88^&LR z2Dg`?;dw7(?s+Ll44#c^hJTHT^^#$C7>#FM7>=d^j%@^YJm_`PwRr88$=E(}0=}KT z2uY_*#CezW!GP%b=sR&5I)6M7?%f~bqy1g+^jS4qMRIW0ixY9hgz+1?E`RVHvYW2 zJs$ip{bxFCt4WiP+Vf?6JE=FiF1rMq+E`4ux;Ju) zEhxP{E`ItmOgZ~Pob&y)7?PTR@{~S!;LQEFYe+XElm7=ib+JMq!f8}VqLt1#i5A;?Y&z}Kig z-0Ik~db3AejK(ux!m`|vXtZN8M$PPr+3PPr=gKzNw){5S^?G0Y<CJD)%hIm-%O`q zQ68$I4kE!2JU)XD<>qtK44c;!W#fzv9gl@R zqArHMUuyGLE*HxZ`|v5}bmj%$&Tu}EY-e{JP@JhnOCtyzboo3hqej}AR&ASY?Udy$ zCZeC0aRM`b)$Zbx=J4|t5~BS(v)>h|4LWe^rkPY-9;U>ADWv0Q>`D~%liXTq$kDP> z+&VM6K$O6W(}?H{BDxi^%JalZ5tvB=#Evc4Wzg0~M{1LszD%>mHu~H9%h*9AV!?6% zVd!v~CJd5@M8XJHR-(#b4i)BcdDP~jZR-$iJ^)=CxY&+FLAnb*uNy8yXP3vzhGDWM z2+Rr+1Vlp!YaTL##j4y)5}t~~s?10dW~h`SWRR2!I@=tEi~J_B<0!$>QV~lL*kLId zj+7uUE7HlONhP5J%3%oOr4tQTTcNTFE0maFH_NPVHExm- z(w*p!eNSF2ZGX!qW~YRbNPZw5RrP?glo{0eELHAwfite>9N zv~i0`E`MNx2K?q?Nh@ybf=5sJ5?_tWI$@9CZ%6g^1$h4D50Q1vtC-M1z_y}@I?Q0H z!j+}rvXE1$q{z4mX~SbXg%c=3$Im^(Vglm z;JW6&+uDj2Zo*p+-H);>KEl1d^}p5aAaLw?oWF!UQ_jcLl@sv6{pT2ICOiOshXP4e zn0Ix5%s%%!yfec8voWxu5mZ%&;Xs4itwV(?RY_r?tca46m|icEmgp-J%HD5T)>bBM zlMuYl?McY<`#kxzukzZ1s5m6yO^Bps zHYiIFR+(c23cY^c&WQAHso$#g-a+kBN(GSwPFlw4H^Wg%o~CK~3IHg|-;aI8OgWhz zQCwUm(lQ&VgT)c*)*`@w1}PPTsHP$Y)hg5B1>lYg5I=xK0O@fd(k%Y>S#jY*aRDR% z2xb<{&;S+;)>*Lzr8EX>N=ePJZ4rrB!gee~Beo`$Vg*3cT`ZKv3IvuGYzJhzO?H_E zyIdaS@wk;~nyhJ>A|j4oyXHOqV#OeZSV>@|lwu_%IZ{F?rAbz#9H~jANJ=H7bYkze zO%ehuqhMhWNlP&^ARQU8Y*toSMIA`T3OWwEos@bBY?3#Ul%9Clgj)2|Hy^zD!KZV| zO1B9$XVZ85r)wwT?pI&?RTDPyPGtH@#z< zW_FW$ZVL3)_*$z?UbWX;z4$8$KpOxVzqKpB+ZgNaryT9v^B0eF3{Ve4sDdmq!$xVfY#rxW{ZBq>ZZ@oEHGYm~*r34cRR!V?K1GC0}4rZO1bp{M# zHY8w@Ql?~bft9YnZYVYxY$^qlhz-YqAxP;UVL(RRQJXz1$RpsG;jkl^G)MC!N0R({ zP%{Hn9#gAi!&jiW6Y>%=8y5`go?S^q3IHmZe^=64O+-DInTUut?=D1DC`ul~q3WtC zL|qve&@qDx%EFwP>;cg~w(2U5l@DSi)X`4z(!*LwVwrpYBHXJFHvRE03fk<|}4BO)|w@Dd!r+mw@4eRE= zU48x&U&!A&j$h55fuR>)hAxAy!jx;y5HR2>iDXdBf61H4Vt%A&70;RDZvW? zCXgT^s_|iI@s}PaFufLm`Qu7b7JxIbFL;z34m80JkQc2jh z1L;VRrZGudMl3r>L{++O9M*JwE3x{~k#g0+{kyidZQnHl0PoM3P9e)CW(F%I7$7hU z2E+;P8kjZ3tO3xKVx0&=N;ZjDD8&XdbY>-#Vi7YKK*Wk{#R3eSnKWicm#mZF@w4CO zmP+YXQi?C4q!#k}Tp>$OtxWZsAuFR(cw`$$B0?oI5{RJxW?DZU>!8$S0I=-6Kk>$$ z`Douf0|0pKj{V%Cbz6FGSrJZcV<9WWdvtI$q5YMeUFBLF46j^#DN@|s-QBgg6o=xn zxG(MwTO0}$EfjYzTA;{c#qGu2ZK1e*oLe~gl^e*DNivxU(^qiB5ouLJ#6qP30YUVD znXGRUs>l&)TxeX(Ncd4jT&(gC>fTX3^c-SoVD}7`B7DjQBK-$x4wJ<|86fTJb{khB zJP=A~s}$Hr0dNCKVTXEvYSXo%omOfwV`LX*zB%^O55`p3j0qTN$%Jot=P;nI@$q>u z6O`66C(*3cpxpyz%W$6&m8rG?Qc9t!0BykNt>_=OCY(|RJ`=)hE>%L=F#g%u=B3^CL2Un9cp^nmv&OhzvRSsr1ofnKWfC z6s6SMd8{=kAZp*gCph(+{SwdExMB*h7_$9SEc}K){-g`}sGPC9jGtMbm1% zq|aiCGy<}N{Y|6L=G_a9@Eij^yZQ%yInWS$9UkCm`+A+*0@ zVjFFq(Sq&w{#axVv91816% zk?l_bww}}1%yMd$%9bIfbJU{yz`ya6YyFJXB_YOzR#Jo{k%eJ~8H&mDv6!f9yXKz@b9t}TD&uiJnRz2gUXSAmfXNj`_z6laupz9%mP%HSPn1ERWBzQ4Qq}ygFEkk49BtTE{v`<02w9Rlbh18&#AH^L+E!!F~| zJy|rVatD4>Etx%+lmIZXCr~y^aBU_2x-3y_MxPhuA_=foufV|VVPfpM6bhhEUIep!fCi>g5Ra<6r8ffJ-jUVQA6@t z_`|cB`+gQFSM?D`*UPH}n39L+?Boq10xB7UZSVfKMC@I7cKP0jdY$YF#RBhOPX=uq zlj`J3r-WJIqH9)y zR4+;%P}Lls+;$|_jya#oTJx)7ypSI~G)l!NP>nuslOm&KSSkO~^yw-4`EA(~LX8za6p|=#xu7G|v62U28zDxEQa`e5%Dm)@3C^4Zg~o?a4>0j_^XwjVB}SDd!V$~3#h6E=g=F0}JVI;9;Pt{`C_8Q^-> zpKnDS0}r5t^UaNg1fRX61-Nl$3&bOxn+85|r$XX%rHz?jW}sH2878hR#_ zSmydh9nqw1zu71+iEi3qVb(|oXF_}Lzn%zH(A{c@G41Q{Knm$UZ~Iq?Dm34TsL_oQ zUm%2aqpr1*R>I~*W;h}h3iqW!tXKIP_JDMueU8CMONzPg)A{NdzNpWscQ}E2_!rB6 zOE6!@V;$ADtI@Pu#~Cj{nLknfN2pjvr(p_m04T*2H5n>F_^>-(7?Cm$T&QKVR;Z;s z1brck+9XaLCp~OAGAhl{zGXfIzANx1 z?;h6N>2ANQ9(c9et(g6aOcM0W0(wCNA1&AVzV&rIQHGd(8F3e=NWeu!>#bv`&Ti!@ zFI{M-ks1j6C4;KP9g(xW%$q{f3#a%Y{O^x?sz~V~2!Imk0-&JrD4=30k^>IKRkElX zNdpS+8>m8=cty38XZRA}Hr=G969%+PYh}4vrHg@dL~ek+P%2=3){ihO~BAr5!(foFT0VkO3am;-s{58B9!{{oX2V=p@O|V;q1d{e+ayCO|a6|5e;? z-#h1AQIObV?xS*XaAS|otP`)#N#ez?sAu5>kyiB;;U{9%2?r-t3gzvnxVzZ}Pl{e) z2mbx%2j*gpc9O!uBrA{%CI!(vk_1e}u?l_Gr44t(=Qrw32jSLN1!%>~OON3<;&=w) z5e$+%e}_?r zM27CG3fG>Lrl$sHq$SZ}r}rXE51j6v*mBwbwN56VjxnsQm9Hcp#)c=od7M@2or(G6 zEdU=m2`t!q%^23BC^cRXI7Y??yKE^UIS=^bM;V0tHa2S}CHL*GNu~`2jmvqugO|mx zC!de}E@D47{QG7JD1f{F5Raw8Og2bIuJVzPoJ)`Md4T_J)>yy$)o_2RN#%xirbv8@ zP^2L6Uq#Sx8ZP;=UAfoirynmb;jX%+|0#i8bDY}J!SZB#?kDL~(iJYVPV|vPh`nfL znEtuJ3?%x(RG%Rq>k1-UA}A8PXxqpOLS98)@3ru5J|)T*cpnK}4k0|BAIjhA8rJW8 zIMxQN)6nSdtUvK{z)CT4sP3d{>s271DKJy4M8nTwfy-=NbT?SU(G(aR-?nb+$!{{r zgu5bSGWM<>_P*N|1SrX9;WaTDM_`mm0Dn!`Ej&3jE7F~Qmn7u;ZAtTzm|vb9z-xNG zK%Dfi!Y4PlF8wiu7#rx@w~Nq*^I?##IRd_!JTd{|=i}8@*%&Y>0gb{1^@w5+CK3D0 zNT_`mBMxc1p1^gr%yp|Hi}~WxjgaUZQ6l5T^}${X`D!4%Wy>p~mIchdLo zEiS>~oK=B}jC8So5EOgCy|~4Geb)E76TEu;Psq;myszfVljW#<=jG6&o-b?`ZCc}8 z7Ix*Hb+;~P*G^mT<)%CFlj+P$2?M-JEMKrS+gq)Vz7SbBbVq*9+dvr8m;*O)N2sIL z5mJaK-QS?f#mHgK2QM!LoQLRUx$7$@fLI*bU5Z+Und6tZL|XW)kb4<9mbO!Iic3l< z@_OBv=)R-MSjjhdEXsviBfmRV#)7#NvJC4`?RaDvE6|mS)4=E@_8rMuirToPsRJ^M zG>RsIWNTbB(bVCHEcv_>BRzt9pNl8NI*=Fe! z$-c|FZn%b8`O*7`S+i__@FaI%0QFocwoT4_fvkf z^2hU67yT6<2IFsjbd#1?7Kt5^G#~BL#h81cnhA$$;MzfNH z6Y0M;QhPi9Z6;ihL~xQ96P~l)wK^5-a58@_U8u^O2_-v-aaPbt^Cma?cOrh7i^*LZ zgs;&)3FSR_go}jDE~AOD0@t-VM_Yc3!KO3SdozjPhn*v4o4l9@`pp2r0BDovix~#ickeWR!LqyA*pBy z?yAyuJem<|4|0v>uA@Au8p7+sP`L_nrw=_TM@4Z#mKeG^HPw&w8Dd35CZtH(@Xvqb zkirK{ahm7dbG!FSN_16zo4KW1|IQcuC_5p1P=`Yhii>)pztwJAAn`zWUHUrjY5D@D zt|jNbY_qCZPYZBNOw~Jav8A$|X7z=o1P!m~MoA0iL;j7nGbx@#9#+}@IEw$>cJYTV z-Ps_9rXZ6br1dW4Y3N@d1IND*AL&h)FLsMl+xACxYmk5%?l>F2h`Mv#2vxH~yW#+< zJA}kXBY~>P(SF98UGU?ZmLwT8toDRI(yO}0^kQ0o#by!li;dHC4qX;|D3DwItF16k zA5~!!jw(ljL6|hx_8A=xm9#Q037Yh0fI!x_%OL^qry|VN+7NXiE9*dPGtX=G=li)N z*|O|~u&{(0O2)O<&t>l7HhNqaT=*AnN_g~lT$o~_v9%ACywP`;g?xgP`(BGyQ$O{0 z`kiUrH!5zZ6=gr=G)?zRulfFK9T|4J{V~7UsrmWpY^F26+frqDV$jIqt9MH5)~#O5 z$VNxd%W-jNOfg^XTy^Pm=!S`foe;YD$Iv|3y`?bre=P@)SWAte=XNBoT+&O))cS>L zDQKYYglqR(FUtcVXs?7X%)a@+0lJqIX!`(jPcjV1t|85+Nox3QP;pNQwy!}y zGXXN4`dcvtt+WTZ*VCZI1JzM2ix^sA!so)G*-OUT9>53I!ze<>JaKQ78Fgzn_GZPTouA57EGoW+jWcmK8djEA|_LaVbSF|ieq)`S4 z!N;;l$Fh_t^GQEIgfodz(zhX+x)r?Mr}GVTku8qXC60?BIsCyi7B4u7%I~mNbjYL` zF4OE8@ce7y&#>vpl%8@uj-9|h#`uxV&SrQgRtvuRg;UVOe|-eJapjK%%;?6YFkU#F z6Om&&v`}?m{j5@Bn?p6@D=XSz-N%gAF*^5cBE=)AS@5glR{=6iN^$u^WOS1Q#W@Hn zIkh70fJ|<#;+tWlE~%?V5a~{x*hfHkf!RE0W$jmRQ-l20F@c=h4DpZ9b`KQ|I%Pn8fM6(_r4}!CXX=uUhgdUV-@fKcOQv`%BJHn z=T=twcsi$vg;6x`mpzs3k*=j%Cth>-(+qSI=?g5UAu12gaz!TRTD+qOByVd(xY$BO~UpXkI zM2BdvV52`?Weyh}B}5>q3;BuOh$<8Qqd|)r#K907sPg0>}uLm%ZQgoBvMvqIZ#$qMQ6`C)s#)&)Cruq~^a{6lSv=qh}2rR|L%6|6Mh z6U7ya%lO9rci)V8j!*3k>CTpjA}J1CL9DCMgq-bX&p2_m)3#9mbt-TRr{PRwD}t zwaL^?&!n^Ad+AVdJb-R4%3$EP(yTEy^7sVF!@Cr9$uvB>Mj8#2&`+Tv zOGFv0a$xLZDtWa+JrqRwxxJPko|Bz~O^6MrijIT0kX48+O&dL7PHs+^Wr7a-&@br5NtLd_|;vV0%-UW;5-zcpOZG?D5W)P6qC2*SkBDlF# z)r)DWrD1eH`di#=x8q_@jU<{XVks4-P2j+Ne#RW)#+Z4_A_QKV_|lDK7Wjhnc3G>^ zp~~KMsw9Hrdt90qu`FOX9XOLZ7+^{n2C6Z6OMSqDLO-_a1;%Q)xsMs;7iFL7C44sl zu$3&uxh}%>T9l;2Yir^brH9dQu@vLCkPqh0wh3eIohiH^3%^a@g`0X_6V|>WYD=y} zOkV`YZ~MH3FWL(B%kE4-vvP@#TMSjc^R(*MJr$ZuZ@8*==J2R*AOH&3*TYZedV5CH zUJB?3#3&{=rUhYd3lr{{rZ}FAvp>q=W~`hepV;(^W1dbWTcQUCz?Dk zV2IO;yUe$iNE(yiBa}H4q~#xljrO;1XuOS``mIp}s)4?;2&AWTt<@ewSQIr__*FGf z=^x$&U2XJygI+D`R)l04PX9X4G$y9v^CC{WKbgPkyYW#2s6MeV^APap{_qvy*B&3W z1SNduM3R&u8n=r5oO68rAVCw-BM(*oO((eIoIRlIPt@_n zGhlq6*!tV%oxHJ&&v)n!^G(NJ9{5VQF$Rx$j9@ZSJx-)7W*1NLmgX!&TAD&UG^$UU zET0TSSQqe{CX|nrnPs`r=t~&z(^6B@wPaWrN}MbVG4)ZZbn8W`!&_q+Y)g%T$)~TL z#l1}}yqbA@;%=T9k#H8^PUIE?(-_F>eJ)DPoZcWMXw#h+y&J1rTeX2}mzQJg>_8(ES%7S7Pe@|eJVUeMVlMYNq&BLi96tuZ1sU+^5 ztJ7~jQFOm`6`7GPCk2wf?y#|2lK;qNv&w_RMJGpu?}zJy_XJ8Q!hL467R`Ux4o(3Y zyWEAuEN+FPP3Thw3mud*9~)#ej-dOY(|^6f3^MD>uL<#Y+%hYb0J~E=oVgSG9)aHp z*YbIM50rnxqc$urd!@799&87ka9I~(4HQR6P-mozmEM=|UTcl%pbm`w#HEh&8`K`? z98ktKT;-4>bL?#XB`kF3+Ao~qSJ|IEcYWVAkS1Vy88-Abw;Q*S_ipcu&;+r))HeRX z3?HdEu24lVz{X0SWyn;*SCKxXY_Fx9sytXp&s0)OOI^~RVN+#CSItt{&x7YprtjZ6 zJ~9HvX-Q_2^i{0Y)vtsO|}raa|IwN^8v0>nmFZeG2<`Ns?CS>G*D zbS}{?GBIu=5>gM|MLNLLB=NNAmMlOyaHMojn4d~gHl_I-`u2F<0*v>3*8LPNE6NyH zOLXw!lPz^Q=qckq(W)#suL?iK2bb-dzOHjTOwhCAT^~@9MEjIUCUEPoer6neLxG)b z%O_7WF&_aTsLD8qeX%xGDGYp|8FZ6HB04@bqW7tv$|7|NeT@&}*NQAf-6G7dOFDC` z+B;x%-ZY7o1&ei2OF@qjXF&^mJWU9w51tn^-=l$CK$6;Dr~m}Y+}uK~-?OLL}ke2yT96K02y|%XCj_`t-)O-T~fH{YNfz zyD^4#d7$sU;k-y;!kgoBN;TG)l8z^(YXgj94(6M17^cRjuXB50tEixHrNtoyKZjhz zq+ShtASu5Iu8v%6z>GB#6|+2-2aSYAVkr;s7COK4CrI9O?;`TkW`!uF@Kc!JsLi+p zgcG};-7K~;cpvk$-~boKGc*F>eCQ#MS19qqoo0D-50vskT1daPVk|oTOHn@Rz|vwN z$YwxAq;{}WAIL5}qVnKVv!apiuwcm?!*}mANrawZ=0sx)V9*vhM*keFVO>e#0@ozg zJ8Uso)EI|Ph^s@FZB(+r64_gm5Mo69rh#q#opc;6rHXWT6(nZz`c!2ROwo+NEloMy zn4eC(4f{%#{d;>ue|i36`>PP_K92glxBAQdwj8Fg0=xKR07%4HSloDVYgF5Y67%v? zj*cc$2@Bs2r-h*Wfe6-mcj713O=(>VLQMu#!RZZ&8H`^q@)iDegJq((Lq6Icb-Z$i zuE{Oc;koKSSnnuVKD4;}x7{|<^Ps`G^U&$qyXF;nBbhK)>;ylUN}~#5fQVnkD*|a! zqDxLX*uiVj=UVx`O4;S)wACWHWO)JkiC(N3 zKU6MelPJD)24b`7u`%8L$Z7kc*`Sr2DBHRtr8F{KE}wYjHqa=9hweVbu<#P+mP2t{ zT556n9~7D+5fpOl9(i+-NNxM<->xHT@Wzp>B{SQMJJQnnH8-j5fus&Q(m;<}1*Q6^ z!9yB0Tdec;EfNXvxZWKgDO(L530A|E3^0Jra&{$%G9*B+eKs^1`HunpHWXfK^B!Bw z(gS#%Dh9aO)?D`4>M~e-YK&^L>4hiNC)qP#Ss6R!Sv5L;uXO#W6uiq`n>p--4H@S@ zA{A~3c)Ya2%%S4#et3;+Sget>1Y|4H!>Lr6lSxU-Dj@(X>SyKWmQP3B&`;C zJ}6Yn5%7x8jOiiG`E~Z(IVtQ`UhlGbtQjLRSBU9VE=&IZO)od1-w?|627($vU}C^~ ND9NkK)ykNM{|`yXupe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{03ZNKL_t(|+U&h|yd6h*|NoxZ zJ?Grsbfv4_n-2zTCIja#6G08Ch=1A zIv|8>d`A-(c=dn9zb+E*>*!ShS_glM`dcFF_60&D@5%U*)(9!GpI#HcTW!C0%h$r^ z)J;B>eb32%)#sow@5X(Ic%;wJ@KtJs|h5&W-p_&Xv# zW%c)h-_+Qr)Lh6jP>M82AtPKE&!%;-kV2SmYO-`M8=fQF{A%zlgk>7$jpyjm z^~~|C&Twr+{QeN9foEa8T7+j4gU#?9t#umDb*#tnY`$mSQ!_kg>++8=o|W;;XN+fa z&K+~6Vz6n3XPtPqUl%;PLqkJUDivmDW)V{0NXJ~J0E8(iV%)eek6vK_&HP*TqKnid zDP&#HXg~@JDAJRWeaOcrd|tvU{HQ`B!%Y}%>hNH1d?VVNksuHx_LTjG!i}NB$%);& zZLUPd;v$+KE0#H_Z&tfiEfSDs9@p2Qz)OEeDV4ZKaYh=J6f!ms^}VWv2_ymsQptX)^mRi>jWD$Kknz87YvEm8w;(pZajt78Z8Xr6h4~>S6qcp zC}Qeb<6N+>iZ(SO-FQu<&W7-Jb^U%t9ES-=#kIC@*(@7b2!T?{m`B}Gdo(rHq{d`w zxxw59YZc%kt&%0zG5V~qYQX}5LN(@s`u&HSMFfi$u3KHe=-4ePY z+&-Q+o<$(EO~po|W5T{Uo{8Z(k_n=zB4#e7xZu3=wN4#=rbyQaA&s?OM4aBh(Zq+J1zk z^mk3-ps=d8BB7lMt430vg4idFjbax{=82S~ND`}~X-SLPHgA?TdpdNA5CR#Q_t6GH zM2B$fnn^sXP}_@J0MWdO_`xX1JeYKbDmY&}XC1t!i|4edWBg%kzm|A5DH#i%vn}#C zo}~~d<>S>n5DrexMG75ll=k-)QK#j_Og!&fA58y7)I?x2-=*bL8+RT>=vIz_w2_MFw3kXQ>rhVLfB zFDk*WR4C1rP`NfbI@)ms2Hj-Qf-~?83g43quG_})UdhNKdl;!mq-c)knC2ZSAoItw zNC~2(71|unvMB<8Rd^Q2nBU68bKH84@GN3NN2V59YeM=iiD$dg@mS;8)HdqYs+D5q z%<=5TEEyH7wr<#vmcS5{7gCRWA$<;_zP{(9WqF%%z4u~ZHgzslg)9rP=pfq zs#Eu9IDAE#m$7)^;?JLDMi0!gHMyRwv#ks_JN_B&Y#w*u_mo7 zE;Y0JDW$i$iAS=*gPRzB`b@T~Dla}?)F)U?GN?i6Ti@1V2Y zZP4(K1)gJCt*%jHi08cZcX(WWFW>&BZ?SvM2?SS&Z*B8+r0^^d+K0jxUjFtsv1a5! zuKV;Zj?d-DNy~BB(A15&)(Jd|q~#S-fm&w-!~AOTT&Ex(8$2t77D#0H>^gyGQh3%P z9#A0a_h!0nbQYfNqALr}Izb@nc|2icIO@h(RiE$2>U?(VltGM#h#l1lT2RUe^g8P? zR9a)ziKrEwahnZJR%Avnn1B>bqGle=h*@zlq9>_g&eN4_0K?Sut$wZyTQnZwCKAFS zu3id@|1hn=>$F9f+*nGdG$wPyX3-+12Ic!YMQf!U-05ewZLzv$s!g1Rei3c;>uBT8 zEIjK7cUC;>w8nZmcot0p0kkH+cr(v?^SgO^-yBs7Q&rk~4S)F$zeMHTn6D*yTBLkF zB8{Rbz`%%rRT_8bBA)xS^I2M4&8eS!m-}}s+*}L&Ti8`BA=?>TwuJuDAzYzjR&SPX zyG|XY@T?OeNoOf$hHqsa!rO-DI*ZT>&(WEgxZg9tb3KAk8#oODFy@J8kvL!K7;SP6 zHp8>UgJZ#SGvV^9Kc8LY`&pb=WB8$@bQ}lm`S`w%<2VMlY&jrf8&z1t7h{}e(i^7z zOdm;d17>PDTH|?M>ie0wXgY1hMc-3#+C333DiSi+5(;0xY6UDq3hoaiMPd5qw`|u49bP&$J8;3Pob^Uu9|^&0q6X z`VdUwStK3$r-^5+W6`HcEW^hjaMlBE_mkDUfcS zd_Irs1hIgsR-;m_;;BI0aos#QSDGL$mYQ6-`1mwAQq@xAW$=zM09%Nxt-@FLS|#7x3a2y@;=W{p;Ly*If}e zZPIqOM@>e%36Yrtlg{-?Phu2Br5k`U%}}j1D^{%Flb`$qv$L~}*E%~p`JLZ+9WygC z_K8smZKR=<(lEtsjG)zk*4lEcC(;P4PPHTtERr#-(N)F#!h@STN{x_MVY4R1Ji#U{ zze7XeNv>scjaD?Jh8sT3jA>~h@k38?hVcEb#Iu0%soi|_EidHr#S)92`Fp(cwJ&1Z z=s)m=Kf8gkiih$P`K8-=$!lKE^B%vR?%D_s{P>%E<=eM&Vy1>KmT<*e{x4VTT+g!p z4rKWtU;otA92>fb=RETXtRL(|q8QtIE4S={bD#1AHuicPz4!Zk@vGlu*NG{7XA{qV z^_6U!J;bS-e@(QLgDcU%3J~OY!vY*egkvS@i32eL;NdHQ;!pc=E`M{t58P9$0l@#ZS z)VvzjfDg-R)GrsGs5IzAOVCFD*J)`XMV5O3tu?;yQ!Ex49v-GtD&hOSCC?&#+wlMu z9W8kMbwproB@Tbx@Q>L47sL}I?b9z(w226v*8&pX7uI=<=2JJ!bRkH*M~t7>T4hH2 z#n(V&{FePbvOp-MY-? zxh$;7*75g^`IHW>>*C6Kpov5}E{+s9ovXOwEq}&qAHRs1Bl|cs3R|B02fY2tZFIOm zemR#sbq7m36yqm{896n~cnMaVwUJeeJE@GH;P}`K-J37v`Om$W{^}@4N2@Hl@MXO2 zSvy(OE*rF$)(WLvdY3F`)5gU(r3sD?4>Rd3=HlOcH?P~#g{MGEiC>;$^yq#L93DXr z?BLaJ|1Gw4xoID5VqTJXjy^db95u(YX?e{L&!Q=wZSQ3rs3x9;5c9{gCN?K$glFc5 zXVDVRb|v9-@EkEg@idM3kL*Nhgh3DLL^gZ<@#cypzWUX#@<)I4M+^=QQZARd?q9Ft zp1bdjyjE5%LuZDGr|3t|k2won*R|S(N{O@;qA&tS(n*H-e4ZO`ypccu^FQYkpZEmN zeC9JzDiCHiN=sW5J{_Ye;(##kI~BE?px)|lm;#N+~*4Kb03;=y2q&JNfz-uI1p+vw7odU%@apLh>{|L{8A`{fUE(bOYc|5xwedjl`y zJ#TwG7j9cZN5O%)__JySG6x54xS9`t<;Sdi%cr^O@>Ohq!YZ8G?xS?-5q|W=4|7j{ zH-(P1Johy(;&Gccu%X}K?h|qUwo+k`eKS0V*vX1=vqz%Y@T{6>9>30bmWhObUnQP( z+8?NS%<&vhp7FrESgu-=ByNkNzY)0O)}4N&3jG9sb8`;s*R4k>MXgrD^E?&}E~3A` zpQ*{ISj@dP?>$VKYox5D$`b_W@jQ?7&O4XRuFgP!`98PZb{mf48XuO%WZ06>%n6gR zMf822wQJY%(wDxBp`oP>b3d9m84Fg@LffDo38i`xi?&;rx=A!fECE?qA_Ze}Q=dkW zL9vUN=9;9sqP!mCU~f__AdB{hn`RN_UKHD8uqb7{P4WcurqaSUe2Tp%&mZ^c|+c!h>-9_Qf0NEBnYb7xCMFd;yXg zrOGIW#szu9XCS0QTURe#RY|QJz3#Sk(ZMMD#{`$OyL9(=QJbA*cB+iqRv_odM9_Gs zjB0Rl9rSbwP92^^sg>k9JCNF;f9n;z@vX05dryT^CuS)0cO(5WdDm&&elj;mq@2I$ z=WT?2XW+SMv_OK|v-?@*i)Z~`jAzaq&&`s|Lu*#Y@GKh9%!14mx>yj*ncz9a=f}?H z#JY=QIDh@eWhxigMF`9J8d(+jLV;KQ)+?Erp5bRV|BU6!mUHQ)mvZ>f5pKQp)>tH5 zq*x@Qmqf$s6ZaDc%H=Yz|J~QIdGltJQj|(1o^$1M>FUf`q=GGCFS&@(Bsz|yP$+Q8 zC6{pd<(E?~muYKjYnbs3v$hdjp;NgMDg8oV4f;!`RO{5jwyIkf%iT(v?8c(T%D5Ox zg1I4+;1x~%1lqDu(@B+aYOwiXQKx0hk}sJKS4}MME_%8kH!C^0kKPs1VXy#xltk zUP|Cd5iemSWEdyb&;eznq*?cqNNeRf+9NXG$-2isk0&gi;6J|pWv;${oGae>X0F`X z6PsTt92|l`5Sc8;mW5{-XFam;OiMiLlpFpg(E4?J_`cut8sk#XK>OMp#=A2WQ{P1OxbBqP_VRj&Pi*HWoe z_~m`SWZCj%?Ay1G{Rj4^zoL^~D`SduJqb2`G_<9XK)| zxr8nlL`k!!MPU2(;i2vz$t_uh$WoB{lKtRfj!z2+sT>p-;SV2iV z>$t#*YHyMf9NO}`t?_IMmea$ty>d?4LX7X3$n}wRKD$c!_G^Y*uCElg-EwpG}9j_0^OP~YhaJx^sM8_%sP{$%i%vSoIRdw>ozCuVDtQ+n1WsEAU0q$s zb{FjxdF0k_@a=7{<>{CF23s%o5JFKLeTdPLhprywhHL+mEw6eK8_zk5zVH5!nxBtS zLxdemRthl7I&VsI|7!7U(tve5+w!$e56`-VlGa2HB=D@8#LTzGvuN={2|U+pAZFk> zxn^-+yXEXkQ0&%-%pKcz=)SndubHF2s-q$vj=EiR)!iFgD&l{hBQ~F-z;U z5vnbAm`&y&Bf;2Wv+G8innXa2ZmxXH3(t*Gq-T~m*}$_>I2}Foc6E^Rrx}?jMLR?| zw0HH;*_J~J(8{ASJIzelL(4q6XmkMLCU??sgiC2pq4oYtfm z(!rW@VL7K#fH1X28~r7WisF_@5;7fVVK44!-|Rxr#AifCG~}5HxA_jGbaO2@k(8}1 z$<*<*5n%t3KKHrmHrjtS)DePA5%Oh7F8SErjQ1n6VcFNu6Cy3@mS#5TSyHdCbYnC^aLl*ry>e1FrgcmEQwWH#hBtS!!REn@9xkm;hvX6_8=&^M8R z=a}ccIi4fSz>a5osrKg2Xv4D|%0LtcgZhXE8p6$_haXgDe07DAT4Z$fM z6`tc&;Lill=J_mQ29+D*U@e+Mq@l%=f*T((YhekqcZ;EsW!0b3*$-^f3}Txy8F?h) z-FK~p9L-HENE3eA-n})e_@=qvwfQ{BLS5SE2WI%QM3!XL+OlCqjG|}~p=!}6byI(n z?Y%5tg3U6pmDZZ?b(0k`bVdo8w9g@-Wh$L=QfrZ>WPY9Toc7CRb4da_p5st$j^|WX z)EVO0^h5k_!gI4q5A(&d)uOi2bTr4aE%haZ=QPfec&^6|WZ^j(MEl>4XPw5gYlaCo zzGj9XrY2jYSh0AK3z2I3t_*EOCF_6H^9YPSO-f-6u1NEwHo!F_gSE9LSj%u)p@#b$?lvh+`gv4u6oic5S(-)~Q zY>^HDPK5o&lzq~@#ggRBqr$VcB_Er36IL2a2u;K)+ItI~8J=6!Wz;D;>5TAf*cJa9 z@oZMbu>~|W!*ixtV#Tw)Us%kLm^Yqjif3U7DL3(~PZQ5^wkHeErc&D)&mxw>lg6`~ z4y%!7+-&OOy@}G-h`*jXovj*Tvw1V?iX{)sdecF(l0jA!W31YNZc^nw{I0BL z!I_$R#^%++GT)C9&yA`F)-Ey04tm*`G+XPWf)7khn)ze8<>%*x=SYyx7tc09mBe!@ z@aGKioHT~h$NpoBXVbSeFFX?kbp2Q0dEODU85%(f&)VWA%fNHeubz$)jC)J z+R~qQwNmja7Amr+biL-DO8Z}9Y+L<6lt!{>VxsG%`qPa#bvA>g=b;T}Y@7x(+nfktlyqvu>L{{eGSk8aEBCB*wr|U-Z6`SUC@&&O zZ^SpYnUGu$`!%Z!nAd5ogd{3Zm^mW~v?S4IDQQ^)LZQu{46oB@ntPgfu0OO5&voTU zXpyGZQkJDWZ9Jzt*R;U%=~xvuJU9K$Jn$@{{!Oj$Y$o zeKIDVO+};GB+m=a#9OZDnAM=-HHDktS?CNp&w^*W64l5Y&%|?-pe+-YQ96e$s|n|0 zg=ZHLm28RE3ygyxq79ST@=-q{GO2{-8c!?{IkN^B8Gfd4iFI6qY({;|x6YPX+AI}` zmsu@X#LVR&jMa~XJH&b-X^f7l7y$&C-noP?CZi9I2>@Y<`N*1&Mw30IQ+ZZN|DcYk zypg7*wMqNh@>bH6VjA2cs+y$})QXNaS!1PRHR7`IoGzY{Y?f!>*;Z{-&lk_;rcQ3) z=6F^KS5#9xYvvu8oQda@&o&FsbwQoLbHY>83eWMG{q@ANPFW%L-efjBBT^(x9M2@^ zx<=rUc@m07a=LlmoDrVuszWmII6<~#VN9fiR9g5qTZ1&7c~p3IrHpGh_2-reF4M-u zDzl-p6VgH$714FvXOXHBY?!(-*@nK+8e7JGF+1BmLwU%kJC+UhbO=u)7boTH6-^I_ zx&|$9K!(*4toJF9GM@0B<-v(-BcjnN-Zl@7C>~37fh>wH(lY&~&l+ji@vhE|C?=7P zEHVR8;%hBZ)J#K@mjZ!IM6ro_A@ratLmfj>8UjJYekWPN$5u2(x4^Rqqw+)y3t4zh zVlD2&X@+OfBv$$K@ND;VM0n1sMv=Y0f+|E#FwbX*XIpe~qi1gmJWG+ZOdlIOW8l*i zw2gN17Ca{fnXM4)qr$V0F+b87<5@%{qB8Mp%QF-fxtQ{uCQZ8e;#r?Dp53TIK@`Ip zr#*DoCrLG`>_!@}PK1A&Y_@LELX>z|XEG)~)doOduVG>nCav3GXH9C{@t6kVd@E7Z z1&VHLbWlRasQ}UnQ>&KNaYv?Zt!0PQgiiE+iq=V39IRmhSF<8>!=lw$#&lf6OHkq3 zat&e8G)%f7YOU@gZFMMPif!G2oG5N8k_{WgM--;;+&G)-SX3dFExeF*ug@RP zrf{y~*%h{8vm#mfyMEZJhJGl+eo|&{s;1>bYzd@V#Cd77NkOjb=vuvT^7gKOadbpLO_i1 z6X_YKSD;T&AoVD^WYu}mYThmGL9L8H8$%EZL@dg*{!P``+S*!lvl*Tv`{z;OS(_Sm z7M@j8kGReZ5{Tou6}@fu1Euk-wVjAQV?2vyju3-*^zAqiGMjVsK5>&?2gtfI&ve*pAGPv__ZAnp0^$rz*MiTvL_q~WjC3lhf*?RbSj1EXaB6`oU zTqDb2-OxOxh`01;XpB0tz2>a1as%67z;#ufK*I|*MWwSW;B%Uqje;Us%v`S*x z=V;}}sr#0p?7s>;8!C$h&)UTAqr!8XNVMVEaYQEVnZh%V63;?d_1>0vPP}f;)uY3+ zXo_bcf@?>#y&ccl-CRxs&ocT@W~r=(6&Sr@Kc7z@&u%=>Azt_}C=aMecL@saT;_7P z+N0)aaJm@UdKURp_j2&PNB0Z>03ZNKL_t(!CBq!FBofMaFPU_Ge34#QYmRUF;hjQ1 zOI8k1JGqyU8HJO};|L$G<{QlymBlF@4?DH;>pG*Ifrx96^}?>fes^&44%(~XtH`S? zGN}_A*DI`k1l>f4CUerVawtSb(yXl-dL&?)M^f1+qK0m$a`bK7PJd}H`;Qipjx?eI zO`nfO#i~0fUxXI(L7B;xpc4I%JTLJ4jmk(;zg}|bUhMMngZ+5 z;#oAsvza@Uh372cY$mQZOE%V8x9q#1=fUHo14^_}Ycz>xor$doyUBX5+Fm0u1J5ex zmTPr?WaHUr-4xq4BEgwA!!wOKvzb)-=?bk_NND{b8(l^PZg($jj*KfpwKsAot&UfU?TdyL=V7sRNvv_7i?BiKq)}VRs@2+D3Ti(jnj3 zjpNNxE>#;L^+Eu$Ku1>ruQZKnU&-bj>zUbm3kQbFQE#4RN4ycPs=~18dV7e3{hgpE zgpoH9sY-Q41O&n@(AM4-Xs}wLYGtaGD!$SUtw?252Wa3%si*{&w)eKOr8H@+P)gFh zYz_S|-qjTS9RRDA{tnc=b>L+NV4-g%^e-Ho8ZfzAsZk z>5SIp7CdXMQL2OG7d?fQ)%&>nzT(^+QK%Nqheyx~JV(ZrPa_Rc>bw zZK6zZwh~=Oxa8YAkba3u#cTLoll+!OlJDuKJ6{ee!PluN5m~C*!rq@2o=L9LY2sO> zsi~NSm8i60;@M1-Ia54qoA1WZ1kBfc{5YNw392lO=UAawL_q0^aK6kGkPx?xh}~9r zwp7-rD*SnL^n8 zT@8sQ5KbG5&w4V;)I;q0#e>W#Cy@ERk2AELb1qoKv7i5dLv!PtIH0LcS3?UgoFiq- zg9uU$gAU6wil*`vN;o(nZK8ZHuy&=$D7~UnJ{&XgL*}|zym33r7k43)kJbWz<^Yd8 zbdWhe^7;6_G90G$Xr}P>hErBX%>c9t4}f|^l!G*i$~O8u$sjrF16xpVEKp{4&8nSD%@s&MNHYwp$K{N2W&S23WD}0y?JdXYa#DsUd>o zaXSa-U%Z(1yu>d}FmZC2xtb*1HYWVlRHR8f14Ju@@71V|?_&48BWNc)43tOBQz#$W z29`6>-%Czv6a`%Bf>YypHEO~OED3y+ujm-s!n#g{o||O+)N$s#L=jz`(LvDE2y1hU zA3DO)Eray-ILuC{u%tD{y+2vwU$MuGA=Rj_Hx( zOwH6l2;9yAdixjA(UwOF#oWn#oSO0wZh@{P%jxUsz@bL*)M3V^gZs<%u3^>IRXBK* zCr>dkF-1*_uu?$W6Pr4w66&w2Omh65n;6y#cgb07-qgpb-S;szT?RBY&!KZ@CH=i! zNL6Nb>;zNOMSSg$?_0uPPY-Pc7wwgpI&p|u)lJ{vVmjOMND1ED7?abAj{X5U3KFk0 z#l*--<|-QS@w^(I=LP#fNRl~y`xx+hML|JPdK*J^lfkjR1sermRPHT&oRnRSXdR2(%4)1lOSECB-OJ{ zr$ehSTF@t3C1nYnEVEaLR`Hi2-a;f%v(Y+pnr!+{o24caLc89?(WslL6K6s)LQ9D^V`aqTL{@QA!6b3iPbm&YIf& zOiq#N=<=$NREVOnI`uTUz^ zHiVXRT!eu9;>~P0Yc2WmBy&}T+ulo?s0MJ+lAe`YS?4~&%;YSUy3fhYk;`e6E2F5W z28|NmFt*kK_4leX$C=hU=@}T{i)GyY z^{n5zj(laBvggn{w36P=`+4LT46NFM%*|1p8K#ySWaX9}v>zGc)b0sHzLQ03x6nQP zOD0C9BJJ2C#krlyK0-=XA43cV{>wQ&`CcASz| zVA0Bz49=CQl}mW!=o?y1U%SixM-DOP7wB7i4y((*V0^Lyxo(zhKAQn=gsGyY(7lSq zOL{qQ|AS1GJY-uB9qk1a4(&@;(%YHm;JyRQR?Ujt!fa{RQXH5OwW@K7YP7G>(x)B{ zt|MuLyJ#~Tw=Rd`6ct^dcj;0(+aF;6{;33P3M|^Zlau|=- zkVFm^)>sT{SYq9}N-|bx*`WD^7S`Tf*y2WYGA2tH)|!aUXA$Pr+A8rI0dPV`^V*1< z70fHLI38*jw_e?3IHVR)@?>2q%l@65d)c;-@+dQQcn`;p6w$sP1QgVBP8yY_3-qm6 zOP?6y!0rc`obz!9wsY=9TNpZcn8QVIq%eF&BF4oELfV0N$fXXi@AU8B+$V1fqk^i8 z9ooaOV-=QeSWkCxFS{N(M%jb5{ohsJA-#8>49K_FUoF|=VLowIv+Xzvk9 zo}^>x4z_LCMBnjyn3*oIw7rYG1FB~U9YW&_4AI5}D&IjzzQXL}1fGy_%0TFJ=#Lrw z6Rvi3azDo=&SUxcm(zXnC?}5`Vq&@+Xui%OR&8E|+W!+CJUEH(4zOm&c`RPCn8~R* z$`kw9KknfxLB4klo6q0MqP{(h9ap$*?a0zG4(~ZY$pe&6u5$$|R}WA*cn6OhokmFq zp=xN_5eRCd4|8D81QhyNws|K5OBOReHbv13Bm9g|=2SghTdRi##f8y|18^6ya??s` z`+m$rho?~a#jM?VE=vacnVcFY*Vc}je1HQFj-#bOdC=aUN7N=bvHtK~@sy-%#aXOhGemdi5oRjJGfI&WhnGx>5{VR39agYV=+3R2bLslXHz8cwI&(}- zYqacP#pVs)KRNzV1$OG_Y!HY^wsmU8gwH6A=kV{YsykHbPbIXGG#C0^N+&pWa3b`v)R>zp;?*7ETHz}XB}2ws`zYB) zTcMry!9g}XZe@7$ISSIHvt6L3Rik8yZ#+yub4@5#DASRvFg87l zSk_HGU%(yeqjK~SSUN;s`@>AP_fznTj7*l%4ZoL->yMH5vC31bGQsczw=&f`$f9Md zS$DyDRt(?I-hD@@bS$B_;NWg}0vE0efzsXu!^d!hLUgWR?WT3~b$24Q!j&GCTolf$ z{TjaK;d{Xkw{;BBp=UXGa+HeaAcfyha5bR4DmBjoJ;U7WEQ7smxI)JcV|3i|4%3bdBNhW0(YY89_q zVS22HUhSaEC8~anx!EbIVll1*+VfH29`HO5+<X#pf#tfY)aOL1JK;_8N3)3PO=jXqsQ4amT8t}QtP%^$+F z1fw`SlX^FWk&2(sI;hlP7FxHpU@;>#W2K&~p~UmUbHmaK@)zonS2ErPguub9tK&=# z52KyX?9>_|bBW*qlg@B(9EZ}0eH=b|imHmJ8*dIAN2Wqm8zCA_+~kkKb%T^<4d}`Q z6DLmu^dJF8Pn#1szC&j>b!#mQjgnGEkv%eScq8g`ri|rznE4#`cHqLQEtF@*nJTTM zr?;PW)z6}~5+{adP$Igg=z$#^S1^0{0S=GOMUYV*)j1DOPE%VsL|exaI{P#eyAR>@ zt!DA!PAcsKP&&kP8H8hT)Qe`jHF{Ci=9nElLUHsc!;81EZTs1*93SUE)kWwEqYvG| z@lq6=qAD}YIjh)u{<*YIJ8v4nZ@l}$%+*P9480} zs@L@qjuScTEf^G;r&72Vgh15B85=%^CjC)woTOq`yRrgQ?fC(;|?zb^cNs8&)_D!mm)RRmgQo{K_=NQaqzS!oF-c zj0MrbWj>N5s&A#W3<|TvdNzdzMs=D}P0+Wvm)v*-Ux(KdB8&>G7j+5zXi{rD1#Nj3 zN7jNUyySt9DCBA;Qrg-&=<*EH<5TqYFK6XoKhDen#!6nKX*GgXfXXc8nqqOgraUu2 z&5zSP{>&IN+S=rE5Jt|Y< zlxl0}Y|FvSIAy(-_VyaZ;bOE|ln1?obmz+)-gkhBl8;jml)bf4jl%|+5N!g#Jb|BI zO;>k;QzJFBY>^2sl4~5NI_i0XS!Z4&I;z2U1Q?(^PDQVxy{$&+CmkmgVD&u`-J#n(M2DQ_;YSWKRdZ=``l$H0+!(A%sJF zM<;nbN2OYg2ma`++@U6BfLWb80~aD$5H?0Dil{1ZvdLqUgHlQvQeUawpe-#fogolf zDHw4)i;QPY6T`L|t7f{Jw)w_vofhgL@*=Rvt=3ONz}wH~25G0$UR5(4B5n{wVfCkn zXCvg@+SE&%5yqk+xy|)di6|JY%2Ykcq9rToJ-Lt3;bHpE-om;qE~iE&@I*TWImYor zWBABK*_1%=Xp6?A({qU|EMn0zX%zJ#9hRnQ6_y>g}xXPvL8i;`m8s%R0rCo9#r>k&mWgRAG8-gt?_VSNIk{y(Npwq-NBZvU7Q-91-A|9jd1e#B%(IW_+*L2o7W?b?xpDY_$Llg+q#p1 zsl)6&HHQ{%lS<=8R8_qUXq2c!esC-6m%;S-6gB12v1Bbhg(Amis;JU1hmRE5y8aS2 z%Y97DX>tY4?8tGZN~6qHRF8UJWlBZC&yLeKv7Deg=!ogi8y5=OgT=*#8PTRqVjx1siP67@-Rn_ZD!Mki`n4r zXR@Tp7ZlSYCzzh8CxGj)Yiv}zE~0m0al@&DDpt@`%BUQ!jwtTBb6XWhne)$L#ik9& zQ$<8iH+dN}^FY_Alxw&Hs~GH=L?Q_3BK;E_KRia?#`D?2 zBaBQ{khvVXGQ!A-BGqaYF|?FLeJ3f82G?z0dKPQEQ&gN@hE^=4a^il9rCK1|bUH*Y z$yOwDg@h?BTHsk5-I#SOfh`{D9#4#qTRbF~w?^BMWNHQ39f-5K8rxcz#2TX-ScsEy zhJ9fCrZv9Mm?~RCbZ8V@%Bj!4I|43`M6BCeM}`*?l)1+qN*YZX>m+ zqm(C41Z@}UHNYA*Rij*kcv054{}G@zJ;KDPW3-oNI5Aa1X+IQr8s$|f&(2V;1s5(I zyN?IGSyruH$@29M+Mi?c=xA7Jz+?8*DW(V7C=E}ev_MpbIXb+Of#M;is)ogC*R(hZvqHqtQ$}_){J%ZD-~34Xk!GUhyR5Q3p{v%H9X^ ztlhAdRhw6$QB8dR(k{+{%#yL4wq%u3n zT-gtz{iMRH6e-SDsCg=^8WNUTN;s;sHm2!l_o_waW?U*>4bS&MD8?WBDSJz2vwYbG zRyqo=c%0c&K1wMnvr`mHRa96$No!55GDoo}@q8ccD^#^eak@s;_k%Qw+8lGUvs7v| zd|y&2PEo9e;pDXnrP*m@#Y6cDEoxMX)08Sc{>&ph^nlB{b!%AJFHp*(GJb@)k_V#3 z=-!9uI%^Y)7UdZppED|TTWV@&m4z2jD@`%$RnUa_l4!K5QJtGcl&fd~vj^^EcXcx> zSFU8mB7v^XFnV|dbd8x~2N-VO%0Pby$3_C5m9A+zhc+_kRG2w>A4iTHr|i{fE*s`D z4kj`GIEPkvw)(QPZ6>q+-8TLrVuYq@F}7F{Oz^wr-khKnHnh zvA$l?34DJI>&J^6u0n=$97F{Ao^Rw=%iy~rjGn`3V8Wygg1OdV(yWV=plUUg%;DDS z%BdhKF<7(ckz_`6Sh6c@tk{_HP%21?kdAC5Q!3vJExQ2IGJGz-Rz=HPaPM`ESoz^K zoG|#NM$OYWt{YM-f$$2}RHHo)Epxbz41*RtkU3l_jDNcU9j$8kzS-vJqz zTvyt?)H*vEw!SvntKs9|x=!R%)4?2Q>EhI}7Vg!$^&&$oP~Rg$Ae|o8KIy6S9sL1! z?U@efN9lw~(U$OV9R)0BG_8p3t5ldq3p{HxNJPY0REWc ztYn@D z*oeVlZ}JM^yh#T)?^wl%aPuMSknRd5T^SQTT5Du3-*_#!RVPTqH9I0(?yYglhQBV= z8a@<^QpCc9aNHbH>-d=lNH-s0v*9|6s*nUPxa4wCGQE%vt`T`E+`N(PBam(`s&c47 zx^6UAG8dGjsaNCHM$m$AaB@!6?a(-Ugvcgok}(X@%^}kvZ%8*6HBuBoV33qftnx#^ z5(Jo&gw(C$;>sYnMmSOHk9ecyc%pAzWGQR)VUu!CP-U&~9E-k-*PgUGOAHH?rk%Y- zta)SP|2e(VLt2w4FkTM_*D1P}`QTZk({W;*kF(ulE$S)88(7xwL1`5Tti<^&V)QJ@ z`1UATP&d@oxR7eln~AfwSy+q_An4k(1C`{=wKcLdinJqYTaoEwu}0iQ4qhqJt)8Q3 znR=oeMm~yB>=R+i7Na&=!mBCLDv!Aoq6Nnq$>*qX8etzB8Q!2al3)W(FsVtTbrgXJ ztx;PPjlDo_>;6X>98CRy(TSE9B2Bdj9RVyI{UaJtrzF|;aH9sLsM5{dwAPtXVH$&O z5z+5R8$Fcd^D~N_rsxNq43|#hnR(#Z+N`r4xRE??v>6GhV+v;&8`hZ17@h?QI>n6Q z%EEKY*c=1TqH$0)$FoH08smHKp*ZK^xK5%bV!~0Ro9N|MJkM7kq)J}Q56?QT+}ZK0 zV{>YX6~Uv&vk;^x$(UX|PdwY2hsLUV=qx-p>syt^vkaqXo8wtW3V$r!$_yZq7H6zT zCrw-MY{RXqZI02zBI_n$9x)4DkmzLDDnyl7an7X4Do6lC>kQp8BWgq25B{VH-ZD8L z@z6p@l;QhISz@LYWNri! z3F72j#9PCp1c0_xnNQ|pMG8xl9BW#QI=)w>wBng0o`rR3PaDtLisv-drHve$)_4}_ z(6r=@|F__|!qm}+!+MRPVNr<$p7m+qIVy&m;P}oI&n=?=G-rV42GjWH@NAx`(u!vt zE6u0tKCA>5B*X%ibec0y=@Gw5Jd1=xY>8*nDccIqmL_HH%*=GqyQfhvN+&d1vT~qNbbczXqjZ z@Y0zPOs(s@#hFZ7XVK94teaR}%%`fHU1KvTB!f4xu81bvc`vg0oO;${qv4N6TdD^A z_u)C-H!R6soIaif^E=xk?EGr*tXtc2^TKnoZTzFfvsr<{#B(#3@2?Ecmbd1QXRuUa zvfw#gt1*RVGJ%@(c4UO1XW+6ao<$Syzs~TDHD3=gJw5$syUHz$g|RRe#==+_|0P4{ zN8buWYyh7?V84YX001BWNklyPE0XZ^8rbrvzMOE90EnTSVFr6+6pdWVZ9c{|MsD3%udfxs`)r= zJ@j`M7I42X7KSlo<~uXD@v(Qmfu}EB!t;JuevE%sbL>CA$RGdZC%AnC;9)-gdoSdv zmpz#$Kl!P={H_1M?h3#J-}~tM`S8_0Vcc6-tcCHve@x!}HQx4{SMuzqJ&C8h;=|lN zp%x}(VJr-rrB$6i%-y%$!|_?@UAu#e&bf>~`}}2GF|~?6HB)k`lRSLiUF<$Ifmpni zCp}>s{W(eL_&xmej)RnB8%x%1|j6urTyG+`@?jt zekB(V0ctI8`PxtU;{w3_ykpzb_`5sa#222lh!?$R9bf;WO)$9(1&1vakiAV1v3 zhIOmy>31mBlo0?@W#3P)BnR?(0-13K?<%3staNSjJ=9;$4IKSUvXttg0 zJBGODpTER6e>p}+PY1<=S99aYC;9uAucCB#9|w+}V#%}4CkG(g=_!ox{m*`hpYD5z zL+8AXH*ODqbjM|^8U85u9~$Q3bsNbqtl7f&A2j^p2zOooPyBFSm7FU;`_$wbUi$kl zV@r1~{^7CR>`_ZO$G?@o{c?$CJ%2s>uep!v+tx4Oeqk((NN8!MkN<*iUU!@q|I3f~ z?N#7aYG5h1MCBMizxg)&op0vz?|%lxYo5pUFW<&{o^>%t?%PHArSIj%FTH@XHZ7xV z^1FQQ>Tff$?s6_)JBYjQem?cNpYWlVznbFM7*o@EcC3zXS|?v1?}F!fL?sbdaaQ*P z_ne%h>O-s$!@^h?zve?YE}i{DEL&C$d$uWjIY67O%|vyMns9OT90yO#;BM)_pPHls z3qosQEDTdlJKY6~0)Ago#!}y^d;g%+(aVOPAmPJ=>O{K0QuJtmJiHxrV_X z-^V|F|+EC?5_T2O@TyuMgw!8#gqwMTt%X6N>n$AQV zR9iRs+8k=_3;4hrwo?7thj14S(zY;-3u9rJLQBxuw~md42e|$=xaeXiP0b8bD6klq+{>=YdbSU_pvKsgxw)sN-^esuxP=vlLxWh=WmcGv#kE=qUt;TLRT(ZC`GmR-Tm&;JO2|JuRez2mp= zV8<4Au3Sc8A@+A+{0|$#ZDVlVc6RJIhjY$3hjY%^!H%=n(`(hhR`9y3UPIfzzmb)L zOZdy4tN6mJRxC{7!dMvQp8D@eF0OF*HJ{{P_jU7su6hF-o2ZhzKKC9zU%8OC|L#j! z+p(}<3u9p{jD_+4=i&bM{A_{qpZfx4ca5MXJy@J^8+we{tuNqrSD(e21%b6N7RJI@ z7z>uxLK&xpu`m|K!dMvpQ^rDQ!@{VWwZ8^eSQraqVJwX1!~J!;q0w8f<@UiBapk5w z_!Hd!lOOPtyAG4z_H2IZigW04EYTRnJ$(0DH?ZqS5iKRI>(aa9mAwAxOMx;+@B0}y z-1JK-YoE$Xp1za8j(N)J%6_i9=0TqLJ6AH4e9s@|Ctv?I_fHCzKmO&s_*}^YH-4KN z?>m9&ThHZJUcq@oMQ-`lx47luF;rm@=RNCXJY!oYhwr(O|G4okMk@}3XFroyTzM|N zuAp?}XI%Tu+nDZM$EDA_k_%R~LwP?x_~s9IaHPVL$Gw!_ymSSqGDq*df$!Y78-MjB zyzn_sU`6-oFQqqql$-wTyOg#(n`d3ThFobM|M86q@8)AyeT5@34=4`)_#1rs%hxlk%lzzb z-p9vpJ%P6A^{x#1tO!Z2Q071X{15r!zOZJSca$5x^)+tV?=aBYj&nK@h^2e@=sW*` z6Snsr{4DRgdOvNwJ#^=Nj^FbQ{^}#way;L` zX%8Sz@s6+Zci*~)$;!g!I{o2s?=_#|GuPk49Fu(S{cq*dyUPpHvM?5gX=!P{%<;|RujGU8xss#q zTi-0a{r|yjKVHm_zdy;-|LzmK>AY?(+_#pueEwc8zT^h(tv#Kq z-~SHUu6rZT{MMZuf5v(A4$eQLr*!Hr{^kE2{A2F)p2mwWJjPG&8DPhHkK2B52jZL;@Xo*dTR#1dALlvyKfs&+Z3KUM zA2;2ym*p@2W8U$&DZX~~x7c;k2NZXI?Pi8va#>KaW^Rn}ibu!r^}Osgf5I;cc_tp% z$87&4JbUerdCMPso$J5zkNoGUO+0Q(q47XRKKWrDxa`e5s|N~0=keM%zLuvy;e4L< z@;~5>FTRB3;#S`Jrth-tZGXe3KlZ0wUb~vBKC_qhO&9a(cmFk?{p#oWKi)s_?r-ix z0kz^0X3l>HAN-y3*z<3n;F^0BPk7nudE;-K!^+3KlsEpt@AJ~fFJ=7&FXxr#+{UGY zi`nwgF<$YiE7`boAP`tU>Es>UIk|!^DgI2eEKEps2sYT6FnPw z_>;fI%m3`>(em)TL@lWpJSnqb0-t-!_J?&#Sm#kv!p8fdUeUwk`V-7g9 z{}8+HIKudz8+mxqRvvusvw6a$&*IIW{wcHdvPA1HXZ!e_+;ME0h5F=B8{5lQe)l3a zY&whWXP?dXZJXJ!<2C&7L@E8@$wQoQmoT{NFL}aqKg`5gOBnsd9_ALNabYZs$kGCE z3f-(ZcL(dr`%s-1pvHf~Y-tYRxQ%wo(s6MGC})7}+t+a6`Zf3$_VM9;qtyEHEIoS% z+qZ3I@xh&(y=pJF4HwZTZ{}lv@dfUm^e8@j4{Gfx)W&vJth<0`oWG2%Lp$L+4{+q< zG&_fU9{m5Ni>SQu~_WL0L8z_2n-_QNL&-|||A9CiLeRf^zti9Iy?@XE4 z7|*KhD;G|O4Q2HnjOy5sge#Yj?N(f>AX<%@%gH_uG5X?De6s#g!f$W-Uu53$68e19 zq>@EI?M1cfF$4wpqK~dYOpqRquVur*pE)r8X+D))l$Dea(IF38xq>g=e2vW+Cd`?8 zxo*3LtvhJ_>d>!uEoz&rRNrxgizlvNsFOroxEI=tC~71mputAQ51aV*Qe8ec`4zg= zqnWmD2M?tVB*9k!mJ_@_=nec|*+Jhx01sLXpTq9Qo?w2zr+9Polf3I=Md$-b@6(;w zLyU_>Q^{zHXL>va&R3U9nlo;i%VI%&xTWodpbTGp!C2@ zUcbUJ7Q`){5hC2koF8`w~KdxFD8 z$?;8?W^d=Kh>OgBX*`nxH?i;$e;|-JuToCls6gCnh5kQ=$}gS)i+9t<_1kYnmF5nN z7%m4+haFw&0H$?JBl+46gx&5|{%*MOo7DrA{vf3SSyrKxl_+o`gg~ZJ5F)^Ni~CQK zQ7RP3fUJ-Zu1d)yD`g~w3Z+7YLZL==bv*h#I?E7|?i&#W0%17UR{kbZGTN#Jri za0&sa(J38R992tH|JW^Dzp#^{sLr$u^`l9b6wK$&aHY@;BAW$WyKZ zn~92!A_NxD6>?Sy| zIc2m;cNhkM{l;mQ^sa`7cK|^_K?DW*;1SxHudbT@c(Wl8PnVf;RTQn#gRx{6qpKE) z`#>Hy-1wc+`n6yeRaTBe5kP`(5hpSWDJ#CrfjxP+s;Fmf$$ue4)w8b3Yq$OfTsAXK zk01hd3T);JtY3ctt1KZ43%OYb*>=jr@(m{}z!UHyt-c2tN3T~Fu8klyHk=#h z_i!vfi%&kuqkhjcJRAjlJ@IKSJh`1!L%sQE;$kxF02VgA{Ug<$>`wLH@I6)5>2}yg z?Z;?&^8*(Bcm-ogAy+OQ<VwsS@oHTHiK$`wV0d>S17%{kGb!kCZTBp5$XNt;Bknr4;N6JpT+58 zM#65fEtAc0V=!sq9>{Ko7OJ2Wp8GN%hqautvNFny797Rj(JlNAs>ri8%_HsXKYWbr zn`c=0VIi#t)ph#?-EiYK+k=vfAuxsrUmae$U;^|8L|70yLn>pYx1!(JCpjA*Lr~pj zBzUVZ*nJ=Fup$cKx_vg=DjG7PV>NzF9xtgq2n>xt=TY_LuW8AL zUkqdLh@P~pkkI(mV#tiQ>GN3=20n7WIZ+8zR2)H&+|88hcelC0|(mEi>!M$x3U9oavLfsu5g ze9}yZ+V(KR9^KE_woP%QKgIkptq9ct*vL3&B(>iF;_k@|aG>)ECRnSY0#Al78BfO0 zF|?UyCUM}$tZt&B{L%^D8}Ss&&uMA!*elHMT_3e9Gi%l3^dH)m2VDk|AAX6qAFH$? z?fbtWH@+q5!Cvl=_rDEqdQKcg=8Lb;vsn%yJr=R1gO9sg+;HR9GW{PjVhBMMZS~)I zh@Ab488$YL6}#Rb#Cxvu>4+J4%veBY z@BfK5nfY<%R1Vbc&+xXj@Nl1f=7t+?{MRV0e~6Oe=Htv{qc2oh8u3U@o!ODcDt~S8H1$#&m1);Db%R6G7gg&*BxvlNufrG z9lO&_3iQ8lI-yi4a5-0$G3QT|TE~TtRtCw(@%v1;o54DWN=0vO4Vz01Zy+h4BG%{AJ<959aIvq~4nLm>0 zsPND_sj#?k-F_FiOcpAHjE5R5HU(O(iwcVqS=OLcIWSwDe;SVddw6KoI4ri?byWZY z8J$Lf#cBtI8m(lf!XZ#<^r#&bn4Gs-18SuT9Cj=yFz6K6%rReu+t(`vzD zp#soq^(ZZsQvRkt{7V6`KVkW^|=S6#Q; zz?Q|rHa#eL=LnNiB#>pWSrI~kq)~$`fpCJw3Q8qK2i7zDgT1t#wUnk_Wngt6Bo)$) z&*|NLA5(u`M6!I1?-tDAoBZmGoB1r#N8PBkAc=3c_2H|IJt%x9kJoEE5%#-mLpjYH zU)7zaFPV9M(OTYUxtZQ$3m7-8F^juSr`gY&c``~_m1hQ$QV*F6=rQ&(!=}GP>zaN@ zrh|-rU^Ize?&FzA8^Td_ui6v#45Y^RRCatfj4)y3(EHtKG1pRymbJ-4>&i;^graAPQBr{`XUlIcKl%IHm2Zt5#<`0W#;K=4; zp`Gwh3)4Ff$1?goX0(Py9outc)M?(0-NC2{D~Wkw1*2LBPM(m6HBO}F_!M^Re44z) z{TRKo8Sk$dOPu`sK9q2nF0!CsZ%#b=6CXSgMAqp-{K6b8?l*+|7d~J{i!dZ4B&mX9 zUoK?!S`#m>oQiQu4`zCdDkdX9tb_{ut37YYI`$h*mDsniLX&|j`AUIrqsjeiYpy>QL z3Pm1s9-Bk0_t!8y$%~4D{fzB33jMV2nBD>k%3OGO`C`y(xID8tPit1Nb!0V!?O#tr zc3O+LR;nj5Qs(fymzjAfjtLV-P{*IYp0jSaalaLomlxK-gK?}`b6auUR$3ahn$N#n z&r{VdFy^g!jDIAZ@~>Z_%ZN|Nb;!hZeVtDh4eq#qMXMD)x+KoK@^fb1dy8#hBSh8t8DSMuy^YCxEQexu6<3~vwG?lr- zIuT`noHZYCvh_leeRY68cD3AGxIVrb2DR;p2@_QegE906)cVpZ7ITrqp8h^+WRWMbdg>k`-8dJ;CR9@A6So zq%a@?{K2Kd85o97hzHiZ-DIh~F=-SyJv9`oJ;>cPp26=&vS|NX)bs?nM^3(qQZf}m zw26yC;qQlse<$kLOW5_pF>cftK%FpubiM0v?Uh0b^0)B%;S|Py+7Y!ksJ;F13@E|8 z*#k$`YPv5yP1g^W(6vqkNO$NrV`bYNKHd=Cf>sZBGV;6ybPCRv81e1Y6=Qi3mu;cM z#kg2wH*juoI*q^R%ch0ZDb+?08l!+*17&I%m!Ch9zZR=4mmIG;M1^?($;3wiS@YPY zY{b;22`GX+>G)I(^EVvf$bhq44sOq=u9X4%sSg1A^%SXeWNe?n@QsNq**%pw{hj-; zB5xU=6g+pJs^!sQ*tQK)y9Yt zo4+^s{nAH?qn;zW?_!or`H(d=UT1H&IPAGcC{w6$1ZY8}t-RN~nK=i;7`&+qzCqqV z0ClSUy+!KRuo-@wL(-_Q`1papHzlWjWKYl#*7vFmsSOJH<^Gtb`fXXf9?hA|h>ve@bNfdu++tzece&(UJIkVOai}FgILJHrF%u`Rr|v5sGbrUW zFTJ#p=;uG>Y~FQt4L!#*!+#*^;dlAri?rZ9%S8%l?n^299o}2T≪sab); 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�vzWU%8gW)rn36z&gBQyCYZx(QC%N7( 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/index"}, "@NL80211_ATTR_SCAN_SUPP_RATES": {"cmds": [], "type": "unspec", "desc": "rates per to be advertised as supported in scan nested array attribute containing an entry for each band, with the entry being a list of supported rates as defined by IEEE 802.11 7.3.2.2 but without the length restriction (at most %NL80211_MAX_SUPP_RATES)."}, "@NL80211_ATTR_AKM_SUITES": {"cmds": [], "type": "unspec", "desc": "Used with CONNECT indicate which key management algorithm(s) to use (an array of u32)."}, "@NL80211_ATTR_SCAN_FLAGS": {"cmds": [], "type": "unspec", "desc": "scan request control flags "}, "@NL80211_ATTR_IFTYPE": {"cmds": [], "type": "unspec", "desc": "type of virtual interface"}, "@NL80211_ATTR_MAX_SCAN_IE_LEN": {"cmds": [], "type": "unspec", "desc": "maximum length of information elements that can be added to a scan request"}, "@NL80211_ATTR_FREQ_BEFORE": {"cmds": [], "type": "unspec", "desc": "A channel which has suffered a regulatory change due to considerations from a beacon hint. This attribute reflects the state of the channel _before_ the beacon hint processing. This attributes consists of a nested attribute containing NL80211_FREQUENCY_ATTR_*"}, "@NL80211_ATTR_P2P_OPPPS": {"cmds": [], "type": "unspec", "desc": "P2P GO opportunistic PS START_AP and SET_BSS commands. This can have the values 0 or 1; if not given in START_AP 0 is assumed, if not given in SET_BSS no change is made."}, "@NL80211_ATTR_IE_ASSOC_RESP": {"cmds": ["%NL80211_CMD_NEW_BEACON", "%NL80211_CMD_SET_BEACON"], "type": "unspec", "desc": "Information element Response frames. This is used with %NL80211_CMD_NEW_BEACON and %NL80211_CMD_SET_BEACON to provide extra IEs (e.g., WPS/P2P IE) into (Re)Association Response frames when the driver (or firmware) replies to (Re)Association Request frames."}, "@NL80211_ATTR_MPATH_NEXT_HOP": {"cmds": [], "type": "unspec", "desc": "MAC address of the next hop for a mesh path"}, "@NL80211_ATTR_RXMGMT_FLAGS": {"cmds": [], "type": "unspec", "desc": "flags for nl80211_send_mgmt As specified in the &enum nl80211_rxmgmt_flags."}, "@NL80211_ATTR_MAX_CRIT_PROT_DURATION": {"cmds": [], "type": "unspec", "desc": "duration in milliseconds in which the connection should have increased reliability (u16)."}, "@NL80211_ATTR_STA_LISTEN_INTERVAL": {"cmds": [], "type": "unspec", "desc": "listen interval as defined by IEEE 802.11 7.3.1.6 (u16)."}, "@NL80211_ATTR_FRAME_TYPE": {"cmds": [], "type": "unspec", "desc": "A u16 indicating the frame type @NL80211_CMD_REGISTER_FRAME command."}, "@NL80211_ATTR_REG_RULES": {"cmds": [], "type": "unspec", "desc": "a nested array of regulatory domain regulatory rules."}, "@NL80211_ATTR_STATUS_CODE": {"cmds": [], "type": "unspec", "desc": "StatusCode for the event (u16)"}, "@NL80211_ATTR_VHT_CAPABILITY": {"cmds": [], "type": "unspec", "desc": "VHT Capability information element association request when used with NL80211_CMD_NEW_STATION)"}, "@NL80211_ATTR_CRIT_PROT_ID": {"cmds": [], "type": "unspec", "desc": "critical protocol identifier requiring increased reliability, see &enum nl80211_crit_proto_id (u16)."}, "@NL80211_ATTR_TDLS_ACTION": {"cmds": [], "type": "unspec", "desc": "Low level TDLS action code request, link setup confirm, link teardown, etc.). Values are described in the TDLS (802.11z) specification."}, "@NL80211_ATTR_RESP_IE": {"cmds": [], "type": "unspec", "desc": " sent by peer, for ROAM and successful CONNECT events."}, "@NL80211_ATTR_WDEV": {"cmds": [], "type": "unspec", "desc": "wireless device identifier that don't have a netdev (u64)"}, "@NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS": {"cmds": [], "type": "unspec", "desc": "number of SSIDs you can scan with a single scheduled scan request, a wiphy attribute."}, "@NL80211_ATTR_CONTROL_PORT_ETHERTYPE": {"cmds": [], "type": "unspec", "desc": "A 16 ethertype that will be used for key negotiation. It can be specified with the associate and connect commands. If it is not specified, the value defaults to 0x888E (PAE, 802.1X). This attribute is also used as a flag in the wiphy information to indicate that protocols other than PAE are supported."}, "@NL80211_ATTR_KEY_TYPE": {"cmds": [], "type": "unspec", "desc": "Key Type"}, "@NL80211_ATTR_ROAM_SUPPORT": {"cmds": [], "type": "unspec", "desc": "Indicates whether the firmware is capable of roaming to another AP in the same ESS if the signal lever is low."}, "@NL80211_ATTR_TX_NO_CCK_RATE": {"cmds": ["%NL80211_CMD_TRIGGER_SCAN", "%NL80211_CMD_FRAME"], "type": "unspec", "desc": "Indicates whether to use CCK rate or not for management frames transmission. In order to avoid p2p probe/action frames are being transmitted at CCK rate in 2GHz band, the user space applications use this attribute. This attribute is used with %NL80211_CMD_TRIGGER_SCAN and %NL80211_CMD_FRAME commands."}, "@NL80211_ATTR_MGMT_SUBTYPE": {"cmds": ["%NL80211_CMD_SET_MGMT_EXTRA_IE"], "type": "unspec", "desc": "Management frame subtype for %NL80211_CMD_SET_MGMT_EXTRA_IE."}, "@NL80211_ATTR_RX_FRAME_TYPES": {"cmds": [], "type": "unspec", "desc": "wiphy capability attribute nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing information about which frame types can be registered for RX."}, "@NL80211_ATTR_BSS_BASIC_RATES": {"cmds": [], "type": "unspec", "desc": "basic rates rates in format defined by IEEE 802.11 7.3.2.2 but without the length restriction (at most %NL80211_MAX_SUPP_RATES)."}, "@NL80211_ATTR_IE_PROBE_RESP": {"cmds": ["%NL80211_CMD_NEW_BEACON", "%NL80211_CMD_SET_BEACON"], "type": "unspec", "desc": "Information element This is used with %NL80211_CMD_NEW_BEACON and %NL80211_CMD_SET_BEACON to provide extra IEs (e.g., WPS/P2P IE) into Probe Response frames when the driver (or firmware) replies to Probe Request frames."}, "@NL80211_ATTR_SUPPORTED_IFTYPES": {"cmds": [], "type": "unspec", "desc": "nested attribute containing all supported interface types, each a flag attribute with the number of the interface mode."}, "@NL80211_ATTR_IFINDEX": {"cmds": [], "type": "unspec", "desc": "network interface index of the device to operate on"}, "@NL80211_ATTR_EXT_CAPA_MASK": {"cmds": [], "type": "unspec", "desc": "Extended capabilities that the kernel driver has set in the %NL80211_ATTR_EXT_CAPA value, for multibit fields."}, "@NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION": {"cmds": [], "type": "unspec", "desc": "Device attribute that specifies the maximum duration that can be requested with the remain-on-channel operation, in milliseconds, u32."}, "@NL80211_ATTR_REQ_IE": {"cmds": [], "type": "unspec", "desc": " sent out by the card, for ROAM and successful CONNECT events."}, "@NL80211_ATTR_REKEY_DATA": {"cmds": [], "type": "unspec", "desc": "nested attribute containing the information necessary for GTK rekeying in the device, see &enum nl80211_rekey_data."}, "@NL80211_ATTR_HT_CAPABILITY": {"cmds": [], "type": "unspec", "desc": "HT Capability information element association request when used with NL80211_CMD_NEW_STATION)"}, "@NL80211_ATTR_KEY_DATA": {"cmds": [], "type": "unspec", "desc": " 16 bytes encryption key followed by 8 bytes each for TX and RX MIC keys"}, "@NL80211_ATTR_KEY_DEFAULT": {"cmds": [], "type": "unspec", "desc": "Flag attribute indicating the key is default key"}, "@NL80211_ATTR_MESH_SETUP": {"cmds": [], "type": "unspec", "desc": "Optional mesh setup parameters changed once the mesh is active."}, "@NL80211_ATTR_PMKSA_CANDIDATE": {"cmds": [], "type": "unspec", "desc": "Nested attribute containing the PMKSA caching candidate information, see &enum nl80211_pmksa_candidate_attr."}, "@NL80211_ATTR_WIPHY_RTS_THRESHOLD": {"cmds": [], "type": "unspec", "desc": "RTS threshold larger than or equal to this use RTS/CTS handshake); allowed range: 0..65536, disable with (u32)-1; dot11RTSThreshold; u32"}, "@NL80211_ATTR_DTIM_PERIOD": {"cmds": [], "type": "unspec", "desc": "DTIM period for beaconing"}, "@NL80211_ATTR_MAX_NUM_SCAN_SSIDS": {"cmds": [], "type": "unspec", "desc": "number of SSIDs you can scan with a single scan request, a wiphy attribute."}, "@NL80211_ATTR_MESH_CONFIG": {"cmds": [], "type": "unspec", "desc": "Mesh configuration parameters containing attributes from &enum nl80211_meshconf_params."}, "@NL80211_ATTR_COOKIE": {"cmds": [], "type": "unspec", "desc": "Generic 64"}, "@NL80211_ATTR_MAX_MATCH_SETS": {"cmds": [], "type": "unspec", "desc": "maximum number of sets that can be used with @NL80211_ATTR_SCHED_SCAN_MATCH, a wiphy attribute."}, "@NL80211_ATTR_CH_SWITCH_COUNT": {"cmds": [], "type": "unspec", "desc": "u32 attribute specifying the number of TBTT until the channel switch event."}, "@NL80211_ATTR_OFFCHANNEL_TX_OK": {"cmds": [], "type": "unspec", "desc": "For management frame TX transmitted on another channel when the channel given doesn't match the current channel. If the current channel doesn't match and this flag isn't set, the frame will be rejected. This is also used as an nl80211 capability flag."}, "@NL80211_ATTR_SUPPORT_MESH_AUTH": {"cmds": [], "type": "unspec", "desc": "Currently allows auth frames in a mesh to be passed to userspace for processing via the @NL80211_MESH_SETUP_USERSPACE_AUTH flag."}, "@NL80211_ATTR_REASON_CODE": {"cmds": ["%NL80211_CMD_DISASSOCIATE"], "type": "unspec", "desc": "ReasonCode for %NL80211_CMD_DISASSOCIATE, u16"}, "@NL80211_ATTR_STA_WME": {"cmds": [], "type": "unspec", "desc": "Nested attribute containing the wme configuration of the station, see &enum nl80211_sta_wme_attr."}, "@NL80211_ATTR_AP_ISOLATE": {"cmds": [], "type": "unspec", "desc": " connected to this BSS."}, "@NL80211_ATTR_TESTDATA": {"cmds": [], "type": "unspec", "desc": "Testmode data blob We recommend using nested, driver-specific attributes within this."}, "@NL80211_ATTR_CIPHER_SUITES_PAIRWISE": {"cmds": [], "type": "unspec", "desc": "For crypto settings for connect or other commands, indicates which pairwise cipher suites are used"}, "@NL80211_ATTR_BSS_CTS_PROT": {"cmds": [], "type": "unspec", "desc": "whether CTS protection is enabled "}, "@NL80211_ATTR_BSS_SHORT_SLOT_TIME": {"cmds": [], "type": "unspec", "desc": "whether short slot time enabled (u8, 0 or 1)"}, "@NL80211_ATTR_PEER_AID": {"cmds": [], "type": "unspec", "desc": "Association ID for the peer TDLS station This is similar to @NL80211_ATTR_STA_AID but with a difference of being allowed to be used with the first @NL80211_CMD_SET_STATION command to update a TDLS peer STA entry."}, "@NL80211_ATTR_SPLIT_WIPHY_DUMP": {"cmds": [], "type": "unspec", "desc": "flag attribute receiving the data for a single wiphy split across multiple messages, given with wiphy dump message"}, "@NL80211_ATTR_SUPPORT_IBSS_RSN": {"cmds": [], "type": "unspec", "desc": "The device supports IBSS RSN means support for per-station GTKs."}, "@NL80211_ATTR_IE": {"cmds": ["%NL80211_CMD_SET_MGMT_EXTRA_IE"], "type": "unspec", "desc": "Information element %NL80211_CMD_SET_MGMT_EXTRA_IE)."}, "@NL80211_ATTR_AUTH_TYPE": {"cmds": [], "type": "unspec", "desc": "AuthenticationType represented as a u32"}, "@NL80211_ATTR_BSS": {"cmds": [], "type": "unspec", "desc": "scan result BSS"}, "@NL80211_ATTR_PROBE_RESP_OFFLOAD": {"cmds": [], "type": "unspec", "desc": "Indicates that the HW responds to probe requests while operating in AP-mode. This attribute holds a bitmap of the supported protocols for offloading (see &enum nl80211_probe_resp_offload_support_attr)."}, "@NL80211_ATTR_STA_SUPPORTED_CHANNELS": {"cmds": [], "type": "unspec", "desc": "array of supported channels"}, "@NL80211_ATTR_KEY_SEQ": {"cmds": [], "type": "unspec", "desc": "transmit key sequence number CCMP keys, each six bytes in little endian"}, "@NL80211_ATTR_4ADDR": {"cmds": [], "type": "unspec", "desc": "Use 4"}, "@NL80211_ATTR_TIMED_OUT": {"cmds": ["%NL80211_CMD_AUTHENTICATE"], "type": "unspec", "desc": "a flag indicating than an operation timed out is used, e.g., with %NL80211_CMD_AUTHENTICATE event"}, "@NL80211_ATTR_UNSPEC": {"cmds": [], "type": "unspec", "desc": "unspecified attribute to catch errors"}, "@NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT": {"cmds": [], "type": "unspec", "desc": "When included along with %NL80211_ATTR_CONTROL_PORT_ETHERTYPE, indicates that the custom ethertype frames used for key negotiation must not be encrypted."}, "@NL80211_ATTR_BEACON_TAIL": {"cmds": [], "type": "unspec", "desc": "portion of the beacon after the TIM IE"}, "@NL80211_ATTR_REG_INITIATOR": {"cmds": [], "type": "unspec", "desc": "indicates who requested the regulatory domain currently in effect. This could be any of the %NL80211_REGDOM_SET_BY_*"}, "@NL80211_ATTR_WIPHY_TX_POWER_LEVEL": {"cmds": [], "type": "unspec", "desc": "Transmit power level in signed mBm units This is used in association with @NL80211_ATTR_WIPHY_TX_POWER_SETTING for non-automatic settings."}, "@NL80211_ATTR_ACL_POLICY": {"cmds": [], "type": "unspec", "desc": "ACL policy carried in a u32 attribute"}, "@NL80211_ATTR_SAE_DATA": {"cmds": [], "type": "unspec", "desc": "SAE elements in Authentication frames with the Authentication transaction sequence number field."}, "@NL80211_ATTR_WIPHY_RETRY_LONG": {"cmds": [], "type": "unspec", "desc": "TX retry limit for frames whose length is greater than the RTS threshold; allowed range: 1..255; dot11ShortLongLimit; u8"}, "@NL80211_ATTR_INTERFACE_COMBINATIONS": {"cmds": [], "type": "unspec", "desc": "Nested attribute listing the supported interface combinations. In each nested item, it contains attributes defined in &enum nl80211_if_combination_attrs."}, "@NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX": {"cmds": [], "type": "unspec", "desc": "Bitmap of antennas which are available for configuration as TX antennas via the above parameters."}, "@NL80211_ATTR_KEY_DEFAULT_MGMT": {"cmds": [], "type": "unspec", "desc": "Flag attribute indicating the key is the default management key"}, "@NL80211_ATTR_BSS_HT_OPMODE": {"cmds": [], "type": "unspec", "desc": "HT operation mode "}, "@NL80211_ATTR_BEACON_HEAD": {"cmds": [], "type": "unspec", "desc": "portion of the beacon before the TIM IE"}, "@NL80211_ATTR_KEYS": {"cmds": [], "type": "unspec", "desc": "array of keys for static WEP keys for connect and join_ibss(), key information is in a nested attribute each with %NL80211_KEY_* sub-attributes"}, "@NL80211_ATTR_MDID": {"cmds": [], "type": "unspec", "desc": "Mobility Domain Identifier"}, "@NL80211_ATTR_STA_PLINK_ACTION": {"cmds": [], "type": "unspec", "desc": "action to perform on the mesh peer link (see &enum nl80211_plink_action)."}, "@NL80211_ATTR_ACK": {"cmds": [], "type": "unspec", "desc": "Flag attribute indicating that the frame was acknowledged by the recipient."}, "@NL80211_ATTR_WIPHY_FREQ": {"cmds": [], "type": "unspec", "desc": "frequency of the selected channel in MHz defines the channel together with the (deprecated) %NL80211_ATTR_WIPHY_CHANNEL_TYPE attribute or the attributes %NL80211_ATTR_CHANNEL_WIDTH and if needed %NL80211_ATTR_CENTER_FREQ1 and %NL80211_ATTR_CENTER_FREQ2"}, "@NL80211_ATTR_WPA_VERSIONS": {"cmds": [], "type": "unspec", "desc": "Used with CONNECT indicate which WPA version(s) the AP we want to associate with is using (a u32 with flags from &enum nl80211_wpa_versions)."}, "@NL80211_ATTR_SUPPORT_AP_UAPSD": {"cmds": [], "type": "unspec", "desc": "the device supports uapsd when working as AP."}, "@NL80211_ATTR_SCHED_SCAN_MATCH": {"cmds": [], "type": "unspec", "desc": "Nested attribute with one or more sets of attributes to match during scheduled scans. Only BSSs that match any of the sets will be reported. These are pass-thru filter rules. For a match to succeed, the BSS must match all attributes of a set. Since not every hardware supports matching all types of attributes, there is no guarantee that the reported BSSs are fully complying with the match sets and userspace needs to be able to ignore them by itself. Thus, the implementation is somewhat hardware-dependent, but this is only an optimization and the userspace application needs to handle all the non-filtered results anyway. If the match attributes don't make sense when combined with the values passed in @NL80211_ATTR_SCAN_SSIDS (eg. if an SSID is included in the probe request, but the match attributes will never let it go through), -EINVAL may be returned. If ommited, no filtering is done."}, "@NL80211_ATTR_LOCAL_MESH_POWER_MODE": {"cmds": [], "type": "unspec", "desc": "local mesh STA link defined in &enum nl80211_mesh_power_mode."}, "@NL80211_ATTR_SCHED_SCAN_INTERVAL": {"cmds": [], "type": "unspec", "desc": "Interval between scheduled scan cycles, in msecs."}, "@NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED": {"cmds": [], "type": "unspec", "desc": "indicates capabilities, the supported WoWLAN triggers"}, "@NL80211_ATTR_REG_TYPE": {"cmds": [], "type": "unspec", "desc": "indicates the type of the regulatory domain currently set. This can be one of the nl80211_reg_type (%NL80211_REGDOM_TYPE_*)"}, "@NL80211_ATTR_SUPPORTED_COMMANDS": {"cmds": [], "type": "unspec", "desc": "wiphy attribute that specifies an array of command numbers (i.e. a mapping index to command number) that the driver for the given wiphy supports."}, "@NL80211_ATTR_SCAN_FREQUENCIES": {"cmds": [], "type": "unspec", "desc": "nested attribute with frequencies "}, "@NL80211_ATTR_IFNAME": {"cmds": [], "type": "unspec", "desc": "network interface name"}, "@NL80211_ATTR_CSA_IES": {"cmds": [], "type": "unspec", "desc": "Nested set of attributes containing the IE information for the time while performing a channel switch."}, "@NL80211_ATTR_CONTROL_PORT": {"cmds": ["%NL80211_CMD_ASSOCIATE"], "type": "unspec", "desc": "A flag indicating whether user space controls IEEE 802.1X port, i.e., sets/clears %NL80211_STA_FLAG_AUTHORIZED, in station mode. If the flag is included in %NL80211_CMD_ASSOCIATE request, the driver will assume that the port is unauthorized until authorized by user space. Otherwise, port is marked authorized by default in station mode."}, "@NL80211_ATTR_CSA_C_OFF_PRESP": {"cmds": [], "type": "unspec", "desc": "Offset of the channel switch counter field in the probe response (%NL80211_ATTR_PROBE_RESP)."}, "@NL80211_ATTR_CIPHERS_PAIRWISE": {"cmds": [], "type": "unspec", "desc": "Used with CONNECT to indicate which unicast key ciphers will be used with the connection (an array of u32)."}, "@NL80211_ATTR_WIPHY_ANTENNA_RX": {"cmds": [], "type": "unspec", "desc": "Bitmap of allowed antennas for receiving This can be used to mask out antennas which are not attached or should not be used for receiving. If an antenna is not selected in this bitmap the hardware should not be configured to receive on this antenna. For a more detailed description see @NL80211_ATTR_WIPHY_ANTENNA_TX."}, "@NL80211_ATTR_DISCONNECTED_BY_AP": {"cmds": [], "type": "unspec", "desc": "A flag indicating that the DISCONNECT event was due to the AP disconnecting the station, and not due to a local disconnect request."}, "@NL80211_ATTR_INACTIVITY_TIMEOUT": {"cmds": [], "type": "unspec", "desc": "timeout value in seconds used by the drivers which has MLME in firmware and does not have support to report per station tx/rx activity to free up the staion entry from the list. This needs to be used when the driver advertises the capability to timeout the stations."}, "@NL80211_ATTR_TDLS_SUPPORT": {"cmds": [], "type": "unspec", "desc": "A flag indicating the device can operate as a TDLS peer sta."}, "@NL80211_ATTR_CENTER_FREQ2": {"cmds": [], "type": "unspec", "desc": "Center frequency of the second part of the channel, used only for 80+80 MHz bandwidth"}, "@NL80211_ATTR_STA_EXT_CAPABILITY": {"cmds": [], "type": "unspec", "desc": "Station extended capabilities are advertised to the driver, e.g., to enable TDLS off channel operations and PU-APSD."}, "@NL80211_ATTR_STA_PLINK_STATE": {"cmds": [], "type": "unspec", "desc": "The state of a mesh peer link as defined in &enum nl80211_plink_state. Used when userspace is driving the peer link management state machine. @NL80211_MESH_SETUP_USERSPACE_AMPE or @NL80211_MESH_SETUP_USERSPACE_MPM must be enabled."}, "@NL80211_ATTR_MAC": {"cmds": [], "type": "unspec", "desc": "MAC address "}, "@NL80211_ATTR_CSA_C_OFF_BEACON": {"cmds": [], "type": "unspec", "desc": "Offset of the channel switch counter field in the beacons tail (%NL80211_ATTR_BEACON_TAIL)."}, "@NL80211_ATTR_WIPHY_NAME": {"cmds": [], "type": "unspec", "desc": "wiphy name "}, "@NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX": {"cmds": [], "type": "unspec", "desc": "Bitmap of antennas which are available for configuration as RX antennas via the above parameters."}, "@NL80211_ATTR_CONN_FAILED_REASON": {"cmds": [], "type": "unspec", "desc": "The reason for which AP has rejected the connection request from a station. nl80211_connect_failed_reason enum has different reasons of connection failure."}, "@NL80211_ATTR_CENTER_FREQ1": {"cmds": [], "type": "unspec", "desc": "Center frequency of the first part of the channel, used for anything but 20 MHz bandwidth"}, "@NL80211_ATTR_FRAME": {"cmds": [], "type": "unspec", "desc": "frame data and body, but not FCS; used, e.g., with NL80211_CMD_AUTHENTICATE and NL80211_CMD_ASSOCIATE events"}, "@NL80211_ATTR_SOFTWARE_IFTYPES": {"cmds": [], "type": "unspec", "desc": "Nested attribute %NL80211_ATTR_SUPPORTED_IFTYPES) containing the interface types that are managed in software: interfaces of these types aren't subject to any restrictions in their number or combinations."}, "@NL80211_ATTR_PID": {"cmds": [], "type": "unspec", "desc": "Process ID of a network namespace"}, "@NL80211_ATTR_USE_MFP": {"cmds": ["%NL80211_CMD_ASSOCIATE", "%NL80211_CMD_CONNECT"], "type": "unspec", "desc": "Whether management frame protection used for the association (&enum nl80211_mfp, represented as a u32); this attribute can be used with %NL80211_CMD_ASSOCIATE and %NL80211_CMD_CONNECT requests"}, "@NL80211_ATTR_PS_STATE": {"cmds": [], "type": "unspec", "desc": "powersave state"}, "@NL80211_ATTR_PREV_BSSID": {"cmds": [], "type": "unspec", "desc": "previous BSSID commands to specify using a reassociate frame"}, "@NL80211_ATTR_DISABLE_HT": {"cmds": [], "type": "unspec", "desc": " Force HT capable interfaces to disable this feature. Currently, only supported in mac80211 drivers."}, "@NL80211_ATTR_TX_RATES": {"cmds": ["%NL80211_CMD_SET_TX_BITRATE_MASK"], "type": "unspec", "desc": "Nested set of attributes (enum nl80211_tx_rate_attributes) describing TX rates per band. The enum nl80211_band value is used as the index (nla_type() of the nested data. If a band is not included, it will be configured to allow all rates based on negotiated supported rates information. This attribute is used with %NL80211_CMD_SET_TX_BITRATE_MASK."}, "@NL80211_ATTR_MAC_ADDRS": {"cmds": [], "type": "unspec", "desc": "Array of nested MAC addresses"}, "@NL80211_ATTR_COALESCE_RULE": {"cmds": [], "type": "unspec", "desc": "Coalesce rule information"}, "@NL80211_ATTR_RADAR_EVENT": {"cmds": [], "type": "unspec", "desc": "Type of radar event for notification to userspace contains a value of enum nl80211_radar_event (u32)."}, "@NL80211_ATTR_STA_SUPPORTED_RATES": {"cmds": [], "type": "unspec", "desc": "supported rates rates as defined by IEEE 802.11 7.3.2.2 but without the length restriction (at most %NL80211_MAX_SUPP_RATES)."}, "@NL80211_ATTR_IE_RIC": {"cmds": [], "type": "unspec", "desc": "Resource Information Container Information element"}, "@NL80211_ATTR_STA_FLAGS2": {"cmds": [], "type": "unspec", "desc": "Attribute containing a &struct nl80211_sta_flag_update."}, "@NL80211_ATTR_PRIVACY": {"cmds": [], "type": "unspec", "desc": "Flag attribute that protected APs should be used. This is also used with NEW_BEACON to indicate that the BSS is to use protection."}, "@NL80211_ATTR_WIPHY_COVERAGE_CLASS": {"cmds": [], "type": "unspec", "desc": "Coverage Class as defined by IEEE 802 section 7.3.2.9; dot11CoverageClass; u8"}, "@NL80211_ATTR_BSS_SHORT_PREAMBLE": {"cmds": [], "type": "unspec", "desc": "whether short preamble is enabled (u8, 0 or 1)"}, "@NL80211_ATTR_MCAST_RATE": {"cmds": [], "type": "unspec", "desc": "Multicast tx rate "}, "@NL80211_ATTR_WIPHY_CHANNEL_TYPE": {"cmds": [], "type": "unspec", "desc": "included with NL80211_ATTR_WIPHY_FREQ if HT20 or HT40 are to be used (i.e., HT disabled if not included): NL80211_CHAN_NO_HT = HT not allowed (same as not including) NL80211_CHAN_HT20 = HT20 only NL80211_CHAN_HT40MINUS = secondary channel is below the primary channel NL80211_CHAN_HT40PLUS = secondary channel is above the primary channel This attribute is now deprecated."}, "@NL80211_ATTR_PROBE_RESP": {"cmds": [], "type": "unspec", "desc": "Probe Response template data probe-response frame. The DA field in the 802.11 header is zero-ed out, to be filled by the FW."}, "@NL80211_ATTR_CQM": {"cmds": [], "type": "unspec", "desc": "connection quality monitor configuration in a nested attribute with %NL80211_ATTR_CQM_* sub-attributes."}, "@NL80211_ATTR_DONT_WAIT_FOR_ACK": {"cmds": [], "type": "unspec", "desc": "Used with the driver to not wait for an acknowledgement. Note that due to this, it will also not give a status callback nor return a cookie. This is mostly useful for probe responses to save airtime."}, "@NL80211_ATTR_STA_VLAN": {"cmds": [], "type": "unspec", "desc": "interface index of VLAN interface to move station to, or the AP interface the station was originally added to to."}, "@NL80211_ATTR_FREQ_AFTER": {"cmds": [], "type": "unspec", "desc": "A channel which has suffered a regulatory change due to considerations from a beacon hint. This attribute reflects the state of the channel _after_ the beacon hint processing. This attributes consists of a nested attribute containing NL80211_FREQUENCY_ATTR_*"}, "@NL80211_ATTR_MESH_ID": {"cmds": [], "type": "unspec", "desc": "mesh id "}, "@NL80211_ATTR_DFS_REGION": {"cmds": [], "type": "unspec", "desc": "region for regulatory rules which this country abides to when initiating radiation on DFS channels. A country maps to one DFS region."}, "@NL80211_ATTR_MNTR_FLAGS": {"cmds": [], "type": "unspec", "desc": "flags &enum nl80211_mntr_flags."}, "@NL80211_ATTR_WIPHY_FRAG_THRESHOLD": {"cmds": [], "type": "unspec", "desc": "fragmentation threshold length in octets for frames; allowed range: 256..8000, disable fragmentation with (u32)-1; dot11FragmentationThreshold; u32"}, "@NL80211_ATTR_KEY_CIPHER": {"cmds": [], "type": "unspec", "desc": "key cipher suite section 7.3.2.25.1, e.g. 0x000FAC04)"}, "@NL80211_ATTR_KEY_IDX": {"cmds": [], "type": "unspec", "desc": "key ID "}, "@NL80211_ATTR_P2P_CTWINDOW": {"cmds": [], "type": "unspec", "desc": "P2P GO Client Traffic Window the START_AP and SET_BSS commands"}, "@NL80211_ATTR_TDLS_EXTERNAL_SETUP": {"cmds": ["%NL80211_CMD_TDLS_MGMT", "%NL80211_CMD_TDLS_OPER"], "type": "unspec", "desc": "The TDLS discovery procedures should be performed by sending TDLS packets via %NL80211_CMD_TDLS_MGMT. Otherwise %NL80211_CMD_TDLS_OPER should be used for asking the driver to perform a TDLS operation."}, "@NL80211_ATTR_PROTOCOL_FEATURES": {"cmds": [], "type": "unspec", "desc": "global nl80211 feature flags &enum nl80211_protocol_features, the attribute is a u32."}, "@NL80211_ATTR_MPATH_INFO": {"cmds": ["%NL80211_CMD_GET_MPATH"], "type": "unspec", "desc": "information about a mesh_path info given for %NL80211_CMD_GET_MPATH, nested attribute described at &enum nl80211_mpath_info."}, "@NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN": {"cmds": [], "type": "unspec", "desc": "maximum length of information elements that can be added to a scheduled scan request"}, "@NL80211_ATTR_TDLS_OPERATION": {"cmds": [], "type": "unspec", "desc": "High level TDLS operation &enum nl80211_tdls_operation, represented as a u8."}, "@NL80211_ATTR_FREQ_FIXED": {"cmds": [], "type": "unspec", "desc": "a flag indicating the IBSS should not try to look for other networks on different channels"}, "@NL80211_ATTR_STA_FLAGS": {"cmds": [], "type": "unspec", "desc": "flags &enum nl80211_sta_flags (deprecated, use %NL80211_ATTR_STA_FLAGS2)"}, "@NL80211_ATTR_MAX_NUM_PMKIDS": {"cmds": [], "type": "unspec", "desc": "maximum number of PMKIDs a firmware can cache, a wiphy attribute."}, "@NL80211_ATTR_MAC_ACL_MAX": {"cmds": [], "type": "unspec", "desc": "u32 attribute to advertise the maximum number of MAC addresses that a device can support for MAC ACL"}, "@NL80211_ATTR_STA_AID": {"cmds": [], "type": "unspec", "desc": "Association ID for the station "}, "@NL80211_ATTR_KEY": {"cmds": [], "type": "unspec", "desc": "key information in a nested attribute with %NL80211_KEY_* sub-attributes"}, "@NL80211_ATTR_STA_CAPABILITY": {"cmds": [], "type": "unspec", "desc": "Station capabilities the driver, e.g., to enable TDLS power save (PU-APSD)."}, "@NL80211_ATTR_DEVICE_AP_SME": {"cmds": [], "type": "unspec", "desc": "This u32 attribute may be listed for devices that have AP support to indicate that they have the AP SME integrated with support for the features listed in this attribute, see &enum nl80211_ap_sme_features."}, "@NL80211_ATTR_HIDDEN_SSID": {"cmds": [], "type": "unspec", "desc": "indicates whether SSID is to be hidden from Beacon and Probe Response (when response to wildcard Probe Request); see &enum nl80211_hidden_ssid, represented as a u32"}, "@NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES": {"cmds": [], "type": "unspec", "desc": "array of supported supported operating classes."}, "@NL80211_ATTR_FRAME_MATCH": {"cmds": [], "type": "unspec", "desc": "A binary attribute which typically must contain at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME."}, "@NL80211_ATTR_STA_INFO": {"cmds": ["%NL80211_CMD_GET_STATION"], "type": "unspec", "desc": "information about a station given for %NL80211_CMD_GET_STATION, nested attribute containing info as possible, see &enum nl80211_sta_info."}, "@NL80211_ATTR_GENERATION": {"cmds": [], "type": "unspec", "desc": "Used to indicate consistent snapshots for dumps. This number increases whenever the object list being dumped changes, and as such userspace can verify that it has obtained a complete and consistent snapshot by verifying that all dump messages contain the same generation number. If it changed then the list changed and the dump should be repeated completely from scratch."}, "@NL80211_ATTR_WIPHY_RETRY_SHORT": {"cmds": [], "type": "unspec", "desc": "TX retry limit for frames whose length is less than or equal to the RTS threshold; allowed range: 1..255; dot11ShortRetryLimit; u8"}, "@NL80211_ATTR_CIPHER_GROUP": {"cmds": [], "type": "unspec", "desc": "Used with CONNECT indicate which group key cipher will be used with the connection, a u32"}, "@NL80211_ATTR_DURATION": {"cmds": [], "type": "unspec", "desc": "Duration of an operation in milliseconds"}, "@NL80211_ATTR_BG_SCAN_PERIOD": {"cmds": [], "type": "unspec", "desc": "Background scan period in seconds or 0 to disable background scan."}, "@NL80211_ATTR_WIPHY_BANDS": {"cmds": [], "type": "unspec", "desc": "Information about an operating bands consisting of a nested array."}, "@NL80211_ATTR_CIPHER_SUITES": {"cmds": [], "type": "unspec", "desc": "a set of u32 values indicating the supported cipher suites"}, "@NL80211_ATTR_TDLS_DIALOG_TOKEN": {"cmds": [], "type": "unspec", "desc": "Non TDLS conversation between two devices."}, "@NL80211_ATTR_REG_ALPHA2": {"cmds": [], "type": "unspec", "desc": "an ISO current regulatory domain should be set to or is already set to. For example, 'CR', for Costa Rica. This attribute is used by the kernel to query the CRDA to retrieve one regulatory domain. This attribute can also be used by userspace to query the kernel for the currently set regulatory domain. We chose an alpha2 as that is also used by the IEEE-802.11 country information element to identify a country. Users can also simply ask the wireless core to set regulatory domain to a specific alpha2."}, "@NL80211_ATTR_LOCAL_STATE_CHANGE": {"cmds": [], "type": "unspec", "desc": "Flag attribute to indicate that a command is requesting a local authentication/association state change without invoking actual management frame exchange. This can be used with NL80211_CMD_AUTHENTICATE, NL80211_CMD_DEAUTHENTICATE, NL80211_CMD_DISASSOCIATE."}, "@NL80211_ATTR_USER_REG_HINT_TYPE": {"cmds": [], "type": "unspec", "desc": "type of regulatory hint passed from userspace. If unset it is assumed the hint comes directly from a user. If set code could specify exactly what type of source was used to provide the hint. For the different types of allowed user regulatory hints see nl80211_user_reg_hint_type."}, "@NL80211_ATTR_BEACON_INTERVAL": {"cmds": [], "type": "unspec", "desc": "beacon interval in TU"}, "@NL80211_ATTR_EXT_CAPA": {"cmds": [], "type": "unspec", "desc": "802 has and handles. The format is the same as the IE contents. See 802.11-2012 8.4.2.29 for more information."}, "@NL80211_ATTR_CH_SWITCH_BLOCK_TX": {"cmds": [], "type": "unspec", "desc": "flag attribute specifying that transmission must be blocked on the current channel (before the channel switch operation)."}, "@NL80211_ATTR_WIPHY_TXQ_PARAMS": {"cmds": [], "type": "unspec", "desc": "a nested array of TX queue parameters"}, "@NL80211_ATTR_WOWLAN_TRIGGERS": {"cmds": ["%NL80211_CMD_GET_WOWLAN"], "type": "unspec", "desc": "used by indicate which WoW triggers should be enabled. This is also used by %NL80211_CMD_GET_WOWLAN to get the currently enabled WoWLAN triggers."}, "@NL80211_ATTR_HT_CAPABILITY_MASK": {"cmds": [], "type": "unspec", "desc": "Specify which bits of the ATTR_HT_CAPABILITY to which attention should be paid. Currently, only mac80211 NICs support this feature. The values that may be configured are: MCS rates, MAX-AMSDU, HT-20-40 and HT_CAP_SGI_40 AMPDU density and AMPDU factor. All values are treated as suggestions and may be ignored by the driver as required. The actual values may be seen in the station debugfs ht_caps file."}, "@NL80211_ATTR_TX_FRAME_TYPES": {"cmds": ["%NL80211_CMD_FRAME"], "type": "unspec", "desc": "wiphy capability attribute nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing information about which frame types can be transmitted with %NL80211_CMD_FRAME."}, "@NL80211_ATTR_CIPHER_SUITE_GROUP": {"cmds": [], "type": "unspec", "desc": "For crypto settings for connect or other commands, indicates which group cipher suite is used"}, "@NL80211_ATTR_RX_SIGNAL_DBM": {"cmds": ["%NL80211_CMD_FRAME"], "type": "unspec", "desc": "signal strength in dBm this attribute is (depending on the driver capabilities) added to received frames indicated with %NL80211_CMD_FRAME."}, "@NL80211_ATTR_SSID": {"cmds": [], "type": "unspec", "desc": "SSID "}, "@NL80211_ATTR_KEY_DEFAULT_TYPES": {"cmds": [], "type": "unspec", "desc": "A nested attribute containing flags attributes, specifying what a key should be set as default as. See &enum nl80211_key_default_types."}, "@NL80211_ATTR_SURVEY_INFO": {"cmds": ["%NL80211_CMD_GET_SURVEY"], "type": "unspec", "desc": "survey information about a channel the survey response for %NL80211_CMD_GET_SURVEY, nested attribute containing info as possible, see &enum survey_info."}, "@NL80211_ATTR_WIPHY_TX_POWER_SETTING": {"cmds": [], "type": "unspec", "desc": "Transmit power setting type &enum nl80211_tx_power_setting for possible values."}, "@NL80211_ATTR_WIPHY_ANTENNA_TX": {"cmds": [], "type": "unspec", "desc": "Bitmap of allowed antennas for transmitting This can be used to mask out antennas which are not attached or should not be used for transmitting. If an antenna is not selected in this bitmap the hardware is not allowed to transmit on this antenna. Each bit represents one antenna, starting with antenna 1 at the first bit. Depending on which antennas are selected in the bitmap, 802.11n drivers can derive which chainmasks to use (if all antennas belonging to a particular chain are disabled this chain should be disabled) and if a chain has diversity antennas wether diversity should be used or not. HT capabilities (STBC, TX Beamforming, Antenna selection) can be derived from the available chains after applying the antenna mask. Non-802.11n drivers can derive wether to use diversity or not. Drivers may reject configurations or RX/TX mask combinations they cannot support by returning -EINVAL."}, "@NL80211_ATTR_CHANNEL_WIDTH": {"cmds": [], "type": "unspec", "desc": "u32 attribute containing one of the values of &enum nl80211_chan_width, describing the channel width. See the documentation of the enum for more information."}, "@NL80211_ATTR_NOACK_MAP": {"cmds": [], "type": "unspec", "desc": "This u16 bitmap contains the No Ack Policy of up to 16 TIDs."}, "@NL80211_ATTR_SCAN_SSIDS": {"cmds": [], "type": "unspec", "desc": "nested attribute with SSIDs scanning and include a zero-length SSID (wildcard) for wildcard scan"}, "@NL80211_ATTR_FEATURE_FLAGS": {"cmds": [], "type": "unspec", "desc": "This u32 attribute contains flags from &enum nl80211_feature_flags and is advertised in wiphy information."}, "@NL80211_ATTR_HANDLE_DFS": {"cmds": ["%NL80211_CMD_JOIN_IBSS"], "type": "unspec", "desc": "A flag indicating whether user space controls DFS operation in IBSS mode. If the flag is included in %NL80211_CMD_JOIN_IBSS request, the driver will allow use of DFS channels and reports radar events to userspace. Userspace is required to react to radar events, e.g. initiate a channel switch or leave the IBSS network."}} {"0": ["@NL80211_ATTR_UNSPEC"], "1": ["@NL80211_ATTR_WIPHY"], "2": ["@NL80211_ATTR_WIPHY_NAME"], "3": ["@NL80211_ATTR_IFINDEX"], "4": ["@NL80211_ATTR_IFNAME"], "5": ["@NL80211_ATTR_IFTYPE"], "6": ["@NL80211_ATTR_MAC"], "7": ["@NL80211_ATTR_KEY_DATA"], "8": ["@NL80211_ATTR_KEY_IDX"], "9": ["@NL80211_ATTR_KEY_CIPHER"], "10": ["@NL80211_ATTR_KEY_SEQ"], "11": ["@NL80211_ATTR_KEY_DEFAULT"], "12": ["@NL80211_ATTR_BEACON_INTERVAL"], "13": ["@NL80211_ATTR_DTIM_PERIOD"], "14": ["@NL80211_ATTR_BEACON_HEAD"], "15": ["@NL80211_ATTR_BEACON_TAIL"], "16": ["@NL80211_ATTR_STA_AID"], "17": ["@NL80211_ATTR_STA_FLAGS"], "18": ["@NL80211_ATTR_STA_LISTEN_INTERVAL"], "19": ["@NL80211_ATTR_STA_SUPPORTED_RATES"], "20": ["@NL80211_ATTR_STA_VLAN"], "21": ["@NL80211_ATTR_STA_INFO"], "22": ["@NL80211_ATTR_WIPHY_BANDS"], "23": ["@NL80211_ATTR_MNTR_FLAGS"], "24": ["@NL80211_ATTR_MESH_ID"], "25": ["@NL80211_ATTR_STA_PLINK_ACTION"], "26": ["@NL80211_ATTR_MPATH_NEXT_HOP"], "27": ["@NL80211_ATTR_MPATH_INFO"], "28": ["@NL80211_ATTR_BSS_CTS_PROT"], "29": ["@NL80211_ATTR_BSS_SHORT_PREAMBLE"], "30": ["@NL80211_ATTR_BSS_SHORT_SLOT_TIME"], "31": ["@NL80211_ATTR_HT_CAPABILITY"], "32": ["@NL80211_ATTR_SUPPORTED_IFTYPES"], "33": ["@NL80211_ATTR_REG_ALPHA2"], "34": ["@NL80211_ATTR_REG_RULES"], "35": ["@NL80211_ATTR_MESH_CONFIG"], "36": ["@NL80211_ATTR_BSS_BASIC_RATES"], "37": ["@NL80211_ATTR_WIPHY_TXQ_PARAMS"], "38": ["@NL80211_ATTR_WIPHY_FREQ"], "39": ["@NL80211_ATTR_WIPHY_CHANNEL_TYPE"], "40": ["@NL80211_ATTR_KEY_DEFAULT_MGMT"], "41": ["@NL80211_ATTR_MGMT_SUBTYPE"], "42": ["@NL80211_ATTR_IE"], "43": ["@NL80211_ATTR_MAX_NUM_SCAN_SSIDS"], "44": ["@NL80211_ATTR_SCAN_FREQUENCIES"], "45": ["@NL80211_ATTR_SCAN_SSIDS"], "46": ["@NL80211_ATTR_GENERATION"], "47": ["@NL80211_ATTR_BSS"], "48": ["@NL80211_ATTR_REG_INITIATOR"], "49": ["@NL80211_ATTR_REG_TYPE"], "50": ["@NL80211_ATTR_SUPPORTED_COMMANDS"], "51": ["@NL80211_ATTR_FRAME"], "52": ["@NL80211_ATTR_SSID"], "53": ["@NL80211_ATTR_AUTH_TYPE"], "54": ["@NL80211_ATTR_REASON_CODE"], "55": ["@NL80211_ATTR_KEY_TYPE"], "56": ["@NL80211_ATTR_MAX_SCAN_IE_LEN"], "57": ["@NL80211_ATTR_CIPHER_SUITES"], "58": ["@NL80211_ATTR_FREQ_BEFORE"], "59": ["@NL80211_ATTR_FREQ_AFTER"], "60": ["@NL80211_ATTR_FREQ_FIXED"], "61": ["@NL80211_ATTR_WIPHY_RETRY_SHORT"], "62": ["@NL80211_ATTR_WIPHY_RETRY_LONG"], "63": ["@NL80211_ATTR_WIPHY_FRAG_THRESHOLD"], "64": ["@NL80211_ATTR_WIPHY_RTS_THRESHOLD"], "65": ["@NL80211_ATTR_TIMED_OUT"], "66": ["@NL80211_ATTR_USE_MFP"], "67": ["@NL80211_ATTR_STA_FLAGS2"], "68": ["@NL80211_ATTR_CONTROL_PORT"], "69": ["@NL80211_ATTR_TESTDATA"], "70": ["@NL80211_ATTR_PRIVACY"], "71": ["@NL80211_ATTR_DISCONNECTED_BY_AP"], "72": ["@NL80211_ATTR_STATUS_CODE"], "73": ["@NL80211_ATTR_CIPHER_SUITES_PAIRWISE"], "74": ["@NL80211_ATTR_CIPHER_SUITE_GROUP"], "75": ["@NL80211_ATTR_WPA_VERSIONS"], "76": ["@NL80211_ATTR_AKM_SUITES"], "77": ["@NL80211_ATTR_REQ_IE"], "78": ["@NL80211_ATTR_RESP_IE"], "79": ["@NL80211_ATTR_PREV_BSSID"], "80": ["@NL80211_ATTR_KEY"], "81": ["@NL80211_ATTR_KEYS"], "82": ["@NL80211_ATTR_PID"], "83": ["@NL80211_ATTR_4ADDR"], "84": ["@NL80211_ATTR_SURVEY_INFO"], "85": ["@NL80211_ATTR_PMKID"], "86": ["@NL80211_ATTR_MAX_NUM_PMKIDS"], "87": ["@NL80211_ATTR_DURATION"], "88": ["@NL80211_ATTR_COOKIE"], "89": ["@NL80211_ATTR_WIPHY_COVERAGE_CLASS"], "90": ["@NL80211_ATTR_TX_RATES"], "91": ["@NL80211_ATTR_FRAME_MATCH"], "92": ["@NL80211_ATTR_ACK"], "93": ["@NL80211_ATTR_PS_STATE"], "94": ["@NL80211_ATTR_CQM"], "95": ["@NL80211_ATTR_LOCAL_STATE_CHANGE"], "96": ["@NL80211_ATTR_AP_ISOLATE"], "97": ["@NL80211_ATTR_WIPHY_TX_POWER_SETTING"], "98": ["@NL80211_ATTR_WIPHY_TX_POWER_LEVEL"], "99": ["@NL80211_ATTR_TX_FRAME_TYPES"], "100": ["@NL80211_ATTR_RX_FRAME_TYPES"], "101": ["@NL80211_ATTR_FRAME_TYPE"], "102": ["@NL80211_ATTR_CONTROL_PORT_ETHERTYPE"], "103": ["@NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT"], "104": ["@NL80211_ATTR_SUPPORT_IBSS_RSN"], "105": ["@NL80211_ATTR_WIPHY_ANTENNA_TX"], "106": ["@NL80211_ATTR_WIPHY_ANTENNA_RX"], "107": ["@NL80211_ATTR_MCAST_RATE"], "108": ["@NL80211_ATTR_OFFCHANNEL_TX_OK"], "109": ["@NL80211_ATTR_BSS_HT_OPMODE"], "110": ["@NL80211_ATTR_KEY_DEFAULT_TYPES"], "111": ["@NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION"], "112": ["@NL80211_ATTR_MESH_SETUP"], "113": ["@NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX"], "114": ["@NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX"], "115": ["@NL80211_ATTR_SUPPORT_MESH_AUTH"], "116": ["@NL80211_ATTR_STA_PLINK_STATE"], "117": ["@NL80211_ATTR_WOWLAN_TRIGGERS"], "118": ["@NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED"], "119": ["@NL80211_ATTR_SCHED_SCAN_INTERVAL"], "120": ["@NL80211_ATTR_INTERFACE_COMBINATIONS"], "121": ["@NL80211_ATTR_SOFTWARE_IFTYPES"], "122": ["@NL80211_ATTR_REKEY_DATA"], "123": ["@NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS"], "124": ["@NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN"], "125": ["@NL80211_ATTR_SCAN_SUPP_RATES"], "126": ["@NL80211_ATTR_HIDDEN_SSID"], "127": ["@NL80211_ATTR_IE_PROBE_RESP"], "128": ["@NL80211_ATTR_IE_ASSOC_RESP"], "129": ["@NL80211_ATTR_STA_WME"], "130": ["@NL80211_ATTR_SUPPORT_AP_UAPSD"], "131": ["@NL80211_ATTR_ROAM_SUPPORT"], "132": ["@NL80211_ATTR_SCHED_SCAN_MATCH"], "133": ["@NL80211_ATTR_MAX_MATCH_SETS"], "134": ["@NL80211_ATTR_PMKSA_CANDIDATE"], "135": ["@NL80211_ATTR_TX_NO_CCK_RATE"], "136": ["@NL80211_ATTR_TDLS_ACTION"], "137": ["@NL80211_ATTR_TDLS_DIALOG_TOKEN"], "138": ["@NL80211_ATTR_TDLS_OPERATION"], "139": ["@NL80211_ATTR_TDLS_SUPPORT"], "140": ["@NL80211_ATTR_TDLS_EXTERNAL_SETUP"], "141": ["@NL80211_ATTR_DEVICE_AP_SME"], "142": ["@NL80211_ATTR_DONT_WAIT_FOR_ACK"], "143": ["@NL80211_ATTR_FEATURE_FLAGS"], "144": ["@NL80211_ATTR_PROBE_RESP_OFFLOAD"], "145": ["@NL80211_ATTR_PROBE_RESP"], "146": ["@NL80211_ATTR_DFS_REGION"], "147": ["@NL80211_ATTR_DISABLE_HT"], "148": ["@NL80211_ATTR_HT_CAPABILITY_MASK"], "149": ["@NL80211_ATTR_NOACK_MAP"], "150": ["@NL80211_ATTR_INACTIVITY_TIMEOUT"], "151": ["@NL80211_ATTR_RX_SIGNAL_DBM"], "152": ["@NL80211_ATTR_BG_SCAN_PERIOD"], "153": ["@NL80211_ATTR_WDEV"], "154": ["@NL80211_ATTR_USER_REG_HINT_TYPE"], "155": ["@NL80211_ATTR_CONN_FAILED_REASON"], "156": ["@NL80211_ATTR_SAE_DATA"], "157": ["@NL80211_ATTR_VHT_CAPABILITY"], "158": ["@NL80211_ATTR_SCAN_FLAGS"], "159": ["@NL80211_ATTR_CHANNEL_WIDTH"], "160": ["@NL80211_ATTR_CENTER_FREQ1"], "161": ["@NL80211_ATTR_CENTER_FREQ2"], "162": ["@NL80211_ATTR_P2P_CTWINDOW"], "163": ["@NL80211_ATTR_P2P_OPPPS"], "164": ["@NL80211_ATTR_LOCAL_MESH_POWER_MODE"], "165": ["@NL80211_ATTR_ACL_POLICY"], "166": ["@NL80211_ATTR_MAC_ADDRS"], "167": ["@NL80211_ATTR_MAC_ACL_MAX"], "168": ["@NL80211_ATTR_RADAR_EVENT"], "169": ["@NL80211_ATTR_EXT_CAPA"], "170": ["@NL80211_ATTR_EXT_CAPA_MASK"], "171": ["@NL80211_ATTR_STA_CAPABILITY"], "172": ["@NL80211_ATTR_STA_EXT_CAPABILITY"], "173": ["@NL80211_ATTR_PROTOCOL_FEATURES"], "174": ["@NL80211_ATTR_SPLIT_WIPHY_DUMP"], "177": ["@NL80211_ATTR_MDID"], "178": ["@NL80211_ATTR_IE_RIC"], "179": ["@NL80211_ATTR_CRIT_PROT_ID"], "180": ["@NL80211_ATTR_MAX_CRIT_PROT_DURATION"], "181": ["@NL80211_ATTR_PEER_AID"], "182": ["@NL80211_ATTR_COALESCE_RULE"], "183": ["@NL80211_ATTR_CH_SWITCH_COUNT"], "184": ["@NL80211_ATTR_CH_SWITCH_BLOCK_TX"], "185": ["@NL80211_ATTR_CSA_IES"], "186": ["@NL80211_ATTR_CSA_C_OFF_BEACON"], "187": ["@NL80211_ATTR_CSA_C_OFF_PRESP"], "188": ["@NL80211_ATTR_RXMGMT_FLAGS"], "189": ["@NL80211_ATTR_STA_SUPPORTED_CHANNELS"], "190": ["@NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES"], "191": ["@NL80211_ATTR_HANDLE_DFS"]} diff --git a/pyric/docs/commands.help b/pyric/docs/commands.help index a1859ba..fd06fd7 100644 --- a/pyric/docs/commands.help +++ b/pyric/docs/commands.help @@ -1,5 +1,5 @@ -# commands.help (stored json format) -# Automatically generated 2016-04-17T11:06:57.694132 +# commands.help (stored in json format) +# Automatically generated 2016-04-17T11:06:57.694132 from nl80211.h {"@NL80211_CMD_GET_REG": {"attrs": [], "desc": "ask the wireless core to send us its currently set\tregulatory domain."}, "@NL80211_CMD_STOP_SCHED_SCAN": {"attrs": [], "desc": "stop if scheduled scan is not running."}, "@NL80211_CMD_START_SCHED_SCAN": {"attrs": ["%NL80211_ATTR_SCHED_SCAN_INTERVAL", "%NL80211_ATTR_SCAN_SSIDS", "%NL80211_ATTR_SCAN_FREQUENCIES", "%NL80211_ATTR_IE"], "desc": "start intervals, as specified by %NL80211_ATTR_SCHED_SCAN_INTERVAL. Like with normal scans, if SSIDs (%NL80211_ATTR_SCAN_SSIDS) are passed, they are used in the probe requests. For broadcast, a broadcast SSID must be passed (ie. an empty string). If no SSID is passed, no probe requests are sent and a passive scan is performed. %NL80211_ATTR_SCAN_FREQUENCIES, if passed, define which channels should be scanned; if not passed, all channels allowed for the current regulatory domain are used. Extra IEs can also be passed from the userspace by using the %NL80211_ATTR_IE attribute."}, "@NL80211_CMD_NEW_SURVEY_RESULTS": {"attrs": [], "desc": "survey NL80211_CMD_GET_SURVEY and on the \"scan\" multicast group)"}, "@NL80211_CMD_SET_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_IFTYPE"], "desc": "Set %NL80211_ATTR_IFINDEX and %NL80211_ATTR_IFTYPE."}, "@NL80211_CMD_DISASSOCIATE": {"attrs": [], "desc": "disassociation NL80211_CMD_AUTHENTICATE but for Disassociation frames (similar to MLME-DISASSOCIATE.request and MLME-DISASSOCIATE.indication primitives)."}, "@NL80211_CMD_FRAME": {"attrs": ["%NL80211_ATTR_FRAME", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_DURATION", "%NL80211_ATTR_COOKIE", "%NL80211_ATTR_TX_NO_CCK_RATE"], "desc": "Management command is used both as a request to transmit a management frame and as an event indicating reception of a frame that was not processed in kernel code, but is for us (i.e., which may need to be processed in a user space application). %NL80211_ATTR_FRAME is used to specify the frame contents (including header). %NL80211_ATTR_WIPHY_FREQ is used to indicate on which channel the frame is to be transmitted or was received. If this channel is not the current channel (remain-on-channel or the operational channel) the device will switch to the given channel and transmit the frame, optionally waiting for a response for the time specified using %NL80211_ATTR_DURATION. When called, this operation returns a cookie (%NL80211_ATTR_COOKIE) that will be included with the TX status event pertaining to the TX request. %NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the management frames at CCK rate or not in 2GHz band."}, "@NL80211_CMD_NEW_KEY": {"attrs": ["%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_KEY_CIPHER", "%NL80211_ATTR_KEY_SEQ"], "desc": "add %NL80211_ATTR_KEY_IDX, %NL80211_ATTR_MAC, %NL80211_ATTR_KEY_CIPHER, and %NL80211_ATTR_KEY_SEQ attributes."}, "@NL80211_CMD_STOP_AP": {"attrs": [], "desc": "Stop"}, "@NL80211_CMD_DEL_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX"], "desc": "Virtual %NL80211_ATTR_IFINDEX and %NL80211_ATTR_WIPHY. Can also be sent from userspace to request deletion of a virtual interface, then requires attribute %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNEXPECTED_4ADDR_FRAME": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Sent associated station identified by %NL80211_ATTR_MAC sent a 4addr frame and wasn't already in a 4-addr VLAN. The event will be sent similarly to the %NL80211_CMD_UNEXPECTED_FRAME event, to the same listener."}, "@NL80211_CMD_SET_MESH_CONFIG": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set interface identified by %NL80211_ATTR_IFINDEX"}, "@NL80211_CMD_STOP_P2P_DEVICE": {"attrs": ["%NL80211_ATTR_WDEV"], "desc": "Stop its %NL80211_ATTR_WDEV identifier."}, "@NL80211_CMD_START_P2P_DEVICE": {"attrs": ["%NL80211_ATTR_WDEV"], "desc": "Start its %NL80211_ATTR_WDEV identifier. It must have been created with %NL80211_CMD_NEW_INTERFACE previously. After it has been started, the P2P Device can be used for P2P operations, e.g. remain-on-channel and public action frame TX."}, "@NL80211_CMD_SET_COALESCE": {"attrs": [], "desc": "Configure"}, "@NL80211_CMD_DEL_WIPHY": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_WIPHY_NAME"], "desc": "Wiphy %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME."}, "@NL80211_CMD_SET_STATION": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Set %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_LEAVE_MESH": {"attrs": [], "desc": "Leave network is determined by the network interface."}, "@NL80211_CMD_GET_KEY": {"attrs": ["%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_MAC"], "desc": "Get by %NL80211_ATTR_KEY_IDX and/or %NL80211_ATTR_MAC."}, "@NL80211_CMD_GET_SURVEY": {"attrs": [], "desc": "get"}, "@NL80211_CMD_TDLS_MGMT": {"attrs": [], "desc": "Send"}, "@NL80211_CMD_SET_BSS": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_SET_WOWLAN": {"attrs": ["%NL80211_ATTR_WOWLAN_TRIGGERS"], "desc": "set Since wireless is more complex than wired ethernet, it supports various triggers. These triggers can be configured through this command with the %NL80211_ATTR_WOWLAN_TRIGGERS attribute. For more background information, see http://wireless.kernel.org/en/users/Documentation/WoWLAN. The @NL80211_CMD_SET_WOWLAN command can also be used as a notification from the driver reporting the wakeup reason. In this case, the @NL80211_ATTR_WOWLAN_TRIGGERS attribute will contain the reason for the wakeup, if it was caused by wireless. If it is not present in the wakeup notification, the wireless device didn't cause the wakeup but reports that it was woken up."}, "@NL80211_CMD_NEW_STATION": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Add the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_SET_PMKSA": {"attrs": ["%NL80211_ATTR_PMKID"], "desc": "Add (for the BSSID) and %NL80211_ATTR_PMKID."}, "@NL80211_CMD_SET_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": " destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_DEL_STATION": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Remove or, if no MAC address given, all stations, on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNPROT_DISASSOCIATE": {"attrs": [], "desc": "Unprotected notification. This event is used to indicate that an unprotected disassociation frame was dropped when MFP is in use."}, "@NL80211_CMD_CH_SWITCH_NOTIFY": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_FREQ"], "desc": "An independently of the userspace SME, send this event indicating %NL80211_ATTR_IFINDEX is now on %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width."}, "@NL80211_CMD_SET_KEY": {"attrs": ["%NL80211_ATTR_KEY_DEFAULT_MGMT", "%NL80211_ATTR_KEY_THRESHOLD"], "desc": "Set %NL80211_ATTR_KEY_DEFAULT_MGMT, or %NL80211_ATTR_KEY_THRESHOLD."}, "@NL80211_CMD_SET_MAC_ACL": {"attrs": ["%NL80211_ATTR_MAC_ADDRS", "%NL80211_ATTR_ACL_POLICY"], "desc": "sets This is to be used with the drivers advertising the support of MAC address based access control. List of MAC addresses is passed in %NL80211_ATTR_MAC_ADDRS and ACL policy is passed in %NL80211_ATTR_ACL_POLICY. Driver will enable ACL with this list, if it is not already done. The new list will replace any existing list. Driver will clear its ACL when the list of MAC addresses passed is empty. This command is used in AP/P2P GO mode. Driver has to make sure to clear its ACL list during %NL80211_CMD_STOP_AP."}, "@NL80211_CMD_GET_WOWLAN": {"attrs": [], "desc": "get"}, "@NL80211_CMD_GET_STATION": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Get %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNSPEC": {"attrs": [], "desc": "unspecified"}, "@NL80211_CMD_NEW_PEER_CANDIDATE": {"attrs": [], "desc": "Notification beacon or probe response from a compatible mesh peer. This is only sent while no station information (sta_info) exists for the new peer candidate and when @NL80211_MESH_SETUP_USERSPACE_AUTH, @NL80211_MESH_SETUP_USERSPACE_AMPE, or @NL80211_MESH_SETUP_USERSPACE_MPM is set. On reception of this notification, userspace may decide to create a new station (@NL80211_CMD_NEW_STATION). To stop this notification from reoccurring, the userspace authentication daemon may want to create the new station with the AUTHENTICATED flag unset and maybe change it later depending on the authentication result."}, "@NL80211_CMD_REGISTER_ACTION": {"attrs": [], "desc": "Alias backward compatibility"}, "@NL80211_CMD_REG_CHANGE": {"attrs": ["%NL80211_ATTR_REG_INITIATOR", "%NL80211_ATTR_REG_ALPHA2", "%NL80211_ATTR_REG_TYPE", "%NL80211_ATTR_REG_ALPHA2"], "desc": "indicates has been changed and provides details of the request information that caused the change such as who initiated the regulatory request (%NL80211_ATTR_REG_INITIATOR), the wiphy_idx (%NL80211_ATTR_REG_ALPHA2) on which the request was made from if the initiator was %NL80211_REGDOM_SET_BY_COUNTRY_IE or %NL80211_REGDOM_SET_BY_DRIVER, the type of regulatory domain set (%NL80211_ATTR_REG_TYPE), if the type of regulatory domain is %NL80211_REG_TYPE_COUNTRY the alpha2 to which we have moved on to (%NL80211_ATTR_REG_ALPHA2)."}, "@NL80211_CMD_CONN_FAILED": {"attrs": ["%NL80211_ATTR_CONN_FAILED_REASON"], "desc": "connection notify userspace that AP has rejected the connection request from a station, due to particular reason. %NL80211_ATTR_CONN_FAILED_REASON is used for this."}, "@NL80211_CMD_SCAN_ABORTED": {"attrs": [], "desc": "scan partial scan results may be available"}, "@NL80211_CMD_SET_POWER_SAVE": {"attrs": [], "desc": "Set"}, "@NL80211_CMD_SET_MGMT_EXTRA_IE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MGMT_SUBTYPE", "%NL80211_ATTR_IE"], "desc": "Set interface is identified with %NL80211_ATTR_IFINDEX and the management frame subtype with %NL80211_ATTR_MGMT_SUBTYPE. The extra IE data to be added to the end of the specified management frame is specified with %NL80211_ATTR_IE. If the command succeeds, the requested data will be added to all specified management frames generated by kernel/firmware/driver. Note: This command has been removed and it is only reserved at this point to avoid re-using existing command number. The functionality this command was planned for has been provided with cleaner design with the option to specify additional IEs in NL80211_CMD_TRIGGER_SCAN, NL80211_CMD_AUTHENTICATE, NL80211_CMD_ASSOCIATE, NL80211_CMD_DEAUTHENTICATE, and NL80211_CMD_DISASSOCIATE."}, "@NL80211_CMD_SET_REKEY_OFFLOAD": {"attrs": ["%NL80211_ATTR_REKEY_DATA"], "desc": "This the necessary information for supporting GTK rekey offload. This feature is typically used during WoWLAN. The configuration data is contained in %NL80211_ATTR_REKEY_DATA (which is nested and contains the data in sub-attributes). After rekeying happened, this command may also be sent by the driver as an MLME event to inform userspace of the new replay counter."}, "@NL80211_CMD_SET_CHANNEL": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set and the attributes determining channel width) the given interface (identifed by %NL80211_ATTR_IFINDEX) shall operate on. In case multiple channels are supported by the device, the mechanism with which it switches channels is implementation-defined. When a monitor interface is given, it can only switch channel while no other interfaces are operating to avoid disturbing the operation of any other interfaces, and other interfaces will again take precedence when they are used."}, "@NL80211_CMD_START_AP": {"attrs": ["%NL80211_ATTR_BEACON_INTERVAL", "%NL80211_ATTR_DTIM_PERIOD", "%NL80211_ATTR_SSID", "%NL80211_ATTR_HIDDEN_SSID", "%NL80211_ATTR_CIPHERS_PAIRWISE", "%NL80211_ATTR_CIPHER_GROUP", "%NL80211_ATTR_WPA_VERSIONS", "%NL80211_ATTR_AKM_SUITES", "%NL80211_ATTR_PRIVACY", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_INACTIVITY_TIMEOUT", "%NL80211_ATTR_ACL_POLICY", "%NL80211_ATTR_MAC_ADDRS", "%NL80211_ATTR_WIPHY_FREQ"], "desc": "Start are like for %NL80211_CMD_SET_BEACON, and additionally parameters that do not change are used, these include %NL80211_ATTR_BEACON_INTERVAL, %NL80211_ATTR_DTIM_PERIOD, %NL80211_ATTR_SSID, %NL80211_ATTR_HIDDEN_SSID, %NL80211_ATTR_CIPHERS_PAIRWISE, %NL80211_ATTR_CIPHER_GROUP, %NL80211_ATTR_WPA_VERSIONS, %NL80211_ATTR_AKM_SUITES, %NL80211_ATTR_PRIVACY, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_INACTIVITY_TIMEOUT, %NL80211_ATTR_ACL_POLICY and %NL80211_ATTR_MAC_ADDRS. The channel to use can be set on the interface or be given using the %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width."}, "@NL80211_CMD_DEL_PMKSA": {"attrs": ["%NL80211_ATTR_PMKID"], "desc": "Delete (for the BSSID) and %NL80211_ATTR_PMKID."}, "@NL80211_CMD_UNEXPECTED_FRAME": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Used (or GO) interface (i.e. hostapd) to ask for unexpected frames to implement sending deauth to stations that send unexpected class 3 frames. Also used as the event sent by the kernel when such a frame is received. For the event, the %NL80211_ATTR_MAC attribute carries the TA and other attributes like the interface index are present. If used as the command it must have an interface index and you can only unsubscribe from the event by closing the socket. Subscription is also for %NL80211_CMD_UNEXPECTED_4ADDR_FRAME events."}, "@NL80211_CMD_GET_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Get destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_GET_BEACON": {"attrs": [], "desc": ""}, "@NL80211_CMD_PMKSA_CANDIDATE": {"attrs": [], "desc": "This of PMKSA caching dandidates."}, "@NL80211_CMD_PROBE_CLIENT": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_COOKIE", "%NL80211_ATTR_ACK"], "desc": "Probe by sending a null data frame to it and reporting when the frame is acknowleged. This is used to allow timing out inactive clients. Uses %NL80211_ATTR_IFINDEX and %NL80211_ATTR_MAC. The command returns a direct reply with an %NL80211_ATTR_COOKIE that is later used to match up the event with the request. The event includes the same data and has %NL80211_ATTR_ACK set if the frame was ACKed."}, "@NL80211_CMD_NEW_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFTYPE", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFTYPE", "%NL80211_ATTR_IFNAME"], "desc": "Newly to %NL80211_CMD_GET_INTERFACE. Has %NL80211_ATTR_IFINDEX, %NL80211_ATTR_WIPHY and %NL80211_ATTR_IFTYPE attributes. Can also be sent from userspace to request creation of a new virtual interface, then requires attributes %NL80211_ATTR_WIPHY, %NL80211_ATTR_IFTYPE and %NL80211_ATTR_IFNAME."}, "@NL80211_CMD_SET_TX_BITRATE_MASK": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface and @NL80211_ATTR_TX_RATES the set of allowed rates."}, "@NL80211_CMD_NEW_SCAN_RESULTS": {"attrs": [], "desc": "scan NL80211_CMD_GET_SCAN and on the \"scan\" multicast group)"}, "@NL80211_CMD_GET_WIPHY": {"attrs": [], "desc": "request to get a list of all present wiphys."}, "@NL80211_CMD_SET_NOACK_MAP": {"attrs": [], "desc": "sets No Acknowledgement Policy should be applied."}, "@NL80211_CMD_ACTION": {"attrs": [], "desc": "Alias"}, "@NL80211_CMD_FLUSH_PMKSA": {"attrs": [], "desc": "Flush"}, "@NL80211_CMD_ASSOCIATE": {"attrs": [], "desc": "association NL80211_CMD_AUTHENTICATE but for Association and Reassociation (similar to MLME-ASSOCIATE.request, MLME-REASSOCIATE.request, MLME-ASSOCIATE.confirm or MLME-REASSOCIATE.confirm primitives)."}, "@NL80211_CMD_GET_PROTOCOL_FEATURES": {"attrs": ["%NL80211_ATTR_PROTOCOL_FEATURES"], "desc": "Get i.e. features for the nl80211 protocol rather than device features. Returns the features in the %NL80211_ATTR_PROTOCOL_FEATURES bitmap."}, "@NL80211_CMD_DEAUTHENTICATE": {"attrs": [], "desc": "deauthentication NL80211_CMD_AUTHENTICATE but for Deauthentication frames (similar to MLME-DEAUTHENTICATION.request and MLME-DEAUTHENTICATE.indication primitives)."}, "@NL80211_CMD_CRIT_PROTOCOL_STOP": {"attrs": [], "desc": "Indicates return back to normal."}, "@NL80211_CMD_FT_EVENT": {"attrs": [], "desc": "Send to the supplicant. This will carry the target AP's MAC address along with the relevant Information Elements. This event is used to report received FT IEs (MDIE, FTIE, RSN IE, TIE, RICIE)."}, "@NL80211_CMD_NEW_WIPHY": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_WIPHY_NAME"], "desc": "Newly or rename notification. Has attributes %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME."}, "@NL80211_CMD_UPDATE_FT_IES": {"attrs": [], "desc": "Pass Information Element to the WLAN driver"}, "@NL80211_CMD_SET_WDS_PEER": {"attrs": [], "desc": "Set"}, "@NL80211_CMD_SCHED_SCAN_STOPPED": {"attrs": [], "desc": "indicates stopped. The driver may issue this event at any time during a scheduled scan. One reason for stopping the scan is if the hardware does not support starting an association or a normal scan while running a scheduled scan. This event is also sent when the %NL80211_CMD_STOP_SCHED_SCAN command is received or when the interface is brought down while a scheduled scan was running."}, "@NL80211_CMD_FRAME_TX_STATUS": {"attrs": ["%NL80211_ATTR_COOKIE", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_ACK"], "desc": "Report transmitted with %NL80211_CMD_FRAME. %NL80211_ATTR_COOKIE identifies the TX command and %NL80211_ATTR_FRAME includes the contents of the frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged the frame."}, "@NL80211_CMD_TDLS_OPER": {"attrs": ["%NL80211_ATTR_TDLS_OPERATION", "%NL80211_ATTR_MAC", "%NL80211_ATTR_REASON_CODE"], "desc": "Perform In addition, this can be used as an event to request userspace to take actions on TDLS links (set up a new link or tear down an existing one). In such events, %NL80211_ATTR_TDLS_OPERATION indicates the requested operation, %NL80211_ATTR_MAC contains the peer MAC address, and %NL80211_ATTR_REASON_CODE the reason code to be used (only with %NL80211_TDLS_TEARDOWN)."}, "@NL80211_CMD_GET_SCAN": {"attrs": [], "desc": "get"}, "@NL80211_CMD_SET_WIPHY": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_NAME", "%NL80211_ATTR_WIPHY_TXQ_PARAMS", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_WIPHY_RETRY_SHORT", "%NL80211_ATTR_WIPHY_RETRY_LONG", "%NL80211_ATTR_WIPHY_FRAG_THRESHOLD", "%NL80211_ATTR_WIPHY_RTS_THRESHOLD"], "desc": "set %NL80211_ATTR_IFINDEX; can be used to set %NL80211_ATTR_WIPHY_NAME, %NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ (and the attributes determining the channel width; this is used for setting monitor mode channel), %NL80211_ATTR_WIPHY_RETRY_SHORT, %NL80211_ATTR_WIPHY_RETRY_LONG, %NL80211_ATTR_WIPHY_FRAG_THRESHOLD, and/or %NL80211_ATTR_WIPHY_RTS_THRESHOLD. However, for setting the channel, see %NL80211_CMD_SET_CHANNEL instead, the support here is for backward compatibility only."}, "@NL80211_CMD_AUTHENTICATE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_SSID", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_IE", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_TIMED_OUT", "%NL80211_ATTR_MAC"], "desc": "authentication This command is used both as a command (request to authenticate) and as an event on the \"mlme\" multicast group indicating completion of the authentication process. When used as a command, %NL80211_ATTR_IFINDEX is used to identify the interface. %NL80211_ATTR_MAC is used to specify PeerSTAAddress (and BSSID in case of station mode). %NL80211_ATTR_SSID is used to specify the SSID (mainly for association, but is included in authentication request, too, to help BSS selection. %NL80211_ATTR_WIPHY_FREQ is used to specify the frequence of the channel in MHz. %NL80211_ATTR_AUTH_TYPE is used to specify the authentication type. %NL80211_ATTR_IE is used to define IEs (VendorSpecificInfo, but also including RSN IE and FT IEs) to be added to the frame. When used as an event, this reports reception of an Authentication frame in station and IBSS modes when the local MLME processed the frame, i.e., it was for the local STA and was received in correct state. This is similar to MLME-AUTHENTICATE.confirm primitive in the MLME SAP interface (kernel providing MLME, userspace SME). The included %NL80211_ATTR_FRAME attribute contains the management frame (including both the header and frame body, but not FCS). This event is also used to indicate if the authentication attempt timed out. In that case the %NL80211_ATTR_FRAME attribute is replaced with a %NL80211_ATTR_TIMED_OUT flag (and %NL80211_ATTR_MAC to indicate which pending authentication timed out)."}, "@NL80211_CMD_DEL_PATH": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Remove or, if no MAC address given, all mesh paths, on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_GET_MESH_CONFIG": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Get interface identified by %NL80211_ATTR_IFINDEX"}, "@NL80211_CMD_NEW_PATH": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Add the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_NEW_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_MPATH_NEXT_HOP"], "desc": "Create %NL80211_ATTR_MAC via %NL80211_ATTR_MPATH_NEXT_HOP."}, "@NL80211_CMD_MICHAEL_MIC_FAILURE": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_KEY_TYPE", "%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_KEY_SEQ"], "desc": "notification MIC (part of TKIP) failure; sent on the \"mlme\" multicast group; the event includes %NL80211_ATTR_MAC to describe the source MAC address of the frame with invalid MIC, %NL80211_ATTR_KEY_TYPE to show the key type, %NL80211_ATTR_KEY_IDX to indicate the key identifier, and %NL80211_ATTR_KEY_SEQ to indicate the TSC value of the frame; this event matches with MLME-MICHAELMICFAILURE.indication() primitive"}, "@NL80211_CMD_SET_WIPHY_NETNS": {"attrs": [], "desc": "Set associated with this wiphy must be down and will follow."}, "@NL80211_CMD_DEL_KEY": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "delete or %NL80211_ATTR_MAC."}, "@NL80211_CMD_SET_CQM": {"attrs": [], "desc": "Connection is used to configure connection quality monitoring notification trigger levels."}, "@NL80211_CMD_REMAIN_ON_CHANNEL": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_DURATION", "%NL80211_ATTR_COOKIE"], "desc": "Request channel for the specified amount of time. This can be used to do off-channel operations like transmit a Public Action frame and wait for a response while being associated to an AP on another channel. %NL80211_ATTR_IFINDEX is used to specify which interface (and thus radio) is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the frequency for the operation. %NL80211_ATTR_DURATION is used to specify the duration in milliseconds to remain on the channel. This command is also used as an event to notify when the requested duration starts (it may take a while for the driver to schedule this time due to other concurrent needs for the radio). When called, this operation returns a cookie (%NL80211_ATTR_COOKIE) that will be included with any events pertaining to this request; the cookie is also used to cancel the request."}, "@NL80211_CMD_JOIN_IBSS": {"attrs": ["%NL80211_ATTR_BEACON_INTERVAL"], "desc": "Join FREQ attribute (for the initial frequency if no peer can be found) and optionally a MAC (as BSSID) and FREQ_FIXED attribute if those should be fixed rather than automatically determined. Can only be executed on a network interface that is UP, and fixed BSSID/FREQ may be rejected. Another optional parameter is the beacon interval, given in the %NL80211_ATTR_BEACON_INTERVAL attribute, which if not given defaults to 100 TU (102.4ms)."}, "@NL80211_CMD_REG_BEACON_HINT": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_FREQ_BEFORE", "%NL80211_ATTR_FREQ_AFTER"], "desc": "indicates has been found while world roaming thus enabling active scan or any mode of operation that initiates TX (beacons) on a channel where we would not have been able to do either before. As an example if you are world roaming (regulatory domain set to world or if your driver is using a custom world roaming regulatory domain) and while doing a passive scan on the 5 GHz band you find an AP there (if not on a DFS channel) you will now be able to actively scan for that AP or use AP mode on your card on that same channel. Note that this will never be used for channels 1-11 on the 2 GHz band as they are always enabled world wide. This beacon hint is only sent if your device had either disabled active scanning or beaconing on a channel. We send to userspace the wiphy on which we removed a restriction from (%NL80211_ATTR_WIPHY) and the channel on which this occurred before (%NL80211_ATTR_FREQ_BEFORE) and after (%NL80211_ATTR_FREQ_AFTER) the beacon hint was processed."}, "@NL80211_CMD_CRIT_PROTOCOL_START": {"attrs": [], "desc": "Indicates a critical protocol that needs more reliability in the connection to complete."}, "@NL80211_CMD_UNPROT_DEAUTHENTICATE": {"attrs": [], "desc": "Unprotected notification. This event is used to indicate that an unprotected deauthentication frame was dropped when MFP is in use."}, "@NL80211_CMD_REQ_SET_REG": {"attrs": [], "desc": "ask to the specified ISO/IEC 3166-1 alpha2 country code. The core will store this as a valid request and then query userspace for it."}, "@NL80211_CMD_SCHED_SCAN_RESULTS": {"attrs": [], "desc": "indicates results available."}, "@NL80211_CMD_REGISTER_BEACONS": {"attrs": [], "desc": "Register other BSSes when any interfaces are in AP mode. This helps implement OLBC handling in hostapd. Beacons are reported in %NL80211_CMD_FRAME messages. Note that per PHY only one application may register."}, "@NL80211_CMD_NEW_BEACON": {"attrs": [], "desc": "old"}, "@NL80211_CMD_NOTIFY_CQM": {"attrs": [], "desc": "Connection command is used as an event to indicate the that a trigger level was reached."}, "@NL80211_CMD_TRIGGER_SCAN": {"attrs": ["%NL80211_ATTR_TX_NO_CCK_RATE"], "desc": "trigger %NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the probe requests at CCK rate or not."}, "@NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_COOKIE"], "desc": "This pending remain-on-channel duration if the desired operation has been completed prior to expiration of the originally requested duration. %NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify the radio. The %NL80211_ATTR_COOKIE attribute must be given as well to uniquely identify the request. This command is also used as an event to notify when a requested remain-on-channel duration has expired."}, "@NL80211_CMD_REGISTER_FRAME": {"attrs": [], "desc": "Register (via @NL80211_CMD_FRAME) for processing in userspace. This command requires an interface index, a frame type attribute (optional for backward compatibility reasons, if not given assumes action frames) and a match attribute containing the first few bytes of the frame that should match, e.g. a single byte for only a category match or four bytes for vendor frames including the OUI. The registration cannot be dropped, but is removed automatically when the netlink socket is closed. Multiple registrations can be made."}, "@NL80211_CMD_CHANNEL_SWITCH": {"attrs": ["%NL80211_ATTR_CH_SWITCH_COUNT", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_CH_SWITCH_BLOCK_TX"], "desc": "Perform the new channel information (Channel Switch Announcement - CSA) in the beacon for some time (as defined in the %NL80211_ATTR_CH_SWITCH_COUNT parameter) and then change to the new channel. Userspace provides the new channel information (using %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width). %NL80211_ATTR_CH_SWITCH_BLOCK_TX may be supplied to inform other station that transmission must be blocked until the channel switch is complete."}, "@NL80211_CMD_GET_INTERFACE": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX"], "desc": "Request either a dump request on a %NL80211_ATTR_WIPHY or a specific get on an %NL80211_ATTR_IFINDEX is supported."}, "@NL80211_CMD_RADAR_DETECT": {"attrs": ["%NL80211_ATTR_RADAR_EVENT"], "desc": "Start a radar is detected or the channel availability scan (CAC) has finished or was aborted, or a radar was detected, usermode will be notified with this event. This command is also used to notify userspace about radars while operating on this channel. %NL80211_ATTR_RADAR_EVENT is used to inform about the type of the event."}, "@NL80211_CMD_GET_POWER_SAVE": {"attrs": [], "desc": "Get"}, "@NL80211_CMD_DISCONNECT": {"attrs": ["%NL80211_ATTR_DISCONNECTED_BY_AP", "%NL80211_ATTR_REASON_CODE"], "desc": "drop userspace that a connection was dropped by the AP or due to other reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and %NL80211_ATTR_REASON_CODE attributes are used."}, "@NL80211_CMD_CONNECT": {"attrs": ["%NL80211_ATTR_SSID", "%NL80211_ATTR_IE", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_USE_MFP", "%NL80211_ATTR_MAC", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_CONTROL_PORT", "%NL80211_ATTR_CONTROL_PORT_ETHERTYPE", "%NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT", "%NL80211_ATTR_BG_SCAN_PERIOD"], "desc": "connection requests to connect to a specified network but without separating auth and assoc steps. For this, you need to specify the SSID in a %NL80211_ATTR_SSID attribute, and can optionally specify the association IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_USE_MFP, %NL80211_ATTR_MAC, %NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT, %NL80211_ATTR_CONTROL_PORT_ETHERTYPE and %NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT. Background scan period can optionally be specified in %NL80211_ATTR_BG_SCAN_PERIOD, if not specified default background scan configuration in driver is used and if period value is 0, bg scan will be disabled. This attribute is ignored if driver does not support roam scan. It is also sent as an event, with the BSSID and response IEs when the connection is established or failed to be established. This can be determined by the STATUS_CODE attribute."}, "@NL80211_CMD_SET_BEACON": {"attrs": ["%NL80211_ATTR_BEACON_HEAD", "%NL80211_ATTR_BEACON_TAIL", "%NL80211_ATTR_IE", "%NL80211_ATTR_IE_PROBE_RESP", "%NL80211_ATTR_IE_ASSOC_RESP"], "desc": "change using the %NL80211_ATTR_BEACON_HEAD and %NL80211_ATTR_BEACON_TAIL attributes. For drivers that generate the beacon and probe responses internally, the following attributes must be provided: %NL80211_ATTR_IE, %NL80211_ATTR_IE_PROBE_RESP and %NL80211_ATTR_IE_ASSOC_RESP."}, "@NL80211_CMD_ACTION_TX_STATUS": {"attrs": [], "desc": "Alias backward compatibility."}, "@NL80211_CMD_JOIN_MESH": {"attrs": [], "desc": "Join mesh config parameters may be given."}, "@NL80211_CMD_ROAM": {"attrs": [], "desc": "request sent as an event when the card/driver roamed by itself."}, "@NL80211_CMD_SET_REG": {"attrs": ["%NL80211_ATTR_REG_ALPHA", "%NL80211_ATTR_REG_RULE_FREQ_", "%NL80211_ATTR_FREQ_RANGE_MAX_BW", "%NL80211_ATTR_REG_RULE_POWER_MAX_ANT_GAIN", "%NL80211_ATTR_REG_RULE_POWER_MAX_EIRP"], "desc": "Set after being queried by the kernel. CRDA replies by sending a regulatory domain structure which consists of %NL80211_ATTR_REG_ALPHA set to our current alpha2 if it found a match. It also provides NL80211_ATTR_REG_RULE_FLAGS, and a set of regulatory rules. Each regulatory rule is a nested set of attributes given by %NL80211_ATTR_REG_RULE_FREQ_[START|END] and %NL80211_ATTR_FREQ_RANGE_MAX_BW with an attached power rule given by %NL80211_ATTR_REG_RULE_POWER_MAX_ANT_GAIN and %NL80211_ATTR_REG_RULE_POWER_MAX_EIRP."}, "@NL80211_CMD_GET_COALESCE": {"attrs": [], "desc": "Get"}, "@NL80211_CMD_FRAME_WAIT_CANCEL": {"attrs": [], "desc": "When command may be used with the corresponding cookie to cancel the wait time if it is known that it is no longer necessary."}, "@NL80211_CMD_DEL_BEACON": {"attrs": [], "desc": "old"}, "@NL80211_CMD_LEAVE_IBSS": {"attrs": [], "desc": "Leave determined by the network interface."}, "@NL80211_CMD_SET_MCAST_RATE": {"attrs": [], "desc": "Change for IBSS or MESH vif."}, "@NL80211_CMD_TESTMODE": {"attrs": [], "desc": "testmode to identify the device, and the TESTDATA blob attribute to pass through to the driver."}, "@NL80211_CMD_DEL_MPATH": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Delete %NL80211_ATTR_MAC."}} {"0": "@NL80211_CMD_UNSPEC", "1": "@NL80211_CMD_GET_WIPHY", "2": "@NL80211_CMD_SET_WIPHY", "3": "@NL80211_CMD_NEW_WIPHY", "4": "@NL80211_CMD_DEL_WIPHY", "5": "@NL80211_CMD_GET_INTERFACE", "6": "@NL80211_CMD_SET_INTERFACE", "7": "@NL80211_CMD_NEW_INTERFACE", "8": "@NL80211_CMD_DEL_INTERFACE", "9": "@NL80211_CMD_GET_KEY", "10": "@NL80211_CMD_SET_KEY", "11": "@NL80211_CMD_NEW_KEY", "12": "@NL80211_CMD_DEL_KEY", "13": "@NL80211_CMD_GET_BEACON", "14": "@NL80211_CMD_SET_BEACON", "15": ["@NL80211_CMD_START_AP", "@NL80211_CMD_NEW_BEACON"], "16": ["@NL80211_CMD_STOP_AP", "@NL80211_CMD_DEL_BEACON"], "17": "@NL80211_CMD_GET_STATION", "18": "@NL80211_CMD_SET_STATION", "19": "@NL80211_CMD_NEW_STATION", "20": "@NL80211_CMD_DEL_STATION", "21": "@NL80211_CMD_GET_MPATH", "22": "@NL80211_CMD_SET_MPATH", "23": "@NL80211_CMD_NEW_MPATH", "24": "@NL80211_CMD_DEL_MPATH", "25": "@NL80211_CMD_SET_BSS", "26": "@NL80211_CMD_SET_REG", "27": "@NL80211_CMD_REQ_SET_REG", "28": "@NL80211_CMD_GET_MESH_CONFIG", "29": "@NL80211_CMD_SET_MESH_CONFIG", "30": "@NL80211_CMD_SET_MGMT_EXTRA_IE", "31": "@NL80211_CMD_GET_REG", "32": "@NL80211_CMD_GET_SCAN", "33": "@NL80211_CMD_TRIGGER_SCAN", "34": "@NL80211_CMD_NEW_SCAN_RESULTS", "35": "@NL80211_CMD_SCAN_ABORTED", "36": "@NL80211_CMD_REG_CHANGE", "37": "@NL80211_CMD_AUTHENTICATE", "38": "@NL80211_CMD_ASSOCIATE", "39": "@NL80211_CMD_DEAUTHENTICATE", "40": "@NL80211_CMD_DISASSOCIATE", "41": "@NL80211_CMD_MICHAEL_MIC_FAILURE", "42": "@NL80211_CMD_REG_BEACON_HINT", "43": "@NL80211_CMD_JOIN_IBSS", "44": "@NL80211_CMD_LEAVE_IBSS", "45": "@NL80211_CMD_TESTMODE", "46": "@NL80211_CMD_CONNECT", "47": "@NL80211_CMD_ROAM", "48": "@NL80211_CMD_DISCONNECT", "49": "@NL80211_CMD_SET_WIPHY_NETNS", "50": "@NL80211_CMD_GET_SURVEY", "51": "@NL80211_CMD_NEW_SURVEY_RESULTS", "52": "@NL80211_CMD_SET_PMKSA", "53": "@NL80211_CMD_DEL_PMKSA", "54": "@NL80211_CMD_FLUSH_PMKSA", "55": "@NL80211_CMD_REMAIN_ON_CHANNEL", "56": "@NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL", "57": "@NL80211_CMD_SET_TX_BITRATE_MASK", "58": ["@NL80211_CMD_REGISTER_ACTION", "@NL80211_CMD_REGISTER_FRAME"], "59": ["@NL80211_CMD_FRAME", "@NL80211_CMD_ACTION"], "60": ["@NL80211_CMD_FRAME_TX_STATUS", "@NL80211_CMD_ACTION_TX_STATUS"], "61": "@NL80211_CMD_SET_POWER_SAVE", "62": "@NL80211_CMD_GET_POWER_SAVE", "63": "@NL80211_CMD_SET_CQM", "64": "@NL80211_CMD_NOTIFY_CQM", "65": "@NL80211_CMD_SET_CHANNEL", "66": "@NL80211_CMD_SET_WDS_PEER", "67": "@NL80211_CMD_FRAME_WAIT_CANCEL", "68": "@NL80211_CMD_JOIN_MESH", "69": "@NL80211_CMD_LEAVE_MESH", "70": "@NL80211_CMD_UNPROT_DEAUTHENTICATE", "71": "@NL80211_CMD_UNPROT_DISASSOCIATE", "72": "@NL80211_CMD_NEW_PEER_CANDIDATE", "73": "@NL80211_CMD_GET_WOWLAN", "74": "@NL80211_CMD_SET_WOWLAN", "75": "@NL80211_CMD_START_SCHED_SCAN", "76": "@NL80211_CMD_STOP_SCHED_SCAN", "77": "@NL80211_CMD_SCHED_SCAN_RESULTS", "78": "@NL80211_CMD_SCHED_SCAN_STOPPED", "79": "@NL80211_CMD_SET_REKEY_OFFLOAD", "80": "@NL80211_CMD_PMKSA_CANDIDATE", "81": "@NL80211_CMD_TDLS_OPER", "82": "@NL80211_CMD_TDLS_MGMT", "83": "@NL80211_CMD_UNEXPECTED_FRAME", "84": "@NL80211_CMD_PROBE_CLIENT", "85": "@NL80211_CMD_REGISTER_BEACONS", "86": "@NL80211_CMD_UNEXPECTED_4ADDR_FRAME", "87": "@NL80211_CMD_SET_NOACK_MAP", "88": "@NL80211_CMD_CH_SWITCH_NOTIFY", "89": "@NL80211_CMD_START_P2P_DEVICE", "90": "@NL80211_CMD_STOP_P2P_DEVICE", "91": "@NL80211_CMD_CONN_FAILED", "92": "@NL80211_CMD_SET_MCAST_RATE", "93": "@NL80211_CMD_SET_MAC_ACL", "94": "@NL80211_CMD_RADAR_DETECT", "95": "@NL80211_CMD_GET_PROTOCOL_FEATURES", "96": "@NL80211_CMD_UPDATE_FT_IES", "97": "@NL80211_CMD_FT_EVENT", "98": "@NL80211_CMD_CRIT_PROTOCOL_START", "99": "@NL80211_CMD_CRIT_PROTOCOL_STOP", "100": "@NL80211_CMD_GET_COALESCE", "101": "@NL80211_CMD_SET_COALESCE", "102": "@NL80211_CMD_CHANNEL_SWITCH"} \ No newline at end of file diff --git a/pyric/docs/nlhelp.py b/pyric/docs/nlhelp.py index 46a8603..356dc4e 100644 --- a/pyric/docs/nlhelp.py +++ b/pyric/docs/nlhelp.py @@ -32,7 +32,7 @@ __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' +__status__ = 'Production' import os import json diff --git a/pyric/lib/__init__.py b/pyric/lib/__init__.py index b65ddbc..3f81618 100644 --- a/pyric/lib/__init__.py +++ b/pyric/lib/__init__.py @@ -45,4 +45,4 @@ __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' \ No newline at end of file +__status__ = 'Production' \ No newline at end of file diff --git a/pyric/lib/libio.py b/pyric/lib/libio.py index e6224c4..c652211 100644 --- a/pyric/lib/libio.py +++ b/pyric/lib/libio.py @@ -31,7 +31,7 @@ __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' +__status__ = 'Production' import socket import struct @@ -44,11 +44,11 @@ def io_socket_alloc(): create a socket for ioctl calls :returns: an io socket """ - return socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + return socket.socket(socket.AF_INET,socket.SOCK_DGRAM) -def io_socket_free(sock): +def io_socket_free(iosock): """ close the socket """ - if sock: sock.close() + if iosock: iosock.close() return None def io_transfer(iosock,flag,ifreq): diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 02e0184..e2b3190 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -37,7 +37,7 @@ __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' +__status__ = 'Production' from time import time from os import getpid,strerror diff --git a/pyric/net/__init__.py b/pyric/net/__init__.py index 3b2cb56..3f9f2dd 100644 --- a/pyric/net/__init__.py +++ b/pyric/net/__init__.py @@ -42,5 +42,5 @@ __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' +__status__ = 'Production' diff --git a/pyric/net/genetlink_h.py b/pyric/net/genetlink_h.py index be29629..cffdf00 100644 --- a/pyric/net/genetlink_h.py +++ b/pyric/net/genetlink_h.py @@ -79,7 +79,6 @@ def genlmsghdr(cmd,vers=1): GENL_ID_VFS_DQUOT = GENL_ID_CTRL + 1 GENL_ID_PMCRAID = GENL_ID_CTRL + 2 - #Controller CTRL_CMD_UNSPEC = 0 CTRL_CMD_NEWFAMILY = 1 diff --git a/pyric/net/if_h.py b/pyric/net/if_h.py index 1f8f9f2..0dd6318 100644 --- a/pyric/net/if_h.py +++ b/pyric/net/if_h.py @@ -1,5 +1,4 @@ #!/usr/bin/env python - """ sockios_h.py: definitions for INET interface module /* diff --git a/pyric/net/netlink_h.py b/pyric/net/netlink_h.py index dab9830..c230bc7 100644 --- a/pyric/net/netlink_h.py +++ b/pyric/net/netlink_h.py @@ -45,7 +45,7 @@ __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' +__status__ = 'Production' import struct diff --git a/pyric/net/policy.py b/pyric/net/policy.py index 67f10ef..8cbd7f1 100644 --- a/pyric/net/policy.py +++ b/pyric/net/policy.py @@ -33,7 +33,7 @@ __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' +__status__ = 'Production' import pyric.net.netlink_h as nlh import pyric.net.genetlink_h as genlh diff --git a/pyric/net/sockios_h.py b/pyric/net/sockios_h.py index 40f2125..dd9c901 100644 --- a/pyric/net/sockios_h.py +++ b/pyric/net/sockios_h.py @@ -39,7 +39,7 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. -Most of these constants are not used but are left for possible future use. +Most of these constants are not used but are left as is for possible future use. """ diff --git a/pyric/net/wireless/__init__.py b/pyric/net/wireless/__init__.py index 94c2ff4..5188d3c 100644 --- a/pyric/net/wireless/__init__.py +++ b/pyric/net/wireless/__init__.py @@ -33,4 +33,4 @@ __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' \ No newline at end of file +__status__ = 'Production' \ No newline at end of file diff --git a/pyric/net/wireless/nl80211_c.py b/pyric/net/wireless/nl80211_c.py index 6dba580..247d8ca 100644 --- a/pyric/net/wireless/nl80211_c.py +++ b/pyric/net/wireless/nl80211_c.py @@ -31,7 +31,7 @@ __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' +__status__ = 'Production' import struct import pyric.net.netlink_h as nlh diff --git a/pyric/net/wireless/nl80211_h.py b/pyric/net/wireless/nl80211_h.py index 141d5ee..62ea596 100644 --- a/pyric/net/wireless/nl80211_h.py +++ b/pyric/net/wireless/nl80211_h.py @@ -57,7 +57,7 @@ __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' +__status__ = 'Production' import struct diff --git a/pyric/pyw.py b/pyric/pyw.py index 8dbc7e1..95681d5 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -107,7 +107,7 @@ def _nlstub_(fct,*argv): __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' +__status__ = 'Production' import struct # ioctl unpacking import pyric # pyric exception @@ -613,7 +613,7 @@ def down(card, *argv): #### INFO RELATED #### -def devfreqs(card,*argv): +def devfreqs(card, *argv): """ returns card's supported frequencies :param card: Card object @@ -623,11 +623,11 @@ def devfreqs(card,*argv): try: nlsock = argv[0] except IndexError: - return _nlstub_(devfreqs,card) + return _nlstub_(devfreqs, card) - return phyinfo(card,nlsock)['freqs'] + return phyinfo(card, nlsock)['freqs'] -def devchs(card,*argv): +def devchs(card, *argv): """ returns card's supported channels :param card: Card object @@ -637,9 +637,9 @@ def devchs(card,*argv): try: nlsock = argv[0] except IndexError: - return _nlstub_(devchs,card) + return _nlstub_(devchs, card) - return map(channels.rf2ch,phyinfo(card,nlsock)['freqs']) + return map(channels.rf2ch, phyinfo(card, nlsock)['freqs']) def devstds(card, *argv): """ @@ -656,8 +656,8 @@ def devstds(card, *argv): try: flag = sioch.SIOCGIWNAME ret = io.io_transfer(iosock, flag,ifh.ifreq(card.dev, flag)) - stds = ret[ifh.IFNAMELEN:] # get the standards - stds = stds[:stds.find('\x00')] # remove nulls + stds = ret[ifh.IFNAMELEN:] # get the standards + stds = stds[:stds.find('\x00')] # remove nulls stds = stds.replace('IEEE 802.11', '') # remove IEEE 802.11 return [std for std in stds] except AttributeError as e: @@ -845,7 +845,7 @@ def chget(card, *argv): return _nlstub_(chget, card) return channels.rf2ch(devinfo(card, nlsock)['RF']) -def chset(card, ch, chw=None, *argv): +def chset(card, ch, chw, *argv): """ REQUIRES ROOT PRIVILEGES sets current channel on device (iw phy set channel ) diff --git a/pyric/rfkill.py b/pyric/rfkill.py index 148faba..d886f83 100644 --- a/pyric/rfkill.py +++ b/pyric/rfkill.py @@ -40,6 +40,13 @@ Implements userspace program rfkill in Python to query the state of rfkill switches +NOTE: + o rfkill_block will block all devices regardless of index, however, the blocked + state will only shown in device that was submitted for blocking - this is the + same behavior seen in rfkill block + - this may be due to bug in ubuntu and not present in other distros + o rfkill does not do sanity checks on the index, rfkill.py will through error + if the index does not exist """ """ @@ -60,7 +67,7 @@ __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' +__status__ = 'Production' import os import struct @@ -168,6 +175,8 @@ def rfkill_block(idx): blocks the device at index :param idx: rkill index """ + if not os.path.exists(os.path.join(spath,"rfkill{0}".format(idx))): + raise pyric.error(errno.ENODEV,"No device at {0}".format(idx)) fout = None try: rfke = rfkill_event(idx,RFKILL_TYPE_ALL,RFKILL_OP_CHANGE,1,0) @@ -180,20 +189,99 @@ def rfkill_block(idx): finally: if fout: fout.close() +def rfkill_blockby(rtype): + """ + blocks the device of type + :param rtype: rfkill type one of {'all'|'wlan'|'bluetooth'|'uwb'|'wimax' + |'wwan'|'gps'|'fm'|'nfc'} + """ + rfks = rfkill_list() + for name in rfks: + if rfks[name]['type'] == rtype: + rfkill_block(rfks[name]['idx']) + def rfkill_unblock(idx): """ unblocks the device at index :param idx: rkill index """ - pass + if not os.path.exists(os.path.join(spath, "rfkill{0}".format(idx))): + raise pyric.error(errno.ENODEV, "No device at {0}".format(idx)) + fout = None + try: + rfke = rfkill_event(idx,RFKILL_TYPE_ALL,RFKILL_OP_CHANGE,0,0) + fout = open(dpath, 'w') + fout.write(rfke) + except struct.error as e: + raise pyric.error(pyric.EUNDEF,"Error packing rfkill event {0}".format(e)) + except IOError as e: + raise pyric.error(e.errno,e.message) + finally: + if fout: fout.close() def rfkill_unblockby(rtype): """ - blocks the device of type + unblocks the device of type :param rtype: rfkill type one of {'all'|'wlan'|'bluetooth'|'uwb'|'wimax' |'wwan'|'gps'|'fm'|'nfc'} """ - pass + if rtype not in RFKILL_TYPES: + raise pyric.error(errno.EINVAL,"Type {0} is not valid".format(rtype)) + rfks = rfkill_list() + for name in rfks: + if rfks[name]['type'] == rtype: + rfkill_unblock(rfks[name]['idx']) + +def soft_blocked(idx): + """ + determines soft block state of device + :param idx: rkill index + :returns: True if device at idx is soft blocked, False otherwise + """ + if not os.path.exists(os.path.join(spath,"rfkill{0}".format(idx))): + raise pyric.error(errno.ENODEV,"No device at {0}".format(idx)) + fin = None + try: + fin = open(os.path.join(spath,"rfkill{0}".format(idx),'soft'),'r') + return int(fin.read().strip()) == 1 + except IOError: + raise pyric.error(errno.ENODEV,"No device at {0}".format(idx)) + except ValueError: + raise pyric.error(pyric.EUNDEF,"Unexpected error") + finally: + if fin: fin.close() + +def hard_blocked(idx): + """ + determines hard block state of device + :param idx: rkill index + :returns: True if device at idx is hard blocked, False otherwise + """ + if not os.path.exists(os.path.join(spath,"rfkill{0}".format(idx))): + raise pyric.error(errno.ENODEV,"No device at {0}".format(idx)) + fin = None + try: + fin = open(os.path.join(spath,"rfkill{0}".format(idx),'hard'),'r') + return int(fin.read().strip()) == 1 + except IOError: + raise pyric.error(errno.ENODEV,"No device at {0}".format(idx)) + except ValueError: + raise pyric.error(pyric.EUNDEF,"Unexpected error") + finally: + if fin: fin.close() + +def getidx(phy): + """ + returns the rfkill index associated with the physical index + :param phy: phyiscal index + :returns: the rfkill index + """ + phy = "phy{0}".format(phy) + rfks = rfkill_list() + try: + return rfks["phy{0}".format(phy)]['idx'] + except KeyError: + return None def getname(idx): """ @@ -206,7 +294,7 @@ def getname(idx): fin = open(os.path.join(spath,"rfkill{0}".format(idx),'name'),'r') return fin.read().strip() except IOError: - raise pyric.error(errno.EINVAL,"No such device") + raise pyric.error(errno.EINVAL,"No device at {0}".format(idx)) finally: if fin: fin.close() @@ -221,6 +309,6 @@ def gettype(idx): fin = open(os.path.join(spath,"rfkill{0}".format(idx),'type'),'r') return fin.read().strip() except IOError: - raise pyric.error(errno.EINVAL,"No such device") + raise pyric.error(errno.ENODEV,"No device at {0}".format(idx)) finally: if fin: fin.close() \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index 298f1e6..5e831dd 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,3 +1,4 @@ +# pip distribution [bdist_wheel] universal=1 description-file = README.md \ No newline at end of file diff --git a/setup.py b/setup.py index 223f887..00af85b 100644 --- a/setup.py +++ b/setup.py @@ -24,29 +24,28 @@ #__name__ = 'setup' __license__ = 'GPLv3' -__version__ = '0.0.2' -__date__ = 'May 2016' +__version__ = '0.0.3' +__date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' -__status__ = 'Development' +__status__ = 'Production' from setuptools import setup, find_packages import pyric - long_desc = """ - PyRIC provides the ability to -manipuate, identify and enumerate your system's wireless cards. It is a pure -python port of a subset of the functionality provided by iw, ifconfig and iwconfig. -PyRIC is: -* Pythonic: No ctypes, SWIG etc. PyRIC redefines C header files as Python and -uses sockets to communicate with kernel. -* Self-sufficient: No third-party files used, PyRIC is completely self-contained -* Fast: (relatively speaking) PyRIC is faster than using iw through subprocess.Popen -* Parse(less): Get the output you without parsing output from iw. Never worry about -iw updates and rewriting your parsers. -* Easy: If you can use iw, you can use PyRIC + PyRIC provides the ability to manipuate, identify and enumerate your system's + wireless cards. It is a pure python port of a subset of the functionality provided + by iw, ifconfig, iwconfig and rfkill. + PyRIC is: + * Pythonic: No ctypes, SWIG etc. PyRIC redefines C header files as Python and + uses sockets to communicate with kernel. + * Self-sufficient: No third-party files used, PyRIC is completely self-contained + * Fast: (relatively speaking) PyRIC is faster than using iw through subprocess.Popen + * Parseless: Get the output you without parsing output from iw. Never worry about + iw updates and rewriting your parsers. + * Easy: If you can use iw, you can use PyRIC """ setup(name='PyRIC', @@ -60,9 +59,11 @@ maintainer=pyric.__maintainer__, maintainer_email=pyric.__email__, license=pyric.__license__, - classifiers=['Development Status :: 4 - Beta', + classifiers=['Development Status :: 5 - Production/Stable', 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', 'Intended Audience :: Developers', + 'Intended Audience :: System Administrators', + 'Topic :: Security', 'Topic :: Software Development', 'Topic :: Software Development :: Libraries', 'Topic :: Security', @@ -72,7 +73,7 @@ 'Programming Language :: Python', 'Programming Language :: Python :: 2.7' ], - keywords='nl80211 iw developement wireless pentest', + keywords='nl80211 iw wireless pentest', packages=find_packages(), package_data={'pyric':['docs/*.help']} ) diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index ba9cac1..11f017e 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -1,5 +1,6 @@ #!/usr/bin/env python """ pyw.unittest.py: unittest + Define unittest functions for pyw Assumptions: From 0db925f182881e7581e764609f9d4ae10d3468d9 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 4 Jun 2016 08:39:13 -0600 Subject: [PATCH 012/121] 0.1.1 Restructured hierarchy --- .gitignore | 1 + MANIFEST.in | 12 +- PyRIC.pdf | Bin 383056 -> 0 bytes README.md | 90 +- RFI | 117 - TODO | 122 +- {guide => docs}/PyRIC.bib | 0 {guide => docs}/PyRIC.tex | 0 {guide => docs}/nlsend.png | Bin {guide => docs}/nlsock.png | Bin examples/device_details.py | 12 +- examples/pentest.py | 12 +- pyric/__init__.py | 22 +- pyric/net/wireless/__init__.py | 2 +- pyric/net/wireless/rfkill_h.py | 134 + pyric/{docs => nlhelp}/__init__.py | 12 +- pyric/{docs => nlhelp}/attributes.help | 0 pyric/{docs => nlhelp}/commands.help | 0 pyric/{docs/nlhelp.py => nlhelp/nlsearch.py} | 0 pyric/pyw.py | 55 +- pyric/utils/__init__.py | 37 + pyric/{ => utils}/channels.py | 0 pyric/utils/data/oui.txt | 22132 +++++++++++++++++ pyric/{device.py => utils/hardware.py} | 75 +- pyric/utils/ouifetch.py | 110 + pyric/{ => utils}/rfkill.py | 124 +- setup.py | 10 +- tests/pyw.unittest.py | 2 +- 28 files changed, 22754 insertions(+), 327 deletions(-) delete mode 100644 PyRIC.pdf delete mode 100644 RFI rename {guide => docs}/PyRIC.bib (100%) rename {guide => docs}/PyRIC.tex (100%) rename {guide => docs}/nlsend.png (100%) rename {guide => docs}/nlsock.png (100%) create mode 100644 pyric/net/wireless/rfkill_h.py rename pyric/{docs => nlhelp}/__init__.py (87%) rename pyric/{docs => nlhelp}/attributes.help (100%) rename pyric/{docs => nlhelp}/commands.help (100%) rename pyric/{docs/nlhelp.py => nlhelp/nlsearch.py} (100%) create mode 100644 pyric/utils/__init__.py rename pyric/{ => utils}/channels.py (100%) create mode 100644 pyric/utils/data/oui.txt rename pyric/{device.py => utils/hardware.py} (71%) create mode 100644 pyric/utils/ouifetch.py rename pyric/{ => utils}/rfkill.py (66%) diff --git a/.gitignore b/.gitignore index 677c41a..eb21fdd 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ dist/ downloads/ eggs/ .eggs/ +# lib -> commented out as we use lib lib64/ parts/ sdist/ diff --git a/MANIFEST.in b/MANIFEST.in index 68fde43..b49c2c7 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,10 +1,8 @@ -# Include license, README, channels, device, rfkill, pyw and user guide -include LICENSE README.md __init__.py channels.py device.py rfkill.py pyw.py PyRIC.pdf TODO RFI +# setup paramaters +include LICENSE README.md TODO # Include subdirectories -# device_details.py was not being included without the below recursive include -recursive-include lib net examples docs tests guide +recursive-include examples recursive-include examples *.py -recursive-include docs *.help -recursive-include tests *.py -recursive-include guide *.tex *.bib *.png \ No newline at end of file +recursive-include docs *.pdf +recursive-include pyric/utils/data *.txt \ No newline at end of file diff --git a/PyRIC.pdf b/PyRIC.pdf deleted file mode 100644 index 017a61b8c7b9c6aaab27a5d6b9088f923f8774b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383056 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 z 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

*a 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 diff --git a/README.md b/README.md index 2ef0741..2745f87 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # PyRIC: Python Radio Interface Controller -## Pythonic iw (and more) for the Wireless Pentester +## Linux wireless library for the Python Wireless Developer and Pentester [![License: GPLv3](https://img.shields.io/pypi/l/PyRIC.svg)](https://github.com/wraith-wireless/PyRIC/blob/master/LICENSE) [![Current version at PyPI](https://img.shields.io/pypi/v/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) @@ -8,26 +8,30 @@ ![Software status](https://img.shields.io/pypi/status/PyRIC.svg) ## 1 DESCRIPTION: -BLUF: Why use subprocess.Popen, regular expressions and str.find to interact -with your Wireless Network Interface Card. PyRIC provides the ability to -manipulate, identify and enumerate your system's wireless cards. It is a pure -python port of a subset of the functionality provided by iw, ifconfig and iwconfig. -PyRIC is: -* Pythonic: No ctypes, SWIG etc. PyRIC redefines C header files as Python and -uses netlink (or ioctl) sockets to communicate directly with the kernel. -* Self-sufficient: No third-party files used, PyRIC is completely self-contained -* Fast: (relatively speaking) PyRIC is faster than using iw through subprocess.Popen -* Small: PyRIC is roughly 420kB -* Parseless: Get the output you want without parsing output from iw. Never worry -about iw updates and rewriting your parsers. -* Easy: If you can use iw, you can use PyRIC - -PyRIC is primarliy and originally a port of a subset of iw but has evolved in -an attempt to meet the needs of wireless pentesting as it relates to wireless -network cards. In addition to providing iw related functions, PyRIC implements: -* ifconfig functionality such as mac address, ip address, netmask and broadcast -setting and getting -* rfkill list, block and unblock +PyRIC (is a Linux only) library providing wireless developers and pentesters the +ability to identify, enumerate and manipulate their system's wireless cards +programmatically in Python. Pentesting applications and scripts written in Python +have increased dramatically in recent years. However, these tools still rely on +Linux command lines tools to setup and prepare and restore the system for use. +Until now. Why use subprocess.Popen, regular expressions and str.find to interact +with your wireless cards? PyRIC is: +1. Pythonic: no ctypes, SWIG etc. PyRIC redefines C header files as Python and +uses sockets to communicate with the kernel. +2. Self-sufficient: No third-party files used. PyRIC is completely self-contained. +3. Fast: (relatively speaking) PyRIC is faster than using command line tools +through subprocess.Popen +4. Parseless: Get the output you want without parsing output from command line +tools. Never worry about newer iw versions and having to rewrite your parsers. +5. Easy: If you can use iw, you can use PyRIC. + +At it's heart, PyRIC is a Python port of (a subset of) iw and by extension, a +Python port of Netlink w.r.t nl80211 functionality. The original goal of PyRIC +was to provide a simple interface to the underlying nl80211 kernel support, +handling the complex operations of Netlink seamlessy while maintaining a minimum +of "code walking" to understand, modify and extend. But, why stop there? Since +it's initial inception, PyRIC has grown to include ioctl support to replicate +features of ifconfig such as getting or setting the mac address and has recently +implemented rkill support to soft block or unblock wireless cards. ### a. Background PyRIC arose out of a need in Wraith (https://github.com/wraith-wireless/wraith) @@ -115,18 +119,13 @@ To avoid confusion, PyRIC is the system as a whole, including all header files and "libraries" that are required to communicate with the kernel. pyw is a interface to these libraries providing specific funtions. -What it does - defines programmatic access to a subset of iw, ifconfig and iwconfig. +What it does - defines programmatic access to a subset of iw, ifconfig and rkill. In short, PyRIC provides Python wireless pentesters the ability to work with wireless cards directly from Python without having to use command line tools through Popen. ## 2. INSTALLING/USING: -Starting with version 0.0.6, the structure (see Section 4) has changed to facilitate -packaging on PyPI. This restructing has of course led to some minor difficulties -especially when attempting to install (or even just test) outside of a pip -installation. - ### a. Requirements PyRIC has only two requirements: Linux and Python. There has been very little testing (on my side) on kernel 4.x and Python 3 but unit testing confirms @@ -172,7 +171,7 @@ https://github.com/wraith-wireless/pyric/releases/ It is not guaranteed to be st (as I tend to commit changes periodically while working on the code) and may in fact not run at all. -## 3. USING +## 3. USING (Work in Progress) Once installed, see examples/pentest.py which covers most pyw functions or read throuhg PyRIC.pdf. However, for those impatient types: @@ -353,34 +352,40 @@ w0 Extending PyRIC is fun and easy too, see the user guide PyRIC.pdf. -## 5. ARCHITECTURE/HEIRARCHY: Brief Overview of the project file structure +## 5. ARCHITECTURE/HEIRARCHY: +Brief Overview of the project file structure. Directories and/or files annotated +with (-) are not included in pip installs or PyPI downloads * PyRIC root Distribution directory - \_\_init\_\_.py initialize distrubution PyRIC module - examples example folder + pentest.py create wireless pentest environment example + device_details.py display device information - - tests test folder + - tests (-) test folder + pyw.unittest.py unit test for pyw functions - - guide User Guide resources - + PyRIC.tex User Guide LaTex - + PyRIC.bib User Guide bibliography + - docs User Guide resources + + nlsend.png (-) image for user guide + + nlsock.png (-) image for user guide + + PyRIC.tex (-) User tex file + + PyRIC.bib (-) User Guide bibliography + + PyRIC.pdf User Guide - setup.py install file - setup.cfg used by setup.py - MANIFEST.in used by setup.py - README.md this file - LICENSE GPLv3 License + TODO todos for PyRIC - + RFI comments and observations - - PyRIC.pdf User Guide - - pyw_unittest.py unittest for pyw - pyric package directory + \_\_init\_\_.py initialize pyric module + pyw.py wireless nic functionality - + radio.py consolidate pyw in a class - + channels.py 802.11 ISM/UNII freqs. & channels - + device.py device/chipset utility functions - + rfkill.py rfkill port + + utils utility directory + * \_\_init\_\_.py initialize utils module + * channels.py 802.11 ISM/UNII freqs. & channels + * hardware.py device, chipset and mac address utility functions + * rfkill.py rfkill functions + * ouifetch.py retrieve and store oui dict from IEEE + * data data folder for ouis + - oui.txt oui file fetched from IEEE + net linux header ports * \_\_init\_\_.py initialize net subpackage * if_h.py inet/ifreq definition @@ -392,11 +397,12 @@ Extending PyRIC is fun and easy too, see the user guide PyRIC.pdf. - \_\_init\_\_.py initialize wireless subpackage - nl80211_h.py nl80211 constants - nl80211_c.py nl80211 attribute policies + - rfkill_h.py rfkill header file + lib library subpackages * \_\_init\_\_.py initialize lib subpackage * libnl.py netlink helper functions * libio.py sockios helper functions - + docs netlinke documentation/help - * nlhelp.py nl80211 search + + nlhelp netlinke documentation/help + * nsearch.py nl80211 search * commands.help nl80211 commands help data * attributes.help nl80211 attributes help data \ No newline at end of file diff --git a/RFI b/RFI deleted file mode 100644 index be5f3a4..0000000 --- a/RFI +++ /dev/null @@ -1,117 +0,0 @@ -Reading through the iw source code to figure out how to get the regulatory domain -is like reading through a ham radio radio manual to figure out how to turn it on. -Even when I could see what iw was doing there were no comments or directions as -to why they were doing it a specific way. And, I could not find any definitive -resources on nl80211 via netlink. Fortunately, Thomas Graf provides excellent -documentation on libnl at http://www.carisma.slowglass.com/~tgr/libnl/doc/core.html. -Reading this, I was able to write a simple netlink message class and parser. I still -cannot follow the iw code but with strace, I was able to copy the hex strings and -parse the communications to and from the kernel. However, this leaves a lot of -questions unaswered which is the purpose of this document - to document my -observations, findings and questions in a central location rather than dispersed -throughout the code. - -1) Odd error on what should be a NLE_PERM -When running a root level cmd (reg set) as non-root), I get a return message w/ -the following format: - - nlmsghdr(len=48, type=2, flags=5, seq=1460441619, pid=9865) - genlmsghdr(cmd=255) - attributes: - 0: type = 0, datatype = 0 - value = 1a00050013920c57892600001b000000070021005553 - -and the hex of this message is: - -"\x30\x00\x00\x00\x02\x00\x00\x00\x13\x92\x0c\x57\x89\x26\x00\x00\xff\xff\xff\xff\x1c\x00\x00\x00\x1a\x00\x05\x00\x13\x92\x0c\x57\x89\x26\x00\x00\x1b\x00\x00\x00\x07\x00\x21\x00\x55\x53\x00\x00" - -First, type=2 generally designates an error (at least when executing nl80211). -Second, there is no cmd = 255. Third attempting to parse it as an netlink error -results in a errno of -1. Finally, it does not follow the correct error message -format which should be nlmsghdr+errno+nlmsghdr. - -I checked and this is the same response iw gets. - -* workaround is in place in libnl.nlmsg_fromstream() - -2) ACK messages -PyRIC is set up in a simple send a message & receive the response method. However, -if the caller designates the message with a NLM_F_ACK flag and the ack is not -pulled off the socket subsequent messages will fail due to sequence numbers -mismatching. This is only a problem when using a persistent netlink socket. -ATT I set the NLM_F_ACK flag on all sent packets to ensure we get ack messages -back. - -* workaround is in place in libnl.nl_recvmsg - -3) Hanging terminal -I don't attempt to parse attributes of type nested or unspec. In some situations -when printing the hex values of these attributes on the terminal some character -or set of characters causes the terminal to hang. No combinination of keys etc -can then kill the terminal. I haven't yet looked into trying to determine what -hex value(s) is causing this. - -* workaround is in place in GENLMsg.__repr__ using hexlify - -4) Using deprecated programs/processes -IOT to replicate iw dev info, one has to pass the ifindex (I've tried using -the device name with appropriate attribute type but it fails). The only way to -get the ifindex is by using the supposedly deprecated ioctl (iw does the same). -Seems kind of ironic that the 'new and improved' relies on the old and deprecated - -* no workaround at this point - -5) Error -Netlink provides error codes in netlink/errno.h. However these do not match those -found in /usr/include/asm-generic/errno-base.h and /usr/include/asm-generic/errno.h. -In most cases, it appears that using the netlink errors results in reporting an -incorrect error - there doesn't seem to be any rhyme or reason for this as even -the error codes reporting in the nlmsgerr struct fit linux errors over netlink -errors (in most cases). But, of course there is a catch. NLE_SUCCESS (0) and -NLE_FAILURE (1) as reported in ack/error messages are correct but do not correspond -to the same error code in the linux asm header files. - -* workaround in place, added '-1' as an undefined, use errno for error codes, -error strings and test for NLE_SUCCESS in netlink error message - -6) Setting the channel/Frequency -nl80211.h states that using NL80211_CMD_SET_WIPHY to set the channel is deprecated -in place of NL80211_CMD_SET_CHANNEL. Below is the attempted code: -phy = devinfoex(nlsock,nic)['phy'] -msg = nl.nlmsg_new(nl_type=_FAM80211ID_, - cmd=nl80211h.NL80211_CMD_SET_CHANNEL, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) -msg.nla_put_u32(phy,nl80211h.NL80211_ATTR_WIPHY) -msg.nla_put_u32(channels.ch2rf(ch),nl80211h.NL80211_ATTR_WIPHY_FREQ) -msg.nla_put_u32(CHWIDTHS.index(chw),nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) - -and results in a 'invalid argument' error. So, am I sending the wrong crap? The -description for this command in nl80211_h - - * @NL80211_CMD_SET_CHANNEL: Set the channel (using %NL80211_ATTR_WIPHY_FREQ - * and the attributes determining channel width) the given interface - * (identifed by %NL80211_ATTR_IFINDEX) shall operate on. - * In case multiple channels are supported by the device, the mechanism - * with which it switches channels is implementation-defined. - * When a monitor interface is given, it can only switch channel while - * no other interfaces are operating to avoid disturbing the operation - * of any other interfaces, and other interfaces will again take - * precedence when they are used. - -mentions ifindex. Adding the ifindex with: - -msg.nla_put_u32(nl80211h.NL80211_ATTR_IFINDEX,8) - -still gives an 'invalid argument' error. Took out channel width and still no go - -* workaround in place, using the deprecated NL80211_CMD_SET_WIPHY - -7) Would like to be able set the tx-power, not just to the max but lower or raise -as desired, neither of the below work in iw or through netlinks - -dev set txpower [] - Specify transmit power level and setting type. - -phy set txpower [] - Specify transmit power level and setting type. - diff --git a/TODO b/TODO index 9be6027..b13d22e 100644 --- a/TODO +++ b/TODO @@ -13,4 +13,124 @@ validity o Can we find the current channel of a radio in monitor mode that is actively scanning? - o parse NL80211_ATTR_WIPHY_BANDS (have workaround currently in place) \ No newline at end of file + o parse NL80211_ATTR_WIPHY_BANDS (have workaround currently in place) + +------- Request For Information RFI ---------- + +Reading through the iw source code to figure out how to get the regulatory domain +is like reading through a ham radio radio manual to figure out how to turn it on. +Even when I could see what iw was doing there were no comments or directions as +to why they were doing it a specific way. And, I could not find any definitive +resources on nl80211 via netlink. Fortunately, Thomas Graf provides excellent +documentation on libnl at http://www.carisma.slowglass.com/~tgr/libnl/doc/core.html. +Reading this, I was able to write a simple netlink message class and parser. I still +cannot follow the iw code but with strace, I was able to copy the hex strings and +parse the communications to and from the kernel. However, this leaves a lot of +questions unaswered which is the purpose of this document - to document my +observations, findings and questions in a central location rather than dispersed +throughout the code. + +1) Odd error on what should be a NLE_PERM +When running a root level cmd (reg set) as non-root), I get a return message w/ +the following format: + + nlmsghdr(len=48, type=2, flags=5, seq=1460441619, pid=9865) + genlmsghdr(cmd=255) + attributes: + 0: type = 0, datatype = 0 + value = 1a00050013920c57892600001b000000070021005553 + +and the hex of this message is: + +"\x30\x00\x00\x00\x02\x00\x00\x00\x13\x92\x0c\x57\x89\x26\x00\x00\xff\xff\xff\xff\x1c\x00\x00\x00\x1a\x00\x05\x00\x13\x92\x0c\x57\x89\x26\x00\x00\x1b\x00\x00\x00\x07\x00\x21\x00\x55\x53\x00\x00" + +First, type=2 generally designates an error (at least when executing nl80211). +Second, there is no cmd = 255. Third attempting to parse it as an netlink error +results in a errno of -1. Finally, it does not follow the correct error message +format which should be nlmsghdr+errno+nlmsghdr. + +I checked and this is the same response iw gets. + +* workaround is in place in libnl.nlmsg_fromstream() + +2) ACK messages +PyRIC is set up in a simple send a message & receive the response method. However, +if the caller designates the message with a NLM_F_ACK flag and the ack is not +pulled off the socket subsequent messages will fail due to sequence numbers +mismatching. This is only a problem when using a persistent netlink socket. +ATT I set the NLM_F_ACK flag on all sent packets to ensure we get ack messages +back. + +* workaround is in place in libnl.nl_recvmsg + +3) Hanging terminal +I don't attempt to parse attributes of type nested or unspec. In some situations +when printing the hex values of these attributes on the terminal some character +or set of characters causes the terminal to hang. No combinination of keys etc +can then kill the terminal. I haven't yet looked into trying to determine what +hex value(s) is causing this. + +* workaround is in place in GENLMsg.__repr__ using hexlify + +4) Using deprecated programs/processes +IOT to replicate iw dev info, one has to pass the ifindex (I've tried using +the device name with appropriate attribute type but it fails). The only way to +get the ifindex is by using the supposedly deprecated ioctl (iw does the same). +Seems kind of ironic that the 'new and improved' relies on the old and deprecated + +* no workaround at this point + +5) Error +Netlink provides error codes in netlink/errno.h. However these do not match those +found in /usr/include/asm-generic/errno-base.h and /usr/include/asm-generic/errno.h. +In most cases, it appears that using the netlink errors results in reporting an +incorrect error - there doesn't seem to be any rhyme or reason for this as even +the error codes reporting in the nlmsgerr struct fit linux errors over netlink +errors (in most cases). But, of course there is a catch. NLE_SUCCESS (0) and +NLE_FAILURE (1) as reported in ack/error messages are correct but do not correspond +to the same error code in the linux asm header files. + +* workaround in place, added '-1' as an undefined, use errno for error codes, +error strings and test for NLE_SUCCESS in netlink error message + +6) Setting the channel/Frequency +nl80211.h states that using NL80211_CMD_SET_WIPHY to set the channel is deprecated +in place of NL80211_CMD_SET_CHANNEL. Below is the attempted code: +phy = devinfoex(nlsock,nic)['phy'] +msg = nl.nlmsg_new(nl_type=_FAM80211ID_, + cmd=nl80211h.NL80211_CMD_SET_CHANNEL, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) +msg.nla_put_u32(phy,nl80211h.NL80211_ATTR_WIPHY) +msg.nla_put_u32(channels.ch2rf(ch),nl80211h.NL80211_ATTR_WIPHY_FREQ) +msg.nla_put_u32(CHWIDTHS.index(chw),nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) + +and results in a 'invalid argument' error. So, am I sending the wrong crap? The +description for this command in nl80211_h + + * @NL80211_CMD_SET_CHANNEL: Set the channel (using %NL80211_ATTR_WIPHY_FREQ + * and the attributes determining channel width) the given interface + * (identifed by %NL80211_ATTR_IFINDEX) shall operate on. + * In case multiple channels are supported by the device, the mechanism + * with which it switches channels is implementation-defined. + * When a monitor interface is given, it can only switch channel while + * no other interfaces are operating to avoid disturbing the operation + * of any other interfaces, and other interfaces will again take + * precedence when they are used. + +mentions ifindex. Adding the ifindex with: + +msg.nla_put_u32(nl80211h.NL80211_ATTR_IFINDEX,8) + +still gives an 'invalid argument' error. Took out channel width and still no go + +* workaround in place, using the deprecated NL80211_CMD_SET_WIPHY + +7) Would like to be able set the tx-power, not just to the max but lower or raise +as desired, neither of the below work in iw or through netlinks + +dev set txpower [] + Specify transmit power level and setting type. + +phy set txpower [] + Specify transmit power level and setting type. + diff --git a/guide/PyRIC.bib b/docs/PyRIC.bib similarity index 100% rename from guide/PyRIC.bib rename to docs/PyRIC.bib diff --git a/guide/PyRIC.tex b/docs/PyRIC.tex similarity index 100% rename from guide/PyRIC.tex rename to docs/PyRIC.tex diff --git a/guide/nlsend.png b/docs/nlsend.png similarity index 100% rename from guide/nlsend.png rename to docs/nlsend.png diff --git a/guide/nlsock.png b/docs/nlsock.png similarity index 100% rename from guide/nlsock.png rename to docs/nlsock.png diff --git a/examples/device_details.py b/examples/device_details.py index a115b40..18b1b89 100644 --- a/examples/device_details.py +++ b/examples/device_details.py @@ -6,10 +6,10 @@ """ import argparse as ap -import pyric # pyric error (and ecode EUNDEF) -from pyric import pyw # for iw functionality -from pyric import device # for chipset/driver -from pyric.channels import rf2ch # rf to channel conversion +import pyric # pyric error (and ecode EUNDEF) +from pyric import pyw # for iw functionality +import pyric.utils.hardware as hw # for chipset/driver +from pyric.utils.channels import rf2ch # rf to channel conversion def execute(dev): # ensure dev is a wireless interfaces @@ -20,8 +20,8 @@ def execute(dev): dinfo = pyw.devinfo(dev) card = dinfo['card'] pinfo = pyw.phyinfo(card) - driver = device.ifdriver(card.dev) - chipset = device.ifchipset(driver) + driver = hw.ifdriver(card.dev) + chipset = hw.ifchipset(driver) msg = "Device {0}\n".format(dev) msg += "\tDriver: {0} Chipset: {1}\n".format(driver,chipset) diff --git a/examples/pentest.py b/examples/pentest.py index 422f0ca..10c5d77 100644 --- a/examples/pentest.py +++ b/examples/pentest.py @@ -7,10 +7,10 @@ import argparse as ap import time -import pyric # pyric error (and ecode EUNDEF) -from pyric import pyw # for iw functionality -from pyric import device # for chipset/driver -from pyric.channels import rf2ch # rf to channel conversion +import pyric # pyric error (and ecode EUNDEF) +from pyric import pyw # for iw functionality +import pyric.utils.hardware as hw # for chipset/driver +from pyric.utils.channels import rf2ch # rf to channel conversion def execute(dev): print 'Setting up...' @@ -28,8 +28,8 @@ def execute(dev): dinfo = pyw.devinfo(dev) card = dinfo['card'] pinfo = pyw.phyinfo(card) - driver = device.ifdriver(card.dev) - chipset = device.ifchipset(driver) + driver = hw.ifdriver(card.dev) + chipset = hw.ifchipset(driver) # bring the card down and change the mac pyw.down(card) diff --git a/pyric/__init__.py b/pyric/__init__.py index f191fa5..314b35f 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -115,11 +115,28 @@ o unittest completed 61 tests ran in 5.360s o added rfkill (still working on it) + pyric 0.1.0 + desc: Pythonic iw - wireless nic (radio) manipulation, enumeration, and attribute + enumeration + includes: /docs /examples /lib /net pyw 0.1.2 device 0.0.3 channels 0.0.1 + changes: + o production release + + pyric 0.1.1 + desc: wireless nic library: wireless radio identification, manipulation, enumeration + includes: /nlhelp /lib /net /utils pyw 0.1.2 + changes: + o restructured hierarchy + - renamed device to hardware + o added mac address related functions to hardware + o split rfkill into functions file and definition file + o added block/unblock to pyw + """ __name__ = 'pyric' __license__ = 'GPLv3' -__version__ = '0.1.0' +__version__ = '0.1.1' __date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' @@ -139,5 +156,4 @@ def perror(e): :returns: string description of error code """ # anything less than 0 is an unknown - return strerror(e) - + return strerror(e) \ No newline at end of file diff --git a/pyric/net/wireless/__init__.py b/pyric/net/wireless/__init__.py index 5188d3c..07995ff 100644 --- a/pyric/net/wireless/__init__.py +++ b/pyric/net/wireless/__init__.py @@ -20,7 +20,7 @@ wireless 0.0.1 desc: linux port of nl80211.h, nl80211.c - includes: nl80211_h 0.0.2 nl80211_c 0.0.1 + includes: rfkill_h 0.0.1 nl80211_h 0.0.2 nl80211_c 0.0.1 changes: o added nl80211_c to handle attribute policies - added nl80211_parse_freqs to parse out supported frequencies diff --git a/pyric/net/wireless/rfkill_h.py b/pyric/net/wireless/rfkill_h.py new file mode 100644 index 0000000..3c66b99 --- /dev/null +++ b/pyric/net/wireless/rfkill_h.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python +""" rfkill_.py: rfkill header port + +/usr/include/linux +/* + * Copyright (C) 2006 - 2007 Ivo van Doorn + * Copyright (C) 2007 Dmitry Torokhov + * Copyright 2009 Johannes Berg + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +Redistribution and use in source and binary forms, with or without modifications, +are permitted provided that the following conditions are met: + o Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + o Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + o Neither the name of the orginal author Dale V. Patterson nor the names of any + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +Implements userspace program rfkill in Python to query the state of rfkill switches + +NOTE: + o rfkill_block will block all devices regardless of index, however, the blocked + state will only shown in device that was submitted for blocking - this is the + same behavior seen in rfkill block + - this may be due to bug in ubuntu and not present in other distros + o rfkill does not do sanity checks on the index, rfkill.py will through error + if the index does not exist +""" + +__name__ = 'rfkill_h' +__license__ = 'GPLv3' +__version__ = '0.0.1' +__date__ = 'June 2016' +__author__ = 'Dale Patterson' +__maintainer__ = 'Dale Patterson' +__email__ = 'wraith.wireless@yandex.com' +__status__ = 'Production' + +import struct + +RFKILL_STATE_SOFT_BLOCKED = 0 +RFKILL_STATE_UNBLOCKED = 1 +RFKILL_STATE_HARD_BLOCKED = 2 + +""" +/** + * enum rfkill_type - type of rfkill switch. + * + * @RFKILL_TYPE_ALL: toggles all switches (requests only - not a switch type) + * @RFKILL_TYPE_WLAN: switch is on a 802.11 wireless network device. + * @RFKILL_TYPE_BLUETOOTH: switch is on a bluetooth device. + * @RFKILL_TYPE_UWB: switch is on a ultra wideband device. + * @RFKILL_TYPE_WIMAX: switch is on a WiMAX device. + * @RFKILL_TYPE_WWAN: switch is on a wireless WAN device. + * @RFKILL_TYPE_GPS: switch is on a GPS device. + * @RFKILL_TYPE_FM: switch is on a FM radio device. + * @RFKILL_TYPE_NFC: switch is on an NFC device. + * @NUM_RFKILL_TYPES: number of defined rfkill types + */ +""" +RFKILL_TYPES = ['all','wlan','bluetooth','uwb','wimax','wwan','gps','fm','nfc'] +RFKILL_TYPE_ALL = 0 +RFKILL_TYPE_WLAN = 1 +RFKILL_TYPE_BLUETOOTH = 2 +RFKILL_TYPE_UWB = 3 +RFKILL_TYPE_WIMAX = 4 +RFKILL_TYPE_WWAN = 5 +RFKILL_TYPE_GPS = 6 +RFKILL_TYPE_FM = 7 +RFKILL_TYPE_NFC = 8 +NUM_RFKILL_TYPES = 9 + +""" +/** + * enum rfkill_operation - operation types + * @RFKILL_OP_ADD: a device was added + * @RFKILL_OP_DEL: a device was removed + * @RFKILL_OP_CHANGE: a device's state changed -- userspace changes one device + * @RFKILL_OP_CHANGE_ALL: userspace changes all devices (of a type, or all) + */ + """ +RFKILL_OP_ADD = 0 +RFKILL_OP_DEL = 1 +RFKILL_OP_CHANGE = 2 +RFKILL_OP_CHANGE_ALL = 3 + +""" +/** + * struct rfkill_event - events for userspace on /dev/rfkill + * @idx: index of dev rfkill + * @type: type of the rfkill struct + * @op: operation code + * @hard: hard state (0/1) + * @soft: soft state (0/1) + * + * Structure used for userspace communication on /dev/rfkill, + * used for events from the kernel and control to the kernel. + */ +""" +rfk_rfkill_event = "IBBBB" +RFKILLEVENTLEN = struct.calcsize(rfk_rfkill_event) +def rfkill_event(idx,rtype,op,hard=0,soft=0): + """ + create a rkfill event structure + :param idx: index of dev rfkill i.e. 0,1 + :param rtype: type of rfkill + :param op: op code + :param hard: hard state one of {0=unbloacked|1=blocked} + :param soft: soft state one of {0=unblocked|1=blocked} + :returns: a rfkill event structure + """ + return struct.pack(rfk_rfkill_event,idx,rtype,op,hard,soft) \ No newline at end of file diff --git a/pyric/docs/__init__.py b/pyric/nlhelp/__init__.py similarity index 87% rename from pyric/docs/__init__.py rename to pyric/nlhelp/__init__.py index 2c7bfe1..6b07387 100644 --- a/pyric/docs/__init__.py +++ b/pyric/nlhelp/__init__.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -""" docs +""" nlhelp nl80211_h search utlities Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) @@ -21,14 +21,14 @@ Documentation to include lookup functionality for nl80211 commands and attributes - docs 0.0.1 - desc: PyRIC and nl80211 documentation/help - includes: nl80211.cmd + nlhelp 0.0.1 + desc: nl80211 attributes and commands search utility + includes: attributes.help commands.help nlsearch 0.0.1 changes: - o User Guide complete (mostly) + o name changes """ -__name__ = 'docs' +__name__ = 'nlhelp' __license__ = 'GPLv3' __version__ = '0.0.1' __date__ = 'April 2016' diff --git a/pyric/docs/attributes.help b/pyric/nlhelp/attributes.help similarity index 100% rename from pyric/docs/attributes.help rename to pyric/nlhelp/attributes.help diff --git a/pyric/docs/commands.help b/pyric/nlhelp/commands.help similarity index 100% rename from pyric/docs/commands.help rename to pyric/nlhelp/commands.help diff --git a/pyric/docs/nlhelp.py b/pyric/nlhelp/nlsearch.py similarity index 100% rename from pyric/docs/nlhelp.py rename to pyric/nlhelp/nlsearch.py diff --git a/pyric/pyw.py b/pyric/pyw.py index 95681d5..ad12c23 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -109,20 +109,21 @@ def _nlstub_(fct,*argv): __email__ = 'wraith.wireless@yandex.com' __status__ = 'Production' -import struct # ioctl unpacking -import pyric # pyric exception -import errno # error codes -import re # check addr validity -from pyric import device # device related -from pyric import channels # channel related -from pyric.docs.nlhelp import cmdbynum # get command name -import pyric.net.netlink_h as nlh # netlink definition -import pyric.net.genetlink_h as genlh # genetlink definition -import pyric.net.wireless.nl80211_h as nl80211h # 802.11 definition -import pyric.net.sockios_h as sioch # sockios constants -import pyric.net.if_h as ifh # ifreq structure -import pyric.lib.libnl as nl # netlink functions -import pyric.lib.libio as io # ioctl functions +import struct # ioctl unpacking +import pyric # pyric exception +import errno # error codes +import re # check addr validity +from pyric.utils import channels # channel related +from pyric.utils import rfkill # block/unblock +from pyric.nlhelp.nlsearch import cmdbynum # get command name +import pyric.utils.hardware as hw # device related +import pyric.net.netlink_h as nlh # netlink definition +import pyric.net.genetlink_h as genlh # genetlink definition +import pyric.net.wireless.nl80211_h as nl80211h # nl80211 definition +import pyric.net.sockios_h as sioch # sockios constants +import pyric.net.if_h as ifh # ifreq structure +import pyric.lib.libnl as nl # netlink functions +import pyric.lib.libio as io # ioctl functions _FAM80211ID_ = None @@ -143,7 +144,7 @@ def interfaces(): try: # read in devices from /proc/net/dev. After splitting on newlines, the # first 2 lines are headers and the last line is empty so we remove them - fin = open(device.dpath, 'r') + fin = open(hw.dpath, 'r') ds = fin.read().split('\n')[2:-1] except IOError: return [] @@ -611,6 +612,28 @@ def down(card, *argv): raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) return True +def block(card): + """ + soft blocks card + :param card: Card object + """ + try: + idx = rfkill.getidx(card.phy) + rfkill.rfkill_block(idx) + except AttributeError: + raise pyric.error(errno.ENODEV, "Device no longer registered") + +def unblock(card): + """ + turns off soft block + :param card: + """ + try: + idx = rfkill.getidx(card.phy) + rfkill.rfkill_unblock(idx) + except AttributeError: + raise pyric.error(errno.ENODEV, "Device no longer registered") + #### INFO RELATED #### def devfreqs(card, *argv): @@ -845,7 +868,7 @@ def chget(card, *argv): return _nlstub_(chget, card) return channels.rf2ch(devinfo(card, nlsock)['RF']) -def chset(card, ch, chw, *argv): +def chset(card, ch, chw=None, *argv): """ REQUIRES ROOT PRIVILEGES sets current channel on device (iw phy set channel ) diff --git a/pyric/utils/__init__.py b/pyric/utils/__init__.py new file mode 100644 index 0000000..5632f02 --- /dev/null +++ b/pyric/utils/__init__.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python +""" utils PyRIC utilities + +Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +Redistribution and use in source and binary forms, with or without modifications, +are permitted provided that the following conditions are met: + o Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + o Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + o Neither the name of the orginal author Dale V. Patterson nor the names of any + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + utils 0.0.1 + desc: utilities + includes: hardware 0.0.4 ouifetch 0.0.1 channels 0.0.1 rfkill 0.0.1 + changes: + o added mac address related to hardware.py + +""" + +__name__ = 'utils' +__license__ = 'GPLv3' +__version__ = '0.0.1' +__date__ = 'June 2016' +__author__ = 'Dale Patterson' +__maintainer__ = 'Dale Patterson' +__email__ = 'wraith.wireless@yandex.com' +__status__ = 'Production' \ No newline at end of file diff --git a/pyric/channels.py b/pyric/utils/channels.py similarity index 100% rename from pyric/channels.py rename to pyric/utils/channels.py diff --git a/pyric/utils/data/oui.txt b/pyric/utils/data/oui.txt new file mode 100644 index 0000000..901c493 --- /dev/null +++ b/pyric/utils/data/oui.txt @@ -0,0 +1,22132 @@ +2016-06-04T09:53:45.530902 +E0:43:DB Shenzhen ViewAt Technology Co.,Ltd. +24:05:F5 Integrated Device Technology (Malaysia) Sdn. Bhd. +2C:30:33 NETGEAR +3C:D9:2B Hewlett Packard +9C:8E:99 Hewlett Packard +B4:99:BA Hewlett Packard +1C:C1:DE Hewlett Packard +3C:35:56 Cognitec Systems GmbH +00:50:BA D-Link Corporation +00:17:9A D-Link Corporation +1C:BD:B9 D-Link International +90:94:E4 D-Link International +28:10:7B D-Link International +1C:7E:E5 D-Link International +C4:A8:1D D-Link International +18:62:2C Sagemcom Broadband SAS +7C:03:D8 Sagemcom Broadband SAS +E8:F1:B0 Sagemcom Broadband SAS +00:F8:71 DGS Denmark A/S +20:BB:76 COL GIOVANNI PAOLO SpA +2C:22:8B CTR SRL +34:8A:AE Sagemcom Broadband SAS +BC:EC:23 SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD +8C:E7:48 Private +F0:9C:E9 Aerohive Networks Inc. +C4:13:E2 Aerohive Networks Inc. +AC:06:C7 ServerNet S.r.l. +CC:46:D6 Cisco Systems, Inc +48:AD:08 HUAWEI TECHNOLOGIES CO.,LTD +2C:AB:00 HUAWEI TECHNOLOGIES CO.,LTD +00:E0:FC HUAWEI TECHNOLOGIES CO.,LTD +24:DF:6A HUAWEI TECHNOLOGIES CO.,LTD +00:9A:CD HUAWEI TECHNOLOGIES CO.,LTD +00:CD:FE Apple, Inc. +38:F2:3E Microsoft Mobile Oy +58:AC:78 Cisco Systems, Inc +90:7F:61 Chicony Electronics Co., Ltd. +28:BC:18 SourcingOverseas Co. Ltd +80:7A:BF HTC Corporation +40:9F:87 Jide Technology (Hong Kong) Limited +3C:5A:B4 Google, Inc. +00:1A:11 Google, Inc. +D8:3C:69 Shenzhen TINNO Mobile Technology Corp. +74:AC:5F Qiku Internet Network Scientific (Shenzhen) Co., Ltd. +18:AF:61 Apple, Inc. +BC:83:A7 SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD +00:03:47 Intel Corporation +00:11:75 Intel Corporation +00:13:E8 Intel Corporate +00:13:02 Intel Corporate +E4:F8:9C Intel Corporate +A4:02:B9 Intel Corporate +4C:34:88 Intel Corporate +00:0D:0B BUFFALO.INC +00:07:40 BUFFALO.INC +00:24:A5 BUFFALO.INC +DC:FB:02 BUFFALO.INC +F4:CE:46 Hewlett Packard +00:1C:C4 Hewlett Packard +00:25:B3 Hewlett Packard +00:18:71 Hewlett Packard +00:0B:CD Hewlett Packard +00:0E:7F Hewlett Packard +00:0F:20 Hewlett Packard +00:11:0A Hewlett Packard +00:13:21 Hewlett Packard +00:16:35 Hewlett Packard +00:17:A4 Hewlett Packard +00:08:02 Hewlett Packard +90:E7:C4 HTC Corporation +74:A7:8E zte corporation +D8:60:B0 bioMérieux Italia S.p.A. +80:38:BC HUAWEI TECHNOLOGIES CO.,LTD +D4:40:F0 HUAWEI TECHNOLOGIES CO.,LTD +64:A6:51 HUAWEI TECHNOLOGIES CO.,LTD +E8:CD:2D HUAWEI TECHNOLOGIES CO.,LTD +AC:E2:15 HUAWEI TECHNOLOGIES CO.,LTD +EC:23:3D HUAWEI TECHNOLOGIES CO.,LTD +78:F5:FD HUAWEI TECHNOLOGIES CO.,LTD +80:B6:86 HUAWEI TECHNOLOGIES CO.,LTD +10:C6:1F HUAWEI TECHNOLOGIES CO.,LTD +88:53:D4 HUAWEI TECHNOLOGIES CO.,LTD +0C:37:DC HUAWEI TECHNOLOGIES CO.,LTD +BC:76:70 HUAWEI TECHNOLOGIES CO.,LTD +24:DB:AC HUAWEI TECHNOLOGIES CO.,LTD +BC:3A:EA GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD +E8:BB:A8 GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD +00:21:E8 Murata Manufacturing Co., Ltd. +00:60:57 Murata Manufacturing Co., Ltd. +00:07:D8 Hitron Technologies. Inc +00:12:F2 Brocade Communications Systems, Inc. +00:1B:ED Brocade Communications Systems, Inc. +00:24:38 Brocade Communications Systems, Inc. +84:74:2A zte corporation +68:1A:B2 zte corporation +E0:05:C5 TP-LINK TECHNOLOGIES CO.,LTD. +A0:F3:C1 TP-LINK TECHNOLOGIES CO.,LTD. +8C:21:0A TP-LINK TECHNOLOGIES CO.,LTD. +EC:17:2F TP-LINK TECHNOLOGIES CO.,LTD. +EC:88:8F TP-LINK TECHNOLOGIES CO.,LTD. +14:CF:92 TP-LINK TECHNOLOGIES CO.,LTD. +64:56:01 TP-LINK TECHNOLOGIES CO.,LTD. +14:CC:20 TP-LINK TECHNOLOGIES CO.,LTD. +BC:46:99 TP-LINK TECHNOLOGIES CO.,LTD. +0C:45:BA HUAWEI TECHNOLOGIES CO.,LTD +84:77:78 Cochlear Limited +04:53:D5 Sysorex Global Holdings +CC:44:63 Apple, Inc. +6C:72:E7 Apple, Inc. +CC:A2:23 HUAWEI TECHNOLOGIES CO.,LTD +E8:08:8B HUAWEI TECHNOLOGIES CO.,LTD +60:E7:01 HUAWEI TECHNOLOGIES CO.,LTD +00:08:83 Hewlett Packard +C4:34:6B Hewlett Packard +8C:DC:D4 Hewlett Packard +34:64:A9 Hewlett Packard +D4:C9:EF Hewlett Packard +A4:5D:36 Hewlett Packard +A0:D3:C1 Hewlett Packard +40:A8:F0 Hewlett Packard +6C:3B:E5 Hewlett Packard +08:2E:5F Hewlett Packard +28:92:4A Hewlett Packard +10:60:4B Hewlett Packard +30:8D:99 Hewlett Packard +00:30:C1 Hewlett Packard +FC:3F:DB Hewlett Packard +4C:A1:61 Rain Bird Corporation +7C:61:93 HTC Corporation +00:12:17 Cisco-Linksys, LLC +00:0C:41 Cisco-Linksys, LLC +00:0F:66 Cisco-Linksys, LLC +44:E0:8E Cisco SPVTG +18:59:33 Cisco SPVTG +E4:48:C7 Cisco SPVTG +24:76:7D Cisco SPVTG +2C:AB:A4 Cisco SPVTG +00:02:C7 ALPS ELECTRIC CO.,LTD. +04:76:6E ALPS ELECTRIC CO.,LTD. +00:6B:8E Shanghai Feixun Communication Co.,Ltd. +AC:85:3D HUAWEI TECHNOLOGIES CO.,LTD +74:88:2A HUAWEI TECHNOLOGIES CO.,LTD +78:D7:52 HUAWEI TECHNOLOGIES CO.,LTD +E0:24:7F HUAWEI TECHNOLOGIES CO.,LTD +00:46:4B HUAWEI TECHNOLOGIES CO.,LTD +70:7B:E8 HUAWEI TECHNOLOGIES CO.,LTD +54:89:98 HUAWEI TECHNOLOGIES CO.,LTD +08:19:A6 HUAWEI TECHNOLOGIES CO.,LTD +3C:F8:08 HUAWEI TECHNOLOGIES CO.,LTD +B4:15:13 HUAWEI TECHNOLOGIES CO.,LTD +28:31:52 HUAWEI TECHNOLOGIES CO.,LTD +DC:D2:FC HUAWEI TECHNOLOGIES CO.,LTD +F8:A4:5F Xiaomi Communications Co Ltd +8C:BE:BE Xiaomi Communications Co Ltd +64:09:80 Xiaomi Communications Co Ltd +98:FA:E3 Xiaomi Communications Co Ltd +18:59:36 Xiaomi Communications Co Ltd +9C:99:A0 Xiaomi Communications Co Ltd +00:03:DD Comark Interactive Solutions +00:10:7B Cisco Systems, Inc +00:90:6D Cisco Systems, Inc +00:90:BF Cisco Systems, Inc +00:50:80 Cisco Systems, Inc +00:E0:18 ASUSTek COMPUTER INC. +00:0C:6E ASUSTek COMPUTER INC. +00:1B:FC ASUSTek COMPUTER INC. +00:1E:8C ASUSTek COMPUTER INC. +00:15:F2 ASUSTek COMPUTER INC. +00:23:54 ASUSTek COMPUTER INC. +00:1F:C6 ASUSTek COMPUTER INC. +60:18:2E ShenZhen Protruly Electronic Ltd co. +F4:CF:E2 Cisco Systems, Inc +50:1C:BF Cisco Systems, Inc +28:5F:DB HUAWEI TECHNOLOGIES CO.,LTD +40:4D:8E HUAWEI TECHNOLOGIES CO.,LTD +78:1D:BA HUAWEI TECHNOLOGIES CO.,LTD +00:1E:10 HUAWEI TECHNOLOGIES CO.,LTD +B0:AD:AA Avaya Inc +10:CD:AE Avaya Inc +50:CD:22 Avaya Inc +FC:A8:41 Avaya Inc +3C:B1:5B Avaya Inc +C8:F4:06 Avaya Inc +2C:F4:C5 Avaya Inc +70:38:EE Avaya Inc +88:F0:31 Cisco Systems, Inc +50:87:89 Cisco Systems, Inc +38:1C:1A Cisco Systems, Inc +F4:0F:1B Cisco Systems, Inc +BC:67:1C Cisco Systems, Inc +A0:EC:F9 Cisco Systems, Inc +D4:6D:50 Cisco Systems, Inc +1C:E8:5D Cisco Systems, Inc +C4:72:95 Cisco Systems, Inc +A0:55:4F Cisco Systems, Inc +84:B8:02 Cisco Systems, Inc +BC:C4:93 Cisco Systems, Inc +00:19:47 Cisco SPVTG +00:22:CE Cisco SPVTG +F0:29:29 Cisco Systems, Inc +EC:E1:A9 Cisco Systems, Inc +7C:69:F6 Cisco Systems, Inc +C0:8C:60 Cisco Systems, Inc +C0:25:5C Cisco Systems, Inc +88:5A:92 Cisco Systems, Inc +E4:C7:22 Cisco Systems, Inc +C0:7B:BC Cisco Systems, Inc +00:90:F2 Cisco Systems, Inc +00:17:3B Cisco Systems, Inc +00:40:0B Cisco Systems, Inc +00:60:09 Cisco Systems, Inc +00:60:47 Cisco Systems, Inc +00:06:C1 Cisco Systems, Inc +00:E0:14 Cisco Systems, Inc +00:E0:1E Cisco Systems, Inc +AC:F2:C5 Cisco Systems, Inc +CC:C7:60 Apple, Inc. +08:74:02 Apple, Inc. +28:5A:EB Apple, Inc. +28:F0:76 Apple, Inc. +84:28:5A Saffron Solutions Inc +80:A1:AB Intellisis +44:D8:84 Apple, Inc. +EC:85:2F Apple, Inc. +28:6A:BA Apple, Inc. +70:56:81 Apple, Inc. +7C:D1:C3 Apple, Inc. +F0:DC:E2 Apple, Inc. +B0:65:BD Apple, Inc. +A8:20:66 Apple, Inc. +BC:67:78 Apple, Inc. +68:96:7B Apple, Inc. +84:85:06 Apple, Inc. +B4:F0:AB Apple, Inc. +10:DD:B1 Apple, Inc. +04:F7:E4 Apple, Inc. +34:C0:59 Apple, Inc. +F0:D1:A9 Apple, Inc. +F8:27:93 Apple, Inc. +AC:FD:EC Apple, Inc. +D0:E1:40 Apple, Inc. +F8:32:E4 ASUSTek COMPUTER INC. +8C:7C:92 Apple, Inc. +78:31:C1 Apple, Inc. +F4:37:B7 Apple, Inc. +54:AE:27 Apple, Inc. +64:76:BA Apple, Inc. +84:B1:53 Apple, Inc. +78:3A:84 Apple, Inc. +2C:BE:08 Apple, Inc. +24:E3:14 Apple, Inc. +00:10:FF Cisco Systems, Inc +34:BD:C8 Cisco Systems, Inc +54:A2:74 Cisco Systems, Inc +58:97:BD Cisco Systems, Inc +04:6C:9D Cisco Systems, Inc +60:FE:C5 Apple, Inc. +00:A0:40 Apple, Inc. +BC:3B:AF Apple, Inc. +78:6C:1C Apple, Inc. +04:15:52 Apple, Inc. +38:48:4C Apple, Inc. +70:11:24 Apple, Inc. +C8:6F:1D Apple, Inc. +68:5B:35 Apple, Inc. +38:0F:4A Apple, Inc. +30:10:E4 Apple, Inc. +04:DB:56 Apple, Inc. +88:1F:A1 Apple, Inc. +04:E5:36 Apple, Inc. +10:9A:DD Apple, Inc. +40:A6:D9 Apple, Inc. +7C:F0:5F Apple, Inc. +A4:B1:97 Apple, Inc. +0C:74:C2 Apple, Inc. +40:30:04 Apple, Inc. +48:60:BC Apple, Inc. +50:EA:D6 Apple, Inc. +28:E0:2C Apple, Inc. +60:C5:47 Apple, Inc. +7C:11:BE Apple, Inc. +00:3E:E1 Apple, Inc. +68:D9:3C Apple, Inc. +2C:F0:EE Apple, Inc. +84:78:8B Apple, Inc. +6C:94:F8 Apple, Inc. +70:3E:AC Apple, Inc. +C0:1A:DA Apple, Inc. +34:36:3B Apple, Inc. +C8:1E:E7 Apple, Inc. +9C:FC:01 Apple, Inc. +00:0D:93 Apple, Inc. +00:1C:B3 Apple, Inc. +64:B9:E8 Apple, Inc. +34:15:9E Apple, Inc. +58:B0:35 Apple, Inc. +F0:B4:79 Apple, Inc. +14:13:57 ATP Electronics, Inc. +F4:4B:2A Cisco SPVTG +3C:8C:F8 TRENDnet, Inc. +78:D6:B2 Toshiba +C0:4A:09 Zhejiang Everbright Communication Equip. Co,. Ltd +F0:0D:5C JinQianMao Technology Co.,Ltd. +2C:08:1C OVH +30:E0:90 Linctronix Ltd, +70:BF:3E Charles River Laboratories +D8:48:EE Hangzhou Xueji Technology Co., Ltd. +88:94:7E Fiberhome Telecommunication Technologies Co.,LTD +88:C2:42 Poynt Co. +E8:34:3E Beijing Infosec Technologies Co., LTD. +C4:AD:F1 GOPEACE Inc. +58:F4:96 Source Chain +80:B7:09 Viptela, Inc +1C:60:DE SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. +74:18:65 Shanghai DareGlobal Technologies Co.,Ltd +00:84:ED Private +DC:DC:07 TRP Systems BV +08:0A:4E Planet Bingo® — 3rd Rock Gaming® +0C:1A:10 Acoustic Stream +E4:A3:87 Control Solutions LLC +DC:82:F6 iPort +C4:9E:41 G24 Power Limited +D0:3E:5C HUAWEI TECHNOLOGIES CO.,LTD +C8:A9:FC Goyoo Networks Inc. +C4:9F:F3 Mciao Technologies, Inc. +80:73:9F KYOCERA Corporation +7C:2B:E1 Shenzhen Ferex Electrical Co.,Ltd +30:FF:F6 HangZhou KuoHeng Technology Co.,ltd +58:53:C0 Beijing Guang Runtong Technology Development Company co.,Ltd +50:31:AD ABB Global Industries and Services Private Limited +30:A2:43 Shenzhen Prifox Innovation Technology Co., Ltd. +2C:A5:39 Parallel Wireless, Inc +FC:33:5F Polyera +FC:C2:33 Private +A8:C8:7F Roqos, Inc. +C0:25:A2 NEC Platforms, Ltd. +78:53:F2 ROXTON Ltd. +AC:BC:32 Apple, Inc. +94:BB:AE Husqvarna AB +AC:89:95 AzureWave Technology Inc. +F8:98:B9 HUAWEI TECHNOLOGIES CO.,LTD +1C:49:7B Gemtek Technology Co., Ltd. +2C:CF:58 HUAWEI TECHNOLOGIES CO.,LTD +54:FF:82 Davit Solution co. +D4:45:E8 Jiangxi Hongpai Technology Co., Ltd. +84:79:73 Shanghai Baud Data Communication Co.,Ltd. +90:6F:18 Private +88:1B:99 SHENZHEN XIN FEI JIA ELECTRONIC CO. LTD. +68:12:95 Lupine Lighting Systems GmbH +64:9A:12 P2 Mobile Technologies Limited +E4:C2:D1 HUAWEI TECHNOLOGIES CO.,LTD +DC:3C:F6 Atomic Rules LLC +3C:31:78 Qolsys Inc. +F4:57:3E Fiberhome Telecommunication Technologies Co.,LTD +08:3A:5C Junilab, Inc. +4C:AE:31 ShengHai Electronics (Shenzhen) Ltd +C8:0E:14 AVM Audiovisuelles Marketing und Computersysteme GmbH +F0:D6:57 ECHOSENS +24:69:3E innodisk Corporation +E4:8D:8C Routerboard.com +C0:DC:6A Qingdao Eastsoft Communication Technology Co.,LTD +64:59:F8 Vodafone Omnitel B.V. +08:2C:B0 Network Instruments +F0:AB:54 MITSUMI ELECTRIC CO.,LTD. +48:50:73 Microsoft Corporation +3C:A3:1A Oilfind International LLC +AC:FD:93 Weifang GoerTek Electronics Co., Ltd. +A4:24:DD Cambrionix Ltd +88:A2:D7 HUAWEI TECHNOLOGIES CO.,LTD +D8:9A:34 Beijing SHENQI Technology Co., Ltd. +1C:AD:D1 Bosung Electronics Co., Ltd. +24:E5:AA Philips Oral Healthcare, Inc. +88:CB:A5 Suzhou Torchstar Intelligent Technology Co.,Ltd +04:61:69 MEDIA GLOBAL LINKS CO., LTD. +AC:56:2C LAVA INTERNATIONAL(H.K) LIMITED +3C:CE:15 Mercedes-Benz USA, LLC +84:DF:19 Chuango Security Technology Corporation +3C:47:11 HUAWEI TECHNOLOGIES CO.,LTD +24:5B:F0 Liteon, Inc. +FC:FE:C2 Invensys Controls UK Limited +E8:F2:E2 LG Innotek +AC:67:6F Electrocompaniet A.S. +4C:B8:2C Cambridge Mobile Telematics, Inc. +F0:22:4E Esan electronic co. +B0:41:1D ITTIM Technologies +7C:B2:5C Acacia Communications +78:EB:39 Instituto Nacional de Tecnología Industrial +7C:C9:5A EMC +EC:EE:D8 ZTLX Network Technology Co.,Ltd +F8:5B:9C SB SYSTEMS Co.,Ltd +7C:A2:37 King Slide Technology CO., LTD. +30:0E:E3 Aquantia Corporation +84:73:03 Letv Mobile and Intelligent Information Technology (Beijing) Corporation Ltd. +B0:49:5F OMRON HEALTHCARE Co., Ltd. +BC:6E:64 Sony Mobile Communications AB +F4:47:13 Leading Public Performance Co., Ltd. +D4:52:2A TangoWiFi.com +B0:EC:E1 Private +40:7F:E0 Glory Star Technics (ShenZhen) Limited +BC:5C:4C ELECOM CO.,LTD. +6C:59:40 SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. +6C:A7:5F zte corporation +C8:C5:0E Shenzhen Primestone Network Technologies.Co., Ltd. +9C:BE:E0 Biosoundlab Co., Ltd. +5C:5B:35 Mist Systems, Inc. +E8:07:BF SHENZHEN BOOMTECH INDUSTRY CO.,LTD +E8:16:2B IDEO Security Co., Ltd. +70:9F:2D zte corporation +5C:6B:4F Private +EC:E2:FD SKG Electric Group(Thailand) Co., Ltd. +88:E6:03 Avotek corporation +74:E2:8C Microsoft Corporation +94:F1:9E HUIZHOU MAORONG INTELLIGENT TECHNOLOGY CO.,LTD +C4:92:4C KEISOKUKI CENTER CO.,LTD. +E4:F9:39 Minxon Hotel Technology INC. +38:C7:0A WiFiSong +60:E6:BC Sino-Telecom Technology Co.,Ltd. +1C:A5:32 Shenzhen Gongjin Electronics Co.,Ltd +48:6E:FB Davit System Technology Co., Ltd. +34:0A:22 TOP-ACCESS ELECTRONICS CO LTD +B0:08:BF Vital Connect, Inc. +48:54:15 NET RULES TECNOLOGIA EIRELI +70:C7:6F INNO S +70:4E:66 SHENZHEN FAST TECHNOLOGIES CO.,LTD +40:9B:0D Shenzhen Yourf Kwan Industrial Co., Ltd +C4:08:80 Shenzhen UTEPO Tech Co., Ltd. +94:C0:38 Tallac Networks +80:19:67 Shanghai Reallytek Information Technology Co.,Ltd +68:36:B5 DriveScale, Inc. +2C:F7:F1 Seeed Technology Inc. +F8:84:79 Yaojin Technology(Shenzhen)Co.,Ltd +4C:48:DA Beijing Autelan Technology Co.,Ltd +90:17:9B Nanomegas +30:77:CB Maike Industry(Shenzhen)CO.,LTD +34:28:F0 ATN International Limited +EC:3C:5A SHEN ZHEN HENG SHENG HUI DIGITAL TECHNOLOGY CO.,LTD +8C:05:51 Koubachi AG +D8:84:66 Extreme Networks +E8:87:A3 Loxley Public Company Limited +10:FA:CE Reacheng Communication Technology Co.,Ltd +D8:CB:8A Micro-Star INTL CO., LTD. +A8:D0:E3 Systech Electronics Ltd. +84:63:D6 Microsoft Corporation +78:B3:B9 ShangHai sunup lighting CO.,LTD +F4:EE:14 SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. +18:65:71 Top Victory Electronics (Taiwan) Co., Ltd. +F8:BC:41 Rosslare Enterprises Limited +84:86:F3 Greenvity Communications +20:5C:FA Yangzhou ChangLian Network Technology Co,ltd. +8C:18:D9 Shenzhen RF Technology Co., Ltd +60:99:D1 Vuzix / Lenovo +34:F6:D2 Panasonic Taiwan Co.,Ltd. +DC:2F:03 Step forward Group Co., Ltd. +58:21:36 KMB systems, s.r.o. +00:AE:FA Murata Manufacturing Co., Ltd. +5C:AA:FD Sonos, Inc. +8C:DF:9D NEC Corporation +F8:E9:03 D-Link International +F0:B0:52 Ruckus Wireless +68:28:F6 Vubiq Networks, Inc. +44:35:6F Neterix +74:2E:FC DirectPacket Research, Inc, +20:C0:6D SHENZHEN SPACETEK TECHNOLOGY CO.,LTD +3C:B7:92 Hitachi Maxell, Ltd., Optronics Division +74:91:BD Four systems Co.,Ltd. +D4:32:66 Fike Corporation +94:8E:89 INDUSTRIAS UNIDAS SA DE CV +94:05:B6 Liling FullRiver Electronics & Technology Ltd +38:2C:4A ASUSTek COMPUTER INC. +74:54:7D Cisco SPVTG +D4:8F:33 Microsoft Corporation +1C:A2:B1 ruwido austria gmbh +94:54:93 Rigado, LLC +34:B7:FD Guangzhou Younghead Electronic Technology Co.,Ltd +38:4B:76 AIRTAME ApS +1C:52:16 DONGGUAN HELE ELECTRONICS CO., LTD +34:02:9B CloudBerry Technologies Private Limited +70:AF:25 Nishiyama Industry Co.,LTD. +B4:7C:29 Shenzhen Guzidi Technology Co.,Ltd +2C:1A:31 Electronics Company Limited +6C:19:8F D-Link International +60:C1:CB Fujian Great Power PLC Equipment Co.,Ltd +68:6E:48 Prophet Electronic Technology Corp.,Ltd +30:F7:D7 Thread Technology Co., Ltd +38:08:FD Silca Spa +7C:25:87 chaowifi.com +20:12:D5 Scientech Materials Corporation +DC:39:79 Skyport Systems +EC:1D:7F zte corporation +AC:11:D3 Suzhou HOTEK Video Technology Co. Ltd +30:42:25 BURG-WÄCHTER KG +1C:48:40 IMS Messsysteme GmbH +F4:28:53 Zioncom Electronics (Shenzhen) Ltd. +3C:46:D8 TP-LINK TECHNOLOGIES CO.,LTD. +6C:02:73 Shenzhen Jin Yun Video Equipment Co., Ltd. +2C:FA:A2 Alcatel-Lucent +F0:76:1C COMPAL INFORMATION (KUNSHAN) CO., LTD. +F4:28:33 MMPC Inc. +24:4F:1D iRule LLC +BC:9C:C5 Beijing Huafei Technology Co., Ltd. +50:50:65 TAKT Corporation +D0:0A:AB Yokogawa Digital Computer Corporation +A4:A4:D3 Bluebank Communication Technology Co.Ltd +74:F4:13 Maxwell Forest +34:F0:CA Shenzhen Linghangyuan Digital Technology Co.,Ltd. +84:18:3A Ruckus Wireless +30:B5:F1 Aitexin Technology Co., Ltd +88:29:50 Dalian Netmoon Tech Develop Co.,Ltd +08:CD:9B samtec automotive electronics & software GmbH +28:FC:F6 Shenzhen Xin KingBrand enterprises Co.,Ltd +4C:26:E7 Welgate Co., Ltd. +94:D6:0E shenzhen yunmao information technologies co., ltd +7C:6A:C3 GatesAir, Inc +3C:CD:5A Technische Alternative GmbH +60:48:26 Newbridge Technologies Int. Ltd. +24:D1:3F MEXUS CO.,LTD +70:2C:1F Wisol +9C:BD:9D SkyDisk, Inc. +74:C6:21 Zhejiang Hite Renewable Energy Co.,LTD +44:C3:06 SIFROM Inc. +54:A3:1B Shenzhen Linkworld Technology Co,.LTD +5C:E7:BF New Singularity International Technical Development Co.,Ltd +1C:EE:E8 Ilshin Elecom +6C:64:1A Penguin Computing +E0:36:E3 Stage One International Co., Ltd. +34:DE:34 zte corporation +34:46:6F HiTEM Engineering +2C:39:C1 Ciena Corporation +6C:2C:06 OOO NPP Systemotechnika-NN +54:EE:75 Wistron InfoComm(Kunshan)Co.,Ltd. +60:81:2B Custom Control Concepts +F8:66:01 Suzhou Chi-tek information technology Co., Ltd +FC:4A:E9 Castlenet Technology Inc. +34:E4:2A Automatic Bar Controls Inc. +B8:7C:F2 Aerohive Networks Inc. +20:A7:87 Bointec Taiwan Corporation Limited +6C:AA:B3 Ruckus Wireless +A4:81:EE Nokia Corporation +54:C8:0F TP-LINK TECHNOLOGIES CO.,LTD. +D4:21:22 Sercomm Corporation +EC:17:66 Research Centre Module +7C:FF:62 Huizhou Super Electron Technology Co.,Ltd. +A0:D1:2A AXPRO Technology Inc. +30:C7:50 MIC Technology Group +44:29:38 NietZsche enterprise Co.Ltd. +D8:81:CE AHN INC. +E0:D3:1A EQUES Technology Co., Limited +9C:3E:AA EnvyLogic Co.,Ltd. +90:98:64 Impex-Sat GmbH&Co KG +DC:E5:78 Experimental Factory of Scientific Engineering and Special Design Department +94:9F:3F Optek Digital Technology company limited +98:77:70 Pep Digital Technology (Guangzhou) Co., Ltd +44:11:C2 Telegartner Karl Gartner GmbH +94:51:BF Hyundai ESG +4C:7F:62 Nokia Corporation +84:17:66 Weifang GoerTek Electronics Co., Ltd +F0:3F:F8 R L Drake +B0:C5:54 D-Link International +54:D1:63 MAX-TECH,INC +E4:12:18 ShenZhen Rapoo Technology Co., Ltd. +2C:8A:72 HTC Corporation +44:86:C1 Siemens Low Voltage & Products +C8:31:68 eZEX corporation +F8:4A:73 EUMTECH CO., LTD +88:0F:10 Huami Information Technology Co.,Ltd. +24:33:6C Private +C4:6B:B4 myIDkey +EC:E5:12 tado GmbH +30:91:8F Technicolor +FC:09:F6 GUANGDONG TONZE ELECTRIC CO.,LTD +68:78:48 Westunitis Co., Ltd. +A8:B9:B3 ESSYS +64:B3:70 PowerComm Solutions LLC +D8:65:95 Toy's Myth Inc. +D8:DD:5F BALMUDA Inc. +88:D9:62 Canopus Systems US LLC +24:C8:48 mywerk system GmbH +2C:18:AE Trend Electronics Co., Ltd. +E0:97:F2 Atomax Inc. +90:F3:B7 Kirisun Communications Co., Ltd. +DC:AD:9E GreenPriz +B4:82:7B AKG Acoustics GmbH +90:8C:44 H.K ZONGMU TECHNOLOGY CO., LTD. +0C:47:3D Hitron Technologies. Inc +4C:5E:0C Routerboard.com +9C:F8:DB shenzhen eyunmei technology co,.ltd +64:42:14 Swisscom Energy Solutions AG +8C:CD:A2 ACTP, Inc. +CC:72:0F Viscount Systems Inc. +90:67:17 Alphion India Private Limited +24:05:0F MTN Electronic Co. Ltd +40:B6:B1 SUNGSAM CO,.Ltd +98:FF:6A OTEC(Shanghai)Technology Co.,Ltd. +AC:6B:AC Jenny Science AG +70:7C:18 ADATA Technology Co., Ltd +FC:4B:1C INTERSENSOR S.R.L. +18:79:A2 GMJ ELECTRIC LIMITED +E0:C8:6A SHENZHEN TW-SCIE Co., Ltd +80:BA:E6 Neets +3C:18:A0 Luxshare Precision Industry Co.,Ltd. +4C:B8:1C SAM Electronics GmbH +04:1A:04 WaveIP +50:20:6B Emerson Climate Technologies Transportation Solutions +C8:EE:75 Pishion International Co. Ltd +CC:34:29 TP-LINK TECHNOLOGIES CO.,LTD. +40:74:96 aFUN TECHNOLOGY INC. +18:C8:E7 Shenzhen Hualistone Technology Co.,Ltd +3C:F7:48 Shenzhen Linsn Technology Development Co.,Ltd +9C:03:9E Beijing Winchannel Software Technology Co., Ltd +F8:A9:63 COMPAL INFORMATION (KUNSHAN) CO., LTD. +48:A2:B7 Kodofon JSC +44:3C:9C Pintsch Tiefenbach GmbH +F8:1C:E5 Telefonbau Behnke GmbH +BC:2D:98 ThinGlobal LLC +7C:72:E4 Unikey Technologies +18:1B:EB Actiontec Electronics, Inc +CC:74:98 Filmetrics Inc. +7C:6A:B3 IBC TECHNOLOGIES INC. +F0:32:1A Mita-Teknik A/S +4C:D7:B6 Helmer Scientific +74:6F:3D Contec GmbH +48:3D:32 Syscor Controls & Automation +90:31:CD Onyx Healthcare Inc. +A0:E4:53 Sony Mobile Communications AB +40:4A:18 Addrek Smart Solutions +C4:C0:AE MIDORI ELECTRONIC CO., LTD. +90:83:7A General Electric Water & Process Technologies +08:97:58 Shenzhen Strong Rising Electronics Co.,Ltd DongGuan Subsidiary +B4:24:E7 Codetek Technology Co.,Ltd +44:EE:30 Budelmann Elektronik GmbH +38:DB:BB Sunbow Telecom Co., Ltd. +24:93:CA Voxtronic Technology Computer-Systeme GmbH +68:8A:B5 EDP Servicos +40:7A:80 Nokia Corporation +F0:61:30 Advantage Pharmacy Services, LLC +D4:81:CA iDevices, LLC +B8:98:F7 Gionee Communication Equipment Co,Ltd.ShenZhen +C0:F1:C4 Pacidal Corporation Ltd. +D8:58:D7 CZ.NIC, z.s.p.o. +10:B7:13 Private +E8:E7:70 Warp9 Tech Design, Inc. +78:CA:5E ELNO +98:FF:D0 Lenovo Mobile Communication Technology Ltd. +50:A0:54 Actineon +48:EE:86 UTStarcom (China) Co.,Ltd +50:56:A8 Jolla Ltd +D0:9D:0A LINKCOM +54:FB:58 WISEWARE, Lda +C0:A0:BB D-Link International +28:A1:EB ETEK TECHNOLOGY (SHENZHEN) CO.,LTD +4C:CB:F5 zte corporation +F0:F5:AE Adaptrum Inc. +F4:28:96 SPECTO PAINEIS ELETRONICOS LTDA +1C:7B:21 Sony Mobile Communications AB +BC:96:80 Shenzhen Gongjin Electronics Co.,Ltd +9C:28:40 Discovery Technology,LTD.. +F8:9F:B8 YAZAKI Energy System Corporation +F0:37:A1 Huike Electronics (SHENZHEN) CO., LTD. +6C:D1:B0 WING SING ELECTRONICS HONG KONG LIMITED +A4:F5:22 CHOFU SEISAKUSHO CO.,LTD +7C:E5:6B ESEN Optoelectronics Technology Co.,Ltd. +CC:47:03 Intercon Systems Co., Ltd. +5C:33:27 Spazio Italia srl +F8:5B:C9 M-Cube Spa +80:05:DF Montage Technology Group Limited +78:E8:B6 zte corporation +04:1B:94 Host Mobility AB +CC:2A:80 Micro-Biz intelligence solutions Co.,Ltd +38:59:F8 MindMade Sp. z o.o. +5C:02:6A Applied Vision Corporation +7C:BD:06 AE REFUsol +94:BA:56 Shenzhen Coship Electronics Co., Ltd. +28:94:AF Samhwa Telecom +74:0E:DB Optowiz Co., Ltd +00:A2:FF abatec group AG +D0:95:C7 Pantech Co., Ltd. +D0:2C:45 littleBits Electronics, Inc. +50:27:C7 TECHNART Co.,Ltd +24:80:00 Westcontrol AS +F8:4A:7F Innometriks Inc +58:63:9A TPL SYSTEMES +0C:9B:13 Shanghai Magic Mobile Telecommunication Co.Ltd. +3C:15:EA TESCOM CO., LTD. +B4:CC:E9 PROSYST +34:A3:BF Terewave. Inc. +B0:CE:18 Zhejiang shenghui lighting co.,Ltd +50:3C:C4 Lenovo Mobile Communication Technology Ltd. +28:6D:97 SAMJIN Co., Ltd. +AC:E4:2E SK hynix +08:EF:3B MCS Logic Inc. +80:6C:8B KAESER KOMPRESSOREN AG +04:8C:03 ThinPAD Technology (Shenzhen)CO.,LTD +84:E6:29 Bluwan SA +34:CD:6D CommSky Technologies +C4:7F:51 Inventek Systems +E8:D4:E0 Beijing BenyWave Technology Co., Ltd. +38:89:DC Opticon Sensors Europe B.V. +68:1D:64 Sunwave Communications Co., Ltd +F4:CD:90 Vispiron Rotec GmbH +E4:38:F2 Advantage Controls +24:C9:A1 Ruckus Wireless +C8:F3:86 Shenzhen Xiaoniao Technology Co.,Ltd +E8:CE:06 SkyHawke Technologies, LLC. +B0:80:8C Laser Light Engines +C4:19:EC Qualisys AB +98:10:94 Shenzhen Vsun communication technology Co.,ltd +08:27:19 APS systems/electronic AG +D4:AC:4E BODi rS, LLC +B0:38:50 Nanjing CAS-ZDC IOT SYSTEM CO.,LTD +C0:DA:74 Hangzhou Sunyard Technology Co., Ltd. +34:A8:43 KYOCERA Display Corporation +6C:57:79 Aclima, Inc. +40:BD:9E Physio-Control, Inc +58:1C:BD Affinegy +F8:2B:C8 Jiangsu Switter Co., Ltd +60:C3:97 2Wire Inc +30:65:EC Wistron (ChongQing) +5C:A3:EB Lokel s.r.o. +04:DF:69 Car Connectivity Consortium +28:DB:81 Shanghai Guao Electronic Technology Co., Ltd +9C:B7:93 Creatcomm Technology Inc. +A0:B1:00 ShenZhen Cando Electronics Co.,Ltd +40:56:0C In Home Displays Ltd +94:36:E0 Sichuan Bihong Broadcast & Television New Technologies Co.,Ltd +D4:D5:0D Southwest Microwave, Inc +B8:CD:93 Penetek, Inc +D8:FE:E3 D-Link International +F8:51:6D Denwa Technology Corp. +10:78:CE Hanvit SI, Inc. +D8:DA:52 APATOR S.A. +10:7A:86 U&U ENGINEERING INC. +98:0D:2E HTC Corporation +84:2F:75 Innokas Group +D4:BF:7F UPVEL +50:61:D6 Indu-Sol GmbH +68:EC:62 YODO Technology Corp. Ltd. +F0:7F:0C Leopold Kostal GmbH &Co. KG +5C:22:C4 DAE EUN ELETRONICS CO., LTD +08:48:2C Raycore Taiwan Co., LTD. +F4:B3:81 WindowMaster A/S +74:F1:02 Beijing HCHCOM Technology Co., Ltd +08:0E:A8 Velex s.r.l. +00:86:A0 Private +60:FE:1E China Palms Telecom.Ltd +84:1E:26 KERNEL-I Co.,LTD +34:9D:90 Heinzmann GmbH & CO. KG +D4:01:6D TP-LINK TECHNOLOGIES CO.,LTD. +FC:11:86 Logic3 plc +50:CD:32 NanJing Chaoran Science & Technology Co.,Ltd. +68:3E:EC ERECA +44:61:9C FONsystem co. ltd. +BC:BA:E1 AREC Inc. +18:FA:6F ISC applied systems corp +9C:97:26 Technicolor +88:09:05 MTMCommunications +C4:26:28 Airo Wireless +74:5F:00 Samsung Semiconductor Inc. +54:1F:D5 Advantage Electronics +90:FF:79 Metro Ethernet Forum +E0:81:77 GreenBytes, Inc. +48:F2:30 Ubizcore Co.,LTD +B0:C9:5B Beijing Symtech CO.,LTD +88:15:44 Meraki, Inc. +DC:A9:89 MACANDC +C0:5E:6F V. Stonkaus firma Kodinis Raktas +6C:D1:46 Smartek d.o.o. +E0:C2:B7 Masimo Corporation +F8:2E:DB RTW GmbH & Co. KG +60:A4:4C ASUSTek COMPUTER INC. +04:5F:A7 Shenzhen Yichen Technology Development Co.,LTD +98:3F:9F China SSJ (Suzhou) Network Technology Inc. +F0:23:29 SHOWA DENKI CO.,LTD. +64:99:A0 AG Elektronik AB +A8:01:80 IMAGO Technologies GmbH +04:4C:EF Fujian Sanao Technology Co.,Ltd +DC:1D:D4 Microstep-MIS spol. s r.o. +E0:18:77 FUJITSU LIMITED +14:94:48 BLU CASTLE S.A. +40:51:6C Grandex International Corporation +D0:D4:71 MVTECH co., Ltd +34:AD:E4 Shanghai Chint Power Systems Co., Ltd. +18:53:E0 Hanyang Digitech Co.Ltd +C4:E0:32 IEEE 1904.1 Working Group +AC:DB:DA Shenzhen Geniatech Inc, Ltd +A4:2C:08 Masterwork Automodules +60:B1:85 ATH system +50:4F:94 Loxone Electronics GmbH +8C:07:8C FLOW DATA INC +88:87:DD DarbeeVision Inc. +80:7B:1E Corsair Components +A0:E2:5A Amicus SK, s.r.o. +F8:7B:62 FASTWEL INTERNATIONAL CO., LTD. Taiwan Branch +B4:98:42 zte corporation +9C:9C:1D Starkey Labs Inc. +90:CC:24 Synaptics, Inc +AC:17:02 Fibar Group sp. z o.o. +78:98:FD Q9 Networks Inc. +3C:57:D5 FiveCo +4C:22:58 cozybit, Inc. +10:EA:59 Cisco SPVTG +34:FA:40 Guangzhou Robustel Technologies Co., Limited +18:17:25 Cameo Communications, Inc. +E8:2E:24 Out of the Fog Research LLC +1C:52:D6 FLAT DISPLAY TECHNOLOGY CORPORATION +40:27:0B Mobileeco Co., Ltd +AC:E9:7F IoT Tech Limited +30:15:18 Ubiquitous Communication Co. ltd. +10:12:48 ITG, Inc. +10:6F:EF Ad-Sol Nissin Corp +A0:36:F0 Comprehensive Power +18:0C:AC CANON INC. +00:DB:1E Albedo Telecom SL +74:94:3D AgJunction +08:0C:0B SysMik GmbH Dresden +C8:FB:26 Cisco SPVTG +7C:C8:AB Acro Associates, Inc. +C4:DA:26 NOBLEX SA +1C:C3:16 MileSight Technology Co., Ltd. +C4:E7:BE SCSpro Co.,Ltd +10:5F:49 Cisco SPVTG +04:18:D6 Ubiquiti Networks +44:95:FA Qingdao Santong Digital Technology Co.Ltd +60:F2:EF VisionVera International Co., Ltd. +B0:12:66 Futaba-Kikaku +90:9D:E0 Newland Design + Assoc. Inc. +64:D8:14 Cisco Systems, Inc +6C:E4:CE Villiger Security Solutions AG +30:F3:3A +plugg srl +58:CF:4B Lufkin Industries +C4:39:3A SMC Networks Inc +C4:01:7C Ruckus Wireless +D4:5C:70 Wi-Fi Alliance +08:EB:ED World Elite Technology Co.,LTD +60:BC:4C EWM Hightec Welding GmbH +F4:1E:26 Simon-Kaloi Engineering +C4:45:67 SAMBON PRECISON and ELECTRONICS +D0:73:8E DONG OH PRECISION CO., LTD. +E8:71:8D Elsys Equipamentos Eletronicos Ltda +3C:83:B5 Advance Vision Electronics Co. Ltd. +80:82:87 ATCOM Technology Co.Ltd. +28:A1:92 GERP Solution +A0:8C:15 Gerhard D. Wempe KG +8C:E0:81 zte corporation +48:52:61 SOREEL +10:FB:F0 KangSheng LTD. +3C:57:BD Kessler Crane Inc. +60:0F:77 SilverPlus, Inc +68:51:B7 PowerCloud Systems, Inc. +A4:4E:2D Adaptive Wireless Solutions, LLC +3C:C1:2C AES Corporation +0C:CD:FB EDIC Systems Inc. +2C:E2:A8 DeviceDesign +B4:9D:B4 Axion Technologies Inc. +D8:18:2B Conti Temic Microelectronic GmbH +30:44:49 PLATH GmbH +94:FD:2E Shanghai Uniscope Technologies Co.,Ltd +64:A3:41 Wonderlan (Beijing) Technology Co., Ltd. +8C:AE:4C Plugable Technologies +D8:D5:B9 Rainforest Automation, Inc. +C0:A0:E2 Eden Innovations +E8:AB:FA Shenzhen Reecam Tech.Ltd. +58:87:4C LITE-ON CLEAN ENERGY TECHNOLOGY CORP. +E8:5B:F0 Imaging Diagnostics +20:DC:93 Cheetah Hi-Tech, Inc. +78:46:C4 DAEHAP HYPER-TECH +0C:D9:C1 Visteon Corporation +68:AB:8A RF IDeas +70:E2:4C SAE IT-systems GmbH & Co. KG +88:61:5A Siano Mobile Silicon Ltd. +30:21:5B Shenzhen Ostar Display Electronic Co.,Ltd +DC:02:8E zte corporation +DC:B0:58 Bürkert Werke GmbH +64:1C:67 DIGIBRAS INDUSTRIA DO BRASILS/A +C8:E1:A7 Vertu Corporation Limited +88:D7:BC DEP Company +F4:94:66 CountMax, ltd +4C:AB:33 KST technology +5C:E0:F6 NIC.br- Nucleo de Informacao e Coordenacao do Ponto BR +00:E6:66 ARIMA Communications Corp. +F8:E4:FB Actiontec Electronics, Inc +58:87:E2 Shenzhen Coship Electronics Co., Ltd. +B4:DF:FA Litemax Electronics Inc. +48:F8:B3 Cisco-Linksys, LLC +68:1C:A2 Rosewill Inc. +7C:09:2B Bekey A/S +D8:08:F5 Arcadia Networks Co. Ltd. +84:DF:0C NET2GRID BV +3C:B8:7A Private +E4:25:E9 Color-Chip +F4:48:48 Amscreen Group Ltd +44:13:19 WKK TECHNOLOGY LTD. +08:8F:2C Hills Sound Vision & Lighting +3C:9F:81 Shenzhen CATIC Bit Communications Technology Co.,Ltd +18:33:9D Cisco Systems, Inc +64:22:16 Shandong Taixin Electronic co.,Ltd +D4:3D:7E Micro-Star Int'l Co, Ltd +64:51:7E LONG BEN (DONGGUAN) ELECTRONIC TECHNOLOGY CO.,LTD. +0C:57:EB Mueller Systems +48:28:2F zte corporation +74:53:27 COMMSEN CO., LIMITED +E4:71:85 Securifi Ltd +88:10:36 Panodic(ShenZhen) Electronics Limted +18:F8:7A i3 International Inc. +14:2D:F5 Amphitech +C0:8A:DE Ruckus Wireless +90:F7:2F Phillips Machine & Welding Co., Inc. +B4:55:70 Borea +5C:50:15 Cisco Systems, Inc +0C:D2:B5 Binatone Telecommunication Pvt. Ltd +48:46:F1 Uros Oy +1C:D4:0C Kriwan Industrie-Elektronik GmbH +74:7B:7A ETH Inc. +1C:7C:45 Vitek Industrial Video Products, Inc. +C8:AE:9C Shanghai TYD Elecronic Technology Co. Ltd +A4:4C:11 Cisco Systems, Inc +78:25:44 Omnima Limited +D4:DF:57 Alpinion Medical Systems +50:48:EB BEIJING HAIHEJINSHENG NETWORK TECHNOLOGY CO. LTD. +40:AC:8D Data Management, Inc. +54:46:6B Shenzhen CZTIC Electronic Technology Co., Ltd +1C:34:77 Innovation Wireless +44:23:AA Farmage Co., Ltd. +A0:EF:84 Seine Image Int'l Co., Ltd +AC:7A:42 iConnectivity +58:69:F9 Fusion Transactive Ltd. +B0:C8:3F Jiangsu Cynray IOT Co., Ltd. +CC:14:A6 Yichun MyEnergy Domain, Inc +98:D6:86 Chyi Lee industry Co., ltd. +20:44:3A Schneider Electric Asia Pacific Ltd +28:C9:14 Taimag Corporation +4C:78:97 Arrowhead Alarm Products Ltd +AC:0A:61 Labor S.r.L. +B4:82:C5 Relay2, Inc. +60:D1:AA Vishal Telecommunications Pvt Ltd +CC:C1:04 Applied Technical Systems +70:9B:A5 Shenzhen Y&D Electronics Co.,LTD. +EC:42:F0 ADL Embedded Solutions, Inc. +10:BD:18 Cisco Systems, Inc +B0:43:5D NuLEDs, Inc. +A8:2B:D6 Shina System Co., Ltd +8C:C7:AA Radinet Communications Inc. +20:01:4F Linea Research Ltd +80:D1:8B Hangzhou I'converge Technology Co.,Ltd +B4:A4:B5 Zen Eye Co.,Ltd +48:91:53 Weinmann Geräte für Medizin GmbH + Co. KG +54:9D:85 EnerAccess inc +5C:EE:79 Global Digitech Co LTD +9C:E1:0E NCTech Ltd +28:F6:06 Syes srl +A0:C3:DE Triton Electronic Systems Ltd. +AC:3F:A4 TAIYO YUDEN CO.,LTD +0C:13:0B Uniqoteq Ltd. +14:CF:8D OHSUNG ELECTRONICS CO., LTD. +80:86:98 Netronics Technologies Inc. +2C:00:F7 XOS +80:93:93 Xapt GmbH +00:DE:FB Cisco Systems, Inc +90:AC:3F BrightSign LLC +7C:AC:B2 Bosch Software Innovations GmbH +00:43:FF KETRON S.R.L. +74:57:98 TRUMPF Laser GmbH + Co. KG +38:E0:8E Mitsubishi Electric Corporation +E4:FA:1D PAD Peripheral Advanced Design Inc. +4C:9E:80 KYOKKO ELECTRIC Co., Ltd. +A8:26:D9 HTC Corporation +F0:3A:55 Omega Elektronik AS +24:B8:8C Crenus Co.,Ltd. +98:BC:57 SVA TECHNOLOGIES CO.LTD +98:FE:03 Ericsson - North America +F0:EE:BB VIPAR GmbH +54:D0:ED AXIM Communications +A4:90:05 CHINA GREATWALL COMPUTER SHENZHEN CO.,LTD +30:55:ED Trex Network LLC +D4:A0:2A Cisco Systems, Inc +04:63:E0 Nome Oy +BC:A4:E1 Nabto +90:0A:3A PSG Plastic Service GmbH +FC:5B:26 MikroBits +5C:C2:13 Fr. Sauter AG +58:1D:91 Advanced Mobile Telecom co.,ltd. +9C:B0:08 Ubiquitous Computing Technology Corporation +00:37:6D Murata Manufacturing Co., Ltd. +E0:EF:25 Lintes Technology Co., Ltd. +CC:EE:D9 VAHLE DETO GmbH +64:5E:BE Yahoo! JAPAN +CC:C5:0A SHENZHEN DAJIAHAO TECHNOLOGY CO.,LTD +D0:1A:A7 UniPrint +B0:8E:1A URadio Systems Co., Ltd +40:60:5A Hawkeye Tech Co. Ltd +E0:5D:A6 Detlef Fink Elektronik & Softwareentwicklung +0C:75:23 BEIJING GEHUA CATV NETWORK CO.,LTD +BC:2C:55 Bear Flag Design, Inc. +04:F4:BC Xena Networks +60:8C:2B Hanson Technology +EC:11:20 FloDesign Wind Turbine Corporation +D0:F7:3B Helmut Mauell GmbH +C4:95:A2 SHENZHEN WEIJIU INDUSTRY AND TRADE DEVELOPMENT CO., LTD +0C:9E:91 Sankosha Corporation +F4:87:71 Infoblox +04:F0:21 Compex Systems Pte Ltd +88:23:FE TTTech Computertechnik AG +98:AA:D7 BLUE WAVE NETWORKING CO LTD +20:10:7A Gemtek Technology Co., Ltd. +50:22:67 PixeLINK +90:92:B4 Diehl BGT Defence GmbH & Co. KG +80:60:07 RIM +38:A8:51 Moog, Ing +90:18:5E Apex Tool Group GmbH & Co OHG +64:9E:F3 Cisco Systems, Inc +34:D0:9B MobilMAX Technology Inc. +08:75:72 Obelux Oy +9C:1F:DD Accupix Inc. +50:64:41 Greenlee +80:94:6C TOKYO RADAR CORPORATION +00:FA:3B CLOOS ELECTRONIC GMBH +28:CD:1C Espotel Oy +D8:24:BD Cisco Systems, Inc +D8:78:E5 KUHN SA +C4:93:00 8Devices +4C:39:10 Newtek Electronics co., Ltd. +58:08:FA Fiber Optic & telecommunication INC. +7C:94:B2 Philips Healthcare PCCI +20:05:05 RADMAX COMMUNICATION PRIVATE LIMITED +58:48:C0 COFLEC +C8:F7:04 Building Block Video +C8:AF:40 marco Systemanalyse und Entwicklung GmbH +AC:31:9D Shenzhen TG-NET Botone Technology Co.,Ltd. +08:D0:9F Cisco Systems, Inc +B8:14:13 Keen High Holding(HK) Ltd. +20:37:BC Kuipers Electronic Engineering BV +A8:87:ED ARC Wireless LLC +98:35:71 Sub10 Systems Ltd +B0:5C:E5 Nokia Corporation +CC:6B:F1 Sound Masking Inc. +B8:2C:A0 Honeywell HomMed +94:AE:61 Alcatel Lucent +7C:A6:1D MHL, LLC +5C:CE:AD CDYNE Corporation +9C:A3:BA SAKURA Internet Inc. +70:97:56 Happyelectronics Co.,Ltd +D4:20:6D HTC Corporation +18:66:E3 Veros Systems, Inc. +00:B3:38 Kontron Design Manufacturing Services (M) Sdn. Bhd +94:DE:0E SmartOptics AS +A4:29:B7 bluesky +7C:6B:33 Tenyu Tech Co. Ltd. +CC:B8:F1 EAGLE KINGDOM TECHNOLOGIES LIMITED +DC:2E:6A HCT. Co., Ltd. +34:25:5D Shenzhen Loadcom Technology Co.,Ltd +18:97:FF TechFaith Wireless Technology Limited +8C:8E:76 taskit GmbH +B4:D8:DE iota Computing, Inc. +54:CD:A7 Fujian Shenzhou Electronic Co.,Ltd +10:00:FD LaonPeople +60:35:53 Buwon Technology +B8:9B:C9 SMC Networks Inc +48:02:2A B-Link Electronic Limited +48:A6:D2 GJsun Optical Science and Tech Co.,Ltd. +18:6D:99 Adanis Inc. +D4:4B:5E TAIYO YUDEN CO., LTD. +B4:0C:25 Palo Alto Networks +40:BF:17 Digistar Telecom. SA +E4:AF:A1 HES-SO +58:92:0D Kinetic Avionics Limited +20:76:00 Actiontec Electronics, Inc +84:D3:2A IEEE 1905.1 +F8:E7:B5 µTech Tecnologia LTDA +04:62:D7 ALSTOM HYDRO FRANCE +CC:C8:D7 CIAS Elettronica srl +64:AE:0C Cisco Systems, Inc +A4:46:FA AmTRAN Video Corporation +28:04:E0 FERMAX ELECTRONICA S.A.U. +FC:01:CD FUNDACION TEKNIKER +88:E7:A6 iKnowledge Integration Corp. +98:E7:9A Foxconn(NanJing) Communication Co.,Ltd. +54:F5:B6 ORIENTAL PACIFIC INTERNATIONAL LIMITED +34:A5:5D TECHNOSOFT INTERNATIONAL SRL +D0:C2:82 Cisco Systems, Inc +44:9C:B5 Alcomp, Inc +24:E6:BA JSC Zavod im. Kozitsky +8C:8A:6E ESTUN AUTOMATION TECHNOLOY CO., LTD +E0:ED:1A vastriver Technology Co., Ltd +C8:3B:45 JRI-Maxant +68:5E:6B PowerRay Co., Ltd. +4C:32:D9 M Rutty Holdings Pty. Ltd. +50:A7:33 Ruckus Wireless +60:3F:C5 COX CO., LTD +18:2B:05 8D Technologies +54:A9:D4 Minibar Systems +48:61:A3 Concern Axion JSC +D8:96:85 GoPro +08:A1:2B ShenZhen EZL Technology Co., Ltd +94:31:9B Alphatronics BV +08:FC:52 OpenXS BV +20:5B:5E Shenzhen Wonhe Technology Co., Ltd +3C:C9:9E Huiyang Technology Co., Ltd +C8:A1:BA Neul Ltd +AC:02:EF Comsis +C4:3A:9F Siconix Inc. +04:18:B6 Private +D4:02:4A Delphian Systems LLC +84:24:8D Zebra Technologies Inc +24:EC:99 ASKEY COMPUTER CORP +B8:62:1F Cisco Systems, Inc +B4:5C:A4 Thing-talk Wireless Communication Technologies Corporation Limited +AC:8A:CD ROGER D.Wensker, G.Wensker sp.j. +98:42:46 SOL INDUSTRY PTE., LTD +28:A5:74 Miller Electric Mfg. Co. +38:26:CD ANDTEK +C4:36:DA Rusteletech Ltd. +00:FC:70 Intrepid Control Systems, Inc. +A4:EE:57 SEIKO EPSON CORPORATION +D0:AF:B6 Linktop Technology Co., LTD +44:4F:5E Pan Studios Co.,Ltd. +0C:39:56 Observator instruments +A4:99:81 FuJian Elite Power Tech CO.,LTD. +B8:3A:7B Worldplay (Canada) Inc. +78:3F:15 EasySYNC Ltd. +F4:B5:49 Yeastar Technology Co., Ltd. +88:B1:68 Delta Control GmbH +20:B3:99 Enterasys +18:B7:9E Invoxia +14:74:11 RIM +5C:56:ED 3pleplay Electronics Private Limited +08:38:A5 Funkwerk plettac electronic GmbH +BC:CD:45 VOISMART +78:02:8F Adaptive Spectrum and Signal Alignment (ASSIA), Inc. +D4:A4:25 SMAX Technology Co., Ltd. +98:F8:DB Marini Impianti Industriali s.r.l. +14:07:08 Private +24:C9:DE Genoray +60:54:64 Eyedro Green Solutions Inc. +54:05:5F Alcatel Lucent +40:55:39 Cisco Systems, Inc +B8:BE:BF Cisco Systems, Inc +38:FE:C5 Ellips B.V. +24:C8:6E Chaney Instrument Co. +D4:D8:98 Korea CNO Tech Co., Ltd +50:70:E5 He Shan World Fair Electronics Technology Limited +28:EE:2C Frontline Test Equipment +80:22:75 Beijing Beny Wave Technology Co Ltd +BC:81:99 BASIC Co.,Ltd. +00:07:26 Shenzhen Gongjin Electronics Co., Ltd. +24:47:0E PentronicAB +A4:DB:2E Kingspan Environmental Ltd +F4:4E:FD Actions Semiconductor Co.,Ltd.(Cayman Islands) +34:BC:A6 Beijing Ding Qing Technology, Ltd. +D4:C1:FC Nokia Corporation +48:DC:FB Nokia Corporation +68:84:70 eSSys Co.,Ltd +F0:8B:FE COSTEL.,CO.LTD +54:35:DF Symeo GmbH +F4:3D:80 FAG Industrial Services GmbH +D4:F0:B4 Napco Security Technologies +40:B3:FC Logital Co. Limited +D0:5F:CE Hitachi Data Systems +8C:82:A8 Insigma Technology Co.,Ltd +3C:27:63 SLE quality engineering GmbH & Co. KG +A4:4B:15 Sun Cupid Technology (HK) LTD +50:8A:CB SHENZHEN MAXMADE TECHNOLOGY CO., LTD. +70:32:D5 Athena Wireless Communications Inc +7C:F0:BA Linkwell Telesystems Pvt Ltd +CC:C6:2B Tri-Systems Corporation +AC:F9:7E ELESYS INC. +4C:73:67 Genius Bytes Software Solutions GmbH +DC:2B:66 InfoBLOCK S.A. de C.V. +14:F0:C5 Xtremio Ltd. +C0:27:B9 Beijing National Railway Research & Design Institute of Signal & Communication Co., Ltd. +70:A4:1C Advanced Wireless Dynamics S.L. +28:51:32 Shenzhen Prayfly Technology Co.,Ltd +4C:3B:74 VOGTEC(H.K.) Co., Ltd +50:97:72 Westinghouse Digital +D8:5D:84 CAx soft GmbH +78:A6:83 Precidata +BC:67:84 Environics Oy +B4:E0:CD Fusion-io, Inc +50:AF:73 Shenzhen Bitland Information Technology Co., Ltd. +48:8E:42 DIGALOG GmbH +28:60:46 Lantech Communications Global, Inc. +A4:24:B3 FlatFrog Laboratories AB +A4:85:6B Q Electronics Ltd +84:EA:99 Vieworks +DC:CB:A8 Explora Technologies Inc +58:EE:CE Icon Time Systems +A4:1B:C0 Fastec Imaging Corporation +E0:1F:0A Xslent Energy Technologies. LLC +F4:03:21 BeNeXt B.V. +00:B0:33 OAO Izhevskiy radiozavod +70:7E:DE NASTEC LTD. +CC:BE:71 OptiLogix BV +D8:B1:2A Panasonic Mobile Communications Co., Ltd. +7C:DD:90 Shenzhen Ogemray Technology Co., Ltd. +C0:7E:40 SHENZHEN XDK COMMUNICATION EQUIPMENT CO.,LTD +E4:4F:29 MA Lighting Technology GmbH +6C:AB:4D Digital Payment Technologies +60:DA:23 Estech Co.,Ltd +28:F3:58 2C - Trifonov & Co +30:4C:7E Panasonic Electric Works Automation Controls Techno Co.,Ltd. +64:D1:A3 Sitecom Europe BV +38:31:AC WEG +2C:7E:CF Onzo Ltd +10:E3:C7 Seohwa Telecom +E8:40:40 Cisco Systems, Inc +0C:81:12 Private +7C:7D:41 Jinmuyu Electronics Co., Ltd. +4C:14:80 NOREGON SYSTEMS, INC +60:F6:73 TERUMO CORPORATION +E4:8A:D5 RF WINDOW CO., LTD. +24:F0:FF GHT Co., Ltd. +4C:07:C9 COMPUTER OFFICE Co.,Ltd. +40:F4:EC Cisco Systems, Inc +28:72:F0 ATHENA +9C:80:7D SYSCABLE Korea Inc. +18:0B:52 Nanotron Technologies GmbH +64:DE:1C Kingnetic Pte Ltd +54:04:96 Gigawave LTD +C8:C1:26 ZPM Industria e Comercio Ltda +04:1D:10 Dream Ware Inc. +88:DD:79 Voltaire +44:68:AB JUIN COMPANY, LIMITED +90:2E:87 LabJack +C8:20:8E Storagedata +00:B3:42 MacroSAN Technologies Co., Ltd. +4C:B9:C8 CONET CO., LTD. +04:74:A1 Aligera Equipamentos Digitais Ltda +10:64:E2 ADFweb.com s.r.l. +CC:34:D7 GEWISS S.P.A. +B4:CF:DB Shenzhen Jiuzhou Electric Co.,LTD +C4:63:54 U-Raku, Inc. +20:FE:DB M2M Solution S.A.S. +40:5F:BE RIM +E0:5B:70 Innovid, Co., Ltd. +04:36:04 Gyeyoung I&T +34:F9:68 ATEK Products, LLC +D0:D0:FD Cisco Systems, Inc +70:64:17 ORBIS TECNOLOGIA ELECTRICA S.A. +64:FC:8C Zonar Systems +28:ED:58 JAG Jakob AG +98:73:C4 Sage Electronic Engineering LLC +B8:79:7E Secure Meters (UK) Limited +20:05:E8 OOO InProMedia +E0:D1:0A Katoudenkikougyousyo co ltd +1C:06:56 IDY Corporation +C4:4B:44 Omniprint Inc. +60:15:C7 IdaTech +18:8E:D5 TP Vision Belgium N.V. - innovation site Brugge +8C:E7:B3 Sonardyne International Ltd +00:34:F1 Radicom Research, Inc. +A8:B0:AE LEONI +60:89:3C Thermo Fisher Scientific P.O.A. +5C:17:D3 LGE +34:78:77 O-NET Communications(Shenzhen) Limited +70:A1:91 Trendsetter Medical, LLC +A4:9B:13 Burroughs Payment Systems, Inc. +58:BC:27 Cisco Systems, Inc +34:D2:C4 RENA GmbH Print Systeme +E0:A6:70 Nokia Corporation +E0:61:B2 HANGZHOU ZENOINTEL TECHNOLOGY CO., LTD +44:91:DB Shanghai Huaqin Telecom Technology Co.,Ltd +14:D7:6E CONCH ELECTRONIC Co.,Ltd +CC:6B:98 Minetec Wireless Technologies +C4:CD:45 Beijing Boomsense Technology CO.,LTD. +D0:BB:80 SHL Telemedicine International Ltd. +1C:83:B0 Linked IP GmbH +F0:65:DD Primax Electronics Ltd. +70:65:82 Suzhou Hanming Technologies Co., Ltd. +94:C7:AF Raylios Technology +68:54:F5 enLighted Inc +00:8C:10 Black Box Corp. +20:A2:E7 Lee-Dickens Ltd +8C:DD:8D Wifly-City System Inc. +EC:98:C1 Beijing Risbo Network Technology Co.,Ltd +EC:C3:8A Accuenergy (CANADA) Inc +D4:8F:AA Sogecam Industrial, S.A. +38:A9:5F Actifio Inc +A0:DD:E5 SHARP Corporation +94:A7:BC BodyMedia, Inc. +6C:9B:02 Nokia Corporation +84:DB:2F Sierra Wireless Inc +A4:50:55 busware.de +2C:D2:E7 Nokia Corporation +C8:93:83 Embedded Automation, Inc. +D4:9E:6D Wuhan Zhongyuan Huadian Science & Technology Co., +94:F7:20 Tianjin Deviser Electronics Instrument Co., Ltd +EC:23:68 IntelliVoice Co.,Ltd. +B4:52:53 Seagate Technology +04:DD:4C Velocytech +B4:C8:10 UMPI Elettronica +38:58:0C Panaccess Systems GmbH +24:AF:54 NEXGEN Mediatech Inc. +F0:F9:F7 IES GmbH & Co. KG +CC:0C:DA Miljovakt AS +C0:12:42 Alpha Security Products +90:50:7B Advanced PANMOBIL Systems GmbH & Co. KG +00:B5:D6 Omnibit Inc. +F8:93:F3 VOLANS +7C:3E:9D PATECH +4C:60:D5 airPointe of New Hampshire +D4:52:97 nSTREAMS Technologies, Inc. +78:EC:22 Shanghai Qihui Telecom Technology Co., LTD +F8:D7:56 Simm Tronic Limited +E0:87:B1 Nata-Info Ltd. +A8:B1:D4 Cisco Systems, Inc +4C:BA:A3 Bison Electronics Inc. +EC:7C:74 Justone Technologies Co., Ltd. +3C:1A:79 Huayuan Technology CO.,LTD +30:E4:8E Vodafone UK +08:51:2E Orion Diagnostica Oy +9C:F6:1A UTC Fire and Security +C8:02:A6 Beijing Newmine Technology +C8:4C:75 Cisco Systems, Inc +28:4C:53 Intune Networks +10:2D:96 Looxcie Inc. +30:37:A6 Cisco Systems, Inc +AC:EA:6A GENIX INFOCOMM CO., LTD. +5C:35:DA There Corporation Oy +00:52:18 Wuxi Keboda Electron Co.Ltd +08:F2:F4 Net One Partners Co.,Ltd. +68:EF:BD Cisco Systems, Inc +18:3B:D2 BYD Precision Manufacture Company Ltd. +F4:55:95 HENGBAO Corporation LTD. +C0:8B:6F S I Sistemas Inteligentes Eletrônicos Ltda +BC:A9:D6 Cyber-Rain, Inc. +0C:DD:EF Nokia Corporation +80:C6:3F Remec Broadband Wireless , LLC +F0:9C:BB RaonThink Inc. +FC:E2:3F CLAY PAKY SPA +B0:E3:9D CAT SYSTEM CO.,LTD. +78:A6:BD DAEYEON Control&Instrument Co,.Ltd +48:12:49 Luxcom Technologies Inc. +B4:3D:B2 Degreane Horizon +C4:82:3F Fujian Newland Auto-ID Tech. Co,.Ltd. +F4:C7:95 WEY Elektronik AG +08:76:95 Auto Industrial Co., Ltd. +AC:CE:8F HWA YAO TECHNOLOGIES CO., LTD +04:2F:56 ATOCS (Shenzhen) LTD +08:4E:1C H2A Systems, LLC +A4:B1:21 Arantia 2010 S.L. +98:89:ED Anadem Information Inc. +14:73:73 TUBITAK UEKAE +98:2D:56 Resolution Audio +00:A2:DA INAT GmbH +6C:3E:9C KE Knestel Elektronik GmbH +F8:9D:0D Control Technology Inc. +10:10:B6 McCain Inc +08:1F:F3 Cisco Systems, Inc +5C:E2:86 Nortel Networks +2C:CD:27 Precor Inc +6C:5E:7A Ubiquitous Internet Telecom Co., Ltd +D8:28:C9 General Electric Consumer and Industrial +C8:6C:1E Display Systems Ltd +EC:6C:9F Chengdu Volans Technology CO.,LTD +CC:CC:4E Sun Fountainhead USA. Corp +60:D3:0A Quatius Limited +BC:9D:A5 DASCOM Europe GmbH +94:2E:63 Finsécur +C8:D2:C1 Jetlun (Shenzhen) Corporation +F0:BC:C8 MaxID (Pty) Ltd +40:61:86 MICRO-STAR INT'L CO.,LTD +74:E5:37 RADSPIN +7C:08:D9 Shanghai B-Star Technology Co +44:8E:81 VIG +20:46:F9 Advanced Network Devices (dba:AND) +68:1F:D8 Advanced Telemetry +0C:82:30 SHENZHEN MAGNUS TECHNOLOGIES CO.,LTD +50:93:4F Gradual Tecnologia Ltda. +34:EF:8B NTT Communications Corporation +38:E9:8C Reco S.p.A. +F0:24:08 Talaris (Sweden) AB +A0:69:86 Wellav Technologies Ltd +F0:2F:D8 Bi2-Vision +C8:6C:B6 Optcom Co., Ltd. +C4:59:76 Fugoo Coorporation +B0:C8:AD People Power Company +A8:70:A5 UniComm Inc. +80:17:7D Nortel Networks +E8:DA:AA VideoHome Technology Corp. +64:7D:81 YOKOTA INDUSTRIAL CO,.LTD +88:91:DD Racktivity +C4:19:8B Dominion Voting Systems Corporation +C8:3A:35 Tenda Technology Co., Ltd. +F4:AC:C1 Cisco Systems, Inc +58:4C:EE Digital One Technologies, Limited +E0:64:BB DigiView S.r.l. +4C:63:EB Application Solutions (Electronics and Vision) Ltd +C0:1E:9B Pixavi AS +64:16:8D Cisco Systems, Inc +24:D2:CC SmartDrive Systems Inc. +7C:6C:8F AMS NEVE LTD +C4:E1:7C U2S co. +A8:C2:22 TM-Research Inc. +50:25:2B Nethra Imaging Incorporated +A4:DA:3F Bionics Corp. +9C:4E:8E ALT Systems Ltd +44:83:12 Star-Net +68:79:24 ELS-GmbH & Co. KG +38:BB:23 OzVision America LLC +00:3A:99 Cisco Systems, Inc +04:C0:5B Tigo Energy +5C:14:37 Thyssenkrupp Aufzugswerke GmbH +9C:55:B4 I.S.E. S.r.l. +DC:2C:26 Iton Technology Limited +4C:C4:52 Shang Hai Tyd. Electon Technology Ltd. +F0:C2:4C Zhejiang FeiYue Digital Technology Co., Ltd +08:18:4C A. S. Thomas, Inc. +5C:E2:23 Delphin Technology AG +FC:61:98 NEC Personal Products, Ltd +F8:71:FE The Goldman Sachs Group, Inc. +D8:C3:FB DETRACOM +20:12:57 Most Lucky Trading Ltd +D4:9C:28 JayBird LLC +A0:3A:75 PSS Belgium N.V. +74:6B:82 MOVEK +0C:84:11 A.O. Smith Water Products +F8:E9:68 Egker Kft. +E8:DF:F2 PRF Co., Ltd. +00:64:40 Cisco Systems, Inc +D0:E4:0B Wearable Inc. +AC:86:7E Create New Technology (HK) Limited Company +58:F6:7B Xia Men UnionCore Technology LTD. +A0:2E:F3 United Integrated Services Co., Led. +A8:CE:90 CVC +00:27:1F MIPRO Electronics Co., Ltd +00:27:1A Geenovo Technology Ltd. +00:27:14 Grainmustards, Co,ltd. +00:27:17 CE Digital(Zhenjiang)Co.,Ltd +00:27:08 Nordiag ASA +00:27:01 INCOstartec GmbH +00:27:02 SolarEdge Technologies +00:26:FB AirDio Wireless, Inc. +00:26:F5 XRPLUS Inc. +00:26:32 Instrumentation Technologies d.d. +00:26:2C IKT Advanced Technologies s.r.o. +00:26:26 Geophysical Survey Systems, Inc. +00:26:1F SAE Magnetics (H.K.) Ltd. +00:26:20 ISGUS GmbH +00:26:1A Femtocomm System Technology Corp. +00:26:13 Engel Axil S.L. +00:26:0D Mercury Systems, Inc. +00:25:D8 KOREA MAINTENANCE +00:25:CC Mobile Communications Korea Incorporated +00:25:C5 Star Link Communication Pvt. Ltd. +00:25:C6 kasercorp, ltd +00:25:C0 ZillionTV Corporation +00:25:B4 Cisco Systems, Inc +00:25:B9 Cypress Solutions Inc +00:25:AD Manufacturing Resources International +00:26:00 TEAC Australia Pty Ltd. +00:26:07 Enabling Technology Pty Ltd +00:25:FB Tunstall Healthcare A/S +00:25:FA J&M Analytik AG +00:25:F6 netTALK.com, Inc. +00:25:EF I-TEC Co., Ltd. +00:25:E9 i-mate Development, Inc. +00:25:DF Private +00:26:90 I DO IT +00:26:8A Terrier SC Ltd +00:26:89 General Dynamics Robotic Systems +00:26:84 KISAN SYSTEM +00:26:83 Ajoho Enterprise Co., Ltd. +00:26:7D A-Max Technology Macao Commercial Offshore Company Limited +00:26:77 DEIF A/S +00:26:71 AUTOVISION Co., Ltd +00:26:6A ESSENSIUM NV +00:26:EF Technology Advancement Group, Inc. +00:26:E9 SP Corp +00:26:DC Optical Systems Design +00:26:D6 Ningbo Andy Optoelectronic Co., Ltd. +00:26:CF DEKA R&D +00:26:D0 Semihalf +00:26:CA Cisco Systems, Inc +00:26:C9 Proventix Systems, Inc. +00:26:C3 Insightek Corp. +00:26:64 Core System Japan +00:26:58 T-Platforms (Cyprus) Limited +00:26:45 Circontrol S.A. +00:26:3F LIOS Technology GmbH +00:26:39 T.M. Electronics, Inc. +00:26:BD JTEC Card & Communication Co., Ltd. +00:26:B3 Thales Communications Inc +00:26:AD Arada Systems, Inc. +00:26:A9 Strong Technologies Pty Ltd +00:26:A3 FQ Ingenieria Electronica S.A. +00:26:9C ITUS JAPAN CO. LTD +00:26:96 NOOLIX Co., Ltd +00:24:84 Bang and Olufsen Medicom a/s +00:24:86 DesignArt Networks +00:24:7F Nortel Networks +00:24:78 Mag Tech Electronics Co Limited +00:24:71 Fusion MultiSystems dba Fusion-io +00:24:73 3COM EUROPE LTD +00:24:60 Giaval Science Development Co. Ltd. +00:24:5B RAIDON TECHNOLOGY, INC. +00:24:4E RadChips, Inc. +00:24:47 Kaztek Systems +00:24:42 Axona Limited +00:24:3D Emerson Appliance Motors and Controls +00:25:28 Daido Signal Co., Ltd. +00:25:23 OCP Inc. +00:25:1E ROTEL TECHNOLOGIES +00:25:19 Viaas Inc +00:25:14 PC Worth Int'l Co., Ltd. +00:25:0D GZT Telkom-Telmor sp. z o.o. +00:25:06 A.I. ANTITACCHEGGIO ITALIA SRL +00:25:08 Maquet Cardiopulmonary AG +00:25:7A CAMCO Produktions- und Vertriebs-GmbH für Beschallungs- und Beleuchtungsanlagen +00:25:7F CallTechSolution Co.,Ltd +00:25:73 ST Electronics (Info-Security) Pte Ltd +00:25:6E Van Breda B.V. +00:25:6D Broadband Forum +00:25:60 Ibridge Networks & Communications Ltd. +00:25:5B CoachComm, LLC +00:24:E2 HASEGAWA ELECTRIC CO.,LTD. +00:24:DB Alcohol Monitoring Systems +00:24:CF Inscape Data Corporation +00:24:C8 Broadband Solutions Group +00:24:C3 Cisco Systems, Inc +00:24:C0 NTI COMODO INC +00:24:B6 Seagate Technology +00:24:BB CENTRAL Corporation +00:24:B1 Coulomb Technologies +00:24:AA Dycor Technologies Ltd. +00:24:A3 Sonim Technologies Inc +00:24:9E ADC-Elektronik GmbH +00:24:8B HYBUS CO., LTD. +00:24:92 Motorola, Broadband Solutions Group +00:24:97 Cisco Systems, Inc +00:25:54 Pixel8 Networks +00:25:4D Singapore Technologies Electronics Limited +00:25:4E Vertex Wireless Co., Ltd. +00:25:37 Runcom Technologies Ltd. +00:25:3E Sensus Metering Systems +00:25:41 Maquet Critical Care AB +00:25:2D Kiryung Electronics +00:25:A6 Central Network Solution Co., Ltd. +00:25:A1 Enalasys +00:25:9A CEStronics GmbH +00:25:93 DatNet Informatikai Kft. +00:25:94 Eurodesign BG LTD +00:25:8E The Weather Channel +00:25:8A Pole/Zero Corporation +00:25:89 Hills Industries Limited +00:25:84 Cisco Systems, Inc +00:25:01 JSC Supertel +00:24:FA Hilger u. Kern GMBH +00:24:F5 NDS Surgical Imaging +00:24:EE Wynmax Inc. +00:24:E7 Plaster Networks +00:23:F2 TVLogic +00:23:E8 Demco Corp. +00:23:E1 Cavena Image Products AB +00:23:DC Benein, Inc +00:23:DB saxnet gmbh +00:23:C9 Sichuan Tianyi Information Science & Technology Stock CO.,LTD +00:23:CE KITA DENSHI CORPORATION +00:23:D5 WAREMA electronic GmbH +00:24:21 MICRO-STAR INT'L CO., LTD. +00:24:14 Cisco Systems, Inc +00:24:15 Magnetic Autocontrol GmbH +00:24:0F Ishii Tool & Engineering Corporation +00:24:08 Pacific Biosciences +00:24:02 Op-Tection GmbH +00:23:FC Ultra Stereo Labs, Inc +00:23:CF CUMMINS-ALLISON CORP. +00:23:C2 SAMSUNG Electronics. Co. LTD +00:23:B6 SECURITE COMMUNICATIONS / HONEYWELL +00:23:BC EQ-SYS GmbH +00:23:AA HFR, Inc. +00:23:A9 Beijing Detianquan Electromechanical Equipment Co., Ltd +00:23:41 Siemens AB, Infrastructure & Cities, Building Technologies Division, IC BT SSP SP BA PR +00:23:3C Alflex +00:23:3B C-Matic Systems Ltd +00:23:35 Linkflex Co.,Ltd +00:23:2D SandForce +00:23:28 ALCON TELECOMMUNICATIONS CO., LTD. +00:23:21 Avitech International Corp +00:22:F8 PIMA Electronic Systems Ltd. +00:23:1F Guangda Electronic & Telecommunication Technology Development Co., Ltd. +00:22:E6 Intelligent Data +00:22:E0 Atlantic Software Technologies S.r.L. +00:22:DF TAMUZ Monitors +00:22:DA ANATEK, LLC +00:22:D3 Hub-Tech +00:22:CD Ared Technology Co., Ltd. +00:22:C4 epro GmbH +00:22:C9 Lenord, Bauer & Co GmbH +00:22:BF SieAmp Group of Companies +00:22:B9 Analogix Seminconductor, Inc +00:22:BA HUTH Elektronik Systeme GmbH +00:23:9D Mapower Electronics Co., Ltd +00:23:92 Proteus Industries Inc. +00:23:8D Techno Design Co., Ltd. +00:23:88 V.T. Telematica S.p.a. +00:23:83 InMage Systems Inc +00:23:7C NEOTION +00:23:24 G-PRO COMPUTER +00:24:31 Uni-v co.,ltd +00:24:1B iWOW Communications Pte Ltd +00:24:22 Knapp Logistik Automation GmbH +00:24:27 SSI COMPUTER CORP +00:23:73 GridIron Systems, Inc. +00:23:67 UniControls a.s. +00:23:6E Burster GmbH & Co KG +00:23:6D ResMed Ltd +00:23:60 Lookit Technology Co., Ltd +00:23:5B Gulfstream +00:23:16 KISAN ELECTRONICS CO +00:23:0F Hirsch Electronics Corporation +00:23:0A ARBURG GmbH & Co KG +00:23:09 Janam Technologies LLC +00:23:03 LITE-ON IT Corporation +00:22:F2 SunPower Corp +00:22:ED TSI Power Corporation +00:22:8D GBS Laboratories LLC +00:22:87 Titan Wireless LLC +00:22:88 Sagrad, Inc. +00:22:81 Daintree Networks Pty +00:22:7A Telecom Design +00:22:6B Cisco-Linksys, LLC +00:22:5D Digicable Network India Pvt. Ltd. +00:22:5C Multimedia & Communication Technology +00:21:6F SymCom, Inc. +00:21:69 Prologix, LLC. +00:21:56 Cisco Systems, Inc +00:21:50 EYEVIEW ELECTRONICS +00:21:4A Pixel Velocity, Inc +00:21:A3 Micromint +00:21:99 Vacon Plc +00:21:95 GWD Media Limited +00:21:94 Ping Communication +00:21:8F Avantgarde Acoustic Lautsprechersysteme GmbH +00:21:88 EMC Corporation +00:21:82 SandLinks Systems, Ltd. +00:21:75 Pacific Satellite International Ltd. +00:22:2A SoundEar A/S +00:22:1E Media Devices Co., Ltd. +00:22:25 Thales Avionics Ltd +00:22:18 Verivue Inc. +00:22:12 CAI Networks, Inc. +00:22:0B National Source Coding Center +00:22:05 WeLink Solutions, Inc. +00:22:06 Cyberdyne Inc. +00:22:B3 Sei S.p.A. +00:22:AC Hangzhou Siyuan Tech. Co., Ltd +00:22:A7 Tyco Electronics AMP GmbH +00:22:A0 Delphi Corporation +00:22:9A Lastar, Inc. +00:22:99 SeaMicro Inc. +00:22:94 Kyocera Corporation +00:21:FA A4SP Technologies Ltd. +00:21:F4 INRange Systems, Inc +00:21:ED Telegesis +00:21:E7 Informatics Services Corporation +00:21:DB Santachi Video Technology (Shenzhen) Co., Ltd. +00:21:E1 Nortel Networks +00:21:D5 X2E GmbH +00:21:DA Automation Products Group Inc. +00:21:CE NTC-Metrotek +00:21:C8 LOHUIS Networks +00:21:C2 GL Communications Inc +00:21:BB Riken Keiki Co., Ltd. +00:21:B5 Galvanic Ltd +00:21:AF Radio Frequency Systems +00:21:B6 Triacta Power Technologies Inc. +00:21:A9 Mobilink Telecom Co.,Ltd +00:21:A8 Telephonics Corporation +00:21:0D SAMSIN INNOTEC +00:21:41 RADLIVE +00:21:37 Bay Controls, LLC +00:21:2D SCIMOLEX CORPORATION +00:21:33 Building B, Inc +00:21:21 VRmagic GmbH +00:21:26 Shenzhen Torch Equipment Co., Ltd. +00:22:57 3COM EUROPE LTD +00:22:4E SEEnergy Corp. +00:22:47 DAC ENGINEERING CO., LTD. +00:22:3D JumpGen Systems, LLC +00:22:37 Shinhint Group +00:22:38 LOGIPLUS +00:22:31 SMT&C Co., Ltd. +00:22:2B Nucomm, Inc. +00:1E:F6 Cisco Systems, Inc +00:1E:EA Sensor Switch, Inc. +00:1E:EF Cantronic International Limited +00:1E:DE BYD COMPANY LIMITED +00:1E:E3 T&W Electronics (ShenZhen) Co.,Ltd +00:1E:DD WASKO S.A. +00:1E:D9 Mitsubishi Precision Co.,LTd. +00:1E:D4 Doble Engineering +00:1E:D3 Dot Technology Int'l Co., Ltd. +00:1E:CD KYLAND Technology Co. LTD +00:1E:C6 Obvius Holdings LLC +00:1F:9D Cisco Systems, Inc +00:1F:A2 Datron World Communications, Inc. +00:1F:91 DBS Lodging Technologies, LLC +00:1F:96 APROTECH CO.LTD +00:1F:90 Actiontec Electronics, Inc +00:1F:8F Shanghai Bellmann Digital Source Co.,Ltd. +00:1F:85 Apriva ISS, LLC +00:1F:87 Skydigital Inc. +00:1F:86 digEcor +00:1F:80 Lucas Holding bv +00:1F:3E RP-Technik e.K. +00:1F:42 Etherstack plc +00:1F:41 Ruckus Wireless +00:1F:39 Construcciones y Auxiliar de Ferrocarriles, S.A. +00:1F:2B Orange Logic +00:1F:2C Starbridge Networks +00:1F:26 Cisco Systems, Inc +00:1F:1A Prominvest +00:1E:C1 3COM EUROPE LTD +00:1E:BA High Density Devices AS +00:1E:B3 Primex Wireless +00:1E:B4 UNIFAT TECHNOLOGY LTD. +00:1E:AE Continental Automotive Systems +00:1E:A8 Datang Mobile Communications Equipment CO.,LTD +00:1E:9C Fidustron INC +00:1E:95 SIGMALINK +00:1E:96 Sepura Plc +00:1E:8B Infra Access Korea Co., Ltd. +00:1F:EF SHINSEI INDUSTRIES CO.,LTD +00:1F:E8 KURUSUGAWA Electronics Industry Inc,. +00:1F:DC Mobile Safe Track Ltd +00:1F:D7 TELERAD SA +00:1F:CB NIW Solutions +00:1F:77 HEOL DESIGN +00:1F:73 Teraview Technology Co., Ltd. +00:1F:6D Cisco Systems, Inc +00:1F:61 Talent Communication Networks Inc. +00:1F:66 PLANAR LLC +00:1F:5A Beckwith Electric Co. +00:1F:53 GEMAC Gesellschaft für Mikroelektronikanwendung Chemnitz mbH +00:1F:4E ConMed Linvatec +00:1F:54 Lorex Technology Inc. +00:1F:47 MCS Logic Inc. +00:1F:D2 COMMTECH TECHNOLOGY MACAO COMMERCIAL OFFSHORE LTD. +00:1F:BF Fulhua Microelectronics Corp. Taiwan Branch +00:1F:AC Goodmill Systems Ltd +00:21:1A LInTech Corporation +00:21:13 Padtec S/A +00:21:14 Hylab Technology Inc. +00:21:0E Orpak Systems L.T.D. +00:21:0A byd:sign Corporation +00:21:04 Gigaset Communications GmbH +00:1F:FB Green Packet Bhd +00:1F:F6 PS Audio International +00:1F:19 BEN-RI ELECTRONICA S.A. +00:1F:13 S.& A.S. Ltd. +00:1F:0F Select Engineered Systems +00:1E:FD Microbit 2.0 AB +00:1F:02 Pixelmetrix Corporation Pte Ltd +00:1E:F0 Gigafin Networks +00:1D:2C Wavetrend Technologies (Pty) Limited +00:1D:27 NAC-INTERCOM +00:1D:18 Power Innovation GmbH +00:1D:13 NextGTV +00:1D:0C MobileCompia +00:1D:06 HM Electronics, Inc. +00:1D:05 Eaton Corporation +00:1E:62 Siemon +00:1E:5D Holosys d.o.o. +00:1E:56 Bally Wulff Entertainment GmbH +00:1E:50 BATTISTONI RESEARCH +00:1E:4A Cisco Systems, Inc +00:1D:85 Call Direct Cellular Solutions +00:1D:80 Beijing Huahuan Eletronics Co.,Ltd +00:1D:68 Thomson Telecom Belgium +00:1D:6F Chainzone Technology Co., Ltd +00:1D:76 Eyeheight Ltd. +00:1D:7B Ice Energy, Inc. +00:1D:75 Radioscape PLC +00:1D:63 Miele & Cie. KG +00:1D:5C Tom Communication Industrial Co.,Ltd. +00:1D:55 ZANTAZ, Inc +00:1D:C8 Navionics Research Inc., dba SCADAmetrics +00:1D:C1 Audinate Pty L +00:1D:BB Dynamic System Electronics Corp. +00:1D:AB SwissQual License AG +00:1E:86 MEL Co.,Ltd. +00:1E:7F CBM of America +00:1E:7A Cisco Systems, Inc +00:1E:79 Cisco Systems, Inc +00:1E:6F Magna-Power Electronics, Inc. +00:1E:70 Cobham Defence Communications Ltd +00:1E:69 Thomson Inc. +00:1D:56 Kramer Electronics Ltd. +00:1D:50 SPINETIX SA +00:1D:4B Grid Connect Inc. +00:1D:46 Cisco Systems, Inc +00:1D:3F Mitron Pty Ltd +00:1D:39 MOOHADIGITAL CO., LTD +00:1D:3A mh acoustics LLC +00:1D:33 Maverick Systems Inc. +00:1E:09 ZEFATEK Co.,LTD +00:1E:04 Hanson Research Corporation +00:1D:F7 R. STAHL Schaltgeräte GmbH +00:1D:F8 Webpro Vision Technology Corporation +00:1D:F1 Intego Systems, Inc. +00:1D:EA Commtest Instruments Ltd +00:1D:DB C-BEL Corporation +00:1D:E5 Cisco Systems, Inc +00:1D:A4 Hangzhou System Technology CO., LTD +00:1D:9F MATT R.P.Traczynscy Sp.J. +00:1D:92 MICRO-STAR INT'L CO.,LTD. +00:1D:91 Digitize, Inc +00:1D:8C La Crosse Technology LTD +00:1E:39 Comsys Communication Ltd. +00:1E:34 CryptoMetrics +00:1E:2D STIM +00:1E:26 Digifriends Co. Ltd +00:1E:1A Best Source Taiwan Inc. +00:1E:14 Cisco Systems, Inc +00:1E:0A Syba Tech Limited +00:1C:61 Galaxy Microsystems LImited +00:1C:55 Shenzhen Kaifa Technology Co. +00:1C:5A Advanced Relay Corporation +00:1C:44 Bosch Security Systems BV +00:1C:4B Gener8, Inc. +00:1C:38 Bio-Rad Laboratories, Inc. +00:1C:3D WaveStorm +00:1C:3F International Police Technologies, Inc. +00:1C:3E ECKey Corporation +00:1C:31 Mobile XP Technology Co., LTD +00:1C:2C Synapse +00:1C:F9 Cisco Systems, Inc +00:1C:F3 EVS BROADCAST EQUIPMENT +00:1C:F4 Media Technology Systems Inc +00:1C:ED ENVIRONNEMENT SA +00:1C:E3 Optimedical Systems +00:1C:DC Custom Computer Services, Inc. +00:1C:D0 Circleone Co.,Ltd. +00:1B:F5 Tellink Sistemas de Telecomunicación S.L. +00:1B:F0 Value Platforms Limited +00:1B:E8 Ultratronik GmbH +00:1B:E1 ViaLogy +00:1B:DC Vencer Co., Ltd. +00:1B:D5 Cisco Systems, Inc +00:1B:CE Measurement Devices Ltd +00:1C:94 LI-COR Biosciences +00:1C:8E Alcatel-Lucent IPD +00:1C:8D Mesa Imaging +00:1C:88 TRANSYSTEM INC. +00:1C:83 New Level Telecom Co., Ltd. +00:1C:7A Perfectone Netware Company Ltd +00:1C:7B Castlenet Technology Inc. +00:1C:79 Cohesive Financial Technologies LLC +00:1C:74 Syswan Technologies Inc. +00:1C:6D KYOHRITSU ELECTRONIC INDUSTRY CO., LTD. +00:1C:68 Anhui Sun Create Electronics Co., Ltd +00:1C:C9 Kaise Electronic Technology Co., Ltd. +00:1C:CA Shanghai Gaozhi Science & Technology Development Co. +00:1C:BD Ezze Mobile Tech., Inc. +00:1C:B8 CBC Co., Ltd +00:1C:AD Wuhan Telecommunication Devices Co.,Ltd +00:1C:AE WiChorus, Inc. +00:1C:A7 International Quartz Limited +00:1C:A0 Production Resource Group, LLC +00:1C:9B FEIG ELECTRONIC GmbH +00:1B:69 Equaline Corporation +00:1B:64 IsaacLandKorea Co., Ltd, +00:1B:5D Vololink Pty Ltd +00:1B:56 Tehuti Networks Ltd. +00:1B:51 Vector Technology Corp. +00:1B:45 ABB AS, Division Automation Products +00:1B:4A W&W Communications, Inc. +00:1B:43 Beijing DG Telecommunications equipment Co.,Ltd +00:1B:3E Curtis, Inc. +00:1B:37 Computec Oy +00:1B:2B Cisco Systems, Inc +00:1B:C9 FSN DISPLAY INC +00:1B:C2 Integrated Control Technology Limitied +00:1B:BC Silver Peak Systems, Inc. +00:1B:BD FMC Kongsberg Subsea AS +00:1B:B3 Condalo GmbH +00:1B:B8 BLUEWAY ELECTRONIC CO;LTD +00:1B:AC Curtiss Wright Controls Embedded Computing +00:1B:B2 Intellect International NV +00:1B:A5 MyungMin Systems, Inc. +00:1B:A0 Awox +00:1B:99 KS System GmbH +00:1C:1B Hyperstone GmbH +00:1C:0F Cisco Systems, Inc +00:1C:08 Echo360, Inc. +00:1C:02 Pano Logic +00:1C:01 ABB Oy Drives +00:1C:03 Betty TV Technology AG +00:1B:92 l-acoustics +00:1B:8D Electronic Computer Systems, Inc. +00:1B:88 Divinet Access Technologies Ltd +00:1B:83 Finsoft Ltd +00:1B:7C A & R Cambridge +00:1B:76 Ripcode, Inc. +00:1B:75 Hypermedia Systems +00:1B:70 IRI Ubiteq, INC. +00:1A:18 Advanced Simulation Technology inc. +00:1A:0A Adaptive Micro-Ware Inc. +00:1A:05 OPTIBASE LTD +00:1A:03 Angel Electronics Co., Ltd. +00:19:FE SHENZHEN SEECOMM TECHNOLOGY CO.,LTD. +00:19:F9 TDK-Lambda +00:19:ED Axesstel Inc. +00:19:F4 Convergens Oy Ltd +00:1A:79 TELECOMUNICATION TECHNOLOGIES LTD. +00:1A:99 Smarty (HZ) Information Electronics Co., Ltd +00:1A:9B ADEC & Parter AG +00:1A:94 Votronic GmbH +00:1A:83 Pegasus Technologies Inc. +00:1A:7E LN Srithai Comm Ltd. +00:1A:F1 Embedded Artists AB +00:1A:F6 Woven Systems, Inc. +00:1A:EC Keumbee Electronics Co.,Ltd. +00:1A:E0 Mythology Tech Express Inc. +00:1A:E5 Mvox Technologies Inc. +00:1A:D2 Eletronica Nitron Ltda +00:1A:D9 International Broadband Electric Communications, Inc. +00:1A:CB Autocom Products Ltd +00:1A:CD Tidel Engineering LP +00:1A:46 Digital Multimedia Technology Co., Ltd +00:1A:3A Dongahelecomm +00:1A:3F intelbras +00:1A:41 INOCOVA Co.,Ltd +00:1A:2E Ziova Coporation +00:1A:33 ASI Communications, Inc. +00:1A:1D PChome Online Inc. +00:1A:24 Galaxy Telecom Technologies Ltd +00:19:A5 RadarFind Corporation +00:19:AC GSP SYSTEMS Inc. +00:19:B1 Arrow7 Corporation +00:19:9E Nifty +00:19:A0 NIHON DATA SYSTENS, INC. +00:19:94 Jorjin Technologies Inc. +00:19:8F Alcatel Bell N.V. +00:19:E8 Cisco Systems, Inc +00:19:DA Welltrans O&E Technology Co. , Ltd. +00:19:DC ENENSYS Technologies +00:19:C9 S&C ELECTRIC COMPANY +00:19:CE Progressive Gaming International +00:19:D5 IP Innovations, Inc. +00:19:C4 Infocrypt Inc. +00:19:BF Citiway technology Co.,ltd +00:19:BD New Media Life +00:19:B8 Boundary Devices +00:1B:26 RON-Telecom ZAO +00:1B:1C Coherent +00:1B:1A e-trees Japan, Inc. +00:1B:15 Voxtel, Inc. +00:1B:09 Matrix Telecom Pvt. Ltd. +00:1B:0E InoTec GmbH Organisationssysteme +00:1B:07 Mendocino Software +00:1B:02 ED Co.Ltd +00:1A:FB Joby Inc. +00:1A:74 Procare International Co +00:1A:6D Cisco Systems, Inc +00:1A:68 Weltec Enterprise Co., Ltd. +00:1A:61 PacStar Corp. +00:1A:54 Hip Shing Electronics Ltd. +00:1A:59 Ircona +00:1A:4D GIGA-BYTE TECHNOLOGY CO.,LTD. +00:1A:52 Meshlinx Wireless Inc. +00:1A:C6 Micro Control Designs +00:1A:BC U4EA Technologies Ltd +00:1A:C1 3Com Ltd +00:1A:B0 Signal Networks Pvt. Ltd., +00:1A:B5 Home Network System +00:1A:A9 FUJIAN STAR-NET COMMUNICATION CO.,LTD +00:18:3C Encore Software Limited +00:18:41 High Tech Computer Corp +00:18:43 Dawevision Ltd +00:18:37 Universal ABIT Co., Ltd. +00:18:26 Cale Access AB +00:18:2B Softier +00:18:18 Cisco Systems, Inc +00:18:1A AVerMedia Information Inc. +00:18:1F Palmmicro Communications +00:18:04 E-TEK DIGITAL TECHNOLOGY LIMITED +00:18:07 Fanstel Corp. +00:18:0C Optelian Access Networks +00:17:FF PLAYLINE Co.,Ltd. +00:17:F1 Renu Electronics Pvt Ltd +00:17:F3 Harris Corparation +00:17:F8 Motech Industries Inc. +00:17:D4 Monsoon Multimedia, Inc +00:17:D9 AAI Corporation +00:17:E0 Cisco Systems, Inc +00:19:20 KUME electric Co.,Ltd. +00:19:25 Intelicis Corporation +00:19:12 Welcat Inc +00:19:14 Winix Co., Ltd +00:19:19 ASTEL Inc. +00:19:0D IEEE 1394c +00:19:01 F1MEDIA +00:19:06 Cisco Systems, Inc +00:18:F5 Shenzhen Streaming Video Technology Company Limited +00:18:F7 Kameleon Technologies +00:18:FC Altec Electronic AG +00:19:81 Vivox Inc +00:19:83 CCT R&D Limited +00:19:75 Beijing Huisen networks technology Inc +00:19:7C Riedel Communications GmbH +00:19:70 Z-Com, Inc. +00:19:64 Doorking Inc. +00:19:5F Valemount Networks Corporation +00:19:53 Chainleader Communications Corp. +00:19:58 Bluetooth SIG, Inc. +00:19:5A Jenaer Antriebstechnik GmbH +00:18:F0 JOYTOTO Co., Ltd. +00:18:E9 Numata Corporation +00:18:E4 YIGUANG +00:18:DD Silicondust Engineering Ltd +00:18:D8 ARCH METER Corporation +00:18:D1 Siemens Home & Office Comm. Devices +00:18:D6 Swirlnet A/S +00:18:CC AXIOHM SAS +00:18:C7 Real Time Automation +00:18:6C Neonode AB +00:18:78 Mackware GmbH +00:18:67 Datalogic ADC +00:18:5B Network Chemistry, Inc +00:18:62 Seagate Technology +00:18:4F 8 Ways Technology Corp. +00:18:54 Argard Co., Ltd +00:18:56 EyeFi, Inc +00:18:48 Vecima Networks Inc. +00:19:45 RF COncepts, LLC +00:19:4C Fujian Stelcom information & Technology CO.,Ltd +00:19:40 Rackable Systems +00:19:34 TRENDON TOUCH TECHNOLOGY CORP. +00:19:39 Gigamips +00:19:31 Balluff GmbH +00:18:BB Eliwell Controls srl +00:18:B9 Cisco Systems, Inc +00:18:B4 Dawon Media Inc. +00:18:AD NIDEC SANKYO CORPORATION +00:18:A8 AnNeal Technology Inc. +00:18:9C Weldex Corporation +00:18:A1 Tiqit Computers, Inc. +00:18:97 JESS-LINK PRODUCTS Co., LTD +00:18:92 ads-tec GmbH +00:18:90 RadioCOM, s.r.o. +00:18:84 Fon Technology S.L. +00:18:7D Armorlink shanghai Co. Ltd +00:18:7F ZODIANET +00:16:D1 ZAT a.s. +00:16:C3 BA Systems Inc +00:16:BE INFRANET, Inc. +00:16:B7 Seoul Commtech +00:16:B2 DriveCam Inc +00:16:B0 VK Corporation +00:16:AB Dansensor A/S +00:16:A6 Dovado FZ-LLC +00:17:C8 KYOCERA Document Solutions Inc. +00:17:CF iMCA-GmbH +00:17:C3 KTF Technologies Inc. +00:17:B7 Tonze Technology Co. +00:17:BC Touchtunes Music Corporation +00:17:B5 Peerless Systems Corporation +00:17:23 Summit Data Communications +00:17:1C NT MicroSystems, Inc. +00:17:10 Casa Systems Inc. +00:17:15 Qstik +00:17:17 Leica Geosystems AG +00:17:0B Contela, Inc. +00:16:FF Wamin Optocomm Mfg Corp +00:17:74 Elesta GmbH +00:17:79 QuickTel +00:17:7B Azalea Networks inc +00:17:64 ATMedia GmbH +00:17:66 Accense Technology, Inc. +00:17:5F XENOLINK Communications Co., Ltd. +00:17:51 Online Corporation +00:17:53 nFore Technology Inc. +00:17:58 ThruVision Ltd +00:17:45 INNOTZ CO., Ltd +00:17:4C Millipore +00:17:9F Apricorn +00:17:A9 Sentivision +00:17:93 Tigi Corporation +00:17:8C Independent Witness, Inc +00:17:8E Gunnebo Cash Automation AB +00:17:80 Applied Biosystems B.V. +00:17:87 Brother, Brother & Sons ApS +00:17:6B Kiyon, Inc. +00:BA:C0 Biometric Access Company +00:16:73 Bury GmbH & Co. KG +00:16:71 Symphox Information Co. +00:16:65 Cellon France +00:16:6A TPS +00:16:5E Precision I/O +00:16:57 Aegate Ltd +00:16:59 Z.M.P. RADWAG +00:16:58 Fusiontech Technologies Inc. +00:16:52 Hoatech Technologies, Inc. +00:16:46 Cisco Systems, Inc +00:16:4B Quorion Data Systems GmbH +00:17:40 Bluberi Gaming Technologies Inc +00:17:36 iiTron Inc. +00:17:2F NeuLion Incorporated +00:17:28 Selex Communications +00:17:2A Proware Technology Corp.(By Unifosa) +00:16:9A Quadrics Ltd +00:16:A1 3Leaf Networks +00:16:93 PowerLink Technology Inc. +00:16:95 AVC Technology (International) Limited +00:16:8E Vimicro corporation +00:16:82 Pro Dex, Inc +00:16:87 Chubb CSC-Vendor AP +00:16:7B Haver&Boecker +00:16:F3 CAST Information Co., Ltd +00:16:EE Royaldigital Inc. +00:16:E7 Dynamix Promotions Limited +00:16:E0 3Com Ltd +00:16:D6 TDA Tech Pty Ltd +00:15:1E Ethernet Powerlink Standardization Group (EPSG) +00:15:25 Chamberlain Access Solutions +00:15:19 StoreAge Networking Technologies +00:15:18 Shenzhen 10MOONS Technology Development CO.,Ltd +00:15:14 Hu Zhou NAVA Networks&Electronics Ltd. +00:15:0E OPENBRAIN TECHNOLOGIES CO., LTD. +00:15:0F mingjong +00:15:0D Hoana Medical, Inc. +00:15:08 Global Target Enterprise Inc +00:14:FC Extandon, Inc. +00:15:01 LexBox +00:14:F5 OSI Security Devices +00:14:E9 Nortech International +00:14:EE Western Digital Technologies, Inc. +00:14:DF HI-P Tech Corporation +00:14:E4 infinias, LLC +00:14:D3 SEPSA +00:14:D8 bio-logic SA +00:14:D2 Kyuden Technosystems Corporation +00:15:E0 Ericsson +00:15:DC KT&C Co., Ltd. +00:15:D5 NICEVT +00:15:D7 Reti Corporation +00:15:D6 OSLiNK Sp. z o.o. +00:15:C4 FLOVEL CO., LTD. +00:15:C9 Gumstix, Inc +00:15:BD Group 4 Technology Ltd +00:15:B6 ShinMaywa Industries, Ltd. +00:15:81 MAKUS Inc. +00:15:6B Perfisans Networks Corp. +00:15:70 Zebra Technologies Inc +00:15:5D Microsoft Corporation +00:15:5F GreenPeak Technologies +00:15:64 BEHRINGER Spezielle Studiotechnik GmbH +00:15:5E Morgan Stanley +00:15:58 FOXCONN +00:15:51 RadioPulse Inc. +00:15:49 Dixtal Biomedica Ind. Com. Ltda +00:15:4C Saunders Electronics +00:15:4A WANSHIH ELECTRONIC CO., LTD +00:15:3D ELIM PRODUCT CO. +00:15:44 coM.s.a.t. AG +00:15:31 KOCOM +00:15:38 RFID, Inc. +00:15:2A Nokia GmbH +00:16:1D Innovative Wireless Technologies, Inc. +00:16:1C e:cue +00:16:0C LPL DEVELOPMENT S.A. DE C.V +00:16:11 Altecon Srl +00:16:12 Otsuka Electronics Co., Ltd. +00:16:05 YORKVILLE SOUND INC. +00:15:F9 Cisco Systems, Inc +00:16:00 CelleBrite Mobile Synchronization +00:15:ED Fulcrum Microsystems, Inc. +00:15:E1 Picochip Ltd +00:15:E6 MOBILE TECHNIKA Inc. +00:15:B1 Ambient Corporation +00:15:AC Capelon AB +00:15:A7 Robatech AG +00:15:94 BIXOLON CO.,LTD +00:15:8D Jennic Ltd +00:15:88 Salutica Allied Solutions Sdn Bhd +00:14:CC Zetec, Inc. +00:14:C0 Symstream Technology Group Ltd +00:14:C5 Alive Technologies Pty Ltd +00:14:B9 MSTAR SEMICONDUCTOR +00:14:AF Datasym POS Inc. +00:14:A8 Cisco Systems, Inc +00:16:3C Rebox B.V. +00:16:2E Space Shuttle Hi-Tech Co., Ltd. +00:16:29 Nivus GmbH +00:16:22 BBH SYSTEMS GMBH +00:16:16 BROWAN COMMUNICATION INC. +00:16:1B Micronet Corporation +00:13:5B PanelLink Cinema, LLC +00:13:62 ShinHeung Precision Co., Ltd. +00:13:51 Niles Audio Corporation +00:13:45 Eaton Corporation +00:13:4A Engim, Inc. +00:13:3E MetaSwitch +00:13:2B Phoenix Digital +00:13:32 Beijing Topsec Network Security Technology Co., Ltd. +00:13:37 Orient Power Home Network Ltd. +00:13:38 FRESENIUS-VIAL +00:13:7A Netvox Technology Co., Ltd. +00:13:81 CHIPS & Systems, Inc. +00:13:86 ABB Inc./Totalflow +00:13:74 Atheros Communications, Inc. +00:13:6E Techmetro Corp. +00:13:73 BLwave Electronics Co., Ltd +00:13:67 Narayon. Co., Ltd. +00:13:61 Biospace Co., Ltd. +00:13:57 Soyal Technology Co., Ltd. +00:13:26 ECM Systems Ltd +00:13:25 Cortina Systems Inc +00:13:1B BeCell Innovations Corp. +00:13:1C LiteTouch, Inc. +00:13:09 Ocean Broadband Networks +00:13:0E Focusrite Audio Engineering Limited +00:12:FC PLANET System Co.,LTD +00:12:F6 MDK CO.,LTD. +00:12:F1 IFOTEC +00:14:3E AirLink Communications, Inc. +00:14:37 GSTeletech Co.,Ltd. +00:14:30 ViPowER, Inc +00:14:2B Edata Communication Inc. +00:14:24 Merry Electrics CO., LTD. +00:14:1F SunKwang Electronics Co., Ltd +00:14:1A DEICY CORPORATION +00:14:13 Trebing & Himstedt Prozeßautomation GmbH & Co. KG +00:14:15 Intec Automation inc. +00:14:14 Jumpnode Systems LLC. +00:14:05 OpenIB, Inc. +00:14:0B FIRST INTERNATIONAL COMPUTER, INC. +00:13:FE GRANDTEC ELECTRONIC CORP. +00:13:F9 Cavera Systems +00:13:F2 Klas Ltd +00:13:EC Netsnapper Technologies SARL +00:13:E1 Iprobe AB +00:13:E2 GeoVision Inc. +00:13:D5 RuggedCom +00:13:DC IBTEK INC. +00:13:D0 t+ Medical Ltd +00:13:CB Zenitel Norway AS +00:13:C6 OpenGear, Inc +00:13:C5 LIGHTRON FIBER-OPTIC DEVICES INC. +00:13:BB Smartvue Corporation +00:13:BF Media System Planning Corp. +00:13:B5 Wavesat +00:13:AE Radiance Technologies, Inc. +00:13:A2 MaxStream, Inc +00:13:9B ioIMAGE Ltd. +00:13:9C Exavera Technologies, Inc. +00:13:96 Acbel Polytech Inc. +00:13:8A QINGDAO GOERTEK ELECTRONICS CO.,LTD. +00:13:89 Redes de Telefonía Móvil S.A. +00:14:9C HF Company +00:14:A3 Vitelec BV +00:14:97 ZHIYUAN Eletronics co.,ltd. +00:14:96 Phonic Corp. +00:14:90 ASP Corporation +00:14:89 B15402100 - JANDEI, S.L. +00:14:84 Cermate Technologies Inc. +00:14:7F Thomson Telecom Belgium +00:14:7A Eubus GmbH +00:14:73 Bookham Inc +00:14:67 ArrowSpan Inc. +00:14:60 Kyocera Wireless Corp. +00:14:5B SeekerNet Inc. +00:14:5A Neratec Solutions AG +00:14:59 Moram Co., Ltd. +00:14:54 Symwave +00:14:43 Consultronics Europe Ltd +00:14:4A Taiwan Thick-Film Ind. Corp. +00:11:C4 Terminales de Telecomunicacion Terrestre, S.L. +00:11:C9 MTT Corporation +00:11:BF AESYS S.p.A. +00:11:B8 Liebherr - Elektronik GmbH +00:11:AC Simtec Electronics +00:11:B1 BlueExpert Technology Corp. +00:11:B2 2001 Technology Inc. +00:11:A0 Vtech Engineering Canada Ltd +00:11:A5 Fortuna Electronic Corp. +00:12:76 CG Power Systems Ireland Limited +00:12:6F Rayson Technology Co., Ltd. +00:12:70 NGES Denro Systems +00:12:6A OPTOELECTRONICS Co., Ltd. +00:12:63 Data Voice Technologies GmbH +00:12:5E CAEN +00:12:5D CyberNet Inc. +00:12:59 THERMO ELECTRON KARLSRUHE +00:12:54 Spectra Technologies Holdings Company Ltd +00:12:53 AudioDev AB +00:12:9D First International Computer do Brasil +00:12:91 KWS Computersysteme GmbH +00:12:96 Addlogix +00:12:8F Montilio +00:12:82 Qovia +00:12:89 Advance Sterilization Products +00:12:7D MobileAria +00:11:F4 woori-net +00:11:EE Estari, Inc. +00:11:ED 802 Global +00:11:E8 Tixi.Com +00:11:DB Land-Cellular Corporation +00:11:DC Glunz & Jensen +00:11:E1 Arcelik A.S +00:11:CE Ubisense Limited +00:11:D5 Hangzhou Sunyard System Engineering Co.,Ltd. +00:12:46 T.O.M TECHNOLOGY INC.. +00:12:4D Inducon BV +00:12:41 a2i marketing center +00:12:3A Posystech Inc., Co. +00:12:34 Camille Bauer +00:12:2A VTech Telecommunications Ltd. +00:12:2E Signal Technology - AISD +00:12:33 JRC TOKKI Co.,Ltd. +00:11:99 2wcom Systems GmbH +00:11:8F EUTECH INSTRUMENTS PTE. LTD. +00:11:83 Datalogic ADC, Inc. +00:11:7C e-zy.net +00:11:76 Intellambda Systems, Inc. +00:12:C0 HotLava Systems, Inc. +00:12:B5 Vialta, Inc. +00:12:BC Echolab LLC +00:12:B6 Santa Barbara Infrared, Inc. +00:12:B0 Efore Oyj (Plc) +00:12:A4 ThingMagic, LLC +00:12:A9 3Com Ltd +00:12:A3 Trust International B.V. +00:12:24 NexQL Corporation +00:12:29 BroadEasy Technologies Co.,Ltd +00:12:1D Netfabric Corporation +00:12:11 Protechna Herbst GmbH & Co. KG +00:12:18 ARUZE Corporation +00:12:05 Terrasat Communications, Inc. +00:12:0A Emerson Climate Technologies GmbH +00:11:FE Keiyo System Research, Inc. +00:11:F8 AIRAYA Corp +00:12:EC Movacolor b.v. +00:12:E5 Time America, Inc. +00:12:E0 Codan Limited +00:12:DF Novomatic AG +00:12:D9 Cisco Systems, Inc +00:12:C6 TGC America, Inc +00:12:CD ASEM SpA +00:0F:E9 GW TECHNOLOGIES CO.,LTD. +00:0F:DD SORDIN AB +00:0F:D6 Sarotech Co., Ltd +00:26:54 3Com Corporation +00:0F:D0 ASTRI +00:0F:CF DataWind Research +00:0F:C3 PalmPalm Technology, Inc. +00:11:44 Assurance Technology Corp +00:11:3E JL Corporation +00:11:31 UNATECH. CO.,LTD +00:11:37 AICHI ELECTRIC CO., LTD. +00:11:2D iPulse Systems +11:11:11 Private +00:11:23 Appointech, Inc. +00:11:1D Hectrix Limited +00:0F:6C ADDI-DATA GmbH +00:0F:6B GateWare Communications GmbH +00:0F:5F Nicety Technologies Inc. (NTS) +00:0F:5A Peribit Networks +00:0F:53 Solarflare Communications Inc +00:0F:47 ROBOX SPA +00:0F:4C Elextech INC +00:11:70 GSC SRL +00:11:69 EMS Satcom +00:11:64 ACARD Technology Corp. +00:11:5F ITX Security Co., Ltd. +00:11:5A Ivoclar Vivadent AG +00:11:59 MATISSE NETWORKS INC +00:11:53 Trident Tek, Inc. +00:11:50 Belkin Corporation +00:11:51 Mykotronx +00:11:4A KAYABA INDUSTRY Co,.Ltd. +00:11:10 Maxanna Technology Co., Ltd. +00:11:17 CESNET +00:11:04 TELEXY +00:11:0B Franklin Technology Systems +00:11:00 Schneider Electric +00:0F:FE G-PRO COMPUTER +00:0F:EF Thales e-Transactions GmbH +00:0F:F0 Sunray Co. Ltd. +00:0F:F5 GN&S company +00:0F:CA A-JIN TECHLINE CO, LTD +00:0F:BD MRV Communications (Networks) LTD +00:0F:BE e-w/you Inc. +00:0F:B7 Cavium +00:0F:A4 Sprecher Automation GmbH +00:0F:AB Kyushu Electronics Systems Inc. +00:0F:9D DisplayLink (UK) Ltd +00:0F:98 Avamax Co. Ltd. +00:0F:8B Orion MultiSystems Inc +00:0F:8C Gigawavetech Pte Ltd +00:0F:91 Aerotelecom Co.,Ltd. +00:0F:7E Ablerex Electronics Co., LTD +00:0F:85 ADDO-Japan Corporation +00:0F:72 Sandburst +00:0F:79 Bluetooth Interest Group Inc. +00:0F:19 Boston Scientific +00:0F:0D Hunt Electronic Co., Ltd. +00:0F:01 DIGITALKS INC +00:0E:FA Optoway Technology Incorporation +00:0E:F3 Smarthome +00:0E:EE Muco Industrie BV +00:0E:E7 AAC ELECTRONICS CORP. +00:0F:38 Netstar +00:0F:40 Optical Internetworking Forum +00:0F:33 DUALi Inc. +00:0F:2C Uplogix, Inc. +00:0F:26 WorldAccxx LLC +00:0F:25 AimValley B.V. +00:0F:13 Nisca corporation +00:0F:14 Mindray Co., Ltd. +00:0E:E1 ExtremeSpeed Inc. +00:0E:DB XiNCOM Corp. +00:0E:E2 Custom Engineering +00:0E:D5 COPAN Systems Inc. +00:0E:C9 YOKO Technology Corp. +00:0E:D0 Privaris, Inc. +00:0E:D7 Cisco Systems, Inc +00:0E:C4 Iskra Transmission d.d. +00:0E:C3 Logic Controls, Inc. +00:0E:BD Burdick, a Quinton Compny +00:0E:B1 Newcotech,Ltd +00:0D:AA S.A.Tehnology co.,Ltd. +00:0D:A0 NEDAP N.V. +00:0D:9F RF Micro Devices +00:0D:9A INFOTEC LTD +00:0D:8D Prosoft Technology, Inc +00:0D:8E Koden Electronics Co., Ltd. +00:0D:84 Makus Inc. +00:0D:83 Sanmina-SCI Hungary Ltd. +00:0D:76 Hokuto Denshi Co,. Ltd. +00:0D:7D Afco Systems +00:0E:51 tecna elettronica srl +00:0E:4C Bermai Inc. +00:0E:4B atrium c and i +00:0E:3E Sun Optronics Inc +00:0E:45 Beijing Newtry Electronic Technology Ltd +00:0E:39 Cisco Systems, Inc +00:0E:32 Kontron Medical +00:0E:2B Safari Technologies +00:0E:2C Netcodec co. +00:0E:1F TCL Networks Equipment Co., Ltd. +00:0E:26 Gincom Technology Corp. +00:0E:1A JPS Communications +00:0E:19 LogicaCMG Pty Ltd +00:0E:13 Accu-Sort Systems inc. +00:0E:0F ERMME +00:0E:05 WIRELESS MATRIX CORP. +00:0E:06 Team Simoco Ltd +00:0E:0B Netac Technology Co., Ltd. +00:0D:F8 ORGA Kartensysteme GmbH +00:0D:FF CHENMING MOLD INDUSTRY CORP. +00:0D:EC Cisco Systems, Inc +00:0D:F3 Asmax Solutions +00:0D:E6 YOUNGBO ENGINEERING CO.,LTD +00:0D:E5 Samsung Thales +00:0D:E0 ICPDAS Co.,LTD +00:0D:D3 SAMWOO Telecommunication Co.,Ltd. +00:0D:D4 Symantec Corporation +00:0D:D9 Anton Paar GmbH +00:0D:CD GROUPE TXCOM +00:0E:AA Scalent Systems, Inc. +00:0E:9E Topfield Co., Ltd +00:0E:A3 CNCR-IT CO.,LTD,HangZhou P.R.CHINA +00:0E:A4 Certance Inc. +00:0E:92 Open Telecom +00:0E:97 Ultracker Technology CO., Inc +00:0E:91 Navico Auckland Ltd +00:0E:8B Astarte Technology Co, Ltd. +00:0E:84 Cisco Systems, Inc +00:0D:6A Redwood Technologies LTD +00:0D:71 boca systems +00:0D:5E NEC Personal Products +00:0D:63 DENT Instruments, Inc. +00:0D:64 COMAG Handels AG +00:0D:57 Fujitsu I-Network Systems Limited. +00:0D:52 Comart system +00:0D:51 DIVR Systems, Inc. +00:0D:47 Collex +00:0D:C1 SafeWeb Inc +00:0D:C6 DigiRose Technology Co., Ltd. +00:0D:BA Océ Document Technologies GmbH +00:0D:B4 NETASQ +00:0D:B3 SDO Communication Corperation +00:0D:AE SAMSUNG HEAVY INDUSTRIES CO., LTD. +00:0D:A6 Universal Switching Corporation +00:0E:78 Amtelco +00:0E:70 in2 Networks +00:0E:6B Janitza electronics GmbH +00:0E:64 Elphel, Inc +00:0E:5D Triple Play Technologies A/S +00:0E:5E Raisecom Technology +00:0E:58 Sonos, Inc. +00:0B:E2 Lumenera Corporation +00:0B:E7 COMFLUX TECHNOLOGY INC. +00:0B:D6 Paxton Access Ltd +00:0B:D2 Remopro Technology Inc. +00:0B:C6 ISAC, Inc. +00:0B:CB Fagor Automation , S. Coop +00:0B:BF Cisco Systems, Inc +00:0B:BA Harmonic, Inc +00:0B:B3 RiT technologies Ltd. +00:0C:38 TelcoBridges Inc. +00:0C:3F Cogent Defence & Security Networks, +00:0C:30 Cisco Systems, Inc +00:0C:26 Weintek Labs. Inc. +00:0C:2E Openet information technology(shenzhen) Co., Ltd. +00:0C:25 Allied Telesis Labs, Inc. +00:0C:1F Glimmerglass Networks +00:0C:24 ANATOR +00:0C:1B ORACOM Co, Ltd. +00:0C:19 Telio Communications GmbH +00:0C:7A DaTARIUS Technologies GmbH +00:0C:67 OYO ELECTRIC CO.,LTD +00:0C:4F UDTech Japan Corporation +00:0C:54 Pedestal Networks, Inc +00:0C:5B HANWANG TECHNOLOGY CO.,LTD +00:0C:60 ACM Systems +00:0C:62 ABB AB, Cewe-Control +00:0C:48 QoStek Corporation +00:0C:4D Curtiss-Wright Controls Avionics & Electronics +00:0C:14 Diagnostic Instruments, Inc. +00:0C:07 Iftest AG +00:0C:06 Nixvue Systems Pte Ltd +00:0C:08 HUMEX Technologies Corp. +00:0C:0D Communications & Power Industries / Satcom Division +00:0B:F5 Shanghai Sibo Telecom Technology Co.,Ltd +00:0B:FA EXEMYS SRL +00:0C:01 Abatron AG +00:0B:EE inc.jet, Incorporated +00:0C:E6 Meru Networks Inc +00:0C:EB CNMP Networks, Inc. +00:0C:E2 Rolls-Royce +00:0C:EC Spectracom Corp. +00:0C:D7 Nallatech Ltd +00:0C:DE ABB STOTZ-KONTAKT GmbH +00:0C:D2 Schaffner EMV AG +00:0C:D8 M. K. Juchheim GmbH & Co +00:0C:C6 Ka-Ro electronics GmbH +00:0C:CB Design Combus Ltd +00:0C:C5 Nextlink Co., Ltd. +00:0C:B3 ROUND Co.,Ltd. +00:0C:B8 MEDION AG +00:0C:BF Holy Stone Ent. Co., Ltd. +00:0A:07 WebWayOne Ltd +00:0C:A1 SIGMACOM Co., LTD. +00:0C:A6 Mintera Corporation +00:0C:A8 Garuda Networks Corporation +00:0C:AD BTU International +00:0C:95 PrimeNet +00:0C:9A Hitech Electronics Corp. +00:0C:8E Mentor Engineering Inc +00:0C:93 Xeline Co., Ltd. +00:0C:7F synertronixx GmbH +00:0C:82 NETWORK TECHNOLOGIES INC +00:0C:87 AMD +00:0C:73 TELSON ELECTRONICS CO., LTD +00:0D:1D HIGH-TEK HARNESS ENT. CO., LTD. +00:0D:1E Control Techniques +00:0D:0C MDI Security Systems +00:0D:11 DENTSPLY - Gendex +00:0D:05 cybernet manufacturing inc. +00:0C:F9 Xylem Water Solutions +00:0C:FE Grand Electronic Co., Ltd +00:0C:F2 GAMESA Eólica +00:0D:43 DRS Tactical Systems Inc. +00:0D:37 WIPLUG +00:0D:3E APLUX Communications Ltd. +00:0D:3D Hammerhead Systems, Inc. +00:0D:30 IceFyre Semiconductor +00:0D:2B Racal Instruments +00:0D:24 SENTEC E&E CO., LTD. +00:0D:18 Mega-Trend Electronics CO., LTD. +00:0B:A4 Shiron Satellite Communications Ltd. (1996) +00:0B:A9 CloudShield Technologies, Inc. +00:0B:A3 Siemens AG, I&S +00:0B:91 Aglaia Gesellschaft für Bildverarbeitung und Kommunikation mbH +00:0B:96 Innotrac Diagnostics Oy +00:0B:9D TwinMOS Technologies Inc. +00:0B:8A MITEQ Inc. +00:0B:7E SAGINOMIYA Seisakusho Inc. +00:0B:83 DATAWATT B.V. +00:0A:AD Stargames Corporation +00:0A:B2 Fresnel Wireless Systems +00:0A:B4 ETIC Telecommunications +00:0A:B9 Astera Technologies Corp. +00:0A:A1 V V S Limited +00:0A:A6 Hochiki Corporation +00:0A:8E Invacom Ltd +00:0A:9F Pannaway Technologies, Inc. +00:0A:99 Calamp Wireless Networks Inc +00:0A:93 W2 Networks, Inc. +00:0A:7F Teradon Industries, Inc +00:0A:86 Lenze +00:0A:8B Cisco Systems, Inc +00:0B:15 Platypus Technology +00:0B:10 11wave Technonlogy Co.,Ltd +00:0B:09 Ifoundry Systems Singapore +00:0B:04 Volktek Corporation +00:0A:FD Kentec Electronics +00:0B:02 Dallmeier electronic +00:0A:F1 Clarity Design, Inc. +00:0A:F6 Emerson Climate Technologies Retail Solutions, Inc. +00:0A:0E Invivo Research Inc. +00:0A:13 Honeywell Video Systems +00:0A:04 3Com Ltd +00:09:FD Ubinetics Limited +00:09:F4 Alcon Laboratories, Inc. +00:09:E7 ADC Techonology +00:09:EE MEIKYO ELECTRIC CO.,LTD +00:09:F3 WELL Communication Corp. +00:09:E2 Sinbon Electronics Co., Ltd. +00:09:DB eSpace +00:0B:70 Load Technology, Inc. +00:0B:72 Lawo AG +00:0B:77 Cogent Systems, Inc. +00:0B:71 Litchfield Communications Inc. +00:0B:5F Cisco Systems, Inc +00:0B:64 Kieback & Peter GmbH & Co KG +00:0B:5B Rincon Research Corporation +00:0B:56 Cybernetics +00:0B:4E VertexRSI, General Dynamics SatCOM Technologies, Inc. +00:0B:53 INITIUM Co., Ltd. +00:0A:35 Xilinx +00:0A:3A J-THREE INTERNATIONAL Holding Co., Ltd. +00:0A:3C Enerpoint Ltd. +00:0A:41 Cisco Systems, Inc +00:0A:48 Albatron Technology +00:0A:2E MAPLE NETWORKS CO., LTD +00:0A:26 CEIA S.p.A. +00:0A:28 Motorola +00:0A:21 Integra Telecom Co. Ltd +00:0A:1A Imerge Ltd +00:0A:15 Silicon Data, Inc +00:0B:42 commax Co., Ltd. +00:0B:47 Advanced Energy +00:0B:36 Productivity Systems, Inc. +00:0B:28 Quatech Inc. +00:0B:2F bplan GmbH +00:0B:1C SIBCO bv +00:0B:21 G-Star Communications Inc. +00:0B:23 Siemens Subscriber Networks +00:0A:7A Kyoritsu Electric Co., Ltd. +00:0A:6E Harmonic, Inc +00:0A:73 Scientific Atlanta +00:0A:60 Autostar Technology Pte Ltd +00:0A:67 OngCorp +00:0A:6C Walchem Corporation +00:0A:5B Power-One as +00:0A:59 HW server +00:0A:54 Laguna Hills, Inc. +00:0A:4D Noritz Corporation +00:0A:DF Gennum Corporation +00:0A:D8 IPCserv Technology Corp. +00:0A:CC Winnow Networks, Inc. +00:0A:D1 MWS +00:0A:D3 INITECH Co., Ltd +00:0A:C0 Fuyoh Video Industry CO., LTD. +00:0A:C5 Color Kinetics +00:09:7B Cisco Systems, Inc +00:09:82 Loewe Opta GmbH +00:09:76 Datasoft ISDN Systems GmbH +00:09:69 Meret Optical Communications +00:09:63 Dominion Lasercom Inc. +00:09:6A Cloverleaf Communications Inc. +00:09:6F Beijing Zhongqing Elegant Tech. Corp.,Limited +00:09:5D Dialogue Technology Corp. +00:09:5F Telebyte, Inc. +00:09:58 INTELNET S.A. +00:09:4C Communication Weaver Co.,Ltd. +00:09:51 Apogee Imaging Systems +00:09:4B FillFactory NV +00:09:AE OKANO ELECTRIC CO.,LTD +00:09:AD HYUNDAI SYSCOMM, INC. +00:09:B4 KISAN TELECOM CO., LTD. +00:09:A8 Eastmode Pte Ltd +00:09:9B Western Telematic Inc. +00:09:9C Naval Research Laboratory +00:09:A1 Telewise Communications, Inc. +00:09:95 Castle Technology Ltd +00:09:89 VividLogic Inc. +00:09:8E ipcas GmbH +00:09:7C Cisco Systems, Inc +00:09:C8 SINAGAWA TSUSHIN KEISOU SERVICE +00:09:CF iAd GmbH +00:09:D4 Transtech Networks +00:09:BB MathStar, Inc. +00:09:C0 6WIND +00:08:07 Access Devices Limited +00:08:01 HighSpeed Surfing Inc. +00:08:08 PPT Vision, Inc. +00:07:F7 Galtronics +00:07:FE Rigaku Corporation +00:07:F8 ITDevices, Inc. +00:07:EB Cisco Systems, Inc +00:07:F1 TeraBurst Networks Inc. +00:07:E5 Coup Corporation +00:07:DF Vbrick Systems Inc. +00:07:DE eCopilt AB +00:07:CF Anoto AB +00:07:D2 Logopak Systeme GmbH & Co. KG +00:08:AA KARAM +00:08:A4 Cisco Systems, Inc +00:08:98 Gigabit Optics Corporation +00:08:9D UHD-Elektronik +00:08:90 AVILINKS SA +00:08:89 Echostar Technologies Corp +00:08:84 Index Braille AB +00:08:77 Liebert-Hiross Spa +08:00:6B ACCEL TECHNOLOGIES INC. +00:08:71 NORTHDATA Co., Ltd. +00:08:7D Cisco Systems, Inc +00:08:76 SDSystem +00:08:E6 Littlefeet +00:08:D9 Mitadenshi Co.,LTD +00:08:D4 IneoQuest Technologies, Inc +00:08:CD With-Net Inc +00:08:D3 Hercules Technologies S.A.S. +00:08:C3 Contex A/S +00:08:BD TEPG-US +00:08:BC Ilevo AB +00:08:B7 HIT Incorporated +00:08:B0 BKtel communications GmbH +00:08:6A Securiton Gmbh +00:08:64 Fasy S.p.A. +00:08:5E PCO AG +00:08:51 Canadian Bank Note Company, Ltd. +00:08:52 Davolink Co. Inc. +00:08:57 Polaris Networks, Inc. +00:08:1B Windigo Systems +00:08:22 InPro Comm +00:08:2E Multitone Electronics PLC +00:08:1C @pos.com +00:08:28 Koei Engineering Ltd. +00:08:16 Bluelon ApS +00:08:15 CATS Co., Ltd. +00:09:1A Macat Optics & Electronics Co., Ltd. +00:09:19 MDS Gateways +00:09:13 SystemK Corporation +00:09:0C Mayekawa Mfg. Co. Ltd. +00:09:07 Chrysalis Development +00:09:00 TMT +00:08:F8 UTC CCS +00:08:F3 WANY +00:08:EC Optical Zonu Corporation +00:08:E0 ATO Technology Ltd. +00:08:E5 IDK Corporation +00:09:45 Palmmicro Communications Inc +00:09:3E C&I Technologies +00:09:32 Omnilux +00:09:39 ShibaSoku Co.,Ltd. +00:09:26 YODA COMMUNICATIONS, INC. +00:09:2B iQstor Networks, Inc. +00:09:2C Hitpoint Inc. +00:09:1F A&D Co., Ltd. +00:07:51 m-u-t AG +00:07:50 Cisco Systems, Inc +00:07:46 TURCK, Inc. +00:07:4A Carl Valentin GmbH +00:07:3A Inventel Systemes +00:07:34 ONStor, Inc. +00:07:39 Scotty Group Austria Gmbh +00:07:2D CNSystems +00:07:27 Zi Corporation (HK) Ltd. +00:07:17 Wieland Electric GmbH +00:07:1E Tri-M Engineering / Nupak Dev. Corp. +00:07:23 ELCON Systemtechnik GmbH +00:07:1D Satelsa Sistemas Y Aplicaciones De Telecomunicaciones, S.A. +00:06:32 Mesco Engineering GmbH +00:06:25 The Linksys Group, Inc. +00:06:2C Bivio Networks +00:06:24 Gentner Communications Corp. +00:06:1B Notebook Development Lab. Lenovo Japan Ltd. +00:06:22 Chung Fu Chen Yeh Enterprise Corp. +00:06:1C Hoshino Metal Industries, Ltd. +00:06:21 Hinox, Co., Ltd. +00:06:0B Artesyn Embedded Technologies +00:06:11 Zeus Wireless, Inc. +00:06:15 Kimoto Electric Co., Ltd. +00:06:05 Inncom International, Inc. +00:05:E3 LightSand Communications, Inc. +00:05:EF ADOIR Digital Technology +00:05:F6 Young Chang Co. Ltd. +00:05:E9 Unicess Network, Inc. +00:05:F0 SATEC +00:05:FC Schenck Pegasus Corp. +00:05:E0 Empirix Corp. +00:05:D6 L-3 Linkabit +00:05:C4 Telect, Inc. +00:05:D0 Solinet Systems +00:05:CA Hitron Technology, Inc. +00:05:BD ROAX BV +00:05:BE Kongsberg Seatex AS +00:05:C3 Pacific Instruments, Inc. +00:05:9D Daniel Computing Systems, Inc. +00:07:96 LSI Systems, Inc. +00:07:90 Tri-M Technologies (s) Limited +00:07:84 Cisco Systems, Inc +00:07:89 DONGWON SYSTEMS +00:07:83 SynCom Network, Inc. +00:07:8A Mentor Data System Inc. +00:07:7A Infoware System Co., Ltd. +00:07:6D Flexlight Networks +00:07:69 Italiana Macchi SpA +00:07:73 Ascom Powerline Communications Ltd. +00:07:5D Celleritas Inc. +00:07:63 Sunniwell Cyber Tech. Co., Ltd. +00:07:56 Juyoung Telecom +00:07:C9 Technol Seven Co., Ltd. +00:04:7B Schlumberger +00:07:C3 Thomson +00:07:BD Radionet Ltd. +00:07:B0 Office Details, Inc. +00:07:B7 Samurai Ind. Prods Eletronicos Ltda +00:07:B6 Telecom Technology Ltd. +00:07:A3 Ositis Software, Inc. +00:07:A9 Novasonics +00:07:AC Eolring +00:07:9C Golden Electronics Technology Co., Ltd. +00:06:AB W-Link Systems, Inc. +00:06:A5 PINON Corp. +00:06:A1 Celsian Technologies, Inc. +00:06:94 Mobillian Corporation +00:06:9B AVT Audio Video Technologies GmbH +00:06:8E HID Corporation +00:06:88 Telways Communication Co., Ltd. +00:06:82 Convedia +00:06:81 Goepel Electronic GmbH +00:06:55 Yipee, Inc. +00:D0:5F VALCOM, INC. +00:06:74 Spectrum Control, Inc. +00:06:78 Marantz Brand Company +00:06:61 NIA Home Technologies Corp. +00:06:68 Vicon Industries Inc. +00:06:67 Tripp Lite +00:06:6E Delta Electronics, Inc. +00:06:4E Broad Net Technology Inc. +00:06:4F PRO-NETS Technology Corporation +00:06:42 Genetel Systems Inc. +00:06:3E Opthos Inc. +00:06:48 Seedsware, Inc. +00:06:38 Sungjin C&C Co., Ltd. +00:07:0B Novabase SGPS, SA +00:07:10 Adax, Inc. +00:07:00 Zettamedia Korea +00:06:F9 Mitsui Zosen Systems Research Inc. +00:07:03 CSEE Transport +00:07:06 Sanritz Corporation +00:06:E8 Optical Network Testing, Inc. +00:06:EE Shenyang Neu-era Information & Technology Stock Co., Ltd +00:06:E2 Ceemax Technology Co., Ltd. +00:06:D8 Maple Optical Systems +00:06:D4 Interactive Objects, Inc. +00:06:CE DATENO +00:06:B7 TELEM GmbH +00:06:BE Baumer Optronic GmbH +00:06:B8 Bandspeed Pty Ltd +00:06:BD BNTECHNOLOGY Co., Ltd. +00:06:C2 Smartmatic Corporation +00:06:C7 RFNET Technologies Pte Ltd (S) +00:06:B1 Sonicwall +00:04:75 3 Com Corporation +00:04:6F Digitel S/A Industria Eletronica +00:04:68 Vivity, Inc. +00:04:5C Mobiwave Pte Ltd +00:04:63 Bosch Security Systems +00:04:62 DAKOS Data & Communication Co., Ltd. +00:04:55 ANTARA.net +00:04:56 Cambium Networks Limited +00:04:50 DMD Computers SRL +00:04:46 CYZENTECH Co., Ltd. +00:04:4B NVIDIA +00:05:AD Topspin Communications, Inc. +00:05:B1 ASB Technology BV +00:05:B7 Arbor Technology Corp. +00:05:A3 QEI, Inc. +00:05:97 Eagle Traffic Control Systems +00:05:91 Active Silicon Ltd +00:05:8A Netcom Co., Ltd. +00:05:90 Swissvoice Ltd. +00:05:7E Eckelmann Steuerungstechnik GmbH +00:05:78 Private +00:05:84 AbsoluteValue Systems, Inc. +00:05:2E Cinta Networks +00:05:3A Willowglen Services Pte Ltd +00:05:28 New Focus, Inc. +00:05:27 SJ Tek Co. Ltd +00:05:21 Control Microsystems +00:05:15 Nuark Co., Ltd. +00:05:1B Magic Control Technology Corporation +00:05:11 Complementary Technologies Ltd +00:05:0B SICOM Systems, Inc. +00:05:01 Cisco Systems, Inc +00:05:05 Systems Integration Solutions, Inc. +00:05:04 Naray Information & Communication Enterprise +00:04:FB Commtech, Inc. +00:05:74 Cisco Systems, Inc +00:05:67 Etymonic Design, Inc. +00:05:6E National Enhance Technology, Inc. +00:05:6D Pacific Corporation +00:05:61 nac Image Technology, Inc. +00:05:5B Charles Industries, Ltd. +00:05:54 Rangestar Wireless +00:05:55 Japan Cash Machine Co., Ltd. +00:05:47 Starent Networks +00:05:4E Philips +00:05:40 FAST Corporation +00:05:41 Advanced Systems Co., Ltd. +00:05:34 Northstar Engineering Ltd. +00:04:F4 Infinite Electronics Inc. +00:04:EE Lincoln Electric Company +00:04:E8 IER, Inc. +00:80:86 COMPUTER GENERATION INC. +00:04:DE Cisco Systems, Inc +00:04:E4 Daeryung Ind., Inc. +00:04:D7 Omitec Instrumentation Ltd. +00:04:D8 IPWireless, Inc. +00:04:D2 Adcon Telemetry GmbH +00:04:D1 Drew Technologies, Inc. +00:04:CB Tdsoft Communication, Ltd. +00:04:BF VersaLogic Corp. +00:04:C5 ASE Technologies, USA +00:04:3F ESTeem Wireless Modems, Inc +00:04:39 Rosco Entertainment Technology, Inc. +00:04:33 Cyberboard A/S +00:04:2C Minet, Inc. +00:04:27 Cisco Systems, Inc +00:04:26 Autosys +00:04:20 Slim Devices, Inc. +00:04:13 SNOM Technology AG +00:04:18 Teltronic S.A.U. +00:04:12 WaveSmith Networks, Inc. +00:04:0C Kanno Works, Ltd. +00:03:70 NXTV, Inc. +00:04:05 ACN Technologies +00:04:06 Fa. Metabox AG +00:03:FB ENEGATE Co.,Ltd. +00:03:FC Intertex Data AB +00:03:EF Oneline AG +00:03:F6 Allegro Networks, Inc. +00:03:EA Mega System Technologies, Inc. +00:03:E9 Akara Canada, Inc. +00:03:E4 Cisco Systems, Inc +00:03:D8 iMPath Networks, Inc. +00:03:D5 Advanced Communications Co., Ltd. +00:03:CC Momentum Computer, Inc. +00:03:D1 Takaya Corporation +00:03:C5 Mobotix AG +00:03:BE Netility +00:03:B9 Hualong Telecom Co., Ltd. +00:03:B7 ZACCESS Systems +00:03:B3 IA Link Systems Co., Ltd. +00:03:A7 Unixtar Technology, Inc. +00:03:AE Allied Advanced Manufacturing Pte, Ltd. +00:03:A0 Cisco Systems, Inc +00:03:98 WISI +00:03:9B NetChip Technology, Inc. +00:03:94 Connect One +00:03:8D PCS Revenue Control Systems, Inc. +00:03:85 Actelis Networks, Inc. +00:03:88 Fastfame Technology Co., Ltd. +00:03:7F Atheros Communications, Inc. +00:04:B8 Kumahira Co., Ltd. +00:04:B2 ESSEGI SRL +00:04:AE Sullair Corporation +00:04:AB Comverse Network Systems, Inc. +00:04:9F Freescale Semiconductor +00:04:A4 NetEnabled, Inc. +00:04:9E Wirelink Co., Ltd. +00:04:98 Mahi Networks +00:04:91 Technovision, Inc. +00:04:8C Nayna Networks, Inc. +00:04:92 Hive Internet, Ltd. +00:04:85 PicoLight +00:03:07 Secure Works, Inc. +00:03:00 Barracuda Networks, Inc. +00:02:F8 SEAKR Engineering, Inc. +00:D0:24 Cognex Corporation +00:02:F4 PCTEL, Inc. +00:02:FB Baumuller Aulugen-Systemtechnik GmbH +00:02:E9 CS Systemes De Securite - C3S +00:02:DD Bromax Communications, Ltd. +00:02:E2 NDC Infared Engineering +00:02:DA ExiO Communications, Inc. +00:02:D6 NICE Systems +00:02:CA EndPoints, Inc. +00:02:CF ZyGate Communications, Inc. +00:01:CD ARtem +00:01:D2 inXtron, Inc. +00:01:C9 Cisco Systems, Inc +00:01:C7 Cisco Systems, Inc +00:01:C2 ARK Research Corp. +00:01:BE Gigalink Co., Ltd. +00:01:BC Brains Corporation +00:01:AC Sitara Networks, Inc. +00:01:A9 BMW AG +00:01:B0 Fulltek Technology Co., Ltd. +00:01:79 WIRELESS TECHNOLOGY, INC. +00:01:85 Hitachi Aloka Medical, Ltd. +00:01:8C Mega Vision +00:01:92 Texas Digital Systems +00:01:9E ESS Technology, Inc. +00:10:95 Thomson Inc. +00:02:5A Catena Networks +00:02:71 Zhone Technologies +00:02:6C Philips CFT +00:02:6A Cocess Telecom Co., Ltd. +00:02:66 Thermalogic Corporation +00:02:5F Nortel Networks +00:02:56 Alpha Processor, Inc. +00:02:51 Soma Networks, Inc. +00:02:4A Cisco Systems, Inc +00:02:4D Mannesman Dematic Colby Pty. Ltd. +00:02:45 Lampus Co, Ltd. +00:02:3E Selta Telematica S.p.a +00:02:3B Ericsson +00:02:37 Cosmo Research Corp. +00:02:34 Imperial Technology, Inc. +00:02:28 Necsom, Ltd. +00:02:24 C-COR +00:02:0D Micronpc.com +00:02:20 CANON FINETECH INC. +00:03:78 HUMAX Co., Ltd. +00:03:6C Cisco Systems, Inc +00:03:73 Aselsan A.S +00:03:68 Embedone Co., Ltd. +00:03:66 ASM Pacific Technology +00:03:65 Kira Information & Communications, Ltd. +00:03:60 PAC Interactive Technology, Inc. +00:03:5D Bosung Hi-Net Co., Ltd. +00:03:1A Beijing Broad Telecom Ltd., China +00:03:59 DigitalSis +00:03:54 Fiber Logic Communications +00:03:52 Colubris Networks +00:03:4E Pos Data Company, Ltd. +00:02:C3 Arelnet Ltd. +00:02:BE Totsu Engineering, Inc. +00:02:BA Cisco Systems, Inc +00:02:B2 Cablevision +00:02:B5 Avnet, Inc. +00:02:AE Scannex Electronics Ltd. +00:02:A7 Vivace Networks +00:02:A2 Hilscher GmbH +00:02:97 C-COR.net +00:02:8E Rapid 5 Networks, Inc. +00:02:93 Solid Data Systems +00:01:FA HOROSCAS +00:02:84 AREVA T&D +00:02:7D Cisco Systems, Inc +00:03:3F BigBand Networks, Ltd. +00:03:36 Zetes Technologies +00:03:3B TAMI Tech Co., Ltd. +00:03:28 Mace Group, Inc. +00:03:2F Global Sun Technology, Inc. +00:03:20 Xpeed, Inc. +00:03:23 Cornet Technology, Inc. +00:02:9F L-3 Communication Aviation Recorders +00:03:1F Condev Ltd. +00:03:17 Merlin Systems, Inc. +00:03:0E Core Communications Co., Ltd. +00:03:13 Access Media SPA +00:01:A5 Nextcomm, Inc. +00:01:A1 Mag-Tek, Inc. +00:01:95 Sena Technologies, Inc. +00:01:7D ThermoQuest +00:01:89 Refraction Technology, Inc. +00:30:8B Brix Networks +00:01:4F ADTRAN INC +00:01:5A Digital Video Broadcasting +00:01:66 TC GROUP A/S +00:01:6D CarrierComm Inc. +00:01:5F DIGITAL DESIGN GmbH +00:02:14 DTVRO +00:02:10 Fenecom +00:02:08 Unify Networks, Inc. +00:02:01 IFM Electronic gmbh +00:01:F5 ERIM S.A. +00:01:FD Digital Voice Systems, Inc. +00:01:E5 Supernet, Inc. +00:01:E8 Force10 Networks, Inc. +00:01:D9 Sigma, Inc. +00:01:E0 Fast Systems, Inc. +00:01:D5 HAEDONG INFO & COMM CO., LTD +00:01:18 EZ Digital Co., Ltd. +00:01:24 Acer Incorporated +00:01:01 Private +00:01:0D CORECO, INC. +00:01:14 KANDA TSUSHIN KOGYO CO., LTD. +00:01:11 iDigm Inc. +00:01:05 Beckhoff Automation GmbH +00:02:9C 3COM +00:B0:09 Grass Valley, A Belden Brand +00:B0:9D Point Grey Research Inc. +00:B0:94 Alaris, Inc. +00:B0:48 Marconi Communications Inc. +00:B0:C7 Tellabs Operations, Inc. +00:30:60 Powerfile, Inc. +00:30:1C ALTVATER AIRDATA SYSTEMS +00:30:15 CP CLARE CORP. +00:30:E6 Draeger Medical Systems, Inc. +00:30:91 TAIWAN FIRST LINE ELEC. CORP. +00:30:80 Cisco Systems, Inc +00:30:AD SHANGHAI COMMUNICATION +00:30:5B Toko Inc. +00:30:24 Cisco Systems, Inc +00:30:1F OPTICAL NETWORKS, INC. +00:30:D9 DATACORE SOFTWARE CORP. +00:D0:FF Cisco Systems, Inc +00:30:58 API MOTION +00:30:C6 CONTROL SOLUTIONS, INC. +00:30:36 RMP ELEKTRONIKSYSTEME GMBH +00:30:8A NICOTRA SISTEMI S.P.A +00:30:2C SYLANTRO SYSTEMS CORPORATION +00:30:06 SUPERPOWER COMPUTER +00:30:79 CQOS, INC. +00:30:59 KONTRON COMPACT COMPUTERS AG +00:30:B9 ECTEL +00:30:3A MAATEL +00:30:A3 Cisco Systems, Inc +00:30:40 Cisco Systems, Inc +00:30:64 ADLINK TECHNOLOGY, INC. +00:30:97 AB Regin +00:30:EB TURBONET COMMUNICATIONS, INC. +00:30:C8 GAD LINE, LTD. +00:30:C9 LuxN, N +00:B0:1E Rantic Labs, Inc. +00:B0:64 Cisco Systems, Inc +00:30:A2 Lightner Engineering +00:30:DE WAGO Kontakttechnik GmbH +00:30:9E WORKBIT CORPORATION. +00:30:57 QTelNet, Inc. +00:30:5C SMAR Laboratories Corp. +00:30:82 TAIHAN ELECTRIC WIRE CO., LTD. +00:30:AE Times N System, Inc. +00:30:0D MMC Technology, Inc. +00:30:75 ADTECH +00:30:E7 CNF MOBILE SOLUTIONS, INC. +00:30:19 Cisco Systems, Inc +00:30:52 ELASTIC NETWORKS +00:30:11 HMS Industrial Networks +00:30:4A Fraunhofer IPMS +00:30:14 DIVIO, INC. +00:30:29 OPICOM +00:30:BD BELKIN COMPONENTS +00:30:BA AC&T SYSTEM CO., LTD. +00:30:1D SKYSTREAM, INC. +00:30:49 BRYANT TECHNOLOGY, LTD. +00:30:41 SAEJIN T & M CO., LTD. +00:30:8C Quantum Corporation +00:D0:4F BITRONICS, INC. +00:D0:EF IGT +00:D0:22 INCREDIBLE TECHNOLOGIES, INC. +00:D0:C8 Prevas A/S +00:D0:52 ASCEND COMMUNICATIONS, INC. +00:D0:B1 OMEGA ELECTRONICS SA +00:D0:C1 HARMONIC DATA SYSTEMS, LTD. +00:D0:F0 CONVISION TECHNOLOGY GMBH +00:D0:0E PLURIS, INC. +00:D0:55 KATHREIN-WERKE KG +00:D0:95 Alcatel-Lucent, Enterprise Business Group +00:D0:00 FERRAN SCIENTIFIC, INC. +00:D0:05 ZHS ZEITMANAGEMENTSYSTEME +00:D0:19 DAINIPPON SCREEN CORPORATE +00:D0:53 CONNECTED SYSTEMS +00:D0:97 Cisco Systems, Inc +00:01:6A ALITEC +00:01:76 Orient Silver Enterprises +00:01:58 Electro Industries/Gauge Tech +00:01:2D Komodo Technology +00:01:39 Point Multimedia Systems +00:01:40 Sendtek Corporation +00:01:4C Berkeley Process Control +00:01:35 KDC Corp. +00:01:3C TIW SYSTEMS +00:01:48 X-traWeb Inc. +00:01:20 OSCILLOQUARTZ S.A. +00:01:27 OPEN Networks Pty Ltd +00:30:9C Timing Applications, Inc. +00:30:86 Transistor Devices, Inc. +00:30:B5 Tadiran Microwave Networks +00:30:70 1Net Corporation +00:30:44 CradlePoint, Inc +00:30:7E Redflex Communication Systems +00:30:7A Advanced Technology & Systems +00:30:B7 Teletrol Systems, Inc. +00:30:B3 San Valley Systems, Inc. +00:30:3B PowerCom Technology +00:30:BC Optronic AG +00:30:71 Cisco Systems, Inc +00:90:03 APLIO +00:90:D7 NetBoost Corp. +00:90:93 NANAO CORPORATION +00:90:B4 WILLOWBROOK TECHNOLOGIES +00:90:83 TURBO COMMUNICATION, INC. +00:90:BD OMNIA COMMUNICATIONS, INC. +00:90:94 OSPREY TECHNOLOGIES, INC. +00:90:DD MIHARU COMMUNICATIONS Inc +00:90:28 NIPPON SIGNAL CO., LTD. +00:90:8C ETREND ELECTRONICS, INC. +00:90:5D NETCOM SICHERHEITSTECHNIK GMBH +00:90:68 DVT CORP. +00:90:30 HONEYWELL-DATING +00:90:D3 GIESECKE & DEVRIENT GmbH +00:50:81 MURATA MACHINERY, LTD. +00:50:CB JETTER +00:50:0E CHROMATIS NETWORKS, INC. +00:50:FD VISIONCOMM CO., LTD. +00:50:FE PCTVnet ASA +00:50:AB NALTEC, Inc. +00:50:06 TAC AB +00:50:BF Metalligence Technology Corp. +00:50:89 SAFETY MANAGEMENT SYSTEMS +00:50:66 AtecoM GmbH advanced telecomunication modules +00:50:D9 ENGETRON-ENGENHARIA ELETRONICA IND. e COM. LTDA +00:50:43 MARVELL SEMICONDUCTOR, INC. +00:50:18 AMIT, Inc. +00:50:59 iBAHN +00:50:6A EDEVA, INC. +00:50:2E CAMBEX CORPORATION +00:50:70 CHAINTECH COMPUTER CO., LTD. +00:50:3B MEDIAFIRE CORPORATION +00:50:84 ATL PRODUCTS +00:50:55 DOMS A/S +00:50:4B BARCONET N.V. +00:50:46 MENICX INTERNATIONAL CO., LTD. +00:50:2C SOYO COMPUTER, INC. +00:50:60 TANDBERG TELECOM AS +00:50:DD SERRA SOLDADURA, S.A. +00:50:3F ANCHOR GAMES +00:50:EE TEK DIGITEL CORPORATION +00:50:04 3COM CORPORATION +00:50:72 CORVIS CORPORATION +00:50:12 CBL - GMBH +00:50:E8 NOMADIX INC. +00:50:F2 MICROSOFT CORP. +00:50:52 TIARA NETWORKS, INC. +00:50:64 CAE ELECTRONICS +00:50:B4 SATCHWELL CONTROL SYSTEMS, LTD +00:50:B2 BRODEL GmbH +00:D0:81 RTD Embedded Technologies, Inc. +00:D0:11 PRISM VIDEO, INC. +00:D0:9B SPECTEL LTD. +00:D0:31 INDUSTRIAL LOGIC CORPORATION +00:D0:21 REGENT ELECTRONICS CORP. +00:D0:DF KUZUMI ELECTRONICS, INC. +00:D0:B4 KATSUJIMA CO., LTD. +00:D0:79 Cisco Systems, Inc +00:D0:E2 MRT MICRO, INC. +00:D0:39 UTILICOM, INC. +00:50:4F OLENCOM ELECTRONICS +00:50:A0 DELTA COMPUTER SYSTEMS, INC. +00:50:07 SIEMENS TELECOMMUNICATION SYSTEMS LIMITED +00:50:15 BRIGHT STAR ENGINEERING +00:50:31 AEROFLEX LABORATORIES, INC. +00:50:DF AirFiber, Inc. +00:50:F3 GLOBAL NET INFORMATION CO., Ltd. +00:50:38 DAIN TELECOM CO., LTD. +00:D0:E1 AVIONITEK ISRAEL INC. +00:D0:1B MIMAKI ENGINEERING CO., LTD. +00:D0:6E TRENDVIEW RECORDERS LTD. +00:D0:75 ALARIS MEDICAL SYSTEMS, INC. +00:50:9D THE INDUSTREE B.V. +00:50:1E Grass Valley, A Belden Brand +00:50:2B GENRAD LTD. +00:50:0A IRIS TECHNOLOGIES, INC. +00:D0:27 APPLIED AUTOMATION, INC. +00:D0:F1 SEGA ENTERPRISES, LTD. +00:D0:09 HSING TECH. ENTERPRISE CO. LTD +00:D0:80 EXABYTE CORPORATION +00:D0:84 NEXCOMM SYSTEMS, INC. +00:D0:E6 IBOND INC. +00:D0:99 Elcard Wireless Systems Oy +00:90:AF J. MORITA MFG. CORP. +00:90:88 BAXALL SECURITY LTD. +00:90:E0 SYSTRAN CORP. +00:90:3E N.V. PHILIPS INDUSTRIAL ACTIVITIES +00:90:B9 BERAN INSTRUMENTS LTD. +00:90:1A UNISPHERE SOLUTIONS +00:90:82 FORCE INSTITUTE +00:90:6A TURNSTONE SYSTEMS, INC. +00:01:FE DIGITAL EQUIPMENT CORPORATION +00:90:77 ADVANCED FIBRE COMMUNICATIONS +00:90:B2 AVICI SYSTEMS INC. +00:90:95 UNIVERSAL AVIONICS +00:90:12 GLOBESPAN SEMICONDUCTOR, INC. +00:90:B6 FIBEX SYSTEMS +00:90:F4 LIGHTNING INSTRUMENTATION +00:90:4F ABB POWER T&D COMPANY, INC. +00:90:5A DEARBORN GROUP, INC. +00:90:66 Troika Networks, Inc. +00:90:7A Spectralink, Inc +00:90:F0 Harmonic Video Systems Ltd. +00:10:47 ECHO ELETRIC CO. LTD. +00:10:0C ITO CO., LTD. +00:10:D0 WITCOM, LTD. +00:10:06 Thales Contact Solutions Ltd. +00:10:D6 Exelis +00:10:76 EUREM GmbH +00:10:3F TOLLGRADE COMMUNICATIONS, INC. +00:10:34 GNP Computers +00:10:12 PROCESSOR SYSTEMS (I) PVT LTD +00:10:C8 COMMUNICATIONS ELECTRONICS SECURITY GROUP +00:10:D1 Top Layer Networks, Inc. +00:10:F0 RITTAL-WERK RUDOLF LOH GmbH & Co. +00:10:6A DIGITAL MICROWAVE CORPORATION +00:10:30 EION Inc. +00:10:A4 XIRCOM +00:10:50 RION CO., LTD. +00:10:9C M-SYSTEM CO., LTD. +00:10:64 DNPG, LLC +00:10:20 Hand Held Products Inc +00:10:6E TADIRAN COM. LTD. +00:10:5B NET INSIGHT AB +00:10:02 ACTIA +00:10:A0 INNOVEX TECHNOLOGIES, INC. +00:10:74 ATEN INTERNATIONAL CO., LTD. +00:10:57 Rebel.com, Inc. +00:10:BC Aastra Telecom +00:10:33 ACCESSLAN COMMUNICATIONS, INC. +00:04:AC IBM Corp +00:10:B4 ATMOSPHERE NETWORKS +00:10:F9 UNIQUE SYSTEMS, INC. +00:10:38 MICRO RESEARCH INSTITUTE, INC. +00:10:0A WILLIAMS COMMUNICATIONS GROUP +00:10:80 METAWAVE COMMUNICATIONS +00:10:AB KOITO ELECTRIC INDUSTRIES, LTD. +00:90:3C ATLANTIC NETWORK SYSTEMS +00:90:CE TETRA GmbH +00:90:E3 AVEX ELECTRONICS INC. +00:90:0B LANNER ELECTRONICS, INC. +00:90:C8 WAVERIDER COMMUNICATIONS (CANADA) INC. +00:90:B7 DIGITAL LIGHTWAVE, INC. +00:90:37 ACUCOMM, INC. +00:90:59 TELECOM DEVICE K.K. +00:E0:03 NOKIA WIRELESS BUSINESS COMMUN +00:E0:F3 WebSprint Communications, Inc. +00:E0:13 EASTERN ELECTRONIC CO., LTD. +00:10:63 STARGUIDE DIGITAL NETWORKS +00:10:A7 UNEX TECHNOLOGY CORPORATION +00:10:39 Vectron Systems AG +00:10:C3 CSI-CONTROL SYSTEMS +00:10:7F CRESTRON ELECTRONICS, INC. +00:10:2C Lasat Networks A/S +00:10:B7 COYOTE TECHNOLOGIES, LLC +00:60:64 NETCOMM LIMITED +00:60:CB HITACHI ZOSEN CORPORATION +00:60:90 Artiza Networks Inc +00:60:A9 GESYTEC MBH +00:60:F2 LASERGRAPHICS, INC. +00:60:31 HRK SYSTEMS +00:60:A6 PARTICLE MEASURING SYSTEMS +00:60:82 NOVALINK TECHNOLOGIES, INC. +00:60:12 POWER COMPUTING CORPORATION +00:60:4D MMC NETWORKS, INC. +00:60:48 EMC CORPORATION +00:60:E5 FUJI AUTOMATION CO., LTD. +00:60:10 NETWORK MACHINES, INC. +00:60:44 LITTON/POLY-SCIENTIFIC +00:60:9B ASTRO-MED, INC. +00:60:BE WEBTRONICS +00:60:52 PERIPHERALS ENTERPRISE CO., Ltd. +00:E0:3F JATON CORPORATION +00:E0:EB DIGICOM SYSTEMS, INCORPORATED +00:E0:0E AVALON IMAGING SYSTEMS, INC. +00:E0:CD SAAB SENSIS CORPORATION +00:E0:CB RESON, INC. +00:E0:48 SDL COMMUNICATIONS, INC. +00:E0:83 JATO TECHNOLOGIES, INC. +00:E0:3D FOCON ELECTRONIC SYSTEMS A/S +00:E0:FA TRL TECHNOLOGY, LTD. +00:E0:2C AST COMPUTER +00:E0:0B ROOFTOP COMMUNICATIONS CORP. +00:E0:67 eac AUTOMATION-CONSULTING GmbH +00:E0:58 PHASE ONE DENMARK A/S +00:E0:89 ION Networks, Inc. +00:E0:3B PROMINET CORPORATION +00:60:17 TOKIMEC INC. +00:60:E6 SHOMITI SYSTEMS INCORPORATED +00:60:53 TOYODA MACHINE WORKS, LTD. +00:60:A0 SWITCHED NETWORK TECHNOLOGIES, INC. +00:60:19 Roche Diagnostics +00:60:33 ACUITY IMAGING, INC. +00:60:EE APOLLO +00:60:22 VICOM SYSTEMS, INC. +00:60:13 NETSTAL MASCHINEN AG +00:60:F4 ADVANCED COMPUTER SOLUTIONS, Inc. +00:60:11 CRYSTAL SEMICONDUCTOR CORP. +00:60:0E WAVENET INTERNATIONAL, INC. +00:60:C0 Nera Networks AS +00:E0:62 HOST ENGINEERING +00:E0:33 E.E.P.D. GmbH +00:E0:79 A.T.N.R. +00:E0:9C MII +00:E0:75 Verilink Corporation +00:E0:7A MIKRODIDAKT AB +00:E0:3E ALFATECH, INC. +00:E0:9A Positron Inc. +00:60:D7 ECOLE POLYTECHNIQUE FEDERALE DE LAUSANNE (EPFL) +00:60:87 KANSAI ELECTRIC CO., LTD. +00:E0:29 STANDARD MICROSYSTEMS CORP. +00:60:6B Synclayer Inc. +00:60:73 REDCREEK COMMUNICATIONS, INC. +00:60:39 SanCom Technology, Inc. +00:60:A5 PERFORMANCE TELECOM CORP. +00:60:B3 Z-COM, INC. +00:60:89 XATA +00:60:3C HAGIWARA SYS-COM CO., LTD. +00:60:2E CYCLADES CORPORATION +00:60:75 PENTEK, INC. +00:60:1C TELXON CORPORATION +00:60:16 CLARIION +00:60:AD MegaChips Corporation +00:60:B6 LAND COMPUTER CO., LTD. +00:60:55 CORNELL UNIVERSITY +00:60:15 NET2NET CORPORATION +00:A0:1D Red Lion Controls, LP +00:A0:71 VIDEO LOTTERY TECHNOLOGIES,INC +00:A0:52 STANILITE ELECTRONICS PTY. LTD +00:A0:EA ETHERCOM CORP. +00:A0:2E BRAND COMMUNICATIONS, LTD. +00:A0:E2 Keisokugiken Corporation +00:A0:58 GLORY, LTD. +00:E0:93 ACKFIN NETWORKS +00:E0:E3 SK-ELEKTRONIK GMBH +00:E0:66 ProMax Systems, Inc. +00:E0:DB ViaVideo Communications, Inc. +00:E0:DF KEYMILE GmbH +00:E0:0D RADIANT SYSTEMS +00:E0:08 AMAZING CONTROLS! INC. +00:E0:86 Emerson Network Power, Avocent Division +00:E0:E1 G2 NETWORKS, INC. +00:E0:42 Pacom Systems Ltd. +00:E0:8E UTSTARCOM +00:E0:95 ADVANCED-VISION TECHNOLGIES CORP. +00:60:06 SOTEC CO., LTD +00:60:3D 3CX +00:60:29 CARY PERIPHERALS INC. +00:60:43 iDirect, INC. +00:60:D1 CASCADE COMMUNICATIONS +00:60:CD VideoServer, Inc. +00:60:94 IBM Corp +00:60:D9 TRANSYS NETWORKS INC. +00:60:AA INTELLIGENT DEVICES INC. (IDI) +00:60:5A CELCORE, INC. +00:60:65 BERNECKER & RAINER INDUSTRIE-ELEKTRONIC GmbH +00:E0:7B BAY NETWORKS +00:E0:77 WEBGEAR, INC. +00:E0:D2 VERSANET COMMUNICATIONS, INC. +00:E0:4E SANYO DENKI CO., LTD. +00:E0:D0 NETSPEED, INC. +00:E0:2A TANDBERG TELEVISION AS +00:E0:5B WEST END SYSTEMS CORP. +00:E0:51 TALX CORPORATION +00:A0:F0 TORONTO MICROELECTRONICS INC. +00:A0:49 DIGITECH INDUSTRIES, INC. +00:A0:27 FIREPOWER SYSTEMS, INC. +00:A0:FF TELLABS OPERATIONS, INC. +00:A0:01 DRS Signal Solutions +00:A0:F1 MTI +00:A0:46 SCITEX CORP. LTD. +00:A0:D9 CONVEX COMPUTER CORPORATION +00:A0:B5 3H TECHNOLOGY +00:A0:AC GILAT SATELLITE NETWORKS, LTD. +00:A0:57 LANCOM Systems GmbH +00:A0:86 AMBER WAVE SYSTEMS, INC. +00:A0:83 ASIMMPHONY TURKEY +00:A0:91 APPLICOM INTERNATIONAL +00:A0:04 NETPOWER, INC. +00:A0:81 ALCATEL DATA NETWORKS +00:A0:D5 SIERRA WIRELESS INC. +00:20:0F EBRAINS Inc +00:20:C7 AKAI Professional M.I. Corp. +00:20:EB CINCINNATI MICROWAVE, INC. +00:20:E3 MCD KENCOM CORPORATION +00:20:13 DIVERSIFIED TECHNOLOGY, INC. +00:20:C1 SAXA, Inc. +00:20:87 MEMOTEC, INC. +00:20:F9 PARALINK NETWORKS, INC. +00:A0:F9 BINTEC COMMUNICATIONS GMBH +00:A0:BC VIASAT, INCORPORATED +00:A0:03 Siemens Switzerland Ltd., I B T HVP +00:A0:9E ICTV +00:A0:26 TELDAT, S.A. +00:20:1A MRV Communications, Inc. +00:20:23 T.C. TECHNOLOGIES PTY. LTD +00:20:F3 RAYNET CORPORATION +00:20:39 SCINETS +00:20:38 VME MICROSYSTEMS INTERNATIONAL CORPORATION +00:20:3E LogiCan Technologies, Inc. +00:20:55 ALTECH CO., LTD. +00:20:D9 PANASONIC TECHNOLOGIES, INC./MIECO-US +00:20:80 SYNERGY (UK) LTD. +00:20:26 AMKLY SYSTEMS, INC. +00:20:3D Honeywell ECC +00:20:19 OHLER GMBH +00:20:57 TITZE DATENTECHNIK GmbH +00:20:BE LAN ACCESS CORP. +00:20:22 NMS Communications +00:20:AA Ericsson Television Limited +00:20:8E CHEVIN SOFTWARE ENG. LTD. +00:20:3B WISDM LTD. +00:20:44 GENITECH PTY LTD +00:20:F5 PANDATEL AG +00:20:21 ALGORITHMS SOFTWARE PVT. LTD. +00:20:74 SUNGWOON SYSTEMS +00:20:CE LOGICAL DESIGN GROUP, INC. +00:20:82 ONEAC CORPORATION +00:20:BF AEHR TEST SYSTEMS +00:20:F1 ALTOS INDIA LIMITED +00:20:5D NANOMATIC OY +00:20:E1 ALAMAR ELECTRONICS +00:20:CC DIGITAL SERVICES, LTD. +00:20:2C WELLTRONIX CO., LTD. +00:20:B3 Tattile SRL +00:A0:48 QUESTECH, LTD. +00:A0:C4 CRISTIE ELECTRONICS LTD. +00:A0:89 XPOINT TECHNOLOGIES, INC. +00:A0:D1 INVENTEC CORPORATION +00:A0:AE NUCOM SYSTEMS, INC. +00:A0:2B TRANSITIONS RESEARCH CORP. +00:A0:A1 EPIC DATA INC. +00:A0:C3 UNICOMPUTER GMBH +00:A0:42 SPUR PRODUCTS CORP. +00:C0:07 PINNACLE DATA SYSTEMS, INC. +00:C0:F8 ABOUT COMPUTING INC. +00:C0:6F KOMATSU LTD. +00:C0:8E NETWORK INFORMATION TECHNOLOGY +00:C0:5A SEMAPHORE COMMUNICATIONS CORP. +00:C0:EB SEH COMPUTERTECHNIK GMBH +00:C0:C7 SPARKTRUM MICROSYSTEMS, INC. +00:C0:D8 UNIVERSAL DATA SYSTEMS +00:C0:68 HME Clear-Com LTD. +00:40:DB ADVANCED TECHNICAL SOLUTIONS +00:40:5B FUNASSET LIMITED +00:40:1B PRINTER SYSTEMS CORP. +00:40:EB MARTIN MARIETTA CORPORATION +00:40:CD TERA MICROSYSTEMS, INC. +00:40:E5 SYBUS CORPORATION +00:40:F9 COMBINET +00:40:39 OPTEC DAIICHI DENKO CO., LTD. +00:40:FE SYMPLEX COMMUNICATIONS +00:20:F0 UNIVERSAL MICROELECTRONICS CO. +00:20:EF USC CORPORATION +00:20:16 SHOWA ELECTRIC WIRE & CABLE CO +00:20:1F BEST POWER TECHNOLOGY, INC. +00:20:45 ION Networks, Inc. +00:20:B6 AGILE NETWORKS, INC. +00:20:8A SONIX COMMUNICATIONS, LTD. +00:20:4C MITRON COMPUTER PTE LTD. +00:20:02 SERITECH ENTERPRISE CO., LTD. +00:20:4B AUTOCOMPUTER CO., LTD. +00:20:AF 3COM CORPORATION +00:20:48 Marconi Communications +00:20:08 CABLE & COMPUTER TECHNOLOGY +00:C0:23 TUTANKHAMON ELECTRONICS +00:C0:F3 NETWORK COMMUNICATIONS CORP. +00:C0:43 STRATACOM +00:C0:B3 COMSTAT DATACOMM CORPORATION +00:C0:B5 CORPORATE NETWORK SYSTEMS,INC. +00:40:3E RASTER OPS CORPORATION +00:40:AE DELTA CONTROLS, INC. +00:40:C6 FIBERNET RESEARCH, INC. +00:40:92 ASP COMPUTER PRODUCTS, INC. +00:40:54 CONNECTION MACHINES SERVICES +00:40:D8 OCEAN OFFICE AUTOMATION LTD. +00:40:C0 VISTA CONTROLS CORPORATION +00:40:88 MOBIUS TECHNOLOGIES, INC. +00:80:3B APT COMMUNICATIONS, INC. +00:80:BA SPECIALIX (ASIA) PTE, LTD +00:BB:01 OCTOTHORPE CORP. +00:C0:1F S.E.R.C.E.L. +00:C0:94 VMX INC. +00:C0:75 XANTE CORPORATION +00:C0:F9 Artesyn Embedded Technologies +00:C0:39 Teridian Semiconductor Corporation +00:C0:77 DAEWOO TELECOM LTD. +00:C0:2F OKUMA CORPORATION +00:C0:F1 SHINKO ELECTRIC CO., LTD. +00:C0:DE ZCOMM, INC. +00:40:AF DIGITAL PRODUCTS, INC. +00:40:4F SPACE & NAVAL WARFARE SYSTEMS +00:40:7B SCIENTIFIC ATLANTA +00:40:4E FLUENT, INC. +00:C0:F7 ENGAGE COMMUNICATION, INC. +00:C0:30 INTEGRATED ENGINEERING B. V. +00:C0:4A GROUP 2000 AG +00:C0:A6 EXICOM AUSTRALIA PTY. LTD +00:C0:53 Aspect Software Inc. +00:C0:CF IMATRAN VOIMA OY +00:C0:29 Nexans Deutschland GmbH - ANS +00:C0:A4 UNIGRAF OY +00:C0:60 ID SCANDINAVIA AS +00:C0:82 MOORE PRODUCTS CO. +00:C0:08 SECO SRL +00:C0:BB FORVAL CREATIVE, INC. +00:C0:E0 DSC COMMUNICATION CORP. +00:C0:5E VARI-LITE, INC. +00:C0:31 DESIGN RESEARCH SYSTEMS, INC. +00:C0:7C HIGHTECH INFORMATION +00:C0:AE TOWERCOM CO. INC. DBA PC HOUSE +00:C0:D6 J1 SYSTEMS, INC. +00:C0:AA SILICON VALLEY COMPUTER +00:C0:4E COMTROL CORPORATION +00:C0:0A MICRO CRAFT +00:C0:2A OHKURA ELECTRIC CO., LTD. +00:C0:F2 TRANSITION NETWORKS +00:C0:1D GRAND JUNCTION NETWORKS, INC. +00:C0:AD MARBEN COMMUNICATION SYSTEMS +00:C0:24 EDEN SISTEMAS DE COMPUTACAO SA +00:C0:E9 OAK SOLUTIONS, LTD. +00:C0:C5 SID INFORMATICA +00:C0:01 DIATEK PATIENT MANAGMENT +00:C0:7E KUBOTA CORPORATION ELECTRONIC +00:80:12 INTEGRATED MEASUREMENT SYSTEMS +00:80:39 ALCATEL STC AUSTRALIA +00:80:23 INTEGRATED BUSINESS NETWORKS +00:80:CA NETCOM RESEARCH INCORPORATED +00:80:4D CYCLONE MICROSYSTEMS, INC. +00:80:D6 NUVOTECH, INC. +00:80:ED IQ TECHNOLOGIES, INC. +00:80:C1 LANEX CORPORATION +00:80:49 NISSIN ELECTRIC CO., LTD. +00:80:7C FIBERCOM, INC. +00:80:79 MICROBUS DESIGNS LTD. +00:80:DE GIPSI S.A. +00:80:04 ANTLOW COMMUNICATIONS, LTD. +00:80:78 PRACTICAL PERIPHERALS, INC. +00:80:40 JOHN FLUKE MANUFACTURING CO. +00:00:F8 DIGITAL EQUIPMENT CORPORATION +00:80:CE BROADCAST TELEVISION SYSTEMS +00:80:1A BELL ATLANTIC +00:80:3F TATUNG COMPANY +00:80:D4 CHASE RESEARCH LTD. +00:80:CB FALCO DATA PRODUCTS +00:80:75 PARSYTEC GMBH +00:80:EB COMPCONTROL B.V. +00:80:99 Eaton Industries GmbH +00:80:E4 NORTHWEST DIGITAL SYSTEMS, INC +00:80:41 VEB KOMBINAT ROBOTRON +00:80:C8 D-LINK SYSTEMS, INC. +00:80:36 REFLEX MANUFACTURING SYSTEMS +00:40:F0 MicroBrain,Inc. +00:40:A7 ITAUTEC PHILCO S.A. +00:40:D3 KIMPSION INTERNATIONAL CORP. +00:40:65 GTE SPACENET +00:40:CB LANWAN TECHNOLOGIES +00:40:41 FUJIKURA LTD. +00:40:53 AMPRO COMPUTERS +00:80:32 ACCESS CO., LTD. +00:80:CF EMBEDDED PERFORMANCE INC. +00:80:31 BASYS, CORP. +00:80:3A VARITYPER, INC. +00:80:7E SOUTHERN PACIFIC LTD. +00:80:29 EAGLE TECHNOLOGY, INC. +00:80:2F NATIONAL INSTRUMENTS CORP. +00:80:51 FIBERMUX +00:80:FD EXSCEED CORPRATION +00:40:08 A PLUS INFO CORPORATION +00:40:E9 ACCORD SYSTEMS, INC. +00:40:B5 VIDEO TECHNOLOGY COMPUTERS LTD +00:40:12 WINDATA, INC. +00:40:1C AST RESEARCH, INC. +00:40:67 OMNIBYTE CORPORATION +00:40:35 OPCOM +00:40:EA PLAIN TREE SYSTEMS INC +00:40:EF HYPERCOM, INC. +00:40:93 PAXDATA NETWORKS LTD. +00:40:EC MIKASA SYSTEM ENGINEERING +00:80:B9 ARCHE TECHNOLIGIES INC. +00:80:A7 Honeywell International Inc +00:40:DA TELSPEC LTD +00:40:83 TDA INDUSTRIA DE PRODUTOS +00:40:C8 MILAN TECHNOLOGY CORPORATION +00:40:BC ALGORITHMICS LTD. +00:40:2F XLNT DESIGNS INC. +00:40:5D STAR-TEK, INC. +00:40:5F AFE COMPUTERS LTD. +00:40:43 Nokia Siemens Networks GmbH & Co. KG. +00:80:0D VOSSWINKEL F.U. +00:80:D1 KIMTRON CORPORATION +00:80:5D CANSTAR +00:80:94 ALFA LAVAL AUTOMATION AB +00:80:47 IN-NET CORP. +00:80:64 WYSE TECHNOLOGY LLC +00:80:C5 NOVELLCO DE MEXICO +00:80:AC IMLOGIX, DIVISION OF GENESYS +00:00:52 Intrusion.com, Inc. +00:00:BD MITSUBISHI CABLE COMPANY +00:00:37 OXFORD METRICS LIMITED +00:00:3F SYNTREX, INC. +08:00:7C VITALINK COMMUNICATIONS CORP. +08:00:76 PC LAN TECHNOLOGIES +08:00:72 XEROX CORP UNIV GRANT PROGRAM +08:00:70 MITSUBISHI ELECTRIC CORP. +08:00:68 RIDGE COMPUTERS +08:00:62 General Dynamics +08:00:57 Evans & Sutherland +00:00:10 SYTEK INC. +00:00:33 EGAN MACHINERY COMPANY +00:00:80 CRAY COMMUNICATIONS A/S +00:00:FD HIGH LEVEL HARDWARE +08:00:8C NETWORK RESEARCH CORPORATION +08:00:89 Kinetics +08:00:84 TOMEN ELECTRONICS CORP. +00:00:0D FIBRONICS LTD. +00:00:4F LOGICRAFT, INC. +00:00:15 DATAPOINT CORPORATION +00:00:C7 ARIX CORPORATION +00:00:1C BELL TECHNOLOGIES +00:00:1A ADVANCED MICRO DEVICES +00:00:82 LECTRA SYSTEMES SA +00:00:DA ATEX +00:00:DB British Telecommunications plc +00:00:C1 Madge Ltd. +00:00:F6 APPLIED MICROSYSTEMS CORP. +08:00:23 Panasonic Communications Co., Ltd. +08:00:22 NBI INC. +08:00:19 GENERAL ELECTRIC CORPORATION +08:00:4D CORVUS SYSTEMS INC. +08:00:3E CODEX CORPORATION +08:00:33 BAUSCH & LOMB +08:00:2F PRIME COMPUTER INC. +08:00:32 TIGAN INCORPORATED +08:00:2E METAPHOR COMPUTER SYSTEMS +00:00:D2 SBE, INC. +00:00:6B SILICON GRAPHICS INC./MIPS +00:00:CC DENSAN CO., LTD. +00:00:CE MEGADATA CORP. +00:00:EF KTI +00:00:0F NEXT, INC. +00:00:C6 EON SYSTEMS +00:00:D5 MICROGNOSIS INTERNATIONAL +00:00:78 LABTAM LIMITED +00:00:EB MATSUSHITA COMM. IND. CO. LTD. +00:00:9C ROLM MIL-SPEC COMPUTERS +00:00:32 Marconi plc +00:00:69 CONCORD COMMUNICATIONS INC +00:00:8B INFOTRON +00:00:BE THE NTI GROUP +00:00:4C NEC CORPORATION +00:00:3B i Controls, Inc. +00:00:FE ANNAPOLIS MICRO SYSTEMS +08:00:13 Exxon +02:BB:01 OCTOTHORPE CORP. +00:00:A6 NETWORK GENERAL CORPORATION +00:DD:06 UNGERMANN-BASS INC. +00:DD:0B UNGERMANN-BASS INC. +00:00:07 XEROX CORPORATION +08:00:14 EXCELAN +08:00:0F MITEL CORPORATION +00:00:D7 DARTMOUTH COLLEGE +00:DD:00 UNGERMANN-BASS INC. +08:00:0A NESTAR SYSTEMS INCORPORATED +08:00:1C KDD-KOKUSAI DEBNSIN DENWA CO. +02:AA:3C OLIVETTI TELECOMM SPA (OLTECO) +08:00:1D ABLE COMMUNICATIONS INC. +08:00:18 PIRELLI FOCOM NETWORKS +08:00:15 STC BUSINESS SYSTEMS +00:DD:03 UNGERMANN-BASS INC. +00:80:1F KRUPP ATLAS ELECTRONIK GMBH +00:40:8E Tattile SRL +00:80:0F STANDARD MICROSYSTEMS +08:00:65 GENRAD INC. +00:22:75 Belkin International Inc. +14:91:82 Belkin International Inc. +70:10:6F Hewlett Packard Enterprise +98:8B:5D Sagemcom Broadband SAS +94:FE:F4 Sagemcom Broadband SAS +C8:CD:72 Sagemcom Broadband SAS +E8:BE:81 Sagemcom Broadband SAS +28:FA:A0 vivo Mobile Communication Co., Ltd. +3C:A3:48 vivo Mobile Communication Co., Ltd. +F4:29:81 vivo Mobile Communication Co., Ltd. +C4:28:2D Embedded Intellect Pty Ltd +00:23:48 Sagemcom Broadband SAS +B8:70:F4 COMPAL INFORMATION (KUNSHAN) CO., LTD. +00:0F:B0 COMPAL ELECTRONICS, INC. +1C:75:08 COMPAL INFORMATION (KUNSHAN) CO., LTD. +8C:0E:E3 GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD +38:29:DD ONvocal Inc +F8:18:97 2Wire Inc +EC:F4:BB Dell Inc. +D0:67:E5 Dell Inc. +18:A9:9B Dell Inc. +F8:DB:88 Dell Inc. +18:FB:7B Dell Inc. +00:14:95 2Wire Inc +74:E6:E2 Dell Inc. +10:98:36 Dell Inc. +44:A8:42 Dell Inc. +34:E6:D7 Dell Inc. +00:0B:DB Dell Inc. +00:11:43 Dell Inc. +00:18:8B Dell Inc. +D4:BE:D9 Dell Inc. +00:26:50 2Wire Inc +00:21:7C 2Wire Inc +00:1F:B3 2Wire Inc +64:0F:28 2Wire Inc +00:1A:A0 Dell Inc. +00:21:70 Dell Inc. +00:26:B9 Dell Inc. +A4:BA:DB Dell Inc. +00:1E:4F Dell Inc. +5C:F9:DD Dell Inc. +90:7A:F1 Wally +28:10:1B MagnaCom +00:06:5B Dell Inc. +44:87:23 HOYA SERVICE CORPORATION +80:6C:1B Motorola Mobility LLC, a Lenovo Company +A4:70:D6 Motorola Mobility LLC, a Lenovo Company +34:07:FB Ericsson AB +00:1B:21 Intel Corporate +00:1B:77 Intel Corporate +18:FF:0F Intel Corporate +58:A8:39 Intel Corporate +A4:34:D9 Intel Corporate +00:21:5D Intel Corporate +00:16:76 Intel Corporate +98:4F:EE Intel Corporate +E8:2A:EA Intel Corporate +60:57:18 Intel Corporate +C4:D9:87 Intel Corporate +B4:B6:76 Intel Corporate +8C:70:5A Intel Corporate +9C:4E:36 Intel Corporate +54:14:73 Wingtech Group (HongKong)Limited +14:14:4B FUJIAN STAR-NET COMMUNICATION CO.,LTD +00:1C:50 TCL Technoly Electronics (Huizhou) Co., Ltd. +00:AA:01 Intel Corporation +5C:36:B8 TCL King Electrical Appliances (Huizhou) Co., Ltd +00:90:27 Intel Corporation +A0:88:69 Intel Corporate +00:C2:C6 Intel Corporate +B8:8A:60 Intel Corporate +00:A0:C9 Intel Corporation +7C:7A:91 Intel Corporate +AC:7B:A1 Intel Corporate +AC:72:89 Intel Corporate +60:6C:66 Intel Corporate +4C:80:93 Intel Corporate +BC:77:37 Intel Corporate +A0:88:B4 Intel Corporate +00:27:0E Intel Corporate +00:1D:E0 Intel Corporate +00:24:D6 Intel Corporate +D8:FC:93 Intel Corporate +E8:B1:FC Intel Corporate +18:64:72 Aruba Networks +00:24:6C Aruba Networks +64:D9:54 Taicang T&W Electronics +74:C6:3B AzureWave Technology Inc. +CC:1F:C4 InVue +A0:D3:7A Intel Corporate +98:5F:D3 Microsoft Corporation +00:D0:AC Commscope, Inc +00:25:D3 AzureWave Technology Inc. +74:2F:68 AzureWave Technology Inc. +DC:85:DE AzureWave Technology Inc. +E0:B9:A5 AzureWave Technology Inc. +E0:41:36 MitraStar Technology Corp. +E0:B2:F1 FN-LINK TECHNOLOGY LIMITED +00:26:FC AcSiP Technology Corp. +B8:61:6F Accton Technology Corp +00:10:B5 Accton Technology Corp +00:A0:2F ADB Broadband Italia +64:87:D7 ADB Broadband Italia +00:E0:98 AboCom +F0:A2:25 Private +00:00:B1 Alpha Micro +00:15:77 Allied Telesis, Inc. +AC:E0:10 Liteon Technology Corporation +EC:08:6B TP-LINK TECHNOLOGIES CO.,LTD. +24:21:AB Sony Mobile Communications AB +6C:23:B9 Sony Mobile Communications AB +58:17:0C Sony Mobile Communications AB +B8:F9:34 Sony Mobile Communications AB +20:54:76 Sony Mobile Communications AB +30:39:26 Sony Mobile Communications AB +00:EB:2D Sony Mobile Communications AB +B0:05:94 Liteon Technology Corporation +40:F0:2F Liteon Technology Corporation +E8:61:7E Liteon Technology Corporation +28:E3:47 Liteon Technology Corporation +18:CF:5E Liteon Technology Corporation +D0:DF:9A Liteon Technology Corporation +00:13:A9 Sony Corporation +00:21:9E Sony Mobile Communications AB +00:1E:45 Sony Mobile Communications AB +00:18:13 Sony Mobile Communications AB +00:21:63 ASKEY COMPUTER CORP +E8:39:DF ASKEY COMPUTER CORP +00:13:8F Asiarock Technology Limited +2C:B0:5D NETGEAR +00:14:6C NETGEAR +1C:69:A5 BlackBerry RTS +00:30:67 BIOSTAR Microtech Int'l Corp. +24:65:11 AVM GmbH +00:23:08 Arcadyan Technology Corporation +88:03:55 Arcadyan Technology Corporation +A4:2B:8C NETGEAR +04:A1:51 NETGEAR +28:C6:8E NETGEAR +5C:DC:96 Arcadyan Technology Corporation +50:4A:6E NETGEAR +D0:D0:4B HUAWEI TECHNOLOGIES CO.,LTD +00:1D:00 Brivo Systems, LLC +00:10:E7 Breezecom, Ltd. +5C:96:56 AzureWave Technology Inc. +7C:4C:A5 BSkyB Ltd +90:21:06 BSkyB Ltd +A4:C7:DE Cambridge Industries(Group) Co.,Ltd. +34:37:59 zte corporation +00:40:2A Canoga Perkins Corporation +38:2D:E8 Samsung Electronics Co.,Ltd +D0:87:E2 Samsung Electronics Co.,Ltd +20:55:31 Samsung Electronics Co.,Ltd +54:40:AD Samsung Electronics Co.,Ltd +84:2E:27 Samsung Electronics Co.,Ltd +50:F0:D3 Samsung Electronics Co.,Ltd +84:11:9E Samsung Electronics Co.,Ltd +08:EC:A9 Samsung Electronics Co.,Ltd +10:D3:8A Samsung Electronics Co.,Ltd +38:2D:D1 Samsung Electronics Co.,Ltd +E0:CB:EE Samsung Electronics Co.,Ltd +64:B8:53 Samsung Electronics Co.,Ltd +98:83:89 Samsung Electronics Co.,Ltd +24:4B:03 Samsung Electronics Co.,Ltd +FC:8F:90 Samsung Electronics Co.,Ltd +18:16:C9 Samsung Electronics Co.,Ltd +F4:42:8F Samsung Electronics Co.,Ltd +18:83:31 Samsung Electronics Co.,Ltd +84:55:A5 Samsung Electronics Co.,Ltd +A8:7C:01 Samsung Electronics Co.,Ltd +C0:11:73 Samsung Electronics Co.,Ltd +BC:E6:3F Samsung Electronics Co.,Ltd +B8:57:D8 Samsung Electronics Co.,Ltd +94:B1:0A Samsung Electronics Co.,Ltd +E4:58:B8 Samsung Electronics Co.,Ltd +08:8C:2C Samsung Electronics Co.,Ltd +B8:6C:E8 Samsung Electronics Co.,Ltd +9C:65:B0 Samsung Electronics Co.,Ltd +C8:A8:23 Samsung Electronics Co.,Ltd +C4:42:02 Samsung Electronics Co.,Ltd +D0:59:E4 Samsung Electronics Co.,Ltd +64:B3:10 Samsung Electronics Co.,Ltd +78:AB:BB Samsung Electronics Co.,Ltd +00:0B:3B devolo AG +00:1D:20 Comtrend Corporation +6C:38:A1 Ubee Interactive Corp. +14:0C:76 FREEBOX SAS +00:24:D4 FREEBOX SAS +A0:89:E4 Skyworth Digital Technology(Shenzhen) Co.,Ltd +00:1A:9A Skyworth Digital Technology(Shenzhen) Co.,Ltd +AC:3A:7A Roku, Inc. +CC:6D:A0 Roku, Inc. +00:0D:4B Roku, Inc. +00:19:99 Fujitsu Technology Solutions GmbH +00:09:E1 Gemtek Technology Co., Ltd. +C4:77:AB Beijing ASU Tech Co.,Ltd +18:2A:7B Nintendo Co., Ltd. +00:24:F3 Nintendo Co., Ltd. +A4:5C:27 Nintendo Co., Ltd. +00:1D:BC Nintendo Co., Ltd. +00:1F:32 Nintendo Co., Ltd. +D8:FB:5E ASKEY COMPUTER CORP +54:44:08 Nokia Corporation +00:17:B0 Nokia Danmark A/S +00:1B:EE Nokia Danmark A/S +18:86:AC Nokia Danmark A/S +00:21:FE Nokia Danmark A/S +00:22:66 Nokia Danmark A/S +DC:B3:B4 Honeywell Environmental & Combustion Controls (Tianjin) Co., Ltd. +C8:D1:0B Nokia Corporation +C8:97:9F Nokia Corporation +F4:F5:A5 Nokia Corporation +3C:C2:43 Nokia Corporation +00:15:A0 Nokia Danmark A/S +00:1A:16 Nokia Danmark A/S +00:22:FC Nokia Danmark A/S +00:25:48 Nokia Danmark A/S +00:1D:FD Nokia Danmark A/S +00:1E:A3 Nokia Danmark A/S +00:1D:98 Nokia Danmark A/S +00:11:9F Nokia Danmark A/S +18:A6:F7 TP-LINK TECHNOLOGIES CO.,LTD. +24:69:68 TP-LINK TECHNOLOGIES CO.,LTD. +8C:A2:FD Starry, Inc. +14:BB:6E Samsung Electronics Co.,Ltd +AC:61:EA Apple, Inc. +38:B5:4D Apple, Inc. +90:A6:2F NAVER +F4:ED:5F SHENZHEN KTC TECHNOLOGY GROUP +94:76:B7 Samsung Electronics Co.,Ltd +8C:1A:BF Samsung Electronics Co.,Ltd +B4:74:43 Samsung Electronics Co.,Ltd +00:0B:A2 Sumitomo Electric Industries,Ltd +30:CB:F8 Samsung Electronics Co.,Ltd +2C:4D:79 GoerTek Inc. +40:D3:57 Ison Technology Co., Ltd. +A4:F1:E8 Apple, Inc. +00:35:1A Cisco Systems, Inc +00:A0:B8 NetApp +9C:D4:8B Innolux Technology Europe BV +54:5A:A6 Espressif Inc. +DC:E8:38 CK Telecom (Shenzhen) Limited +00:CC:FC Cisco Systems, Inc +2C:96:62 Invenit BV +DC:2D:CB Beijing Unis HengYue Technology Co., Ltd. +38:10:D5 AVM Audiovisuelles Marketing und Computersysteme GmbH +1C:5F:2B D-Link International +D8:80:3C Anhui Huami Information Technology Company Limited +70:3C:03 RadiAnt Co.,Ltd +F0:D2:F1 Amazon Technologies Inc. +58:32:77 Reliance Communications LLC +CC:D3:E2 Jiangsu Yinhe Electronics Co.,Ltd. +18:21:95 Samsung Electronics Co.,Ltd +A8:81:95 Samsung Electronics Co.,Ltd +88:AD:D2 Samsung Electronics Co.,Ltd +00:8E:73 Cisco Systems, Inc +B8:05:AB zte corporation +9C:52:F8 HUAWEI TECHNOLOGIES CO.,LTD +90:03:25 HUAWEI TECHNOLOGIES CO.,LTD +DC:09:4C HUAWEI TECHNOLOGIES CO.,LTD +DC:EE:06 HUAWEI TECHNOLOGIES CO.,LTD +AC:44:F2 YAMAHA CORPORATION +50:89:65 SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. +80:8C:97 Kaonmedia CO., LTD. +30:B4:9E TP-LINK TECHNOLOGIES CO.,LTD. +34:99:71 Quanta Storage Inc. +24:61:5A China Mobile Group Device Co.,Ltd. +B0:E2:E5 Fiberhome Telecommunication Technologies Co.,LTD +AC:0D:1B LG Electronics (Mobile Communications) +A0:04:3E Parker Hannifin Manufacturing Germany GmbH & Co. KG +5C:C7:D7 AZROAD TECHNOLOGY COMPANY LIMITED +00:17:06 Techfaithwireless Communication Technology Limited. +30:F6:B9 Ecocentric Energy +1C:3A:DE Samsung Electronics Co.,Ltd +00:42:68 Cisco Systems, Inc +00:BD:82 Shenzhen YOUHUA Technology Co., Ltd +60:3E:CA Cambridge Medical Robotics Ltd +54:48:9C CDOUBLES ELECTRONICS CO. LTD. +54:BE:F7 PEGATRON CORPORATION +0C:54:A5 PEGATRON CORPORATION +20:25:64 PEGATRON CORPORATION +60:02:92 PEGATRON CORPORATION +84:00:2D PEGATRON CORPORATION +80:19:FE JianLing Technology CO., LTD +58:60:5F HUAWEI TECHNOLOGIES CO.,LTD +00:11:88 Enterasys +10:78:D2 Elitegroup Computer Systems Co.,Ltd. +00:1E:90 Elitegroup Computer Systems Co.,Ltd. +00:24:65 Elentec +00:1C:D7 Harman/Becker Automotive Systems GmbH +00:16:EC Elitegroup Computer Systems Co.,Ltd. +00:0D:87 Elitegroup Computer Systems Co.,Ltd. +00:0A:E6 Elitegroup Computer Systems Co.,Ltd. +94:50:89 SimonsVoss Technologies GmbH +00:1F:1F Edimax Technology Co. Ltd. +00:16:FA ECI Telecom Ltd. +00:3A:7D Cisco Systems, Inc +84:40:76 Drivenets +00:10:E0 Oracle Corporation +00:14:4F Oracle Corporation +E8:09:59 Guoguang Electric Co.,Ltd +00:90:AE ITALTEL S.p.A/RF-UP-I +00:1E:33 INVENTEC Corporation +00:1A:29 Johnson Outdoors Marine Electronics d/b/a Minnkota +00:1F:09 Jastec +D0:A4:B1 Sonifex Ltd. +00:1D:B5 Juniper Networks +00:23:9C Juniper Networks +80:71:1F Juniper Networks +28:C0:DA Juniper Networks +BC:AD:28 Hangzhou Hikvision Digital Technology Co.,Ltd. +28:F3:66 Shenzhen Bilian electronic CO.,LTD +88:28:B3 HUAWEI TECHNOLOGIES CO.,LTD +C4:F0:81 HUAWEI TECHNOLOGIES CO.,LTD +80:13:82 HUAWEI TECHNOLOGIES CO.,LTD +64:87:88 Juniper Networks +A8:D0:E5 Juniper Networks +08:81:F4 Juniper Networks +6C:3B:6B Routerboard.com +7C:73:8B Cocoon Alarm Ltd +00:0F:E2 Hangzhou H3C Technologies Co., Limited +00:23:89 Hangzhou H3C Technologies Co., Limited +38:22:D6 Hangzhou H3C Technologies Co., Limited +80:F6:2E Hangzhou H3C Technologies Co., Limited +58:66:BA Hangzhou H3C Technologies Co., Limited +0C:DA:41 Hangzhou H3C Technologies Co., Limited +58:6A:B1 Hangzhou H3C Technologies Co., Limited +74:1F:4A Hangzhou H3C Technologies Co., Limited +3C:CB:7C TCT mobile ltd +F0:34:04 TCT mobile ltd +D8:E5:6D TCT mobile ltd +90:C1:C6 Apple, Inc. +70:A2:B3 Apple, Inc. +4C:57:CA Apple, Inc. +68:FB:7E Apple, Inc. +44:2C:05 AMPAK Technology, Inc. +10:BE:F5 D-Link International +7C:6A:F3 Integrated Device Technology (Malaysia) Sdn. Bhd. +C4:1C:FF Vizio, Inc +44:44:50 OttoQ +FC:55:DC Baltic Latvian Universal Electronics LLC +94:18:82 Hewlett Packard Enterprise +00:0E:B6 Riverbed Technology, Inc. +D0:FC:CC Samsung Electronics Co.,Ltd +04:56:04 Gionee Communication Equipment Co.,Ltd. +10:BD:55 Q-Lab Corporation +C4:49:BB MITSUMI ELECTRIC CO.,LTD. +8C:6D:50 SHENZHEN MTC CO LTD +3C:68:16 VXi Corporation +C0:A1:A2 MarqMetrix +00:F6:63 Cisco Systems, Inc +34:12:90 Treeview Co.,Ltd. +F4:0A:4A INDUSNET Communication Technology Co.,LTD +E8:37:7A ZyXEL Communications Corporation +04:BF:6D ZyXEL Communications Corporation +00:A0:C5 ZyXEL Communications Corporation +10:7B:EF ZyXEL Communications Corporation +C0:C9:76 Shenzhen TINNO Mobile Technology Corp. +14:C9:13 LG Electronics +68:07:15 Intel Corporate +A0:9E:1A Polar Electro Oy +3C:B6:B7 vivo Mobile Communication Co., Ltd. +D0:B2:C4 Technicolor CH USA Inc. +FC:94:E3 Technicolor CH USA Inc. +FC:52:8D Technicolor CH USA Inc. +D8:4A:87 OI ELECTRIC CO.,LTD +BC:30:7D Wistron Neweb Corporation +64:3A:B1 SICHUAN TIANYI COMHEART TELECOMCO.,LTD +D4:41:65 SICHUAN TIANYI COMHEART TELECOMCO.,LTD +64:5D:92 SICHUAN TIANYI COMHEART TELECOMCO.,LTD +80:48:A5 SICHUAN TIANYI COMHEART TELECOMCO.,LTD +54:10:EC Microchip Technology Inc. +00:26:2D Wistron Neweb Corporation +5C:FF:35 Wistron Neweb Corporation +00:0A:E4 Wistron Neweb Corporation +30:9B:AD BBK EDUCATIONAL ELECTRONICS CORP.,LTD. +00:1B:B1 Wistron Neweb Corporation +00:0B:6B Wistron Neweb Corporation +AC:9B:0A Sony Corporation +48:13:F3 BBK EDUCATIONAL ELECTRONICS CORP.,LTD. +74:B4:72 CIESSE +48:3C:0C HUAWEI TECHNOLOGIES CO.,LTD +4C:66:41 SAMSUNG ELECTRO-MECHANICS(THAILAND) +C8:75:5B Quantify Technology Pty. Ltd. +1C:57:D8 Kraftway Corporation PLC +00:23:97 Westell Technologies Inc. +00:60:0F Westell Technologies Inc. +00:E0:DD Zenith Electronics Corporation +50:CE:75 Measy Electronics Co., Ltd. +04:7D:7B QUANTA COMPUTER INC. +88:12:4E Qualcomm Inc. +64:9C:81 Qualcomm Inc. +00:1B:32 QLogic Corporation +00:1E:21 Qisda Corporation +00:17:CA Qisda Corporation +00:14:D1 TRENDnet, Inc. +00:1C:7E Toshiba +00:1C:14 VMware, Inc. +90:A2:10 United Telecoms Ltd +E0:2A:82 Universal Global Scientific Industrial Co., Ltd. +00:16:41 Universal Global Scientific Industrial Co., Ltd. +44:D9:E7 Ubiquiti Networks +F0:9F:C2 Ubiquiti Networks +4C:33:4E HIGHTECH +60:E3:AC LG Electronics (Mobile Communications) +00:13:15 Sony Interactive Entertainment Inc. +00:1F:A7 Sony Interactive Entertainment Inc. +A8:E3:EE Sony Interactive Entertainment Inc. +70:9E:29 Sony Interactive Entertainment Inc. +FC:0F:E6 Sony Interactive Entertainment Inc. +00:50:C2 IEEE Registration Authority +CC:79:CF SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. +54:4E:45 Private +14:1F:BA IEEE Registration Authority +80:0A:80 IEEE Registration Authority +A4:4F:29 IEEE Registration Authority +5C:F2:86 IEEE Registration Authority +64:FB:81 IEEE Registration Authority +E4:95:6E IEEE Registration Authority +C8:8E:D1 IEEE Registration Authority +78:C2:C0 IEEE Registration Authority +88:5D:90 IEEE Registration Authority +3C:39:E7 IEEE Registration Authority +A0:BB:3E IEEE Registration Authority +6C:B9:C5 Delta Networks, Inc. +7C:FC:3C Visteon Corporation +58:BC:8F Cognitive Systems Corp. +54:DC:1D Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd +3C:BD:D8 LG ELECTRONICS INC +0C:48:85 LG Electronics (Mobile Communications) +88:C9:D0 LG Electronics (Mobile Communications) +70:05:14 LG Electronics (Mobile Communications) +E8:92:A4 LG Electronics (Mobile Communications) +A8:16:B2 LG Electronics (Mobile Communications) +C4:43:8F LG Electronics (Mobile Communications) +20:21:A5 LG Electronics (Mobile Communications) +6C:D6:8A LG Electronics (Mobile Communications) +00:1E:75 LG Electronics (Mobile Communications) +00:26:E2 LG Electronics (Mobile Communications) +00:1F:E3 LG Electronics (Mobile Communications) +2C:54:CF LG Electronics (Mobile Communications) +F8:95:C7 LG Electronics (Mobile Communications) +48:88:CA Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. +74:B5:7E zte corporation +54:09:55 zte corporation +88:A6:C6 Sagemcom Broadband SAS +00:0F:59 Phonak AG +00:0E:F4 Kasda Networks Inc +00:0A:EB TP-LINK TECHNOLOGIES CO.,LTD. +2C:37:31 SHENZHEN YIFANG DIGITAL TECHNOLOGY CO.,LTD. +00:1F:BA Boyoung Tech +C4:04:7B Shenzhen YOUHUA Technology Co., Ltd +A4:29:40 Shenzhen YOUHUA Technology Co., Ltd +3C:33:00 Shenzhen Bilian electronic CO.,LTD +20:F4:1B Shenzhen Bilian electronic CO.,LTD +30:92:F6 SHANGHAI SUNMON COMMUNICATION TECHNOGY CO.,LTD +7C:20:64 Alcatel-Lucent IPD +48:F8:E1 Alcatel-Lucent Canada +00:D0:F6 Alcatel-Lucent Canada +E4:A1:E6 Alcatel-Lucent Shanghai Bell Co., Ltd +00:0B:34 ShangHai Broadband Technologies CO.LTD +B0:75:4D Alcatel-Lucent Canada +BC:8D:0E Alcatel-Lucent Canada +E4:81:84 Alcatel-Lucent Canada +94:E9:8C Alcatel-Lucent Canada +84:26:2B Alcatel-Lucent Canada +98:B0:39 Alcatel-Lucent Canada +A4:7B:2C Alcatel-Lucent Canada +BC:6B:4D Alcatel-Lucent Canada +38:25:6B Microsoft Mobile Oy +20:3A:EF Sivantos GmbH +00:1E:40 Shanghai DareGlobal Technologies Co.,Ltd +80:A1:D7 Shanghai DareGlobal Technologies Co.,Ltd +D8:FB:68 Cloud Corner Ltd. +C0:91:34 ProCurve Networking by HP +4C:B2:1C Maxphotonics Co.,Ltd +D8:C4:6A Murata Manufacturing Co., Ltd. +84:98:66 Samsung Electronics Co.,Ltd +00:21:62 Nortel Networks +00:0F:06 Nortel Networks +00:03:42 Nortel Networks +00:15:9B Nortel Networks +00:14:0E Nortel Networks +00:16:CA Nortel Networks +00:19:69 Nortel Networks +00:19:E1 Nortel Networks +00:1A:8F Nortel Networks +E8:93:09 Samsung Electronics Co.,Ltd +00:D0:B2 19514 +00:19:88 Wi2Wi, Inc +4C:FA:CA Cambridge Industries(Group) Co.,Ltd. +2C:9D:1E HUAWEI TECHNOLOGIES CO.,LTD +C8:8D:83 HUAWEI TECHNOLOGIES CO.,LTD +08:00:87 Xyplex, Inc. +00:B0:B3 XSTREAMIS PLC +14:82:5B Hefei Radio Communication Technology Co., Ltd +00:54:9F Avaya Inc +00:56:2B Cisco Systems, Inc +24:F5:7E HWH CO., LTD. +94:3D:C9 Asahi Net, Inc. +08:00:28 Texas Instruments +00:12:D2 Texas Instruments +D4:94:A1 Texas Instruments +78:C5:E5 Texas Instruments +84:7E:40 Texas Instruments +00:18:32 Texas Instruments +90:D7:EB Texas Instruments +BC:0D:A5 Texas Instruments +7C:8E:E4 Texas Instruments +D8:54:3A Texas Instruments +88:4A:EA Texas Instruments +B0:91:22 Texas Instruments +20:91:48 Texas Instruments +A0:F6:FD Texas Instruments +D4:F5:13 Texas Instruments +00:17:EC Texas Instruments +00:17:E5 Texas Instruments +C8:3E:99 Texas Instruments +8C:8B:83 Texas Instruments +D0:B5:C2 Texas Instruments +84:EB:18 Texas Instruments +6C:EC:EB Texas Instruments +98:5D:AD Texas Instruments +E8:EB:11 Texas Instruments +D4:36:39 Texas Instruments +A0:43:DB Sitael S.p.A. +E4:BE:ED Netcore Technology Inc. +84:EF:18 Intel Corporate +84:C1:C1 Juniper Networks +A8:A6:48 Qingdao Hisense Communications Co.,Ltd. +30:58:90 Frontier Silicon Ltd +00:22:61 Frontier Silicon Ltd +04:9F:81 NetScout Systems, Inc. +00:80:8C NetScout Systems, Inc. +C4:F5:A5 Kumalift Co., Ltd. +98:F0:58 Lynxspring, Incl. +24:E4:3F Wenzhou Kunmei Communication Technology Co.,Ltd. +A0:04:60 NETGEAR +94:62:69 ARRIS Group, Inc. +D4:05:98 ARRIS Group, Inc. +78:71:9C ARRIS Group, Inc. +E0:B7:0A ARRIS Group, Inc. +C8:3F:B4 ARRIS Group, Inc. +20:73:55 ARRIS Group, Inc. +90:0D:CB ARRIS Group, Inc. +14:CF:E2 ARRIS Group, Inc. +00:15:D0 ARRIS Group, Inc. +E8:6D:52 ARRIS Group, Inc. +3C:43:8E ARRIS Group, Inc. +90:B1:34 ARRIS Group, Inc. +20:E5:64 ARRIS Group, Inc. +40:B7:F3 ARRIS Group, Inc. +94:CC:B9 ARRIS Group, Inc. +00:AC:E0 ARRIS Group, Inc. +3C:36:E4 ARRIS Group, Inc. +00:00:C5 ARRIS Group, Inc. +D0:39:B3 ARRIS Group, Inc. +8C:7F:3B ARRIS Group, Inc. +90:3E:AB ARRIS Group, Inc. +CC:A4:62 ARRIS Group, Inc. +00:1D:CD ARRIS Group, Inc. +00:1D:D4 ARRIS Group, Inc. +00:1D:CE ARRIS Group, Inc. +00:50:E3 ARRIS Group, Inc. +00:08:0E ARRIS Group, Inc. +00:15:9A ARRIS Group, Inc. +00:19:2C ARRIS Group, Inc. +D4:0A:A9 ARRIS Group, Inc. +38:4C:90 ARRIS Group, Inc. +44:AA:F5 ARRIS Group, Inc. +70:85:C6 ARRIS Group, Inc. +D0:E5:4D ARRIS Group, Inc. +B4:F2:E8 ARRIS Group, Inc. +FC:8E:7E ARRIS Group, Inc. +00:50:94 ARRIS Group, Inc. +00:21:43 ARRIS Group, Inc. +00:23:EE ARRIS Group, Inc. +64:ED:57 ARRIS Group, Inc. +00:23:A3 ARRIS Group, Inc. +F8:7B:7A ARRIS Group, Inc. +00:25:F1 ARRIS Group, Inc. +00:1A:66 ARRIS Group, Inc. +00:18:C0 ARRIS Group, Inc. +00:1E:46 ARRIS Group, Inc. +00:1A:DE ARRIS Group, Inc. +00:23:AF ARRIS Group, Inc. +24:0A:C4 Espressif Inc. +58:56:E8 ARRIS Group, Inc. +E4:C1:F1 SHENZHEN SPOTMAU INFORMATION TECHNOLIGY CO., Ltd +24:0D:C2 TCT mobile ltd +14:DD:E5 MPMKVVCL +68:EB:AE 5481 +60:A1:0A 5481 +A0:75:91 5481 +8C:71:F8 5481 +04:18:0F 5481 +CC:05:1B 5481 +94:63:D1 5481 +0C:DF:A4 5481 +00:16:DB Samsung Electronics Co.,Ltd +00:1F:CC 5481 +60:D0:A9 5481 +5C:3C:27 Samsung Electronics Co.,Ltd +10:D5:42 Samsung Electronics Co.,Ltd +A0:82:1F Samsung Electronics Co.,Ltd +C4:50:06 Samsung Electronics Co.,Ltd +88:32:9B SAMSUNG ELECTRO-MECHANICS(THAILAND) +BC:8C:CD SAMSUNG ELECTRO-MECHANICS(THAILAND) +40:0E:85 SAMSUNG ELECTRO-MECHANICS(THAILAND) +EC:9B:F3 SAMSUNG ELECTRO-MECHANICS(THAILAND) +F8:04:2E SAMSUNG ELECTRO-MECHANICS(THAILAND) +84:38:38 SAMSUNG ELECTRO-MECHANICS(THAILAND) +54:88:0E SAMSUNG ELECTRO-MECHANICS(THAILAND) +BC:79:AD Samsung Electronics Co.,Ltd +30:D6:C9 Samsung Electronics Co.,Ltd +B0:DF:3A Samsung Electronics Co.,Ltd +80:57:19 Samsung Electronics Co.,Ltd +78:A8:73 Samsung Electronics Co.,Ltd +04:1B:BA Samsung Electronics Co.,Ltd +08:FD:0E Samsung Electronics Co.,Ltd +08:D4:2B Samsung Electronics Co.,Ltd +00:E3:B2 Samsung Electronics Co.,Ltd +C8:14:79 Samsung Electronics Co.,Ltd +F0:72:8C Samsung Electronics Co.,Ltd +94:35:0A Samsung Electronics Co.,Ltd +00:1F:CD Samsung Electronics Co.,Ltd +D0:DF:C7 Samsung Electronics Co.,Ltd +1C:62:B8 Samsung Electronics Co.,Ltd +18:E2:C2 Samsung Electronics Co.,Ltd +F0:43:47 HUAWEI TECHNOLOGIES CO.,LTD +9C:B2:B2 HUAWEI TECHNOLOGIES CO.,LTD +84:BE:52 HUAWEI TECHNOLOGIES CO.,LTD +00:1A:8A Samsung Electronics Co.,Ltd +00:25:67 Samsung Electronics Co.,Ltd +A8:F2:74 Samsung Electronics Co.,Ltd +B0:78:70 Wi-NEXT, Inc. +00:15:99 Samsung Electronics Co.,Ltd +00:12:FB Samsung Electronics Co.,Ltd +7C:F8:54 Samsung Electronics Co.,Ltd +8C:C8:CD Samsung Electronics Co.,Ltd +E8:11:32 Samsung Electronics Co.,Ltd +A0:21:95 Samsung Electronics Co.,Ltd +84:0B:2D SAMSUNG ELECTRO MECHANICS CO., LTD. +00:02:78 SAMSUNG ELECTRO MECHANICS CO., LTD. +F0:7B:CB Hon Hai Precision Ind. Co.,Ltd. +4C:0F:6E Hon Hai Precision Ind. Co.,Ltd. +5C:6D:20 Hon Hai Precision Ind. Co.,Ltd. +90:00:4E Hon Hai Precision Ind. Co.,Ltd. +C0:F8:DA Hon Hai Precision Ind. Co.,Ltd. +48:5A:B6 Hon Hai Precision Ind. Co.,Ltd. +08:3E:8E Hon Hai Precision Ind. Co.,Ltd. +F4:B7:E2 Hon Hai Precision Ind. Co.,Ltd. +44:37:E6 Hon Hai Precision Ind. Co.,Ltd. +00:16:CF Hon Hai Precision Ind. Co.,Ltd. +00:1C:25 Hon Hai Precision Ind. Co.,Ltd. +C4:8E:8F Hon Hai Precision Ind. Co.,Ltd. +18:4F:32 Hon Hai Precision Ind. Co.,Ltd. +44:1C:A8 Hon Hai Precision Ind. Co.,Ltd. +A8:47:4A Hon Hai Precision Ind. Co.,Ltd. +08:ED:B9 Hon Hai Precision Ind. Co.,Ltd. +7C:E9:D3 Hon Hai Precision Ind. Co.,Ltd. +E4:D5:3D Hon Hai Precision Ind. Co.,Ltd. +C4:17:FE Hon Hai Precision Ind. Co.,Ltd. +38:B1:DB Hon Hai Precision Ind. Co.,Ltd. +00:23:4D Hon Hai Precision Ind. Co.,Ltd. +00:23:4E Hon Hai Precision Ind. Co.,Ltd. +00:26:5E Hon Hai Precision Ind. Co.,Ltd. +54:13:79 Hon Hai Precision Ind. Co.,Ltd. +10:08:B1 Hon Hai Precision Ind. Co.,Ltd. +70:1D:C4 NorthStar Battery Company, LLC +80:18:44 Dell Inc. +0C:6F:9C Shaw Communications Inc. +18:01:E3 Bittium Wireless Ltd +C0:AC:54 Sagemcom Broadband SAS +40:F2:01 Sagemcom Broadband SAS +C8:91:F9 Sagemcom Broadband SAS +4C:FF:12 Fuze Entertainment Co., ltd +00:59:AC KPN. B.V. +AC:9A:22 NXP Semiconductors +00:60:37 NXP Semiconductors +54:60:09 Google, Inc. +A4:77:33 Google, Inc. +94:EB:2C Google, Inc. +28:BC:56 EMAC, Inc. +28:7C:DB Hefei Toycloud Technology Co.,ltd +D0:B3:3F Shenzhen TINNO Mobile Technology Corp. +00:73:8D Shenzhen TINNO Mobile Technology Corp. +A8:CA:7B HUAWEI TECHNOLOGIES CO.,LTD +AC:CF:85 HUAWEI TECHNOLOGIES CO.,LTD +0C:D7:46 Apple, Inc. +44:00:10 Apple, Inc. +24:35:CC Zhongshan Scinan Internet of Things Co.,Ltd. +2C:27:D7 Hewlett Packard +00:0F:3D D-Link Corporation +00:11:95 D-Link Corporation +00:15:E9 D-Link Corporation +0C:FD:37 SUSE Linux GmbH +2C:FF:65 Oki Electric Industry Co., Ltd. +00:1C:F0 D-Link Corporation +00:26:5A D-Link Corporation +AC:F1:DF D-Link International +FC:75:16 D-Link International +7C:18:CD E-TRON Co.,Ltd. +C8:66:5D Aerohive Networks Inc. +38:97:D6 Hangzhou H3C Technologies Co., Limited +C8:47:8C Beken Corporation +E4:98:D6 Apple, Inc. +60:69:44 Apple, Inc. +00:19:77 Aerohive Networks Inc. +40:18:B1 Aerohive Networks Inc. +88:96:B6 Global Fire Equipment S.A. +18:87:96 HTC Corporation +AC:2A:0C CSR ZHUZHOU INSTITUTE CO.,LTD. +F4:CA:24 FreeBit Co., Ltd. +00:0A:57 Hewlett Packard +64:31:50 Hewlett Packard +00:23:76 HTC Corporation +00:07:E9 Intel Corporation +B4:6D:83 Intel Corporate +E4:FA:FD Intel Corporate +DC:53:60 Intel Corporate +78:0C:B8 Intel Corporate +48:45:20 Intel Corporate +00:40:26 BUFFALO.INC +00:02:A5 Hewlett Packard +A0:2B:B8 Hewlett Packard +6C:C2:17 Hewlett Packard +38:63:BB Hewlett Packard +CC:3E:5F Hewlett Packard +74:46:A0 Hewlett Packard +44:31:92 Hewlett Packard +FC:15:B4 Hewlett Packard +EC:9A:74 Hewlett Packard +80:C1:6E Hewlett Packard +D0:7E:28 Hewlett Packard +74:03:BD BUFFALO.INC +10:1F:74 Hewlett Packard +00:1A:4B Hewlett Packard +00:1F:29 Hewlett Packard +00:21:5A Hewlett Packard +00:0F:61 Hewlett Packard +00:11:85 Hewlett Packard +00:12:79 Hewlett Packard +00:17:08 Hewlett Packard +28:32:C5 HUMAX Co., Ltd. +EC:4D:47 HUAWEI TECHNOLOGIES CO.,LTD +88:CF:98 HUAWEI TECHNOLOGIES CO.,LTD +6C:E3:B6 Nera Telecommunications Ltd. +94:2C:B3 HUMAX Co., Ltd. +04:52:F3 Apple, Inc. +24:1E:EB Apple, Inc. +F4:31:C3 Apple, Inc. +C4:F5:7C Brocade Communications Systems, Inc. +8C:7C:FF Brocade Communications Systems, Inc. +00:0C:DB Brocade Communications Systems, Inc. +00:60:69 Brocade Communications Systems, Inc. +C8:7B:5B zte corporation +98:F5:37 zte corporation +00:1E:73 zte corporation +00:19:C6 zte corporation +00:15:EB zte corporation +A0:51:C6 Avaya Inc +24:D9:21 Avaya Inc +84:83:71 Avaya Inc +70:52:C5 Avaya Inc +00:1B:4F Avaya Inc +F0:EB:D0 Shanghai Feixun Communication Co.,Ltd. +D8:49:0B HUAWEI TECHNOLOGIES CO.,LTD +88:86:03 HUAWEI TECHNOLOGIES CO.,LTD +F8:E8:11 HUAWEI TECHNOLOGIES CO.,LTD +E0:97:96 HUAWEI TECHNOLOGIES CO.,LTD +CC:CC:81 HUAWEI TECHNOLOGIES CO.,LTD +10:1B:54 HUAWEI TECHNOLOGIES CO.,LTD +70:54:F5 HUAWEI TECHNOLOGIES CO.,LTD +D0:7A:B5 HUAWEI TECHNOLOGIES CO.,LTD +C4:05:28 HUAWEI TECHNOLOGIES CO.,LTD +3C:DF:BD HUAWEI TECHNOLOGIES CO.,LTD +14:B9:68 HUAWEI TECHNOLOGIES CO.,LTD +80:71:7A HUAWEI TECHNOLOGIES CO.,LTD +F4:9F:F3 HUAWEI TECHNOLOGIES CO.,LTD +2C:5B:B8 GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD +B0:AA:36 GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD +78:4B:87 Murata Manufacturing Co., Ltd. +28:A1:83 ALPS ELECTRIC CO.,LTD. +5C:F8:A1 Murata Manufacturing Co., Ltd. +60:21:C0 Murata Manufacturing Co., Ltd. +84:DB:AC HUAWEI TECHNOLOGIES CO.,LTD +C0:70:09 HUAWEI TECHNOLOGIES CO.,LTD +E0:19:1D HUAWEI TECHNOLOGIES CO.,LTD +B8:BC:1B HUAWEI TECHNOLOGIES CO.,LTD +24:1F:A0 HUAWEI TECHNOLOGIES CO.,LTD +50:A7:2B HUAWEI TECHNOLOGIES CO.,LTD +C8:51:95 HUAWEI TECHNOLOGIES CO.,LTD +00:F8:1C HUAWEI TECHNOLOGIES CO.,LTD +F4:55:9C HUAWEI TECHNOLOGIES CO.,LTD +28:3C:E4 HUAWEI TECHNOLOGIES CO.,LTD +64:A5:C3 Apple, Inc. +00:1D:0F TP-LINK TECHNOLOGIES CO.,LTD. +5C:63:BF TP-LINK TECHNOLOGIES CO.,LTD. +B0:48:7A TP-LINK TECHNOLOGIES CO.,LTD. +38:83:45 TP-LINK TECHNOLOGIES CO.,LTD. +14:E6:E4 TP-LINK TECHNOLOGIES CO.,LTD. +64:70:02 TP-LINK TECHNOLOGIES CO.,LTD. +64:66:B3 TP-LINK TECHNOLOGIES CO.,LTD. +6C:E8:73 TP-LINK TECHNOLOGIES CO.,LTD. +08:E8:4F HUAWEI TECHNOLOGIES CO.,LTD +04:BD:70 HUAWEI TECHNOLOGIES CO.,LTD +18:C5:8A HUAWEI TECHNOLOGIES CO.,LTD +04:C0:6F HUAWEI TECHNOLOGIES CO.,LTD +5C:4C:A9 HUAWEI TECHNOLOGIES CO.,LTD +4C:54:99 HUAWEI TECHNOLOGIES CO.,LTD +00:25:9E HUAWEI TECHNOLOGIES CO.,LTD +00:18:82 HUAWEI TECHNOLOGIES CO.,LTD +D4:EA:0E Avaya Inc +B4:47:5E Avaya Inc +90:FB:5B Avaya Inc +14:F6:5A Xiaomi Communications Co Ltd +0C:1D:AF Xiaomi Communications Co Ltd +28:E3:1F Xiaomi Communications Co Ltd +F0:B4:29 Xiaomi Communications Co Ltd +00:90:6F Cisco Systems, Inc +00:90:A6 Cisco Systems, Inc +00:90:AB Cisco Systems, Inc +74:26:AC Cisco Systems, Inc +B0:00:B4 Cisco Systems, Inc +28:34:A2 Cisco Systems, Inc +64:12:25 Cisco Systems, Inc +54:4A:00 Cisco Systems, Inc +50:67:AE Cisco Systems, Inc +BC:16:F5 Cisco Systems, Inc +68:99:CD Cisco Systems, Inc +F4:4E:05 Cisco Systems, Inc +0C:F5:A4 Cisco Systems, Inc +5C:FC:66 Cisco Systems, Inc +D0:A5:A6 Cisco Systems, Inc +3C:5E:C3 Cisco Systems, Inc +64:F6:9D Cisco Systems, Inc +74:A2:E6 Cisco Systems, Inc +20:4C:9E Cisco Systems, Inc +00:11:2F ASUSTek COMPUTER INC. +00:11:D8 ASUSTek COMPUTER INC. +00:17:31 ASUSTek COMPUTER INC. +00:18:F3 ASUSTek COMPUTER INC. +48:5B:39 ASUSTek COMPUTER INC. +F4:6D:04 ASUSTek COMPUTER INC. +30:85:A9 ASUSTek COMPUTER INC. +00:90:0C Cisco Systems, Inc +00:10:79 Cisco Systems, Inc +00:10:2F Cisco Systems, Inc +00:0E:08 Cisco-Linksys, LLC +00:60:2F Cisco Systems, Inc +00:60:70 Cisco Systems, Inc +00:60:83 Cisco Systems, Inc +00:06:7C Cisco Systems, Inc +C8:D7:19 Cisco-Linksys, LLC +CC:08:E0 Apple, Inc. +58:55:CA Apple, Inc. +8C:7B:9D Apple, Inc. +88:C6:63 Apple, Inc. +C8:2A:14 Apple, Inc. +98:03:D8 Apple, Inc. +8C:58:77 Apple, Inc. +34:51:C9 Apple, Inc. +E0:B9:BA Apple, Inc. +D0:23:DB Apple, Inc. +B8:8D:12 Apple, Inc. +B8:17:C2 Apple, Inc. +68:A8:6D Apple, Inc. +78:A3:E4 Apple, Inc. +54:78:1A Cisco Systems, Inc +58:97:1E Cisco Systems, Inc +CC:D5:39 Cisco Systems, Inc +20:BB:C0 Cisco Systems, Inc +4C:4E:35 Cisco Systems, Inc +7C:AD:74 Cisco Systems, Inc +10:F3:11 Cisco Systems, Inc +08:CC:68 Cisco Systems, Inc +D0:C7:89 Cisco Systems, Inc +F8:4F:57 Cisco Systems, Inc +34:DB:FD Cisco Systems, Inc +5C:A4:8A Cisco Systems, Inc +AC:7A:4D ALPS ELECTRIC CO.,LTD. +FC:62:B9 ALPS ELECTRIC CO.,LTD. +00:10:A6 Cisco Systems, Inc +E8:65:49 Cisco Systems, Inc +84:B5:17 Cisco Systems, Inc +04:62:73 Cisco Systems, Inc +9C:57:AD Cisco Systems, Inc +00:22:3A Cisco SPVTG +00:18:39 Cisco-Linksys, LLC +00:1E:E5 Cisco-Linksys, LLC +38:C8:5C Cisco SPVTG +F4:5F:D4 Cisco SPVTG +00:23:06 ALPS ELECTRIC CO.,LTD. +00:1E:3D ALPS ELECTRIC CO.,LTD. +00:19:C1 ALPS ELECTRIC CO.,LTD. +BC:92:6B Apple, Inc. +00:50:E4 Apple, Inc. +00:30:65 Apple, Inc. +00:0A:27 Apple, Inc. +00:14:51 Apple, Inc. +00:19:E3 Apple, Inc. +00:23:12 Apple, Inc. +00:23:32 Apple, Inc. +00:24:36 Apple, Inc. +00:25:4B Apple, Inc. +00:26:BB Apple, Inc. +E8:06:88 Apple, Inc. +98:5A:EB Apple, Inc. +20:78:F0 Apple, Inc. +78:D7:5F Apple, Inc. +E0:AC:CB Apple, Inc. +98:E0:D9 Apple, Inc. +C0:CE:CD Apple, Inc. +70:E7:2C Apple, Inc. +D0:33:11 Apple, Inc. +84:7D:50 Holley Metering Limited +6C:4A:39 BITA +C8:B5:B7 Apple, Inc. +A8:BB:CF Apple, Inc. +90:B2:1F Apple, Inc. +B8:E8:56 Apple, Inc. +14:99:E2 Apple, Inc. +04:21:4C Insight Energy Ventures LLC +B4:18:D1 Apple, Inc. +80:00:6E Apple, Inc. +60:D9:C7 Apple, Inc. +C8:F6:50 Apple, Inc. +1C:1A:C0 Apple, Inc. +E0:66:78 Apple, Inc. +5C:8D:4E Apple, Inc. +64:A3:CB Apple, Inc. +44:FB:42 Apple, Inc. +F4:1B:A1 Apple, Inc. +3C:E0:72 Apple, Inc. +E8:8D:28 Apple, Inc. +CC:78:5F Apple, Inc. +AC:3C:0B Apple, Inc. +88:CB:87 Apple, Inc. +EC:35:86 Apple, Inc. +F0:C1:F1 Apple, Inc. +F4:F9:51 Apple, Inc. +18:AF:8F Apple, Inc. +C0:F2:FB Apple, Inc. +00:F7:6F Apple, Inc. +AC:87:A3 Apple, Inc. +48:43:7C Apple, Inc. +34:A3:95 Apple, Inc. +9C:F3:87 Apple, Inc. +A8:5B:78 Apple, Inc. +90:8D:6C Apple, Inc. +0C:15:39 Apple, Inc. +BC:4C:C4 Apple, Inc. +0C:BC:9F Apple, Inc. +A4:5E:60 Apple, Inc. +68:09:27 Apple, Inc. +60:FA:CD Apple, Inc. +1C:AB:A7 Apple, Inc. +8C:FA:BA Apple, Inc. +5C:95:AE Apple, Inc. +E0:C9:7A Apple, Inc. +BC:52:B7 Apple, Inc. +14:10:9F Apple, Inc. +54:26:96 Apple, Inc. +D8:D1:CB Apple, Inc. +4C:8E:CC SILKAN SA +3C:EF:8C ZHEJIANG DAHUA TECHNOLOGY CO.,LTD. +98:F4:28 zte corporation +7C:5A:67 JNC Systems, Inc. +5C:49:79 AVM Audiovisuelles Marketing und Computersysteme GmbH +C4:BB:EA Pakedge Device and Software Inc +84:10:0D Motorola Mobility LLC, a Lenovo Company +D8:8B:4C KingTing Tech. +E8:13:63 Comstock RD, Inc. +6C:93:54 Yaojin Technology (Shenzhen) Co., LTD. +40:54:E4 Wearsafe Labs Inc +8C:E2:DA Circle Media Inc +74:D7:CA Panasonic Corporation Automotive +1C:CD:E5 Shanghai Wind Technologies Co.,Ltd +20:89:6F Fiberhome Telecommunication Technologies Co.,LTD +D4:94:E8 HUAWEI TECHNOLOGIES CO.,LTD +B0:78:F0 Beijing HuaqinWorld Technology Co.,Ltd. +30:29:BE Shanghai MRDcom Co.,Ltd +70:11:AE Music Life LTD +EC:B8:70 Beijing Heweinet Technology Co.,Ltd. +30:95:E3 SHANGHAI SIMCOM LIMITED +40:1B:5F Weifang GoerTek Electronics Co., Ltd. +40:40:A7 Sony Mobile Communications AB +54:BE:53 zte corporation +A0:1E:0B MINIX Technology Limited +D4:83:04 SHENZHEN FAST TECHNOLOGIES CO.,LTD +38:5F:66 Cisco SPVTG +54:4E:90 Apple, Inc. +58:FC:73 Arria Live Media, Inc. +2C:1B:C8 Hunan Topview Network System CO.,LTD +5C:AD:CF Apple, Inc. +00:6D:52 Apple, Inc. +D8:88:CE RF Technology Pty Ltd +D4:F4:BE Palo Alto Networks +B8:86:87 Liteon Technology Corporation +68:F9:56 Objetivos y Servicio de Valor Añadido +58:B6:33 Ruckus Wireless +AC:60:B6 Ericsson AB +F4:E9:26 Tianjin Zanpu Technology Inc. +04:C2:3E HTC Corporation +2C:FC:E4 CTEK Sweden AB +C0:B7:13 Beijing Xiaoyuer Technology Co. Ltd. +DC:A3:AC RBcloudtech +44:65:6A Mega Video Electronic(HK) Industry Co., Ltd +0C:91:60 Hui Zhou Gaoshengda Technology Co.,LTD +EC:A9:FA GUANGDONG GENIUS TECHNOLOGY CO.,LTD. +30:0C:23 zte corporation +44:5F:8C Intercel Group Limited +A4:8D:3B Vizio, Inc +0C:75:6C Anaren Microwave, Inc. +5C:51:88 Motorola Mobility LLC, a Lenovo Company +68:9A:B7 Atelier Vision Corporation +64:0D:E6 Petra Systems +28:37:13 Shenzhen 3Nod Digital Technology Co., Ltd. +7C:AB:25 MESMO TECHNOLOGY INC. +74:04:2B Lenovo Mobile Communication (Wuhan) Company Limited +44:55:B1 HUAWEI TECHNOLOGIES CO.,LTD +A4:56:02 fenglian Technology Co.,Ltd. +D0:6A:1F BSE CO.,LTD. +A8:80:38 ShenZhen MovingComm Technology Co., Limited +80:50:67 W & D TECHNOLOGY CORPORATION +40:28:14 RFI Engineering +10:2C:83 XIMEA +D4:68:BA Shenzhen Sundray Technologies Company Limited +A4:7B:85 ULTIMEDIA Co Ltd, +CC:37:AB Edgecore Networks Corportation +F8:0D:60 CANON INC. +E0:2C:B2 Lenovo Mobile Communication (Wuhan) Company Limited +DC:15:DB Ge Ruili Intelligent Technology ( Beijing ) Co., Ltd. +30:F3:35 HUAWEI TECHNOLOGIES CO.,LTD +E8:91:20 Motorola Mobility LLC, a Lenovo Company +54:61:72 ZODIAC AEROSPACE SAS +54:CD:10 Panasonic Mobile Communications Co.,Ltd. +A4:A1:E4 Innotube, Inc. +70:68:79 Saijo Denki International Co., Ltd. +34:3D:98 JinQianMao Technology Co.,Ltd. +58:04:CB Tianjin Huisun Technology Co.,Ltd. +1C:B7:2C ASUSTek COMPUTER INC. +40:B8:37 Sony Mobile Communications AB +28:76:10 IgniteNet +68:A3:78 FREEBOX SAS +74:6A:3A Aperi Corporation +18:44:E6 zte corporation +A8:D4:09 USA 111 Inc +30:89:D3 HONGKONG UCLOUDLINK NETWORK TECHNOLOGY LIMITED +4C:B7:6D Novi Security +90:6C:AC Fortinet, Inc. +00:32:3A so-logic +64:DB:81 Syszone Co., Ltd. +C4:BA:A3 Beijing Winicssec Technologies Co., Ltd. +A0:13:CB Fiberhome Telecommunication Technologies Co.,LTD +20:63:5F Abeeway +E0:03:70 ShenZhen Continental Wireless Technology Co., Ltd. +70:9C:8F Nero AG +80:74:59 K's Co.,Ltd. +CC:96:35 LVS Co.,Ltd. +70:01:36 FATEK Automation Corporation +E0:35:60 Challenger Supply Holdings, LLC +0C:B5:DE Alcatel Lucent +04:C9:D9 EchoStar Technologies Corp +E4:CE:70 Health & Life co., Ltd. +EC:5A:86 Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd +F8:7A:EF Rosonix Technology, Inc. +C4:3A:BE Sony Mobile Communications AB +18:B1:69 Sonicwall +D4:68:4D Ruckus Wireless +1C:C7:2D Shenzhen Huapu Digital CO.,Ltd +38:D8:2F zte corporation +C8:D7:79 Qingdao Haier Telecom Co.,Ltd +2C:A2:B4 Fortify Technologies, LLC +D8:74:95 zte corporation +8C:87:3B Leica Camera AG +28:E4:76 Pi-Coral +9C:68:5B Octonion SA +AC:AB:BF AthenTek Inc. +5C:41:E7 Wiatec International Ltd. +DC:09:14 Talk-A-Phone Co. +14:29:71 NEMOA ELECTRONICS (HK) CO. LTD +B4:73:56 Hangzhou Treebear Networking Co., Ltd. +D8:8D:5C Elentec +50:AD:D5 Dynalec Corporation +28:D9:8A Hangzhou Konke Technology Co.,Ltd. +BC:4D:FB Hitron Technologies. Inc +40:EA:CE FOUNDER BROADBAND NETWORK SERVICE CO.,LTD +10:C6:7E SHENZHEN JUCHIN TECHNOLOGY CO., LTD +3C:49:37 ASSMANN Electronic GmbH +90:45:06 Tokyo Boeki Medisys Inc. +80:A8:5D Osterhout Design Group +9C:6C:15 Microsoft Corporation +EC:74:BA Hirschmann Automation and Control GmbH +68:3C:7D Magic Intelligence Technology Limited +60:12:8B CANON INC. +EC:BA:FE GIROPTIC +E8:44:7E Bitdefender SRL +84:C3:E8 Vaillant GmbH +B8:8E:C6 Stateless Networks +14:6B:72 Shenzhen Fortune Ship Technology Co., Ltd. +40:A5:EF Shenzhen Four Seas Global Link Network Technology Co., Ltd. +7C:7A:53 Phytrex Technology Corp. +48:86:E8 Microsoft Corporation +78:FC:14 B Communications Pty Ltd +88:E1:61 Art Beijing Science and Technology Development Co., Ltd. +B4:A9:FE GHIA Technology (Shenzhen) LTD +70:0F:C7 SHENZHEN IKINLOOP TECHNOLOGY CO.,LTD. +EC:80:09 NovaSparks +64:00:2D Powerlinq Co., LTD +10:12:18 Korins Inc. +B0:45:15 mira fitness,LLC. +30:75:12 Sony Mobile Communications AB +A4:9D:49 Ketra, Inc. +C0:98:79 Acer Inc. +1C:9E:CB Beijing Nari Smartchip Microelectronics Company Limited +D4:8D:D9 Meld Technology, Inc +2C:37:96 CYBO CO.,LTD. +94:70:D2 WINFIRM TECHNOLOGY +2C:29:97 Microsoft Corporation +4C:E2:F1 sclak srl +34:4D:EA zte corporation +90:8C:09 Total Phase +1C:7E:51 3bumen.com +60:C7:98 Verifone, Inc. +38:0E:7B V.P.S. Thai Co., Ltd +38:F3:3F TATSUNO CORPORATION +28:A5:EE Shenzhen SDGI CATV Co., Ltd +94:CE:31 CTS Limited +4C:BB:58 Chicony Electronics Co., Ltd. +C4:00:06 Lipi Data Systems Ltd. +78:9C:E7 Shenzhen Aikede Technology Co., Ltd +5C:2E:D2 ABC(XiSheng) Electronics Co.,Ltd +D8:F7:10 Libre Wireless Technologies Inc. +68:F7:28 LCFC(HeFei) Electronics Technology co., ltd +DC:EC:06 Heimi Network Technology Co., Ltd. +88:70:EF SC Professional Trading Co., Ltd. +10:2F:6B Microsoft Corporation +AC:B7:4F METEL s.r.o. +CC:F5:38 3isysnetworks +04:DE:DB Rockport Networks Inc +68:F0:6D ALONG INDUSTRIAL CO., LIMITED +54:F8:76 ABB AG +48:57:DD Facebook +84:93:0C InCoax Networks Europe AB +D4:7B:35 NEO Monitors AS +D8:FB:11 AXACORE +C8:D0:19 Shanghai Tigercel Communication Technology Co.,Ltd +18:A9:58 PROVISION THAI CO., LTD. +D8:DE:CE ISUNG CO.,LTD +20:53:CA Risk Technology Ltd +14:2B:D6 Guangdong Appscomm Co.,Ltd +B0:25:AA Private +40:82:56 Continental Automotive GmbH +D8:66:EE BOXIN COMMUNICATION CO.,LTD. +3C:18:9F Nokia Corporation +28:29:CC Corsa Technology Incorporated +FC:79:0B Hitachi High Technologies America, Inc. +28:E6:E9 SIS Sat Internet Services GmbH +BC:4E:5D ZhongMiao Technology Co., Ltd. +08:F7:28 GLOBO Multimedia Sp. z o.o. Sp.k. +70:72:0D Lenovo Mobile Communication Technology Ltd. +84:01:A7 Greyware Automation Products, Inc +C4:C9:EC Gugaoo HK Limited +F4:06:A5 Hangzhou Bianfeng Networking Technology Co., Ltd. +4C:39:09 HPL Electric & Power Private Limited +7C:FE:4E Shenzhen Safe vision Technology Co.,LTD +54:EF:92 Shenzhen Elink Technology Co., LTD +80:0E:24 ForgetBox +FC:E1:86 A3M Co., LTD +CC:B6:91 NECMagnusCommunications +40:16:7E ASUSTek COMPUTER INC. +C8:9F:1D SHENZHEN COMMUNICATION TECHNOLOGIES CO.,LTD +98:37:13 PT.Navicom Indonesia +AC:A9:19 TrekStor GmbH +84:85:0A Hella Sonnen- und Wetterschutztechnik GmbH +18:30:09 Woojin Industrial Systems Co., Ltd. +60:81:F9 Helium Systems, Inc +34:C5:D0 Hagleitner Hygiene International GmbH +74:DB:D1 Ebay Inc +34:31:C4 AVM GmbH +DC:53:7C Compal Broadband Networks, Inc. +A0:06:27 NEXPA System +30:33:35 Boosty +18:D5:B6 SMG Holdings LLC +C8:FF:77 Dyson Limited +C0:3D:46 Shanghai Mochui Network Technology Co., Ltd +DC:F1:10 Nokia Corporation +54:DF:00 Ulterius Technologies, LLC +E0:1D:38 Beijing HuaqinWorld Technology Co.,Ltd +D8:0C:CF C.G.V. S.A.S. +14:3D:F2 Beijing Shidai Hongyuan Network Communication Co.,Ltd +B0:D5:9D Shenzhen Zowee Technology Co., Ltd +C4:91:3A Shenzhen Sanland Electronic Co., ltd. +A4:60:32 MRV Communications (Networks) LTD +20:5A:00 Coval +0C:20:26 noax Technologies AG +88:0F:B6 Jabil Circuits India Pvt Ltd,-EHTP unit +C4:62:6B ZPT Vigantice +74:F8:5D Berkeley Nucleonics Corp +48:EE:07 Silver Palm Technologies LLC +9C:FB:F1 MESOMATIC GmbH & Co.KG +94:C0:14 Sorter Sp. j. Konrad Grzeszczyk MichaA, Ziomek +10:27:BE TVIP +20:87:AC AES motomation +A8:24:EB ZAO NPO Introtest +44:7E:76 Trek Technology (S) Pte Ltd +E8:FC:60 ELCOM Innovations Private Limited +1C:FC:BB Realfiction ApS +B0:EC:8F GMX SAS +C4:0E:45 ACK Networks,Inc. +5C:25:4C Avire Global Pte Ltd +7C:1A:03 8Locations Co., Ltd. +48:18:42 Shanghai Winaas Co. Equipment Co. Ltd. +E8:17:FC NIFTY Corporation +D0:9C:30 Foster Electric Company, Limited +78:FE:E2 Shanghai Diveo Technology Co., Ltd +38:6C:9B Ivy Biomedical +E4:4C:6C Shenzhen Guo Wei Electronic Co,. Ltd. +00:8B:43 RFTECH +2C:95:7F zte corporation +24:26:42 SHARP Corporation. +28:22:46 Beijing Sinoix Communication Co., LTD +FC:16:07 Taian Technology(Wuxi) Co.,Ltd. +CC:89:FD Nokia Corporation +E8:61:83 Black Diamond Advanced Technology, LLC +C4:82:4E Changzhou Uchip Electronics Co., LTD. +24:A8:7D Panasonic Automotive Systems Asia Pacific(Thailand)Co.,Ltd. +78:EC:74 Kyland-USA +28:C8:25 DellKing Industrial Co., Ltd +64:E8:92 Morio Denki Co., Ltd. +08:6D:F2 Shenzhen MIMOWAVE Technology Co.,Ltd +64:EB:8C Seiko Epson Corporation +48:D0:CF Universal Electronics, Inc. +DC:C7:93 Nokia Corporation +E0:3F:49 ASUSTek COMPUTER INC. +D8:EE:78 Moog Protokraft +F4:B6:E5 TerraSem Co.,Ltd +28:BB:59 RNET Technologies, Inc. +7C:8D:91 Shanghai Hongzhuo Information Technology co.,LTD +A8:81:F1 BMEYE B.V. +24:11:48 Entropix, LLC +30:B5:C2 TP-LINK TECHNOLOGIES CO.,LTD. +F8:5C:45 IC Nexus Co. Ltd. +04:DB:8A Suntech International Ltd. +08:3F:76 Intellian Technologies, Inc. +0C:C4:7A Super Micro Computer, Inc. +D0:63:4D Meiko Maschinenbau GmbH & Co. KG +88:C6:26 Logitech - Ultimate Ears +88:9C:A6 BTB Korea INC +B0:DA:00 CERA ELECTRONIQUE +44:70:98 MING HONG TECHNOLOGY (SHEN ZHEN) LIMITED +00:EE:BD HTC Corporation +48:B5:A7 Glory Horse Industries Ltd. +DC:5E:36 Paterson Technology +50:E0:C7 TurControlSystme AG +9C:D6:43 D-Link International +28:FC:51 The Electric Controller and Manufacturing Co., LLC +34:A5:E1 Sensorist ApS +A4:E9:A3 Honest Technology Co., Ltd +C4:E9:2F AB Sciex +9C:21:6A TP-LINK TECHNOLOGIES CO.,LTD. +F8:62:AA xn systems +A4:05:9E STA Infinity LLP +6C:15:F9 Nautronix Limited +68:0A:D7 Yancheng Kecheng Optoelectronic Technology Co., Ltd +BC:88:93 VILLBAU Ltd. +64:3F:5F Exablaze +E8:F2:26 MILLSON CUSTOM SOLUTIONS INC. +70:60:DE LaVision GmbH +FC:FE:77 Hitachi Reftechno, Inc. +70:53:3F Alfa Instrumentos Eletronicos Ltda. +44:8A:5B Micro-Star INT'L CO., LTD. +68:19:3F Digital Airways +5C:D6:1F Qardio, Inc +90:20:83 General Engine Management Systems Ltd. +14:B1:26 Industrial Software Co +C0:35:80 A&R TECH +14:46:E4 AVISTEL +90:79:90 Benchmark Electronics Romania SRL +C4:93:80 Speedytel technology +B4:A8:2B Histar Digital Electronics Co., Ltd. +60:A9:B0 Merchandising Technologies, Inc +00:7D:FA Volkswagen Group of America +60:24:C1 Jiangsu Zhongxun Electronic Technology Co., Ltd +6C:5A:B5 TCL Technoly Electronics (Huizhou) Co., Ltd. +88:78:9C Game Technologies SA +18:AA:45 Fon Technology +54:93:59 SHENZHEN TWOWING TECHNOLOGIES CO.,LTD. +28:44:30 GenesisTechnical Systems (UK) Ltd +98:43:DA INTERTECH +28:57:67 Echostar Technologies Corp +B0:79:08 Cummings Engineering +04:CB:1D Traka plc +B8:7A:C9 Siemens Ltd. +B0:98:9F LG CNS +3C:30:0C Dewar Electronics Pty Ltd +78:B5:D2 Ever Treasure Industrial Limited +A4:09:CB Alfred Kaercher GmbH & Co KG +C4:45:EC Shanghai Yali Electron Co.,LTD +E8:61:1F Dawning Information Industry Co.,Ltd +0C:A6:94 Sunitec Enterprise Co.,Ltd +14:60:80 zte corporation +98:6C:F5 zte corporation +78:49:1D The Will-Burt Company +74:D4:35 GIGA-BYTE TECHNOLOGY CO.,LTD. +84:0F:45 Shanghai GMT Digital Technologies Co., Ltd +D8:27:0C MaxTronic International Co., Ltd. +E8:04:10 Private +8C:08:8B Remote Solution +A4:77:60 Nokia Corporation +24:A4:95 Thales Canada Inc. +88:36:12 SRC Computers, LLC +E0:A1:98 NOJA Power Switchgear Pty Ltd +CC:7B:35 zte corporation +04:D4:37 ZNV +CC:F4:07 EUKREA ELECTROMATIQUE SARL +BC:2B:D7 Revogi Innovation Co., Ltd. +24:EC:D6 CSG Science & Technology Co.,Ltd.Hefei +10:22:79 ZeroDesktop, Inc. +CC:4A:E1 fourtec -Fourier Technologies +A4:89:5B ARK INFOSOLUTIONS PVT LTD +38:EC:11 Novatek Microelectronics Corp. +A8:CC:C5 Saab AB (publ) +98:8E:4A NOXUS(BEIJING) TECHNOLOGY CO.,LTD +1C:41:58 Gemalto M2M GmbH +AC:D6:57 Shaanxi Guolian Digital TV Technology Co., Ltd. +54:1B:5D Techno-Innov +78:CB:33 DHC Software Co.,Ltd +50:76:91 Tekpea, Inc. +C4:21:C8 KYOCERA Corporation +A4:C0:C7 ShenZhen Hitom Communication Technology Co..LTD +EC:22:57 JiangSu NanJing University Electronic Information Technology Co.,Ltd +34:1A:4C SHENZHEN WEIBU ELECTRONICS CO.,LTD. +A0:9B:BD Total Aviation Solutions Pty Ltd +E8:48:1F Advanced Automotive Antennas +18:D6:CF Kurth Electronic GmbH +E0:7F:88 EVIDENCE Network SIA +1C:7C:C7 Coriant GmbH +54:2C:EA PROTECTRON +00:C5:DB Datatech Sistemas Digitales Avanzados SL +10:9A:B9 Tosibox Oy +F8:42:FB Yasuda Joho Co.,ltd. +88:73:98 K2E Tekpoint +68:EE:96 Cisco SPVTG +FC:60:18 Zhejiang Kangtai Electric Co., Ltd. +30:3E:AD Sonavox Canada Inc +44:4A:65 Silverflare Ltd. +50:A0:BF Alba Fiber Systems Inc. +3C:97:7E IPS Technology Limited +F0:24:05 OPUS High Technology Corporation +D8:B0:4C Jinan USR IOT Technology Co., Ltd. +64:6E:EA Iskratel d.o.o. +04:3D:98 ChongQing QingJia Electronics CO.,LTD +E8:BB:3D Sino Prime-Tech Limited +98:CD:B4 Virident Systems, Inc. +54:E3:B0 JVL Industri Elektronik +64:0B:4A Digital Telecom Technology Limited +F4:20:12 Cuciniale GmbH +4C:21:D0 Sony Mobile Communications AB +18:10:4E CEDINT-UPM +2C:7B:84 OOO Petr Telegin +54:05:36 Vivago Oy +2C:E6:CC Ruckus Wireless +E0:FA:EC Platan sp. z o.o. sp. k. +F0:8E:DB VeloCloud Networks +B8:DC:87 IAI Corporation +7C:6F:F8 ShenZhen ACTO Digital Video Technology Co.,Ltd. +8C:4B:59 3D Imaging & Simulations Corp +A4:FB:8D Hangzhou Dunchong Technology Co.Ltd +00:75:E1 Ampt, LLC +CC:04:B4 Select Comfort +28:4F:CE Liaoning Wontel Science and Technology Development Co.,Ltd. +0C:C8:1F Summer Infant, Inc. +D8:69:60 Steinsvik +44:2A:FF E3 Technology, Inc. +0C:93:01 PT. Prasimax Inovasi Teknologi +60:69:9B isepos GmbH +B8:30:A8 Road-Track Telematics Development +54:21:60 Resolution Products +88:46:2A Telechips Inc. +A8:97:DC IBM +E8:DE:27 TP-LINK TECHNOLOGIES CO.,LTD. +FC:22:9C Han Kyung I Net Co.,Ltd. +14:86:92 TP-LINK TECHNOLOGIES CO.,LTD. +18:32:A2 LAON TECHNOLOGY CO., LTD. +68:54:ED Alcatel-Lucent - Nuage +98:5C:93 SBG Systems SAS +64:E5:99 EFM Networks +F4:99:AC WEBER Schraubautomaten GmbH +8C:C7:D0 zhejiang ebang communication co.,ltd +70:82:0E as electronics GmbH +DC:2B:CA Zera GmbH +50:8D:6F CHAHOO Limited +68:83:1A Pandora Mobility Corporation +D4:22:3F Lenovo Mobile Communication Technology Ltd. +08:68:D0 Japan System Design +10:3D:EA HFC Technology (Beijing) Ltd. Co. +E8:E8:75 iS5 Communications Inc. +2C:7B:5A Milper Ltd +18:5A:E8 Zenotech.Co.,Ltd +E0:AE:ED LOENK +D4:EE:07 HIWIFI Co., Ltd. +90:82:60 IEEE 1904.1 Working Group +FC:AD:0F QTS NETWORKS +98:4C:04 Zhangzhou Keneng Electrical Equipment Co Ltd +CC:04:7C G-WAY Microwave +44:F8:49 Union Pacific Railroad +1C:FA:68 TP-LINK TECHNOLOGIES CO.,LTD. +D0:BE:2C CNSLink Co., Ltd. +28:18:78 Microsoft Corporation +E4:57:A8 Stuart Manufacturing, Inc. +24:81:AA KSH International Co., Ltd. +78:99:66 Musilab Electronics (DongGuan)Co.,Ltd. +EC:2C:49 University of Tokyo +CC:5D:57 Information System Research Institute,Inc. +1C:37:BF Cloudium Systems Ltd. +24:95:04 SFR +30:89:99 Guangdong East Power Co., +D4:A4:99 InView Technology Corporation +AC:41:22 Eclipse Electronic Systems Inc. +A0:73:FC Rancore Technologies Private Limited +84:62:23 Shenzhen Coship Electronics Co., Ltd. +A4:E9:91 SISTEMAS AUDIOVISUALES ITELSIS S.L. +84:F4:93 OMS spol. s.r.o. +38:67:93 Asia Optical Co., Inc. +BC:D1:77 TP-LINK TECHNOLOGIES CO.,LTD. +C8:B3:73 Cisco-Linksys, LLC +98:30:71 DAIKYUNG VASCOM +0C:04:00 Jantar d.o.o. +C0:43:01 Epec Oy +68:7C:D5 Y Soft Corporation, a.s. +E0:7C:62 Whistle Labs, Inc. +FC:44:99 Swarco LEA d.o.o. +0C:84:84 Zenovia Electronics Inc. +5C:F3:70 CC&C Technologies, Inc +A0:1C:05 NIMAX TELECOM CO.,LTD. +F8:0D:EA ZyCast Technology Inc. +18:00:DB Fitbit Inc. +50:A7:15 Aboundi, Inc. +FC:35:E6 Visteon corp +D8:66:C6 Shenzhen Daystar Technology Co.,ltd +18:36:FC Elecsys International Corporation +F4:81:39 CANON INC. +D4:0B:B9 Solid Semecs bv. +74:8E:08 Bestek Corp. +B8:C8:55 Shanghai GBCOM Communication Technology Co.,Ltd. +C4:7D:FE A.N. Solutions GmbH +E0:31:D0 SZ Telstar CO., LTD +70:C6:AC Bosch Automotive Aftermarket +2C:69:BA RF Controls, LLC +DC:57:26 Power-One +2C:24:5F Babolat VS +D4:64:F7 CHENGDU USEE DIGITAL TECHNOLOGY CO., LTD +A4:7A:CF VIBICOM COMMUNICATIONS INC. +CC:3C:3F SA.S.S. Datentechnik AG +90:56:92 Autotalks Ltd. +0C:2A:E7 Beijing General Research Institute of Mining and Metallurgy +DC:D5:2A Sunny Heart Limited +C4:C7:55 Beijing HuaqinWorld Technology Co.,Ltd +9C:79:AC Suntec Software(Shanghai) Co., Ltd. +F8:DF:A8 zte corporation +AC:A4:30 Peerless AV +B4:AB:2C MtM Technology Corporation +74:37:2F Tongfang Shenzhen Cloudcomputing Technology Co.,Ltd +BC:51:FE Swann communications Pty Ltd +D4:0F:B2 Applied Micro Electronics AME bv +74:FE:48 ADVANTECH CO., LTD. +D0:B4:98 Robert Bosch LLC Automotive Electronics +80:B9:5C ELFTECH Co., Ltd. +E8:5A:A7 LLC Emzior +24:2F:FA Toshiba Global Commerce Solutions +A0:BA:B8 Pixon Imaging +9C:E1:D6 Junger Audio-Studiotechnik GmbH +E4:E4:09 LEIFHEIT AG +00:4D:32 Andon Health Co.,Ltd. +C4:6D:F1 DataGravity +28:D2:44 LCFC(HeFei) Electronics Technology Co., Ltd. +AC:E8:7E Bytemark Computer Consulting Ltd +60:CD:C5 Taiwan Carol Electronics., Ltd +60:C5:A8 Beijing LT Honway Technology Co.,Ltd +B4:DF:3B Chromlech +A4:6E:79 DFT System Co.Ltd +94:DE:80 GIGA-BYTE TECHNOLOGY CO.,LTD. +C8:8A:83 Dongguan HuaHong Electronics Co.,Ltd +0C:C6:55 Wuxi YSTen Technology Co.,Ltd. +D4:10:CF Huanshun Network Science and Technology Co., Ltd. +B8:04:15 Bayan Audio +84:C8:B1 Incognito Software Systems Inc. +64:5A:04 Chicony Electronics Co., Ltd. +5C:89:D4 Beijing Banner Electric Co.,Ltd +98:4C:D3 Mantis Deposition +8C:4C:DC PLANEX COMMUNICATIONS INC. +D0:63:B4 SolidRun Ltd. +2C:3B:FD Netstor Technology Co., Ltd. +F0:73:AE PEAK-System Technik +68:4C:A8 Shenzhen Herotel Tech. Co., Ltd. +F4:47:2A Nanjing Rousing Sci. and Tech. Industrial Co., Ltd +18:52:53 Pixord Corporation +FC:A9:B0 MIARTECH (SHANGHAI),INC. +80:D7:33 QSR Automations, Inc. +8C:33:30 EmFirst Co., Ltd. +8C:0C:90 Ruckus Wireless +08:E5:DA NANJING FUJITSU COMPUTER PRODUCTS CO.,LTD. +58:84:E4 IP500 Alliance e.V. +04:E9:E5 PJRC.COM, LLC +70:38:11 Invensys Rail +AC:E6:4B Shenzhen Baojia Battery Technology Co., Ltd. +30:32:94 W-IE-NE-R Plein & Baus GmbH +EC:47:3C Redwire, LLC +54:81:AD Eagle Research Corporation +7C:82:2D Nortec +74:5F:AE TSL PPL +84:62:A6 EuroCB (Phils), Inc. +80:FA:5B CLEVO CO. +E4:F3:65 Time-O-Matic, Inc. +18:55:0F Cisco SPVTG +1C:91:79 Integrated System Technologies Ltd +38:F5:97 home2net GmbH +38:66:45 OOSIC Technology CO.,Ltd +D0:DF:B2 Genie Networks Limited +80:8B:5C Shenzhen Runhuicheng Technology Co., Ltd +04:58:6F Sichuan Whayer information industry Co.,LTD +44:9B:78 The Now Factory +D0:52:A8 Physical Graph Corporation +34:F6:2D SHARP Corporation +C4:EB:E3 RRCN SAS +4C:1A:95 Novakon Co., Ltd. +C0:4A:00 TP-LINK TECHNOLOGIES CO.,LTD. +9C:31:78 Foshan Huadian Intelligent Communications Teachnologies Co.,Ltd +48:BE:2D Symanitron +38:E5:95 Shenzhen Gongjin Electronics Co.,Ltd +B8:60:91 Onnet Technologies and Innovations LLC +20:1A:06 COMPAL INFORMATION (KUNSHAN) CO., LTD. +D4:CA:6E u-blox AG +C0:11:A6 Fort-Telecom ltd. +B8:DA:F1 Strahlenschutz- Entwicklungs- und Ausruestungsgesellschaft mbH +1C:11:E1 Wartsila Finland Oy +50:46:5D ASUSTek COMPUTER INC. +74:BF:A1 HYUNTECK +F8:AA:8A Axview Technology (Shenzhen) Co.,Ltd +58:94:CF Vertex Standard LMR, Inc. +2C:5A:A3 PROMATE ELECTRONIC CO.LTD +B4:00:9C CableWorld Ltd. +80:3F:D6 bytes at work AG +64:5F:FF Nicolet Neuro +28:29:D9 GlobalBeiMing technology (Beijing)Co. Ltd +18:9A:67 CSE-Servelec Limited +38:A5:B6 SHENZHEN MEGMEET ELECTRICAL CO.,LTD +E4:3F:A2 Wuxi DSP Technologies Inc. +00:FD:4C NEVATEC +60:45:BD Microsoft +9C:54:CA Zhengzhou VCOM Science and Technology Co.,Ltd +38:8A:B7 ITC Networks +BC:C2:3A Thomson Video Networks +00:BF:15 Genetec Inc. +20:F8:5E Delta Electronics +68:CE:4E L-3 Communications Infrared Products +68:B6:FC Hitron Technologies. Inc +7C:16:0D Saia-Burgess Controls AG +A4:D1:8F Shenzhen Skyee Optical Fiber Communication Technology Ltd. +0C:56:5C HyBroad Vision (Hong Kong) Technology Co Ltd +64:7C:34 Ubee Interactive Corp. +64:9F:F7 Kone OYj +4C:06:8A Basler Electric Company +E0:A3:0F Pevco +5C:17:37 I-View Now, LLC. +04:9C:62 BMT Medical Technology s.r.o. +C4:BA:99 I+ME Actia Informatik und Mikro-Elektronik GmbH +0C:2A:69 electric imp, incorporated +BC:81:1F Ingate Systems +34:E0:CF zte corporation +80:1D:AA Avaya Inc +6C:40:C6 Nimbus Data Systems, Inc. +50:3F:56 Syncmold Enterprise Corp +D0:4C:C1 SINTRONES Technology Corp. +DC:9F:A4 Nokia Corporation +44:C3:9B OOO RUBEZH NPO +58:C2:32 NEC Corporation +D8:C6:91 Hichan Technology Corp. +7C:02:BC Hansung Electronics Co. LTD +18:48:D8 Fastback Networks +70:23:93 fos4X GmbH +D8:AF:F1 Panasonic Appliances Company +58:EC:E1 Newport Corporation +14:35:8B Mediabridge Products, LLC. +34:99:6F VPI Engineering +24:10:64 Shenzhen Ecsino Tecnical Co. Ltd +10:D1:DC INSTAR Deutschland GmbH +D8:16:0A Nippon Electro-Sensory Devices +58:69:6C Fujian Ruijie Networks co, ltd +F4:54:33 Rockwell Automation +EC:93:27 MEMMERT GmbH + Co. KG +1C:43:EC JAPAN CIRCUIT CO.,LTD +BC:28:D6 Rowley Associates Limited +F0:5F:5A Getriebebau NORD GmbH and Co. KG +00:95:69 LSD Science and Technology Co.,Ltd. +34:C8:03 Nokia Corporation +50:11:EB SilverNet Ltd +5C:D4:1B UCZOON Technology Co., LTD +78:3C:E3 Kai-EE +08:68:EA EITO ELECTRONICS CO., LTD. +5C:4A:26 Enguity Technology Corp +28:9E:DF Danfoss Turbocor Compressors, Inc +50:05:3D CyWee Group Ltd +4C:64:D9 Guangdong Leawin Group Co., Ltd +7C:B0:3E OSRAM GmbH +14:B1:C8 InfiniWing, Inc. +C0:49:3D MAITRISE TECHNOLOGIQUE +34:A7:BA Fischer International Systems Corporation +AC:D3:64 ABB SPA, ABB SACE DIV. +38:F8:B7 V2COM PARTICIPACOES S.A. +B4:82:55 Research Products Corporation +2C:75:0F Shanghai Dongzhou-Lawton Communication Technology Co. Ltd. +B4:04:18 Smartchip Integrated Inc. +F4:EA:67 Cisco Systems, Inc +D0:AE:EC Alpha Networks Inc. +3C:98:BF Quest Controls, Inc. +D0:57:85 Pantech Co., Ltd. +04:5C:06 Zmodo Technology Corporation +50:4A:5E Masimo Corporation +38:BF:33 NEC CASIO Mobile Communications +A0:41:A7 NL Ministry of Defense +34:2F:6E Anywire corporation +E8:6D:6E voestalpine SIGNALING Fareham Ltd. +F8:D4:62 Pumatronix Equipamentos Eletronicos Ltda. +54:53:ED Sony Corporation +94:00:70 Nokia Corporation +6C:3A:84 Shenzhen Aero-Startech. Co.Ltd +44:2B:03 Cisco Systems, Inc +78:1C:5A SHARP Corporation +E4:C6:E6 Mophie, LLC +50:2D:1D Nokia Corporation +BC:EA:2B CityCom GmbH +94:44:44 LG Innotek +E4:C8:06 Ceiec Electric Technology Inc. +18:B5:91 I-Storm +A4:56:30 Cisco Systems, Inc +00:2A:AF LARsys-Automation GmbH +60:F3:DA Logic Way GmbH +A0:6D:09 Intelcan Technosystems Inc. +BC:14:01 Hitron Technologies. Inc +68:D9:25 ProSys Development Services +B4:1D:EF Internet Laboratories, Inc. +28:41:21 OptiSense Network, LLC +50:57:A8 Cisco Systems, Inc +38:45:8C MyCloud Technology corporation +0C:9D:56 Consort Controls Ltd +3C:CE:73 Cisco Systems, Inc +A4:7C:14 ChargeStorm AB +F4:60:0D Panoptic Technology, Inc +AC:CF:23 Hi-flying electronics technology Co.,Ltd +C0:81:70 Effigis GeoSolutions +78:C4:AB Shenzhen Runsil Technology Co.,Ltd +70:9A:0B Italian Institute of Technology +24:09:17 Devlin Electronics Limited +DC:37:D2 Hunan HKT Electronic Technology Co., Ltd +04:8B:42 Skspruce Technology Limited +50:76:A6 Ecil Informatica Ind. Com. Ltda +B4:31:B8 Aviwest +24:11:25 Hutek Co., Ltd. +00:36:FE SuperVision +CC:18:7B Manzanita Systems, Inc. +38:B1:2D Sonotronic Nagel GmbH +80:20:AF Trade FIDES, a.s. +50:D2:74 Steffes Corporation +48:D5:4C Jeda Networks +34:97:FB ADVANCED RF TECHNOLOGIES INC +C4:64:13 Cisco Systems, Inc +14:3A:EA Dynapower Company LLC +9C:A1:34 Nike, Inc. +B4:D8:A9 BetterBots +7C:C8:D7 Damalisk +00:91:FA Synapse Product Development +A0:5A:A4 Grand Products Nevada, Inc. +24:C0:B3 RSF +E0:0B:28 Inovonics +50:0B:32 Foxda Technology Industrial(ShenZhen)Co.,LTD +30:2D:E8 JDA, LLC (JDA Systems) +70:CA:9B Cisco Systems, Inc +2C:3F:38 Cisco Systems, Inc +80:3F:5D Winstars Technology Ltd +78:07:38 Z.U.K. Elzab S.A. +64:0E:36 TAZTAG +70:EE:50 Netatmo +EC:63:E5 ePBoard Design LLC +60:B6:06 Phorus +F4:E6:D7 Solar Power Technologies, Inc. +78:DD:D6 c-scape +98:4A:47 CHG Hospital Beds +3C:6A:7D Niigata Power Systems Co., Ltd. +FC:45:5F JIANGXI SHANSHUI OPTOELECTRONIC TECHNOLOGY CO.,LTD +3C:70:59 MakerBot Industries +F8:FE:5C Reciprocal Labs Corp +6C:9C:ED Cisco Systems, Inc +94:E0:D0 HealthStream Taiwan Inc. +DC:F8:58 Lorent Networks, Inc. +58:93:96 Ruckus Wireless +A0:5E:6B MELPER Co., Ltd. +30:B3:A2 Shenzhen Heguang Measurement & Control Technology Co.,Ltd +F0:00:7F Janz - Contadores de Energia, SA +CC:94:4A Pfeiffer Vacuum GmbH +0C:85:25 Cisco Systems, Inc +BC:E5:9F WATERWORLD Technology Co.,LTD +1C:5C:55 PRIMA Cinema, Inc +08:25:22 ADVANSEE +4C:2F:9D ICM Controls +E4:67:BA Danish Interpretation Systems A/S +BC:FE:8C Altronic, LLC +24:BB:C1 Absolute Analysis +7C:DD:11 Chongqing MAS SCI&TECH.Co.,Ltd +C4:3C:3C CYBELEC SA +00:D6:32 GE Energy +C4:0A:CB Cisco Systems, Inc +74:63:DF VTS GmbH +38:28:EA Fujian Netcom Technology Co., LTD +2C:EE:26 Petroleum Geo-Services +DC:3E:51 Solberg & Andersen AS +D8:B9:0E Triple Domain Vision Co.,Ltd. +7C:4B:78 Red Sun Synthesis Pte Ltd +28:D1:AF Nokia Corporation +68:BC:0C Cisco Systems, Inc +2C:9E:FC CANON INC. +98:C8:45 PacketAccess +98:82:17 Disruptive Ltd +80:FF:A8 UNIDIS +48:9B:E2 SCI Innovations Ltd +B0:E5:0E NRG SYSTEMS INC +4C:5F:D2 Alcatel-Lucent +E8:78:A1 BEOVIEW INTERCOM DOO +30:57:AC IRLAB LTD. +90:02:A9 ZHEJIANG DAHUA TECHNOLOGY CO.,LTD +28:AF:0A Sirius XM Radio Inc +24:86:F4 Ctek, Inc. +3C:E5:B4 KIDASEN INDUSTRIA E COMERCIO DE ANTENAS LTDA +A8:5B:F3 Audivo GmbH +34:4F:69 EKINOPS SAS +C0:29:73 Audyssey Laboratories Inc. +30:16:8D ProLon +B4:51:F9 NB Software +30:68:8C Reach Technology Inc. +88:F4:88 cellon communications technology(shenzhen)Co.,Ltd. +00:41:B4 Wuxi Zhongxing Optoelectronics Technology Co.,Ltd. +D4:53:AF VIGO System S.A. +1C:E1:92 Qisda Corporation +20:C8:B3 SHENZHEN BUL-TECH CO.,LTD. +58:B0:D4 ZuniData Systems Inc. +64:55:7F NSFOCUS Information Technology Co., Ltd. +40:6A:AB RIM +24:87:07 SEnergy Corporation +EC:3F:05 Institute 706, The Second Academy China Aerospace Science & Industry Corp +C4:C1:9F National Oilwell Varco Instrumentation, Monitoring, and Optimization (NOV IMO) +68:CD:0F U Tek Company Limited +D4:CE:B8 Enatel LTD +EC:F2:36 NEOMONTANA ELECTRONICS +E4:A5:EF TRON LINK ELECTRONICS CO., LTD. +AC:4A:FE Hisense Broadband Multimedia Technology Co.,Ltd. +2C:1E:EA AERODEV +FC:6C:31 LXinstruments GmbH +3C:6F:45 Fiberpro Inc. +B4:FC:75 SEMA Electronics(HK) CO.,LTD +5C:16:C7 Big Switch Networks +B0:BF:99 WIZITDONGDO +14:7D:B3 JOA TELECOM.CO.,LTD +3C:D1:6E Telepower Communication Co., Ltd +00:07:7D Cisco Systems, Inc +10:45:BE Norphonic AS +A0:E2:95 DAT System Co.,Ltd +40:F1:4C ISE Europe SPRL +98:29:3F Fujian Start Computer Equipment Co.,Ltd +70:D4:F2 RIM +90:67:F3 Alcatel Lucent +64:D9:12 Solidica, Inc. +8C:5C:A1 d-broad,INC +C8:F9:81 Seneca s.r.l. +70:31:87 ACX GmbH +14:30:7A Avermetrics +8C:7E:B3 Lytro, Inc. +58:76:75 Beijing ECHO Technologies Co.,Ltd +78:EF:4C Unetconvergence Co., Ltd. +E8:DA:96 Zhuhai Tianrui Electrical Power Tech. Co., Ltd. +6C:A7:80 Nokia Corporation +04:88:8C Eifelwerk Butler Systeme GmbH +10:13:EE Justec International Technology INC. +70:46:42 CHYNG HONG ELECTRONIC CO., LTD. +78:BE:B6 Enhanced Vision +EC:EA:03 DARFON LIGHTING CORP +C8:90:3E Pakton Technologies +74:65:D1 Atlinks +30:1A:28 Mako Networks Ltd +D4:94:5A COSMO CO., LTD +5C:F2:07 Speco Technologies +B0:1B:7C Ontrol A.S. +D4:7B:75 HARTING Electronics GmbH +70:E8:43 Beijing C&W Optical Communication Technology Co.,Ltd. +08:AC:A5 Benu Video, Inc. +D8:9D:B9 eMegatech International Corp. +40:5A:9B ANOVO +AC:CA:54 Telldus Technologies AB +CC:1E:FF Metrological Group BV +94:16:73 Point Core SARL +6C:5D:63 ShenZhen Rapoo Technology Co., Ltd. +E4:D7:1D Oraya Therapeutics +C8:FE:30 Bejing DAYO Mobile Communication Technology Ltd. +64:B6:4A ViVOtech, Inc. +DC:A7:D9 Compressor Controls Corp +C4:55:A6 Cadac Holdings Ltd +BC:BB:C9 Kellendonk Elektronik GmbH +78:1D:FD Jabil Inc +10:37:11 Simlink AS +60:11:99 Siama Systems Inc +30:0B:9C Delta Mobile Systems, Inc. +90:EA:60 SPI Lasers Ltd +D4:6F:42 WAXESS USA Inc +B0:A7:2A Ensemble Designs, Inc. +50:79:5B Interexport Telecomunicaciones S.A. +E8:C2:29 H-Displays (MSC) Bhd +B0:BD:A1 ZAKLAD ELEKTRONICZNY SIMS +8C:44:35 Shanghai BroadMobi Communication Technology Co., Ltd. +24:B8:D2 Opzoon Technology Co.,Ltd. +24:CB:E7 MYK, Inc. +88:BF:D5 Simple Audio Ltd +94:8B:03 EAGET Innovation and Technology Co., Ltd. +80:2D:E1 Solarbridge Technologies +F0:81:AF IRZ AUTOMATION TECHNOLOGIES LTD +14:EB:33 BSMediasoft Co., Ltd. +AC:86:74 Open Mesh, Inc. +14:A9:E3 MST CORPORATION +58:98:35 Technicolor +50:D6:D7 Takahata Precision +B4:A5:A9 MODI GmbH +D0:9B:05 Emtronix +98:EC:65 Cosesy ApS +90:09:17 Far-sighted mobile +88:F0:77 Cisco Systems, Inc +AC:47:23 Genelec +20:B7:C0 OMICRON electronics GmbH +D4:2C:3D Sky Light Digital Limited +80:6C:BC NET New Electronic Technology GmbH +1C:18:4A ShenZhen RicherLink Technologies Co.,LTD +04:E6:62 Acroname Inc. +F0:BF:97 Sony Corporation +C4:4A:D0 FIREFLIES SYSTEMS +88:E0:A0 Shenzhen VisionSTOR Technologies Co., Ltd +68:79:ED SHARP Corporation +9C:C0:D2 Conductix-Wampfler GmbH +40:8B:F6 Shenzhen TCL New Technology Co; Ltd. +44:7E:95 Alpha and Omega, Inc +E8:B7:48 Cisco Systems, Inc +DC:16:A2 Medtronic Diabetes +78:CA:04 Nokia Corporation +2C:8B:F2 Hitachi Metals America Ltd +58:F9:8E SECUDOS GmbH +28:26:A6 PBR electronics GmbH +CC:76:69 SEETECH +E4:37:D7 HENRI DEPAEPE S.A.S. +58:2F:42 Universal Electric Corporation +AC:20:AA DMATEK Co., Ltd. +E0:A1:D7 SFR +28:85:2D Touch Networks +F0:2A:61 Waldo Networks, Inc. +B8:41:5F ASP AG +2C:B6:9D RED Digital Cinema +98:8E:34 ZHEJIANG BOXSAM ELECTRONIC CO.,LTD +D4:4C:24 Vuppalamritha Magnetic Components LTD +4C:B4:EA HRD (S) PTE., LTD. +34:BD:F9 Shanghai WDK Industrial Co.,Ltd. +74:CE:56 Packet Force Technology Limited Company +A8:9B:10 inMotion Ltd. +88:8C:19 Brady Corp Asia Pacific Ltd +74:7D:B6 Aliwei Communications, Inc +B4:14:89 Cisco Systems, Inc +AC:6F:4F Enspert Inc +88:86:A0 Simton Technologies, Ltd. +F0:C8:8C LeddarTech Inc. +68:EB:C5 Angstrem Telecom +44:8C:52 KTIS CO., Ltd +68:63:59 Advanced Digital Broadcast SA +40:18:D7 Smartronix, Inc. +18:92:2C Virtual Instruments +F8:0F:84 Natural Security SAS +EC:9E:CD Artesyn Embedded Technologies +30:39:55 Shenzhen Jinhengjia Electronic Co., Ltd. +FC:5B:24 Weibel Scientific A/S +34:B5:71 PLDS +A8:62:A2 JIWUMEDIA CO., LTD. +98:4E:97 Starlight Marketing (H. K.) Ltd. +7C:6A:DB SafeTone Technology Co.,Ltd +EC:98:6C Lufft Mess- und Regeltechnik GmbH +B0:51:8E Holl technology CO.Ltd. +DC:DE:CA Akyllor +A0:71:A9 Nokia Corporation +80:65:E9 BenQ Corporation +84:5D:D7 Shenzhen Netcom Electronics Co.,Ltd +44:7D:A5 VTION INFORMATION TECHNOLOGY (FUJIAN) CO.,LTD +0C:CD:D3 EASTRIVER TECHNOLOGY CO., LTD. +B8:E5:89 Payter BV +C8:9C:1D Cisco Systems, Inc +50:3D:E5 Cisco Systems, Inc +80:14:40 Sunlit System Technology Corp +94:8D:50 Beamex Oy Ab +94:E2:26 D. ORtiz Consulting, LLC +E8:E7:32 Alcatel-Lucent +38:6E:21 Wasion Group Ltd. +D8:C9:9D EA DISPLAY LIMITED +CC:FC:6D RIZ TRANSMITTERS +AC:80:D6 Hexatronic AB +9C:F9:38 AREVA NP GmbH +50:0E:6D TrafficCast International +1C:FE:A7 IDentytech Solutins Ltd. +D0:B5:3D SEPRO ROBOTIQUE +A0:DE:05 JSC Irbis-T +88:95:B9 Unified Packet Systems Crop +78:59:3E RAFI GmbH & Co.KG +68:43:52 Bhuu Limited +3C:C0:C6 d&b audiotechnik GmbH +F8:DA:F4 Taishan Online Technology Co., Ltd. +D8:E3:AE CIRTEC MEDICAL SYSTEMS +A8:39:44 Actiontec Electronics, Inc +FC:1F:C0 EURECAM +48:91:F6 Shenzhen Reach software technology CO.,LTD +EC:14:F6 BioControl AS +B8:D0:6F GUANGZHOU HKUST FOK YING TUNG RESEARCH INSTITUTE +B4:C4:4E VXL eTech Pvt Ltd +F0:93:3A NxtConect +60:52:D0 FACTS Engineering +8C:27:8A Vocollect Inc +FC:AF:6A Qulsar Inc +EC:E5:55 Hirschmann Automation +DC:D0:F7 Bentek Systems Ltd. +D0:57:4C Cisco Systems, Inc +88:18:AE Tamron Co., Ltd +20:D6:07 Nokia Corporation +58:DB:8D Fast Co., Ltd. +18:EF:63 Cisco Systems, Inc +CC:CE:40 Janteq Corp +8C:4D:EA Cerio Corporation +EC:FA:AA The IMS Company +CC:55:AD RIM +F0:F7:B3 Phorm +E8:75:7F FIRS Technologies(Shenzhen) Co., Ltd +C8:3E:A7 KUNBUS GmbH +A8:D3:C8 Wachendorff Elektronik GmbH & Co. KG +E0:CF:2D Gemintek Corporation +68:BD:AB Cisco Systems, Inc +9C:AD:EF Obihai Technology, Inc. +D0:89:99 APCON, Inc. +44:54:C0 Thompson Aerospace +B4:A4:E3 Cisco Systems, Inc +90:90:3C TRISON TECHNOLOGY CORPORATION +94:DD:3F A+V Link Technologies, Corp. +C8:EE:08 TANGTOP TECHNOLOGY CO.,LTD +74:72:F2 Chipsip Technology Co., Ltd. +5C:D9:98 D-Link Corporation +D4:6C:DA CSM GmbH +C4:F4:64 Spica international +74:91:1A Ruckus Wireless +54:4A:05 wenglor sensoric gmbh +5C:CA:32 Theben AG +84:C7:A9 C3PO S.A. +F8:AC:6D Deltenna Ltd +64:10:84 HEXIUM Technical Development Co., Ltd. +C4:16:FA Prysm Inc +E0:C2:86 Aisai Communication Technology Co., Ltd. +D8:4B:2A Cognitas Technologies, Inc. +68:4B:88 Galtronics Telemetry Inc. +84:29:14 EMPORIA TELECOM Produktions- und VertriebsgesmbH & Co KG +4C:8B:55 Grupo Digicon +04:A3:F3 Emicon +F8:66:F2 Cisco Systems, Inc +7C:55:E7 YSI, Inc. +C0:2B:FC iNES. applied informatics GmbH +AC:34:CB Shanhai GBCOM Communication Technology Co. Ltd +D4:A9:28 GreenWave Reality Inc +9C:FF:BE OTSL Inc. +2C:D1:DA Sanjole, Inc. +10:0E:2B NEC CASIO Mobile Communications +44:5E:F3 Tonalite Holding B.V. +10:0C:24 pomdevices, LLC +58:F6:BF Kyoto University +7C:ED:8D Microsoft +54:FD:BF Scheidt & Bachmann GmbH +B4:0E:DC LG-Ericsson Co.,Ltd. +A4:D1:D1 ECOtality North America +C8:D5:FE Shenzhen Zowee Technology Co., Ltd +C4:93:13 100fio networks technology llc +A4:A8:0F Shenzhen Coship Electronics Co., Ltd. +B8:92:1D BG T&A +48:FC:B8 Woodstream Corporation +54:89:22 Zelfy Inc +F8:C0:91 Highgates Technology +6C:5C:DE SunReports, Inc. +24:1F:2C Calsys, Inc. +28:48:46 GridCentric Inc. +58:B9:E1 Crystalfontz America, Inc. +64:67:07 Beijing Omnific Technology, Ltd. +D4:00:0D Phoenix Broadband Technologies, LLC. +E8:7A:F3 S5 Tech S.r.l. +40:C7:C9 Naviit Inc. +A0:A7:63 Polytron Vertrieb GmbH +D4:96:DF SUNGJIN C&T CO.,LTD +D0:7D:E5 Forward Pay Systems, Inc. +7C:EF:18 Creative Product Design Pty. Ltd. +FC:D4:F6 Messana Air.Ray Conditioning s.r.l. +0C:D6:96 Amimon Ltd +B4:37:41 Consert, Inc. +F8:FB:2F Santur Corporation +2C:CD:43 Summit Technology Group +6C:8D:65 Wireless Glue Networks, Inc. +CC:FC:B1 Wireless Technology, Inc. +CC:5C:75 Weightech Com. Imp. Exp. Equip. Pesagem Ltda +A0:98:ED Shandong Intelligent Optical Communication Development Co., Ltd. +34:C6:9A Enecsys Ltd +50:2A:8B Telekom Research and Development Sdn Bhd +F8:8D:EF Tenebraex +EC:43:E6 AWCER Ltd. +F0:EC:39 Essec +58:49:BA Chitai Electronic Corp. +18:17:14 DAEWOOIS +80:B2:89 Forworld Electronics Ltd. +14:A6:2C S.M. Dezac S.A. +A8:F4:70 Fujian Newland Communication Science Technologies Co.,Ltd. +DC:1D:9F U & B tech +08:16:51 SHENZHEN SEA STAR TECHNOLOGY CO.,LTD +DC:49:C9 CASCO SIGNAL LTD +B0:91:34 Taleo +A8:63:DF DISPLAIRE CORPORATION +10:43:69 Soundmax Electronic Limited +C0:6C:0F Dobbs Stanford +54:75:D0 Cisco Systems, Inc +BC:6A:16 tdvine +C8:EF:2E Beijing Gefei Tech. Co., Ltd +98:DC:D9 UNITEC Co., Ltd. +30:52:5A NST Co., LTD +60:89:B7 KAEL MÜHENDİSLİK ELEKTRONİK TİCARET SANAYİ LİMİTED ŞİRKETİ +2C:A7:80 True Technologies Inc. +54:5F:A9 Teracom Limited +EC:C8:82 Cisco Systems, Inc +A0:B9:ED Skytap +50:2D:F4 Phytec Messtechnik GmbH +38:E8:DF b gmbh medien + datenbanken +10:18:9E Elmo Motion Control +88:FD:15 LINEEYE CO., LTD +10:44:5A Shaanxi Hitech Electronic Co., LTD +60:B3:C4 Elber Srl +04:C8:80 Samtec Inc +88:4B:39 Siemens AG, Healthcare Sector +44:C2:33 Guangzhou Comet Technology Development Co.Ltd +B4:82:FE ASKEY COMPUTER CORP +30:7C:30 RIM +BC:4E:3C CORE STAFF CO., LTD. +80:BA:AC TeleAdapt Ltd +FC:44:63 Universal Audio, Inc +F0:68:53 Integrated Corporation +10:E6:AE Source Technologies, LLC +A4:AD:B8 Vitec Group, Camera Dynamics Ltd +90:A2:DA GHEO SA +C4:1E:CE HMI Sources Ltd. +BC:D5:B6 d2d technologies +1C:8F:8A Phase Motion Control SpA +A4:B1:EE H. ZANDER GmbH & Co. KG +48:6F:D2 StorSimple Inc +D4:F1:43 IPROAD.,Inc +CC:54:59 OnTime Networks AS +3C:B1:7F Wattwatchers Pty Ld +00:DB:45 THAMWAY CO.,LTD. +A0:23:1B TeleComp R&D Corp. +94:C4:E9 PowerLayer Microsystems HongKong Limited +88:43:E1 Cisco Systems, Inc +B4:ED:19 Pie Digital, Inc. +88:87:17 CANON INC. +E0:27:1A TTC Next-generation Home Network System WG +84:C7:27 Gnodal Ltd +E4:AB:46 UAB Selteka +D4:79:C3 Cameronet GmbH & Co. KG +94:5B:7E TRILOBIT LTDA. +E8:5B:5B LG ELECTRONICS INC +20:D9:06 Iota, Inc. +40:40:22 ZIV +74:F7:26 Neuron Robotics +18:FC:9F Changhe Electronics Co., Ltd. +A4:38:FC Plastic Logic +60:1D:0F Midnite Solar +50:A6:E3 David Clark Company +54:9A:16 Uzushio Electric Co.,Ltd. +40:01:C6 3COM EUROPE LTD +60:8D:17 Sentrus Government Systems Division, Inc +80:91:2A Lih Rong electronic Enterprise Co., Ltd. +80:38:FD LeapFrog Enterprises, Inc. +70:72:CF EdgeCore Networks +80:3B:9A ghe-ces electronic ag +9C:CD:82 CHENG UEI PRECISION INDUSTRY CO.,LTD +C8:AA:CC Private +00:3D:41 Hatteland Computer AS +08:76:18 ViE Technologies Sdn. Bhd. +A4:AD:00 Ragsdale Technology +2C:19:84 IDN Telecom, Inc. +38:63:F6 3NOD MULTIMEDIA(SHENZHEN)CO.,LTD +DC:E2:AC Lumens Digital Optics Inc. +98:D8:8C Nortel Networks +C8:87:3B Net Optics +B0:E9:7E Advanced Micro Peripherals +D4:4C:A7 Informtekhnika & Communication, LLC +20:2C:B7 Kong Yue Electronics & Information Industry (Xinhui) Ltd. +68:CC:9C Mine Site Technologies +04:B4:66 BSP Co., Ltd. +E4:1F:13 IBM Corp +00:27:1B Alec Sicherheitssysteme GmbH +00:27:18 Suzhou NEW SEAUNION Video Technology Co.,Ltd +00:27:0C Cisco Systems, Inc +00:27:0B Adura Technologies +00:27:05 Sectronic +00:27:06 YOISYS +00:26:F9 S.E.M. srl +00:26:F3 SMC Networks +68:85:40 IGI Mobile, Inc. +64:65:C0 Nuvon, Inc +F0:DE:71 Shanghai EDO Technologies Co.,Ltd. +28:FB:D3 Ragentek Technology Group +7C:1E:B3 2N TELEKOMUNIKACE a.s. +14:6E:0A Private +10:45:F8 LNT-Automation GmbH +64:4F:74 LENUS Co., Ltd. +78:7F:62 GiK mbH +D4:AA:FF MICRO WORLD +C4:FC:E4 DishTV NZ Ltd +0C:D7:C2 Axium Technologies, Inc. +40:F5:2E Leica Microsystems (Schweiz) AG +C0:22:50 Private +64:BC:11 CombiQ AB +40:97:D1 BK Electronics cc +68:AA:D2 DATECS LTD., +00:26:EC Legrand Home Systems, Inc +00:26:E6 Visionhitech Co., Ltd. +00:26:E0 ASITEQ +00:26:DA Universal Media Corporation /Slovakia/ s.r.o. +00:26:D3 Zeno Information System +00:26:D4 IRCA SpA +00:26:CD PurpleComm, Inc. +10:88:0F Daruma Telecomunicações e Informática S.A. +4C:4B:68 Mobile Device, Inc. +94:BA:31 Visiontec da Amazônia Ltda. +F4:5F:F7 DQ Technology Inc. +60:F1:3D JABLOCOM s.r.o. +0C:EF:7C AnaCom Inc +E0:8F:EC REPOTEC CO., LTD. +D0:D2:86 Beckman Coulter K.K. +1C:0F:CF Sypro Optics GmbH +00:25:AB AIO LCD PC BU / TPV +00:25:A4 EuroDesign embedded technologies GmbH +00:25:9D Private +00:25:98 Zhong Shan City Litai Electronic Industrial Co. Ltd +00:25:91 NEXTEK, Inc. +00:25:8C ESUS ELEKTRONIK SAN. VE DIS. TIC. LTD. STI. +00:25:87 Vitality, Inc. +00:25:81 x-star networks Inc. +00:25:82 Maksat Technologies (P) Ltd +00:25:78 JSC Concern Sozvezdie +00:25:7D PointRed Telecom Private Ltd. +00:25:77 D-BOX Technologies +00:25:71 Zhejiang Tianle Digital Electric Co.,Ltd +00:25:6A inIT - Institut Industrial IT +00:25:65 Vizimax Inc. +00:25:5E Shanghai Dare Technologies Co.,Ltd. +00:25:58 MPEDIA +00:26:35 Bluetechnix GmbH +00:26:2F HAMAMATSU TOA ELECTRONICS +00:26:23 JRD Communication Inc +00:26:28 companytec automação e controle ltda. +00:26:1C NEOVIA INC. +00:26:15 Teracom Limited +00:26:16 Rosemount Inc. +00:26:10 Apacewave Technologies +00:26:09 Phyllis Co., Ltd. +00:26:8C StarLeaf Ltd. +00:26:92 Mitsubishi Electric Co. +00:26:86 Quantenna Communcations, Inc. +00:26:80 SIL3 Pty.Ltd +00:26:7F Zenterio AB +00:26:7A wuhan hongxin telecommunication technologies co.,ltd +00:26:79 Euphonic Technologies, Inc. +00:26:73 RICOH COMPANY,LTD. +00:26:6D MobileAccess Networks +00:25:D6 The Kroger Co. +00:25:CA LS Research, LLC +00:25:BE Tektrap Systems Inc. +00:25:BD Italdata Ingegneria dell'Idea S.p.A. +00:25:B7 Costar electronics, inc., +00:25:B0 Schmartz Inc +00:25:46 Cisco Systems, Inc +00:25:45 Cisco Systems, Inc +00:25:35 Minimax GmbH & Co KG +00:25:32 Digital Recorders +00:25:2B Stirling Energy Systems +00:25:FD OBR Centrum Techniki Morskiej S.A. +00:26:03 Shenzhen Wistar Technology Co., Ltd +00:25:F3 Nordwestdeutsche Zählerrevision +00:25:EC Humanware +00:25:E2 Everspring Industry Co., Ltd. +00:25:DD SUNNYTEK INFORMATION CO., LTD. +00:26:67 CARECOM CO.,LTD. +00:26:60 Logiways +00:26:56 Sansonic Electronics USA +00:26:53 DaySequerra Corporation +00:26:4C Shanghai DigiVision Technology Co., Ltd. +00:26:47 WFE TECHNOLOGY CORP. +00:26:3B Onbnetech +00:26:C1 ARTRAY CO., LTD. +00:26:B5 ICOMM Tele Ltd +00:26:AF Duelco A/S +00:26:AB SEIKO EPSON CORPORATION +00:26:A5 MICROROBOT.CO.,LTD +00:26:9F Private +00:26:99 Cisco Systems, Inc +00:24:89 Vodafone Omnitel N.V. +00:24:8E Infoware ZRt. +00:24:82 Ruckus Wireless +00:24:76 TAP.tv +00:24:6F Onda Communication spa +00:24:6A Solid Year Co., Ltd. +00:23:FA RG Nets, Inc. +00:23:FF Beijing HTTC Technology Ltd. +00:23:F4 Masternaut +00:23:EA Cisco Systems, Inc +00:23:E4 IPnect co. ltd. +00:23:DE Ansync Inc. +00:23:D1 TRG +00:23:CB Shenzhen Full-join Technology Co.,Ltd +00:23:D2 Inhand Electronics, Inc. +00:24:B4 ESCATRONIC GmbH +00:24:AF EchoStar Technologies +00:24:AD Adolf Thies Gmbh & Co. KG +00:24:9C Bimeng Comunication System Co. Ltd +00:25:26 Genuine Technologies Co., Ltd. +00:25:25 CTERA Networks Ltd. +00:25:20 SMA Railway Technology GmbH +00:25:1B Philips CareServant +00:25:16 Integrated Design Tools, Inc. +00:25:0F On-Ramp Wireless, Inc. +00:25:03 IBM Corp +00:25:0A Security Expert Co. Ltd +00:24:DD Centrak, Inc. +00:24:D8 IlSung Precision +00:24:CC Fascinations Toys and Gifts, Inc. +00:24:D1 Thomson Inc. +00:24:CA Tobii Technology AB +00:24:C5 Meridian Audio Limited +00:24:B9 Wuhan Higheasy Electronic Technology Development Co.Ltd +00:24:25 Shenzhenshi chuangzhicheng Technology Co.,Ltd +00:24:19 Private +00:24:12 Benign Technologies Co, Ltd. +00:24:0C DELEC GmbH +00:24:06 Pointmobile +00:23:F9 Double-Take Software, INC. +00:24:63 Phybridge Inc +00:24:59 ABB Automation products GmbH +00:24:5E Hivision Co.,ltd +00:24:51 Cisco Systems, Inc +00:24:4C Solartron Metrology Ltd +00:24:45 CommScope Canada Inc. +00:24:3F Storwize, Inc. +00:24:40 Halo Monitoring, Inc. +00:24:3B CSSI (S) Pte Ltd +00:24:FC QuoPin Co., Ltd. +00:24:F7 Cisco Systems, Inc +00:24:F0 Seanodes +00:24:EB ClearPath Networks, Inc. +00:24:E4 Withings +00:24:35 WIDE CORPORATION +00:24:2F Micron +00:24:1F DCT-Delta GmbH +00:23:C5 Radiation Safety and Control Services Inc +00:23:C4 Lux Lumen +00:23:B8 Sichuan Jiuzhou Electronic Technology Co.,Ltd +00:23:BF Mainpine, Inc. +00:23:B2 Intelligent Mechatronic Systems Inc +00:23:AC Cisco Systems, Inc +00:23:A0 Hana CNS Co., LTD. +00:23:A5 SageTV, LLC +00:22:B6 Superflow Technologies Group +00:22:A3 California Eastern Laboratories +00:22:9E Social Aid Research Co., Ltd. +00:22:91 Cisco Systems, Inc +00:22:92 Cinetal +00:22:97 XMOS Semiconductor +00:22:8B Kensington Computer Products Group +00:22:84 DESAY A&V SCIENCE AND TECHNOLOGY CO.,LTD +00:22:7F Ruckus Wireless +00:22:77 NEC Australia Pty Ltd +00:22:6D Shenzhen GIEC Electronics Co., Ltd. +00:22:63 Koos Technical Services, Inc. +00:22:67 Nortel Networks +00:22:59 Guangzhou New Postcom Equipment Co.,Ltd. +00:22:E4 APASS TECHNOLOGY CO., LTD. +00:22:DD Protecta Electronics Ltd +00:22:D8 Shenzhen GST Security and Safety Technology Limited +00:22:D1 Albrecht Jung GmbH & Co. KG +00:22:C3 Zeeport Technology Inc. +00:22:C7 SEGGER Microcontroller GmbH & Co. KG +00:22:BD Cisco Systems, Inc +00:23:44 Objective Interface Systems, Inc. +00:23:43 TEM AG +00:23:37 Global Star Solutions ULC +00:23:2B IRD A/S +00:23:1C Fourier Systems Ltd. +00:23:1B Danaher Motion - Kollmorgen +00:23:9F Institut für Prüftechnik +00:23:93 AJINEXTEK +00:23:8F NIDEC COPAL CORPORATION +00:23:85 ANTIPODE +00:23:7E ELSTER GMBH +00:23:7F PLANTRONICS, INC. +00:23:79 Union Business Machines Co. Ltd. +00:22:53 Entorian Technologies +00:22:50 Point Six Wireless, LLC +00:22:49 HOME MULTIENERGY SL +00:22:4A RAYLASE AG +00:22:40 Universal Telecom S/A +00:22:2D SMC Networks Inc. +00:22:2E maintech GmbH +00:23:64 Power Instruments Pte Ltd +00:23:69 Cisco-Linksys, LLC +00:23:70 Snell +00:23:5D Cisco Systems, Inc +00:23:56 Packet Forensics LLC +00:23:4A Private +00:23:13 Qool Technologies Ltd. +00:23:0D Nortel Networks +00:23:01 Witron Technology Limited +00:22:F7 Conceptronic +00:22:EA Rustelcom Inc. +00:22:F0 3 Greens Aviation Limited +00:22:E9 ProVision Communications +00:21:1C Cisco Systems, Inc +00:21:17 Tellord +00:21:10 Clearbox Systems +00:21:06 RIM Testing Services +00:1F:FF Respironics, Inc. +00:1F:FE HPN Supply Chain +00:1F:F8 Siemens AG, Sector Industry, Drive Technologies, Motion Control Systems +00:1F:FD Indigo Mobile Technologies Corp. +00:22:21 ITOH DENKI CO,LTD. +00:22:1B Morega Systems +00:22:20 Mitac Technology Corp +00:22:27 uv-electronic GmbH +00:22:14 RINNAI KOREA +00:22:0E Indigo Security Co., Ltd. +00:22:08 Certicom Corp +00:22:01 Aksys Networks Inc +00:21:F7 HPN Supply Chain +00:21:A0 Cisco Systems, Inc +00:21:9C Honeywld Technology Corp. +00:21:92 Baoding Galaxy Electronic Technology Co.,Ltd +00:21:8C TopControl GMBH +00:21:7F Intraco Technology Pte Ltd +00:21:7A Sejin Electron, Inc. +00:21:79 IOGEAR, Inc. +00:21:73 Ion Torrent Systems, Inc. +00:1F:C3 SmartSynch, Inc +00:1F:C8 Up-Today Industrial Co., Ltd. +00:1F:C1 Hanlong Technology Co.,LTD +00:1F:C2 Jow Tong Technology Co Ltd +00:1F:BC EVGA Corporation +00:1F:B0 TimeIPS, Inc. +00:1F:B5 I/O Interconnect Inc. +00:1F:A9 Atlanta DTH, Inc. +00:21:F1 Tutus Data AB +00:21:F2 EASY3CALL Technology Limited +00:21:EB ESP SYSTEMS, LLC +00:21:E5 Display Solution AG +00:21:E4 I-WIN +00:21:DF Martin Christ GmbH +00:21:D8 Cisco Systems, Inc +00:21:CC Flextronics International +00:1F:F1 Paradox Hellas S.A. +00:1F:EC Synapse Électronique +00:1F:E5 In-Circuit GmbH +00:1F:D9 RSD Communications Ltd +00:1F:D4 4IPNET, INC. +00:1F:CF MSI Technology GmbH +00:21:3F A-Team Technology Ltd. +00:21:39 Escherlogic Inc. +00:21:34 Brandywine Communications +00:21:2F Phoebe Micro Inc. +00:21:29 Cisco-Linksys, LLC +00:21:2A Audiovox Corporation +00:21:23 Aerosat Avionics +00:21:6D Soltech Co., Ltd. +00:21:6C ODVA +00:21:67 HWA JIN T&I Corp. +00:21:60 Hidea Solutions Co. Ltd. +00:21:54 D-TACQ Solutions Ltd +00:21:4D Guangzhou Skytone Transmission Technology Com. Ltd. +00:21:48 Kaco Solar Korea +00:21:C5 3DSP Corp +00:21:BF Hitachi High-Tech Control Systems Corporation +00:21:C0 Mobile Appliance, Inc. +00:21:B9 Universal Devices Inc. +00:21:B3 Ross Controls +00:21:B2 Fiberblaze A/S +00:21:AD Nordic ID Oy +00:21:A6 Videotec Spa +00:1F:11 OPENMOKO, INC. +00:1F:0B Federal State Unitary Enterprise Industrial UnionElectropribor +00:1E:FF Mueller-Elektronik GmbH & Co. KG +00:1F:06 Integrated Dispatch Solutions +00:1F:05 iTAS Technology Corp. +00:1E:F3 From2 +00:1E:F8 Emfinity Inc. +00:1F:7A WiWide Inc. +00:1F:70 Botik Technologies LTD +00:1F:75 GiBahn Media +00:1F:64 Beijing Autelan Technology Inc. +00:1F:5E Dyna Technology Co.,Ltd. +00:1F:58 EMH Energiemesstechnik GmbH +00:1F:4C Roseman Engineering Ltd +00:1F:51 HD Communications Corp +00:1F:4B Lineage Power +00:1F:9F Thomson Telecom Belgium +00:1F:93 Xiotech Corporation +00:1F:98 DAIICHI-DENTSU LTD. +00:1F:8C CCS Inc. +00:1F:8A Ellion Digital Inc. +00:1F:83 Teleplan Technology Services Sdn Bhd +00:1E:30 Shireen Inc +00:1E:2B Radio Systems Design, Inc. +00:1E:24 Zhejiang Bell Technology Co.,ltd +00:1E:18 Radio Activity srl +00:1E:1D East Coast Datacom, Inc. +00:1E:1E Honeywell Life Safety +00:1E:13 Cisco Systems, Inc +00:1E:0E MAXI VIEW HOLDINGS LIMITED +00:1E:60 Digital Lighting Systems, Inc +00:1E:59 Silicon Turnkey Express, LLC +00:1E:54 TOYO ELECTRIC Corporation +00:1E:4D Welkin Sciences, LLC +00:1E:48 Wi-Links +00:1E:43 AISIN AW CO.,LTD. +00:1E:3E KMW Inc. +00:1E:C3 Kozio, Inc. +00:1E:BC WINTECH AUTOMATION CO.,LTD. +00:1E:B7 TBTech, Co., Ltd. +00:1E:B0 ImesD Electronica S.L. +00:1E:A5 ROBOTOUS, Inc. +00:1E:AB TeleWell Oy +00:1E:9E ddm hopt + schuler Gmbh + Co. KG +00:1E:99 Vantanol Industrial Corporation +00:1F:36 Bellwin Information Co. Ltd., +00:1F:35 AIR802 LLC +00:1F:30 Travelping +00:1F:23 Interacoustics +00:1F:24 DIGITVIEW TECHNOLOGY CO., LTD. +00:1F:1D Atlas Material Testing Technology LLC +00:1E:92 JEULIN S.A. +00:1E:89 CRFS Limited +00:1E:84 Pika Technologies Inc. +00:1E:83 LAN/MAN Standards Association (LMSC) +00:1E:6C Opaque Systems +00:1E:E6 Shenzhen Advanced Video Info-Tech Co., Ltd. +00:1E:E0 Urmet Domus SpA +00:1E:DB Giken Trastem Co., Ltd. +00:1E:D6 Alentec & Orion AB +00:1E:CF PHILIPS ELECTRONICS UK LTD +00:1C:96 Linkwise Technology Pte Ltd +00:1C:91 Gefen Inc. +00:1C:8A Cirrascale Corporation +00:1C:84 STL Solution Co.,Ltd. +00:1C:80 New Business Division/Rhea-Information CO., LTD. +00:1C:76 The Wandsworth Group Ltd +00:1C:6F Emfit Ltd +00:1C:71 Emergent Electronics +00:1C:70 NOVACOMM LTDA +00:1C:6A Weiss Engineering Ltd. +00:1D:59 Mitra Energy & Infrastructure +00:1D:52 Defzone B.V. +00:1D:4C Alcatel-Lucent +00:1D:48 Sensor-Technik Wiedemann GmbH +00:1D:41 Hardy Instruments +00:1D:3C Muscle Corporation +00:1D:30 YX Wireless S.A. +00:1D:35 Viconics Electronics Inc. +00:1D:2F QuantumVision Corporation +00:1C:D3 ZP Engineering SEL +00:1C:CE By Techdesign +00:1C:C7 Rembrandt Technologies, LLC d/b/a REMSTREAM +00:1C:C2 Part II Research, Inc. +00:1C:BB MusicianLink +00:1C:B1 Cisco Systems, Inc +00:1C:B7 USC DigiArk Corporation +00:1C:A3 Terra +00:1C:A5 Zygo Corporation +00:1C:AA Bellon Pty Ltd +00:1C:9D Liecthi AG +00:1D:CA PAV Electronics Limited +00:1D:C4 AIOI Systems Co., Ltd. +00:1D:C3 RIKOR TV, Ltd +00:1D:B1 Crescendo Networks +00:1D:B2 HOKKAIDO ELECTRIC ENGINEERING CO.,LTD. +00:1D:B7 Tendril Networks, Inc. +00:1D:AD Sinotech Engineering Consultants, Inc. Geotechnical Enginee +00:1D:A8 Takahata Electronics Co.,Ltd +00:1D:A7 Seamless Internet +00:1D:A1 Cisco Systems, Inc +00:1D:9A GODEX INTERNATIONAL CO., LTD +00:1D:95 Flash, Inc. +00:1D:8E Alereon, Inc. +00:1D:87 VigTech Labs Sdn Bhd +00:1D:88 Clearwire +00:1D:7E Cisco-Linksys, LLC +00:1D:7D GIGA-BYTE TECHNOLOGY CO.,LTD. +00:1D:6C ClariPhy Communications, Inc. +00:1D:71 Cisco Systems, Inc +00:1D:78 Invengo Information Technology Co.,Ltd +00:1D:65 Microwave Radio Communications +00:1D:5E COMING MEDIA CORP. +00:1D:29 Doro AB +00:1D:22 Foss Analytical A/S +00:1D:1D Inter-M Corporation +00:1D:16 SFR +00:1D:10 LightHaus Logic, Inc. +00:1D:0A Davis Instruments, Inc. +00:1D:03 Design Solutions Inc. +00:1C:FE Quartics Inc +00:1C:F7 AudioScience +00:1C:E6 INNES +00:1C:E1 INDRA SISTEMAS, S.A. +00:1C:DA Exegin Technologies Limited +00:1E:07 Winy Technology Co., Ltd. +00:1E:02 Sougou Keikaku Kougyou Co.,Ltd. +00:1E:01 Renesas Technology Sales Co., Ltd. +00:1D:FB NETCLEUS Systems Corporation +00:1D:F4 Magellan Technology Pty Limited +00:1D:EF TRIMM, INC. +00:1D:E8 Nikko Denki Tsushin Corporation(NDTC) +00:1D:E3 Intuicom +00:1D:DD DAT H.K. LIMITED +00:1A:F8 Copley Controls Corporation +00:1A:F3 Samyoung Electronics +00:1A:EE Shenztech Ltd +00:1A:E2 Cisco Systems, Inc +00:1A:E7 Aztek Networks, Inc. +00:1A:D4 iPOX Technology Co., Ltd. +00:1A:D6 JIAGNSU AETNA ELECTRIC CO.,LTD +00:1B:97 Violin Technologies +00:1B:9C SATEL sp. z o.o. +00:1B:90 Cisco Systems, Inc +00:1B:86 Bosch Access Systems GmbH +00:1B:8B NEC Platforms, Ltd. +00:1B:7F TMN Technologies Telecomunicacoes Ltda +00:1B:81 DATAQ Instruments, Inc. +00:1B:80 LORD Corporation +00:1B:73 DTL Broadcast Ltd +00:1B:6E Anue Systems, Inc. +00:1B:67 Cisco Systems Inc +00:1B:60 NAVIGON AG +00:1B:54 Cisco Systems, Inc +00:1B:48 Shenzhen Lantech Electronics Co., Ltd. +00:1B:4D Areca Technology Corporation +00:1B:41 General Infinity Co.,Ltd. +00:1B:3C Software Technologies Group,Inc. +00:1B:35 ChongQing JINOU Science & Technology Development CO.,Ltd +00:1B:2E Sinkyo Electron Inc +00:1B:30 Solitech Inc. +00:1B:C7 StarVedia Technology Inc. +00:1B:C6 Strato Rechenzentrum AG +00:1B:BB RFTech Co.,Ltd +00:1B:B6 Bird Electronic Corp. +00:1B:AA XenICs nv +00:1B:A3 Flexit Group GmbH +00:1C:63 TRUEN +00:1C:57 Cisco Systems, Inc +00:1C:5E ASTON France +00:1C:46 QTUM +00:1C:3A Element Labs, Inc. +00:1C:41 scemtec Transponder Technology GmbH +00:1C:34 HUEY CHIAO INTERNATIONAL CO., LTD. +00:1C:33 Sutron +00:1B:F7 Lund IP Products AB +00:1B:F9 Intellitect Water Ltd +00:1B:F8 Digitrax Inc. +00:1B:F2 KWORLD COMPUTER CO., LTD +00:1B:EB DMP Electronics INC. +00:1B:E6 VR AG +00:1B:DF Iskra Sistemi d.d. +00:1B:D3 Panasonic Corp. AVC Company +00:1B:D8 DVTel LTD +00:1B:CC KINGTEK CCTV ALLIANCE CO., LTD. +00:1A:C8 ISL (Instrumentation Scientifique de Laboratoire) +00:1A:CF C.T. ELETTRONICA +00:1A:C3 Scientific-Atlanta, Inc +00:1A:B9 PMC +00:1A:BE COMPUTER HI-TECH INC. +00:1A:AB eWings s.r.l. +00:1A:B2 Cyber Solutions Inc. +00:1A:B7 Ethos Networks LTD. +00:1C:2E HPN Supply Chain +00:1C:27 Sunell Electronics Co. +00:1C:22 Aeris Elettronica s.r.l. +00:1C:1D CHENZHOU GOSPELL DIGITAL TECHNOLOGY CO.,LTD +00:1C:18 Sicert S.r.L. +00:1C:0A Shenzhen AEE Technology Co.,Ltd. +00:1C:05 Nonin Medical Inc. +00:1B:FE Zavio Inc. +00:1B:29 Avantis.Co.,Ltd +00:1B:23 SimpleComTools +00:1B:1E HART Communication Foundation +00:1B:12 Apprion +00:1B:17 Palo Alto Networks +00:1B:0B Phidgets Inc. +00:1B:10 ShenZhen Kang Hui Technology Co.,ltd +00:1B:04 Affinity International S.p.a +00:1A:FF Wizyoung Tech. +00:1A:FD EVOLIS +00:19:1C Sensicast Systems +00:19:1E Beyondwiz Co., Ltd. +00:19:23 Phonex Korea Co., LTD. +00:19:2A Antiope Associates +00:19:10 Knick Elektronische Messgeraete GmbH & Co. KG +00:19:17 Posiflex Inc. +00:19:09 DEVI - Danfoss A/S +00:19:0B Southern Vision Systems, Inc. +00:19:04 WB Electronics Sp. z o.o. +00:18:FF PowerQuattro Co. +00:18:FA Yushin Precision Equipment Co.,Ltd. +00:19:55 Cisco Systems, Inc +00:19:4E Ultra Electronics - TCS (Tactical Communication Systems) +00:19:50 Harman Multimedia +00:19:49 TENTEL COMTECH CO., LTD. +00:19:42 ON SOFTWARE INTERNATIONAL LIMITED +00:19:3D GMC Guardian Mobility Corp. +00:19:36 STERLITE OPTICAL TECHNOLOGIES LIMITED +00:19:3B Wilibox Deliberant Group LLC +00:19:2F Cisco Systems, Inc +00:1A:20 CMOTECH Co. Ltd. +00:1A:22 eQ-3 Entwicklung GmbH +00:1A:14 Xin Hua Control Engineering Co.,Ltd. +00:1A:0D HandHeld entertainment, Inc. +00:1A:0F Sistemas Avanzados de Control, S.A. +00:1A:08 Simoco Ltd. +00:1A:01 Smiths Medical +00:19:FC PT. Ufoakses Sukses Luarbiasa +00:19:EF SHENZHEN LINNKING ELECTRONICS CO.,LTD +00:19:F1 Star Communication Network Technology Co.,Ltd +00:19:F6 Acconet (PTE) Ltd +00:1A:76 SDT information Technology Co.,LTD. +00:1A:6F MI.TEL s.r.l. +00:1A:6A Tranzas, Inc. +00:1A:63 Elster Solutions, LLC, +00:1A:5E Thincom Technology Co.,Ltd +00:1A:57 Matrix Design Group, LLC +00:1A:5C Euchner GmbH+Co. KG +00:1A:50 PheeNet Technology Corp. +00:1A:9D Skipper Wireless, Inc. +00:1A:A2 Cisco Systems, Inc +00:1A:91 FusionDynamic Ltd. +00:1A:96 ECLER S.A. +00:1A:90 Trópico Sistemas e Telecomunicações da Amazônia LTDA. +00:1A:8C Sophos Ltd +00:1A:85 NV Michel Van de Wiele +00:1A:87 Canhold International Limited +00:1A:86 AdvancedIO Systems Inc +00:19:B5 Famar Fueguina S.A. +00:19:BA Paradox Security Systems Ltd +00:19:A2 ORDYN TECHNOLOGIES +00:19:AE Hopling Technologies b.v. +00:19:A7 ITU-T +00:19:96 TurboChef Technologies Inc. +00:19:9B Diversified Technical Systems, Inc. +00:19:91 avinfo +00:19:8A Northrop Grumman Systems Corp. +00:19:8C iXSea +00:19:85 IT Watchdogs, Inc +00:19:6B Danpex Corporation +00:19:66 Asiarock Technology Limited +00:19:5C Innotech Corporation +00:19:61 Blaupunkt Embedded Systems GmbH +00:19:DE MOBITEK +00:19:EA TeraMage Technologies Co., Ltd. +00:19:D0 Cathexis +00:19:D7 FORTUNETEK CO., LTD +00:19:B3 Stanford Research Systems +00:1A:44 JWTrading Co., Ltd +00:1A:49 Micro Vision Co.,LTD +00:1A:3D Ajin Vision Co.,Ltd +00:1A:31 SCAN COIN Industries AB +00:1A:38 Sanmina-SCI +00:1A:2C SATEC Co.,LTD +00:1A:27 Ubistar +00:17:AE GAI-Tronics +00:17:A2 Camrivox Ltd. +00:17:A7 Mobile Computing Promotion Consortium +00:17:9D Kelman Limited +00:17:91 LinTech GmbH +00:17:96 Rittmeyer AG +00:17:98 Azonic Technology Co., LTD +00:17:8A DARTS TECHNOLOGIES CORP. +00:17:7E Meshcom Technologies Inc. +00:17:85 Sparr Electronics Ltd +00:18:09 CRESYN +00:18:0E Avega Systems +00:18:10 IPTrade S.A. +00:17:F6 Pyramid Meriden Inc. +00:17:FB FA +00:17:FD Amulet Hotkey +00:17:EF IBM Corp +00:17:D7 ION Geophysical Corporation Inc. +00:17:DC DAEMYUNG ZERO1 +00:17:DE Advantage Six Ltd +00:18:C3 CS Corporation +00:18:CA Viprinet GmbH +00:18:BE ANSA Corporation +00:18:B2 ADEUNIS RF +00:18:B7 D3 LED, LLC +00:18:AB BEIJING LHWT MICROELECTRONICS INC. +00:18:A6 Persistent Systems, LLC +00:18:95 Hansun Technologies Inc. +00:18:9A HANA Micron Inc. +00:18:E7 Cameo Communications, INC. +00:18:EE Videology Imaging Solutions, Inc. +00:18:E2 Topdata Sistemas de Automacao Ltda +00:18:DB EPL Technology Ltd +00:18:E0 ANAVEO +00:18:CF Baldor Electric Company +00:18:D4 Unified Display Interface SIG +00:18:4A Catcher, Inc. +00:18:4C Bogen Communications +00:18:45 Pulsar-Telecom LLC. +00:18:3E Digilent, Inc +00:18:28 e2v technologies (UK) ltd. +00:18:2D Artec Design +00:18:21 SINDORICOH +00:18:15 GZ Technologies, Inc. +00:18:1C Exterity Limited +00:17:72 ASTRO Strobel Kommunikationssysteme GmbH +00:17:77 Obsidian Research Corporation +00:17:6E DUCATI SISTEMI +00:17:62 Solar Technology, Inc. +00:17:69 Cymphonix Corp +00:17:5D Dongseo system. +00:17:5B ACS Solutions Switzerland Ltd. +00:17:56 Vinci Labs Oy +00:17:4F iCatch Inc. +00:17:CD CEC Wireless R&D Ltd. +00:17:D2 THINLINX PTY LTD +00:17:C6 Cross Match Technologies Inc +00:17:BA SEDO CO., LTD. +00:17:BF Coherent Research Limited +00:17:C1 CM Precision Technology LTD. +00:17:B3 Aftek Infosys Limited +00:18:6A Global Link Digital Technology Co,.LTD +00:18:6F Setha Industria Eletronica LTDA +00:18:76 WowWee Ltd. +00:18:69 KINGJIM +00:18:64 Eaton Corporation +00:18:5D TAIGUEN TECHNOLOGY (SHEN-ZHEN) CO., LTD. +00:18:51 SWsoft +00:18:58 TagMaster AB +00:18:9F Lenntek Corporation +00:18:8E Ekahau, Inc. +00:18:87 Metasystem SpA +00:18:89 WinNet Solutions Limited +00:18:7B 4NSYS Co. Ltd. +00:16:61 Novatium Solutions (P) Ltd +00:16:63 KBT Mobile +00:16:68 Eishin Electronics +00:16:62 Liyuh Technology Ltd. +00:16:5C Trackflow Ltd +00:16:55 FUHO TECHNOLOGY Co., LTD +00:16:50 Herley General Microwave Israel. +00:15:E4 Zimmer Elektromedizin +00:15:DA IRITEL A.D. +00:15:DF Clivet S.p.A. +00:15:D3 Pantech&Curitel Communications, Inc. +00:15:C7 Cisco Systems, Inc +00:15:C0 DIGITAL TELEMEDIA CO.,LTD. +00:15:BA iba AG +00:17:4A SOCOMEC +00:17:43 Deck Srl +00:17:3D Neology +00:17:3E LeucotronEquipamentos Ltda. +00:17:38 International Business Machines +00:17:2C TAEJIN INFOTECH +00:17:20 Image Sensing Systems, Inc. +00:17:25 Liquid Computing +00:17:01 KDE, Inc. +00:17:03 MOSDAN Internation Co.,Ltd +00:16:FC TOHKEN CO.,LTD. +00:16:F0 Dell +00:16:F5 Dalian Golden Hualu Digital Technology Co.,Ltd +00:16:E9 Tiba Medical Inc +00:16:E4 VANGUARD SECURITY ENGINEERING CORP. +00:16:DD Gigabeam Corporation +00:16:E2 American Fibertek, Inc. +00:16:D8 Senea AB +00:16:9C Cisco Systems, Inc +00:16:9E TV One Ltd +00:16:A3 Ingeteam Transmission&Distribution, S.A. +00:16:90 J-TEK INCORPORATION +00:16:97 NEC Corporation +00:16:89 Pilkor Electronics Co., Ltd +00:16:8B Paralan Corporation +00:16:84 Donjin Co.,Ltd. +00:16:7D Sky-Line Information Co., Ltd. +00:16:78 SHENZHEN BAOAN GAOKE ELECTRONICS CO., LTD +00:16:49 SetOne GmbH +00:16:3F CReTE SYSTEMS Inc. +00:16:38 TECOM Co., Ltd. +00:16:33 Oxford Diagnostics Ltd. +00:16:2C Xanboo +00:16:27 embedded-logic DESIGN AND MORE GmbH +00:16:19 Lancelan Technologies S.L. +00:16:14 Picosecond Pulse Labs +00:17:19 Audiocodes USA, Inc +00:17:1E Theo Benning GmbH & Co. KG +00:17:12 ISCO International +00:17:0D Dust Networks Inc. +00:16:0F BADGER METER INC +00:16:0A SWEEX Europe BV +00:16:03 COOLKSKY Co., LTD +00:15:FC Littelfuse Startco +00:15:F7 Wintecronics Ltd. +00:15:F0 EGO BV +00:15:EA Tellumat (Pty) Ltd +00:16:C5 Shenzhen Xing Feng Industry Co.,Ltd +00:16:C7 Cisco Systems, Inc +00:16:CC Xcute Mobile Corp. +00:16:C0 Semtech Corporation +00:16:B4 Private +00:16:A8 CWT CO., LTD. +00:16:AD BT-Links Company Limited +00:15:53 Cytyc Corporation +00:15:55 DFM GmbH +00:15:4E IEC +00:15:47 AiZen Solutions Inc. +00:15:42 MICROHARD S.R.L. +00:15:3B EMH metering GmbH & Co. KG +00:15:34 A Beltrónica-Companhia de Comunicações, Lda +00:14:40 ATOMIC Corporation +00:14:39 Blonder Tongue Laboratories, Inc. +00:14:34 Keri Systems, Inc +00:14:2D Toradex AG +00:14:26 NL Technology +00:14:21 Total Wireless Technologies Pte. Ltd. +00:14:1C Cisco Systems, Inc +00:15:83 IVT corporation +00:15:7E Weidmüller Interface GmbH & Co. KG +00:15:79 Lunatone Industrielle Elektronik GmbH +00:15:74 Horizon Semiconductors Ltd. +00:15:66 A-First Technology Co., Ltd. +00:15:61 JJPlus Corporation +00:15:5A DAINIPPON PHARMACEUTICAL CO., LTD. +00:15:54 Atalum Wireless S.A. +00:15:28 Beacon Medical Products LLC d.b.a. BeaconMedaes +00:15:21 Horoquartz +00:15:23 Meteor Communications Corporation +00:15:22 Dea Security +00:15:1C LENECO +00:15:12 Zurich University of Applied Sciences +00:15:0B SAGE INFOTECH LTD. +00:15:06 Neo Photonics +00:14:FF Precise Automation, Inc. +00:14:F8 Scientific Atlanta +00:14:F3 ViXS Systems Inc +00:14:E7 Stolinx,. Inc +00:14:EC Acro Telecom +00:14:E2 datacom systems inc. +00:14:D6 Jeongmin Electronics Co.,Ltd. +00:14:DB Elma Trenew Electronic GmbH +00:14:DD Covergence Inc. +00:14:DC Communication System Design & Manufacturing (CSDM) +00:14:CF INVISIO Communications +00:14:CA Key Radio Systems Limited +00:14:C3 Seagate Technology +00:14:BC SYNECTIC TELECOM EXPORTS PVT. LTD. +00:14:B7 AR Infotek Inc. +00:14:AD Gassner Wiege- und Meßtechnik GmbH +00:14:B2 mCubelogics Corporation +00:14:A6 Teranetics, Inc. +00:14:9F System and Chips, Inc. +00:14:A1 Synchronous Communication Corp +00:14:70 Prokom Software SA +00:14:69 Cisco Systems, Inc +00:14:62 Digiwell Technology, inc +00:14:5D WJ Communications, Inc. +00:14:50 Heim Systems GmbH +00:14:56 Edge Products +00:14:4C General Meters Corp. +00:14:45 Telefon-Gradnja d.o.o. +00:14:47 BOAZ Inc. +00:14:46 SuperVision Solutions LLC +00:15:B3 Caretech AB +00:15:A9 KWANG WOO I&C CO.,LTD +00:15:9D Tripp Lite +00:15:91 RLW Inc. +00:15:8A SURECOM Technology Corp. +00:15:8F NTT Advanced Technology Corporation +00:15:90 Hectronic GmbH +00:14:A0 Accsense, Inc. +00:14:93 Systimax Solutions +00:14:8E Tele Power Inc. +00:14:87 American Technology Integrators +00:14:82 Aurora Networks +00:14:81 Multilink Inc +00:14:7C 3Com Ltd +00:14:75 Wiline Networks, Inc. +00:12:E7 Projectek Networking Electronics Corp. +00:12:E8 Fraunhofer IMS +00:12:DB ZIEHL industrie-elektronik GmbH + Co KG +00:12:E2 ALAXALA Networks Corporation +00:12:D6 Jiangsu Yitong High-Tech Co.,Ltd +00:12:D5 Motion Reality Inc. +00:12:C3 WIT S.A. +00:13:E5 TENOSYS, INC. +00:13:EA Kamstrup A/S +00:13:DE Adapt4, LLC +00:13:D7 SPIDCOM Technologies SA +00:13:D8 Princeton Instruments +00:13:CF 4Access Communications +00:13:D2 PAGE IBERICA, S.A. +00:13:C9 Beyond Achieve Enterprises Ltd. +00:13:C2 WACOM Co.,Ltd +00:13:BD HYMATOM SA +00:13:B8 RyCo Electronic Systems Limited +00:13:4E Valox Systems, Inc. +00:13:53 HYDAC Filtertechnik GMBH +00:13:4D Inepro BV +00:13:47 Red Lion Controls, LP +00:13:3B Speed Dragon Multimedia Limited +00:13:40 AD.EL s.r.l. +00:13:2E ITian Coporation +00:13:28 Westech Korea Inc., +00:13:2D iWise Communications +00:13:34 Arkados, Inc. +00:13:B3 Ecom Communications Technology Co., Ltd. +00:13:AC Sunmyung Electronics Co., LTD +00:13:A6 Extricom Ltd +00:13:A5 General Solutions, LTD. +00:13:A0 ALGOSYSTEM Co., Ltd. +00:13:99 STAC Corporation. +00:13:93 Panta Systems, Inc. +00:13:94 Infohand Co.,Ltd +00:13:8D Kinghold +00:12:C8 Perfect tech +00:12:B9 Fusion Digital Technology +00:12:BE Astek Corporation +00:12:AC ONTIMETEK INC. +00:12:AB WiLife, Inc. +00:12:B2 AVOLITES LTD. +00:12:A6 Dolby Australia +00:13:78 Qsan Technology, Inc. +00:13:7D Dynalab, Inc. +00:13:84 Advanced Motion Controls +00:13:7E CorEdge Networks, Inc. +00:13:6C TomTom +00:13:6B E-TEC +00:13:59 ProTelevision Technologies A/S +00:13:5E EAB/RWI/K +00:12:9F RAE Systems +00:12:99 Ktech Telecommunications Inc +00:12:9A IRT Electronics Pty Ltd +00:12:8C Woodward Governor +00:12:93 GE Energy +00:12:87 Digital Everywhere Unterhaltungselektronik GmbH +00:12:80 Cisco Systems, Inc +00:13:1E Peiker acustic GmbH & Co. KG +00:13:23 Cap Co., Ltd. +00:13:0B Mextal B.V. +00:13:12 Amedia Networks Inc. +00:12:F8 WNI Resources, LLC +00:12:FF Lely Industries N.V. +00:13:04 Flaircomm Technologies Co. LTD +00:14:10 Suzhou Keda Technology CO.,Ltd +00:14:17 RSE Informations Technologie GmbH +00:14:08 Eka Systems Inc. +00:14:02 kk-electronic a/s +00:14:01 Rivertree Networks Corp. +00:13:FB RKC INSTRUMENT INC. +00:13:F4 Psitek (Pty) Ltd +00:13:EF Kingjon Digital Technology Co.,Ltd +00:11:F7 Shenzhen Forward Industry Co., Ltd +00:11:F2 Institute of Network Technologies +00:11:EB Innovative Integration +00:11:E6 Scientific Atlanta +00:11:E5 KCodes Corporation +00:11:DF Current Energy +00:11:D3 NextGenTel Holding ASA +00:11:0E Tsurusaki Sealand Transportation Co. Ltd. +00:11:15 EPIN Technologies, Inc. +00:11:14 EverFocus Electronics Corp. +00:11:07 RGB Networks Inc. +00:11:08 Orbital Data Corporation +00:11:02 Aurora Multimedia Corp. +00:0F:FC Merit Li-Lin Ent. +00:0F:DA YAZAKI CORPORATION +00:0F:F3 Jung Myoung Communications&Technology +00:11:A2 Manufacturing Technology Inc +00:11:9B Telesynergy Research Inc. +00:11:8C Missouri Department of Transportation +00:11:91 CTS-Clima Temperatur Systeme GmbH +00:11:8B Alcatel-Lucent, Enterprise Business Group +00:11:96 Actuality Systems, Inc. +00:11:7E Progeny, A division of Midmark Corp +00:11:79 Singular Technology Co. Ltd. +00:11:72 COTRON CORPORATION +00:11:66 Taelim Electronics Co., Ltd. +00:11:6B Digital Data Communications Asia Co.,Ltd +00:11:6C Nanwang Multimedia Inc.,Ltd +00:11:62 STAR MICRONICS CO.,LTD. +00:11:61 NetStreams, LLC +00:11:55 Sevis Systems +00:11:5C Cisco Systems, Inc +00:11:47 Secom-Industry co.LTD. +00:11:4C caffeina applied research ltd. +00:12:74 NIT lab +00:12:7A Sanyu Industry Co.,Ltd. +00:12:6D University of California, Berkeley +00:12:68 IPS d.o.o. +00:12:67 Panasonic Corporation +00:12:61 Adaptix, Inc +00:12:57 LeapComm Communication Technologies Inc. +00:12:22 Skardin (UK) Ltd +00:12:27 Franklin Electric Co., Inc. +00:12:1B Sound Devices, LLC +00:12:21 B.Braun Melsungen AG +00:12:14 Koenig & Bauer AG +00:12:0F IEEE 802.3 +00:12:08 Gantner Instruments GmbH +00:12:01 Cisco Systems, Inc +00:12:02 Decrane Aerospace - Audio International Inc. +00:11:C7 Raymarine UK Ltd +00:11:CC Guangzhou Jinpeng Group Co.,Ltd. +00:11:B5 Shenzhen Powercom Co.,Ltd +00:11:BA Elexol Pty Ltd +00:11:C1 4P MOBILE DATA PROCESSING +00:11:A8 Quest Technologies +00:11:A7 Infilco Degremont Inc. +00:12:50 Tokyo Aircaft Instrument Co., Ltd. +00:12:4B Texas Instruments +00:12:44 Cisco Systems, Inc +00:12:38 SetaBox Technology Co., Ltd. +00:12:3D GES Co, Ltd +00:12:3E ERUNE technology Co., Ltd. +00:12:2C Soenen Controls N.V. +00:12:31 Motion Control Systems, Inc. +00:11:46 Telecard-Pribor Ltd +00:11:40 Nanometrics Inc. +00:11:39 STOEBER ANTRIEBSTECHNIK GmbH + Co. KG. +00:11:3A SHINBORAM +00:11:34 MediaCell, Inc. +00:11:27 TASI, Inc +00:11:2A Niko NV +00:11:21 Cisco Systems, Inc +00:0E:BB Everbee Networks +00:0E:B4 GUANGZHOU GAOKE COMMUNICATIONS TECHNOLOGY CO.LTD. +00:0E:AE GAWELL TECHNOLOGIES CORP. +00:0E:A8 United Technologists Europe Limited +00:0E:AD Metanoia Technologies, Inc. +00:0E:A1 Formosa Teletek Corporation +00:0E:9C Benchmark Electronics +00:0E:9B Ambit Microsystems Corporation +00:0E:8E SparkLAN Communications, Inc. +00:0E:95 Fujiya Denki Seisakusho Co.,Ltd. +00:0F:C1 WAVE Corporation +00:0F:C8 Chantry Networks +00:0F:C7 Dionica R&D Ltd. +00:0F:BA Tevebox AB +00:0F:A7 Raptor Networks Technology +00:0F:AE E2O Communications +00:0F:A8 Photometrics, Inc. +00:0F:9A Synchrony, Inc. +00:0F:A2 2xWireless +00:0E:89 CLEMATIC +00:0E:82 Commtech Wireless +00:0E:7C Televes S.A. +00:0E:76 GEMSOC INNOVISION INC. +00:0E:6E MAT S.A. (Mircrelec Advanced Technology) +00:0E:72 CTS electronics +00:0E:68 E-TOP Network Technology Inc. +00:0E:67 Eltis Microelectronics Ltd. +00:0F:E7 Lutron Electronics Co., Inc. +00:0F:EC ARKUS Inc. +00:0F:E0 NComputing Co.,Ltd. +00:0F:D4 Soundcraft +00:0F:D9 FlexDSL Telecommunications AG +00:0E:EA Shadong Luneng Jicheng Electronics,Co.,Ltd +00:0E:DD SHURE INCORPORATED +00:0E:E4 BOE TECHNOLOGY GROUP CO.,LTD +00:0E:D8 Positron Access Solutions Corp +00:0E:CD SKOV A/S +00:0E:CE S.I.T.T.I. S.p.A. +00:0E:D3 Epicenter, Inc. +00:0E:C7 Motorola Korea +00:0F:93 Landis+Gyr Ltd. +00:0F:94 Genexis BV +00:0F:8E DONGYANG TELECOM CO.,LTD. +00:0F:87 Maxcess International +00:0F:82 Mortara Instrument, Inc. +00:0F:81 PAL Pacific Inc. +00:0F:74 Qamcom Technology AB +00:0F:7B Arce Sistemas, S.A. +00:0F:68 Vavic Network Technology, Inc. +00:0F:6F FTA Communication Technologies +00:0F:62 Alcatel Bell Space N.V. +00:0F:5C Day One Digital Media Limited +00:0F:55 Datawire Communication Networks Inc. +00:0F:49 Northover Solutions Limited +00:0F:50 StreamScale Limited +00:0F:42 Xalyo Systems +00:0F:1C DigitAll World Co., Ltd +00:0F:0A Clear Edge Networks +00:0F:09 Private +00:0F:03 COM&C CO., LTD +00:0E:F7 Vulcan Portals Inc +00:0E:FC JTAG Technologies B.V. +00:0E:E9 WayTech Development, Inc. +00:0E:F0 Festo AG & Co. KG +00:0F:4F Cadmus Technology Ltd +00:0F:35 Cisco Systems, Inc +00:0F:2E Megapower International Corp. +00:0F:29 Augmentix Corporation +00:0F:22 Helius, Inc. +00:0F:0F Real ID Technology Co., Ltd. +00:0F:16 JAY HOW TECHNOLOGY CO., +00:0F:1B Ego Systems Inc. +00:0D:74 Sand Network Systems, Inc. +00:0D:7B Consensys Computers Inc. +00:0D:6E K-Patents Oy +00:0D:68 Vinci Systems, Inc. +00:0D:6D K-Tech Devices Corp. +00:0D:5B Smart Empire Investments Limited +00:0D:5C Robert Bosch GmbH, VT-ATMO +00:0D:61 Giga-Byte Technology Co., Ltd. +00:0D:55 SANYCOM Technology Co.,Ltd +00:0D:49 Triton Systems of Delaware, Inc. +00:0D:4E NDR Co.,LTD. +00:0E:5B ParkerVision - Direct2Data +00:0E:55 AUVITRAN +00:0E:56 4G Systems GmbH & Co. KG +00:0E:4F Trajet GmbH +00:0E:48 Lipman TransAction Solutions +00:0E:43 G-Tek Electronics Sdn. Bhd. +00:0E:34 NexGen City, LP +00:0E:3B Hawking Technologies, Inc. +00:0E:2F Roche Diagnostics GmbH +00:0D:FB Komax AG +00:0D:E9 Napatech Aps +00:0D:EE Andrew RF Power Amplifier Group +00:0D:E2 CMZ Sistemi Elettronici +00:0D:DC VAC +00:0D:D6 ITI LTD +00:0D:DB AIRWAVE TECHNOLOGIES INC. +00:0D:CA Tait Electronics +00:0D:CF Cidra Corp. +00:0E:28 Dynamic Ratings P/L +00:0E:22 Private +00:0E:21 MTU Friedrichshafen GmbH +00:0E:15 Tadlys LTD +00:0E:1C Hach Company +00:0E:0D Hesch Schröder GmbH +00:0E:10 C-guys, Inc. +00:0D:F5 Teletronics International Inc. +00:0D:FC ITFOR Inc. +00:0E:01 ASIP Technologies Inc. +00:0C:F0 M & N GmbH +00:0C:F5 InfoExpress +00:0C:E0 Trek Diagnostics Inc. +00:0C:E4 NeuroCom International, Inc. +00:0C:E9 BLOOMBERG L.P. +00:0C:CE Cisco Systems, Inc +00:0C:D4 Positron Public Safety Systems inc. +00:0C:CD IEC - TC57 +00:0D:15 Voipac s.r.o. +00:0D:16 UHS Systems Pty Ltd +00:0D:1B Kyoto Electronics Manufacturing Co., Ltd. +00:0D:0F Finlux Ltd +00:0D:03 Matrics, Inc. +00:0D:08 AboveCable, Inc. +00:0C:FC S2io Technologies Corp +00:0C:F6 Sitecom Europe BV +00:0D:A3 Emerging Technologies Limited +00:0D:9C Elan GmbH & Co KG +00:0D:96 Vtera Technology Inc. +00:0D:95 Opti-cell, Inc. +00:0D:90 Factum Electronics AB +00:0D:89 Bils Technology Inc +00:0D:80 Online Development Inc +00:0D:C9 THALES Elektronik Systeme GmbH +00:0D:C3 First Communication, Inc. +00:0D:BC Cisco Systems, Inc +00:0D:B7 SANKO ELECTRIC CO,.LTD +00:0D:B0 Olym-tech Co.,Ltd. +00:0D:A8 Teletronics Technology Corporation +00:0D:41 Siemens AG ICM MP UC RD IT KLF1 +00:0D:3A Microsoft Corp. +00:0D:35 PAC International Ltd +00:0D:2E Matsushita Avionics Systems Corporation +00:0D:28 Cisco Systems, Inc +00:0D:22 Unitronics LTD +00:0D:27 MICROPLEX Printware AG +00:0C:21 Faculty of Science and Technology, Keio University +00:0C:11 NIPPON DEMPA CO.,LTD. +00:0C:10 PNI Corporation +00:0C:12 Micro-Optronic-Messtechnik GmbH +00:0C:17 AJA Video Systems Inc +00:0C:04 Tecnova +00:0C:0B Broadbus Technologies +00:0B:F8 Infinera +00:0B:FF Berkeley Camera Engineering +00:0B:EC NIPPON ELECTRIC INSTRUMENT, INC. +00:0B:B8 Kihoku Electronic Co. +00:0B:BD Connexionz Limited +00:0B:AD PC-PoS Inc. +00:0B:A0 T&L Information Inc. +00:0B:A7 Maranti Networks +00:0B:AC 3Com Ltd +00:0B:93 Ritter Elektronik +00:0B:98 NiceTechVision +00:0B:9B Sirius System Co, Ltd. +00:0B:8C Flextronics +00:0B:F1 LAP Laser Applikations +00:0B:DF Shenzhen RouterD Networks Limited +00:0B:DE TELDIX GmbH +00:0B:E0 SercoNet Ltd. +00:0B:E5 HIMS International Corporation +00:0B:D9 General Hydrogen +00:0B:AE Vitals System Inc. +00:0B:D0 XiMeta Technology Americas Inc. +00:0B:D5 Nvergence, Inc. +00:0B:C4 BIOTRONIK GmbH & Co +00:0B:C9 Electroline Equipment +00:0B:B1 Super Star Technology Co., Ltd. +00:0B:B6 Metalligence Technology Corp. +00:0B:79 X-COM, Inc. +00:0B:80 Lycium Networks +00:0B:87 American Reliance Inc. +00:0B:6D SOLECTRON JAPAN NAKANIIDA +00:0B:74 Kingwave Technology Co., Ltd. +00:0B:67 Topview Technology Corporation +00:0B:61 Friedrich Lütze GmbH & Co. KG +00:0B:66 Teralink Communications +00:0B:68 Addvalue Communications Pte Ltd +00:0B:58 Astronautics C.A LTD +00:0B:50 Oxygnet +00:0B:44 Concord IDea Corp. +00:0B:49 RF-Link System Inc. +00:0B:4B VISIOWAVE SA +00:0B:31 Yantai ZhiYang Scientific and technology industry CO., LTD +00:0B:3D CONTAL OK Ltd. +00:0B:38 Knürr GmbH +00:0B:2A HOWTEL Co., Ltd. +00:0B:2C Eiki Industrial Co. Ltd. +00:0C:97 NV ADB TTV Technologies SA +00:0C:9C Chongho information & communications +00:0C:9E MemoryLink Corp. +00:0C:89 AC Electric Vehicles, Ltd. +00:0C:8B Connect Tech Inc +00:0C:90 Octasic Inc. +00:0C:84 Eazix, Inc. +00:0C:75 Oriental integrated electronics. LTD +00:0C:77 Life Racing Ltd +00:0C:7C Internet Information Image Inc. +00:0C:43 Ralink Technology, Corp. +00:0C:45 Animation Technologies Inc. +00:0C:3C MediaChorus, Inc. +00:0C:32 Avionic Design Development GmbH +00:0C:35 KaVo Dental GmbH & Co. KG +00:0C:2B ELIAS Technology, Inc. +00:0C:28 RIFATRON +00:0C:1C MicroWeb Co., Ltd. +00:0C:64 X2 MSA Group +00:0C:69 National Radio Astronomy Observatory +00:0C:70 ACC GmbH +00:0C:51 Scientific Technologies Inc. +00:0C:56 Megatel Computer (1986) Corp. +00:0C:58 M&S Systems +00:0C:5D CHIC TECHNOLOGY (CHINA) CORP. +00:0C:4A Cygnus Microsystems (P) Limited +00:0C:C8 Xytronix Research & Design, Inc. +00:0C:BB ISKRAEMECO +00:0C:B5 Premier Technolgies, Inc +00:0C:BC Iscutum +00:0C:A3 Rancho Technology, Inc. +00:0C:AA Cubic Transportation Systems Inc +00:0A:38 Apani Networks +00:0A:3F Data East Corporation +00:0A:44 Avery Dennison Deutschland GmbH +00:0A:46 ARO WELDING TECHNOLOGIES SAS +00:0A:33 Emulex Corporation +00:0A:31 HCV Consulting +00:0A:2C Active Tchnology Corporation +00:42:52 RLX Technologies +00:0A:2A QSI Systems Inc. +00:0A:1E Red-M Products Limited +00:0A:23 Parama Networks Inc +00:0A:17 NESTAR COMMUNICATIONS, INC +00:0A:1C Bridge Information Co., Ltd. +00:0B:19 Vernier Networks, Inc. +00:0B:1E KAPPA opto-electronics GmbH +00:0B:25 Aeluros +00:0B:17 MKS Instruments +00:0B:12 NURI Telecom Co., Ltd. +00:0B:0B Corrent Corporation +00:0A:FA Traverse Technologies Australia +00:0A:FF Kilchherr Elektronik AG +00:0A:F3 Cisco Systems, Inc +00:0A:F8 American Telecare Inc. +00:0A:EE GCD Hard- & Software GmbH +00:0A:06 Teledex LLC +00:0A:09 TaraCom Integrated Products, Inc. +00:0A:0B Sealevel Systems, Inc. +00:0A:10 FAST media integrations AG +00:09:F7 SED, a division of Calian +00:0A:01 SOHOware, Inc. +00:09:E9 Cisco Systems, Inc +00:09:F0 Shimizu Technology Inc. +00:09:EA YEM Inc. +00:09:E4 K Tech Infosystem Inc. +00:09:D8 Fält Communications AB +00:09:DD Mavin Technology Inc. +00:09:B1 Kanematsu Electronics, Ltd. +00:09:A3 Leadfly Techologies Corp. Ltd. +00:09:AA Data Comm for Business, Inc. +00:09:A4 HARTEC Corporation +00:09:9E Testech, Inc. +00:09:92 InterEpoch Technology,INC. +00:09:91 GE Fanuc Automation Manufacturing, Inc. +00:09:8B Entropic Communications, Inc. +00:0A:B0 LOYTEC electronics GmbH +00:0A:B7 Cisco Systems, Inc +00:0A:A4 SHANGHAI SURVEILLANCE TECHNOLOGY CO,LTD +00:0A:A9 Brooks Automation GmbH +00:0A:91 HemoCue AB +00:0A:9D King Young Technology Co. Ltd. +00:0A:8C Guardware Systems Ltd. +00:0A:97 SONICblue, Inc. +00:0A:7D Valo, Inc. +00:0A:84 Rainsun Enterprise Co., Ltd. +00:0A:89 Creval Systems, Inc. +00:09:D7 DC Security Products +00:09:CA iMaxNetworks(Shenzhen)Limited. +00:09:D1 SERANOA NETWORKS INC +00:09:C5 KINGENE Technology Corporation +00:09:BD Epygi Technologies, Ltd. +00:09:B6 Cisco Systems, Inc +00:09:7F Vsecure 2000 LTD. +00:09:84 MyCasa Network Inc. +00:09:71 Time Management, Inc. +00:09:78 AIJI System Co., Ltd. +00:09:72 Securebase,Inc +00:09:6C Imedia Semiconductor Corp. +00:09:65 HyunJu Computer Co., Ltd. +00:09:60 YOZAN Inc. +00:09:56 Network Systems Group, Ltd. (NSG) +00:09:55 Young Generation International Corp. +00:0A:E9 AirVast Technology Inc. +00:0A:DB SkyPilot Network, Inc +00:0A:DD Allworx Corp. +00:0A:E2 Binatone Electronics International, Ltd +00:0A:CA YOKOYAMA SHOKAI CO.,Ltd. +00:0A:CF PROVIDEO Multimedia Co. Ltd. +00:0A:D6 BeamReach Networks +00:0A:BC Seabridge Ltd. +00:0A:BE OPNET Technologies CO., LTD. +00:0A:C3 eM Technics Co., Ltd. +00:0A:78 OLITEC +00:0A:71 Avrio Technologies, Inc +00:0A:76 Beida Jade Bird Huaguang Technology Co.,Ltd +00:0A:63 DHD GmbH +00:0A:65 GentechMedia.co.,ltd. +00:0A:6A SVM Microwaves s.r.o. +00:0A:5E 3COM Corporation +00:0A:52 AsiaRF Ltd. +00:0A:4B DataPower Technology, Inc. +00:07:5A Air Products and Chemicals, Inc. +00:07:54 Xyterra Computing, Inc. +00:07:4E IPFRONT Inc +00:07:4D Zebra Technologies Corp. +00:07:42 Ormazabal +00:07:48 The Imaging Source Europe +00:07:36 Data Video Technologies Co., Ltd. +00:07:3D Nanjing Postel Telecommunications Co., Ltd. +00:07:3C Telecom Design +00:07:2A Innovance Networks +00:07:2F Intransa, Inc. +00:07:30 Hutchison OPTEL Telecom Technology Co., Ltd. +00:07:25 Bematech International Corp. +00:08:18 Pixelworks, Inc. +00:08:12 GM-2 Corporation +00:08:11 VOIX Corporation +00:08:0B Birka BPA Informationssystem AB +00:08:05 Techno-Holon Corporation +00:08:0C VDA Elettronica spa +00:07:FB Giga Stream UMTS Technologies GmbH +00:07:F5 Bridgeco Co AG +00:07:E8 EdgeWave +00:07:EF Lockheed Martin Tactical Systems +00:07:E2 Bitworks, Inc. +00:07:D6 Commil Ltd. +00:07:DC Atek Co, Ltd. +00:09:23 Heaman System Co., Ltd +00:09:1D Proteam Computer Corporation +00:09:24 Telebau GmbH +00:09:11 Cisco Systems, Inc +00:09:16 Listman Home Technologies, Inc. +00:09:0A SnedFar Technology Co., Ltd. +00:09:04 MONDIAL electronic +00:09:03 Panasas, Inc +00:08:FE UNIK C&C Co.,Ltd. +00:08:FA Karl E.Brinkmann GmbH +00:08:EE Logic Product Development +00:08:F0 Next Generation Systems, Inc. +00:09:48 Vista Control Systems, Corp. +00:09:4F elmegt GmbH & Co. KG +00:09:43 Cisco Systems, Inc +00:09:3C Jacques Technologies P/L +00:09:36 Ipetronik GmbH & Co. KG +00:09:35 Sandvine Incorporated +00:09:29 Sanyo Industries (UK) Limited +00:09:30 AeroConcierge Inc. +00:08:E9 NextGig +00:08:DC Wiznet +00:08:E2 Cisco Systems, Inc +00:08:DB Corrigent Systems +00:08:D6 HASSNET Inc. +00:08:CF Nippon Koei Power Systems Co., Ltd. +00:08:C0 ASA SYSTEMS +00:08:C5 Liontech Co., Ltd. +00:08:C9 TechniSat Digital GmbH +00:08:CA TwinHan Technology Co.,Ltd +00:08:BF Aptus Elektronik AB +00:08:B3 Fastwel +00:08:B2 SHENZHEN COMPASS TECHNOLOGY DEVELOPMENT CO.,LTD +00:08:A6 Multiware & Image Co., Ltd. +00:08:AD Toyo-Linx Co., Ltd. +00:08:9A Alcatel Microelectronics +00:08:A0 Stotz Feinmesstechnik GmbH +00:08:92 EM Solutions +00:08:96 Printronix, Inc. +00:08:8C Quanta Network Systems Inc. +00:08:86 Hansung Teliann, Inc. +00:08:73 DapTechnology B.V. +00:08:7A Wipotec GmbH +00:08:7F SPAUN electronic GmbH & Co. KG +02:60:8C 3COM CORPORATION +00:07:D0 Automat Engenharia de Automação Ltda. +00:07:CD Kumoh Electronic Co, Ltd +00:07:C7 Synectics Systems Limited +00:04:7D Pelco +00:04:7E Siqura B.V. +00:07:C1 Overture Networks, Inc. +00:07:C0 NetZerver Inc. +00:07:AE Britestream Networks, Inc. +00:07:B4 Cisco Systems, Inc +00:07:9A Verint Systems Inc +00:07:A0 e-Watch Inc. +00:07:94 Simple Devices, Inc. +00:07:93 Shin Satellite Public Company Limited +00:07:8D NetEngines Ltd. +00:07:8E Garz & Friche GmbH +00:07:81 Itron Inc. +00:07:87 Idea System Co., Ltd. +00:07:77 Motah Ltd. +00:07:71 Embedded System Corporation +00:07:5B Gibson Guitars +00:07:60 TOMIS Information & Telecom Corp. +00:07:67 Yuxing Electronics Company Limited +00:08:79 CEM Corporation +00:08:6C Plasmon LMS +00:08:6D Missouri FreeNet +00:08:67 Uptime Devices +00:08:60 LodgeNet Entertainment Corp. +00:08:54 Netronix, Inc. +00:08:5A IntiGate Inc. +00:08:1E Repeatit AB +00:08:2B Wooksung Electronics, Inc. +00:08:24 Nuance Document Imaging +00:05:BA Area Netwoeks, Inc. +00:05:B9 Airvana, Inc. +00:05:C0 Digital Network Alacarte Co., Ltd. +00:05:99 DRS Test and Energy Management or DRS-TEM +00:05:A0 MOBILINE Kft. +00:05:A9 Princeton Networks, Inc. +00:05:AA Moore Industries International Inc. +00:05:AF InnoScan Computing A/S +00:05:B3 Asahi-Engineering Co., Ltd. +00:05:9F Yotta Networks, Inc. +00:05:A6 Extron Electronics +00:05:B4 Aceex Corporation +00:05:8D Lynx Photonic Networks, Inc. +00:05:87 Locus, Incorporated +00:05:93 Grammar Engine Inc. +00:05:86 Lucent Technologies +00:05:7A Overture Networks +00:06:3C Intrinsyc Software International Inc. +00:06:2F Pivotech Systems Inc. +00:06:36 Jedai Broadband Networks +00:06:35 PacketAir Networks, Inc. +00:06:28 Cisco Systems, Inc +00:06:1F Vision Components GmbH +00:06:19 Connection Technology Systems +00:06:0D Wave7 Optics +00:06:13 Kawasaki Microelectronics Incorporated +00:06:0E IGYS Systems, Inc. +00:05:EC Mosaic Systems Inc. +00:05:D3 eProduction Solutions, Inc. +00:06:08 At-Sky SAS +00:06:07 Omni Directional Control Technology Inc. +00:05:E6 Egenera, Inc. +00:05:80 FibroLAN Ltd. +00:05:76 NSM Technology Ltd. +00:05:70 Baydel Ltd. +00:05:6A Heuft Systemtechnik GmbH +00:05:63 J-Works, Inc. +00:05:5D D-LINK SYSTEMS, INC. +00:05:64 Tsinghua Bitway Co., Ltd. +00:05:57 Agile TV Corporation +00:05:51 F & S Elektronik Systeme GmbH +00:05:4B Eaton Automation AG +00:05:4A Ario Data Networks, Inc. +00:05:44 Valley Technologies, Inc. +00:05:3E KID Systeme GmbH +00:05:31 Cisco Systems, Inc +00:05:38 Merilus, Inc. +00:05:32 Cisco Systems, Inc +00:05:25 Puretek Industrial Co., Ltd. +00:05:2B HORIBA, Ltd. +00:05:1F Taijin Media Co., Ltd. +00:05:19 Siemens Building Technologies AG, +00:05:18 Jupiters Technology +00:05:0E 3ware, Inc. +00:05:0F Tanaka S/S Ltd. +00:05:08 Inetcam, Inc. +00:04:FE Pelago Networks +00:06:71 Softing AG +00:06:72 Netezza +00:06:7B Toplink C&C Corporation +00:06:65 Sunny Giken, Inc. +00:06:6B Sysmex Corporation +00:06:52 Cisco Systems, Inc +00:06:59 EAL (Apeldoorn) B.V. +00:06:58 Helmut Fischer GmbH Institut für Elektronik und Messtechnik +00:06:46 ShenZhen XunBao Network Technology Co Ltd +00:06:40 White Rock Networks +00:06:4C Invicta Networks, Inc. +00:06:B5 Source Photonics, Inc. +00:06:A8 KC Technology, Inc. +00:06:9E UNIQA, Inc. +00:06:98 egnite GmbH +00:06:92 Intruvert Networks, Inc. +00:06:8C 3COM CORPORATION +00:06:85 NetNearU Corporation +00:06:8B AirRunner Technologies, Inc. +00:06:86 ZARDCOM Co., Ltd. +00:06:7F Digeo, Inc. +00:06:DE Flash Technology +00:06:E4 Citel Technologies Ltd. +00:06:D1 Tahoe Networks, Inc. +00:06:DA ITRAN Communications Ltd. +00:06:CB Jotron Electronics A/S +00:06:CC JMI Electronics Co., Ltd. +00:06:BB ATI Technologies Inc. +00:06:C5 INNOVI Technologies Limited +00:06:AF Xalted Networks +00:07:19 Mobiis Co., Ltd. +00:07:20 Trutzschler GmbH & Co. KG +00:07:13 IP One, Inc. +00:07:0D Cisco Systems, Inc +00:07:14 Brightcom +00:06:F1 Optillion +00:06:F0 Digeo, Inc. +00:06:FB Hitachi Printing Solutions, Ltd. +00:06:EB Global Data +00:05:F2 Power R, Inc. +00:05:FE Traficon N.V. +00:05:E5 Renishaw PLC +00:05:F8 Real Time Access, Inc. +00:05:FF SNS Solutions, Inc. +00:05:DD Cisco Systems, Inc +00:05:D9 Techno Valley, Inc. +00:05:C6 Triz Communications +00:05:CC Sumtel Communications, Inc. +00:04:4C JENOPTIK +00:04:48 Polaroid Corporation +00:04:3C SONOS Co., Ltd. +00:04:41 Half Dome Systems, Inc. +00:04:35 Comptek International, Inc. +00:04:2F International Communications Products, Inc. +00:04:29 Pixord Corporation +00:04:22 Gordon Kapes, Inc. +00:04:1C ipDialog, Inc. +00:04:1D Corega of America +00:04:16 Parks S/A Comunicacoes Digitais +00:04:10 Spinnaker Networks, Inc. +00:04:0F Asus Network Technologies, Inc. +00:04:0A Sage Systems +00:04:03 Nexsi Corporation +00:04:F8 QUALICABLE TV Industria E Com., Ltda +00:04:F2 Polycom +00:04:EB Paxonet Communications, Inc. +00:04:EC Memobox SA +00:04:E6 Banyan Network Private Limited +00:04:E1 Infinior Microsystems +00:04:DB Tellus Group Corp. +00:04:E2 SMC Networks, Inc. +00:04:D5 Hitachi Information & Communication Engineering, Ltd. +00:04:CF Seagate Technology +00:04:C9 Micro Electron Co., Ltd. +00:04:87 Cogency Semiconductor, Inc. +00:04:82 Medialogic Corp. +00:04:78 G. Star Technology Corporation +00:04:71 IPrad +00:04:6B Palm Wireless, Inc. +00:04:65 i.s.t isdn-support technik GmbH +00:04:59 Veristar Corporation +00:04:5E PolyTrax Information Technology AG +00:04:58 Fusion X Co., Ltd. +00:04:52 RocketLogix, Inc. +00:04:42 NACT +00:03:F9 Pleiades Communications, Inc. +00:03:E2 Comspace Corporation +00:03:F4 NetBurner +00:03:F3 Dazzle Multimedia, Inc. +00:03:ED Shinkawa Electric Co., Ltd. +00:03:E7 Logostek Co. Ltd. +00:03:DF Desana Systems +00:03:DB Apogee Electronics Corp. +00:03:D6 RADVision, Ltd. +00:03:CF Muxcom, Inc. +00:03:C8 CML Emergency Services +00:03:C3 Micronik Multimedia +00:03:C0 RFTNC Co., Ltd. +00:03:BC COT GmbH +00:03:B1 Hospira Inc. +00:03:A5 Medea Corporation +00:03:AA Watlow +00:03:A2 Catapult Communications +00:03:97 Watchfront Limited +00:03:9E Tera System Co., Ltd. +00:03:92 Hyundai Teletek Co., Ltd. +00:03:8F Weinschel Corporation +00:03:8B PLUS-ONE I&T, Inc. +00:03:86 Ho Net, Inc. +00:03:7D Stellcom +00:03:82 A-One Co., Ltd. +00:03:7A Taiyo Yuden Co., Ltd. +00:03:76 Graphtec Technology, Inc. +00:03:69 Nippon Antenna Co., Ltd. +00:03:6F Telsey SPA +00:03:63 Miraesys Co., Ltd. +00:03:5E Metropolitan Area Networks, Inc. +00:03:57 Intervoice-Brite, Inc. +00:03:4C Shanghai DigiVision Technology Co., Ltd. +00:03:51 Diebold, Inc. +00:03:11 Micro Technology Co., Ltd. +00:03:0A Argus Technologies +00:03:02 Charles Industries, Ltd. +00:03:05 MSC Vertriebs GmbH +00:02:FE Viditec, Inc. +00:02:F2 eDevice, Inc. +00:02:F7 ARM +00:02:EC Maschoff Design Engineering +00:02:E4 JC HYUN Systems, Inc. +00:02:E7 CAB GmbH & Co KG +00:02:E0 ETAS GmbH +00:02:D9 Reliable Controls +00:02:D4 PDA Peripherals, Inc. +00:02:D1 Vivotek, Inc. +00:02:CD TeleDream, Inc. +00:03:49 Vidicode Datacommunicatie B.V. +00:03:40 Floware Wireless Systems, Ltd. +00:80:37 Ericsson Group +00:03:32 Cisco Systems, Inc +00:03:39 Eurologic Systems, Ltd. +00:03:2A UniData Communication Systems, Inc. +00:03:2D IBASE Technology, Inc. +00:03:26 Iwasaki Information Systems Co., Ltd. +00:03:1D Taiwan Commate Computer, Inc. +00:03:18 Cyras Systems, Inc. +00:04:C2 Magnipix, Inc. +00:04:B6 Stratex Networks, Inc. +00:04:BC Giantec, Inc. +00:04:B0 ELESIGN Co., Ltd. +00:04:A9 SandStream Technologies, Inc. +00:04:A8 Broadmax Technologies, Inc. +00:04:A2 L.S.I. Japan Co., Ltd. +00:04:9B Cisco Systems, Inc +00:04:9C Surgient Networks, Inc. +00:04:96 Extreme Networks +00:04:8F TD Systems Corporation +00:04:88 Eurotherm Controls +00:02:81 Madge Ltd. +00:90:64 Thomson Inc. +00:02:7F ask-technologies.com +00:02:7A IOI Technology Corporation +00:02:73 Coriolis Networks +00:02:6E NeGeN Access, Inc. +00:02:63 UPS Manufacturing SRL +00:02:5C SCI Systems (Kunshan) Co., Ltd. +00:02:53 Televideo, Inc. +00:02:4C SiByte, Inc. +00:02:4E Datacard Group +00:01:2F Twinhead International Corp +00:02:3C Creative Technology, Ltd. +00:02:40 Seedek Co., Ltd. +00:02:47 Great Dragon Information Technology (Group) Co., Ltd. +00:02:43 Raysis Co., Ltd. +00:02:39 Visicom +00:02:36 INIT GmbH +00:02:31 Ingersoll-Rand +00:02:2A Asound Electronic +00:02:2D Agere Systems +00:02:19 Paralon Technologies +00:01:86 Uwe Disch +00:01:7B Heidelberger Druckmaschinen AG +00:01:82 DICA TECHNOLOGIES AG +00:01:8E Logitec Corporation +00:01:9B Kyoto Microcomputer Co., Ltd. +00:01:94 Capital Equipment Corporation +00:01:97 Cisco Systems, Inc +00:01:A3 GENESYS LOGIC, INC. +00:01:4E WIN Enterprises, Inc. +00:30:AC Systeme Lauer GmbH & Co., Ltd. +00:01:3E Ascom Tateco AB +00:01:45 WINSYSTEMS, INC. +00:01:26 PAC Labs +00:01:1A Hoffmann und Burmeister GbR +00:01:1D Centillium Communications +00:01:29 DFI Inc. +00:01:07 Leiser GmbH +00:01:0E Bri-Link Technologies Co., Ltd +00:01:16 Netspect Technologies, Inc. +00:01:03 3COM CORPORATION +00:06:2B INTRASERVER TECHNOLOGY +00:02:C1 Innovative Electronic Designs, Inc. +00:02:C8 Technocom Communications Technology (pte) Ltd +00:02:A9 RACOM, s.r.o. +00:02:B8 WHI KONSULT AB +00:02:AC 3PAR data +00:02:B1 Anritsu, Ltd. +00:02:9A Storage Apps +00:02:A0 Flatstack Ltd. +00:02:95 IP.Access Limited +00:02:94 Tokyo Sokushin Co., Ltd. +00:02:90 Woorigisool, Inc. +00:02:86 Occam Networks +00:02:8B VDSL Systems OY +00:02:22 Chromisys, Inc. +00:02:1D Data General Communication Ltd. +00:02:0A Gefran Spa +00:02:16 Cisco Systems, Inc +00:02:06 Telital R&D Denmark A/S +00:02:03 Woonsang Telecom, Inc. +00:01:F7 Image Display Systems, Inc. +00:01:EE Comtrol Europe, Ltd. +00:01:E2 Ando Electric Corporation +00:01:F1 Innovative Concepts, Inc. +00:B0:6D Jones Futurex Inc. +00:30:FE DSA GmbH +00:30:5E Abelko Innovation +00:30:1E 3COM EUROPE LTD. +00:30:4D ESI +00:30:46 Controlled Electronic Manageme +00:30:7B Cisco Systems, Inc +00:01:D6 manroland AG +00:01:DB Freecom Technologies GmbH +00:01:DE Trango Systems, Inc. +00:01:CF Alpha Data Parallel Systems, Ltd. +00:01:CB EVR +00:01:C4 NeoWave, Inc. +00:01:C0 CompuLab, Ltd. +00:01:B9 SKF Condition Monitoring +00:01:B5 Turin Networks, Inc. +00:01:7F Experience Music Project +00:01:6C FOXCONN +00:01:73 AMCC +00:01:5C CADANT INC. +00:01:63 Cisco Systems, Inc +00:01:0A CIS TECHNOLOGY INC. +00:01:6F Inkel Corp. +00:01:55 Promise Technology, Inc. +00:01:51 Ensemble Communications +00:01:42 Cisco Systems, Inc +00:01:32 Dranetz - BMI +00:D0:7D COSINE COMMUNICATIONS +00:D0:CA Intrinsyc Software International Inc. +00:D0:58 Cisco Systems, Inc +00:D0:67 CAMPIO COMMUNICATIONS +00:D0:23 INFORTREND TECHNOLOGY, INC. +00:D0:2A Voxent Systems Ltd. +00:D0:68 IWILL CORPORATION +00:D0:9D VERIS INDUSTRIES +00:D0:9A FILANET CORPORATION +00:D0:0A LANACCESS TELECOM S.A. +00:D0:4A PRESENCE TECHNOLOGY GMBH +00:D0:C3 VIVID TECHNOLOGY PTE, LTD. +00:D0:F8 FUJIAN STAR TERMINAL +00:D0:96 3COM EUROPE LTD. +00:D0:03 COMDA ENTERPRISES CORP. +00:D0:29 WAKEFERN FOOD CORPORATION +00:D0:F5 ORANGE MICRO, INC. +00:D0:F7 NEXT NETS CORPORATION +00:D0:78 Eltex of Sweden AB +00:D0:AF CUTLER-HAMMER, INC. +00:D0:26 HIRSCHMANN AUSTRIA GMBH +00:D0:10 CONVERGENT NETWORKS, INC. +00:D0:74 TAQUA SYSTEMS, INC. +00:D0:D5 GRUNDIG AG +00:D0:34 ORMEC SYSTEMS CORP. +00:D0:8C GENOA TECHNOLOGY, INC. +00:D0:59 AMBIT MICROSYSTEMS CORP. +00:50:20 MEDIASTAR CO., LTD. +00:50:3E Cisco Systems, Inc +00:D0:2B JETCELL, INC. +00:50:17 RSR S.R.L. +00:D0:CC TECHNOLOGIES LYRE INC. +00:50:6D VIDEOJET SYSTEMS +00:50:77 PROLIFIC TECHNOLOGY, INC. +00:50:D4 JOOHONG INFORMATION & +00:50:5E DIGITEK MICROLOGIC S.A. +00:50:E7 PARADISE INNOVATIONS (ASIA) +00:50:B9 XITRON TECHNOLOGIES, INC. +00:D0:49 IMPRESSTEK CO., LTD. +00:D0:4D DIV OF RESEARCH & STATISTICS +00:D0:35 BEHAVIOR TECH. COMPUTER CORP. +00:D0:2D ADEMCO +00:D0:7C KOYO ELECTRONICS INC. CO.,LTD. +00:D0:5B ACROLOOP MOTION CONTROL +00:D0:C6 THOMAS & BETTS CORP. +00:D0:2E COMMUNICATION AUTOMATION CORP. +00:D0:DA TAICOM DATA SYSTEMS CO., LTD. +00:D0:E8 MAC SYSTEM CO., LTD. +00:D0:3C Vieo, Inc. +00:D0:9F NOVTEK TEST SYSTEMS +00:D0:7E KEYCORP LTD. +00:D0:EA NEXTONE COMMUNICATIONS, INC. +00:D0:20 AIM SYSTEM, INC. +00:D0:64 MULTITEL +00:D0:72 BROADLOGIC +00:30:9B Smartware +00:30:AF Honeywell GmbH +00:30:74 EQUIINET LTD. +00:30:90 CYRA TECHNOLOGIES, INC. +00:30:30 HARMONIX CORPORATION +00:30:7C ADID SA +00:30:63 SANTERA SYSTEMS, INC. +00:30:9F AMBER NETWORKS +00:30:A8 OL'E COMMUNICATIONS, INC. +00:30:4C APPIAN COMMUNICATIONS, INC. +00:30:EF NEON TECHNOLOGY, INC. +00:30:6F SEYEON TECH. CO., LTD. +00:30:31 LIGHTWAVE COMMUNICATIONS, INC. +00:30:35 Corning Incorporated +00:30:2B INALP NETWORKS, INC. +00:30:5F Hasselblad +00:30:2D QUANTUM BRIDGE COMMUNICATIONS +00:30:25 CHECKOUT COMPUTER SYSTEMS, LTD +00:D0:1F Senetas Security +00:30:12 DIGITAL ENGINEERING LTD. +00:30:77 ONPREM NETWORKS +00:30:D4 AAE Systems, Inc. +00:D0:0F SPEECH DESIGN GMBH +00:D0:CF MORETON BAY +00:D0:73 ACN ADVANCED COMMUNICATIONS +00:D0:30 Safetran Systems Corp +00:D0:57 ULTRAK, INC. +00:D0:3B VISION PRODUCTS PTY. LTD. +00:D0:BF PIVOTAL TECHNOLOGIES +00:D0:50 ISKRATEL +00:D0:CB DASAN CO., LTD. +00:D0:D3 Cisco Systems, Inc +00:D0:8E Grass Valley, A Belden Brand +00:D0:A3 VOCAL DATA, INC. +00:D0:E0 DOOIN ELECTRONICS CO. +00:30:54 CASTLENET TECHNOLOGY, INC. +00:30:39 SOFTBOOK PRESS +00:30:17 BlueArc UK Ltd +00:30:76 Akamba Corporation +00:30:5D DIGITRA SYSTEMS, INC. +00:30:F7 RAMIX INC. +00:30:33 ORIENT TELECOM CO., LTD. +00:30:83 Ivron Systems +00:30:07 OPTI, INC. +00:30:DD INDIGITA CORPORATION +00:30:F2 Cisco Systems, Inc +00:30:20 TSI, Inc.. +00:30:89 Spectrapoint Wireless, LLC +00:30:22 Fong Kai Industrial Co., Ltd. +00:30:F8 Dynapro Systems, Inc. +00:30:C2 COMONE +00:30:56 Beck IPC GmbH +00:30:D2 WIN TECHNOLOGIES, CO., LTD. +00:30:50 Versa Technology +00:30:B8 RiverDelta Networks +00:90:4D SPEC S.A. +00:90:79 ClearOne, Inc. +00:90:8F AUDIO CODES LTD. +00:90:D5 EUPHONIX, INC. +00:90:A7 CLIENTEC CORPORATION +00:90:7F WatchGuard Technologies, Inc. +00:90:7E VETRONIX CORP. +00:90:2F NETCORE SYSTEMS, INC. +00:90:0D Overland Storage Inc. +00:90:44 ASSURED DIGITAL, INC. +00:90:78 MER TELEMANAGEMENT SOLUTIONS, LTD. +00:90:09 I Controls, Inc. +00:90:15 CENTIGRAM COMMUNICATIONS CORP. +00:90:F3 ASPECT COMMUNICATIONS +00:90:A8 NineTiles Networks, Ltd. +00:50:7A XPEED, INC. +00:50:02 OMNISEC AG +00:50:8D ABIT COMPUTER CORPORATION +00:50:CD DIGIANSWER A/S +00:50:C5 ADS Technologies, Inc +00:50:2F TollBridge Technologies, Inc. +00:50:28 AVAL COMMUNICATIONS +00:50:5B KAWASAKI LSI U.S.A., INC. +00:50:F8 ENTREGA TECHNOLOGIES, INC. +00:50:6F G-CONNECT +00:50:CC XYRATEX +00:50:D5 AD SYSTEMS CORP. +00:50:AA KONICA MINOLTA HOLDINGS, INC. +00:50:9C BETA RESEARCH +00:50:27 GENICOM CORPORATION +00:50:10 NovaNET Learning, Inc. +00:50:9E Les Technologies SoftAcoustik Inc. +00:50:5F BRAND INNOVATORS +00:50:95 PERACOM NETWORKS +00:50:26 COSYSTEMS, INC. +00:50:EF SPE Systemhaus GmbH +00:50:93 BOEING +00:50:D8 UNICORN COMPUTER CORP. +00:90:34 IMAGIC, INC. +00:90:73 GAIO TECHNOLOGY +00:90:C9 DPAC Technologies +00:90:E7 HORSCH ELEKTRONIK AG +00:90:01 NISHIMU ELECTRONICS INDUSTRIES CO., LTD. +00:90:FB PORTWELL, INC. +00:90:70 NEO NETWORKS, INC. +00:90:EF INTEGRIX, INC. +00:90:B0 VADEM +00:90:D1 LEICHU ENTERPRISE CO., LTD. +00:50:D7 TELSTRAT +00:50:F1 Intel Corporation +00:50:1B ABL CANADA, INC. +00:50:36 NETCAM, LTD. +00:50:C9 MASPRO DENKOH CORP. +00:50:09 PHILIPS BROADBAND NETWORKS +00:50:C4 IMD +00:50:A3 TransMedia Communications, Inc. +00:50:99 3COM EUROPE, LTD. +00:50:A4 IO TECH, INC. +00:50:B3 VOICEBOARD CORPORATION +00:50:B7 BOSER TECHNOLOGY CO., LTD. +00:90:8D VICKERS ELECTRONICS SYSTEMS +00:90:42 ECCS, Inc. +00:90:51 ULTIMATE TECHNOLOGY CORP. +00:90:FF TELLUS TECHNOLOGY INC. +00:90:18 ITO ELECTRIC INDUSTRY CO, LTD. +00:90:02 ALLGON AB +00:90:16 ZAC +00:90:05 PROTECH SYSTEMS CO., LTD. +00:90:1E Selesta Ingegneria S.p.A. +00:90:90 I-BUS +00:90:AA INDIGO ACTIVE VISION SYSTEMS LIMITED +00:90:3A NIHON MEDIA TOOL INC. +00:90:55 PARKER HANNIFIN CORPORATION COMPUMOTOR DIVISION +00:90:9F DIGI-DATA CORPORATION +00:90:E4 NEC AMERICA, INC. +00:90:13 SAMSAN CORP. +00:90:04 3COM EUROPE LTD. +00:90:E1 TELENA S.P.A. +00:50:4A ELTECO A.S. +00:50:4C Galil Motion Control +00:50:21 EIS INTERNATIONAL, INC. +00:50:6E CORDER ENGINEERING CORPORATION +00:50:7E NEWER TECHNOLOGY +00:50:E6 HAKUSAN CORPORATION +00:50:AE FDK Co., Ltd +00:10:9D CLARINET SYSTEMS, INC. +00:10:D2 NITTO TSUSHINKI CO., LTD +00:10:45 Nortel Networks +00:10:6B SONUS NETWORKS, INC. +00:10:EC RPCG, LLC +00:10:92 NETCORE INC. +00:10:E2 ArrayComm, Inc. +00:10:71 ADVANET INC. +00:10:69 HELIOSS COMMUNICATIONS, INC. +00:10:FD COCOM A/S +00:10:AC IMCI TECHNOLOGIES +00:10:EF DBTEL INCORPORATED +00:10:17 Bosch Access Systems GmbH +00:10:24 NAGOYA ELECTRIC WORKS CO., LTD +00:10:DD ENABLE SEMICONDUCTOR, INC. +00:10:C9 MITSUBISHI ELECTRONICS LOGISTIC SUPPORT CO. +00:10:85 POLARIS COMMUNICATIONS, INC. +00:10:44 InnoLabs Corporation +00:10:56 SODICK CO., LTD. +00:10:99 InnoMedia, Inc. +00:10:61 HOSTLINK CORP. +00:10:93 CMS COMPUTERS, LTD. +00:10:CD INTERFACE CONCEPT +00:10:F3 Nexcom International Co., Ltd. +00:10:05 UEC COMMERCIAL +00:10:66 ADVANCED CONTROL SYSTEMS, INC. +00:10:E4 NSI CORPORATION +00:10:62 NX SERVER, ILNC. +00:10:B9 MAXTOR CORP. +00:10:8B LASERANIMATION SOLLINGER GMBH +00:10:5C QUANTUM DESIGNS (H.K.) LTD. +00:10:42 Alacritech, Inc. +00:10:60 BILLIONTON SYSTEMS, INC. +00:10:DE INTERNATIONAL DATACASTING CORPORATION +00:10:5D Draeger Medical +00:10:E1 S.I. TECH, INC. +00:10:91 NO WIRES NEEDED BV +00:10:F5 AMHERST SYSTEMS, INC. +00:10:90 CIMETRICS, INC. +00:10:70 CARADON TREND LTD. +00:10:BA MARTINHO-DAVIS SYSTEMS, INC. +00:10:7C P-COM, INC. +00:10:AE SHINKO ELECTRIC INDUSTRIES CO. +00:10:40 INTERMEC CORPORATION +00:10:B0 MERIDIAN TECHNOLOGY CORP. +00:10:77 SAF DRIVE SYSTEMS, LTD. +00:10:F4 Vertical Communications +00:10:65 RADYNE CORPORATION +00:10:4A The Parvus Corporation +00:10:B3 NOKIA MULTIMEDIA TERMINALS +00:10:37 CYQ've Technology Co., Ltd. +00:10:51 CMICRO CORPORATION +00:10:DC MICRO-STAR INTERNATIONAL CO., LTD. +00:10:EE CTI PRODUCTS, INC. +00:10:1B CORNET TECHNOLOGY, INC. +00:10:32 ALTA TECHNOLOGY +00:10:25 Grayhill, Inc +00:10:09 HORO QUARTZ +00:10:F8 TEXIO TECHNOLOGY CORPORATION +00:10:4D SURTEC INDUSTRIES, INC. +00:E0:E0 SI ELECTRONICS, LTD. +00:E0:D1 TELSIS LIMITED +00:E0:05 TECHNICAL CORP. +00:E0:72 LYNK +00:E0:C1 MEMOREX TELEX JAPAN, LTD. +00:E0:AD EES TECHNOLOGY, LTD. +00:E0:25 dit Co., Ltd. +00:E0:B1 Alcatel-Lucent, Enterprise Business Group +00:E0:E4 FANUC ROBOTICS NORTH AMERICA, Inc. +00:E0:31 HAGIWARA ELECTRIC CO., LTD. +00:E0:A5 ComCore Semiconductor, Inc. +00:E0:44 LSICS CORPORATION +00:E0:5D UNITEC CO., LTD. +00:E0:B3 EtherWAN Systems, Inc. +00:E0:53 CELLPORT LABS, INC. +00:E0:7D NETRONIX, INC. +00:E0:ED SILICOM, LTD. +00:E0:B4 TECHNO SCOPE CO., LTD. +00:E0:C6 LINK2IT, L.L.C. +00:E0:6D COMPUWARE CORPORATION +00:E0:74 TIERNAN COMMUNICATIONS, INC. +00:E0:59 CONTROLLED ENVIRONMENTS, LTD. +00:E0:06 SILICON INTEGRATED SYS. CORP. +00:E0:F8 DICNA CONTROL AB +00:E0:04 PMC-SIERRA, INC. +00:E0:DE DATAX NV +00:E0:78 BERKELEY NETWORKS +00:E0:41 CSPI +00:E0:E2 INNOVA CORP. +00:E0:09 MARATHON TECHNOLOGIES CORP. +00:E0:2F MCNS HOLDINGS, L.P. +00:E0:4C REALTEK SEMICONDUCTOR CORP. +00:E0:47 InFocus Corporation +00:E0:92 ADMTEK INCORPORATED +00:E0:FF SECURITY DYNAMICS TECHNOLOGIES, Inc. +08:BB:CC AK-NORD EDV VERTRIEBSGES. mbH +00:60:B2 PROCESS CONTROL CORP. +00:60:04 COMPUTADORES MODULARES SA +00:60:D6 NovAtel Wireless Technologies Ltd. +00:60:00 XYCOM INC. +00:A0:19 NEBULA CONSULTANTS, INC. +00:A0:ED Brooks Automation, Inc. +00:A0:A9 NAVTEL COMMUNICATIONS INC. +00:A0:E1 WESTPORT RESEARCH ASSOCIATES, INC. +00:A0:D6 SBE, Inc. +00:A0:5E MYRIAD LOGIC INC. +00:A0:78 Marconi Communications +00:A0:0B COMPUTEX CO., LTD. +00:A0:9A NIHON KOHDEN AMERICA +00:A0:95 ACACIA NETWORKS, INC. +00:A0:F2 INFOTEK COMMUNICATIONS, INC. +00:A0:EF LUCIDATA LTD. +00:A0:3F COMPUTER SOCIETY MICROPROCESSOR & MICROPROCESSOR STANDARDS C +00:A0:67 NETWORK SERVICES GROUP +00:A0:A7 VORAX CORPORATION +00:A0:2D 1394 Trade Association +00:A0:E6 DIALOGIC CORPORATION +00:A0:4A NISSHIN ELECTRIC CO., LTD. +00:A0:5B MARQUIP, INC. +00:A0:8D JACOMO CORPORATION +00:A0:6F THE APPCON GROUP, INC. +00:A0:8E Check Point Software Technologies +00:E0:AA ELECTROSONIC LTD. +00:E0:85 GLOBAL MAINTECH, INC. +00:E0:5A GALEA NETWORK SECURITY +00:E0:22 Analog Devices Inc. +00:E0:E7 RAYTHEON E-SYSTEMS, INC. +00:E0:0C MOTOROLA +00:E0:4A ZX Technologies, Inc +00:E0:0A DIBA, INC. +00:E0:B9 BYAS SYSTEMS +00:E0:54 KODAI HITEC CO., LTD. +00:E0:AF GENERAL DYNAMICS INFORMATION SYSTEMS +00:60:5B IntraServer Technology, Inc. +00:60:4B Safe-com GmbH & Co. KG +00:A0:CD DR. JOHANNES HEIDENHAIN GmbH +00:A0:DA INTEGRATED SYSTEMS Technology, Inc. +00:A0:3C EG&G NUCLEAR INSTRUMENTS +00:A0:38 EMAIL ELECTRONICS +00:A0:BE INTEGRATED CIRCUIT SYSTEMS, INC. COMMUNICATIONS GROUP +00:60:5D SCANIVALVE CORP. +00:60:E4 COMPUSERVE, INC. +00:60:0A SORD COMPUTER CORPORATION +00:60:C4 SOLITON SYSTEMS K.K. +00:60:C8 KUKA WELDING SYSTEMS & ROBOTS +00:60:30 VILLAGE TRONIC ENTWICKLUNG +00:60:E7 RANDATA +00:60:2A SYMICRON COMPUTER COMMUNICATIONS, LTD. +00:60:1E SOFTLAB, INC. +00:60:F8 Loran International Technologies Inc. +00:60:88 WHITE MOUNTAIN DSP, INC. +00:60:9A NJK TECHNO CO. +00:60:CC EMTRAK, INCORPORATED +00:60:36 AIT Austrian Institute of Technology GmbH +00:60:B9 NEC Platforms, Ltd +00:60:CE ACCLAIM COMMUNICATIONS +00:60:F5 ICON WEST, INC. +00:60:A4 GEW Technologies (PTY)Ltd +00:60:CA HARMONIC SYSTEMS INCORPORATED +00:60:24 GRADIENT TECHNOLOGIES, INC. +00:60:FB PACKETEER, INC. +00:60:BC KeunYoung Electronics & Communication Co., Ltd. +00:60:B8 CORELIS Inc. +00:60:FE LYNX SYSTEM DEVELOPERS, INC. +00:60:01 InnoSys, Inc. +00:60:7D SENTIENT NETWORKS INC. +00:60:6E DAVICOM SEMICONDUCTOR, INC. +00:60:7E GIGALABS, INC. +00:60:CF ALTEON NETWORKS, INC. +00:60:26 VIKING Modular Solutions +00:60:03 TERAOKA WEIGH SYSTEM PTE, LTD. +00:60:59 TECHNICAL COMMUNICATIONS CORP. +00:60:66 LACROIX Trafic +00:60:DA Red Lion Controls, LP +00:60:42 TKS (USA), INC. +00:A0:23 APPLIED CREATIVE TECHNOLOGY, INC. +00:A0:0F Broadband Technologies +00:A0:32 GES SINGAPORE PTE. LTD. +00:20:34 ROTEC INDUSTRIEAUTOMATION GMBH +00:20:B2 GKD Gesellschaft Fur Kommunikation Und Datentechnik +00:20:04 YAMATAKE-HONEYWELL CO., LTD. +00:20:FE TOPWARE INC. / GRAND COMPUTER +00:20:73 FUSION SYSTEMS CORPORATION +00:20:7A WiSE Communications, Inc. +00:20:5C InterNet Systems of Florida, Inc. +00:20:7E FINECOM CO., LTD. +00:20:5A COMPUTER IDENTICS +00:20:E4 HSING TECH ENTERPRISE CO., LTD +00:A0:00 CENTILLION NETWORKS, INC. +00:A0:7B DAWN COMPUTER INCORPORATION +00:A0:5C INVENTORY CONVERSION, INC./ +00:20:6F FLOWPOINT CORPORATION +00:20:DF KYOSAN ELECTRIC MFG. CO., LTD. +00:20:10 JEOL SYSTEM TECHNOLOGY CO. LTD +00:20:20 MEGATRON COMPUTER INDUSTRIES PTY, LTD. +00:20:37 SEAGATE TECHNOLOGY +00:20:A0 OA LABORATORY CO., LTD. +00:C0:A3 DUAL ENTERPRISES CORPORATION +00:70:B0 M/A-COM INC. COMPANIES +00:9D:8E CARDIAC RECORDERS, INC. +00:60:86 LOGIC REPLACEMENT TECH. LTD. +00:1C:7C PERQ SYSTEMS CORPORATION +00:C0:59 DENSO CORPORATION +00:C0:A9 BARRON MCCANN LTD. +00:C0:69 Axxcelera Broadband Wireless +00:C0:19 LEAP TECHNOLOGY, INC. +00:A0:62 AES PRODATA +00:A0:08 NETCORP +00:A0:1B PREMISYS COMMUNICATIONS, INC. +00:A0:4B TFL LAN INC. +00:A0:15 WYLE +00:A0:11 MUTOH INDUSTRIES LTD. +00:A0:B6 SANRITZ AUTOMATION CO., LTD. +00:A0:DD AZONIX CORPORATION +00:A0:0A Airspan +00:A0:3B TOSHIN ELECTRIC CO., LTD. +00:A0:F3 STAUBLI +00:A0:97 JC INFORMATION SYSTEMS +00:A0:82 NKT ELEKTRONIK A/S +00:A0:72 OVATION SYSTEMS LTD. +00:A0:B2 SHIMA SEIKI +00:A0:E5 NHC COMMUNICATIONS +00:A0:D3 INSTEM COMPUTER SYSTEMS, LTD. +00:A0:BA PATTON ELECTRONICS CO. +00:A0:B4 TEXAS MICROSYSTEMS, INC. +00:A0:AF WMS INDUSTRIES +00:A0:FE BOSTON TECHNOLOGY, INC. +00:20:2F ZETA COMMUNICATIONS, LTD. +00:20:60 ALCATEL ITALIA S.p.A. +00:20:9A THE 3DO COMPANY +00:20:5E CASTLE ROCK, INC. +00:20:7C AUTEC GMBH +00:20:75 MOTOROLA COMMUNICATION ISRAEL +00:20:15 ACTIS COMPUTER SA +00:20:E9 DANTEL +00:20:4A PRONET GMBH +00:20:29 TELEPROCESSING PRODUCTS, INC. +00:20:51 Verilink Corporation +00:20:A1 DOVATRON +00:20:24 PACIFIC COMMUNICATION SCIENCES +00:20:9D LIPPERT AUTOMATIONSTECHNIK +00:20:41 DATA NET +00:20:76 REUDO CORPORATION +00:20:6E XACT, INC. +00:20:CA DIGITAL OCEAN +00:20:85 Eaton Corporation +00:20:CD HYBRID NETWORKS, INC. +00:20:E7 B&W NUCLEAR SERVICE COMPANY +00:20:AC INTERFLEX DATENSYSTEME GMBH +00:20:F6 NET TEK AND KARLNET, INC. +00:20:D3 OST (OUEST STANDARD TELEMATIQU +00:20:D8 Nortel Networks +00:20:17 ORBOTECH +00:20:25 CONTROL TECHNOLOGY, INC. +00:C0:8B RISQ MODULAR SYSTEMS, INC. +00:C0:CD COMELTA, S.A. +00:C0:4B CREATIVE MICROSYSTEMS +00:C0:A1 TOKYO DENSHI SEKEI CO. +00:C0:3E FA. GEBR. HELLER GMBH +00:C0:E1 SONIC SOLUTIONS +00:C0:47 UNIMICRO SYSTEMS, INC. +00:C0:46 Blue Chip Technology Ltd +00:C0:0D ADVANCED LOGIC RESEARCH, INC. +00:C0:FA CANARY COMMUNICATIONS, INC. +00:C0:B7 AMERICAN POWER CONVERSION CORP +00:C0:BA NETVANTAGE +00:C0:B6 Overland Storage, Inc. +00:C0:48 BAY TECHNICAL ASSOCIATES +00:C0:3F STORES AUTOMATED SYSTEMS, INC. +00:C0:0E PSITECH, INC. +00:C0:36 RAYTECH ELECTRONIC CORP. +00:C0:09 KT TECHNOLOGY (S) PTE LTD +00:C0:EA ARRAY TECHNOLOGY LTD. +00:C0:3A MEN-MIKRO ELEKTRONIK GMBH +00:C0:40 ECCI +00:C0:4C DEPARTMENT OF FOREIGN AFFAIRS +00:C0:1C INTERLINK COMMUNICATIONS LTD. +00:C0:86 THE LYNK CORPORATION +00:C0:8D TRONIX PRODUCT DEVELOPMENT +00:C0:A2 INTERMEDIUM A/S +00:C0:70 SECTRA SECURE-TRANSMISSION AB +00:C0:57 MYCO ELECTRONICS +00:C0:DF KYE Systems Corp. +00:C0:F6 CELAN TECHNOLOGY INC. +00:C0:8F Panasonic Electric Works Co., Ltd. +00:C0:12 NETSPAN CORPORATION +00:C0:C4 COMPUTER OPERATIONAL +00:C0:C2 INFINITE NETWORKS LTD. +00:C0:D3 OLYMPUS IMAGE SYSTEMS, INC. +00:C0:B0 GCC TECHNOLOGIES,INC. +00:C0:F4 INTERLINK SYSTEM CO., LTD. +00:C0:E2 CALCOMP, INC. +00:C0:CA ALFA, INC. +00:C0:7B ASCEND COMMUNICATIONS, INC. +00:C0:52 BURR-BROWN +00:C0:BE ALCATEL - SEL +00:40:8F WM-DATA MINFO AB +00:40:B7 STEALTH COMPUTER SYSTEMS +00:40:57 LOCKHEED - SANDERS +00:40:17 Silex Technology America +00:40:87 UBITREX CORPORATION +00:40:0E MEMOTEC, INC. +00:C0:9E CACHE COMPUTERS, INC. +00:C0:93 ALTA RESEARCH CORP. +00:C0:34 TRANSACTION NETWORK +00:40:34 BUSTEK CORPORATION +00:40:97 DATEX DIVISION OF +00:40:1E ICC +00:40:7C QUME CORPORATION +00:40:60 COMENDEC LTD +00:40:56 MCM JAPAN LTD. +00:40:95 R.P.T. INTERGROUPS INT'L LTD. +00:40:C3 FISCHER AND PORTER CO. +00:40:F1 CHUO ELECTRONICS CO., LTD. +00:40:61 DATATECH ENTERPRISES CO., LTD. +00:40:8B RAYLAN CORPORATION +00:40:20 CommScope Inc +00:40:6E COROLLARY, INC. +00:40:66 Hitachi Metals, Ltd. +00:40:16 ADC - Global Connectivity Solutions Division +00:40:86 MICHELS & KLEBERHOFF COMPUTER +00:40:DC TRITEC ELECTRONIC GMBH +00:40:74 CABLE AND WIRELESS +00:40:84 HONEYWELL ACS +00:40:B8 IDEA ASSOCIATES +00:40:58 KRONOS, INC. +00:40:A8 IMF INTERNATIONAL LTD. +00:80:BB HUGHES LAN SYSTEMS +00:C0:A0 ADVANCE MICRO RESEARCH, INC. +00:C0:D7 TAIWAN TRADING CENTER DBA +00:C0:37 DYNATEM +00:C0:5F FINE-PAL COMPANY LIMITED +00:40:CE NET-SOURCE, INC. +00:40:80 ATHENIX CORPORATION +00:40:BB GOLDSTAR CABLE CO., LTD. +00:40:B1 CODONICS INC. +00:40:2E PRECISION SOFTWARE, INC. +00:C0:CE CEI SYSTEMS & ENGINEERING PTE +00:40:9B HAL COMPUTER SYSTEMS INC. +00:40:73 BASS ASSOCIATES +10:00:5A IBM Corp +00:40:05 ANI COMMUNICATIONS INC. +00:40:99 NEWGEN SYSTEMS CORP. +00:40:E1 MARNER INTERNATIONAL, INC. +00:80:DD GMX INC/GIMIX +00:80:B7 STELLAR COMPUTER +00:80:02 SATELCOM (UK) LTD +00:80:5C AGILIS CORPORATION +00:80:E7 LYNWOOD SCIENTIFIC DEV. LTD. +00:80:70 COMPUTADORAS MICRON +00:80:8F C. ITOH ELECTRONICS, INC. +00:00:91 ANRITSU CORPORATION +00:00:94 ASANTE TECHNOLOGIES +00:00:90 MICROCOM +00:00:47 NICOLET INSTRUMENTS CORP. +00:00:FB RECHNER ZUR KOMMUNIKATION +00:00:A3 NETWORK APPLICATION TECHNOLOGY +00:00:8F Raytheon +00:00:7E CLUSTRIX CORPORATION +00:00:0A OMRON TATEISI ELECTRONICS CO. +00:00:63 BARCO CONTROL ROOMS GMBH +00:00:4E AMPEX CORPORATION +00:00:C2 INFORMATION PRESENTATION TECH. +00:00:34 NETWORK RESOURCES CORPORATION +00:00:49 APRICOT COMPUTERS, LTD +00:00:E2 ACER TECHNOLOGIES CORP. +00:00:97 EMC Corporation +00:00:D4 PURE DATA LTD. +00:00:E1 GRID SYSTEMS +00:00:44 CASTELLE CORPORATION +00:00:27 JAPAN RADIO COMPANY +00:40:49 Roche Diagnostics International Ltd. +00:40:29 Compex +00:80:38 DATA RESEARCH & APPLICATIONS +00:80:90 MICROTEK INTERNATIONAL, INC. +00:80:C3 BICC INFORMATION SYSTEMS & SVC +00:80:5A TULIP COMPUTERS INTERNAT'L B.V +00:80:F0 Panasonic Communications Co., Ltd. +00:80:43 NETWORLD, INC. +00:80:B0 ADVANCED INFORMATION +00:80:66 ARCOM CONTROL SYSTEMS, LTD. +00:40:51 GRACILIS, INC. +00:40:64 KLA INSTRUMENTS CORPORATION +00:40:28 NETCOMM LIMITED +00:40:13 NTT DATA COMM. SYSTEMS CORP. +00:40:A0 GOLDSTAR CO., LTD. +00:40:B2 SYSTEMFORSCHUNG +00:40:71 ATM COMPUTER GMBH +00:80:BF TAKAOKA ELECTRIC MFG. CO. LTD. +00:80:F6 SYNERGY MICROSYSTEMS +00:00:58 RACORE COMPUTER PRODUCTS INC. +00:00:50 RADISYS CORPORATION +00:80:82 PEP MODULAR COMPUTERS GMBH +00:80:96 HUMAN DESIGNED SYSTEMS, INC. +00:80:D5 CADRE TECHNOLOGIES +00:80:3E SYNERNETICS +00:80:9A NOVUS NETWORKS LTD +00:80:B3 AVAL DATA CORPORATION +00:80:A3 Lantronix +00:80:3C TVS ELECTRONICS LTD +00:80:61 LITTON SYSTEMS, INC. +00:80:AD CNET TECHNOLOGY, INC. +00:80:81 KENDALL SQUARE RESEARCH CORP. +00:80:19 DAYNA COMMUNICATIONS, INC. +00:80:8B DACOLL LIMITED +00:80:97 CENTRALP AUTOMATISMES +00:80:FC AVATAR CORPORATION +00:80:76 MCNC +00:80:80 DATAMEDIA CORPORATION +00:00:E6 APTOR PRODUITS DE COMM INDUST +00:00:84 SUPERNET +00:00:FF CAMTEC ELECTRONICS LTD. +00:00:7B RESEARCH MACHINES +00:00:56 DR. B. STRUCK +00:00:BB TRI-DATA +08:00:25 CONTROL DATA +08:00:20 Oracle Corporation +02:70:01 RACAL-DATACOM +08:00:06 SIEMENS AG +08:00:7E AMALGAMATED WIRELESS(AUS) LTD +08:00:75 DANSK DATA ELECTRONIK +08:00:73 TECMAR INC. +08:00:69 SILICON GRAPHICS INC. +08:00:61 JAROGATE LTD. +08:00:5D GOULD INC. +08:00:4E 3COM EUROPE LTD. +08:00:4A BANYAN SYSTEMS INC. +08:00:4C HYDRA COMPUTER SYSTEMS INC. +08:00:43 PIXEL COMPUTER INC. +08:00:3A ORCATECH INC. +08:00:35 MICROFIVE CORPORATION +08:00:36 INTERGRAPH CORPORATION +08:00:2D LAN-TEC INC. +00:00:25 RAMTEK CORP. +00:00:3A CHYRON CORPORATION +00:00:77 INTERPHASE CORPORATION +00:00:96 MARCONI ELECTRONICS LTD. +00:00:76 ABEKAS VIDEO SYSTEM +00:00:EA UPNOD AB +00:00:74 RICOH COMPANY LTD. +00:00:6A COMPUTER CONSOLES INC. +00:00:C4 WATERS DIV. OF MILLIPORE +00:00:06 XEROX CORPORATION +00:01:C8 THOMAS CONRAD CORP. +00:DD:0E UNGERMANN-BASS INC. +08:00:8D XYVISION INC. +08:00:59 A/S MYCRON +02:1C:7C PERQ SYSTEMS CORPORATION +10:00:00 Private +08:00:04 CROMEMCO INCORPORATED +00:DD:07 UNGERMANN-BASS INC. +00:00:3E SIMPACT +04:E0:C4 TRIUMPH-ADLER AG +04:0A:E0 XMIT AG COMPUTER NETWORKS +08:00:16 BARRISTER INFO SYS CORP +08:00:12 BELL ATLANTIC INTEGRATED SYST. +00:01:C8 CONRAD CORP. +00:00:F9 QUOTRON SYSTEMS INC. +00:00:BF SYMMETRIC COMPUTER SYSTEMS +00:00:85 CANON INC. +00:00:28 PRODIGY SYSTEMS CORPORATION +00:00:12 INFORMATION TECHNOLOGY LIMITED +08:00:85 ELXSI +00:00:5B ELTEC ELEKTRONIK AG +00:00:54 Schneider Electric +00:00:A9 NETWORK SYSTEMS CORP. +00:00:59 Hellige GMBH +00:00:99 MTX, INC. +00:00:E9 ISICAD, INC. +08:00:3F FRED KOSCHARA ENTERPRISES +08:00:02 BRIDGE COMMUNICATIONS INC. +08:00:8B PYRAMID TECHNOLOGY CORP. +00:00:02 XEROX CORPORATION +84:F6:FA Miovision Technologies Incorporated +CC:3B:3E Lester Electrical +C0:56:27 Belkin International Inc. +88:07:4B LG Electronics (Mobile Communications) +40:65:A3 Sagemcom Broadband SAS +00:78:9E Sagemcom Broadband SAS +44:E9:DD Sagemcom Broadband SAS +10:F6:81 vivo Mobile Communication Co., Ltd. +B8:88:E3 COMPAL INFORMATION (KUNSHAN) CO., LTD. +00:26:22 COMPAL INFORMATION (KUNSHAN) CO., LTD. +00:1E:EC COMPAL INFORMATION (KUNSHAN) CO., LTD. +DC:0E:A1 COMPAL INFORMATION (KUNSHAN) CO., LTD. +FC:45:96 COMPAL INFORMATION (KUNSHAN) CO., LTD. +20:89:84 COMPAL INFORMATION (KUNSHAN) CO., LTD. +24:7C:4C Herman Miller +18:03:73 Dell Inc. +F8:B1:56 Dell Inc. +1C:40:24 Dell Inc. +F8:BC:12 Dell Inc. +00:1B:5B 2Wire Inc +00:24:56 2Wire Inc +00:23:51 2Wire Inc +00:25:3C 2Wire Inc +00:22:A4 2Wire Inc +C0:83:0A 2Wire Inc +D0:43:1E Dell Inc. +24:6E:96 Dell Inc. +20:47:47 Dell Inc. +4C:76:25 Dell Inc. +B8:AC:6F Dell Inc. +00:1E:C9 Dell Inc. +E0:98:61 Motorola Mobility LLC, a Lenovo Company +F4:F1:E1 Motorola Mobility LLC, a Lenovo Company +74:C9:9A Ericsson AB +3C:19:7D Ericsson AB +60:BE:B5 Motorola Mobility LLC, a Lenovo Company +78:45:C4 Dell Inc. +B4:E1:C4 Microsoft Mobile Oy +D8:6C:02 Huaqin Telecom Technology Co.,Ltd +00:19:D2 Intel Corporate +7C:5C:F8 Intel Corporate +00:1E:67 Intel Corporate +00:1F:3C Intel Corporate +00:22:FA Intel Corporate +00:15:17 Intel Corporate +00:16:6F Intel Corporate +A4:4E:31 Intel Corporate +6C:88:14 Intel Corporate +F8:16:54 Intel Corporate +34:13:E8 Intel Corporate +34:E6:AD Intel Corporate +FC:F8:AE Intel Corporate +64:80:99 Intel Corporate +00:23:14 Intel Corporate +40:25:C2 Intel Corporate +8C:A9:82 Intel Corporate +D0:7E:35 Intel Corporate +68:5D:43 Intel Corporate +90:E2:BA Intel Corporate +00:26:C7 Intel Corporate +80:86:F2 Intel Corporate +78:FF:57 Intel Corporate +20:93:4D FUJIAN STAR-NET COMMUNICATION CO.,LTD +00:AA:00 Intel Corporation +6C:F3:7F Aruba Networks +60:5B:B4 AzureWave Technology Inc. +9C:0E:4A Shenzhen Vastking Electronic Co.,Ltd. +AC:E5:F0 Doppler Labs +00:F2:8B Cisco Systems, Inc +54:14:FD Orbbec 3D Technology International +1C:4B:D6 AzureWave Technology Inc. +94:DB:C9 AzureWave Technology Inc. +40:E2:30 AzureWave Technology Inc. +00:00:6E Artisoft Inc. +A0:F4:59 FN-LINK TECHNOLOGY LIMITED +0C:6A:E6 Stanley Security Solutions +E8:74:E6 ADB Broadband Italia +00:24:7B Actiontec Electronics, Inc +68:9C:5E AcSiP Technology Corp. +00:12:CF Accton Technology Corp +00:30:D3 Agilent Technologies, Inc. +38:22:9D ADB Broadband Italia +00:22:33 ADB Broadband Italia +D4:D1:84 ADB Broadband Italia +34:C3:D2 FN-LINK TECHNOLOGY LIMITED +38:E3:C5 Taicang T&W Electronics +D0:E4:4A Murata Manufacturing Co., Ltd. +94:33:DD Taco Inc +94:88:15 Infinique Worldwide Inc +30:10:B3 Liteon Technology Corporation +00:18:02 Alpha Networks Inc. +EC:CD:6D Allied Telesis, Inc. +74:C2:46 Amazon Technologies Inc. +F0:27:2D Amazon Technologies Inc. +00:22:5F Liteon Technology Corporation +98:3B:16 AMPAK Technology, Inc. +40:2B:A1 Sony Mobile Communications AB +00:25:E7 Sony Mobile Communications AB +D0:51:62 Sony Mobile Communications AB +94:CE:2C Sony Mobile Communications AB +00:1A:80 Sony Corporation +00:24:BE Sony Corporation +00:16:20 Sony Mobile Communications AB +00:12:EE Sony Mobile Communications AB +20:68:9D Liteon Technology Corporation +44:6D:57 Liteon Technology Corporation +44:EE:02 MTI Ltd. +00:26:B6 ASKEY COMPUTER CORP +B4:EE:B4 ASKEY COMPUTER CORP +FC:B4:E6 ASKEY COMPUTER CORP +F0:5C:19 Aruba Networks +C4:3D:C7 NETGEAR +00:0F:B5 NETGEAR +00:09:5B NETGEAR +F8:73:94 NETGEAR +70:AA:B2 BlackBerry RTS +00:26:FF BlackBerry RTS +40:6F:2A BlackBerry RTS +00:25:57 BlackBerry RTS +00:24:FE AVM GmbH +74:5A:AA HUAWEI TECHNOLOGIES CO.,LTD +7C:1C:F1 HUAWEI TECHNOLOGIES CO.,LTD +C0:FF:D4 NETGEAR +40:5D:82 NETGEAR +80:37:73 NETGEAR +00:26:4D Arcadyan Technology Corporation +74:A5:28 HUAWEI TECHNOLOGIES CO.,LTD +30:A2:20 ARG Telecom +78:3E:53 BSkyB Ltd +4C:F2:BF Cambridge Industries(Group) Co.,Ltd. +70:D9:31 Cambridge Industries(Group) Co.,Ltd. +00:E0:63 Cabletron Systems, Inc. +E0:1D:3B Cambridge Industries(Group) Co.,Ltd. +D4:76:EA zte corporation +00:40:FB CASCADE COMMUNICATIONS +F0:5A:09 Samsung Electronics Co.,Ltd +50:32:75 Samsung Electronics Co.,Ltd +28:CC:01 Samsung Electronics Co.,Ltd +B4:62:93 Samsung Electronics Co.,Ltd +04:FE:31 Samsung Electronics Co.,Ltd +84:51:81 Samsung Electronics Co.,Ltd +D8:31:CF Samsung Electronics Co.,Ltd +F8:D0:BD Samsung Electronics Co.,Ltd +FC:C7:34 Samsung Electronics Co.,Ltd +E4:B0:21 Samsung Electronics Co.,Ltd +B0:EC:71 Samsung Electronics Co.,Ltd +3C:BB:FD Samsung Electronics Co.,Ltd +24:F5:AA Samsung Electronics Co.,Ltd +2C:AE:2B Samsung Electronics Co.,Ltd +C4:88:E5 Samsung Electronics Co.,Ltd +7C:91:22 Samsung Electronics Co.,Ltd +E8:B4:C8 Samsung Electronics Co.,Ltd +18:89:5B Samsung Electronics Co.,Ltd +E0:DB:10 Samsung Electronics Co.,Ltd +E0:99:71 Samsung Electronics Co.,Ltd +60:77:E2 Samsung Electronics Co.,Ltd +68:05:71 Samsung Electronics Co.,Ltd +6C:2F:2C Samsung Electronics Co.,Ltd +50:56:BF Samsung Electronics Co.,Ltd +00:01:36 CyberTAN Technology Inc. +F8:8E:85 Comtrend Corporation +30:0D:43 Microsoft Mobile Oy +6C:27:79 Microsoft Mobile Oy +60:7E:DD Microsoft Mobile Oy +F8:80:96 Elsys Equipamentos Eletrônicos Ltda +E0:B9:E5 Technicolor +0C:BF:15 Genetec Inc. +00:0B:5D FUJITSU LIMITED +F4:CA:E5 FREEBOX SAS +00:21:00 Gemtek Technology Co., Ltd. +00:21:47 Nintendo Co., Ltd. +00:22:AA Nintendo Co., Ltd. +00:22:D7 Nintendo Co., Ltd. +00:23:31 Nintendo Co., Ltd. +00:24:1E Nintendo Co., Ltd. +78:A2:A0 Nintendo Co., Ltd. +00:1B:7A Nintendo Co., Ltd. +40:F4:07 Nintendo Co., Ltd. +B8:AE:6E Nintendo Co., Ltd. +60:A8:FE Nokia +54:67:51 Compal Broadband Networks, Inc. +84:BA:3B CANON INC. +00:18:C5 Nokia Danmark A/S +80:50:1B Nokia Corporation +34:7E:39 Nokia Danmark A/S +A8:7E:33 Nokia Danmark A/S +00:24:7D Nokia Danmark A/S +00:1B:AF Nokia Danmark A/S +00:1C:35 Nokia Danmark A/S +00:1C:D4 Nokia Danmark A/S +00:19:79 Nokia Danmark A/S +9C:18:74 Nokia Danmark A/S +00:21:FC Nokia Danmark A/S +00:1F:5D Nokia Danmark A/S +00:25:CF Nokia Danmark A/S +00:25:D0 Nokia Danmark A/S +00:1F:DE Nokia Danmark A/S +90:72:82 Sagemcom Broadband SAS +00:6C:FD Sichuan Changhong Electric Ltd. +1C:23:4F EDMI Europe Ltd +A4:44:D1 Wingtech Group (HongKong)Limited +1C:9E:46 Apple, Inc. +00:50:58 Sangoma Technologies +34:82:DE Kiio Inc +00:08:F6 Sumitomo Electric Industries,Ltd +00:00:5F Sumitomo Electric Industries,Ltd +A0:C5:89 Intel Corporate +74:BF:B7 Nusoft Corporation +50:DA:00 Hangzhou H3C Technologies Co., Limited +9C:2A:83 Samsung Electronics Co.,Ltd +E4:5D:75 Samsung Electronics Co.,Ltd +3C:BE:E1 NIKON CORPORATION +04:7E:4A moobox CO., Ltd. +F0:1B:6C vivo Mobile Communication Co., Ltd. +E0:C7:67 Apple, Inc. +2C:09:CB COBS AB +60:AC:C8 KunTeng Inc. +04:04:EA Valens Semiconductor Ltd. +80:0D:D7 Latticework, Inc +40:2E:28 MiXTelematics +18:C5:01 SHENZHEN GONGJIN ELECTRONICS CO.,LT +54:6D:52 TOPVIEW OPTRONICS CORP. +CC:B3:AB shenzhen Biocare Bio-Medical Equipment Co.,Ltd. +E4:B3:18 Intel Corporate +00:C8:8B Cisco Systems, Inc +A8:5E:E4 12Sided Technology, LLC +00:0C:C1 Eaton Corporation +00:90:F9 Imagine Communications +04:C1:03 Clover Network, Inc. +F8:77:B8 Samsung Electronics Co.,Ltd +1C:55:3A QianGua Corp. +E4:A7:A0 Intel Corporate +E4:FA:ED Samsung Electronics Co.,Ltd +78:96:82 zte corporation +F0:27:45 F-Secure Corporation +54:D0:B4 Xiamen Four-Faith Communication Technology Co.,Ltd +D0:17:C2 ASUSTek COMPUTER INC. +10:DA:43 NETGEAR +00:16:25 Impinj, Inc. +60:EE:5C SHENZHEN FAST TECHNOLOGIES CO.,LTD +58:D6:7A TCPlink +00:A0:DE YAMAHA CORPORATION +08:1F:71 TP-LINK TECHNOLOGIES CO.,LTD. +2C:2D:48 bct electronic GesmbH +E4:A4:71 Intel Corporate +60:B6:17 Fiberhome Telecommunication Technologies Co.,LTD +18:A3:E8 Fiberhome Telecommunication Technologies Co.,LTD +74:1E:93 Fiberhome Telecommunication Technologies Co.,LTD +00:A0:F4 GE +00:CA:E5 Cisco Systems, Inc +48:83:C7 Sagemcom Broadband SAS +70:50:AF BSkyB Ltd +F4:EF:9E SGSG SCIENCE & TECHNOLOGY CO. LTD +DC:9C:9F Shenzhen YOUHUA Technology Co., Ltd +0C:BF:3F Shenzhen Lencotion Technology Co.,Ltd +84:FE:DC Borqs Beijing Ltd. +F0:3E:90 Ruckus Wireless +D8:D7:23 IDS, Inc +70:3A:0E Aruba Networks +70:54:D2 PEGATRON CORPORATION +7C:05:07 PEGATRON CORPORATION +C0:7C:D1 PEGATRON CORPORATION +94:DB:DA HUAWEI TECHNOLOGIES CO.,LTD +38:4C:4F HUAWEI TECHNOLOGIES CO.,LTD +E4:A8:B6 HUAWEI TECHNOLOGIES CO.,LTD +24:4C:07 HUAWEI TECHNOLOGIES CO.,LTD +E8:40:F2 PEGATRON CORPORATION +F0:D1:B8 LEDVANCE +60:B3:87 Synergics Technologies GmbH +70:85:C2 ASRock Incorporation +C8:25:E1 Lemobile Information Technology (Beijing) Co., Ltd +00:22:B1 Elbit Systems Ltd. +00:00:B4 Edimax Technology Co. Ltd. +00:06:5F ECI Telecom Ltd. +00:1F:45 Enterasys +00:90:FA Emulex Corporation +50:C9:71 GN Netcom A/S +00:1D:82 GN Netcom A/S +00:13:17 GN Netcom A/S +74:97:81 zte corporation +B4:B1:5A Siemens AG Energy Management Division +A8:D8:28 Ascensia Diabetes Care +FC:BC:9C Vimar Spa +14:9E:CF Dell Inc. +AC:62:0D Jabil Circuit(Wuxi) Co.,Ltd +00:8C:FA INVENTEC Corporation +00:08:B9 Kaonmedia CO., LTD. +C8:3F:26 Microsoft Corporation +00:E0:E6 INCAA Computers +5C:5E:AB Juniper Networks +78:19:F7 Juniper Networks +2C:21:72 Juniper Networks +88:E0:F3 Juniper Networks +4C:96:14 Juniper Networks +3C:8A:B0 Juniper Networks +B0:C6:9A Juniper Networks +00:90:69 Juniper Networks +20:4E:71 Juniper Networks +F4:B5:2F Juniper Networks +88:A2:5E Juniper Networks +00:1B:C0 Juniper Networks +F4:9E:EF Taicang T&W Electronics +F4:91:1E ZHUHAI EWPE INFORMATION TECHNOLOGY INC +94:FE:22 HUAWEI TECHNOLOGIES CO.,LTD +F8:23:B2 HUAWEI TECHNOLOGIES CO.,LTD +DC:D9:16 HUAWEI TECHNOLOGIES CO.,LTD +00:25:52 VXi Corporation +00:6C:BC Cisco Systems, Inc +DC:37:52 GE +B4:D5:BD Intel Corporate +7C:B0:C2 Intel Corporate +98:AA:3C Will i-tech Co., Ltd. +44:9F:7F DataCore Software Corporation +00:11:FC HARTING Electronics GmbH +5C:DD:70 Hangzhou H3C Technologies Co., Limited +24:BF:74 Private +B8:E7:79 9Solutions Oy +24:0A:11 TCT mobile ltd +78:B8:4B SICHUAN TIANYI COMHEART TELECOMCO.,LTD +C8:45:44 Asia Pacific CIS (Wuxi) Co, Ltd +E8:A7:F2 sTraffic +D8:20:9F Cubro Acronet GesmbH +CC:50:0A Fiberhome Telecommunication Technologies Co.,LTD +A8:60:B6 Apple, Inc. +24:F0:94 Apple, Inc. +90:B0:ED Apple, Inc. +C4:B3:01 Apple, Inc. +E0:5F:45 Apple, Inc. +48:3B:38 Apple, Inc. +E4:7B:3F BEIJING CO-CLOUD TECHNOLOGY LTD. +A0:41:5E Opsens Solution Inc. +1C:6E:76 Quarion Technology Inc +00:0A:AB Toyota Technical Development Corporation +44:D1:FA Shenzhen Yunlink Technology Co., Ltd +08:C0:21 HUAWEI TECHNOLOGIES CO.,LTD +48:43:5A HUAWEI TECHNOLOGIES CO.,LTD +9C:E3:74 HUAWEI TECHNOLOGIES CO.,LTD +40:F4:20 SICHUAN TIANYI COMHEART TELECOMCO.,LTD +6C:0E:E6 Chengdu Xiyida Electronic Technology Co,.Ltd +78:FF:CA TECNO MOBILE LIMITED +F0:3E:BF GOGORO TAIWAN LIMITED +50:AB:3E Qibixx AG +A8:BB:50 WiZ IoT Company Limited +00:5F:86 Cisco Systems, Inc +E4:62:51 HAO CHENG GROUP LIMITED +88:50:DD Infiniband Trade Association +DC:78:34 LOGICOM SA +54:F2:01 Samsung Electronics Co.,Ltd +A0:60:90 Samsung Electronics Co.,Ltd +38:76:CA Shenzhen Smart Intelligent Technology Co.Ltd +D0:57:7B Intel Corporate +B8:24:F0 SOYO Technology Development Co., Ltd. +B4:56:B9 Teraspek Technologies Co.,Ltd +A0:09:ED Avaya Inc +68:B3:5E Shenzhen Neostra Technology Co.Ltd +24:E2:71 Qingdao Hisense Communications Co.,Ltd. +BC:60:10 Qingdao Hisense Communications Co.,Ltd. +AC:37:43 HTC Corporation +60:31:97 ZyXEL Communications Corporation +00:19:CB ZyXEL Communications Corporation +FC:F5:28 ZyXEL Communications Corporation +58:8B:F3 ZyXEL Communications Corporation +EC:43:F6 5420 +D8:B0:2E Guangzhou Zonerich Business Machine Co., LTD. +DC:1A:C5 vivo Mobile Communication Co., Ltd. +84:9D:64 SMC Corporation +A0:20:A6 Espressif Inc. +88:F7:C7 Technicolor CH USA Inc. +08:95:2A Technicolor CH USA Inc. +C4:BB:4C Zebra Information Tech Co. Ltd +8C:04:FF Technicolor CH USA Inc. +10:4F:A8 Sony Corporation +6C:25:B9 BBK EDUCATIONAL ELECTRONICS CORP.,LTD. +48:6B:2C BBK EDUCATIONAL ELECTRONICS CORP.,LTD. +00:00:1F Telco Systems, Inc. +00:16:D3 Wistron Neweb Corporation +00:1F:16 Wistron Neweb Corporation +BC:30:7E Wistron Neweb Corporation +00:C0:AB Telco Systems, Inc. +00:10:CA Telco Systems, Inc. +0C:25:76 LONGCHEER TELECOMMUNICATION LIMITED +00:07:A6 Leviton Manufacturing Co., Inc. +20:87:56 SIEMENS AG +B0:89:00 HUAWEI TECHNOLOGIES CO.,LTD +A0:3E:6B IEEE Registration Authority +DC:44:27 IEEE Registration Authority +00:55:DA IEEE Registration Authority +90:C6:82 IEEE Registration Authority +98:6D:35 IEEE Registration Authority +E0:B6:F5 IEEE Registration Authority +C4:7C:8D IEEE Registration Authority +00:1B:C5 IEEE Registration Authority +64:0D:CE SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. +00:A0:85 Private +AC:DE:48 Private +10:07:23 IEEE Registration Authority +60:63:F9 Ciholas, Inc. +F0:42:1C Intel Corporate +C0:E4:2D TP-LINK TECHNOLOGIES CO.,LTD. +18:D6:C7 TP-LINK TECHNOLOGIES CO.,LTD. +B8:BB:23 Guangdong Nufront CSC Co., Ltd +EC:26:FB TECC CO.,LTD. +10:68:3F LG Electronics (Mobile Communications) +A0:39:F7 LG Electronics (Mobile Communications) +64:BC:0C LG Electronics (Mobile Communications) +00:90:CC PLANEX COMMUNICATIONS INC. +E0:9D:B8 PLANEX COMMUNICATIONS INC. +64:89:9A LG Electronics (Mobile Communications) +58:A2:B5 LG Electronics (Mobile Communications) +74:A7:22 LG Electronics (Mobile Communications) +00:1F:6B LG Electronics (Mobile Communications) +90:3A:E6 PARROT SA +00:E0:0F Shanghai Baud Data Communication Co.,Ltd. +3C:40:4F GUANGDONG PISEN ELECTRONICS CO.,LTD +F0:AC:D7 IEEE Registration Authority +1C:EA:1B Alcatel-Lucent Canada +00:23:3E Alcatel-Lucent IPD +6C:BE:E9 Alcatel-Lucent IPD +4C:C9:4F Alcatel-Lucent Canada +00:80:F7 Zenith Electronics Corporation +00:C0:95 ZNYX Networks, Inc. +60:EB:69 QUANTA COMPUTER INC. +C8:0A:A9 QUANTA COMPUTER INC. +00:23:8B QUANTA COMPUTER INC. +00:07:BA UTStarcom Inc +44:39:C4 Universal Global Scientific Industrial Co., Ltd. +70:F3:95 Universal Global Scientific Industrial Co., Ltd. +00:1E:37 Universal Global Scientific Industrial Co., Ltd. +00:27:13 Universal Global Scientific Industrial Co., Ltd. +00:21:86 Universal Global Scientific Industrial Co., Ltd. +80:2A:A8 Ubiquiti Networks +00:15:6D Ubiquiti Networks +8C:FD:F0 Qualcomm Inc. +00:00:31 QPSX COMMUNICATIONS, LTD. +00:0E:7B Toshiba +B8:6B:23 Toshiba +00:0C:29 VMware, Inc. +00:50:56 VMware, Inc. +9C:61:21 SICHUAN TIANYI COMHEART TELECOMCO.,LTD +00:1C:4D Aplix IP Holdings Corporation +D0:05:2A Arcadyan Corporation +F4:85:C6 FDT Technologies +BC:60:A7 Sony Interactive Entertainment Inc. +08:D8:33 Shenzhen RF Technology Co., Ltd +94:D4:69 Cisco Systems, Inc +38:56:10 CANDY HOUSE, Inc. +20:F5:43 Hui Zhou Gaoshengda Technology Co.,LTD +68:53:88 P&S Technology +48:F7:F1 Alcatel-Lucent Canada +10:E8:78 Alcatel-Lucent Canada +54:A6:19 Alcatel-Lucent Shanghai Bell Co., Ltd +18:80:F5 Alcatel-Lucent Shanghai Bell Co., Ltd +F0:25:B7 SAMSUNG ELECTRO-MECHANICS(THAILAND) +C8:BA:94 SAMSUNG ELECTRO-MECHANICS(THAILAND) +EC:1F:72 SAMSUNG ELECTRO-MECHANICS(THAILAND) +8C:0D:76 HUAWEI TECHNOLOGIES CO.,LTD +00:5A:13 HUAWEI TECHNOLOGIES CO.,LTD +24:DB:ED Samsung Electronics Co.,Ltd +AC:36:13 Samsung Electronics Co.,Ltd +14:49:E0 SAMSUNG ELECTRO-MECHANICS(THAILAND) +C0:BD:D1 SAMSUNG ELECTRO-MECHANICS(THAILAND) +E8:50:8B SAMSUNG ELECTRO-MECHANICS(THAILAND) +1C:AF:05 Samsung Electronics Co.,Ltd +E4:92:FB Samsung Electronics Co.,Ltd +24:7F:20 Sagemcom Broadband SAS +00:73:E0 Samsung Electronics Co.,Ltd +BC:44:86 Samsung Electronics Co.,Ltd +38:0B:40 Samsung Electronics Co.,Ltd +98:52:B1 Samsung Electronics Co.,Ltd +14:89:FD Samsung Electronics Co.,Ltd +CC:FE:3C Samsung Electronics Co.,Ltd +78:9E:D0 Samsung Electronics Co.,Ltd +E4:40:E2 Samsung Electronics Co.,Ltd +8C:77:12 5481 +00:07:AB 5481 +00:24:90 Samsung Electronics Co.,Ltd +00:23:D7 Samsung Electronics Co.,Ltd +FC:A1:3E Samsung Electronics Co.,Ltd +A0:07:98 Samsung Electronics Co.,Ltd +94:51:03 Samsung Electronics Co.,Ltd +C8:19:F7 Samsung Electronics Co.,Ltd +2C:44:01 Samsung Electronics Co.,Ltd +84:E0:F4 IEEE Registration Authority +08:C6:B3 QTECH LLC +64:DA:A0 Robert Bosch Smart Home GmbH +14:B8:37 Shenzhen YOUHUA Technology Co., Ltd +60:4B:AA Private +CC:73:14 HONG KONG WHEATEK TECHNOLOGY LIMITED +64:74:F6 Shooter Detection Systems +98:E7:F4 Hewlett Packard +D4:2C:44 Cisco Systems, Inc +D8:42:E2 Canary Connect, Inc. +00:19:72 Plexus (Xiamen) Co.,ltd. +64:88:FF Sichuan Changhong Electric Ltd. +00:59:79 Networked Energy Services +00:09:97 Nortel Networks +00:0E:62 Nortel Networks +00:0E:C0 Nortel Networks +00:0F:CD Nortel Networks +00:04:DC Nortel Networks +02:E6:D3 NIXDORF COMPUTER CORP. +00:16:B9 ProCurve Networking by HP +00:24:A8 ProCurve Networking by HP +CC:3A:DF Private +14:1F:78 Samsung Electronics Co.,Ltd +00:6F:64 Samsung Electronics Co.,Ltd +DC:66:72 Samsung Electronics Co.,Ltd +00:25:C3 21168 +00:13:65 Nortel Networks +00:1E:CA Nortel Networks +00:1D:42 Nortel Networks +00:1C:EB Nortel Networks +00:23:63 Zhuhai Raysharp Technology Co.,Ltd +D0:37:42 Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd +00:1C:FD Universal Electronics, Inc. +08:00:51 ExperData +00:80:C7 XIRCOM +04:9F:CA HUAWEI TECHNOLOGIES CO.,LTD +C8:1F:BE HUAWEI TECHNOLOGIES CO.,LTD +20:3D:B2 HUAWEI TECHNOLOGIES CO.,LTD +48:D5:39 HUAWEI TECHNOLOGIES CO.,LTD +10:E6:8F KWANGSUNG ELECTRONICS KOREA CO.,LTD. +18:99:F5 Sichuan Changhong Electric Ltd. +E4:1D:2D Mellanox Technologies, Inc. +B8:00:18 Htel +00:81:C4 Cisco Systems, Inc +E8:FD:90 Turbostor +00:17:EA Texas Instruments +00:17:E3 Texas Instruments +00:18:34 Texas Instruments +00:18:2F Texas Instruments +78:DE:E4 Texas Instruments +B8:FF:FE Texas Instruments +E0:D7:BA Texas Instruments +40:5F:C2 Texas Instruments +80:30:DC Texas Instruments +CC:78:AB Texas Instruments +A4:D5:78 Texas Instruments +54:4A:16 Texas Instruments +D8:DD:FD Texas Instruments +20:CD:39 Texas Instruments +98:7B:F3 Texas Instruments +24:71:89 Texas Instruments +EC:11:27 Texas Instruments +F0:C7:7F Texas Instruments +F4:5E:AB Texas Instruments +00:17:83 Texas Instruments +A8:1B:6A Texas Instruments +98:84:E3 Texas Instruments +38:D2:69 Texas Instruments +C8:FD:19 Texas Instruments +50:8C:B1 Texas Instruments +04:BB:F9 Pavilion Data Systems Inc +B0:F8:93 Shanghai MXCHIP Information Technology Co., Ltd. +00:C0:17 NetScout Systems, Inc. +D4:9B:5C Chongqing Miedu Technology Co., Ltd. +EC:8C:A2 Ruckus Wireless +C0:D3:91 IEEE Registration Authority +C4:11:E0 Bull Group Co., Ltd +84:61:A0 ARRIS Group, Inc. +0C:F8:93 ARRIS Group, Inc. +14:AB:F0 ARRIS Group, Inc. +AC:B3:13 ARRIS Group, Inc. +30:60:23 ARRIS Group, Inc. +00:1D:D6 ARRIS Group, Inc. +90:84:2B LEGO System A/S +84:C7:EA Sony Mobile Communications AB +00:1D:D1 ARRIS Group, Inc. +60:19:71 ARRIS Group, Inc. +00:00:CA ARRIS Group, Inc. +00:15:96 ARRIS Group, Inc. +00:15:A2 ARRIS Group, Inc. +00:13:11 ARRIS Group, Inc. +8C:61:02 Beijing Baofengmojing Technologies Co., Ltd +1C:1B:68 ARRIS Group, Inc. +44:E1:37 ARRIS Group, Inc. +E8:33:81 ARRIS Group, Inc. +10:05:B1 ARRIS Group, Inc. +10:86:8C ARRIS Group, Inc. +00:1A:DB ARRIS Group, Inc. +00:23:75 ARRIS Group, Inc. +00:24:A1 ARRIS Group, Inc. +A4:ED:4E ARRIS Group, Inc. +00:26:42 ARRIS Group, Inc. +00:24:95 ARRIS Group, Inc. +2C:9E:5F ARRIS Group, Inc. +C8:AA:21 ARRIS Group, Inc. +34:1F:E4 ARRIS Group, Inc. +40:0D:10 ARRIS Group, Inc. +00:26:D9 ARRIS Group, Inc. +28:C8:7A ARRIS Group, Inc. +54:E2:E0 ARRIS Group, Inc. +A0:55:DE ARRIS Group, Inc. +A0:C5:62 ARRIS Group, Inc. +FC:6F:B7 ARRIS Group, Inc. +00:D0:37 ARRIS Group, Inc. +00:15:2F ARRIS Group, Inc. +00:11:1A ARRIS Group, Inc. +00:16:26 ARRIS Group, Inc. +00:18:A4 ARRIS Group, Inc. +00:1A:1B ARRIS Group, Inc. +00:14:9A ARRIS Group, Inc. +00:15:CE ARRIS Group, Inc. +00:20:40 ARRIS Group, Inc. +00:11:AE ARRIS Group, Inc. +00:0F:9F ARRIS Group, Inc. +00:0B:06 ARRIS Group, Inc. +00:1D:6B ARRIS Group, Inc. +00:1C:C1 ARRIS Group, Inc. +00:1C:11 ARRIS Group, Inc. +00:1F:7E ARRIS Group, Inc. +00:13:71 ARRIS Group, Inc. +00:1D:BE ARRIS Group, Inc. +00:1E:5A ARRIS Group, Inc. +FC:91:14 Technicolor CH USA Inc. +1C:25:E1 China Mobile IOT Company Limited +C0:F6:36 Hangzhou Kuaiyue Technologies, Ltd. +74:23:44 Xiaomi Communications Co Ltd +F0:03:8C AzureWave Technology Inc. +B4:5D:50 Aruba Networks +00:1E:7D Samsung Electronics Co.,Ltd +00:21:D2 5481 +BC:47:60 5481 +20:13:E0 5481 +D0:17:6A 5481 +78:D6:F0 SAMSUNG ELECTRO MECHANICS CO., LTD. +B4:07:F9 SAMSUNG ELECTRO MECHANICS CO., LTD. +3C:62:00 Samsung Electronics Co.,Ltd +00:24:E9 Samsung Electronics Co.,Ltd +00:23:99 Samsung Electronics Co.,Ltd +E4:E0:C5 Samsung Electronics Co.,Ltd +E8:03:9A Samsung Electronics Co.,Ltd +C4:73:1E Samsung Electronics Co.,Ltd +D8:79:88 Hon Hai Precision Ind. Co.,Ltd. +00:24:2B Hon Hai Precision Ind. Co.,Ltd. +00:24:2C Hon Hai Precision Ind. Co.,Ltd. +94:53:30 Hon Hai Precision Ind. Co.,Ltd. +A8:6B:AD Hon Hai Precision Ind. Co.,Ltd. +D8:0F:99 Hon Hai Precision Ind. Co.,Ltd. +80:56:F2 Hon Hai Precision Ind. Co.,Ltd. +70:18:8B Hon Hai Precision Ind. Co.,Ltd. +3C:77:E6 Hon Hai Precision Ind. Co.,Ltd. +0C:84:DC Hon Hai Precision Ind. Co.,Ltd. +84:4B:F5 Hon Hai Precision Ind. Co.,Ltd. +E0:06:E6 Hon Hai Precision Ind. Co.,Ltd. +60:F4:94 Hon Hai Precision Ind. Co.,Ltd. +A4:17:31 Hon Hai Precision Ind. Co.,Ltd. +C0:14:3D Hon Hai Precision Ind. Co.,Ltd. +64:27:37 Hon Hai Precision Ind. Co.,Ltd. +60:D8:19 Hon Hai Precision Ind. Co.,Ltd. +40:B8:9A Hon Hai Precision Ind. Co.,Ltd. +A8:A7:95 Hon Hai Precision Ind. Co.,Ltd. +80:96:CA Hon Hai Precision Ind. Co.,Ltd. +9C:D2:1E Hon Hai Precision Ind. Co.,Ltd. +EC:0E:C4 Hon Hai Precision Ind. Co.,Ltd. +74:29:AF Hon Hai Precision Ind. Co.,Ltd. +34:68:95 Hon Hai Precision Ind. Co.,Ltd. +78:DD:08 Hon Hai Precision Ind. Co.,Ltd. +00:19:7E Hon Hai Precision Ind. Co.,Ltd. +C0:CB:38 Hon Hai Precision Ind. Co.,Ltd. +C0:F9:45 Toshiba Toko meter systems co., LTD. +A0:AB:1B D-Link International +08:6A:0A ASKEY COMPUTER CORP +58:46:E1 Baxter International Inc +00:D0:BD Lattice Semiconductor Corp. (LPA) +F0:82:61 Sagemcom Broadband SAS +D0:84:B0 Sagemcom Broadband SAS +00:FE:C8 Cisco Systems, Inc +00:30:C5 CADENCE DESIGN SYSTEMS, INC. +EC:22:80 D-Link International +04:78:63 Shanghai MXCHIP Information Technology Co., Ltd. +24:BA:13 RISO KAGAKU CORPORATION +24:DA:11 NO NDA Inc +70:CA:4D Shenzhen lnovance Technology Co.,Ltd. +DC:C0:EB ASSA ABLOY CÔTE PICARDE +00:17:35 Intel Wireless Network Group +9C:DF:B1 Shenzhen Crave Communication Co., LTD +5C:F9:38 Apple, Inc. +38:71:DE Apple, Inc. +BC:54:36 Apple, Inc. +0C:C7:31 Currant, Inc. +00:14:2F Savvius +2C:DD:A3 Point Grey Research Inc. +24:FD:5B SmartThings, Inc. +28:76:CD Funshion Online Technologies Co.,Ltd +F4:F5:D8 Google, Inc. +F4:F5:E8 Google, Inc. +F8:8F:CA Google, Inc. +BC:D1:D3 Shenzhen TINNO Mobile Technology Corp. +BC:44:34 Shenzhen TINNO Mobile Technology Corp. +00:41:D2 Cisco Systems, Inc +4C:FB:45 HUAWEI TECHNOLOGIES CO.,LTD +A4:BA:76 HUAWEI TECHNOLOGIES CO.,LTD +78:E3:B5 Hewlett Packard +98:4B:E1 Hewlett Packard +68:B5:99 Hewlett Packard +0C:47:C9 Amazon Technologies Inc. +14:D6:4D D-Link International +C8:BE:19 D-Link International +BC:F6:85 D-Link International +CC:B2:55 D-Link International +84:C9:B2 D-Link International +DC:D3:21 HUMAX Co., Ltd. +CC:4E:EC HUMAX Co., Ltd. +DC:33:0D Qingdao Haier Telecom Co.,Ltd +00:80:E1 STMicroelectronics SRL +58:DC:6D Exceptional Innovation, Inc. +00:09:2D HTC Corporation +F8:DB:7F HTC Corporation +E8:99:C4 HTC Corporation +7C:B1:5D HUAWEI TECHNOLOGIES CO.,LTD +18:68:6A zte corporation +0C:05:35 Juniper Systems +8C:F2:28 SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. +08:EA:44 Aerohive Networks Inc. +78:F8:82 LG Electronics (Mobile Communications) +88:51:FB Hewlett Packard +AC:16:2D Hewlett Packard +A0:B3:CC Hewlett Packard +E4:11:5B Hewlett Packard +C8:CB:B8 Hewlett Packard +94:57:A5 Hewlett Packard +00:01:E7 Hewlett Packard +08:00:09 Hewlett Packard +00:80:A0 Hewlett Packard +D4:85:64 Hewlett Packard +3C:4A:92 Hewlett Packard +78:0A:C7 Baofeng TV Co., Ltd. +00:1D:73 BUFFALO.INC +00:16:01 BUFFALO.INC +10:6F:3F BUFFALO.INC +88:57:EE BUFFALO.INC +00:9C:02 Hewlett Packard +78:E7:D1 Hewlett Packard +00:1B:78 Hewlett Packard +00:1E:0B Hewlett Packard +2C:6E:85 Intel Corporate +00:D0:B7 Intel Corporation +00:02:B3 Intel Corporation +00:11:11 Intel Corporation +00:13:20 Intel Corporate +00:12:F0 Intel Corporate +90:49:FA Intel Corporate +C8:34:8E Intel Corporate +00:50:8B Hewlett Packard +78:48:59 Hewlett Packard +14:58:D0 Hewlett Packard +50:65:F3 Hewlett Packard +A0:48:1C Hewlett Packard +A0:1D:48 Hewlett Packard +94:B2:CC PIONEER CORPORATION +88:7F:03 Comper Technology Investment Limited +E0:60:66 Sercomm Corporation +00:19:E0 TP-LINK TECHNOLOGIES CO.,LTD. +00:23:CD TP-LINK TECHNOLOGIES CO.,LTD. +00:27:19 TP-LINK TECHNOLOGIES CO.,LTD. +40:16:9F TP-LINK TECHNOLOGIES CO.,LTD. +94:0C:6D TP-LINK TECHNOLOGIES CO.,LTD. +74:EA:3A TP-LINK TECHNOLOGIES CO.,LTD. +90:F6:52 TP-LINK TECHNOLOGIES CO.,LTD. +10:FE:ED TP-LINK TECHNOLOGIES CO.,LTD. +C4:6E:1F TP-LINK TECHNOLOGIES CO.,LTD. +50:FA:84 TP-LINK TECHNOLOGIES CO.,LTD. +F4:83:CD TP-LINK TECHNOLOGIES CO.,LTD. +88:25:93 TP-LINK TECHNOLOGIES CO.,LTD. +80:89:17 TP-LINK TECHNOLOGIES CO.,LTD. +5C:89:9A TP-LINK TECHNOLOGIES CO.,LTD. +A8:1B:5A GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD +E4:22:A5 PLANTRONICS, INC. +1C:99:4C Murata Manufacturing Co., Ltd. +F0:27:65 Murata Manufacturing Co., Ltd. +D4:97:0B Xiaomi Communications Co Ltd +F4:8B:32 Xiaomi Communications Co Ltd +20:A7:83 miControl GmbH +00:50:53 Cisco Systems, Inc +00:50:0F Cisco Systems, Inc +04:8A:15 Avaya Inc +44:32:2A Avaya Inc +FC:83:99 Avaya Inc +00:04:0D Avaya Inc +D8:42:AC Shanghai Feixun Communication Co.,Ltd. +34:CD:BE HUAWEI TECHNOLOGIES CO.,LTD +D4:6A:A8 HUAWEI TECHNOLOGIES CO.,LTD +54:39:DF HUAWEI TECHNOLOGIES CO.,LTD +48:46:FB HUAWEI TECHNOLOGIES CO.,LTD +20:0B:C7 HUAWEI TECHNOLOGIES CO.,LTD +10:47:80 HUAWEI TECHNOLOGIES CO.,LTD +88:30:8A Murata Manufacturing Co., Ltd. +44:A7:CF Murata Manufacturing Co., Ltd. +00:13:E0 Murata Manufacturing Co., Ltd. +74:8E:F8 Brocade Communications Systems, Inc. +00:E0:52 Brocade Communications Systems, Inc. +00:04:80 Brocade Communications Systems, Inc. +00:00:88 Brocade Communications Systems, Inc. +34:4B:50 zte corporation +FC:C8:97 zte corporation +9C:D2:4B zte corporation +C8:64:C7 zte corporation +D0:15:4A zte corporation +88:E3:AB HUAWEI TECHNOLOGIES CO.,LTD +00:66:4B HUAWEI TECHNOLOGIES CO.,LTD +68:A0:F6 HUAWEI TECHNOLOGIES CO.,LTD +5C:F9:6A HUAWEI TECHNOLOGIES CO.,LTD +B4:30:52 HUAWEI TECHNOLOGIES CO.,LTD +88:CE:FA HUAWEI TECHNOLOGIES CO.,LTD +58:2A:F7 HUAWEI TECHNOLOGIES CO.,LTD +F4:8E:92 HUAWEI TECHNOLOGIES CO.,LTD +40:CB:A8 HUAWEI TECHNOLOGIES CO.,LTD +08:7A:4C HUAWEI TECHNOLOGIES CO.,LTD +D4:6E:5C HUAWEI TECHNOLOGIES CO.,LTD +24:69:A5 HUAWEI TECHNOLOGIES CO.,LTD +C8:D1:5E HUAWEI TECHNOLOGIES CO.,LTD +F8:3D:FF HUAWEI TECHNOLOGIES CO.,LTD +30:87:30 HUAWEI TECHNOLOGIES CO.,LTD +00:25:68 HUAWEI TECHNOLOGIES CO.,LTD +D4:78:56 Avaya Inc +C0:57:BC Avaya Inc +38:BB:3C Avaya Inc +E4:5D:52 Avaya Inc +A4:25:1B Avaya Inc +6C:A8:49 Avaya Inc +30:D1:7E HUAWEI TECHNOLOGIES CO.,LTD +9C:28:EF HUAWEI TECHNOLOGIES CO.,LTD +7C:60:97 HUAWEI TECHNOLOGIES CO.,LTD +60:DE:44 HUAWEI TECHNOLOGIES CO.,LTD +34:00:A3 HUAWEI TECHNOLOGIES CO.,LTD +64:3E:8C HUAWEI TECHNOLOGIES CO.,LTD +00:C6:10 Apple, Inc. +70:DE:E2 Apple, Inc. +18:20:32 Apple, Inc. +6C:C2:6B Apple, Inc. +10:40:F3 Apple, Inc. +FC:25:3F Apple, Inc. +18:34:51 Apple, Inc. +C0:84:7A Apple, Inc. +64:20:0C Apple, Inc. +74:E1:B6 Apple, Inc. +0C:77:1A Apple, Inc. +00:F4:B9 Apple, Inc. +C8:33:4B Apple, Inc. +B8:F6:B1 Apple, Inc. +C0:9F:42 Apple, Inc. +18:9E:FC Apple, Inc. +6C:3E:6D Apple, Inc. +00:16:FE ALPS ELECTRIC CO.,LTD. +04:98:F3 ALPS ELECTRIC CO.,LTD. +38:C0:96 ALPS ELECTRIC CO.,LTD. +E0:75:0A ALPS ELECTRIC CO.,LTD. +B0:59:47 Shenzhen Qihu Intelligent Technology Company Limited +00:E0:4F Cisco Systems, Inc +00:10:11 Cisco Systems, Inc +00:10:F6 Cisco Systems, Inc +80:E0:1D Cisco Systems, Inc +80:E8:6F Cisco Systems, Inc +E4:AA:5D Cisco Systems, Inc +00:03:89 PLANTRONICS, INC. +0C:E0:E4 PLANTRONICS, INC. +B0:AA:77 Cisco Systems, Inc +78:BA:F9 Cisco Systems, Inc +00:16:B6 Cisco-Linksys, LLC +00:18:F8 Cisco-Linksys, LLC +00:25:2E Cisco SPVTG +A4:A2:4A Cisco SPVTG +60:2A:D0 Cisco SPVTG +00:1B:FB ALPS ELECTRIC CO.,LTD. +00:E0:8F Cisco Systems, Inc +20:3A:07 Cisco Systems, Inc +34:A8:4E Cisco Systems, Inc +E4:D3:F1 Cisco Systems, Inc +1C:E6:C7 Cisco Systems, Inc +E0:2F:6D Cisco Systems, Inc +84:78:AC Cisco Systems, Inc +44:03:A7 Cisco Systems, Inc +68:86:A7 Cisco Systems, Inc +B4:E9:B0 Cisco Systems, Inc +00:08:32 Cisco Systems, Inc +B0:FA:EB Cisco Systems, Inc +50:06:04 Cisco Systems, Inc +70:10:5C Cisco Systems, Inc +7C:FA:DF Apple, Inc. +10:1C:0C Apple, Inc. +00:11:24 Apple, Inc. +00:1D:4F Apple, Inc. +00:1E:52 Apple, Inc. +00:1F:5B Apple, Inc. +00:1F:F3 Apple, Inc. +00:21:E9 Apple, Inc. +00:23:6C Apple, Inc. +00:25:00 Apple, Inc. +60:FB:42 Apple, Inc. +14:DA:E9 ASUSTek COMPUTER INC. +3C:08:F6 Cisco Systems, Inc +D0:72:DC Cisco Systems, Inc +28:C7:CE Cisco Systems, Inc +6C:FA:89 Cisco Systems, Inc +58:F3:9C Cisco Systems, Inc +34:62:88 Cisco Systems, Inc +88:1D:FC Cisco Systems, Inc +F8:1E:DF Apple, Inc. +90:84:0D Apple, Inc. +D8:A2:5E Apple, Inc. +C8:BC:C8 Apple, Inc. +28:E7:CF Apple, Inc. +D8:9E:3F Apple, Inc. +04:0C:CE Apple, Inc. +A4:D1:D2 Apple, Inc. +40:6C:8F Apple, Inc. +C0:67:AF Cisco Systems, Inc +64:E9:50 Cisco Systems, Inc +18:9C:5D Cisco Systems, Inc +00:0E:A6 ASUSTek COMPUTER INC. +00:13:D4 ASUSTek COMPUTER INC. +00:26:18 ASUSTek COMPUTER INC. +00:24:8C ASUSTek COMPUTER INC. +00:50:A2 Cisco Systems, Inc +00:50:F0 Cisco Systems, Inc +00:90:5F Cisco Systems, Inc +00:90:2B Cisco Systems, Inc +00:10:0B Cisco Systems, Inc +00:10:0D Cisco Systems, Inc +00:10:14 Cisco Systems, Inc +64:9A:BE Apple, Inc. +94:E9:6A Apple, Inc. +AC:29:3A Apple, Inc. +10:41:7F Apple, Inc. +70:14:A6 Apple, Inc. +A8:66:7F Apple, Inc. +D0:25:98 Apple, Inc. +CC:29:F5 Apple, Inc. +6C:70:9F Apple, Inc. +0C:3E:9F Apple, Inc. +34:E2:FD Apple, Inc. +60:92:17 Apple, Inc. +88:63:DF Apple, Inc. +80:E6:50 Apple, Inc. +00:61:71 Apple, Inc. +90:FD:61 Apple, Inc. +5C:97:F3 Apple, Inc. +6C:40:08 Apple, Inc. +24:A0:74 Apple, Inc. +F0:24:75 Apple, Inc. +20:A2:E4 Apple, Inc. +5C:F5:DA Apple, Inc. +D4:B8:FF Home Control Singapore Pte Ltd +28:E1:4C Apple, Inc. +54:E4:3A Apple, Inc. +C8:E0:EB Apple, Inc. +A8:88:08 Apple, Inc. +90:72:40 Apple, Inc. +0C:4D:E9 Apple, Inc. +D8:96:95 Apple, Inc. +0C:30:21 Apple, Inc. +F0:F6:1C Apple, Inc. +B0:34:95 Apple, Inc. +84:8E:0C Apple, Inc. +8C:2D:AA Apple, Inc. +44:4C:0C Apple, Inc. +84:FC:FE Apple, Inc. +E4:8B:7F Apple, Inc. +5C:96:9D Apple, Inc. +A8:FA:D8 Apple, Inc. +94:94:26 Apple, Inc. +E0:F5:C6 Apple, Inc. +AC:64:62 zte corporation +C0:84:88 Finis Inc +68:E8:EB Linktel Technologies Co.,Ltd +20:C3:A4 RetailNext +78:05:41 Queclink Wireless Solutions Co., Ltd +C0:2D:EE Cuff +54:A3:FA BQT Solutions (Australia)Pty Ltd +90:23:EC Availink, Inc. +74:67:F7 Zebra Technologoes +38:91:D5 Hangzhou H3C Technologies Co., Limited +90:DF:FB HOMERIDER SYSTEMS +3C:83:1E CKD Corporation +38:1C:23 Hilan Technology CO.,LTD +E0:36:76 HUAWEI TECHNOLOGIES CO.,LTD +3C:B7:2B PLUMgrid Inc +24:31:84 SHARP Corporation +24:DA:9B Motorola Mobility LLC, a Lenovo Company +30:52:CB Liteon Technology Corporation +B8:B2:EB Googol Technology (HK) Limited +C4:00:49 Kamama +50:A9:DE Smartcom - Bulgaria AD +88:09:AF Masimo Corp. +E8:DE:D6 Intrising Networks, Inc. +B8:44:D9 Apple, Inc. +DC:2B:2A Apple, Inc. +8C:10:D4 Sagemcom Broadband SAS +B8:3A:9D FIVE INTERACTIVE, LLC +08:9B:4B iKuai Networks +3C:78:73 Airsonics +BC:5F:F6 SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. +C8:F9:C8 NewSharp Technology(SuZhou)Co,Ltd +3C:5C:C3 Shenzhen First Blue Chip Technology Ltd +A8:74:1D PHOENIX CONTACT Electronics GmbH +A4:C1:38 Telink Semiconductor (Taipei) Co. Ltd. +D8:EF:CD Nokia +EC:01:33 TRINUS SYSTEMS INC. +1C:56:FE Motorola Mobility LLC, a Lenovo Company +7C:A2:3E HUAWEI TECHNOLOGIES CO.,LTD +50:1A:A5 GN Netcom A/S +F0:9A:51 Shanghai Viroyal Electronic Technology Company Limited +98:70:E8 INNATECH SDN BHD +50:DF:95 Lytx +58:49:25 E3 Enterprise +94:F2:78 Elma Electronic +E8:BD:D1 HUAWEI TECHNOLOGIES CO.,LTD +34:81:F4 SST Taiwan Ltd. +F4:B8:A7 zte corporation +58:F1:02 BLU Products Inc. +B8:69:C2 Sunitec Enterprise Co., Ltd. +2C:C5:48 IAdea Corporation +30:7C:B2 ANOV FRANCE +90:D8:F3 zte corporation +44:4C:A8 Arista Networks +FC:E3:3C HUAWEI TECHNOLOGIES CO.,LTD +BC:6A:2F Henge Docks LLC +E4:90:7E Motorola Mobility LLC, a Lenovo Company +48:06:6A Tempered Networks, Inc. +1C:F0:3E Wearhaus Inc. +DC:DB:70 Tonfunk Systementwicklung und Service GmbH +C4:7D:46 FUJITSU LIMITED +68:ED:A4 Shenzhen Seavo Technology Co.,Ltd +B8:99:B0 Cohere Technologies +2C:C5:D3 Ruckus Wireless +80:C5:E6 Microsoft Corporation +D8:5D:EF Busch-Jaeger Elektro GmbH +10:DF:8B Shenzhen CareDear Communication Technology Co.,Ltd +00:A7:84 ITX security +80:01:84 HTC Corporation +38:FA:CA Skyworth Digital Technology(Shenzhen) Co.,Ltd +44:C6:9B Wuhan Feng Tian Information Network CO.,LTD +C0:25:67 Nexxt Solutions +B4:6D:35 Dalian Seasky Automation Co;Ltd +B8:9A:CD ELITE OPTOELECTRONIC(ASIA)CO.,LTD +24:1C:04 SHENZHEN JEHE TECHNOLOGY DEVELOPMENT CO., LTD. +F8:CF:C5 Motorola Mobility LLC, a Lenovo Company +BC:F8:11 Xiamen DNAKE Technology Co.,Ltd +A8:82:7F CIBN Oriental Network(Beijing) CO.,Ltd +60:9C:9F Brocade Communications Systems, Inc. +90:0A:39 Wiio, Inc. +C4:69:3E Turbulence Design Inc. +1C:83:41 Hefei Bitland Information Technology Co.Ltd +40:11:DC Sonance +24:9E:AB HUAWEI TECHNOLOGIES CO.,LTD +DC:56:E6 Shenzhen Bococom Technology Co.,LTD +5C:A1:78 TableTop Media (dba Ziosk) +70:2A:7D EpSpot AB +B8:B3:DC DEREK (SHAOGUAN) LIMITED +6C:1E:70 Guangzhou YBDS IT Co.,Ltd +C8:E1:30 Milkyway Group Ltd +88:33:BE Ivenix, Inc. +34:CC:28 Nexpring Co. LTD., +14:41:46 Honeywell (China) Co., LTD +F4:15:63 F5 Networks, Inc. +C4:EA:1D Technicolor +20:E4:07 Spark srl +88:73:84 Toshiba +58:47:04 Shenzhen Webridge Technology Co.,Ltd +1C:14:B3 Pinyon Technologies +74:9C:E3 Art2Wave Canada Inc. +B8:56:BD ITT LLC +10:78:73 Shenzhen Jinkeyi Communication Co., Ltd. +D4:55:56 Fiber Mountain Inc. +F0:1E:34 ORICO Technologies Co., Ltd +74:A0:63 HUAWEI TECHNOLOGIES CO.,LTD +A8:90:08 Beijing Yuecheng Technology Co. Ltd. +18:38:64 CAP-TECH INTERNATIONAL CO., LTD. +08:D3:4B Techman Electronics (Changshu) Co., Ltd. +C8:08:E9 LG Electronics +78:AC:BF Igneous Systems +20:62:74 Microsoft Corporation +5C:CC:FF Techroutes Network Pvt Ltd +84:4B:B7 Beijing Sankuai Online Technology Co.,Ltd +14:8F:21 Garmin International +3C:6A:9D Dexatek Technology LTD. +14:89:3E VIXTEL TECHNOLOGIES LIMTED +60:F1:89 Murata Manufacturing Co., Ltd. +74:A3:4A ZIMI CORPORATION +98:F5:A9 OHSUNG ELECTRONICS CO.,LTD. +D8:93:41 General Electric Global Research +F4:64:5D Toshiba +30:D5:87 Samsung Electronics Co.,Ltd +14:36:C6 Lenovo Mobile Communication Technology Ltd. +04:C0:9C Tellabs Inc. +84:44:64 ServerU Inc +58:9B:0B Shineway Technologies, Inc. +A4:8C:DB Lenovo +40:62:B6 Tele system communication +3C:2C:94 杭州德澜科技有限公司(HangZhou Delan Technology Co.,Ltd) +78:31:2B zte corporation +C0:35:C5 Prosoft Systems LTD +F8:B2:F3 GUANGZHOU BOSMA TECHNOLOGY CO.,LTD +1C:7D:22 Fuji Xerox Co., Ltd. +7C:11:CD QianTang Technology +04:92:EE iway AG +F0:2A:23 Creative Next Design +8C:91:09 Toyoshima Electric Technoeogy(Suzhou) Co.,Ltd. +30:73:50 Inpeco SA +E8:CC:18 D-Link International +B0:91:37 ISis ImageStream Internet Solutions, Inc +3C:1E:13 HANGZHOU SUNRISE TECHNOLOGY CO., LTD +B4:A8:28 Shenzhen Concox Information Technology Co., Ltd +A4:12:42 NEC Platforms, Ltd. +40:4E:EB Higher Way Electronic Co., Ltd. +50:BD:5F TP-LINK TECHNOLOGIES CO.,LTD. +14:75:90 TP-LINK TECHNOLOGIES CO.,LTD. +EC:B9:07 CloudGenix Inc +5C:F9:F0 Atomos Engineering P/L +FC:DB:B3 Murata Manufacturing Co., Ltd. +B8:18:6F ORIENTAL MOTOR CO., LTD. +1C:9C:26 Zoovel Technologies +9C:35:83 Nipro Diagnostics, Inc +C4:56:FE Lava International Ltd. +B8:9B:E4 ABB Power Systems Power Generation +C0:EE:FB OnePlus Tech (Shenzhen) Ltd +E0:0D:B9 Private +10:8A:1B RAONIX Inc. +8C:F8:13 ORANGE POLSKA +B8:F3:17 iSun Smasher Communications Private Limited +24:42:BC Alinco,incorporated +C4:01:CE PRESITION (2000) CO., LTD. +D0:12:42 BIOS Corporation +50:F4:3C Leeo Inc +B4:39:34 Pen Generations, Inc. +DC:C6:22 BUHEUNG SYSTEM +5C:2B:F5 Vivint +D0:62:A0 China Essence Technology (Zhumadian) Co., Ltd. +CC:10:A3 Beijing Nan Bao Technology Co., Ltd. +2C:A3:0E POWER DRAGON DEVELOPMENT LIMITED +4C:F5:A0 Scalable Network Technologies Inc +08:46:56 VEO-LABS +44:88:CB Camco Technologies NV +50:14:B5 Richfit Information Technology Co., Ltd +CC:30:80 VAIO Corporation +F8:24:41 Yeelink +6C:BF:B5 Noon Technology Co., Ltd +48:9D:18 Flashbay Limited +8C:B0:94 Airtech I&C Co., Ltd +70:F1:96 Actiontec Electronics, Inc +6C:6E:FE Core Logic Inc. +E4:C6:2B Airware +80:F8:EB RayTight +94:B4:0F Aruba Networks +4C:2C:83 Zhejiang KaNong Network Technology Co.,Ltd. +BC:C3:42 Panasonic System Networks Co., Ltd. +E8:96:06 testo Instruments (Shenzhen) Co., Ltd. +CC:3F:1D Intesis Software SL +90:21:81 Shanghai Huaqin Telecom Technology Co.,Ltd +60:04:17 POSBANK CO.,LTD +A4:4A:D3 ST Electronics(Shanghai) Co.,Ltd +24:97:ED Techvision Intelligent Technology Limited +10:4E:07 Shanghai Genvision Industries Co.,Ltd +4C:11:BF ZHEJIANG DAHUA TECHNOLOGY CO.,LTD. +FC:D5:D9 Shenzhen SDMC Technology Co., Ltd. +00:75:32 INID BV +A0:02:DC Amazon Technologies Inc. +90:7E:BA UTEK TECHNOLOGY (SHENZHEN) CO.,LTD +48:82:44 Life Fitness / Div. of Brunswick +A8:F7:E0 PLANET Technology Corporation +2C:5B:E1 Centripetal Networks, Inc +D8:7E:B1 x.o.ware, inc. +40:45:DA Spreadtrum Communications (Shanghai) Co., Ltd. +98:BE:94 IBM +D4:B4:3E Messcomp Datentechnik GmbH +A8:E5:39 Moimstone Co.,Ltd +98:F1:70 Murata Manufacturing Co., Ltd. +04:C9:91 Phistek INC. +58:1F:67 Open-m technology limited +BC:25:F0 3D Display Technologies Co., Ltd. +7C:E5:24 Quirky, Inc. +D8:5D:FB Private +7C:C4:EF Devialet +94:AE:E3 Belden Hirschmann Industries (Suzhou) Ltd. +44:66:6E IP-LINE +70:5B:2E M2Communication Inc. +0C:8C:8F Kamo Technology Limited +F4:FD:2B ZOYI Company +FC:AA:14 GIGA-BYTE TECHNOLOGY CO.,LTD. +50:FE:F2 Sify Technologies Ltd +3C:D9:CE Eclipse WiFi +C8:02:10 LG Innotek +70:2D:D1 Newings Communication CO., LTD. +44:74:6C Sony Mobile Communications AB +F4:F6:46 Dediprog Technology Co. Ltd. +EC:D9:D1 Shenzhen TG-NET Botone Technology Co.,Ltd. +74:8F:4D MEN Mikro Elektronik GmbH +A4:7E:39 zte corporation +0C:63:FC Nanjing Signway Technology Co., Ltd +AC:A9:A0 Audioengine, Ltd. +A8:A6:68 zte corporation +60:E3:27 TP-LINK TECHNOLOGIES CO.,LTD. +E4:D3:32 TP-LINK TECHNOLOGIES CO.,LTD. +A0:DA:92 Nanjing Glarun Atten Technology Co. Ltd. +68:28:BA Dejai +48:D1:8E Metis Communication Co.,Ltd +A4:9F:85 Lyve Minds, Inc +7C:D3:0A INVENTEC Corporation +34:81:C4 AVM GmbH +88:5B:DD Aerohive Networks Inc. +08:57:00 TP-LINK TECHNOLOGIES CO.,LTD. +88:89:14 All Components Incorporated +D8:15:0D TP-LINK TECHNOLOGIES CO.,LTD. +A0:65:18 VNPT TECHNOLOGY +74:8F:1B MasterImage 3D +F0:3A:4B Bloombase, Inc. +D8:2A:15 Leitner SpA +C4:29:1D KLEMSAN ELEKTRIK ELEKTRONIK SAN.VE TIC.AS. +70:4E:01 KWANGWON TECH CO., LTD. +84:84:33 Paradox Engineering SA +D4:31:9D Sinwatec +DC:05:2F National Products Inc. +CC:39:8C Shiningtek +6C:5F:1C Lenovo Mobile Communication Technology Ltd. +B4:2C:92 Zhejiang Weirong Electronic Co., Ltd +FC:13:49 Global Apps Corp. +8C:41:F2 RDA Technologies Ltd. +FC:07:A0 LRE Medical GmbH +AC:02:CA HI Solutions, Inc. +F4:90:CA Tensorcom +2C:53:4A Shenzhen Winyao Electronic Limited +CC:85:6C SHENZHEN MDK DIGITAL TECHNOLOGY CO.,LTD +60:FF:DD C.E. ELECTRONICS, INC +FC:BB:A1 Shenzhen Minicreate Technology Co.,Ltd +50:B6:95 Micropoint Biotechnologies,Inc. +B4:85:47 Amptown System Company GmbH +3C:25:D7 Nokia Corporation +18:89:DF CerebrEX Inc. +30:A8:DB Sony Mobile Communications AB +CC:9F:35 Transbit Sp. z o.o. +40:78:75 IMBEL - Industria de Material Belico do Brasil +0C:4F:5A ASA-RT s.r.l. +B4:B5:42 Hubbell Power Systems, Inc. +54:CD:EE ShenZhen Apexis Electronic Co.,Ltd +F8:F0:05 Newport Media Inc. +98:C0:EB Global Regency Ltd +D4:22:4E Alcatel Lucent +28:DE:F6 bioMerieux Inc. +88:E8:F8 YONG TAI ELECTRONIC (DONGGUAN) LTD. +2C:07:3C DEVLINE LIMITED +7C:E4:AA Private +18:20:A6 Sage Co., Ltd. +BC:F6:1C Geomodeling Wuxi Technology Co. Ltd. +08:3F:3E WSH GmbH +6C:09:D6 Digiquest Electronics LTD +8C:56:9D Imaging Solutions Group +A4:3A:69 Vers Inc +38:7B:47 AKELA, Inc. +7C:CD:11 MS-Magnet +94:FB:B2 Shenzhen Gongjin Electronics Co.,Ltd +4C:E1:BB Zhuhai HiFocus Technology Co., Ltd. +8C:DE:99 Comlab Inc. +2C:9A:A4 NGI SpA +B4:66:98 Zealabs srl +28:3B:96 Cool Control LTD +80:D4:33 LzLabs GmbH +08:5A:E0 Recovision Technology Co., Ltd. +BC:EE:7B ASUSTek COMPUTER INC. +FC:09:D8 ACTEON Group +0C:12:62 zte corporation +68:7C:C8 Measurement Systems S. de R.L. +F0:15:A0 KyungDong One Co., Ltd. +EC:F7:2B HD DIGITAL TECH CO., LTD. +D8:B6:D6 Blu Tether Limited +84:72:07 I&C Technology +E0:AE:B2 Bender GmbH & Co.KG +2C:55:3C Gainspeed, Inc. +B4:3E:3B Viableware, Inc +F8:54:AF ECI Telecom Ltd. +24:64:EF CYG SUNRI CO.,LTD. +50:B8:88 wi2be Tecnologia S/A +B8:C1:A2 Dragon Path Technologies Co., Limited +50:ED:78 Changzhou Yongse Infotech Co.,Ltd +8C:B7:F7 Shenzhen UniStrong Science & Technology Co., Ltd +08:52:40 EbV Elektronikbau- und Vertriebs GmbH +80:F2:5E Kyynel +84:4F:03 Ablelink Electronics Ltd +94:B9:B4 Aptos Technology +D0:B5:23 Bestcare Cloucal Corp. +78:3D:5B TELNET Redes Inteligentes S.A. +D0:C4:2F Tamagawa Seiki Co.,Ltd. +5C:FF:FF Shenzhen Kezhonglong Optoelectronic Technology Co., Ltd +F0:D3:A7 CobaltRay Co., Ltd +84:76:16 Addat s.r.o. +D4:68:67 Neoventus Design Group +68:69:2E Zycoo Co.,Ltd +A8:75:E2 Aventura Technologies, Inc. +38:BF:2F Espec Corp. +18:20:12 Aztech Associates Inc. +C0:F9:91 GME Standard Communications P/L +14:ED:A5 Wächter GmbH Sicherheitssysteme +E0:56:F4 AxesNetwork Solutions inc. +38:5A:A8 Beijing Zhongdun Security Technology Development Co. +FC:3F:AB Henan Lanxin Technology Co., Ltd +F8:FF:5F Shenzhen Communication Technology Co.,Ltd +DC:C4:22 Systembase Limited +F4:BD:7C Chengdu jinshi communication Co., LTD +C8:F3:6B Yamato Scale Co.,Ltd. +6C:90:B1 SanLogic Inc +84:5C:93 Chabrier Services +D4:4C:9C Shenzhen YOOBAO Technology Co.Ltd +A8:8D:7B SunDroid Global limited. +A0:3B:1B Inspire Tech +3C:6E:63 Mitron OY +50:2E:5C HTC Corporation +20:D2:1F Wincal Technology Corp. +FC:1E:16 IPEVO corp +6C:4B:7F Vossloh-Schwabe Deutschland GmbH +0C:CB:8D ASCO Numatics GmbH +28:47:AA Nokia Corporation +68:2D:DC Wuhan Changjiang Electro-Communication Equipment CO.,LTD +1C:63:B7 OpenProducts 237 AB +A0:A2:3C GPMS +70:8D:09 Nokia Corporation +FC:E1:D9 Stable Imaging Solutions LLC +38:B7:4D Fijowave Limited +A0:E5:E9 enimai Inc +9C:BB:98 Shen Zhen RND Electronic Co.,LTD +34:5C:40 Cargt Holdings LLC +34:88:5D Logitech Far East +60:64:A1 RADiflow Ltd. +80:79:AE ShanDong Tecsunrise Co.,Ltd +2C:71:55 HiveMotion +90:99:16 ELVEES NeoTek OJSC +FC:1B:FF V-ZUG AG +AC:50:36 Pi-Coral Inc +FC:01:9E VIEVU +F4:5F:69 Matsufu Electronics distribution Company +F4:A2:94 EAGLE WORLD DEVELOPMENT CO., LIMITED +2C:CD:69 Aqavi.com +94:7C:3E Polewall Norge AS +E0:D1:E6 Aliph dba Jawbone +28:C6:71 Yota Devices OY +DC:17:92 Captivate Network +7C:83:06 Glen Dimplex Nordic as +84:25:3F Silex Technology, Inc +90:7A:0A Gebr. Bode GmbH & Co KG +30:61:12 PAV GmbH +A0:C6:EC ShenZhen ANYK Technology Co.,LTD +C8:02:58 ITW GSE ApS +10:01:CA Ashley Butterworth +24:6A:AB IT-IS International +28:F5:32 ADD-Engineering BV +FC:4B:BC Sunplus Technology Co., Ltd. +14:2D:8B Incipio Technologies, Inc +CC:E8:AC SOYEA Technology Co.,Ltd. +78:D3:8D HONGKONG YUNLINK TECHNOLOGY LIMITED +1C:48:F9 GN Netcom A/S +74:4B:E9 EXPLORER HYPERTECH CO.,LTD +B8:36:D8 Videoswitch +F8:35:DD Gemtek Technology Co., Ltd. +0C:F0:19 Malgn Technology Co., Ltd. +D4:6A:91 Snap AV +E8:51:9D Yeonhab Precision Co.,LTD +00:B7:8D Nanjing Shining Electric Automation Co., Ltd +68:E1:66 Private +60:FE:F9 Thomas & Betts +78:FE:41 Socus networks +08:35:71 CASwell INC. +DC:F7:55 SITRONIK +AC:CA:8E ODA Technologies +64:05:BE NEW LIGHT LED +E0:3E:4A Cavanagh Group International +6C:B3:50 Anhui comhigher tech co.,ltd +A4:23:05 Open Networking Laboratory +1C:86:AD MCT CO., LTD. +28:D9:3E Telecor Inc. +88:23:64 Watchnet DVR Inc +A0:5B:21 ENVINET GmbH +50:B8:A2 ImTech Technologies LLC, +A4:15:66 Wei Fang Goertek Electronics Co.,Ltd +B0:4C:05 Fresenius Medical Care Deutschland GmbH +A0:EC:80 zte corporation +90:46:B7 Vadaro Pte Ltd +1C:08:C1 Lg Innotek +20:1D:03 Elatec GmbH +C0:6C:6D MagneMotion, Inc. +74:CA:25 Calxeda, Inc. +CC:BD:35 Steinel GmbH +78:8D:F7 Hitron Technologies. Inc +6C:EC:A1 SHENZHEN CLOU ELECTRONICS CO. LTD. +D8:62:DB Eno Inc. +68:DB:67 Nantong Coship Electronics Co., Ltd +BC:26:1D HONG KONG TECON TECHNOLOGY +88:89:64 GSI Electronics Inc. +4C:82:CF Echostar Technologies +9C:A5:77 Osorno Enterprises Inc. +C0:C3:B6 Automatic Systems +A8:29:4C Precision Optical Transceivers, Inc. +D0:EB:03 Zhehua technology limited +A0:86:1D Chengdu Fuhuaxin Technology co.,Ltd +94:98:A2 Shanghai LISTEN TECH.LTD +2C:B6:93 Radware +88:68:5C Shenzhen ChuangDao & Perpetual Eternal Technology Co.,Ltd +B4:FE:8C Centro Sicurezza Italia SpA +D8:29:16 Ascent Communication Technology +64:72:D8 GooWi Technology Co.,Limited +84:AC:A4 Beijing Novel Super Digital TV Technology Co., Ltd +3C:6F:F7 EnTek Systems, Inc. +B8:38:CA Kyokko Tsushin System CO.,LTD +38:0F:E4 Dedicated Network Partners Oy +84:7A:88 HTC Corporation +54:61:EA Zaplox AB +78:32:4F Millennium Group, Inc. +F0:5D:C8 Duracell Powermat +48:F9:25 Maestronic +C0:88:5B SnD Tech Co., Ltd. +64:C6:67 Barnes&Noble +C4:7D:CC Zebra Technologies Inc +64:53:5D Frauscher Sensortechnik +10:5F:06 Actiontec Electronics, Inc +84:17:15 GP Electronics (HK) Ltd. +08:79:99 AIM GmbH +84:C2:E4 Jiangsu Qinheng Co., Ltd. +C0:B8:B1 BitBox Ltd +0C:72:2C TP-LINK TECHNOLOGIES CO.,LTD. +B0:14:08 LIGHTSPEED INTERNATIONAL CO. +F8:FE:A8 Technico Japan Corporation +A8:15:4D TP-LINK TECHNOLOGIES CO.,LTD. +D0:50:99 ASRock Incorporation +78:A1:06 TP-LINK TECHNOLOGIES CO.,LTD. +A4:9E:DB AutoCrib, Inc. +28:2C:B2 TP-LINK TECHNOLOGIES CO.,LTD. +D4:3A:65 IGRS Engineering Lab Ltd. +10:B9:FE Lika srl +D4:27:51 Infopia Co., Ltd +A8:95:B0 Aker Subsea Ltd +5C:20:D0 Asoni Communication Co., Ltd. +E0:C3:F3 zte corporation +10:4D:77 Innovative Computer Engineering +3C:08:1E Beijing Yupont Electric Power Technology Co.,Ltd +7C:A1:5D GN ReSound A/S +B4:DD:15 ControlThings Oy Ab +3C:86:A8 Sangshin elecom .co,, LTD +FC:DD:55 Shenzhen WeWins wireless Co.,Ltd +CC:0D:EC Cisco SPVTG +68:B0:94 INESA ELECTRON CO.,LTD +40:E7:30 DEY Storage Systems, Inc. +A8:D2:36 Lightware Visual Engineering +6C:86:86 Technonia +84:E7:14 Liang Herng Enterprise,Co.Ltd. +30:3D:08 GLINTT TES S.A. +9C:54:1C Shenzhen My-power Technology Co.,Ltd +E4:96:AE ALTOGRAPHICS Inc. +F8:0B:D0 Datang Telecom communication terminal (Tianjin) Co., Ltd. +48:B9:C2 Teletics Inc. +D0:46:DC Southwest Research Institute +04:6E:49 TaiYear Electronic Technology (Suzhou) Co., Ltd +08:60:6E ASUSTek COMPUTER INC. +BC:39:A6 CSUN System Technology Co.,LTD +EC:B5:41 SHINANO E and E Co.Ltd. +D4:00:57 MC Technologies GmbH +48:B8:DE HOMEWINS TECHNOLOGY CO.,LTD. +10:65:CF IQSIM +B8:77:C3 Decagon Devices, Inc. +84:9D:C5 Centera Photonics Inc. +58:09:43 Private +54:7F:A8 TELCO systems, s.r.o. +54:74:E6 Webtech Wireless +AC:5D:10 Pace Americas +88:F4:90 Jetmobile Pte Ltd +E8:A3:64 Signal Path International / Peachtree Audio +D0:D6:CC Wintop +10:1D:51 ON-Q LLC dba ON-Q Mesh Networks +34:C9:9D EIDOLON COMMUNICATIONS TECHNOLOGY CO. LTD. +8C:4A:EE GIGA TMS INC +F4:6D:E2 zte corporation +04:F8:C2 Flaircomm Microelectronics, Inc. +0C:93:FB BNS Solutions +38:B5:BD E.G.O. Elektro-Ger +B8:5A:F7 Ouya, Inc +E0:D9:A2 Hippih aps +F0:F6:69 Motion Analysis Corporation +F0:21:9D Cal-Comp Electronics & Communications Company Ltd. +F8:D7:BF REV Ritter GmbH +00:B5:6D David Electronics Co., LTD. +B4:61:FF Lumigon A/S +90:38:DF Changzhou Tiannengbo System Co. Ltd. +CC:59:3E TOUMAZ LTD +AC:8D:14 Smartrove Inc +18:67:3F Hanover Displays Limited +A0:0A:BF Wieson Technologies Co., Ltd. +20:91:D9 I'M SPA +74:4D:79 Arrive Systems Inc. +C8:3D:97 Nokia Corporation +38:19:2F Nokia Corporation +14:1B:F0 Intellimedia Systems Ltd +E4:56:14 Suttle Apparatus +84:2B:BC Modelleisenbahn GmbH +E8:56:D6 NCTech Ltd +40:88:E0 Beijing Ereneben Information Technology Limited Shenzhen Branch +1C:F4:CA Private +F4:90:EA Deciso B.V. +94:21:97 Stalmart Technology Limited +AC:94:03 Envision Peripherals Inc +A8:65:B2 DONGGUAN YISHANG ELECTRONIC TECHNOLOGY CO., LIMITED +60:B9:82 RO.VE.R. Laboratories S.p.A. +B4:62:38 Exablox +40:70:4A Power Idea Technology Limited +A4:0B:ED Carry Technology Co.,Ltd +0C:D9:96 Cisco Systems, Inc +D8:2D:E1 Tricascade Inc. +C4:38:D3 TAGATEC CO.,LTD +54:73:98 Toyo Electronics Corporation +E0:AA:B0 GENERAL VISION ELECTRONICS CO. LTD. +68:B4:3A WaterFurnace International, Inc. +54:39:68 Edgewater Networks Inc +98:5E:1B ConversDigital Co., Ltd. +B8:B7:D7 2GIG Technologies +10:48:B1 Beijing Duokan Technology Limited +00:5D:03 Xilinx, Inc +24:EE:3A Chengdu Yingji Electronic Hi-tech Co Ltd +F8:22:85 Cypress Technology CO., LTD. +84:82:F4 Beijing Huasun Unicreate Technology Co., Ltd +0C:C4:7E EUCAST Co., Ltd. +CC:E7:98 My Social Stuff +50:72:4D BEG Brueck Electronic GmbH +B8:98:B0 Atlona Inc. +2C:62:5A Finest Security Systems Co., Ltd +20:74:CF Shenzhen Voxtech Co.,Ltd +AC:BD:0B IMAC CO.,LTD +D8:D2:7C JEMA ENERGY, SA +10:F3:DB Gridco Systems, Inc. +B0:12:03 Dynamics Hong Kong Limited +70:93:F8 Space Monkey, Inc. +30:5D:38 Beissbarth +FC:D6:BD Robert Bosch GmbH +04:4A:50 Ramaxel Technology (Shenzhen) limited company +A4:46:6B EOC Technology +3C:F3:92 Virtualtek. Co. Ltd +88:96:76 TTC MARCONI s.r.o. +14:9F:E8 Lenovo Mobile Communication Technology Ltd. +70:B5:99 Embedded Technologies s.r.o. +EC:4C:4D ZAO NPK RoTeK +E8:D4:83 ULTIMATE Europe Transportation Equipment GmbH +AC:D9:D6 tci GmbH +74:93:A4 Zebra Technologies Corp. +9C:0D:AC Tymphany HK Limited +8C:D3:A2 VisSim AS +64:76:57 Innovative Security Designs +60:45:5E Liptel s.r.o. +94:4A:09 BitWise Controls +E8:10:2E Really Simple Software, Inc +D4:8C:B5 Cisco Systems, Inc +D4:1E:35 TOHO Electronics INC. +70:0B:C0 Dewav Technology Company +2C:D4:44 FUJITSU LIMITED +EC:1A:59 Belkin International Inc. +60:CB:FB AirScape Inc. +4C:54:27 Linepro Sp. z o.o. +3C:EA:FB NSE AG +34:76:C5 I-O DATA DEVICE, INC. +40:70:74 Life Technology (China) Co., Ltd +58:BF:EA Cisco Systems, Inc +7C:38:6C Real Time Logic +D8:AF:3B Hangzhou Bigbright Integrated communications system Co.,Ltd +78:D3:4F Pace-O-Matic, Inc. +78:44:05 FUJITU(HONG KONG) ELECTRONIC Co.,LTD. +C0:3F:2A Biscotti, Inc. +44:B3:82 Kuang-chi Institute of Advanced Technology +D8:0D:E3 FXI TECHNOLOGIES AS +1C:E1:65 Marshal Corporation +0C:C0:C0 MAGNETI MARELLI SISTEMAS ELECTRONICOS MEXICO +AC:40:EA C&T Solution Inc. +BC:8B:55 NPP ELIKS America Inc. DBA T&M Atlantic +20:25:98 Teleview +84:49:15 vArmour Networks, Inc. +A0:4C:C1 Helixtech Corp. +1C:B2:43 TDC A/S +1C:51:B5 Techaya LTD +80:DB:31 Power Quotient International Co., Ltd. +AC:01:42 Uriel Technologies SIA +A0:07:B6 Advanced Technical Support, Inc. +54:2A:9C LSY Defense, LLC. +F8:99:55 Fortress Technology Inc +B8:27:EB Raspberry Pi Foundation +E8:8D:F5 ZNYX Networks, Inc. +48:EA:63 Zhejiang Uniview Technologies Co., Ltd. +0C:E5:D3 DH electronics GmbH +C4:71:30 Fon Technology S.L. +48:D7:FF BLANKOM Antennentechnik GmbH +F4:7F:35 Cisco Systems, Inc +A0:F4:19 Nokia Corporation +BC:C1:68 DinBox Sverige AB +6C:AE:8B IBM Corporation +A4:F7:D0 LAN Accessories Co., Ltd. +D4:EC:0C Harley-Davidson Motor Company +6C:A9:6F TransPacket AS +48:ED:80 daesung eltec +A0:86:EC SAEHAN HITEC Co., Ltd +BC:4B:79 SensingTek +28:18:FD Aditya Infotech Ltd. +E4:2C:56 Lilee Systems, Ltd. +50:00:8C Hong Kong Telecommunications (HKT) Limited +DC:A8:CF New Spin Golf, LLC. +34:BA:9A Asiatelco Technologies Co. +64:2D:B7 SEUNGIL ELECTRONICS +00:8D:DA Link One Co., Ltd. +08:B4:CF Abicom International +44:5F:7A Shihlin Electric & Engineering Corp. +28:BA:18 NextNav, LLC +2C:36:F8 Cisco Systems, Inc +AC:3D:05 Instorescreen Aisa +F4:8E:09 Nokia Corporation +D4:43:A8 Changzhou Haojie Electric Co., Ltd. +BC:B8:52 Cybera, Inc. +70:D6:B6 Metrum Technologies +28:D5:76 Premier Wireless, Inc. +6C:E9:07 Nokia Corporation +94:DF:58 IJ Electron CO.,Ltd. +8C:0C:A3 Amper +28:94:0F Cisco Systems, Inc +5C:EB:4E R. STAHL HMI Systems GmbH +B8:DA:F7 Advanced Photonics, Inc. +2C:36:A0 Capisco Limited +80:0A:06 COMTEC co.,ltd +20:FA:BB Cambridge Executive Limited +1C:0B:52 EPICOM S.A +74:7E:2D Beijing Thomson CITIC Digital Technology Co. LTD. +E8:0C:75 Syncbak, Inc. +18:D6:6A Inmarsat +C8:56:45 Intermas France +8C:60:4F Cisco Systems, Inc +74:FF:7D Wren Sound Systems, LLC +2C:C2:60 Ravello Systems +30:B2:16 Hytec Geraetebau GmbH +34:FC:6F ALCEA +C0:B3:57 Yoshiki Electronics Industry Ltd. +D8:BF:4C Victory Concept Electronics Limited +C0:DF:77 Conrad Electronic SE +C8:60:00 ASUSTek COMPUTER INC. +64:52:99 The Chamberlain Group, Inc +BC:12:5E Beijing WisVideo INC. +C8:07:18 TDSi +B4:94:4E WeTelecom Co., Ltd. +34:5B:11 EVI HEAT AB +98:8B:AD Corintech Ltd. +40:50:E0 Milton Security Group LLC +C8:7C:BC Valink Co., Ltd. +40:9F:C7 BAEKCHUN I&C Co., Ltd. +C8:7D:77 Shenzhen Kingtech Communication Equipment Co.,Ltd +A0:78:BA Pantech Co., Ltd. +D4:50:7A CEIVA Logic, Inc +9C:C7:D1 SHARP Corporation +00:B9:F6 Shenzhen Super Rich Electronics Co.,Ltd +9C:5C:8D FIREMAX INDÚSTRIA E COMÉRCIO DE PRODUTOS ELETRÔNICOS LTDA +E0:1E:07 Anite Telecoms US. Inc +B0:6C:BF 3ality Digital Systems GmbH +20:AA:4B Cisco-Linksys, LLC +08:0D:84 GECO, Inc. +88:E7:12 Whirlpool Corporation +64:4B:F0 CalDigit, Inc +28:38:CF Gen2wave +50:FC:30 Treehouse Labs +70:70:4C Purple Communications, Inc +F4:7A:CC SolidFire, Inc. +24:BC:82 Dali Wireless, Inc. +64:C5:AA South African Broadcasting Corporation +64:ED:62 WOORI SYSTEMS Co., Ltd +C4:23:7A WhizNets Inc. +84:30:E5 SkyHawke Technologies, LLC +2C:00:2C UNOWHY +04:81:AE Clack Corporation +C0:91:32 Patriot Memory +A8:98:C6 Shinbo Co., Ltd. +00:6B:A0 SHENZHEN UNIVERSAL INTELLISYS PTE LTD +50:26:90 FUJITSU LIMITED +B4:21:1D Beijing GuangXin Technology Co., Ltd +E0:39:D7 Plexxi, Inc. +FC:94:6C UBIVELOX +38:DE:60 Mohlenhoff GmbH +28:39:E7 Preceno Technology Pte.Ltd. +28:D9:97 Yuduan Mobile Co., Ltd. +88:6B:76 CHINA HOPEFUL GROUP HOPEFUL ELECTRIC CO.,LTD +A0:CF:5B Cisco Systems, Inc +18:C4:51 Tucson Embedded Systems +58:2E:FE Lighting Science Group +F8:D3:A9 AXAN Networks +5C:D4:AB Zektor +F8:46:2D SYNTEC Incorporation +58:67:7F Clare Controls Inc. +CC:A3:74 Guangdong Guanglian Electronic Technology Co.Ltd +50:F6:1A Kunshan JADE Technologies co., Ltd. +20:BB:C6 Jabil Circuit Hungary Ltd. +2C:97:17 I.C.Y. B.V. +64:E8:4F Serialway Communication Technology Co. Ltd +94:1D:1C TLab West Systems AB +40:66:7A mediola - connected living AG +64:80:8B VG Controls, Inc. +7C:6B:52 Tigaro Wireless +48:C1:AC PLANTRONICS, INC. +04:6D:42 Bryston Ltd. +D0:CF:5E Energy Micro AS +64:4D:70 dSPACE GmbH +80:76:93 Newag SA +FC:17:94 InterCreative Co., Ltd +18:14:20 TEB SAS +D0:31:10 Ingenic Semiconductor Co.,Ltd +AC:81:F3 Nokia Corporation +94:C6:EB NOVA electronics, Inc. +10:F9:EE Nokia Corporation +80:97:1B Altenergy Power System,Inc. +10:71:F9 Cloud Telecomputers, LLC +C4:7B:2F Beijing JoinHope Image Technology Ltd. +18:F6:50 Multimedia Pacific Limited +70:4A:AE Xstream Flow (Pty) Ltd +9C:93:4E Xerox Corporation +3C:26:D5 Sotera Wireless +FC:2E:2D Lorom Industrial Co.LTD. +E8:4E:06 EDUP INTERNATIONAL (HK) CO., LTD +B4:C7:99 Zebra Technologies Inc +70:B9:21 Fiberhome Telecommunication Technologies Co.,LTD +94:8F:EE Hughes Telematics, Inc. +E8:C3:20 Austco Communication Systems Pty Ltd +D8:97:3B Artesyn Embedded Technologies +00:8D:4E CJSC NII STT +10:C5:86 BIO SOUND LAB CO., LTD. +E8:BA:70 Cisco Systems, Inc +64:73:E2 Arbiter Systems, Inc. +00:A1:DE ShenZhen ShiHua Technology CO.,LTD +04:E1:C8 IMS Soluções em Energia Ltda. +E4:DD:79 En-Vision America, Inc. +60:19:0C RRAMAC +34:A7:09 Trevil srl +F8:03:32 Khomp +C4:0F:09 Hermes electronic GmbH +90:8D:1D GH Technologies +CC:B5:5A Fraunhofer ITWM +58:75:21 CJSC RTSoft +64:D9:89 Cisco Systems, Inc +44:D3:CA Cisco Systems, Inc +24:DA:B6 Sistemas de Gestión Energética S.A. de C.V +B8:F5:E7 WayTools, LLC +14:8A:70 ADS GmbH +FC:00:12 Toshiba Samsung Storage Technolgoy Korea Corporation +F4:44:50 BND Co., Ltd. +64:43:46 GuangDong Quick Network Computer CO.,LTD +FC:E8:92 Hangzhou Lancable Technology Co.,Ltd +B8:B4:2E Gionee Communication Equipment Co,Ltd.ShenZhen +A8:40:41 Dragino Technology Co., Limited +DC:F0:5D Letta Teknoloji +D0:5A:0F I-BT DIGITAL CO.,LTD +7C:DD:20 IOXOS Technologies S.A. +A0:E9:DB Ningbo FreeWings Technologies Co.,Ltd +9C:7B:D2 NEOLAB Convergence +90:0D:66 Digimore Electronics Co., Ltd +48:C8:62 Simo Wireless,Inc. +0C:F3:EE EM Microelectronic +F0:C2:7C Mianyang Netop Telecom Equipment Co.,Ltd. +BC:35:E5 Hydro Systems Company +28:34:10 Enigma Diagnostics Limited +28:CC:FF Corporacion Empresarial Altra SL +14:B7:3D ARCHEAN Technologies +A4:33:D1 Fibrlink Communications Co.,Ltd. +84:DE:3D Crystal Vision Ltd +B4:AA:4D Ensequence, Inc. +04:0A:83 Alcatel-Lucent +B4:2A:39 ORBIT MERRET, spol. s r. o. +B8:0B:9D ROPEX Industrie-Elektronik GmbH +18:AE:BB Siemens Convergence Creators GmbH&Co.KG +38:91:FB Xenox Holding BV +50:FA:AB L-tek d.o.o. +A8:E0:18 Nokia Corporation +44:AA:E8 Nanotec Electronic GmbH & Co. KG +D8:DF:0D beroNet GmbH +D8:C0:68 Netgenetech.co.,ltd. +50:E5:49 GIGA-BYTE TECHNOLOGY CO.,LTD. +A8:FC:B7 Consolidated Resource Imaging +F8:7B:8C Amped Wireless +44:D2:CA Anvia TV Oy +4C:1A:3A PRIMA Research And Production Enterprise Ltd. +AC:06:13 Senselogix Ltd +CC:F6:7A Ayecka Communication Systems LTD +00:BB:8E HME Co., Ltd. +C0:A2:6D Abbott Point of Care +20:5B:2A Private +18:B4:30 Nest Labs Inc. +F8:76:9B Neopis Co., Ltd. +08:E6:72 JEBSEE ELECTRONICS CO.,LTD. +58:E4:76 CENTRON COMMUNICATIONS TECHNOLOGIES FUJIAN CO.,LTD +B4:35:F7 Zhejiang Pearmain Electronics Co.ltd. +0C:6E:4F PrimeVOLT Co., Ltd. +68:5B:36 POWERTECH INDUSTRIAL CO., LTD. +98:30:00 Beijing KEMACOM Technologies Co., Ltd. +F8:1D:93 Longdhua(Beijing) Controls Technology Co.,Ltd +D0:EB:9E Seowoo Inc. +8C:5F:DF Beijing Railway Signal Factory +58:6D:8F Cisco-Linksys, LLC +14:C2:1D Sabtech Industries +74:B0:0C Network Video Technologies, Inc +C8:84:39 Sunrise Technologies +44:E4:D9 Cisco Systems, Inc +00:54:AF Continental Automotive Systems Inc. +EC:7D:9D MEI +9C:95:F8 SmartDoor Systems, LLC +D0:75:BE Reno A&E +7C:6C:39 PIXSYS SRL +9C:5D:95 VTC Electronics Corp. +DC:05:ED Nabtesco Corporation +FC:83:29 Trei technics +94:E8:48 FYLDE MICRO LTD +AC:5E:8C Utillink +CC:7E:E7 Panasonic AVC Networks Company +BC:99:BC FonSee Technology Inc. +98:60:22 EMW Co., Ltd. +80:B3:2A Alstom Grid +80:34:57 OT Systems Limited +B8:3D:4E Shenzhen Cultraview Digital Technology Co.,Ltd Shanghai Branch +CC:F3:A5 Chi Mei Communication Systems, Inc +C4:24:2E Galvanic Applied Sciences Inc +64:00:F1 Cisco Systems, Inc +04:C5:A4 Cisco Systems, Inc +3C:A7:2B MRV Communications (Networks) LTD +58:4C:19 Chongqing Guohong Technology Development Company Limited +D0:A3:11 Neuberger Gebäudeautomation GmbH +10:A1:3B FUJIKURA RUBBER LTD. +F4:E1:42 Delta Elektronika BV +F0:02:48 SmarteBuilding +2C:DD:0C Discovergy GmbH +40:B2:C8 Nortel Networks +48:6B:91 Fleetwood Group Inc. +F4:38:14 Shanghai Howell Electronic Co.,Ltd +20:AA:25 IP-NET LLC +EC:BB:AE Digivoice Tecnologia em Eletronica Ltda +DC:20:08 ASD Electronics Ltd +08:8D:C8 Ryowa Electronics Co.,Ltd +D4:91:AF Electroacustica General Iberica, S.A. +1C:DF:0F Cisco Systems, Inc +34:DF:2A Fujikon Industrial Co.,Limited +C8:84:47 Beautiful Enterprise Co., Ltd +C8:8B:47 Nolangroup S.P.A con Socio Unico +24:BA:30 Technical Consumer Products, Inc. +74:D6:75 WYMA Tecnologia +D0:1C:BB Beijing Ctimes Digital Technology Co., Ltd. +94:81:A4 Azuray Technologies +BC:E0:9D Eoslink +34:6F:92 White Rodgers Division +8C:DB:25 ESG Solutions +64:1A:22 Heliospectra AB +30:14:2D Piciorgros GmbH +E4:41:E6 Ottec Technology GmbH +10:E2:D5 Qi Hardware Inc. +7C:DA:84 Dongnian Networks Inc. +A0:36:FA Ettus Research LLC +EC:83:6C RM Tech Co., Ltd. +C0:C5:20 Ruckus Wireless +60:83:B2 GkWare e.K. +80:D0:19 Embed, Inc +D4:12:96 Anobit Technologies Ltd. +B8:FF:6F Shanghai Typrotech Technology Co.Ltd +DC:9C:52 Sapphire Technology Limited. +68:12:2D Special Instrument Development Co., Ltd. +64:9B:24 V Technology Co., Ltd. +04:75:F5 CSST +BC:20:BA Inspur (Shandong) Electronic Information Co., Ltd +24:94:42 OPEN ROAD SOLUTIONS , INC. +E0:F3:79 Vaddio +B0:9A:E2 STEMMER IMAGING GmbH +CC:D8:11 Aiconn Technology Corporation +78:D0:04 Neousys Technology Inc. +78:A0:51 iiNet Labs Pty Ltd +58:A7:6F iD corporation +44:59:9F Criticare Systems, Inc +3C:2F:3A SFORZATO Corp. +EC:92:33 Eddyfi NDT Inc +EC:E9:0B SISTEMA SOLUCOES ELETRONICAS LTDA - EASYTECH +A0:8C:9B Xtreme Technologies Corp +60:76:88 Velodyne +98:0E:E4 Private +E8:28:D5 Cots Technology +08:D5:C0 Seers Technology Co., Ltd +8C:B6:4F Cisco Systems, Inc +6C:33:A9 Magicjack LP +08:B7:EC Wireless Seismic +BC:71:C1 XTrillion, Inc. +0C:46:9D MS Sedco +E0:E8:E8 Olive Telecommunication Pvt. Ltd +0C:3C:65 Dome Imaging Inc +94:20:53 Nokia Corporation +D4:9C:8E University of FUKUI +2C:B0:DF Soliton Technologies Pvt Ltd +5C:F3:FC IBM Corp +D4:3D:67 Carma Industries Inc. +00:BD:27 Exar Corp. +C8:A7:29 SYStronics Co., Ltd. +6C:9C:E9 Nimble Storage +70:02:58 01DB-METRAVIB +20:FD:F1 3COM EUROPE LTD +38:95:92 Beijing Tendyron Corporation +70:5E:AA Action Target, Inc. +0C:8D:98 TOP EIGHT IND CORP +30:49:3B Nanjing Z-Com Wireless Co.,Ltd +68:DB:96 OPWILL Technologies CO .,LTD +00:F8:60 PT. Panggung Electric Citrabuana +FC:ED:B9 Arrayent +44:ED:57 Longicorn, inc. +C8:A1:B6 Shenzhen Longway Technologies Co., Ltd +64:1E:81 Dowslake Microsystems +88:AC:C1 Generiton Co., Ltd. +78:57:12 Mobile Integration Workgroup +38:0A:0A Sky-City Communication and Electronics Limited Company +14:1B:BD Volex Inc. +78:C6:BB Innovasic, Inc. +DC:4E:DE SHINYEI TECHNOLOGY CO., LTD. +88:8B:5D Storage Appliance Corporation +F0:F8:42 KEEBOX, Inc. +78:A7:14 Amphenol +F4:50:EB Telechips Inc +98:8E:DD TE Connectivity Limerick +98:FC:11 Cisco-Linksys, LLC +18:0C:77 Westinghouse Electric Company, LLC +AC:A0:16 Cisco Systems, Inc +E4:AD:7D SCL Elements +40:D4:0E Biodata Ltd +7C:05:1E RAFAEL LTD. +58:57:0D Danfoss Solar Inverters +0C:82:6A Wuhan Huagong Genuine Optics Technology Co., Ltd +5C:0E:8B Zebra Technologies Inc +38:C7:BA CS Services Co.,Ltd. +70:D5:7E Scalar Corporation +78:66:AE ZTEC Instruments, Inc. +78:81:8F Server Racks Australia Pty Ltd +E0:58:9E Laerdal Medical +44:D6:3D Talari Networks +58:FD:20 Bravida Sakerhet AB +98:35:B8 Assembled Products Corporation +24:0B:2A Viettel Group +68:E4:1F Unglaube Identech GmbH +84:F6:4C Cross Point BV +90:51:3F Elettronica Santerno SpA +7C:A2:9B D.SignT GmbH & Co. KG +34:AA:EE Mikrovisatos Servisas UAB +A4:0C:C3 Cisco Systems, Inc +34:E0:D7 DONGGUAN QISHENG ELECTRONICS INDUSTRIAL CO., LTD +40:52:0D Pico Technology +54:31:31 Raster Vision Ltd +90:E0:F0 IEEE 1722a Working Group +1C:6F:65 GIGA-BYTE TECHNOLOGY CO.,LTD. +F0:AD:4E Globalscale Technologies, Inc. +90:3D:5A Shenzhen Wision Technology Holding Limited +60:9A:A4 GVI SECURITY INC. +F0:ED:1E Bilkon Bilgisayar Kontrollu Cih. Im.Ltd. +24:A9:37 PURE Storage +34:83:02 iFORCOM Co., Ltd +94:9C:55 Alta Data Technologies +38:9F:83 OTN Systems N.V. +8C:54:1D LGE +60:12:83 Soluciones Tecnologicas para la Salud y el Bienestar SA +00:3A:9D NEC Platforms, Ltd. +90:54:46 TES ELECTRONIC SOLUTIONS +DC:7B:94 Cisco Systems, Inc +68:23:4B Nihon Dengyo Kousaku +18:42:2F Alcatel Lucent +A4:BE:61 EutroVision System, Inc. +E0:62:90 Jinan Jovision Science & Technology Co., Ltd. +A0:18:59 Shenzhen Yidashi Electronics Co Ltd +04:22:34 Wireless Standard Extensions +78:12:B8 ORANTEK LIMITED +F0:B6:EB Poslab Technology Co., Ltd. +FC:CC:E4 Ascon Ltd. +34:86:2A Heinz Lackmann GmbH & Co KG +84:21:41 Shenzhen Ginwave Technologies Ltd. +B4:ED:54 Wohler Technologies +54:42:49 Sony Corporation +24:DB:AD ShopperTrak RCT Corporation +CC:69:B0 Global Traffic Technologies, LLC +28:72:C5 Smartmatic Corp +B8:A3:E0 BenRui Technology Co.,Ltd +B8:F7:32 Aryaka Networks Inc +70:82:8E OleumTech Corporation +50:2A:7E Smart electronic GmbH +F0:26:4C Dr. Sigrist AG +3C:1C:BE JADAK LLC +A8:99:5C aizo ag +F4:45:ED Portable Innovation Technology Ltd. +6C:32:DE Indieon Technologies Pvt. Ltd. +FC:CF:62 IBM Corp +B0:90:74 Fulan Electronics Limited +2C:A8:35 RIM +94:F6:92 Geminico co.,Ltd. +8C:73:6E FUJITSU LIMITED +30:EF:D1 Alstom Strongwish (Shenzhen) Co., Ltd. +C8:35:B8 Ericsson, EAB/RWI/K +24:3C:20 Dynamode Group +70:D5:E7 Wellcore Corporation +3C:F7:2A Nokia Corporation +FC:E1:92 Sichuan Jinwangtong Electronic Science&Technology Co,.Ltd +F8:91:2A GLP German Light Products GmbH +E0:26:30 Intrigue Technologies, Inc. +8C:92:36 Aus.Linx Technology Co., Ltd. +40:12:E4 Compass-EOS +F8:DC:7A Variscite LTD +00:3A:9C Cisco Systems, Inc +E8:E7:76 Shenzhen Kootion Technology Co., Ltd +70:2F:97 Aava Mobile Oy +90:18:AE Shanghai Meridian Technologies, Co. Ltd. +04:94:A1 CATCH THE WIND INC +2C:34:27 ERCO & GENER +B4:2C:BE Direct Payment Solutions Limited +F4:76:26 Viltechmeda UAB +EC:44:76 Cisco Systems, Inc +9C:EB:E8 BizLink (Kunshan) Co.,Ltd +88:ED:1C Cudo Communication Co., Ltd. +B0:5B:1F THERMO FISHER SCIENTIFIC S.P.A. +74:32:56 NT-ware Systemprg GmbH +00:3A:AF BlueBit Ltd. +C0:BA:E6 Application Solutions (Electronics and Vision) Ltd +20:BF:DB DVL +88:98:21 TERAON +CC:50:76 Ocom Communications, Inc. +70:58:12 Panasonic AVC Networks Company +7C:2C:F3 Secure Electrans Ltd +30:41:74 ALTEC LANSING LLC +78:30:E1 UltraClenz, LLC +FC:FB:FB Cisco Systems, Inc +1C:12:9D IEEE PES PSRC/SUB +B4:08:32 TC Communications +00:27:20 NEW-SOL COM +00:27:1C MERCURY CORPORATION +00:27:12 MaxVision LLC +00:27:0F Envisionnovation Inc +00:26:D7 KM Electornic Technology Co., Ltd. +00:26:D1 S Squared Innovations Inc. +00:26:CB Cisco Systems, Inc +00:26:C4 Cadmos microsystems S.r.l. +00:26:BE Schoonderbeek Elektronica Systemen B.V. +00:26:B2 Setrix GmbH +00:26:AC Shanghai LUSTER Teraband photonic Co., Ltd. +00:26:B1 Navis Auto Motive Systems, Inc. +00:26:A8 DAEHAP HYPER-TECH +00:26:A7 CONNECT SRL +00:26:A1 Megger +00:26:A2 Instrumentation Technology Systems +00:26:9B SOKRAT Ltd. +00:26:95 ZT Group Int'l Inc +00:26:8F MTA SpA +6C:8C:DB Otus Technologies Ltd +B4:41:7A ShenZhen Gongjin Electronics Co.,Ltd +40:15:97 Protect America, Inc. +60:39:1F ABB Ltd +A0:73:32 Cashmaster International Limited +7C:7B:E4 Z'SEDAI KENKYUSHO CORPORATION +40:EF:4C Fihonest communication co.,Ltd +24:CF:21 Shenzhen State Micro Technology Co., Ltd +04:B3:B6 Seamap (UK) Ltd +10:BA:A5 GANA I&C CO., LTD +58:6E:D6 Private +E0:91:53 XAVi Technologies Corp. +CC:00:80 BETTINI SRL +64:4B:C3 Shanghai WOASiS Telecommunications Ltd., Co. +0C:E7:09 Fox Crypto B.V. +00:27:03 Testech Electronics Pte Ltd +00:26:FD Interactive Intelligence +00:26:F6 Military Communication Institute +00:26:F0 cTrixs International GmbH. +00:26:EA Cheerchip Electronic Technology (ShangHai) Co., Ltd. +00:26:E3 DTI +00:26:DD Fival Science & Technology Co.,Ltd. +00:26:DE FDI MATELEC +54:B6:20 SUHDOL E&C Co.Ltd. +C4:AA:A1 SUMMIT DEVELOPMENT, spol.s r.o. +78:C4:0E H&D Wireless +9C:5B:96 NMR Corporation +E4:FF:DD ELECTRON INDIA +F8:52:DF VNL Europe AB +1C:F0:61 SCAPS GmbH +A8:93:E6 JIANGXI JINGGANGSHAN CKING COMMUNICATION TECHNOLOGY CO.,LTD +00:26:7C Metz-Werke GmbH & Co KG +00:26:76 COMMidt AS +00:26:6F Coordiwise Technology Corp. +00:26:70 Cinch Connectors +00:26:63 Shenzhen Huitaiwei Tech. Ltd, co. +00:25:CD Skylane Optics +00:25:C8 S-Access GmbH +00:25:C7 altek Corporation +00:25:C1 Nawoo Korea Corp. +00:25:BA Alcatel-Lucent IPD +00:25:B5 Cisco Systems, Inc +00:25:AE Microsoft Corporation +00:25:A8 Kontron (BeiJing) Technology Co.,Ltd +00:25:A7 Comverge, Inc. +00:26:2B Wongs Electronics Co. Ltd. +00:26:25 MediaSputnik +00:26:1E QINGBANG ELEC(SZ) CO., LTD +00:26:19 FRC +00:26:12 Space Exploration Technologies +00:26:0B Cisco Systems, Inc +00:26:0C Dataram +00:25:FF CreNova Multimedia Co., Ltd +00:26:06 RAUMFELD GmbH +00:25:F9 GMK electronic design GmbH +00:25:A2 Alta Definicion LINCEO S.L. +00:25:96 GIGAVISION srl +00:25:9B Beijing PKUNITY Microsystems Technology Co., Ltd +00:25:95 Northwest Signal Supply, Inc +00:25:8F Trident Microsystems, Inc. +00:25:85 KOKUYO S&T Co., Ltd. +00:25:7B STJ ELECTRONICS PVT LTD +00:25:74 KUNIMI MEDIA DEVICE Co., Ltd. +00:26:4F Krüger &Gothe GmbH +00:26:48 Emitech Corp. +00:26:44 Thomson Telecom Belgium +00:26:3E Trapeze Networks +00:26:38 Xia Men Joyatech Co., Ltd. +00:26:3D MIA Corporation +00:26:31 COMMTACT LTD +00:25:6F Dantherm Power +00:25:62 interbro Co. Ltd. +00:25:5C NEC Corporation +00:25:4F ELETTROLAB Srl +00:25:18 Power PLUS Communications AG +00:25:13 CXP DIGITAL BV +00:25:0C Enertrac +00:25:05 eks Engel GmbH & Co. KG +00:24:F9 Cisco Systems, Inc +00:24:F2 Uniphone Telecommunication Co., Ltd. +00:24:ED YT Elec. Co,.Ltd. +00:24:E6 In Motion Technology Inc. +00:24:E1 Convey Computer Corp. +00:24:DF Digitalbox Europe GmbH +00:24:DA Innovar Systems Limited +00:25:49 Jeorich Tech. Co.,Ltd. +00:25:38 Samsung Electronics Co., Ltd., Memory Division +00:25:42 Pittasoft +00:25:30 Aetas Systems Inc. +00:25:29 COMELIT GROUP S.P.A +00:25:22 ASRock Incorporation +00:25:1D DSA Encore, LLC +00:25:F5 DVS Korea, Co., Ltd +00:25:F0 Suga Electronics Limited +00:25:EA Iphion BV +00:25:E4 OMNI-WiFi, LLC +00:25:E0 CeedTec Sdn Bhd +00:25:DA Secura Key +00:25:D9 DataFab Systems Inc. +00:24:10 NUETEQ Technology,Inc. +00:24:09 The Toro Company +00:23:F7 Private +00:23:FD AFT Atlas Fahrzeugtechnik GmbH +00:23:F6 Softwell Technology Co., Ltd. +00:23:EC Algorithmix GmbH +00:23:E7 Hinke A/S +00:23:87 ThinkFlood, Inc. +00:23:81 Lengda Technology(Xiamen) Co.,Ltd. +00:23:7B WHDI LLC +00:23:72 MORE STAR INDUSTRIAL GROUP LIMITED +00:24:CE Exeltech Inc +00:24:D3 QUALICA Inc. +00:24:C7 Mobilarm Ltd +00:24:C2 Asumo Co.,Ltd. +00:24:BC HuRob Co.,Ltd +00:24:B7 GridPoint, Inc. +00:24:AB A7 Engineering, Inc. +00:24:A6 TELESTAR DIGITAL GmbH +00:24:9A Beijing Zhongchuang Telecommunication Test Co., Ltd. +00:24:9F RIM Testing Services +00:24:87 Blackboard Inc. +00:24:98 Cisco Systems, Inc +00:24:85 ConteXtream Ltd +00:24:80 Meteocontrol GmbH +00:24:48 SpiderCloud Wireless, Inc +00:24:4A Voyant International +00:24:49 Shen Zhen Lite Star Electronics Technology Co., Ltd +00:24:43 Nortel Networks +00:24:39 Digital Barriers Advanced Technologies +00:24:79 Optec Displays, Inc. +00:24:6D Weinzierl Engineering GmbH +00:24:74 Autronica Fire And Securirty +00:24:68 Sumavision Technologies Co.,Ltd +00:24:66 Unitron nv +00:24:61 Shin Wang Tech. +00:24:5C Design-Com Technologies Pty. Ltd. +00:24:4F Asantron Technologies Ltd. +00:23:BB Schmitt Industries +00:23:BA Chroma +00:23:B5 ORTANA LTD +00:23:A8 Marshall Electronics +00:23:9B Elster Solutions, LLC +00:23:96 ANDES TECHNOLOGY CORPORATION +00:23:91 Maxian +00:23:8C Private +00:24:32 Neostar Technology Co.,LTD +00:24:29 MK MASTER INC. +00:24:1C FuGang Electronic (DG) Co.,Ltd +00:24:28 EnergyICT +00:24:16 Any Use +00:23:E0 INO Therapeutics LLC +00:23:DA Industrial Computer Source (Deutschland)GmbH +00:23:C8 TEAM-R +00:23:C7 AVSystem +00:23:C1 Securitas Direct AB +00:21:DC TECNOALARM S.r.l. +00:21:D6 LXI Consortium +00:21:CF The Crypto Group +00:21:C9 Wavecom Asia Pacific Limited +00:21:CA ART System Co., Ltd. +00:21:C3 CORNELL Communications, Inc. +00:23:34 Cisco Systems, Inc +00:23:2E Kedah Electronics Engineering, LLC +00:23:29 DDRdrive LLC +00:23:22 KISS Teknical Solutions, Inc. +00:23:25 IOLAN Holding +00:23:19 Sielox LLC +00:22:70 ABK North America, LLC +00:23:17 Lasercraft Inc +00:23:10 LNC Technology Co., Ltd. +00:22:73 Techway +00:22:74 FamilyPhone AB +00:22:6F 3onedata Technology Co. Ltd. +00:22:6A Honeywell +00:22:60 AFREEY Inc. +00:22:5B Teradici Corporation +00:22:56 Cisco Systems, Inc +00:22:55 Cisco Systems, Inc +00:22:4D MITAC INTERNATIONAL CORP. +00:22:52 ZOLL Lifecor Corporation +00:22:46 Evoc Intelligent Technology Co.,Ltd. +00:23:66 Beijing Siasun Electronic System Co.,Ltd. +00:23:6B Xembedded, Inc. +00:23:59 Benchmark Electronics ( Thailand ) Public Company Limited +00:23:5F Silicon Micro Sensors GmbH +00:23:53 F E T Elettronica snc +00:23:4C KTC AB +00:23:04 Cisco Systems, Inc +00:22:F3 SHARP Corporation +00:22:EE Algo Communication Products Ltd +00:22:E7 WPS Parking Systems +00:22:E1 ZORT Labs, LLC. +00:22:E2 WABTEC Transit Division +00:22:DB Translogic Corporation +00:22:A1 Huawei Symantec Technologies Co.,Ltd. +00:22:9B AverLogic Technologies, Inc. +00:22:9C Verismo Networks Inc +00:22:95 SGM Technology for lighting spa +00:22:8E TV-NUMERIC +00:22:89 Optosecurity Inc. +00:22:82 8086 Consultancy +00:22:7C Woori SMT Co.,ltd +00:22:79 Nippon Conlux Co., Ltd. +00:22:3C RATIO Entwicklungen GmbH +00:22:36 VECTOR SP. Z O.O. +00:22:30 FutureLogic Inc. +00:22:29 Compumedics Ltd +00:22:1D Freegene Technology LTD +00:22:24 Good Will Instrument Co., Ltd. +00:22:23 TimeKeeping Systems, Inc. +00:22:16 SHIBAURA VENDING MACHINE CORPORATION +00:22:17 Neat Electronics +00:22:11 Rohati Systems +00:22:0A OnLive, Inc +00:22:04 KORATEK +00:21:FF Cyfrowy Polsat SA +00:21:F5 Western Engravers Supply, Inc. +00:21:EF Kapsys +00:21:EE Full Spectrum Inc. +00:22:D4 ComWorth Co., Ltd. +00:22:CA Anviz Biometric Tech. Co., Ltd. +00:22:C5 INFORSON Co,Ltd. +00:22:C0 Shenzhen Forcelink Electronic Co, Ltd +00:22:BB beyerdynamic GmbH & Co. KG +00:22:AE Mattel Inc. +00:22:AD TELESIS TECHNOLOGIES, INC. +00:22:A8 Ouman Oy +00:21:32 Masterclock, Inc. +00:21:2C SemIndia System Private Limited +00:21:31 Blynke Inc. +00:21:1F SHINSUNG DELTATECH CO.,LTD. +00:21:20 Sequel Technologies +00:21:25 KUK JE TONG SHIN Co.,LTD +00:21:12 WISCOM SYSTEM CO.,LTD +00:1F:B9 Paltronics +00:1F:B7 WiMate Technologies Corp. +00:1F:B8 Universal Remote Control, Inc. +00:1F:B2 Sontheim Industrie Elektronik GmbH +00:1F:AB I.S HIGH TECH.INC +00:1F:A6 Stilo srl +00:1F:A1 Gtran Inc +00:1F:9C LEDCO +00:21:5E IBM Corp +00:21:51 Millinet Co., Ltd. +00:21:52 General Satellite Research & Development Limited +00:21:57 National Datacast, Inc. +00:21:4B Shenzhen HAMP Science & Technology Co.,Ltd +00:21:45 Semptian Technologies Ltd. +00:21:44 SS Telecoms +00:21:3C AliphCom +00:21:3B Berkshire Products, Inc +00:21:90 Goliath Solutions +00:21:89 AppTech, Inc. +00:21:84 POWERSOFT SRL +00:21:83 VATECH HYDRO +00:21:7D PYXIS S.R.L. +00:21:77 W. L. Gore & Associates +00:21:76 YMax Telecom Ltd. +00:21:71 Wesung TNC Co., Ltd. +00:21:64 Special Design Bureau for Seismic Instrumentation +00:21:03 GHI Electronics, LLC +00:1F:FA Coretree, Co, Ltd +00:1F:F5 Kongsberg Defence & Aerospace +00:1F:F4 Power Monitors, Inc. +00:1F:EE ubisys technologies GmbH +00:1F:E7 Simet +00:1F:DB Network Supply Corp., +00:1F:D1 OPTEX CO.,LTD. +00:1F:CA Cisco Systems, Inc +00:1F:BE Shenzhen Mopnet Industrial Co.,Ltd +00:1F:62 JSC Stilsoft +00:1F:67 Hitachi,Ltd. +00:1F:55 Honeywell Security (China) Co., Ltd. +00:1F:56 DIGITAL FORECAST +00:1F:4F Thinkware Co. Ltd. +00:1F:48 Mojix Inc. +00:1F:43 ENTES ELEKTRONIK +00:1F:8E Metris USA Inc. +00:1F:88 FMS Force Measuring Systems AG +00:1F:81 Accel Semiconductor Corp +00:1B:58 ACE CAD Enterprise Co., Ltd. +00:1F:78 Blue Fox Porini Textile +00:1F:6E Vtech Engineering Corporation +00:1F:68 Martinsson Elektronik AB +00:21:BC ZALA COMPUTER +00:21:B7 Lexmark International Inc. +00:21:B0 Tyco Telecommunications +00:21:A4 Dbii Networks +00:21:9A Cambridge Visual Networks Ltd +00:21:96 Telsey S.p.A. +00:1E:4B City Theatrical +00:1E:47 PT. Hariff Daya Tunggal Engineering +00:1E:41 Microwave Communication & Component, Inc. +00:1E:2E SIRTI S.p.A. +00:1E:27 SBN TECH Co.,Ltd. +00:1E:28 Lumexis Corporation +00:1D:F2 Netflix, Inc. +00:1D:EB DINEC International +00:1D:EC Marusys +00:1D:E6 Cisco Systems, Inc +00:1D:DA Mikroelektronika spol. s r. o. +00:1D:DF Sunitec Enterprise Co., Ltd. +00:1D:CC Hetra Secure Solutions +00:1D:C7 L-3 Communications Geneva Aerospace +00:1D:C0 Enphase Energy +00:1E:D8 Digital United Inc. +00:1E:D2 Ray Shine Video Technology Inc +00:1E:D1 Keyprocessor B.V. +00:1E:CC CDVI +00:1E:C5 Middle Atlantic Products Inc +00:1E:BF Haas Automation Inc. +00:1E:B9 Sing Fai Technology Limited +00:1E:B2 LG innotek +00:1F:2E Triangle Research Int'l Pte Ltd +00:1F:2D Electro-Optical Imaging, Inc. +00:1F:27 Cisco Systems, Inc +00:1F:14 NexG +00:1F:1B RoyalTek Company Ltd. +00:1F:0D L3 Communications - Telemetry West +00:1F:0E Japan Kyastem Co., Ltd +00:1E:22 ARVOO Imaging Products BV +00:1E:1B Digital Stream Technology, Inc. +00:1E:16 Keytronix +00:1E:15 Beech Hill Electronics +00:1E:11 ELELUX INTERNATIONAL LTD +00:1E:05 Xseed Technologies & Computing +00:1E:0C Sherwood Information Partners, Inc. +00:1D:FE Palm, Inc +00:1D:F9 Cybiotronics (Far East) Limited +00:1E:AD Wingtech Group Limited +00:1E:A2 Symx Systems, Inc. +00:1E:A7 Actiontec Electronics, Inc +00:1E:A1 Brunata a/s +00:1E:9B San-Eisha, Ltd. +00:1E:94 SUPERCOM TECHNOLOGY CORPORATION +00:1E:8F CANON INC. +00:1E:87 Realease Limited +00:1E:80 Last Mile Ltd. +00:1E:FC JSC MASSA-K +00:1F:08 RISCO LTD +00:1E:F5 Hitek Automated Inc. +00:1E:FB Trio Motion Technology Ltd +00:1E:E9 Stoneridge Electronics AB +00:1E:EE ETL Systems Ltd +00:1E:7B R.I.CO. S.r.l. +00:1E:76 Thermo Fisher Scientific +00:1E:6A Beijing Bluexon Technology Co.,Ltd +00:1E:71 MIrcom Group of Companies +00:1E:63 Vibro-Meter SA +00:1E:5E COmputime Ltd. +00:1E:57 ALCOMA, spol. s r.o. +00:1E:51 Converter Industry Srl +00:1D:B9 Wellspring Wireless +00:1D:B4 KUMHO ENG CO.,LTD +00:1D:9E AXION TECHNOLOGIES +00:1D:A3 SabiOso +00:1D:9D ARTJOY INTERNATIONAL LIMITED +00:1D:45 Cisco Systems, Inc +00:1D:3E SAKA TECHNO SCIENCE CO.,LTD +00:1D:37 Thales-Panda Transportation System +00:1D:38 Seagate Technology +00:1D:32 Longkay Communication & Technology (Shanghai) Co. Ltd +00:1D:2B Wuhan Pont Technology CO. , LTD +00:1D:1F Siauliu Tauro Televizoriai, JSC +00:1D:26 Rockridgesound Technology Co. +00:1D:1A OvisLink S.A. +00:1D:7A Wideband Semiconductor, Inc. +00:1D:74 Tianjin China-Silicon Microelectronics Co., Ltd. +00:1D:62 InPhase Technologies +00:1D:61 BIJ Corporation +00:1D:5B Tecvan Informática Ltda +00:1D:54 Sunnic Technology & Merchandise INC. +00:1D:4A Carestream Health, Inc. +00:1C:E8 Cummins Inc +00:1C:E4 EleSy JSC +00:1C:DD COWBELL ENGINEERING CO., LTD. +00:1C:DE Interactive Multimedia eXchange Inc. +00:1C:D8 BlueAnt Wireless +00:1C:D1 Waves Audio LTD +00:1C:CB Forth Corporation Public Company Limited +00:1C:C5 3Com Ltd +00:1D:14 SPERADTONE INFORMATION TECHNOLOGY LIMITED +00:1D:07 Shenzhen Sang Fei Consumer Communications Co.,Ltd +00:1D:01 Neptune Digital +00:1C:FA Alarm.com +00:1C:EE SHARP Corporation +00:1C:F5 Wiseblue Technology Limited +00:1C:B9 KWANG SUNG ELECTRONICS CO., LTD. +00:1C:AF Plato Networks Inc. +00:1C:B4 Iridium Satellite LLC +00:1C:9F Razorstream, LLC +00:1C:99 Shunra Software Ltd. +00:1C:8C DIAL TECHNOLOGY LTD. +00:1C:93 ExaDigm Inc +00:1C:87 Uriver Inc. +00:1C:82 Genew Technologies +00:1C:1A Thomas Instrumentation, Inc +00:1C:0E Cisco Systems, Inc +00:1C:13 OPTSYS TECHNOLOGY CO., LTD. +00:1C:07 Cwlinux Limited +00:1C:00 Entry Point, LLC +00:1B:F4 KENWIN INDUSTRIAL(HK) LTD. +00:1B:EF Blossoms Digital Technology Co.,Ltd. +00:1B:E2 AhnLab,Inc. +00:1C:7D Excelpoint Manufacturing Pte Ltd +00:1C:73 Arista Networks, Inc. +00:1C:78 WYPLAY SAS +00:1C:65 JoeScan, Inc. +00:1C:67 Pumpkin Networks, Inc. +00:1C:66 UCAMP CO.,LTD +00:1C:60 CSP Frontier Technologies,Inc. +00:1C:54 Hillstone Networks Inc +00:1C:59 DEVON IT +00:1C:4F MACAB AB +00:1C:37 Callpod, Inc. +00:1C:3C Seon Design Inc. +00:1C:30 Mode Lighting (UK ) Ltd. +00:1C:2B Alertme.com Limited +00:1C:2A Envisacor Technologies Inc. +00:1C:29 CORE DIGITAL ELECTRONICS CO., LTD +00:1C:24 Formosa Wireless Systems Corp. +00:1C:1F Quest Retail Technology Pty Ltd +00:1D:97 Alertus Technologies LLC +00:1D:90 EMCO Flow Systems +00:1D:84 Gateway, Inc. +00:1D:67 AMEC +00:1A:93 ERCO Leuchten GmbH +00:1A:98 Asotel Communication Limited Taiwan Branch +00:1A:8E 3Way Networks Ltd +00:1A:7D cyber-blue(HK)Ltd +00:1A:82 PROBA Building Automation Co.,LTD +00:1A:7C Hirschmann Multimedia B.V. +00:1A:78 ubtos +00:1A:7B Teleco, Inc. +00:1A:71 Diostech Co., Ltd. +00:1A:6C Cisco Systems, Inc +00:1A:65 Seluxit +00:1B:7D CXR Anderson Jacobson +00:1B:71 Telular Corp. +00:1B:6A Powerwave Technologies Sweden AB +00:1B:65 China Gridcom Co., Ltd +00:1B:5E BPL Limited +00:1B:57 SEMINDIA SYSTEMS PRIVATE LIMITED +00:1B:46 Blueone Technology Co.,Ltd +00:1B:4B SANION Co., Ltd. +00:1B:AD iControl Incorporated +00:1B:A6 intotech inc. +00:1B:A1 Åmic AB +00:1B:93 JC Decaux SA DNT +00:1B:95 VIDEO SYSTEMS SRL +00:1B:9A Apollo Fire Detectors Ltd +00:1B:94 T.E.M.A. S.p.A. +00:1B:8E Hulu Sweden AB +00:1B:89 EMZA Visual Sense Ltd. +00:1B:8A 2M Electronic A/S +00:1B:84 Scan Engineering Telecom +00:1B:D1 SOGESTMATIC +00:1B:D6 Kelvin Hughes Ltd +00:1B:CF Dataupia Corporation +00:1B:D0 IDENTEC SOLUTIONS +00:1B:CA Beijing Run Technology LTD. Company +00:1B:C3 Mobisolution Co.,Ltd +00:1B:BE ICOP Digital +00:1B:B4 Airvod Limited +00:1B:14 Carex Lighting Equipment Factory +00:1B:0D Cisco Systems, Inc +00:1B:06 Ateliers R. LAUMONIER +00:1B:08 Danfoss Drives A/S +00:1B:01 Applied Radio Technologies +00:1A:F5 PENTAONE. CO., LTD. +00:1A:FA Welch Allyn, Inc. +00:1A:E4 Medicis Technologies Corporation +00:1A:DD PePWave Ltd +00:1A:D1 FARGO CO., LTD. +00:1A:D8 AlsterAero GmbH +00:1A:CA Tilera Corporation +00:1A:CC Celestial Semiconductor, Ltd +00:1A:C5 BreakingPoint Systems, Inc. +00:1A:BB Fontal Technology Incorporation +00:1A:C0 JOYBIEN TECHNOLOGIES CO., LTD. +00:1A:60 Wave Electronics Co.,Ltd. +00:1A:55 ACA-Digital Corporation +00:1A:5A Korea Electric Power Data Network (KDN) Co., Ltd +00:1A:4E NTI AG / LinMot +00:1A:53 Zylaya +00:1A:42 Techcity Technology co., Ltd. +00:1A:47 Agami Systems, Inc. +00:1A:3B Doah Elecom Inc. +00:1B:3F ProCurve Networking by HP +00:1B:3A SIMS Corp. +00:1B:2C ATRON electronic GmbH +00:1B:27 Merlin CSI +00:1B:20 TPine Technology +00:1B:19 IEEE I&M Society TC9 +00:1A:B4 FFEI Ltd. +00:1A:AF BLUSENS TECHNOLOGY +00:1A:A8 Mamiya Digital Imaging Co., Ltd. +00:1A:9F A-Link Ltd +00:1A:A6 Telefunken Radio Communication Systems GmbH &CO.KG +00:19:3F RDI technology(Shenzhen) Co.,LTD +00:19:33 Strix Systems, Inc. +00:19:38 UMB Communications Co., Ltd. +00:19:2D Nokia Corporation +00:19:26 BitsGen Co., Ltd. +00:19:28 Siemens AG, Transportation Systems +00:19:0E Atech Technology Co., Ltd. +00:19:13 Chuang-Yi Network Equipment Co.Ltd. +00:19:15 TECOM Co., Ltd. +00:19:1A IRLINK +00:19:93 Changshu Switchgear MFG. Co.,Ltd. (Former Changshu Switchgea +00:19:98 SATO CORPORATION +00:19:8E Oticon A/S +00:19:80 Gridpoint Systems +00:19:87 Panasonic Mobile Communications Co., Ltd. +00:19:7B Picotest Corp. +00:19:68 Digital Video Networks(Shanghai) CO. LTD. +00:19:6D Raybit Systems Korea, Inc +00:19:6F SensoPart GmbH +00:19:52 ACOGITO Co., Ltd +00:19:57 Saafnet Canada Inc. +00:19:46 Cianet Industria e Comercio S/A +00:19:44 Fossil Partners, L.P. +00:1A:2F Cisco Systems, Inc +00:1A:36 Aipermon GmbH & Co. KG +00:1A:25 DELTA DORE +00:1A:17 Teak Technologies, Inc. +00:1A:19 Computer Engineering Limited +00:1A:12 Essilor +00:1A:0B BONA TECHNOLOGY INC. +00:1A:06 OpVista, Inc. +00:18:CD Erae Electronics Industry Co., Ltd +00:18:D2 High-Gain Antennas LLC +00:18:D9 Santosha Internatonal, Inc +00:18:C1 Almitec Informática e Comércio +00:18:C8 ISONAS Inc. +00:18:BC ZAO NVP Bolid +00:18:B5 Magna Carta +00:18:AE TVT CO.,LTD +00:19:02 Cambridge Consultants Ltd +00:19:07 Cisco Systems, Inc +00:18:FD Optimal Technologies International Inc. +00:18:F1 Chunichi Denshi Co.,LTD. +00:18:EA Alltec GmbH +00:18:EC Welding Technology Corporation +00:18:E5 Adhoco AG +00:18:A2 XIP Technology AB +00:18:A9 Ethernet Direct Corporation +00:18:9D Navcast Inc. +00:18:93 SHENZHEN PHOTON BROADBAND TECHNOLOGY CO.,LTD +00:18:98 KINGSTATE ELECTRONICS CORPORATION +00:18:91 Zhongshan General K-mate Electronics Co., Ltd +00:18:85 Avigilon Corporation +00:18:8C Mobile Action Technology Inc. +00:19:C8 AnyDATA Corporation +00:19:C3 Qualitrol +00:19:BE Altai Technologies Limited +00:19:BC ELECTRO CHANCE SRL +00:19:A4 Austar Technology (hang zhou) Co.,Ltd +00:19:A9 Cisco Systems, Inc +00:19:AB Raycom CO ., LTD +00:19:B0 HanYang System +00:19:FA Cable Vision Electronics CO., LTD. +00:19:FF Finnzymes +00:19:EC Sagamore Systems, Inc. +00:19:F3 Cetis, Inc +00:19:F8 Embedded Systems Design, Inc. +00:19:E5 Lynx Studio Technology, Inc. +00:19:E7 Cisco Systems, Inc +00:19:CD Chengdu ethercom information technology Ltd. +00:19:D4 ICX Technologies +00:19:D9 Zeutschel GmbH +00:18:23 Delta Electronics, Inc. +00:18:17 D. E. Shaw Research, LLC +00:18:1E GDX Technologies Ltd. +00:18:12 Beijing Xinwei Telecom Technology Co., Ltd. +00:18:06 Hokkei Industries Co., Ltd. +00:18:0B Brilliant Telecommunications +00:18:05 Beijing InHand Networking Technology Co.,Ltd. +00:17:B8 NOVATRON CO., LTD. +00:17:BD Tibetsystem +00:17:B1 ACIST Medical Systems, Inc. +00:17:AA elab-experience inc. +00:17:AC O'Neil Product Development Inc. +00:17:A5 Ralink Technology Corp +00:17:A0 RoboTech srl +00:17:9B Chant Sincere CO., LTD. +00:17:0F Cisco Systems, Inc +00:17:05 Methode Electronics +00:17:0A INEW DIGITAL COMPANY +00:16:F9 CETRTA POT, d.o.o., Kranj +00:16:F7 L-3 Communications, Aviation Recorders +00:16:E6 GIGA-BYTE TECHNOLOGY CO.,LTD. +00:17:8F NINGBO YIDONG ELECTRONIC CO.,LTD. +00:17:94 Cisco Systems, Inc +00:17:8D Checkpoint Systems, Inc. +00:17:7C Smartlink Network Systems Limited +00:17:81 Greystone Data System, Inc. +00:17:88 Philips Lighting BV +00:17:6C Pivot3, Inc. +00:17:70 Arti Industrial Electronics Ltd. +00:17:75 TTE Germany GmbH +00:17:60 Naito Densei Machida MFG.CO.,LTD +00:17:67 Earforce AS +00:18:5A uControl, Inc. +00:18:5F TAC Inc. +00:18:61 Ooma, Inc. +00:18:66 Leutron Vision +00:18:53 Atera Networks LTD. +00:18:4E Lianhe Technologies, Inc. +00:18:47 AceNet Technology Inc. +00:18:3B CENITS Co., Ltd. +00:18:40 3 Phoenix, Inc. +00:18:42 Nokia Danmark A/S +00:18:25 Private +00:18:2A Taiwan Video & Monitor +00:18:36 Reliance Electric Limited +00:17:59 Cisco Systems, Inc +00:17:54 Arkino HiTOP Corporation Limited +00:17:46 Freedom9 Inc. +00:17:48 Neokoros Brasil Ltda +00:17:4D DYNAMIC NETWORK FACTORY, INC. +00:17:41 DEFIDEV +00:17:33 SFR +00:17:3A Reach Systems Inc. +00:17:2E FXC Inc. +00:17:27 Thermo Ramsey Italia s.r.l. +00:17:22 Hanazeder Electronic GmbH +00:17:1B Innovation Lab Corp. +00:17:14 BR Controls Nederland bv +00:17:16 Qno Technology Inc. +00:17:F4 ZERON ALLIANCE +00:17:F9 Forcom Sp. z o.o. +00:18:00 UNIGRAND LTD +00:17:ED WooJooIT Ltd. +00:17:DA Spans Logic +00:17:E1 DACOS Technologies Co., Ltd. +00:17:D0 Opticom Communications, LLC +00:17:C4 Quanta Microsystems, INC. +00:18:80 Maxim Integrated Products +00:18:6D Zhenjiang Sapphire Electronic Industry CO. +00:18:72 Expertise Engineering +00:18:74 Cisco Systems, Inc +00:18:79 dSys +00:16:86 Karl Storz Imaging +00:16:7F Bluebird Soft Inc. +00:16:81 Vector Informatik GmbH +00:16:74 EuroCB (Phils.), Inc. +00:16:72 Zenway enterprise ltd +00:16:66 Quantier Communication Inc. +00:16:5F Fairmount Automation +00:16:AA Kei Communication Technology Inc. +00:16:AF Shenzhen Union Networks Equipment Co.,Ltd. +00:16:A5 Tandberg Storage ASA +00:16:99 Tonic DVB Marketing Ltd +00:16:A0 Auto-Maskin +00:16:92 Scientific-Atlanta, Inc. +00:16:94 Sennheiser Communications A/S +00:16:8D KORWIN CO., Ltd. +00:16:5A Harman Specialty Group +00:16:53 LEGO System A/S IE Electronics Division +00:16:4C PLANET INT Co., Ltd +00:16:47 Cisco Systems, Inc +00:16:42 Pangolin +00:16:3D Tsinghua Tongfang Legend Silicon Tech. Co., Ltd. +00:16:31 Xteam +00:16:2F Geutebrück GmbH +00:16:30 Vativ Technologies +00:15:F5 Sustainable Energy Systems +00:15:F4 Eventide +00:15:EE Omnex Control Systems +00:15:F3 PELTOR AB +00:15:E7 Quantec Tontechnik +00:15:E2 Dr.Ing. Herbert Knauer GmbH +00:15:DD IP Control Systems Ltd. +00:15:D8 Interlink Electronics +00:15:CA TeraRecon, Inc. +00:15:98 Kolektor group +00:15:93 U4EA Technologies Inc. +00:15:8C Liab ApS +00:15:86 Xiamen Overseas Chinese Electronic Co., Ltd. +00:15:85 Aonvision Technolopy Corp. +00:15:87 Takenaka Seisakusho Co.,Ltd +00:15:80 U-WAY CORPORATION +00:15:7B Leuze electronic GmbH + Co. KG +00:15:76 LABiTec - Labor Biomedical Technologies GmbH +00:15:6A DG2L Technologies Pvt. Ltd. +00:15:6F Xiranet Communications GmbH +00:16:DF Lundinova AB +00:16:DA Futronic Technology Co. Ltd. +00:16:D5 Synccom Co., Ltd +00:16:C9 NAT Seattle, Inc. +00:16:D0 ATech elektronika d.o.o. +00:16:BD ATI Industrial Automation +00:16:C2 Avtec Systems Inc +00:16:BB Law-Chain Computer Technology Co Ltd +00:16:2A Antik computers & communications s.r.o. +00:16:23 Interval Media +00:16:17 MSI +00:16:1E Woojinnet +00:16:0D Be Here Corporation +00:16:06 Ideal Industries +00:15:FA Cisco Systems, Inc +00:15:63 Cisco Systems, Inc +00:15:57 Olivetti +00:15:5C Dresser Wayne +00:15:4B Wonde Proud Technology Co., Ltd +00:15:50 Nits Technology Inc +00:15:45 SEECODE Co., Ltd. +00:15:3E Q-Matic Sweden AB +00:15:BC Develco +00:15:B5 CI Network Corp. +00:15:B0 AUTOTELENET CO.,LTD +00:15:AB PRO CO SOUND INC +00:15:A6 Digital Electronics Products Ltd. +00:15:9F Terascala, Inc. +00:15:32 Consumer Technologies Group, LLC +00:15:39 Technodrive srl +00:15:2B Cisco Systems, Inc +00:15:2D TenX Networks, LLC +00:15:2C Cisco Systems, Inc +00:15:1F Multivision Intelligent Surveillance (Hong Kong) Ltd +00:15:26 Remote Technologies Inc +00:15:1A Hunter Engineering Company +00:15:15 Leipold+Co.GmbH +00:15:10 Techsphere Co., Ltd +00:14:53 ADVANTECH TECHNOLOGIES CO.,LTD +00:14:4E SRISA +00:14:42 ATTO CORPORATION +00:14:49 Sichuan Changhong Electric Ltd. +00:14:3D Aevoe Inc. +00:14:3C Rheinmetall Canada Inc. +00:14:3B Sensovation AG +00:14:36 Qwerty Elektronik AB +00:14:AB Senhai Electronic Technology Co., Ltd. +00:14:B0 Naeil Community +00:14:A9 Cisco Systems, Inc +00:14:AA Ashly Audio, Inc. +00:14:9D Sound ID Inc. +00:14:98 Viking Design Technology +00:14:8A Elin Ebg Traction Gmbh +00:14:91 Daniels Electronics Ltd. dbo Codan Rado Communications +00:14:85 Giga-Byte +00:14:7E InnerWireless +00:14:77 Nertec Inc. +00:14:72 China Broadband Wireless IP Standard Group +00:14:66 Kleinhenz Elektronik GmbH +00:14:6B Anagran, Inc. +00:14:5F ADITEC CO. LTD +00:14:58 HS Automatic ApS +00:14:E6 AIM Infrarotmodule GmbH +00:14:E0 LET'S Corporation +00:14:D4 K Technology Corporation +00:14:D9 IP Fabrics, Inc. +00:14:CD DigitalZone Co., Ltd. +00:14:C1 U.S. Robotics Corporation +00:14:C6 Quixant Ltd +00:14:BA Carvers SA de CV +00:14:B5 PHYSIOMETRIX,INC +00:13:C7 IONOS Co.,Ltd. +00:13:C0 Trix Tecnologia Ltda. +00:13:B6 Sling Media, Inc. +00:13:AF NUMA Technology,Inc. +00:13:B0 Jablotron +00:13:AA ALS & TEC Ltd. +00:13:A3 Siemens Com CPE Devices +00:13:9E Ciara Technologies Inc. +00:15:02 BETA tech +00:15:09 Plus Technology Co., Ltd +00:14:FD Thecus Technology Corp. +00:14:EF TZero Technologies, Inc. +00:14:F1 Cisco Systems, Inc +00:14:F0 Business Security OL AB +00:14:EA S Digm Inc. (Safe Paradigm Inc.) +00:14:E5 Alticast +00:14:23 J-S Co. NEUROCOM +00:14:19 SIDSA +00:14:12 S-TEC electronics AG +00:14:09 MAGNETI MARELLI S.E. S.p.A. +00:14:0A WEPIO Co., Ltd. +00:13:FD Nokia Danmark A/S +00:13:F8 Dex Security Solutions +00:13:F1 AMOD Technology Co., Ltd. +00:13:F7 SMC Networks, Inc. +00:13:E7 Halcro +00:13:DB SHOEI Electric Co.,Ltd +00:13:CC Tall Maple Systems +00:12:84 Lab33 Srl +00:12:7E Digital Lifestyles Group, Inc. +00:12:77 Korenix Technologies Co., Ltd. +00:12:72 Redux Communications Ltd. +00:12:71 Measurement Computing Corp +00:12:6B Ascalade Communications Limited +00:12:64 daum electronic gmbh +00:12:5A Microsoft Corporation +00:12:5F AWIND Inc. +00:12:55 NetEffect Incorporated +00:12:4E XAC AUTOMATION CORP. +00:12:48 EMC Corporation (Kashya) +00:12:42 Millennial Net +00:12:36 ConSentry Networks +00:12:3B KeRo Systems ApS +00:13:68 Saab Danmark A/S +00:13:5C OnSite Systems, Inc. +00:13:55 TOMEN Cyber-business Solutions, Inc. +00:13:56 FLIR Radiation Inc +00:13:50 Silver Spring Networks, Inc +00:13:44 Fargo Electronics Inc. +00:13:43 Matsushita Electronic Components (Europe) GmbH +00:13:3D Micro Memory Curtiss Wright Co +00:13:9D Marvell Hispana S.L. +00:13:8B Phantom Technologies LLC +00:13:90 Termtek Computer Co., Ltd +00:13:76 Tabor Electronics Ltd. +00:13:7B Movon Corporation +00:13:82 Cetacea Networks Corporation +00:13:87 27M Technologies AB +00:13:6F PacketMotion, Inc. +00:13:75 American Security Products Co. +00:13:63 Verascape, Inc. +00:12:FA THX LTD +00:13:01 IronGate S.L. +00:13:07 Paravirtual Corporation +00:12:F5 Imarda New Zealand Limited +00:12:EB PDH Solutions, LLC +00:12:DE Radio Components Sweden AB +00:12:DD Shengqu Information Technology (Shanghai) Co., Ltd. +00:12:E4 ZIEHL industrie-electronik GmbH + Co KG +00:12:AF ELPRO Technologies +00:12:A8 intec GmbH +00:12:A2 VITA +00:12:A1 BluePacket Communications Co., Ltd. +00:12:9C Yulinet +00:12:90 KYOWA Electric & Machinery Corp. +00:12:95 Aiware Inc. +00:13:2A Sitronics Telecom Solutions +00:13:31 CellPoint Connect +00:13:36 Tianjin 712 Communication Broadcasting co., ltd. +00:13:24 Schneider Electric Ultra Terminal +00:13:14 Asiamajor Inc. +00:13:19 Cisco Systems, Inc +00:13:1A Cisco Systems, Inc +00:13:0D GALILEO AVIONICA +00:13:08 Nuvera Fuel Cells +00:12:2F Sanei Electric Inc. +00:12:35 Andrew Corporation +00:12:2B Virbiage Pty Ltd +00:12:12 PLUS Corporation +00:12:19 Ahead Communication Systems Inc +00:12:D8 International Games System Co., Ltd. +00:12:CB CSS Inc. +00:12:C5 V-Show Technology (China) Co.,Ltd +00:12:CC Bitatek CO., LTD +00:12:B4 Work Microwave GmbH +00:12:BB Telecommunications Industry Association TR-41 Committee +00:12:06 iQuest (NZ) Ltd +00:12:0B Chinasys Technologies Limited +00:12:0C CE-Infosys Pte Ltd +00:11:FF Digitro Tecnologia Ltda +00:11:FA Rane Corporation +00:11:F0 Wideful Limited +00:11:EF Conitec Datensysteme GmbH +00:11:E9 STARNEX CO., LTD. +00:11:87 Category Solutions, Inc +00:11:82 IMI Norgren Ltd +00:11:81 InterEnergy Co.Ltd, +00:11:7B Büchi Labortechnik AG +00:11:6F Netforyou Co., LTD. +00:11:68 HomeLogic LLC +00:11:5E ProMinent Dosiertechnik GmbH +00:11:57 Oki Electric Industry Co., Ltd. +00:0F:B2 Broadband Pacenet (India) Pvt. Ltd. +00:0F:A5 BWA Technology GmbH +00:0F:B1 Cognio Inc. +00:0F:AC IEEE 802.11 +00:0F:9C Panduit Corp +00:0F:A0 CANON KOREA BUSINESS SOLUTIONS INC. +00:0F:97 Avanex Corporation +00:0F:8A WideView +00:0F:89 Winnertec System Co., Ltd. +00:0F:90 Cisco Systems, Inc +00:0F:D7 Harman Music Group +00:0F:D1 Applied Wireless Identifications Group, Inc. +00:0F:D2 EWA Technologies, Inc. +00:0F:C4 NST co.,LTD. +00:0F:CB 3Com Ltd +00:0F:BF DGT Sp. z o.o. +00:0F:B8 CallURL Inc. +00:11:DD FROMUS TEC. Co., Ltd. +00:11:E2 Hua Jung Components Co., Ltd. +00:11:CF Thrane & Thrane A/S +00:11:D6 HandEra, Inc. +00:11:D0 Tandberg Data ASA +00:11:CA Long Range Systems, Inc. +00:11:C3 Transceiving System Technology Corporation +00:11:B7 Octalix B.V. +00:11:BE AGP Telecom Co. Ltd +00:11:BD Bombardier Transportation +00:11:05 Sunplus Technology Co., Ltd. +00:11:0C Atmark Techno, Inc. +00:0F:F9 Valcretec, Inc. +00:0F:FA Optinel Systems, Inc. +00:0F:FF Control4 +00:0F:F1 nex-G Systems Pte.Ltd +00:0F:E4 Pantech Co.,Ltd +00:0F:EA Giga-Byte Technology Co.,LTD. +00:0F:E3 Damm Cellular Systems A/S +00:11:AB TRUSTABLE TECHNOLOGY CO.,LTD. +00:11:B0 Fortelink Inc. +00:11:A4 JStream Technologies Inc. +00:11:98 Prism Media Products Limited +00:11:9D Diginfo Technology Corporation +00:11:9E Solectron Brazil +00:11:8E Halytech Mace +00:11:93 Cisco Systems, Inc +00:11:52 Eidsvoll Electronics AS +00:11:4F US Digital Television, Inc +00:11:49 Proliphix Inc. +00:11:42 e-SMARTCOM INC. +00:11:3D KN SOLTEC CO.,LTD. +00:11:3C Micronas GmbH +00:11:36 Goodrich Sensor Systems +00:11:2C IZT GmbH +00:11:30 Allied Telesis (Hong Kong) Ltd. +00:11:1E EPSG (Ethernet Powerlink Standardization Group) +00:11:1F Doremi Labs, Inc. +00:11:12 Honeywell CMSS +00:11:18 BLX IC Design Corp., Ltd. +00:0F:58 Adder Technology Limited +00:0F:52 YORK Refrigeration, Marine & Controls +00:0F:57 CABLELOGIC Co., Ltd. +00:0F:45 Stretch, Inc. +00:0F:46 SINAR AG +00:0F:4B Oracle Corporation +00:0F:37 Xambala Incorporated +00:0F:3F Big Bear Networks +00:0F:3B Fuji System Machines Co., Ltd. +00:0F:31 Allied Vision Technologies Canada Inc +00:0F:32 Lootom Telcovideo Network Wuxi Co Ltd +00:0F:2B GREENBELL SYSTEMS +00:0E:98 HME Clear-Com LTD. +00:0E:93 Milénio 3 Sistemas Electrónicos, Lda. +00:0E:8C Siemens AG A&D ET +00:0E:86 Alcatel North America +00:0E:80 Thomson Technology Inc +00:0E:85 Catalyst Enterprises, Inc. +00:0E:74 Solar Telecom. Tech +00:0E:79 Ample Communications Inc. +00:0F:24 Cisco Systems, Inc +00:0F:12 Panasonic Europe Ltd. +00:0F:18 Industrial Control Systems +00:0F:11 Prodrive B.V. +00:0F:0C SYNCHRONIC ENGINEERING +00:0E:FF Megasolution,Inc. +00:0F:00 Legra Systems, Inc. +00:0F:05 3B SYSTEM INC. +00:0F:7D Xirrus +00:0F:84 Astute Networks, Inc. +00:0F:77 DENTUM CO.,LTD +00:0F:71 Sanmei Electronics Co.,Ltd +00:0F:78 Datacap Systems Inc +00:0F:65 icube Corp. +00:0F:5E Veo +00:0E:71 Gemstar Technology Development Ltd. +00:0E:6C Device Drivers Limited +00:0E:65 TransCore +00:0E:5F activ-net GmbH & Co. KG +00:0E:60 360SUN Digital Broadband Corporation +00:0E:52 Optium Corporation +00:0E:46 Niigata Seimitsu Co.,Ltd. +00:0E:4D Numesa Inc. +00:0E:3F Soronti, Inc. +00:0E:C5 Digital Multitools Inc +00:0E:B8 Iiga co.,Ltd +00:0E:B7 Knovative, Inc. +00:0E:BE B&B Electronics Manufacturing Co. +00:0E:B2 Micro-Research Finland Oy +00:0E:AB Cray Inc +00:0E:A5 BLIP Systems +00:0E:9F TEMIC SDS GmbH +00:0E:0A SAKUMA DESIGN OFFICE +00:0E:12 Adaptive Micro Systems Inc. +00:0E:04 CMA/Microdialysis AB +00:0D:F7 Space Dynamics Lab +00:0D:FE Hauppauge Computer Works, Inc. +00:0D:F1 IONIX INC. +00:0D:EB CompXs Limited +00:0D:F2 Private +00:0D:E4 DIGINICS, Inc. +00:0E:F9 REA Elektronik GmbH +00:0E:F2 Infinico Corporation +00:0E:E0 Mcharge +00:0E:DF PLX Technology +00:0E:E6 Adimos Systems LTD +00:0E:CA WTSS Inc +00:0E:D1 Osaka Micro Computer. +00:0E:DA C-TECH UNITED CORP. +00:0E:D6 Cisco Systems, Inc +00:0E:37 Harms & Wende GmbH & Co.KG +00:0E:38 Cisco Systems, Inc +00:0E:31 Olympus Soft Imaging Solutions GmbH +00:0E:2A Private +00:0E:25 Hannae Technology Co., Ltd +00:0E:18 MyA Technology +00:0E:17 Private +00:0E:0E ESA elettronica S.P.A. +00:0C:7E Tellium Incorporated +00:0C:86 Cisco Systems, Inc +00:0C:81 Schneider Electric (Australia) +00:0C:72 Tempearl Industrial Co., Ltd. +00:0C:79 Extel Communications P/L +00:0C:66 Pronto Networks Inc +00:0C:6B Kurz Industrie-Elektronik GmbH +00:0C:6D Edwards Ltd. +00:0D:DF Japan Image & Network Inc. +00:0D:D2 Simrad Optronics ASA +00:0D:D1 Stryker Corporation +00:0D:D8 BBN +00:0D:CC NEOSMART Corp. +00:0D:BF TekTone Sound & Signal Mfg., Inc. +00:0D:C0 Spagat AS +00:0D:C5 EchoStar Global B.V. +00:0D:B9 PC Engines GmbH +00:0D:8C Shanghai Wedone Digital Ltd. CO. +00:0D:8B T&D Corporation +00:0D:85 Tapwave, Inc. +00:0D:86 Huber + Suhner AG +00:0D:7E Axiowave Networks, Inc. +00:0D:78 Engineering & Security +00:0D:77 FalconStor Software +00:0D:6B Mita-Teknik A/S +00:0D:65 Cisco Systems, Inc +00:0D:5F Minds Inc +00:0D:66 Cisco Systems, Inc +00:0C:B1 Salland Engineering (Europe) BV +00:0C:B7 Nanjing Huazhuo Electronics Co., Ltd. +00:0C:BE Innominate Security Technologies AG +00:0C:C3 BeWAN systems +00:0C:B2 UNION co., ltd. +00:0C:A5 Naman NZ LTd +00:0C:AC Citizen Watch Co., Ltd. +00:0C:94 United Electronic Industries, Inc. (EUI) +00:0C:99 HITEL LINK Co.,Ltd +00:0C:A0 StorCase Technology, Inc. +00:0C:8D MATRIX VISION GmbH +00:0C:92 WolfVision Gmbh +00:0D:32 DispenseSource, Inc. +00:0D:31 Compellent Technologies, Inc. +00:0D:2C Patapsco Designs Ltd +00:0D:25 SANDEN CORPORATION +00:0D:1F AV Digital +00:0D:19 ROBE Show lighting +00:0D:20 ASAHIKASEI TECHNOSYSTEM CO.,LTD. +00:0D:0D ITSupported, LLC +00:0D:12 AXELL Corporation +00:0D:B2 Ammasso, Inc. +00:0D:AD Dataprobe, Inc. +00:0D:9E TOKUDEN OHIZUMI SEISAKUSYO Co.,Ltd. +00:0D:A5 Fabric7 Systems, Inc +00:0D:99 Orbital Sciences Corp.; Launch Systems Group +00:0D:58 Private +00:0D:4C Outline Electronics Ltd. +00:0D:53 Beijing 5w Communication Corp. +00:0D:3F VTI Instruments Corporation +00:0D:44 Audio BU - Logitech +00:0D:38 NISSIN INC. +00:0C:D1 SFOM Technology Corp. +00:0C:D6 PARTNER TECH +00:0C:DD AOS technologies AG +00:0C:CA HGST a Western Digital Company +00:0C:C4 Tiptel AG +00:0D:00 Seaway Networks Inc. +00:0D:06 Compulogic Limited +00:0C:FA Digital Systems Corp +00:0C:FF MRO-TEK LIMITED +00:0C:ED Real Digital Media +00:0C:EE jp-embedded +00:0C:F3 CALL IMAGE SA +00:0C:E7 MediaTek Inc. +00:0C:E3 Option International N.V. +00:0B:01 DAIICHI ELECTRONICS CO., LTD. +00:0A:F0 SHIN-OH ELECTRONICS CO., LTD. R&D +00:0A:F5 Airgo Networks, Inc. +00:0A:EC Koatsu Gas Kogyo Co., Ltd. +00:0A:E5 ScottCare Corporation +00:0A:E7 ELIOP S.A. +00:0A:E0 Fujitsu Softek +00:0A:C8 ZPSYS CO.,LTD. (Planning&Management) +00:0A:CD Sunrich Technology Limited +00:0A:D4 CoreBell Systems Inc. +00:0B:5E Audio Engineering Society Inc. +00:0B:63 Kaleidescape +00:0B:55 ADInstruments +00:0B:5A HyperEdge +00:0B:52 JOYMAX ELECTRONICS CO. LTD. +00:0B:4D Emuzed +00:0B:41 Ing. Büro Dr. Beutlhauser +00:0B:46 Cisco Systems, Inc +00:0B:33 Vivato Technologies +00:0B:3A QuStream Corporation +00:0B:3F Anthology Solutions Inc. +00:0B:95 eBet Gaming Systems Pty Ltd +00:0B:8F AKITA ELECTRONICS SYSTEMS CO.,LTD. +00:0B:89 Top Global Technology, Ltd. +00:0B:8E Ascent Corporation +00:0B:90 ADVA Optical Networking Ltd. +00:0B:7D SOLOMON EXTREME INTERNATIONAL LTD. +00:0B:82 Grandstream Networks, Inc. +00:0B:6F Media Streaming Networks Inc +00:0B:76 ET&T Technology Co. Ltd. +00:0A:C1 Futuretel +00:0A:C6 Overture Networks. +00:0A:AE Rosemount Process Analytical +00:0A:B3 Fa. GIRA +00:0A:B5 Digital Electronic Network +00:0A:BA Arcon Technology Limited +00:0A:A2 SYSTEK INC. +00:0A:A7 FEI Electron Optics +00:0A:8F Aska International Inc. +00:0A:94 ShangHai cellink CO., LTD +00:0C:4E Winbest Technology CO,LT +00:0C:53 Private +00:0C:5A IBSmm Embedded Electronics Consulting +00:0C:5F Avtec, Inc. +00:0C:47 SK Teletech(R&D Planning Team) +00:0C:4C Arcor AG&Co. +00:0C:3E Crest Audio +00:0C:37 Geomation, Inc. +00:0C:2D FullWave Technology Co., Ltd. +00:0C:1A Quest Technical Solutions Inc. +00:0C:1E Global Cache +00:0C:23 Beijing Lanchuan Tech. Co., Ltd. +00:0C:0E XtremeSpectrum, Inc. +00:0C:15 CyberPower Systems, Inc. +00:0C:09 Hitachi IE Systems Co., Ltd +00:0B:D3 cd3o +00:0B:C7 ICET S.p.A. +00:0B:CE Free2move AB +00:0B:C2 Corinex Communication Corp. +00:0B:BB Etin Systems Co., Ltd +00:0B:C0 China IWNComm Co., Ltd. +00:0B:AF WOOJU COMMUNICATIONS Co,.Ltd +00:0B:B4 RDC Semiconductor Inc., +00:0B:A5 Quasar Cipta Mandiri, PT +00:0B:AA Aiphone co.,Ltd +00:0B:9E Yasing Technology Corp. +00:0B:27 Scion Corporation +00:0B:2E Cal-Comp Electronics (Thailand) Public Company Limited Taipe +00:0B:1B Systronix, Inc. +00:0B:20 Hirata corporation +00:0B:22 Environmental Systems and Services +00:0B:14 ViewSonic Corporation +00:0B:0D Air2U, Inc. +00:0B:0F Bosch Rexroth +00:0B:08 Pillar Data Systems +00:0A:FC Core Tec Communications, LLC +00:0B:F6 Nitgen Co., Ltd +00:0B:FB D-NET International Corporation +00:0C:02 ABB Oy +00:0B:EA Zultys Technologies +00:0B:EF Code Corporation +00:0B:E3 Key Stream Co., Ltd. +00:0B:E8 AOIP +00:0B:E9 Actel Corporation +00:0B:D7 DORMA Time + Access GmbH +00:0B:DC AKCP +00:09:94 Cronyx Engineering +00:09:99 CP GEORGES RENAULT +00:09:87 NISHI NIPPON ELECTRIC WIRE & CABLE CO.,LTD. +00:09:88 Nudian Electron Co., Ltd. +00:09:8D Velocity Semiconductor +00:09:81 Newport Networks +00:09:75 fSONA Communications Corporation +00:09:7A Louis Design Labs. +00:09:68 TECHNOVENTURE, INC. +00:09:62 Sonitor Technologies AS +00:0A:9B TB Group Inc +00:0A:9A Aiptek International Inc +00:0A:80 Telkonet Inc. +00:0A:82 TATSUTA SYSTEM ELECTRONICS CO.,LTD. +00:0A:87 Integrated Micromachines Inc. +00:0A:7B Cornelius Consult +00:0A:6D EKS Elektronikservice GmbH +00:0A:6F ZyFLEX Technologies Inc +00:0A:74 Manticom Networks Inc. +00:0A:61 Cellinx Systems Inc. +00:09:C3 NETAS +00:09:B9 Action Imaging Solutions +00:09:BA MAKU Informationstechik GmbH +00:09:AC LANVOICE +00:09:B3 MCM Systems Ltd +00:09:A7 Bang & Olufsen A/S +00:09:9A ELMO COMPANY, LIMITED +00:09:A0 Microtechno Corporation +00:09:ED CipherOptics +00:09:F2 Cohu, Inc., Electronics Division +00:09:E6 Cyber Switching Inc. +00:09:E0 XEMICS S.A. +00:09:DA Control Module Inc. +00:09:DF Vestel Komunikasyon Sanayi ve Ticaret A.S. +00:09:CD HUDSON SOFT CO.,LTD. +00:09:C7 Movistec +00:09:CE SpaceBridge Semiconductor Corp. +00:09:D3 Western DataCom Co., Inc. +00:09:01 Shenzhen Shixuntong Information & Technoligy Co +00:08:FC Gigaphoton Inc. +00:08:F9 Artesyn Embedded Technologies +00:08:F4 Bluetake Technology Co., Ltd. +00:08:EB ROMWin Co.,Ltd. +00:08:E4 Envenergy Inc +00:08:DF Alistel Inc. +00:08:D8 Dowkey Microwave +00:08:D2 ZOOM Networks Inc. +00:08:CC Remotec, Inc. +00:08:D1 KAREL INC. +00:09:67 Tachyon, Inc +00:09:6E GIANT ELECTRONICS LTD. +00:09:5E Masstech Group Inc. +00:09:59 Sitecsoft +00:09:4D Braintree Communications Pty Ltd +00:09:52 Auerswald GmbH & Co. KG +00:09:46 Cluster Labs GmbH +00:09:40 AGFEO GmbH & Co. KG +00:09:3F Double-Win Enterpirse CO., LTD +00:09:3A Molex Fiber Optics +00:09:33 Ophit Co.Ltd. +00:0A:5C Carel s.p.a. +00:0A:50 REMOTEK CORPORATION +00:0A:55 MARKEM Corporation +00:0A:4E UNITEK Electronics INC. +00:0A:42 Cisco Systems, Inc +00:0A:49 F5 Networks, Inc. +00:0A:36 Synelec Telecom Multimedia +00:0A:3B GCT Semiconductor, Inc +00:0A:3D Elo Sistemas Eletronicos S.A. +00:0A:2F Artnix Inc. +00:09:27 TOYOKEIKI CO.,LTD. +00:09:2E B&Tech System Inc. +00:09:20 EpoX COMPUTER CO.,LTD. +00:09:1B Digital Generation Inc. +00:09:14 COMPUTROLS INC. +00:09:0E Helix Technology Inc. +00:09:08 VTech Technology Corp. +00:09:0D LEADER ELECTRONICS CORP. +00:0A:20 SVA Networks, Inc. +00:0A:25 CERAGON NETWORKS +00:0A:14 TECO a.s. +00:0A:19 Valere Power, Inc. +00:0A:0D FCI Deutschland GmbH +00:0A:12 Azylex Technology, Inc +00:09:F9 ART JAPAN CO., LTD. +00:09:FC IPFLEX Inc. +00:0A:03 ENDESA SERVICIOS, S.L. +00:06:F4 Prime Electronics & Satellitics Inc. +00:07:05 Endress & Hauser GmbH & Co +00:06:F8 The Boeing Company +00:06:FF Sheba Systems Co., Ltd. +00:06:FD Comjet Information Systems Corp. +00:06:E7 Bit Blitz Communications Inc. +00:06:ED Inara Networks +00:06:DC Syabas Technology (Amquest) +00:06:E1 Techno Trade s.a +00:06:E6 DongYang Telecom Co., Ltd. +00:06:CF Thales Avionics In-Flight Systems, LLC +00:06:D6 Cisco Systems, Inc +00:06:D5 Diamond Systems Corp. +00:06:C9 Technical Marketing Research, Inc. +00:07:B1 Equator Technologies +00:07:B8 Corvalent Corporation +00:07:B2 Transaccess S.A. +00:07:A4 GN Netcom Ltd. +00:07:AA Quantum Data Inc. +00:07:9D Musashi Co., Ltd. +00:07:9E Ilinx Co., Ltd. +00:07:74 GuangZhou Thinker Technology Co. Ltd. +00:07:91 International Data Communications, Inc. +00:07:98 Selea SRL +00:07:97 Netpower Co., Ltd. +00:07:8B Wegener Communications, Inc. +00:07:85 Cisco Systems, Inc +00:07:7B Millimetrix Broadband Networks +00:08:56 Gamatronic Electronic Industries Ltd. +00:08:2D Indus Teqsite Private Limited +00:08:21 Cisco Systems, Inc +00:08:14 TIL Technologies +00:08:1A Sanrad Intelligence Storage Communications (2000) Ltd. +00:08:0F Proximion Fiber Optics AB +00:08:09 Systemonic AG +00:08:03 Cos Tron +00:07:FF Gluon Networks +00:07:F9 Sensaphone +00:08:94 InnoVISION Multimedia Ltd. +00:08:8F ADVANCED DIGITAL TECHNOLOGY +00:08:88 OULLIM Information Technology Inc,. +00:08:82 SIGMA CORPORATION +00:08:7C Cisco Systems, Inc +00:08:75 Acorp Electronics Corp. +00:08:70 Rasvia Systems, Inc. +00:08:6F Resources Computer Network Ltd. +00:08:69 Command-e Technology Co.,Ltd. +00:08:63 Entrisphere Inc. +00:08:5D Aastra +00:08:62 NEC Eluminant Technologies, Inc. +00:08:50 Arizona Instrument Corp. +00:07:38 Young Technology Co., Ltd. +00:07:3F Woojyun Systec Co., Ltd. +00:07:2C Fabricom +00:07:33 DANCONTROL Engineering +00:07:32 AAEON Technology Inc. +00:07:16 J & S Marine Ltd. +00:07:1B CDVI Americas Ltd +00:07:22 The Nielsen Company +00:07:1C AT&T Fixed Wireless Services +00:07:0A Unicom Automation Co., Ltd. +00:07:0F Fujant, Inc. +00:07:09 Westerstrand Urfabrik AB +00:07:02 Varian Medical Systems +00:06:F3 AcceLight Networks +00:06:C3 Schindler Elevator Ltd. +00:06:C8 Sumitomo Metal Micro Devices, Inc. +00:06:BF Accella Technologies Co., Ltd. +00:06:B9 A5TEK Corp. +00:06:B2 Linxtek Co. +00:06:AC Intersoft Co. +00:06:A6 Artistic Licence Engineering Ltd +00:06:A2 Microtune, Inc. +00:06:95 Ensure Technologies, Inc. +00:06:9C Transmode Systems AB +00:06:96 Advent Networks +00:07:F3 Thinkengine Networks +00:07:EC Cisco Systems, Inc +00:07:F2 IOA Corporation +00:07:E6 edgeflow Canada Inc. +00:07:E0 Palm Inc. +00:07:D9 Splicecom +00:07:DA Neuro Telecom Co., Ltd. +00:07:D3 SPGPrints B.V. +00:07:CA Creatix Polymedia Ges Fur Kommunikaitonssysteme +00:07:C4 JEAN Co. Ltd. +00:07:BE DataLogic SpA +00:07:7E Elrest GmbH +00:07:6F Synoptics Limited +00:07:6E Sinetica Corporation Limited +00:07:6A NEXTEYE Co., Ltd. +00:07:5E Ametek Power Instruments +00:07:65 Jade Quantum Technologies, Inc. +00:07:64 YoungWoo Telecom Co. Ltd. +00:07:57 Topcall International AG +00:07:58 Dragonwave +00:07:52 Rhythm Watch Co., Ltd. +00:07:4B Daihen Corporation +00:07:45 Radlan Computer Communications Ltd. +00:08:C2 Cisco Systems, Inc +00:08:BB NetExcell +00:08:B5 TAI GUEN ENTERPRISE CO., LTD +00:08:B6 RouteFree, Inc. +00:08:AF Novatec Corporation +00:08:A9 SangSang Technology, Inc. +00:08:A8 Systec Co., Ltd. +00:08:A3 Cisco Systems, Inc +00:08:9C Elecs Industry Co., Ltd. +00:06:90 Euracom Communication GmbH +00:06:8F Telemonitor, Inc. +00:06:89 yLez Technologies Pte Ltd +00:06:83 Bravara Communications, Inc. +00:D0:B9 MICROTEK INTERNATIONAL, INC. +00:06:7D Takasago Ltd. +00:06:75 Banderacom, Inc. +00:06:79 Konami Corporation +00:06:63 Human Technology Co., Ltd. +00:06:6F Korea Data Systems +00:06:62 MBM Technology Ltd. +00:06:69 Datasound Laboratories Ltd +00:05:5A Power Dsine Ltd. +00:06:5C Malachite Technologies, Inc. +00:06:10 Abeona Networks Inc +00:06:16 Tel Net Co., Ltd. +00:06:0A Blue2space +00:06:04 @Track Communications, Inc. +00:CB:BD Cambridge Broadband Networks Ltd. +00:06:03 Baker Hughes Inc. +A0:6A:00 Verilink Corporation +00:05:EE Siemens AB, Infrastructure & Cities, Building Technologies Division, IC BT SSP SP BA PR +00:05:F5 Geospace Technologies +00:06:01 Otanikeiki Co., Ltd. +00:05:E8 TurboWave, Inc. +00:05:F4 System Base Co., Ltd. +00:05:FB ShareGate, Inc. +00:05:DB PSI Nentec GmbH +00:05:DF Electronic Innovation, Inc. +00:05:CF Thunder River Technologies, Inc. +00:05:C9 LG Innotek Co., Ltd. +00:05:D5 Speedcom Wireless +00:05:BC Resource Data Management Ltd +00:05:C2 Soronti, Inc. +00:05:B0 Korea Computer Technology Co., Ltd. +00:05:9C Kleinknecht GmbH, Ing. Büro +00:05:B6 INSYS Microelectronics GmbH +00:05:A2 CELOX Networks +00:05:AC Northern Digital, Inc. +00:04:E5 Glonet Systems, Inc. +00:04:D9 Titan Electronics, Inc. +00:04:D3 Toyokeiki Co., Ltd. +00:04:CC Peek Traffic B.V. +00:04:C0 Cisco Systems, Inc +00:04:B9 S.I. Soubou, Inc. +00:04:BA KDD Media Will Corporation +00:04:AF Digital Fountain, Inc. +00:04:B4 CIAC +00:04:B3 Videotek, Inc. +00:04:A6 SAF Tehnika Ltd. +00:04:A0 Verity Instruments, Inc. +00:05:0C Network Photonics, Inc. +00:05:12 Zebra Technologies Inc +00:05:06 Reddo Networks AB +00:04:FC Stratus Computer (DE), Inc. +00:04:F6 Amphus +00:04:F5 SnowShore Networks, Inc. +00:04:E9 Infiniswitch Corporation +00:04:F0 International Computers, Ltd +00:04:EF Polestar Corp. +00:04:DF Teracom Telematica Ltda. +00:05:53 DVC Company, Inc. +00:05:48 Disco Corporation +00:05:4D Brans Technologies, Inc. +00:05:42 Otari, Inc. +00:05:3C XIRCOM +00:05:2F Leviton Network Solutions +00:05:3B Harbour Networks Ltd., Co. Beijing +00:05:35 Chip PC Ltd. +00:05:29 Shanghai Broadan Communication Technology Co., Ltd +00:05:23 AVL List GmbH +00:05:22 LEA*D Corporation, Inc. +00:05:1C Xnet Technology Corp. +00:05:16 SMART Modular Technologies +00:06:50 Tiburon Networks, Inc. +00:06:56 Tactel AB +00:06:2D TouchStar Technologies, L.L.C. +00:06:49 3M Deutschland GmbH +00:06:43 SONO Computer Co., Ltd. +00:06:4A Honeywell Co., Ltd. (KOREA) +00:06:3F Everex Communications Inc. +00:06:39 Newtec +00:06:33 Cross Match Technologies GmbH +00:06:26 MWE GmbH +00:06:1D MIP Telecom, Inc. +00:06:23 MGE UPS Systems France +00:05:89 National Datacomputer +00:05:95 Alesis Corporation +00:05:8F CLCsoft co. +00:05:96 Genotech Co., Ltd. +00:05:7D Sun Communications, Inc. +00:05:7C RCO Security AB +00:05:83 ImageCom Limited +00:05:73 Cisco Systems, Inc +00:05:72 Deonet Co., Ltd. +00:05:6C Hung Chang Co., Ltd. +00:05:66 Secui.com Corporation +00:05:60 LEADER COMM.CO., LTD +00:05:59 Intracom S.A. +00:04:A5 Barco Projection Systems NV +00:04:99 Chino Corporation +00:04:8D Teo Technologies, Inc +00:04:93 Tsinghua Unisplendour Co., Ltd. +00:04:84 Amann GmbH +00:04:8A Temia Vertriebs GmbH +00:04:7A AXXESSIT ASA +00:04:74 LEGRAND +00:04:6E Cisco Systems, Inc +00:04:73 Photonex Corporation +00:04:67 Wuhan Research Institute of MII +00:04:61 EPOX Computer Co., Ltd. +00:03:D9 Secheron SA +00:03:D2 Crossbeam Systems, Inc. +00:03:CD Clovertech, Inc. +00:03:CA MTS Systems Corp. +00:03:C6 ICUE Systems, Inc. +00:03:BF Centerpoint Broadband Technologies, Inc. +00:03:BA Oracle Corporation +00:03:AF Paragea Communications +00:03:B4 Macrotek International Corp. +00:03:AC Fronius Schweissmaschinen +00:03:A8 IDOT Computers, Inc. +00:03:A1 HIPER Information & Communication, Inc. +00:03:99 Dongju Informations & Communications Co., Ltd. +00:03:9C OptiMight Communications, Inc. +00:03:90 Digital Video Communications, Inc. +00:03:95 California Amplifier +00:03:80 SSH Communications Security Corp. +00:03:74 Control Microsystems +00:02:F0 AME Optimedia Technology Co., Ltd. +00:03:79 Proscend Communications, Inc. +00:03:71 Acomz Networks Corp. +00:03:6D Runtop, Inc. +00:02:E3 LITE-ON Communications, Inc. +00:02:DE Astrodesign, Inc. +00:02:DB NETSEC +00:02:D7 EMPEG Ltd +00:02:D2 Workstation AG +00:02:23 ClickTV +00:02:CB TriState Ltd. +00:02:C4 Vector International BVBA +00:02:BF dotRocket, Inc. +00:02:BB Continuous Computing Corp +00:02:BC LVL 7 Systems, Inc. +00:02:B6 Acrosser Technology Co., Ltd. +00:02:AF TeleCruz Technology, Inc. +00:02:AA PLcom Co., Ltd. +00:04:5B Techsan Electronics Co., Ltd. +00:04:4E Cisco Systems, Inc +00:04:4F Schubert System Elektronik Gmbh +00:04:54 Quadriga UK +00:04:45 LMS Skalar Instruments GmbH +00:04:4A iPolicy Networks, Inc. +00:04:44 Western Multiplex Corporation +00:04:3E Telencomm +00:04:32 Voyetra Turtle Beach, Inc. +00:04:37 Powin Information Technology, Inc. +00:04:2B IT Access Co., Ltd. +00:03:61 Widcomm, Inc. +00:03:5A Photron Limited +00:03:55 TeraBeam Internet Systems +00:03:53 Mitac, Inc. +00:03:4F Sur-Gard Security +00:03:4A RIAS Corporation +00:03:46 Hitachi Kokusai Electric, Inc. +00:03:44 Tietech.Co., Ltd. +00:03:43 Martin Professional A/S +00:03:34 Newport Electronics +00:03:37 Vaone, Inc. +00:03:3C Daiden Co., Ltd. +00:03:29 F3, Inc. +00:03:30 Imagenics, Co., Ltd. +00:03:21 Reco Research Co., Ltd. +00:03:24 SANYO Consumer Electronics Co., Ltd. +00:03:1B Cellvision Systems, Inc. +00:01:A8 Welltech Computer Co., Ltd. +00:03:0F Digital China (Shanghai) Networks Ltd. +00:03:14 Teleware Network Systems +00:03:0C Telesoft Technologies Ltd. +00:03:08 AM Communications, Inc. +00:02:FC Cisco Systems, Inc +00:03:01 EXFO +00:02:F9 MIMOS Berhad +00:02:F5 VIVE Synergies, Inc. +00:02:EA Focus Enhancements +00:02:69 Nadatel Co., Ltd +00:02:65 Virditech Co. Ltd. +00:02:5E High Technology Ltd +00:02:61 Tilgin AB +00:02:59 Tsann Kuen China (Shanghai)Enterprise Co., Ltd. IT Group +00:02:55 IBM Corp +00:02:49 Aviv Infocom Co, Ltd. +00:02:50 Geyser Networks, Inc. +00:02:42 Videoframe Systems +00:02:44 SURECOM Technology Co. +00:02:2C ABB Bomem, Inc. +00:02:3A ZSK Stickmaschinen GmbH +00:04:25 Atmel Corporation +00:04:19 Fibercycle Networks, Inc. +00:04:1A Ines Test and Measurement GmbH & CoKG +00:04:14 Umezawa Musen Denki Co., Ltd. +00:04:07 Topcon Positioning Systems, Inc. +00:03:F7 Plast-Control GmbH +00:03:FE Cisco Systems, Inc +00:03:FD Cisco Systems, Inc +00:04:01 Osaki Electric Co., Ltd. +00:03:F0 Redfern Broadband Networks +00:03:EB Atrica +00:03:E5 Hermstedt SG +00:02:A3 ABB Switzerland Ltd, Power Systems +00:02:98 Broadframe Corporation +00:02:92 Logic Innovations, Inc. +00:02:8D Movita Technologies, Inc. +00:02:83 Spectrum Controls, Inc. +00:02:77 Cash Systemes Industrie +00:02:7C Trilithic, Inc. +00:02:75 SMART Technologies, Inc. +00:02:70 Crewave Co., Ltd. +00:01:04 DVICO Co., Ltd. +00:01:10 Gotham Networks +00:01:0C System Talks Inc. +00:01:13 OLYMPUS CORPORATION +00:01:00 EQUIP'TRANS +00:B0:AC SIAE-Microelettronica S.p.A. +00:B0:17 InfoGear Technology Corp. +00:30:F0 Uniform Industrial Corp. +00:B0:CE TECHNOLOGY RESCUE +00:B0:80 Mannesmann Ipulsys B.V. +00:B0:9A Morrow Technologies Corp. +00:B0:91 Transmeta Corp. +00:30:BE City-Net Technology, Inc. +00:02:33 Mantra Communications, Inc. +00:02:2F P-Cube, Ltd. +00:02:27 ESD Electronic System Design GmbH +00:02:1F Aculab PLC +00:02:1B Kollmorgen-Servotronix +00:02:0C Metro-Optix +00:02:18 Advanced Scientific Corp +00:02:13 S.D.E.L. +00:02:0F AATR +00:01:F9 TeraGlobal Communications Corp. +00:02:00 Net & Sys Co., Ltd. +00:01:FC Keyence Corporation +00:01:F3 QPS, Inc. +00:01:E4 Sitera, Inc. +00:01:EB C-COM Corporation +00:01:F0 Tridium, Inc. +00:01:D4 Leisure Time, Inc. +00:01:D8 Teltronics, Inc. +00:01:C6 Quarry Technologies +00:01:CC Japan Total Design Communication Co., Ltd. +00:01:D1 CoNet Communications, Inc. +00:01:B3 Precision Electronic Manufacturing +00:01:60 ELMEX Co., LTD. +00:01:5E BEST TECHNOLOGY CO., LTD. +00:01:62 Cygnet Technologies, Inc. +00:01:69 Celestix Networks Pte Ltd. +00:01:75 Radiant Communications Corp. +00:01:59 S1 Corporation +00:01:65 AirSwitch Corporation +00:01:71 Allied Data Technologies +00:01:57 SYSWAVE CO., LTD +00:01:53 ARCHTEK TELECOM CORPORATION +00:01:44 EMC Corporation +00:30:38 XCP, INC. +00:30:DB Mindready Solutions, Inc. +00:30:6A PENTA MEDIA CO., LTD. +00:30:21 HSING TECH. ENTERPRISE CO.,LTD +00:30:EA TeraForce Technology Corporation +00:30:F4 STARDOT TECHNOLOGIES +00:30:87 VEGA GRIESHABER KG +00:30:00 ALLWELL TECHNOLOGY CORP. +00:30:34 SET ENGINEERING +00:30:8D Pinnacle Systems, Inc. +00:30:4B ORBACOM SYSTEMS, INC. +00:30:FA TELICA, INC. +00:01:B1 General Bandwidth +00:01:BB Frequentis +00:01:B7 Centos, Inc. +00:01:AF Artesyn Embedded Technologies +00:01:AB Main Street Networks +00:01:91 SYRED Data Systems +00:01:9D E-Control Systems, Inc. +00:01:A4 Microlink Corporation +00:01:99 HeiSei Electronics +00:01:A0 Infinilink Corporation +00:01:7C AG-E GmbH +00:01:88 LXCO Technologies ag +00:01:78 MARGI Systems, Inc. +00:01:8B NetLinks Co., Ltd. +00:30:F5 Wild Lab. Ltd. +00:01:84 SIEB & MEYER AG +00:30:3E Radcom Ltd. +00:30:D7 Innovative Systems, L.L.C. +00:30:FC Terawave Communications, Inc. +00:30:0F IMT - Information Management T +00:30:04 LEADTEK RESEARCH INC. +00:30:18 Jetway Information Co., Ltd. +00:30:88 Ericsson +00:30:CA Discovery Com +00:30:4F PLANET Technology Corporation +00:01:4B Ennovate Networks, Inc. +00:01:2C Aravox Technologies, Inc. +00:01:34 Selectron Systems AG +00:01:3B BNA SYSTEMS +00:01:47 Zhone Technologies +00:01:2B TELENET Co., Ltd. +00:01:1C Universal Talkware Corporation +00:01:23 DIGITAL ELECTRONICS CORP. +00:01:1F RC Networks, Inc. +00:30:45 Village Networks, Inc. (VNI) +00:30:BB CacheFlow, Inc. +00:30:53 Basler AG +00:30:72 Intellibyte Inc. +00:30:B1 TrunkNet +00:30:A7 SCHWEITZER ENGINEERING +00:D0:86 FOVEON, INC. +00:D0:5A SYMBIONICS, LTD. +00:D0:1A URMET TLC S.P.A. +00:D0:F3 SOLARI DI UDINE SPA +00:D0:89 DYNACOLOR, INC. +00:D0:8D PHOENIX GROUP, INC. +00:D0:9C KAPADIA COMMUNICATIONS +00:D0:FE ASTRAL POINT +00:D0:DC MODULAR MINING SYSTEMS, INC. +00:D0:62 DIGIGRAM +00:D0:A7 TOKYO SOKKI KENKYUJO CO., LTD. +00:D0:32 YANO ELECTRIC CO., LTD. +00:D0:54 SAS INSTITUTE INC. +00:D0:EB LIGHTERA NETWORKS, INC. +00:D0:1E PINGTEL CORP. +00:D0:A9 SHINANO KENSHI CO., LTD. +00:30:E9 GMA COMMUNICATION MANUFACT'G +00:30:27 KERBANGO, INC. +00:30:F6 SECURELOGIX CORPORATION +00:30:B6 Cisco Systems, Inc +00:30:B2 L-3 Sonoma EO +00:30:D6 MSC VERTRIEBS GMBH +00:30:08 AVIO DIGITAL, INC. +00:30:6D LUCENT TECHNOLOGIES +00:30:E4 CHIYODA SYSTEM RIKEN +00:30:1A SMARTBRIDGES PTE. LTD. +00:30:CD CONEXANT SYSTEMS, INC. +00:30:01 SMP +00:30:E1 Network Equipment Technologies, Inc. +00:50:A7 Cisco Systems, Inc +00:D0:EE DICTAPHONE CORPORATION +00:D0:B8 Iomega Corporation +00:50:45 RIOWORKS SOLUTIONS, INC. +00:50:7C VIDEOCON AG +00:50:65 TDK-Lambda Corporation +00:50:C7 Private +00:50:F4 SIGMATEK GMBH & CO. KG +00:50:76 IBM Corp +00:50:75 KESTREL SOLUTIONS +00:50:90 DCTRI +00:50:ED ANDA NETWORKS +00:50:96 SALIX TECHNOLOGIES, INC. +00:50:9B SWITCHCORE AB +00:50:A9 MOLDAT WIRELESS TECHNOLGIES +00:50:3C TSINGHUA NOVEL ELECTRONICS +00:50:30 FUTURE PLUS SYSTEMS +00:50:37 KOGA ELECTRONICS CO. +00:50:1F MRG SYSTEMS, LTD. +00:50:92 Rigaku Corporation Osaka Plant +00:50:1C JATOM SYSTEMS, INC. +00:50:5C TUNDO CORPORATION +00:50:68 ELECTRONIC INDUSTRIES ASSOCIATION +00:50:1A IQinVision +00:50:63 OY COMSEL SYSTEM AB +00:50:DE SIGNUM SYSTEMS CORP. +00:50:7B MERLOT COMMUNICATIONS +00:50:78 MEGATON HOUSE, LTD. +00:50:8F ASITA TECHNOLOGIES INT'L LTD. +00:50:57 BROADBAND ACCESS SYSTEMS +00:50:87 TERASAKI ELECTRIC CO., LTD. +00:D0:3E ROCKETCHIPS, INC. +00:D0:3F AMERICAN COMMUNICATION +00:D0:33 DALIAN DAXIAN NETWORK +00:D0:CE ASYST ELECTRONIC +00:D0:90 Cisco Systems, Inc +00:D0:B6 CRESCENT NETWORKS, INC. +00:D0:D2 EPILOG CORPORATION +00:50:B6 GOOD WAY IND. CO., LTD. +00:50:FF HAKKO ELECTRONICS CO., LTD. +00:50:32 PICAZO COMMUNICATIONS, INC. +00:50:DA 3COM CORPORATION +00:50:F9 Sensormatic Electronics LLC +00:50:F6 PAN-INTERNATIONAL INDUSTRIAL CORP. +00:50:6C Beijer Electronics Products AB +00:50:A5 CAPITOL BUSINESS SYSTEMS, LTD. +00:50:00 NEXO COMMUNICATIONS, INC. +00:D0:71 ECHELON CORP. +00:D0:66 WINTRISS ENGINEERING CORP. +00:D0:6F KMC CONTROLS +00:D0:4B LA CIE GROUP S.A. +00:D0:60 Panasonic Europe Ltd. +00:D0:02 DITECH CORPORATION +00:D0:A6 LANBIRD TECHNOLOGY CO., LTD. +00:D0:DE PHILIPS MULTIMEDIA NETWORK +00:D0:83 INVERTEX, INC. +00:D0:38 FIVEMERE, LTD. +00:D0:0C SNIJDER MICRO SYSTEMS +00:D0:F2 MONTEREY NETWORKS +00:D0:7B COMCAM INTERNATIONAL INC +00:D0:5D INTELLIWORXX, INC. +00:D0:0D MICROMERITICS INSTRUMENT +00:D0:4C EUROTEL TELECOM LTD. +00:D0:FD OPTIMA TELE.COM, INC. +00:30:D8 SITEK +00:30:62 IP Video Networks Inc +00:30:81 ALTOS C&C +00:D0:B0 BITSWITCH LTD. +00:D0:44 ALIDIAN NETWORKS, INC. +00:D0:04 PENTACOM LTD. +00:D0:45 KVASER AB +00:D0:D0 ZHONGXING TELECOM LTD. +00:90:2C DATA & CONTROL EQUIPMENT LTD. +00:90:49 ENTRIDIA CORPORATION +00:90:43 Tattile SRL +00:90:76 FMT AIRCRAFT GATE SUPPORT SYSTEMS AB +00:90:17 Zypcom, Inc +00:90:7B E-TECH, INC. +00:10:2A ZF MICROSYSTEMS, INC. +00:10:7D AURORA COMMUNICATIONS, LTD. +00:10:1C OHM TECHNOLOGIES INTL, LLC +00:10:6C EDNT GmbH +00:10:D4 STORAGE COMPUTER CORPORATION +00:10:BF InterAir Wireless +00:10:36 INTER-TEL INTEGRATED SYSTEMS +00:10:26 ACCELERATED NETWORKS, INC. +00:10:4B 3COM CORPORATION +00:06:29 IBM Corp +00:10:04 THE BRANTLEY COILE COMPANY,INC +00:10:3A DIAMOND NETWORK TECH +00:10:D8 CALISTA +00:10:31 OBJECTIVE COMMUNICATIONS, INC. +00:10:7E BACHMANN ELECTRONIC GmbH +00:10:C0 ARMA, Inc. +00:10:16 T.SQWARE +00:10:3D PHASECOM, LTD. +00:10:C2 WILLNET, INC. +00:10:7A AmbiCom, Inc. +00:10:C4 MEDIA GLOBAL LINKS CO., LTD. +00:10:EB SELSIUS SYSTEMS, INC. +00:10:FE DIGITAL EQUIPMENT CORPORATION +00:10:2E NETWORK SYSTEMS & TECHNOLOGIES PVT. LTD. +00:10:3E NETSCHOOLS CORPORATION +00:10:49 ShoreTel, Inc +00:10:5E Spirent plc, Service Assurance Broadband +00:50:88 AMANO CORPORATION +00:50:A8 OpenCon Systems, Inc. +00:50:62 KOUWELL ELECTRONICS CORP. ** +00:50:B1 GIDDINGS & LEWIS +00:50:0C e-Tek Labs, Inc. +00:50:91 NETACCESS, INC. +00:50:97 MMC-EMBEDDED COMPUTERTECHNIK GmbH +00:50:AF INTERGON, INC. +00:50:EB ALPHA-TOP CORPORATION +00:50:BC HAMMER STORAGE SOLUTIONS +00:90:C3 TOPIC SEMICONDUCTOR CORP. +00:90:EC PYRESCOM +00:90:3B TriEMS Research Lab, Inc. +00:90:74 ARGON NETWORKS, INC. +00:90:C1 Peco II, Inc. +00:10:D3 GRIPS ELECTRONIC GMBH +00:10:ED SUNDANCE TECHNOLOGY, INC. +00:10:23 Network Equipment Technologies +00:10:4E CEOLOGIC +00:10:FB ZIDA TECHNOLOGIES LIMITED +00:10:AD SOFTRONICS USB, INC. +00:10:D5 IMASDE CANARIAS, S.A. +00:10:E5 SOLECTRON TEXAS +00:90:9D NovaTech Process Solutions, LLC +00:90:38 FOUNTAIN TECHNOLOGIES, INC. +00:90:C5 INTERNET MAGIC, INC. +00:90:AD ASPECT ELECTRONICS, INC. +00:90:97 Sycamore Networks +00:90:08 HanA Systems Inc. +00:90:D4 BindView Development Corp. +00:90:89 SOFTCOM MICROSYSTEMS, INC. +00:90:C4 JAVELIN SYSTEMS, INC. +00:90:14 ROTORK INSTRUMENTS, LTD. +00:90:B5 NIKON CORPORATION +00:90:C6 OPTIM SYSTEMS, INC. +00:90:9B MARKEM-IMAJE +00:90:5B RAYMOND AND LAE ENGINEERING +00:90:E8 MOXA TECHNOLOGIES CORP., LTD. +00:90:A1 Flying Pig Systems/High End Systems Inc. +00:90:FD CopperCom, Inc. +00:90:AC OPTIVISION, INC. +00:90:2A COMMUNICATION DEVICES, INC. +00:90:98 SBC DESIGNS, INC. +00:90:CF NORTEL +00:90:0F KAWASAKI HEAVY INDUSTRIES, LTD +00:90:36 ens, inc. +00:90:E9 JANZ COMPUTER AG +00:90:32 PELCOMBE GROUP LTD. +00:90:B8 ROHDE & SCHWARZ GMBH & CO. KG +00:90:BE IBC/INTEGRATED BUSINESS COMPUTERS +00:90:62 ICP VORTEX COMPUTERSYSTEME GmbH +00:10:8F RAPTOR SYSTEMS +00:10:89 WebSonic +00:10:86 ATTO Technology, Inc. +00:10:27 L-3 COMMUNICATIONS EAST +00:10:B8 ISHIGAKI COMPUTER SYSTEM CO. +00:10:4C Teledyne LeCroy, Inc +00:10:01 Citel +00:10:CF FIBERLANE COMMUNICATIONS +00:10:68 COMOS TELECOM +00:10:67 Ericsson +00:10:F1 I-O CORPORATION +00:10:73 TECHNOBOX, INC. +00:E0:C0 SEIWA ELECTRIC MFG. CO., LTD. +00:E0:46 BENTLY NEVADA CORP. +00:E0:15 HEIWA CORPORATION +00:E0:65 OPTICAL ACCESS INTERNATIONAL +00:E0:69 JAYCOR +00:E0:5C Panasonic Healthcare Co., Ltd. +00:E0:87 LeCroy - Networking Productions Division +00:E0:49 MICROWI ELECTRONIC GmbH +00:E0:50 EXECUTONE INFORMATION SYSTEMS, INC. +00:E0:64 SAMSUNG ELECTRONICS +00:E0:12 PLUTO TECHNOLOGIES INTERNATIONAL INC. +00:E0:D8 LANBit Computer, Inc. +00:E0:2D InnoMediaLogic, Inc. +00:E0:A9 FUNAI ELECTRIC CO., LTD. +00:E0:35 Artesyn Embedded Technologies +00:E0:60 SHERWOOD +00:E0:A2 MICROSLATE INC. +00:E0:6C Ultra Electronics Limited (AEP Networks) +00:E0:CE ARN +00:E0:5F e-Net, Inc. +00:E0:2B EXTREME NETWORKS +00:E0:C7 EUROTECH SRL +00:E0:C4 HORNER ELECTRIC, INC. +00:E0:4D INTERNET INITIATIVE JAPAN, INC +00:60:7F AURORA TECHNOLOGIES, INC. +00:E0:39 PARADYNE CORP. +00:60:91 FIRST PACIFIC NETWORKS, INC. +00:60:02 SCREEN SUBTITLING SYSTEMS, LTD +00:60:61 WHISTLE COMMUNICATIONS CORP. +00:60:BD HUBBELL-PULSECOM +00:E0:A1 HIMA PAUL HILDEBRANDT GmbH Co. KG +00:E0:28 APTIX CORPORATION +00:E0:F2 ARLOTTO COMNET, INC. +00:E0:20 TECNOMEN OY +00:E0:C5 BCOM ELECTRONICS INC. +00:E0:EE MAREL HF +00:E0:AC MIDSCO, INC. +00:E0:02 CROSSROADS SYSTEMS, INC. +00:E0:57 HAN MICROTELECOM. CO., LTD. +00:E0:F0 ABLER TECHNOLOGY, INC. +00:E0:B7 PI GROUP, LTD. +00:10:B1 FOR-A CO., LTD. +00:10:41 BRISTOL BABCOCK, INC. +00:10:F7 IRIICHI TECHNOLOGIES Inc. +00:10:E6 APPLIED INTELLIGENT SYSTEMS, INC. +00:10:1E MATSUSHITA ELECTRONIC INSTRUMENTS CORP. +00:10:F2 ANTEC +00:10:BE MARCH NETWORKS CORPORATION +00:60:58 COPPER MOUNTAIN COMMUNICATIONS, INC. +00:60:1B MESA ELECTRONICS +00:60:FF QuVis, Inc. +00:60:56 NETWORK TOOLS, INC. +00:60:D8 ELMIC SYSTEMS, INC. +00:60:7A DVS GMBH +00:60:97 3COM CORPORATION +00:60:E3 ARBIN INSTRUMENTS +00:E0:FD A-TREND TECHNOLOGY CO., LTD. +00:E0:FB LEIGHTRONIX, INC. +00:E0:D3 DATENTECHNIK GmbH +00:E0:5E JAPAN AVIATION ELECTRONICS INDUSTRY, LTD. +00:E0:E5 CINCO NETWORKS, INC. +00:A0:FD SCITEX DIGITAL PRINTING, INC. +00:A0:F5 RADGUARD LTD. +00:A0:22 CENTRE FOR DEVELOPMENT OF ADVANCED COMPUTING +00:A0:87 Microsemi Corporation +00:A0:07 APEXX TECHNOLOGY, INC. +00:A0:66 ISA CO., LTD. +00:A0:AB NETCS INFORMATIONSTECHNIK GMBH +00:A0:D8 SPECTRA - TEK +00:A0:1A BINAR ELEKTRONIK AB +00:A0:E8 REUTERS HOLDINGS PLC +00:A0:76 CARDWARE LAB, INC. +00:A0:A3 RELIABLE POWER METERS +00:A0:55 Data Device Corporation +00:A0:65 Symantec Corporation +00:A0:44 NTT IT CO., LTD. +00:60:08 3COM CORPORATION +00:60:EF FLYTECH TECHNOLOGY CO., LTD. +00:60:98 HT COMMUNICATIONS +00:60:F7 DATAFUSION SYSTEMS +00:60:DE Kayser-Threde GmbH +00:60:D0 SNMP RESEARCH INCORPORATED +00:60:79 Mainstream Data, Inc. +00:60:20 PIVOTAL NETWORKING, INC. +00:05:A8 WYLE ELECTRONICS +00:60:B7 CHANNELMATIC, INC. +00:60:A3 CONTINUUM TECHNOLOGY CORP. +00:60:50 INTERNIX INC. +00:60:E0 AXIOM TECHNOLOGY CO., LTD. +00:60:A8 TIDOMAT AB +00:A0:56 MICROPROSS +00:A0:51 ANGIA COMMUNICATIONS. INC. +00:A0:A6 M.I. SYSTEMS, K.K. +00:A0:5F BTG Electronics Design BV +00:A0:94 COMSAT CORPORATION +00:A0:10 SYSLOGIC DATENTECHNIK AG +00:A0:63 JRL SYSTEMS, INC. +00:A0:8F DESKNET SYSTEMS, INC. +00:A0:CC LITE-ON COMMUNICATIONS, INC. +00:A0:90 TimeStep Corporation +00:A0:F7 V.I COMPUTER CORP. +00:A0:9C Xyplex, Inc. +00:A0:92 H. BOLLMANN MANUFACTURERS, LTD +00:A0:4D EDA INSTRUMENTS, INC. +00:A0:DB FISHER & PAYKEL PRODUCTION +00:A0:A5 TEKNOR MICROSYSTEME, INC. +00:A0:18 CREATIVE CONTROLLERS, INC. +00:A0:9F COMMVISION CORP. +00:A0:6B DMS DORSCH MIKROSYSTEM GMBH +00:60:51 QUALITY SEMICONDUCTOR +00:60:5E LIBERTY TECHNOLOGY NETWORKING +00:60:C6 DCS AG +00:60:9E ASC X3 - INFORMATION TECHNOLOGY STANDARDS SECRETARIATS +00:60:84 DIGITAL VIDEO +00:60:2D ALERTON TECHNOLOGIES, INC. +00:60:93 VARIAN +00:60:E2 QUEST ENGINEERING & DEVELOPMENT +00:A0:39 ROSS TECHNOLOGY, INC. +00:A0:6D MANNESMANN TALLY CORPORATION +00:60:8E HE ELECTRONICS, TECHNOLOGIE & SYSTEMTECHNIK GmbH +00:60:F0 JOHNSON & JOHNSON MEDICAL, INC +00:60:D2 LUCENT TECHNOLOGIES TAIWAN TELECOMMUNICATIONS CO., LTD. +00:60:77 PRISA NETWORKS +00:60:AB LARSCOM INCORPORATED +00:60:E9 ATOP TECHNOLOGIES, INC. +00:60:8B ConferTech International +00:60:C3 NETVISION CORPORATION +00:A0:A0 COMPACT DATA, LTD. +00:A0:24 3COM CORPORATION +00:A0:8B ASTON ELECTRONIC DESIGNS LTD. +00:A0:AA SPACELABS MEDICAL +00:A0:4F AMERITEC CORP. +00:A0:73 COM21, INC. +00:A0:84 Dataplex Pty Ltd +00:A0:34 AXEL +00:C0:BC TELECOM AUSTRALIA/CSSC +00:C0:EF ABIT CORPORATION +00:C0:3C TOWER TECH S.R.L. +00:C0:61 SOLECTEK CORPORATION +00:C0:74 TOYODA AUTOMATIC LOOM +00:C0:7F NUPON COMPUTING CORP. +00:C0:27 CIPHER SYSTEMS, INC. +00:C0:25 DATAPRODUCTS CORPORATION +00:C0:22 LASERMASTER TECHNOLOGIES, INC. +00:C0:E6 Verilink Corporation +00:C0:5C ELONEX PLC +00:C0:C1 QUAD/GRAPHICS, INC. +00:C0:91 JABIL CIRCUIT, INC. +00:C0:02 SERCOMM CORPORATION +00:C0:F5 METACOMP, INC. +00:C0:42 DATALUX CORP. +00:C0:89 TELINDUS DISTRIBUTION +00:C0:9D DISTRIBUTED SYSTEMS INT'L, INC +00:C0:A5 DICKENS DATA SYSTEMS +00:C0:E3 OSITECH COMMUNICATIONS, INC. +00:C0:71 AREANEX COMMUNICATIONS, INC. +00:C0:AF TEKLOGIX INC. +00:20:9F MERCURY COMPUTER SYSTEMS, INC. +00:20:B7 NAMAQUA COMPUTERWARE +00:20:1B NORTHERN TELECOM/NETWORK +00:20:C0 PULSE ELECTRONICS, INC. +00:20:8D CMD TECHNOLOGY +00:20:DD Cybertec Pty Ltd +00:20:BD NIOBRARA R & D CORPORATION +00:20:E6 LIDKOPING MACHINE TOOLS AB +00:20:47 STEINBRECHER CORP. +00:20:B5 YASKAWA ELECTRIC CORPORATION +00:20:72 WORKLINK INNOVATIONS +00:20:B8 PRIME OPTION, INC. +00:20:92 CHESS ENGINEERING B.V. +00:20:B9 METRICOM, INC. +00:20:6B KONICA MINOLTA HOLDINGS, INC. +00:20:FC MATROX +00:C0:03 GLOBALNET COMMUNICATIONS +00:C0:C3 ACUSON COMPUTED SONOGRAPHY +00:C0:4D MITEC, INC. +00:C0:55 MODULAR COMPUTING TECHNOLOGIES +00:C0:67 UNITED BARCODE INDUSTRIES +00:C0:B4 MYSON TECHNOLOGY, INC. +00:C0:80 NETSTAR, INC. +00:C0:15 NEW MEDIA CORPORATION +00:70:B3 DATA RECALL LTD. +00:E6:D3 NIXDORF COMPUTER CORP. +00:C0:83 TRACE MOUNTAIN PRODUCTS, INC. +00:C0:05 LIVINGSTON ENTERPRISES, INC. +00:C0:64 GENERAL DATACOMM IND. INC. +00:C0:C8 MICRO BYTE PTY. LTD. +00:C0:90 PRAIM S.R.L. +00:C0:11 INTERACTIVE COMPUTING DEVICES +00:C0:FD PROSUM +00:C0:41 DIGITAL TRANSMISSION SYSTEMS +00:C0:0F QUANTUM SOFTWARE SYSTEMS LTD. +00:C0:76 I-DATA INTERNATIONAL A-S +00:C0:C6 PERSONAL MEDIA CORP. +00:C0:3B MULTIACCESS COMPUTING CORP. +00:20:F4 SPECTRIX CORPORATION +00:20:4E NETWORK SECURITY SYSTEMS, INC. +00:20:27 MING FORTUNE INDUSTRY CO., LTD +00:20:ED GIGA-BYTE TECHNOLOGY CO., LTD. +00:20:0E SATELLITE TECHNOLOGY MGMT, INC +00:20:96 Invensys +00:20:BB ZAX CORPORATION +00:20:4D INOVIS GMBH +00:20:89 T3PLUS NETWORKING, INC. +00:20:5F GAMMADATA COMPUTER GMBH +00:20:35 IBM Corp +00:20:E2 INFORMATION RESOURCE ENGINEERING +00:20:58 ALLIED SIGNAL INC. +00:20:81 TITAN ELECTRONICS +00:20:1D KATANA PRODUCTS +00:20:CF TEST & MEASUREMENT SYSTEMS INC +00:20:43 NEURON COMPANY LIMITED +00:20:18 CIS TECHNOLOGY INC. +00:20:31 Tattile SRL +00:20:DE JAPAN DIGITAL LABORAT'Y CO.LTD +00:20:F7 CYBERDATA CORPORATION +00:20:EE GTECH CORPORATION +00:20:8C GALAXY NETWORKS, INC. +00:20:63 WIPRO INFOTECH LTD. +00:20:DC DENSITRON TAIWAN LTD. +00:20:78 RUNTOP, INC. +00:20:42 DATAMETRICS CORP. +00:20:F8 CARRERA COMPUTERS, INC. +00:20:0C ADASTRA SYSTEMS CORP. +00:20:C4 INET,INC. +00:C0:99 YOSHIKI INDUSTRIAL CO.,LTD. +00:C0:FC ELASTIC REALITY, INC. +00:C0:D0 RATOC SYSTEM INC. +00:C0:7A PRIVA B.V. +00:07:01 RACAL-DATACOM +00:C0:9C HIOKI E.E. CORPORATION +00:C0:04 JAPAN BUSINESS COMPUTER CO.LTD +00:C0:62 IMPULSE TECHNOLOGY +00:02:67 NODE RUNNER, INC. +00:20:64 PROTEC MICROSYSTEMS, INC. +00:20:32 ALCATEL TAISEL +00:20:7F KYOEI SANGYO CO., LTD. +00:20:77 KARDIOS SYSTEMS CORP. +00:20:68 ISDYNE +00:20:2A N.V. DZINE +00:80:06 COMPUADD CORPORATION +00:80:EF RATIONAL +00:80:C4 DOCUMENT TECHNOLOGIES, INC. +00:80:95 BASIC MERTON HANDELSGES.M.B.H. +00:80:53 INTELLICOM, INC. +00:80:26 NETWORK PRODUCTS CORPORATION +00:80:FE AZURE TECHNOLOGIES, INC. +00:80:28 TRADPOST (HK) LTD +00:80:B6 THEMIS COMPUTER +00:80:C0 PENRIL DATACOMM +00:80:F5 Quantel Ltd +00:40:1D INVISIBLE SOFTWARE, INC. +00:40:BD STARLIGHT NETWORKS, INC. +00:40:6D LANCO, INC. +00:40:4D TELECOMMUNICATIONS TECHNIQUES +00:40:A5 CLINICOMP INTL. +00:40:59 YOSHIDA KOGYO K. K. +00:40:21 RASTER GRAPHICS +00:40:81 MANNESMANN SCANGRAPHIC GMBH +00:80:6C CEGELEC PROJECTS LTD +00:40:4A WEST AUSTRALIAN DEPARTMENT +00:40:0A PIVOTAL TECHNOLOGIES, INC. +00:40:32 DIGITAL COMMUNICATIONS +00:40:42 N.A.T. GMBH +00:40:C2 APPLIED COMPUTING DEVICES +00:40:3C FORKS, INC. +00:40:C4 KINKEI SYSTEM CORPORATION +00:40:D1 FUKUDA DENSHI CO., LTD. +00:40:24 COMPAC INC. +00:40:B6 COMPUTERM CORPORATION +00:40:3F SSANGYONG COMPUTER SYSTEMS +00:40:03 Emerson Process Management Power & Water Solutions, Inc. +00:40:90 ANSEL COMMUNICATIONS +00:40:9A NETWORK EXPRESS, INC. +00:40:DE Elsag Datamat spa +00:40:63 VIA TECHNOLOGIES, INC. +00:40:6C COPERNIQUE +00:40:DF DIGALOG SYSTEMS, INC. +00:40:15 ASCOM INFRASYS AG +00:80:56 SPHINX Electronics GmbH & Co KG +00:80:60 NETWORK INTERFACE CORPORATION +00:80:5E LSI LOGIC CORPORATION +00:80:93 XYRON CORPORATION +00:C0:5D L&N TECHNOLOGIES +00:C0:E4 SIEMENS BUILDING +00:C0:1B SOCKET COMMUNICATIONS, INC. +00:C0:6E HAFT TECHNOLOGY, INC. +00:40:6F SYNC RESEARCH INC. +00:40:1F COLORGRAPH LTD +00:40:CF STRAWBERRY TREE, INC. +00:40:F7 Polaroid Corporation +00:40:37 SEA-ILAN, INC. +00:40:CC SILCOM MANUF'G TECHNOLOGY INC. +00:40:52 STAR TECHNOLOGIES, INC. +00:40:7A SOCIETE D'EXPLOITATION DU CNIT +00:40:89 MEIDENSHA CORPORATION +00:40:5A GOLDSTAR INFORMATION & COMM. +00:40:4C HYPERTEC PTY LTD. +00:C0:EE KYOCERA CORPORATION +00:C0:CB CONTROL TECHNOLOGY CORPORATION +00:C0:9A PHOTONICS CORPORATION +00:C0:1A COROMETRICS MEDICAL SYSTEMS +00:40:4B MAPLE COMPUTER SYSTEMS +00:40:55 METRONIX GMBH +00:40:45 TWINHEAD CORPORATION +00:40:9D DIGIBOARD, INC. +00:40:1A FUJI ELECTRIC CO., LTD. +00:40:B9 MACQ ELECTRONIQUE SA +00:40:C7 RUBY TECH CORPORATION +00:40:04 ICM CO. LTD. +00:40:70 INTERWARE CO., LTD. +00:80:57 ADSOFT, LTD. +00:80:7A AITECH SYSTEMS LTD. +00:80:AA MAXPEED +00:C0:E7 FIBERDATA AB +00:80:0A JAPAN COMPUTER CORP. +00:80:6E NIPPON STEEL CORPORATION +00:80:10 COMMODORE INTERNATIONAL +00:80:DA Bruel & Kjaer Sound & Vibration Measurement A/S +00:80:BC HITACHI ENGINEERING CO., LTD +00:80:00 MULTITECH SYSTEMS, INC. +00:80:A1 MICROTEST, INC. +00:80:D0 COMPUTER PERIPHERALS, INC. +00:80:7D EQUINOX SYSTEMS INC. +00:80:63 Hirschmann Automation and Control GmbH +00:60:8C 3COM CORPORATION +00:80:4E APEX COMPUTER COMPANY +00:80:0E ATLANTIX CORPORATION +00:80:6F ONELAN LTD. +00:80:98 TDK CORPORATION +00:80:9C LUXCOM, INC. +00:80:65 CYBERGRAPHIC SYSTEMS PTY LTD. +00:80:16 WANDEL AND GOLTERMANN +00:80:E6 PEER NETWORKS, INC. +00:80:A2 CREATIVE ELECTRONIC SYSTEMS +00:80:E0 XTP SYSTEMS, INC. +00:80:50 ZIATECH CORPORATION +00:00:E0 QUADRAM CORP. +00:00:57 SCITEX CORPORATION LTD. +00:00:D6 PUNCH LINE HOLDING +00:00:C8 ALTOS COMPUTER SYSTEMS +00:00:98 CROSSCOMM CORPORATION +00:00:7D Oracle Corporation +00:00:A2 Bay Networks +00:00:38 CSS LABS +00:00:61 GATEWAY COMMUNICATIONS +00:00:43 MICRO TECHNOLOGY +00:00:E7 Star Gate Technologies +00:00:F3 GANDALF DATA LIMITED +00:00:64 Yokogawa Electric Corporation +00:00:2C AUTOTOTE LIMITED +00:00:2A TRW - SEDD/INP +00:00:F1 MAGNA COMPUTER CORPORATION +00:00:83 TADPOLE TECHNOLOGY PLC +00:00:20 DATAINDUSTRIER DIAB AB +00:00:7A DANA COMPUTER INC. +00:00:7C AMPERE INCORPORATED +00:00:8A DATAHOUSE INFORMATION SYSTEMS +00:00:68 ROSEMOUNT CONTROLS +00:00:A8 STRATUS COMPUTER INC. +00:00:DF BELL & HOWELL PUB SYS DIV +00:00:62 BULL HN INFORMATION SYSTEMS +00:00:AD BRUKER INSTRUMENTS INC. +00:00:D0 DEVELCON ELECTRONICS LTD. +00:00:93 PROTEON INC. +00:80:08 DYNATECH COMPUTER SYSTEMS +00:80:FF SOC. DE TELEINFORMATIQUE RTC +00:00:70 HCL LIMITED +00:00:8E SOLBOURNE COMPUTER, INC. +00:00:DC HAYES MICROCOMPUTER PRODUCTS +00:00:24 CONNECT AS +00:00:48 SEIKO EPSON CORPORATION +00:80:30 NEXUS ELECTRONICS +00:80:22 SCAN-OPTICS +00:00:41 ICE CORPORATION +00:00:1E TELSIST INDUSTRIA ELECTRONICA +00:80:7B ARTEL COMMUNICATIONS CORP. +00:80:2E CASTLE ROCK COMPUTING +00:80:F9 HEURIKON CORPORATION +00:80:05 CACTUS COMPUTER INC. +00:80:1D INTEGRATED INFERENCE MACHINES +00:80:15 SEIKO SYSTEMS, INC. +00:80:34 SMT GOUPIL +00:80:C9 ALBERTA MICROELECTRONIC CENTRE +00:80:0B CSK CORPORATION +00:00:16 DU PONT PIXEL SYSTEMS . +00:00:5C TELEMATICS INTERNATIONAL INC. +00:00:AC CONWARE COMPUTER CONSULTING +00:00:F2 SPIDER COMMUNICATIONS +00:00:30 VG LABORATORY SYSTEMS LTD +00:00:35 SPECTRAGRAPHICS CORPORATION +02:07:01 RACAL-DATACOM +08:00:11 TEKTRONIX INC. +08:00:40 FERRANTI COMPUTER SYS. LIMITED +08:00:3B TORUS SYSTEMS LIMITED +08:00:3D CADNETIX CORPORATIONS +08:00:39 SPIDER SYSTEMS LIMITED +08:00:30 NETWORK RESEARCH CORPORATION +08:00:27 Cadmus Computer Systems +00:00:9B INFORMATION INTERNATIONAL, INC +00:DD:0F UNGERMANN-BASS INC. +00:00:01 XEROX CORPORATION +08:00:21 3M COMPANY +AA:00:04 DIGITAL EQUIPMENT CORPORATION +08:00:0C MIKLYN DEVELOPMENT CO. +00:DD:08 UNGERMANN-BASS INC. +00:00:A0 SANYO Electric Co., Ltd. +08:00:7F CARNEGIE-MELLON UNIVERSITY +08:00:82 VERITAS SOFTWARE +08:00:7B SANYO ELECTRIC CO. LTD. +00:DD:0C UNGERMANN-BASS INC. +00:00:05 XEROX CORPORATION +00:00:AA XEROX CORPORATION +00:40:6B SYSGEN +AA:00:01 DIGITAL EQUIPMENT CORPORATION +08:00:01 COMPUTERVISION CORPORATION +00:00:53 COMPUCORP +08:00:4B Planning Research Corp. +08:00:03 ADVANCED COMPUTER COMM. +08:00:74 CASIO COMPUTER CO. LTD. +08:00:5E COUNTERPOINT COMPUTER INC. +08:00:5A IBM Corp +08:00:56 STANFORD LINEAR ACCEL. CENTER +08:00:53 MIDDLE EAST TECH. UNIVERSITY +08:00:4F CYGNET SYSTEMS +F8:E7:1E Ruckus Wireless +00:19:4B Sagemcom Broadband SAS +00:1F:95 Sagemcom Broadband SAS +00:0E:59 Sagemcom Broadband SAS +A0:1B:29 Sagemcom Broadband SAS +90:01:3B Sagemcom Broadband SAS +EC:DF:3A vivo Mobile Communication Co., Ltd. +E4:5A:A2 vivo Mobile Communication Co., Ltd. +00:23:5A COMPAL INFORMATION (KUNSHAN) CO., LTD. +00:1B:38 COMPAL INFORMATION (KUNSHAN) CO., LTD. +E4:6F:13 D-Link International +DC:6D:CD GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD +94:C1:50 2Wire Inc +60:FE:20 2Wire Inc +98:90:96 Dell Inc. +B8:2A:72 Dell Inc. +00:D0:9E 2Wire Inc +00:0D:72 2Wire Inc +00:0F:1F Dell Inc. +14:FE:B5 Dell Inc. +00:15:C5 Dell Inc. +D4:AE:52 Dell Inc. +B0:E7:54 2Wire Inc +B8:E6:25 2Wire Inc +54:9F:35 Dell Inc. +64:00:6A Dell Inc. +B4:E1:0F Dell Inc. +00:23:AE Dell Inc. +9C:D9:17 Motorola Mobility LLC, a Lenovo Company +90:68:C3 Motorola Mobility LLC, a Lenovo Company +40:88:05 Motorola Mobility LLC, a Lenovo Company +A4:A1:C2 Ericsson AB +34:84:46 Ericsson AB +AC:2B:6E Intel Corporate +F8:F1:B6 Motorola Mobility LLC, a Lenovo Company +00:21:6A Intel Corporate +00:1E:64 Intel Corporate +00:16:EB Intel Corporate +00:18:DE Intel Corporate +68:17:29 Intel Corporate +5C:51:4F Intel Corporate +B8:08:CF Intel Corporate +C8:F7:33 Intel Corporate +48:51:B7 Intel Corporate +5C:C5:D4 Intel Corporate +7C:CC:B8 Intel Corporate +F4:06:69 Intel Corporate +3C:A9:F4 Intel Corporate +28:B2:BD Intel Corporate +08:D4:0C Intel Corporate +84:3A:4B Intel Corporate +0C:D2:92 Intel Corporate +78:92:9C Intel Corporate +68:05:CA Intel Corporate +AC:A3:1E Aruba Networks +9C:1C:12 Aruba Networks +00:1A:1E Aruba Networks +28:C2:DD AzureWave Technology Inc. +84:D4:7E Aruba Networks +A8:58:40 Cambridge Industries(Group) Co.,Ltd. +00:22:43 AzureWave Technology Inc. +74:F0:6D AzureWave Technology Inc. +44:D8:32 AzureWave Technology Inc. +78:18:81 AzureWave Technology Inc. +B0:EE:45 AzureWave Technology Inc. +24:0A:64 AzureWave Technology Inc. +D0:E7:82 AzureWave Technology Inc. +0C:4C:39 MitraStar Technology Corp. +00:24:23 AzureWave Technologies (Shanghai) Inc. +A8:1D:16 AzureWave Technology Inc. +38:A5:3C COMECER Netherlands +00:1D:8B ADB Broadband Italia +A4:52:6F ADB Broadband Italia +58:12:43 AcSiP Technology Corp. +00:26:B8 Actiontec Electronics, Inc +00:30:F1 Accton Technology Corp +00:19:74 16063 +EC:F0:0E AboCom +30:39:F2 ADB Broadband Italia +00:08:27 ADB Broadband Italia +90:97:D5 Espressif Inc. +18:FE:34 Espressif Inc. +54:F6:C5 FUJIAN STAR-NET COMMUNICATION CO.,LTD +28:EF:01 Private +5C:33:8E Alpha Networks Inc. +00:1A:EB Allied Telesis R&D Center K.K. +74:75:48 Amazon Technologies Inc. +A4:31:11 ZIV +5C:93:A2 Liteon Technology Corporation +E8:C7:4F Liteon Technology Corporation +E8:F7:24 Hewlett Packard Enterprise +70:1A:04 Liteon Technology Corporation +48:D2:24 Liteon Technology Corporation +2C:D0:5A Liteon Technology Corporation +74:E5:43 Liteon Technology Corporation +A4:DB:30 Liteon Technology Corporation +B8:EE:65 Liteon Technology Corporation +00:1D:BA Sony Corporation +00:0A:D9 Sony Mobile Communications AB +00:0F:DE Sony Mobile Communications AB +00:1E:DC Sony Mobile Communications AB +00:19:63 Sony Mobile Communications AB +00:1B:59 Sony Mobile Communications AB +78:84:3C Sony Corporation +00:23:F1 Sony Mobile Communications AB +30:17:C8 Sony Mobile Communications AB +18:00:2D Sony Mobile Communications AB +04:E6:76 AMPAK Technology, Inc. +00:22:F4 AMPAK Technology, Inc. +08:00:46 Sony Corporation +00:0D:92 ARIMA Communications Corp. +00:90:96 ASKEY COMPUTER CORP +00:11:F5 ASKEY COMPUTER CORP +DC:D8:7C Beijing Jingdong Century Trading Co., LTD. +00:1C:4A AVM GmbH +00:0B:6A Asiarock Technology Limited +40:BA:61 ARIMA Communications Corp. +84:1B:5E NETGEAR +20:4E:7F NETGEAR +A0:21:B7 NETGEAR +00:24:B2 NETGEAR +C0:3F:0E NETGEAR +00:1F:33 NETGEAR +18:83:BF Arcadyan Technology Corporation +9C:80:DF Arcadyan Technology Corporation +00:1C:CC BlackBerry RTS +94:EB:CD BlackBerry RTS +64:4F:B0 Hyunjin.com +00:1A:2A Arcadyan Technology Corporation +00:1D:19 Arcadyan Technology Corporation +88:25:2C Arcadyan Technology Corporation +A4:E4:B8 BlackBerry RTS +58:67:1A Barnes&Noble +BC:05:43 AVM GmbH +00:26:75 Aztech Electronics Pte Ltd +00:1F:3F AVM GmbH +50:6A:03 NETGEAR +6C:B0:CE NETGEAR +10:0D:7F NETGEAR +00:20:D6 Breezecom, Ltd. +00:10:18 Broadcom +00:1B:E9 Broadcom +00:80:77 Brother industries, LTD. +02:9D:8E CARDIAC RECORDERS, INC. +FC:2F:40 Calxeda, Inc. +00:26:E4 Canal + +38:94:96 Samsung Electronics Co.,Ltd +0C:B3:19 Samsung Electronics Co.,Ltd +08:EE:8B Samsung Electronics Co.,Ltd +84:A4:66 Samsung Electronics Co.,Ltd +98:1D:FA Samsung Electronics Co.,Ltd +FC:F1:36 Samsung Electronics Co.,Ltd +0C:89:10 Samsung Electronics Co.,Ltd +54:FA:3E Samsung Electronics Co.,Ltd +A8:9F:BA Samsung Electronics Co.,Ltd +FC:19:10 Samsung Electronics Co.,Ltd +08:3D:88 Samsung Electronics Co.,Ltd +5C:2E:59 Samsung Electronics Co.,Ltd +64:6C:B2 Samsung Electronics Co.,Ltd +F8:84:F2 Samsung Electronics Co.,Ltd +14:B4:84 Samsung Electronics Co.,Ltd +60:8F:5C Samsung Electronics Co.,Ltd +4C:BC:A5 Samsung Electronics Co.,Ltd +78:59:5E Samsung Electronics Co.,Ltd +B0:D0:9C Samsung Electronics Co.,Ltd +4C:A5:6D Samsung Electronics Co.,Ltd +A4:84:31 Samsung Electronics Co.,Ltd +E4:F8:EF Samsung Electronics Co.,Ltd +14:32:D1 Samsung Electronics Co.,Ltd +E4:58:E7 Samsung Electronics Co.,Ltd +8C:BF:A6 Samsung Electronics Co.,Ltd +78:40:E4 Samsung Electronics Co.,Ltd +90:00:DB Samsung Electronics Co.,Ltd +18:3A:2D Samsung Electronics Co.,Ltd +08:37:3D Samsung Electronics Co.,Ltd +50:F5:20 Samsung Electronics Co.,Ltd +A4:EB:D3 Samsung Electronics Co.,Ltd +28:98:7B Samsung Electronics Co.,Ltd +18:67:B0 Samsung Electronics Co.,Ltd +F4:0E:22 Samsung Electronics Co.,Ltd +9C:3A:AF Samsung Electronics Co.,Ltd +BC:F2:AF devolo AG +02:70:B3 DATA RECALL LTD. +00:0F:F6 DARFON LIGHTING CORP +70:25:59 CyberTAN Technology Inc. +00:90:D6 Crystal Group, Inc. +00:1D:AA DrayTek Corp. +02:CF:1C Communication Machinery Corporation +0C:75:BD Cisco Systems, Inc +38:F0:C8 Livestream +0C:11:67 Cisco Systems, Inc +00:19:82 SmarDTV +10:C6:FC Garmin International +00:E0:00 FUJITSU LIMITED +00:00:0E FUJITSU LIMITED +00:23:26 FUJITSU LIMITED +00:07:CB FREEBOX SAS +3C:59:1E TCL King Electrical Appliances (Huizhou) Co., Ltd +00:26:82 Gemtek Technology Co., Ltd. +00:1A:73 Gemtek Technology Co., Ltd. +00:90:4B Gemtek Technology Co., Ltd. +D8:6B:F7 Nintendo Co., Ltd. +A4:C0:E1 Nintendo Co., Ltd. +34:AF:2C Nintendo Co., Ltd. +8C:CD:E8 Nintendo Co., Ltd. +9C:E6:35 Nintendo Co., Ltd. +60:01:94 Espressif Inc. +F4:4D:17 GOLDCARD HIGH-TECH CO.,LTD. +00:1E:35 Nintendo Co., Ltd. +00:1F:C5 Nintendo Co., Ltd. +00:21:BD Nintendo Co., Ltd. +00:27:09 Nintendo Co., Ltd. +E8:4E:CE Nintendo Co., Ltd. +00:09:BF Nintendo Co., Ltd. +00:1A:E9 Nintendo Co., Ltd. +00:1C:BE Nintendo Co., Ltd. +00:24:03 Nokia Danmark A/S +00:22:65 Nokia Danmark A/S +00:19:B7 Nokia Danmark A/S +00:24:04 Nokia Danmark A/S +00:02:EE Nokia Danmark A/S +00:1C:9A Nokia Danmark A/S +00:1F:01 Nokia Danmark A/S +00:0E:ED Nokia Danmark A/S +00:1E:3A Nokia Danmark A/S +00:1A:89 Nokia Danmark A/S +00:21:AA Nokia Danmark A/S +00:26:69 Nokia Danmark A/S +00:22:FD Nokia Danmark A/S +00:21:09 Nokia Danmark A/S +00:21:08 Nokia Danmark A/S +00:1D:6E Nokia Danmark A/S +00:1B:33 Nokia Danmark A/S +EC:F3:5B Nokia Corporation +EC:9B:5B Nokia Corporation +BC:C6:DB Nokia Corporation +B8:32:41 Wuhan Tianyu Information Industry Co., Ltd. +98:97:D1 MitraStar Technology Corp. +94:C9:60 Zhongshan B&T technology.co.,ltd +E0:4F:BD SICHUAN TIANYI COMHEART TELECOMCO.,LTD +00:14:79 NEC Magnus Communications,Ltd. +9C:4F:DA Apple, Inc. +1C:5C:F2 Apple, Inc. +08:21:EF Samsung Electronics Co.,Ltd +A0:CB:FD Samsung Electronics Co.,Ltd +34:14:5F Samsung Electronics Co.,Ltd +B4:62:AD Elysia Germany GmbH +74:78:18 Jurumani Solutions +80:38:96 SHARP Corporation +80:D1:60 Integrated Device Technology (Malaysia) Sdn. Bhd. +68:6E:23 Wi3 Inc. +B8:A1:75 Roku, Inc. +00:80:E5 NetApp +E4:9A:79 Apple, Inc. +28:A0:2B Apple, Inc. +B4:4B:D2 Apple, Inc. +00:23:40 MiXTelematics +B4:8B:19 Apple, Inc. +00:AF:1F Cisco Systems, Inc +4C:CC:6A Micro-Star INTL CO., LTD. +98:5B:B0 KMDATA INC. +6C:8F:B5 Microsoft Mobile Oy +24:5E:BE QNAP Systems, Inc. +A8:93:52 SHANGHAI ZHONGMI COMMUNICATION TECHNOLOGY CO.,LTD +AC:5F:3E SAMSUNG ELECTRO-MECHANICS(THAILAND) +B0:7F:B9 NETGEAR +70:66:1B Sonova AG +1C:98:EC Hewlett Packard Enterprise +9C:9D:5D Raden Inc +E8:FD:72 SHANGHAI LINGUO TECHNOLOGY CO., LTD. +98:BB:1E BYD Precision Manufacture Company Ltd. +EC:43:8B YAPTV +18:66:DA Dell Inc. +98:1F:B1 Shenzhen Lemon Network Technology Co.,Ltd +CC:B1:1A Samsung Electronics Co.,Ltd +40:47:6A AG Acquisition Corp. d.b.a. ASTRO Gaming +A4:BF:01 Intel Corporate +50:9E:A7 Samsung Electronics Co.,Ltd +DC:CF:96 Samsung Electronics Co.,Ltd +00:04:C6 YAMAHA MOTOR CO.,LTD +14:D1:1F HUAWEI TECHNOLOGIES CO.,LTD +54:51:1B HUAWEI TECHNOLOGIES CO.,LTD +68:53:6C SPnS Co.,Ltd +64:CC:2E Xiaomi Communications Co Ltd +00:5B:A1 shanghai huayuan chuangxin software CO., LTD. +B0:7E:70 Zadara Storage Ltd. +40:5E:E1 Shenzhen H&T Intelligent Control Co.,Ltd. +10:F0:05 Intel Corporate +BC:98:89 Fiberhome Telecommunication Technologies Co.,LTD +E4:2F:26 Fiberhome Telecommunication Technologies Co.,LTD +34:4B:3D Fiberhome Telecommunication Technologies Co.,LTD +FC:F6:47 Fiberhome Telecommunication Technologies Co.,LTD +10:88:CE Fiberhome Telecommunication Technologies Co.,LTD +D4:63:FE Arcadyan Corporation +94:66:E7 WOM Engineering +F8:A1:88 LED Roadway Lighting +00:11:74 Mojo Networks, Inc. +BC:15:AC Vodafone Italia S.p.A. +14:0C:5B PLNetworks +D0:B0:CD Moen +00:71:C2 PEGATRON CORPORATION +DC:FE:07 PEGATRON CORPORATION +E4:7E:66 HUAWEI TECHNOLOGIES CO.,LTD +9C:74:1A HUAWEI TECHNOLOGIES CO.,LTD +EC:93:ED DDoS-Guard LTD +4C:72:B9 PEGATRON CORPORATION +F4:62:D0 Not for Radio, LLC +94:51:3D iSmart Alarm, Inc. +C8:9C:DC Elitegroup Computer Systems Co.,Ltd. +00:25:11 Elitegroup Computer Systems Co.,Ltd. +00:0E:03 Emulex Corporation +00:1B:B9 Elitegroup Computer Systems Co.,Ltd. +00:19:21 Elitegroup Computer Systems Co.,Ltd. +00:14:2A Elitegroup Computer Systems Co.,Ltd. +00:01:F4 Enterasys +48:7A:DA Hangzhou H3C Technologies Co., Limited +1C:73:70 Neotech +00:50:FC Edimax Technology Co. Ltd. +20:0A:5E Xiangshan Giant Eagle Technology Developing Co., Ltd. +30:E3:7A Intel Corporate +4C:A0:03 T-21 Technologies LLC +F0:EE:58 PACE Telematics GmbH +A0:8C:FD Hewlett Packard +40:00:E0 Derek(Shaoguan)Limited +00:13:97 Oracle Corporation +00:A0:A4 Oracle Corporation +A4:E5:97 Gessler GmbH +00:24:F4 Kaminario, Ltd. +00:1D:08 Jiangsu Yinhe Electronics Co.,Ltd. +00:18:D7 JAVAD GNSS, Inc. +00:1C:6C 30805 +00:A0:B0 I-O DATA DEVICE, INC. +00:E0:CF INTEGRATED DEVICE +54:7F:54 INGENICO +48:C0:49 Broad Telecom SA +DC:38:E1 Juniper Networks +40:A6:77 Juniper Networks +0C:86:10 Juniper Networks +EC:3E:F7 Juniper Networks +00:14:F6 Juniper Networks +00:12:1E Juniper Networks +00:10:DB Juniper Networks +30:7C:5E Juniper Networks +84:18:88 Juniper Networks +40:B4:F0 Juniper Networks +00:26:88 Juniper Networks +00:17:CB Juniper Networks +E0:A3:AC HUAWEI TECHNOLOGIES CO.,LTD +E0:0E:DA Cisco Systems, Inc +6C:24:83 Microsoft Mobile Oy +84:83:19 Hangzhou Zero Zero Technology Co., Ltd. +00:1F:20 Logitech Europe SA +88:20:12 LMI Technologies +00:23:82 Lih Rong electronic Enterprise Co., Ltd. +88:79:5B Konka Group Co., Ltd. +00:1A:34 Konka Group Co., Ltd. +20:A9:0E TCT mobile ltd +8C:99:E6 TCT mobile ltd +74:5C:9F TCT mobile ltd +0C:BD:51 TCT mobile ltd +E4:2D:02 TCT mobile ltd +3C:E5:A6 Hangzhou H3C Technologies Co., Limited +3C:8C:40 Hangzhou H3C Technologies Co., Limited +B0:45:19 TCT mobile ltd +A8:15:59 Breathometer, Inc. +EC:AD:B8 Apple, Inc. +98:01:A7 Apple, Inc. +2C:F0:A2 Apple, Inc. +C0:97:27 SAMSUNG ELECTRO-MECHANICS(THAILAND) +2C:5A:8D SYSTRONIK Elektronik u. Systemtechnik GmbH +B8:BB:AF Samsung Electronics Co.,Ltd +60:C5:AD Samsung Electronics Co.,Ltd +8C:89:7A AUGTEK +54:ED:A3 Navdy, Inc. +04:65:65 Testop +04:27:58 HUAWEI TECHNOLOGIES CO.,LTD +3C:92:DC Octopod Technology Co. Ltd. +74:CC:39 Fiberhome Telecommunication Technologies Co.,LTD +60:38:E0 Belkin International Inc. +F0:FD:A0 Acurix Networks Pty Ltd +1C:B9:C4 Ruckus Wireless +38:76:D1 Euronda SpA +C4:8F:07 Shenzhen Yihao Hulian Science and Technology Co., Ltd. +00:9E:1E Cisco Systems, Inc +00:25:50 Riverbed Technology, Inc. +D8:5B:2A Samsung Electronics Co.,Ltd +AC:C3:3A Samsung Electronics Co.,Ltd +F4:5B:73 Wanjiaan Interconnected Technology Co., Ltd +00:21:E2 visago Systems & Controls GmbH & Co. KG +28:F1:0E Dell Inc. +C4:A3:66 zte corporation +00:14:B4 General Dynamics United Kingdom Ltd +A0:B4:37 GD Mission Systems +50:52:D2 Hangzhou Telin Technologies Co., Limited +1C:D6:BD LEEDARSON LIGHTING CO., LTD. +9C:DD:1F Intelligent Steward Co.,Ltd +00:EB:D5 Cisco Systems, Inc +1C:7B:23 Qingdao Hisense Communications Co.,Ltd. +1C:74:0D ZyXEL Communications Corporation +00:13:49 ZyXEL Communications Corporation +40:4A:03 ZyXEL Communications Corporation +CC:5D:4E ZyXEL Communications Corporation +A0:E4:CB ZyXEL Communications Corporation +90:CF:7D Qingdao Hisense Communications Co.,Ltd. +F8:F0:82 NAG LLC +40:F4:13 Rubezh +2C:09:4D Raptor Engineering, LLC +AC:E7:7B SICHUAN TIANYI COMHEART TELECOMCO.,LTD +B0:E2:35 Xiaomi Communications Co Ltd +88:79:7E Motorola Mobility LLC, a Lenovo Company +40:C7:29 Sagemcom Broadband SAS +AC:04:0B Peloton Interactive, Inc +00:60:74 QSC LLC +34:ED:0B Shanghai XZ-COM.CO.,Ltd. +00:10:C1 OI ELECTRIC CO.,LTD +44:32:C8 Technicolor CH USA Inc. +E0:88:5D Technicolor CH USA Inc. +80:29:94 Technicolor CH USA Inc. +20:6A:8A Wistron Infocomm (Zhongshan) Corporation +F0:DE:F1 Wistron Infocomm (Zhongshan) Corporation +F8:0F:41 Wistron Infocomm (Zhongshan) Corporation +94:DF:4E Wistron InfoComm(Kunshan)Co.,Ltd. +48:A9:D2 Wistron Neweb Corporation +68:3E:34 MEIZU Technology Co., Ltd. +00:1E:C0 Microchip Technology Inc. +3C:07:71 Sony Corporation +D8:D4:3C Sony Corporation +00:A0:12 Telco Systems, Inc. +94:61:1E Wata Electronics Co.,Ltd. +00:25:D4 General Dynamics Mission Systems +5C:A8:6A HUAWEI TECHNOLOGIES CO.,LTD +C8:77:8B Themis Computer +00:0A:68 Solarflare Communications Inc +0C:D5:02 Westell Technologies Inc. +00:16:36 QUANTA COMPUTER INC. +00:C0:9F QUANTA COMPUTER INC. +54:AB:3A QUANTA COMPUTER INC. +08:9E:01 QUANTA COMPUTER INC. +00:19:9D Vizio, Inc +6C:0B:84 Universal Global Scientific Industrial Co., Ltd. +24:A4:3C Ubiquiti Networks +E4:50:9A HW Communications Ltd +70:29:00 Shenzhen ChipTrip Technology Co,Ltd +20:4C:03 Aruba Networks +90:F0:52 MEIZU Technology Co., Ltd. +00:0E:1E QLogic Corporation +D8:EB:97 TRENDnet, Inc. +14:61:02 Alpine Electronics, Inc. +90:03:B7 PARROT SA +0C:FE:45 Sony Interactive Entertainment Inc. +F8:D0:AC Sony Interactive Entertainment Inc. +00:D9:D1 Sony Interactive Entertainment Inc. +00:04:1F Sony Interactive Entertainment Inc. +00:1D:0D Sony Interactive Entertainment Inc. +7C:C7:09 SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. +38:B8:EB IEEE Registration Authority +38:FD:FE IEEE Registration Authority +7C:47:7C IEEE Registration Authority +50:FF:99 IEEE Registration Authority +68:91:D0 IEEE Registration Authority +28:36:38 IEEE Registration Authority +2C:6A:6F IEEE Registration Authority +BC:34:00 IEEE Registration Authority +B4:37:D1 IEEE Registration Authority +D4:55:BE SHENZHEN FAST TECHNOLOGIES CO.,LTD +F4:0E:11 IEEE Registration Authority +A4:3B:FA IEEE Registration Authority +CC:1B:E0 IEEE Registration Authority +80:7B:85 IEEE Registration Authority +54:9A:11 IEEE Registration Authority +B8:D8:12 IEEE Registration Authority +1C:CA:E3 IEEE Registration Authority +74:19:F8 IEEE Registration Authority +1C:21:D1 IEEE Registration Authority +80:E4:DA IEEE Registration Authority +2C:D1:41 IEEE Registration Authority +8C:A6:DF TP-LINK TECHNOLOGIES CO.,LTD. +00:E0:91 LG Electronics +6C:D0:32 LG Electronics +C0:41:F6 LG ELECTRONICS INC +40:4A:D4 Widex A/S +00:21:FB LG Electronics (Mobile Communications) +8C:3A:E3 LG Electronics (Mobile Communications) +30:76:6F LG Electronics (Mobile Communications) +F8:0C:F3 LG Electronics (Mobile Communications) +00:22:CF PLANEX COMMUNICATIONS INC. +A8:4E:3F Hitron Technologies. Inc +00:A7:42 Cisco Systems, Inc +6C:A8:58 Fiberhome Telecommunication Technologies Co.,LTD +00:14:78 TP-LINK TECHNOLOGIES CO.,LTD. +00:16:7A Skyworth Overseas Development Ltd. +28:BE:03 TCT mobile ltd +D4:E3:3F Alcatel-Lucent Canada +14:3E:60 Alcatel-Lucent Canada +84:DB:FC Alcatel-Lucent Canada +38:52:1A Alcatel-Lucent Canada +F4:C6:13 Alcatel-Lucent Shanghai Bell Co., Ltd +D8:26:B9 Guangdong Coagent Electronics S&T Co.,Ltd. +FC:B0:C4 Shanghai DareGlobal Technologies Co.,Ltd +24:AF:4A Alcatel-Lucent IPD +00:1A:F0 Alcatel-Lucent IPD +AC:9C:E4 Alcatel-Lucent Shanghai Bell Co., Ltd +D8:47:10 Sichuan Changhong Electric Ltd. +00:0E:40 Nortel Networks +00:11:58 Nortel Networks +00:11:F9 Nortel Networks +00:0F:6A Nortel Networks +00:12:83 Nortel Networks +00:04:38 Nortel Networks +00:23:47 ProCurve Networking by HP +00:25:61 ProCurve Networking by HP +00:80:58 PRINTER SYSTEMS CORP. +00:14:0D Nortel Networks +00:17:65 Nortel Networks +00:18:B0 Nortel Networks +00:1B:25 Nortel Networks +00:1D:AF Nortel Networks +00:16:6D Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd +00:16:F2 Dmobile System Co., Ltd. +00:01:38 XAVi Technologies Corp. +3C:91:57 Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd +00:00:D8 Novell, Inc. +00:10:87 XSTREAMIS PLC +7C:06:23 Ultra Electronics Sonar System Division +00:25:55 Visonic Technologies 1993 Ltd. +00:90:58 Ultra Electronics Limited (AEP Networks) +48:FD:8E HUAWEI TECHNOLOGIES CO.,LTD +24:44:27 HUAWEI TECHNOLOGIES CO.,LTD +B4:A9:84 Symantec Corporation +34:07:4F AccelStor, Inc. +58:E8:76 IEEE Registration Authority +24:8A:07 Mellanox Technologies, Inc. +00:25:8B Mellanox Technologies, Inc. +3C:2D:B7 Texas Instruments +00:23:D4 Texas Instruments +00:18:31 Texas Instruments +D0:8C:B5 Texas Instruments +B4:EE:D4 Texas Instruments +CC:8C:E3 Texas Instruments +10:2E:AF Texas Instruments +64:7B:D4 Texas Instruments +00:17:E8 Texas Instruments +00:17:E6 Texas Instruments +B0:B4:48 Texas Instruments +50:56:63 Texas Instruments +3C:7D:B1 Texas Instruments +40:98:4E Texas Instruments +00:12:D1 Texas Instruments +88:C2:55 Texas Instruments +E0:C7:9D Texas Instruments +90:59:AF Texas Instruments +B4:99:4C Texas Instruments +70:FF:76 Texas Instruments +50:72:24 Texas Instruments +44:04:44 GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD +50:65:83 Texas Instruments +BC:28:2C e-Smart Systems Pvt. Ltd +54:6C:0E Texas Instruments +F8:5C:4D NOKIA +D0:13:FD LG Electronics (Mobile Communications) +D8:E7:2B NetScout Systems, Inc. +04:FE:A1 Fihonest communication co.,Ltd +2C:AC:44 CONEXTOP +A8:BD:27 Hewlett Packard Enterprise +98:1E:0F Jeelan (Shanghai Jeelan Technology Information Inc +54:8C:A0 Liteon Technology Corporation +00:1A:AD ARRIS Group, Inc. +00:19:5E ARRIS Group, Inc. +00:14:04 ARRIS Group, Inc. +00:1B:DD ARRIS Group, Inc. +00:23:A2 ARRIS Group, Inc. +00:1E:8D ARRIS Group, Inc. +00:03:E0 ARRIS Group, Inc. +70:7E:43 ARRIS Group, Inc. +1C:14:48 ARRIS Group, Inc. +A4:7A:A4 ARRIS Group, Inc. +E8:3E:FC ARRIS Group, Inc. +E8:89:2C ARRIS Group, Inc. +00:1D:D3 ARRIS Group, Inc. +00:15:D1 ARRIS Group, Inc. +20:3D:66 ARRIS Group, Inc. +64:55:B1 ARRIS Group, Inc. +C0:05:C2 ARRIS Group, Inc. +3C:DF:A9 ARRIS Group, Inc. +8C:09:F4 ARRIS Group, Inc. +08:3E:0C ARRIS Group, Inc. +00:12:25 ARRIS Group, Inc. +00:12:8A ARRIS Group, Inc. +D4:04:CD ARRIS Group, Inc. +00:24:93 ARRIS Group, Inc. +E4:64:49 ARRIS Group, Inc. +74:56:12 ARRIS Group, Inc. +74:EA:E8 ARRIS Group, Inc. +A8:11:FC ARRIS Group, Inc. +04:4E:5A ARRIS Group, Inc. +94:E8:C5 ARRIS Group, Inc. +F8:A0:97 ARRIS Group, Inc. +00:23:0B ARRIS Group, Inc. +00:1B:52 ARRIS Group, Inc. +00:23:ED ARRIS Group, Inc. +00:23:95 ARRIS Group, Inc. +00:22:B4 ARRIS Group, Inc. +00:21:36 ARRIS Group, Inc. +00:24:C1 ARRIS Group, Inc. +3C:75:4A ARRIS Group, Inc. +40:FC:89 ARRIS Group, Inc. +BC:64:4B ARRIS Group, Inc. +34:7A:60 ARRIS Group, Inc. +84:E0:58 ARRIS Group, Inc. +00:36:76 ARRIS Group, Inc. +00:1C:A8 AirTies Wireless Networks +00:17:D5 Samsung Electronics Co.,Ltd +00:12:47 Samsung Electronics Co.,Ltd +E4:12:1D Samsung Electronics Co.,Ltd +68:48:98 Samsung Electronics Co.,Ltd +F4:09:D8 SAMSUNG ELECTRO-MECHANICS(THAILAND) +B4:79:A7 SAMSUNG ELECTRO-MECHANICS(THAILAND) +00:23:39 Samsung Electronics Co.,Ltd +D4:87:D8 Samsung Electronics Co.,Ltd +18:46:17 Samsung Electronics Co.,Ltd +50:01:BB Samsung Electronics Co.,Ltd +38:0A:94 Samsung Electronics Co.,Ltd +D8:57:EF Samsung Electronics Co.,Ltd +1C:66:AA Samsung Electronics Co.,Ltd +58:C3:8B Samsung Electronics Co.,Ltd +00:1E:E2 Samsung Electronics Co.,Ltd +00:1C:43 Samsung Electronics Co.,Ltd +00:1D:25 Samsung Electronics Co.,Ltd +3C:5A:37 Samsung Electronics Co.,Ltd +54:9B:12 Samsung Electronics Co.,Ltd +3C:8B:FE Samsung Electronics Co.,Ltd +00:26:5D Samsung Electronics Co.,Ltd +D4:E8:B2 Samsung Electronics Co.,Ltd +08:08:C2 Samsung Electronics Co.,Ltd +B0:C4:E7 Samsung Electronics Co.,Ltd +D8:90:E8 Samsung Electronics Co.,Ltd +34:AA:8B Samsung Electronics Co.,Ltd +24:C6:96 Samsung Electronics Co.,Ltd +18:1E:B0 Samsung Electronics Co.,Ltd +20:D3:90 Samsung Electronics Co.,Ltd +34:31:11 Samsung Electronics Co.,Ltd +34:BE:00 Samsung Electronics Co.,Ltd +78:52:1A Samsung Electronics Co.,Ltd +18:D2:76 HUAWEI TECHNOLOGIES CO.,LTD +00:23:3A 5481 +C8:7E:75 5481 +78:25:AD Samsung Electronics Co.,Ltd +F4:D9:FB Samsung Electronics Co.,Ltd +00:17:C9 Samsung Electronics Co.,Ltd +00:16:6B Samsung Electronics Co.,Ltd +00:16:6C Samsung Electronics Co.,Ltd +E4:7C:F9 Samsung Electronics Co.,Ltd +90:18:7C SAMSUNG ELECTRO MECHANICS CO., LTD. +FC:1F:19 SAMSUNG ELECTRO MECHANICS CO., LTD. +50:CC:F8 SAMSUNG ELECTRO MECHANICS CO., LTD. +98:0C:82 SAMSUNG ELECTRO MECHANICS CO., LTD. +00:21:19 SAMSUNG ELECTRO MECHANICS CO., LTD. +00:24:54 Samsung Electronics Co.,Ltd +20:D5:BF Samsung Electronics Co.,Ltd +30:CD:A7 Samsung Electronics Co.,Ltd +5C:0A:5B SAMSUNG ELECTRO MECHANICS CO., LTD. +00:74:9C RUIJIE NETWORKS CO., LTD. +54:35:30 Hon Hai Precision Ind. Co.,Ltd. +30:0E:D5 Hon Hai Precision Ind. Co.,Ltd. +D0:27:88 Hon Hai Precision Ind. Co.,Ltd. +00:14:A4 Hon Hai Precision Ind. Co.,Ltd. +00:16:CE Hon Hai Precision Ind. Co.,Ltd. +00:1D:D9 Hon Hai Precision Ind. Co.,Ltd. +00:1F:E2 Hon Hai Precision Ind. Co.,Ltd. +00:22:69 Hon Hai Precision Ind. Co.,Ltd. +40:49:0F Hon Hai Precision Ind. Co.,Ltd. +28:56:5A Hon Hai Precision Ind. Co.,Ltd. +00:1F:3A Hon Hai Precision Ind. Co.,Ltd. +50:63:13 Hon Hai Precision Ind. Co.,Ltd. +78:E4:00 Hon Hai Precision Ind. Co.,Ltd. +8C:7C:B5 Hon Hai Precision Ind. Co.,Ltd. +EC:55:F9 Hon Hai Precision Ind. Co.,Ltd. +C0:38:96 Hon Hai Precision Ind. Co.,Ltd. +2C:33:7A Hon Hai Precision Ind. Co.,Ltd. +AC:D1:B8 Hon Hai Precision Ind. Co.,Ltd. +48:E2:44 Hon Hai Precision Ind. Co.,Ltd. +30:F7:72 Hon Hai Precision Ind. Co.,Ltd. +90:48:9A Hon Hai Precision Ind. Co.,Ltd. +94:39:E5 Hon Hai Precision Ind. Co.,Ltd. +5C:86:13 Beijing Zhoenet Technology Co., Ltd +C8:B2:1E CHIPSEA TECHNOLOGIES (SHENZHEN) CORP. +50:3F:98 CMITECH +B0:72:BF Murata Manufacturing Co., Ltd. +60:0B:03 Hangzhou H3C Technologies Co., Limited +D8:6C:E9 Sagemcom Broadband SAS +3C:81:D8 Sagemcom Broadband SAS +2C:E4:12 Sagemcom Broadband SAS +18:1E:78 Sagemcom Broadband SAS +00:37:B7 Sagemcom Broadband SAS +00:14:BF Cisco-Linksys, LLC +6C:8D:C1 Apple, Inc. +38:CA:DA Apple, Inc. +8C:57:9B Wistron Neweb Corporation +B4:36:A9 Fibocom Wireless Inc. +64:16:F0 HUAWEI TECHNOLOGIES CO.,LTD +48:DB:50 HUAWEI TECHNOLOGIES CO.,LTD +24:00:BA HUAWEI TECHNOLOGIES CO.,LTD +68:DB:CA Apple, Inc. +04:4B:ED Apple, Inc. +3C:BB:73 Shenzhen Xinguodu Technology Co., Ltd. +3C:CF:5B ICOMM HK LIMITED +F4:03:04 Google, Inc. +78:AC:C0 Hewlett Packard +3C:90:66 SmartRG, Inc. +00:19:5B D-Link Corporation +00:0D:88 D-Link Corporation +00:13:46 D-Link Corporation +20:55:32 Gotech International Technology Limited +00:24:01 D-Link Corporation +1C:AF:F7 D-Link International +B8:A3:86 D-Link International +C8:D3:A3 D-Link International +44:19:B6 Hangzhou Hikvision Digital Technology Co.,Ltd. +C0:56:E3 Hangzhou Hikvision Digital Technology Co.,Ltd. +C8:E7:D8 SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. +E0:1C:41 Aerohive Networks Inc. +D8:54:A2 Aerohive Networks Inc. +9C:EF:D5 Panda Wireless, Inc. +C0:2C:7A Shenzhen Horn Audio Co.,Ltd. +88:B8:D0 Dongguan Koppo Electronic Co.,Ltd +38:E7:D8 HTC Corporation +D8:B3:77 HTC Corporation +B4:CE:F6 HTC Corporation +D4:0B:1A HTC Corporation +A0:8D:16 HUAWEI TECHNOLOGIES CO.,LTD +60:18:88 zte corporation +80:02:DF ORA Inc. +D8:FC:38 Giantec Semiconductor Inc +2C:67:98 InTalTech Ltd. +D0:BF:9C Hewlett Packard +B0:5A:DA Hewlett Packard +00:10:83 Hewlett Packard +00:01:E6 Hewlett Packard +C4:40:44 RackTop Systems Inc. +38:98:D8 MERITECH CO.,LTD +C8:67:5E Aerohive Networks Inc. +00:0C:F1 Intel Corporation +00:0E:0C Intel Corporation +BC:0F:64 Intel Corporate +6C:A1:00 Intel Corporate +94:65:9C Intel Corporate +10:02:B5 Intel Corporate +A4:68:BC Private +44:1E:A1 Hewlett Packard +D8:D3:85 Hewlett Packard +18:A9:05 Hewlett Packard +00:23:7D Hewlett Packard +00:26:55 Hewlett Packard +00:14:38 Hewlett Packard +00:15:60 Hewlett Packard +28:80:23 Hewlett Packard +64:51:06 Hewlett Packard +5C:B9:01 Hewlett Packard +DC:4A:3E Hewlett Packard +2C:59:E5 Hewlett Packard +9C:B6:54 Hewlett Packard +38:EA:A7 Hewlett Packard +E8:39:35 Hewlett Packard +08:EB:74 HUMAX Co., Ltd. +6C:B5:6B HUMAX Co., Ltd. +94:09:37 HUMAX Co., Ltd. +40:3D:EC HUMAX Co., Ltd. +E8:4D:D0 HUAWEI TECHNOLOGIES CO.,LTD +D8:1F:CC Brocade Communications Systems, Inc. +14:04:67 SNK Technologies Co.,Ltd. +EC:5F:23 Qinghai Kimascend Electronics Technology Co. Ltd. +04:7D:50 Shenzhen Kang Ying Technology Co.Ltd. +54:EF:FE Fullpower Technologies, Inc. +EC:52:DC WORLD MEDIA AND TECHNOLOGY Corp. +A4:D1:8C Apple, Inc. +CC:25:EF Apple, Inc. +24:09:95 HUAWEI TECHNOLOGIES CO.,LTD +24:7F:3C HUAWEI TECHNOLOGIES CO.,LTD +1C:8E:5C HUAWEI TECHNOLOGIES CO.,LTD +94:77:2B HUAWEI TECHNOLOGIES CO.,LTD +F4:E3:FB HUAWEI TECHNOLOGIES CO.,LTD +04:02:1F HUAWEI TECHNOLOGIES CO.,LTD +00:34:FE HUAWEI TECHNOLOGIES CO.,LTD +D0:2D:B3 HUAWEI TECHNOLOGIES CO.,LTD +08:63:61 HUAWEI TECHNOLOGIES CO.,LTD +F8:01:13 HUAWEI TECHNOLOGIES CO.,LTD +70:72:3C HUAWEI TECHNOLOGIES CO.,LTD +5C:7D:5E HUAWEI TECHNOLOGIES CO.,LTD +4C:8B:EF HUAWEI TECHNOLOGIES CO.,LTD +20:F3:A3 HUAWEI TECHNOLOGIES CO.,LTD +AC:E8:7B HUAWEI TECHNOLOGIES CO.,LTD +68:8F:84 HUAWEI TECHNOLOGIES CO.,LTD +AC:F7:F3 Xiaomi Communications Co Ltd +88:94:71 Brocade Communications Systems, Inc. +CC:4E:24 Brocade Communications Systems, Inc. +50:EB:1A Brocade Communications Systems, Inc. +00:27:F8 Brocade Communications Systems, Inc. +00:05:33 Brocade Communications Systems, Inc. +00:60:DF Brocade Communications Systems, Inc. +4C:AC:0A zte corporation +00:26:ED zte corporation +00:22:93 zte corporation +FC:D7:33 TP-LINK TECHNOLOGIES CO.,LTD. +10:A5:D0 Murata Manufacturing Co., Ltd. +D4:C9:B2 Quanergy Systems Inc +E4:CE:02 WyreStorm Technologies Ltd +20:02:AF Murata Manufacturing Co., Ltd. +00:26:E8 Murata Manufacturing Co., Ltd. +EC:CB:30 HUAWEI TECHNOLOGIES CO.,LTD +78:6A:89 HUAWEI TECHNOLOGIES CO.,LTD +20:08:ED HUAWEI TECHNOLOGIES CO.,LTD +50:9F:27 HUAWEI TECHNOLOGIES CO.,LTD +CC:96:A0 HUAWEI TECHNOLOGIES CO.,LTD +54:A5:1B HUAWEI TECHNOLOGIES CO.,LTD +F4:C7:14 HUAWEI TECHNOLOGIES CO.,LTD +28:6E:D4 HUAWEI TECHNOLOGIES CO.,LTD +A0:12:90 Avaya Inc +F8:15:47 Avaya Inc +50:61:84 Avaya Inc +BC:AD:AB Avaya Inc +B4:A9:5A Avaya Inc +3C:3A:73 Avaya Inc +04:F9:38 HUAWEI TECHNOLOGIES CO.,LTD +FC:48:EF HUAWEI TECHNOLOGIES CO.,LTD +80:FB:06 HUAWEI TECHNOLOGIES CO.,LTD +D4:B1:10 HUAWEI TECHNOLOGIES CO.,LTD +CC:53:B5 HUAWEI TECHNOLOGIES CO.,LTD +00:21:27 TP-LINK TECHNOLOGIES CO.,LTD. +54:E6:FC TP-LINK TECHNOLOGIES CO.,LTD. +D8:5D:4C TP-LINK TECHNOLOGIES CO.,LTD. +F8:1A:67 TP-LINK TECHNOLOGIES CO.,LTD. +F0:F3:36 TP-LINK TECHNOLOGIES CO.,LTD. +44:B3:2D TP-LINK TECHNOLOGIES CO.,LTD. +F0:78:16 Cisco Systems, Inc +00:13:10 Cisco-Linksys, LLC +00:23:BE Cisco SPVTG +54:D4:6F Cisco SPVTG +24:37:4C Cisco SPVTG +BC:C8:10 Cisco SPVTG +48:44:87 Cisco SPVTG +44:58:29 Cisco SPVTG +48:1D:70 Cisco SPVTG +00:21:4F ALPS ELECTRIC CO.,LTD. +00:E0:36 PIONEER CORPORATION +E0:AE:5E ALPS ELECTRIC CO.,LTD. +34:C7:31 ALPS ELECTRIC CO.,LTD. +60:38:0E ALPS ELECTRIC CO.,LTD. +64:D4:BD ALPS ELECTRIC CO.,LTD. +00:00:0C Cisco Systems, Inc +00:40:96 Cisco Systems, Inc +30:F7:0D Cisco Systems, Inc +B0:7D:47 Cisco Systems, Inc +D8:B1:90 Cisco Systems, Inc +F0:B2:E5 Cisco Systems, Inc +18:8B:9D Cisco Systems, Inc +38:ED:18 Cisco Systems, Inc +EC:BD:1D Cisco Systems, Inc +DC:CE:C1 Cisco Systems, Inc +84:B2:61 Cisco Systems, Inc +00:9E:C8 Xiaomi Communications Co Ltd +7C:1D:D9 Xiaomi Communications Co Ltd +A0:86:C6 Xiaomi Communications Co Ltd +58:44:98 Xiaomi Communications Co Ltd +70:E4:22 Cisco Systems, Inc +00:50:BD Cisco Systems, Inc +00:90:86 Cisco Systems, Inc +00:50:54 Cisco Systems, Inc +3C:0E:23 Cisco Systems, Inc +90:E6:BA ASUSTek COMPUTER INC. +BC:AE:C5 ASUSTek COMPUTER INC. +10:BF:48 ASUSTek COMPUTER INC. +A8:0C:0D Cisco Systems, Inc +B8:38:61 Cisco Systems, Inc +6C:99:89 Cisco Systems, Inc +58:0A:20 Cisco Systems, Inc +00:50:D1 Cisco Systems, Inc +00:50:0B Cisco Systems, Inc +00:50:73 Cisco Systems, Inc +00:60:3E Cisco Systems, Inc +00:E0:34 Cisco Systems, Inc +00:18:68 Cisco SPVTG +88:75:56 Cisco Systems, Inc +60:73:5C Cisco Systems, Inc +FC:99:47 Cisco Systems, Inc +7C:C5:37 Apple, Inc. +70:CD:60 Apple, Inc. +24:AB:81 Apple, Inc. +58:1F:AA Apple, Inc. +A4:67:06 Apple, Inc. +3C:07:54 Apple, Inc. +E4:CE:8F Apple, Inc. +E8:04:0B Apple, Inc. +B8:C7:5D Apple, Inc. +40:3C:FC Apple, Inc. +28:6A:B8 Apple, Inc. +7C:C3:A1 Apple, Inc. +00:E1:6D Cisco Systems, Inc +F8:C2:88 Cisco Systems, Inc +E0:AC:F1 Cisco Systems, Inc +FC:5B:39 Cisco Systems, Inc +34:6F:90 Cisco Systems, Inc +E0:D1:73 Cisco Systems, Inc +74:A0:2F Cisco Systems, Inc +54:7C:69 Cisco Systems, Inc +68:9C:E2 Cisco Systems, Inc +40:A6:E8 Cisco Systems, Inc +B8:78:2E Apple, Inc. +00:05:02 Apple, Inc. +00:10:FA Apple, Inc. +00:03:93 Apple, Inc. +00:16:CB Apple, Inc. +00:17:F2 Apple, Inc. +00:1B:63 Apple, Inc. +00:1E:C2 Apple, Inc. +00:26:08 Apple, Inc. +7C:6D:62 Apple, Inc. +40:D3:2D Apple, Inc. +D8:30:62 Apple, Inc. +C4:2C:03 Apple, Inc. +6C:20:56 Cisco Systems, Inc +BC:16:65 Cisco Systems, Inc +44:AD:D9 Cisco Systems, Inc +0C:27:24 Cisco Systems, Inc +6C:41:6A Cisco Systems, Inc +F8:72:EA Cisco Systems, Inc +0C:68:03 Cisco Systems, Inc +78:9F:70 Apple, Inc. +DC:37:14 Apple, Inc. +40:33:1A Apple, Inc. +94:F6:A3 Apple, Inc. +D8:1D:72 Apple, Inc. +70:EC:E4 Apple, Inc. +38:C9:86 Apple, Inc. +FC:FC:48 Apple, Inc. +28:57:BE Hangzhou Hikvision Digital Technology Co.,Ltd. +50:D5:9C Thai Habel Industrial Co., Ltd. +FC:A3:86 SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD +F0:F2:49 Hitron Technologies. Inc +A4:C3:61 Apple, Inc. +AC:7F:3E Apple, Inc. +28:0B:5C Apple, Inc. +90:B9:31 Apple, Inc. +24:A2:E1 Apple, Inc. +80:EA:96 Apple, Inc. +60:03:08 Apple, Inc. +04:F1:3E Apple, Inc. +54:72:4F Apple, Inc. +48:74:6E Apple, Inc. +3C:AB:8E Apple, Inc. +7C:6D:F8 Apple, Inc. +48:D7:05 Apple, Inc. +3C:D0:F8 Apple, Inc. +98:D6:BB Apple, Inc. +4C:B1:99 Apple, Inc. +64:E6:82 Apple, Inc. +80:49:71 Apple, Inc. +98:FE:94 Apple, Inc. +D8:00:4D Apple, Inc. +98:B8:E3 Apple, Inc. +80:92:9F Apple, Inc. +88:53:95 Apple, Inc. +9C:04:EB Apple, Inc. +78:FD:94 Apple, Inc. +C8:85:50 Apple, Inc. +D4:F4:6F Apple, Inc. +78:7E:61 Apple, Inc. +60:F8:1D Apple, Inc. +4C:7C:5F Apple, Inc. +48:E9:F1 Apple, Inc. +FC:E9:98 Apple, Inc. +F0:99:BF Apple, Inc. +68:64:4B Apple, Inc. +A8:96:8A Apple, Inc. +4C:8D:79 Apple, Inc. +20:7D:74 Apple, Inc. +F4:F1:5A Apple, Inc. +04:26:65 Apple, Inc. +2C:B4:3A Apple, Inc. +68:9C:70 Apple, Inc. +08:70:45 Apple, Inc. +CC:E0:C3 Mangstor, Inc. +84:A4:23 Sagemcom Broadband SAS +34:69:87 zte corporation +58:68:5D Tempo Australia Pty Ltd +78:9C:85 August Home, Inc. +FC:CF:43 HUIZHOU CITY HUIYANG DISTRICT MEISIQI INDUSTRY DEVELOPMENT CO,.LTD +58:82:A8 Microsoft +B4:EF:04 DAIHAN Scientific Co., Ltd. +04:96:45 WUXI SKY CHIP INTERCONNECTION TECHNOLOGY CO.,LTD. +5C:E3:B6 Fiberhome Telecommunication Technologies Co.,LTD +9C:88:AD Fiberhome Telecommunication Technologies Co.,LTD +C8:C2:C6 Shanghai Airm2m Communication Technology Co., Ltd +EC:64:E7 MOCACARE Corporation +D0:7C:2D Leie IOT technology Co., Ltd +40:86:2E JDM MOBILE INTERNET SOLUTION CO., LTD. +EC:38:8F HUAWEI TECHNOLOGIES CO.,LTD +BC:9C:31 HUAWEI TECHNOLOGIES CO.,LTD +90:C9:9B Recore Systems +5C:B5:59 CNEX Labs +5C:CF:7F Espressif Inc. +38:05:46 Foctek Photonics, Inc. +68:58:C5 ZF TRW Automotive +04:41:69 GoPro +AC:C5:1B Zhuhai Pantum Electronics Co., Ltd. +44:73:D6 Logitech +E8:07:34 Champion Optical Network Engineering, LLC +6C:EB:B2 Dongguan Sen DongLv Electronics Co.,Ltd +A0:32:99 Lenovo (Beijing) Co., Ltd. +A8:45:CD Siselectron Technology LTD. +D0:C1:93 SKYBELL, INC +20:9B:CD Apple, Inc. +F0:B0:E7 Apple, Inc. +CC:20:E8 Apple, Inc. +E4:35:C8 HUAWEI TECHNOLOGIES CO.,LTD +38:FF:36 Ruckus Wireless +D4:72:08 Bragi GmbH +48:9A:42 Technomate Ltd +B4:9D:0B BQ +98:CB:27 Galore Networks Pvt. Ltd. +30:D3:2D devolo AG +CC:79:4A BLU Products Inc. +60:FD:56 WOORISYSTEMS CO., Ltd +48:39:74 Proware Technologies Co., Ltd. +E8:55:B4 SAI Technology Inc. +9C:A6:9D Whaley Technology Co.Ltd +34:26:06 CarePredict, Inc. +B4:AE:2B Microsoft +80:EB:77 Wistron Corporation +B8:89:81 Chengdu InnoThings Technology Co., Ltd. +B4:29:3D Shenzhen Urovo Technology Co.,Ltd. +90:6F:A9 NANJING PUTIAN TELECOMMUNICATIONS TECHNOLOGY CO.,LTD. +14:B3:70 Gigaset Digital Technology (Shenzhen) Co., Ltd. +FC:2F:EF UTT Technologies Co., Ltd. +EC:21:E5 Toshiba +44:FD:A3 Everysight LTD. +84:D4:C8 Widex A/S +24:72:60 IOTTECH Corp +44:97:5A SHENZHEN FAST TECHNOLOGIES CO.,LTD +58:48:22 Sony Mobile Communications AB +F8:BF:09 HUAWEI TECHNOLOGIES CO.,LTD +B4:B2:65 DAEHO I&T +08:1F:EB BinCube +78:5F:4C Argox Information Co., Ltd. +E8:66:C4 Datawise Systems +58:70:C6 Shanghai Xiaoyi Technology Co., Ltd. +80:3B:2A ABB Xiamen Low Voltage Equipment Co.,Ltd. +A0:A6:5C Supercomputing Systems AG +5C:B3:95 HUAWEI TECHNOLOGIES CO.,LTD +C4:12:F5 D-Link International +44:F4:36 zte corporation +34:9B:5B Maquet GmbH +E8:61:BE Melec Inc. +54:B8:0A D-Link International +D8:AD:DD Sonavation, Inc. +C0:9A:71 XIAMEN MEITU MOBILE TECHNOLOGY CO.LTD +34:0B:40 MIOS ELETTRONICA SRL +94:4A:0C Sercomm Corporation +D0:25:16 SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. +D0:5C:7A Sartura d.o.o. +9C:37:F4 HUAWEI TECHNOLOGIES CO.,LTD +5C:EB:68 Cheerstar Technology Co., Ltd +F4:6A:92 SHENZHEN FAST TECHNOLOGIES CO.,LTD +14:AE:DB VTech Telecommunications Ltd. +EC:4F:82 Calix Inc. +B8:C3:BF Henan Chengshi NetWork Technology Co.,Ltd +C0:EE:40 Laird Technologies +F0:18:2B LG Chem +CC:5F:BF Topwise 3G Communication Co., Ltd. +14:DD:A9 ASUSTek COMPUTER INC. +48:5D:36 Verizon +EC:60:E0 AVI-ON LABS +14:5A:83 Logi-D inc +4C:EE:B0 SHC Netzwerktechnik GmbH +18:8E:F9 G2C Co. Ltd. +80:9F:AB Fiberhome Telecommunication Technologies Co.,LTD +D0:04:92 Fiberhome Telecommunication Technologies Co.,LTD +F4:E9:D4 QLogic Corporation +14:22:DB eero inc. +0C:41:3E Microsoft Corporation +00:7E:56 China Dragon Technology Limited +08:62:66 ASUSTek COMPUTER INC. +34:6C:0F Pramod Telecom Pvt. Ltd +3C:91:2B Vexata Inc +54:36:9B 1Verge Internet Technology (Beijing) Co., Ltd. +E4:FE:D9 EDMI Europe Ltd +28:52:E0 Layon international Electronic & Telecom Co.,Ltd +E4:85:01 Geberit International AG +1C:39:47 COMPAL INFORMATION (KUNSHAN) CO., LTD. +2C:AD:13 SHENZHEN ZHILU TECHNOLOGY CO.,LTD +68:B9:83 b-plus GmbH +BC:74:D7 HangZhou JuRu Technology CO.,LTD +E8:8E:60 NSD Corporation +54:51:46 AMG Systems Ltd. +84:DD:B7 Cilag GmbH International +78:EB:14 SHENZHEN FAST TECHNOLOGIES CO.,LTD +D0:5B:A8 zte corporation +8C:E7:8C DK Networks +E4:BA:D9 360 Fly Inc. +7C:3C:B6 Shenzhen Homecare Technology Co.,Ltd. +BC:E7:67 Quanzhou TDX Electronics Co., Ltd +6C:A7:FA YOUNGBO ENGINEERING INC. +D0:92:9E Microsoft Corporation +F4:03:2F Reduxio Systems +84:CF:BF Fairphone +AC:9E:17 ASUSTek COMPUTER INC. +AC:C7:3F VITSMO CO., LTD. +18:BD:AD L-TECH CORPORATION +44:D2:44 Seiko Epson Corporation +10:C0:7C Blu-ray Disc Association +B8:78:79 Roche Diagnostics GmbH +44:80:EB Motorola Mobility LLC, a Lenovo Company +D0:6F:4A TOPWELL INTERNATIONAL HOLDINGS LIMITED +BC:54:F9 Drogoo Technology Co., Ltd. +34:9E:34 Evervictory Electronic Co.Ltd +A0:C2:DE Costar Video Systems +38:09:A4 Firefly Integrations +00:A5:09 WigWag Inc. +A8:64:05 nimbus 9, Inc +70:76:FF KERLINK +68:F0:BC Shenzhen LiWiFi Technology Co., Ltd +BC:D1:65 Cisco SPVTG +4C:A9:28 Insensi +28:84:FA SHARP Corporation +3C:1E:04 D-Link International +E0:FF:F7 Softiron Inc. +DC:60:A1 Teledyne DALSA Professional Imaging +78:E9:80 RainUs Co.,Ltd +7C:82:74 Shenzhen Hikeen Technology CO.,LTD +B4:05:66 SP Best Corporation Co., LTD. +70:AD:54 Malvern Instruments Ltd +DC:E0:26 Patrol Tag, Inc +EC:3C:88 MCNEX Co.,Ltd. +F0:79:59 ASUSTek COMPUTER INC. +E0:8E:3C Aztech Electronics Pte Ltd +78:A3:51 SHENZHEN ZHIBOTONG ELECTRONICS CO.,LTD +94:E2:FD Boge Kompressoren OTTO Boge GmbH & Co. KG +E4:69:5A Dictum Health, Inc. +D4:61:32 Pro Concept Manufacturer Co.,Ltd. +54:A0:50 ASUSTek COMPUTER INC. +84:18:26 Osram GmbH +14:F8:93 Wuhan FiberHome Digital Technology Co.,Ltd. +98:16:EC IC Intracom +DC:DA:4F GETCK TECHNOLOGY, INC +30:FA:B7 Tunai Creative +08:09:B6 Masimo Corp +14:ED:E4 Kaiam Corporation +34:38:AF Inlab Software GmbH +04:9B:9C Eadingcore Intelligent Technology Co., Ltd. +84:26:90 BEIJING THOUGHT SCIENCE CO.,LTD. +B8:4F:D5 Microsoft Corporation +58:7B:E9 AirPro Technology India Pvt. Ltd +FC:1D:84 Autobase +4C:E9:33 RailComm, LLC +60:50:C1 Kinetek Sports +00:35:60 Rosen Aviation +EC:59:E7 Microsoft Corporation +08:EF:AB SAYME WIRELESS SENSOR NETWORK +C8:1B:6B Innova Security +5C:96:6A RTNET +2C:50:89 Shenzhen Kaixuan Visual Technology Co.,Limited +EC:13:B2 Netonix +74:BA:DB Longconn Electornics(shenzhen)Co.,Ltd +4C:74:03 BQ +58:76:C5 DIGI I'S LTD +00:A2:F5 Guangzhou Yuanyun Network Technology Co.,Ltd +70:FC:8C OneAccess SA +90:2C:C7 C-MAX Asia Limited +1C:96:5A Weifang goertek Electronics CO.,LTD +18:82:19 Alibaba Cloud Computing Ltd. +B4:17:80 DTI Group Ltd +D4:37:D7 zte corporation +AC:38:70 Lenovo Mobile Communication Technology Ltd. +80:EA:CA Dialog Semiconductor Hellas SA +4C:BC:42 Shenzhen Hangsheng Electronics Co.,Ltd. +98:7E:46 Emizon Networks Limited +84:32:EA ANHUI WANZTEN P&T CO., LTD +90:B6:86 Murata Manufacturing Co., Ltd. +4C:6E:6E Comnect Technology CO.,LTD +F4:DD:9E GoPro +40:B3:CD Chiyoda Electronics Co.,Ltd. +34:51:AA JID GLOBAL +04:57:2F Sertel Electronics UK Ltd +08:B2:A3 Cynny Italia S.r.L. +D8:97:7C Grey Innovation +80:AD:67 Kasda Networks Inc +30:59:5B streamnow AG +B8:AD:3E BLUECOM +10:C3:7B ASUSTek COMPUTER INC. +48:D8:55 Telvent +28:4E:D7 OutSmart Power Systems, Inc. +5C:5B:C2 YIK Corporation +EC:8A:4C zte corporation +80:14:A8 Guangzhou V-SOLUTION Electronic Technology Co., Ltd. +90:8C:63 GZ Weedong Networks Technology Co. , Ltd +B4:9E:AC Imagik Int'l Corp +C8:E4:2F Technical Research Design and Development +FC:23:25 EosTek (Shenzhen) Co., Ltd. +A8:13:74 Panasonic Corporation AVC Networks Company +4C:83:DE Cisco SPVTG +5C:B6:CC NovaComm Technologies Inc. +B4:AE:6F Circle Reliance, Inc DBA Cranberry Networks +B8:99:19 7signal Solutions, Inc +90:DA:6A FOCUS H&S Co., Ltd. +A4:5D:A1 ADB Broadband Italia +A4:3D:78 GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD +E8:EF:89 OPMEX Tech. +F4:C4:47 Coagent International Enterprise Limited +08:DF:1F Bose Corporation +54:2A:A2 Alpha Networks Inc. +84:94:8C Hitron Technologies. Inc +CC:A0:E5 DZG Metering GmbH +30:59:B7 Microsoft +08:74:F6 Winterhalter Gastronom GmbH +FC:C2:DE Murata Manufacturing Co., Ltd. +1C:1C:FD Dalian Hi-Think Computer Technology, Corp +70:62:B8 D-Link International +B8:75:C0 PayPal, Inc. +E4:7F:B2 FUJITSU LIMITED +38:26:2B UTran Technology +20:ED:74 Ability enterprise co.,Ltd. +78:24:AF ASUSTek COMPUTER INC. +0C:AC:05 Unitend Technologies Inc. +B4:B8:59 Texa Spa +04:5C:8E gosund GROUP CO.,LTD +54:B7:53 Hunan Fenghui Yinjia Science And Technology Co.,Ltd +48:26:E8 Tek-Air Systems, Inc. +A0:12:DB TABUCHI ELECTRIC CO.,LTD +AC:B8:59 Uniband Electronic Corp, +10:0F:18 Fu Gang Electronic(KunShan)CO.,LTD +C8:D5:90 FLIGHT DATA SYSTEMS +70:93:83 Intelligent Optical Network High Tech CO.,LTD. +60:47:D4 FORICS Electronic Technology Co., Ltd. +C0:9D:26 Topicon HK Lmd. +B0:61:C7 Ericsson-LG Enterprise +B0:57:06 Vallox Oy +C8:D4:29 Muehlbauer AG +20:EA:C7 SHENZHEN RIOPINE ELECTRONICS CO., LTD +80:61:8F Shenzhen sangfei consumer communications co.,ltd +5C:F5:0D Institute of microelectronic applications +10:DE:E4 automationNEXT GmbH +44:48:91 HDMI Licensing, LLC +FC:92:3B Nokia Corporation +38:F7:08 National Resource Management, Inc. +C4:C9:19 Energy Imports Ltd +88:A7:3C Ragentek Technology Group +B0:D7:C5 Logipix Ltd +38:C9:A9 SMART High Reliability Solutions, Inc. +BC:1A:67 YF Technology Co., Ltd +B0:24:F3 Progeny Systems +8C:4D:B9 Unmonday Ltd +D8:7C:DD SANIX INCORPORATED +F8:A2:B4 RHEWA-WAAGENFABRIK August Freudewald GmbH &Co. KG +84:FE:9E RTC Industries, Inc. +40:30:67 Conlog (Pty) Ltd +98:DA:92 Vuzix Corporation +5C:2A:EF Open Access Pty Ltd +E4:04:39 TomTom Software Ltd +90:AE:1B TP-LINK TECHNOLOGIES CO.,LTD. +44:1E:91 ARVIDA Intelligent Electronics Technology Co.,Ltd. +6C:14:F7 Erhardt+Leimer GmbH +CC:07:E4 Lenovo Mobile Communication Technology Ltd. +B4:43:0D Broadlink Pty Ltd +A4:BB:AF Lime Instruments +7C:E1:FF Computer Performance, Inc. DBA Digital Loggers, Inc. +D0:69:D0 Verto Medical Solutions, LLC +AC:E0:69 ISAAC Instruments +E8:EA:6A StarTech.com +C4:E9:84 TP-LINK TECHNOLOGIES CO.,LTD. +80:59:FD Noviga +18:FF:2E Shenzhen Rui Ying Da Technology Co., Ltd +1C:AB:01 Innovolt +68:85:6A OuterLink Corporation +30:F4:2F ESP +74:6A:8F VS Vision Systems GmbH +B0:68:B6 Hangzhou OYE Technology Co. Ltd +9C:65:F9 AcSiP Technology Corp. +48:76:04 Private +D0:57:A1 Werma Signaltechnik GmbH & Co. KG +3C:89:A6 KAPELSE +90:F1:B0 Hangzhou Anheng Info&Tech CO.,LTD +9C:86:DA Phoenix Geophysics Ltd. +48:FE:EA HOMA B.V. +10:DD:F4 Maxway Electronics CO.,LTD +08:03:71 KRG CORPORATE +AC:C5:95 Graphite Systems +34:13:A8 Mediplan Limited +4C:D9:C4 Magneti Marelli Automotive Electronics (Guangzhou) Co. Ltd +74:3E:CB Gentrice tech +70:71:B3 Brain Corporation +20:89:86 zte corporation +3C:D4:D6 WirelessWERX, Inc +64:E6:25 Woxu Wireless Co., Ltd +7C:44:4C Entertainment Solutions, S.L. +50:1A:C5 Microsoft +60:96:20 Private +F8:57:2E Core Brands, LLC +E0:E6:31 SNB TECHNOLOGIES LIMITED +20:C6:0D Shanghai annijie Information technology Co.,LTD +7C:97:63 Openmatics s.r.o. +04:44:A1 TELECON GALICIA,S.A. +84:56:9C Coho Data, Inc., +78:AE:0C Far South Networks +38:CA:97 Contour Design LLC +84:A7:83 Alcatel Lucent +2C:5D:93 Ruckus Wireless +1C:C1:1A Wavetronix +4C:F0:2E Vifa Denmark A/S +30:51:F8 BYK-Gardner GmbH +94:C3:E4 SCA Schucker Gmbh & Co KG +FC:19:D0 Cloud Vision Networks Technology Co.,Ltd. +20:E7:91 Siemens Healthcare Diagnostics, Inc +68:76:4F Sony Mobile Communications AB +D4:D9:19 GoPro +50:C9:A0 SKIPPER Electronics AS +A4:9F:89 Shanghai Rui Rui Communication Technology Co.Ltd. +D8:50:E6 ASUSTek COMPUTER INC. +94:10:3E Belkin International Inc. +B4:75:0E Belkin International Inc. +34:61:78 The Boeing Company +18:7E:D5 shenzhen kaism technology Co. Ltd +84:1B:38 Shenzhen Excelsecu Data Technology Co.,Ltd +EC:2A:F0 Ypsomed AG +04:4F:8B Adapteva, Inc. +9C:E7:BD Winduskorea co., Ltd +38:42:A6 Ingenieurbuero Stahlkopf +A0:BF:50 S.C. ADD-PRODUCTION S.R.L. +7C:B7:33 ASKEY COMPUTER CORP +70:59:57 Medallion Instrumentation Systems +6C:83:66 Nanjing SAC Power Grid Automation Co., Ltd. +88:57:6D XTA Electronics Ltd +F8:3D:4E Softlink Automation System Co., Ltd +FC:D8:17 Beijing Hesun Technologies Co.Ltd. +90:9F:43 Accutron Instruments Inc. +50:C0:06 Carmanah Signs +98:FB:12 Grand Electronics (HK) Ltd +3C:10:40 daesung network +B0:45:45 YACOUB Automation GmbH +70:1D:7F Comtech Technology Co., Ltd. +60:DB:2A HNS +7C:BF:88 Mobilicom LTD +90:02:8A Shenzhen Shidean Legrand Electronic Products Co.,Ltd +90:35:6E Vodafone Omnitel N.V. +3C:CA:87 Iders Incorporated +08:CA:45 Toyou Feiji Electronics Co., Ltd. +9C:A9:E4 zte corporation +E4:77:23 zte corporation +C0:98:E5 University of Michigan +B8:DF:6B SpotCam Co., Ltd. +74:2B:62 FUJITSU LIMITED +58:BD:F9 Sigrand +34:4F:3F IO-Power Technology Co., Ltd. +C0:C6:87 Cisco SPVTG +14:2B:D2 Armtel Ltd. +54:A5:4B NSC Communications Siberia Ltd +BC:2B:6B Beijing Haier IC Design Co.,Ltd +64:21:84 Nippon Denki Kagaku Co.,LTD +EC:3E:09 PERFORMANCE DESIGNED PRODUCTS, LLC +EC:21:9F VidaBox LLC +98:D3:31 Shenzhen Bolutek Technology Co.,Ltd. +3C:1A:57 Cardiopulmonary Corp +6C:F9:7C Nanoptix Inc. +58:E0:2C Micro Technic A/S +E4:81:B3 Shenzhen ACT Industrial Co.,Ltd. +E4:F3:E3 Shanghai iComhome Co.,Ltd. +04:CF:25 MANYCOLORS, INC. +D4:10:90 iNFORM Systems AG +34:95:DB Logitec Corporation +88:14:2B Protonic Holland +B8:24:1A SWEDA INFORMATICA LTDA +38:06:B4 A.D.C. GmbH +34:1B:22 Grandbeing Technology Co., Ltd +B4:34:6C MATSUNICHI DIGITAL TECHNOLOGY (HONG KONG) LIMITED +9C:14:65 Edata Elektronik San. ve Tic. A.Ş. +58:7A:4D Stonesoft Corporation +E8:92:18 Arcontia International AB +58:F3:87 HCCP +B0:79:3C Revolv Inc +20:CE:C4 Peraso Technologies +04:84:8A 7INOVA TECHNOLOGY LIMITED +20:C6:EB Panasonic Corporation AVC Networks Company +70:0F:EC Poindus Systems Corp. +78:D5:B5 NAVIELEKTRO KY +E0:67:B3 C-Data Technology Co., Ltd +B8:87:A8 Step Ahead Innovations Inc. +14:0D:4F Flextronics International +B8:47:C6 SanJet Technology Corp. +4C:DF:3D TEAM ENGINEERS ADVANCE TECHNOLOGIES INDIA PVT LTD +70:F1:76 Data Modul AG +20:57:21 Salix Technology CO., Ltd. +70:4C:ED TMRG, Inc. +E8:51:6E TSMART Inc. +7C:1A:FC Dalian Co-Edifice Video Technology Co., Ltd +C0:34:B4 Gigastone Corporation +74:AD:B7 China Mobile Group Device Co.,Ltd. +DC:6F:00 Livescribe, Inc. +D0:73:7F Mini-Circuits +A4:D0:94 Erwin Peters Systemtechnik GmbH +04:88:E2 Beats Electronics LLC +D0:0E:A4 Porsche Cars North America +F4:15:FD Shanghai Pateo Electronic Equipment Manufacturing Co., Ltd. +2C:94:64 Cincoze Co., Ltd. +B0:50:BC SHENZHEN BASICOM ELECTRONIC CO.,LTD. +DC:70:14 Private +40:BC:73 Cronoplast S.L. +78:30:3B Stephen Technologies Co.,Limited +78:F5:E5 BEGA Gantenbrink-Leuchten KG +80:4B:20 Ventilation Control +40:07:C0 Railtec Systems GmbH +94:B8:C5 RuggedCom Inc. +8C:3C:07 Skiva Technologies, Inc. +78:4B:08 f.robotics acquisitions ltd +0C:2D:89 QiiQ Communications Inc. +60:4A:1C SUYIN Corporation +A4:D3:B5 GLITEL Stropkov, s.r.o. +A4:F3:C1 Open Source Robotics Foundation, Inc. +6C:8B:2F zte corporation +B8:63:BC ROBOTIS, Co, Ltd +C8:DD:C9 Lenovo Mobile Communication Technology Ltd. +CC:1A:FA zte corporation +8C:5A:F0 Exeltech Solar Products +F8:DA:DF EcoTech, Inc. +30:AE:7B Deqing Dusun Electron CO., LTD +14:41:E2 Monaco Enterprises, Inc. +F0:77:65 Sourcefire, Inc +E4:F7:A1 Datafox GmbH +60:1E:02 EltexAlatau +E4:7D:5A Beijing Hanbang Technology Corp. +4C:62:55 SANMINA-SCI SYSTEM DE MEXICO S.A. DE C.V. +38:17:66 PROMZAKAZ LTD. +20:4C:6D Hugo Brennenstuhl Gmbh & Co. KG. +DC:82:5B JANUS, spol. s r.o. +B0:88:07 Strata Worldwide +74:D0:2B ASUSTek COMPUTER INC. +A4:E0:E6 FILIZOLA S.A. PESAGEM E AUTOMACAO +60:E0:0E SHINSEI ELECTRONICS CO LTD +30:D4:6A Autosales Incorporated +30:AA:BD Shanghai Reallytek Information Technology Co.,Ltd +A4:B8:18 PENTA Gesellschaft für elektronische Industriedatenverarbeitung mbH +10:66:82 NEC Platforms, Ltd. +10:28:31 Morion Inc. +D8:1E:DE B&W Group Ltd +68:97:E8 Society of Motion Picture & Television Engineers +24:EA:40 Systeme Helmholz GmbH +FC:58:FA Shen Zhen Shi Xin Zhong Xin Technology Co.,Ltd. +60:60:1F SZ DJI TECHNOLOGY CO.,LTD +E0:C6:B3 MilDef AB +FC:DB:96 ENERVALLEY CO., LTD +FC:8B:97 Shenzhen Gongjin Electronics Co.,Ltd +88:2E:5A storONE +D4:29:EA Zimory GmbH +C8:0E:95 OmniLync Inc. +50:AB:BF Hoseo Telecom +C8:EE:A6 Shenzhen SHX Technology Co., Ltd +28:CB:EB One +18:E8:DD MODULETEK +4C:CC:34 Motorola Solutions Inc. +F0:84:C9 zte corporation +E8:94:F6 TP-LINK TECHNOLOGIES CO.,LTD. +94:AC:CA trivum technologies GmbH +7C:D8:44 Enmotus Inc +F4:C6:D7 blackned GmbH +68:A4:0E BSH Bosch and Siemens Home Appliances GmbH +4C:CA:53 Skyera, Inc. +08:1D:FB Shanghai Mexon Communication Technology Co.,Ltd +D0:CD:E1 Scientech Electronics +94:75:6E QinetiQ North America +54:3D:37 Ruckus Wireless +0C:55:21 Axiros GmbH +A4:D8:56 Gimbal, Inc +10:A7:43 SK Mtek Limited +E4:A7:FD Cellco Partnership +24:F2:DD Radiant Zemax LLC +80:CF:41 Lenovo Mobile Communication Technology Ltd. +7C:9A:9B VSE valencia smart energy +A8:45:E9 Firich Enterprises CO., LTD. +78:99:5C Nationz Technologies Inc +8C:C5:E1 ShenZhen Konka Telecommunication Technology Co.,Ltd +6C:B3:11 Shenzhen Lianrui Electronics Co.,Ltd +54:11:5F Atamo Pty Ltd +24:11:D0 Chongqing Ehs Science and Technology Development Co.,Ltd. +6C:9A:C9 Valentine Research, Inc. +10:F4:9A T3 Innovation +58:65:E6 INFOMARK CO., LTD. +60:BD:91 Move Innovation +98:47:3C SHANGHAI SUNMON COMMUNICATION TECHNOGY CO.,LTD +CC:4B:FB Hellberg Safety AB +AC:A2:2C Baycity Technologies Ltd +6C:AD:EF KZ Broadband Technologies, Ltd. +04:4B:FF GuangZhou Hedy Digital Technology Co., Ltd +94:9B:FD Trans New Technology, Inc. +E4:EE:FD MR&D Manufacturing +10:5C:BF DuroByte Inc +88:A3:CC Amatis Controls +EC:89:F5 Lenovo Mobile Communication Technology Ltd. +08:3A:B8 Shinoda Plasma Co., Ltd. +A0:DD:97 PolarLink Technologies, Ltd +E0:55:97 Emergent Vision Technologies Inc. +A0:19:17 Bertel S.p.a. +FC:9F:AE Fidus Systems Inc +FC:06:47 Cortland Research, LLC +20:91:8A PROFALUX +7C:43:8F E-Band Communications Corp. +FC:62:6E Beijing MDC Telecom +C0:B3:39 Comigo Ltd. +DC:C0:DB Shenzhen Kaiboer Technology Co., Ltd. +70:76:DD Oxyguard International A/S +E8:9A:FF Fujian Landi Commercial Equipment Co.,Ltd +68:3B:1E Countwise LTD +D4:13:6F Asia Pacific Brands +A0:A1:30 DLI Taiwan Branch office +EC:E9:15 STI Ltd +A8:1F:AF KRYPTON POLSKA +08:7B:AA SVYAZKOMPLEKTSERVICE, LLC +2C:26:C5 zte corporation +BC:62:9F Telenet Systems P. Ltd. +B4:7F:5E Foresight Manufacture (S) Pte Ltd +78:55:17 SankyuElectronics +84:8E:96 Embertec Pty Ltd +CC:3A:61 SAMSUNG ELECTRO MECHANICS CO., LTD. +A0:03:63 Robert Bosch Healthcare GmbH +F0:F6:44 Whitesky Science & Technology Co.,Ltd. +30:D3:57 Logosol, Inc. +2C:44:1B Spectrum Medical Limited +1C:5A:6B Philips Electronics Nederland BV +A8:75:D6 FreeTek International Co., Ltd. +58:EB:14 Proteus Digital Health +78:9F:87 Siemens AG I IA PP PRM +7C:0A:50 J-MEX Inc. +40:F2:E9 IBM +9C:04:73 Tecmobile (International) Ltd. +CC:26:2D Verifi, LLC +3C:8A:E5 Tensun Information Technology(Hangzhou) Co.,LTD +7C:B2:32 Hui Zhou Gaoshengda Technology Co.,LTD +54:DF:63 Intrakey technologies GmbH +7C:01:87 Curtis Instruments, Inc. +38:8E:E7 Fanhattan LLC +54:F6:66 Berthold Technologies GmbH and Co.KG +80:2F:DE Zurich Instruments AG +08:AF:78 Totus Solutions, Inc. +5C:38:E0 Shanghai Super Electronics Technology Co.,LTD +A0:E5:34 Stratec Biomedical AG +28:91:D0 Stage Tec Entwicklungsgesellschaft für professionelle Audiotechnik mbH +98:29:1D Jaguar de Mexico, SA de CV +18:86:3A DIGITAL ART SYSTEM +F4:B7:2A TIME INTERCONNECT LTD +34:D7:B4 Tributary Systems, Inc. +F4:0F:9B WAVELINK +14:43:19 Creative&Link Technology Limited +64:F5:0E Kinion Technology Company Limited +28:A1:86 enblink +1C:94:92 RUAG Schweiz AG +24:69:4A Jasmine Systems Inc. +C8:C7:91 Zero1.tv GmbH +60:74:8D Atmaca Elektronik +78:D1:29 Vicos +78:AB:60 ABB Australia +28:9A:4B SteelSeries ApS +0C:C6:6A Nokia Corporation +30:78:C2 Innowireless, Co. Ltd. +7C:FE:28 Salutron Inc. +10:9F:A9 Actiontec Electronics, Inc +C0:A3:64 3D Systems Massachusetts +98:A7:B0 MCST ZAO +88:DC:96 SENAO Networks, Inc. +C4:55:C2 Bach-Simpson +EC:A2:9B Kemppi Oy +04:CE:14 Wilocity LTD. +80:2A:FA Germaneers GmbH +1C:84:64 FORMOSA WIRELESS COMMUNICATION CORP. +D8:67:D9 Cisco Systems, Inc +B4:21:8A Dog Hunter LLC +F8:A0:3D Dinstar Technologies Co., Ltd. +D0:8C:FF UPWIS AB +9C:06:6E Hytera Communications Corporation Limited +74:6A:89 Rezolt Corporation +68:D1:FD Shenzhen Trimax Technology Co.,Ltd +24:1B:13 Shanghai Nutshell Electronic Co., Ltd. +B4:35:64 Fujian Tian Cheng Electron Science & Technical Development Co.,Ltd. +54:D1:B0 Universal Laser Systems, Inc +A4:97:BB Hitachi Industrial Equipment Systems Co.,Ltd +FC:52:CE Control iD +E8:04:F3 Throughtek Co., Ltd. +B8:58:10 NUMERA, INC. +2C:AB:25 Shenzhen Gongjin Electronics Co.,Ltd +AC:6E:1A Shenzhen Gongjin Electronics Co.,Ltd +98:86:B1 Flyaudio corporation (China) +28:B3:AB Genmark Automation +44:E8:A5 Myreka Technologies Sdn. Bhd. +AC:14:D2 wi-daq, inc. +9C:4C:AE Mesa Labs +7C:D9:FE New Cosmos Electric Co., Ltd. +E4:90:69 Rockwell Automation +B4:89:10 Coster T.E. S.P.A. +A4:B1:E9 Technicolor +30:AE:F6 Radio Mobile Access +58:34:3B Glovast Technology Ltd. +54:A0:4F t-mac Technologies Ltd +E4:4F:5F EDS Elektronik Destek San.Tic.Ltd.Sti +08:B7:38 Lite-On Technogy Corp. +9C:66:50 Glodio Technolies Co.,Ltd Tianjin Branch +50:39:55 Cisco SPVTG +90:CF:6F Dlogixs Co Ltd +68:AF:13 Futura Mobility +B8:24:10 Magneti Marelli Slovakia s.r.o. +A8:EF:26 Tritonwave +F0:D3:E7 Sensometrix SA +7C:C8:D0 TIANJIN YAAN TECHNOLOGY CO., LTD. +88:E9:17 Tamaggo +80:AA:A4 USAG +5C:24:79 Baltech AG +E8:CB:A1 Nokia Corporation +F8:5F:2A Nokia Corporation +28:60:94 CAPELEC +60:E9:56 Ayla Networks, Inc +28:71:84 Spire Payments +1C:B0:94 HTC Corporation +FC:50:90 SIMEX Sp. z o.o. +20:9B:A5 JIAXING GLEAD Electronics Co.,Ltd +60:84:3B Soladigm, Inc. +50:8C:77 DIRMEIER Schanktechnik GmbH &Co KG +60:89:B1 Key Digital Systems +08:0C:C9 Mission Technology Group, dba Magma +A0:F4:50 HTC Corporation +44:D1:5E Shanghai Kingto Information Technology Ltd +54:5E:BD NL Technologies +C8:BB:D3 Embrane +EC:D1:9A Zhuhai Liming Industries Co., Ltd +34:6E:8A Ecosense +AC:EE:3B 6harmonics Inc +68:16:05 Systems And Electronic Development FZCO +04:F1:7D Tarana Wireless +A0:DC:04 Becker-Antriebe GmbH +8C:C1:21 Panasonic Corporation AVC Networks Company +2C:BE:97 Ingenieurbuero Bickele und Buehler GmbH +04:5A:95 Nokia Corporation +B4:0E:96 HERAN +0C:AF:5A GENUS POWER INFRASTRUCTURES LIMITED +D0:69:9E LUMINEX Lighting Control Equipment +64:AE:88 Polytec GmbH +2C:54:2D Cisco Systems, Inc +70:9E:86 X6D Limited +94:61:24 Pason Systems +DC:30:9C Heyrex Limited +E8:13:24 GuangZhou Bonsoninfo System CO.,LTD +00:36:F8 Conti Temic microelectronic GmbH +44:38:39 Cumulus Networks, inc +20:F0:02 MTData Developments Pty. Ltd. +CC:91:2B TE Connectivity Touch Solutions +78:52:62 Shenzhen Hojy Software Co., Ltd. +40:33:6C Godrej & Boyce Mfg. co. ltd +FC:1D:59 I Smart Cities HK Ltd +EC:0E:D6 ITECH INSTRUMENTS SAS +D0:D2:12 K2NET Co.,Ltd. +9C:8E:DC Teracom Limited +14:6A:0B Cypress Electronics Limited +B0:75:0C QA Cafe +B4:E1:EB Private +FC:2A:54 Connected Data, Inc. +A0:90:DE VEEDIMS,LLC +AC:14:61 ATAW Co., Ltd. +50:8A:42 Uptmate Technology Co., LTD +8C:57:FD LVX Western +00:2A:6A Cisco Systems, Inc +B8:8F:14 Analytica GmbH +94:FA:E8 Shenzhen Eycom Technology Co., Ltd +3C:A3:15 Bless Information & Communications Co., Ltd +F8:DB:4C PNY Technologies, INC. +F8:30:94 Alcatel-Lucent Telecom Limited +28:17:CE Omnisense Ltd +28:E6:08 Tokheim +E4:77:D4 Minrray Industry Co.,Ltd +A4:B9:80 Parking BOXX Inc. +00:2D:76 TITECH GmbH +78:A1:83 Advidia +F8:50:63 Verathon +40:0E:67 Tremol Ltd. +90:1B:0E Fujitsu Technology Solutions GmbH +5C:6F:4F S.A. SISTEL +B0:58:C4 Broadcast Microwave Services, Inc +B8:20:E7 Guangzhou Horizontal Information & Network Integration Co. Ltd +98:58:8A SYSGRATION Ltd. +84:2B:50 Huria Co.,Ltd. +0C:5A:19 Axtion Sdn Bhd +A0:0C:A1 SKTB SKiT +E0:95:79 ORTHOsoft inc, d/b/a Zimmer CAS +30:7E:CB SFR +90:A7:83 JSW PACIFIC CORPORATION +00:08:30 Cisco Systems, Inc +CC:EF:48 Cisco Systems, Inc +78:A5:DD Shenzhen Smarteye Digital Electronics Co., Ltd +28:B0:CC Xenya d.o.o. +EC:E7:44 Omntec mfg. inc +80:42:7C Adolf Tedsen GmbH & Co. KG +F8:F7:D3 International Communications Corporation +B8:9A:ED OceanServer Technology, Inc +E4:55:EA Dedicated Computing +00:FC:58 WebSilicon Ltd. +64:A0:E7 Cisco Systems, Inc +18:E8:0F Viking Electronics Inc. +EC:62:64 Global411 Internet Services, LLC +00:F0:51 KWB Gmbh +F0:DE:B9 ShangHai Y&Y Electronics Co., Ltd +AC:54:EC IEEE P1823 Standards Working Group +C8:29:2A Barun Electronics +E0:DA:DC JVC KENWOOD Corporation +C8:94:D2 Jiangsu Datang Electronic Products Co., Ltd +A0:42:3F Tyan Computer Corp +5C:18:B5 Talon Communications +78:BA:D0 Shinybow Technology Co. Ltd. +30:6C:BE Skymotion Technology (HK) Limited +40:D5:59 MICRO S.E.R.I. +F8:2F:5B eGauge Systems LLC +34:99:D7 Universal Flow Monitors, Inc. +7C:33:6E MEG Electronics Inc. +D4:D2:49 Power Ethernet +10:C2:BA UTT Co., Ltd. +F0:DA:7C RLH INDUSTRIES,INC. +40:98:4C Casacom Solutions AG +B8:97:5A BIOSTAR Microtech Int'l Corp. +48:33:DD ZENNIO AVANCE Y TECNOLOGIA, S.L. +D4:D7:48 Cisco Systems, Inc +9C:CA:D9 Nokia Corporation +F8:31:3E endeavour GmbH +10:FC:54 Shany Electronic Co., Ltd. +D4:CA:6D Routerboard.com +D8:E7:43 Wush, Inc +90:8F:CF UNO System Co., Ltd +90:3C:AE Yunnan KSEC Digital Technology Co.,Ltd. +00:08:31 Cisco Systems, Inc +F0:62:0D Shenzhen Egreat Tech Corp.,Ltd +84:36:11 hyungseul publishing networks +B8:FD:32 Zhejiang ROICX Microelectronics +D8:05:2E Skyviia Corporation +F8:35:53 Magenta Research Ltd. +DC:3C:2E Manufacturing System Insights, Inc. +40:BC:8B itelio GmbH +88:C3:6E Beijing Ereneben lnformation Technology Limited +8C:DE:52 ISSC Technologies Corp. +A8:77:6F Zonoff +90:2B:34 GIGA-BYTE TECHNOLOGY CO.,LTD. +48:E1:AF Vity +24:5F:DF KYOCERA Corporation +C0:A0:DE Multi Touch Oy +94:3A:F0 Nokia Corporation +B8:26:D4 Furukawa Industrial S.A. Produtos Elétricos +14:E4:EC mLogic LLC +FC:0A:81 Zebra Technologies Inc +AC:0D:FE Ekon GmbH - myGEKKO +00:5C:B1 Gospell DIGITAL TECHNOLOGY CO., LTD +18:67:51 KOMEG Industrielle Messtechnik GmbH +B4:67:E9 Qingdao GoerTek Technology Co., Ltd. +B4:9E:E6 SHENZHEN TECHNOLOGY CO LTD +70:41:B7 Edwards Lifesciences LLC +A8:49:A5 Lisantech Co., Ltd. +94:DB:49 SITCORP +8C:D1:7B CG Mobile +14:49:78 Digital Control Incorporated +FC:8F:C4 Intelligent Technology Inc. +F0:4A:2B PYRAMID Computer GmbH +CC:90:93 Hansong Tehnologies +78:F7:D0 Silverbrook Research +F0:4B:6A Scientific Production Association Siberian Arsenal, Ltd. +30:DE:86 Cedac Software S.r.l. +F0:13:C3 SHENZHEN FENDA TECHNOLOGY CO., LTD +CC:E7:DF American Magnetics, Inc. +E4:4E:18 Gardasoft VisionLimited +D4:1C:1C RCF S.P.A. +8C:94:CF Encell Technology, Inc. +14:90:90 KongTop industrial(shen zhen)CO.,LTD +CC:F8:F0 Xi'an HISU Multimedia Technology Co.,Ltd. +30:F9:ED Sony Corporation +28:C7:18 Altierre +20:46:A1 VECOW Co., Ltd +8C:27:1D QuantHouse +9C:8B:F1 The Warehouse Limited +14:7D:C5 Murata Manufacturing Co., Ltd. +94:46:96 BaudTec Corporation +90:34:2B Gatekeeper Systems, Inc. +D4:52:51 IBT Ingenieurbureau Broennimann Thun +30:71:B2 Hangzhou Prevail Optoelectronic Equipment Co.,LTD. +B8:2A:DC EFR Europäische Funk-Rundsteuerung GmbH +B0:9B:D4 GNH Software India Private Limited +7C:F4:29 NUUO Inc. +B8:CD:A7 Maxeler Technologies Ltd. +F4:94:61 NexGen Storage +80:47:31 Packet Design, Inc. +AC:CB:09 Hefcom Metering (Pty) Ltd +10:EE:D9 Canoga Perkins Corporation +24:0B:B1 KOSTAL Industrie Elektrik GmbH +20:EE:C6 Elefirst Science & Tech Co ., ltd +80:7A:7F ABB Genway Xiamen Electrical Equipment CO., LTD +14:37:3B PROCOM Systems +B8:19:99 Nesys +4C:55:85 Hamilton Systems +8C:CF:5C BEFEGA GmbH +A0:13:3B HiTi Digital, Inc. +44:8E:12 DT Research, Inc. +9C:57:11 Feitian Xunda(Beijing) Aeronautical Information Technology Co., Ltd. +18:AD:4D Polostar Technology Corporation +4C:A7:4B Alcatel Lucent +54:94:78 Silvershore Technology Partners +F4:B1:64 Lightning Telecommunications Technology Co. Ltd +0C:FC:83 Airoha Technology Corp., +0C:51:F7 CHAUVIN ARNOUX +70:B0:35 Shenzhen Zowee Technology Co., Ltd +70:81:05 Cisco Systems, Inc +00:08:2F Cisco Systems, Inc +54:20:18 Tely Labs +58:1F:EF Tuttnaer LTD +F8:F2:5A G-Lab GmbH +BC:77:9F SBM Co., Ltd. +C0:58:A7 Pico Systems Co., Ltd. +04:D7:83 Y&H E&C Co.,LTD. +00:E1:75 AK-Systems Ltd +84:3F:4E Tri-Tech Manufacturing, Inc. +C8:32:32 Hunting Innova +D0:59:C3 CeraMicro Technology Corporation +EC:96:81 2276427 Ontario Inc +B8:28:8B Parker Hannifin Manufacturing (UK) Ltd +58:35:D9 Cisco Systems, Inc +80:2E:14 azeti Networks AG +E8:94:4C Cogent Healthcare Systems Ltd +68:F8:95 Redflow Limited +A8:87:92 Broadband Antenna Tracking Systems +90:19:00 SCS SA +AC:93:2F Nokia Corporation +14:35:B3 Future Designs, Inc. +FC:F1:CD OPTEX-FA CO.,LTD. +B0:38:29 Siliconware Precision Industries Co., Ltd. +BC:0F:2B FORTUNE TECHGROUP CO.,LTD +8C:F9:C9 MESADA Technology Co.,Ltd. +E4:2A:D3 Magneti Marelli S.p.A. Powertrain +FC:10:BD Control Sistematizado S.A. +44:37:19 2 Save Energy Ltd +E8:3E:B6 RIM +94:FD:1D WhereWhen Corp +0C:E8:2F Bonfiglioli Vectron GmbH +C0:62:6B Cisco Systems, Inc +74:D0:DC ERICSSON AB +B4:B8:8D Thuh Company +60:F5:9C CRU-Dataport +C4:10:8A Ruckus Wireless +4C:73:A5 KOVE +F8:69:71 Seibu Electric Co., +44:AA:27 udworks Co., Ltd. +6C:AD:3F Hubbell Building Automation, Inc. +84:27:CE Corporation of the Presiding Bishop of The Church of Jesus Christ of Latter-day Saints +D4:28:B2 ioBridge, Inc. +90:B8:D0 Joyent, Inc. +90:90:60 RSI VIDEO TECHNOLOGIES +28:14:71 Lantis co., LTD. +14:07:E0 Abrantix AG +DC:CF:94 Beijing Rongcheng Hutong Technology Co., Ltd. +18:E2:88 STT Condigi +68:87:6B INQ Mobile Limited +98:66:EA Industrial Control Communications, Inc. +F4:A5:2A Hawa Technologies Inc +90:CF:15 Nokia Corporation +B8:D4:9D M Seven System Ltd. +B0:A1:0A Pivotal Systems Corporation +48:F4:7D TechVision Holding Internation Limited +6C:39:1D Beijing ZhongHuaHun Network Information center +64:D2:41 Keith & Koep GmbH +10:12:12 Vivo International Corporation Pty Ltd +50:87:B8 Nuvyyo Inc +E4:12:89 topsystem Systemhaus GmbH +A4:13:4E Luxul +B0:99:28 FUJITSU LIMITED +8C:11:CB ABUS Security-Center GmbH & Co. KG +80:64:59 Nimbus Inc. +A4:5A:1C smart-electronic GmbH +8C:89:A5 Micro-Star INT'L CO., LTD +3C:67:2C Sciovid Inc. +18:D0:71 DASAN CO., LTD. +38:D1:35 EasyIO Corporation Sdn. Bhd. +18:4E:94 MESSOA TECHNOLOGIES INC. +94:D9:3C ENELPS +DC:9B:1E Intercom, Inc. +5C:77:57 Haivision Network Video +E8:B4:AE Shenzhen C&D Electronics Co.,Ltd +C4:56:00 Galleon Embedded Computing +E4:2F:F6 Unicore communication Inc. +B8:F4:D0 Herrmann Ultraschalltechnik GmbH & Co. Kg +B4:F3:23 PETATEL INC. +C8:1E:8E ADV Security (S) Pte Ltd +AC:CA:BA Midokura Co., Ltd. +9C:41:7C Hame Technology Co., Limited +10:76:8A EoCell +04:46:65 Murata Manufacturing Co., Ltd. +D0:13:1E Sunrex Technology Corp +38:01:97 TSST Global,Inc +B4:01:42 GCI Science & Technology Co.,LTD +84:6E:B1 Park Assist LLC +6C:50:4D Cisco Systems, Inc +C0:C1:C0 Cisco-Linksys, LLC +1C:BD:0E Amplified Engineering Pty Ltd +F0:A7:64 GST Co., Ltd. +A0:F2:17 GE Medical System(China) Co., Ltd. +64:34:09 BITwave Pte Ltd +20:D5:AB Korea Infocom Co.,Ltd. +F0:58:49 CareView Communications +BC:15:A6 Taiwan Jantek Electronics,Ltd. +24:1A:8C Squarehead Technology AS +10:83:D2 Microseven Systems, LLC +F0:5D:89 Dycon Limited +AC:02:CF RW Tecnologia Industria e Comercio Ltda +90:67:B5 Alcatel-Lucent +40:98:7B Aisino Corporation +6C:2E:33 Accelink Technologies Co.,Ltd. +4C:ED:DE ASKEY COMPUTER CORP +E8:E0:8F GRAVOTECH MARKING SAS +78:B6:C1 AOBO Telecom Co.,Ltd +B8:BA:68 Xi'an Jizhong Digital Communication Co.,Ltd +BC:38:D2 Pandachip Limited +14:EE:9D AirNav Systems LLC +48:17:4C MicroPower technologies +F8:10:37 Atopia Systems, LP +64:F9:87 Avvasi Inc. +3C:74:37 RIM +04:20:9A Panasonic AVC Networks Company +64:DC:01 Static Systems Group PLC +1C:F5:E7 Turtle Industry Co., Ltd. +9C:4A:7B Nokia Corporation +2C:80:65 HARTING Inc. of North America +F8:F0:14 RackWare Inc. +E4:1C:4B V2 TECHNOLOGY, INC. +E0:14:3E Modoosis Inc. +5C:69:84 NUVICO +20:4A:AA Hanscan Spain S.A. +F0:25:72 Cisco Systems, Inc +80:91:C0 AgileMesh, Inc. +0C:F0:B4 Globalsat International Technology Ltd +BC:C6:1A SPECTRA EMBEDDED SYSTEMS +48:DF:1C Wuhan NEC Fibre Optic Communications industry Co. Ltd +D0:D3:FC Mios, Ltd. +98:94:49 Skyworth Wireless Technology Ltd. +C8:DF:7C Nokia Corporation +F8:C6:78 Carefusion +FC:35:98 Favite Inc. +A0:AA:FD EraThink Technologies Corp. +80:1F:02 Edimax Technology Co. Ltd. +E0:3E:7D data-complex GmbH +A4:E3:2E Silicon & Software Systems Ltd. +1C:19:DE eyevis GmbH +DC:07:C1 HangZhou QiYang Technology Co.,Ltd. +D8:FE:8F IDFone Co., Ltd. +00:06:F6 Cisco Systems, Inc +AC:AB:8D Lyngso Marine A/S +18:14:56 Nokia Corporation +E8:99:5A PiiGAB, Processinformation i Goteborg AB +D4:E3:2C S. Siedle & Sohne +68:DC:E8 PacketStorm Communications +78:22:3D Affirmed Networks +60:C9:80 Trymus +94:CD:AC Creowave Oy +F4:DC:DA Zhuhai Jiahe Communication Technology Co., limited +10:0D:32 Embedian, Inc. +D8:29:86 Best Wish Technology LTD +C0:3B:8F Minicom Digital Signage +A4:21:8A Nortel Networks +6C:04:60 RBH Access Technologies Inc. +5C:86:4A Secret Labs LLC +B8:BA:72 Cynove +C0:0D:7E Additech, Inc. +68:78:4C Nortel Networks +6C:62:6D Micro-Star INT'L CO., LTD +88:41:C1 ORBISAT DA AMAZONIA IND E AEROL SA +18:B2:09 Torrey Pines Logic, Inc +30:18:CF DEOS control systems GmbH +4C:F7:37 SamJi Electronics Co., Ltd +40:40:6B Icomera +18:80:CE Barberry Solutions Ltd +CC:43:E3 Trump s.a. +6C:22:AB Ainsworth Game Technology +3C:10:6F ALBAHITH TECHNOLOGIES +7C:E0:44 NEON Inc +64:D0:2D Next Generation Integration (NGI) +A0:40:41 SAMWONFA Co.,Ltd. +78:8C:54 Eltek Technologies LTD +94:11:DA ITF Fröschl GmbH +10:E8:EE PhaseSpace +A4:7C:1F Cobham plc +8C:1F:94 RF Surgical System Inc. +74:A4:A7 QRS Music Technologies, Inc. +80:39:E5 PATLITE CORPORATION +BC:FF:AC TOPCON CORPORATION +60:2A:54 CardioTek B.V. +1C:3D:E7 Sigma Koki Co.,Ltd. +48:2C:EA Motorola Inc Business Light Radios +70:E1:39 3view Ltd +AC:61:23 Drivven, Inc. +3C:04:BF PRAVIS SYSTEMS Co.Ltd., +44:3D:21 Nuvolt +74:90:50 Renesas Electronics Corporation +7C:BB:6F Cosco Electronics Co., Ltd. +D4:66:A8 Riedo Networks GmbH +98:E1:65 Accutome +EC:66:D1 B&W Group LTD +38:5F:C3 Yu Jeong System, Co.Ltd +94:85:7A Evantage Industries Corp +44:51:DB Raytheon BBN Technologies +64:99:5D LGE +58:50:76 Linear Equipamentos Eletronicos SA +40:83:DE Zebra Technologies Inc +88:97:DF Entrypass Corporation Sdn. Bhd. +0C:15:C5 SDTEC Co., Ltd. +98:03:A0 ABB n.v. Power Quality Products +DC:FA:D5 STRONG Ges.m.b.H. +D8:46:06 Silicon Valley Global Marketing +68:92:34 Ruckus Wireless +D0:E3:47 Yoga +84:A9:91 Cyber Trans Japan Co.,Ltd. +D8:1C:14 Compacta International, Ltd. +90:88:A2 IONICS TECHNOLOGY ME LTDA +B0:B8:D5 Nanjing Nengrui Auto Equipment CO.,Ltd +84:97:B8 Memjet Inc. +A8:55:6A Pocketnet Technology Inc. +B0:81:D8 I-sys Corp +20:6A:FF Atlas Elektronik UK Limited +EC:54:2E Shanghai XiMei Electronic Technology Co. Ltd +B8:8E:3A Infinite Technologies JLT +74:BE:08 ATEK Products, LLC +E0:EE:1B Panasonic Automotive Systems Company of America +E8:0C:38 DAEYOUNG INFORMATION SYSTEM CO., LTD +68:59:7F Alcatel Lucent +2C:30:68 Pantech Co.,Ltd +5C:40:58 Jefferson Audio Video Systems, Inc. +64:31:7E Dexin Corporation +AC:9B:84 Smak Tecnologia e Automacao +4C:02:2E CMR KOREA CO., LTD +24:A4:2C KOUKAAM a.s. +34:F3:9B WizLAN Ltd. +74:B9:EB JinQianMao Technology Co.,Ltd. +24:45:97 GEMUE Gebr. Mueller Apparatebau +30:69:4B RIM +AC:51:35 MPI TECH +E4:EC:10 Nokia Corporation +00:D3:8D Hotel Technology Next Generation +3C:62:78 SHENZHEN JETNET TECHNOLOGY CO.,LTD. +80:81:A5 TONGQING COMMUNICATION EQUIPMENT (SHENZHEN) Co.,Ltd +EC:8E:AD DLX +EC:DE:3D Lamprey Networks, Inc. +04:FE:7F Cisco Systems, Inc +E8:05:6D Nortel Networks +00:D1:1C ACETEL +10:56:CA Peplink International Ltd. +44:A6:89 PROMAX ELECTRONICA SA +10:CC:DB AXIMUM PRODUITS ELECTRONIQUES +6C:92:BF Inspur Electronic Information Industry Co.,Ltd. +E0:1C:EE Bravo Tech, Inc. +3C:19:15 GFI Chrono Time +EC:5C:69 MITSUBISHI HEAVY INDUSTRIES MECHATRONICS SYSTEMS,LTD. +04:E5:48 Cohda Wireless Pty Ltd +0C:1D:C2 SeAH Networks +28:CD:4C Individual Computers GmbH +8C:53:F7 A&D ENGINEERING CO., LTD. +78:11:85 NBS Payment Solutions Inc. +28:93:FE Cisco Systems, Inc +10:B7:F6 Plastoform Industries Ltd. +20:59:A0 Paragon Technologies Inc. +48:71:19 SGB GROUP LTD. +E0:AB:FE Orb Networks, Inc. +CC:EA:1C DCONWORKS Co., Ltd +AC:E3:48 MadgeTech, Inc +68:7F:74 Cisco-Linksys, LLC +CC:B8:88 AnB Securite s.a. +CC:22:18 InnoDigital Co., Ltd. +B8:64:91 CK Telecom Ltd +80:C8:62 Openpeak, Inc +E4:35:93 Hangzhou GoTo technology Co.Ltd +E0:BC:43 C2 Microsystems, Inc. +78:84:EE INDRA ESPACIO S.A. +2C:3F:3E Alge-Timing GmbH +C0:CF:A3 Creative Electronics & Software, Inc. +D4:82:3E Argosy Technologies, Ltd. +84:48:23 WOXTER TECHNOLOGY Co. Ltd +D0:F0:DB Ericsson +7C:14:76 Damall Technologies SAS +D0:58:75 Active Control Technology Inc. +D8:1B:FE TWINLINX CORPORATION +D4:6C:BF Goodrich ISR +5C:57:C8 Nokia Corporation +4C:C6:02 Radios, Inc. +3C:05:AB Product Creation Studio +3C:39:C3 JW Electronics Co., Ltd. +54:7F:EE Cisco Systems, Inc +A4:C2:AB Hangzhou LEAD-IT Information & Technology Co.,Ltd +48:AA:5D Store Electronic Systems +10:62:C9 Adatis GmbH & Co. KG +D8:AE:90 Itibia Technologies +90:47:16 RORZE CORPORATION +28:E7:94 Microtime Computer Inc. +88:94:F9 Gemicom Technology, Inc. +0C:A4:2A OB Telecom Electronic Technology Co., Ltd +58:50:E6 Best Buy Corporation +AC:9A:96 Lantiq Deutschland GmbH +E8:6C:DA Supercomputers and Neurocomputers Research Center +24:B6:B8 FRIEM SPA +F8:6E:CF Arcx Inc +8C:84:01 Private +6C:70:39 Novar GmbH +A4:56:1B MCOT Corporation +80:EE:73 Shuttle Inc. +10:C7:3F Midas Klark Teknik Ltd +40:8A:9A TITENG CO., Ltd. +70:2B:1D E-Domus International Limited +F0:77:D0 Xcellen +78:5C:72 Hioso Technology Co., Ltd. +94:23:6E Shenzhen Junlan Electronic Ltd +88:BA:7F Qfiednet Co., Ltd. +E0:26:36 Nortel Networks +44:56:B7 Spawn Labs, Inc +A0:98:05 OpenVox Communication Co Ltd +00:27:1D Comba Telecom Systems (China) Ltd. +00:27:21 Shenzhen Baoan Fenda Industrial Co., Ltd +A0:9A:5A Time Domain +64:A8:37 Juni Korea Co., Ltd +B4:B5:AF Minsung Electronics +04:4F:AA Ruckus Wireless +44:56:8D PNC Technologies Co., Ltd. +AC:D1:80 Crexendo Business Solutions, Inc. +AC:83:17 Shenzhen Furtunetel Communication Co., Ltd +E8:0B:13 Akib Systems Taiwan, INC +44:C9:A2 Greenwald Industries +9C:B2:06 PROCENTEC +64:6E:6C Radio Datacom LLC +E4:75:1E Getinge Sterilization AB +F8:81:1A OVERKIZ +04:2B:BB PicoCELA, Inc. +FC:08:77 Prentke Romich Company +EC:D0:0E MiraeRecognition Co., Ltd. +74:7E:1A Red Embedded Design Limited +C4:7D:4F Cisco Systems, Inc +4C:9E:E4 Hanyang Navicom Co.,Ltd. +3C:DF:1E Cisco Systems, Inc +BC:B1:81 SHARP CORPORATION +78:B8:1A INTER SALES A/S +78:19:2E NASCENT Technology +2C:06:23 Win Leader Inc. +C8:2E:94 Halfa Enterprise Co., Ltd. +0C:27:55 Valuable Techologies Limited +C0:38:F9 Nokia Danmark A/S +F4:63:49 Diffon Corporation +5C:87:78 Cybertelbridge co.,ltd +9C:5E:73 Calibre UK LTD +F0:62:81 ProCurve Networking by HP +00:3A:9B Cisco Systems, Inc +2C:91:27 Eintechno Corporation +C0:9C:92 COBY +84:90:00 Arnold & Richter Cine Technik +C8:72:48 Aplicom Oy +74:D8:50 Evrisko Systems +6C:AC:60 Venetex Corp +DC:02:65 Meditech Kft +98:6D:C8 TOSHIBA MITSUBISHI-ELECTRIC INDUSTRIAL SYSTEMS CORPORATION +68:A1:B7 Honghao Mingchuan Technology (Beijing) CO.,Ltd. +7C:CF:CF Shanghai SEARI Intelligent System Co., Ltd +EC:30:91 Cisco Systems, Inc +30:32:D4 Hanilstm Co., Ltd. +00:26:EE TKM GmbH +00:26:E7 Shanghai ONLAN Communication Tech. Co., Ltd. +00:26:E1 Stanford University, OpenFlow Group +00:26:DB Ionics EMS Inc. +00:26:CE Kozumi USA Corp. +00:26:D5 Ory Solucoes em Comercio de Informatica Ltda. +00:26:C8 System Sensor +00:27:11 LanPro Inc +00:27:0D Cisco Systems, Inc +00:27:07 Lift Complex DS, JSC +00:27:00 Shenzhen Siglent Technology Co., Ltd. +00:26:FA BandRich Inc. +00:26:F4 Nesslab +00:25:D7 CEDO +00:25:D2 InpegVision Co., Ltd +00:25:D1 Eastern Asia Technology Limited +00:25:CB Reiner SCT +00:25:C4 Ruckus Wireless +00:25:BF Wireless Cables Inc. +00:25:B1 Maya-Creation Corporation +00:25:B8 Agile Communications, Inc. +00:25:B2 MBDA Deutschland GmbH +00:25:AC I-Tech corporation +00:26:C2 SCDI Co. LTD +00:26:BC General Jack Technology Ltd. +00:26:B4 Ford Motor Company +00:26:AE Wireless Measurement Ltd +00:26:AA Kenmec Mechanical Engineering Co., Ltd. +00:26:A4 Novus Produtos Eletronicos Ltda +00:26:98 Cisco Systems, Inc +00:26:9D M2Mnet Co., Ltd. +00:26:8B Guangzhou Escene Computer Technology Limited +00:26:85 Digital Innovation +00:26:78 Logic Instrument SA +00:26:72 AAMP of America +00:26:6B SHINE UNION ENTERPRISE LIMITED +00:26:66 EFM Networks +00:26:65 ProtectedLogic Corporation +00:26:51 Cisco Systems, Inc +00:26:52 Cisco Systems, Inc +00:26:46 SHENYANG TONGFANG MULTIMEDIA TECHNOLOGY COMPANY LIMITED +00:26:40 Baustem Broadband Technologies, Ltd. +00:26:3A Digitec Systems +00:26:34 Infineta Systems, Inc +00:26:33 MIR - Medical International Research +00:26:2E Chengdu Jiuzhou Electronic Technology Inc +00:26:27 Truesell +00:26:21 InteliCloud Technology Inc. +00:26:1B LAUREL BANK MACHINES CO., LTD. +00:26:14 KTNF +00:26:0E Ablaze Systems, LLC +00:26:02 SMART Temps LLC +00:26:01 Cutera Inc +00:25:F7 Ansaldo STS USA +00:25:FC ENDA ENDUSTRIYEL ELEKTRONIK LTD. STI. +00:25:ED NuVo Technologies LLC +00:25:EE Avtex Ltd +00:25:E8 Idaho Technology +00:25:E3 Hanshinit Inc. +00:25:DE Probits Co., LTD. +00:25:79 J & F Labs +00:25:7E NEW POS Technology Limited +00:25:72 Nemo-Q International AB +00:25:6B ATENIX E.E. s.r.l. +00:25:6C Azimut Production Association JSC +00:25:5F SenTec AG +00:25:5A Tantalus Systems Corp. +00:25:59 Syphan Technologies Ltd +00:25:A5 Walnut Media Network +00:25:9F TechnoDigital Technologies GmbH +00:25:99 Hedon e.d. B.V. +00:25:92 Guangzhou Shirui Electronic Co., Ltd +00:25:8D Haier +00:25:88 Genie Industries, Inc. +00:25:83 Cisco Systems, Inc +00:25:4C Videon Central, Inc. +00:25:36 Oki Electric Industry Co., Ltd. +00:25:3D DRS Consolidated Controls +00:25:40 Quasar Technologies, Inc. +00:25:33 WITTENSTEIN AG +00:25:2C Entourage Systems, Inc. +00:25:02 NaturalPoint +00:24:FB Private +00:24:F6 MIYOSHI ELECTRONICS CORPORATION +00:24:EA iris-GmbH infrared & intelligent sensors +00:24:E3 CAO Group +00:25:27 Bitrode Corp. +00:25:24 Lightcomm Technology Co., Ltd +00:25:1F ZYNUS VISION INC. +00:25:1A Psiber Data Systems Inc. +00:25:15 SFR +00:25:0E gt german telematics gmbh +00:25:07 ASTAK Inc. +00:25:09 SHARETRONIC Group LTD +00:24:37 Motorola - BSG +00:24:3C S.A.A.A. +00:24:30 Ruby Tech Corp. +00:23:FB IP Datatel, LLC. +00:23:F3 Glocom, Inc. +00:23:EF Zuend Systemtechnik AG +00:23:E9 F5 Networks, Inc. +00:23:E3 Microtronic AG +00:23:E2 SEA Signalisation +00:23:DD ELGIN S.A. +00:23:D0 Uniloc USA Inc. +00:23:CA Behind The Set, LLC +00:24:B0 ESAB AB +00:24:A9 Ag Leader Technology +00:24:A2 Hong Kong Middleware Technology Limited +00:24:A4 Siklu Communication +00:24:9D NES Technology Inc. +00:24:8A Kaga Electronics Co., Ltd. +00:24:8F DO-MONIX +00:24:96 Ginzinger electronic systems +00:24:77 Tibbo Technology +00:24:70 AUROTECH ultrasound AS. +00:24:72 ReDriven Power Inc. +00:24:6B Covia, Inc. +00:24:64 Bridge Technologies Co AS +00:24:5F Vine Telecom CO.,Ltd. +00:24:20 NetUP Inc. +00:24:26 NOHMI BOSAI LTD. +00:24:1A Red Beetle Inc. +00:24:13 Cisco Systems, Inc +00:24:0D OnePath Networks LTD. +00:24:0E Inventec Besta Co., Ltd. +00:24:07 TELEM SAS +00:24:00 Nortel Networks +00:24:D0 Shenzhen SOGOOD Industry CO.,LTD. +00:24:D5 Winward Industrial Limited +00:24:C9 Broadband Solutions Group +00:24:C4 Cisco Systems, Inc +00:24:BF CIAT +00:24:B5 Nortel Networks +00:24:5A Nanjing Panda Electronics Company Limited +00:24:53 Initra d.o.o. +00:24:4D Hokkaido Electronics Corporation +00:24:52 Silicon Software GmbH +00:24:46 MMB Research Inc. +00:24:41 Wanzl Metallwarenfabrik GmbH +00:23:68 Zebra Technologies Inc +00:23:6F DAQ System +00:23:62 Goldline Controls +00:23:61 Unigen Corporation +00:23:5C Aprius, Inc. +00:23:55 Kinco Automation(Shanghai) Ltd. +00:23:4F Luminous Power Technologies Pvt. Ltd. +00:23:50 LynTec +00:23:49 Helmholtz Centre Berlin for Material and Energy +00:22:44 Chengdu Linkon Communications Device Co., Ltd +00:22:4F Byzoro Networks Ltd. +00:22:48 Microsoft Corporation +00:22:3E IRTrans GmbH +00:22:39 Indiana Life Sciences Incorporated +00:22:32 Design Design Technology Ltd +00:22:2C Ceton Corp +00:23:0E Gorba AG +00:23:07 FUTURE INNOVATION TECH CO.,LTD +00:23:02 Cobalt Digital, Inc. +00:22:EB Data Respons A/S +00:22:EC IDEALBT TECHNOLOGY CORPORATION +00:22:F1 Private +00:23:9E Jiangsu Lemote Technology Corporation Limited +00:23:98 Vutlan sro +00:23:8A Ciena Corporation +00:23:84 GGH Engineering s.r.l. +00:23:42 Coffee Equipment Company +00:23:36 METEL s.r.o. +00:23:3D Novero holding B.V. +00:23:30 DIZIPIA, INC. +00:23:2C Senticare +00:23:20 Nicira Networks +00:23:1D Deltacom Electronics Ltd +00:23:1E Cezzer Multimedia Technologies +00:22:B8 Norcott +00:22:B7 GSS Grundig SAT-Systems GmbH +00:22:B2 4RF Communications Ltd +00:22:AB Shenzhen Turbosight Technology Ltd +00:22:A6 Sony Computer Entertainment America +00:22:9F Sensys Traffic AB +00:22:E5 Fisher-Rosemount Systems Inc. +00:22:DE OPPO Digital, Inc. +00:22:D9 Fortex Industrial Ltd. +00:22:D2 All Earth Comércio de Eletrônicos LTDA. +00:22:CC SciLog, Inc. +00:22:C8 Applied Instruments B.V. +00:22:BE Cisco Systems, Inc +00:22:8C Photon Europe GmbH +00:22:86 ASTRON +00:22:85 NOMUS COMM SYSTEMS +00:22:80 A2B Electronics AB +00:22:76 Triple EYE B.V. +00:22:7B Apogee Labs, Inc. +00:22:62 BEP Marine +00:22:6C LinkSprite Technologies, Inc. +00:22:5E Uwin Technologies Co.,LTD +00:22:58 Taiyo Yuden Co., Ltd. +00:23:C3 LogMeIn, Inc. +00:23:BD Digital Ally, Inc. +00:23:B7 Q-Light Co., Ltd. +00:23:B1 Longcheer Technology (Singapore) Pte Ltd +00:23:B0 COMXION Technology Inc. +00:23:AB Cisco Systems, Inc +00:23:A4 New Concepts Development Corp. +00:1F:C0 Control Express Finland Oy +00:1F:BB Xenatech Co.,LTD +00:1F:B4 SmartShare Systems +00:1F:AD Brown Innovations, Inc +00:1F:AF NextIO, Inc. +00:1F:AE Blick South Africa (Pty) Ltd +00:1F:A8 Smart Energy Instruments Inc. +00:1F:A3 T&W Electronics(Shenzhen)Co.,Ltd. +00:21:42 Advanced Control Systems doo +00:21:40 EN Technologies Inc. +00:21:38 Cepheid +00:21:2E dresden-elektronik +00:21:28 Oracle Corporation +00:21:22 Chip-pro Ltd. +00:21:1B Cisco Systems, Inc +00:21:15 PHYWE Systeme GmbH & Co. KG +00:21:16 Transcon Electronic Systems, spol. s r. o. +00:21:0F Cernium Corp +00:21:0B GEMINI TRAZE RFID PVT. LTD. +00:21:0C Cymtec Systems, Inc. +00:1F:FC Riccius+Sohn GmbH +00:1F:F7 Nakajima All Precision Co., Ltd. +00:21:6E Function ATI (Huizhou) Telecommunications Co., Ltd. +00:21:68 iVeia, LLC +00:21:61 Yournet Inc. +00:21:55 Cisco Systems, Inc +00:21:4E GS Yuasa Power Supply Ltd. +00:21:49 China Daheng Group ,Inc. +00:1F:F0 Audio Partnership +00:1F:E9 Printrex, Inc. +00:1F:EB Trio Datacom Pty Ltd +00:1F:EA Applied Media Technologies Corporation +00:1F:DD GDI LLC +00:1F:D8 A-TRUST COMPUTER CORPORATION +00:1F:D3 RIVA Networks Inc. +00:1F:CE QTECH LLC +00:21:9D Adesys BV +00:21:A1 Cisco Systems, Inc +00:21:98 Thai Radio Co, LTD +00:21:93 Videofon MV +00:21:8D AP Router Ind. Eletronica LTDA +00:21:8E MEKICS CO., LTD. +00:21:87 Imacs GmbH +00:21:81 Si2 Microsystems Limited +00:21:7B Bastec AB +00:21:74 AvaLAN Wireless +00:21:F8 Enseo, Inc. +00:21:F3 Si14 SpA +00:21:EC Solutronic GmbH +00:21:E6 Starlight Video Limited +00:21:E0 CommAgility Ltd +00:21:D3 BOCOM SECURITY(ASIA PACIFIC) LIMITED +00:21:D4 Vollmer Werke GmbH +00:21:D9 SEKONIC CORPORATION +00:21:CD LiveTV +00:21:C7 Russound +00:21:C6 CSJ Global, Inc. +00:21:C1 ABB Oy / Medium Voltage Products +00:21:B4 APRO MEDIA CO., LTD +00:21:AE ALCATEL-LUCENT FRANCE - WTD +00:21:A2 EKE-Electronics Ltd. +00:21:A7 Hantle System Co., Ltd. +00:22:1F eSang Technologies Co., Ltd. +00:22:26 Avaak, Inc. +00:22:1A Audio Precision +00:22:13 PCI CORPORATION +00:22:0D Cisco Systems, Inc +00:22:0C Cisco Systems, Inc +00:22:07 Inteno Broadband Technology AB +00:22:02 Excito Elektronik i Skåne AB +00:21:F9 WIRECOM Technologies +00:1F:40 Speakercraft Inc. +00:1F:38 POSITRON +00:1F:3D Qbit GmbH +00:1F:37 Genesis I&C +00:1F:2A ACCM +00:1F:31 Radiocomp +00:1F:25 MBS GmbH +00:1F:1E Astec Technology Co., Ltd +00:1F:17 IDX Company, Ltd. +00:1F:18 Hakusan.Mfg.Co,.Ltd +00:1E:61 ITEC GmbH +00:1E:5C RB GeneralEkonomik +00:1E:5B Unitron Company, Inc. +00:1E:55 COWON SYSTEMS,Inc. +00:1E:4E DAKO EDV-Ingenieur- und Systemhaus GmbH +00:1E:49 Cisco Systems, Inc +00:1E:44 SANTEC +00:1E:3F TrellisWare Technologies, Inc. +00:1E:38 Bluecard Software Technology Co., Ltd. +00:1E:31 INFOMARK CO.,LTD. +00:1E:32 Zensys +00:1E:2C CyVerse Corporation +00:1E:20 Intertain Inc. +00:1E:19 GTRI +00:1E:0F Briot International +00:1E:E4 ACS Solutions France +00:1E:EB Talk-A-Phone Co. +00:1E:DF Master Industrialization Center Kista +00:1E:DA Wesemann Elektrotechniek B.V. +00:1E:D5 Tekon-Automatics +00:1E:CE BISA Technologies (Hong Kong) Limited +00:1E:C8 Rapid Mobile (Pty) Ltd +00:1E:BB BLUELIGHT TECHNOLOGY INC. +00:1E:B6 TAG Heuer SA +00:1E:B5 Ever Sparkle Technologies Ltd +00:1E:AF Ophir Optronics Ltd +00:1E:AA E-Senza Technologies GmbH +00:1E:9D Recall Technologies, Inc. +00:1E:98 GreenLine Communications +00:1E:97 Medium Link System Technology CO., LTD, +00:1E:91 KIMIN Electronic Co., Ltd. +00:1E:8A eCopy, Inc +00:1E:85 Lagotek Corporation +00:1E:78 Owitek Technology Ltd., +00:1E:6D IT R&D Center +00:1E:6E Shenzhen First Mile Communications Ltd +00:1F:71 xG Technology, Inc. +00:1F:72 QingDao Hiphone Technology Co,.Ltd +00:1F:76 AirLogic Systems Inc. +00:1F:6C Cisco Systems, Inc +00:1F:60 COMPASS SYSTEMS CORP. +00:1F:65 KOREA ELECTRIC TERMINAL CO., LTD. +00:1F:5F Blatand GmbH +00:1F:59 Kronback Tracers +00:1F:4D Segnetics LLC +00:1F:52 UVT Unternehmensberatung fur Verkehr und Technik GmbH +00:1F:03 NUM AG +00:1E:FE LEVEL s.r.o. +00:1F:04 Granch Ltd. +00:1E:F2 Micro Motion Inc +00:1E:F7 Cisco Systems, Inc +00:1E:F1 Servimat +00:1F:9E Cisco Systems, Inc +00:1F:92 VideoIQ, Inc. +00:1F:97 BERTANA srl +00:1F:8B Cache IQ +00:1F:84 Gigle Semiconductor +00:1F:7F Phabrix Limited +00:1C:FF Napera Networks Inc +00:1C:F8 Parade Technologies, Ltd. +00:1C:F1 SUPoX Technology Co. , LTD. +00:1C:F2 Tenlon Technology Co.,Ltd. +00:1C:EC Mobilesoft (Aust.) Pty Ltd +00:1C:E7 Rocon PLC Research Centre +00:1C:E2 Attero Tech, LLC. +00:1C:DB CARPOINT CO.,LTD +00:1C:D5 ZeeVee, Inc. +00:1C:CF LIMETEK +00:1E:08 Centec Networks Inc +00:1E:03 LiComm Co., Ltd. +00:1D:FC KSIC +00:1D:F5 Sunshine Co,LTD +00:1D:F0 Vidient Systems, Inc. +00:1D:DC HangZhou DeChangLong Tech&Info Co.,Ltd +00:1D:E4 Visioneered Image Systems +00:1D:E2 Radionor Communications +00:1C:C8 INDUSTRONIC Industrie-Electronic GmbH & Co. KG +00:1C:BC CastGrabber, LLC +00:1C:B2 BPT SPA +00:1C:A6 Win4NET +00:1C:AB Meyer Sound Laboratories, Inc. +00:1C:AC Qniq Technology Corp. +00:1C:A1 AKAMAI TECHNOLOGIES, INC. +00:1C:95 Opticomm Corporation +00:1C:90 Empacket Corporation +00:1C:8F Advanced Electronic Design, Inc. +00:1C:89 Force Communications, Inc. +00:1C:7F Check Point Software Technologies +00:1C:75 Segnet Ltd. +00:1C:6E Newbury Networks, Inc. +00:1C:69 Packet Vision Ltd +00:1D:A5 WB Electronics +00:1D:A6 Media Numerics Limited +00:1D:A0 Heng Yu Electronic Manufacturing Company Limited +00:1D:99 Cyan Optic, Inc. +00:1D:94 Climax Technology Co., Ltd +00:1D:93 Modacom +00:1D:8D Raytek GmbH +00:1D:86 Shinwa Industries(China) Ltd. +00:1D:C9 GainSpan Corp. +00:1D:C2 XORTEC OY +00:1D:BD Versamed Inc. +00:1D:B6 BestComm Networks, Inc. +00:1D:B0 FuJian HengTong Information Technology Co.,Ltd +00:1D:AC Gigamon Systems LLC +00:1D:81 GUANGZHOU GATEWAY ELECTRONICS CO., LTD +00:1D:69 Knorr-Bremse IT-Services GmbH +00:1D:70 Cisco Systems, Inc +00:1D:77 NSGate +00:1D:7C ABE Elettronica S.p.A. +00:1D:64 Adam Communications Systems Int Ltd +00:1D:5D Control Dynamics Pty. Ltd. +00:1D:2E Ruckus Wireless +00:1D:21 Alcad SL +00:1D:1C Gennet s.a. +00:1D:17 Digital Sky Corporation +00:1D:12 ROHM CO., LTD. +00:1D:11 Analogue & Micro Ltd +00:1D:0B Power Standards Lab +00:1D:04 Zipit Wireless, Inc. +00:1D:58 CQ Inc +00:1D:57 CAETEC Messtechnik +00:1D:51 Babcock & Wilcox Power Generation Group, Inc +00:1D:47 Covote GmbH & Co KG +00:1D:40 Intel – GE Care Innovations LLC +00:1D:34 SYRIS Technology Corp +00:1D:2D Pylone, Inc. +00:1B:2A Cisco Systems, Inc +00:1B:1D Phoenix International Co., Ltd +00:1B:22 Palit Microsystems ( H.K.) Ltd. +00:1B:1B Siemens AG, +00:1B:16 Celtro Ltd. +00:1B:0A Intelligent Distributed Controls Ltd +00:1B:0F Petratec +00:1A:FE SOFACREAL +00:1B:03 Action Technology (SZ) Co., Ltd +00:1B:68 Modnnet Co., Ltd +00:1B:62 JHT Optoelectronics Co.,Ltd. +00:1B:61 Digital Acoustics, LLC +00:1B:5C Azuretec Co., Ltd. +00:1B:55 Hurco Automation Ltd. +00:1B:50 Nizhny Novgorod Factory named after M.Frunze, FSUE (NZiF) +00:1B:44 SanDisk Corporation +00:1B:49 Roberts Radio limited +00:1B:42 Wise & Blue +00:1B:3D EuroTel Spa +00:1B:36 Tsubata Engineering Co.,Ltd. (Head Office) +00:1B:31 Neural Image. Co. Ltd. +00:1C:56 Pado Systems, Inc. +00:1C:5B Chubb Electronic Security Systems Ltd +00:1C:5D Leica Microsystems +00:1C:5C Integrated Medical Systems, Inc. +00:1C:51 Celeno Communications +00:1C:52 VISIONEE SRL +00:1C:45 Chenbro Micom Co., Ltd. +00:1C:4C Petrotest Instruments +00:1C:39 S Netsystems Inc. +00:1C:40 VDG-Security bv +00:1C:32 Telian Corporation +00:1A:C7 UNIPOINT +00:1A:C2 YEC Co.,Ltd. +00:1A:B8 Anseri Corporation +00:1A:BD Impatica Inc. +00:1A:B1 Asia Pacific Satellite Industries Co., Ltd. +00:1B:8C JMicron Technology Corp. +00:1B:91 EFKON AG +00:1B:87 Deepsound Tech. Co., Ltd +00:1B:82 Taiwan Semiconductor Co., Ltd. +00:1B:7B The Tintometer Ltd +00:1B:74 MiraLink Corporation +00:1B:6F Teletrak Ltd +00:1A:FC ModusLink Corporation +00:1A:F2 Dynavisions Schweiz AG +00:1A:F7 dataschalt e+a GmbH +00:1A:ED INCOTEC GmbH +00:1A:DF Interactivetv Pty Limited +00:1A:E1 EDGE ACCESS INC +00:1A:E6 Atlanta Advanced Communications Holdings Limited +00:1A:D3 Vamp Ltd. +00:1A:DA Biz-2-Me Inc. +00:1A:CE YUPITERU CORPORATION +00:1B:C8 MIURA CO.,LTD +00:1B:C1 HOLUX Technology, Inc. +00:1B:B7 Alta Heights Technology Corp. +00:1B:AB Telchemy, Incorporated +00:1B:B0 BHARAT ELECTRONICS +00:1B:A4 S.A.E Afikim +00:1B:9F Calyptech Pty Ltd +00:1B:9D Novus Security Sp. z o.o. +00:1B:F6 CONWISE Technology Corporation Ltd. +00:1B:F1 Nanjing SilverNet Software Co., Ltd. +00:1B:EC Netio Technologies Co., Ltd +00:1B:E7 Postek Electronics Co., Ltd. +00:1B:E0 TELENOT ELECTRONIC GmbH +00:1B:D9 Edgewater Computer Systems +00:1B:DB Valeo VECS +00:1B:D4 Cisco Systems, Inc +00:1B:CD DAVISCOMMS (S) PTE LTD +00:1C:2D FlexRadio Systems +00:1C:1C Center Communication Systems GmbH +00:1C:21 Nucsafe Inc. +00:1C:20 CLB Benelux +00:1C:15 iPhotonix LLC +00:1C:16 ThyssenKrupp Elevator +00:1C:10 Cisco-Linksys, LLC +00:1C:09 SAE Electronic Co.,Ltd. +00:1C:04 Airgain, Inc. +00:1B:FD Dignsys Inc. +00:19:2B Aclara RF Systems Inc. +00:19:30 Cisco Systems, Inc +00:19:1F Microlink communications Inc. +00:19:24 LBNL Engineering +00:19:11 Just In Mobile Information Technologies (Shanghai) Co., Ltd. +00:19:18 Interactive Wear AG +00:19:0C Encore Electronics, Inc. +00:19:00 Intelliverese - DBA Voicecom +00:19:05 SCHRACK Seconet AG +00:18:F4 EO TECHNICS Co., Ltd. +00:18:F6 Thomson Telecom Belgium +00:18:FB Compro Technology +00:19:EE CARLO GAVAZZI CONTROLS SPA-Controls Division +00:19:F0 UNIONMAN TECHNOLOGY CO.,LTD +00:19:F5 Imagination Technologies Ltd +00:19:E9 S-Information Technolgy, Co., Ltd. +00:19:DB MICRO-STAR INTERNATIONAL CO., LTD. +00:19:DD FEI-Zyfer, Inc. +00:19:CA Broadata Communications, Inc +00:19:CF SALICRU, S.A. +00:19:D6 LS Cable and System Ltd. +00:19:B4 Intellio Ltd +00:1A:6E Impro Technologies +00:1A:67 Infinite QL Sdn Bhd +00:1A:69 Wuhan Yangtze Optical Technology CO.,Ltd. +00:1A:62 Data Robotics, Incorporated +00:1A:58 CCV Deutschland GmbH - Celectronic eHealth Div. +00:1A:5D Mobinnova Corp. +00:1A:4C Crossbow Technology, Inc +00:1A:51 Alfred Mann Foundation +00:1A:AA Analogic Corp. +00:1A:A1 Cisco Systems, Inc +00:1A:9C RightHand Technologies, Inc. +00:1A:8B CHUNIL ELECTRIC IND., CO. +00:1A:95 Hisense Mobile Communications Technoligy Co.,Ltd. +00:1A:84 V One Multimedia Pte Ltd +00:19:A1 LG INFORMATION & COMM. +00:19:AD BOBST SA +00:19:B2 XYnetsoft Co.,Ltd +00:19:9A EDO-EVI +00:19:9F DKT A/S +00:19:95 Jurong Hi-Tech (Suzhou)Co.ltd +00:19:90 ELM DATA Co., Ltd. +00:19:89 Sonitrol Corporation +00:1A:3E Faster Technology LLC +00:1A:40 A-FOUR TECH CO., LTD. +00:1A:2D The Navvo Group +00:1A:32 ACTIVA MULTIMEDIA +00:1A:39 Merten GmbH&CoKG +00:1A:28 ASWT Co., LTD. Taiwan Branch H.K. +00:1A:1C GT&T Engineering Pte Ltd +00:1A:23 Ice Qube, Inc +00:1A:15 gemalto e-Payment +00:1A:10 LUCENT TRANS ELECTRONICS CO.,LTD +00:1A:09 Wayfarer Transit Systems Ltd +00:1A:02 SECURE CARE PRODUCTS, INC +00:1A:04 Interay Solutions BV +00:19:84 ESTIC Corporation +00:19:76 Xipher Technologies, LLC +00:19:78 Datum Systems, Inc. +00:19:6A MikroM GmbH +00:19:71 Guangzhou Unicomp Technology Co.,Ltd +00:19:65 YuHua TelTech (ShangHai) Co., Ltd. +00:19:60 DoCoMo Systems, Inc. +00:19:54 Leaf Corporation. +00:19:59 Staccato Communications Inc. +00:19:4D Avago Technologies Sdn Bhd +00:19:48 AireSpider Networks +00:19:41 Pitney Bowes, Inc +00:19:35 DUERR DENTAL AG +00:19:3A OESOLUTIONS +00:19:3C HighPoint Technologies Incorporated +00:17:73 Laketune Technologies Co. Ltd +00:17:78 Central Music Co. +00:17:7A ASSA ABLOY AB +00:17:6F PAX Computer Technology(Shenzhen) Ltd. +00:17:6A Avago Technologies +00:17:63 Essentia S.p.A. +00:17:5E Zed-3 +00:17:50 GSI Group, MicroE Systems +00:17:52 DAGS, Inc +00:17:57 RIX TECHNOLOGY LIMITED +00:18:3D Vertex Link Corporation +00:18:44 Heads Up Technologies, Inc. +00:18:38 PanAccess Communications,Inc. +00:18:27 NEC UNIFIED SOLUTIONS NEDERLAND B.V. +00:18:2C Ascend Networks, Inc. +00:18:1B TaiJin Metal Co., Ltd. +00:18:14 Mitutoyo Corporation +00:18:19 Cisco Systems, Inc +00:18:20 w5networks +00:18:08 SightLogix, Inc. +00:18:0D Terabytes Server Storage Tech Corp +00:18:03 ArcSoft Shanghai Co. LTD +00:17:F0 SZCOM Broadband Network Technology Co.,Ltd +00:17:F7 CEM Solutions Pvt Ltd +00:17:FE TALOS SYSTEM INC. +00:17:D8 Magnum Semiconductor, Inc. +00:17:DD Clipsal Australia +00:17:DF Cisco Systems, Inc +00:18:C6 OPW Fuel Management Systems +00:18:CB Tecobest Technology Limited +00:18:BF Essence Technology Solution, Inc. +00:18:BA Cisco Systems, Inc +00:18:B8 New Voice International AG +00:18:B3 TEC WizHome Co., Ltd. +00:18:AC Shanghai Jiao Da HISYS Technology Co. Ltd. +00:18:A5 ADigit Technologies Corp. +00:18:A7 Yoggie Security Systems LTD. +00:18:96 Great Well Electronic LTD +00:18:9B Thomson Inc. +00:17:9E Sirit Inc +00:17:A3 MIX s.r.l. +00:17:A8 EDM Corporation +00:17:92 Falcom Wireless Comunications Gmbh +00:17:97 Telsy Elettronica S.p.A. +00:17:99 SmarTire Systems Inc. +00:17:8B Teledyne Technologies Incorporated +00:17:7F Worldsmart Retech +00:17:86 wisembed +00:18:77 Amplex A/S +00:18:6B Sambu Communics CO., LTD. +00:18:70 E28 Shanghai Limited +00:18:63 Veritech Electronics Limited +00:18:50 Secfone Kft +00:18:55 Aeromaritime Systembau GmbH +00:18:57 Unilever R&D +00:18:49 Pigeon Point Systems LLC +00:17:C7 MARA Systems Consulting AB +00:17:CE Screen Service Spa +00:17:D3 Etymotic Research, Inc. +00:17:BB Syrinx Industrial Electronics +00:17:B4 Remote Security Systems, LLC +00:17:B6 Aquantia +00:17:AF Enermet +00:18:E8 Hacetron Corporation +00:18:EF Escape Communications, Inc. +00:18:E3 Visualgate Systems, Inc. +00:18:DC Prostar Co., Ltd. +00:18:E1 Verkerk Service Systemen +00:18:D0 AtRoad, A Trimble Company +00:18:D5 REIGNCOM +00:18:A0 Cierma Ascenseurs +00:18:83 FORMOSA21 INC. +00:18:8A Infinova LLC +00:18:8F Montgomery Technology, Inc. +00:18:7C INTERCROSS, LLC +00:18:7E RGB Spectrum +00:16:4A Vibration Technology Limited +00:16:44 LITE-ON Technology Corp. +00:16:45 Power Distribution, Inc. +00:16:3B VertexRSI/General Dynamics +00:16:40 Asmobile Communication Inc. +00:16:3A YVES TECHNOLOGY CO., LTD. +00:16:34 Mathtech, Inc. +00:16:2D STNet Co., Ltd. +00:16:28 Ultra Electronics Manufacturing and Card Systems +00:16:21 Colorado Vnet +00:16:1A Dametric AB +00:16:15 Nittan Company, Limited +00:16:C4 SiRF Technology, Inc. +00:16:C6 North Atlantic Industries +00:16:D2 Caspian +00:16:BF PaloDEx Group Oy +00:16:B3 Photonicbridges (China) Co., Ltd. +00:16:AC Toho Technology Corp. +00:16:B1 KBS +00:16:A7 AWETA G&P +00:17:24 Studer Professional Audio GmbH +00:17:18 Vansco Electronics Oy +00:17:1D DIGIT +00:17:11 GE Healthcare Bio-Sciences AB +00:17:0C Twig Com Ltd. +00:17:07 InGrid, Inc +00:17:02 Osung Midicom Co., Ltd +00:17:44 Araneo Ltd. +00:17:3C Extreme Engineering Solutions +00:17:37 Industrie Dial Face S.p.A. +00:17:2B Global Technologies Inc. +00:17:30 Automation Electronics +00:17:29 Ubicod Co.LTD +00:16:9B Alstom Transport +00:16:A2 CentraLite Systems, Inc. +00:16:96 QDI Technology (H.K.) Limited +00:16:88 ServerEngines LLC +00:16:8A id-Confirm Inc +00:16:83 WEBIO International Co.,.Ltd. +00:16:7C iRex Technologies BV +00:16:10 Carina Technology +00:16:0B TVWorks LLC +00:16:04 Sigpro +00:15:FE SCHILLING ROBOTICS LLC +00:15:FD Complete Media Systems +00:15:FF Novatel Wireless, Inc. +00:15:F8 Kingtronics Industrial Co. Ltd. +00:15:EC Boca Devices LLC +00:15:F1 KYLINK Communications Corp. +00:16:77 Bihl + Wiedemann GmbH +00:16:70 SKNET Corporation +00:16:64 Prod-El SpA +00:16:69 MRV Communication (Networks) LTD +00:16:5D AirDefense, Inc. +00:16:51 Exeo Systems +00:15:E5 Cheertek Inc. +00:15:DB Canesta Inc. +00:15:D4 Emitor AB +00:15:C8 FlexiPanel Ltd +00:15:C3 Ruf Telematik AG +00:15:C2 3M Germany +00:15:BE Iqua Ltd. +00:16:EF Koko Fitness, Inc. +00:16:F4 Eidicom Co., Ltd. +00:16:E8 Sigma Designs, Inc. +00:16:ED Digital Safety Technologies, Inc +00:16:DC ARCHOS +00:16:E1 SiliconStor, Inc. +00:16:D7 Sunways AG +00:14:CB LifeSync Corporation +00:14:D0 BTI Systems Inc. +00:14:C4 Vitelcom Mobile Technology +00:14:BE Wink communication technology CO.LTD +00:14:BD incNETWORKS, Inc +00:14:B8 Hill-Rom +00:14:AE Wizlogics Co., Ltd. +00:14:B3 CoreStar International Corp +00:14:9B Nokota Communications, LLC +00:14:3F Hotway Technology Corporation +00:14:31 PDL Electronics Ltd +00:14:33 Empower Technologies(Canada) Inc. +00:14:32 Tarallax Wireless, Inc. +00:14:2C Koncept International, Inc. +00:14:25 Galactic Computing Corp. +00:14:20 G-Links networking company +00:14:1B Cisco Systems, Inc +00:14:6D RF Technologies +00:14:6F Kohler Co +00:14:6E H. Stoll GmbH & Co. KG +00:14:68 CelPlan International, Inc. +00:14:61 CORONA CORPORATION +00:14:5C Intronics B.V. +00:14:55 Coder Electronics Corporation +00:14:44 Grundfos Holding +00:14:4B Hifn, Inc. +00:15:89 D-MAX Technology Co.,Ltd +00:15:82 Pulse Eight Limited +00:15:7C Dave Networks, Inc. +00:15:78 Audio / Video Innovations +00:15:73 NewSoft Technology Corporation +00:15:6C SANE SYSTEM CO., LTD +00:15:71 Nolan Systems +00:15:72 Red-Lemon +00:15:65 XIAMEN YEALINK NETWORK TECHNOLOGY CO.,LTD +00:15:59 Securaplane Technologies, Inc. +00:14:A2 Core Micro Systems Inc. +00:14:94 ESU AG +00:14:8F Protronic (Far East) Ltd. +00:14:88 Akorri +00:14:83 eXS Inc. +00:14:80 Hitachi-LG Data Storage Korea, Inc +00:14:7B Iteris, Inc. +00:14:74 K40 Electronics +00:15:B8 Tahoe +00:15:B2 Advanced Industrial Computer, Inc. +00:15:AE kyung il +00:15:AD Accedian Networks +00:E0:A8 SAT GmbH & Co. +00:15:A1 ECA-SINTERS +00:15:9C B-KYUNG SYSTEM Co.,Ltd. +00:15:95 Quester Tangent Corporation +00:15:8E Plustek.INC +00:15:52 Wi-Gear Inc. +00:15:48 CUBE TECHNOLOGIES +00:15:4D Netronome Systems, Inc. +00:15:3C Kprotech Co., Ltd. +00:15:43 Aberdeen Test Center +00:15:35 OTE Spa +00:15:37 Ventus Networks +00:15:36 Powertech co.,Ltd +00:15:30 EMC Corporation +00:15:29 N3 Corporation +00:14:F9 Vantage Controls +00:14:FB Technical Solutions Inc. +00:14:FA AsGa S.A. +00:14:F4 DekTec Digital Video B.V. +00:14:ED Airak, Inc. +00:14:DE Sage Instruments Inc. +00:14:E3 mm-lab GmbH +00:14:D7 Datastore Technology Corp +00:15:24 Numatics, Inc. +00:15:1D M2I CORPORATION +00:15:13 EFS sas +00:15:07 Renaissance Learning Inc +00:12:9E Surf Communications Inc. +00:12:97 O2Micro, Inc. +00:12:98 MICO ELECTRIC(SHENZHEN) LIMITED +00:12:8D STB Datenservice GmbH +00:12:8E Q-Free ASA +00:12:92 Griffin Technology +00:12:7C SWEGON AB +00:12:81 March Networks S.p.A. +00:12:7B VIA Networking Technologies, Inc. +00:13:27 Data Acquisitions limited +00:13:1D Scanvaegt International A/S +00:13:22 DAQ Electronics, Inc. +00:13:16 L-S-B Broadcast Technologies GmbH +00:13:0F EGEMEN Bilgisayar Muh San ve Tic LTD STI +00:12:F7 Xiamen Xinglian Electronics Co., Ltd. +00:12:FE Lenovo Mobile Communication Technology Ltd. +00:13:03 GateConnect +00:12:FD OPTIMUS IC S.A. +00:14:0F Federal State Unitary Enterprise Leningrad R&D Institute of +00:14:16 Scosche Industries, Inc. +00:14:06 Go Networks +00:14:07 Sperian Protection Instrumentation +00:14:0C GKB CCTV CO., LTD. +00:13:FF Dage-MTI of MC, Inc. +00:14:00 MINERVA KOREA CO., LTD +00:13:FA LifeSize Communications, Inc +00:13:F3 Giga-byte Communications Inc. +00:13:EE JBX Designs Inc. +00:13:ED PSIA +00:13:5A Project T&E Limited +00:13:5F Cisco Systems, Inc +00:13:60 Cisco Systems, Inc +00:13:52 Naztec, Inc. +00:13:4B ToGoldenNet Technology Inc. +00:13:4C YDT Technology International +00:13:3A VadaTech Inc. +00:13:3F Eppendorf Instrumente GmbH +00:13:2C MAZ Brandenburg GmbH +00:13:39 CCV Deutschland GmbH +00:13:AD Sendo Ltd +00:13:B4 Appear TV +00:13:A8 Tanisys Technology +00:13:A7 BATTELLE MEMORIAL INSTITUTE +00:13:A1 Crow Electronic Engeneering +00:13:9A K-ubique ID Corp. +00:13:95 congatec AG +00:13:8E FOAB Elektronik AB +00:13:88 WiMedia Alliance +00:13:E4 YANGJAE SYSTEMS CORP. +00:13:E9 VeriWave, Inc. +00:13:E3 CoVi Technologies, Inc. +00:13:DD Abbott Diagnostics +00:13:D6 TII NETWORK TECHNOLOGIES, INC. +00:13:D1 KIRK telecom A/S +00:13:CA Pico Digital +00:13:C3 Cisco Systems, Inc +00:13:C4 Cisco Systems, Inc +00:13:BA ReadyLinks Inc +00:13:BE Virtual Conexions +00:13:B9 BM SPA +00:12:F3 connectBlue AB +00:12:ED AVG Advanced Technologies +00:12:E6 SPECTEC COMPUTER CO., LTD. +00:12:E1 Alliant Networks, Inc +00:12:D3 Zetta Systems, Inc. +00:12:DA Cisco Systems, Inc +00:12:D4 Princeton Technology, Ltd +00:12:C7 SECURAY Technologies Ltd.Co. +00:12:CE Advanced Cybernetics Group +00:12:C2 Apex Electronics Factory +00:12:C1 Check Point Software Technologies +00:12:B8 G2 Microsystems +00:12:BD Avantec Manufacturing Limited +00:12:B7 PTW Freiburg +00:12:B1 Dai Nippon Printing Co., Ltd +00:12:A5 Stargen, Inc. +00:12:AA IEE, Inc. +00:13:79 PONDER INFORMATION INDUSTRIES LTD. +00:13:80 Cisco Systems, Inc +00:13:85 Add-On Technology Co., LTD. +00:13:7F Cisco Systems, Inc +00:13:6D Tentaculus AB +00:13:66 Neturity Technologies Inc. +00:12:58 Activis Polska +00:12:51 SILINK +00:12:52 Citronix, LLC +00:12:45 Zellweger Analytics, Inc. +00:12:4C BBWM Corporation +00:12:39 S Net Systems Inc. +00:12:40 AMOI ELECTRONICS CO.,LTD +00:12:2D SiNett Corporation +00:12:32 LeWiz Communications Inc. +00:11:C5 TEN Technology +00:11:C8 Powercom Co., Ltd. +00:11:CD Axsun Technologies +00:11:C6 Seagate Technology +00:11:B4 Westermo Teleindustri AB +00:11:B9 Inner Range Pty. Ltd. +00:11:C0 Aday Technology Inc +00:11:B3 YOSHIMIYA CO.,LTD. +00:11:AD Shanghai Ruijie Technology +00:11:38 TAISHIN CO., LTD. +00:11:3F Alcatel DI +00:11:33 Siemens Austria SIMEA +00:11:32 Synology Incorporated +00:11:29 Paradise Datacom Ltd. +00:11:2E CEICOM +00:11:28 Streamit +00:11:1B Targa Systems Div L-3 Communications Canada +00:11:22 CIMSYS Inc +00:11:71 DEXTER Communications, Inc. +00:11:6A Domo Ltd +00:11:60 ARTDIO Company Co., LTD +00:11:54 Webpro Technologies Inc. +00:11:4B Francotyp-Postalia GmbH +00:11:45 ValuePoint Networks +00:11:A1 VISION NETWARE CO.,LTD +00:11:A6 Sypixx Networks +00:11:9A Alkeria srl +00:11:90 Digital Design Corporation +00:11:8A Viewtran Technology Limited +00:11:94 Chi Mei Communication Systems, Inc. +00:11:89 Aerotech Inc +00:11:84 Humo Laboratory,Ltd. +00:11:7D ZMD America, Inc. +00:11:78 Chiron Technology Ltd +00:11:77 Coaxial Networks, Inc. +00:12:23 Pixim +00:12:28 Data Ltd. +00:12:10 WideRay Corp +00:12:15 iStor Networks, Inc. +00:12:16 ICP Internet Communication Payment AG +00:12:09 Fastrax Ltd +00:12:04 u10 Networks, Inc. +00:11:FD KORG INC. +00:12:03 ActivNetworks +00:11:F3 NeoMedia Europe AG +00:11:E7 WORLDSAT - Texas de France +00:11:EC AVIX INC. +00:11:E0 U-MEDIA Communications, Inc. +00:11:DA Vivaas Technology Inc. +00:11:D4 NetEnrich, Inc +00:11:D9 TiVo +00:11:1C Pleora Technologies Inc. +00:11:0F netplat,Inc. +00:11:16 COTEAU VERT CO., LTD. +00:11:09 Micro-Star International +00:11:03 kawamura electric inc. +00:0F:FD Glorytek Network Inc. +00:0F:EE XTec, Incorporated +00:0F:F4 Guntermann & Drunck GmbH +00:12:75 Sentilla Corporation +00:12:6E Seidel Elektronik GmbH Nfg.KG +00:12:69 Value Electronics +00:12:5C Green Hills Software, Inc. +00:0F:15 Kjaerulff1 A/S +00:0F:1A Gaming Support B.V. +00:0F:0E WaveSplitter Technologies, Inc. +00:0F:08 Indagon Oy +00:0F:07 Mangrove Systems, Inc. +00:0F:02 Digicube Technology Co., Ltd +00:0E:FB Macey Enterprises +00:0E:F5 iPAC Technology Co., Ltd. +00:0E:F6 E-TEN Information Systems Co., Ltd. +00:0E:8A Avara Technologies Pty. Ltd. +00:0E:83 Cisco Systems, Inc +00:0E:73 Tpack A/S +00:0E:7D Electronics Line 3000 Ltd. +00:0E:77 Decru, Inc. +00:0E:7E ionSign Oy +00:0E:6F IRIS Corporation Berhad +00:0E:6A 3Com Ltd +00:0E:69 China Electric Power Research Institute +00:0E:63 Lemke Diagnostics GmbH +00:0E:BC Paragon Fidelity GmbH +00:0E:B0 Solutions Radio BV +00:0E:B5 Ecastle Electronics Co., Ltd. +00:0E:AF CASTEL +00:0E:A9 Shanghai Xun Shi Communications Equipment Ltd. Co. +00:0E:9D Tiscali UK Ltd +00:0E:A2 McAfee, Inc +00:0E:90 PONICO CORP. +00:0E:8F Sercomm Corp. +00:0E:96 Cubic Defense Applications, Inc. +00:0F:4E Cellink +00:0F:41 Zipher Ltd +00:0F:48 Polypix Inc. +00:0F:4D TalkSwitch +00:0F:39 IRIS SENSORS +00:0F:3C Endeleo Limited +00:0F:34 Cisco Systems, Inc +00:0F:2D CHUNG-HSIN ELECTRIC & MACHINERY MFG.CORP. +00:0F:27 TEAL Electronics, Inc. +00:0F:28 Itronix Corporation +00:0F:21 Scientific Atlanta, Inc +00:0E:EF Private +00:0E:DC Tellion INC. +00:0E:E3 Chiyu Technology Co.,Ltd +00:0E:C8 Zoran Corporation +00:0E:CF PROFIBUS Nutzerorganisation e.V. +00:0E:D4 CRESITT INDUSTRIE +00:0E:C2 Lowrance Electronics, Inc. +00:0E:C1 MYNAH Technologies +00:0F:92 Microhard Systems Inc. +00:0F:99 APAC opto Electronics Inc. +00:0F:8D FAST TV-Server AG +00:0F:80 Trinity Security Systems,Inc. +00:0F:7F UBSTORAGE Co.,Ltd. +00:0F:C2 Uniwell Corporation +00:0F:C9 Allnet GmbH +00:0F:BC Onkey Technologies, Inc. +00:0F:BB Nokia Siemens Networks GmbH & Co. KG. +00:0F:B6 Europlex Technologies +00:0F:A9 PC Fabrik +00:0F:AA Nexus Technologies +00:0F:AF Dialog Inc. +00:0F:E8 Lobos, Inc. +00:0F:ED Anam Electronics Co., Ltd +00:0F:DC Ueda Japan Radio Co., Ltd. +00:0F:E1 ID DIGITAL CORPORATION +00:0F:D5 Schwechat - RISE +00:0F:CE Kikusui Electronics Corp. +00:0F:73 RS Automation Co., Ltd +00:0F:7A BeiJing NuQX Technology CO.,LTD +00:0F:6D Midas Engineering +00:0F:67 West Instruments +00:0F:6E BBox +00:0F:60 Lifetron Co.,Ltd +00:0F:5B Delta Information Systems, Inc. +00:0F:54 Entrelogic Corporation +00:0D:75 Kobian Pte Ltd - Taiwan Branch +00:0D:7C Codian Ltd +00:0D:6F Ember Corporation +00:0D:69 TMT&D Corporation +00:0D:70 Datamax Corporation +00:0D:5D Raritan Computer, Inc +00:0D:62 Funkwerk Dabendorf GmbH +00:0D:50 Galazar Networks +00:0D:4A Steag ETA-Optik +00:0D:AB Parker Hannifin GmbH Electromechanical Division Europe +00:0D:A7 Private +00:0D:A1 MIRAE ITS Co.,LTD. +00:0D:A2 Infrant Technologies, Inc. +00:0D:9B Heraeus Electro-Nite International N.V. +00:0D:8F King Tsushin Kogyo Co., LTD. +00:0D:94 AFAR Communications,Inc +00:0D:82 PHS srl +00:0D:81 Pepperl+Fuchs GmbH +00:0D:CE Dynavac Technology Pte Ltd +00:0D:C8 AirMagnet, Inc +00:0D:C2 Private +00:0D:C7 COSMIC ENGINEERING INC. +00:0D:BB Nippon Dentsu Co.,Ltd. +00:0D:B5 GLOBALSAT TECHNOLOGY CORPORATION +00:0D:AF Plexus Corp (UK) Ltd +00:0D:29 Cisco Systems, Inc +00:0D:23 Smart Solution, Inc +00:0D:17 Turbo Networks Co.Ltd +00:0D:1C Amesys Defense +00:0D:0A Projectiondesign as +00:0D:09 Yuehua(Zhuhai) Electronic CO. LTD +00:0D:10 Embedtronics Oy +00:0D:04 Foxboro Eckardt Development GmbH +00:0C:FD Hyundai ImageQuest Co.,Ltd. +00:0D:4F Kenwood Corporation +00:0D:46 Parker SSD Drives +00:0D:42 Newbest Development Limited +00:0D:3C i.Tech Dynamic Ltd +00:0D:36 Wu Han Routon Electronic Co., Ltd +00:0D:3B Microelectronics Technology Inc. +00:0D:2A Scanmatic AS +00:0D:2F AIN Comm.Tech.Co., LTD +00:0D:FA Micro Control Systems Ltd. +00:0D:F4 Watertek Co. +00:0D:F9 NDS Limited +00:0E:00 Atrie +00:0D:E7 Snap-on OEM Group +00:0D:E8 Nasaco Electronics Pte. Ltd +00:0D:ED Cisco Systems, Inc +00:0D:E1 Control Products, Inc. +00:0D:D5 O'RITE TECHNOLOGY CO.,LTD +00:0D:DA ALLIED TELESIS K.K. +00:0E:20 ACCESS Systems Americas, Inc. +00:0E:27 Crere Networks, Inc. +00:0E:14 Visionary Solutions, Inc. +00:0E:1B IAV GmbH +00:0E:57 Iworld Networking, Inc. +00:0E:50 Thomson Telecom Belgium +00:0E:4A Changchun Huayu WEBPAD Co.,LTD +00:0E:49 Forsway Scandinavia AB +00:0E:3D Televic N.V. +00:0E:44 Digital 5, Inc. +00:0E:33 Shuko Electronics Co.,Ltd +00:0E:3A Cirrus Logic +00:0E:2D Hyundai Digital Technology Co.,Ltd. +00:0C:EA aphona Kommunikationssysteme +00:0C:D9 Itcare Co., Ltd +00:0C:D3 Prettl Elektronik Radeberg GmbH +00:0C:DA FreeHand Systems, Inc. +00:0C:DF PULNiX America, Inc +00:0C:C7 Intelligent Computer Solutions Inc. +00:0C:CC Aeroscout Ltd. +00:0C:13 MediaQ +00:0C:05 RPA Reserch Co., Ltd. +00:0C:0C APPRO TECHNOLOGY INC. +00:0B:F4 Private +00:0B:F9 Gemstone Communications, Inc. +00:0C:00 BEB Industrie-Elektronik AG +00:0B:F3 BAE SYSTEMS +00:0C:63 Zenith Electronics Corporation +00:0C:68 SigmaTel, Inc. +00:0C:6F Amtek system co.,LTD. +00:0C:50 Seagate Technology +00:0C:55 Microlink Communications Inc. +00:0C:5C GTN Systems B.V. +00:0C:61 AC Tech corporation DBA Advanced Digital +00:0C:BA Jamex, Inc. +00:0C:B9 LEA +00:0C:C0 Genera Oy +00:0C:B4 AutoCell Laboratories, Inc. +00:0C:34 Vixen Co., Ltd. +00:0C:A2 Harmonic Video Network +00:0C:A7 Metro (Suzhou) Technologies Co., Ltd. +00:0C:A9 Ebtron Inc. +00:0C:AE Ailocom Oy +00:0C:42 Routerboard.com +00:0C:44 Automated Interfaces, Inc. +00:0C:39 Sentinel Wireless Inc. +00:0C:3B Orion Electric Co., Ltd. +00:0C:40 Altech Controls +00:0C:3A Oxance +00:0C:2F SeorimTechnology Co.,Ltd. +00:0C:31 Cisco Systems, Inc +00:0C:2A OCTTEL Communication Co., Ltd. +00:0C:27 Sammy Corporation +00:0C:18 Zenisu Keisoku Inc. +00:0C:20 Fi WIn, Inc. +00:0B:ED ELM Inc. +00:0B:F2 Chih-Kan Technology Co., Ltd. +00:0B:E1 Nokia NET Product Operations +00:0B:E6 Datel Electronics +00:0B:DA EyeCross Co.,Inc. +00:0B:D1 Aeronix, Inc. +00:0B:C5 SMC Networks, Inc. +00:0B:CC JUSAN, S.A. +00:0B:B9 Imsys AB +00:0B:BE Cisco Systems, Inc +00:0B:B2 SMALLBIG TECHNOLOGY +00:0B:B7 Micro Systems Co.,Ltd. +00:0C:96 OQO, Inc. +00:0C:9B EE Solutions, Inc +00:0C:8A Bose Corporation +00:0C:8F Nergal s.r.l. +00:0C:83 Logical Solutions +00:0C:88 Apache Micro Peripherals, Inc. +00:0C:74 RIVERTEC CORPORATION +00:0C:76 MICRO-STAR INTERNATIONAL CO., LTD. +00:0C:7B ALPHA PROJECT Co.,Ltd. +00:0B:85 Cisco Systems, Inc +00:0B:7F Align Engineering LLC +00:0B:84 BODET +00:0B:73 Kodeos Communications +00:0B:78 TAIFATECH INC. +00:0B:6C Sychip Inc. +00:0B:60 Cisco Systems, Inc +00:0B:65 Sy.A.C. srl +00:0B:57 Silicon Laboratories +00:0B:5C Newtech Co.,Ltd +00:0B:4F Verifone, INC. +00:0B:43 Microscan Systems, Inc. +00:0B:48 sofrel +00:0B:4A Visimetrics (UK) Ltd +00:0B:35 Quad Bit System co., Ltd. +00:0B:37 MANUFACTURE DES MONTRES ROLEX SA +00:0B:3C Cygnal Integrated Products, Inc. +00:0B:29 LS(LG) Industrial Systems co.,Ltd +00:0B:30 Beijing Gongye Science & Technology Co.,Ltd +00:0B:A1 SYSCOM Ltd. +00:0B:A8 HANBACK ELECTRONICS CO., LTD. +00:0B:92 Ascom Danmark A/S +00:0B:97 Matsushita Electric Industrial Co.,Ltd. +00:0B:9C TriBeam Technologies, Inc. +00:0B:8B KERAJET, S.A. +00:09:D6 KNC One GmbH +00:09:D5 Signal Communication, Inc. +00:09:DC Galaxis Technology AG +00:09:C9 BlueWINC Co., Ltd. +00:09:D0 Solacom Technologies Inc. +00:09:BC Digital Safety Technologies, Inc +00:09:C1 PROCES-DATA A/S +00:09:C4 Medicore Co., Ltd +00:09:8F Cetacean Networks +00:09:7D SecWell Networks Oy +00:09:7E IMI TECHNOLOGY CO., LTD +00:09:83 GlobalTop Technology, Inc. +00:09:70 Vibration Research Corporation +00:09:77 Brunner Elektronik AG +00:09:64 Hi-Techniques, Inc. +00:09:6B IBM Corp +00:09:57 Supercaller, Inc. +00:09:5C Philips Medical Systems - Cardiac and Monitoring Systems (CM +00:0A:E3 YANG MEI TECHNOLOGY CO., LTD +00:0A:EA ADAM ELEKTRONIK LTD. ŞTI +00:0A:DE Happy Communication Co., Ltd. +00:0A:D7 Origin ELECTRIC CO.,LTD. +00:0A:CB XPAK MSA Group +00:0A:D0 Niigata Develoment Center, F.I.T. Co., Ltd. +00:0A:D2 JEPICO Corporation +00:0A:BD Rupprecht & Patashnick Co. +00:0A:BF HIROTA SS +00:0A:C4 Daewoo Teletech Co., Ltd +00:0A:AC TerraTec Electronic GmbH +00:0A:B1 GENETEC Corporation +00:0A:B8 Cisco Systems, Inc +00:0A:A5 MAXLINK INDUSTRIES LIMITED +00:0A:8D EUROTHERM LIMITED +00:0A:9E BroadWeb Corportation +00:0A:A0 Cedar Point Communications +00:0A:98 M+F Gwinner GmbH & Co +00:0A:92 Presonus Corporation +00:0A:7E The Advantage Group +00:0A:85 PLAT'C2,Inc +00:0A:8A Cisco Systems, Inc +00:09:B5 3J Tech. Co., Ltd. +00:09:AF e-generis +00:09:B0 Onkyo Corporation +00:09:A9 Ikanos Communications +00:09:9D Haliplex Communications +00:09:A2 Interface Co., Ltd. +00:09:90 ACKSYS Communications & systems +00:09:96 RDI +00:09:8A EqualLogic Inc +00:0A:77 Bluewire Technologies LLC +00:0A:79 corega K.K +00:0A:72 STEC, INC. +00:0A:5F almedio inc. +00:0A:66 MITSUBISHI ELECTRIC SYSTEM & SERVICE CO.,LTD. +00:0A:6B Tadiran Telecom Business Systems LTD +00:0A:5A GreenNET Technologies Co.,Ltd. +00:0A:53 Intronics, Incorporated +00:0A:58 Freyer & Siegel Elektronik GmbH & Co. KG +00:0A:4C Molecular Devices Corporation +00:0B:24 AirLogic +00:0B:1D LayerZero Power Systems, Inc. +00:0B:16 Communication Machinery Corporation +00:0B:18 Private +00:0B:11 HIMEJI ABC TRADING CO.,LTD. +00:0B:0A dBm Optics +00:0B:05 Pacific Broadband Networks +00:0A:FE NovaPal Ltd +00:0B:03 Taekwang Industrial Co., Ltd +00:0A:EF OTRUM ASA +00:0A:F2 NeoAxiom Corp. +00:0A:05 Widax Corp. +00:0A:0A SUNIX Co., Ltd. +00:0A:0F Ilryung Telesys, Inc +00:09:FF X.net 2000 GmbH +00:09:FE Daisy Technologies, Inc. +00:0A:00 Mediatek Corp. +00:09:F6 Shenzhen Eastern Digital Tech Ltd. +00:09:F5 Emerson Network Power Co.,Ltd +00:09:E8 Cisco Systems, Inc +00:09:EF Vocera Communications +00:09:E3 Angel Iglesias S.A. +00:0A:39 LoPA Information Technology +00:0A:40 Crown Audio -- Harmanm International +00:0A:45 Audio-Technica Corp. +00:0A:47 Allied Vision Technologies +00:0A:34 Identicard Systems Incorporated +00:0A:2D Cabot Communications Limited +00:0A:22 Amperion Inc +00:0A:16 Lassen Research +00:0A:1B Stream Labs +00:08:78 Benchmark Storage Innovations +00:08:72 Sorenson Communications +00:08:7E Bon Electro-Telecom Inc. +00:08:6B MIPSYS +00:08:65 JASCOM CO., LTD +00:08:66 DSX Access Systems, Inc. +00:08:5F Picanol N.V. +00:08:59 ShenZhen Unitone Electronics Co., Ltd. +00:08:53 Schleicher GmbH & Co. Relaiswerke KG +00:08:58 Novatechnology Inc. +00:08:1D Ipsil, Incorporated +00:08:29 Aval Nagasaki Corporation +00:08:23 Texa Corp. +00:08:2A Powerwallz Network Security +00:08:17 EmergeCore Networks LLC +00:09:1E Firstech Technology Corp. +00:09:25 VSN Systemen BV +00:09:18 SAMSUNG TECHWIN CO.,LTD +00:09:17 WEM Technology Inc +00:09:12 Cisco Systems, Inc +00:09:0B MTL Instruments PLC +00:09:05 iTEC Technologies Ltd. +00:08:FF Trilogy Communications Ltd +00:09:06 Esteem Networks +00:08:FB SonoSite, Inc. +00:08:F2 C&S Technology +00:08:F7 Hitachi Ltd, Semiconductor & Integrated Circuits Gr +00:08:ED ST&T Instrument Corp. +00:07:D1 Spectrum Signal Processing Inc. +00:07:CE Cabletime Limited +00:07:C8 Brain21, Inc. +00:07:BC Identix Inc. +00:04:7C Skidata AG +00:07:BB Candera Inc. +00:07:C2 Netsys Telecom +00:07:B5 Any One Wireless Ltd. +00:07:AF Red Lion Controls, LP +00:07:A2 Opteon Corporation +00:07:A7 A-Z Inc. +00:07:A1 VIASYS Healthcare GmbH +00:07:A8 Haier Group Technologies Ltd. +00:09:4A Homenet Communications +00:09:49 Glyph Technologies Inc. +00:09:50 Independent Storage Corporation +00:09:44 Cisco Systems, Inc +00:09:3D Newisys,Inc. +00:09:37 Inventec Appliance Corp +00:09:31 Future Internet, Inc. +00:09:38 Allot Communications +00:09:2A MYTECS Co.,Ltd. +00:08:B1 ProQuent Systems +00:08:AB EnerLinx.com, Inc. +00:08:AC Eltromat GmbH +00:08:A5 Peninsula Systems Inc. +00:08:99 Netbind, Inc. +00:08:9E Beijing Enter-Net co.LTD +00:08:95 DIRC Technologie GmbH & Co.KG +00:08:91 Lyan Inc. +00:08:8B Tropic Networks Inc. +00:08:8A Minds@Work +00:08:85 EMS Dr. Thomas Wünsche +00:08:E8 Excel Master Ltd. +00:08:E7 SHI ControlSystems,Ltd. +00:08:E1 Barix AG +00:08:DA SofaWare Technologies Ltd. +00:08:D5 Vanguard Networks Solutions, LLC +00:08:CE IPMobileNet Inc. +00:08:C8 Soneticom, Inc. +00:08:C4 Hikari Co.,Ltd. +00:08:BE XENPAK MSA Group +00:08:B8 E.F. Johnson +00:07:9B Aurora Networks +00:07:8F Emkay Innovative Products +00:07:88 Clipcomm, Inc. +00:07:79 Sungil Telecom Co., Ltd. +00:07:78 GERSTEL GmbH & Co. KG +00:07:6C Daehanet, Inc. +00:07:5C Eastman Kodak Company +00:07:68 Danfoss A/S +00:07:62 Group Sense Limited +00:07:55 Lafon +00:07:4F Cisco Systems, Inc +00:07:41 Sierra Automated Systems +00:07:49 CENiX Inc. +00:07:35 Flarion Technologies, Inc. +00:07:3B Tenovis GmbH & Co KG +00:07:29 Kistler Instrumente AG +00:07:2E North Node AB +00:07:28 Neo Telecom +00:07:18 iCanTek Co., Ltd. +00:08:06 Raonet Systems, Inc. +00:07:FD LANergy Ltd. +00:07:F6 Qqest Software Systems +00:07:FC Adept Systems Inc. +00:07:EA Massana, Inc. +00:07:F0 LogiSync LLC +00:07:E3 Navcom Technology, Inc. +00:07:E4 SoftRadio Co., Ltd. +00:07:DD Cradle Technologies +00:07:D7 Caporis Networks AG +00:06:E3 Quantitative Imaging Corporation +00:06:DD AT & T Laboratories - Cambridge Ltd +00:06:A4 INNOWELL Corp. +00:06:D3 Alpha Telecom, Inc. U.S.A. +00:06:D2 Tundra Semiconductor Corp. +00:06:47 Etrali S.A. +00:06:D9 IPM-Net S.p.A. +00:05:EA Rednix +00:06:CD Leaf Imaging Ltd. +00:06:BC Macrolink, Inc. +00:06:C6 lesswire AG +00:06:54 Winpresa Building Automation Technologies GmbH +00:06:B6 Nir-Or Israel Ltd. +00:06:B0 Comtech EF Data Corp. +00:07:1F European Systems Integration +00:07:24 Telemax Co., Ltd. +00:07:07 Interalia Inc. +00:07:0C SVA-Intrusion.com Co. Ltd. +00:07:11 Acterna +00:07:12 JAL Information Technology +00:06:FA IP SQUARE Co, Ltd. +00:06:EF Maxxan Systems, Inc. +00:06:EA ELZET80 Mikrocomputer GmbH&Co. KG +00:06:E9 Intime Corp. +00:05:EB Blue Ridge Networks, Inc. +00:05:F7 Analog Devices, Inc. +00:05:E4 Red Lion Controls Inc. +00:05:F1 Vrcom, Inc. +00:05:FD PacketLight Networks Ltd. +00:05:E2 Creativ Network Technologies +00:05:DC Cisco Systems, Inc +00:05:E1 Trellis Photonics, Ltd. +00:05:D8 Arescom, Inc. +00:05:D7 Vista Imaging, Inc. +00:05:C5 Flaga HF +00:05:D1 Metavector Technologies +00:05:D2 DAP Technologies +00:05:CB ROIS Technologies, Inc. +00:05:7F Acqis Technology +00:05:79 Universal Control Solution Corp. +00:05:75 CDS-Electronics BV +00:05:6F Innomedia Technologies Pvt. Ltd. +00:05:68 Piltofish Networks AB +00:05:62 Digital View Limited +00:05:5C Kowa Company, Ltd. +00:05:56 360 Systems +00:05:50 Vcomms Connect Limited +00:05:45 Internet Photonics +00:05:3F VisionTek, Inc. +00:05:46 KDDI Network & Solultions Inc. +00:06:AA VT Miltope +00:06:A9 Universal Instruments Corp. +00:06:A0 Mx Imaging +00:06:9F Kuokoa Networks +00:06:99 Vida Design Co. +00:06:93 Flexus Computer Technology, Inc. +00:06:9A e & Tel +00:06:8D SEPATON, Inc. +00:06:87 Omnitron Systems Technology, Inc. +00:06:80 Card Access, Inc. +00:05:39 A Brand New World in Sweden AB +00:05:26 IPAS GmbH +00:05:2D Zoltrix International Limited +00:05:2C Supreme Magic Corporation +00:05:20 Smartronix, Inc. +00:05:1A 3COM EUROPE LTD. +00:05:10 Infinite Shanghai Communication Terminals Ltd. +00:05:14 KDT Systems Co., Ltd. +00:05:09 AVOC Nishimura Ltd. +00:05:03 ICONAG +00:05:0A ICS Spa +00:04:FF Acronet Co., Ltd. +00:05:00 Cisco Systems, Inc +00:06:41 ITCN +00:06:3D Microwave Data Systems Inc. +00:06:31 Calix +00:06:30 Adtranz Sweden +00:06:37 Toptrend-Meta Information (ShenZhen) Inc. +00:06:20 Serial System Ltd. +00:06:1A Zetari Inc. +00:06:0C Melco Industries, Inc. +00:06:14 Prism Holdings +00:06:06 RapidWAN, Inc. +00:06:77 SICK AG +00:06:73 TKH Security Solutions USA +00:06:66 Roving Networks +00:06:6D Compuprint S.P.A. +00:06:6C Robinson Corporation +00:06:53 Cisco Systems, Inc +00:06:5A Strix Systems +00:06:4D Sencore +00:06:60 NADEX Co., Ltd. +00:05:B8 Electronic Design Associates, Inc. +00:05:BF JustEzy Technology, Inc. +00:05:AE Mediaport USA +00:05:B2 Medison Co., Ltd. +00:05:9E Zinwell Corporation +00:05:A5 KOTT +00:05:98 CRONOS S.r.l. +00:05:A4 Lucid Voice Ltd. +00:05:92 Pultek Corp. +00:05:8B IPmental, Inc. +00:05:8C Opentech Inc. +00:03:7E PORTech Communications, Inc. +00:03:83 Metera Networks, Inc. +00:03:77 Gigabit Wireless +00:03:7B IDEC IZUMI Corporation +00:03:6B Cisco Systems, Inc +00:03:72 ULAN +00:03:67 Jasmine Networks, Inc. +00:03:6A Mainnet, Ltd. +00:03:64 Scenix Semiconductor, Inc. +00:03:5F Prüftechnik Condition Monitoring GmbH & Co. KG +00:03:5C Saint Song Corp. +00:03:4D Chiaro Networks, Ltd. +00:03:FA TiMetra Networks +00:03:F5 Chip2Chip +00:03:EE MKNet Corporation +00:03:E8 Wavelength Digital Limited +00:03:E3 Cisco Systems, Inc +00:03:DC Lexar Media, Inc. +00:03:D7 NextNet Wireless, Inc. +00:03:D4 Alloptic, Inc. +00:03:0B Hunter Technology, Inc. +00:03:D0 KOANKEISO Co., Ltd. +00:03:C9 TECOM Co., Ltd. +00:03:C4 Tomra Systems ASA +00:04:FA NBS Technologies Inc. +00:04:F9 Xtera Communications, Inc. +00:04:F3 FS FORTH-SYSTEME GmbH +00:04:E7 Lightpointe Communications, Inc +00:04:ED Billion Electric Co., Ltd. +00:04:DD Cisco Systems, Inc +00:04:D6 Takagi Industrial Co., Ltd. +00:04:D0 Softlink s.r.o. +00:04:CA FreeMs Corp. +00:04:BE OptXCon, Inc. +00:04:C3 CASTOR Informatique +00:04:C4 Allen & Heath Limited +00:04:B7 AMB i.t. Holding +00:04:B1 Signal Technology, Inc. +00:04:AD Malibu Networks +00:04:AA Jetstream Communications +00:04:9D Ipanema Technologies +00:04:97 MacroSystem Digital Video AG +00:04:90 Optical Access +00:04:8B Poscon Corporation +00:03:41 Axon Digital Design +00:03:3E Tateyama System Laboratory Co., Ltd. +00:03:3A Silicon Wave, Inc. +00:03:33 Digitel Co., Ltd. +00:03:2B GAI Datenfunksysteme GmbH +00:03:27 ACT'L +00:03:2E Scope Information Management, Ltd. +00:03:22 IDIS Co., Ltd. +00:03:1E Optranet, Inc. +00:B0:52 Atheros Communications +00:03:19 Infineon AG +00:03:16 Nobell Communications, Inc. +00:03:12 TR-Systemtechnik GmbH +00:04:47 Acrowave Systems Co., Ltd. +00:04:3B Lava Computer Mfg., Inc. +00:04:40 cyberPIXIE, Inc. +00:04:3A Intelligent Telecommunications, Inc. +00:04:34 Accelent Systems, Inc. +00:04:2D Sarian Systems, Ltd. +00:04:2E Netous Technologies, Ltd. +00:04:28 Cisco Systems, Inc +00:04:21 Ocular Networks +00:04:17 ELAU AG +00:04:11 Inkra Networks, Inc. +00:04:0B 3COM EUROPE LTD. +00:04:04 Makino Milling Machine Co., Ltd. +00:04:81 Econolite Control Products, Inc. +00:04:86 ITTC, University of Kansas +00:04:77 Scalant Systems, Inc. +00:04:76 3 Com Corporation +00:04:69 Innocom, Inc. +00:04:70 ipUnplugged AB +00:04:6A Navini Networks +00:04:64 Pulse-Link Inc +00:04:5D BEKA Elektronik +00:04:57 Universal Access Technology, Inc. +00:04:51 Medrad, Inc. +00:03:C1 Packet Dynamics Ltd +00:03:BD OmniCluster Technologies, Inc. +00:03:B8 NetKit Solutions, LLC +00:03:B6 QSI Corporation +00:03:A6 Traxit Technology, Inc. +00:03:AB Bridge Information Systems +00:03:A3 MAVIX, Ltd. +00:03:9F Cisco Systems, Inc +00:03:9A SiConnect +00:03:8C Total Impact +00:03:84 AETA +00:03:87 Blaze Network Products +00:03:06 Fusion In Tech Co., Ltd. +00:03:03 JAMA Electronics Co., Ltd. +00:02:FF Handan BroadInfoCom +00:02:F3 Media Serve Co., Ltd. +00:02:FA DX Antenna Co., Ltd. +00:02:ED DXO Telecom Co., Ltd. +00:02:E5 Timeware Ltd. +00:02:E8 E.D.&A. +00:02:DC Fujitsu General Limited +00:02:E1 Integrated Network Corporation +00:02:D5 ACR +00:02:CE FoxJet, Inc. +00:B0:DB Nextcell, Inc. +00:B0:8E Cisco Systems, Inc +00:B0:1C Westport Technologies +00:B0:2D ViaGate Technologies, Inc. +00:B0:3B HiQ Networks +00:30:A9 Netiverse, Inc. +00:B0:F0 CALY NETWORKS +00:B0:86 LocSoft Limited +00:30:C4 Canon Imaging Systems Inc. +00:30:9D Nimble Microsystems, Inc. +00:30:37 Packard Bell Nec Services +00:30:2E Hoft & Wessel AG +00:30:1B SHUTTLE, INC. +00:30:28 FASE Saldatura srl +00:30:FB AZS Technology AG +00:30:48 Supermicro Computer, Inc. +00:01:DA WINCOMM Corporation +00:01:E1 Kinpo Electronics, Inc. +00:01:DD Avail Networks +00:01:CE Custom Micro Products, Ltd. +00:01:CA Geocast Network Systems, Inc. +00:01:B8 Netsensity, Inc. +00:01:BD Peterson Electro-Musical Products, Inc. +00:01:B4 Wayport, Inc. +00:01:C3 Acromag, Inc. +00:01:BF Teleforce Co., Ltd. +00:01:AD Coach Master International d.b.a. CMI Worldwide, Inc. +00:01:7E ADTEK System Science Co., Ltd. +00:01:8A ROI COMPUTER AG +00:01:19 RTUnet (Australia) +00:01:25 YAESU MUSEN CO., LTD. +00:01:21 Watchguard Technologies, Inc. +00:01:28 EnjoyWeb, Inc. +00:01:06 Tews Datentechnik GmbH +00:01:12 Shark Multimedia Inc. +00:01:02 3COM CORPORATION +00:01:15 EXTRATECH CORPORATION +00:01:09 Nagano Japan Radio Co., Ltd. +08:14:43 UNIBRAIN S.A. +00:B0:F5 NetWorth Technologies, Inc. +00:B0:19 UTC CCS +00:B0:2A ORSYS GmbH +00:B0:AE Symmetricom +00:01:81 Nortel Networks +00:01:8D AudeSi Technologies +00:01:9A LEUNIG GmbH +00:01:93 Hanbyul Telecom Co., Ltd. +00:01:A2 Logical Co., Ltd. +00:01:96 Cisco Systems, Inc +00:01:A6 Scientific-Atlanta Arcodan A/S +00:01:72 TechnoLand Co., LTD. +00:30:3F TurboComm Tech Inc. +00:30:73 International Microsystems, In +00:01:4D Shin Kin Enterprises Co., Ltd +00:01:6B LightChip, Inc. +00:01:67 HIOKI E.E. CORPORATION +00:02:15 Cotas Computer Technology A/B +00:02:11 Nature Worldwide Technology Corp. +00:02:09 Shenzhen SED Information Technology Co., Ltd. +00:02:05 Hitachi Denshi, Ltd. +00:02:02 Amino Communications, Ltd. +00:01:F6 Association of Musical Electronics Industry +00:01:ED SETA Corp. +00:01:E9 Litton Marine Systems B.V. +00:02:C6 Data Track Technology PLC +00:02:C2 Net Vision Telecom +00:02:B9 Cisco Systems, Inc +00:02:B4 DAPHNE +00:02:AD HOYA Corporation +00:02:A6 Effinet Systems Co., Ltd. +00:02:A1 World Wide Packets +00:02:9B Kreatel Communications AB +00:02:9E Information Equipment Co., Ltd. +00:02:96 Lectron Co,. Ltd. +00:02:8F Globetek, Inc. +00:02:89 DNE Technologies +00:02:85 Riverstone Networks +00:02:7E Cisco Systems, Inc +00:02:80 Mu Net, Inc. +00:02:79 Control Applications, Ltd. +00:02:72 CC&C Technologies, Inc. +00:02:6B BCM Computers Co., Ltd. +00:02:6D Adept Telecom +00:02:62 Soyo Group Soyo Com Tech Co., Ltd +00:02:60 Accordion Networks, Inc. +00:02:5B Cambridge Silicon Radio +00:00:87 HITACHI, LTD. +00:02:52 Carrier Corporation +00:02:4B Cisco Systems, Inc +00:02:46 All-Win Tech Co., Ltd. +00:01:7A Chengdu Maipu Electric Industrial Co., Ltd. +00:02:35 Paragon Networks International +00:02:38 Serome Technology, Inc. +00:02:30 Intersoft Electronics +00:02:29 Adtec Corporation +00:02:25 One Stop Systems +00:02:1C Network Elements, Inc. +00:02:21 DSP Application, Ltd. +00:01:6E Conklin Corporation +00:01:5B ITALTEL S.p.A/RF-UP-I +00:01:54 G3M Corporation +00:01:50 GILAT COMMUNICATIONS, LTD. +00:01:2E PC Partner Ltd. +00:01:3A SHELCAD COMMUNICATIONS, LTD. +00:01:41 CABLE PRINT +00:01:31 Bosch Security Systems, Inc. +00:01:3D RiscStation Ltd. +00:01:49 T.D.T. Transfer Data Test GmbH +00:D0:47 XN TECHNOLOGIES +00:D0:18 QWES. COM, INC. +00:D0:48 ECTON, INC. +00:D0:28 Harmonic, Inc +00:D0:2F VLSI TECHNOLOGY INC. +00:D0:25 XROSSTECH, INC. +00:D0:85 OTIS ELEVATOR COMPANY +00:D0:77 LUCENT TECHNOLOGIES +00:D0:93 TQ - COMPONENTS GMBH +00:D0:13 PRIMEX AEROSPACE COMPANY +00:D0:56 SOMAT CORPORATION +00:D0:17 SYNTECH INFORMATION CO., LTD. +00:D0:36 TECHNOLOGY ATLANTA CORP. +00:D0:D6 AETHRA TELECOMUNICAZIONI +00:30:78 Cisco Systems, Inc +00:30:03 Phasys Ltd. +00:30:D5 DResearch GmbH +00:30:CE Zaffire +00:30:95 Procomp Informatics, Ltd. +00:30:55 Renesas Technology America, Inc. +00:30:B0 Convergenet Technologies +00:30:CC Tenor Networks, Inc. +00:30:13 NEC Corporation +00:30:61 MobyTEL +00:D0:AB DELTAKABEL TELECOM CV +00:D0:A8 NETWORK ENGINES, INC. +00:D0:1C SBS TECHNOLOGIES, +00:D0:C0 Cisco Systems, Inc +00:D0:51 O2 MICRO, INC. +00:D0:6D ACRISON, INC. +00:50:A1 CARLO GAVAZZI, INC. +00:D0:6C SHAREWAVE, INC. +00:D0:3A ZONEWORX, INC. +00:50:C1 GEMFLEX NETWORKS, LTD. +00:50:FB VSK ELECTRONICS +00:50:33 MAYAN NETWORKS +00:30:A0 TYCO SUBMARINE SYSTEMS, LTD. +00:30:CB OMNI FLOW COMPUTERS, INC. +00:30:6B CMOS SYSTEMS, INC. +00:30:68 CYBERNETICS TECH. CO., LTD. +00:30:E3 SEDONA NETWORKS CORP. +00:D0:07 MIC ASSOCIATES, INC. +00:D0:7F STRATEGY & TECHNOLOGY, LIMITED +00:30:85 Cisco Systems, Inc +00:30:26 HeiTel Digital Video GmbH +00:30:A6 VIANET TECHNOLOGIES, LTD. +00:30:47 NISSEI ELECTRIC CO., LTD. +00:D0:FC GRANITE MICROSYSTEMS +00:D0:42 MAHLO GMBH & CO. UG +00:D0:46 DOLBY LABORATORIES, INC. +00:D0:BA Cisco Systems, Inc +00:D0:BC Cisco Systems, Inc +00:D0:D8 3Com Corporation +00:D0:6B SR TELECOM INC. +00:30:AA AXUS MICROSYSTEMS, INC. +00:30:43 IDREAM TECHNOLOGIES, PTE. LTD. +00:30:10 VISIONETICS INTERNATIONAL +00:30:96 Cisco Systems, Inc +00:30:84 ALLIED TELESYN INTERNAIONAL +00:30:CF TWO TECHNOLOGIES, INC. +00:D0:E3 ELE-CHEM ENGINEERING CO., LTD. +00:D0:ED XIOX +00:D0:C2 BALTHAZAR TECHNOLOGY AB +00:D0:FB TEK MICROSYSTEMS, INCORPORATED +00:D0:82 IOWAVE INC. +00:D0:AD TL INDUSTRIES +00:D0:DB MCQUAY INTERNATIONAL +00:D0:6A LINKUP SYSTEMS CORPORATION +00:D0:65 TOKO ELECTRIC +00:D0:8F ARDENT TECHNOLOGIES, INC. +00:D0:E7 VCON TELECOMMUNICATION LTD. +00:D0:87 MICROFIRST INC. +00:D0:08 MACTELL CORPORATION +00:30:05 Fujitsu Siemens Computers +00:30:4E BUSTEC PRODUCTION LTD. +00:30:E0 OXFORD SEMICONDUCTOR LTD. +00:30:A1 WEBGATE Inc. +00:30:3D IVA CORPORATION +00:30:C3 FLUECKIGER ELEKTRONIK AG +00:90:47 GIGA FAST E. LTD. +00:90:CB Wireless OnLine, Inc. +00:90:3F AZTEC RADIOMEDIA +00:10:43 A2 CORPORATION +00:10:8D Johnson Controls, Inc. +00:10:8E HUGH SYMONS CONCEPT Technologies Ltd. +00:10:52 METTLER-TOLEDO (ALBSTADT) GMBH +00:10:0E MICRO LINEAR COPORATION +00:10:D7 ARGOSY RESEARCH INC. +00:10:59 DIABLO RESEARCH CO. LLC +00:10:B6 ENTRATA COMMUNICATIONS CORP. +00:10:19 SIRONA DENTAL SYSTEMS GmbH & Co. KG +00:10:13 Kontron America, Inc. +00:90:A4 ALTIGA NETWORKS +00:90:6C Sartorius Hamburg GmbH +00:90:FC NETWORK COMPUTING DEVICES +00:90:A3 Corecess Inc. +00:90:22 IVEX +00:90:A5 SPECTRA LOGIC +00:90:BA VALID NETWORKS, INC. +00:90:EE PERSONAL COMMUNICATIONS TECHNOLOGIES +00:90:CD ENT-EMPRESA NACIONAL DE TELECOMMUNICACOES, S.A. +00:90:D0 Thomson Telecom Belgium +00:90:75 NEC DO BRASIL S.A. +00:90:2E NAMCO LIMITED +00:90:A0 8X8 INC. +00:90:7C DIGITALCAST, INC. +00:90:DF MITSUBISHI CHEMICAL AMERICA, INC. +00:90:23 ZILOG INC. +00:90:8A BAYLY COMMUNICATIONS, INC. +00:90:63 COHERENT COMMUNICATIONS SYSTEMS CORPORATION +00:90:41 APPLIED DIGITAL ACCESS +00:90:D8 WHITECROSS SYSTEMS +00:90:11 WAVTrace, Inc. +00:90:40 Siemens Network Convergence LLC +00:90:C7 ICOM INC. +00:90:35 ALPHA TELECOM, INC. +00:90:87 ITIS +00:90:6E PRAXON, INC. +00:90:39 SHASTA NETWORKS +00:90:9A ONE WORLD SYSTEMS, INC. +00:90:53 DAEWOO ELECTRONICS CO., LTD. +00:90:9E Critical IO, LLC +00:90:C2 JK microsystems, Inc. +00:90:91 DigitalScape, Inc. +00:90:ED CENTRAL SYSTEM RESEARCH CO., LTD. +00:90:1B DIGITAL CONTROLS +00:90:5C EDMI +00:90:D2 ARTEL VIDEO SYSTEMS +00:50:8C RSI SYSTEMS +00:50:2D ACCEL, INC. +00:50:B8 INOVA COMPUTERS GMBH & CO. KG +00:50:3A DATONG ELECTRONICS LTD. +00:50:8E OPTIMATION, INC. +00:50:BB CMS TECHNOLOGIES +00:50:51 IWATSU ELECTRIC CO., LTD. +00:50:BE FAST MULTIMEDIA AG +00:50:AD CommUnique Wireless Corp. +00:50:16 SST/WOODHEAD INDUSTRIES +00:50:03 Xrite Inc +00:50:23 PG DESIGN ELECTRONICS, INC. +00:50:39 MARINER NETWORKS +00:50:5A NETWORK ALCHEMY, INC. +00:50:71 AIWA CO., LTD. +00:90:71 Applied Innovation Inc. +00:90:31 MYSTICOM, LTD. +00:90:1F ADTEC PRODUCTIONS, INC. +00:90:81 ALOHA NETWORKS, INC. +00:90:B3 AGRANAT SYSTEMS +00:50:0D SATORI ELECTORIC CO., LTD. +00:50:EC OLICOM A/S +00:50:83 GILBARCO, INC. +00:50:CF VANLINK COMMUNICATION TECHNOLOGY RESEARCH INSTITUTE +00:50:08 TIVA MICROCOMPUTER CORP. (TMC) +00:50:01 YAMASHITA SYSTEMS CORP. +00:50:B5 FICHET-BAUCHE +00:50:B0 TECHNOLOGY ATLANTA CORPORATION +00:50:4E SIERRA MONITOR CORP. +00:50:4D Tokyo Electron Device Limited +00:50:F7 VENTURE MANUFACTURING (SINGAPORE) LTD. +00:50:29 1394 PRINTER WORKING GROUP +00:E0:8D PRESSURE SYSTEMS, INC. +00:E0:40 DeskStation Technology, Inc. +00:E0:D6 COMPUTER & COMMUNICATION RESEARCH LAB. +00:E0:7E WALT DISNEY IMAGINEERING +00:E0:94 OSAI SRL +00:E0:32 MISYS FINANCIAL SYSTEMS, LTD. +00:E0:6B W&G SPECIAL PRODUCTS +00:E0:1C Cradlepoint, Inc +00:E0:76 DEVELOPMENT CONCEPTS, INC. +00:E0:A7 IPC INFORMATION SYSTEMS, INC. +00:E0:A4 ESAOTE S.p.A. +00:E0:80 CONTROL RESOURCES CORPORATION +00:E0:CC HERO SYSTEMS, LTD. +00:E0:99 SAMSON AG +00:10:E9 RAIDTEC LTD. +00:10:03 IMATRON, INC. +00:10:5A 3COM CORPORATION +00:10:A9 ADHOC TECHNOLOGIES +00:04:00 LEXMARK INTERNATIONAL, INC. +00:10:1A PictureTel Corp. +00:10:97 WinNet Metropolitan Communications Systems, Inc. +00:10:6F TRENTON TECHNOLOGY INC. +00:10:DA Kollmorgen Corp +00:10:DF RISE COMPUTER INC. +00:10:9E AWARE, INC. +00:10:72 GVN TECHNOLOGIES, INC. +00:E0:19 ING. GIORDANO ELETTRONICA +00:E0:D7 SUNSHINE ELECTRONICS, INC. +00:E0:DA Alcatel North America ESD +00:E0:68 MERRIMAC SYSTEMS INC. +00:E0:1D WebTV NETWORKS, INC. +00:E0:1F AVIDIA Systems, Inc. +00:E0:56 HOLONTECH CORPORATION +00:E0:C9 AutomatedLogic Corporation +00:E0:30 MELITA INTERNATIONAL CORP. +00:E0:BA BERGHOF AUTOMATIONSTECHNIK GmbH +00:E0:B2 TELMAX COMMUNICATIONS CORP. +00:E0:EF DIONEX +00:E0:BD INTERFACE SYSTEMS, INC. +00:E0:71 EPIS MICROCOMPUTER +00:E0:A6 TELOGY NETWORKS, INC. +00:E0:26 Redlake MASD LLC +00:E0:B8 GATEWAY 2000 +00:E0:88 LTX-Credence CORPORATION +00:E0:7C METTLER-TOLEDO, INC. +00:E0:8C NEOPARADIGM LABS, INC. +00:E0:61 EdgePoint Networks, Inc. +00:E0:6E FAR SYSTEMS S.p.A. +00:E0:1B SPHERE COMMUNICATIONS, INC. +00:E0:AE XAQTI CORPORATION +00:E0:C8 VIRTUAL ACCESS, LTD. +00:10:1D WINBOND ELECTRONICS CORP. +00:10:5F ZODIAC DATA SYSTEMS +00:10:CB FACIT K.K. +00:10:8C FUJITSU TELECOMMUNICATIONS EUROPE, LTD. +00:10:75 Segate Technology LLC +00:10:58 ArrowPoint Communications +00:10:A8 RELIANCE COMPUTER CORP. +00:10:AA MEDIA4, INC. +00:10:E8 TELOCITY, INCORPORATED +00:10:10 INITIO CORPORATION +00:E0:07 Avaya ECS Ltd +00:10:22 SatCom Media Corporation +00:10:C7 DATA TRANSMISSION NETWORK +00:10:98 STARNET TECHNOLOGIES, INC. +00:10:96 TRACEWELL SYSTEMS, INC. +00:10:82 JNA TELECOMMUNICATIONS LIMITED +00:10:21 ENCANTO NETWORKS, INC. +00:10:CE VOLAMP, LTD. +00:10:B2 COACTIVE AESTHETICS +00:10:9A NETLINE +00:10:EA ADEPT TECHNOLOGY +00:10:BD THE TELECOMMUNICATION TECHNOLOGY COMMITTEE (TTC) +00:60:99 SBE, Inc. +00:60:FD NetICs, Inc. +00:60:B5 KEBA GmbH +00:60:27 Superior Modular Products +00:60:C1 WaveSpan Corporation +00:60:41 Yokogawa Electric Corporation +00:60:05 FEEDBACK DATA LTD. +00:60:7B FORE SYSTEMS, INC. +00:60:9C Perkin-Elmer Incorporated +00:60:07 ACRES GAMING, INC. +00:60:35 DALLAS SEMICONDUCTOR, INC. +00:60:F1 EXP COMPUTER, INC. +00:60:40 NETRO CORP. +00:60:34 ROBERT BOSCH GmbH +00:60:BA SAHARA NETWORKS, INC. +00:60:96 T.S. MICROTECH INC. +00:60:3A QUICK CONTROLS LTD. +00:60:AC RESILIENCE CORPORATION +00:60:EB FOURTHTRACK SYSTEMS +00:60:6D DIGITAL EQUIPMENT CORP. +00:60:14 EDEC CO., LTD. +00:60:E1 ORCKIT COMMUNICATIONS LTD. +00:60:62 TELESYNC, INC. +00:60:38 Nortel Networks +00:60:95 ACCU-TIME SYSTEMS, INC. +00:A0:16 MICROPOLIS CORP. +00:A0:1C NASCENT NETWORKS CORPORATION +00:A0:FC IMAGE SCIENCES, INC. +00:A0:B7 CORDANT, INC. +00:A0:37 Mindray DS USA, Inc. +00:A0:4C INNOVATIVE SYSTEMS & TECHNOLOGIES, INC. +00:A0:E9 ELECTRONIC RETAILING SYSTEMS INTERNATIONAL +00:60:78 POWER MEASUREMENT LTD. +00:60:0D Digital Logic GmbH +00:60:8A CITADEL COMPUTER +00:A0:5D CS COMPUTER SYSTEME GmbH +00:A0:BD I-TECH CORP. +00:A0:B9 EAGLE TECHNOLOGY, INC. +00:A0:69 Symmetricom, Inc. +00:A0:7A ADVANCED PERIPHERALS TECHNOLOGIES, INC. +00:A0:4E VOELKER TECHNOLOGIES, INC. +00:A0:5A KOFAX IMAGE PRODUCTS +00:A0:93 B/E AEROSPACE, Inc. +00:A0:BF WIRELESS DATA GROUP MOTOROLA +00:60:9F PHAST CORPORATION +00:60:67 ACER NETXUS INC. +00:60:0C Eurotech Inc. +00:60:25 ACTIVE IMAGING PLC +00:60:71 MIDAS LAB, INC. +00:60:A7 MICROSENS GmbH & CO. KG +00:60:FC CONSERVATION THROUGH INNOVATION LTD. +00:60:D4 ELDAT COMMUNICATION LTD. +00:60:85 Storage Concepts +00:60:D3 AT&T +00:60:18 STELLAR ONE CORPORATION +00:60:2B PEAK AUDIO +00:60:6F CLARION CORPORATION OF AMERICA +00:60:ED RICARDO TEST AUTOMATION LTD. +00:60:F6 NEXTEST COMMUNICATIONS PRODUCTS, INC. +00:60:DD MYRICOM, INC. +00:60:92 MICRO/SYS, INC. +00:60:80 MICROTRONIX DATACOM LTD. +00:60:68 Dialogic Corporation +00:60:DB NTP ELEKTRONIK A/S +00:A0:02 LEEDS & NORTHRUP AUSTRALIA PTY LTD +00:A0:E4 OPTIQUEST +00:A0:1F TRICORD SYSTEMS, INC. +00:A0:C0 DIGITAL LINK CORP. +00:A0:43 AMERICAN TECHNOLOGY LABS, INC. +00:A0:47 INTEGRATED FITNESS CORP. +00:A0:7C TONYANG NYLON CO., LTD. +00:A0:EC TRANSMITTON LTD. +00:A0:7E AVID TECHNOLOGY, INC. +00:A0:35 CYLINK CORPORATION +00:A0:28 CONNER PERIPHERALS +00:A0:C7 TADIRAN TELECOMMUNICATIONS +00:E0:BE GENROCO INTERNATIONAL, INC. +00:E0:10 HESS SB-AUTOMATENBAU GmbH +00:E0:E9 DATA LABS, INC. +00:E0:A0 WILTRON CO. +00:E0:24 GADZOOX NETWORKS +00:E0:17 EXXACT GmbH +00:60:3B AMTEC spa +00:20:E5 APEX DATA, INC. +00:20:7D ADVANCED COMPUTER APPLICATIONS +00:20:D0 VERSALYNX CORPORATION +00:20:6C EVERGREEN TECHNOLOGY CORP. +00:20:12 CAMTRONICS MEDICAL SYSTEMS +00:20:0B OCTAGON SYSTEMS CORP. +00:20:9E BROWN'S OPERATING SYSTEM SERVICES, LTD. +00:20:D7 JAPAN MINICOMPUTER SYSTEMS CO., Ltd. +00:20:FB OCTEL COMMUNICATIONS CORP. +00:20:B1 COMTECH RESEARCH INC. +00:20:33 SYNAPSE TECHNOLOGIES, INC. +00:20:99 BON ELECTRIC CO., LTD. +00:20:AE ORNET DATA COMMUNICATION TECH. +00:20:EA EFFICIENT NETWORKS, INC. +00:20:FF SYMMETRICAL TECHNOLOGIES +00:20:8B LAPIS TECHNOLOGIES, INC. +00:20:69 ISDN SYSTEMS CORPORATION +00:20:BA CENTER FOR HIGH PERFORMANCE +00:20:06 GARRETT COMMUNICATIONS, INC. +00:A0:A2 DIGICOM S.P.A. +00:A0:54 Private +00:A0:30 CAPTOR NV/SA +00:A0:B1 FIRST VIRTUAL CORPORATION +00:20:CB PRETEC ELECTRONICS CORP. +00:20:AB MICRO INDUSTRIES CORP. +00:20:2D TAIYO CORPORATION +00:A0:88 ESSENTIAL COMMUNICATIONS +00:A0:FA Marconi Communication GmbH +00:A0:14 CSIR +00:A0:64 KVB/ANALECT +00:A0:7F GSM-SYNTEL, LTD. +00:A0:3E ATM FORUM +00:A0:50 CYPRESS SEMICONDUCTOR +00:A0:98 NetApp +00:A0:21 General Dynamics +00:A0:A8 RENEX CORPORATION +00:20:49 COMTRON, INC. +00:20:50 KOREA COMPUTER INC. +00:20:3C EUROTIME AB +00:20:28 WEST EGG SYSTEMS, INC. +00:20:14 GLOBAL VIEW CO., LTD. +00:20:53 HUNTSVILLE MICROSYSTEMS, INC. +00:20:01 DSP SOLUTIONS, INC. +00:20:9C PRIMARY ACCESS CORP. +00:20:C5 EAGLE TECHNOLOGY +00:20:09 PACKARD BELL ELEC., INC. +00:20:95 RIVA ELECTRONICS +00:20:3F JUKI CORPORATION +00:C0:14 TELEMATICS CALABASAS INT'L,INC +00:C0:45 ISOLATION SYSTEMS, LTD. +00:C0:00 LANOPTICS, LTD. +00:AA:3C OLIVETTI TELECOM SPA (OLTECO) +00:C0:79 FONSYS CO.,LTD. +00:20:11 CANOPUS CO., LTD. +00:C0:0B NORCONTROL A.S. +00:C0:C0 SHORE MICROSYSTEMS, INC. +00:C0:0C RELIA TECHNOLGIES +00:A0:E7 CENTRAL DATA CORPORATION +00:A0:68 BHP LIMITED +00:A0:B3 ZYKRONIX +00:A0:6E AUSTRON, INC. +00:A0:BB HILAN GMBH +00:A0:C8 ADTRAN INC. +00:A0:17 J B M CORPORATION +00:20:D5 VIPA GMBH +00:20:79 MIKRON GMBH +00:20:FA GDE SYSTEMS, INC. +00:20:07 SFA, INC. +00:20:62 SCORPION LOGIC, LTD. +00:20:0A SOURCE-COMM CORP. +00:20:00 LEXMARK INTERNATIONAL, INC. +00:20:03 PIXEL POWER LTD. +00:20:B4 TERMA ELEKTRONIK AS +00:20:5B Kentrox, LLC +00:20:30 ANALOG & DIGITAL SYSTEMS +00:20:A8 SAST TECHNOLOGY CORP. +00:20:66 GENERAL MAGIC, INC. +00:20:36 BMC SOFTWARE +00:40:BE BOEING DEFENSE & SPACE +00:40:36 Zoom Telephonics, Inc +00:40:46 UDC RESEARCH LIMITED +00:40:6A KENTEK INFORMATION SYSTEMS,INC +00:40:F2 JANICH & KLASS COMPUTERTECHNIK +00:40:82 LABORATORY EQUIPMENT CORP. +00:40:22 KLEVER COMPUTERS, INC. +00:40:A2 KINGSTAR TECHNOLOGY INC. +00:40:B4 NEXTCOM K.K. +00:40:D4 GAGE TALKER CORP. +00:40:38 TALENT ELECTRIC INCORPORATED +00:40:18 ADOBE SYSTEMS, INC. +00:40:B0 BYTEX CORPORATION, ENGINEERING +00:40:40 RING ACCESS, INC. +00:80:D7 Fantum Engineering +00:80:D9 EMK Elektronik GmbH & Co. KG +00:80:6A ERI (EMPAC RESEARCH INC.) +00:40:3B SYNERJET INTERNATIONAL CORP. +00:40:AB ROLAND DG CORPORATION +00:40:D5 Sartorius Mechatronics T&H GmbH +00:40:27 SMC MASSACHUSETTS, INC. +00:40:9C TRANSWARE +00:40:5C FUTURE SYSTEMS, INC. +00:00:8C Alloy Computer Products (Australia) Pty Ltd +00:40:00 PCI COMPONENTES DA AMZONIA LTD +00:40:C5 MICOM COMMUNICATIONS INC. +00:40:AA Metso Automation +00:40:23 LOGIC CORPORATION +00:40:A4 ROSE ELECTRONICS +00:40:48 SMD INFORMATICA S.A. +00:40:25 MOLECULAR DYNAMICS +00:40:10 SONIC SYSTEMS, INC. +00:40:CA FIRST INTERNAT'L COMPUTER, INC +00:40:50 IRONICS, INCORPORATED +00:40:2B TRIGEM COMPUTER, INC. +00:C0:8C PERFORMANCE TECHNOLOGIES, INC. +00:C0:2B GERLOFF GESELLSCHAFT FUR +00:C0:A7 SEEL LTD. +00:40:B3 ParTech Inc. +00:40:7D EXTENSION TECHNOLOGY CORP. +00:40:79 JUKO MANUFACTURE COMPANY, LTD. +00:40:D9 AMERICAN MEGATRENDS INC. +00:40:11 ANDOVER CONTROLS CORPORATION +00:40:C1 BIZERBA-WERKE WILHEIM KRAUT +00:C0:6B OSI PLUS CORPORATION +00:C0:6A ZAHNER-ELEKTRIK GMBH & CO. KG +00:C0:97 ARCHIPEL SA +00:C0:72 KNX LTD. +00:C0:EC DAUPHIN TECHNOLOGY +00:C0:66 DOCUPOINT, INC. +00:C0:28 JASCO CORPORATION +00:C0:DC EOS TECHNOLOGIES, INC. +00:C0:2D FUJI PHOTO FILM CO., LTD. +00:C0:BD INEX TECHNOLOGIES, INC. +00:C0:54 NETWORK PERIPHERALS, LTD. +00:C0:D5 Werbeagentur Jürgen Siebert +00:C0:44 EMCOM CORPORATION +00:C0:50 TOYO DENKI SEIZO K.K. +00:40:8A TPS TELEPROCESSING SYS. GMBH +00:40:FD LXE +00:40:3D Teradata Corporation +00:40:E0 ATOMWIDE LTD. +00:40:8C AXIS COMMUNICATIONS AB +00:40:68 EXTENDED SYSTEMS +00:40:BA ALLIANT COMPUTER SYSTEMS CORP. +00:40:69 LEMCOM SYSTEMS, INC. +00:40:F8 SYSTEMHAUS DISCOM +00:40:77 MAXTON TECHNOLOGY CORPORATION +00:40:E7 ARNOS INSTRUMENTS & COMPUTER +00:40:AC SUPER WORKSTATION, INC. +00:C0:AC GAMBIT COMPUTER COMMUNICATIONS +00:C0:2C CENTRUM COMMUNICATIONS, INC. +00:C0:ED US ARMY ELECTRONIC +00:C0:D1 COMTREE TECHNOLOGY CORPORATION +00:C0:D2 SYNTELLECT, INC. +00:C0:FB ADVANCED TECHNOLOGY LABS +00:C0:92 MENNEN MEDICAL INC. +00:C0:6C SVEC COMPUTER CORP. +00:C0:2E NETWIZ +00:C0:5B NETWORKS NORTHWEST, INC. +00:C0:BF TECHNOLOGY CONCEPTS, LTD. +00:C0:C9 ELSAG BAILEY PROCESS +00:80:9D Commscraft Ltd. +00:80:17 PFU LIMITED +00:80:F8 MIZAR, INC. +00:80:24 KALPANA, INC. +00:80:74 FISHER CONTROLS +00:80:21 Alcatel Canada Inc. +00:00:55 COMMISSARIAT A L`ENERGIE ATOM. +00:00:86 MEGAHERTZ CORPORATION +00:00:92 COGENT DATA TECHNOLOGIES +00:80:68 YAMATECH SCIENTIFIC LTD. +00:80:F2 RAYCOM SYSTEMS INC +00:80:EA ADVA Optical Networking Ltd. +00:80:25 STOLLMANN GMBH +00:00:67 SOFT * RITE, INC. +00:00:E8 ACCTON TECHNOLOGY CORP. +00:00:B2 TELEVIDEO SYSTEMS, INC. +00:00:EE NETWORK DESIGNERS, LTD. +00:00:89 CAYMAN SYSTEMS INC. +00:00:21 SUREMAN COMP. & COMMUN. CORP. +00:00:CF HAYES MICROCOMPUTER PRODUCTS +00:00:A4 ACORN COMPUTERS LIMITED +00:00:18 WEBSTER COMPUTER CORPORATION +00:80:33 EMS Aviation, Inc. +00:80:52 TECHNICALLY ELITE CONCEPTS +00:80:4F DAIKIN INDUSTRIES, LTD. +00:80:6D CENTURY SYSTEMS CORP. +00:80:2D XYLOGICS INC +00:80:48 COMPEX INCORPORATED +00:80:85 H-THREE SYSTEMS CORPORATION +00:80:14 ESPRIT SYSTEMS +00:80:B4 SOPHIA SYSTEMS +00:80:7F DY-4 INCORPORATED +00:00:E4 IN2 GROUPE INTERTECHNIQUE +00:00:79 NETWORTH INCORPORATED +00:00:75 Nortel Networks +00:40:09 TACHIBANA TECTRON CO., LTD. +00:40:9E CONCURRENT TECHNOLOGIES LTD. +00:80:92 Silex Technology, Inc. +00:80:11 DIGITAL SYSTEMS INT'L. INC. +00:80:44 SYSTECH COMPUTER CORP. +00:80:8A SUMMIT MICROSYSTEMS CORP. +00:80:E3 CORAL NETWORK CORPORATION +00:80:72 MICROPLEX SYSTEMS LTD. +00:80:54 FRONTIER TECHNOLOGIES CORP. +00:80:AE HUGHES NETWORK SYSTEMS +00:80:AF ALLUMER CO., LTD. +00:80:EC SUPERCOMPUTING SOLUTIONS, INC. +00:80:A4 LIBERTY ELECTRONICS +00:80:73 DWB ASSOCIATES +00:80:2B INTEGRATED MARKETING CO +00:80:BE ARIES RESEARCH +00:80:27 ADAPTIVE SYSTEMS, INC. +00:80:E2 T.D.I. CO., LTD. +00:40:EE OPTIMEM +00:40:5E NORTH HILLS ISRAEL +00:40:72 Applied Innovation Inc. +00:40:31 KOKUSAI ELECTRIC CO., LTD +00:40:0C GENERAL MICRO SYSTEMS, INC. +00:40:E6 C.A.E.N. +00:40:FC IBR COMPUTER TECHNIK GMBH +00:40:01 Zero One Technology Co. Ltd. +00:40:02 PERLE SYSTEMS LIMITED +00:80:DB GRAPHON CORPORATION +00:80:B1 SOFTCOM A/S +00:80:D8 NETWORK PERIPHERALS INC. +00:80:AB DUKANE NETWORK INTEGRATION +00:80:9B JUSTSYSTEM CORPORATION +00:80:89 TECNETICS (PTY) LTD. +00:00:39 TOSHIBA CORPORATION +00:00:CB COMPU-SHACK ELECTRONIC GMBH +00:00:D1 ADAPTEC INCORPORATED +00:00:B6 MICRO-MATIC RESEARCH +00:00:66 TALARIS SYSTEMS, INC. +00:00:14 NETRONIX +00:00:72 MINIWARE TECHNOLOGY +00:00:AB LOGIC MODELING CORPORATION +00:00:29 IMC NETWORKS CORP. +00:80:CD MICRONICS COMPUTER, INC. +00:80:83 AMDAHL +00:80:03 HYTEC ELECTRONICS LTD. +00:80:1B KODIAK TECHNOLOGY +00:80:CC MICROWAVE BYPASS SYSTEMS +08:00:79 THE DROID WORKS +08:00:77 TSL COMMUNICATIONS LTD. +08:00:71 MATRA (DSIE) +08:00:6A ATT BELL LABORATORIES +08:00:5F SABER TECHNOLOGY CORP. +08:00:5C FOUR PHASE SYSTEMS +08:00:5B VTA TECHNOLOGIES INC. +08:00:58 SYSTEMS CONCEPTS +08:00:50 DAISY SYSTEMS CORP. +08:00:52 INSYSTEC +08:00:47 SEQUENT COMPUTER SYSTEMS INC. +08:00:45 CONCURRENT COMPUTER CORP. +08:00:44 DAVID SYSTEMS INC. +08:00:41 RACAL-MILGO INFORMATION SYS.. +08:00:38 BULL S.A.S. +08:00:3C SCHLUMBERGER WELL SERVICES +08:00:34 FILENET CORPORATION +08:00:2C BRITTON LEE INC. +00:00:B9 MCDONNELL DOUGLAS COMPUTER SYS +00:00:2D CHROMATICS INC +00:00:4A ADC CODENOLL TECHNOLOGY CORP. +00:00:C0 WESTERN DIGITAL CORPORATION +00:00:40 APPLICON, INC. +00:00:5D CS TELECOM +08:00:8E Tandem Computers +08:00:86 KONICA MINOLTA HOLDINGS, INC. +08:00:83 Seiko Instruments Inc. +08:00:80 AES DATA INC. +08:00:30 ROYAL MELBOURNE INST OF TECH +08:00:64 Sitasys AG +00:DD:09 UNGERMANN-BASS INC. +08:00:8A PerfTech, Inc. +00:DD:04 UNGERMANN-BASS INC. +08:00:66 AGFA CORPORATION +08:00:1A TIARA/ 10NET +08:00:90 SONOMA SYSTEMS +08:00:0B UNISYS CORPORATION +08:00:17 NATIONAL SEMICONDUCTOR +00:00:5E ICANN, IANA Department +00:00:AF Canberra Industries, Inc. +00:00:EC MICROPROCESS +00:00:9E MARLI S.A. +00:00:42 METIER MANAGEMENT SYSTEMS LTD. +00:00:8D Cryptek Inc. +00:00:65 Network General Corporation +00:00:4D DCI CORPORATION +08:00:24 10NET COMMUNICATIONS/DCA +08:00:1E APOLLO COMPUTER INC. +08:00:1B EMC Corporation +00:DD:0D UNGERMANN-BASS INC. +AA:00:02 DIGITAL EQUIPMENT CORPORATION +08:00:05 SYMBOLICS INC. +00:00:00 XEROX CORPORATION +00:40:D6 LOCAMATION B.V. +80:00:10 ATT BELL LABORATORIES +AA:00:03 DIGITAL EQUIPMENT CORPORATION +08:00:08 BOLT BERANEK AND NEWMAN INC. +08:00:0E NCR CORPORATION +00:00:6F Madge Ltd. +00:00:5A SysKonnect GmbH +00:00:23 ABB INDUSTRIAL SYSTEMS AB +00:00:45 FORD AEROSPACE & COMM. CORP. +00:00:BC Rockwell Automation +00:00:C3 HARRIS CORP COMPUTER SYS DIV +00:00:04 XEROX CORPORATION +00:00:09 XEROX CORPORATION +00:00:3D UNISYS +F8:2C:18 2Wire Inc +00:17:3F Belkin International Inc. +38:86:02 Flexoptix GmbH +F4:EB:38 Sagemcom Broadband SAS +00:1E:74 Sagemcom Broadband SAS +00:60:4C Sagemcom Broadband SAS +00:26:91 Sagemcom Broadband SAS +C0:D0:44 Sagemcom Broadband SAS +6C:2E:85 Sagemcom Broadband SAS +CC:33:BB Sagemcom Broadband SAS +68:15:90 Sagemcom Broadband SAS +54:64:D9 Sagemcom Broadband SAS +00:02:3F COMPAL ELECTRONICS, INC. +00:80:C2 IEEE 802.1 +C4:66:99 vivo Mobile Communication Co., Ltd. +38:3B:C8 2Wire Inc +DC:7F:A4 2Wire Inc +00:12:88 2Wire Inc +00:1E:C7 2Wire Inc +28:16:2E 2Wire Inc +3C:EA:4F 2Wire Inc +84:8F:69 Dell Inc. +90:B1:1C Dell Inc. +F8:CA:B8 Dell Inc. +24:B6:FD Dell Inc. +00:0D:56 Dell Inc. +00:12:3F Dell Inc. +00:13:72 Dell Inc. +74:86:7A Dell Inc. +34:17:EB Dell Inc. +EC:88:92 Motorola Mobility LLC, a Lenovo Company +B0:79:94 Motorola Mobility LLC, a Lenovo Company +14:1A:A3 Motorola Mobility LLC, a Lenovo Company +CC:C3:EA Motorola Mobility LLC, a Lenovo Company +34:BB:26 Motorola Mobility LLC, a Lenovo Company +40:78:6A Motorola Mobility LLC, a Lenovo Company +00:19:B9 Dell Inc. +00:22:19 Dell Inc. +00:B0:D0 Dell Inc. +5C:26:0A Dell Inc. +B0:83:FE Dell Inc. +14:18:77 Dell Inc. +00:24:E8 Dell Inc. +A4:8E:0A DeLaval International AB +00:21:5C Intel Corporate +00:23:15 Intel Corporate +00:15:00 Intel Corporate +10:4A:7D Intel Corporate +A4:C4:94 Intel Corporate +90:2E:1C Intel Corporate +3C:FD:FE Intel Corporate +B8:BF:83 Intel Corporate +00:1D:E1 Intel Corporate +00:22:FB Intel Corporate +08:11:96 Intel Corporate +60:36:DD Intel Corporate +A0:36:9F Intel Corporate +50:2D:A2 Intel Corporate +4C:79:BA Intel Corporate +4C:EB:42 Intel Corporate +60:67:20 Intel Corporate +84:A6:C8 Intel Corporate +58:91:CF Intel Corporate +88:53:2E Intel Corporate +00:24:D7 Intel Corporate +C4:09:38 FUJIAN STAR-NET COMMUNICATION CO.,LTD +00:AA:02 Intel Corporation +5C:D2:E4 Intel Corporate +04:BD:88 Aruba Networks +00:0B:86 Aruba Networks +88:96:F2 Valeo Schalter und Sensoren GmbH +80:A5:89 AzureWave Technology Inc. +0C:CC:26 Airenetworks +4C:B0:E8 Beijing RongZhi xinghua technology co., LTD +4C:14:A3 TCL Technoly Electronics (Huizhou) Co., Ltd. +F4:8E:38 Dell Inc. +D8:87:D5 Leadcore Technology CO.,LTD +00:DA:55 Cisco Systems, Inc +80:D2:1D AzureWave Technology Inc. +70:5A:0F Hewlett Packard +58:63:56 FN-LINK TECHNOLOGY LIMITED +B0:46:FC MitraStar Technology Corp. +08:A9:5A AzureWave Technology Inc. +6C:AD:F8 AzureWave Technology Inc. +54:27:1E AzureWave Technology Inc. +00:8C:54 ADB Broadband Italia +F0:84:2F ADB Broadband Italia +8C:B8:64 AcSiP Technology Corp. +00:20:E0 Actiontec Electronics, Inc +00:04:E3 Accton Technology Corp +40:95:58 Aisino Corporation +00:D0:C9 ADVANTECH CO., LTD. +00:25:53 ADB Broadband Italia +00:23:8E ADB Broadband Italia +00:1C:A2 ADB Broadband Italia +00:17:C2 ADB Broadband Italia +D0:D4:12 ADB Broadband Italia +00:0F:A3 Alpha Networks Inc. +00:1D:6A Alpha Networks Inc. +00:00:F4 Allied Telesis, Inc. +10:AE:60 Private +F0:4F:7C Private +70:F1:A1 Liteon Technology Corporation +6C:FA:A7 AMPAK Technology, Inc. +00:24:EF Sony Mobile Communications AB +6C:0E:0D Sony Mobile Communications AB +B4:52:7D Sony Mobile Communications AB +E0:63:E5 Sony Mobile Communications AB +00:0E:07 Sony Mobile Communications AB +00:1A:75 Sony Mobile Communications AB +00:16:B8 Sony Mobile Communications AB +00:1D:28 Sony Mobile Communications AB +00:1F:E4 Sony Mobile Communications AB +00:22:98 Sony Mobile Communications AB +24:FD:52 Liteon Technology Corporation +20:16:D8 Liteon Technology Corporation +9C:B7:0D Liteon Technology Corporation +1C:65:9D Liteon Technology Corporation +00:1B:9E ASKEY COMPUTER CORP +E0:CA:94 ASKEY COMPUTER CORP +C0:D9:62 ASKEY COMPUTER CORP +00:15:0C AVM GmbH +74:44:01 NETGEAR +E0:91:F5 NETGEAR +00:1B:2F NETGEAR +00:22:3F NETGEAR +E0:46:9A NETGEAR +F4:0B:93 BlackBerry RTS +68:ED:43 BlackBerry RTS +34:BB:1F BlackBerry RTS +48:9D:24 BlackBerry RTS +00:0F:86 BlackBerry RTS +00:13:33 BaudTec Corporation +50:7E:5D Arcadyan Technology Corporation +84:9C:A6 Arcadyan Technology Corporation +1C:C6:3C Arcadyan Technology Corporation +C0:25:06 AVM GmbH +08:96:D7 AVM GmbH +00:8E:F2 NETGEAR +44:94:FC NETGEAR +20:E5:2A NETGEAR +9C:D3:6D NETGEAR +C4:04:15 NETGEAR +08:BD:43 NETGEAR +4C:09:D4 Arcadyan Technology Corporation +DC:44:6D Allwinner Technology Co., Ltd +BC:62:0E HUAWEI TECHNOLOGIES CO.,LTD +78:F5:57 HUAWEI TECHNOLOGIES CO.,LTD +E0:28:61 HUAWEI TECHNOLOGIES CO.,LTD +C4:47:3F HUAWEI TECHNOLOGIES CO.,LTD +00:0A:F7 Broadcom +00:0D:B6 Broadcom +18:C0:86 Broadcom +C0:3E:0F BSkyB Ltd +00:20:D4 Cabletron Systems, Inc. +00:00:1D Cabletron Systems, Inc. +00:60:BB Cabletron Systems, Inc. +D0:54:2D Cambridge Industries(Group) Co.,Ltd. +00:1F:C7 Casio Hitachi Mobile Communications Co., Ltd. +AC:EE:9E Samsung Electronics Co.,Ltd +C0:89:97 Samsung Electronics Co.,Ltd +28:27:BF Samsung Electronics Co.,Ltd +F0:5B:7B Samsung Electronics Co.,Ltd +7C:F9:0E Samsung Electronics Co.,Ltd +AC:5A:14 Samsung Electronics Co.,Ltd +B0:C5:59 Samsung Electronics Co.,Ltd +BC:D1:1F Samsung Electronics Co.,Ltd +A0:B4:A5 Samsung Electronics Co.,Ltd +80:65:6D Samsung Electronics Co.,Ltd +48:13:7E Samsung Electronics Co.,Ltd +E8:3A:12 Samsung Electronics Co.,Ltd +9C:02:98 Samsung Electronics Co.,Ltd +6C:83:36 Samsung Electronics Co.,Ltd +B8:C6:8E Samsung Electronics Co.,Ltd +74:45:8A Samsung Electronics Co.,Ltd +A4:9A:58 Samsung Electronics Co.,Ltd +B4:EF:39 Samsung Electronics Co.,Ltd +14:A3:64 Samsung Electronics Co.,Ltd +3C:A1:0D Samsung Electronics Co.,Ltd +20:6E:9C Samsung Electronics Co.,Ltd +18:3F:47 Samsung Electronics Co.,Ltd +0C:71:5D Samsung Electronics Co.,Ltd +0C:14:20 Samsung Electronics Co.,Ltd +A8:06:00 Samsung Electronics Co.,Ltd +6C:F3:73 Samsung Electronics Co.,Ltd +90:F1:AA Samsung Electronics Co.,Ltd +C4:57:6E Samsung Electronics Co.,Ltd +78:BD:BC Samsung Electronics Co.,Ltd +38:72:C0 Comtrend Corporation +F4:06:8D devolo AG +00:0B:CA DATAVAN TC +00:50:7F DrayTek Corp. +3C:89:70 Neosfar +C4:36:55 Shenzhen Fenglian Technology Co., Ltd. +78:CB:68 DAEHAP HYPER-TECH +00:1A:7F GCI Science & Technology Co.,LTD +00:05:4F Private +D0:4D:2C Roku, Inc. +E0:0C:7F Nintendo Co., Ltd. +58:BD:A3 Nintendo Co., Ltd. +00:25:A0 Nintendo Co., Ltd. +00:26:59 Nintendo Co., Ltd. +8C:56:C5 Nintendo Co., Ltd. +CC:9E:00 Nintendo Co., Ltd. +00:16:56 Nintendo Co., Ltd. +00:19:1D Nintendo Co., Ltd. +00:19:FD Nintendo Co., Ltd. +00:1E:A9 Nintendo Co., Ltd. +A8:44:81 Nokia Corporation +88:44:F6 Nokia Corporation +A8:7B:39 Nokia Corporation +14:C1:26 Nokia Corporation +4C:25:78 Nokia Corporation +00:1E:A4 Nokia Danmark A/S +00:12:62 Nokia Danmark A/S +00:17:4B Nokia Danmark A/S +00:25:47 Nokia Danmark A/S +00:1D:E9 Nokia Danmark A/S +00:1D:3B Nokia Danmark A/S +00:14:A7 Nokia Danmark A/S +00:1C:D6 Nokia Danmark A/S +D0:99:D5 Alcatel-Lucent +DC:00:77 TP-LINK TECHNOLOGIES CO.,LTD. +00:60:DC NEC Magnus Communications,Ltd. +9C:AE:D3 Seiko Epson Corporation +F4:5C:89 Apple, Inc. +8C:3C:4A NAKAYO TELECOMMUNICATIONS,INC +00:21:FD LACROIX TRAFFIC S.A.U +4C:B4:4A NANOWAVE Technologies Inc. +78:C3:E9 Samsung Electronics Co.,Ltd +9C:5C:8E ASUSTek COMPUTER INC. +70:88:4D JAPAN RADIO CO., LTD. +10:2A:B3 Xiaomi Communications Co Ltd +4C:55:CC Zentri Pty Ltd +BC:EC:5D Apple, Inc. +DC:41:5F Apple, Inc. +30:63:6B Apple, Inc. +84:68:3E Intel Corporate +C8:87:22 Lumenpulse +FC:1A:11 vivo Mobile Communication Co., Ltd. +30:A9:DE LG Innotek +E0:CD:FD Beijing E3Control Technology Co, LTD +20:8B:37 Skyworth Digital Technology(Shenzhen) Co.,Ltd +08:BE:77 Green Electronics +28:0C:28 Unigen DataStorage Corporation +98:0C:A5 Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. +1C:C0:35 PLANEX COMMUNICATIONS INC. +34:54:3C TAKAOKA TOKO CO.,LTD. +D4:95:24 Clover Network, Inc. +00:34:DA LG Electronics (Mobile Communications) +90:46:A2 Tedipay UK Ltd +64:79:A7 Phison Electronics Corp. +C8:38:70 Samsung Electronics Co.,Ltd +28:83:35 Samsung Electronics Co.,Ltd +44:78:3E Samsung Electronics Co.,Ltd +20:2D:07 Samsung Electronics Co.,Ltd +04:52:C7 Bose Corporation +D4:61:2E HUAWEI TECHNOLOGIES CO.,LTD +1C:67:58 HUAWEI TECHNOLOGIES CO.,LTD +E8:56:59 Advanced-Connectek Inc. +34:E7:0B Beijing HAN Networks Co., Ltd +88:01:F2 Vitec System Engineering Inc. +FC:08:4A FUJITSU LIMITED +D4:AD:2D Fiberhome Telecommunication Technologies Co.,LTD +48:55:5F Fiberhome Telecommunication Technologies Co.,LTD +84:7B:EB Dell Inc. +F8:C9:6C Fiberhome Telecommunication Technologies Co.,LTD +34:BF:90 Fiberhome Telecommunication Technologies Co.,LTD +D4:67:E7 Fiberhome Telecommunication Technologies Co.,LTD +04:C1:B9 Fiberhome Telecommunication Technologies Co.,LTD +68:93:61 Integrated Device Technology (Malaysia) Sdn. Bhd. +A0:82:AC Linear DMS Solutions Sdn. Bhd. +00:26:97 Alpha Technologies Inc. +4C:B8:B5 Shenzhen YOUHUA Technology Co., Ltd +1C:AB:C0 Hitron Technologies. Inc +84:E3:23 Green Wave Telecommunication SDN BHD +44:65:0D Amazon Technologies Inc. +D8:97:BA PEGATRON CORPORATION +70:71:BC PEGATRON CORPORATION +E0:69:95 PEGATRON CORPORATION +54:D9:E4 BRILLIANTTS CO., LTD +E4:F3:F5 SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. +00:08:9F EFM Networks +00:18:5C EDSLAB Technologies +00:0E:2E Edimax Technology Co. Ltd. +00:02:0E ECI Telecom Ltd. +00:11:5B Elitegroup Computer Systems Co.,Ltd. +00:07:95 Elitegroup Computer Systems Co.,Ltd. +B8:AE:ED Elitegroup Computer Systems Co.,Ltd. +C0:3F:D5 Elitegroup Computer Systems Co.,Ltd. +74:27:EA Elitegroup Computer Systems Co.,Ltd. +00:00:C9 Emulex Corporation +00:1A:45 GN Netcom A/S +00:16:8F GN Netcom A/S +08:3F:BC zte corporation +04:2A:E2 Cisco Systems, Inc +1C:1B:0D GIGA-BYTE TECHNOLOGY CO.,LTD. +90:38:09 Ericsson AB +00:10:4F Oracle Corporation +00:07:82 Oracle Corporation +E4:2F:56 OptoMET GmbH +00:A0:45 PHOENIX CONTACT Electronics GmbH +00:26:6C INVENTEC Corporation +00:1E:25 INTEK DIGITAL +A0:B6:62 Acutvista Innovation Co., Ltd. +00:C0:F0 Kingston Technology Company, Inc. +4C:8F:A5 Jastec +00:0C:49 Dangaard Telecom Denmark A/S +CC:E1:7F Juniper Networks +44:F4:77 Juniper Networks +5C:45:27 Juniper Networks +F0:1C:2D Juniper Networks +F8:C0:01 Juniper Networks +78:FE:3D Juniper Networks +54:E0:32 Juniper Networks +3C:61:04 Juniper Networks +BC:75:74 HUAWEI TECHNOLOGIES CO.,LTD +20:A6:80 HUAWEI TECHNOLOGIES CO.,LTD +00:19:E2 Juniper Networks +00:1F:12 Juniper Networks +00:24:DC Juniper Networks +50:C5:8D Juniper Networks +00:05:85 Juniper Networks +00:31:46 Juniper Networks +80:AC:AC Juniper Networks +50:DD:4F Automation Components, Inc +90:4D:4A Sagemcom Broadband SAS +7C:79:E8 PayRange Inc. +54:05:93 WOORI ELEC Co.,Ltd +A0:67:BE Sicon srl +C4:CA:D9 Hangzhou H3C Technologies Co., Limited +74:25:8A Hangzhou H3C Technologies Co., Limited +70:F9:6D Hangzhou H3C Technologies Co., Limited +00:26:0F Linn Products Ltd +F8:45:AD Konka Group Co., Ltd. +00:03:58 Hanyang Digitech Co.Ltd +00:07:61 29530 +60:51:2C TCT mobile ltd +90:5F:2E TCT mobile ltd +4C:0B:3A TCT mobile ltd +C0:2F:F1 Volta Networks +48:82:F2 Appel Elektronik GmbH +0C:51:01 Apple, Inc. +08:6D:41 Apple, Inc. +04:D3:CF Apple, Inc. +30:C8:2A WI-BIZ srl +00:62:EC Cisco Systems, Inc +0C:8A:87 AgLogica Holdings, Inc +34:A2:A2 HUAWEI TECHNOLOGIES CO.,LTD +20:F1:7C HUAWEI TECHNOLOGIES CO.,LTD +34:B3:54 HUAWEI TECHNOLOGIES CO.,LTD +74:9D:8F HUAWEI TECHNOLOGIES CO.,LTD +34:6A:C2 HUAWEI TECHNOLOGIES CO.,LTD +50:F5:DA Amazon Technologies Inc. +8C:D2:E9 NIPPON SMT Co.Ltd +C8:3D:FC Pioneer DJ Corporation +00:16:FB SHENZHEN MTC CO LTD +08:01:0F SICHUAN TIANYI COMHEART TELECOMCO.,LTD +38:1D:D9 FN-LINK TECHNOLOGY LIMITED +6C:95:22 Scalys +8C:59:C3 ADB Italia +60:C0:BF ON Semiconductor +98:39:8E Samsung Electronics Co.,Ltd +34:8A:7B Samsung Electronics Co.,Ltd +BC:76:5E Samsung Electronics Co.,Ltd +E0:A8:B8 Le Shi Zhi Xin Electronic Technology (Tianjin) Limited +B8:81:98 Intel Corporate +CC:A2:60 SICHUAN TIANYI COMHEART TELECOMCO.,LTD +E4:FB:8F MOBIWIRE MOBILES (NINGBO) CO.,LTD +78:00:9E Samsung Electronics Co.,Ltd +C8:AF:E3 Hefei Radio Communication Technology Co., Ltd +7C:35:48 Transcend Information +E8:3A:97 Toshiba Corporation +9C:8E:CD Amcrest Technologies +28:25:36 SHENZHEN HOLATEK CO.,LTD +FC:A8:9A Sunitec Enterprise Co.,Ltd +B8:F8:BE BLUECOM +60:73:BC zte corporation +90:EE:D9 UNIVERSAL DE DESARROLLOS ELECTRÓNICOS, SA +04:31:10 Inspur Group Co., Ltd. +00:21:5B SenseAnywhere +C8:16:BD Qingdao Hisense Communications Co.,Ltd. +58:7E:61 Qingdao Hisense Communications Co.,Ltd. +34:0A:FF Qingdao Hisense Communications Co.,Ltd. +F8:5A:00 Sanford LP +50:67:F0 ZyXEL Communications Corporation +C8:6C:87 ZyXEL Communications Corporation +D8:E0:B8 BULAT LLC +68:C4:4D Motorola Mobility LLC, a Lenovo Company +48:FC:B6 LAVA INTERNATIONAL(H.K) LIMITED +CC:35:40 Technicolor CH USA Inc. +C4:27:95 Technicolor CH USA Inc. +58:23:8C Technicolor CH USA Inc. +70:5A:9E Technicolor CH USA Inc. +80:C6:AB Technicolor CH USA Inc. +90:A4:DE Wistron Neweb Corporation +3C:97:0E Wistron InfoComm(Kunshan)Co.,Ltd. +30:14:4A Wistron Neweb Corporation +A8:54:B2 Wistron Neweb Corporation +38:BC:1A MEIZU Technology Co., Ltd. +00:04:A3 Microchip Technology Inc. +98:CF:53 BBK EDUCATIONAL ELECTRONICS CORP.,LTD. +F4:CB:52 HUAWEI TECHNOLOGIES CO.,LTD +44:6E:E5 HUAWEI TECHNOLOGIES CO.,LTD +2C:28:2D BBK EDUCATIONAL ELECTRONICS CORP.,LTD. +80:41:4E BBK EDUCATIONAL ELECTRONICS CORP.,LTD. +8C:77:16 LONGCHEER TELECOMMUNICATION LIMITED +00:0A:08 Alpine Electronics, Inc. +A0:14:3D PARROT SA +00:26:7E PARROT SA +00:12:1C PARROT SA +B8:55:10 Zioncom Electronics (Shenzhen) Ltd. +00:0E:E8 Zioncom Electronics (Shenzhen) Ltd. +00:11:65 ZNYX Networks, Inc. +00:60:D5 AMADA MIYACHI Co., Ltd +00:0F:DB Westell Technologies Inc. +D4:04:FF Juniper Networks +C4:54:44 QUANTA COMPUTER INC. +00:26:9E QUANTA COMPUTER INC. +68:35:63 SHENZHEN LIOWN ELECTRONICS CO.,LTD. +00:03:B2 Radware +2C:60:0C QUANTA COMPUTER INC. +00:1E:68 QUANTA COMPUTER INC. +00:A0:9B QPSX COMMUNICATIONS, LTD. +00:E0:8B QLogic Corporation +00:08:0D Toshiba +00:15:B7 Toshiba +00:05:69 VMware, Inc. +00:08:F1 Voltaire +00:1B:DA UTStarcom Inc +FC:4D:D4 Universal Global Scientific Industrial Co., Ltd. +40:2C:F4 Universal Global Scientific Industrial Co., Ltd. +00:10:C6 Universal Global Scientific Industrial Co., Ltd. +00:24:7E Universal Global Scientific Industrial Co., Ltd. +DC:9F:DB Ubiquiti Networks +00:16:39 Ubiquam Co., Ltd. +18:39:19 Unicoi Systems +90:A4:6A SISNET CO., LTD +14:E7:C8 Integrated Device Technology (Malaysia) Sdn. Bhd. +28:0D:FC Sony Interactive Entertainment Inc. +00:15:C1 Sony Interactive Entertainment Inc. +00:19:C5 Sony Interactive Entertainment Inc. +AC:A2:13 Shenzhen Bilian electronic CO.,LTD +38:F8:CA OWIN Inc. +54:D2:72 Nuki Home Solutions GmbH +9C:A3:A9 Guangzhou Juan Optical and Electronical Tech Joint Stock Co., Ltd +D0:22:12 IEEE Registration Authority +F8:02:78 IEEE Registration Authority +74:E1:4A IEEE Registration Authority +78:CA:83 IEEE Registration Authority +D0:D9:4F IEEE Registration Authority +2C:26:5F IEEE Registration Authority +7C:70:BC IEEE Registration Authority +58:FC:DB IEEE Registration Authority +B0:1F:81 IEEE Registration Authority +11:00:AA Private +00:20:67 Private +98:93:CC LG ELECTRONICS INC +3C:CD:93 LG ELECTRONICS INC +58:3F:54 LG Electronics (Mobile Communications) +00:1C:62 LG Electronics (Mobile Communications) +00:24:83 LG Electronics (Mobile Communications) +E4:17:D8 8BITDO TECHNOLOGY HK LIMITED +40:B0:FA LG Electronics (Mobile Communications) +A0:91:69 LG Electronics (Mobile Communications) +28:6C:07 XIAOMI Electronics,CO.,LTD +84:D9:31 Hangzhou H3C Technologies Co., Limited +34:FC:EF LG Electronics (Mobile Communications) +48:59:29 LG Electronics (Mobile Communications) +50:55:27 LG Electronics (Mobile Communications) +98:D6:F7 LG Electronics (Mobile Communications) +A8:92:2C LG Electronics (Mobile Communications) +44:DC:91 PLANEX COMMUNICATIONS INC. +9C:D3:32 PLC Technology Ltd +94:D7:23 Shanghai DareGlobal Technologies Co.,Ltd +A8:9D:D2 Shanghai DareGlobal Technologies Co.,Ltd +90:3A:A0 Alcatel-Lucent Canada +18:4A:6F Alcatel-Lucent Shanghai Bell Co., Ltd +FC:2F:AA Alcatel-Lucent Canada +BC:52:B4 Alcatel-Lucent Canada +A0:F3:E4 Alcatel-Lucent IPD +00:21:05 Alcatel-Lucent IPD +00:07:72 Alcatel-Lucent Shanghai Bell Co., Ltd +F0:6B:CA Samsung Electronics Co.,Ltd +34:23:BA SAMSUNG ELECTRO-MECHANICS(THAILAND) +D0:22:BE SAMSUNG ELECTRO-MECHANICS(THAILAND) +D0:25:44 SAMSUNG ELECTRO-MECHANICS(THAILAND) +BC:20:A4 Samsung Electronics Co.,Ltd +14:F4:2A Samsung Electronics Co.,Ltd +BC:85:1F Samsung Electronics Co.,Ltd +B8:5E:7B Samsung Electronics Co.,Ltd +C4:62:EA Samsung Electronics Co.,Ltd +00:23:D6 Samsung Electronics Co.,Ltd +00:24:91 Samsung Electronics Co.,Ltd +00:1B:98 Samsung Electronics Co.,Ltd +44:F4:59 Samsung Electronics Co.,Ltd +34:C3:AC Samsung Electronics Co.,Ltd +94:D7:71 Samsung Electronics Co.,Ltd +4C:3C:16 Samsung Electronics Co.,Ltd +94:01:C2 Samsung Electronics Co.,Ltd +B4:3A:28 Samsung Electronics Co.,Ltd +A8:C8:3A HUAWEI TECHNOLOGIES CO.,LTD +84:9F:B5 HUAWEI TECHNOLOGIES CO.,LTD +D0:C1:B1 Samsung Electronics Co.,Ltd +F0:08:F1 Samsung Electronics Co.,Ltd +78:20:79 ID Tech +98:23:4E Micromedia AG +E0:DD:C0 vivo Mobile Communication Co., Ltd. +70:25:26 Alcatel-Lucent Canada +98:2F:3C Sichuan Changhong Electric Ltd. +38:0D:D4 Primax Electronics Ltd. +98:FD:B4 Primax Electronics Ltd. +00:15:7D POSDATA +F8:E6:1A Samsung Electronics Co.,Ltd +88:83:22 Samsung Electronics Co.,Ltd +84:B5:41 Samsung Electronics Co.,Ltd +18:DC:56 Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd +00:1F:46 Nortel Networks +00:1F:0A Nortel Networks +00:13:0A Nortel Networks +00:1E:7E Nortel Networks +00:1C:9C Nortel Networks +00:0C:F8 Nortel Networks +00:0C:F7 Nortel Networks +00:1E:1F Nortel Networks +00:1C:17 Nortel Networks +00:18:2E XStreamHD +50:01:6B HUAWEI TECHNOLOGIES CO.,LTD +58:98:6F Revolution Display +28:AC:67 Mach Power, Rappresentanze Internazionali s.r.l. +B0:B2:8F Sagemcom Broadband SAS +DC:1A:01 Ecoliv Technology ( Shenzhen ) Ltd. +7C:FE:90 Mellanox Technologies, Inc. +00:02:C9 Mellanox Technologies, Inc. +D0:5F:B8 Texas Instruments +C4:BE:84 Texas Instruments +78:A5:04 Texas Instruments +7C:66:9D Texas Instruments +D0:39:72 Texas Instruments +E0:E5:CF Texas Instruments +7C:EC:79 Texas Instruments +74:D6:EA Texas Instruments +00:17:EB Texas Instruments +88:33:14 Texas Instruments +84:DD:20 Texas Instruments +1C:45:93 Texas Instruments +5C:6B:32 Texas Instruments +00:17:E4 Texas Instruments +D0:37:61 Texas Instruments +00:24:BA Texas Instruments +00:22:A5 Texas Instruments +00:21:BA Texas Instruments +00:18:33 Texas Instruments +D8:95:2F Texas Instruments +64:9C:8E Texas Instruments +F4:FC:32 Texas Instruments +74:DA:EA Texas Instruments +04:A3:16 Texas Instruments +98:07:2D Texas Instruments +00:1A:B6 Texas Instruments +C8:A0:30 Texas Instruments +34:B1:F7 Texas Instruments +C4:ED:BA Texas Instruments +A4:0D:BC Xiamen Intretech Inc. +EC:8E:AE Nagravision SA +60:64:05 Texas Instruments +70:8B:CD ASUSTek COMPUTER INC. +00:1A:21 Brookhuis Applied Technologies BV +00:A0:0E NetScout Systems, Inc. +1C:33:0E PernixData +34:57:60 MitraStar Technology Corp. +34:3D:C4 BUFFALO.INC +6C:EF:C6 SHENZHEN TWOWING TECHNOLOGIES CO.,LTD. +98:6B:3D ARRIS Group, Inc. +CC:65:AD ARRIS Group, Inc. +78:96:84 ARRIS Group, Inc. +90:C7:92 ARRIS Group, Inc. +00:15:CF ARRIS Group, Inc. +38:6B:BB ARRIS Group, Inc. +00:E0:6F ARRIS Group, Inc. +00:04:BD ARRIS Group, Inc. +5C:57:1A ARRIS Group, Inc. +00:1D:D0 ARRIS Group, Inc. +00:1D:D5 ARRIS Group, Inc. +00:1D:CF ARRIS Group, Inc. +E8:ED:05 ARRIS Group, Inc. +90:1A:CA ARRIS Group, Inc. +00:2A:10 Cisco Systems, Inc +74:E7:C6 ARRIS Group, Inc. +74:F6:12 ARRIS Group, Inc. +DC:45:17 ARRIS Group, Inc. +F8:0B:BE ARRIS Group, Inc. +6C:C1:D2 ARRIS Group, Inc. +14:5B:D1 ARRIS Group, Inc. +B0:77:AC ARRIS Group, Inc. +B8:16:19 ARRIS Group, Inc. +A4:15:88 ARRIS Group, Inc. +38:70:0C ARRIS Group, Inc. +FC:51:A4 ARRIS Group, Inc. +28:7A:EE ARRIS Group, Inc. +64:12:69 ARRIS Group, Inc. +00:1C:C3 ARRIS Group, Inc. +14:D4:FE ARRIS Group, Inc. +70:B1:4E ARRIS Group, Inc. +D8:25:22 ARRIS Group, Inc. +70:76:30 ARRIS Group, Inc. +00:0C:E5 ARRIS Group, Inc. +00:0E:5C ARRIS Group, Inc. +00:15:A8 ARRIS Group, Inc. +00:17:00 ARRIS Group, Inc. +00:19:A6 ARRIS Group, Inc. +00:14:E8 ARRIS Group, Inc. +00:21:80 ARRIS Group, Inc. +00:26:BA ARRIS Group, Inc. +00:26:41 ARRIS Group, Inc. +00:23:74 ARRIS Group, Inc. +00:25:F2 ARRIS Group, Inc. +00:19:C0 ARRIS Group, Inc. +88:6A:B1 vivo Mobile Communication Co., Ltd. +44:D6:E1 Snuza International Pty. Ltd. +00:15:B9 Samsung Electronics Co.,Ltd +00:1D:F6 Samsung Electronics Co.,Ltd +00:25:66 5481 +00:26:5F 5481 +D4:88:90 5481 +78:47:1D 5481 +38:16:D1 5481 +EC:E0:9B Samsung Electronics Co.,Ltd +60:6B:BD Samsung Electronics Co.,Ltd +00:00:F0 Samsung Electronics Co.,Ltd +48:44:F7 Samsung Electronics Co.,Ltd +DC:71:44 SAMSUNG ELECTRO MECHANICS CO., LTD. +A0:0B:BA SAMSUNG ELECTRO MECHANICS CO., LTD. +1C:5A:3E Samsung Electronics Co.,Ltd +F4:7B:5E Samsung Electronics Co.,Ltd +C4:46:19 Hon Hai Precision Ind. Co.,Ltd. +F0:F0:02 Hon Hai Precision Ind. Co.,Ltd. +88:9F:FA Hon Hai Precision Ind. Co.,Ltd. +5C:AC:4C Hon Hai Precision Ind. Co.,Ltd. +18:F4:6A Hon Hai Precision Ind. Co.,Ltd. +38:59:F9 Hon Hai Precision Ind. Co.,Ltd. +BC:85:56 Hon Hai Precision Ind. Co.,Ltd. +9C:2A:70 Hon Hai Precision Ind. Co.,Ltd. +F8:2F:A8 Hon Hai Precision Ind. Co.,Ltd. +0C:EE:E6 Hon Hai Precision Ind. Co.,Ltd. +0C:60:76 Hon Hai Precision Ind. Co.,Ltd. +90:FB:A6 Hon Hai Precision Ind. Co.,Ltd. +00:19:7D Hon Hai Precision Ind. Co.,Ltd. +00:1C:26 Hon Hai Precision Ind. Co.,Ltd. +9C:AD:97 Hon Hai Precision Ind. Co.,Ltd. +2C:81:58 Hon Hai Precision Ind. Co.,Ltd. +14:2D:27 Hon Hai Precision Ind. Co.,Ltd. +84:3D:C6 Cisco Systems, Inc +2C:39:96 Sagemcom Broadband SAS +00:54:BD Swelaser AB +00:57:D2 Cisco Systems, Inc +3C:67:16 Lily Robotics +80:6A:B0 Shenzhen TINNO Mobile Technology Corp. +A0:F8:95 Shenzhen TINNO Mobile Technology Corp. +00:78:CD Ignition Design Labs +28:ED:6A Apple, Inc. +34:AB:37 Apple, Inc. +60:A3:7D Apple, Inc. +00:56:CD Apple, Inc. +70:81:EB Apple, Inc. +08:66:98 Apple, Inc. +00:29:26 Applied Optoelectronics, Inc Taiwan Branch +2C:FD:37 Blue Calypso, Inc. +0C:61:27 Actiontec Electronics, Inc +00:1B:11 D-Link Corporation +00:1E:58 D-Link Corporation +00:21:91 D-Link Corporation +00:22:B0 D-Link Corporation +F0:7D:68 D-Link Corporation +78:54:2E D-Link International +3C:DD:89 SOMO HOLDINGS & TECH. CO.,LTD. +2C:56:DC ASUSTek COMPUTER INC. +B8:AF:67 Hewlett Packard +18:8B:45 Cisco Systems, Inc +B0:C0:90 Chicony Electronics Co., Ltd. +1C:A7:70 SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD +C4:2F:90 Hangzhou Hikvision Digital Technology Co.,Ltd. +9C:5D:12 Aerohive Networks Inc. +A4:2B:B0 TP-LINK TECHNOLOGIES CO.,LTD. +4C:E6:76 BUFFALO.INC +B0:C7:45 BUFFALO.INC +CC:E1:D5 BUFFALO.INC +B8:FC:9A Le Shi Zhi Xin Electronic Technology (Tianjin) Limited +2C:41:38 Hewlett Packard +2C:76:8A Hewlett Packard +00:18:FE Hewlett Packard +00:19:BB Hewlett Packard +00:22:64 Hewlett Packard +00:24:81 Hewlett Packard +00:0D:9D Hewlett Packard +00:14:C2 Hewlett Packard +78:8B:77 Standar Telecom +84:AC:FB Crouzet Automatismes +34:BA:75 Tembo Systems, Inc. +94:86:CD SEOUL ELECTRONICS&TELECOM +94:AB:DE OMX Technology - FZE +00:0E:35 Intel Corporation +00:20:7B Intel Corporation +00:13:CE Intel Corporate +80:19:34 Intel Corporate +B8:B8:1E Intel Corporate +18:5E:0F Intel Corporate +C8:0E:77 Le Shi Zhi Xin Electronic Technology (Tianjin) Limited +84:34:97 Hewlett Packard +EC:B1:D7 Hewlett Packard +3C:A8:2A Hewlett Packard +48:0F:CF Hewlett Packard +58:20:B1 Hewlett Packard +2C:23:3A Hewlett Packard +00:0E:B3 Hewlett Packard +00:04:EA Hewlett Packard +00:30:6E Hewlett Packard +00:60:B0 Hewlett Packard +24:BE:05 Hewlett Packard +00:04:23 Intel Corporation +00:08:C7 Hewlett Packard +00:10:E3 Hewlett Packard +00:80:5F Hewlett Packard +BC:EA:FA Hewlett Packard +5C:8A:38 Hewlett Packard +D8:9D:67 Hewlett Packard +2C:44:FD Hewlett Packard +F0:92:1C Hewlett Packard +B4:B5:2F Hewlett Packard +90:21:55 HTC Corporation +64:A7:69 HTC Corporation +BC:CF:CC HTC Corporation +B0:F1:A3 Fengfan (BeiJing) Technology Co., Ltd. +7C:7D:3D HUAWEI TECHNOLOGIES CO.,LTD +44:82:E5 HUAWEI TECHNOLOGIES CO.,LTD +54:27:58 Motorola (Wuhan) Mobility Technologies Communication Co., Ltd. +4C:D0:8A HUMAX Co., Ltd. +20:90:6F Shenzhen Tencent Computer System Co., Ltd. +1C:78:39 Shenzhen Tencent Computer System Co., Ltd. +D8:37:BE Shanghai Gongjing Telecom Technology Co,LTD +A4:51:6F Microsoft Mobile Oy +FC:64:BA Xiaomi Communications Co Ltd +24:60:81 razberi technologies +8C:AB:8E Shanghai Feixun Communication Co.,Ltd. +90:60:F1 Apple, Inc. +EC:26:CA TP-LINK TECHNOLOGIES CO.,LTD. +A0:93:47 GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD +2C:08:8C HUMAX Co., Ltd. +40:F3:08 Murata Manufacturing Co., Ltd. +5C:DA:D4 Murata Manufacturing Co., Ltd. +00:0E:6D Murata Manufacturing Co., Ltd. +B0:5B:67 HUAWEI TECHNOLOGIES CO.,LTD +38:F8:89 HUAWEI TECHNOLOGIES CO.,LTD +F4:DC:F9 HUAWEI TECHNOLOGIES CO.,LTD +90:4E:2B HUAWEI TECHNOLOGIES CO.,LTD +0C:96:BF HUAWEI TECHNOLOGIES CO.,LTD +9C:C1:72 HUAWEI TECHNOLOGIES CO.,LTD +00:14:C9 Brocade Communications Systems, Inc. +00:01:0F Brocade Communications Systems, Inc. +08:00:88 Brocade Communications Systems, Inc. +00:05:1E Brocade Communications Systems, Inc. +38:46:08 zte corporation +B4:B3:62 zte corporation +B0:75:D5 zte corporation +08:18:1A zte corporation +00:25:12 zte corporation +CC:F9:54 Avaya Inc +70:30:18 Avaya Inc +B0:A3:7E Qingdao Haier Telecom Co.,Ltd +70:A8:E3 HUAWEI TECHNOLOGIES CO.,LTD +F8:4A:BF HUAWEI TECHNOLOGIES CO.,LTD +4C:B1:6C HUAWEI TECHNOLOGIES CO.,LTD +4C:1F:CC HUAWEI TECHNOLOGIES CO.,LTD +48:62:76 HUAWEI TECHNOLOGIES CO.,LTD +AC:4E:91 HUAWEI TECHNOLOGIES CO.,LTD +E4:68:A3 HUAWEI TECHNOLOGIES CO.,LTD +80:D0:9B HUAWEI TECHNOLOGIES CO.,LTD +58:1F:28 HUAWEI TECHNOLOGIES CO.,LTD +8C:34:FD HUAWEI TECHNOLOGIES CO.,LTD +90:67:1C HUAWEI TECHNOLOGIES CO.,LTD +58:7F:66 HUAWEI TECHNOLOGIES CO.,LTD +BC:25:E0 HUAWEI TECHNOLOGIES CO.,LTD +C4:07:2F HUAWEI TECHNOLOGIES CO.,LTD +0C:D6:BD HUAWEI TECHNOLOGIES CO.,LTD +A4:99:47 HUAWEI TECHNOLOGIES CO.,LTD +34:6B:D3 HUAWEI TECHNOLOGIES CO.,LTD +1C:1D:67 HUAWEI TECHNOLOGIES CO.,LTD +84:A8:E4 HUAWEI TECHNOLOGIES CO.,LTD +20:2B:C1 HUAWEI TECHNOLOGIES CO.,LTD +34:75:C7 Avaya Inc +6C:FA:58 Avaya Inc +64:A7:DD Avaya Inc +64:6A:52 Avaya Inc +F8:73:A2 Avaya Inc +64:C3:54 Avaya Inc +B4:B0:17 Avaya Inc +58:16:26 Avaya Inc +74:1B:B2 Apple, Inc. +00:25:86 TP-LINK TECHNOLOGIES CO.,LTD. +F8:D1:11 TP-LINK TECHNOLOGIES CO.,LTD. +F4:EC:38 TP-LINK TECHNOLOGIES CO.,LTD. +20:DC:E6 TP-LINK TECHNOLOGIES CO.,LTD. +1C:6E:4C Logistic Service & Engineering Co.,Ltd +00:10:1F Cisco Systems, Inc +00:10:54 Cisco Systems, Inc +DC:EB:94 Cisco Systems, Inc +5C:83:8F Cisco Systems, Inc +AC:7E:8A Cisco Systems, Inc +38:20:56 Cisco Systems, Inc +28:CF:E9 Apple, Inc. +00:50:2A Cisco Systems, Inc +00:50:14 Cisco Systems, Inc +00:90:D9 Cisco Systems, Inc +00:90:92 Cisco Systems, Inc +00:10:29 Cisco Systems, Inc +00:10:07 Cisco Systems, Inc +00:60:5C Cisco Systems, Inc +00:E0:F7 Cisco Systems, Inc +00:E0:B0 Cisco Systems, Inc +00:E0:FE Cisco Systems, Inc +00:E0:A3 Cisco Systems, Inc +00:E0:F9 Cisco Systems, Inc +00:1B:D7 Cisco SPVTG +10:51:72 HUAWEI TECHNOLOGIES CO.,LTD +90:17:AC HUAWEI TECHNOLOGIES CO.,LTD +94:04:9C HUAWEI TECHNOLOGIES CO.,LTD +C4:6A:B7 Xiaomi Communications Co Ltd +68:DF:DD Xiaomi Communications Co Ltd +64:B4:73 Xiaomi Communications Co Ltd +74:51:BA Xiaomi Communications Co Ltd +34:80:B3 Xiaomi Communications Co Ltd +50:06:AB Cisco Systems, Inc +00:50:E2 Cisco Systems, Inc +00:50:50 Cisco Systems, Inc +00:90:21 Cisco Systems, Inc +00:90:B1 Cisco Systems, Inc +00:02:3D Cisco Systems, Inc +18:E7:28 Cisco Systems, Inc +2C:3E:CF Cisco Systems, Inc +10:05:CA Cisco Systems, Inc +1C:DE:A7 Cisco Systems, Inc +1C:6A:7A Cisco Systems, Inc +CC:D8:C1 Cisco Systems, Inc +7C:0E:CE Cisco Systems, Inc +F0:9E:63 Cisco Systems, Inc +F0:7F:06 Cisco Systems, Inc +84:80:2D Cisco Systems, Inc +E0:89:9D Cisco Systems, Inc +A8:9D:21 Cisco Systems, Inc +BC:F1:F2 Cisco Systems, Inc +C8:00:84 Cisco Systems, Inc +A0:F8:49 Cisco Systems, Inc +88:90:8D Cisco Systems, Inc +A4:6C:2A Cisco Systems, Inc +00:21:BE Cisco SPVTG +7C:B2:1B Cisco SPVTG +00:26:43 ALPS ELECTRIC CO.,LTD. +00:24:33 ALPS ELECTRIC CO.,LTD. +74:5E:1C PIONEER CORPORATION +00:06:F5 ALPS ELECTRIC CO.,LTD. +00:06:F7 ALPS ELECTRIC CO.,LTD. +00:07:04 ALPS ELECTRIC CO.,LTD. +1C:1D:86 Cisco Systems, Inc +00:1A:92 ASUSTek COMPUTER INC. +00:1D:60 ASUSTek COMPUTER INC. +00:22:15 ASUSTek COMPUTER INC. +20:CF:30 ASUSTek COMPUTER INC. +E0:CB:4E ASUSTek COMPUTER INC. +1C:87:2C ASUSTek COMPUTER INC. +C4:14:3C Cisco Systems, Inc +24:01:C7 Cisco Systems, Inc +04:DA:D2 Cisco Systems, Inc +F4:1F:C2 Cisco Systems, Inc +4C:00:82 Cisco Systems, Inc +DC:A5:F4 Cisco Systems, Inc +7C:95:F3 Cisco Systems, Inc +50:17:FF Cisco Systems, Inc +E8:ED:F3 Cisco Systems, Inc +78:DA:6E Cisco Systems, Inc +24:E9:B3 Cisco Systems, Inc +E4:25:E7 Apple, Inc. +08:00:07 Apple, Inc. +00:0A:95 Apple, Inc. +00:22:41 Apple, Inc. +00:23:DF Apple, Inc. +00:25:BC Apple, Inc. +00:26:4A Apple, Inc. +00:26:B0 Apple, Inc. +04:1E:64 Apple, Inc. +D4:9A:20 Apple, Inc. +90:27:E4 Apple, Inc. +60:33:4B Apple, Inc. +A4:31:35 Apple, Inc. +9C:35:EB Apple, Inc. +50:7A:55 Apple, Inc. +A0:99:9B Apple, Inc. +24:24:0E Apple, Inc. +90:3C:92 Apple, Inc. +34:12:98 Apple, Inc. +9C:29:3F Apple, Inc. +48:8A:D2 SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD. +A8:8E:24 Apple, Inc. +E8:80:2E Apple, Inc. +68:AE:20 Apple, Inc. +E0:B5:2D Apple, Inc. +80:BE:05 Apple, Inc. +D8:BB:2C Apple, Inc. +D0:4F:7E Apple, Inc. +2C:1F:23 Apple, Inc. +54:9F:13 Apple, Inc. +B8:09:8A Apple, Inc. +F0:DB:E2 Apple, Inc. +18:EE:69 Apple, Inc. +74:81:14 Apple, Inc. +18:F6:43 Apple, Inc. +D0:A6:37 Apple, Inc. +A0:18:28 Apple, Inc. +D0:03:4B Apple, Inc. +5C:59:48 Apple, Inc. +78:CA:39 Apple, Inc. +18:E7:F4 Apple, Inc. +B8:FF:61 Apple, Inc. +DC:2B:61 Apple, Inc. +10:93:E9 Apple, Inc. +44:2A:60 Apple, Inc. +E0:F8:47 Apple, Inc. +14:5A:05 Apple, Inc. +28:CF:DA Apple, Inc. +14:8F:C6 Apple, Inc. +28:37:37 Apple, Inc. +04:54:53 Apple, Inc. +F0:CB:A1 Apple, Inc. +C0:63:94 Apple, Inc. +8C:00:6D Apple, Inc. +B0:9F:BA Apple, Inc. +DC:86:D8 Apple, Inc. +8C:29:37 Apple, Inc. +DC:9B:9C Apple, Inc. +98:F0:AB Apple, Inc. +F0:DB:F8 Apple, Inc. +AC:CF:5C Apple, Inc. +3C:15:C2 Apple, Inc. +04:48:9A Apple, Inc. +D8:CF:9C Apple, Inc. +30:F7:C5 Apple, Inc. +00:88:65 Apple, Inc. +40:B3:95 Apple, Inc. +30:90:AB Apple, Inc. +1C:E6:2B Apple, Inc. +A0:ED:CD Apple, Inc. +A8:86:DD Apple, Inc. +54:EA:A8 Apple, Inc. +E4:C6:3D Apple, Inc. +84:38:35 Apple, Inc. +70:73:CB Apple, Inc. +9C:20:7B Apple, Inc. +84:29:99 Apple, Inc. +74:E2:F5 Apple, Inc. +20:C9:D0 Apple, Inc. +14:02:EC Hewlett Packard Enterprise +70:79:38 Wuxi Zhanrui Electronic Technology Co.,LTD +64:6A:74 AUTH-SERVERS, LLC +34:C9:F0 LM Technologies Ltd +E0:34:E4 Feit Electric Company, Inc. +98:E8:48 Axiim +A0:F9:E0 VIVATEL COMPANY LIMITED +F8:C3:72 TSUZUKI DENKI +90:8D:78 D-Link International +A4:CC:32 Inficomm Co., Ltd +58:2B:DB Pax AB +D0:0F:6D T&W Electronics Company +48:BF:74 Baicells Technologies Co.,LTD +38:F5:57 JOLATA, INC. +28:0E:8B Beijing Spirit Technology Development Co., Ltd. +F4:4D:30 Elitegroup Computer Systems Co.,Ltd. +DC:9A:8E Nanjing Cocomm electronics co., LTD +C4:EF:70 Home Skinovations +B8:13:E9 Trace Live Network +74:6F:19 ICARVISIONS (SHENZHEN) TECHNOLOGY CO., LTD. +7C:71:76 Wuxi iData Technology Company Ltd. +7C:01:91 Apple, Inc. +70:48:0F Apple, Inc. +A4:B8:05 Apple, Inc. +58:7F:57 Apple, Inc. +80:D6:05 Apple, Inc. +68:A8:28 HUAWEI TECHNOLOGIES CO.,LTD +98:87:44 Wuxi Hongda Science and Technology Co.,LTD +C8:69:CD Apple, Inc. +BC:6C:21 Apple, Inc. +9C:8D:D3 Leonton Technologies +24:6C:8A YUKAI Engineering +A4:38:31 RF elements s.r.o. +D0:BA:E4 Shanghai MXCHIP Information Technology Co., Ltd. +A4:DC:BE HUAWEI TECHNOLOGIES CO.,LTD +10:CC:1B Liverock technologies,INC +48:B6:20 ROLI Ltd. +20:D1:60 Private +38:21:87 Midea Group Co., Ltd. +30:5A:3A ASUSTek COMPUTER INC. +A8:72:85 IDT, INC. +AC:1F:D7 Real Vision Technology Co.,Ltd. +C8:A2:CE Oasis Media Systems LLC +A4:DE:C9 QLove Mobile Intelligence Information Technology (W.H.) Co. Ltd. +A4:A6:A9 Private +04:69:F8 Apple, Inc. +9C:7A:03 Ciena Corporation +38:0A:AB Formlabs +F4:15:35 SPON Communication Technology Co.,Ltd +E4:1A:2C ZPE Systems, Inc. +A8:15:D6 Shenzhen Meione Technology CO., LTD +D0:93:80 Ducere Technologies Pvt. Ltd. +84:A7:88 Perples +68:89:C1 HUAWEI TECHNOLOGIES CO.,LTD +84:5B:12 HUAWEI TECHNOLOGIES CO.,LTD +14:3E:BF zte corporation +04:1E:7A DSPWorks +38:B7:25 Wistron Infocomm (Zhongshan) Corporation +4C:C6:81 Shenzhen Aisat Electronic Co., Ltd. +28:B9:D9 Radisys Corporation +E0:55:3D Cisco Meraki +08:94:EF Wistron Infocomm (Zhongshan) Corporation +E0:31:9E Valve Corporation +E4:A3:2F Shanghai Artimen Technology Co., Ltd. +D4:7B:B0 ASKEY COMPUTER CORP +50:45:F7 Liuhe Intelligence Technology Ltd. +20:F5:10 Codex Digital Limited +94:9F:3E Sonos, Inc. +78:8E:33 Jiangsu SEUIC Technology Co.,Ltd +E0:1A:EA Allied Telesis, Inc. +34:0C:ED Moduel AB +50:7B:9D LCFC(HeFei) Electronics Technology co., ltd +6C:72:20 D-Link International +F0:26:24 WAFA TECHNOLOGIES CO., LTD. +F8:F4:64 Rawe Electonic GmbH +F4:67:2D ShenZhen Topstar Technology Company +38:2B:78 ECO PLUGS ENTERPRISE CO., LTD +BC:EB:5F Fujian Beifeng Telecom Technology Co., Ltd. +80:0B:51 Chengdu XGimi Technology Co.,Ltd +00:FC:8D Hitron Technologies. Inc +1C:C5:86 Absolute Acoustics +E0:76:D0 AMPAK Technology, Inc. +24:B0:A9 Shanghai Mobiletek Communication Ltd. +64:16:7F Polycom +54:E2:C8 Dongguan Aoyuan Electronics Technology Co., Ltd +20:D7:5A Posh Mobile Limited +88:D3:7B FirmTek, LLC +10:AF:78 Shenzhen ATUE Technology Co., Ltd +B0:96:6C Lanbowan Technology Ltd. +A4:08:EA Murata Manufacturing Co., Ltd. +D4:F9:A1 HUAWEI TECHNOLOGIES CO.,LTD +9C:B6:D0 Rivet Networks +D0:C0:BF Actions Microelectronics Co., Ltd +94:F6:65 Ruckus Wireless +E0:4B:45 Hi-P Electronics Pte Ltd +6C:45:98 Antex Electronic Corp. +94:A7:B7 zte corporation +3C:83:75 Microsoft Corporation +C8:45:8F Wyler AG +14:9A:10 Microsoft Corporation +FC:9A:FA Motus Global Inc. +5C:B4:3E HUAWEI TECHNOLOGIES CO.,LTD +FC:E1:FB Array Networks +54:E1:40 INGENICO +14:15:7C TOKYO COSMOS ELECTRIC CO.,LTD. +40:8D:5C GIGA-BYTE TECHNOLOGY CO.,LTD. +6C:E0:1E Modcam AB +E8:F2:E3 Starcor Beijing Co.,Limited +D0:48:F3 DATTUS Inc +CC:19:A8 PT Inovação e Sistemas SA +6C:44:18 Zappware +44:96:2B Aidon Oy +D4:D7:A9 Shanghai Kaixiang Info Tech LTD +18:5D:9A BobjGear LLC +88:41:57 Shenzhen Atsmart Technology Co.,Ltd. +3C:DA:2A zte corporation +74:73:36 MICRODIGTAL Inc +0C:E7:25 Microsoft Corporation +6C:2E:72 B&B EXPORTING LIMITED +FC:32:88 CELOT Wireless Co., Ltd +BC:B3:08 HONGKONG RAGENTEK COMMUNICATION TECHNOLOGY CO.,LIMITED +44:5E:CD Razer Inc +74:96:37 Todaair Electronic Co., Ltd +20:31:EB HDSN +C0:33:5E Microsoft +AC:CA:AB Virtual Electric Inc +24:1B:44 Hangzhou Tuners Electronics Co., Ltd +90:C3:5F Nanjing Jiahao Technology Co., Ltd. +18:F1:45 NetComm Wireless Limited +4C:A5:15 Baikal Electronics JSC +9C:E2:30 JULONG CO,.LTD. +34:87:3D Quectel Wireless Solution Co.,Ltd. +18:68:82 Beward R&D Co., Ltd. +34:4C:A4 amazipoint technology Ltd. +A8:F0:38 SHEN ZHEN SHI JIN HUA TAI ELECTRONICS CO.,LTD +74:E2:77 Vizmonet Pte Ltd +10:A6:59 Mobile Create Co.,Ltd. +58:85:6E QSC AG +FC:AF:AC Socionext Inc. +F8:C3:97 NZXT Corp. Ltd. +C4:36:6C LG Innotek +60:D9:A0 Lenovo Mobile Communication Technology Ltd. +5C:3B:35 Gehirn Inc. +5C:F7:C3 SYNTECH (HK) TECHNOLOGY LIMITED +3C:C2:E1 XINHUA CONTROL ENGINEERING CO.,LTD +7C:53:4A Metamako +9C:30:66 RWE Effizienz GmbH +FC:A2:2A PT. Callysta Multi Engineering +24:76:56 Shanghai Net Miles Fiber Optics Technology Co., LTD. +A0:AD:A1 JMR Electronics, Inc +60:19:70 HUIZHOU QIAOXING ELECTRONICS TECHNOLOGY CO., LTD. +88:70:33 Hangzhou Silan Microelectronic Inc +8C:79:67 zte corporation +D0:83:D4 XTel ApS +78:F9:44 Private +CC:A4:AF Shenzhen Sowell Technology Co., LTD +84:F1:29 Metrascale Inc. +20:28:BC Visionscape Co,. Ltd. +B8:F0:80 SPS, INC. +78:58:F3 Vachen Co.,Ltd +FC:DC:4A G-Wearables Corp. +F4:2C:56 SENOR TECH CO LTD +50:50:2A Egardia +48:EE:0C D-Link International +48:C0:93 Xirrus, Inc. +3C:1A:0F ClearSky Data +AC:B5:7D Liteon Technology Corporation +DC:E1:AD Shenzhen Wintop Photoelectric Technology Co., Ltd +90:0C:B4 Alinket Electronic Technology Co., Ltd +88:3B:8B Cheering Connection Co. Ltd. +94:D4:17 GPI KOREA INC. +D8:55:A3 zte corporation +70:DA:9C TECSEN +6C:F5:E8 Mooredoll Inc. +70:FF:5C Cheerzing Communication(Xiamen)Technology Co.,Ltd +E0:10:7F Ruckus Wireless +08:11:5E Bitel Co., Ltd. +44:CE:7D SFR +08:81:BC HongKong Ipro Technology Co., Limited +4C:16:F1 zte corporation +80:09:02 Keysight Technologies, Inc. +68:72:DC CETORY.TV Company Limited +D8:B6:B7 Comtrend Corporation +04:99:E6 Shenzhen Yoostar Technology Co., Ltd +94:BF:95 Shenzhen Coship Electronics Co., Ltd +FC:9F:E1 CONWIN.Tech. Ltd +90:20:3A BYD Precision Manufacture Co.,Ltd +A8:1B:5D Foxtel Management Pty Ltd +B8:BD:79 TrendPoint Systems +2C:01:0B NASCENT Technology, LLC - RemKon +D4:EC:86 LinkedHope Intelligent Technologies Co., Ltd +20:A9:9B Microsoft Corporation +6C:76:60 KYOCERA Corporation +A0:A3:E2 Actiontec Electronics, Inc +54:09:8D deister electronic GmbH +F0:FE:6B Shanghai High-Flying Electronics Technology Co., Ltd +3C:AE:69 ESA Elektroschaltanlagen Grimma GmbH +00:F3:DB WOO Sports +08:A5:C8 Sunnovo International Limited +84:8E:DF Sony Mobile Communications AB +CC:BD:D3 Ultimaker B.V. +50:29:4D NANJING IOT SENSOR TECHNOLOGY CO,LTD +0C:CF:D1 SPRINGWAVE Co., Ltd +58:10:8C Intelbras +18:71:17 eta plus electronic gmbh +7C:B1:77 Satelco AG +8C:5D:60 UCI Corporation Co.,Ltd. +10:4B:46 Mitsubishi Electric Corporation +4C:0B:BE Microsoft +08:EB:29 Jiangsu Huitong Group Co.,Ltd. +E4:8C:0F Discovery Insure +58:7F:B7 SONAR INDUSTRIAL CO., LTD. +E4:23:54 SHENZHEN FUZHI SOFTWARE TECHNOLOGY CO.,LTD +20:76:93 Lenovo (Beijing) Limited. +C4:BD:6A SKF GmbH +14:48:8B Shenzhen Doov Technology Co.,Ltd +60:36:96 The Sapling Company +54:FF:CF Mopria Alliance +BC:BC:46 SKS Welding Systems GmbH +A8:D8:8A Wyconn +00:E6:E8 Netzin Technology Corporation,.Ltd. +64:B2:1D Chengdu Phycom Tech Co., Ltd. +88:70:8C Lenovo Mobile Communication Technology Ltd. +F0:3D:29 Actility +90:9F:33 EFM Networks +84:96:81 Cathay Communication Co.,Ltd +A0:56:B2 Harman/Becker Automotive Systems GmbH +40:C6:2A Shanghai Jing Ren Electronic Technology Co., Ltd. +E8:15:0E Nokia Corporation +F4:D0:32 Yunnan Ideal Information&Technology.,Ltd +44:A6:E5 THINKING TECHNOLOGY CO.,LTD +A8:32:9A Digicom Futuristic Technologies Ltd. +B4:0A:C6 DEXON Systems Ltd. +48:0C:49 NAKAYO TELECOMMUNICATIONS,INC +5C:B8:CB Allis Communications +E8:5D:6B Luminate Wireless +8C:33:57 HiteVision Digital Media Technology Co.,Ltd. +50:67:87 iTellus +F4:D2:61 SEMOCON Co., Ltd +D0:5A:F1 Shenzhen Pulier Tech CO.,Ltd +48:1A:84 Pointer Telocation Ltd +E4:F4:C6 NETGEAR +DC:66:3A Apacer Technology Inc. +B0:09:D3 Avizia +3C:AA:3F iKey, Ltd. +0C:38:3E Fanvil Technology Co., Ltd. +60:CD:A9 Abloomy +B4:0B:44 Smartisan Technology Co., Ltd. +A0:FC:6E Telegrafia a.s. +44:D4:E0 Sony Mobile Communications AB +D0:FA:1D Qihoo 360 Technology Co.,Ltd +04:67:85 scemtec Hard- und Software fuer Mess- und Steuerungstechnik GmbH +FC:6D:C0 BME CORPORATION +78:45:61 CyberTAN Technology Inc. +D8:96:E0 Alibaba Cloud Computing Ltd. +30:0D:2A Zhejiang Wellcom Technology Co.,Ltd. +64:EA:C5 SiboTech Automation Co., Ltd. +74:DA:38 Edimax Technology Co. Ltd. +F4:F2:6D TP-LINK TECHNOLOGIES CO.,LTD. +5C:15:15 ADVAN +D0:A0:D6 Chengdu TD Tech Ltd. +8C:BF:9D Shanghai Xinyou Information Technology Ltd. Co. +D4:93:98 Nokia Corporation +78:D6:6F Aristocrat Technologies Australia Pty. Ltd. +50:C7:BF TP-LINK TECHNOLOGIES CO.,LTD. +C0:61:18 TP-LINK TECHNOLOGIES CO.,LTD. +D0:C7:C0 TP-LINK TECHNOLOGIES CO.,LTD. +20:9A:E9 Volacomm Co., Ltd +34:5D:10 Wytek +58:E3:26 Compass Technologies Inc. +84:8D:C7 Cisco SPVTG +A8:BD:3A UNIONMAN TECHNOLOGY CO.,LTD +C4:4E:1F BlueN +CC:A6:14 AIFA TECHNOLOGY CORP. +B0:86:9E Chloride S.r.L +34:4F:5C R&M AG +A4:6C:C1 LTi REEnergy GmbH +90:DB:46 E-LEAD ELECTRONIC CO., LTD +D4:2F:23 Akenori PTE Ltd +28:63:36 Siemens AG - Industrial Automation - EWA +38:F0:98 Vapor Stone Rail Systems +40:01:07 Arista Corp +4C:8B:30 Actiontec Electronics, Inc +08:05:CD DongGuang EnMai Electronic Product Co.Ltd. +00:92:FA SHENZHEN WISKY TECHNOLOGY CO.,LTD +4C:F4:5B Blue Clover Devices +B0:69:71 DEI Sales, Inc. +58:49:3B Palo Alto Networks +58:05:28 LABRIS NETWORKS +28:65:6B Keystone Microtech Corporation +EC:2E:4E HITACHI-LG DATA STORAGE INC +50:58:00 WyTec International, Inc. +78:92:3E Nokia Corporation +D4:CF:F9 Shenzhen Sen5 Technology Co., Ltd. +D8:49:2F CANON INC. +D4:67:61 SAHAB TECHNOLOGY +14:56:45 Savitech Corp. +D4:E0:8E ValueHD Corporation +70:30:5D Ubiquoss Inc +58:50:AB TLS Corporation +90:DF:B7 s.m.s smart microwave sensors GmbH +B8:43:E4 Vlatacom +84:25:A4 Tariox Limited +E0:7F:53 TECHBOARD SRL +4C:0D:EE JABIL CIRCUIT (SHANGHAI) LTD. +A0:77:71 Vialis BV +D0:BD:01 DS International +C0:C5:69 SHANGHAI LYNUC CNC TECHNOLOGY CO.,LTD +20:0E:95 IEC – TC9 WG43 +E0:DB:88 Open Standard Digital-IF Interface for SATCOM Systems +D8:61:94 Objetivos y Sevicios de Valor Añadido +58:9C:FC FreeBSD Foundation +60:21:03 STCUBE.INC +08:5D:DD Mercury Corporation +98:34:9D Krauss Maffei Technologies GmbH +18:CC:23 Philio Technology Corporation +64:8D:9E IVT Electronic Co.,Ltd +CC:95:D7 Vizio, Inc +74:9C:52 Huizhou Desay SV Automotive Co., Ltd. +C0:F7:9D Powercode +3C:0C:48 Servergy, Inc. +68:D2:47 Portalis LC +FC:27:A2 TRANS ELECTRIC CO., LTD. +14:C0:89 DUNE HD LTD +F0:8A:28 JIANGSU HENGSION ELECTRONIC S and T CO.,LTD +A8:57:4E TP-LINK TECHNOLOGIES CO.,LTD. +DC:3E:F8 Nokia Corporation +70:61:73 Calantec GmbH +50:C2:71 SECURETECH INC +7C:49:B9 Plexus Manufacturing Sdn Bhd +18:44:62 Riava Networks, Inc. +9C:44:3D CHENGDU XUGUANG TECHNOLOGY CO, LTD +74:A4:B5 Powerleader Science and Technology Co. Ltd. +BC:41:00 CODACO ELECTRONIC s.r.o. +7C:CD:3C Guangzhou Juzing Technology Co., Ltd +10:B2:6B base Co.,Ltd. +DC:CE:BC Shenzhen JSR Technology Co.,Ltd. +94:86:D4 Surveillance Pro Corporation +F8:95:50 Proton Products Chengdu Ltd +44:7B:C4 DualShine Technology(SZ)Co.,Ltd +54:2F:89 Euclid Laboratories, Inc. +48:B9:77 PulseOn Oy +AC:2D:A3 TXTR GmbH +C8:F6:8D S.E.TECHNOLOGIES LIMITED +BC:14:EF ITON Technology Limited +14:F2:8E ShenYang ZhongKe-Allwin Technology Co.LTD +C0:64:C6 Nokia Corporation +9C:44:A6 SwiftTest, Inc. +44:C4:A9 Opticom Communication, LLC +6C:3C:53 SoundHawk Corp +64:BA:BD SDJ Technologies, Inc. +88:91:66 Viewcooper Corp. +10:33:78 FLECTRON Co., LTD +DC:05:75 SIEMENS ENERGY AUTOMATION +5C:11:93 Seal One AG +B4:52:7E Sony Mobile Communications AB +50:E1:4A Private +68:FC:B3 Next Level Security Systems, Inc. +70:30:5E Nanjing Zhongke Menglian Information Technology Co.,LTD +9C:88:88 Simac Techniek NV +18:0C:14 iSonea Limited +8C:AE:89 Y-cam Solutions Ltd +58:B9:61 SOLEM Electronique +F4:6A:BC Adonit Corp. Ltd. +20:18:0E Shenzhen Sunchip Technology Co., Ltd +80:B2:19 ELEKTRON TECHNOLOGY UK LIMITED +D0:8A:55 Skullcandy +C4:D6:55 Tercel technology co.,ltd +9C:A1:0A SCLE SFE +78:D9:9F NuCom HK Ltd. +44:C5:6F NGN Easy Satfinder (Tianjin) Electronic Co., Ltd +2C:5A:05 Nokia Corporation +84:83:36 Newrun +EC:71:DB Shenzhen Baichuan Digital Technology Co., Ltd. +B8:26:6C ANOV France +28:4D:92 Luminator +1C:4B:B9 SMG ENTERPRISE, LLC +0C:5C:D8 DOLI Elektronik GmbH +2C:5F:F3 Pertronic Industries +E0:AF:4B Pluribus Networks, Inc. +C8:56:63 Sunflex Europe GmbH +88:FE:D6 ShangHai WangYong Software Co., Ltd. +60:03:47 Billion Electric Co. Ltd. +08:40:27 Gridstore Inc. +7C:20:48 KoamTac +70:59:86 OOO TTV +20:DF:3F Nanjing SAC Power Grid Automation Co., Ltd. +30:78:6B TIANJIN Golden Pentagon Electronics Co., Ltd. +4C:D6:37 Qsono Electronics Co., Ltd +8C:F9:45 Power Automation pte Ltd +2C:92:2C Kishu Giken Kogyou Company Ltd,. +50:98:71 Inventum Technologies Private Limited +38:42:33 Wildeboer Bauteile GmbH +94:40:A2 Anywave Communication Technologies, Inc. +7C:B7:7B Paradigm Electronics Inc +28:A2:41 exlar corp +98:76:B6 Adafruit +AC:22:0B ASUSTek COMPUTER INC. +88:35:4C Transics +70:9B:FC Bryton Inc. +D8:2D:9B Shenzhen G.Credit Communication Technology Co., Ltd +94:BF:1E eflow Inc. / Smart Device Planning and Development Division +C0:A3:9E EarthCam, Inc. +08:8E:4F SF Software Solutions +E8:EA:DA Denkovi Assembly Electroncs LTD +DC:AE:04 CELOXICA Ltd +54:22:F8 zte corporation +48:6E:73 Pica8, Inc. +A0:CE:C8 CE LINK LIMITED +90:7A:28 Beijing Morncloud Information And Technology Co. Ltd. +CC:D2:9B Shenzhen Bopengfa Elec&Technology CO.,Ltd +9C:4E:BF BoxCast +34:A6:8C Shine Profit Development Limited +78:DA:B3 GBO Technology +80:BB:EB Satmap Systems Ltd +94:9F:B4 ChengDu JiaFaAnTai Technology Co.,Ltd +40:68:26 Thales UK Limited +5C:15:E1 AIDC TECHNOLOGY (S) PTE LTD +04:8D:38 Netcore Technology Inc. +1C:4A:F7 AMON INC +98:5D:46 PeopleNet Communication +44:67:55 Orbit Irrigation +78:9F:4C HOERBIGER Elektronik GmbH +98:F8:C1 IDT Technology Limited +F4:7A:4E Woojeon&Handan +44:70:0B IFFU +8C:2F:39 IBA Dosimetry GmbH +B8:F8:28 Changshu Gaoshida Optoelectronic Technology Co. Ltd. +58:46:8F Koncar Electronics and Informatics +74:66:30 T:mi Ytti +B0:FE:BD Private +94:0B:D5 Himax Technologies, Inc +30:05:5C Brother industries, LTD. +0C:82:68 TP-LINK TECHNOLOGIES CO.,LTD. +B0:17:43 EDISON GLOBAL CIRCUITS LLC +90:DA:4E AVANU +70:38:B4 Low Tech Solutions +AC:18:26 SEIKO EPSON CORPORATION +4C:80:4F Armstrong Monitoring Corp +90:1D:27 zte corporation +7C:D7:62 Freestyle Technology Pty Ltd +D0:73:D5 LIFI LABS MANAGEMENT PTY LTD +B8:C4:6F PRIMMCON INDUSTRIES INC +50:5A:C6 GUANGDONG SUPER TELECOM CO.,LTD. +38:A8:6B Orga BV +14:13:30 Anakreon UK LLP +0C:F4:05 Beijing Signalway Technologies Co.,Ltd +1C:76:CA Terasic Technologies Inc. +0C:11:05 Ringslink (Xiamen) Network Communication Technologies Co., Ltd +94:50:47 Rechnerbetriebsgruppe +D8:DC:E9 Kunshan Erlab ductless filtration system Co.,Ltd +54:11:2F Sulzer Pump Solutions Finland Oy +E0:DC:A0 Siemens Electrical Apparatus Ltd., Suzhou Chengdu Branch +4C:55:B8 Turkcell Teknoloji +08:80:39 Cisco SPVTG +2C:72:C3 Soundmatters +84:E4:D9 Shenzhen NEED technology Ltd. +C4:48:38 Satcom Direct, Inc. +54:54:14 Digital RF Corea, Inc +24:EB:65 SAET I.S. S.r.l. +D0:F2:7F SteadyServ Technoligies, LLC +DC:64:7C C.R.S. iiMotion GmbH +18:84:10 CoreTrust Inc. +A0:8A:87 HuiZhou KaiYue Electronic Co.,Ltd +04:BF:A8 ISB Corporation +5C:84:86 Brightsource Industries Israel LTD +28:CD:9C Shenzhen Dynamax Software Development Co.,Ltd. +E0:ED:C7 Shenzhen Friendcom Technology Development Co., Ltd +2C:F2:03 EMKO ELEKTRONIK SAN VE TIC AS +24:62:78 sysmocom - systems for mobile communications GmbH +F4:58:42 Boxx TV Ltd +A8:61:AA Cloudview Limited +C8:93:46 MXCHIP Company Limited +F0:F2:60 Mobitec AB +14:23:D7 EUTRONIX CO., LTD. +3C:FB:96 Emcraft Systems LLC +08:1F:3F WondaLink Inc. +DC:6F:08 Bay Storage Technology +E4:92:E7 Gridlink Tech. Co.,Ltd. +60:BB:0C Beijing HuaqinWorld Technology Co,Ltd +70:E0:27 HONGYU COMMUNICATION TECHNOLOGY LIMITED +E8:80:D8 GNTEK Electronics Co.,Ltd. +18:88:57 Beijing Jinhong Xi-Dian Information Technology Corp. +28:79:94 Realplay Digital Technology(Shenzhen) Co.,Ltd +10:5C:3B Perma-Pipe, Inc. +40:C4:D6 ChongQing Camyu Technology Development Co.,Ltd. +A0:EB:76 AirCUVE Inc. +6C:61:26 Rinicom Holdings +C0:4D:F7 SERELEC +EC:D0:40 GEA Farm Technologies GmbH +00:59:07 LenovoEMC Products USA, LLC +78:B3:CE Elo touch solutions +A8:FB:70 WiseSec L.t.d +30:F3:1D zte corporation +E4:77:6B AARTESYS AG +5C:33:5C Swissphone Telecom AG +A4:FC:CE Security Expert Ltd. +E0:CE:C3 ASKEY COMPUTER CORP +5C:43:D2 HAZEMEYER +D8:19:CE Telesquare +D8:09:C3 Cercacor Labs +84:ED:33 BBMC Co.,Ltd +68:1E:8B InfoSight Corporation +C0:44:E3 Shenzhen Sinkna Electronics Co., LTD +08:F1:B7 Towerstream Corpration +20:85:8C Assa +18:7A:93 AMICCOM Electronics Corporation +94:C9:62 Teseq AG +38:43:69 Patrol Products Consortium LLC +D0:8B:7E Passif Semiconductor +68:86:E7 Orbotix, Inc. +2C:E8:71 Alert Metalguard ApS +58:D0:71 BW Broadcast +C0:A0:C7 FAIRFIELD INDUSTRIES +98:20:8E Definium Technologies +70:4A:E4 Rinstrum Pty Ltd +68:B8:D9 Act KDE, Inc. +F8:48:97 Hitachi, Ltd. +74:E4:24 APISTE CORPORATION +58:D6:D3 Dairy Cheq Inc +68:FB:95 Generalplus Technology Inc. +E4:C1:46 Objetivos y Servicios de Valor A +D4:BF:2D SE Controls Asia Pacific Ltd +C4:5D:D8 HDMI Forum +C4:4E:AC Shenzhen Shiningworth Technology Co., Ltd. +C4:58:C2 Shenzhen TATFOOK Technology Co., Ltd. +44:18:4F Fitview +8C:76:C1 Goden Tech Limited +DC:2A:14 Shanghai Longjing Technology Co. +0C:19:1F Inform Electronik +08:0F:FA KSP INC. +EC:FC:55 A. Eberle GmbH & Co. KG +0C:8C:DC Suunto Oy +20:B5:C6 Mimosa Networks +AC:3C:B4 Nilan A/S +A8:30:AD Wei Fang Goertek Electronics Co.,Ltd +80:07:A2 Esson Technology Inc. +2C:35:57 ELLIY Power CO..Ltd +6C:5A:34 Shenzhen Haitianxiong Electronic Co., Ltd. +48:5A:3F WISOL +70:F1:E5 Xetawave LLC +C0:AA:68 OSASI Technos Inc. +B8:29:F7 Blaster Tech +00:C1:4F DDL Co,.ltd. +5C:E0:CA FeiTian United (Beijing) System Technology Co., Ltd. +9C:98:11 Guangzhou Sunrise Electronics Development Co., Ltd +A0:FE:91 AVAT Automation GmbH +58:09:E5 Kivic Inc. +74:EC:F1 Acumen +68:15:D3 Zaklady Elektroniki i Mechaniki Precyzyjnej R&G S.A. +60:19:29 VOLTRONIC POWER TECHNOLOGY(SHENZHEN) CORP. +C0:BD:42 ZPA Smart Energy a.s. +48:B2:53 Marketaxess Corporation +60:D2:B9 REALAND BIO CO., LTD. +20:67:B1 Pluto inc. +08:7D:21 Altasec technology corporation +30:FD:11 MACROTECH (USA) INC. +F8:05:1C DRS Imaging and Targeting Solutions +60:32:F0 Mplus technology +74:99:75 IBM Corporation +0C:DC:CC Inala Technologies +F0:AC:A4 HBC-radiomatic +14:DB:85 S NET MEDIA +D4:93:A0 Fidelix Oy +AC:72:36 Lexking Technology Co., Ltd. +CC:B3:F8 FUJITSU ISOTEC LIMITED +3C:D7:DA SK Mtek microelectronics(shenzhen)limited +E8:6D:54 Digit Mobile Inc +98:57:D3 HON HAI-CCPBG PRECISION IND.CO.,LTD. +9C:8D:1A INTEG process group inc +74:2D:0A Norfolk Elektronik AG +48:03:62 DESAY ELECTRONICS(HUIZHOU)CO.,LTD +B0:35:8D Nokia Corporation +0C:F3:61 Java Information +34:BD:FA Cisco SPVTG +8C:EE:C6 Precepscion Pty. Ltd. +EC:D9:50 IRT SA +74:27:3C ChangYang Technology (Nanjing) Co., LTD +08:7C:BE Quintic Corp. +C4:AD:21 MEDIAEDGE Corporation +DC:BF:90 HUIZHOU QIAOXING TELECOMMUNICATION INDUSTRY CO.,LTD. +E0:F5:CA CHENG UEI PRECISION INDUSTRY CO.,LTD. +1C:5C:60 Shenzhen Belzon Technology Co.,LTD. +2C:ED:EB Alpheus Digital Company Limited +38:1C:4A SIMCom Wireless Solutions Co.,Ltd. +C8:DE:51 Integra Networks, Inc. +90:1E:DD GREAT COMPUTER CORPORATION +2C:62:89 Regenersis (Glenrothes) Ltd +F0:93:C5 Garland Technology +4C:09:B4 zte corporation +B8:B9:4E Shenzhen iBaby Labs, Inc. +00:F4:03 Orbis Systems Oy +AC:C6:98 Kohzu Precision Co., Ltd. +90:70:25 Garea Microsys Co.,Ltd. +50:2E:CE Asahi Electronics Co.,Ltd +44:0C:FD NetMan Co., Ltd. +7C:EB:EA ASCT +08:5B:0E Fortinet, Inc. +4C:0F:C7 Earda Electronics Co.,Ltd +64:C9:44 LARK Technologies, Inc +68:69:F2 ComAp s.r.o. +B8:89:CA ILJIN ELECTRIC Co., Ltd. +B8:5A:FE Handaer Communication Technology (Beijing) Co., Ltd +60:46:16 XIAMEN VANN INTELLIGENT CO., LTD +EC:D9:25 RAMI +04:9F:06 Smobile Co., Ltd. +D8:06:D1 Honeywell Fire System (Shanghai) Co,. Ltd. +68:72:51 Ubiquiti Networks +8C:6A:E4 Viogem Limited +20:C1:AF i Wit Digital Co., Limited +D8:8A:3B UNIT-EM +BC:D9:40 ASR Co,.Ltd. +EC:49:93 Qihan Technology Co., Ltd +B0:AC:FA FUJITSU LIMITED +1C:95:9F Veethree Electronics And Marine LLC +18:D9:49 Qvis Labs, LLC +64:62:23 Cellient Co., Ltd. +AC:F0:B2 Becker Electronics Taiwan Ltd. +10:A9:32 Beijing Cyber Cloud Technology Co. ,Ltd. +C4:7B:A3 NAVIS Inc. +A8:17:58 Elektronik System i Umeå AB +44:34:8F MXT INDUSTRIAL LTDA +9C:01:11 Shenzhen Newabel Electronic Co., Ltd. +0C:A1:38 Blinq Wireless Inc. +34:81:37 UNICARD SA +64:F2:42 Gerdes Aktiengesellschaft +60:F2:81 TRANWO TECHNOLOGY CO., LTD. +B0:E8:92 SEIKO EPSON CORPORATION +64:24:00 Xorcom Ltd. +4C:AA:16 AzureWave Technologies (Shanghai) Inc. +1C:6B:CA Mitsunami Co., Ltd. +08:37:9C Topaz Co. LTD. +E8:3E:FB GEODESIC LTD. +40:16:FA EKM Metering +3C:36:3D Nokia Corporation +BC:02:00 Stewart Audio +1C:97:3D PRICOM Design +F0:07:86 Shandong Bittel Electronics Co., Ltd +88:5C:47 Alcatel Lucent +E0:F9:BE Cloudena Corp. +3C:C1:F6 Melange Systems Pvt. Ltd. +54:E6:3F ShenZhen LingKeWeiEr Technology Co., Ltd. +F8:8C:1C KAISHUN ELECTRONIC TECHNOLOGY CO., LTD. BEIJING +94:01:49 AutoHotBox +C0:35:BD Velocytech Aps +F8:97:CF DAESHIN-INFORMATION TECHNOLOGY CO., LTD. +38:3F:10 DBL Technology Ltd. +8C:68:78 Nortek-AS +80:16:B7 Brunel University +9C:61:1D Omni-ID USA, Inc. +78:BE:BD STULZ GmbH +3C:91:74 ALONG COMMUNICATION TECHNOLOGY +B8:E9:37 Sonos, Inc. +E8:D0:FA MKS Instruments Deutschland GmbH +98:26:2A Applied Research Associates, Inc +B0:D2:F5 Vello Systems, Inc. +C8:9F:42 VDII Innovation AB +A4:18:75 Cisco Systems, Inc +64:0E:94 Pluribus Networks, Inc. +6C:E9:83 Gastron Co., LTD. +0C:B4:EF Digience Co.,Ltd. +D0:DB:32 Nokia Corporation +60:90:84 DSSD Inc +A4:E7:31 Nokia Corporation +08:08:EA AMSC +C0:5E:79 SHENZHEN HUAXUN ARK TECHNOLOGIES CO.,LTD +A4:93:4C Cisco Systems, Inc +E8:54:84 NEO Information Systems Co., Ltd. +74:AE:76 iNovo Broadband, Inc. +60:B9:33 Deutron Electronics Corp. +38:EE:9D Anedo Ltd. +80:CE:B1 Theissen Training Systems GmbH +3C:38:88 ConnectQuest, llc +08:BE:09 Astrol Electronic AG +D8:B8:F6 Nantworks +60:44:F5 Easy Digital Ltd. +AC:51:EE Cambridge Communication Systems Ltd +10:E4:AF APR, LLC +B0:BD:6D Echostreams Innovative Solutions +F0:D1:4F LINEAR LLC +AC:3D:75 HANGZHOU ZHIWAY TECHNOLOGIES CO.,LTD. +14:1A:51 Treetech Sistemas Digitais +84:57:87 DVR C&C Co., Ltd. +F4:36:E1 Abilis Systems SARL +58:7F:C8 S2M +C4:98:05 Minieum Networks, Inc +90:F4:C1 Rand McNally +18:19:3F Tamtron Oy +F8:F7:FF SYN-TECH SYSTEMS INC +F4:73:CA Conversion Sound Inc. +00:E8:AB Meggitt Training Systems, Inc. +18:42:1D Private +78:61:7C MITSUMI ELECTRIC CO.,LTD +C4:01:B1 SeekTech INC +1C:5F:FF Beijing Ereneben Information Technology Co.,Ltd Shenzhen Branch +C0:C9:46 MITSUYA LABORATORIES INC. +AC:C2:EC CLT INT'L IND. CORP. +70:2F:4B PolyVision Inc. +74:14:89 SRT Wireless +94:CA:0F Honeywell Analytics +84:8D:84 Rajant Corporation +D8:33:7F Office FA.com Co.,Ltd. +7C:EF:8A Inhon International Ltd. +84:AF:1F Beat System Service Co,. Ltd. +10:0D:2F Online Security Pty. Ltd. +40:8B:07 Actiontec Electronics, Inc +98:02:84 Theobroma Systems GmbH +E0:3C:5B SHENZHEN JIAXINJIE ELECTRON CO.,LTD +64:55:63 Intelight Inc. +C4:67:B5 Libratone A/S +A4:EF:52 Telewave Co., Ltd. +F4:04:4C ValenceTech Limited +1C:BB:A8 OJSC Ufimskiy Zavod Promsvyaz +50:60:28 Xirrus Inc. +24:B6:57 Cisco Systems, Inc +94:0B:2D NetView Technologies(Shenzhen) Co., Ltd +30:6E:5C Validus Technologies +E8:43:B6 QNAP Systems, Inc. +5C:C9:D3 PALLADIUM ENERGY ELETRONICA DA AMAZONIA LTDA +40:7B:1B Mettle Networks Inc. +64:E1:61 DEP Corp. +C8:A6:20 Nebula, Inc +98:90:80 Linkpower Network System Inc Ltd. +00:64:A6 Maquet CardioVascular +3C:4E:47 Etronic A/S +C8:F9:F9 Cisco Systems, Inc +F0:F7:55 Cisco Systems, Inc +B0:1C:91 Elim Co +0C:A2:F4 Chameleon Technology (UK) Limited +84:6A:ED Wireless Tsukamoto.,co.LTD +D8:E9:52 KEOPSYS +3C:B9:A6 Belden Deutschland GmbH +34:40:B5 IBM +90:D7:4F Bookeen +90:56:82 Lenbrook Industries Limited +CC:6D:EF TJK Tietolaite Oy +3C:E6:24 LG Display +D8:F0:F2 Zeebo Inc +B0:CF:4D MI-Zone Technology Ireland +14:36:05 Nokia Corporation +B8:74:24 Viessmann Elektronik GmbH +C8:1A:FE DLOGIC GmbH +9C:53:CD ENGICAM s.r.l. +DC:C1:01 SOLiD Technologies, Inc. +AC:6F:BB TATUNG Technology Inc. +18:03:FA IBT Interfaces +60:86:45 Avery Weigh-Tronix, LLC +54:1D:FB Freestyle Energy Ltd +9C:F6:7D Ricardo Prague, s.r.o. +A0:E2:01 AVTrace Ltd.(China) +04:EE:91 x-fabric GmbH +18:38:25 Wuhan Lingjiu High-tech Co.,Ltd. +54:04:A6 ASUSTek COMPUTER INC. +F8:33:76 Good Mind Innovation Co., Ltd. +C4:60:44 Everex Electronics Limited +64:54:22 Equinox Payments +D4:12:BB Quadrant Components Inc. Ltd +40:E7:93 Shenzhen Siviton Technology Co.,Ltd +2C:67:FB ShenZhen Zhengjili Electronics Co., LTD +D8:97:60 C2 Development, Inc. +1C:B1:7F NEC Platforms, Ltd. +94:2E:17 Schneider Electric Canada Inc +B8:96:74 AllDSP GmbH & Co. KG +6C:A6:82 EDAM information & communications +48:A2:2D Shenzhen Huaxuchang Telecom Technology Co.,Ltd +50:ED:94 EGATEL SL +B8:74:47 Convergence Technologies +70:A6:6A Prox Dynamics AS +DC:17:5A Hitachi High-Technologies Corporation +5C:07:6F Thought Creator +3C:0F:C1 KBC Networks +58:E6:36 EVRsafe Technologies +90:D1:1B Palomar Medical Technologies +CC:60:BB Empower RF Systems +24:49:7B Innovative Converged Devices Inc +EC:BD:09 FUSION Electronics Ltd +54:84:7B Digital Devices GmbH +70:5C:AD Konami Gaming Inc +78:89:73 CMC +DC:CE:41 FE GLOBAL HONG KONG LIMITED +4C:77:4F Embedded Wireless Labs +20:37:06 Cisco Systems, Inc +7C:4C:58 Scale Computing, Inc. +FC:C2:3D Atmel Corporation +7C:1E:52 Microsoft +DC:B4:C4 Microsoft XCG +74:FD:A0 Compupal (Group) Corporation +C0:29:F3 XySystem +48:F3:17 Private +B0:7D:62 Dipl.-Ing. H. Horstmann GmbH +68:97:4B Shenzhen Costar Electronics Co. Ltd. +B8:BB:6D ENERES Co.,Ltd. +64:5D:D7 Shenzhen Lifesense Medical Electronics Co., Ltd. +D4:5A:B2 Galleon Systems +C4:01:42 MaxMedia Technology Limited +A0:6E:50 Nanotek Elektronik Sistemler Ltd. Sti. +18:2C:91 Concept Development, Inc. +EC:46:70 Meinberg Funkuhren GmbH & Co. KG +B4:0B:7A Brusa Elektronik AG +BC:76:4E Rackspace US, Inc. +C4:EE:AE VSS Monitoring +24:37:EF EMC Electronic Media Communication SA +D4:F6:3F IEA S.R.L. +4C:02:89 LEX COMPUTECH CO., LTD +C0:E5:4E DENX Computer Systems GmbH +E4:35:FB Sabre Technology (Hull) Ltd +00:CD:90 MAS Elektronik AG +A8:BD:1A Honey Bee (Hong Kong) Limited +AC:CC:8E Axis Communications AB +18:7C:81 Valeo Vision Systems +DC:1E:A3 Accensus LLC +A4:01:30 ABIsystems Co., LTD +68:F1:25 Data Controls Inc. +70:6F:81 Private +30:E4:DB Cisco Systems, Inc +74:2B:0F Infinidat Ltd. +28:0C:B8 Mikrosay Yazilim ve Elektronik A.S. +A0:6C:EC RIM +44:3E:B2 DEOTRON Co., LTD. +8C:B8:2C IPitomy Communications +80:7D:E3 Chongqing Sichuan Instrument Microcircuit Co.LTD. +1C:8E:8E DB Communication & Systems Co., ltd. +F0:02:2B Chrontel +00:7F:28 Actiontec Electronics, Inc +0C:92:4E Rice Lake Weighing Systems +40:04:0C A&T +A0:16:5C Triteka LTD +90:B9:7D Johnson Outdoors Marine Electronics d/b/a Minnkota +88:21:E3 Nebusens, S.L. +B0:F1:BC Dhemax Ingenieros Ltda +3C:09:6D Powerhouse Dynamics +CC:50:1C KVH Industries, Inc. +AC:6F:D9 Valueplus Inc. +A4:E3:91 DENY FONTAINE +04:A8:2A Nokia Corporation +48:D8:FE ClarIDy Solutions, Inc. +70:B2:65 Hiltron s.r.l. +84:D9:C8 Unipattern Co., +1C:95:5D I-LAX ELECTRONICS INC. +94:AA:B8 Joview(Beijing) Technology Co. Ltd. +18:B3:BA Netlogic AB +F4:3E:9D Benu Networks, Inc. +64:69:BC Hytera Communications Co .,ltd +64:09:4C Beijing Superbee Wireless Technology Co.,Ltd +F0:AE:51 Xi3 Corp +78:2E:EF Nokia Corporation +78:51:0C LiveU Ltd. +30:61:18 Paradom Inc. +C8:45:29 IMK Networks Co.,Ltd +A8:8C:EE MicroMade Galka i Drozdz sp.j. +20:40:05 feno GmbH +6C:81:FE Mitsuba Corporation +E8:F9:28 RFTECH SRL +70:3A:D8 Shenzhen Afoundry Electronic Co., Ltd +4C:98:EF Zeo +DC:A6:BD Beijing Lanbo Technology Co., Ltd. +58:E8:08 AUTONICS CORPORATION +B8:C7:16 Fiberhome Telecommunication Technologies Co.,LTD +80:58:C5 NovaTec Kommunikationstechnik GmbH +C0:EA:E4 Sonicwall +F8:A9:DE PUISSANCE PLUS +D4:F0:27 Navetas Energy Management +5C:0C:BB CELIZION Inc. +B8:87:1E Good Mind Industries Co., Ltd. +F8:EA:0A Dipl.-Math. Michael Rauch +BC:5F:F4 ASRock Incorporation +A4:B3:6A JSC SDO Chromatec +90:5F:8D modas GmbH +E0:C9:22 Jireh Energy Tech., Ltd. +28:40:1A C8 MediSensors, Inc. +DC:3C:84 Ticom Geomatics, Inc. +E8:CC:32 Micronet LTD +9C:6A:BE QEES ApS. +34:29:EA MCD ELECTRONICS SP. Z O.O. +D4:3A:E9 DONGGUAN ipt INDUSTRIAL CO., LTD +AC:C9:35 Ness Corporation +7C:4A:82 Portsmith LLC +2C:00:33 EControls, LLC +E0:F2:11 Digitalwatt +04:32:F4 Partron +AC:19:9F SUNGROW POWER SUPPLY CO.,LTD. +1C:AA:07 Cisco Systems, Inc +30:8C:FB Dropcam +CC:F8:41 Lumewave +70:14:04 Limited Liability Company +1C:35:F1 NEW Lift Neue Elektronische Wege Steuerungsbau GmbH +CC:D9:E9 SCR Engineers Ltd. +F0:DB:30 Yottabyte +9C:31:B6 Kulite Semiconductor Products Inc +5C:6A:7D KENTKART EGE ELEKTRONIK SAN. VE TIC. LTD. STI. +04:FF:51 NOVAMEDIA INNOVISION SP. Z O.O. +FC:D4:F2 The Coca Cola Company +C4:71:FE Cisco Systems, Inc +34:08:04 D-Link Corporation +B4:4C:C2 NR ELECTRIC CO., LTD +08:4E:BF Broad Net Mux Corporation +48:CB:6E Cello Electronics (UK) Ltd +EC:3B:F0 NovelSat +A8:6A:6F RIM +40:22:ED Digital Projection Ltd +08:17:F4 IBM Corp +C4:D4:89 JiangSu Joyque Information Industry Co.,Ltd +1C:7C:11 EID +F4:3E:61 Shenzhen Gongjin Electronics Co., Ltd +B0:B3:2B Slican Sp. z o.o. +58:42:E4 Baxter International Inc +8C:A0:48 Beijing NeTopChip Technology Co.,LTD +80:4F:58 ThinkEco, Inc. +B0:65:63 Shanghai Railway Communication Factory +34:9A:0D ZBD Displays Ltd +A0:B5:DA HongKong THTF Co., Ltd +CC:CD:64 SM-Electronic GmbH +E8:28:77 TMY Co., Ltd. +AC:81:12 Gemtek Technology Co., Ltd. +6C:A9:06 Telefield Ltd +3C:02:B1 Creation Technologies LP +E4:6C:21 messMa GmbH +04:70:BC Globalstar Inc. +E0:5F:B9 Cisco Systems, Inc +08:17:35 Cisco Systems, Inc +20:FE:CD System In Frontier Inc. +94:D0:19 Cydle Corp. +2C:A1:57 acromate, Inc. +70:DD:A1 Tellabs +30:EB:25 INTEK DIGITAL +BC:3E:13 Accordance Systems Inc. +04:55:CA BriView (Xiamen) Corp. +D4:5D:42 Nokia Corporation +BC:28:46 NextBIT Computing Pvt. Ltd. +44:25:BB Bamboo Entertainment Corporation +B8:A8:AF Logic S.p.A. +64:81:25 Alphatron Marine BV +04:26:05 GFR Gesellschaft für Regelungstechnik und Energieeinsparung mbH +9C:64:5E Harman Consumer Group +78:CD:8E SMC Networks Inc +5C:9A:D8 FUJITSU LIMITED +14:4C:1A Max Communication GmbH +FC:E5:57 Nokia Corporation +BC:6E:76 Green Energy Options Ltd +10:8C:CF Cisco Systems, Inc +74:E0:6E Ergophone GmbH +18:AF:9F DIGITRONIC Automationsanlagen GmbH +EC:46:44 TTK SAS +DC:D8:7F Shenzhen JoinCyber Telecom Equipment Ltd +B0:89:91 LGE +44:DC:CB SEMINDIA SYSTEMS PVT LTD +90:D9:2C HUG-WITSCHI AG +B4:28:F1 E-Prime Co., Ltd. +B4:74:9F ASKEY COMPUTER CORP +AC:2F:A8 Humannix Co.,Ltd. +7C:4A:A8 MindTree Wireless PVT Ltd +C8:A7:0A Verizon Business +30:4E:C3 Tianjin Techua Technology Co., Ltd. +BC:43:77 Hang Zhou Huite Technology Co.,ltd. +A8:1B:18 XTS CORP +04:E2:F8 AEP Ticketing solutions srl +8C:51:05 Shenzhen ireadygo Information Technology CO.,LTD. +28:E2:97 Shanghai InfoTM Microelectronics Co.,Ltd. +D0:93:F8 Stonestreet One LLC +1C:33:4D ITS Telecom +60:9E:64 Vivonic GmbH +D4:4F:80 Kemper Digital GmbH +34:68:4A Teraworks Co., Ltd. +0C:C6:AC DAGS +D8:2A:7E Nokia Corporation +5C:BD:9E HONGKONG MIRACLE EAGLE TECHNOLOGY(GROUP) LIMITED +74:38:89 ANNAX Anzeigesysteme GmbH +64:7F:DA TEKTELIC Communications Inc. +90:61:0C Fida International (S) Pte Ltd +3C:5F:01 Synerchip Co., Ltd. +70:8B:78 citygrow technology co., ltd +74:CD:0C Smith Myers Communications Ltd. +B8:EE:79 YWire Technologies, Inc. +40:C2:45 Shenzhen Hexicom Technology Co., Ltd. +70:76:F0 LevelOne Communications (India) Private Limited +48:C8:B6 SysTec GmbH +30:38:55 Nokia Corporation +9C:45:63 DIMEP Sistemas +E4:27:71 Smartlabs +C4:EE:F5 Oclaro, Inc. +08:76:FF Thomson Telecom Belgium +40:1D:59 Biometric Associates, LP +4C:2C:80 Beijing Skyway Technologies Co.,Ltd +08:D2:9A Proformatique +90:D8:52 Comtec Co., Ltd. +28:06:1E NINGBO GLOBAL USEFUL ELECTRIC CO.,LTD +40:37:AD Macro Image Technology, Inc. +64:E8:E6 global moisture management system +34:A1:83 AWare, Inc +74:0A:BC JSJS Designs (Europe) Limited +58:8D:09 Cisco Systems, Inc +34:21:09 Jensen Scandinavia AS +08:FA:E0 Fohhn Audio AG +50:6F:9A Wi-Fi Alliance +7C:F0:98 Bee Beans Technologies, Inc. +9C:75:14 Wildix srl +BC:7D:D1 Radio Data Comms +28:06:8D ITL, LLC +F0:D7:67 Axema Passagekontroll AB +A4:AE:9A Maestro Wireless Solutions ltd. +5C:D1:35 Xtreme Power Systems +9C:28:BF Continental Automotive Czech Republic s.r.o. +20:6F:EC Braemac CA LLC +64:A2:32 OOO Samlight +A0:82:C7 P.T.I Co.,LTD +F4:1F:0B YAMABISHI Corporation +44:7C:7F Innolight Technology Corporation +FC:75:E6 Handreamnet +20:B0:F7 Enclustra GmbH +40:13:D9 Global ES +F4:DC:4D Beijing CCD Digital Technology Co., Ltd +F8:B5:99 Guangzhou CHNAVS Digital Technology Co.,Ltd +7C:39:20 SSOMA SECURITY +9C:77:AA NADASNV +D8:B6:C1 NetworkAccountant, Inc. +58:D0:8F IEEE 1904.1 Working Group +3C:99:F7 Lansentechnology AB +94:E7:11 Xirka Dama Persada PT +50:7D:02 BIODIT +F4:42:27 S & S Research Inc. +D4:CB:AF Nokia Corporation +CC:09:C8 IMAQLIQ LTD +C4:B5:12 General Electric Digital Energy +E0:25:38 Titan Pet Products +CC:7A:30 CMAX Wireless Co., Ltd. +D8:76:0A Escort, Inc. +60:63:FD Transcend Communication Beijing Co.,Ltd. +E0:8A:7E Exponent +80:C6:CA Endian s.r.l. +F8:DA:E2 Beta LaserMike +E8:04:62 Cisco Systems, Inc +70:B0:8C Shenou Communication Equipment Co.,Ltd +F0:E5:C3 Drägerwerk AG & Co. KG aA +44:61:32 ecobee inc +A4:B2:A7 Adaxys Solutions AG +F4:55:E0 Niceway CNC Technology Co.,Ltd.Hunan Province +AC:4F:FC SVS-VISTEK GmbH +FC:7C:E7 FCI USA LLC +14:54:12 Entis Co., Ltd. +80:7D:1B Neosystem Co. Ltd. +14:FE:AF SAGITTAR LIMITED +7C:B5:42 ACES Technology +40:CD:3A Z3 Technology +04:5D:56 camtron industrial inc. +AC:83:F0 ImmediaTV Corporation +6C:E0:B0 SOUND4 +00:33:6C SynapSense Corporation +E4:46:BD C&C TECHNIC TAIWAN CO., LTD. +74:15:E2 Tri-Sen Systems Corporation +F0:BD:F1 Sipod Inc. +28:89:15 CashGuard Sverige AB +18:06:75 DILAX Intelcom GmbH +40:61:8E Stella-Green Co +9C:4E:20 Cisco Systems, Inc +40:84:93 Clavister AB +1C:3A:4F AccuSpec Electronics, LLC +58:E7:47 Deltanet AG +D8:75:33 Nokia Corporation +EC:FE:7E BlueRadios, Inc. +7C:6F:06 Caterpillar Trimble Control Technologies +7C:76:73 ENMAS GmbH +6C:6F:18 Stereotaxis, Inc. +00:35:32 Electro-Metrics Corporation +44:37:6F Young Electric Sign Co +8C:64:0B Beyond Devices d.o.o. +F0:43:35 DVN(Shanghai)Ltd. +A4:79:E4 KLINFO Corp +00:3C:C5 WONWOO Engineering Co., Ltd +E8:5E:53 Infratec Datentechnik GmbH +C8:48:F5 MEDISON Xray Co., Ltd +1C:17:D3 Cisco Systems, Inc +AC:BE:75 Ufine Technologies Co.,Ltd. +D8:71:57 Lenovo Mobile Communication Technology Ltd. +80:66:29 Prescope Technologies CO.,LTD. +90:F2:78 Radius Gateway +68:CA:00 Octopus Systems Limited +4C:30:89 Thales Transportation Systems GmbH +0C:7D:7C Kexiang Information Technology Co, Ltd. +70:D8:80 Upos System sp. z o.o. +0C:C9:C6 Samwin Hong Kong Limited +B4:58:61 CRemote, LLC +AC:67:06 Ruckus Wireless +B8:65:3B Bolymin, Inc. +B0:97:3A E-Fuel Corporation +A0:5D:C1 TMCT Co., LTD. +E0:CA:4D Shenzhen Unistar Communication Co.,LTD +E4:97:F0 Shanghai VLC Technologies Ltd. Co. +20:4E:6B Axxana(israel) ltd +50:F0:03 Open Stack, Inc. +0C:17:F1 TELECSYS +98:BC:99 Edeltech Co.,Ltd. +E8:E1:E2 Energotest +FC:68:3E Directed Perception, Inc +6C:18:11 Decatur Electronics +94:59:2D EKE Building Technology Systems Ltd +9C:C0:77 PrintCounts, LLC +A8:5B:B0 Shenzhen Dehoo Technology Co.,Ltd +08:9F:97 LEROY AUTOMATION +4C:5D:CD Oy Finnish Electric Vehicle Technologies Ltd +10:09:0C Janome Sewing Machine Co., Ltd. +EC:B1:06 Acuro Networks, Inc +7C:2E:0D Blackmagic Design +08:F6:F8 GET Engineering +6C:DC:6A Promethean Limited +90:55:AE Ericsson, EAB/RWI/K +2C:3A:28 Fagor Electrónica +90:A7:C1 Pakedge Device and Software Inc. +80:F5:93 IRCO Sistemas de Telecomunicación S.A. +6C:FD:B9 Proware Technologies Co Ltd. +6C:FF:BE MPB Communications Inc. +58:3C:C6 Omneality Ltd. +00:97:FF Heimann Sensor GmbH +34:BA:51 Se-Kure Controls, Inc. +44:A8:C2 SEWOO TECH CO., LTD +8C:D6:28 Ikor Metering +48:1B:D2 Intron Scientific co., ltd. +00:93:63 Uni-Link Technology Co., Ltd. +64:DB:18 OpenPattern +58:05:56 Elettronica GF S.r.L. +88:B6:27 Gembird Europe BV +D4:1F:0C JAI Oy +3C:4C:69 Infinity System S.L. +44:E4:9A OMNITRONICS PTY LTD +74:F0:7D BnCOM Co.,Ltd +10:65:A3 Core Brands LLC +20:41:5A Smarteh d.o.o. +70:3C:39 SEAWING Kft +14:A8:6B ShenZhen Telacom Science&Technology Co., Ltd +0C:C3:A7 Meritec +4C:32:2D TELEDATA NETWORKS +B8:B1:C7 BT&COM CO.,LTD +A0:BF:A5 CORESYS +D4:11:D6 ShotSpotter, Inc. +7C:CB:0D Antaira Technologies, LLC +EC:E9:F8 Guang Zhou TRI-SUN Electronics Technology Co., Ltd +9C:AF:CA Cisco Systems, Inc +34:CE:94 Parsec (Pty) Ltd +AC:E9:AA Hay Systems Ltd +08:2A:D0 SRD Innovations Inc. +24:82:8A Prowave Technologies Ltd. +6C:0F:6A JDC Tech Co., Ltd. +6C:F0:49 GIGA-BYTE TECHNOLOGY CO.,LTD. +D4:C7:66 Acentic GmbH +48:EB:30 ETERNA TECHNOLOGY, INC. +20:7C:8F Quanta Microsystems,Inc. +F8:47:2D X2gen Digital Corp. Ltd +8C:59:8B C Technologies AB +64:F9:70 Kenade Electronics Technology Co.,LTD. +A0:40:25 Actioncable, Inc. +78:99:8F MEDILINE ITALIA SRL +40:EC:F8 Siemens AG +F0:4B:F2 JTECH Communications, Inc. +A8:CB:95 EAST BEST CO., LTD. +C8:D1:D1 AGAiT Technology Corporation +3C:F5:2C DSPECIALISTS GmbH +04:0E:C2 ViewSonic Mobile China Limited +54:03:F5 EBN Technology Corp. +7C:2F:80 Gigaset Communications GmbH +44:6C:24 Reallin Electronic Co.,Ltd +A0:59:3A V.D.S. Video Display Systems srl +A8:F9:4B Eltex Enterprise Ltd. +90:6D:C8 DLG Automação Industrial Ltda +48:34:3D IEP GmbH +C8:C1:3C RuggedTek Hangzhou Co., Ltd +60:9F:9D CloudSwitch +0C:E9:36 ELIMOS srl +A4:DE:50 Total Walther GmbH +E8:A4:C1 Deep Sea Electronics PLC +70:1A:ED ADVAS CO., LTD. +64:C6:AF AXERRA Networks Ltd +D8:D6:7E GSK CNC EQUIPMENT CO.,LTD +A4:E7:E4 Connex GmbH +AC:58:3B Human Assembler, Inc. +A0:5D:E7 DIRECTV, Inc. +10:CA:81 PRECIA +00:3A:98 Cisco Systems, Inc +70:5A:B6 COMPAL INFORMATION (KUNSHAN) CO., LTD. +00:3A:9A Cisco Systems, Inc +AC:BE:B6 Visualedge Technology Co., Ltd. +40:A6:A4 PassivSystems Ltd +90:3D:6B Zicon Technology Corp. +7C:3B:D5 Imago Group +B8:94:D2 Retail Innovation HTT AB +DC:E7:1C AUG Elektronik GmbH +88:A5:BD QPCOM INC. +DC:33:50 TechSAT GmbH +00:27:1E Xagyl Communications +00:27:16 Adachi-Syokai Co., Ltd. +00:27:15 Rebound Telecom. Co., Ltd +00:27:0A IEE S.A. +00:26:74 Electronic Solutions, Inc. +00:26:6E Nissho-denki Co.,LTD. +00:26:5B Hitron Technologies. Inc +00:26:61 Irumtek Co., Ltd. +00:26:57 OOO NPP EKRA +00:26:4E Rail & Road Protec GmbH +00:25:E6 Belgian Monitoring Systems bvba +00:25:E1 SHANGHAI SEEYOO ELECTRONIC & TECHNOLOGY CO., LTD +00:25:DB ATI Electronics(Shenzhen) Co., LTD +00:25:D5 Robonica (Pty) Ltd +00:25:C9 SHENZHEN HUAPU DIGITAL CO., LTD +00:25:CE InnerSpace +00:25:C2 RingBell Co.,Ltd. +00:26:A0 moblic +00:26:9A Carina System Co., Ltd. +00:26:94 Senscient Ltd +00:26:93 QVidium Technologies, Inc. +00:26:8D CellTel S.p.A. +00:26:8E Alta Solutions, Inc. +00:26:87 corega K.K +00:26:81 Interspiro AB +00:26:7B GSI Helmholtzzentrum für Schwerionenforschung GmbH +00:25:BB INNERINT Co., Ltd. +00:25:B6 Telecom FM +00:25:AF COMFILE Technology +00:25:AA Beijing Soul Technology Co.,Ltd. +00:25:A9 Shanghai Embedway Information Technologies Co.,Ltd +00:25:A3 Trimax Wireless, Inc. +00:25:9C Cisco-Linksys, LLC +00:25:90 Super Micro Computer, Inc. +00:25:80 Equipson S.A. +00:25:7C Huachentel Technology Development Co., Ltd +00:25:75 FiberPlex Technologies, LLC +00:25:76 NELI TECHNOLOGIES +00:25:70 Eastern Communications Company Limited +00:25:63 Luxtera Inc +00:27:04 Accelerated Concepts, Inc +00:26:FE MKD Technology Inc. +00:26:F8 Golden Highway Industry Development Co., Ltd. +00:26:EB Advanced Spectrum Technology Co., Ltd. +00:26:E5 AEG Power Solutions +00:26:DF TaiDoc Technology Corp. +00:26:D8 Magic Point Inc. +00:26:D2 Pcube Systems, Inc. +00:26:C5 Guangdong Gosun Telecommunications Co.,Ltd +00:26:C0 EnergyHub +00:26:BF ShenZhen Temobi Science&Tech Development Co.,Ltd +00:26:B7 Kingston Technology Company, Inc. +00:26:A6 TRIXELL +00:26:3C Bachmann Technology GmbH & Co. KG +00:26:30 ACOREL S.A.S +00:26:29 Juphoon System Software Inc. +00:26:2A Proxense, LLC +00:26:24 Thomson Inc. +00:26:1D COP SECURITY SYSTEM CORP. +00:26:11 Licera AB +00:26:17 OEM Worldwide +00:26:0A Cisco Systems, Inc +00:25:FE Pilot Electronics Corporation +00:26:05 CC Systems AB +00:26:04 Audio Processing Technology Ltd +00:25:F4 KoCo Connector AG +00:25:EB Reutech Radar Systems (PTY) Ltd +00:24:2A Hittite Microwave Corporation +00:24:1D GIGA-BYTE TECHNOLOGY CO.,LTD. +00:24:24 Axis Network Technology +00:24:17 Thomson Telecom Belgium +00:24:18 Nextwave Semiconductor +00:24:11 PharmaSmart LLC +00:24:0B Virtual Computer Inc. +00:24:0A US Beverage Net +00:24:B8 free alliance sdn bhd +00:24:BD Hainzl Industriesysteme GmbH +00:24:B3 Graf-Syteco GmbH & Co. KG +00:24:AE Morpho +00:24:A7 Advanced Video Communications Inc. +00:24:AC Hangzhou DPtech Technologies Co., Ltd. +00:25:5D Morningstar Corporation +00:25:51 SE-Elektronic GmbH +00:25:4A RingCube Technologies, Inc. +00:25:43 MONEYTECH +00:25:44 LoJack Corporation +00:25:39 IfTA GmbH +00:25:3B din Dietmar Nocker Facilitymanagement GmbH +00:25:0B CENTROFACTOR INC +00:25:04 Valiant Communications Limited +00:24:FD Accedian Networks Inc +00:24:F8 Technical Solutions Company Ltd. +00:24:F1 Shenzhen Fanhai Sanjiang Electronics Co., Ltd. +00:24:EC United Information Technology Co.,Ltd. +00:24:9B Action Star Enterprise Co., Ltd. +00:24:99 Aquila Technologies +00:24:88 Centre For Development Of Telematics +00:24:94 Shenzhen Baoxin Tech CO., Ltd. +00:24:7A FU YI CHENG Technology Co., Ltd. +00:24:75 Compass System(Embedded Dept.) +00:24:6E Phihong USA Corp. +00:24:67 AOC International (Europe) GmbH +00:24:69 Smart Doorphones +00:24:62 Rayzone Corporation +00:24:58 PA Bastion CC +00:24:5D Terberg besturingstechniek B.V. +00:24:55 MuLogic BV +00:24:50 Cisco Systems, Inc +00:24:4B PERCEPTRON INC +00:25:3A CEVA, Ltd. +00:25:31 Cloud Engines, Inc. +00:25:2F Energy, Inc. +00:25:2A Chengdu GeeYa Technology Co.,LTD +00:25:21 Logitek Electronic Systems, Inc. +00:25:1C EDT +00:25:17 Venntis, LLC +00:25:10 Pico-Tesla Magnetic Therapies +00:24:E5 Seer Technology, Inc +00:24:E0 DS Tech, LLC +00:24:DE GLOBAL Technology Inc. +00:24:D9 BICOM, Inc. +00:24:CB Autonet Mobile +00:24:CD Willow Garage, Inc. +00:24:C6 Hager Electro SAS +00:24:3A Ludl Electronic Products +00:24:34 Lectrosonics, Inc. +00:24:2E Datastrip Inc. +00:22:96 LinoWave Corporation +00:22:8F CNRS +00:22:90 Cisco Systems, Inc +00:22:8A Teratronik elektronische systeme gmbh +00:22:7E Chengdu 30Kaitian Communication Industry Co.Ltd +00:22:7D YE DATA INC. +00:22:78 Shenzhen Tongfang Multimedia Technology Co.,Ltd. +00:22:72 American Micro-Fuel Device Corp. +00:22:71 Jäger Computergesteuerte Meßtechnik GmbH. +00:22:6E Gowell Electronic Limited +00:23:58 SYSTEL SA +00:23:57 Pitronot Technologies and Engineering P.T.E. Ltd. +00:23:52 DATASENSOR S.p.A. +00:23:4B Inyuan Technology Inc. +00:23:46 Vestac +00:23:3F Purechoice Inc +00:23:38 OJ-Electronics A/S +00:23:33 Cisco Systems, Inc +00:23:2F Advanced Card Systems Ltd. +00:23:2A eonas IT-Beratung und -Entwicklung GmbH +00:22:C1 Active Storage Inc. +00:22:C2 Proview Eletrônica do Brasil LTDA +00:22:BC JDSU France SAS +00:22:B5 NOVITA +00:22:AF Safety Vision +00:22:A2 Xtramus Technologies +00:22:9D PYUNG-HWA IND.CO.,LTD +00:23:27 Shouyo Electronics CO., LTD +00:23:23 Zylin AS +00:23:1A ITF Co., Ltd. +00:23:11 Gloscom Co., Ltd. +00:23:0C CLOVER ELECTRONICS CO.,LTD. +00:23:05 Cisco Systems, Inc +00:22:FF NIVIS LLC +00:22:FE Advanced Illumination +00:23:00 Cayee Computer Ltd. +00:22:F6 Syracuse Research Corporation +00:22:F9 Pollin Electronic GmbH +00:23:AD Xmark Corporation +00:23:A7 Redpine Signals, Inc. +00:23:A1 Trend Electronics Ltd +00:23:A6 E-Mon +00:23:9A EasyData Hardware GmbH +00:23:94 Samjeon +00:23:90 Algolware Corporation +00:23:86 Tour & Andersson AB +00:24:05 Dilog Nordic AB +00:23:F5 WILO SE +00:23:FE Biodevices, SA +00:23:F0 Shanghai Jinghan Weighing Apparatus Co. Ltd. +00:23:EB Cisco Systems, Inc +00:23:E5 IPaXiom Networks +00:23:E6 Pirkus, Inc. +00:23:D9 Banner Engineering +00:23:D3 AirLink WiFi Networking Corp. +00:23:D8 Ball-It Oy +00:23:C6 SMC Corporation +00:23:C0 Broadway Networks +00:23:B9 EADS Deutschland GmbH +00:23:B3 Lyyn AB +00:22:F5 Advanced Realtime Tracking GmbH +00:22:EF iWDL Technologies +00:22:E8 Applition Co., Ltd. +00:22:E3 Amerigon +00:22:D5 Eaton Corp. Electrical Group Data Center Solutions - Pulizzi +00:22:DC Vigil Health Solutions Inc. +00:22:D6 Cypak AB +00:22:D0 Polar Electro Oy +00:22:CB IONODES Inc. +00:22:C6 Sutus Inc +00:23:80 Nanoteq +00:23:7A RIM +00:23:77 Isotek Electronics Ltd +00:23:71 SOAM Systel +00:23:65 ELKA-Elektronik GmbH +00:23:6A SmartRG Inc +00:23:5E Cisco Systems, Inc +00:22:5A Garde Security AB +00:22:54 Bigelow Aerospace +00:22:51 Lumasense Technologies +00:22:4B AIRTECH TECHNOLOGIES, INC. +00:22:45 Leine & Linde AB +00:22:42 Alacron Inc. +00:22:3B Communication Networks, LLC +00:21:46 Sanmina-SCI +00:21:3D Cermetek Microelectronics, Inc. +00:21:3E TomTom +00:21:35 ALCATEL-LUCENT +00:21:3A Winchester Systems Inc. +00:21:30 Keico Hightech Inc. +00:21:7E Telit Communication s.p.a +00:21:78 Matuschek Messtechnik GmbH +00:21:72 Seoultek Valley +00:21:66 NovAtel Inc. +00:21:65 Presstek Inc. +00:21:5F IHSE GmbH +00:21:53 SeaMicro Inc. +00:21:58 Style Flying Technology Co. +00:21:AC Infrared Integrated Systems Ltd +00:21:A5 ERLPhase Power Technologies Ltd. +00:21:9F SATEL OY +00:21:8A Electronic Design and Manufacturing Company +00:21:8B Wescon Technology, Inc. +00:21:85 MICRO-STAR INT'L CO.,LTD. +00:1F:F9 Advanced Knowledge Associates +00:1F:F2 VIA Technologies, Inc. +00:1F:ED Tecan Systems Inc. +00:1F:E6 Alphion Corporation +00:1F:E0 EdgeVelocity Corp +00:1F:DA Nortel Networks +00:22:09 Omron Healthcare Co., Ltd +00:22:03 Glensound Electronics Ltd +00:22:00 IBM Corp +00:21:F6 Oracle Corporation +00:21:F0 EW3 Technologies LLC +00:21:EA Bystronic Laser AG +00:21:E3 SerialTek LLC +00:21:DE Firepro Wireless +00:21:DD Northstar Systems Corp +00:21:D7 Cisco Systems, Inc +00:22:35 Strukton Systems bv +00:22:34 Corventis Inc. +00:22:2F Open Grid Computing, Inc. +00:22:28 Breeze Innovations Ltd. +00:22:22 Schaffner Deutschland GmbH +00:22:1C Private +00:22:0F MoCA (Multimedia over Coax Alliance) +00:21:2B MSA Auer +00:21:1D Dataline AB +00:21:24 Optos Plc +00:21:18 Athena Tech, Inc. +00:21:11 Uniphone Inc. +00:21:07 Seowonintech Co Ltd. +00:21:01 Aplicaciones Electronicas Quasar (AEQ) +00:21:02 UpdateLogic Inc. +00:21:D0 Global Display Solutions Spa +00:21:CB SMS TECNOLOGIA ELETRONICA LTDA +00:21:C4 Consilium AB +00:21:B8 Inphi Corporation +00:21:B1 DIGITAL SOLUTIONS LTD +00:1F:82 Cal-Comp Electronics & Communications Co., Ltd +00:1F:7D embedded wireless GmbH +00:1F:7B TechNexion Ltd. +00:1F:7C Witelcom AS +00:1F:79 Lodam Electronics A/S +00:1F:74 Eigen Development +00:1F:6F Fujian Sunnada Communication Co.,Ltd. +00:1F:63 JSC Goodwin-Europa +00:1F:6A PacketFlux Technologies, Inc. +00:1F:69 Pingood Technology Co., Ltd. +00:1F:57 Phonik Innovation Co.,LTD +00:1F:21 Inner Mongolia Yin An Science & Technology Development Co.,L +00:1F:22 Source Photonics, Inc. +00:1F:1C KOBISHI ELECTRIC Co.,Ltd. +00:1F:15 Bioscrypt Inc +00:1F:10 TOLEDO DO BRASIL INDUSTRIA DE BALANCAS LTDA +00:1F:0C Intelligent Digital Services GmbH +00:1F:07 AZTEQ Mobile +00:1F:AA Taseon, Inc. +00:1F:A5 Blue-White Industries +00:1F:A4 ShenZhen Gongjin Electronics Co.,Ltd +00:1F:A0 A10 Networks +00:1F:99 SERONICS co.ltd +00:1F:9B POSBRO +00:1F:94 Lascar Electronics Ltd +00:1F:8D Ingenieurbuero Stark GmbH und Ko. KG +00:1F:89 Signalion GmbH +00:1E:D0 Ingespace +00:1E:CB RPC Energoautomatika Ltd +00:1E:C4 Celio Corp +00:1E:BE Cisco Systems, Inc +00:1E:BD Cisco Systems, Inc +00:1E:B8 Fortis, Inc. +00:1E:B1 Cryptsoft Pty Ltd +00:1E:A6 Best IT World (India) Pvt. Ltd. +00:1E:AC Armadeus Systems +00:1E:9F Visioneering Systems, Inc. +00:1E:A0 XLN-t +00:1E:F4 L-3 Communications Display Systems +00:1E:F9 Pascom Kommunikations systeme GmbH. +00:1E:FA PROTEI Ltd. +00:1E:E8 Mytek +00:1E:ED Adventiq Ltd. +00:1E:E7 Epic Systems Inc +00:1E:D7 H-Stream Wireless, Inc. +00:1E:6B Cisco SPVTG +00:1E:72 PCS +00:1E:66 RESOL Elektronische Regelungen GmbH +00:1E:5F KwikByte, LLC +00:1E:53 Further Tech Co., LTD +00:1E:9A HAMILTON Bonaduz AG +00:1E:93 CiriTech Systems Inc +00:1E:8E Hunkeler AG +00:1E:88 ANDOR SYSTEM SUPPORT CO., LTD. +00:1E:82 SanDisk Corporation +00:1E:81 CNB Technology Inc. +00:1E:7C Taiwick Limited +00:1E:77 Air2App +00:1F:50 Swissdis AG +00:1F:49 Manhattan TV Ltd +00:1F:4A Albentia Systems S.A. +00:1F:44 GE Transportation Systems +00:1F:2F Berker GmbH & Co. KG +00:1F:34 Lung Hwa Electronics Co., Ltd. +00:1F:28 HPN Supply Chain +00:1F:D5 MICRORISC s.r.o. +00:1F:D6 Shenzhen Allywll +00:1F:D0 GIGA-BYTE TECHNOLOGY CO.,LTD. +00:1F:C9 Cisco Systems, Inc +00:1F:BD Kyocera Wireless Corp. +00:1F:B1 Cybertech Inc. +00:1F:B6 Chi Lin Technology Co., Ltd. +00:1D:02 Cybertech Telecom Development +00:1C:F6 Cisco Systems, Inc +00:1C:EA Scientific-Atlanta, Inc +00:1C:E9 Galaxy Technology Limited +00:1C:E5 MBS Electronic Systems GmbH +00:1C:E0 DASAN TPS +00:1C:D9 GlobalTop Technology Inc. +00:1C:D2 King Champion (Hong Kong) Limited +00:1C:CD Alektrona Corporation +00:1C:C6 ProStor Systems +00:1C:BA VerScient, Inc. +00:1C:B0 Cisco Systems, Inc +00:1C:B5 Neihua Network Technology Co.,LTD.(NHN) +00:1C:B6 Duzon CNT Co., Ltd. +00:1C:A9 Audiomatica Srl +00:1D:5F OverSpeed SARL +00:1D:53 S&O Electronics (Malaysia) Sdn. Bhd. +00:1D:4E TCM Mobile LLC +00:1D:4D Adaptive Recognition Hungary, Inc +00:1D:49 Innovation Wireless Inc. +00:1D:44 KROHNE Messtechnik GmbH +00:1D:3D Avidyne Corporation +00:1D:43 Shenzhen G-link Digital Technology Co., Ltd. +00:1E:17 STN BV +00:1E:1C SWS Australia Pty Limited +00:1E:12 Ecolab +00:1E:0D Micran Ltd. +00:1E:06 WIBRAIN +00:1D:FF Network Critical Solutions Ltd +00:1E:00 Shantou Institute of Ultrasonic Instruments +00:1D:FA Fujian LANDI Commercial Equipment Co.,Ltd +00:1D:F3 SBS Science & Technology Co., Ltd +00:1D:EE NEXTVISION SISTEMAS DIGITAIS DE TELEVISÃO LTDA. +00:1D:ED Grid Net, Inc. +00:1D:DE Zhejiang Broadcast&Television Technology Co.,Ltd. +00:1D:E7 Marine Sonic Technology, Ltd. +00:1D:D7 Algolith +00:1D:D8 Microsoft Corporation +00:1D:CB Exéns Development Oy +00:1D:C6 SNR Inc. +00:1D:C5 Beijing Jiaxun Feihong Electricial Co., Ltd. +00:1D:BF Radiient Technologies, Inc. +00:1D:B8 Intoto Inc. +00:1D:36 ELECTRONICS CORPORATION OF INDIA LIMITED +00:1D:31 HIGHPRO INTERNATIONAL R&D CO,.LTD. +00:1D:2A SHENZHEN BUL-TECH CO.,LTD. +00:1D:23 SENSUS +00:1D:24 Aclara Power-Line Systems Inc. +00:1D:1B Sangean Electronics Inc. +00:1D:1E KYUSHU TEN CO.,LTD +00:1D:15 Shenzhen Dolphin Electronic Co., Ltd +00:1D:0E Agapha Technology co., Ltd. +00:1D:B3 HPN Supply Chain +00:1D:AE CHANG TSENG TECHNOLOGY CO., LTD +00:1D:A9 Castles Technology, Co., LTD +00:1D:A2 Cisco Systems, Inc +00:1D:9C Rockwell Automation +00:1D:9B Hokuyo Automatic Co., Ltd. +00:1D:96 WatchGuard Video +00:1D:8F PureWave Networks +00:1D:8A TechTrex Inc +00:1D:89 VaultStor Corporation +00:1D:7F Tekron International Ltd +00:1D:83 Emitech Corporation +00:1D:79 SIGNAMAX LLC +00:1D:66 Hyundai Telecom +00:1D:6D Confidant International LLC +00:1E:42 Teltonika +00:1E:3C Lyngbox Media AB +00:1E:2F DiMoto Pty Ltd +00:1E:36 IPTE +00:1E:29 Hypertherm Inc +00:1E:23 Electronic Educational Devices, Inc +00:1C:0C TANITA Corporation +00:1C:06 Siemens Numerical Control Ltd., Nanjing +00:1B:FF Millennia Media inc. +00:1B:FA G.i.N. mbH +00:1B:E3 Health Hero Network, Inc. +00:1B:E5 802automation Limited +00:1B:E4 TOWNET SRL +00:1B:DE Renkus-Heinz, Inc. +00:1B:D2 ULTRA-X ASIA PACIFIC Inc. +00:1C:6B COVAX Co. Ltd +00:1C:64 Landis+Gyr +00:1C:5F Winland Electronics, Inc. +00:1C:53 Synergy Lighting Controls +00:1C:58 Cisco Systems, Inc +00:1C:4E TASA International Limited +00:1C:47 Hangzhou Hollysys Automation Co., Ltd +00:1C:49 Zoltan Technology Inc. +00:1C:48 WiDeFi, Inc. +00:1C:3B AmRoad Technology Inc. +00:1C:42 Parallels, Inc. +00:1B:72 Sicep s.p.a. +00:1B:6D Midtronics, Inc. +00:1B:6B Swyx Solutions AG +00:1B:6C LookX Digital Media BV +00:1B:66 Sennheiser electronic GmbH & Co. KG +00:1B:5F Alien Technology +00:1B:5A Apollo Imaging Technologies, Inc. +00:1B:53 Cisco Systems, Inc +00:1B:47 Futarque A/S +00:1B:4C Signtech +00:1B:4E Navman New Zealand +00:1B:40 Network Automation mxc AB +00:1C:9E Dualtech IT AB +00:1C:97 Enzytek Technology Inc., +00:1C:98 LUCKY TECHNOLOGY (HK) COMPANY LIMITED +00:1C:92 Tervela +00:1C:8B MJ Innovations Ltd. +00:1C:86 Cranite Systems, Inc. +00:1C:85 Eunicorn +00:1C:81 NextGen Venturi LTD +00:1C:72 Mayer & Cie GmbH & Co KG +00:1C:77 Prodys +00:1B:34 Focus System Inc. +00:1B:39 Proxicast +00:1B:3B Yi-Qing CO., LTD +00:1B:28 POLYGON, JSC +00:1B:2D Med-Eng Systems Inc. +00:1B:1F DELTA - Danish Electronics, Light & Acoustics +00:1B:18 Tsuken Electric Ind. Co.,Ltd +00:1B:13 Icron Technologies Corporation +00:1B:0C Cisco Systems, Inc +00:1B:A7 Lorica Solutions +00:1B:A2 IDS Imaging Development Systems GmbH +00:1B:96 General Sensing +00:1B:9B Hose-McCann Communications +00:1B:8F Cisco Systems, Inc +00:1B:85 MAN Diesel SE +00:1B:7E Beckmann GmbH +00:1B:79 FAIVELEY TRANSPORT +00:1C:36 iNEWiT NV +00:1C:2F Pfister GmbH +00:1C:28 Sphairon Technologies GmbH +00:1C:1E emtrion GmbH +00:1C:19 secunet Security Networks AG +00:1C:0B SmartAnt Telecom +00:1C:0D G-Technology, Inc. +00:1B:CB PEMPEK SYSTEMS PTY LTD +00:1B:C4 Ultratec, Inc. +00:1B:B5 ZF Electronics GmbH +00:1B:AE Micro Control Systems, Inc +00:1B:A8 UBI&MOBI,.Inc +00:1B:05 YMC AG +00:1B:00 Neopost Technologies +00:1A:F9 AeroVIronment (AV Inc) +00:1A:EF Loopcomm Technology, Inc. +00:1A:E3 Cisco Systems, Inc +00:1A:EA Radio Terminal Systems Pty Ltd +00:1A:26 Deltanode Solutions AB +00:1A:2B Ayecom Technology Co., Ltd. +00:1A:1F Coastal Environmental Systems +00:1A:1A Gentex Corporation/Electro-Acoustic Products +00:1A:13 Wanlida Group Co., LTD +00:1A:0E Cheng Uei Precision Industry Co.,Ltd +00:1A:0C Swe-Dish Satellite Systems AB +00:1A:07 Arecont Vision +00:1A:00 MATRIX INC. +00:1A:D0 Albis Technologies AG +00:1A:D5 KMC CHAIN INDUSTRIAL CO., LTD. +00:1A:D7 Christie Digital Systems, Inc. +00:1A:C9 SUZUKEN CO.,LTD +00:1A:BA Caton Overseas Limited +00:1A:BF TRUMPF Laser Marking Systems AG +00:1A:81 Zelax +00:1A:88 Venergy,Co,Ltd +00:1A:7A Lismore Instruments Limited +00:1A:70 Cisco-Linksys, LLC +00:1A:72 Mosart Semiconductor Corp. +00:1A:64 IBM Corp +00:1A:56 ViewTel Co,. Ltd. +00:1A:5B NetCare Service Co., Ltd. +00:1A:5F KitWorks.fi Ltd. +00:19:B6 Euro Emme s.r.l. +00:19:A3 asteel electronique atlantique +00:19:A8 WiQuest Communications +00:19:AA Cisco Systems, Inc +00:19:AF Rigol Technologies, Inc. +00:19:92 ADTRAN INC. +00:19:97 Soft Device Sdn Bhd +00:19:9C CTRING +00:1A:43 Logical Link Communications +00:1A:48 Takacom Corporation +00:1A:4A Qumranet Inc. +00:1A:3C Technowave Ltd. +00:1A:30 Cisco Systems, Inc +00:1A:35 BARTEC GmbH +00:1A:37 Lear Corporation +00:19:F2 Teradyne K.K. +00:19:F7 Onset Computer Corporation +00:19:DF Thomson Inc. +00:19:E6 TOYO MEDIC CO.,LTD. +00:19:EB Pyronix Ltd +00:19:CC RCG (HK) Ltd +00:19:D3 TRAK Microwave +00:19:D8 MAXFOR +00:19:C2 Equustek Solutions, Inc. +00:19:8B Novera Optics Korea, Inc. +00:19:8D Ocean Optics, Inc. +00:19:7F PLANTRONICS, INC. +00:19:86 Cheng Hongjian +00:19:73 Zeugma Systems +00:19:7A MAZeT GmbH +00:19:67 TELDAT Sp.J. +00:19:6C ETROVISION TECHNOLOGY +00:19:6E Metacom (Pty) Ltd. +00:1A:AC Corelatus AB +00:1A:AE Savant Systems LLC +00:1A:B3 VISIONITE INC. +00:1A:A7 Torian Wireless +00:1A:9E ICON Digital International Limited +00:1A:A3 DELORME +00:1A:A5 BRN Phoenix +00:1A:A4 Future University-Hakodate +00:1A:97 fitivision technology Inc. +00:1A:8D AVECS Bergen GmbH +00:19:62 Commerciant, LP +00:19:5D ShenZhen XinHuaTong Opto Electronics Co.,Ltd +00:19:51 NETCONS, s.r.o. +00:19:56 Cisco Systems, Inc +00:19:4A TESTO AG +00:19:43 Belden +00:18:73 Cisco Systems, Inc +00:18:75 AnaCise Testnology Pte Ltd +00:18:7A Wiremold +00:18:6E 3Com Ltd +00:18:5E Nexterm Inc. +00:18:60 SIM Technology Group Shanghai Simcom Ltd., +00:18:65 Siemens Healthcare Diagnostics Manufacturing Ltd +00:19:03 Bigfoot Networks Inc +00:18:F9 VVOND, Inc. +00:18:F2 Beijing Tianyu Communication Equipment Co., Ltd +00:18:EB Blue Zen Enterprises Private Limited +00:18:ED Accutech Ultrasystems Co., Ltd. +00:18:E6 Computer Hardware Design SIA +00:18:DF The Morey Corporation +00:19:37 CommerceGuard AB +00:19:2E Spectral Instruments, Inc. +00:19:32 Gude Analog- und Digialsysteme GmbH +00:19:22 CM Comandos Lineares +00:19:27 ImCoSys Ltd +00:19:29 2M2B Montadora de Maquinas Bahia Brasil LTDA +00:19:0F Advansus Corp. +00:19:16 PayTec AG +00:19:1B Sputnik Engineering AG +00:19:08 Duaxes Corporation +00:19:0A HASWARE INC. +00:17:D6 Bluechips Microhouse Co.,Ltd. +00:17:DB CANKO TECHNOLOGIES INC. +00:17:CC Alcatel-Lucent +00:17:C5 SonicWALL +00:17:B9 Gambro Lundia AB +00:17:BE Tratec Telecom B.V. +00:17:C0 PureTech Systems, Inc. +00:18:52 StorLink Semiconductors, Inc. +00:18:59 Strawberry Linux Co.,Ltd. +00:18:4B Las Vegas Gaming, Inc. +00:18:46 Crypto S.A. +00:18:29 Gatsometer +00:18:35 Thoratec / ITC +00:18:24 Kimaldi Electronics, S.L. +00:18:22 CEC TELECOM CO.,LTD. +00:17:B2 SK Telesys +00:17:AD AceNet Corporation +00:17:A6 YOSIN ELECTRONICS CO., LTD. +00:17:A1 3soft inc. +00:17:9C DEPRAG SCHULZ GMBH u. CO. +00:17:90 HYUNDAI DIGITECH Co, Ltd. +00:17:95 Cisco Systems, Inc +00:18:CE Dreamtech Co., Ltd +00:18:D3 TEAMCAST +00:18:C2 Firetide, Inc +00:18:C4 Raba Technologies LLC +00:18:C9 EOps Technology Limited +00:18:BD SHENZHEN DVBWORLD TECHNOLOGY CO., LTD. +00:18:B1 IBM Corp +00:18:B6 S3C, Inc. +00:18:A3 ZIPPY TECHNOLOGY CORP. +00:18:AA Protec Fire Detection plc +00:18:16 Ubixon Co., Ltd. +00:18:1D ASIA ELECTRONICS CO.,LTD +00:18:11 Neuros Technology International, LLC. +00:18:0A Meraki, Inc. +00:18:01 Actiontec Electronics, Inc +00:17:F5 LIG NEOPTEK +00:17:FA Microsoft Corporation +00:17:FC Suprema Inc. +00:18:9E OMNIKEY GmbH. +00:18:94 NPCore, Inc. +00:18:99 ShenZhen jieshun Science&Technology Industry CO,LTD. +00:18:86 EL-TECH, INC. +00:18:88 GOTIVE a.s. +00:18:81 Buyang Electronics Industrial Co., Ltd +00:16:D4 Compal Communications, Inc. +00:16:D9 NINGBO BIRD CO.,LTD. +00:16:C8 Cisco Systems, Inc +00:16:CD HIJI HIGH-TECH CO., LTD. +00:16:C1 Eleksen Ltd +00:16:BA WEATHERNEWS INC. +00:16:4F World Ethnic Broadcastin Inc. +00:16:48 SSD Company Limited +00:16:43 Sunhillo Corporation +00:16:3E Xensource, Inc. +00:16:37 CITEL SpA +00:16:2B Togami Electric Mfg.co.,Ltd. +00:17:55 GE Security +00:17:47 Trimble +00:17:49 HYUNDAE YONG-O-SA CO.,LTD +00:17:4E Parama-tech Co.,Ltd. +00:17:32 Science-Technical Center RISSA +00:17:34 ADC Telecommunications +00:17:39 Bright Headphone Electronics Company +00:17:2D Axcen Photonics Corporation +00:16:24 Teneros, Inc. +00:16:13 LibreStream Technologies Inc. +00:16:18 HIVION Co., Ltd. +00:16:1F SUNWAVETEC Co., Ltd. +00:16:0E Optica Technologies Inc. +00:16:07 Curves International Inc. +00:16:09 Unitech electronics co., ltd. +00:16:08 Sequans Communications +00:16:02 CEYON TECHNOLOGY CO.,LTD. +00:15:FB setex schermuly textile computer gmbh +00:15:F6 SCIENCE AND ENGINEERING SERVICES, INC. +00:17:82 LoBenn Inc. +00:17:89 Zenitron Corporation +00:17:6D CORE CORPORATION +00:17:71 APD Communications Ltd +00:17:76 Meso Scale Diagnostics, LLC +00:17:61 Private +00:17:68 Zinwave Ltd +00:17:5C SHARP CORPORATION +00:17:5A Cisco Systems, Inc +00:17:09 Exalt Communications +00:17:04 Shinco Electronics Group Co.,Ltd +00:16:FD Jaty Electronics +00:16:F1 OmniSense, LLC +00:16:F6 Video Products Group +00:16:F8 AVIQTECH TECHNOLOGY CO., LTD. +00:16:E5 FORDLEY DEVELOPMENT LIMITED +00:16:DE FAST Inc +00:16:7E DIBOSS.CO.,LTD +00:16:80 Bally Gaming + Systems +00:16:79 eOn Communications +00:16:6E Arbitron Inc. +00:16:67 A-TEC Subsystem INC. +00:16:5B Grip Audio +00:16:54 Flex-P Industries Sdn. Bhd. +00:17:21 FITRE S.p.A. +00:17:26 m2c Electronic Technology Ltd. +00:17:1A Winegard Company +00:17:1F IMV Corporation +00:17:13 Tiger NetCom +00:17:0E Cisco Systems, Inc +00:16:A9 2EI +00:16:AE INVENTEL +00:16:9D Cisco Systems, Inc +00:16:9F Vimtron Electronics Co., Ltd. +00:16:A4 Ezurio Ltd +00:16:91 Moser-Baer AG +00:16:98 T&A Mobile Phones +00:16:8C DSL Partner AS +00:16:85 Elisa Oyj +00:15:EF NEC TOKIN Corporation +00:15:E3 Dream Technologies Corporation +00:15:D9 PKC Electronics Oy +00:15:D2 Xantech Corporation +00:15:CC UQUEST, LTD. +00:15:CB Surf Communication Solutions Ltd. +00:15:CD Exartech International Corp. +00:15:C6 Cisco Systems, Inc +00:15:BB SMA Solar Technology AG +00:14:D5 Datang Telecom Technology CO. , LCD,Optical Communication Br +00:14:DA Huntleigh Healthcare +00:14:CE NF CORPORATION +00:14:C8 Contemporary Research Corp +00:14:BB Open Interface North America +00:14:B6 Enswer Technology Inc. +00:14:AC Bountiful WiFi +00:14:B1 Axell Wireless Limited +00:14:76 MultiCom Industries Limited +00:14:71 Eastern Asia Technology Limited +00:14:6A Cisco Systems, Inc +00:14:63 IDCS N.V. +00:14:65 Novo Nordisk A/S +00:14:64 Cryptosoft +00:14:5E IBM Corp +00:14:57 T-VIPS AS +00:14:52 CALCULEX,INC. +00:15:92 Facom UK Ltd (Melksham) +00:15:8B Park Air Systems Ltd +00:15:84 Schenck Process GmbH +00:15:7F ChuanG International Holding CO.,LTD. +00:15:7A Telefin S.p.A. +00:15:75 Nevis Networks Inc. +00:15:6E A. W. Communication Systems Ltd +00:15:67 RADWIN Inc. +00:15:69 PECO II, Inc. +00:15:68 Dilithium Networks +00:15:62 Cisco Systems, Inc +00:15:03 PROFIcomms s.r.o. +00:15:05 Actiontec Electronics, Inc +00:15:04 GAME PLUS CO., LTD. +00:14:FE Artech Electronics +00:14:F7 CREVIS Co., LTD +00:14:F2 Cisco Systems, Inc +00:14:EB AwarePoint Corporation +00:14:E1 Data Display AG +00:15:5B Sampo Corporation +00:15:4F one RF Technology +00:15:46 ITG Worldwide Sdn Bhd +00:15:3F Alcatel Alenia Space Italia +00:15:41 StrataLight Communications, Inc. +00:15:3A Shenzhen Syscan Technology Co.,Ltd. +00:15:BF technicob +00:15:B4 Polymap Wireless LLC +00:15:AA Rextechnik International Co., +00:15:A5 DCI Co., Ltd. +00:15:9E Mad Catz Interactive Inc +00:15:97 AETA AUDIO SYSTEMS +00:14:9E UbONE Co., Ltd +00:14:99 Helicomm Inc +00:14:92 Liteon, Mobile Media Solution SBU +00:14:8B Globo Electronic GmbH & Co. KG +00:14:8D Cubic Defense Simulation Systems +00:14:86 Echo Digital Audio Corporation +00:14:7D Aeon Digital International +00:15:33 NADAM.CO.,LTD +00:15:2E PacketHop, Inc. +00:15:27 Balboa Instruments +00:15:20 Radiocrafts AS +00:15:1B Isilon Systems Inc. +00:15:16 URIEL SYSTEMS INC. +00:15:11 Data Center Systems +00:15:0A Sonoa Systems, Inc +00:13:1F NxtPhase T&D, Corp. +00:13:18 DGSTATION Co., Ltd. +00:13:0C HF System Corporation +00:13:13 GuangZhou Post & Telecom Equipment ltd +00:13:54 Zcomax Technologies, Inc. +00:13:58 Realm Systems, Inc. +00:13:5D NTTPC Communications, Inc. +00:13:4F Tranzeo Wireless Technologies Inc. +00:13:48 Artila Electronics Co., Ltd. +00:13:42 Vision Research, Inc. +00:13:3C QUINTRON SYSTEMS INC. +00:13:41 Shandong New Beiyang Information Technology Co.,Ltd +00:13:29 VSST Co., LTD +00:13:30 EURO PROTECTION SURVEILLANCE +00:13:35 VS Industry Berhad +00:13:2F Interactek +00:12:C4 Viseon, Inc. +00:12:D0 Gossen-Metrawatt-GmbH +00:12:CA Mechatronic Brick Aps +00:12:BA FSI Systems, Inc. +00:12:AE HLS HARD-LINE Solutions Inc. +00:12:B3 Advance Wireless Technology Corp. +00:12:AD IDS GmbH +00:14:4D Intelligent Systems +00:14:41 Innovation Sound Technology Co., LTD. +00:14:48 Inventec Multimedia & Telecom Corporation +00:14:3A RAYTALK INTERNATIONAL SRL +00:14:35 CityCom Corp. +00:14:2E 77 Elektronika Kft. +00:14:29 V Center Technologies Co., Ltd. +00:14:27 JazzMutant +00:14:1E P.A. Semi, Inc. +00:12:F9 URYU SEISAKU, LTD. +00:13:00 IT-FACTORY, INC. +00:13:05 Epicom, Inc. +00:13:06 Always On Wireless +00:12:F4 Belco International Co.,Ltd. +00:12:EF OneAccess SA +00:12:EA Trane +00:12:E9 Abbey Systems Ltd +00:12:DC SunCorp Industrial Limited +00:12:E3 Agat-RT, Ltd. +00:12:D7 Invento Networks, Inc. +00:13:F0 Wavefront Semiconductor +00:13:EB Sysmaster Corporation +00:13:E6 Technolution +00:13:DF Ryvor Corp. +00:13:D9 Matrix Product Development, Inc. +00:13:DA Diskware Co., Ltd +00:13:CD MTI co. LTD +00:13:D3 MICRO-STAR INTERNATIONAL CO., LTD. +00:13:C1 Asoka USA Corporation +00:13:BC Artimi Ltd +00:13:B7 Scantech ID +00:13:AB Telemotive AG +00:13:B2 Carallon Limited +00:13:B1 Intelligent Control Systems (Asia) Pte Ltd +00:13:A4 KeyEye Communications +00:13:9F Electronics Design Services, Co., Ltd. +00:13:98 TrafficSim Co.,Ltd +00:13:92 Ruckus Wireless +00:13:8C Kumyoung.Co.Ltd +00:13:91 OUEN CO.,LTD. +00:13:7C Kaicom co., Ltd. +00:13:83 Application Technologies and Engineering Research Laboratory +00:13:64 Paradigm Technology Inc.. +00:13:69 Honda Electron Co., LED. +00:13:6A Hach Lange Sarl +00:14:18 C4Line +00:14:1D LTi DRIVES GmbH +00:14:11 Deutschmann Automation GmbH & Co. KG +00:45:01 Versus Technology, Inc. +00:14:03 Renasis, LLC +00:13:FC SiCortex, Inc +00:13:F5 Akimbi Systems +00:13:F6 Cintech +00:12:86 ENDEVCO CORP +00:12:7F Cisco Systems, Inc +00:12:78 International Bar Code +00:12:73 Stoke Inc +00:12:66 Swisscom Hospitality Services SA +00:12:65 Enerdyne Technologies, Inc. +00:12:5B KAIMEI ELECTRONI +00:11:D2 Perception Digital Ltd +00:11:D7 eWerks Inc +00:11:D1 Soft Imaging System GmbH +00:11:C2 United Fiber Optic Communication +00:11:CB Jacobsons AB +00:11:BB Cisco Systems, Inc +00:11:BC Cisco Systems, Inc +00:11:AA Uniclass Technology, Co., LTD +00:11:AF Medialink-i,Inc +00:12:00 Cisco Systems, Inc +00:11:FB Heidelberg Engineering GmbH +00:11:F6 Asia Pacific Microsystems , Inc. +00:11:F1 QinetiQ Ltd +00:11:EA IWICS Inc. +00:11:E3 Thomson, Inc. +00:11:DE EURILOGIC +00:11:E4 Danelec Electronics A/S +00:12:30 Picaso Infocommunication CO., LTD. +00:12:26 Japan Direx Corporation +00:12:20 Cadco Systems +00:12:1A Techno Soft Systemnics Inc. +00:12:1F Harding Instruments +00:12:13 Metrohm AG +00:12:0D Advanced Telecommunication Technologies, Inc. +00:12:07 Head Strong International Limited +00:12:0E AboCom +00:11:7A Singim International Corp. +00:11:73 SMART Storage Systems +00:11:67 Integrated System Solution Corp. +00:11:6D American Time and Signal +00:11:63 SYSTEM SPA DEPT. ELECTRONICS +00:11:56 Pharos Systems NZ +00:11:5D Cisco Systems, Inc +00:12:A7 ISR TECHNOLOGIES Inc +00:12:A0 NeoMeridian Sdn Bhd +00:12:9B E2S Electronic Engineering Solutions, S.L. +00:12:94 SUMITOMO ELECTRIC DEVICE INNOVATIONS, INC +00:12:8B Sensory Networks Inc +00:12:85 Gizmondo Europe Ltd +00:11:A9 MOIMSTONE Co., LTD +00:11:A3 LanReady Technologies Inc. +00:11:97 Monitoring Technologies Limited +00:11:9C EP&T Energy +00:11:8D Hanchang System Corp. +00:11:92 Cisco Systems, Inc +00:11:86 Prime Systems, Inc. +00:11:7F Neotune Information Technology Corporation,.LTD +00:12:60 Stanton Magnetics,inc. +00:12:56 LG INFORMATION & COMM. +00:12:4F Pentair Thermal Management +00:12:4A Dedicated Devices, Inc. +00:12:49 Delta Elettronica S.p.A. +00:12:43 Cisco Systems, Inc +00:12:3C Second Rule LLC +00:11:48 Prolon Control Systems +00:11:4D Atsumi Electric Co.,LTD. +00:11:4E 690885 Ontario Inc. +00:11:41 GoodMan Corporation +00:11:3B Micronet Communications Inc. +00:11:35 Grandeye Ltd +00:11:26 Venstar Inc. +00:0E:B9 HASHIMOTO Electronics Industry Co.,Ltd. +00:0E:BA HANMI SEMICONDUCTOR CO., LTD. +00:0E:AC MINTRON ENTERPRISE CO., LTD. +00:0E:A0 NetKlass Technology Inc. +00:0E:A7 Endace Technology +00:0E:9A BOE TECHNOLOGY GROUP CO.,LTD +00:0E:99 Spectrum Digital, Inc +00:11:2B NetModule AG +00:11:20 Cisco Systems, Inc +00:11:25 IBM Corp +00:11:19 Solteras, Inc. +00:11:13 Fraunhofer FOKUS +00:11:06 Siemens NV (Belgium) +00:11:0D SANBlaze Technology, Inc. +00:11:01 CET Technologies Pte Ltd +00:0F:B3 Actiontec Electronics, Inc +00:0F:A6 S2 Security Corporation +00:0F:AD FMN communications GmbH +00:0F:9B Ross Video Limited +00:0F:9E Murrelektronik GmbH +00:0F:A1 Gigabit Systems Inc. +00:0F:95 ELECOM Co.,LTD Laneed Division +00:0F:96 Telco Systems, Inc. +00:0F:8F Cisco Systems, Inc +00:0F:88 AMETEK, Inc. +00:0F:83 Brainium Technologies Inc. +00:0F:51 Azul Systems, Inc. +00:0F:44 Tivella Inc. +00:0F:43 Wasabi Systems Inc. +00:0F:4A Kyushu-kyohan co.,ltd +00:0F:3E CardioNet, Inc +00:0F:3A HISHARP +00:0F:30 Raza Microelectronics Inc +00:0F:2F W-LINX TECHNOLOGY CO., LTD. +00:0F:36 Accurate Techhnologies, Inc. +00:0F:2A Cableware Electronics +00:0F:76 Digital Keystone, Inc. +00:0F:70 Wintec Industries, inc. +00:0F:75 First Silicon Solutions +00:0F:7C ACTi Corporation +00:0F:69 SEW Eurodrive GmbH & Co. KG +00:0F:63 Obzerv Technologies +00:0F:64 D&R Electronica Weesp BV +00:0F:5D Genexis BV +00:0F:56 Continuum Photonics Inc +00:0E:EB Sandmartin(zhong shan)Electronics Co.,Ltd +00:0E:EC Orban +00:0E:F1 EZQUEST INC. +00:0E:DE REMEC, Inc. +00:0E:E5 bitWallet, Inc. +00:0E:CC Tableau, LLC +00:0E:D9 Aksys, Ltd. +00:0E:CB VineSys Technology +00:0E:D2 Filtronic plc +00:0E:BF Remsdaq Limited +00:0E:C6 ASIX ELECTRONICS CORP. +00:0F:23 Cisco Systems, Inc +00:0F:1D Cosmo Techs Co., Ltd. +00:0F:10 RDM Corporation +00:0F:17 Insta Elektro GmbH +00:0F:1E Chengdu KT Electric Co.of High & New Technology +00:0F:0B Kentima Technologies AB +00:0F:04 cim-usa inc +00:0E:FE EndRun Technologies LLC +00:0E:F8 SBC ASI +00:0E:FD FUJINON CORPORATION +00:0F:FB Nippon Denso Industry Co., Ltd. +00:0F:F8 Cisco Systems, Inc +00:0F:F2 Loud Technologies Inc. +00:0F:F7 Cisco Systems, Inc +00:0F:E5 MERCURY SECURITY CORPORATION +00:0F:E6 MBTech Systems, Inc. +00:0F:EB Cylon Controls +00:0F:DF SOLOMON Technology Corp. +00:0F:D8 Force, Inc. +00:0F:D3 Digium +00:0F:C6 Eurocom Industries A/S +00:0F:C5 KeyMed Ltd +00:0F:C0 DELCOMp +00:0F:B4 Timespace Technology +00:0F:B9 Adaptive Instruments +00:0D:4D Ninelanes +00:0D:54 3Com Ltd +00:0D:45 Tottori SANYO Electric Co., Ltd. +00:0D:48 AEWIN Technologies Co., Ltd. +00:0D:40 Verint Loronix Video Solutions +00:0D:39 Network Electronics +00:0D:33 Prediwave Corp. +00:0D:34 Shell International Exploration and Production, Inc. +00:0D:2D NCT Deutschland GmbH +00:0D:26 Primagraphics Limited +00:0D:21 WISCORE Inc. +00:0D:14 Vtech Innovation LP dba Advanced American Telephones +00:0D:13 Wilhelm Rutenbeck GmbH&Co.KG +00:0D:1A Mustek System Inc. +00:0D:0E Inqnet Systems, Inc. +00:0D:01 P&E Microcomputer Systems, Inc. +00:0D:02 NEC Platforms, Ltd. +00:0D:07 Calrec Audio Ltd +00:0E:8D Systems in Progress Holding GmbH +00:0E:94 Maas International BV +00:0E:87 adp Gauselmann GmbH +00:0E:81 Devicescape Software, Inc. +00:0E:88 VIDEOTRON CORP. +00:0E:75 New York Air Brake Corp. +00:0E:7A GemWon Communications Co., Ltd. +00:0E:66 Hitachi Industry & Control Solutions, Ltd. +00:0D:F6 Technology Thesaurus Corp. +00:0D:FD Huges Hi-Tech Inc., +00:0E:02 Advantech AMT Inc. +00:0D:F0 QCOM TECHNOLOGY INC. +00:0D:EA Kingtel Telecommunication Corp. +00:0D:EF Soc. Coop. Bilanciai +00:0D:DD Profilo Telra Elektronik Sanayi ve Ticaret. A.Ş +00:0D:DE Joyteck Co., Ltd. +00:0D:E3 AT Sweden AB +00:0D:D0 TetraTec Instruments GmbH +00:0D:D7 Bright +00:0E:61 MICROTROL LIMITED +00:0E:5A TELEFIELD inc. +00:0E:54 AlphaCell Wireless Ltd. +00:0E:4E Waveplus Technology Co., Ltd. +00:0E:53 AV TECH CORPORATION +00:0E:47 NCI System Co.,Ltd. +00:0E:41 NIHON MECHATRONICS CO.,LTD. +00:0E:42 Motic Incoporation Ltd. +00:0E:3C Transact Technologies Inc +00:0E:36 HEINESYS, Inc. +00:0D:B1 Japan Network Service Co., Ltd. +00:0D:A9 T.E.A.M. S.L. +00:0D:AC Japan CBM Corporation +00:0D:A4 DOSCH & AMAND SYSTEMS AG +00:0D:97 ABB Inc./Tropos +00:0D:98 S.W.A.C. Schmitt-Walter Automation Consult GmbH +00:0D:8A Winners Electronics Co., Ltd. +00:0D:91 Eclipse (HQ Espana) S.L. +00:0D:7F MIDAS COMMUNICATION TECHNOLOGIES PTE LTD ( Foreign Branch) +00:0D:79 Dynamic Solutions Co,.Ltd. +00:0D:73 Technical Support, Inc. +00:0D:7A DiGATTO Asia Pacific Pte Ltd +00:0D:6C M-Audio +00:0D:5A Tiesse SpA +00:0D:60 IBM Corp +00:0D:59 Amity Systems, Inc. +00:0D:CB Petcomkorea Co., Ltd. +00:0D:C4 Emcore Corporation +00:0D:BE Bel Fuse Europe Ltd.,UK +00:0D:B8 SCHILLER AG +00:0D:BD Cisco Systems, Inc +00:0E:30 AERAS Networks, Inc. +00:0E:29 Shester Communications Inc +00:0E:23 Incipient, Inc. +00:0E:24 Huwell Technology Inc. +00:0E:16 SouthWing S.L. +00:0E:1D ARION Technology Inc. +00:0E:09 Shenzhen Coship Software Co.,LTD. +00:0E:11 BDT Büro und Datentechnik GmbH & Co.KG +00:0B:C8 AirFlow Networks +00:0B:CF AGFA NDT INC. +00:0B:C3 Multiplex, Inc. +00:0B:BC En Garde Systems, Inc. +00:0B:C1 Bay Microsystems, Inc. +00:0B:B0 Sysnet Telematica srl +00:0B:B5 nStor Technologies, Inc. +00:0B:A6 Miyakawa Electric Works Ltd. +00:0B:AB Advantech Technology (CHINA) Co., Ltd. +00:0B:99 SensAble Technologies, Inc. +00:0B:9A Shanghai Ulink Telecom Equipment Co. Ltd. +00:0B:9F Neue ELSA GmbH +00:0B:94 Digital Monitoring Products, Inc. +00:0C:1D Mettler & Fuchs AG +00:0C:22 Double D Electronics Ltd +00:0C:0F Techno-One Co., Ltd +00:0C:16 Concorde Microsystems Inc. +00:0C:0A Guangdong Province Electronic Technology Research Institute +00:0B:FD Cisco Systems, Inc +00:0B:F7 NIDEK CO.,LTD +00:0B:FC Cisco Systems, Inc +00:0B:FE CASTEL Broadband Limited +00:0C:03 HDMI Licensing, LLC +00:0C:A4 Prompttec Product Management GmbH +00:0C:AB COMMEND International +00:0C:98 LETEK Communications Inc. +00:0C:9D UbeeAirWalk, Inc. +00:0C:9F NKE Corporation +00:0C:8C KODICOM CO.,LTD. +00:0C:91 Riverhead Networks Inc. +00:0C:80 Opelcomm Inc. +00:0C:85 Cisco Systems, Inc +00:0C:D0 Symetrix +00:0C:D5 Passave Inc. +00:0C:DC BECS Technology, Inc +00:0C:C9 ILWOO DATA & TECHNOLOGY CO.,LTD +00:0C:B0 Star Semiconductor Corporation +00:0C:B6 NANJING SEU MOBILE & INTERNET TECHNOLOGY CO.,LTD +00:0C:BD Interface Masters, Inc +00:0C:C2 ControlNet (India) Private Limited +00:0C:AF TRI TERM CO.,LTD. +00:0C:71 Wybron, Inc +00:0C:78 In-Tech Electronics Limited +00:0C:7D TEIKOKU ELECTRIC MFG. CO., LTD +00:0C:65 Sunin Telecom +00:0C:6A MBARI +00:0C:6C Elgato Systems LLC +00:0B:88 Vidisco ltd. +00:0B:8D Avvio Networks +00:0B:7B Test-Um Inc. +00:0B:7A L-3 Linkabit +00:0B:7C Telex Communications +00:0B:81 Kaparel Corporation +00:0B:6E Neff Instrument Corp. +00:0B:75 Iosoft Ltd. +00:0B:69 Franke Finland Oy +00:91:D6 Crystal Group, Inc. +00:0B:62 ib-mohnen KG +00:0B:59 ScriptPro, LLC +00:0C:52 Roll Systems Inc. +00:0C:57 MACKIE Engineering Services Belgium BVBA +00:0C:59 Indyme Electronics, Inc. +00:0C:5E Calypso Medical +00:0C:4B Cheops Elektronik +00:0C:46 Allied Telesyn Inc. +00:0C:3D Glsystech Co., Ltd. +00:0C:33 Compucase Enterprise Co. Ltd. +00:0C:36 SHARP TAKAYA ELECTRONICS INDUSTRY CO.,LTD. +00:0C:2C Enwiser Inc. +00:0C:FB Korea Network Systems +00:0C:EF Open Networks Engineering Ltd +00:0C:F4 AKATSUKI ELECTRIC MFG.CO.,LTD. +00:0C:E8 GuangZhou AnJuBao Co., Ltd +00:0C:E1 The Open Group +00:0C:CF Cisco Systems, Inc +00:0B:EB Systegra AG +00:0B:F0 MoTEX Products Co., Ltd. +00:0B:DD TOHOKU RICOH Co., LTD. +00:0B:E4 Hosiden Corporation +00:0B:D8 Industrial Scientific Corp. +00:0B:D4 Beijing Wise Technology & Science Development Co.Ltd +00:0A:1D Optical Communications Products Inc. +00:0A:1F ART WARE Telecommunication Co., Ltd. +00:0A:24 Octave Communications +00:0A:18 Vichel Inc. +00:0A:0C Scientific Research Corporation +00:0A:11 ExPet Technologies, Inc +00:09:F8 UNIMO TECHNOLOGY CO., LTD. +00:09:FB Philips Patient Monitoring +00:0A:02 ANNSO CO., LTD. +00:09:EB HuMANDATA LTD. +00:09:EC Daktronics, Inc. +00:09:F1 Yamaki Electric Corporation +00:09:E5 Hottinger Baldwin Messtechnik GmbH +00:09:D9 Neoscale Systems, Inc +00:09:DE Samjin Information & Communications Co., Ltd. +00:09:CC Moog GmbH +00:09:C6 Visionics Corporation +00:09:CB HBrain +00:09:D2 Mai Logic Inc. +00:09:BE Mamiya-OP Co.,Ltd. +00:09:C2 Onity, Inc. +00:0B:51 Micetek International Inc. +00:0B:54 BiTMICRO Networks, Inc. +00:0B:45 Cisco Systems, Inc +00:0B:4C Clarion (M) Sdn Bhd +00:0B:40 Oclaro +00:0B:32 VORMETRIC, INC. +00:0B:39 Keisoku Giken Co.,Ltd. +00:0B:3E BittWare, Inc +00:0B:26 Wetek Corporation +00:0B:2B HOSTNET CORPORATION +00:0B:2D Danfoss Inc. +00:0A:BB Taiwan Secom Co,. Ltd +00:0A:C7 Unication Group +00:0A:AF Pipal Systems +00:0A:B6 COMPUNETIX, INC +00:0A:A3 SHIMAFUJI ELECTRIC CO.,LTD. +00:0A:A8 ePipe Pty. Ltd. +00:0A:AA AltiGen Communications Inc. +00:0A:90 Bayside Interactive, Inc. +00:0A:9C Server Technology, Inc. +00:0A:96 MEWTEL TECHNOLOGY INC. +00:0A:81 TEIMA Audiotex S.L. +00:0A:83 SALTO SYSTEMS S.L. +00:0A:88 InCypher S.A. +00:0A:7C Tecton Ltd +00:0A:70 MPLS Forum +00:0A:75 Caterpillar, Inc +00:0A:62 Crinis Networks, Inc. +00:0A:64 Eracom Technologies +00:0A:69 SUNNY bell Technology Co., Ltd. +00:0A:5D FingerTec Worldwide Sdn Bhd +00:0A:F4 Cisco Systems, Inc +00:0A:E8 Cathay Roxus Information Technology Co. LTD +00:0A:DA Vindicator Technologies +00:0A:DC RuggedCom Inc. +00:0A:E1 EG Technology +00:0A:C9 Zambeel Inc +00:0A:CE RADIANTECH, INC. +00:0A:D5 Brainchild Electronic Co., Ltd. +00:0A:4F Brain Boxes Limited +00:0A:51 GyroSignal Technology Co., Ltd. +00:0A:56 HITACHI Maxell Ltd. +00:0A:4A Targa Systems Ltd. +00:0A:37 Procera Networks, Inc. +00:0A:3E EADS Telecom +00:0A:43 Chunghwa Telecom Co., Ltd. +00:0A:30 Visteon Corporation +00:0A:32 Xsido Corporation +00:0A:2B Etherstuff +00:0A:29 Pan Dacom Networking AG +00:0B:1A Industrial Defender, Inc. +00:0B:1F I CON Computer Co. +00:0B:13 ZETRON INC +00:0B:0C Agile Systems Inc. +00:0B:07 Voxpath Networks +00:0A:F9 HiConnect, Inc. +00:0A:FB Ambri Limited +00:0B:00 FUJIAN START COMPUTER EQUIPMENT CO.,LTD +00:09:B8 Entise Systems +00:09:B7 Cisco Systems, Inc +00:09:B2 L&F Inc. +00:09:A5 HANSUNG ELETRONIC INDUSTRIES DEVELOPMENT CO., LTD +00:09:A6 Ignis Optics, Inc. +00:09:AB Netcontrol Oy +00:09:9F VIDEX INC. +00:07:B3 Cisco Systems, Inc +00:07:AD Pentacon GmbH Foto-und Feinwerktechnik +00:07:A5 Y.D.K Co. Ltd. +00:07:9F Action Digital Inc. +00:07:92 Sütron Electronic GmbH +00:07:99 Tipping Point Technologies, Inc. +00:07:8C Elektronikspecialisten i Borlange AB +00:07:86 Wireless Networks Inc. +00:07:75 Valence Semiconductor, Inc. +00:07:7C Westermo Teleindustri AB +00:07:76 Federal APD +00:07:7F J Communications Co., Ltd. +00:07:80 Bluegiga Technologies OY +00:08:81 DIGITAL HANDS CO.,LTD. +02:C0:8C 3COM CORPORATION +00:08:7B RTX Telecom A/S +00:08:80 BroadTel Canada Communications inc. +00:08:6E Hyglo AB +00:08:68 PurOptix +00:08:61 SoftEnergy Co., Ltd. +00:08:4F Qualstar Corporation +00:08:5B Hanbit Electronics Co., Ltd. +00:08:55 NASA-Goddard Space Flight Center +00:08:4E DivergeNet, Inc. +00:08:5C Shanghai Dare Technologies Co. Ltd. +00:07:ED Altera Corporation +00:07:F4 Eletex Co., Ltd. +00:07:E1 WIS Communications Co. Ltd. +00:07:D4 Zhejiang Yutong Network Communication Co Ltd. +00:07:DB Kirana Networks, Inc. +00:07:D5 3e Technologies Int;., Inc. +00:05:F9 TOA Corporation +00:07:C5 Gcom, Inc. +00:07:CC Kaba Benzing GmbH +00:07:C6 VDS Vosskuhler GmbH +00:07:B9 Ginganet Corporation +00:07:BF Armillaire Technologies, Inc. +00:04:7F Chr. Mayr GmbH & Co. KG +00:09:61 Switchgear and Instrumentation Ltd +00:09:5A RACEWOOD TECHNOLOGY +00:09:54 AMiT spol. s. r. o. +00:09:4E BARTECH SYSTEMS INTERNATIONAL, INC +00:09:53 Linkage System Integration Co.Ltd. +00:09:42 Wireless Technologies, Inc +00:09:47 Aztek, Inc. +00:09:3B HYUNDAI NETWORKS INC. +00:09:34 Dream-Multimedia-Tv GmbH +00:08:BA Erskine Systems Ltd +00:08:B4 SYSPOL +00:08:AE PacketFront Network Products AB +00:08:A7 iLogic Inc. +00:08:A2 ADI Engineering, Inc. +00:08:A1 CNet Technology Inc. +00:08:9B ICP Electronics Inc. +00:08:8D Sigma-Links Inc. +00:08:93 LE INFORMATION COMMUNICATION INC. +00:08:8E Nihon Computer Co., Ltd. +00:08:97 Quake Technologies +00:08:87 Maschinenfabrik Reinhausen GmbH +00:08:FD BlueKorea Co., Ltd. +00:08:F5 YESTECHNOLOGY Co.,Ltd. +00:08:EF DIBAL,S.A. +00:08:EA Motion Control Engineering, Inc +00:08:DD Telena Communications, Inc. +00:08:DE 3UP Systems +00:08:E3 Cisco Systems, Inc +00:08:D7 HOW CORPORATION +00:08:CB Zeta Broadband Inc. +00:08:D0 Musashi Engineering Co., LTD. +00:08:C1 Avistar Communications Corporation +00:08:C6 Philips Consumer Communications +00:09:93 Visteon Corporation +00:09:98 Capinfo Company Limited +00:09:86 Metalink LTD. +00:09:85 Auto Telecom Company +00:09:8C Option Wireless Sweden +00:09:80 Power Zenith Inc. +00:09:73 Lenten Technology Co., Ltd. +00:09:74 Innopia Technologies, Inc. +00:09:79 Advanced Television Systems Committee, Inc. +00:09:66 Thales Navigation +00:09:6D Powernet Technologies Corp. +00:08:1F Pou Yuen Tech Corp. Ltd. +00:08:26 Colorado Med Tech +00:08:20 Cisco Systems, Inc +00:08:25 Acme Packet +00:08:2C Homag AG +00:08:19 Banksys +00:08:10 Key Technology, Inc. +00:08:13 Diskbank, Inc. +00:08:0A Espera-Werke GmbH +00:08:04 ICA Inc. +00:07:FA ITT Co., Ltd. +00:07:E7 FreeWave Technologies +00:07:EE telco Informationssysteme GmbH +00:09:28 Telecore +00:09:2F Akom Technology Corporation +00:09:22 TST Biometrics GmbH +00:09:21 Planmeca Oy +00:09:1C CacheVision, Inc +00:09:10 Simple Access Inc. +00:09:15 CAS Corp. +00:09:0F Fortinet Inc. +00:09:09 Telenor Connect A/S +00:09:02 Redline Communications Inc. +00:06:5E Photuris, Inc. +00:06:45 Meisei Electric Co. Ltd. +00:06:44 neix,Inc +00:06:4B Alexon Co., Ltd. +00:06:3B Arcturus Networks Inc. +00:06:3A Dura Micro, Inc. +00:06:34 GTE Airfone Inc. +00:06:2A Cisco Systems, Inc +00:06:27 Uniwide Technologies, Inc. +00:06:2E Aristos Logic Corp. +00:06:17 Redswitch Inc. +00:06:1E Maxan Systems +00:06:18 DigiPower Manufacturing Inc. +00:07:70 Ubiquoss Inc +00:07:6B Stralfors AB +00:07:5F VCS Video Communication Systems AG +00:07:66 Chou Chin Industrial Co., Ltd. +00:07:59 Boris Manufacturing Corp. +00:07:4C Beicom Inc. +00:07:53 Beijing Qxcomm Technology Co., Ltd. +00:07:43 Chelsio Communications +00:07:44 Unico, Inc. +00:07:47 Mecalc +00:07:37 Soriya Co. Ltd. +00:07:3E China Great-Wall Computer Shenzhen Co., Ltd. +00:06:C4 Piolink Inc. +00:06:C0 United Internetworks, Inc. +00:06:BA Westwave Communications +00:06:AD KB Electronics Ltd. +00:06:B4 Vorne Industries, Inc. +00:06:AE Himachal Futuristic Communications Ltd +00:06:B3 Diagraph Corporation +00:06:A3 Bitran Corporation +00:06:9D Petards Ltd +00:06:A7 Primarion +00:06:57 Market Central, Inc. +00:06:97 R & D Center +00:06:91 PT Inovacao +00:05:C7 I/F-COM A/S +00:05:CE Prolink Microsystems Corporation +00:05:C1 A-Kyung Motion, Inc. +00:05:BB Myspace AB +00:05:9B Cisco Systems, Inc +00:05:A7 Hyperchip, Inc. +00:05:B5 Broadcom Technologies +00:05:9A Cisco Systems, Inc +00:05:A1 Zenocom +00:05:AB Cyber Fone, Inc. +00:05:88 Sensoria Corp. +00:05:8E Flextronics International GmbH & Co. Nfg. KG +00:06:12 Accusys, Inc. +00:06:09 Crossport Systems +00:06:0F Narad Networks Inc +00:06:02 Cirkitech Electronics Co. +00:05:ED Technikum Joanneum GmbH +00:06:00 Toshiba Teli Corporation +00:05:E7 Netrake an AudioCodes Company +00:05:F3 Webyn +00:05:FA IPOptical, Inc. +00:05:DE Gi Fone Korea, Inc. +00:05:DA Apex Automationstechnik +00:05:C8 VERYTECH +00:05:D4 FutureSmart Networks, Inc. +00:06:EC Harris Corporation +00:06:DF AIDONIC Corporation +00:06:E0 MAT Co., Ltd. +00:06:E5 Fujian Newland Computer Ltd. Co. +00:06:DB ICHIPS Co., Ltd. +00:06:D0 Elgar Electronics Corp. +00:06:D7 Cisco Systems, Inc +00:06:CA American Computer & Digital Components, Inc. (ACDC) +00:05:81 Snell +00:05:7B Chung Nam Electronic Co., Ltd. +00:05:82 ClearCube Technology +00:05:77 SM Information & Communication +00:05:71 Seiwa Electronics Co. +00:05:6B C.P. Technology Co., Ltd. +00:05:65 Tailyn Communication Company Ltd. +00:05:5F Cisco Systems, Inc +00:05:5E Cisco Systems, Inc +00:05:58 Synchronous, Inc. +00:05:52 Xycotec Computer GmbH +00:05:49 Salira Optical Network Systems +00:07:2B Jung Myung Telecom Co., Ltd. +00:07:31 Ophir-Spiricon LLC +00:07:1A Finedigital Inc. +00:07:21 Formac Elektronik GmbH +00:07:0E Cisco Systems, Inc +00:07:15 General Research of Electronics, Inc. +00:07:08 Bitrage Inc. +00:06:F2 Platys Communications +00:06:FE Ambrado, Inc +00:06:FC Fnet Co., Ltd. +00:06:84 Biacore AB +00:06:8A NeuronNet Co. Ltd. R&D Center +00:06:7E WinCom Systems, Inc. +00:06:70 Upponetti Oy +00:06:76 Novra Technologies Inc. +00:06:7A JMP Systems +00:06:64 Fostex Corporation +00:06:6A InfiniCon Systems, Inc. +00:06:51 Aspen Networks Inc. +00:06:5D Heidelberg Web Systems +00:04:15 Rasteme Systems Co., Ltd. +00:04:08 Sanko Electronics Co., Ltd. +00:04:09 Cratos Networks +00:04:02 Nexsan Technologies, Ltd. +00:03:F8 SanCastle Technologies, Inc. +00:03:FF Microsoft Corporation +00:03:F1 Cicada Semiconductor, Inc. +00:03:F2 Seneca Networks +00:03:EC ICG Research, Inc. +00:03:E6 Entone, Inc. +00:03:DE OTC Wireless +00:03:E1 Winmate Communication, Inc. +00:03:DA Takamisawa Cybernetics Co., Ltd. +00:05:4C RF Innovations Pty Ltd +00:05:43 IQ Wireless GmbH +00:05:3D Agere Systems +00:05:30 Andiamo Systems, Inc. +00:05:37 Nets Technology Co., Ltd. +00:05:36 Danam Communications, Inc. +00:05:24 BTL System (HK) Limited +00:05:2A Ikegami Tsushinki Co., Ltd. +00:05:1D Airocon, Inc. +00:05:17 Shellcomm, Inc. +00:05:13 VTLinx Multimedia Systems, Inc. +00:04:D4 Proview Electronics Co., Ltd. +00:04:CE Patria Ailon +00:04:CD Extenway Solutions Inc +00:04:C7 NetMount +00:04:C8 LIBA Maschinenfabrik GmbH +00:04:C1 Cisco Systems, Inc +00:04:BB Bardac Corporation +00:04:B5 Equitrac Corporation +00:04:A7 FabiaTech Corporation +00:04:A1 Pathway Connectivity +00:04:9A Cisco Systems, Inc +00:03:5B BridgeWave Communications +00:03:56 Wincor Nixdorf International GmbH +00:03:50 BTICINO SPA +00:03:48 Norscan Instruments, Ltd. +00:03:45 Routrek Networks Corporation +00:03:3D ILSHin Lab +00:01:EC Ericsson Group +00:03:31 Cisco Systems, Inc +00:03:38 Oak Technology +00:03:35 Mirae Technology +00:03:2C ABB Switzerland Ltd +00:03:25 Arima Computer Corp. +00:04:53 YottaYotta, Inc. +00:04:4D Cisco Systems, Inc +00:04:49 Mapletree Networks +00:04:43 Agilent Technologies, Inc. +00:04:3D INDEL AG +00:04:31 GlobalStreams, Inc. +00:04:36 ELANsat Technologies, Inc. +00:04:30 Netgem +00:04:2A Wireless Networks, Inc. +00:04:24 TMC s.r.l. +00:04:1B Bridgeworks Ltd. +00:04:1E Shikoku Instrumentation Co., Ltd. +00:03:D3 Internet Energy Systems, Inc. +00:03:CE ETEN Technologies, Inc. +00:03:CB Nippon Systems Development Co., Ltd. +00:03:C2 Solphone K.K. +00:03:C7 hopf Elektronik GmbH +00:03:BB Signal Communications Limited +00:03:B5 Entra Technology Co. +00:03:B0 Xsense Technology Corp. +00:03:A4 Imation Corp. +00:03:A9 AXCENT Media AG +00:03:AD Emerson Energy Systems AB +00:03:96 EZ Cast Co., Ltd. +00:05:0D Midstream Technologies, Inc. +00:05:07 Fine Appliance Corp. +00:04:FD Japan Control Engineering Co., Ltd. +00:04:F7 Omega Band, Inc. +00:04:F1 WhereNet +00:04:DA Relax Technology, Inc. +00:80:87 OKI ELECTRIC INDUSTRY CO., LTD +00:04:E0 Procket Networks +00:04:60 Knilink Technology, Inc. +00:04:94 Breezecom, Ltd. +00:04:8E Ohm Tech Labs, Inc. +00:04:95 Tejas Networks India Limited +00:04:83 Deltron Technology, Inc. +00:04:89 YAFO Networks, Inc. +00:04:79 Radius Co., Ltd. +00:04:6D Cisco Systems, Inc +00:04:72 Telelynx, Inc. +00:04:6C Cyber Technology Co., Ltd. +00:04:66 ARMITEL Co. +00:04:5A The Linksys Group, Inc. +00:04:5F Avalue Technology, Inc. +00:03:91 Advanced Digital Broadcast, Ltd. +00:03:8A America Online, Inc. +00:03:8E Atoga Systems, Inc. +00:03:7C Coax Media +00:03:81 Ingenico International +00:03:75 NetMedia, Inc. +00:03:6E Nicon Systems (Pty) Limited +00:03:62 Vodtel Communications, Inc. +00:03:1C Svenska Hardvarufabriken AB +00:03:15 Cidco Incorporated +00:03:10 E-Globaledge Corporation +00:03:0D Uniwill Computer Corp. +00:03:09 Texcel Technology PLC +00:03:04 Pacific Broadband Communications +00:01:9F ReadyNet +00:02:FD Cisco Systems, Inc +00:02:F6 Equipe Communications +00:02:F1 Pinetron Co., Ltd. +00:02:EF CCC Network Systems Group Ltd. +00:02:EB Pico Communications +00:02:E6 Gould Instrument Systems, Inc. +00:02:DF Net Com Systems, Inc. +00:02:D3 NetBotz, Inc. +00:02:D8 BRECIS Communications Corporation +00:02:CC M.C.C.I +00:02:D0 Comdial Corporation +00:02:C5 Evertz Microsystems Ltd. +00:02:C0 Bencent Tzeng Industry Co., Ltd. +00:02:BD Bionet Co., Ltd. +00:02:B7 Watanabe Electric Industry Co., Ltd. +00:02:B0 Hokubu Communication & Industrial Co., Ltd. +00:02:A8 Air Link Technology +00:02:AB CTC Union Technologies Co., Ltd. +00:02:A4 AddPac Technology Co., Ltd. +00:02:99 Apex, Inc. +00:02:9D Merix Corp. +00:02:91 Open Network Co., Ltd. +00:02:8A Ambit Microsystems Corporation +00:02:87 Adapcom +00:02:8C Micrel-Synergy Semiconductor +00:02:82 ViaClix, Inc. +00:02:7B Amplify Net, Inc. +00:02:4F IPM Datacom S.R.L. +00:02:74 Tommy Technologies Corp. +00:02:6F Senao International Co., Ltd. +00:02:64 AudioRamp.com +00:30:6C Hitex Holding GmbH +00:01:77 EDSL +00:01:61 Meta Machine Technology +00:01:68 VITANA CORPORATION +00:01:74 CyberOptics Corporation +00:01:64 Cisco Systems, Inc +00:01:70 ESE Embedded System Engineer'g +00:01:52 CHROMATEK INC. +00:01:56 FIREWIREDIRECT.COM, INC. +00:01:3F Neighbor World Co., Ltd. +00:01:46 Tesco Controls, Inc. +00:01:33 KYOWA Electronic Instruments C +00:01:E3 Siemens AG +00:01:EA Cirilium Corp. +00:01:EF Camtel Technology Corp. +00:01:F2 Mark of the Unicorn, Inc. +00:01:D7 F5 Networks, Inc. +00:01:DC Activetelco +00:01:DF ISDN Communications, Ltd. +00:01:D3 PAXCOMM, Inc. +00:01:C5 Simpler Networks +00:01:D0 VitalPoint, Inc. +00:01:B2 Digital Processing Systems, Inc. +00:01:C1 Vitesse Semiconductor Corporation +00:01:BA IC-Net, Inc. +00:01:B6 SAEJIN T&M Co., Ltd. +00:02:2B SAXA, Inc. +00:02:26 XESystems, Inc. +00:02:1E SIMTEL S.R.L. +00:02:1A Zuma Networks +00:02:0B Native Networks, Inc. +00:02:12 SierraCom +00:02:17 Cisco Systems, Inc +00:02:07 VisionGlobal Network Corp. +00:02:04 Bodmann Industries Elektronik GmbH +00:01:F8 TEXIO TECHNOLOGY CORPORATION +00:01:FF Data Direct Networks, Inc. +00:01:FB DoTop Technology, Inc. +00:02:68 Harris Government Communications +00:02:5D Calix Networks +00:02:58 Flying Packets Communications +00:02:57 Microcom Corp. +00:02:54 WorldGate +00:02:48 Pilz GmbH & Co. +00:02:2E TEAC Corp. R& D +00:02:41 Amer.com +00:02:32 Avision, Inc. +00:01:2A Telematica Sistems Inteligente +00:01:30 Extreme Networks +00:01:37 IT Farm Corporation +00:01:43 Cisco Systems, Inc +00:01:1B Unizone Technologies, Inc. +00:01:22 Trend Communications, Ltd. +00:01:1E Precidia Technologies, Inc. +00:01:08 AVLAB Technology, Inc. +00:01:0B Space CyberLink, Inc. +00:01:AE Trex Enterprises +00:01:AA Airspan Communications, Ltd. +00:01:98 Darim Vision +00:01:80 AOpen, Inc. +00:01:87 I2SE GmbH +00:01:8F Kenetec, Inc. +00:01:83 ANITE TELECOMS +00:01:9C JDS Uniphase Inc. +00:01:90 SMK-M +00:30:D1 INOVA CORPORATION +00:30:32 MagicRam, Inc. +00:30:5A TELGEN CORPORATION +00:30:69 IMPACCT TECHNOLOGY CORP. +00:30:EC BORGARDT +00:30:B4 INTERSIL CORP. +00:30:8E CROSS MATCH TECHNOLOGIES, INC. +00:30:D0 Tellabs +00:30:A5 ACTIVE POWER +00:30:09 Tachion Networks, Inc. +00:30:2F GE Aviation System +00:30:A4 Woodwind Communications System +00:30:E5 Amper Datos S.A. +00:30:C0 Lara Technology, Inc. +00:30:0E Klotz Digital AG +00:30:94 Cisco Systems, Inc +00:30:9A ASTRO TERRA CORP. +00:30:0C CONGRUENCY, LTD. +00:30:FD INTEGRATED SYSTEMS DESIGN +00:30:23 COGENT COMPUTER SYSTEMS, INC. +00:30:DF KB/TEL TELECOMUNICACIONES +00:30:7D GRE AMERICA, INC. +00:D0:E4 Cisco Systems, Inc +00:D0:8B ADVA Optical Networking Ltd. +00:D0:98 Photon Dynamics Canada Inc. +00:D0:5E STRATABEAM TECHNOLOGY, INC. +00:D0:BE EMUTEC INC. +00:D0:F4 CARINTHIAN TECH INSTITUTE +00:D0:AA CHASE COMMUNICATIONS +00:D0:FA Thales e-Security Ltd. +00:D0:06 Cisco Systems, Inc +00:D0:3D GALILEO TECHNOLOGY, LTD. +00:D0:14 ROOT, INC. +00:D0:DD SUNRISE TELECOM, INC. +00:D0:91 SMARTSAN SYSTEMS, INC. +00:B0:EE Ajile Systems, Inc. +00:B0:E7 British Federal Ltd. +00:B0:4A Cisco Systems, Inc +00:B0:69 Honewell Oy +00:B0:C2 Cisco Systems, Inc +00:B0:DF Starboard Storage Systems +00:B0:EC EACEM +00:30:92 ModuNORM GmbH +00:30:EE DSG Technology, Inc. +00:30:42 DeTeWe-Deutsche Telephonwerke +00:30:99 BOENIG UND KALLENBACH OHG +00:30:51 ORBIT AVIONIC & COMMUNICATION +00:30:AB DELTA NETWORKS, INC. +00:30:93 Sonnet Technologies, Inc +00:30:3C ONNTO CORP. +00:30:C7 Macromate Corp. +00:30:66 RFM +00:30:7F IRLAN LTD. +00:30:16 ISHIDA CO., LTD. +00:30:2A SOUTHERN INFORMATION +00:30:DC RIGHTECH CORPORATION +00:D0:A4 ALANTRO COMMUNICATIONS +00:D0:43 ZONAL RETAIL DATA SYSTEMS +00:D0:16 SCM MICROSYSTEMS, INC. +00:D0:12 GATEWORKS CORP. +00:D0:92 GLENAYRE WESTERN MULTIPLEX +00:D0:C5 COMPUTATIONAL SYSTEMS, INC. +00:01:A7 UNEX TECHNOLOGY CORPORATION +00:D0:B5 IPricot formerly DotCom +00:30:E8 ENSIM CORP. +00:30:ED Expert Magnetics Corp. +00:30:F9 Sollae Systems Co., Ltd. +00:30:98 Global Converging Technologies +00:30:E2 GARNET SYSTEMS CO., LTD. +00:30:02 Expand Networks +00:30:0B mPHASE Technologies, Inc. +00:30:8F MICRILOR, Inc. +00:30:F3 At Work Computers +00:D0:F9 ACUTE COMMUNICATIONS CORP. +00:D0:63 Cisco Systems, Inc +00:D0:69 TECHNOLOGIC SYSTEMS +00:D0:70 LONG WELL ELECTRONICS CORP. +00:D0:61 TREMON ENTERPRISES CO., LTD. +00:D0:C4 TERATECH CORPORATION +00:30:BF MULTIDATA GMBH +00:D0:D7 B2C2, INC. +00:D0:15 UNIVEX MICROTECHNOLOGY CORP. +00:D0:A5 AMERICAN ARIUM +00:D0:E5 SOLIDUM SYSTEMS CORP. +00:D0:B3 DRS Technologies Canada Ltd +00:D0:E9 Advantage Century Telecommunication Corp. +00:D0:94 Seeion Control LLC +00:90:45 Marconi Communications +00:90:F6 ESCALATE NETWORKS, INC. +00:90:EA ALPHA TECHNOLOGIES, INC. +00:90:FE ELECOM CO., LTD. (LANEED DIV.) +00:90:EB SENTRY TELECOM SYSTEMS +00:90:8E Nortel Networks Broadband Access +00:90:CA ACCORD VIDEO TELECOMMUNICATIONS, LTD. +00:90:8B Tattile SRL +00:90:99 ALLIED TELESIS, K.K. +00:90:0E HANDLINK TECHNOLOGIES, INC. +00:90:F7 NBASE COMMUNICATIONS LTD. +00:90:24 PIPELINKS, INC. +00:90:52 SELCOM ELETTRONICA S.R.L. +00:90:E5 TEKNEMA, INC. +00:90:85 GOLDEN ENTERPRISES, INC. +00:90:19 HERMES ELECTRONICS CO., LTD. +00:90:DC TECO INFORMATION SYSTEMS +00:D0:AE ORESIS COMMUNICATIONS, INC. +00:D0:D4 V-BITS, INC. +00:D0:41 AMIGO TECHNOLOGY CO., LTD. +00:D0:D1 Sycamore Networks +00:D0:A1 OSKAR VIERLING GMBH + CO. KG +00:D0:0B RHK TECHNOLOGY, INC. +00:D0:2C CAMPBELL SCIENTIFIC, INC. +00:D0:A0 MIPS DENMARK +00:D0:4E LOGIBAG +00:D0:D9 DEDICATED MICROCOMPUTERS +00:D0:CD ATAN TECHNOLOGY INC. +00:D0:1D FURUNO ELECTRIC CO., LTD. +00:D0:C7 PATHWAY, INC. +00:D0:5C KATHREIN TechnoTrend GmbH +00:D0:40 SYSMATE CO., LTD. +00:D0:8A PHOTRON USA +00:D0:76 Bank of America +00:D0:7A AMAQUEST COMPUTER CORP. +00:D0:BB Cisco Systems, Inc +00:D0:01 VST TECHNOLOGIES, INC. +00:90:4C Epigram, Inc. +00:90:00 DIAMOND MULTIMEDIA +00:90:25 BAE Systems Australia (Electronic Systems) Pty Ltd +00:90:F8 MEDIATRIX TELECOM +00:90:84 ATECH SYSTEM +00:90:54 INNOVATIVE SEMICONDUCTORS, INC +00:90:80 NOT LIMITED, INC. +00:90:C0 K.J. LAW ENGINEERS, INC. +00:90:BC TELEMANN CO., LTD. +00:90:0A PROTON ELECTRONIC INDUSTRIAL CO., LTD. +00:90:4E DELEM BV +00:90:4A CONCUR SYSTEM TECHNOLOGIES +00:90:29 CRYPTO AG +00:90:61 PACIFIC RESEARCH & ENGINEERING CORPORATION +00:90:A9 WESTERN DIGITAL +00:90:72 SIMRAD AS +00:50:48 INFOLIBRIA +00:50:EA XEL COMMUNICATIONS, INC. +00:50:CE LG INTERNATIONAL CORP. +00:50:19 SPRING TIDE NETWORKS, INC. +00:50:AC MAPLE COMPUTER CORPORATION +00:50:44 ASACA CORPORATION +00:50:C6 LOOP TELECOMMUNICATION INTERNATIONAL, INC. +00:50:49 Arbor Networks Inc +00:50:9F HORIZON COMPUTER +00:50:C8 Addonics Technologies, Inc. +00:50:DC TAS TELEFONBAU A. SCHWABE GMBH & CO. KG +00:50:69 PixStream Incorporated +00:90:1D PEC (NZ) LTD. +00:90:2D DATA ELECTRONICS (AUST.) PTY, LTD. +00:90:07 DOMEX TECHNOLOGY CORP. +00:90:48 ZEAL CORPORATION +00:90:E6 ALi Corporation +00:90:46 DEXDYNE, LTD. +00:90:5E RAULAND-BORG CORPORATION +00:90:67 WalkAbout Computers, Inc. +00:90:DA DYNARC, INC. +00:90:26 ADVANCED SWITCHING COMMUNICATIONS, INC. +00:90:BB TAINET COMMUNICATION SYSTEM Corp. +00:90:33 INNOVAPHONE AG +00:90:10 SIMULATION LABORATORIES, INC. +00:90:3D BIOPAC SYSTEMS, INC. +00:90:57 AANetcom, Inc. +00:90:1C mps Software Gmbh +00:90:56 TELESTREAM, INC. +00:90:7D Lake Communications +00:90:DB NEXT LEVEL COMMUNICATIONS +00:50:42 SCI MANUFACTURING SINGAPORE PTE, LTD. +00:50:C0 GATAN, INC. +00:50:D3 DIGITAL AUDIO PROCESSING PTY. LTD. +00:50:9A TAG ELECTRONIC SYSTEMS +00:50:7D IFP +00:50:D0 MINERVA SYSTEMS +00:50:98 GLOBALOOP, LTD. +00:50:FA OXTEL, LTD. +00:50:86 TELKOM SA, LTD. +00:50:E1 NS TECH ELECTRONICS SDN BHD +00:50:13 Chaparral Network Storage +00:50:22 ZONET TECHNOLOGY, INC. +00:50:40 Panasonic Electric Works Co., Ltd. +00:50:D6 ATLAS COPCO TOOLS AB +00:50:82 FORESSON CORPORATION +00:50:CA NET TO NET TECHNOLOGIES +00:50:A6 OPTRONICS +00:50:DB CONTEMPORARY CONTROL +00:50:6B SPX-ATEG +00:50:74 ADVANCED HI-TECH CORP. +00:50:47 Private +00:50:67 AEROCOMM, INC. +00:50:24 NAVIC SYSTEMS, INC. +00:50:41 Coretronic Corporation +00:50:D2 CMC Electronics Inc +00:90:DE CARDKEY SYSTEMS, INC. +00:90:60 SYSTEM CREATE CORP. +00:90:F1 DOT HILL SYSTEMS CORPORATION +00:90:E2 DISTRIBUTED PROCESSING TECHNOLOGY +00:90:6B APPLIED RESOURCES, INC. +00:90:20 PHILIPS ANALYTICAL X-RAY B.V. +00:90:65 FINISAR CORPORATION +00:10:53 COMPUTER TECHNOLOGY CORP. +00:10:A3 OMNITRONIX, INC. +00:10:2B UMAX DATA SYSTEMS, INC. +00:10:55 FUJITSU MICROELECTRONICS, INC. +00:10:3C IC ENSEMBLE, INC. +00:10:D9 IBM JAPAN, FUJISAWA MT+D +00:10:A5 OXFORD INSTRUMENTS +00:10:46 ALCORN MCBRIDE INC. +00:E0:DC NEXWARE CORP. +00:E0:D9 TAZMO CO., LTD. +00:E0:C2 NECSY S.p.A. +00:E0:9B ENGAGE NETWORKS, INC. +00:E0:45 TOUCHWAVE, INC. +00:E0:55 INGENIERIA ELECTRONICA COMERCIAL INELCOM S.A. +00:E0:37 CENTURY CORPORATION +00:E0:81 TYAN COMPUTER CORP. +00:E0:D4 EXCELLENT COMPUTER +00:E0:1A COMTEC SYSTEMS. CO., LTD. +00:E0:BC SYMON COMMUNICATIONS, INC. +00:E0:84 COMPULITE R&D +00:E0:F6 DECISION EUROPE +00:E0:27 DUX, INC. +00:E0:7F LOGISTISTEM s.r.l. +00:E0:43 VitalCom +00:E0:BF TORRENT NETWORKING TECHNOLOGIES CORP. +00:E0:9D SARNOFF CORPORATION +00:E0:BB NBX CORPORATION +00:E0:8A GEC AVERY, LTD. +00:E0:4B JUMP INDUSTRIELLE COMPUTERTECHNIK GmbH +00:10:15 OOmon Inc. +00:10:88 AMERICAN NETWORKS INC. +00:10:08 VIENNA SYSTEMS CORPORATION +00:10:CC CLP COMPUTER LOGISTIK PLANUNG GmbH +00:10:94 Performance Analysis Broadband, Spirent plc +00:10:BB DATA & INFORMATION TECHNOLOGY +00:10:28 COMPUTER TECHNICA, INC. +00:10:8A TeraLogic, Inc. +00:10:C5 PROTOCOL TECHNOLOGIES, INC. +00:10:6D Axxcelera Broadband Wireless +00:10:FC BROADBAND NETWORKS, INC. +00:10:78 NUERA COMMUNICATIONS, INC. +00:10:48 HTRC AUTOMATION, INC. +00:10:81 DPS, INC. +00:10:2D HITACHI SOFTWARE ENGINEERING +00:10:9F PAVO, INC. +00:10:A1 KENDIN SEMICONDUCTOR, INC. +00:10:84 K-BOT COMMUNICATIONS +00:10:AF TAC SYSTEMS, INC. +00:10:0F INDUSTRIAL CPU SYSTEMS +00:10:A2 TNS +00:10:00 CABLE TELEVISION LABORATORIES, INC. +00:10:3B HIPPI NETWORKING FORUM +00:60:C2 MPL AG +00:60:A2 NIHON UNISYS LIMITED CO. +00:60:46 VMETRO, INC. +00:60:9D PMI FOOD EQUIPMENT GROUP +00:60:BF MACRAIGOR SYSTEMS, INC. +00:60:4A SAIC IDEAS GROUP +00:60:81 TV/COM INTERNATIONAL +00:60:B4 GLENAYRE R&D INC. +00:60:45 PATHLIGHT TECHNOLOGIES +00:A0:05 DANIEL INSTRUMENTS, LTD. +00:A0:53 COMPACT DEVICES, INC. +00:A0:33 imc MeBsysteme GmbH +00:A0:59 HAMILTON HALLMARK +00:A0:AD MARCONI SPA +00:A0:F6 AutoGas Systems Inc. +00:A0:96 MITSUMI ELECTRIC CO., LTD. +00:A0:06 IMAGE DATA PROCESSING SYSTEM GROUP +00:60:F3 Performance Analysis Broadband, Spirent plc +00:60:0B LOGWARE GmbH +00:60:3F PATAPSCO DESIGNS +00:60:7C WaveAccess, Ltd. +00:60:8D UNIPULSE CORP. +00:60:49 VINA TECHNOLOGIES +00:60:A1 VPNet, Inc. +00:60:C9 ControlNet, Inc. +00:60:5F NIPPON UNISOFT CORPORATION +00:60:21 DSC CORPORATION +00:60:1D LUCENT TECHNOLOGIES +00:08:00 MULTITECH SYSTEMS, INC. +00:60:C7 AMATI COMMUNICATIONS CORP. +00:E0:CA BEST DATA PRODUCTS +00:E0:97 CARRIER ACCESS CORPORATION +00:E0:9F PIXEL VISION +00:E0:F5 TELES AG +00:E0:70 DH TECHNOLOGY +00:E0:B5 ARDENT COMMUNICATIONS CORP. +00:E0:73 NATIONAL AMUSEMENT NETWORK, INC. +00:E0:E8 GRETACODER Data Systems AG +00:E0:16 RAPID CITY COMMUNICATIONS +00:E0:01 STRAND LIGHTING LIMITED +00:E0:82 ANERMA +00:E0:EA INNOVAT COMMUNICATIONS, INC. +00:E0:6A KAPSCH AG +00:E0:23 TELRAD +00:E0:C3 SAKAI SYSTEM DEVELOPMENT CORP. +00:60:1A KEITHLEY INSTRUMENTS +00:60:AF PACIFIC MICRO DATA, INC. +00:60:1F STALLION TECHNOLOGIES +00:60:8F TEKRAM TECHNOLOGY CO., LTD. +00:60:C5 ANCOT CORP. +00:60:23 PERICOM SEMICONDUCTOR CORP. +00:60:63 PSION DACOM PLC. +00:60:4F Tattile SRL +00:60:E8 HITACHI COMPUTER PRODUCTS (AMERICA), INC. +00:60:72 VXL INSTRUMENTS, LIMITED +00:60:54 CONTROLWARE GMBH +00:A0:DC O.N. ELECTRONIC CO., LTD. +00:A0:13 TELTREND LTD. +00:A0:DF STS TECHNOLOGIES, INC. +00:A0:61 PURITAN BENNETT +00:A0:CE Ecessa +00:A0:2A TRANCELL SYSTEMS +00:A0:2C interWAVE Communications +00:A0:77 FUJITSU NEXION, INC. +00:A0:20 CITICORP/TTI +00:A0:0D THE PANDA PROJECT +00:A0:31 HAZELTINE CORPORATION, MS 1-17 +00:A0:41 INFICON +00:60:FA EDUCATIONAL TECHNOLOGY RESOURCES, INC. +00:02:88 GLOBAL VILLAGE COMMUNICATION +00:60:F9 DIAMOND LANE COMMUNICATIONS +00:60:EA StreamLogic +00:60:EC HERMARY OPTO ELECTRONICS INC. +00:60:4E CYCLE COMPUTER CORPORATION, INC. +00:60:2C LINX Data Terminals, Inc. +00:60:28 MACROVISION CORPORATION +00:60:6A MITSUBISHI WIRELESS COMMUNICATIONS. INC. +00:E0:21 FREEGATE CORP. +00:E0:AB DIMAT S.A. +00:E0:B6 Entrada Networks +00:E0:EC CELESTICA INC. +00:E0:38 PROXIMA CORPORATION +00:E0:90 BECKMAN LAB. AUTOMATION DIV. +00:E0:2E SPC ELECTRONICS CORPORATION +00:E0:F4 INSIDE Technology A/S +00:E0:3C AdvanSys +00:E0:96 SHIMADZU CORPORATION +00:E0:F1 THAT CORPORATION +00:A0:D0 TEN X TECHNOLOGY, INC. +00:A0:E0 TENNYSON TECHNOLOGIES PTY LTD +00:A0:99 K-NET LTD. +00:A0:3D OPTO-22 +00:A0:8C MultiMedia LANs, Inc. +10:00:E8 NATIONAL SEMICONDUCTOR +00:60:76 SCHLUMBERGER TECHNOLOGIES RETAIL PETROLEUM SYSTEMS +00:60:AE TRIO INFORMATION SYSTEMS AB +00:60:6C ARESCOM +00:60:32 I-CUBE, INC. +00:60:60 Data Innovations North America +00:A0:EB Encore Networks, Inc. +00:A0:C1 ORTIVUS MEDICAL AB +00:A0:7D SEEQ TECHNOLOGY, INC. +00:A0:CF SOTAS, INC. +00:A0:3A KUBOTEK CORPORATION +00:A0:D7 KASTEN CHASE APPLIED RESEARCH +00:A0:9D JOHNATHON FREEMAN TECHNOLOGIES +00:A0:36 APPLIED NETWORK TECHNOLOGY +00:A0:D2 ALLIED TELESIS INTERNATIONAL CORPORATION +00:A0:75 MICRON TECHNOLOGY, INC. +00:A0:09 WHITETREE NETWORK +00:A0:60 ACER PERIPHERALS, INC. +00:A0:0C KINGMAX TECHNOLOGY, INC. +00:20:FD ITV TECHNOLOGIES, INC. +00:20:0D CARL ZEISS +00:20:91 J125, NATIONAL SECURITY AGENCY +00:20:54 Sycamore Networks +00:20:A7 PAIRGAIN TECHNOLOGIES, INC. +00:20:DA Alcatel North America ESD +00:20:05 SIMPLE TECHNOLOGY +00:20:2B ADVANCED TELECOMMUNICATIONS MODULES, LTD. +00:20:86 MICROTECH ELECTRONICS LIMITED +00:20:52 RAGULA SYSTEMS +00:20:90 ADVANCED COMPRESSION TECHNOLOGY, INC. +00:20:A3 Harmonic, Inc +00:20:6A OSAKA COMPUTER CORP. +00:20:DB XNET TECHNOLOGY, INC. +00:20:A4 MULTIPOINT NETWORKS +00:20:1C EXCEL, INC. +00:20:9B ERSAT ELECTRONIC GMBH +00:20:C9 VICTRON BV +00:20:D1 MICROCOMPUTER SYSTEMS (M) SDN. +00:20:84 OCE PRINTING SYSTEMS, GMBH +00:20:C2 TEXAS MEMORY SYSTEMS, INC. +00:20:C8 LARSCOM INCORPORATED +00:20:EC TECHWARE SYSTEMS CORP. +00:20:83 PRESTICOM INCORPORATED +00:20:6D DATA RACE, INC. +00:20:3A DIGITAL BI0METRICS INC. +00:A0:6C SHINDENGEN ELECTRIC MFG. CO., LTD. +00:A0:EE NASHOBA NETWORKS +00:A0:FB TORAY ENGINEERING CO., LTD. +00:A0:E3 XKL SYSTEMS CORP. +00:A0:1E EST CORPORATION +00:A0:80 Tattile SRL +00:A0:C2 R.A. SYSTEMS CO., LTD. +00:A0:CB ARK TELECOMMUNICATIONS, INC. +00:A0:74 PERCEPTION TECHNOLOGY +00:A0:6A Verilink Corporation +00:A0:70 COASTCOM +00:A0:79 ALPS ELECTRIC (USA), INC. +00:20:59 MIRO COMPUTER PRODUCTS AG +00:20:BC Long Reach Networks Pty Ltd +00:20:AD LINQ SYSTEMS +00:20:46 CIPRICO, INC. +00:20:71 IBR GMBH +00:20:A2 GALCOM NETWORKING LTD. +00:20:98 HECTRONIC AB +00:20:65 SUPERNET NETWORKING INC. +00:20:94 CUBIX CORPORATION +00:20:C3 COUNTER SOLUTIONS LTD. +00:20:A5 API ENGINEERING +00:20:70 HYNET, LTD. +00:20:1E NETQUEST CORPORATION +00:20:97 APPLIED SIGNAL TECHNOLOGY +00:20:E8 DATATREK CORPORATION +00:20:4F DEUTSCHE AEROSPACE AG +00:20:2E DAYSTAR DIGITAL +00:20:B0 GATEWAY DEVICES, INC. +00:20:A9 WHITE HORSE INDUSTRIAL +00:20:61 GarrettCom, Inc. +00:20:C6 NECTEC +00:20:D2 RAD DATA COMMUNICATIONS, LTD. +00:A0:F8 Zebra Technologies Inc +00:A0:25 REDCOM LABS INC. +00:A0:D4 RADIOLAN, INC. +00:A0:8A BROOKTROUT TECHNOLOGY, INC. +00:20:93 LANDINGS TECHNOLOGY CORP. +00:20:56 NEOPRODUCTS +00:20:A6 Proxim Wireless +00:C0:73 XEDIA CORPORATION +00:C0:D4 AXON NETWORKS, INC. +00:C0:E5 GESPAC, S.A. +00:A0:CA FUJITSU DENSO LTD. +00:A0:29 COULTER CORPORATION +00:C0:88 EKF ELEKTRONIK GMBH +00:C0:56 SOMELEC +00:C0:63 MORNING STAR TECHNOLOGIES, INC +00:C0:21 NETEXPRESS +00:C0:49 U.S. ROBOTICS, INC. +00:C0:32 I-CUBED LIMITED +00:C0:51 ADVANCED INTEGRATION RESEARCH +00:C0:85 ELECTRONICS FOR IMAGING, INC. +00:C0:FE APTEC COMPUTER SYSTEMS, INC. +00:C0:E8 PLEXCOM, INC. +00:C0:B2 NORAND CORPORATION +00:C0:B1 GENIUS NET CO. +00:C0:D9 QUINTE NETWORK CONFIDENTIALITY +00:C0:38 RASTER IMAGE PROCESSING SYSTEM +00:C0:98 CHUNTEX ELECTRONIC CO., LTD. +00:C0:DD QLogic Corporation +00:C0:8A Lauterbach GmbH +00:40:FF TELEBIT CORPORATION +00:40:D7 STUDIO GEN INC. +00:40:07 TELMAT INFORMATIQUE +00:40:8D THE GOODYEAR TIRE & RUBBER CO. +00:40:2C ISIS DISTRIBUTED SYSTEMS, INC. +00:C0:3D WIESEMANN & THEIS GMBH +00:C0:26 LANS TECHNOLOGY CO., LTD. +00:40:E2 MESA RIDGE TECHNOLOGIES, INC. +00:40:78 WEARNES AUTOMATION PTE LTD +00:40:62 E-SYSTEMS, INC./GARLAND DIV. +00:40:D2 PAGINE CORPORATION +00:40:D0 MITAC INTERNATIONAL CORP. +00:40:E4 E-M TECHNOLOGY, INC. +00:40:BF CHANNEL SYSTEMS INTERN'L INC. +00:40:94 SHOGRAPHICS, INC. +00:40:7F FLIR Systems +00:40:A9 DATACOM INC. +00:C0:7D RISC DEVELOPMENTS LTD. +00:C0:1E LA FRANCAISE DES JEUX +00:C0:84 DATA LINK CORP. LTD. +00:C0:87 UUNET TECHNOLOGIES, INC. +00:C0:33 TELEBIT COMMUNICATIONS APS +00:C0:81 METRODATA LTD. +00:C0:06 NIPPON AVIONICS CO., LTD. +00:C0:13 NETRIX +00:C0:58 DATAEXPERT CORP. +00:40:E8 CHARLES RIVER DATA SYSTEMS,INC +00:40:30 GK COMPUTER +00:80:DC PICKER INTERNATIONAL +00:C0:A8 GVC CORPORATION +00:C0:10 HIRAKAWA HEWTECH CORP. +00:C0:20 ARCO ELECTRONIC, CONTROL LTD. +00:40:A6 Cray, Inc. +00:40:98 DRESSLER GMBH & CO. +00:C0:B9 FUNK SOFTWARE, INC. +00:C0:65 SCOPE COMMUNICATIONS, INC. +00:C0:18 LANART CORPORATION +00:C0:FF DOT HILL SYSTEMS CORPORATION +00:40:0D LANNET DATA COMMUNICATIONS,LTD +00:40:F5 OEM ENGINES +00:40:19 AEON SYSTEMS, INC. +00:40:A1 ERGO COMPUTING +00:40:7E EVERGREEN SYSTEMS, INC. +00:40:F6 KATRON COMPUTERS INC. +00:40:76 Sun Conversion Technologies +00:40:F4 CAMEO COMMUNICATIONS, INC. +00:C0:6D BOCA RESEARCH, INC. +00:C0:DB IPC CORPORATION (PTE) LTD. +00:C0:DA NICE SYSTEMS LTD. +00:C0:9B RELIANCE COMM/TEC, R-TEC +00:C0:B8 FRASER'S HILL LTD. +00:C0:16 ELECTRONIC THEATRE CONTROLS +00:C0:96 TAMURA CORPORATION +00:C0:35 QUINTAR COMPANY +00:C0:CC TELESCIENCES CO SYSTEMS, INC. +00:C0:78 COMPUTER SYSTEMS ENGINEERING +00:40:F3 NETCOR +00:40:33 ADDTRON TECHNOLOGY CO., LTD. +00:40:A3 MICROUNITY SYSTEMS ENGINEERING +00:40:ED NETWORK CONTROLS INT'NATL INC. +00:40:AD SMA REGELSYSTEME GMBH +00:80:D2 SHINNIHONDENKO CO., LTD. +00:80:DF ADC CODENOLL TECHNOLOGY CORP. +00:80:71 SAI TECHNOLOGY +00:80:3D SURIGIKEN CO., LTD. +00:80:4B EAGLE TECHNOLOGIES PTY.LTD. +00:80:07 DLOG NC-SYSTEME +00:80:01 PERIPHONICS CORPORATION +00:80:62 INTERFACE CO. +00:80:F3 SUN ELECTRONICS CORP. +00:80:8D WESTCOAST TECHNOLOGY B.V. +00:80:B2 NETWORK EQUIPMENT TECHNOLOGIES +00:80:5B CONDOR SYSTEMS, INC. +00:80:1C NEWPORT SYSTEMS SOLUTIONS +00:80:C6 NATIONAL DATACOMM CORPORATION +00:80:FA RWT GMBH +00:80:84 THE CLOUD INC. +00:80:46 Tattile SRL +00:80:A6 REPUBLIC TECHNOLOGY, INC. +00:80:09 JUPITER SYSTEMS, INC. +00:80:B5 UNITED NETWORKS INC. +00:80:35 TECHNOLOGY WORKS, INC. +00:80:88 VICTOR COMPANY OF JAPAN, LTD. +00:80:9E DATUS GMBH +00:80:55 FERMILAB +00:80:2A TEST SYSTEMS & SIMULATIONS INC +00:40:E3 QUIN SYSTEMS LTD +00:40:91 PROCOMP INDUSTRIA ELETRONICA +00:40:14 COMSOFT GMBH +00:40:0F DATACOM TECHNOLOGIES +00:40:85 SAAB INSTRUMENTS AB +00:40:06 SAMPO TECHNOLOGY CORPORATION +00:40:2D HARRIS ADACOM CORPORATION +00:40:47 WIND RIVER SYSTEMS +00:40:FA MICROBOARDS, INC. +00:00:2E SOCIETE EVIRA +00:00:ED APRIL +00:00:3C AUSPEX SYSTEMS INC. +00:00:51 HOB ELECTRONIC GMBH & CO. KG +00:00:A7 NETWORK COMPUTING DEVICES INC. +00:00:F7 YOUTH KEEP ENTERPRISE CO LTD +00:00:FC MEIKO +00:00:B5 DATABILITY SOFTWARE SYS. INC. +00:00:26 SHA-KEN CO., LTD. +00:00:22 VISUAL TECHNOLOGY INC. +00:00:6D CRAY COMMUNICATIONS, LTD. +00:00:FA MICROSAGE COMPUTER SYSTEMS INC +00:00:2B CRISP AUTOMATION, INC +00:00:19 APPLIED DYNAMICS INTERNATIONAL +00:80:D3 SHIVA CORP. +00:80:A5 SPEED INTERNATIONAL +00:80:A9 CLEARPOINT RESEARCH +00:80:69 COMPUTONE SYSTEMS +00:80:91 TOKYO ELECTRIC CO.,LTD +00:80:F4 TELEMECANIQUE ELECTRIQUE +00:80:0C VIDECOM LIMITED +00:80:E8 CUMULUS CORPORATIION +00:00:CD Allied Telesis Labs Ltd +00:00:A5 Tattile SRL +00:80:1E XINETRON, INC. +00:80:4A PRO-LOG +00:80:59 STANLEY ELECTRIC CO., LTD +00:80:6B SCHMID TELECOMMUNICATION +00:80:2C THE SAGE GROUP PLC +00:80:18 KOBE STEEL, LTD. +00:80:EE THOMSON CSF +00:80:13 THOMAS-CONRAD CORPORATION +00:80:8E RADSTONE TECHNOLOGY +00:00:36 ATARI CORPORATION +00:80:BD THE FURUKAWA ELECTRIC CO., LTD +00:80:A8 VITACOM CORPORATION +00:80:FB BVM LIMITED +00:80:42 Artesyn Embedded Technologies +00:80:67 SQUARE D COMPANY +00:80:45 MATSUSHITA ELECTRIC IND. CO +00:80:4C CONTEC CO., LTD. +00:80:20 NETWORK PRODUCTS +00:40:44 QNIX COMPUTER CO., LTD. +00:40:DD HONG TECHNOLOGIES +00:40:3A IMPACT TECHNOLOGIES +00:40:C9 NCUBE +00:40:75 Tattile SRL +00:80:F1 OPUS SYSTEMS +08:00:8F CHIPCOM CORPORATION +08:00:81 ASTECH INC. +08:00:7A INDATA +08:00:78 ACCELL CORPORATION +08:00:6E MASSCOMP +08:00:6D WHITECHAPEL COMPUTER WORKS +08:00:6C SUNTEK TECHNOLOGY INT'L +08:00:67 ComDesign +08:00:63 PLESSEY +08:00:60 INDUSTRIAL NETWORKING INC. +00:00:81 Bay Networks +00:00:A1 MARQUETTE ELECTRIC CO. +00:00:F5 DIAMOND SALES LIMITED +00:00:E5 SIGMEX LTD. +00:00:BA SIIG, INC. +00:00:2F TIMEPLEX INC. +00:00:B8 SEIKOSHA CO., LTD. +00:00:7F LINOTYPE-HELL AG +00:00:B7 DOVE COMPUTER CORPORATION +00:00:9A RC COMPUTER A/S +00:00:DE CETIA +00:00:4B ICL DATA OY +00:00:13 CAMEX +00:00:95 SONY TEKTRONIX CORP. +08:00:37 FUJI-XEROX CO. LTD. +08:00:31 LITTLE MACHINES INC. +08:00:2B DIGITAL EQUIPMENT CORPORATION +08:00:2A MOSAIC TECHNOLOGIES INC. +08:00:29 Megatek Corporation +08:00:26 NORSK DATA A.S. +08:00:1F SHARP CORPORATION +00:00:AE DASSAULT ELECTRONIQUE +00:00:DD TCL INCORPORATED +00:00:D9 NIPPON TELEGRAPH & TELEPHONE +00:00:46 OLIVETTI NORTH AMERICA +00:00:17 Oracle +00:00:9F AMERISTAR TECHNOLOGIES INC. +00:00:E3 INTEGRATED MICRO PRODUCTS LTD +00:00:73 SIECOR CORPORATION +00:00:D3 WANG LABORATORIES INC. +00:00:B3 CIMLINC INCORPORATED +00:00:9D LOCUS COMPUTING CORPORATION +00:00:60 KONTRON ELEKTRONIK GMBH +00:00:11 NORMEREL SYSTEMES +08:00:6F PHILIPS APELDOORN B.V. +00:00:B0 RND-RAD NETWORK DEVICES +00:00:71 ADRA SYSTEMS INC. +00:00:6C Private +AA:00:00 DIGITAL EQUIPMENT CORPORATION +02:70:B0 M/A-COM INC. COMPANIES +00:00:0B MATRIX CORPORATION +08:00:42 JAPAN MACNICS CORP. +02:60:86 LOGIC REPLACEMENT TECH. LTD. +00:DD:05 UNGERMANN-BASS INC. +00:BB:F0 UNGERMANN-BASS INC. +00:80:E9 Madge Ltd. +08:00:55 STANFORD TELECOMM. INC. +08:00:48 EUROTHERM GAUGING SYSTEMS +08:00:49 UNIVATION +00:DD:02 UNGERMANN-BASS INC. +00:00:03 XEROX CORPORATION +00:00:08 XEROX CORPORATION +08:00:30 CERN +00:DD:01 UNGERMANN-BASS INC. +18:01:7D Harbin Arteor technology co., LTD +00:1C:DF Belkin International Inc. +94:44:52 Belkin International Inc. +08:86:3B Belkin International Inc. +20:82:C0 Xiaomi Communications Co Ltd +00:15:56 Sagemcom Broadband SAS +00:25:69 Sagemcom Broadband SAS +00:1B:BF Sagemcom Broadband SAS +4C:17:EB Sagemcom Broadband SAS +7C:03:4C Sagemcom Broadband SAS +88:AE:1D COMPAL INFORMATION (KUNSHAN) CO., LTD. +5C:35:3B Compal Broadband Networks, Inc. +C8:F2:30 GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD +1C:44:19 TP-LINK TECHNOLOGIES CO.,LTD. +74:9D:DC 2Wire Inc +78:2B:CB Dell Inc. +B8:CA:3A Dell Inc. +F0:1F:AF Dell Inc. +C8:1F:66 Dell Inc. +00:18:3F 2Wire Inc +00:19:E4 2Wire Inc +00:1A:C4 2Wire Inc +00:1D:5A 2Wire Inc +34:EF:44 2Wire Inc +98:2C:BE 2Wire Inc +00:14:22 Dell Inc. +00:1C:23 Dell Inc. +00:21:9B Dell Inc. +00:08:74 Dell Inc. +00:25:64 Dell Inc. +84:2B:2B Dell Inc. +E0:DB:55 Dell Inc. +A4:1F:72 Dell Inc. +00:C0:4F Dell Inc. +F0:4D:A2 Dell Inc. +BC:30:5B Dell Inc. +00:1D:09 Dell Inc. +F8:E0:79 Motorola Mobility LLC, a Lenovo Company +14:30:C6 Motorola Mobility LLC, a Lenovo Company +04:4E:06 Ericsson AB +00:0D:67 Ericsson +E0:75:7D Motorola Mobility LLC, a Lenovo Company +00:1E:65 Intel Corporate +00:1F:3B Intel Corporate +00:16:EA Intel Corporate +00:21:6B Intel Corporate +00:19:D1 Intel Corporate +00:1C:C0 Intel Corporate +5C:E0:C5 Intel Corporate +18:3D:A2 Intel Corporate +44:85:00 Intel Corporate +80:9B:20 Intel Corporate +10:0B:A9 Intel Corporate +24:77:03 Intel Corporate +C4:85:08 Intel Corporate +00:26:C6 Intel Corporate +74:E5:0B Intel Corporate +58:94:6B Intel Corporate +00:27:10 Intel Corporate +64:D4:DA Intel Corporate +DC:A9:71 Intel Corporate +00:1C:BF Intel Corporate +A0:A8:CD Intel Corporate +34:02:86 Intel Corporate +34:DE:1A Intel Corporate +80:00:0B Intel Corporate +B8:03:05 Intel Corporate +30:3A:64 Intel Corporate +AC:FD:CE Intel Corporate +E0:94:67 Intel Corporate +00:DB:DF Intel Corporate +0C:8B:FD Intel Corporate +E0:9D:31 Intel Corporate +CC:3D:82 Intel Corporate +D0:0E:D9 Taicang T&W Electronics +6C:29:95 Intel Corporate +40:E3:D6 Aruba Networks +24:DE:C6 Aruba Networks +D8:C7:C8 Aruba Networks +90:0B:C1 Sprocomm Technologies CO.,Ltd +6C:71:D9 AzureWave Technology Inc. +38:4F:F0 AzureWave Technology Inc. +00:15:AF AzureWave Technology Inc. +48:5D:60 AzureWave Technology Inc. +54:E4:BD FN-LINK TECHNOLOGY LIMITED +98:74:3D Shenzhen Jun Kai Hengye Technology Co. Ltd +A0:4F:D4 ADB Broadband Italia +84:26:15 ADB Broadband Italia +5C:E2:F4 AcSiP Technology Corp. +00:26:62 Actiontec Electronics, Inc +00:19:3E ADB Broadband Italia +00:13:C8 ADB Broadband Italia +DC:0B:1A ADB Broadband Italia +74:88:8B ADB Broadband Italia +84:D6:D0 Amazon Technologies Inc. +E0:CB:1D Private +AC:D0:74 Espressif Inc. +D0:53:49 Liteon Technology Corporation +00:BB:3A Private +00:09:41 Allied Telesis R&D Center K.K. +00:01:4A Sony Corporation +00:1C:A4 Sony Mobile Communications AB +00:23:45 Sony Mobile Communications AB +8C:64:22 Sony Mobile Communications AB +90:C1:15 Sony Mobile Communications AB +84:00:D2 Sony Mobile Communications AB +5C:B5:24 Sony Mobile Communications AB +94:A1:A2 AMPAK Technology, Inc. +74:DE:2B Liteon Technology Corporation +68:A3:C4 Liteon Technology Corporation +C8:FF:28 Liteon Technology Corporation +00:24:D2 ASKEY COMPUTER CORP +DC:64:B8 Shenzhen JingHanDa Electronics Co.Ltd +C4:DA:7D Ivium Technologies B.V. +94:92:BC SYNTECH(HK) TECHNOLOGY LIMITED +00:1A:4F AVM GmbH +00:04:0E AVM GmbH +00:16:E3 ASKEY COMPUTER CORP +30:46:9A NETGEAR +00:26:F2 NETGEAR +00:18:4D NETGEAR +00:1E:2A NETGEAR +E8:FC:AF NETGEAR +4C:60:DE NETGEAR +00:30:0A Aztech Electronics Pte Ltd +A0:63:91 NETGEAR +9C:C7:A6 AVM GmbH +DC:EF:09 NETGEAR +74:31:70 Arcadyan Technology Corporation +A8:D3:F7 Arcadyan Technology Corporation +7C:4F:B5 Arcadyan Technology Corporation +00:12:BF Arcadyan Technology Corporation +20:0C:C8 NETGEAR +04:FE:8D HUAWEI TECHNOLOGIES CO.,LTD +48:00:31 HUAWEI TECHNOLOGIES CO.,LTD +00:19:FB BSkyB Ltd +0C:F9:C0 BSkyB Ltd +00:1B:A9 Brother industries, LTD. +00:11:B6 Open Systems International +E0:3E:44 Broadcom +D4:01:29 Broadcom +FC:B6:98 Cambridge Industries(Group) Co.,Ltd. +00:E0:3A Cabletron Systems, Inc. +00:01:17 Canal + +00:19:C7 Cambridge Industries(Group) Co.,Ltd. +00:6D:FB Vutrix Technologies Ltd +C8:10:73 CENTURY OPTICOMM CO.,LTD +74:4A:A4 zte corporation +9C:D3:5B Samsung Electronics Co.,Ltd +60:AF:6D Samsung Electronics Co.,Ltd +B8:5A:73 Samsung Electronics Co.,Ltd +10:30:47 Samsung Electronics Co.,Ltd +10:92:66 Samsung Electronics Co.,Ltd +B0:47:BF Samsung Electronics Co.,Ltd +7C:0B:C6 Samsung Electronics Co.,Ltd +80:4E:81 Samsung Electronics Co.,Ltd +24:4B:81 Samsung Electronics Co.,Ltd +50:A4:C8 Samsung Electronics Co.,Ltd +84:25:DB Samsung Electronics Co.,Ltd +D8:C4:E9 Samsung Electronics Co.,Ltd +50:C8:E5 Samsung Electronics Co.,Ltd +44:6D:6C Samsung Electronics Co.,Ltd +38:D4:0B Samsung Electronics Co.,Ltd +64:77:91 Samsung Electronics Co.,Ltd +78:1F:DB Samsung Electronics Co.,Ltd +08:FC:88 Samsung Electronics Co.,Ltd +30:C7:AE Samsung Electronics Co.,Ltd +18:22:7E Samsung Electronics Co.,Ltd +00:F4:6F Samsung Electronics Co.,Ltd +BC:14:85 Samsung Electronics Co.,Ltd +9C:E6:E7 Samsung Electronics Co.,Ltd +38:01:95 Samsung Electronics Co.,Ltd +5C:F6:DC Samsung Electronics Co.,Ltd +10:77:B1 Samsung Electronics Co.,Ltd +50:85:69 Samsung Electronics Co.,Ltd +00:90:A2 CyberTAN Technology Inc. +00:30:DA Comtrend Corporation +64:68:0C Comtrend Corporation +00:CF:1C Communication Machinery Corporation +00:90:F5 CLEVO CO. +00:30:FF DataFab Systems Inc. +E4:98:D1 Microsoft Mobile Oy +A8:A0:89 Tactical Communications +48:36:5F Wintecronics Ltd. +00:5A:39 SHENZHEN FAST TECHNOLOGIES CO.,LTD +5C:C6:D0 Skyworth Digital Technology(Shenzhen) Co.,Ltd +08:05:81 Roku, Inc. +B0:A7:37 Roku, Inc. +B8:3E:59 Roku, Inc. +DC:3A:5E Roku, Inc. +00:14:A5 Gemtek Technology Co., Ltd. +00:17:42 FUJITSU LIMITED +2C:10:C1 Nintendo Co., Ltd. +CC:FB:65 Nintendo Co., Ltd. +40:D2:8A Nintendo Co., Ltd. +7C:BB:8A Nintendo Co., Ltd. +00:22:4C Nintendo Co., Ltd. +00:23:CC Nintendo Co., Ltd. +00:24:44 Nintendo Co., Ltd. +E0:E7:51 Nintendo Co., Ltd. +00:17:AB Nintendo Co., Ltd. +00:1B:EA Nintendo Co., Ltd. +00:15:DE Nokia Danmark A/S +00:13:70 Nokia Danmark A/S +00:24:7C Nokia Danmark A/S +00:23:B4 Nokia Danmark A/S +00:21:AB Nokia Danmark A/S +00:1F:DF Nokia Danmark A/S +00:19:4F Nokia Danmark A/S +00:18:8D Nokia Danmark A/S +00:18:0F Nokia Danmark A/S +54:79:75 Nokia Corporation +2C:CC:15 Nokia Corporation +00:BD:3A Nokia Corporation +00:26:CC Nokia Danmark A/S +00:16:4E Nokia Danmark A/S +00:16:BC Nokia Danmark A/S +00:1A:DC Nokia Danmark A/S +00:26:68 Nokia Danmark A/S +00:1F:5C Nokia Danmark A/S +00:1F:00 Nokia Danmark A/S +00:1E:3B Nokia Danmark A/S +A0:4E:04 Nokia Corporation +24:0B:0A Palo Alto Networks +C4:E5:10 Mechatro, Inc. +74:C3:30 SHENZHEN FAST TECHNOLOGIES CO.,LTD +40:3F:8C TP-LINK TECHNOLOGIES CO.,LTD. +14:C3:C2 K.A. Schmersal GmbH & Co. KG +10:78:5B Actiontec Electronics, Inc +20:76:8F Apple, Inc. +9C:5C:F9 Sony Mobile Communications AB +88:A0:84 Formation Data Systems +00:25:DC Sumitomo Electric Industries,Ltd +00:1C:FC Sumitomo Electric Industries,Ltd +00:D0:EC NAKAYO TELECOMMUNICATIONS,INC +8C:C6:61 Current, powered by GE +00:90:50 Teleste Corporation +BC:44:B0 Elastifile +78:64:E6 Green Motive Technology Limited +74:3E:2B Ruckus Wireless +C0:CC:F8 Apple, Inc. +80:ED:2C Apple, Inc. +E8:B2:AC Apple, Inc. +00:80:B8 DMG MORI B.U.G. CO., LTD. +84:89:AD Apple, Inc. +40:B6:88 LEGIC Identsystems AG +A0:9D:91 SoundBridge +30:78:5C Partow Tamas Novin (Parman) +44:11:02 EDMI Europe Ltd +2C:21:D7 IMAX Corporation +00:26:F7 Nivetti Systems Pvt. Ltd. +24:C3:F9 Securitas Direct AB +DC:4D:23 MRV Comunications +08:5B:DA CliniCare LTD +0C:5A:9E Wi-SUN Alliance +00:C1:64 Cisco Systems, Inc +C4:BE:D4 Avaya Inc +98:E7:F5 HUAWEI TECHNOLOGIES CO.,LTD +24:BC:F8 HUAWEI TECHNOLOGIES CO.,LTD +10:D0:AB zte corporation +20:2D:F8 Digital Media Cartridge Ltd. +04:2D:B4 First Property (Beijing) Co., Ltd Modern MOMA Branch +00:8A:96 Cisco Systems, Inc +00:78:88 Cisco Systems, Inc +98:DE:D0 TP-LINK TECHNOLOGIES CO.,LTD. +30:FC:68 TP-LINK TECHNOLOGIES CO.,LTD. +5C:CA:1A Microsoft Mobile Oy +00:05:94 HMS Industrial Networks +00:0A:C2 Wuhan FiberHome Digital Technology Co.,Ltd. +F0:8C:FB Fiberhome Telecommunication Technologies Co.,LTD +D4:F2:07 DIAODIAO(Beijing)Technology CO.,Ltd +FC:F8:B7 TRONTEQ Electronic +D4:88:3F HDPRO CO., LTD. +00:1B:F3 TRANSRADIO SenderSysteme Berlin AG +E0:07:1B Hewlett Packard Enterprise +A8:6A:C1 HanbitEDS Co., Ltd. +40:16:3B Samsung Electronics Co.,Ltd +88:B1:E1 Mojo Networks, Inc. +74:DF:BF Liteon Technology Corporation +FC:3F:7C HUAWEI TECHNOLOGIES CO.,LTD +60:83:34 HUAWEI TECHNOLOGIES CO.,LTD +84:AD:58 HUAWEI TECHNOLOGIES CO.,LTD +74:6F:F7 Wistron Neweb Corporation +B0:1B:D2 Le Shi Zhi Xin Electronic Technology (Tianjin) Limited +74:85:2A PEGATRON CORPORATION +38:60:77 PEGATRON CORPORATION +60:B4:F7 Plume Design Inc +A4:D8:CA HONG KONG WATER WORLD TECHNOLOGY CO. LIMITED +00:10:9B Emulex Corporation +00:E0:D5 Emulex Corporation +00:10:35 Elitegroup Computer Systems Co.,Ltd. +EC:A8:6B Elitegroup Computer Systems Co.,Ltd. +44:87:FC Elitegroup Computer Systems Co.,Ltd. +00:21:97 Elitegroup Computer Systems Co.,Ltd. +64:99:68 Elentec +00:20:8F ECI Telecom Ltd. +9C:DF:03 Harman/Becker Automotive Systems GmbH +F0:40:7B Fiberhome Telecommunication Technologies Co.,LTD +94:88:5E Surfilter Network Technology Co., Ltd. +00:23:78 GN Netcom A/S +00:20:88 GLOBAL VILLAGE COMMUNICATION +90:C7:D8 zte corporation +BC:6A:44 Commend International GmbH +00:20:F2 Oracle Corporation +00:01:5D Oracle Corporation +94:3B:B1 Kaonmedia CO., LTD. +14:63:08 JABIL CIRCUIT (SHANGHAI) LTD. +08:00:0D International Computers, Ltd +00:D0:A2 INTEGRATED DEVICE +00:60:B1 Input/Output, Inc. +00:17:7D IDT Technology Limited +28:8A:1C Juniper Networks +10:0E:7E Juniper Networks +84:B5:9C Juniper Networks +54:4B:8C Juniper Networks +54:1E:56 Juniper Networks +64:64:9B Juniper Networks +2C:6B:F5 Juniper Networks +00:22:83 Juniper Networks +EC:13:DB Juniper Networks +AC:4B:C8 Juniper Networks +B0:A8:6E Juniper Networks +3C:94:D5 Juniper Networks +F4:CC:55 Juniper Networks +00:21:59 Juniper Networks +5C:70:A3 LG Electronics (Mobile Communications) +34:97:F6 ASUSTek COMPUTER INC. +50:68:0A HUAWEI TECHNOLOGIES CO.,LTD +D8:94:03 Hewlett Packard Enterprise +9C:8D:7C ALPS ELECTRIC CO.,LTD. +E0:4F:43 Universal Global Scientific Industrial Co., Ltd. +B0:E0:3C TCT mobile ltd +D0:9D:AB TCT mobile ltd +94:D8:59 TCT mobile ltd +94:71:AC TCT mobile ltd +70:BA:EF Hangzhou H3C Technologies Co., Limited +00:90:06 Hamamatsu Photonics K.K. +00:1A:F4 Handreamnet +00:0A:ED HARTING Electronics GmbH +1C:CB:99 TCT mobile ltd +18:E3:BC TCT mobile ltd +28:9A:FA TCT mobile ltd +44:A4:2D TCT mobile ltd +8C:8E:F2 Apple, Inc. +F4:0F:24 Apple, Inc. +A0:D3:85 AUMA Riester GmbH & Co. KG +14:14:E6 Ningbo Sanhe Digital Co.,Ltd +84:A1:34 Apple, Inc. +1C:91:48 Apple, Inc. +CC:16:7E Cisco Systems, Inc +60:08:10 HUAWEI TECHNOLOGIES CO.,LTD +C8:5B:76 LCFC(HeFei) Electronics Technology co., ltd +00:1A:E8 Unify Software and Solutions GmbH & Co. KG +94:59:07 Shanghai HITE-BELDEN Network Technology Co., Ltd. +48:C6:63 GTO Access Systems LLC +60:64:53 AOD Co.,Ltd. +6C:98:EB Riverbed Technology, Inc. +DC:29:3A Shenzhen Nuoshi Technology Co., LTD. +40:56:2D Smartron India Pvt ltd +70:28:8B Samsung Electronics Co.,Ltd +00:80:9F ALE International +B0:D7:CC Tridonic GmbH & Co KG +7C:57:4E COBI GmbH +34:C0:F9 Rockwell Automation +20:C0:47 Verizon +AC:04:81 Jiangsu Huaxing Electronics Co., Ltd. +FC:2D:5E zte corporation +E8:11:CA SHANDONG KAER ELECTRIC.CO.,LTD +EC:D6:8A Shenzhen JMicron Intelligent Technology Developmen +1C:77:F6 GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD +08:D0:B7 Qingdao Hisense Communications Co.,Ltd. +28:28:5D ZyXEL Communications Corporation +5C:F4:AB ZyXEL Communications Corporation +4C:9E:FF ZyXEL Communications Corporation +00:23:F8 ZyXEL Communications Corporation +B0:B2:DC ZyXEL Communications Corporation +90:EF:68 ZyXEL Communications Corporation +00:24:8D Sony Interactive Entertainment Inc. +54:27:6C Jiangsu Houge Technology Corp. +00:CB:00 Private +FC:FF:AA IEEE Registration Authority +70:B3:D5 IEEE Registration Authority +40:D8:55 IEEE Registration Authority +48:DF:37 Hewlett Packard Enterprise +9C:93:E4 Private +00:50:79 Private +74:F8:DB IEEE Registration Authority +0C:EF:AF IEEE Registration Authority +28:FD:80 IEEE Registration Authority +B0:C5:CA IEEE Registration Authority +98:02:D8 IEEE Registration Authority +D0:76:50 IEEE Registration Authority +BC:66:41 IEEE Registration Authority +00:28:F8 Intel Corporate +84:16:F9 TP-LINK TECHNOLOGIES CO.,LTD. +CC:D3:1E IEEE Registration Authority +8C:19:2D IEEE Registration Authority +E8:18:63 IEEE Registration Authority +C4:4B:D1 Wallys Communications Teachnologies Co.,Ltd. +20:57:AF Shenzhen FH-NET OPTOELECTRONICS CO.,LTD +34:EA:34 HangZhou Gubei Electronics Technology Co.,Ltd +F8:A9:D0 LG Electronics (Mobile Communications) +CC:FA:00 LG Electronics (Mobile Communications) +BC:F5:AC LG Electronics (Mobile Communications) +00:AA:70 LG Electronics (Mobile Communications) +F0:1C:13 LG Electronics (Mobile Communications) +CC:2D:8C LG ELECTRONICS INC +34:4D:F7 LG Electronics (Mobile Communications) +C4:9A:02 LG Electronics (Mobile Communications) +00:22:A9 LG Electronics (Mobile Communications) +00:25:E5 LG Electronics (Mobile Communications) +10:F9:6F LG Electronics (Mobile Communications) +00:11:6E Peplink International Ltd. +A0:91:C8 zte corporation +00:25:97 Kalki Communication Technologies +88:2B:D7 ADDÉNERGIE TECHNOLOGIES +9C:A5:C0 vivo Mobile Communication Co., Ltd. +B4:A5:EF Sercomm Corporation. +30:44:A1 Shanghai Nanchao Information Technology +C4:F1:D1 BEIJING SOGOU TECHNOLOGY DEVELOPMENT CO., LTD. +38:A2:8C SHENZHEN RF-LINK TECHNOLOGY CO.,LTD. +58:52:8A Mitsubishi Electric Corporation +BC:C0:0F Fiberhome Telecommunication Technologies Co.,LTD +B0:C2:87 Technicolor CH USA Inc. +CC:03:FA Technicolor CH USA Inc. +28:BE:9B Technicolor CH USA Inc. +50:9F:3B OI ELECTRIC CO.,LTD +E4:02:9B Intel Corporate +60:02:B4 Wistron Neweb Corporation +98:EE:CB Wistron Infocomm (Zhongshan) Corporation +70:E2:84 Wistron Infocomm (Zhongshan) Corporation +80:EA:23 Wistron Neweb Corporation +D8:80:39 Microchip Technology Inc. +00:1D:72 Wistron Neweb Corporation +FC:3D:93 LONGCHEER TELECOMMUNICATION LIMITED +48:F7:C0 Technicolor CH USA Inc. +00:40:9F Telco Systems, Inc. +00:E0:9E Quantum Corporation +00:14:8C General Dynamics Mission Systems +A4:71:74 HUAWEI TECHNOLOGIES CO.,LTD +D4:A1:48 HUAWEI TECHNOLOGIES CO.,LTD +D0:65:CA HUAWEI TECHNOLOGIES CO.,LTD +8C:EB:C6 HUAWEI TECHNOLOGIES CO.,LTD +B8:08:D7 HUAWEI TECHNOLOGIES CO.,LTD +FC:F1:52 Sony Corporation +78:44:76 Zioncom Electronics (Shenzhen) Ltd. +00:18:3A Westell Technologies Inc. +E8:9A:8F QUANTA COMPUTER INC. +00:1B:24 QUANTA COMPUTER INC. +CC:52:AF Universal Global Scientific Industrial Co., Ltd. +00:1A:6B Universal Global Scientific Industrial Co., Ltd. +00:27:22 Ubiquiti Networks +00:DD:0A UNGERMANN-BASS INC. +00:03:9D Qisda Corporation +00:0B:0E Trapeze Networks +00:23:18 Toshiba +E8:9D:87 Toshiba +E8:E0:B7 Toshiba +00:14:28 Vocollect Inc +00:6B:9E Vizio, Inc +00:24:FF QLogic Corporation +00:A0:C6 Qualcomm Inc. +EC:AA:A0 PEGATRON CORPORATION +E8:88:6C Shenzhen SC Technologies Co.,LTD +DC:35:F1 Positivo Informática SA. +EC:68:81 Palo Alto Networks +44:33:4C Shenzhen Bilian electronic CO.,LTD +D8:4F:B8 LG ELECTRONICS +9C:22:0E TASCAN Systems GmbH +0C:A4:02 Alcatel-Lucent IPD +00:16:4D Alcatel-Lucent IPD +FC:FA:F7 Shanghai Baud Data Communication Co.,Ltd. +0C:54:B9 Alcatel-Lucent Canada +C4:08:4A Alcatel-Lucent Canada +C8:E7:76 PTCOM Technology +5C:49:7D Samsung Electronics Co.,Ltd +34:AA:99 Alcatel-Lucent Canada +8C:90:D3 Alcatel-Lucent Canada +A8:AD:3D Alcatel-Lucent Shanghai Bell Co., Ltd +E0:30:05 Alcatel-Lucent Shanghai Bell Co., Ltd +28:24:FF Wistron Neweb Corporation +14:C1:FF ShenZhen QianHai Comlan communication Co.,LTD +EC:8E:B5 Hewlett Packard +70:AF:6A SHENZHEN FENGLIAN TECHNOLOGY CO., LTD. +00:26:F1 ProCurve Networking by HP +B4:39:D6 ProCurve Networking by HP +00:1C:EF Primax Electronics Ltd. +00:02:76 Primax Electronics Ltd. +48:49:C7 Samsung Electronics Co.,Ltd +00:1F:9A Nortel Networks +00:14:C7 Nortel Networks +00:15:40 Nortel Networks +00:17:D1 Nortel Networks +00:15:E8 Nortel Networks +00:16:60 Nortel Networks +00:1B:BA Nortel Networks +20:5E:F7 Samsung Electronics Co.,Ltd +00:03:4B Nortel Networks +00:00:1B Novell, Inc. +00:E0:11 UNIDEN CORPORATION +B0:3E:B0 MICRODIA Ltd. +00:12:6C Visonic Technologies 1993 Ltd. +18:AB:F5 Ultra Electronics Electrics +30:44:87 Hefei Radio Communication Technology Co., Ltd +AC:61:75 HUAWEI TECHNOLOGIES CO.,LTD +AC:48:2D Ralinwi Nanjing Electronic Technology Co., Ltd. +A4:82:69 Datrium, Inc. +44:14:41 AudioControl Inc. +00:18:DA AMBER wireless GmbH +EC:24:B8 Texas Instruments +68:C9:0B Texas Instruments +F4:B8:5E Texas Instruments +5C:31:3E Texas Instruments +A0:E6:F8 Texas Instruments +20:C3:8F Texas Instruments +D0:FF:50 Texas Instruments +74:72:B0 Guangzhou Shiyuan Electronics Co., Ltd. +44:BF:E3 Shenzhen Longtech Electronics Co.,Ltd +F4:52:14 Mellanox Technologies, Inc. +68:9E:19 Texas Instruments +98:59:45 Texas Instruments +1C:E2:CC Texas Instruments +44:C1:5C Texas Instruments +00:17:E9 Texas Instruments +00:17:E7 Texas Instruments +D0:07:90 Texas Instruments +04:E4:51 Texas Instruments +B0:D5:CC Texas Instruments +5C:F8:21 Texas Instruments +FC:0F:4B Texas Instruments +3C:6F:EA Panasonic India Pvt. Ltd. +A8:63:F2 Texas Instruments +94:88:54 Texas Instruments +00:12:37 Texas Instruments +BC:6A:29 Texas Instruments +C0:E4:22 Texas Instruments +00:18:30 Texas Instruments +1C:BA:8C Texas Instruments +58:FB:84 Intel Corporate +E0:E7:BB Nureva, Inc. +7C:A9:7D Objenious +BC:8A:A3 NHN Entertainment +70:A8:4C MONAD., Inc. +00:D0:88 ARRIS Group, Inc. +00:16:75 ARRIS Group, Inc. +00:16:B5 ARRIS Group, Inc. +00:17:84 ARRIS Group, Inc. +00:17:E2 ARRIS Group, Inc. +CC:7D:37 ARRIS Group, Inc. +00:1A:77 ARRIS Group, Inc. +98:4B:4A ARRIS Group, Inc. +00:15:A4 ARRIS Group, Inc. +00:15:A3 ARRIS Group, Inc. +7C:BF:B1 ARRIS Group, Inc. +80:96:B1 ARRIS Group, Inc. +00:90:9C ARRIS Group, Inc. +00:11:80 ARRIS Group, Inc. +00:17:EE ARRIS Group, Inc. +40:70:09 ARRIS Group, Inc. +94:87:7C ARRIS Group, Inc. +00:1D:D2 ARRIS Group, Inc. +9C:34:26 ARRIS Group, Inc. +5C:8F:E0 ARRIS Group, Inc. +6C:CA:08 ARRIS Group, Inc. +54:65:DE ARRIS Group, Inc. +F8:ED:A5 ARRIS Group, Inc. +00:A2:89 Cisco Systems, Inc +AC:EC:80 ARRIS Group, Inc. +3C:7A:8A ARRIS Group, Inc. +00:0F:CC ARRIS Group, Inc. +BC:CA:B5 ARRIS Group, Inc. +80:F5:03 ARRIS Group, Inc. +84:96:D8 ARRIS Group, Inc. +D4:2C:0F ARRIS Group, Inc. +E0:B7:B1 ARRIS Group, Inc. +00:24:A0 ARRIS Group, Inc. +C0:C5:22 ARRIS Group, Inc. +5C:B0:66 ARRIS Group, Inc. +00:22:10 ARRIS Group, Inc. +00:21:1E ARRIS Group, Inc. +E4:83:99 ARRIS Group, Inc. +00:26:36 ARRIS Group, Inc. +00:12:C9 ARRIS Group, Inc. +00:1C:FB ARRIS Group, Inc. +00:1C:12 ARRIS Group, Inc. +00:1F:C4 ARRIS Group, Inc. +6C:1E:90 Hansol Technics Co., Ltd. +48:6D:BB Vestel Elektronik San ve Tic. A.Ş. +E0:9D:FA Wanan Hongsheng Electronic Co.Ltd +34:E7:1C Shenzhen YOUHUA Technology Co., Ltd +18:28:61 AirTies Wireless Networks +88:41:FC AirTies Wireless Networks +18:26:66 Samsung Electronics Co.,Ltd +C0:65:99 Samsung Electronics Co.,Ltd +CC:07:AB Samsung Electronics Co.,Ltd +E8:4E:84 Samsung Electronics Co.,Ltd +50:FC:9F Samsung Electronics Co.,Ltd +E4:32:CB Samsung Electronics Co.,Ltd +88:9B:39 Samsung Electronics Co.,Ltd +BC:B1:F3 Samsung Electronics Co.,Ltd +38:EC:E4 Samsung Electronics Co.,Ltd +CC:F9:E8 Samsung Electronics Co.,Ltd +F0:E7:7E Samsung Electronics Co.,Ltd +5C:E8:EB Samsung Electronics Co.,Ltd +B8:D9:CE Samsung Electronics Co.,Ltd +70:F9:27 Samsung Electronics Co.,Ltd +30:19:66 Samsung Electronics Co.,Ltd +28:BA:B5 Samsung Electronics Co.,Ltd +10:3B:59 Samsung Electronics Co.,Ltd +6C:B7:F4 Samsung Electronics Co.,Ltd +44:4E:1A 5481 +E8:E5:D6 5481 +10:1D:C0 5481 +00:1E:E1 Samsung Electronics Co.,Ltd +00:18:AF Samsung Electronics Co.,Ltd +00:21:D1 5481 +54:92:BE 5481 +BC:72:B1 Samsung Electronics Co.,Ltd +78:F7:BE Samsung Electronics Co.,Ltd +F4:9F:54 Samsung Electronics Co.,Ltd +7C:11:CB HUAWEI TECHNOLOGIES CO.,LTD +A4:CA:A0 HUAWEI TECHNOLOGIES CO.,LTD +00:21:4C Samsung Electronics Co.,Ltd +00:16:32 Samsung Electronics Co.,Ltd +D0:66:7B Samsung Electronics Co.,Ltd +38:AA:3C SAMSUNG ELECTRO MECHANICS CO., LTD. +20:64:32 SAMSUNG ELECTRO MECHANICS CO., LTD. +00:26:37 SAMSUNG ELECTRO MECHANICS CO., LTD. +00:13:77 Samsung Electronics Co.,Ltd +50:B7:C3 Samsung Electronics Co.,Ltd +80:18:A7 Samsung Electronics Co.,Ltd +5C:A3:9D SAMSUNG ELECTRO MECHANICS CO., LTD. +B8:8E:DF Zencheer Communication Technology Co., Ltd. +D8:5D:E2 Hon Hai Precision Ind. Co.,Ltd. +70:77:81 Hon Hai Precision Ind. Co.,Ltd. +60:6D:C7 Hon Hai Precision Ind. Co.,Ltd. +68:14:01 Hon Hai Precision Ind. Co.,Ltd. +00:71:CC Hon Hai Precision Ind. Co.,Ltd. +F8:66:D1 Hon Hai Precision Ind. Co.,Ltd. +F8:0D:43 Hon Hai Precision Ind. Co.,Ltd. +00:22:68 Hon Hai Precision Ind. Co.,Ltd. +00:1F:E1 Hon Hai Precision Ind. Co.,Ltd. +00:25:56 Hon Hai Precision Ind. Co.,Ltd. +00:26:5C Hon Hai Precision Ind. Co.,Ltd. +90:CD:B6 Hon Hai Precision Ind. Co.,Ltd. +00:1E:4C Hon Hai Precision Ind. Co.,Ltd. +F8:DA:0C Hon Hai Precision Ind. Co.,Ltd. +90:34:FC Hon Hai Precision Ind. Co.,Ltd. +90:6E:BB Hon Hai Precision Ind. Co.,Ltd. +34:23:87 Hon Hai Precision Ind. Co.,Ltd. +68:94:23 Hon Hai Precision Ind. Co.,Ltd. +B8:76:3F Hon Hai Precision Ind. Co.,Ltd. +1C:3E:84 Hon Hai Precision Ind. Co.,Ltd. +C0:18:85 Hon Hai Precision Ind. Co.,Ltd. +78:59:68 Hon Hai Precision Ind. Co.,Ltd. +1C:66:6D Hon Hai Precision Ind. Co.,Ltd. +CC:AF:78 Hon Hai Precision Ind. Co.,Ltd. +90:4C:E5 Hon Hai Precision Ind. Co.,Ltd. +B0:10:41 Hon Hai Precision Ind. Co.,Ltd. +00:05:CD D&M Holdings Inc. +74:87:A9 OCT Technology Co., Ltd. +70:F8:E7 IEEE Registration Authority diff --git a/pyric/device.py b/pyric/utils/hardware.py similarity index 71% rename from pyric/device.py rename to pyric/utils/hardware.py index 5400c60..0bbe547 100644 --- a/pyric/device.py +++ b/pyric/utils/hardware.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -""" device.py: utility functions +""" hardware.py: device related utility functions Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) @@ -20,26 +20,81 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. -Defines device functions to get driver and chipset. Should we move hwaddr from -hex string to here? +Defines device hardware related functions: mac address, driver, chipset """ -__name__ = 'device' +__name__ = 'hardware' __license__ = 'GPLv3' -__version__ = '0.0.3' -__date__ = 'August 2014' +__version__ = '0.0.4' +__date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' __status__ = 'Production' -from os import listdir +import os +import random dpath = '/proc/net/dev' # system device details drvpath = '/sys/class/net/{0}/device/driver/module/drivers' # format w/ device name -#phypath = '/sys/class/ieee80211/{0}' # format w/ phyiscal name -# NOTE phypath + index contains the ifindex (sometimes) + +def parseoui(path): + """ + parse oui.txt file + :param path: path of oui text file + :returns: oui dict {oui:manuf} for each oui in path or empty dict + """ + fin = None + ouis = {} + + try: + fin = open(path) + for line in fin.readlines()[1:]: + o,m = line.strip().split('\t') + ouis[o.lower()] = m[0:100] + fin.close() + except (IOError,IndexError): + pass + finally: + if fin and not fin.closed: fin.close() + return ouis + +def oui(mac): + """ + :param mac: 48-bit mac address + :returns: oui portion of mac address + """ + return mac[:8] + +def ulm(mac): + """ + :param mac: + :returns: ulm portion of mac address + """ + return mac[9:] + +def manufacturer(ouis,mac): + """ + returns the manufacturer of the mac address if exists, otherwise 'unknown' + :param ouis: oui dict + :param mac: hw addr to search up + :returns: manufacturer + """ + try: + return ouis[mac[:8]] + except KeyError: + return "unknown" + +def randhw(ouis): + """ + generate a random hw address + :param ouis: oui dict to use + :returns: random hw address + """ + o = random.choice(ouis.keys()) + u = ":".join(['{0:02x}'.format(random.randint(0,255)) for _ in xrange(3)]) + return o + ':' + u def ifcard(dev): """ @@ -56,7 +111,7 @@ def ifdriver(dev): """ try: # find the driver for nic in driver's module, split on ':' and return - ds = listdir(drvpath.format(dev)) + ds = os.listdir(drvpath.format(dev)) if len(ds) > 1: return "Unknown" return ds[0].split(':')[1] except OSError: diff --git a/pyric/utils/ouifetch.py b/pyric/utils/ouifetch.py new file mode 100644 index 0000000..ba681fe --- /dev/null +++ b/pyric/utils/ouifetch.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python + +""" ouifetch.py: get ouis data from IEEE + +Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) + +This program is free software:you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation,either version 3 of the License,or (at your option) any later +version. + +Redistribution and use in source and binary forms,with or without modifications, +are permitted provided that the following conditions are met: + o Redistributions of source code must retain the above copyright notice,this + list of conditions and the following disclaimer. + o Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + o Neither the name of the orginal author Dale V. Patterson nor the names of any + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +Fetchs and store oui data from IEEE + +""" + +#__name__ = 'ouifetch' +__license__ = 'GPLv3' +__version__ = '0.0.1' +__date__ = 'August 2014' +__author__ = 'Dale Patterson' +__maintainer__ = 'Dale Patterson' +__email__ = 'wraith.wireless@yandex.com' +__status__ = 'Production' + +import urllib2,os,sys,datetime,time +import argparse as ap + +OUIURL = 'http://standards-oui.ieee.org/oui.txt' +OUIPATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), + os.path.abspath('data/oui.txt')) + +def fetch(path=None,verbose=False): + """ + retrieves oui.txt from IEEE and writes to data file + :param path: fullpath of oui.txt + :param verbose: write updates to stdout + """ + # determine if data path is legit + if path is None: path = OUIPATH + if not os.path.isdir(os.path.dirname(path)): + print "Path to data is incorrect {0}".format(path) + sys.exit(1) + + # fetch oui file from ieee + fout = None + + # set up url request + req = urllib2.Request(OUIURL) + req.add_header('User-Agent',"PyRIC +https://github.com/wraith-wireless/PyRIC/") + try: + # retrieve the oui file and parse out generated date + if verbose: print 'Fetching ', OUIURL + res = urllib2.urlopen(req) + if verbose: print "Parsing OUI file" + + if verbose: print "Opening data file {0} for writing".format(path) + fout = open(path,'w') + gen = datetime.datetime.utcnow().isoformat() # use current time as the first line + fout.write(gen+'\n') + + # pull out ouis + t = time.time() + cnt = 0 + for l in res: + if '(hex)' in l: + # extract oui and manufacturer + oui,manuf = l.split('(hex)') + oui = oui.strip().replace('-',':') + manuf = manuf.strip() + if manuf.startswith("IEEE REGISTRATION AUTHORITY"): + manuf = "IEEE REGISTRATION AUTHORITY" + + # write to file & update count + fout.write('{0}\t{1}\n'.format(oui,manuf)) + cnt += 1 + if verbose: print "{0}:\t{1}\t{2}".format(cnt,oui,manuf) + print "Wrote {0} OUIs in {1:.3} secs".format(cnt,time.time()-t) + except urllib2.URLError as e: + print "Error fetching oui file: {0}".format(e) + except IOError as e: + print "Error opening output file {0}".format(e) + except Exception as e: + print "Error parsing oui file: {0}".format(e) + finally: + if fout: fout.close() + +if __name__ == '__main__': + # create arg parser and parse command line args + print "OUI Fetch {0}".format(__version__) + argp = ap.ArgumentParser(description="IEEE OUI fetch and parse") + argp.add_argument('-p','--path',help="Path to write parsed file") + argp.add_argument('-v','--verbose',action='store_true',help="Display operations to stdout") + argp.add_argument('--version',action='version',version="OUI Fetch {0}".format(__version__)) + args = argp.parse_args() + verbose = args.verbose + path = args.path + + # execute + fetch(path,verbose) diff --git a/pyric/rfkill.py b/pyric/utils/rfkill.py similarity index 66% rename from pyric/rfkill.py rename to pyric/utils/rfkill.py index d886f83..2f9a9cc 100644 --- a/pyric/rfkill.py +++ b/pyric/utils/rfkill.py @@ -1,24 +1,5 @@ #!/usr/bin/env python -""" rfkill.py: rfkill port - -/usr/include/linux -/* - * Copyright (C) 2006 - 2007 Ivo van Doorn - * Copyright (C) 2007 Dmitry Torokhov - * Copyright 2009 Johannes Berg - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ +""" rfkill.py: rfkill functions Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) @@ -49,17 +30,6 @@ if the index does not exist """ -""" - rfkill writes and reads rfkill_event structures to /dev/rfkill using fcntl - Results and useful information can be found in /sys/class/rfkill which contains - one or more rfkill directories where n is the index of each 'wireless' - device. In each rfkill are several files some of which are: - o type: type of device i.e. wlan, bluetooth etc - o name: in the case of 802.11 cards this is the physical name -""" -dpath = '/dev/rfkill' -spath = '/sys/class/rfkill' - __name__ = 'rfkill' __license__ = 'GPLv3' __version__ = '0.0.1' @@ -74,79 +44,18 @@ import fcntl import pyric import errno - -RFKILL_STATE_SOFT_BLOCKED = 0 -RFKILL_STATE_UNBLOCKED = 1 -RFKILL_STATE_HARD_BLOCKED = 2 - -""" -/** - * enum rfkill_type - type of rfkill switch. - * - * @RFKILL_TYPE_ALL: toggles all switches (requests only - not a switch type) - * @RFKILL_TYPE_WLAN: switch is on a 802.11 wireless network device. - * @RFKILL_TYPE_BLUETOOTH: switch is on a bluetooth device. - * @RFKILL_TYPE_UWB: switch is on a ultra wideband device. - * @RFKILL_TYPE_WIMAX: switch is on a WiMAX device. - * @RFKILL_TYPE_WWAN: switch is on a wireless WAN device. - * @RFKILL_TYPE_GPS: switch is on a GPS device. - * @RFKILL_TYPE_FM: switch is on a FM radio device. - * @RFKILL_TYPE_NFC: switch is on an NFC device. - * @NUM_RFKILL_TYPES: number of defined rfkill types - */ -""" -RFKILL_TYPES = ['all','wlan','bluetooth','uwb','wimax','wwan','gps','fm','nfc'] -RFKILL_TYPE_ALL = 0 -RFKILL_TYPE_WLAN = 1 -RFKILL_TYPE_BLUETOOTH = 2 -RFKILL_TYPE_UWB = 3 -RFKILL_TYPE_WIMAX = 4 -RFKILL_TYPE_WWAN = 5 -RFKILL_TYPE_GPS = 6 -RFKILL_TYPE_FM = 7 -RFKILL_TYPE_NFC = 8 -NUM_RFKILL_TYPES = 9 - -""" -/** - * enum rfkill_operation - operation types - * @RFKILL_OP_ADD: a device was added - * @RFKILL_OP_DEL: a device was removed - * @RFKILL_OP_CHANGE: a device's state changed -- userspace changes one device - * @RFKILL_OP_CHANGE_ALL: userspace changes all devices (of a type, or all) - */ - """ -RFKILL_OP_ADD = 0 -RFKILL_OP_DEL = 1 -RFKILL_OP_CHANGE = 2 -RFKILL_OP_CHANGE_ALL = 3 +import pyric.net.wireless.rfkill_h as rfkh """ -/** - * struct rfkill_event - events for userspace on /dev/rfkill - * @idx: index of dev rfkill - * @type: type of the rfkill struct - * @op: operation code - * @hard: hard state (0/1) - * @soft: soft state (0/1) - * - * Structure used for userspace communication on /dev/rfkill, - * used for events from the kernel and control to the kernel. - */ + rfkill writes and reads rfkill_event structures to /dev/rfkill using fcntl + Results and useful information can be found in /sys/class/rfkill which contains + one or more rfkill directories where n is the index of each 'wireless' + device. In each rfkill are several files some of which are: + o type: type of device i.e. wlan, bluetooth etc + o name: in the case of 802.11 cards this is the physical name """ -rfk_rfkill_event = "IBBBB" -RFKILLEVENTLEN = struct.calcsize(rfk_rfkill_event) -def rfkill_event(idx,rtype,op,hard=0,soft=0): - """ - create a rkfill event structure - :param idx: index of dev rfkill i.e. 0,1 - :param rtype: type of rfkill - :param op: op code - :param hard: hard state one of {0=unbloacked|1=blocked} - :param soft: soft state one of {0=unblocked|1=blocked} - :returns: a rfkill event structure - """ - return struct.pack(rfk_rfkill_event,idx,rtype,op,hard,soft) +dpath = '/dev/rfkill' +spath = '/sys/class/rfkill' def rfkill_list(): """ @@ -159,10 +68,11 @@ def rfkill_list(): fcntl.fcntl(fin.fileno(),fcntl.F_SETFL,flags|os.O_NONBLOCK) while True: try: - idx,t,op,s,h = struct.unpack(rfk_rfkill_event,fin.read(RFKILLEVENTLEN)) - if op == RFKILL_OP_ADD: + idx,t,op,s,h = struct.unpack(rfkh.rfk_rfkill_event, + fin.read(rfkh.RFKILLEVENTLEN)) + if op == rfkh.RFKILL_OP_ADD: rfks[getname(idx)] = {'idx':idx, - 'type':RFKILL_TYPES[t], + 'type':rfkh.RFKILL_TYPES[t], 'soft':s, 'hard':h} except IOError: @@ -179,7 +89,7 @@ def rfkill_block(idx): raise pyric.error(errno.ENODEV,"No device at {0}".format(idx)) fout = None try: - rfke = rfkill_event(idx,RFKILL_TYPE_ALL,RFKILL_OP_CHANGE,1,0) + rfke = rfkh.rfkill_event(idx,rfkh.RFKILL_TYPE_ALL,rfkh.RFKILL_OP_CHANGE,1,0) fout = open(dpath, 'w') fout.write(rfke) except struct.error as e: @@ -209,7 +119,7 @@ def rfkill_unblock(idx): raise pyric.error(errno.ENODEV, "No device at {0}".format(idx)) fout = None try: - rfke = rfkill_event(idx,RFKILL_TYPE_ALL,RFKILL_OP_CHANGE,0,0) + rfke = rfkh.rfkill_event(idx,rfkh.RFKILL_TYPE_ALL,rfkh.RFKILL_OP_CHANGE,0,0) fout = open(dpath, 'w') fout.write(rfke) except struct.error as e: @@ -225,7 +135,7 @@ def rfkill_unblockby(rtype): :param rtype: rfkill type one of {'all'|'wlan'|'bluetooth'|'uwb'|'wimax' |'wwan'|'gps'|'fm'|'nfc'} """ - if rtype not in RFKILL_TYPES: + if rtype not in rfkh.RFKILL_TYPES: raise pyric.error(errno.EINVAL,"Type {0} is not valid".format(rtype)) rfks = rfkill_list() for name in rfks: diff --git a/setup.py b/setup.py index 00af85b..de86ca8 100644 --- a/setup.py +++ b/setup.py @@ -35,9 +35,11 @@ import pyric long_desc = """ - PyRIC provides the ability to manipuate, identify and enumerate your system's - wireless cards. It is a pure python port of a subset of the functionality provided - by iw, ifconfig, iwconfig and rfkill. + PyRIC is Linux wireless network interface card library. It provides the ability to + manipuate, identify and enumerate your system's wireless cards. PyRIC is a pure + python port of a subset of the functionality provided by iw, ifconfig, iwconfig + and rfkill. + PyRIC is: * Pythonic: No ctypes, SWIG etc. PyRIC redefines C header files as Python and uses sockets to communicate with kernel. @@ -73,7 +75,7 @@ 'Programming Language :: Python', 'Programming Language :: Python :: 2.7' ], - keywords='nl80211 iw wireless pentest', + keywords='Linux nl80211 iw wireless pentest', packages=find_packages(), package_data={'pyric':['docs/*.help']} ) diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 11f017e..42dea12 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -35,7 +35,7 @@ import unittest import time from pyric import error -from pyric.channels import ISM_24_F2C,rf2ch +from pyric.utils.channels import ISM_24_F2C,rf2ch from pyric import pyw # modify below to fit your system From 031e90385b39081baf21d81229c29d4b9b262183 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 4 Jun 2016 12:03:25 -0600 Subject: [PATCH 013/121] 0.1.1 Restructured hierarchy --- README.md | 11 ++++++++++- tests/pyw.unittest.py | 4 ++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2745f87..d1b8f24 100644 --- a/README.md +++ b/README.md @@ -234,7 +234,7 @@ You can also use pyw.devinfo to get a Card object and pyw.devadd will return a c object for the newly created virtual interface. The card, w0, will be used throughout the remainder of the examples. -#### i. Setting The Mac Address +#### i. Setting The Mac Address and IP Address ```python mac = pyw.macget(w0) # get the hw addr @@ -250,6 +250,15 @@ pyw.up(w0) # bring wlan0 back up pyw.macget(w0) # see if it worked => '00:1F:32:00:01:00' + +pyw.inetget(w0) # not associated, inet won't return an address +=> (None, None, None) + +pyw.inetset(w0,'192.168.3.23','192.168.3.63','255.255.255.192') +=> True + +pyw.inetget(w0) +=> ('192.168.3.23', '255.255.255.0', '192.168.3.255') ``` #### ii. Getting Info On Your Card diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 42dea12..3bff8ee 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -41,8 +41,8 @@ # modify below to fit your system pri = {'dev':'alfa0', 'mac':'00:c0:ca:59:af:a6', - 'ifindex':5, - 'phy':2, + 'ifindex':4, + 'phy':1, 'mode':'managed', 'tx':20, 'freqs':sorted(ISM_24_F2C.keys()), From 664a857aa20e717d253e2e95d9853210590ec8b2 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 4 Jun 2016 12:09:19 -0600 Subject: [PATCH 014/121] v0.1.1 --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d1b8f24..3d2d17e 100644 --- a/README.md +++ b/README.md @@ -234,7 +234,7 @@ You can also use pyw.devinfo to get a Card object and pyw.devadd will return a c object for the newly created virtual interface. The card, w0, will be used throughout the remainder of the examples. -#### i. Setting The Mac Address and IP Address +#### i. Setting Mac and IP Addresses ```python mac = pyw.macget(w0) # get the hw addr @@ -254,12 +254,17 @@ pyw.macget(w0) # see if it worked pyw.inetget(w0) # not associated, inet won't return an address => (None, None, None) -pyw.inetset(w0,'192.168.3.23','192.168.3.63','255.255.255.192') +pyw.inetset(w0,'192.168.3.23','255.255.255.192','192.168.3.63') => True pyw.inetget(w0) -=> ('192.168.3.23', '255.255.255.0', '192.168.3.255') +=> ('192.168.3.23', '255.255.255.192', '192.168.3.255') ``` + +It is important to note that (like ifconfig), erroneous values can be set +when setting the inet addresses: for example you can set the ip address on +192.168.3.* network with a broadcast address of 10.255.255.255. + #### ii. Getting Info On Your Card ```python From 67a036502bb7399a19ac508846e096a04a823bab Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 4 Jun 2016 12:56:13 -0600 Subject: [PATCH 015/121] v0.1.1 --- README.md | 52 ++++++++++++++++++++++++++++++++++------- pyric/utils/hardware.py | 10 ++++++-- pyric/utils/ouifetch.py | 2 +- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 3d2d17e..daa0025 100644 --- a/README.md +++ b/README.md @@ -176,10 +176,8 @@ Once installed, see examples/pentest.py which covers most pyw functions or read throuhg PyRIC.pdf. However, for those impatient types: ```python -import pyric # pyric error and EUNDEF error code -from pyric import device # driver and chipset lookup -from pyric import channels # channels, freqs, widths and conversions -from pyric import pyw # iw functionality +import pyric # pyric error and EUNDEF error code +from pyric import pyw iw functionality ``` will import the basic requirements and is assumed for the examples below. It is also assumed @@ -268,6 +266,10 @@ when setting the inet addresses: for example you can set the ip address on #### ii. Getting Info On Your Card ```python +pyw.devinfo(w0) +=> {'wdev': 4294967297, 'RF': None, 'CF': None, 'mac': '00:c0:ca:59:af:a6', +'mode': 'managed', 'CHW': None, 'card': Card(phy=1,dev=alfa0,ifindex=4)} + pyw.txget(w0) => 20 @@ -288,10 +290,6 @@ u'frame', u'frame_wait_cancel', u'set_wiphy_netns', u'set_channel', u'set_wds_pe u'probe_client', u'set_noack_map', u'register_beacons', u'start_p2p_device', u'set_mcast_rate', u'connect', u'disconnect'] -pyw.devinfo(w0) -=> {'wdev': 4294967297, 'RF': None, 'CF': None, 'mac': '00:c0:ca:59:af:a6', -'mode': 'managed', 'CHW': None, 'card': Card(phy=1,dev=alfa0,ifindex=4)} - pinfo = pyw.phyinfo(w0) pinfo['scan_ssids'] @@ -312,6 +310,44 @@ pinfo['rts_thresh'] pinfo['cov_class'] => 0 +pinfo['freqs'] +=>[2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, +2484] +``` + +Read the user guide, or type dir(pyw) in your console to get a full listing +of pyw functions. + +c. Miscelleaneous Utilities +Several additional tools are located in the utils directory. Two of these are: + * channels.py: defines ISM and UNII band channels/frequencies and provides + functions to convert between channel and frequency and vice-versa + * ouifetch.py: retrieves and parses oui.txt from the IEEE website and stores + the oui data in a file that can be read by hardware.py functions +The others will be demonstrated in the following functions + +i. hardware.py +Driver, chipset and mac address related functions can be found here: + +``` python +import pyric.utils.hardware as hw + +ouis = hw.parseoui() +len(ouis) +=> 22128 + +mac = 'a0:88:b4:9e:68:58' +dev = 'wlan0' + +hw.oui(mac) +=> 'a0:88:b4' + +hw.ulm(mac) +=> '9e:68:58' + +hw.manufacturer(ouis,mac) +=> 'Intel Corporate' + ``` #### iii. Virtual Interfaces diff --git a/pyric/utils/hardware.py b/pyric/utils/hardware.py index 0bbe547..ead73b7 100644 --- a/pyric/utils/hardware.py +++ b/pyric/utils/hardware.py @@ -35,11 +35,12 @@ import os import random +import pyric dpath = '/proc/net/dev' # system device details drvpath = '/sys/class/net/{0}/device/driver/module/drivers' # format w/ device name -def parseoui(path): +def parseoui(path=None): """ parse oui.txt file :param path: path of oui text file @@ -48,14 +49,19 @@ def parseoui(path): fin = None ouis = {} + if not path: + path = os.path.join(os.path.dirname(os.path.abspath(__file__)),'data/oui.txt') + try: fin = open(path) for line in fin.readlines()[1:]: o,m = line.strip().split('\t') ouis[o.lower()] = m[0:100] fin.close() - except (IOError,IndexError): + except IndexError: pass + except IOError as e: + raise pyric.error(e.errno,e.strerror) finally: if fin and not fin.closed: fin.close() return ouis diff --git a/pyric/utils/ouifetch.py b/pyric/utils/ouifetch.py index ba681fe..2610571 100644 --- a/pyric/utils/ouifetch.py +++ b/pyric/utils/ouifetch.py @@ -20,7 +20,7 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. -Fetchs and store oui data from IEEE +Fetchs and stores oui data from IEEE """ From 6bc917361c9332db24310aacbdb5bc35530ba3c5 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 4 Jun 2016 15:00:58 -0600 Subject: [PATCH 016/121] v0.1.1 --- README.md | 58 ++++++++++++++++++++++++++++++++++++++++++- pyric/utils/rfkill.py | 7 +++--- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index daa0025..d55e5b9 100644 --- a/README.md +++ b/README.md @@ -332,7 +332,7 @@ Driver, chipset and mac address related functions can be found here: ``` python import pyric.utils.hardware as hw -ouis = hw.parseoui() +ouis = hw.parseoui() # load the oui dict len(ouis) => 22128 @@ -348,8 +348,64 @@ hw.ulm(mac) hw.manufacturer(ouis,mac) => 'Intel Corporate' +hw.randhw(ouis) # generate a random mac address +=>'00:03:f0:5a:a1:fc' + +hw.manufacturer(ouis,'00:03:f0:5a:a1:fc') +=> 'Redfern Broadband Networks' + +hw.ifcard('wlan0') # get driver & chipset +=> ('iwlwifi', 'Intel 4965/5xxx/6xxx/1xxx') ``` +ii. rfkill.py +Sometimes, your card has a soft block (or hard block) on it and it is not +recognized by command line tools or pyw. Use rkill to list, turn on or turn +off soft blocks. + +``` python +from pyric.utils import rfkill + +rfkill.rfkill_list() # list rfkill devices +=> {'tpacpi_bluetooth_sw': {'soft': True, 'hard': False, 'type': 'bluetooth', 'idx': 1}, + 'phy3': {'soft': False, 'hard': False, 'type': 'wlan', 'idx': 5}, + 'phy0': {'soft': False, 'hard': False, 'type': 'wlan', 'idx': 0}} + +idx = rfkill.getidx(3) +idx +=> 5 + +rfkill.getname(idx) +=> phy3 + +rfkill.gettype(idx) +=> 'wlan' + +rfkill.soft_blocked(idx) +=> False + +rfkill.hard_blocked(idx) +=> False + +rfkill.rfkill_block(idx) + +rfkill.list() +=> {'tpacpi_bluetooth_sw': {'soft': False, 'hard': True, 'type': 'bluetooth', 'idx': 1}, + 'phy3': {'soft': True, 'hard': True, 'type': 'wlan', 'idx': 5}, + 'phy0': {'soft': True, 'hard': True, 'type': 'wlan', 'idx': 0}} + +rfkill.rfkill_unblock(idx) + +rfkill.rfkill_list() +=> {'tpacpi_bluetooth_sw': {'soft': True, 'hard': False, 'type': 'bluetooth', 'idx': 1}, + 'phy3': {'soft': False, 'hard': False, 'type': 'wlan', 'idx': 5}, + 'phy0': {'soft': False, 'hard': False, 'type': 'wlan', 'idx': 0}} +``` + +Note that rfkill_list lists all 'wireless' devices: wlan, bluetooth, wimax, wwan, +gps, fm and nfc. Another important thing to note is that the index is not the +interface index. + #### iii. Virtual Interfaces In my experience, virtual interfaces are primarily used to recon, attack or some other tomfoolery but can also be used to analyze your wireless network. In either diff --git a/pyric/utils/rfkill.py b/pyric/utils/rfkill.py index 2f9a9cc..d726a02 100644 --- a/pyric/utils/rfkill.py +++ b/pyric/utils/rfkill.py @@ -46,6 +46,8 @@ import errno import pyric.net.wireless.rfkill_h as rfkh +RFKILL_STATE = [False,True] # Unblocked = 0, Blocked = 1 + """ rfkill writes and reads rfkill_event structures to /dev/rfkill using fcntl Results and useful information can be found in /sys/class/rfkill which contains @@ -73,8 +75,8 @@ def rfkill_list(): if op == rfkh.RFKILL_OP_ADD: rfks[getname(idx)] = {'idx':idx, 'type':rfkh.RFKILL_TYPES[t], - 'soft':s, - 'hard':h} + 'soft':RFKILL_STATE[s], + 'hard':RFKILL_STATE[h]} except IOError: break fin.close() @@ -186,7 +188,6 @@ def getidx(phy): :param phy: phyiscal index :returns: the rfkill index """ - phy = "phy{0}".format(phy) rfks = rfkill_list() try: return rfks["phy{0}".format(phy)]['idx'] From ca25c32839753ea644f6a8471166540165f7efb9 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 4 Jun 2016 15:04:24 -0600 Subject: [PATCH 017/121] v0.1.1 --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d55e5b9..b9258ad 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ have increased dramatically in recent years. However, these tools still rely on Linux command lines tools to setup and prepare and restore the system for use. Until now. Why use subprocess.Popen, regular expressions and str.find to interact with your wireless cards? PyRIC is: + 1. Pythonic: no ctypes, SWIG etc. PyRIC redefines C header files as Python and uses sockets to communicate with the kernel. 2. Self-sufficient: No third-party files used. PyRIC is completely self-contained. @@ -403,8 +404,8 @@ rfkill.rfkill_list() ``` Note that rfkill_list lists all 'wireless' devices: wlan, bluetooth, wimax, wwan, -gps, fm and nfc. Another important thing to note is that the index is not the -interface index. +gps, fm and nfc. Another important thing to note is that the rfkill index is not +the same as the interface index. #### iii. Virtual Interfaces In my experience, virtual interfaces are primarily used to recon, attack or some From 8d65cd1c8d9336ffc38807c2b15a50c3dad710be Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 4 Jun 2016 18:43:06 -0600 Subject: [PATCH 018/121] v0.1.1 --- README.md | 39 +--------- docs/PyRIC.pdf | Bin 0 -> 382487 bytes docs/PyRIC.tex | 153 +++++++++++++++++-------------------- examples/device_details.py | 8 +- 4 files changed, 77 insertions(+), 123 deletions(-) create mode 100644 docs/PyRIC.pdf diff --git a/README.md b/README.md index b9258ad..de0fafa 100644 --- a/README.md +++ b/README.md @@ -34,38 +34,7 @@ it's initial inception, PyRIC has grown to include ioctl support to replicate features of ifconfig such as getting or setting the mac address and has recently implemented rkill support to soft block or unblock wireless cards. -### a. Background -PyRIC arose out of a need in Wraith (https://github.com/wraith-wireless/wraith) -for Python nl80211/netlink and ioctl functionality. Originally, Wraith used -ifconfig, iwconfig and iw via subprocess.Popen and parsed the output. There -are obvious shortfalls with this method, especially in terms of iw that is -actively changing (revisions break the parser) and I started looking for an -open source alternative. There are several open source projects out there -such as pyroute, pymnl (and the python files included in the libnl source) but -they generally have either not been maintained recently or come with warnings. -I desired a simple interface to the underlying nl80211 kernel support that -handles the complex operations of netlink seamlessy while maintaining a minimum -of "code walking" to understand, modify and extend. I decided to write my own -because I do not need complete netlink functionality, only that provided by -generic netlink and within the nl80221 family. Additionally, for Wraith, I do -not need a full blown port of iw et. al. functionality to Python but only -require the ability to turn a wireless nic on/off, get/set the hwaddr, get/set -the channel, determine some properties of the card and add/delete interfaces. - -So, why did I do this and why is it done "this" way? When I first started to -explore the idea of moving away from iw output parsing, I looked at the source -for iw, and existing Python ports. Just to figure out how to get the family id -for nl80211 required reading through five different source files with no -comments. To that extent, I have attempted to keep subclassing to a minimum, -the total number of classes to a minimum, combine files where possible and where -it makes since and keep the number of files required to be open simulateneously -in order to understand the methodology and follow the program to a minimum. One -can understand the PyRIC program flow with only two files open at any time namely, -pyw and libnl. In fact, only an understanding of pyw is required to add additional -commands although an understanding of libnl(.py) is helpful especially, if for -example, the code is to be extended to handle multicast or callbacks. - -### b. Additions to iw +### a. Additions to iw Several "extensions" have been added to iw: * Persistent sockets: pyw provides the caller with functions & ability to pass their own netlink (or ioctl socket) to pyw functions; @@ -91,7 +60,7 @@ hoptime. Not a big difference. However, the performance increased dramatically w persistent netlink sockets are used with the total time and average hop time nearly halved. -### c. Current State +### b. Current State ATT, PyRIC accomplishes my core needs but it is still a work in progress. It currently provides the following: * enumerate interfaces and wireless interfaces @@ -114,7 +83,7 @@ It also provides limited help functionality concerning nl80211 commands/attribut (for those who wish to add additional commands). However, it pulls directly from the nl80211 header file and may be vague. -### d. What is PyRIC? +### c. What is PyRIC? To avoid confusion, PyRIC is the system as a whole, including all header files and "libraries" that are required to communicate with the kernel. pyw is a @@ -481,7 +450,7 @@ with (-) are not included in pip installs or PyPI downloads - MANIFEST.in used by setup.py - README.md this file - LICENSE GPLv3 License - + TODO todos for PyRIC + - TODO todos for PyRIC - pyric package directory + \_\_init\_\_.py initialize pyric module + pyw.py wireless nic functionality diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d60b93e6cd5fe6983bf5dd495cc336e14bccef0e GIT binary patch literal 382487 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%0DlFvf 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%0DBBSC6*`>MHvSfhK3 z*$zUI&KL%HGD3}8)U|pS++a*kt`OZ1UT(1ypb^!xP~zp&39AO9cXPB@m=w(IE!23~ zRPv6(&a^vGbJ(`8!}rHhl&EQ~D^_Q#JjM7la>v%1{ndD+G;M6OImmd!F#H;LEYU=O zPs!5V&B-mHVd*fN%Sa?IDRAEkF85Xy)(jq58SoKf6mhQsL#IPT$k^1Z43#8h3`0gy z=w?qvE-7tWOoilp5l44slbI^g8gb2QsI^K%MhfNBdFV{4JOhVk?ZSA8znqAuzNH}_ z1-ol22s#l(|Kpjf>_+acc8($0eM<+c56%|5%NntcMvmq?iSldYkIv@WN(mUmP4BIy zD$z13TH2Z@3-Ie#ZKJ1h-K9k&46O`!$l2Z64g~I|Q~avOo5z`ZfD z^lV;@D+3u;!V(s>^Q$Gca$*{0PA=98EYv!feYxHhq$eb%VdL)R=$_mO!pVWi{T6>- zW}Px5dL`3JQrIkYakJBb^QA;!`%+J+zK)5Fjk&5YkCx z*5N7+MhFNR7LM$|=kqmbD0Fg{!5CqRO+2E!Avf01#MIi>Qk$2I*0^*Px!vzBNWrIV zsVOF`;+j5vNT$ol0uOl;Fu>iBU?w7E-7qr|uf;29TQD~eXKG+-Wn*oqD#*_4=G|;!OvoRE* zrB{vX-a{iNvpn@xIj($nRm3r_^3b6VTBiJf*$=~CE;j~Az7mP*T51f{5mfc-=*o7p zwY0>Hz(|>!K`>+hiC!Bj3e}^$dF?rexM@f;2Wg#BCXX*CS!wDz0*v*X+lyP;bub_t^mv#UA(N&@ zOn&_|<~-d>qI@V{b#P$>U+hXz=U~;ach=_Tkn=0Y{XFE)M!;d<6P4VI-35Df9{hsR zh8E6=Jz&IUvkf<$gt4=Sv#q6f`p9CNJP~_%=K>1It9aw7oo{a^>VE_S6CQWkm$~2SpTgy`6_|Et2Vw|mlJi!fC|XWH^2{Jj05bNiODEWk=fdU#M^a7cJ!e$V33S-$8;|41}#Zg-+M zJ_E=bi{6^5Eh*`mg`jsw3*#{_1VrU@fN-}RGi@2sm^lnhZJ0caD2mz~&QW7v4e6Y1 zEidbu0v<$+26}mTcn3u1^kO5`L#7*FhXn-&2FB*UEjEMGm0t<@)~rre zMkQd?eDIy&`rPuC!JgW*ARkN(KC#6(YX}r*tTNiyD=49GaQUt4fc-90qKAgH>$4rj zrOnvoo~upD=~!Ft$cXUs^78f#j;|g9p;1e9`SF4N{(inb-d^7EjYp^HeshqXn2vAf zXj@8h?Fx2f);rRZONXWhio$(8J>0#+Gn-Zb*hkHlgnN4X_yziT1trxE99a=fyOQ0O z%3IwUDNe~B1diB^!Q!IYv8mpY(lB>*MX`@9X2?o!Gf`zz`tj z8lx4srBZswD+?-ymw~ZD2QnjbhM;KF+F&U_2(QZz>|wV0-=VAzugABCohk3A7aw;4 zk3xbct77~;Jv=aTSTeSWMDKJZgoOqN`}_F#_y)(64P!B4#D`VHwrb=JJGn8GBt`@9 z;kXv^#hx*`HS8UCBMTWW%IaE&F4v_NPHkG zj&(HwAY7=Z#Y*N_+z6dW3v(}X!{;A3r#&D}r_=iT0%)F!NY z6A4}FDToXRPAqK&1Y7t-en#Em{vo>!-x+Vn2=(&~PAVHejP{S*8psOu3rWm5fD_bO zYkopVKydaTFmF2(H3`A~0f8a0xy{QvYxOy$!|MPAtv07*c5i=y-QedH+L9^3j^&#vpa~dAHrr|b@MFrt1UVapoPKyfyLk9 z%ZUMGfkcHpPTfZt9=z$KP)Krj1SWJLl%p|b%ckCL}f85CX-<_cIw49dH^6w}p==S=|_{0+U zO*j+8-pa)2*!03W?2l;z0iGQh8W|m%oCEJ~4L23Vgan6%9hC5>#F`oSUuCjRVeqt^ zmecYFU?Lm_g}hauQ21Xb-}iqA22n_CK>-1iPzQhgag`s`ewd;j_4b!9tKhH()bH~7 zJgn}ZLex?H$kR9!r{%Q#AB92qh(GPsD-S6-Z8G}mlXQu{`>&fC5kuR5Oy#hdN*htq zTNlpZFpr2X8LcSr{t?M^$Kjg8<$KD_=MCod|q%?1R9cUps z^j_Zm_1rJNUcAd~oW6qEstHvm{O#-y|M>Ynr$g%+^mG%RmecYVfgV#2lgran~y-$kJ#}M+c_9!Pzxzo{^p9VayM2Duja}wz&^)?Vt<26}f3CDJi% zobx)w-9VI2J@-x6{+%S&yG)T|rls^y!ydOvVAiHun#S_yv?(tJ^!yp`QK&``41$)^LyiYiZ2L_bB9*I0IvvYjB~IwGX;u?v6)?H zpu35IoUw_erfFDR0>@b*A0TZQ3Nl(^!$L0TncuebNg1?7_7ahMOP)5bVq{jpD>_x2 zm(!XbC!=2O0OSL$@7`cZu#=gIi3zq3ruIJB%f~Q;Q_;ps!u%}UihkXPHe6GgMs%!( zmCL6>@o70Ne?}ODDIOnv8a`X^XR98P_gY2Ow`H(g?72kQ=Kge9h>eB0u9~uuZ_#{z z5W9eR88*dXw>sVnzvI&h%=nW$)O(YmX)0Jl#35z~3xn|K1Zfrt`>?nuHv<7-xxg^% zS3cOhuT9uBHaIsA(E{`+At`%a{ZLiE<#h zJm+bnfv77e$XL1KD>4C}((aW{+6wd=T)SsH42NuQt`^%;F&beb7NJ2=0`$shy&vXM z+3n5sFw<01SI70i*fHhAa8WyhzT!ku(SXCiQn|M%uY5?;^63sdEvMyA2!qgX|DJZ~ zsYzVp_K7f#oH>18pL5bUn%?GnQbcod+@EsFkWVzmN#r|yDjr8Dl(J1HVA6?$YQKPvc@G0J_0fM!iSREC*8l?^FAU6RbPO5><%rJ$U%&DTi*- z0gf-ladVlLjeM1p%XFj=*@K(6@NV6D%%K%E2^tMjdVJ>0H6a@z(kUL1kHVSA9TOoWGy&AxPC*Fz$IyiI_(;^&ol3ER@ z4FUn9(1$^3ck}FNSiFwH_aLHqsa31jJ~A!aFiaD$BaH11)|C$_n*G{I-obPj0@(zn z1=~F|9Qca;fKRvJX*n(baTruqeqT3;{d?!T?|$#+`|o#ue$V>$ht zeojAso(~T6-iE<%zdik&eojB9pZ}X5G!(k~`0*Yo>A(9!Lb6Xz0VOBHekFraQo^aI z;FOeyzkJRIcnd~B0U;&%5A^?-5s~hZkweMJ_pyItMu!~{#Xh!sn6EHOD$Fl13hV>8 z{sVu1tn=8nD4}FzU)3d&gNX%Z72CZ}KTrOqdt~G=;N35qUI@kEkg+oWqXLGEorj}Q zztt8c6^sl!Ofm`>1=&6sIsE8(3UUYq<(scmn1v>XQc%3RJ;-oVdN8YG?^Q?+!EG=S zl0D2zoJv`c|5HeEiT;bN85{8>P zQZn2^9Bm9>ZYhE1p}6Nis1R~gA?Z66V%LHcyG#ImK!U$O<@^8EQ3H$kkrw}hvN>XZ zwsix6)%C%fn<`Vw$}=0f2fxH=qp!QMsAqikPor%>qQSkZAlzl}#^OLhRe5g92rjth z8fdztraZZ%vTSM>cA#zzAP#Di)ZYO?EF+ORtD zt-Y0+#-_$K#J|^ecDcB1Y4`V4f%<}9Kfl7QJYxy<=tdBR5VqS~ROI9pB@VM}0hZ`5zVHY`-i}Zy%@#YVO3)G#+Yf#2tfJA2o&^8(^9}Y)>A%}ha4yIogXjWV>No+w$fpB?Z3|4GHpVjk%N)sH|c!C9l3<9 zThZu=7+oGFIp3}?jWvZE-+G$1LH2u{Uvj5?Vq6A(AL@_;i57x_Vk)ZQj4!2`Bp2$l{=c24 ztDp7>gI(1AR9B9#Q&5<!}<0#0FStsk;_o-q;;1@Y7dOQqr`|Xq^Hg&2}XiD=TT4 zxP}J1C-z`Zm8k>~5%ZG44Q%)o8187;ZwlgL;EMV@SF^na*;^Dbz*K@pilVKwv`pQD zy=@INER#pzXw+&;w27*+ik4|`X6rU)`6o(T_0`l2oWp!9eCj{M&B-tem#AQK&!>v*J-kW+w{G))m2>TfPD7z58Sby&d~L8e{m7prV|$uTxX%K z=96>aoVYibZlkHDuC4D7T!cAim)dgNj5XC&R1Ca}mX4wCjf#X|WA^iZf2!!><&)C7 zvA5I_X|1KItgLMx-?xF-Y6>*9vp3N)_KEf}Gj+}%f$a@eMA)iGXh)B19v;*i1Abz3 z4!CSDi$yNJh4a|>*t?VIj;>`Np5~~9Na|bsR@$_(uQ3NdqRL!C%&+W3=oxh)B_w-* zCtbabo=#$VESS}h>nf|{`(9%Cr3{w)JO#K3NYN0I^UYs=r^fl$w%l?aLpWR|Bp`ou zN49ncJ)Xe)lrtpGTUx~``L(kGzq)_d<|iXSp>`JQTy!nGJ?+iy{EK^mBtCPwLAEB! zik8I(zVD#%9A9HK9UDjC$ImRQKHx6;OgK0#b0;x>)yQ3aXfg0<8r~eu^fpvhv+#8` zamb&5qR{*E#V*$2uS4t&3~b^n26tE6!|e>zm6c3_f$Xl}*@keRj8!0YPCNkArzUeA!CVCUh z2Hwfkrjzv_8hOodg)SaAGgpH7A4x`arrFEM+vQ`v4_Of3*Qwi?@F%^(12|btW~vBD z#?+K!Ds-*`1c*|J%g^lk#>*^NSS;r-TuzGWOSzD-(L~xybcp~TIPcH*L?Rw5YD~D( z3A(jSe>$%)3JUH?x7O6RbaZicvNbdbsab`h_lGlWwJ?OBXBUtUjAXSt&Pi8A(ze?21-cXjlw3t~yT2WqdLiya@h{tn0g>E3?eWjh6n5B&Y zpPat8DeEm#&6p?+Vp{Lv`8qQWR{QMwiu{7siFGuzMT?qNBRD-L$(i-~dC_cO`^?8_ za~lNrt{wCmw$W(FO!Sb5M$NB!p`w@15Cwgh;k)tGKQ2kfRMr&4=yJUB8bEAK z_tunEG`7`8Dlp4r&I~y}yebgjr$b32WT>HO9GH^pZ>Z-OnN?k1n_|Vz?E-9gP(zHS zqU!6BH|v1hDB!q;gTXgEkm<8W$|blCK>CY4Mft2oFce-NrY6Wt&%nUQ$jHFRB%qA7 zLEot}QIPjMK-ooq7GnA6in@xj^2%la28X+<%PSk(>cVB|r87RX)!d)#@5(lKdYRL= ztfsbWW@l%8ytb&czOCW4vAA4x+n^8mW&Yqq3z9o@MlMb|DmG=H?Unv)orlk~Yv&Kr zRP4>Rdx+3E;$RR~uRzS|-;3GCh!)eQ1ge=?cD&To^q3wq(9=*cX;rNw7NY3xN)>hG zspb0sX#r!qel%x*2Tee%;qVtQu! zmoJ6A>Ot5*#<2L812KP@wpS1XOdZ-a)u>& zFkb%0klSNjm5~CMpSWNb3{)3mCM>KK zTbOQ0e(An>b$6&D)4`h2(=bVRdT4SA>qUC0vP*?DMv?zallCdOZ?ihmL{v;Ct{_#9 z@W<;0mAgnZxYO#!-|uYNqw>t9%3p5-LXVp_H_k?W#<$Ch(^OKkFwj+Ubv0w-HcSatW)cg<4EZ8`LS2#wEt|QAn{}YQ z1SyYeW2WrYr?xeziY#LO$sSCMx>$FHNnaWk^Uv|7Lhj6`8xYgTSSpEdYMAOUv02v5 z4hOK3$VHXaRhE@kG;bm|a@{nhmzfqIe@_g9Zq5I1GC{FtNR!3QgiSM@bl1U#;a+#;7%L9_s^z#`!j5l1o%-eg*A7iWPLX z=5=D1G0g7WpAO-^FAgL>M>RRhi`mDIA0DVk_|{}kQ@W3yu%vO>r`7M@H_A;8^71qlp(Mh8 zLCelBAjm;+9gi~sLuOOCzKU{sZ^tD^tmnTAgZssXuV}QBW_EGn5@NbOMv+?veMr9;j&z6t2;H3)9^;E0x@4kM{TI8atLr%ZX~>7Fs+|I zu$_Dd1~L1>iI&u+6|vu>aGxw<9u41^o1Vt?cY1nu1%}>?p}QfAX>BS?fl0Cwg>JT$ zVApUiZ0YOi?ipSAK<7JTO+e?`)8;}(?o^Y?jxU(il;_0tN;$K8q`$j+a1JMNei00s zJ*IZ=Z+9UhbF56^e9jdXZ%6sy1q~TBk5yLR{^!78Unm2C3}E8FkR&dmos1*YVT(sZ z?!b=O9tbfLP;$qd|L7hQDk96u^|i$}Yc{{W-5<=)tC5hM7MC|XpGEg0Y1}8k7u@4- zB&^{FQg-#=Y##qP z($L{Nwo4>|gX2{N8HrXpa`x7mj9i9!TY}cjuZ=aoATU z3S4~dIxvzSo7Pn9!$_-Ei{tU*6klGyO=;7({z(|jwdK%?E%&i8kIF65<JhK)67f`jSva~}ofN)L951u;p94}kVxZpo`0N8Z+dS!?dhf*f69~upwv%3y# zt|hSD!!`zPNH!5uN;r^5T9vL*cnq&?fJYl`G&=rDk%14!D$ENEieHJ3*2`!5~|$_RsDrGy-TcQR-rAm{1fWAsf&; zQ6~6Uta2L#2TwO-25RxsGAsJ_b^0=JTi1>Q?KUXfAP@c!XB#-Ku@+%qa(6yWmqsC? zHo{U)!?j=mh8l6By02T;=Rrc}H`0@-BV$&a7Ub!!Mfa55s=R*zGeIEm*7hC{Y-}>u zPf1RvWbGsvM6`KJ(@MFwE$+V=Ze6qjw|qGay;Eqz`0&Cn=g$2KlnW1OO-2BXX_SJb zVtDnzRzd77cNE3jt8$XjD3r|&dTU7=_?It1k%Nve?rJw4J5lS=^moc z3Bw#lbFoqsT4~L$)FkdB>vd`r!g*aaq3TKj0Hv?SGSj~egB=(cbUM-vuEkOl>Xsz) z-RI8O+M5Uyy#DxBU% zJYi4w!ln*@!5&8nGKT}B|AhnrZmo=VAl>kG4&7PWw5j1(fkPPN1z@m({VG%TIuecC z?~3E2l*q#{;VUD}83DRfH=i2TEp}Ow{qi%ehiCu!E0KwV`m0xpNv*S($EJJ;E(;X* zihTjC(!3Dpb^wp}-&%fk6^@jTt4scW0&P-P>wiPz<0gXB(5V z+F~=JY-9>E%SYFZZ5^%y5)OsJ5U68da3R;8Qzx;?&%rLPpxlsKDYPj!$qf2wg4n7vj6ujeTkJ`*FxX`86W*Ce`K`$N# z-r#m%*Tag1zyFb=9DJhYY_~=Vk2Zb}(EEJ=gCNl4*ed4D`HFBQN!5a}26aXrkE&@D zyhr!O-^jw2kA=ZP91QBwC@Qq>|{ssn-qbcSb!bT-yZ#y6F_Y}B^@Y{}`$n(}(YN~r@ViU@v zw#G&P0N9yrv|yohsjauyQ1JxP0fWM5e!imF@Cg`%EEV{O3L4j8dQz-Td0QgB*$o4O zqgWWse-{Q#>JNot=wgqrG_6tj5mN)p7rXzo@oyJ5;jGp zPVz$bNt1gg!r)VC+n!DIR+aqOzy0qM+5Dzl7f~^r0pu6Mpu`&(v>(_)gDPZx`rCH| zqLFc)qOuMcDQqiR@YxIFqD_n-gMzg=KRHimIddEguJ#5HoG0`hM{k$fv5Afnd^vpTM>5SgoXVfZ47KxZNgV-wTSU;x_27=wFFhYM&Y1nw)-rRqsZ-Q z@oNv9hY|B7-lBZU#VgB!Jk*krZ4mgl-P7|TMO*9b5du_#xts7BbAC4S)D_5p1|FV9 z4H&jqsX_A08s|+r>dqkO+A_U+cr~$-WAN}1r|J9K{x27yy;w=>g{ogHwp9dH*QQ;h+*=B)~xP~4hnr=**9 zv{I1vK)&a9Zr!9BV-HT`#e5v`K1S z47Rv42&HXqm5Y(8Hq12}zPxqi>NPwviKs>(A?93)+Ou1CpOLW&uo5Zb0v9Z$N{E`} zVP#h6fEOd)xgUN!d+{!vby`18qcY}1d4)4_>14Zu-8#A3FQb7x&eK)CZq}*guT?Z7 z2BxZIDV6KiN8H&TT)lDYHa@*+LKlW^z}2p-&mKH}!6r)m8$0{U_Sc(uQxrKM!6hVK?aR?-eL?j~L{Wf-e52X$m3&EGQ@n+aLwJxe^YdH3p1c0! z83CPUITix8yHfRt&YvSz4{XPBxv(<9AMp%Ej>C{rv4`{#ICR-RrJi5 zIf)w_b)n{P>)(K(VFUX2e-q_u(e#!6G;-??#xKqLsr|GGVsYC!ks`6~%t z3QEnW@#SisJ0!x~qz`W2qLd4tL!&24{P~{Wym967-B*^4%g0UqY>qm^ldBglQ|ab{ zvG)Zv{t^$){&bUGD{la}4~KR8vfjIT<;G(PAMDg^cKNH&-8}pAW3j-oZQz1zuF#11 z;<>8?Y_9oJSjjL`nfB4ui@#Cp7XW8GWTnDe?EcxGZZYZ=4Fd-Oq|=+_&Xp@S@n!tm z4_JgDS9&40)t)YboTAx4PiV=Qn;ndy|lYO4OkX4WCXjV7`6v{7ovQ zjJ{QDm-asAA|CZMclYl+1fH3ionM$5scU8p6ahoP&L3)qid^a}^fYyDKjE?jy1ltLJ+rbg9xKJBQ#AQzl|Og1HOyBz%Kk_T zJk*y__ow^${>Fvwf(PSN8I^)ww77=asRCdko9mnr|9=L9lx~t1-J5{WG`q}9;XC+AyQ9(hSh;BG~ zcV=XG+oP_cJ!S&pI8RN{$p9pj@@4<&~&ktZpi$>M4G@_z{f~uaGZP>qYhCjXiS6fQn^so@q!@l|5KW9o?)L$lb;AxJ-4`yV&t+ePZ zLMW{4p4x)`{$22Sd*TyMq5iLL?2|h1*P*zRhwyJD`md54P+#BP{}uE={bdLN^{?$W zY@#k9A--i1sCewPog_OAE000Lf$ng?rTplIbt)A*eIMP+U2&Wd$)2DW{+HaV-F-J3@ht ziBrljxeaS@f|^RTlY2!^!@y%yu?86_a<&Za{@DBb6PfNByo`(z&cz#8mCZ&+m^>>Z zr;JH@&n|kS$jmCXfBBuUZPWf(s*4&A6Qh)CDF}@Qw>T?U)_jCp z-(MbxGvKGAWOK@B#od;prqXrz*f{uQJWCeQuz@K5fSl%~k9A#;ZQ%e`o3>VEFDJmk&SMZah#5gc znwv-B&_`7S1F=>L+|0~!UbTSY2Zflc^_5~~;8u1h8-t-2Q?*Q9&wQLC+^lz&W}$q^ zB4-&lhIex)O@`BYT_RtBIjvG7P(#x#|t_(m2?eF+gDmfGXgxv5F1_+1J|cE(~9 z3^LbF7GzMMb{`cU8Y&uAQNz@Z4~+B>`@_Y~X8v6tYY;M()`K3@MHT z${7|MJ_@dia?rDgodu>8IbN8On(jjO6H(HkGI=(`TGlGOclE?g*Ka`j+%&CkX8YiY z{jnH3MMdMpVG!0GwnO;_;bo)nNCW0EJDneC;a77{XM4g2UCGafoc&(fxj=Bl!OFnq2)Oom;teD|a? z1=Y3C$#Q`uQo@^afyW2H~Wjf zk_>Cw*=bd~_uO^j#M2hK-l#+V!nB}0+eK4c$9D(@iWa68@-FCVO;;f#w(En8=eo;D znzfv$D%>k|P!iVjuIel^eDPGZ3WQj%)21M`C~VKLR~0u58Qqz%dr4*1xOVb+zY@f9 zhrv3xv#YJ8tz#YsHyvg#B?4N8CKfiKpwV<0GOl#cNprYe8eyfV8UDsZ3Em)Z0pFu( zps%ZYcpB60N{phAR&?zq;-n6&w$?Vab#%5>Cn%E=o3}uqtHYh`odYAS?)3NQeA@Rx zHH!C${pL?x#FhR;KKxg)UBf+{eX|>TD9G|~Z+9nVJdK$O4{jMWfjgtj6?AA%RKz>&JoWT#$mL1hJ=SuTLEV916GE$C) zEpiUg6J`1qWi7&2OXVKFj9fiw4p9s3uN7bM1k|*IDsW5qmaHKWBiV8BiT0G2sIjJK zn|ZdXDvqybU?+88GggXG&@HQ@JxlG`GxLtU^?}^T_~Ndfat9u&S1#qCoeuSTj}P8i zZu2peuu46!S3+Vo#$E;I1(MfCcWR&#MIr6i&2uN=cE2G7bwKwUSlHeD_+7vyo9sFNyNX@s39N zNy!5`VXiLJ&^T^`$=ok=Rdz4hoQb~qgUJAJG^E`EM?u4=hNqrpKIwzNyAM(XztL?b zF^Pk5;v$}-r^;WytGs^NB(Ndm7Tde>C%3Uj`Ce9z(X5p4t=Q||nGVyz8Rpmt7^NRE zSJSnO{96`JP6)e@sx06z0;pgkFC6XtTl!xp@*0%0!W2jRuHAC%9w@X|GY4Ba<7=$$ zYCc=XGIw$$F6p0nJV{GJB-IOMK-=G@I zU||gUT)XSBz{CuNI~#{rp5Ck;6)E4=1NBSjWP+u7RCP;`xlv>}*aTrKj`M4SSBJwM zT-<@+yC>82^qec_=(q-h%j$(EItm@xo9k=smIKK3jZ{M^pC;&1?ClFSZ>a3Z#uOi! zEARj2qsu%G1PoG_nKW2Kn5=rlX`cmLyP2R)0R&7fsI=lXe6ciC5h8Wzx-ifAFK-)_ zE@7C|LEZ1gTHgfuV2HR*^!PsEMEf0%*O2p>1HP#>#>hUhcZ+yJy|`i5>)+T9oiX?( zZ2^PASt#)8@-xv}mffcY)l7tmX>9Wna7ukHoFdV4u=R2iQR}}BOu)^A+`sJ((kGGKDbp9NVQThh( z3VJoySJn3UX$%yqR+~$^917Cy3rkU_g1+oPGne>IfRLf-65s1K!{0!byRlwE7m?cQ z%BArPf@SvxCoMIH>+46YGnt2_o@#FSYtwPJ&l&dtfTkRkI6csgXiD=l_c%kAP6Gkp zvlZHH$4W5kxR6uRByDOV8JyGr;r}G?G5vkerfmZy?A&E|-lVPtD6R5Kp zdd5C=GbdU-Vfnez16$y%2opsvcHZ^91!@8Y#h}{9obbPT)e%&EsUXoaAob6;R~E?> zA|7!fi;>fH-g+A8Z*~zUb}D`L1{-7^Jkikzs2B%`Z1&NE5C8m^4}s?|AN>Aon=!;ouTuLz+j}1)2dV%*$ zJW}AX&VpcQO!C3}B7%50_57i6=3rltsd04qG${NSQ}&ncCY&193`mWG#lvS&7TnSS z!!RbMS?P6v|AZw*j>Faypc_E@A3U-c8rr}_Q>~;_@U(o1@ zY0f|{W%?OAxOf;CIpvR_nPZk;-ivB~%KO=EpS&a$Ws|5tZ@VBT%{u~4)z3vg;7$Yf z9kp6zE}&j}TIPY&>vLZ&rt5{qWr>ti6(3e`#s-H?KEE5?mc;wzUGJ=TC1vk%fP!;O zHQfpa(JV&Bpy7v}s*7odNBNn0WGyi_V;@Ka*2W3Fe?pGQvN(oaI&woinfKJjYm$B4VP3% zL%iT0uLQK`iC$C&>dL7yvsbKnRr*O~inhFSD;3@9U}_)lrF4PIttDId z&pf$vwaQl>1SNRMXz812o7iV}0z7}!{RU^msWQYk9E^0e4)Sx9Q+IDzB~$wJKfC4p zQ0d0^7w+nZ*RrRHuQTJeE;~5MMx<^J<(ey4cAnZ~xK_LCQct?`G;Szlqk-vVIo=hp zYDX})Qx&h7lp}EiT7TyF`EJ`w5ED-p#9IHgOW64N=+}rhy(#fDXRI zdc&d{=Vu)M@f$Apt}}Jx;Dxz>W%>#Ne4PsKvbZUde`;=0C*q{lLK`x4E(ym%XiUUn zfxv%q{O-fgE(qIKuu}zC?6S-H98VNm(xGYsZ5`jx>Q{2q?kdFQ#ONCY_c57Efx4zK z_235W=15-Ds+%lTK7Y$hU-105x0K^rS6FOd#^LhaxQ$aFY&N)BxgMbga9H zo3-8pF}sqd5+Czr0zmlk6j^Q$jf3(5i+(pmKp=4FM5SS%*Ion~T044~nmT0nBbk%7 zUvoxvJmvlPrf*@2lB_{YxWA3>8M3&a0W-jC)R{j}I*TtS_xtlIM0e(DUJ`q{Ps8@4 zsEEtE*qLYtc&Oi#4eZ+h?ajCIvtTc*bzEQcu(f&yoivuJF02t57i8@6Y@WHDC?xG) z6(jtoAN{-Xg};@lVUrG-04L#56hKPQsEm`6Y4rWULI(}Qw<^*6lnr7_EmbUYdXZEn zgGwe6i6r15g8#FVU;u6KlnpYlJ6(1+KmK0Qwe$GrE&lO%6~jlJt0yK4owV~*{12ZA z2C!l%w?gC+d`1!dFZ?&a~6LGUp3_Jm=fK z2@n*fMdeHGls(Gv=4A6DC)0?>ev;QO80F7{QN9*m{@?({vNLu%gB;9a8_t@QP?`)s z;`mJG6)+;YKg3QyFr#bvn2K#y`@a>5@A8Wm^5|He$6&e?{O3z%B z=*a?=?>*b2ZLzQOSu;o{e3;u~ym#O(81k0H42#rc(*2uVe6P>rPa`U>gBPoJjiQsA?Xc>Zu% zJpq(G>rp&{9z81yGwayRe1Y#JGi#q~t2tM1;>hS8w_BpY6NexTEj|^x=g@!leUJ>D zkKel*GYPI~ze@3R^_Tx_8tX&Fq&hcYn9arGB$XD%z2%< zGaoCgE0+J0FU)gC0RYnn41dpY{mCjA65*%H?@$PC1EJoW+otUBwC)%KzL4Ri?ws>F z5vR}oJC5JW)`C_ZrXxGZ!uBb6z>x6Uya6*vea^C(JeBam+Z|r-W`&{)#*MbkAs$$(lw1XIedja`0U04bG+GXtZhC3NW)SSg`(OQf@;rLjy0|e5@ zV`p9Ol#Ue`71yHmDSs9Kgs;w!Wv3mO5AHm!O8c^A(P@`j-mtH4 zhpnPF=NGp+;-#dG;=;U4gU*n}^BmM{0qGMWtr7KFYo7GK!|@w|mr&55-St#S%CdZm zKt%Qh@JjjhZGs%*C)xVc{va{Em=moY_!YGn&i9A&N-?1Mwh<>F^00GZeg=ZudCC8s zJQ#`(M_^DGEDjGcF$$GRqp?q)aXeP(rmda#W{MHDTlsU|ve&*(Sf-KM!=fR8z80e8 zE}p-534AVmcY)6{y$d*uMbEdjLF`nlqn1zpJKVpA&yCbQipSXzap=V|liQd16-{zy zfWe@N8ged0V<-KdaER`3$?G>cId5I~dRs?bEnq+kN{j37z{KM|{BQ3$5(iHBW4HiX4R7|lXyIU8;cN$JHovX%>LsqV>35zUMwLROF~?oDNJ4RbqNiH+>BW;)VomHRF^i zW?Na*t$a6K;U6z)CJz9D1~KHrdHW$?{?I2f3=G|C+jAAUw2D@7U^i2j%Upi!%MnDG zkEK&$9Xr8|veRgL|2m(TQanH=^r=7t-A6^B#90o#{hdYs(WoysrzbEq+GvWlo=e3P z%OS;>u)TW!$=ZplqC3q~=F$(c{)KD6i|disf3O7)k+7EIE5}Z^A->H9fj>-EL|a;h zPO=FVJ?t;d%g4#>QVWm;p)1=@*EANi7-oEL2uI8#3G@?>Sbwmdq*oQ26RijE3p^TP z>vQDwj%1A=&xx2l>HwWhWa0^P!MC~J;PC;|o$0gBRaNZE$Irav48&@snXq;pTO5*C zQZ1AOuU$3BW|fnpp9DmsngXSD0=m{&Tq|4n3+bXaZr7lh=2~tAL+of%>`H~%oh$tE z2AMN7=23x$ifhgM*?Vcrb;CKnZfsX7pw&NLWs6f-x0~SI2fV@o z?J%$aotLqFR0}|^JBh;QOxh50k8YhI%Ro1woo$LPKD^Bx$u6MBz)e>~Dgi)nOdJCX zAwB2(PP+~GLdtHQHIH6gN2b5o8M3}NZXvQMZz#uH$@Uf7G9t`IYl`#Vx@A$c%3u=4 z3LRuM5`iUSYaAZvCeE^ht^s@RJF)uL{=mIBWm%tw6_!(u0iDRxzj0Ae)1hpI!NfOc z@Tg~j4l(j%1iyFgIt6od0L9?(SbzzFE(1FKEHt0I)%(~%C$i(jLc=WfH87|#+Jsax}mcht{GoL<0tjYXB0RaFZRH-7nuH3p0~D5?Bsfnr<|-? z$vly?6efPhIJq)6+}Y43a*9Z(^)j&vO{;0Did4I!d|D-fzVOn*%(Y|!#Uw4IYI7^piI(yu=qW*l*+6SM)`h8MWSDV6Pw|q34?2zD{E7Cdu7Zk1DOm4l|H9 zDL=JjiS<^uH8Xa|48m5szp}7b&Dv0&hn`i!JPuKAC$H+4UQ?NDbYCQXg^rjgwpCFJ zFDwaEm$P{>jHaHL(!CLqvO!}2()*LFRb6s7ciLz&Cc|Vr2 z7AY<0kXc_>kYKB=9pBB$SFSOESqT81n zj)G4u z{GiT=OFX!32eDS4{i3|C=4FV9iuR)-R&9@EzssNLx4#u*Ksm#QuJ-vV$v-Td#X{RGF1>fvBD=p*d3dPS_1b@)_dT&h z=u4$`7ET2tNPvx}>E2gJS|O}usPXF*t{~?tqKu8~)5`Omgaut&518bo(AUTcA3VKg zhvms%)CFs%91g#**D}Z+n9cV#wg|6*QV*Uf-&c(+sm_0FAgNn=#9S&4eT}U4!!xZu z-A&aY6OgUYDmOXV;2y$Zxz1h5nEs>V#ac&2g`oVhP(5X!$FY=S6r-s6FA`tqB> z5~=)1mZmn| zajlDQRdjC?A$uz>N>8tG_d z?dX%+`{sq;YS05t*G?#MA|oKW6FeUHOmSvr`vQ)M8BYsvwzjf+T)oB)Jea9ZaxpP> zj;-E6ok=tL@qCe~xOVyCYE^c2+YGn|l#wL2_#S|~V3RMs%}wn5Q+n4~3M+EtnV*xj zm3?&0o7Er=GmRB&a>rov1)hPmApMXLL!}9sZTn2xX3bN7TQhUN+%Y1{fIJ$@_W}kC zd_J)8MyL+1*XAa7+%#;uK0Ui;5!~yg;z#lIJ47aBy(ZWmSh7cA6?Qf3RHizYB{ z<)2_WpSYO$WGyWm-n*ILtw33OLSD9fhW~QblW{yv4m%ziNAGH@{m3Gd*9VtcG z=zeCRX5YFrm7DxxXami%RASwq^zSSbx*6%}8JIeS&O0dNsTguOMt+ zwT7C>_6lZY=Hhl*^OH*f1pv2D6z${WXlLu-lhqFgG0>IfZfR=i7Sl8jJp%&isM&%` zEPZajr!=GN6$n_ybe2y-*THImgQ=CRt);1vk){9hfnCyWcV0wTSX6XU&hx;?`ZGd8 zRQVWN#MJF9R{8~%v;In1u8oc>2M+qED>vNU#KhxyHH4jpQPk$E zw1iw%?(k-FTvF)*jLtmlh<3KNw)e>BVwo_cowlqqWW5H$@<44t*%118@JV$399SKK ziR^mp{cM8DBrUh5x|$d}MU^hI>W6Q<^ffaDxRaHMwdeE3Gh2Q=MDV^#+aYQ)!|yRm z%pev@v(o!!;BVd>|J^`C*kogR`irT*T>uO_Sdf-oKk|+WzDt3^m*p%XN>=Ho{QXsq zzqX=rQr8mt=R?C#14a1*r%e(5`FK?Z6~EZ@qG_G}F9&B57CI_l&A@*_!o^-odeIEw zU!DNvV4<_MeeoBhLc+Uq^G0C*a?CHC0H10q?%w{_16;8awZ*-w_khE>|X9F0s^dR5gmdHf5~llNQF3#ak_EEWCJ$>NNk{R^TeFK_txXTq!*3_6WQ zqXK#$1GIwa;7r*6eoBmZI2?v1{w+?&Aj6O0XxzJ)1s*ci(bCv4`8u+YgxDVKXz5=* zApTqDsr~x=`uzI*pM5~~18^fcjm`iabN`b$ET{aBOePYkWFn11VbCaakRQ?j;qhxe z;;+xI&#%w_KL4XoC`1yOOr=r*F35WR=Xepo0x4t?g@_|y(PTV^#RiFV8o&vutk`J! zzxQ7LZ+ztc^*R6lYCiw_OZnw0$iLwp{vS>Z|EKqmKqRBEcp{MqawiIv&f8+;L~@3PTpkSeEJAOGcx>yjartE|>O#U^~0zxwnu z9{UOeoiLnjtYFvhuDXE7gO80KeDlGdE^8z%V;R)_dJE1ke*2r>eSAeWw)KFypRc6g z*|v&&$5vtn!i2v2{EP3e8zc;aGllkr>G6E?!Jn^aC$ABiuvXI>QrYNtOn{0Q$g;it z$$xYF_mzj0Gq|4!E_h#noo#&8^1G5T;a%Rcm;e07KYVmi^RE-I>0_>!c;ntt=Zmmg zrTX0;|NFh)eRNqirU7*MuD^7-fBw5~zyAE1eDD|o-t@%8IPlfaAHs2UxWUB_e*4~k z|M5rlghf1qNyAO#nEv>|pT6YOO6x~3H<9asF^rmb^G(*|Naku{^FK($`FMK zZ-_Sh@#EkB_isMnw9MP3FgL1GW7qBmLZ(x2b|ir3^N%XN5$ETzyMG6j+uXzrdo`Ys@BRN9DM`|9J5Iju{; zFQVaQE4+BVc#q>Z=PYw4(6gbp`NNjq<#l3g)wb1g;>0aEIN7Og^`S9 z?YnBH!A9cD1it;?PZ!nV=TTH916gBz|D)gh#}%=MU@X*LzN)fE(<1yGK)?<~ihTdY zSKnW?c{)U=5pWn34o@JFfPbWakPSB16mxKJs6~JgP8&zC!y_0Jg~j0rI1-skqs=cJ z4L}fYFM&bAqu~ep7}y>Lc1Xm)sU#eoN(6L676bg-`X}%P92ShkVu0!+@c+EyMXfd>9+qP|Y-?nYrwr$(CZQHhO-nMPM`!H4WF(32ulAm3tD%q*z zB&o{Ud#y?S==TUnZVexwaCewk+z`4R@hA$citI~gqPoL*xIxVE94`waf`Z7D^7`a0I*g{VW zFE1ze01)nkS7}*O{6`Te$C^AU-Hxmvrbke)J;st*rUM@_8`|538?(J`U<2 zF{gH!^{EIDUJ{o_WSGP-q}_?u#vV}Zzbr#;aC<=*hT_Bffx;pulG{xe9ZM+z$fXGo z288mP{QHMp&HX%Be8KlcGD0UqRk*w+DhtiV6{|%PSvR*)lO5ZBpdk8{@6@SqH*ieK zj*~m5iqk5!5j|MtjF8$wy|^-SEh4mF1Hy!An^IY(u?7|QK!6fpK~{g2QulQ4FuTVHR$Jz#Wnw}P*5Zg2))3Lq$uVutq_*zHL`@ah}S z>jL~o4;C2KZ?Mo>qr`9&CDhU2iLKWVrT3aXE8nGIm8u7FT0N5LMN#=!f1sc6wIyGNtDCh zrfxJ!|7r{xv~3HMyc~OF_t4|HVqt9OVQE^!lCHMy6(Mo;+}P-|+3u^zV$7xY-l;sw zbWqQ?BfZtxPAexiTY0y#zl>$b^1h3Hp#y*-3e8P=qub|j7@KXkL6$3l-P|{vXFoW4 z_U~QZCYrmE4WeF>TK8aH;Vpj#ehnzK;gh<@WS7-cZV_qOxO(a%lw8eVO77MdG}Vor z!q3_malx$+p)d=^7BUQe5Yns88#UNlk}J{g;~}hDfK0KGWVzWO68i>LsHp32zcGo)x1S z60Cnw+s(>@u2U*D!@AwByW;iXzJtb5ukJ;?5_5Bf4k$u6PQ8Q(3?qEFB*b95?-p4j z(+Bl8eU5~As^a>a25xC&Tl!$wlv(Kga8HG6liwv7tibal1Dt(C#zv7t;^&RV=x_E~ zg#=|qCwH0Y3{7$f;s~6s4JL`mK$or>OV3(}QnajDAwEd`h?5*A3|j(wbp*bT#%w8VtM6hho#-4`mxs z&ct9HUcl%qtlZsWX#4EP5xmD=KJmZP7`&#wR{~r`6)GY)BUeT22%$BRt;}(@eSkou zqZV)v>VJ&>3fTE`=Xp7}RpwQAIUjEWy3*^NIAsvIhEKo9XNHC!BWQuE#~z@=WAK`e z$tJ044XzwzcOASXfFNs}20k17LZ@ky#j3u(AkO!MtUUYRphb-#QTStt{g%;-m80-W z5Ej;}!+?bi9spzn5hsR|Fh#()_5g{3$a%9&`AY>vZ*T?DDBRg&LCTZ?Mj}4n>V?nW z6}`i=7_&TEcTbs7Ona<7!sET3SZpVIE@smX)u80z7#P}}TACv&=ajy2xNVa~2#n2u zMQp?KO?mCrHLkiqw4$TeR}nK)^`%qRcLgR2u$975aJS|Kf6v~8yC&|(3mN!F{IyLu3pUA+8F zo%nn^?housr3{3#uPWA=Qz3P!5t5rhA)%199~SAkuq1t9UY-<@*VPm0>#kM%q{p7L z(H$6|G5f+=4^d(K9XX?P%tXVNQeb^C3DeBxC|Kb1V8RLp_>6Vr@!CSS`@{gR_2Jg0p;BX19JlE!-@Z8>F3$r{5 zYT_%6E`cq{&X+QGg_o;AGwr6Lc*@FF>5kSGL%}i4xIxjZkgoRL<^Wv>^2m0?;i($S z%9^TDazb*OcZYN!+%c9^1!{d_x55}Z6m|2z;31XQ0i`UMm&v`+g*C;*y~gyC-1&rf zQ>_6jbaoRUsIqYBQOk%d2J||HTN%2Qa71~K#gnKZ+H7JmxfIMr@%r}qki4o=9V#wH zCX_0|34hJ;ZS=r9f)(rhK8cvyqOpBokCLwBe+|B!+W(x8Dm~x}N%zCh_pY8w5h#DYAJuqyCdiZIu>X+w9)f#7Yty^m}>D)wCT5 zBtBils=@am4uP&o4-Bqjlm^9O$IpN0bA(E2BACV@`8lccU*iQK7ED@Tt+>LZ`KTCj zFvV9}J;dhe9rlf~9(CO3Kdj>fbRf`s(7D{mNi8p6aB)||?>1I<(xcwB)3_7$#r9qN z_|zIZ{hc&DPG1UT*TgfJ1Ko?w}f*Jyqz z&9sd|dov6C{Od&G`=SC0q&Et5la|CteylTewVYDXn#g`A@AFa+1L zOj(sFn!o$*Ax4UjE>ipzvkQwTLiGQhBESO#pVW^R5K6y?-w8!v)r{#q+IOA??-*>{ zE78(zQa@tE;YuXvugc57vpvFC0v)w&z3`(=?gYocbAGVyZ3wnF&v3Ki^v?=9bY#NF zkjtJ`I$fav5GL{9Ru$!GZ<>DjqTK_PmlJs&d*G`#O1W64WLdVS%i`qB!1v)xO*)+0 zzR~Y~K7baX%$kIRNbcvRbHA%_Mm1*D(it~>xaKI@s<92{;W0Ae3US@D_dZ($n*~^_ z_mgOUWo=zcUq41+g2L{Rkvx;n8ZjHs|X&M>xvAYk;btx2*JDT#o%Tq+0sm}F| z)zgF3E;~37`-C+>nrxjIfS(zB5Y>kvYmhw<8bIIw7kgTZVkGmrCh{AKGwWo(4d?=m zRn4OLRB8>ZkoR`SEX?6tQ#-{%iKeOO7bMll@&<5AGf}E|Ke2FV?7|X7>zO#&igVFJhm< z(F9aDSKV~qLAy=Lck7z-XUC++Nc2#jX^{VSx4JovrMfek1UL5d+-dRmnD!xjZokfw^bDjD_+OzXMCv~K)#oWG-7%22^?95GX%eKn zr{5T)I(YzCfPQsb{#K+ncyCJ7l^nyO3QK+S^Gr4nGexfCzC$mlO4zUps8g4R)J-HC zmmH@6+`N~Ap7YgMP#txcY1Op2L~ST)+^_~^{fb+Jt7-zn7odG9uDZctk86M(Slz!g z2C3}u6)In$^q|XGFNsI=7buPI5FI;GDyI|FC|0j+lR3pEH29pEZvmt{=-k64U+O+} zmdkvH(E<8vl{26vPOKY0=>HNz?qxSUqu*k}e5&){KZ~@l@HETCF-GV1)1$9pe&|d3 zowDg0=NV`)Zrsq*psazXsXR+I&0Y`Jsc>xQ_~w^s4H7{qt=0UKqlN0TGIj0AV|^>38|3z5>KrECUQTgQlsTkdadNAw%`ov$~4C$q{fC;*j*##M${#| zJqeHjI8Q1T58{?hcBJk4Pi#PB&-h=bSoIoR**eTuK&jyl5vj_8*<57Ab{ee zfh6&&oD`L!LOVtZv}G+eEb;K7`_*G{y8s$6T4xe3t4Erf%r+K&S~z*UKs}VUwyrij z_XB}Pwm$qF^HQgCZr>S@txi6l>LjfEg?Ce<^*_%z>QOJ*};;nZHH4Frq^n2Tt~BHB%dGM z$$WJd-LpSHw{WsVZ}_5Sw*Ga}azPa`qCTzO z_2C3{wJ$6laAfH_h%1xZ%c(l2$OlFVF_-)BzK+3&>2SO#5py+v@RvG!1x2%-JUh_ z+aXNbf2c-fz3kEm4(4NQJR9#qpJ^k#gcdn8ty3tf@j+k9B`&&3IIN?>m7g;yobr~1 z@tzWJyrylZ_j+a2Bspx|n_E1DEwdlL@v!z(r7=Z_$2z=uW_4ki;h{ErkiL$^rGieA z;4esU_AA9wiz$7jotg0ZZt;uE> zI6OS7;$;~XArXEDfpH=|Alr$a5T}(m4ePBX9^3#xYm%1jfMi0vwVzwA$A;CEZA$yW zudXdGPTOo4*VX3UUgmuizjF) zq-;`*YAo_bqOBFcg7~V1Tw`2}vb@4VQ;6NRK<;SXwfYg@$eHM&eq?99uhc9TxYi|g zx1q*QS1uh~&r`X9YL#$>>LFVIjhS=u6r5@+a=eA*?DvM)VcWgjnr8*ZK+} z66_jM8P(OZ11N{eRT(`k8RY9q2YcpOX-P$0fo!?qzZ!g*-rES}w1h>~1r@cn zSE*d~m7(;b_YWR2`XCAnCINRE}2j)p{<6Gmlh&0eTrRB)(|6pMn9(>5W=l-!7lzw$DSBz=T@qk^K^ zijvatYW(y@U_%7fsO%As5R#GMR30X-c`MSQZXCNvu{l7A>r{R= zOe6BLii(n&(&EZX=Np3y-q|;#v3x%S6r|L|ltxafL$ExkmzJ1{>~cJnj7agY7F_!K zrH0ELE=HT5Q#;4P!z3di9`4D+T7)QMHk_(*@u!PkIJY`#E>jkKEhMFQJAYrmn?Gj2 z@GTrZTZI-aJMtQR?bYmhvl1Gco1=@%MJu|&~n zb6S+o>{!zuBL0OL2u|f=T6LP+BP7i1E`GO>iW|QZ#n1QzT2xGQOf^X94`ibb+7(=d z%({JHZj!LsE44kYa+nl_C$Ojw5UUJqrB97Do6=z(CgmqcNAVXKj}SVzc(wbz+xm6? zO*PeDxr-nbz_i?_eQn{-$+5|NNlu_Cm1iDvs$bddIv+1asFk2{W*?Xo1r zqnoK4vXlYCjl#sj#NALIVa!!3A;0RcWEEzYNnH$vEE`cQ0ffZ#$FKi`+t$y?23-~m zrh6vjykVi?{W=Ni2?fX5#njN-+t3%0 z|7tomCR&CbH(x^&9JQl?;d#`bTz6rCLP#XlDA>rVlfdc}^&$SxdqEN3YZKxb#e3FdX7p$$Xxe=JkYItZQqM;$e z0wQ^Q_aw;0zCXid9lPi4EGq`Gbd>H{O6-za%N(tGTrBF(WxqW0)6d27+4$KLRI(3X z6qkB75UakSrS0>X%O57~j!lz@XcsChrY`5<&MqMvA%ZXrsw5!2tQ;JC{48CAy$~kx zv+oiMdw6s=1v7N3^cYz?j)ZZ6;rrPW!blY~&|an%Z|ULd*_b#OSYWSq$6-a@it-%~ z{qFmFOn(^NTf&kpAyKkwOwVpco;ESl9mYX7Rn`{+v8|}XeqUHXDPB{x141I!GBL5y z(^dU;wm@Nuc=Ezi>5BxCbui;N7tZwSjuc>^8+{8)XLomFXKz<%QIOTXCQdF^C~jin zA>yVkvtVJp>BrU9D4g|mE$wYnF*HOtG;{)nr+ZF@{`vXwqeZ&dNhSk=q#Lvnc+PDR1heJ~=TVG*t~1z=*NS%Pj~Lltu;)AYNo@uY5%5u_3}g#6$Zqp`s^n z6XfdpIC9CH6;{U5gDz!U8j*;d}Py{08uBuKD@# zCiw(^ro#HU%+q%`5FnyHuY?_`E^Lf*01Sv`r8oX~S=f2G`i9BWrT3H^(bvFR$ z`+34nR!)kG)ye=UGjf7eTb=`Wm`dQAg!|MedP)lks3U`xp;V(yr2sNDa8-6?i2vjgdvn9q z4F8s~pYWoXSIjqXQ$t5bLrYa{WhY*U4hzf~m#O?}y=FG0o@);ffBhtWI`5q7CH?zWYHa&^F29~Q6U>Lx&j`aSB;Oym6vAnM&V zcHoWG?Uj!o1hlsuny^tE^0rWydK##-S2 zE;4Xsb7Qb~?Z6M51xDimE^BIX1^{de09>s9X;OsM#ahv2US0_NVM2<7N! zmG3IY?|CiMrS_9?i9uP(1gNuJ%6Fk)$2xJs{90=PN_t%F2;ool!z^+A} zo5U6`0{#Nr(be%P%L(Fd-wy`VwY`r$KDd;@{B(1}_*3WKUwJ85B2V!v+gKT6^dFiJwh@^&8akHK#nxs^tD6nWIAR>w8dxH|}t#)L~^_tdwaxEND~4IbxF zyR?KLuRORtK3imx$&-3)ZJo6c^!f46x<#~n8d3_v@o~!Ir4VEN<;>0EtGmeX`z^Fa z3H$(hp1m%sm7ka>J?;ip^*@R+d3oVgLcnR3%^G->6cBLld;|u60%=rrDa+EE?=KL9 zBvQJ}LO~$zSK+HlHVEfoYVrwi?rv`F*AbgTt$Z(*%|WmZ_Rw~EfnRwAuYFVbYEYf;GP9?)xX`{-P(a46+Br0r?@aH2Yt`S zc|R2D(AE@|G}MHJrDoR-nmJKg z;=;;{B<&{&IxSW&Ik*%FS^mqP+svBI&9;ck04fT>b|UMLJz65d}OAek7th+S5M%`{Oc-(+66hWj?Im*)P7Cge`jO@fR6an@)MC*J#O@@4=cuNZH0ZpO6oy6 z7iNfgi7}ucg$NWNh;wI14<8O-Syt;t!vJ;qnfl$@!XD-yhBxNm-Vx8x;i zQuM#G9jbWXM8a7VgB4LLT9jF=I1d}EecnAF*5eKHI~?>QdLDP2iLBV}r}Toz@Vw5J z;6-f#9VqoDBsCB6uuSA|9232TOrlr+Ato-}v>IbONt#}{UK+TOzW&(T zh0zd_x#o!iAh~avG2ziVI#g_kbBDgu zchIF5X(*poLP18CTNbZA(=WmE16=veX83@%}I!n;Olyu60J2 zi88L&GKoLqiDR7>XgC{#j}+JU9v2dcICHo#ZLMik<2@?IVh3*H)70Vsz=5N-WbrGJf*u-qZ@6LoKarb;PdUBkD2=Ab<#w4$)O4aR0>g>?RC%oT!&c5EcBD+mu2`1%b;->aA@%J3W zp1P>cbCh4(V6-ag^F`v*V=ym58JJ$6vU;W2No)+rxTG5!kYwR<=DqV(mK`NW^b@kJ zP^sQ&Mx-uvbt-Ts=4&bdPz={@2L^+%H-d&`2c7z9L>=}#UzGh44HF~SU+mC9y*?Di z9PSreCkgJm_MqX?oPi-3k+3_D9QH6Cn-~VQSE?QD5%%4bi1W=Xy49n2NQ%k{3Qq(28kC=kf!{%_ zp5Ld@Y5&8AyMgZ*B$*TG>MBvQc``2F7(bktd8E2YbX>~kMdnzn%uyvZC+bN^SLmvo z@%=yOI!rWL6nm;1JL8hV>JuG~5TJ2K7WHeP`V=Iv{d`fMr)tc{sKs_NGB+h_T?a}c?@;5Q{b~G1gmf^$k>mjODfz*8?6SgC{h^s6F-5 zUxTH}JywefO$=l{EV}!l*LRQwgcpJbq}n`ql@! z@y8RyM;nUR2MFq1cUJ?Xxc&loXd#;&!^}Cx%SfhqXAqX;v2`vY=9ONpF>LLb8ssFw zpQFpN#?ambik+Kzf z;$Gnotga^}R9?>AA7k{*UBqr|uO6zDGe(^%>3${;e z7ehf<_ne!Ipac#C%Nsm_Q93v>V4Wz9J zd2%Ka4IzKwXNHJ{RaUU0rkFm-@!Mb8h>fu`;l++1Qj!pD`Gfw$Y;(ZfjjP*!r+$8f z>6P5_>c@{J3#2RLg!OD)F8rJ#Y2d+w=9wsx4fA}w4 zZ=HyHxgKIA4gqB5IP(r8F!05n0{|B1f<|JCeTBypGK z43M)YCXGnePr z&(7V!*45CryRFv2-K?jp(V`hs zMUUh8BN3%fPYC@VLmC>LMx<%G2$0?j@%yOT-09BG1aVY~f2nw9*d5CB*}->=aGE-x zbbCij?z|EvL{&1&uzwYEd1Y@ks*>N3)mEibxb5|Mct%Jy5<Uoq?+lX%?@mMOvE}S*0$t>4B5Q| zXO;`+txOEajADmF-%W+I1~kml2QJItm7b)wNGD_d5F|6J72VzM44*Gdw-*l{@vB6c zGdMWWNh%EY;W{k}#I~}<8w~oX&GPz!%s-##^mSq~EdSCF6ja@Ad^<6DIPq9?gup&p zCCRW{PlZvi1A(rx79cE`^Wzu{6tcpA#Yhh4&+CWa0ilJF%a@aIgN2aBo9}ZV0tzKW zgY$-yDp8OC!MTs4?1KWSV}LE^ue0ElGmpyo*w}I8j5Bk?@v=7cz`nE*w5fknd^{;v znf2@Ocu|avm^^`8)kB=1?D=srW@lw4qF$I_o!yd<-EOPqrt5GA2GPdOULoIyeTtbA z;Ysxe^|+qHP*o{I=SZ7a^8>n=oi!x2s;OH#>W&GPT#$2HNVz!bWfM*9Y0UAVE8C2H zfpYYC*{h>~(YygY^!q9K5m**zJ_^NhtsqDd+Gfksl-;)0Tx(ee*B(B2T+T3+I zu6RW9lN~PT5ON3JR7b)L6RMdME$c#Tkr~FP`p`Rh4;n2A0Xp3+lT1sF4lvC2oMz`y zuf(QZKwv5d!WhwMD(@DhtOVtDKPaDtuB@MfnC5Ba{6i-tj-g<$8cpB7W9EVDZ6&kv zS}eYr)KM*}B=_e9Xdiad{)rdv_GKK}-Da#iUStTALH^wE@u7gp;Qtja4hpdQAONt_ z&bTU595It^rJ_Qj}A(22}Aw)QlxFU%eg<=Ag zLcrvKil@r+%MKNPnOA906;I6W?O2>Q$i@3^jhCOxEYE4~(CNY(Q2pWnc4*;0fl=7a z?Z8+561<)QLB2n3&Z5${E2v9uDzVlIuG^g4 zhw#59PHn)!@|7=gKVew#S}lqRwrq01 zg*KK9Ibl{Z_4IFH9@+qAxFzt@WVYRW>Id8|#wPEa8hJkXJd@H=ouBzYY0lbHElmnM zXigw2NRpMOqM!b6OSPYYOb~DUcK>Mb~W5}`n_7Xkqy{?XHwPC^3~0rdSS(CU!gO#OJ_NC%Z8I} zdiUhGlv%qiKMbp5dYUu{?kZ{_)q4k7ScoS#UW8k5jPmvxHyJ_oa=On<@@%BbkZ-qW zS>Z-$`8JY_q*lH7ZpECnB01okS_6|V)2lg5`ijgHCGR#-XFY=c@s;%1EV`|!r?(T? zzOsgCLs1$oQJqH9ZTm)Oer%jf8xXsmSp;7f^eftQ`2S2c@4B&UJ0?UF!~x^h z#O|EvXG%X>P}jLqtH;o8ri@a>GXH7l++gpvtc07(#$S%8K-|XQFWz6$fx_A#hMEV} zgoER&l7HsA{(68HV9^-@K}kpIXA@YFR50^>Llf!}Q$`FD)^9q~rbB1LM}gu{r|Zng z)?-+@(-TN>3^s2aIQJyi`cFAUPd@MFp!-*rT3&IKcIwtz5$hqAM#mS- zPsgV)?zq<97KYk!K@U}x5IODU&HJPSP+I06V`Cqor|@@H5Bkg_pbL;ZW5vXwNz>QgQ~HNTOU{oiD{4=3YfV4;B;tKX_Iw|Xdhrsdn$APb@>N#GGB=kH zzUvYL^VJs(>LRZBHMP_Zo6uDlBq$HV29UgtqDo#c5&7Lj^R8_gtf#ix_V$%Q+A=Ak zN;tM3&&1u~i7f9H7oPR!G@P{G=R=1iw(N?98vHv!1Cz|Um?>JaKYPAOGS-;#$b%d~ z=c=zFSh@;tt(5pNS?$ZLC1Ba3=shru*-Q#{i^@w&A$5X5i)LLgt~-}v?jhi&^Z*7* zEEVH(vrPMhDjR7AW(-DyZ*ypz#q%ubi90wgR=vCAc|Rtd3mI3f3rWT}+vys;s0K7Br|L5$AMHKc~n&8dcwaHU$DD#TIW&mdLzcPDf-b>afBKYy{w9 zPw`zMuz^o!c+~0U^&x0?Y*t$1!BX;1s-G7n{65aCn(kByLz%&TZ5GG;zHZ~jANy*#6Zd!$ zsfrX{QnFe8z>-2@ec8Bzma-g>z4oWHC`~7=V`&(5&ph$@RI|-pDY6EP96pNVYnIX> zU!C6SRjsz$1lLi`qiGR}kSM|><$7`%Oq2$p>!FqmB!8=^&AM15JK}>~H@-{`!us6! zq=9P9wnWK)7|n&`#jRyEn*XxM7iQ=>Pk0X;Nq8Rish=cru{#2yo~P~+-dfQI?=VuM zaq$)qq-$zl)!5lLOH*FP@)^I4h#mH7UOol_?J{fDetz{uuVr-}$$JNBb4~UK0DnSe zE-0+UzN>4EVZ|s0MYIQ3iPh*3`yY;qZ!$Vb!DvLh>~Jx-eU&AhU})utv*Y4;94JZ~ zYm2UaPd8sRPClT|RcZc{I_C5mH>S#A88&qYA;Mvt7s_B=j?&}$Xr3E(_~mesGDk+w z!!>^$pX79@3nCU9374+GQRsU;$RDrs1#vJFmMx(2*l6It!MCnQl8lyOi$ z*QM|~#Lg%4`r6?u5qleLf>)s?2^Wm3-AW${A{gz`t1U| zmLT*FiMs-f4UrSnE<6rbKE3_A(m$)-Y`gUGVprtA-c8X^d2JAN0t21Egv^zdm{$d8KMS9dBk&G zu!ikdNs}NdP$L8X;`|!rJI_(P(|)Kj2L6%#1S{=1F<4&^IffZ0>Gf{N7)PJ@?_?mY zw9))vB^43Ag?M#*g^QtHY4PCa{6i1!fzOATvIg!*S*e8V`001?EGhcFGv$kiM_A#~ z86KU_Q&mtYNw>5*k~o2~>8ymhuHc978Y;$mzl^1h2njU9dmSm~#ISqe#zRYJ{EAft zQ`*h+Q@r7MIiB1+T&!IvUsJf(ly1PZ>2ok;Gwfd3Llp+q_K-bsMDoTJNfgoG} z!d9Imz-~tn-$3t6CF=70YdK9LSCI~kO91SA5W9!QJS_{r6|}Fw4?_; zR%tnRf&IoDhanqWUPPW~DX^*N6rSOtZKiiGap1uyEW-FFz$7`@`;{{{rpx9K$D1v@Bs+%^Ups~Ej@ne9Q(c|j!B;W&jMXgu z@7*cA8796g)_m$^f?|^^ErTDkB6!Z@^ximC<;B5(2bk|Ow}n>X`>RzqaF2Ct*R6(; zODo09!Ia2=$lBWJQQAt%F)JHe0{BPh`oC?>|E|>rEM{Sg&%D__clj3JR6x$E^;lh%p_%5oYT@TTCZ6x_zGQgwlDzo|NA0$q?{qoH{ql~}pw+WMeLC8E zbY)4FH2l|In5aNKaQx_@?PgGjAl{Fw@Mete@j04DQ2;ZYHO@i`c*|Ud{$kw4K~(Am zEmD~X4SRv0reO3B4E@T~O1dbeyQ}5MNqFu8HFHSK_fyibgD|D}i>Fo8&))5mJ!bOh zK~`(tY=;3ZYLdbucUO01N!YqX3H&{%V1+cVV$ffmhzQA`2(a87&Tcl6@uA`AO9z?b zC^S0aCHXlF2;H)*VG5)bji1;H=?4YouWQA z3?rr?Rw=cxC8kOY2slry&WUNG;R0?E69O8S*O(&v!mlsuTIdCMQ5;rZl3vl zzrI`>_Xe4ggm}&@N62ehTpeMi3}G{vdv|Sp@X35IL4sRSEXWS-Vbh@Bo=Rc9F(E{` zU<{r?_krADO~a+2?>+2ns|5QGtEx;d%APskHF|~^tJRexRcNpq_sn(@MS-ZDDX-|A zn?Ig*HCaZv!pV1DkJ>Uef4AOndq_C5h7O=fAc)lbnE)>Kx?h4@WnkGhOv5++dz)tAtEKKw75FK#Em(FC{dsg zAepHA<$(#~UtwDcxz_eJP8rKpmOtmmJ_RlMfQn4IvT7KaH@&~$Y@r^e?7A>%KWu*l zgK&Fa%NG~c%d5X9K)ZI#us(D_+(Xe^g8)G2Kl3*j<@sg(FLP0>iwY>{e9K?*uj~E4 zUZ@I{bY<0~JjMue7Ioej%JK_ai_4n}Q^c>%37eN!mRVeoygog{dxr6-Vnnge3YIW& zUgE_m`eXP*T!EGTxN1@H6U6ITqW)Zn)aoPP?M73QeBTL5h9D&qE*46Sf46NZbpEPS ziXbS*Ky(B-pAh8i?yc={@e?YT8&B>NBu(`9=+UY5A3}*3f+SEJ)lI4oBffPXX{?uA5?KIf0sEKwJA3_l3z zFp6H3hn`QvFmEmTKyixLGcEt0qKk*f$cM(oz`)Fli<44Uq>O1phv0nkB06#eGK_y) zpHZ@JZ;)g5JxI|tgK!%mdOJs0Arv>pA>~30)(lQh7Yxc+j{C^NQFXlmc3zxw6cQJ@PO@;x*do&PRrXe zV_{*t8G?K*U(6cju*5E_gQqBBJ~KN*Ox)3E< z*J--vfK`jRYITSbbzw(iclZ1Fs%H5~$fh&E$3HY_+IP(ZZKa$+cR-*r{=bdGlumoY}7 z4but<=JL#6lG|JxhmwQip!r8N{4|#4l@`}{3+7l^fE1%v>OUYr0o}1+CCMV1cCCF| z6SciJy*tN-&~a+}M!mBq<#UW;&`ZSd5`t76Ej3B(`~{8c+6C&>@>DDG0EGW89O57< zx`rnQ3w(B}>03I=3Zi?J^k8*&HV#UT@0&+ksu;aoI z`*v-*v+?R0SctKI1Mp@qSD^wCFlOSY#F7XOH9&v>c@UV`w=ZK#VMRp<4gBZGYw8!! zYUjfX%EZ>#$=T7wz~( zeUY#+Ff)OoSF0RaF2fCzr`R#92=LI2tR`{f4cf8WPH4_~kmt8ixjk5ys$ zzgFe{%oz(i^Z)Ohtzd1~Vo%)b=rN8Cd`D0I^>w+e0!SyE*;i`=bu*W%5KUY)93Vi8UI7?WMo z)ak8MU7GmfL91-6JsHyAx#+(9_B3N*Xr{)>k2)@2r{wrNK57P!QtdX@u8)y$mxvl= z!mbe~LlI5Kh%`~rw!J_?&Nzbxp z0`N#HMTz%^lP+KYsSG;$JO9NfVV!0_YwO4^QK&+qiP*oA(?TNjM_A+!zvI9}HgdU? zVw%smgw|?~ZF9gya~LPq6|~b&Y^LWt!TF|fuNx6*Q{21GEv_P9o1Q^p1fqYV&aLx1 z$+mwye%Wo$ILIhuOgV@Vrd9{8qkhzMZ#5>Y~k(|`3n$5_`PZ?}f zpZ755ekq%qwib1C|fI}HZhcv{F$?5_R|5{>i=9Zpvl9FDC7m=20X4z9}@sc>bA z>oOi95BVt9V&@OQNP$>DDkuU{^T^B~&#Dq67_F0}vDg-G;#vxeNqP_y2x&$WvcfpK zO0k(>YV2CJJzzC7GeIuMCDcV7h2^IExNO(FWQfUs6 zXLalwdsmA8f>7A_JMy&(QYF2at^-x@FM+zN_v2DJ^G++6R$IMz&auQ(f|#CVl3wv< z8E=qLDw|n{dBVTIu;_sGK7zK|{s(367$nIThWU22ZFAbTZQHhOd)l@+?Vk3uZQHhO zYx}<&yKy7-!@c)QMn%-A%9EK9Ctp10_q20jbNq-EQFx^=q0jCb(QW^wvWx zmq@(*ie^VZmW&tUXUdcwl>MwDX@p&hL-=C6_Ubk)p3Nf@-`NZJ?}K zg0kLJBwJ_}hD8AlW$YTNc$pG{-QbzuA0lx`MBP_pi~y;_1(SaI%b*2q|4;ncNvVeH z9!cC;DE6r1%A)0&{#%OF)XU54>E(BW(`L@ z_Wj6KS_K%!Bu2&PujZVERvWGg@%>#UcOlC5E+QCB$76DxLSBk`sFDwsT-e&h^l^-| zYjf^`=(b-m6?tG`L*^d%sR3m^%2jl1-@F{ zon|9&=*)UIMtYNurqtQ^Hfs%i7$_`4Lwl?fEnj6*t!;1dbzeRs`#Q2rbNWY~LkjFw zPN!gZ=b5*s2S$8o>LN6`75us}80WL;=QVYgMmfvNdCW>RHPr#Y-fpSu=43Ps&rsZ+ z>onXbPl+&Ls=S(NG9sFMmp2uNOF+x#(XwW$W~-A<@rs{3cd&>Q`p=~k=)YEepT6Yc zRMxb-%(vu;f3G;UEV?dE%t~w-uobo5+=ws{3KQKgB8NQNc&+F^x@&32fAktb{q7Nk zIegm4E&+MJRg30EuI*ImzLnP^4U-Yc`5!T#Wd>^oDy7!p#xO0M zKgF+RMh#k*t|#4>m{qA&uidYcD&w@z&*y^{t~=_^rz7R5xw#b}{J9X5u7T%lQ`;`* zmb5IgTh2~XuKPh>lpd1o33}i05;bW}K8u2B_oO|bY^b-+eR)Vzq@7h-L)(a7nLCsz zA6t>?B} Av8)PrW+gE*Ja}Nle z1_OTLCmf?`Hq(V?)cSA13*0)4tVnz_c_eP(3r-_>r1y+=Jd6^yqbYa-O+Fr8=H@a# z{A@A2tH!3dPW^HEHd?!tUc9AYc9PoG=_e+nt57F_%=T6ywJRiCfGpmK0 zn;H~4t)oVyUPRHT(b1`2MV8Y599L?CLJos@Cl>H2S+8(AVh6A#lnz;+xErQzmlJ=H z0}|Hd?9Tx<^y*@d4{h1xe=^?V@CA$ST}Q7Fc>)(~m|tpw*R5De9Y{AYzn4LeRl3N0 zhPFTMAYjw3P>6N>U(vz(lwqkt?(mLJKF+k@&AbuQ)enfeHk>Hkb0$P$O*@81We!Zl z9GKc;k66aGwNlsgQtMYh?Fe3~qek0hjYz8~1L^(j-77rQGy5+Cl}Tfqu}p3RGIj3r~0J{N91o7yd46#DNV z_H&>SOT}@B-J$%w1)hBf9mAr!!^kSE*uIUJ4NNKceGcLea+KX)gU)pY<6s)IOv^}8 zr@s!*k6We!O$54L+h4$KH9Oq+LOWcLt^JW{Jlh$<6tcqkyA;w3$04*)b~gse$g9d9137gEZ*7N39W$A3T@7RI1dr64X`rkr6n$8^%A>udEr|Vf({zFbX(ocga8wi% zv0A}-Pq0+v6IKc!f&jQPg0eipOOV6*$$4#j8+`^jEoB$RSc`f|g*P>V__}WZ$Q5b- z{~c$taQr{w%>UofKO;Na|JUeWNnGeBpO7_lw*JM+_H$09|C0)^GqQ8A|IfJg|2-AB z@P!aSQ-5lHw{7}hAGJ%IB*RX^Oj_{=W=q5_tYzo^1l zPL)Kscy=DQyss~_JPnL&7&Ys&Open=?>pJ!xZQv7=oOKRvrEL)D7id^2ik^VFw}-{+ZB6+>C*)E*>m+p;9;tQ>M^By{1m9&?gOwkO?FJICz^8 zola+Eex8|)O^ht*L9S>M`Jv28URI}xdguw3ro?U=Q@;dMX% z?0ad97agO~=^^>5{^|DTYdUtppphXL`%>RH5wA`;;xy_aWT?F9i>Vm8>t3W=4IX^f zh4rnaRbGbB0i&UJf@bxt8vC;oJE}>Z2IHvDrG86`H<7xB4!n3OK@TJv=&$BJ!X6yb zuz_(Gk1GhN#6GJ*7ys&Ha0ZvPHZO{eVe)Xg8Fy$tbzQN z227gtO9~Ww!r3?8ECnnzJftVyi%*L8R#q zT$}W=zHj<~t>8TW9M*477RYc$2)#THo`asioAKvRPo@;DLgm`9ztzRM?Rpy9alQMq z#JseP2vqni4X)1*j|dMpnOQeVMjaIMs1#;xGCo*hNlP1m~ zL|e}0hfc58xkO`8#(HnQgP+;kV1U1QDgG(Z)Q3tQutZTp1`6RSOc7#3NfM~oQ1U%V z z3eW(R5{}uQSjK{#G=da#Gngz~G0-0fK1Bcm zif(lHgZKb-I26X2Cx<~*IjcCmu@s*AK#s;=fJeN9c3oa{ADXvrMmDb1BDYA zu9#>{JPUjOhZD!?9R?c{kNo!f!otpdM{{%kZ=eXNwD1t8RvEIiIt?29xZ&gbA7GgT z4XPBXQiR6enGsW`R;f~jzsXjeQibZ}{`QosDa%B8pDkXdKAL_q7a`+mbVHD^(Vz|EB?Q7Cf(&lxrOK^viG^@95V;G_CYojq;(sl$ei9X-AWtsvfT{g*OR zp0<1XyaKK;1-7{p1^sK6acbPAG~R#@s4sTQOS zPzmvO3f;O-+?bemo$-Ym#>CG>q=Q3)Ix;P&1Q<93-jusiQe!E}(Ult)$qyB+V4kPy z_fGfs)q3OOqvNg6xSZrbcy3=2AC41-r8n!{$`LMeg28yf@BL;XilvXG)R&p0`hV_`C@=*Vns|E z@E9S&9ST(FuwJEd7Wgm_k8U8iNK)hI`ZfasOY!?}MX-P>@QBjFbYa*8=3NXo= zeurRdAP6~+7$aN^CLVTJT;Z$+a?0pFOfhu4Oapcd`oMir!Qt;{a&;>p2<(@HwH=Qy zh%+Dd=e~M^=9dzlmMjO0?cI|gLGYhDQjAN1j8R0z?$0=)0{@m2B;Nf=-)(GMf}^p5`$HM_ zLCWd?2QNTS%+cbp4i*xO=McCOeSLm8I?JwuM*rC9bs-tt_f@+aoCR;mg^j0jVxzcF zFuZS-Y-BbDSEA|y;L?**GvE~Tz0{r-H*j~hqc1Kd8bku-1D1oS%dt*JC4s=q0w5&9 zGERXs%>q<1QUDI7a&Bf*ixb(|7aQ5IJJrh2p-zh* z@#3@~h7?G!gXmF5i;#O@6vj-U1C+W71%widk7XzNH|sB`Q@mo7if7Bww$nwEMn$Mn zX10RNnRmV;Bt*AfSAsi+w123vCdn9L1n`_*gio+HyhjJ@Zr)7bmPYwazlV37&B5SL z8#_tW<#JmEzndGRl&+q33A!MK1wZcA3j}k-==SO|WYE>iW`KnL?A5pW@Z}BfLk&39 z7B2iPBI1i12k=R&T7?La?cAr!aD_+}&tSTcMGYR+W{9xhMv(77YQO?s2slGUdle;6 zu@Ht0AXSK<S6)&k?>nNOk2r}Ekn3EXd$bS6ShT8dBu0QFAyOaNg9 zZipL?`Z=I>_=amBW_s>tD={ZAJ;B~b>sK(+;%2ERm})fCw3M{%PW}7Zu05@%$G@qm zVU2Kjyq%vxn~TN8kMeK$TNSo~vFaFGe!+t*8`XX+Oj{cZvvUix;5hblHGU#Q?3-m4 z#LAgt)>;taS%0y!2waa-oW^U%gz2ym=vX)wgJ6lRb;EUQxW0{_E~5B7EjUZ*+QzQq43x z=6EQhzAqlJ`=i7{A==-?uwu3#1m>9DJ4I86|kMwrTgY%juu2oNP?tSHf=OSU(( zD}f8g069wn4)>!wwqPL&kpaf=D&B$epuvjk$sdABSH$(o4#(>^9tuyNy&g!H==u0t zDX6xjBk#UlU{MpW**i<#Kb^yg=ltd4a}m<=A`O*BPfl7|WNxB22}09y(Xi0a@w;!M zGI`)2`W(y?Dowc>1LFWKd25;%-Q`G4T-#OGnje^TOII;j*Wp-EUH%(0G{84bNz#+p3EC{;zoR~YW5>Ow&e6kD z!PAh(AitWO`z!vo>YTlFxt7MuX`x)8n~7c~@9C;KUiE~do68}d-lFGN**G2tvWiPl z{DrZXf!n~XEj|#hcW}l%3}4G3U;eZ*a{1V)S29q*?YMmexGNr5FAlE~&@1xRM(fHs zRfwwf*H*SP$qvu^lcIHAlsg@P!@3(o)vctzZlBq^FPh2Fe#c9t9uWxp+WKQzu{mfU zsWJcrQTP`!V66`YQY4X3`?pld+$k)0Os`QrXTadd;cd?Y7Cyqu2zaGDSLu0I(hu2PhImhY{qN%zDQ;%Zv9!FJBm{!LgOt*81S)_m+{41nNjGuZMM;gfr()q9G!eIg zENAXsVe82zjezn(U9}@$nR{T_(iR|UaeL3k-TU(RPK)NmNpz*+)iRfq^f>3Lk^$=< zclR|w(l1k>VPF32U0lmAzV2=(!g}tM)^;W|*$xrfgVAJ`+Dobs@6gd{ZUI^Ow>n8~ zcj1YXrsg(stWzox$I1P^F6}yZpEbRE3q}+nK!PgWZCY!@-j1X+p22& z`%!6)_NWTxDf&!xm7J=+z*9!ktqYI;OhrYo(EQY(uG{X`e(0#Ke%_yWp79E%DGr}Q zU2c1ZON4ZF#d24@C$*}w;ozt;l28=Mh%Nskmok+~X`x)+tp^DK@cFZqScY|qNVk8k0vu*&q?g1U1tSfBxI+ZrF=j*hx@yHMYL z=ccZi;bm&+985InYjikP%A3@Ri@ zZYfs&GQ?$kU^e+-A(~C6?!P+ReD3EE(8rSUmPh)j!cWjV=!1 zO)wfJ%VR|)+B2}RX6Svwn8dv0*4;qS-B$cAX)kZR*a=a!xv3jR@Qi>E7aK>+$N?N7 zW6rRuL#I!&Q>USm5HD};{33*pV!$65K#mSLL--ipzvt9pi-N(7wjm1}G^xj=AxoMB zt*=>?p@Mk{y+!$F8?(_Diw}Rx>+rVITgwYU1Pm_%3U+zBO1Tl0Y?%UD|bajQE6>u+oG+g>(_oK zs48jY=Wvn`n7|0`S!Ul5C?Mt*Bdg+lFngKT@8$n;(B8aRtnSvD z2Nun|+YiGnhuVvuqy29W6}PMe7{{D(yvC;Xq@nqHuqna{vgMbxf&E3D8#Jfe%(I2w z_jpjCkjZL_@o9?iKMeWuy4A3swMHF;9iG4OVm#pO*k5?Gz8>B)T>Z@TWkR+-XI{(; zx@jfE4Pd?|$5qX*AS0%)`xxO$iC{q^^miEfdi>Ba;j7M_vTq1wiHxALo+ym+>>;oH zEb}33(9O%Qf#@)U5$Wra8KQ4b>a;Cwc4x9-fO-@Nfs9;V(kl>L^52}+0eEK) zO)C@qoI4Y%_s7EWWF>kLUFlj1O4;fvU-@k%e@p(f)-`@Az88vbes%`*a`<^E#{f8RZb<4tiDCr;j7PmbZ?F*VYw^arzPh{HxvDjq26i9HIm_O@~&xeuSORF|50@Gq`UE$mwSpXL1Q?DR|t5`LGBM#FPs zULBveAB(853yay0KRGwnuNX9p9Z8@liDJQxVA{hk8GOTGQGzs zm-uuoG18zA5;qNc*1X)vUw?ewXH@vwJG*QM4X<)n1j`fP(U~=`)1yMa96y{61;X82 zv3M8y3Yb&0`J3$LQh%zsCOwFK`7mn`2C<$mb4Xpl|9dgAjSYftwcvbW#+wYZa>xyz=Vj$sqgOq%^KR`Ra zB>7*73jbtC*py3ugJqDhBLq-RjPfzm`5V&B{4u2aj2TEuAd@v>vZYA_D1TGXq|_{w z4U*ud(5E<^s1QZS{86gK#7*FEc~^3h{WkF5X22CEiKlQ00C^RPkRc^(Zge$7t0bgJ zAU;OYu*ucvL4pAQqe>0zQ11{(lK@9(P^3h{hG~$YfOJr%1w}Of3Xvjx!ytFCY@o@f z>53mmxdGBbi+UC6x8aRI%^ojMpa7KR3fTsj0k0kZ@kY;=qAEfz7a1|E^Uz@nnnDiP zKhOzC3>2mSJ|p`<3J<`Q?KkYYo62^InVE|jEcRiiA~N9>VDgycx1!Eg`r;r%{f z=EOWf(RR~m-LCOb{XHLC<>4??nRJt8?#g2SzFYvh1hakb;ge7QtKNhvBwoxAWG_F( z$%3X!sA4%B(}O2LgeXB$q(r22ner8u=ogvQXB2u{vQ(6V49JNHm(muQ8aTFx5p2hzNl$DT@pXHa>0VLrpm#*;uDeuS z3Lbx2N$9^!x%c?6%55{uO_u)&)s>63?462LfXyiY@c?>C!c-L@LJ*84kGmHg2#2zF zn?e=n-eQ4@^+g;Au3Qy5K)^(4haKoNaOjT+O?)^g&^-_f1qghG1|8a%sZpJYQ|{fj z*Ip<139`zx1IXP-$)&oLVWc`=?jMPBPi2g^#ee#aU$4O5C^J?n0@p>ak4^tjXXhVw z2z3C8AR|~yZqJe?zGrcxcD-6hPIqdABzU%F-HF0mK zK;U4D9_^(+*VKW?@=bU%fm5Svkomy6Fsa4m;6-4_<1mJIZ_T?`B@}3(M6cP-^P5W2bI*(R`Y&rV1cl1J4|RKu7R! zce8d`Ke%P6KZ>dR!%}FIiUk*8n`7l_9Ag+Om>2$d&I^W4@i(if?+gm6I`wM5(IQ(Q zLfoQ)vl0#83Z1iNw>u!!??~tFnYW;oX-7=+CYbOw>d$nd*XQtmvhgv5fPi(V zh^X>B{$aw1ytRVix5t5d%FVl*^oA~!{wpVK+>YeE_-F9?^g*|mHM8TeiqHPNaX~Fk zpQ7}5=Jw4RTV4p=si$z(Il~!76S&Ra#DC(2Aa9ImK3j21D#__S4pTp;6lGQuS`5v|wCZnu@Q4mj*qpi~nCt{1i<@mXc55Bj zq*~kGO_~MvyCv~>`WLnHppb*;OzgG%hlhiN?VA+)U`N8H|0a^b`IOr_(nBFhz$1&L z>`!X0vv!-Axz%V6PDl!cnSAtfHO%XwyR_4E2!zhxLPo^R=kYPBiff&_Eliz$C8evk zYF7T_1b@mA!}8C-ca52KT-c0u9w_cntIC9qvXOIlXE(bw*Q$HC%AX>cz}5NLprInM zM5bO`cf;C&g|B6>x58~<1(`FiHo&^(qAxJ$_L&@oXJOLJKNCA%-$4cK9Lh`Y){)4M_?z4mFE)#&g@c8C`^C}pBLGcK%R>KRIT;Jct(uXih;$3;F z>0VQlwa_1LoCow~m`K?9K_wQ#VdQMo4fD~sCMJQzM38N;-f8CAa2pY zrRu`2IGzld*bOSIEVv(YTs=HLKeDjv?V`=o=DU%KzIa|gY`r{kGZR6aF48g6MgnQa zyfZjvxsUL&q|azsd^L)95+173o>0bdI+e@TTtm6QQ{b6>9$59t(`)+wt*_v?_1Zpx zo3FvE2)OpJEpG>wU-*-P!eViM`{u2*vp)NfA0vM5uh+y!Y|AbYi|Q`o&=qe_;R&2GK!DK#j1VKpY$*EEE6> z2iNOBPp4yWvMyrUu4Wrv8Dt{}X`cm7X$lqAS9nhLpuODo8nk$-0iPrFM+r-Z@_zI% z$PYUb`{GV>*Y{xEjCr$1Q)Mr9!}p!|>JN}-3R=eGg9qeXzFPSB_TymQ7oT(Q z#_9FHVrd?7~Fj_!EnA2vwCEiQOsBH@+~bVubhS)b<6s{LBtZ zm>OKmypLL$@d3#0xUGz^-owxC3x$qgS+d0N+Ei)5Cqs5jug+{?;v~(!x|ZU+*M{@% zLP7sx3lrn`QulYj-s5!n6QcH-*!923L5Br^a4Q146TvC=|0Oed>=dyPz30v4SO7tHNz>n|D0C55kTD5 zL3;1iiVethby9??7fv%$)@_?i8)YyZyiA79;xI(_w#xKYP%2U{JOyU070pv+9&NK- z{59O+x$z_*s-!1zX7UkJP+BIuz9-eQ;5I4)E)&2mL)+CDB=Vi3tN5&~_x#eT)Ne#~ z5(nl=@bcslF0w5!dnox(YWd-uBK?t08UhvqtRI4a?yvM2z<(_6uFjwJ$Vc*re&0lK z3?7b(#|^OhEPpy>O=*r|2HjUzfk%-x~(2%klDMqel2mcs}j@{jRB-2gs8csgT+z*4TMau!&yj z1JxUiH>2IRy}t>7_+A$1&=6Rmf}16S>>(;2V$dZqHxYfYfO1Q^S|QyX8z^aTTMwu=QjV>c8yf4z+M zeb`&}#eGk%&!XjIiU&5jD-&h}0s#sH{}Vg>r%KQtxC|)C6Z}y(sLKU)G_?r#`mMVc ze|vjdQ;JblZ&?#Yl5xtH9xi8Z;JcO2GHk~B(O1=?jE6pjh1{V0x{&7IyFR?~EOJ0S zlO+83$5LiQEKWdP`D)>Oo~7kZ|DNi3KJll%Rd%DaV*FOCFO62KV~Eq$h{cm;aCqMd zMI8{q9LyeE=F?sO-rDyR`>)58S{}|aA3g9!%~B!OQf95g>S>wzm{W9_xp!7oG-dvQ zHVH@eq%k;*d~|UGgzM|&X9&*|W7(z6DuzezR>SqT~YQ$TZn z>Cx00KjeQ8)x<^JrXT;xs$nE$nSs(4MeQ$Qf349-Vy{~<*w%&9QBIN6ToZ+#pUw1!} zszh;0w6+w5tH5_JXLl?vQ*7zN!u)&0r)PfEkUGf=?CClj)iznqL!3u~VXv`1+aIlf zk)!g9+yIns_Rcu()v7h^t*qL5O&Tw|q(bx%=wt7=5g%9L`3f)j+Xjd-exW?2y=2+2 z*aX1-&N8${Rgqs1;(_c%)S4|@Ov)Mx__oMRgAvM1akZG-nL$*OqSyV7IMfXXC+rZ# z7GWv!w1>W8GQsB0d9G;bKCPdeM46HpjtJPqkRA?fPUL3$ZfLblw<#!o+~)1_-1O?E zE)0S?rGQMS#8C^X-?)9y5SO%#PO^Zjb(?_&49P66+)M6il3AH5Y< z2?rw#01mTm-(fngpEjQWy;(fYn|}87ldCIpTL+KJ)^p%5-72g<4u%zu0pF#a%SYYD zKR?FxIn=Xue(Xd~miV)H&e~bJj2V{f@)XBlvT@b|(q+i_oM~Nvr`Ce8=SpRzyxLh( z{dCvT|0SMi04y}-7N+Yc`WO?_h&D(%xl<7Iuj?b8=%BAMGR$s> zFNFgj5`?$~yB8UhwHa&5S2nfT=p(xTnQRKQYdiN#!0Vzevn9L}@bx~G1`i2aaa55` zTNlXpK2^jr3kY&(I8ZW~vD=Q9W|fK2qb5$y-8?=fKy=}#wi-d)Fm^Z3g@uA$!|~Wz zh~W#WD#ewCM(9-Gy7{zW%gJQ(*mu&J9{@F&+B8_7$s%DqSQYRv4hO%V3VwTi%jsl= zPxuwwEEW`n@$D3nl$T7t_@JQYr=*^hr5lYbAZ`Am_1W!~335I@>+CpKT5{4}Z}wfG zq>Xlmz@PXt!(>0@)9q!J3eJPLC8zIDq7 z6;yZZ#1o^H<#A2~cJ3W{q5ZTAOb^=W^gk};{lCt|>o4h+^ONm8V2U8Pk7TtQKUGkk zm*@UQ&k?sHQ%mk>v{Vw>d@gj$z50w+%Q0lice?jlFNuFYAM^Xxa@~-@WkZw*G#-UO zlQSGK zxHNEUsAr*ZxQ-=vcRYW2`}-aX^=->KQQMm&5kqj_7;wn*oV9jPql!@3cQ3GLHpff0Jq+FQ)2 zp{~&WsqxPuH0+ZfhFt0Ru4a#8EwgD2Kt$WlgUj=L8CFiUQa2SUK8q`=%Y)1%vN?8+ zMd-=ONN+>4G0a>3?xB;n;vzRNa`#Y$mIU&jW}-8Tf(mlwkK);>a^E*WA>1_ysscZ( zzB`}ekNrL#=1z(9XA8t3`n^rf<&eQztm47=^vbq& z481@#&_fQmVMng>`OR94z&rWGPZC61qk5YG{zveD;NQAiQNoj0vsl%=u9ZIut_h$T zTu<{?V!$_~DRynBQ(eF`2%jXHL5eF?c|89s%BVD3y!ubQ1j+$^0}P9&N)gE2!UDKX z$9QEchaN}{T9oLI013#oWFaE|JxEY6T<#iL=5jbw^gD&5JXd>r6dS#}J>W`R^vaLP zqDB4URP$OZHE^Kn&ttKuUHi<9mFup`g$qLG=5&TnvefAT7#yn#by45wbYvP_mKB;5 z8k6U%IzX4pK^;9utqMpR0!YChuLTU5poQS($DUTGP6&htEF?MV6z7*z9y&Qe6=&yg zX#mHlqtGk~h^2~B!U1VcO0wEHr)^2l@e(ZP3UEq0%?1p(KIfx5$=>+$_WM9dKuwyP zDTfVgMOPLolFQW*!aK`hk`4ELzIf zVw3<-{c>EcCL_^{D3)-3>wix6q<|ASqcq}67s`@nO zUoXQ|l{_)Pn_olL`5(g0F3yz+q7qG_%e$|K^LmNSSOq*2yM$PSG(3mjBl*L}YbTwPWRK4k;KjizbeCu%f-==sl&9APaoLwV09_Sa13 zVr}z$objuc^QoUSv`V9~tY$HI?3L+6@4%0e<@35b30x^0+l5Mq<~S$juJ(+6^fU@+*lJDi-=$Q7&7 zp7l5FO&gpJt&Fwv%7$@=8iR7ptgGDZnlre^`EckKCF3=>q`Naa$L1_f&vcK+m7c4a zbi3ci<&U^Ivgkj@NbVxC*WE|G3j~_8$x*9v^<76k&NE<^Dw$asHJyu~ba*oLo5nr- zDOD>y|Lz0xRMy`-;9vJ!_S-L6D_?ulxmJNfSyI@S?(cExPiUCfTGyGJ$y{62Wh&w~ z8D9N19ame;p}R^vW8H*WPo2nZb_xpG+>2vJzssYS*0kp_{p%f{SJ4;|Gkxfo^g~s50*ZGHacIMv3$;w*iJ97Ah_j-Al#*j3c_6ksn?= z=I(*twcgJZUSIjyvH9^ju8yVsl1FWN{`k2p-fHLv z^Ej6z0HRUV5537e5+4D$8*|W6-{4O#$aXb1Zkw4au+Bmn+>C*&=vZ&n*DK?E-<{Ug9l)|`o z@XIwblZMAN$Zt4MDfkLL-s5kx7LRuAN_Q?_bB({t2!n4LIKFT4`>?|L#e_UEPVBku zBP(|EdkE-y!IGFG2@&W4F+V=Epf@b_je(0GzP|ggD=DVTo!tJ(ptp??S?bf81`V^0 zPXygu5bDy6ovK#cWT{X!uOpbvCbwuhe+4?ssUP?#4}RqJX2;{1IzU z1v@_8NWx3m{Fn=d?j#dYr76+N4hDb}VgKP7xdrbq}-)6@|5=f1KyEI)>^lxbkQm z8Xl*>98cz2Vuin+4{x+j{eqi%Pi4{CwLZ*-K`B>}Qg|PcgyCzFu)_MyTOD)Dd>>mr z&VAI*T!PHtFpG4Lt}ArU{p8zz18RV%e4X8}h3m&mI`bq#T;qM+aHzi8*Df~{rrl=u zV!M&ZPo`FmY83>-xL?1y^W<~@(M6qxXA8nwKy6d#tVL~~$lSoAv*~v)TCcvE)5iJB z4XuaWQUj^86vWCpYaW z*s%fEulo(DjBp6Xc3>sIYvs26*W|~cS?bR&0C;iyj#@zf&KK4>6S&ld+I5xPw0j*) zMb*>_`**$llGdt5X6EZrY`H%b+|%`^k?m1W7449qD(!L;$E92ZjNVgRcgK6g?br{A7AgEwWAV!mM zy~x3MDWKPBNoe2^kW#b#xjHv5TnIPX?mh&PQ&zh$&GLbtrf&V#yqYGco$f~5H^y(@ zLAx}~%Tu03qF4@CRE{gU{`cM$8fJHFn`iI%=eBLxXni3TC$*ktUTVIh>52p0?M6f~ z@tr2B=#O_6pO#y3)yTZj_+X{Sw5}leGk8d`-jCc;`h=>^!{2mkgm;(|$Eb$<3Jw9` zcEk5TEc06E{^ZCMdNjBTC^Ai-{&%J&fsWtGosn<>Y00XM!(Tj)`8pmVc^0N(5O;AQEQo2%h)r! zuLLqf@^PSgO(#p(#Umlh)osy7xuh^&;O>n_1%~ZG)1UF4MyaGX9L!oa_s?!P1RM_% zCZa_HkVcis-p$?rF0>I+c7HrQT*7@;9+*goD(5PFtk}ZGCx4|<0 zUZ*pc;yClOCGKUnetCW5Uv9kS5*En}q&geegd2@tFPj4Env63rxBZZSR{HuY#6AME z{KY1U&xMUj`eAn$=R*ts>;$oU8QJs7YUNP!NZAHO{WQ8KF2DQL$7@+x)Gg=pP{0tr z1l%)cE+3UADcryH`DXhE37fh=7g(nq_G-OfP5;i+tdx)+Zt#TDtSh-^C^`VEFt8S0aE zZ%&6W{ecXaFg!D##%?6H)e#b`peh(gn5qiuHW#KNcz+_cmbZ&%mKBIOgV}k>oybt# z`U@DwPen5`MvmhAZYFwW>UD+P%1Y};RKNGwxGy6&s>cm{4C1KGMjqFy?qYGqip8+?;ja^GhiYkhk(g#Nqh9_(`1f zKQirK+{`sjWw%9jk`~OdL+Ixbtz!Bud>@SdB}U!;25P*RO`-(4|7h^x=M3&G-(|~_ z5&$+G39F}m;3qoFcpFu#1o?vS&1(<(@RvJc>kntiwzdhq9@FQh`jx1h|t*`ttU%ZtPh9`hv(q=XER5kqWj+>f zD+lS7rY8I&7MeO{0bT+=ox=_QU$yv+g~L2xZu&rZkQGb5yjx&{v92SEAxRZw2?W@;xtv5{X4 z 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

X5*P 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

3ZLKj_w!QmRG>BZo7){s* z04sOf{POLF$&oN6&9qdCpKpVXfMwOzJG8z-fBhC1WA3tUGo)GpEEq&gS27M+f(lo4 zRQ1}u!-@&j4u=bPsn1-Mb9zQM6TFhC?NgM^V5@sl+X(_2)egmj0EaFQviNw=bM!!7 z^c3qGN1A|(dpATICR{e%WKX$XA*#&-@t9IDX=Kj*A*7z=7n zLEK_nV9`N75=0w3CgZ0PF^jM*BOUiD5gSZIj(7H7ktJ)rr6+2s>oX(9Q@om-?O0ZR zvGI5&;-lC!ZsRyFIq@i&jn-lTzb;dx&a*CI-l_jae0Ap_d|$^s)(U2{34x;RU6{V zwoUV`+per*6dsB%F!A^qFhz7~S4X;-cCV9Qvt?JY?~WUheLcn%J{&1jp>M6X3kvI! z)h)e&idimii{r7FWJT;6Mbmu&jt5-=P77*v_+GZ5dl1eMOL4Kkj%qdoRl7nr)^)eR z_exVPqBYPbqNi6HA&^A5BX=h>osc+ml1qvFCMwPN+@ufH#}^Rr1#whdvOcg@R$cv zB+|RR4E1zY0;MK-p@B9s_1$GyWDzYrP*x4eL>_qvza$Liqnb=x+6j_?wqJUw3XUcM z3AL!1i3a4}tOs%wQwGN%&;HJCH;P(s_Jn>m*;?7uf>{VAdeuKuIHTIq?Jf8(8TO?A zY2As_O>@QXS&P{`XDK2PN{=*y%ez3uu+aRG z1nFx5NUghr`xC+Zwnf^TGn(OfW6yNQn8`nPv!8B}N6>qvbL??;?%lno60nhI{fN!) zEnevmt8_ASto_5pND9jnEXTx|Q4Q@2HpiGA(ZD1WST5!rsU_@K$l zP@+K7FlP=^l>T#X%f%Rb=yB(mYUV*(hmu)(Km3!%(c${4S@ac z&$|2rPSXEx4Dtt@q-SRT7b5xZ;3O-@zv_PeAHYc^P$i}Ho)jb;A&GV{Kw*-QD-j6= z4Tm&LJ-swclMpz55c5-|b}r(iBm_WnRMg_)4#jPZ=PlRo>#D~sPRne^C%Wer-|ZH6 z_D9&)U50>tgjzlmfLKVFz~I8Txo?`^ zpuoWUH>}F^aQLNx0zge02)_vt^Ws_?#1Q3;evsFfxs+)cJ%uELI$`2 zh{oAn*>(|3;+X=D@&~*H1Hl0jG`PjI5hI5I9$*8J|#IiItEfG=*LDbB@S@l zPVA=S&9hN?M=Oma$kWP(q2ARa11zdummJ@bYMXJ z>fdQ(1M)Yf?!V}mFH#jxN-<-5r@^BIfG=+e^nC0*F}{Fr`T{off8z|n9v$Cr<9_P^ z1_k-av4em&26FVq`}vmdPtw0{TYlUy*vaOBLQL}z5}X|0Kj)(6=*XcU?LNxB)VxBK zTc%@Ro^O3czu4y1Gmasj^wUv;9;6~Af?ZD&xa^H*n1G zp|Zq3k>@Sg!o2jqLx;ZOYutRrPe||daGey~XoUc}f9H3Th{1sL^#pxw1HB~Q_1u1$ zCVxl1eYX*^uz~EQWBhUEft>X(fXxhacw0@kKtZk>Bwo*bz(Pg@XQe-`{EYo%emS zs|;>Gv`wkDldIl$Q}E`x%_Rl_^`_|k*I@5AJs9v4klzh4G8!`Q8^o?LRIvNk9-EvT zK=|KXML)MFpWmJ+U^kAHM8Emz(PA-UoQGulZcCAGYQPZKV8G~lbh&$7zb!u{&*{_1 zV1Qm8072v350vi9UdtrH2Lr#?dk6odFV$k)U&%3SJl;~{i(1byKgz2bYnpKw`qqC9 z@5RN#cT=~p#(?qA=<>j3NzIK6Xt&Puly(m0ZhCgUj{y$B2{UlPh!clS%G(ZM)yl7F zAZTucv3=U1QO^?AtJTH1ZbfK!(ltRj0ixl^*^}1o6eKZfs6zgl;Ak_o^FB&Znq|g_ zL}B|Sy`S&+7sBl!-@%c1zHT{7*vVphxyCl9`$`6Fb+m0=ok9msVBBd@Gm@#0uR1iG z_UVrb@Y7#s<2vBvy@51KsaIOUWwLN95>nY=2OYM-r?A#Vj+1hbg!9*)D%T3(pwdX_ zmwc2440jH!FwP+h+cL5w;x=&C%NZ7onxV2=)vpuf^s5G#xS=fhsp0ez`dh1K$5IPZ zklY~LA@s=g%z z+I;Ps0CL)J>H5A?!`-VP3g6>Jy8I}M*^04y*t*VjDvF6MUWMjxk}-6EW!kfZ8&yd8 z89vN<#+);3oQh|xh7!`UsFRbDlFYY-JRas6Gp#vax%q+oXO(aZQ$eKx5|Y{Hr{xkn zE^$156laI64`@^Y84h0=&Wwv>9vh8S~$_fM>(oWUv^y&oZ1sj-q{C2#9X zo)383*EV&zYmS=U@h_}g5bCJuLe+M@VuSiymQu>6kXL_dAv7)-ka5#kT6w4Q`LxuA`?oQ z+p0^DqBo4Ac6h+49#C^rTV|M7b>#I_osa%#w&`H*qr4tkIMsCC>r`~peR?duoES#N zI)|QL3QjQFK&)O;ZhGI5sY-SysiuV@U@I5qPn*7y1p?q)rKAN8SHFRM2)Wn6atma-E#Jv95keH`{iv2lG_YkFHd`~47p zw??1#u~>CHlSg&S2H>Sst!aaV%sRYhQ*iRq8ea_k_N$01dnpi9g=u-XZx(2~o@HM3 zF{i8(z}Em}aV&PZW@@*V*0U|#4j;)^Rih?P7{5qqq^?2@XI9T`D*qRAwhqj#>Kj-% zJ{RN2LCR-n3OVvONjG){DsFi~9mD48;8uqrt zu4WZpv~SyitKz`S7Tjg={r-H`X=WJHU6A~ima~51>rjTKSUt@?Qc2W_Th-T;*wE5+ zqjBId`dsy2<<&^h)NAZ4SKdaQ-3)qqPDEu^)3GX;C^wT00J?e-8-$A8BErh!NXzA0 zpG$@WkQXHr-#_Ge_xphJ33 z=eweeZlP%6${sVtfHef^J;$>fv2A%9`^p5*T?P){1vX0KjoGfl+GVuI&rZ08>BAzr zRcf)KjL6yPFB8G;XBd5{Ludpe!*uc+nN+|y=#BzC-fu_ka@iTE@jbbEZO$(N4Gi!j zI0VOrGcy9ZH3eZKiDpdEaWIo?;ccjYT4J0>)6#QlZcIkJcAV38Qu!oE_lw~yQ=L@q zQ(Z-`gp7OazbWw|U6TKFTt|9u3|jZ6C}oq+j{02b{c0O)<?@%zbh-%9;xZt zbT4aaeHiMo+MJ*sNz+nK-=B>PQ1PCZ6m>msijYza9As{NVlKuh_pB~1B#Gn|@$mG8 z&RfKxTw7PRY-9?1K{$LFRqJ5WXFQ=kEK`$)I_emCQ2)lvq(*|J>zrTDhRH!}{|IDl zgI(0MaR+}^=SW1#t9&U>cHA90G^M+q@#@l2r>J{oWOY*gL6`0j1C9x!{dP z-E9?{=9(m@804h<{FS15`z+CjvsRT2d1c^g0kEtR{ehV4GB@{x=gVQQ*DX(Vj+rJi zStS~Wys(t_=*}Q`N2+9)B`rjs-6mn8wGF!NZ5| zxB8z`r8xR2l?UL;U&izOa4e1m2@>k8HWV^gw zw)UEq8E`H|X*UB@>VtyDw58MfJg^`#`D`BCe;7x8oy0&MMuO4UrZ~!SjO|{N5}&+Y zR6>C%#(Uu9fQX+}K212QOGKYf*2TiA-Ga)WnQ=}@A~;4Ymhjvs=AnZhV=Ca5;aywJ z$9s_U#O%%#wMUWL8^jLyHQj4;hr*_2M&Ucspv$=+ zW0{a_#f^K~sZf*>^D=|h%G0N*H-AF8ZZA79t=S|azcxgZZ^7U~n{}DCetEd1*7VJa z8tTjW4gZwMVvAQ93iJ83t=={FfgGceMU&PAEe#S9`90S9Dhc5-i^HvU@;w0q{XgmYp!E z-1a z#jY9PY+-dvP`Yqx=wy_(j(O8+Y5K%vGZ-&Gd84ilMYqu3nE-6NYrfLIS{=dK3#Cx^)$`Kk|_74!i%SwC)&K4+3IP81~#i4_HI6a!{T z&XK#xTW%vC1*qZ0T~9OS?d<2CIP4o}rKAirHpKd=)buF8yQ^ihnxeXr-u?wfl?1WM z5VIrcEpamkT&KQdx>&yKk+U)O>)Xw0%y^9my=Ha#qlBb729PH^7!S{pdL*o?L0+xx zH#9*<rs;u!=R?Oj;k7QU z_|Jt?vAy3iWtPK=h4ZVgBHkS+$F^5&(|Ct*$UAQ+;Hi?pM^(~r8gCP7phtZ$XJ=H# z_39V_JPzA9#Y+U(kT+Q1=)y>bE-skA{o(%)hP>0FylCK1c^ znkGCU8lnRnmWw+tC%m&1^)-ISdFKL3xaP(%4Hn5ve;2$u(9m3hh<@FwOM(VFa~MZN zO-ZT@k61oGFMgtN)5Q`uS<4#mrbN zlSrYRRx`+l7{XzSNgTxtmX%q=hz$IoaZ7yt(N4Tf`D^OTOetHY|X1%Ai!bj|9M1)UDV&Lqc?O9A)EBHF`7o9ZJ0`LxP& ze2*^(dTLllU;bx5^sz@j>V93z)AU$K0$3O4NL1#5{e>41oqVE)GlO@$nwk&)aG~FL zoO?%xy7@Qla=-#IFK*m{g5C;pNV(3OpLH-p)pB~KG{4n0;rpoSG$(fUpHhBLHQCpA z^H?2yu5=a6keBNORDAA@5o(23Xz!8hntUY6adEQn&Xd0lP-!x4@eKG7p$991Jcu;d z`ccxVcijn_>o_cxR}OkvE8%@Z`B92SWM#n%WGjuvmnE8HB;iXyE3UsPX<>K|D*ZT( z_fQBWcUgcmO&X4=_9JY0IS2p9F|gCcDrfRN>`&xS;NszlP%pyeEFF)wGem@McSa7( zJUNeQNpbtQGUmN@-$Gx~XZ{GXP%U2PmW8r(XJ7EW(v}Ik*y~esprfKhB=c)u9b6a0 zJ-(`(@(R4zu>ePto{eHd+PWa8mX$lAFo#KBtV87}5S%FqEhrWF5Sq+TU};-AM$1D^ zmbL*ku`rirQ8Oqe^7Ne3$iW1_$r_s$Oim`isk^lbJ;j!)QHA@kS5WH$q!9{H2)Mfx zO|NTu2K8`AP46l-K8P^U_>91+3s$}Z1DnW*X>Uu1opCJAz)Kgl;<@4boli>N>CWtM zr$ANX5L#o<`YeHo93VWJ`8TvV8yZ^UDv$ieq-|qcp}M2nPk{P#O_CSgWREWN2}v-b zkhCgnUBv^)RLqH&{M}4A-jRiekABo+^<2O_!Q_xaa67>k8={e68FTm7G^qV*EnYyw z!lS=-p&tGr$=FNW?MQkH-RbGHqNQ^WYPzQeQ8HaQ1ct$(Qd$?TFJ$^qJVVA}G-e0t z2_5ZdSBTN71n`&aoP<#b+ol0dZ=t+B>nafb59|dQjdO>T)D8qGWQH0`TCkKznzwJt zdOD@(=so6)!l2*a_X(L`D6Aq{AO|d%zJ7OMYa5Zvb4^hePpxX6h-<80sT2ug6o0?0;g zuVZAZ=T;Tku$-v)-zLn<^hu0rR;=q$uag)2IIVrq?d=?whErl=a>p$d z7Poy7Q#~d3*uN0fwuy2c4&F)BB;`cI?340KhmVNqlVkMfUb^NWdhQ*_LO(Y8WB`Lp z0DX7o=4TBdTqH?!ECA!FQ0~1_$iAZ3>NwvYjX01E#>8+pYqD7G#N~O^XKQ<)P%Xr1Mi>t}cX(lRD#vdxPmtfp>aTUp-ojYM-;m~9 zB2bb{nv+@|qn6G(rC(z!Be0ulWiU8o_Eucs*LOc8F>&;&CzG1Pzd3ko2!SKqihpJp zkUr3M?Xx5vKd{~0XFj}gV;kD!OG<2SZaDLKoY`J$9J1!HsvY;DiSwdCntF;Lk(qnR zXTPK$zL9u8zc|?#ixd^$wqVii(!GQvK4BkQukpZ@ivREZi zCzimsq-UgLvp}xLd%)!x>thHWdfio^&oZB4mwyS(UK4hkkBojmW}K4%w%o<5*8~kC zV(t;Uqgba)Eq5jVrEv+1g|lCHfdodeb@>22Z4Z}kiN4DJ{sSJFK|0w5T^6H;-=vdS zD9?P@I?1tI86Sy4b)`(IGob^7_N9TN;fx`>#0i>5qJHVY7K6gj@O(xuAD>wQgI@EDzDl>7m~P^RiQjAlwkZVOc3Qwz{|F-G@2se(W4Ru z@+zfn{Xpwe%FKDVxpgph%}x;E$8|Luq}g5CEPm_sHZFMHj|^3ZZfaoU zc_^)$3(VS-g>=gv4qr(6gF<1IEh}X!D;?I35Q!(_)~gF2LA2~BBuq1w!pG^dtm!-p zJAP%2Ac+1g?|$jKo9b1hEDa+=QV|PBlR1;-S;(?MF2! zGl}2n!jsyEg6lR6IH-L$OLbumb>8xR&4bZo{!wX`e^8LtRQy+RLuT!1$GUSYOHhSa z1|`F%P77NWTULitgbar_uwX`VcoYszg$7v4!q#9DHJO~HuM{G_da0iF`prJ>o7FZ* zeJ#l#&@Xyq4#N@6hGrXlyK6kFavbw8*E3&dh!j({l>{tI5Lp&VseXP2$Pm89Q{R~ZjQ7e*ip*@bqtWkp==$fKgr4Fu5>K7Q7AF}4Vj$I3>w)k zPr4Hg`3j_yKvOMWjp2$4J6NXpyG>&c<%TG*g&)K8bz62Sn0=6uWBS|O0gz4{fzSjT zkWd#&F(8X0n2K0C++1QrH#=J)r?bvy%;gTjX$-6&gWfpoq+ED>CMe)|1RW}e%n1Y! z?Lc-`3-w^y%$ENvV2Gfi#*De07GptoMQ9-w4|XcA?qmjm8`;cC!VE7bB*Fo-%6?WS zUw4LE$x0r7D>w(jD$MlzodVRz3G|!ljrdnQ0}z^b609dKs63eZOqc~bH`v^p!y(dO z-3ft{Ow$FRk~NM5mzEmxihDRPIzhFdsv0r_00x?6!oE~*q*VBc<^#AwaMxG?%K%km z5DOY^&>z1eVJAeAhS5Al9H>^-Uj!Y_kk@Nm%rOiwA!HD z(xd&`X8y3MEMTz95b<#isvJ)$ z3)QS-5CE2hF`Sf!-MS3rw;}cis{8ZD2FpUPp%MlQ;?wKy8Vyt$9}8%BQJ?r`vb)cE zyEXK@9VAw4vVFfCnyh&{fA&uKC@k4U6aPrU7c5KF0;8_^ZB@WI)+ZyY`)wb zb*!JuZhw1wSlj)ww^4aMf*Rz@!=W;1-u@_A{NS+2hX4V~4E~|9mjI`7j)m!e;27 ze{&lV(b5zqUE=w}m%Rz0kt;2Sc=h{a_V9)M)|&cM!bxo|Uhgi+<*?tS?M2pn*(@^S z#!s=u`t?`l9-H7nj&<0BXu0O&!qxMxoXPc6!s;+`?jNy6J`|6yGIJ8e)4IFV=#NwJ zyWBS)Sud#aCWOJ|V+&Qg&`YSJTt-?8Mjlj2!HtoNT+#+4nemSWaeOv>i?URR_V>O1 z_t>5|*NBx%;qlMSpNofIy}kMQSHSk0;Zmo2&D-U^Wxa(>*Z20c@x9;adv||Q5ZN{l z3HxQ4&-a~=&DOJ;?*k^{g(@&e%Is=f_dIY?PxyO)m;Dj*5_Z|gve$9Ep|Qk9BXQb7 znlUz{PBG34h$SZi!d$Q{!CM14)^fP;{syzraE-nSC5N= zG#Yu2FIgdJlA7Xcb%2k-FbB%Xn2BX_1$}g4t;VH>*T-|4)_q?0 z^2_P-Ub>>X=WG1@9lj;Wg>}+xcss*m-qCAKgQ@Fg9@^uB(c9eCX@1pD&^<%s+sR`- z==0;LfAe!3|3|cpSLgD}txHSIwA$s{`F-;<)^(C@>FwI}daL{U>S+^xl7H!np01+D zvbw(bS;v!&t;@JK`AFC;vyXY%Y(2?Zk`=J2TmnenW3)A5CpZWV&OijXY!Q zTH#otmh$^FK=1E#7I(I6mvIIpbPl$V|jbA)4DfsXG3#DL=2kp&E?1&46~ z=(j+I*Mo2YhKZz**0VFVahZPmUjDAn)l{9g=MCLj$XZ$eg8F@^aFj*jD&g2rQlE`2 zKVlN2U(?**lV+lOLpUYJ$1pJ&jwtUqbj-hT~yrki{d>irK$m zdCKv?HRTWIrAP=62kx{J7_fKkI>#_AMVT?dP)2^}h%#?Whc)I)NN| zNpJ3igbrO>xU!S+p2ImAOf{3Uu31H*l*i^A_!i@*AIDkK{QO=Am%R|N)18LD-1`ZM zas+FLBm|HL{PhskP}^kK?NBh{FOr71kniF&W4SSdpr0Jz(07mb#V`@8a%1*?$v)!5 zxcEhJC-aZO`Nvy!0!6))t6n<;|b zZ#Ni-@15O28J$>RR{_nRprnbwrZbQyMaeVpVJ8kvq_LO``Iq`ju3+&e&O&5><*0~= zm~l&cx@82Igi}~JNsAX+j$vsl&Yollq0tVR7QPxaXULkA+OxkyuNKE@emqinW1f1$ zG*3Q&s1!KjNA~&T>WlR0rNUvBNMeVa&grGmuM4J57qCOC+K)xqRPqAqeW7t%fi#Jix@QF5RK9-E` za*_=^<5ZAYTHCJeq(fh;kZe25u{i4@sFy}wuk~EWpTS2G1*503tg!_7Gq^)$ z0sV?|RwoJ>`7pRc<%1xeW-&trhcK#|(%_6fYz*$#NO%P>=NP6jB8R;bvB+1raL`bA zCh*%RW?dLYgL0^d>)tjXn_Wd}JZZ8fZWQyM4XkmY#IbPc6wF~%a1uL%M16?t6(blF zf;F0m00q@K6z0e7n8Y8a^2h1l2%;9?Gv`=m%-N-) zx#Jz;N%5c{EXNiA!5F0?)R=z{3hQ>OUVpoB%WS0NMd>OKG!_hHCH*trPaHf3D}9T{ zlWQ2XXjm?r4v9gz+Zn`?|I_q;8ewNpQxY9+MD1b8Eb(rMq{sQEQJQ1eG#^R@C{u_5 zi{XP@5(7&7)_~%%DOSW!+36A%sU>V;Q^@G;T>i~^K0WD(9QA1+NjY9Eus`BwYIR&_> z_MSYojc%-#Cs0e)v(HRVf{L@o;N@?Z*g+vwQf)LHn&!IVP1-ytLLupS!y>?43$q=8;BQSB6VRc|8dE6KtvJfZ<;?M<9+cf*(K<)&}h+48<_;tDv zD6dculcldX)F?>8BEq0Lh!9b?go!9&{Dd0K+SOS$QRZ^jU66$-AI}P~$0PGt1un%A zhJk+3)fYGkREnQ2K>hL%s-oApvXLjAibWkVq4pHs`%u#l%DFcTp0$gWQb_t47Lnt$ zjVN&1QW8GxWQmw_w?qxUU!p)du2LnQTF(>9YLSm;w|%rIZOLeM=StFN7HZ_)cT8U3 zFn!237q-jls??h=-bDdyA9K{^Oct%6q%1Aut^*-~Q(iiF+#waNb3xzNH*&m`_C*#e%L>#^%IH91^3{qRtEn)F9-Erl*2 zN2xEr%@2AfEO;EK?N5BpWMSU117MoP6)$7axYCB!61QYiRR{@ewz+1{$|KEZ@uikL z>(!?EyZ*=ZBQ?(|6;#N17w6;+Vod{e_KYo?b+?lkc0_Smd7W{*y!iRbNvZZnj?UEO zX8HWjub{PLWoew?Ci_XS%WoF;GE`ZtAEw^nPc!BB89R2)>6n@c?jc9857vqvm{8p= zqv45Mep}2#LSx6b&=jV zVM{a6m!W_6Mc%``92efzy5AnKV91^8>TtWu3F)Zh`<3dT<+oC)Eain!7{v6~-x$O= zHdLnVZ}3wcvFEF#T$=L9sY9=)+n5N_%AIBni zJ{ZFyAXxpe!m_80Z>Z^#PzI);Nd{HVgA-JyTIjuObv`s+q`F$GDO2e;2rP73O^mJi zk(-cM7tPmHx=O5Be!Rk;&U}qkV7=9V(O_L{ z5A1OO2R_gv0k~|Zxfxd@zBMmk{iO-?FdRD2gH<~%iHx>vhc$*@A%~sMD`6wxoX+K& zo0PezS*;T#C$b;bRggUNDnyR;r`1CRrJws8s9RxmG@`Hh2C!(_Vq$B z+l|HefGKV8T1|XiDV)&BSX;|;lbP7a0T7{B&`pMIG!ox$P)~7$HpzF=d?Kxc_zd#G ze%6hxI{GClz+!|v?Ojy(gwdXa`}p8=P?n}C!$b4pbvV$fa!wE1zn<-~dK~UL3tjG$ zSNhLVhoGE&f3EG~@k7-U^y_lRfu@^u9`uC=R1VWuYl^~xm3|QNC*ib>K{)BJn5k$9 z|JV`a91f`R4p~J72P4Wtp79l7PeiH|W1&b{cljXt##(mhDqzw0VD|i&HG36-2&ogf z?+}67AhVTGvIt?rFwpfnLTvdb8xyHZ{Nw?0{Ed7NKRJdlhI$|Lg+n z#J~QA#%=vASA~4h#23(`@*IY9KnO}^kdba>STGCIi4Q~wBm(Cj#F!Y_FV-Nx1z%@j9GKl)C6D7YA$pGcaAo9;N7numSf2Mgu3eN+g8VV(`WWYsX{F?i* z2QV*LaMfD3UM)7Q(O0By>&qKT*eW<*^emw*eIEn_IP+HvxgMs3T5hL=YEo7dVrkfv zQaJEAsAy>2mwPl$@ydKe0{1qw{)T9PuR%XcMke$LWvr8-{QRr8FH=wtCU>^6DmvnL z&grkrnxx>JH8vpjiq%SWvd);Du%R3OSsjiy4vV>`UL~N@s%L9+Q>;~O8lzk7IakMy zXppS>*XzQyUBdnj=^h)<(c84Zje71kY2yJ0`}y@=c*(AuFkfv%ynhsu(s4sIb7Y3u zl~hqsN3UGRB;X9b}8ayEeJA0ofXQv=rNDMMTxBY&zf=3V_AcX6khh4HR57KHv{k6H94AwEdsvITG+*^ z1bQ}NZ4@p77R{ak%$Yd@m^X6zF>B!d#>$2xh?W756Db82E9_wQTSyVDgwgEfK#cY* z$@Pv@*Z_$evIa0$0xY6+W!C%#b{sWbShf1HWu+NxtEA6eFQ}a5f?Z!gUJukjqp z>t8gO*|o3_3PZ#Z4NKdFhZccN{v{M8$00BP5%Xj0u>WJsn%PBVYz~#JTL06zQFJu9 zkJ~6F-_)^m8MicDvKkKa@bzd*j{t^M;Qj%q3+l6VgjW$ykALL0_EL0*HC;7qcBhu0 zy-8LXv&hyBx6>xlE4ON}x?suPBJYOk{ag_}1UN|HM3a1#jPAC@xt6WZz7#0bJhK;4 z0)UPCLIC73yq3HFJLCF9Euyt}=FmOw9NfHRJ|aTFHYv78elensTv6%DKjcNU^3agk(SmQ|+vfY7@B4&H_4V?;?fto!`+a$sTJyC&xA-~# z2=A&m)B9V=O@2K#VXkouapq>dyAQ zZ?pUJvIF0zy$^T8&Dr<|iRmrEw zh{?s1NB$?8c_x}gN8->?nE}T5AsyezYQJl0=+@<;%-1ia+@1=DVSJU>k=)PtT=DRV z=x6+v?b+8&pXUME@3+_t7i7bqoW(*m2`u~u^J5nEi*kW12Y8_o!}4Wos;d)J3qt!a?NdRgnpRu2*`yv8R>ttAAibL7}yvY znCNNfS;^?>$$sWZ+Zz2(QF?h&zPtQRE!-Qe@;!n^b;Aw&j(h@~F8{SRD=h;p1H})YAAzxrk*$FR6blFazp)1XpXq#-ep47)a`8~YtAoM^Az&ny#*m4vWg}Q! zTcy4^vD>cc*RNUAKU+EhM8G>Dzg%xvF9^R;p00X9=?Nuggwy^K>1%1A5IK>Q-t&v6 zj2bdZ)iGUzaJk#>11A0lm+u|Ic%qCjAfg^fgX6bSSRq3B84$?S&n}{ZT1c$TBgTTj z9(0O`j67>#-`84l+KBYLcT(S)B69rzf7SG*l^$R^W1@(XcimZ{F%XVSU}VJj)9Yl! zVriilMZLc-w_iFO@=HM!;~zV`(hLQikW4Xes+18>q!+Bix+-YNQfbK-bQNK0$R>0* zsox0pq&OaHx+=)Z((L86-(Eqq6_IYpG2>4)#9_V}c4ymEii!*LyAS4H^*Lq6f6+aW z?j>J$4v%iesNI~YCdvSq*8fs>F}{1JH2@wR^>x0}^Fg9H`2|DoL>u26S-5fe2|w!J zlJjX;%Zo0s>~dkd-{km{)YU$?yZM4puLI$u`NtOMxuaFefl#UT4Nv!xjnh1xT(;*2bh_UXbcyn)hfPHxaH{*s} ze*5E^@8Ml6>~PieR`cn#fW75{y-|Wck%N1>_I5wsJW7l#f-`)+4xG^Nk%DO7FCC3UMBISPMftUG)F|F>G)hKIt zJ89#!>t;WoSar|%JDsr(T6~{cx?_Ocsw7q!`0Wdjn*2l+@h~Rb+79Nk3ENZgyV^S7 zoNQNwq*Wc;W-(yhcvnWZRa4Q7Zi9+!BpKFi6$?rKmsmI~=Ehn_9331U2F$Bs{%=om zvCq}NA5}DSSP?EEV%=7eh#53r5J?34&BW=A@=38Yj~GI1esk6XxpGHnNjy-8GQVG; z5ehv~9rE|=%Y;bQ#-ItGXv*$D2Tu8wp;msVIq0!_pvw~tGJkVgM>EPLKGrs&C|~-> znRe@@mlUL%*;r{u^eq)yS$~!i+Cvc^zC3G$rR?z=CW7DQ@jIK9;V@%CM8E%xhA$OF z*GV&bQyMSa&2PG}%38S06lFX1qTNe{*&gWTSTlAM$h?py-Sr7BJTs|f{6%+5{ z7*Pu1ZU@SEv`IpqtYNfMOm8M<<*1l7dEokOy{%V%7?3^iz<z9dOi)`2Sd-fIH(g!58aBTODc>2tl7gU*%tzmO%oO6j#ePVEJ#T3u4 z3_tqYYxv#D2Yg!Q&Zv@xg9%r72INU5FIg(-*aqFR3CfE9NWu+pDUpU$xnP z)7H4A<-VQ(f0TzCD#DxDa7#6QTjhPH7~EBI{?y9cqf^`aG*uUj0@E8JUVxC#J4>5$ zj+k9OO4Q{iK39N6aRu1{u23f^JRgeu0+DndSB%ro73VZ?C1_PHD$b{~ljtnE7*~q* zaM6i^GIM39dsp@nl-EEp9B8g$X{bbhag`~47pqsQJPC1ZCRep2RLg|;6;PdH!X;3< zu7=*LsYq*yIvlvJ?s%xDNb6G|E>XXdG|Oa~k!wI5xQ5i9Yg`AKC=pF*X|5UF$E9#W zxE2bxC5^&8NXu}os3F(-n4eZR(OvW~E|o*crLsIOO#`)S3GGKhx)PQ#7BV$ZN0!lb zq9R;p7T$GHd|mZkx2A%v>v~W$t|zU}^->Ocv#PF-;>%*)TwhJUA4jF@|2hmf1=-4d z_8}OgzZjh61*y02g4NUaCVs+(Fk%B-$**98?6kD*#=`{1Xb+D z(L3FED%L&0k>Dn1%_nkpyGe6la-JWpujnWG8#iUIzc;|R1;hNWf%>m6H12ET|Npbb z?d6ztxut`@05#$SWC~?&WOH Date: Sat, 4 Jun 2016 18:56:55 -0600 Subject: [PATCH 019/121] v0.1.1 --- examples/device_details.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/device_details.py b/examples/device_details.py index 90e409c..2d42f32 100644 --- a/examples/device_details.py +++ b/examples/device_details.py @@ -33,7 +33,7 @@ def execute(dev): msg += "\tmode: {0}\n".format(dinfo['mode']) msg += "\twiphy: {0}\n".format(card.phy) if dinfo['mode'] == 'managed': - msg += "\tchannel: {0} (1 MHz), width: {2}, CF: {3}\n".format(rf2ch(dinfo['RF']), + msg += "\tchannel: {0} ({1} MHz), width: {2}, CF: {3}\n".format(rf2ch(dinfo['RF']), dinfo['RF'], dinfo['CHW'], dinfo['CF']) From 41aeffaeffe87ef8508cbf0693b7cceb40e5c60b Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sun, 5 Jun 2016 02:19:18 -0600 Subject: [PATCH 020/121] v0.1.1 --- docs/PyRIC.pdf | Bin 382487 -> 383209 bytes docs/PyRIC.tex | 28 +++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index d60b93e6cd5fe6983bf5dd495cc336e14bccef0e..595bd3552b1ea0571fb8652d0dbe36eb03fcbe02 100644 GIT binary patch delta 31262 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�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 delta 30516 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 up), type: ioctl, bring card up \item down(card,[iosock]): (ifconfig card. down), type: ioctl, bring card down +\item block(card): (rfkill block ) type: N/A, soft blocks card +\item unblock(card): (rfkill unblock ) type: N/A, removes the soft +block on card \item inetget(card,[iosock]): (ifconfig card.), type: ioctl, get ip4 address, netmask and broadcast address of card \item inetset(card,ipaddr,netmask,broadcast,[iosock]): (ifconfig card/ @@ -837,8 +840,9 @@ \subsection{Functions} \item rf2ch(f): convert frequency f to channel \end{enumerate} -\section{API: device.py}\label{sec:deviceapi} -Retrieval of the driver and chipset of a given card is found in device.py. +\section{API: hardware.py}\label{sec:deviceapi} +Hardware related: driver, chipset, manufacturer and mac address utility functions +can be found in device.py. \subsection{Constants} \begin{enumerate} @@ -848,11 +852,25 @@ \subsection{Constants} \subsection{Functions} \begin{enumerate} +\item parseoui(path): reads and stores oui data from optional into a dict +\item oui(mac): returns the oui portion of address +\item ulm(mac): returns the ulm portion of address +\item manufacturer(ouis,mac): returns the manufacturer name of given the +dict of +\item randhw(ouis): returns a random mac address given a dict of \item ifcard(dev): returns the device driver and chipset \item ifdriver(dev): returns the device driver \item ifchipset(driver): returns the chipset associated with driver \end{enumerate} +\section{API: ouifetch.py} +The file ouifetch.py retrieves and saves a tab seperated file of oui to +manufacturer name for use by hardware.py functions. From a command line, type: \\ + +\texttt{python ouifetch.py}\\ + +Optional arguments path and verbose can also be specified. + \section{API: rfkill.py}\label{sec:rfkillapi} A port of the command line tool rfkill, rfkill.py writes and reads rfkill\_event structures to /dev/rfkill using fcntl provding functionality to block and unblock @@ -860,8 +878,8 @@ \section{API: rfkill.py}\label{sec:rfkillapi} \subsection{Constants} \begin{enumerate} -\item \textbf{RFKILL\_TYPES}: list of strings corresponding to the types of devices -supported by rfkill +\item \textbf{RFKILL\_STATE}: list of boolean values corresponding to blocked, +unblocked \end{enumerate} \subsection{Functions} From e0719373d14cf034bc4059a3d977789878ad0aff Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sun, 5 Jun 2016 02:22:35 -0600 Subject: [PATCH 021/121] v0.1.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index de0fafa..2fc4624 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ https://github.com/wraith-wireless/pyric/releases/ It is not guaranteed to be st (as I tend to commit changes periodically while working on the code) and may in fact not run at all. -## 3. USING (Work in Progress) +## 3. USING Once installed, see examples/pentest.py which covers most pyw functions or read throuhg PyRIC.pdf. However, for those impatient types: From cdbf05b2b9972024db50462d3e73c8ac8288389b Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Wed, 8 Jun 2016 16:08:17 -0600 Subject: [PATCH 022/121] v0.1.1 minor formatting --- TODO | 5 +++++ docs/PyRIC.pdf | Bin 383209 -> 383238 bytes docs/PyRIC.tex | 4 ++-- pyric/pyw.py | 2 +- setup.py | 6 +++--- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/TODO b/TODO index b13d22e..abb0020 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,11 @@ 1) overall o make a cli as well o determine if rfkill issue is related only to ubuntu + o ethtool uses ioctl but does not follow same pattern as ifconfig seems + to use however, see below, may be something worth researching although it + is not vital information and therefore of low priority + - ethtool -i gives driver information including firmware-version + - ethool -S gives some statistics 2) libnl.py o see (1) in RFI 4) pyw diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 595bd3552b1ea0571fb8652d0dbe36eb03fcbe02..cce769cf5f4de1e2a189fd49679fcb8fc075be65 100644 GIT binary patch delta 18712 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 HMNdWwAf`op delta 18695 zcmV)NK)1h!vKQ&G7my?ZGc=ds0s<+2SWR==HW0o0SMUhVlrX+Y=2S_IJ4&avr&W?e z+5;`ImTH>Pkd$Tr`|J{+zRX&dlcsf~iz$QL1@M6P_5sYh_L%qc3Hyg^K#%QWU>Y97Qc4I{R2X5y-pzB@pZ>x2Cm1(& zv@lPus8psNZ2&K5D4|>r zI#<{qna(SCM%p26ZU?t+H20?3=nL=(3<0su@i1WX>E~Y*w zb7&>`$PWyQ3BaludzBCV@Ad#NFFD|S3b7Iq!&7C8XaRU;v3UTetsHYsiZ zeih53OzefU-e}#f3IT^I7IIe`!ba=s+R)F-D#=r~zG#kG=GjZ@q7(beBZ35(SJN}vqoScXPz-<|h+ zC7K5%$PD%JVL@lu-vi7l(%(Yo&1Ne=8>`1))NpVak&8SHs>!XJ^qrf=C5|0@%A`a; zfOy&Wzfb)D-VE{eO9q4Nd#M1<1_Fh zFhYP)NTwMg6YB3=ocYVqj-S+TxvZMcW$Z6$k*66_(=jlcT;&%+{nSS?5ou?r8w zk?^m$stistoV8MaK{ud_B@<@z>hxk>&FZt(%Ar@qG_wtVFwG`TrK=47+>Nm zfs!*glXAkI6c)7M z=>&e&)*C$L8hJd7?NWqRL3{ePp@WKscwbyW7ES(6hgEsn%aXE8(Sf$J?qCZ@E5d3A z!qOsq=0}pu>jTTsUEYLWdj36F`BVF!gInaQ3&Ikv%hwQPYnFm?1_FJhQ^l3`ucFvR-|&wTTI#V&O$54+Z>74PuN%!OlD54XHoW7jw- zMhhfWQlx9_V(1XUUF>oeyjL59Sbx{#;@?V2A20Scxq7uh0KAXn+JBv%f%ocqkZZ~~ zSZ)(j&6=z8jc?x$PCf(k*y7a+Wo~41baG{3Z3<OMM>H$Wna=x1{Vih~DZr*=W7CFD_0$~r*=<|W^kBQD11WXpD z40AN1jDDS^v2*?QU5kHV;S}iF_xMM5m@?HrY4Ayev)}V!^kPK!>h<;8AMFYpSNWfL z@%~s&IKgvq?6L<`1I`Rw$&add_!+?Vf5^nX_lzq3biuuXGqRI{TeU|8H;R?xtKTcQ zl9{fkKMn%4vj2Cr@}C)7jQsy>S5vLl^FTQrKZ<|yrewCaRiPWJ!R$ej z#G~2$Y^Fed82fl8q{{$iamuHG!4+K9c?Fd|@Sq7qp>g8e?0Z(IAdnR-(f2&e+Z&@w(nBOjjcK0|1 zGE2YFCht%ngdLv^!LiAkYTMW20vuTx9@;%zW%H%w*^yE(D{@oH5CB-2e6z{Bs>thl z&s4yVzBl`B-8SHAF(`L4pXiBzow;tl-PRyVA~;CH!B2le#}=mAc0%2ms_S&alZu{b zJmxcbyw34Vwt#Rp$Xd*mV{~qH$=zWIDga58Kn_#{5Iq)bbRlr_d{1I?V^KeF#qV1r z?1=gSwbbUUK>%cQ_P|$UNMLVk%X2^l55z0r6focOh!pbuiD$yJXaRYG$Hx@fXv=hx zn+$S!PV#?s*Ke6LZrd8Y&5b^x8n94nhHI{6nVo`(%hsIJuD2Rfi%Ok;i*J%fuqTS0 zhN5LB4DZ*2Pe%#v{i*Yra2V^ z1kjfFz8fhKq}-3@SJ;te0W3+bLWi!3b6G9STu&tfC)CmqZg5TMA#)1O83LU}=v3gm zd;jK&*WuOd;*Ri;4l_Wu)C3v%5)g#G)_JK7k8!;o)^queafdWcZW&rtmMyzvfes)K z21|bsFGPoFjI@F=L?!q*Zt5FM3z|U|a{&j-GL5cJO4&kCWZ`o zQ9MvZ;Z7!pg4MQ}hbZw8cPufVe#7);x*)=b3IflNkxP0~lg=_A47Ges$g z-N?(PE)qT~Hqj}d1aMk77oe$|1>q4?2|#s)kL56x#2V6%SRLKGmjy{eIPuBZ+hKnN zJjqh8fh)LeSXi2N!=nllY?^@&O7mev4hc2byC7SB$Hiw50FZJ#@|CAqosC#R0E(43 z#6f$bu@rOrL*2WiPvRn_a;&x%M|vE6O0Y)HvBc}#?$7#a1jF#eSKllrmz8j0SM#M5 zp-1j6cxg{g^aP(eG@Y|W6u2r$rg4AwN}7fcDqz)NONApysHVF>=;I*@h=GM8C?OCaL&WP9dpurbR z;rH;ug_`q zu4>3~(A7h%p;}gE4P+_u8=4e)+dXo3KO1`?Ic6fK+K9ajn){(n=>>nZ7T#U?arjd(o60TPKYudNLry*uZRPONStaQx5$p27BlYE5KrU;h_s0 z`a_9p_}=hSR5?R^IdKDOnE+L}uA-+EVo#!mR2svxk+TqUb6HqZiEP`6j4?%OkxKZe zaGDff-eE%=P=f|*cidP}^5&_q=ERwY^N*0Gj zviRetM7}@0ep>&WZWd`0*GZi&UiXVCTU1FMCk3q9#owb|kE1&1z_cLRhq|TQ8VAVC8qN%8jy=Tjr6zkas>ypGuk#f z4yUpzPU%T*c;%QTu0IDZ^JFIPpnjg04g)1N!t zi>z|m?N6rbKxJ87M5^nUb7ScOCYeUM(ue$?0MVl!5O|Ld2wL;*^x|d zrZsrL3RfNE|0A>)jI1I?9Q?H%! z5)X#WtleIbTRic2F-~`&BIeMr6AS6fZ!)`*hnd^*zvA|w{aOqQI@E`$Q+{w)QQy!j zWB(H-Hvc;lM^wOtVelUGF!Z1g<^sGK9xlYWtoFScPfwPE5OsrU8#Rgpi>rTklbKdB zo!MVSO@GXQQ>__(Cyqq<=xEM2iS9w+%-fQ(^7q$i$S)xjnU#=WKE%EG$q~&tozIl3 z2j{gYWAvaGOno2XU%$;uGxR-hGyWf_rRSp7>W|b5#kzijGQXziJBB_4|-eh3cq z=u{t^8hUP1TK)a)1Sw_RLUougBro@T^t~0pU4PD28lm+>e9U!7cdLYA{#dfPNOLQI zjX+lA&-(e%wl6d1Izw;SEL?GmLv#_uOfjkTiY z=yvb!0dAaDo?Bz8N7V2bJ|s^|)RI)7`+Sk6ab1=fY7zRKB8#h1`kgd}MkGzMGWrR6 zD1W&AbfEe+fI`v#>4s-JV8@iiWt~5@%VnNK$_=AtkXm^H_Oizxt1+Mv!p0ZBe_L*I zC=>=;YFuMiMHSck^Z0qaKHv`aFS{57TVIHD6?zm|b3=v4_n|R&xW;}B<_bI0@7ivg zWNEs#w|Sxpt!1@|jChytc;nZG0j^_s0)O`Y;>^LoPKQs^271hP`y?7(3hvSJb@$F$ zNX-RreQ2le%v88Z=iiKC#5nC{2Oey|iEYqK{0rVV$h-r}E;4TY0Vru?(*l!M;w~8N zJb93+%F^idsGVj46#&%h4sG*hhG}Hnc!Vsy2kA$?~ZGAEoJAVdoWC1LDe57 zN6iSpssoX&^3oKcmu-q*4SBr3ycF zG}2_wsHbwvDE?8fy{j1)lWn!@uH=lkmSo3^6ZhIy&)RO}<_jf2ePkiZ@+`qHYS~&@ zuuDeu1{nOti{ODUYjSuIa(~a?d#;7Ws8x?C{K|J2$2|T zdZd|p#={dc!u-&L)(B&<7R`4Ur9a>wn}pPdU(y)$-k71X`qos@OoJ30{{V1B2g7Zu zijzSN4>X26_wmk)GuS5~*h>XRc%XUG@WP_ZE_B4M6kvX zr5LfFFgqZ$lb>;xmw&h6gO}*Ncnqr!t~Hj(BCWxZ1OPpwX5Y7Nc!>Z}a^%mDlR&#dIo#|@cjk%TucWaryo9KcvI7CjOsT`IyG;!^v(QlF}t_Q4KN7f z@VkFh&vVH8zf|$lAhF2uG={{tSmn^gX2MqfMDvH&PyYtmLHNd(0rmqEle!iZ0y#F9 z0dxZ?f2A4Oj^oDheZE5Q%TmCI=6x72g3Trl)&Vw-cK|=^?n4jRl9=Hk^BC>?ed_8a zsnLv`&5OFbSY2IJU00X9&0*th{&C~U_}9Ce?|<@>jqka+m;0N${U!}Ish7K61gmoM z$@$pbZg*jxIOpRw$ebrwWT8`5B~RYt5IAMWf6MV$4Lnn=V666;uhl4Yx>hrV?{MpP zvSk~jj-qXU+3w;zc78kRc5z_neD=bqAB4&mT{q@AX4?qC*=K07l zeZU8}$xZ7P6dd|-iXzGfvq$;3^$~;V@D`2=oIS_p8Sa@0(+=Ct&ja3Sey=toZiRWY% z2t&RRtF1FH@O_5%`uC~ob!k?rB>tINf8R}q51261&~npU;`kSoNv@*Hq?5! zCgZt6<%Ut}v>lH{*EC2eb67!H?%Zv`H01Mm#9P6c{yGXC>OQ8cMEH?R;SqV!3{m5# zx4zSy@EX|?krGi%oCm_xCx#BwJy}8l8*0Q?Fd1+%ur?Mu6)&5rtq`HXbEihQf8h%t z>`~QA*<%)+c%SS>K33z!BsrS@E=)bAsMRp&ffsZxjEZsKT-;qP&P{XF9}09|k?R7s z(LU`tA9XMA6I=W+RQI)jI4Z!zpur9jZIlxgD@%wC%mAwDk^uV=DD|3MAH|i(UZxA_ z@dHYau3}k7;B21w33Y)`*(m#1e&JX%O#48&(E-F=146?fOBBv5!l6x=?s^(N{`HU9vJk}JP z-b%cX&}W5&k~Ls$od_2cS4+~8MS*Ms0@Z?Hys9b`<#+&5LJ84Q>-t_5DB=TzZ{Xzn zpTcnC`)(e`0ah@;Sdh7KBAoed022B^?0kSkMc0_d&O1n!K<#mhfBdxgi&rr)y>&%| z^gK7tL#B7fc@M&_?i&=-OVHl~0)RDeF9Rpj zparwy1f+YC_-OJ4g~bC>SNAyO{F|6GDk)qN2_C5T6!^Wwf)p=_k~Xdh;ktjgW~`PE zl+fHnFIV{4i@gu;f8W92yL?-$q%c?nDpoySxabYg&J{@vKvmP}io8m`9%*F@fe>Sf zF%YdW8jGb=Ul7S6LETRi1BD3dxj`pf>Li^e-#n1+$_()LVedaclAF? zc{-veJYAI(s3$K<3LELRz)Ne965RUhOOgl*+M88|r6uxX;#`pS{z&@BO;eFR{wCqE zvW$r9E8<6<>j&ve;;)?kPsslVvViY+Ve)_7BzfeuYfRlBNemWP9Y@VIrO*ws$l$zt zfl}zX>4ioje-<$`R}Aa>VeBETLO{J0NXugf!77fO|L9_5fCM_2Re~~SZdmN6w&1u- z%Ry_N$Q^_xyred~AQF~~BiUI;p%TN{E`>ahrk7QeBo$>`cPRSmgeP9jEIU+W8cKdi zOnwO^zo63oOa^%i$uJ06$1saHNdu&TnwW|um@6L6f4!n|OA>Z3A0f)OvRM$v>4e!6 zAtOV6Eruh~cD`hE`4 zY(^W^gGqZn#}MBWgF(RBj{tB!R;ECp+JhewdZ2rIGxGjf&47Zp0c9kAp_%}I53POj zKPOt1@){<6P&olm*h>Bd9su#nUuzEB+mrz&f7K~V62YQ8$p&}wC`6C!C8X}*na`k8 zUp1Hfd7MJi7-yz7%zn z+)Y9oD|$YFt3oo*5Ni2(p9fnAs0*O+}2*S%Qlq7 zZca92!v$pV$cHRa;hPs{ikg&Y_7Nlrw3qgzX`!ot8{HiRW3G4&8&~^FR9}RNx9H3!rsoJyj_fd@TZ6IU zyC}vQvt*K*Cz|Y=-&55@a|SV-nQi@QWrsw1covT;do5yr5e$cgr zb`37nxLz)}|D>*U6mb;Cv8hm4oQd7SY&Kg&ETv0ts|19aA~ds|rYOzPf4yjy&4REe z;}&X3;^dxd8OsM*2Lv=#Q|(u>8AK82nws6CxFld3Cxqz}^&KbSr|9@j`>uAcDd}z7 zNk#x0vOU!>7PfGL|3*kRrV*QbBEy?x+p1+EP9c9T#FFRGj;S0{?ZFs3d00%!VF+zl>l!6JG(`$>Pa{AE*w)iMWK_ zNvdXRPc!-74`+=sPYqar7FWA16bf_M+0!LrFZn2c?$ELHrjw2kH#31ZHJH~Qf6ae5hxrDwX__YV_KDmG9!*)|rb)JXBZV>cU2ohr^4-5e z=m8fQh!s&JMe=|?N;1X#8YRcNyJj`R#FI|2z>eHjPANvdE-5FIvPtqpZxRuh3(m9Pw#q)J5RW%MTQ zPS1o%V|7nLvn&eQzm4qTJA$oI`=O+H!1BQNjA|c`#kQR#817Khf z8m|sQM5XcH4>FOv4jC=09Z#nf?7QR>j|rX(^BjBAKdu0`DSHeW&Z6nR41ucund!kOfutu zV;LyM{4Q5q&TNz!F%Ce_phX}_X`pru=*|HD&Rl8Eet{6rFjyTSt8=F{tPg&q=#TT9V zWBo&JbfR)|cOf#7)_loA?h(mz67e^0)2M{@p8!KT8{N{V#fESi)zR-eG)Z7ZPU?_4 zffAc#d13|3nrDfGE|S<^s(z@N%hNLnrzt`5l*-~4r&fQ)t7bM-ZNok9nz|oW7w@Km zeI~S`DM4@&Ei_Mgeg%>wosJQMOY<<~3cCa;PjuMW z9?~TE#G!wpDX}18oDLS#aIN(H&;dOYulupzGsbpX(0XTXa6&`!V2!$`B`KURL=9h8 zI3YsPnR}FQeoc+k&LsEU!BH&3=dao3iAu%ceb{|}LAU1ecmZD>FR9$px1;ZH*V|d0;xHjC#0P%>3^^L8RSaeU;j=ry@<`U$OWvDpKoDFDm$j4L!@LvSeiXV z&q06SAuKec)rK_Opw8dbZJ9nuXFgy{(j8lpKg5<8aO}&|42TKv*k52bjCJZjWRk4wd=z~0FExtiZ9QK zFVBiD&j>t&fkA&<{nBu~$<#6ROY<$1^h-_j>uc{-!6h}<$K0#ZiPgag>v6B7exHBL ztwbK1XIc{WK2DyI6wVpxCjWe!YGw=+C2|_WMrQSiO%v2`Dm=qF> z3gKMEU@-=F+lWt*ze(9)fPMQOEgD`mq&{ArNK29AX@1PJmMVb|gU>qOo^|lJsb+Jk z$n0}ioP$dM?tuR7ggE466F%ijK68K1VBmbEoutEa#JZsbi3{rU|knn#U|;R&)Um zGygk}1uF2k3Qs4UAG*rl5VuNh3QqunCVA3xW4~JR=Gt!X;Vogo`zU{XpNu3jlcX+? zc-`YXsf}N)hpV=snc%Wnw6~#uNiP()Tp3?$#xWhk z-g}U~Oe21n7U5&QSW1VJ^wiFsn>36@~%R^HY4BDFMC0tL$S4GqKx=)tGrVW~aj;_4L#-j5HAJ)#K-Tb<$>#={GrlaR5q|&acxgUs+ zS38*CR}6#;=U2Y>`}n`?=#lKED)E>!MSJ+RzY$TcqEaBF72rA4sNA{WgX8Tyn|J=t zm2YNio{80VweVfgE}EX6&tRs~-&8ZtW#&n>?CFgUr!BkchHX=z8E>3?b5rCCNF=NpxNTNzmk|1jvg-F;^{-^B%PSwoYZZYnIG&-pL#YV<) zf_BxEBgP#Y@I0tJXcKI_f0!7{AjTkml2Zr3l42H&x>4h^rWqeXq42Zs;55M4>okq) z>Y_o3kr@3^H=h8YLRZy}U7ywfdhSITWkZWJxDGpo1~7jF^8)sTqMEx6U6OBNCQB-e zAL#}mhL)o9JZ9% z87T^m1mvpY<{c-3)m2k(My-)zy9#TpQDd+~juyK8`vG+UHnGnxk>sGGf{`PQ0#>+d z*|f`mg*ZllTSfk}IYJ}iD80?t9d4F~l~q5Zk$r#9x{M2&^T4UhVhigEcd^WFy4V14 zN;Mb&q!kQ+6>I?PXaFq!2k?Hc-1UCOB0)Nsxdl;zg#%WUr= zfWT z%^UQB?w80-Y`iLZE))zdioTlhun7+D*p54fOw~+w&d@Wo~41baI!t zzyu6~3t@)~VF8B=VFHH>VFQN?VFb4eVFk|w0W+5|5CkfJt>U?ci#!KRcT%t}-yWvdJ@Z3MLAKS+X20j9`C7>@`u;zNR4tQkpp%zB^@;@cRKltXIVLxy4OQu>?!*|JLEvG`DQFa7LiRFrI#N< zk$y7KSw~m&3GVop0ha_6mlkIQ7MIHp1uVA)W(5%ew}og0&`$w3lR*wCe_U&CB*%6A z&R@|V69n5+?*||luvV6=#Igmg;y76B2Wmx0Or%|bS>Y@%GA_ zsRlPWlrcU`9@(sOlSg$9f5knj^!%StnMqTys2gPh-k6Xt;3e7O8s&;{SJAK;bqXj~ zOPm5;WbigL###RNlXD?Xu}seMf1X^xOA?w8vqJ;Xz7(c}cIFhWkaQ)cDItG#c1n5j z#`-DS$)llDHfX8|Q)bf*?tA>NamvUSD()u?L`hRY{*>HRLH>-!e-z{|=yyT>ihg70 zf(AbJ;aLJ&xXsW|lloU81ZmPCogpl1hly(>nYeL~O zPF%zcISd6-7zj*@e>Ewz5k#us>@XhIRDi`G=HEE1@M1K7Hkv1YI~EZ&X5!(pAt zTnWgB*I>Eee@+}ArfOvhZ^uIO7%amDg4dv2#1viy%)X6*xiF|UR`eurg`!KCUyOjm zWJT7F0ZB+z4iEas^<|5*d5T<27>1a5r(!-Mt}qm6e#EHQf10oW(PLvUvATz&dV8)Ux^d?)}?WHxJWm zwD7afr_HxFe}9m&bi3d7%Nl>EZL0B4ZD!hQX1HvON85;NYm@+)?@ns7k4HXJY0>sn==GzPl`N&Fw!iGPKV8)RW8d$QPeJt-P4V@)`W4)6 zzk>Nq=0z>0OR+S>y*B&H+N>I<+kEMwk9!|#sOL0v^Tpl!55JOkO0(OGmiwDmn{V%~ z-`)Spe?o8nF>PMH+I)8NKeumhzWL(QY4hduaQETnv4uBKi5>jgU%vaVo3}mJm%o76 zd}NZ43Eh49u`$@2tmrQsgJYl3)^u(620XVsOK<94Z}LgKN#@Bgb_|k_pvI+$koE{w zvX^!7uyj1Q4xd3frah*W!e#AO1AQr5O?&Gnf92)#lZQ?;hGEZ~CjvpRa$pY1Q?ne0BYBcgvQ~ zf2Jw*_*+wNdX7(9&!!iCdO=HIrj6~59tL)1w>?eLe>%Nsjs5)g?*8HBPuF*#l~LG3Bckds*zxe?a40j4Ru-u7mbCax5z zIMyr-f#YHqg}n_)b!)m#b-^YMLk(-%Pjx}D*7dZek$)i>>^#OqE-XexE;txQt~h@R zYrEJEK3}gahfS_nF345jFv=BewMnjM)|HmfxN3?jlfy0aX0rmy70z zTQAsx6T!Z9y6#=-PXqnh^`)%+HY`GI4sC23Ui zf@2(FFKwYe%nPS_9j%}1o0EUh&76sDW_sc1fuhp>WOOsf&~4Q>2D&Y5QKMTC)#x>t z17@k87ZM`Z>)r9x9JqJrsX6i59DK)7dZcn5Z|7ruIiCNN^C>8ZkGvh2;qjSwY$R{k zMZ{C+RYXZhf;bQ?0;?juivvf25y?(zyfYyWx%J4CLAanh=WrH&K8=5r5z+eTFh25B zPvK}g$jDO}lx!Cm>H8I6#8Ek~B`jx(n z^fm_Drg{P^F}P2~V86{UqhPR0yA0E%J%;JhV3<(bLN|Ceg$+aC>6U+s6w@sw9cgBz=GRDO zd%o1zOZPOWt|R4St^Ezl`*NYax|Cb)sjhA}+4P&e9v^1wRT=~5XMETy%UU`ZGVOkq zr2NR&pL;`P8fV7Bv^mgEd$W6b$=@2Fn%R;k$P5pVYe$^?KuQmoYezjOQGn&`IKa4Z zWI`DZl#M7GEzy4rhbNHX0HVf39K(Tp80KVlWC;#Tvr_U=t{vO_y-68zP3pLSJVUC9 z!|lqNjCZy}m^_Y3T*P4siPVNkEpbGWbdgEO-42u}(2GY)E6TM4WuabIWlF%Cpjg** zgyZi>FP{8SkwvM~PY2}|PySS4#S=?7mT)ZL;t*iqvQ~ezd%BrKxyRS!M4Ja$wZj0x zkR+>w-fGIdW-OdoASeOF1VN!EHi#A?7l#CNBEV>T5&_0=FA-q4>qLM>#>|P-#FrJ7 z)N~@haMy|W!d)lQi@|pyycn(~c96)PYDp`G5Jp`UQFRzxWrq^v#MA*9<&4sZoESP1 zBLYPuLg#ZjEuGO65c+%Z%@egAzE= z$rwW?IvE4VL?>em+0e=8WE7nYEf_i(UOIF#yi{~Dd^Aq<#mW^TCZ`^(xm?hoEvg$n zf@%gsaiU{ZR;}z*&S^uH+fwn|mWt<;iibWa6%T)%8Y&)U$PE<_v*Lz|XBe&-6_s&H z#lzc`iifuk70>eRgOV`H(I{f$f>p%E1*eFO3tkZ$7lI--E<{CaoG?rh8yB)7HZBZx z6KxUtNzK`o@eE&Sk@qnkvea`4QQad%&X~LsqBXruh-izaqt1t?>!eljq39JIDtmNj zPbGhKd8niixuFT(gXdF}uzE=JDK&w?tzN;JP+r2CFkZr%5MIJs%I8i+*ypCvB;lq@ zdf)oV@aGVpe=1fDW=zGZ#^|XiV=5x8iO0^*G!hFB?zI>iA`d&i zVjz!BP!0mE){u`q9nm~1&F%MklfkoHQ&*U7cdDNu6P9u+KbnfS#wnm-bs4rLS1W(L zcCueR-MaHA>)x{Dq(*$=u>Umn4MnN$*vN6DUHeUUs;wM*%R=rCvu&ErIuC9 z9(kcxjK>#x1w8UXuOhc2_(5g8&?|rLClLWoCOSAOTM!j36|O}lDlCjlRQLdyXwl@e zYVs*6KyI5-6vfoOMmL;|AUZw>+0=q)s_w3{5M7<76j;P3Hzz1V}DVFLf$U7F-ln2Q6H| z?ozs7_m=_21up^Tmodf#Ndc{wd&UJfNFaNO^=#x2Hx6>49S{u;V#Slx4Exz(t6J3- zH5`tnw8MUyr`XW|=4Q2?;qa@?Y?bH7EM+*tIrcGnT_3lKVWEsW{(0?VCztxh1&sp% z|9qE<#|89%oNWwxN}x#FR86|^OdM_)A41tRK7_JodNT(ph^5r<&<`Lu?!v%N4JC>}4 zuEPE}cMj*f{eoc@=peLhS{+bv`>?V4yMdv@wsV9=DBH{ za}H~#cw5FLun+x;V;cHnm9ysnC#4uL4D`j>SN#w}&=dXqGvF{>UVd^nQjRIYT~ z;&GWTaX*&jaj&AbaTM0T*cL+y_5a?JxJ8hHxM#4YgScm!@{$K93gVq%l(&u{3{KfY zf(SW(a+MMG!XVPDxQYllaupGBh(k*thX5QxVL3*tSZ(NJV==1c1!6hWvU`X7V}^2bJm z{h|LMC=L;V;t(My4iSRl5J9*ke+NWJZ(-GcYYX^`AVOd(N5>9w5QLR6YE8H?#At|K zk%JI}A_qZ598n`niW~$Lal~MQqR2r|5k~|$9dQ)4B96jV#8KFaI0{=4M?pm#QFl&? z4g?i(#9azS(*YH6M3gm}4vdH+(g785#1-u|9ay;D>0;gOyW33h;^SGkAiZ$E zw3rzzB#J1ku9-`|%%Rr-c`A;HQs+iVYMyf+J}k}I93vIIVGNG%!R(T*O+1>}ZDm>8 zo$4ICT=i!)c4vrY1(cdyrf(9fs%4ECbn_kChpK7#TL^07tCgT9;>DIa%b zx=;`OGST?YV#ic+-WFwE2J7>DqRA|yHfPU*=(6d=kT(SIm=ME#-c z8Jl|;!0VOl5#5Kfr>YSAAes+lk0?HrJynaFszUIiQ6czIl%7JXG#VXG8i%dj@W-X9LjGuVe15cA5sX$Vf>GJpN%Vul`lxK}c%Rki9<4_A zXf?V=tI<6=9Zwpajwg*y$CE~PZak?iPjD1l;5pHZTdSXa$5PyjCyo2@q*29_y4>+< z{SUk)p;2eEbN9d=rZ|@s=X3La(Hgz+uq_RNVjz9k+5c1z$M7$23!VXz&`v0-eUHjC z%k|powf)r7;+j`l>oWsI8Dg21bkAWHXEl(UVWsW-OuLu1H5}AEFx#(sj*imr5tD@P zM|L}fX3EO(F{D1SU+J-!{2jmSnc?{7?@@XTk})Vk(>W(zX&NyqO(RBsrD?3tNyCZhGbFj9$AsW6-Y77<9Z^3_4ydjuG)3ZwE^6aeXtz>*;0pplt1C<`_A$HB-`08q`9S@Mm+_>0OF5P&J#8d zHNy+dWzRw~HJGh?E_Xoek)4&??td7t+P?1bBoA{+1Fc6wN$9M9RsNe;R8({vCJpW( z34;~J;i2F@hcwIvQIuEWk?5`@b)veG)MXWQ8;9ZnzX(A0N(9PVG%Ih>tgN>|#;mtN z#+)>EQRLtDb9_dmDp)kk{AfOT#z%Q-(s@BB%<+wRtBU%m)b_UZNgP5Z%+ zy}8>Oh4v$*ZCR-OP8yq|3SunhzkFw8ci&wed$(6x`45nL{>aKbe`VzZe*;K%Vr|m5QnBg;TeWG(7lUM$Rr+m+{aA6qn@A1x*JvFfuVXFfx}o z&jlO@H83(UI50A|Th9dt0z)`CG&eIaH$gBqMng43IYl)!K{G}MKv`+Ge$WyG%_^ZnQv z%M8XoGS;#0`dD z&&Tha^ZR|5&-e5BoL>+G!Go9}$mvAjf*>}~rwq|c^blP|Cuf^n^mKp-MT`sl{^*_w z?}EG+qsvUuR%Cw{*<28RHhR!XG!uuqI-Eo9v3uB;xeX7 zbT3xqb3yye=rT(b5cyq@_V)@3iGnW3EY7w@JQm%HcQN@!N1qCdI2R1P6u6j}vC+Mv zqKJ#}`2rVKSQy}WK36s8iQxC>Ll=qsf}Nf&?i+!kGy5v5(2@nUpYRwTMG zt9o=HF!zM(-$LO-6sNlkpccZUV7L{B$zGZZoEULJ0a!PbrQ&e@~ z)Ml)C>UDU#9K7=!Oj`oeJaqsC(o)=ps|xnd+QKi|+ckyr`s46xqPPM7od>_Y4ZkbwH?-0lN8#pNxU~}g zP=bH_`61l?8t!C+yYcW>9NY`wertG8NbC!ocTNy1AM$1I34}L7;OevbX@n&q0Z8 zP;v*9It-p=w)*jE&l2$-+D0;&*VpG-J?)dx_W z^YAsas+w(})}-iU8jB{Psq?i-249D?^>v3py#Y|aNA$hsqJ?Pbe1ncWXc!BP6oba? zpvm7=+gh{{4?Evfn{LMW`sQ1q#aL)L8d^1k)}KO~tI$?cw$u08QyRWw4xw#zt^1ZMX1mrDt|!5-&EYp?#P3@34gL0}^6J)2_(P@f zr;hu!TFd`Bz#S#wU0S67OF4c|>3yGfqklkfEZ}6!b%q#<-9oyzd0u}{W*Z?J!&~-u zAqQ)=T%@SwW_^~2L$SP6faRMAv2<1|P!tOC+Oa}Zx5e#(c$$$FNsYqUO{9wM&Wds# zmcW9n7-?q3$$KkFZ?aOFs7!uHK&|w;MDer1c=>EsYYgbbT+Kcb@fH3cYzj+9Q;K_0g&_$X$DsSEYaTCFQN(cIZ$0vP_c8 zvM3E3Kr6L@6qpUtF9yd&>+3BZ5q+Eu;SFX_6cM~7?WxaTsKPmn1h!{LE*s9D2^&H6 z*hmffEVX5$c=y<74Larrc#gcXaf4ty^=1=j4>oaKG~1)1ujuD&((LHoW6t=yrBD6! quP=0V=y3G^&pQn}xSQV|z7+f)1_Auxm)+O}APF@%3MC~)PeuyD<1S4A diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 2ed874e..6efdead 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -170,8 +170,8 @@ \subsection{Background} \subsection{Naming Conventions} The terms interface, device and radio are all used interchangeably throughout to -refer to a network interface card (NIC). The following terms will always have one -meaning: +refer to a network interface controller (NIC). The following terms will always +have one meaning: \begin{itemize} \item \textbf{dev} - the device name i.e. wlan0 or eth0 of a NIC, \item \textbf{phy} - the physical index of a NIC i.e. the 0 in phy0, diff --git a/pyric/pyw.py b/pyric/pyw.py index ad12c23..5542a6b 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -256,7 +256,7 @@ def regset(rd, *argv): class Card(tuple): """ - A wireless network interface card - Wrapper around a tuple + A wireless network interface controller - Wrapper around a tuple t = (physical index,device name, interface index) Exposes the following properties: (callable by '.'): phy: physical index diff --git a/setup.py b/setup.py index de86ca8..354ccac 100644 --- a/setup.py +++ b/setup.py @@ -35,9 +35,9 @@ import pyric long_desc = """ - PyRIC is Linux wireless network interface card library. It provides the ability to - manipuate, identify and enumerate your system's wireless cards. PyRIC is a pure - python port of a subset of the functionality provided by iw, ifconfig, iwconfig + PyRIC is Linux wireless network interface controller library. It provides the + ability to manipuate, identify and enumerate your system's wireless cards. PyRIC + is a pure python port of a subset of the functionality provided by iw, ifconfig, and rfkill. PyRIC is: From db4037305de789adee5b4c2bee79b0d921b9adab Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Wed, 8 Jun 2016 16:34:02 -0600 Subject: [PATCH 023/121] v0.1.1 minor formatting --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2fc4624..1a253ee 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ [![Downloads per month on PyPI](https://img.shields.io/pypi/dm/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) ![Supported Python Versions](https://img.shields.io/pypi/pyversions/PyRIC.svg) ![Software status](https://img.shields.io/pypi/status/PyRIC.svg) +[![Documentation Status](https://readthedocs.org/projects/pyric/badge/?version=latest)](http://pyric.readthedocs.io/en/latest/?badge=latest) ## 1 DESCRIPTION: PyRIC (is a Linux only) library providing wireless developers and pentesters the From 6148069152374d65e399f275a6c1a71576053a3d Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Wed, 8 Jun 2016 17:48:08 -0600 Subject: [PATCH 024/121] v0.1.1 minor formatting --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 5e831dd..2b5f45b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,4 +1,4 @@ -# pip distribution +# pip installation and distribution [bdist_wheel] universal=1 description-file = README.md \ No newline at end of file From 2093164b98c46c82b5075b2db818e95e07b6e8e1 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Wed, 8 Jun 2016 17:49:02 -0600 Subject: [PATCH 025/121] v0.1.1 minor formatting --- __init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__init__.py b/__init__.py index 0321a1a..a4c8b62 100644 --- a/__init__.py +++ b/__init__.py @@ -1,3 +1,3 @@ # PyRIC root Distribution directory # Do not import from this directory i.e from PyRIC import foobar -# use pip to install or import from pyric +# use pip ('sudo pip install PyRIC') to install or import from pyric From 817e22aeff6321cf6df9b7d8f6978f788bf5e7e1 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Wed, 8 Jun 2016 17:49:34 -0600 Subject: [PATCH 026/121] v0.1.1 minor formatting --- LICENSE | 1 + 1 file changed, 1 insertion(+) diff --git a/LICENSE b/LICENSE index 80fa603..0ac7396 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,5 @@ PyRIC: Python Radio Interface Controller +Python wireless library Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) This program is free software: you can redistribute it and/or modify it under From 496c60383ce827b996bccd12b697078ebeae7385 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Thu, 9 Jun 2016 16:41:20 -0600 Subject: [PATCH 027/121] v0.1.1 minor formatting --- pyric/lib/libnl.py | 4 +++- pyric/pyw.py | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index e2b3190..ddaf68b 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -472,7 +472,6 @@ def nla_parse(msg,l,mtype,stream,idx): # Note: we use unpack_from which will ignore the null bytes in numeric # datatypes & for strings, strip trailing null bytes - #if dt == nlh.NLA_STRING or dt == nlh.NLA_UNSPEC: a = _nla_strip_(a) # dt == nlh.NLA_UNSPEC: ignore if dt == nlh.NLA_STRING: a = _nla_strip_(a) elif dt == nlh.NLA_NESTED: a = nla_parse_nested(a) @@ -486,6 +485,9 @@ def nla_parse(msg,l,mtype,stream,idx): except struct.error: # append as Error, stripping null bytes nla_put(msg,_nla_strip_(a),atype,nlh.NLA_ERROR) + except MemoryError as e: + raise pyric.error(pyric.EUNDEF, + "Parsing attr type {0} failed due to {1}",atype,e) idx = nlh.NLMSG_ALIGN(idx + alen) # move index to next attr def nla_parse_nested(nested): diff --git a/pyric/pyw.py b/pyric/pyw.py index 5542a6b..3c89042 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -812,7 +812,6 @@ def phyinfo(card, *argv): info['scan_ssids'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS) # nested attributes bands = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_BANDS) - #info['freqs'] = nl80211_parse_freqs(bands) info['freqs'] = _getfreqs_(bands) modes = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_IFTYPES) info['modes'] = [_iftypes_(struct.unpack('>H', mode)[0]) for mode in modes] From b9f2eb67ad6a8b79a2cfb8457da82ebd8d404d05 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Thu, 9 Jun 2016 17:57:38 -0600 Subject: [PATCH 028/121] v0.1.1 minor formatting --- pyric/pyw.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyric/pyw.py b/pyric/pyw.py index 3c89042..3817fa2 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -794,6 +794,7 @@ def phyinfo(card, *argv): nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) + except AttributeError as e: raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) From b45fd36f2e469314adcf05f00782b0c58c8210e4 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Thu, 9 Jun 2016 17:58:52 -0600 Subject: [PATCH 029/121] v0.1.1 minor formatting --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1a253ee..009ed83 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@ ## Linux wireless library for the Python Wireless Developer and Pentester [![License: GPLv3](https://img.shields.io/pypi/l/PyRIC.svg)](https://github.com/wraith-wireless/PyRIC/blob/master/LICENSE) -[![Current version at PyPI](https://img.shields.io/pypi/v/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) +[![GitHub Version](https://img.shields.io/github/tag/strongloop/express.svg?maxAge=2592000)]() +[![PyPI Version](https://img.shields.io/pypi/v/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) [![Downloads per month on PyPI](https://img.shields.io/pypi/dm/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) ![Supported Python Versions](https://img.shields.io/pypi/pyversions/PyRIC.svg) ![Software status](https://img.shields.io/pypi/status/PyRIC.svg) From 9281e33d071c97b0b6aca29ec98cdf914f6c7772 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Thu, 9 Jun 2016 18:01:39 -0600 Subject: [PATCH 030/121] v0.1.1 minor formatting --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 009ed83..7918f7d 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ ## Linux wireless library for the Python Wireless Developer and Pentester [![License: GPLv3](https://img.shields.io/pypi/l/PyRIC.svg)](https://github.com/wraith-wireless/PyRIC/blob/master/LICENSE) -[![GitHub Version](https://img.shields.io/github/tag/strongloop/express.svg?maxAge=2592000)]() [![PyPI Version](https://img.shields.io/pypi/v/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) [![Downloads per month on PyPI](https://img.shields.io/pypi/dm/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) ![Supported Python Versions](https://img.shields.io/pypi/pyversions/PyRIC.svg) From 349c99b6e886821907a78cf7efcae495974c4db9 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 11 Jun 2016 05:17:16 -0600 Subject: [PATCH 031/121] v0.1.1 Issue #11 --- pyric/lib/libnl.py | 2 +- pyric/net/policy.py | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index ddaf68b..7f1d41b 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -487,7 +487,7 @@ def nla_parse(msg,l,mtype,stream,idx): nla_put(msg,_nla_strip_(a),atype,nlh.NLA_ERROR) except MemoryError as e: raise pyric.error(pyric.EUNDEF, - "Parsing attr type {0} failed due to {1}",atype,e) + "Parsing attr type {0} of pol {1} failed due to {2}",atype,pol,e) idx = nlh.NLMSG_ALIGN(idx + alen) # move index to next attr def nla_parse_nested(nested): diff --git a/pyric/net/policy.py b/pyric/net/policy.py index 8cbd7f1..146f670 100644 --- a/pyric/net/policy.py +++ b/pyric/net/policy.py @@ -56,14 +56,18 @@ def nla_datatype(policy,attr): nla_dts = {} #### CTRL_ATTR_* +# commented out below to determine if nested _OPS and _MCAST_GROUPS +# was causing an infinite loop in nla_parse_nested nla_dts["ctrl_attr"] = {genlh.CTRL_ATTR_UNSPEC:nlh.NLA_UNSPEC, genlh.CTRL_ATTR_FAMILY_ID:nlh.NLA_U16, genlh.CTRL_ATTR_FAMILY_NAME:nlh.NLA_STRING, genlh.CTRL_ATTR_VERSION:nlh.NLA_U32, genlh.CTRL_ATTR_HDRSIZE:nlh.NLA_U32, genlh.CTRL_ATTR_MAXATTR:nlh.NLA_U32, - genlh.CTRL_ATTR_OPS:nlh.NLA_NESTED, - genlh.CTRL_ATTR_MCAST_GROUPS:nlh.NLA_NESTED} + #genlh.CTRL_ATTR_OPS:nlh.NLA_NESTED, + genlh.CTRL_ATTR_OPS: nlh.NLA_UNSPEC, + #genlh.CTRL_ATTR_MCAST_GROUPS:nlh.NLA_NESTED} + genlh.CTRL_ATTR_MCAST_GROUPS: nlh.NLA_UNSPEC} #### CTRL_ATTR_OP_* nla_dts["ctrl_attr_op"] = {genlh.CTRL_ATTR_OP_UNSPEC:nlh.NLA_UNSPEC, From a0a83050e28a3fc3474d66644853bfdaae9c566f Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 11 Jun 2016 07:34:43 -0600 Subject: [PATCH 032/121] v0.1.1 Issue #11 MemoryError Fix --- pyric/lib/__init__.py | 5 ++-- pyric/lib/libnl.py | 17 +++++++++--- pyric/net/policy.py | 8 +++--- pyric/pyw.py | 64 +++++++++++++++++++++++++++---------------- tests/pyw.unittest.py | 4 +-- 5 files changed, 62 insertions(+), 36 deletions(-) diff --git a/pyric/lib/__init__.py b/pyric/lib/__init__.py index 3f81618..360cb67 100644 --- a/pyric/lib/__init__.py +++ b/pyric/lib/__init__.py @@ -23,7 +23,7 @@ lib 0.0.2 desc: lib subpackage - includes: libnl 0.0.6 libio 0.0.1 + includes: libnl 0.0.7 libio 0.0.1 changes: o added libio o updated libnl @@ -35,7 +35,8 @@ - remove nla_* from GENLMsg stand-alone functions as this was my original intent where the classes should only be 'placeholders', similar to C structs and not full blow objects - + - added some error checking to nla_parse_nested, raising and handling error + in situations where attribute len is 0 """ __name__ = 'lib' diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 7f1d41b..e309642 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -32,8 +32,8 @@ __name__ = 'libnl' __license__ = 'GPLv3' -__version__ = '0.0.6' -__date__ = 'May 2016' +__version__ = '0.0.7' +__date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' @@ -485,9 +485,16 @@ def nla_parse(msg,l,mtype,stream,idx): except struct.error: # append as Error, stripping null bytes nla_put(msg,_nla_strip_(a),atype,nlh.NLA_ERROR) + except pyric.error as e: + if e.errno == errno.EINVAL: + # a nested attribute failed to parse correctly + nla_put(msg, _nla_strip_(a), atype, nlh.NLA_ERROR) + else: + raise except MemoryError as e: - raise pyric.error(pyric.EUNDEF, - "Parsing attr type {0} of pol {1} failed due to {2}",atype,pol,e) + # hopefully don't get here + emsg = "Attr type {0} of pol {1} failed: {2}".format(atype,pol,e) + raise pyric.error(pyric.EUNDEF,emsg) idx = nlh.NLMSG_ALIGN(idx + alen) # move index to next attr def nla_parse_nested(nested): @@ -529,6 +536,8 @@ def nla_parse_nested(nested): # first byte is the length, including this byte and one pad byte - does # not include additional pad bytes for proper alignment alen = struct.unpack_from('B',nested,idx)[0] + if alen == 0: + raise pyric.error(errno.EINVAL,"attribute length is 0") ns.append(nested[idx+1:idx+(alen-1)]) idx = nlh.NLMSG_ALIGN(idx + alen) return ns diff --git a/pyric/net/policy.py b/pyric/net/policy.py index 146f670..3d467ed 100644 --- a/pyric/net/policy.py +++ b/pyric/net/policy.py @@ -64,10 +64,10 @@ def nla_datatype(policy,attr): genlh.CTRL_ATTR_VERSION:nlh.NLA_U32, genlh.CTRL_ATTR_HDRSIZE:nlh.NLA_U32, genlh.CTRL_ATTR_MAXATTR:nlh.NLA_U32, - #genlh.CTRL_ATTR_OPS:nlh.NLA_NESTED, - genlh.CTRL_ATTR_OPS: nlh.NLA_UNSPEC, - #genlh.CTRL_ATTR_MCAST_GROUPS:nlh.NLA_NESTED} - genlh.CTRL_ATTR_MCAST_GROUPS: nlh.NLA_UNSPEC} + genlh.CTRL_ATTR_OPS:nlh.NLA_NESTED, + #genlh.CTRL_ATTR_OPS: nlh.NLA_UNSPEC, + genlh.CTRL_ATTR_MCAST_GROUPS:nlh.NLA_NESTED} + #genlh.CTRL_ATTR_MCAST_GROUPS: nlh.NLA_UNSPEC} #### CTRL_ATTR_OP_* nla_dts["ctrl_attr_op"] = {genlh.CTRL_ATTR_OP_UNSPEC:nlh.NLA_UNSPEC, diff --git a/pyric/pyw.py b/pyric/pyw.py index 3817fa2..477b5bc 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -102,8 +102,8 @@ def _nlstub_(fct,*argv): __name__ = 'pyw' __license__ = 'GPLv3' -__version__ = '0.1.3' -__date__ = 'May 2016' +__version__ = '0.1.4' +__date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' @@ -794,39 +794,55 @@ def phyinfo(card, *argv): nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) - except AttributeError as e: raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) # pull out attributes - info = {'scan_ssids':None, 'modes':None, 'freqs':None, 'retry_short':None, - 'retry_long':None, 'frag_thresh':None, 'rts_thresh':None, - 'cov_class':None, 'swmodes':None, 'commands':None} - # singular attributes + info = {'generation':None, 'retry_short':None, 'retry_long':None, + 'frag_thresh':None, 'rts_thresh':None, 'cov_class':None, + 'scan_ssids':None, 'freqs':[], 'modes':[], 'swmodes':[], + 'commands':[]} info['generation'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_GENERATION) info['retry_short'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_SHORT) info['retry_long'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_LONG) - info['retry_short'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_SHORT) info['frag_thresh'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_FRAG_THRESHOLD) info['rts_thresh'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RTS_THRESHOLD) info['cov_class'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_COVERAGE_CLASS) info['scan_ssids'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS) - # nested attributes - bands = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_BANDS) - info['freqs'] = _getfreqs_(bands) - modes = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_IFTYPES) - info['modes'] = [_iftypes_(struct.unpack('>H', mode)[0]) for mode in modes] - modes = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SOFTWARE_IFTYPES) - info['swmodes'] = [_iftypes_(struct.unpack('>H', mode)[0]) for mode in modes] - cmds = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_COMMANDS) - info['commands'] = [] - for cmd in cmds: - try: - cmd = cmdbynum(struct.unpack_from('>HH', cmd,0)[1]) - if type(cmd) is type([]): cmd = cmd[0] - info['commands'].append(cmd[13:].lower()) - except KeyError: - info['commands'].append("unknown cmd ({0})".format(cmd)) + + # nested attributes require additional processing. They must be unpacked + # beg-endian and may not be processed correctly by libnl. In the event of an + # unparsed nested attribute leave as empty list + # get freqs + _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_BANDS, False) + if d != nlh.NLA_ERROR: info['freqs'] = _getfreqs_(bs) + + # get supported modes + _, ms, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_IFTYPES, False) + if d != nlh.NLA_ERROR: + info['modes'] = [_iftypes_(struct.unpack('>H', m)[0]) for m in ms] + + # get supported sw modes + _, ms, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SOFTWARE_IFTYPES, False) + if d != nlh.NLA_ERROR: + info['swmodes'] = [_iftypes_(struct.unpack('>H', m)[0]) for m in ms] + + # get supported commands + _, cs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_COMMANDS, False) + if d != nlh.NLA_ERROR: + for c in cs: + try: + # convert the numeric command to the form @NL80211_CMD_ + # Some numeric commands may have multiple string synonyms, in + # that case, take the first one. Finally, strip off @NL80211_CMD_ + # to get only the command name and make it lowercase + c = cmdbynum(struct.unpack_from('>HH', c, 0)[1]) + if type(c) is type([]): c = c[0] + info['commands'].append(c[13:].lower()) + except KeyError: + # some cards (atheros) have proprietary commands not found + # in nlh8022.h. + info['commands'].append("unknown cmd ({0})".format(c)) return info #### TX/RX RELATED #### diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 3bff8ee..1a0ed53 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -54,9 +54,9 @@ newip = '192.168.3.30' newbcast = '192.168.3.255' newmask = '255.255.255.0' -nics = ['alfa0','rose0','eth0','lo','wlan0'] +nics = ['alfa0','eth0','lo','wlan0'] enics = ['eth0','lo'] -wnics = ['alfa0','rose0','wlan0'] +wnics = ['alfa0','wlan0'] inics = ['foo0','bar0'] regdom = '00' newregdom = 'BO' From bb69785fba972e79067ac2745280cf233829e8c3 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 11 Jun 2016 07:43:27 -0600 Subject: [PATCH 033/121] v0.1.1 Issue #11 MemoryError Fix --- pyric/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyric/__init__.py b/pyric/__init__.py index 314b35f..6ce965a 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -131,7 +131,8 @@ o added mac address related functions to hardware o split rfkill into functions file and definition file o added block/unblock to pyw - + o updated pyw to handle the newest version of libnl.py's processing of nested + attributes """ __name__ = 'pyric' From 1470e4d145737fce0c94fca5ab23599cce1f371b Mon Sep 17 00:00:00 2001 From: Brian Date: Sat, 11 Jun 2016 11:34:50 -0400 Subject: [PATCH 034/121] Fix typo This patch will fix the typo's regarding string formating. --- pyric/pyw.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyric/pyw.py b/pyric/pyw.py index 477b5bc..4a7607e 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -976,7 +976,7 @@ def modeset(card, mode, flags=None, *argv): raise pyric.error(errno.EINVAL, 'Can only set flags in monitor mode') for flag in flags: if flag not in MNTRFLAGS: - raise pyric.error(errno.EINVAL, 'Invalid flag: {0}', format(flag)) + raise pyric.error(errno.EINVAL, 'Invalid flag: {0}'.format(flag)) else: flags = [] try: @@ -1043,7 +1043,7 @@ def devadd(card, vdev, mode, flags=None, *argv): raise pyric.error(errno.EINVAL, 'Can only set flags in monitor mode') for flag in flags: if flag not in MNTRFLAGS: - raise pyric.error(errno.EINVAL, 'Invalid flag: {0}', format(flag)) + raise pyric.error(errno.EINVAL, 'Invalid flag: {0}'.format(flag)) else: flags = [] try: @@ -1340,4 +1340,4 @@ def _fut_chset(card, ch, chw, *argv): nl.nla_put_u32(msg, channels.CHWIDTHS.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) - return True \ No newline at end of file + return True From 8f2b1459a2a86f4d7be20a323d5b3fcf1797a410 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 11 Jun 2016 09:50:58 -0600 Subject: [PATCH 035/121] v0.1.1 Issue #11 MemoryError Fix --- Help/PyRIC.bib | 48 ++ Help/PyRIC.tex | 1124 +++++++++++++++++++++++++++++++++++++ Help/nlsend.png | Bin 0 -> 90242 bytes Help/nlsock.png | Bin 0 -> 123683 bytes pyric/__init__.py | 4 +- pyric/docs/res/nlsend.png | Bin 0 -> 90242 bytes pyric/docs/res/nlsock.png | Bin 0 -> 123683 bytes pyric/pyw_unittest.py | 0 8 files changed, 1174 insertions(+), 2 deletions(-) create mode 100644 Help/PyRIC.bib create mode 100644 Help/PyRIC.tex create mode 100644 Help/nlsend.png create mode 100644 Help/nlsock.png create mode 100644 pyric/docs/res/nlsend.png create mode 100644 pyric/docs/res/nlsock.png create mode 100644 pyric/pyw_unittest.py diff --git a/Help/PyRIC.bib b/Help/PyRIC.bib new file mode 100644 index 0000000..d159770 --- /dev/null +++ b/Help/PyRIC.bib @@ -0,0 +1,48 @@ + +@Misc{libnl, + Title = {Netlink Library (libnl)}, + Author = {Thomas Graf}, + Month = {May}, + Year = {2011}, + Date = {2011-05-09}, + Language = {english}, + Organization = {Swiss Internet User Group}, + Shorthand = {libnl}, + Url = {http://www.carisma.slowglass.com/~tgr/libnl/doc/core.html}, + Version = {3.2} +} + +@Article{spae, + Title = {Communicating between the kernel and user-space in Linux using Netlink sockets}, + Author = {Pablo Neira Ayuso, Rafael M. Gasca, Laurent Lefevre}, + Journal = {Software - Practice And Experience}, + Year = {2010}, + Month = {August}, + Pages = {797-810}, + Volume = {40} +} + +@Misc{wraith, + Title = {Wireless Reconnaissance And Intelligent Target Harvesting}, + Author = {Dale V. Patterson}, + Month = {April}, + Year = {2016}, + Date = {2016-04-03}, + Language = {english}, + Shorthand = {wraith}, + Url = {https://github.com/wraith-wireless/wraith}, + Version = {0.0.6} +} + +@Misc{gplv3, + Title = {GNU General Public License}, + Month = {June}, + Year = {2007}, + Date = {2007-06-29}, + Language = {english}, + Organization = {Free Software Foundation}, + Pagination = {section}, + Shorthand = {GPL}, + Url = {http://www.gnu.org/licenses/gpl.html}, + Version = {3} +} diff --git a/Help/PyRIC.tex b/Help/PyRIC.tex new file mode 100644 index 0000000..c076969 --- /dev/null +++ b/Help/PyRIC.tex @@ -0,0 +1,1124 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) +% +%This program is free software: you can redistribute it and/or modify it under +%the terms of the GNU General Public License as published by the Free Software +%Foundation, either version 3 of the License, or (at your option) any later +%version. +% +%Redistribution and use in source and binary forms, with or without modifications, +%are permitted provided that the following conditions are met: +% o Redistributions of source code must retain the above copyright notice, this +% list of conditions and the following disclaimer. +% o Redistributions in binary form must reproduce the above copyright notice, +% this list of conditions and the following disclaimer in the documentation +% and/or other materials provided with the distribution. +% o Neither the name of the orginal author Dale V. Patterson nor the names of any +% contributors may be used to endorse or promote products derived from this +% software without specific prior written permission. +% +% __name__ = 'User Guide' +%__license__ = 'GPLv3' +%__version__ = '0.0.3' +%__date__ = 'June 2016' +%__author__ = 'Dale Patterson' +%__maintainer__ = 'Dale Patterson' +%__email__ = 'wraith.wireless@yandex.com' +%__status__ = 'Production' +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\documentclass[11pt]{article} +\usepackage[utf8]{inputenc} +\setlength{\parindent}{0pt} +\usepackage{graphicx} +\usepackage{listings} +\usepackage{caption} +\usepackage{geometry} +\usepackage{color} +\usepackage[titletoc,toc,title]{appendix} +\usepackage[T1]{fontenc} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} + +\geometry{left=1.0in,right=1.0in,top=1.0in,bottom=1.0in } + +\lstset{ + frame=top, + frame=bottom, + basicstyle=\small\normalfont\ , + stepnumber=1, + numbersep=10pt, + tabsize=2, + extendedchars=true, + breaklines=true, + captionpos=b, + mathescape=true, + showspaces=false, + showtabs=false, + xleftmargin=17pt, + framexleftmargin=17pt, + framexrightmargin=17pt, + framexbottommargin=5pt, + framextopmargin=5pt, + showstringspaces=false, + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\footnotesize +} + +\title{PyRIC v0.1.0: User Manual} +\author{Dale V. Patterson\\ wraith.wireless@yandex.com} + +\begin{document} +\maketitle +\tableofcontents + +\section{About PyRIC}\label{sec:About} +PyRIC provides wireless pentesters the ability to manipulate, identify and +enumerate your system's wireless cards programmatically in Python. PyRIC provides +functionality offered by command line tools like iw, ifconfig, iwconfig and rfkill. +Why use subprocess.Popen, regular expressions and str.find to interact with your +wireless cards? PyRIC is: +\begin{enumerate} +\item \textbf{Pythonic}: No ctypes, SWIG etc. PyRIC redefines C header files as +Python and uses sockets to communicate with kernel. +\item \textbf{Self-sufficient}: No third-party files used, PyRIC is completely self- +contained +\item \textbf{Fast}: (relatively speaking) PyRIC is faster than using iw through +subprocess.Popen +\item \textbf{Parseless}: Get the output you without parsing output from iw. Never +worry about iw updates and rewriting your parsers. +\item \textbf{Easy}: If you can use iw, you can use PyRIC +\end{enumerate} + +At it's heart, PyRIC is a python port of (a subset of) iw and by extension a +python port of Netlink\cite{spae} (w.r.t nl80211 functions). The original goal +of PyRIC was to provide a simple interface to the underlying nl80211 kernel +support, handling the complex operations of Netlink seamlessy while maintaining +a minimum of "code walking" to understand, modify and extend. PyRIC will only work +on Linux with Netlink support.\\ + +While users can utilize libnl(.py) to communicate directly with the kernel, the +true utility of PyRIC is pyw(.py). Like iw, pyw provides an interface/buffer +between the caller and the kernel, handling all message construction, parsing +and transfer transparently and without requiring any Netlink knowledge or +experience. \\ + +PyRIC does more though, via fcntl it implements rfkill, allowing users to list, +block and unblock devices as well as implement libio(.py) for ioctl communication +with the kernel providing users the ability to turn cards on/off and set addresses. + +At this time, PyRIC (through pyw, rfkill and device) can: +\begin{itemize} +\item enumerate interfaces and wireless interfaces, +\item get/set regulatory domain, +\item get/set hw address, +\item get/set ip4, netmask and broadcast address +\item identify a radio's chipset and driver, +\item turn device on/off, +\item get supported standards, +\item get supported commands, +\item get supported modes, +\item get dev/phy info on device, +\item get/set mode, +\item add/delete interfaces, and +\item block/unblock devices through rfkill. +\end{itemize} +It also provides users with the ability, through libnl(.py) to extend the above +functionality by creating additional commands.\\ + +Currently, PyRIC does handle multicast messages i.e. events or dumps although +plans for future versions include adding the ability to process dumps. \\ + +\subsection{Naming Conventions} +The terms interface, device and radio are all used interchangeably throughout to +refer to a network interface card (NIC). The following terms will always have one +meaning: +\begin{itemize} +\item \textbf{dev} - the device name i.e. wlan0 or eth0 of a NIC, +\item \textbf{phy} - the physical index of a NIC i.e. the 0 in phy0, +\item \textbf{ifindex} - the interface index of a NIC, +\item \textbf{card} or \textbf{Card} - a NIC abstraction, an object used in pyw +functions see the following section for a description. +\end{itemize} + +\subsection{Cards} +A Card is merely a wrapper around a tuple t = (phy index,device name,ifindex). +Since the underlying Netlink calls sometimes require the physical index, sometimes +the device name, and sometimes the ifindex, pyw functions\footnote{Not all functions +accept a Card, the function pyw.devinfo() will accept either a Card or a dev and +pyw.isinterface() only accepts a dev} take a Card object which doesn't require +callers to know which identifier to use for each function. There are four primary methods to creating a Card: +\begin{enumerate} +\item \textbf{pyw.getcard} returns a Card object from a given dev, +\item \textbf{pyw.devinfo} returns the dict info where info['card'] is the Card +object. This function will take either a card or a dev +\item \textbf{pyw.devadd} returns a new Card object, +\item \textbf{pyw.ifaces} returns a list of tuples t = (Card,mode) sharing the +same phy as a given dev. +\end{enumerate} + +A side affect of using Cards is that many of the netlink calls require the ifindex. +The ifindex is found through the use of ioctl, meaning two sockets have to be +created and two messages have to be sent, received and parsed in order to execute +the command. With Cards, the ifindex is requested for only once. \\ + +Keep in mind that any identifier (phy, dev, ifindex) can be invalidated outside +of your control. Another program can rename your interface, that is change the +dev without your knowledge. Depending on what functions are being used this may +not be noticed right away as the phy will remain the same. Also, usb devices (if +the usb is disconnected and reconnected) will have the same dev but the phy and +ifindex will be different. + +\subsection{Benchmarks} +PyRIC makes use of several "extensions" to speed up pyw functions: +\begin{enumerate} +\item \textbf{Persistent sockets}: pyw provides the caller with functions and +the ability to pass their own netlink (or ioctl socket) to pyw functions +\item \textbf{One-time request for the nl80211 family id}: pyw stores the family +id in a global variable +\item \textbf{Consolidation} different "reference" values are consolidated in one +class (see the previous section) +\end{enumerate} + +\begin{table} +\begin{center} +\begin{tabular}{| l | r | r | r | r|} +\hline +chset & Total & Avg & Longest & Shortest \\ +\hline +Popen(iw) & 588.3059 & 0.0588 & 0.0682 & 0.0021 \\ +\hline +one-time & 560.3559 & 0.0560 & 0.0645 & 0.0003 \\ +\hline +persistent & 257.8293 & 0.0257 & 0.0354 & 0.0004 \\ +\hline +\end{tabular} +\caption{Benchmark: Popen(iw) vs pyw} +\end{center} +\label{tab:benchmark} +\end{table} + +While small, these changes can improve the performance of any programs using pyw. +Table 1 shows benchmarks for hop time on an Alfa AWUS036NH conducted 10000 times. +Note that we are not implying that PyRIC is faster than iw. Rather, the table +shows that PyRIC is faster than using Popen to execute iw. Using one-time sockets, +there is a difference of 28 seconds over Popen and iw with a small decrease in +the average hoptime. Not a big difference. However, the performance increased +dramatically when persistent netlink sockets are used with the total time and +average hop time nearly halved. + +\section{Installing PyRIC}\label{sec:installing} +Starting with version 0.0.6, the structure (see Section \ref{sec:About} has +changed to facilitate packaging on PyPI. This restructing has of course led +to some minor difficulties especially when attempting to install (or even +just test) outside of a pip installation. \\ + +Obviously, the easiest way to install PyRIC is through PyPI:\\ + + \texttt{sudo pip install PyRIC}\\ + +You can also install PyRIC from source. The tarball can be downloaded from: + +\begin{itemize} +\item PyPi: https://pypi.python.org/pypi/PyRIC, +\item PyRIC Web: http://wraith-wireless.github.io/PyRIC, or +\item Github: https://github.com/wraith-wireless/PyRIC. +\end{itemize} + +After downloading, extract and run:\\ + + \texttt{sudo python setup.py install}\\ + +If you just want to test PyRIC out, download your choice from above. After +extraction, move the pyric folder (the package directory) to your location of +choice and from there start Python and import pyw. It is very important that you +do not try and run it from PyRIC which is the distribution directory. This will +break the imports pyw.py uses. \\ + +You will only be able to test PyRIC from the pyric directory but, if you want to, +you can add it to your Python path and run it from any program or any location. +To do so, assume you untared PyRIC to /home/bob/PyRIC. Create a text file named +pyric.pth with one line \\ + + /home/bob/PyRIC \\ + +and save this file to /usr/lib/python2.7/dist-packages (or +/usr/lib/python3/dist-packages if you want to try it in Python 3). + +\begin{table} +\begin{center} +\begin{tabular}{| l | r | r | r |} +\hline +Source & Stability & Recency & Installation \\ +\hline +pip & 5 & 3 & 5\\ +\hline +PyPI & 5 & 3 & 4\\ +\hline +PyRIC Web & 4 & 4 & 4\\ +\hline +Github & 3 & 5 & 3\\ +\hline +\end{tabular} +\caption{Stability vs Recency vs Installation} +\end{center} +\label{tab:install} +\end{table} + +\section{Using PyRIC}\label{sec:using} +As stated previously, PyRIC provides a set of functions to interact with your +system's radio(s) and the ability to interact directly with the kernel through +netlink and ioctl sockets. + +\subsection{Interacting with the Wireless Core and Wireless NICs: pyw.py} +If you can use iw, you can use pyw. The easist way to explain how to use pyw is +with an example. Imagine your wireless network, on ch 6, has been experiencing +difficulties lately and you want to capture some traffic to analyse it. Listing +\ref{lst:pentest} shows how to set up a wireless pentest environment. \\ + +\begin{lstlisting}[caption={Setting up a Wireless Pentest Environment}, + label={lst:pentest}, + language=Python] + 1: import pyric # pyric error (and ecode EUNDEF) + 2: from pyric import pyw # for iw functionality + 3: from pyric import device # for chipset/driver + 4: from pyric.channels import rf2ch # rf to channel conversion + 5: + 6: dev = 'wlan0' + 7: ifaces = pyw.interfaces() + 8: wifaces = pyw.winterfaces() + 9: if dev not in ifaces: +10: print "Device {0} is not valid, use one of {1}".format(dev,ifaces) +11: return +12: elif dev not in wifaces: +13: print "Device {0} is not wireless, use one of {1}".format(dev,wifaces) +14: +15: print "Regulatory Domain currently: ", pyw.regget() +16: dinfo = pyw.devinfo(dev) +17: card = dinfo['card'] +18: pinfo = pyw.phyinfo(card) +19: driver = device.ifdriver(card.dev) +20: chipset = device.ifchipset(driver) +21: +22: pyw.down(card) +23: pyw.macset(card,'00:03:93:57:54:46') +24: +25: msg = "Using {0} currently in mode: {1}\n".format(card,dinfo['mode']) +26: msg += "\tDriver: {0} Chipset: {1}\n".format(driver,chipset) +27: if dinfo['mode'] == 'managed': +28: msg += "\ton channel {0} width {1}\n".format(rf2ch(dinfo['RF']), +29: dinfo['CHW']) +30: msg += "\tSupports modes {0}\n".format(pinfo['modes']) +31: msg += "\tSupports commands {0}".format(pinfo['commands']) +32: msg += "\thw addr {0}".format(pyw.macget(card)) +33: print msg +34: +35: pdev = 'pent0' +36: for iface in pyw.ifaces(card): +37: pyw.devdel(iface[0]) +38: pcard = pyw.devadd(card, pdev, 'monitor') +39: pyw.up(pcard) +40: pyw.chset(pcard,6,None) +41: +42: # DO STUFF HERE +43: +44: pyw.devdel(pcard) +45: +46: card = pyw.devadd(card,card.dev,dinfo['mode']) +47: pyw.macset(card,dinfo['mac']) +48: pyw.up(card) +\end{lstlisting} + +Listing \ref{lst:pentest} attempts to show most of the available pyw functions +in use and is the basic shell used in another project, Wraith\cite{wraith}, to +instantiate a wireless (802.11) sensor - (for a full listing of all pyw functions +see Appendix \ref{sec:pywapi}) - with scanning capabilities. Lines 1 and 2 should +always be included as they import the pyric error and pyw functions. Line 3 +imports device which provides the ifchipset and ifdriver functions and Line 4 +imports the rf2ch conversion function. \\ + +In lines 6 through 13, the device wlan0 is confirmed wireless and lines 16 through +20 a Card object for 'wlan0' is created and details about the interface are printed. +Next, the mac address of wlan0 is changed on lines 23. Note, the device is brought +down first. \\ + +More information on the device is printed in lines 25 through 33. Starting on +line 35, a device named 'pent0' is created in monitor mode. First in lines 36 +and 37, all interfaces on the same phy are deleted \footnote{we have found that +it is better to delete all interfaces on the same phy ensuring that external +processes don't interfere with the new device} before creating the new device, +bringing the card up and setting it to channel 6 NOHT.\\ + +Restoring the device starts on line 45, where the virtual interface is deleted, +the previous interface is restored and the mac address is reset. + +\subsubsection{One-time vs Persistent Sockets} +The example in Listing \ref{lst:pentest} uses one-time sockets (netlink and +ioctl). When using iw, there are several things that occur prior to the actual +command or request being submitted. First, iw creates a netlink socket. Then, +iw will request the family id for nl80211. The relative time spent doing this +is neglible but, it is redundant and it may become noticeable in programs that +repeatedly use the Netlink service. Once comlete, iw closes the socket. In some +cases, the ifindex of the device is needed and iw will also initiate an ioctl +call to retrieve it. PyRIC eliminates these redundancies by using a global +variable in pyw that stores the family id after the first time it is requested +and by providing callers the option to use persistent sockets. +\begin{itemize} +\item \textbf{One-time Sockets} Similar to iw. The command, creates the netlink +socket (or ioctl socket), composes the message, sends the message and receives +the response, parses the results, closes the socket and returns the results to +the caller. At no time does the caller need to be aware of any underlying Netlink +processes or structures. +\item \textbf{Persistent Sockets} Communication and parsing only. The onus of +socket creation and deletion is on the caller which allows them to create one +(or more) socket(s). The pyw functions will only handle message construction, +message sending and receiving and message parsing. +\end{itemize} +The caller needs to be cognizant of whether the function requires a netlink or +ioctl socket. Passing the wrong type will result in an error. \\ + +NOTE: One must remember that there is an upper limit to the number of open netlink +sockets. It is advised to use one-time functions as much as possible and save the +use of persistent sockets for use in code that repeatedly makes use of netlink. \\ + +The latest version of pyw.py (v 0.1.*) implements this functionality through the +use of what I call templates\footnote{I use templates and stubs for the lack +of any better naming convention}, Listing \ref{lst:template} and stubs Listing +\ref{lst:stub}. + +\begin{lstlisting}[caption={A Basic Netlink Function Template}, + label={lst:template}, + language=Python] +def fcttemplate(arg0,arg1,..,argn,*argv): + # put parameter validation (if any) here + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(fcttemplate,arg0,arg1,...,argn) + + # command execution + ... + return results +\end{lstlisting} + +The template function in Listing \ref{lst:template} checks if argv has a netlink +socket\footnote{ioctl calls operate in the same manner} at index 0. If so, it +proceeds to execution. If there is no socket, the stub is executed which creates +one. If something other than a netlink socket is at argv[0], an error will be +raised during execution. \\ + +\begin{lstlisting}[caption={Function \_nlstub\_}, + label={lst:stub}, + language=Python] +def _nlstub_(fct,*argv): + nlsock = None + try: + nlsock = nlsock = nl.nl_socket_alloc() + argv = list(argv) + [nlsock] + return fct(*argv) + except pyric.error: + raise # catch & release + finally: + if nlsock: nl.nl_socket_free(nlsock) +\end{lstlisting} + +The stub function, Listing \ref{lst:stub} allocates a netlink socket, executes +the original (now with a netlink socket) and then destroys the netlink socket.\\ + +\begin{lstlisting}[caption={Using Persistent Sockets}, + label={lst:persistent}, + language=Python] + 1: import pyric # pyric error (and ecode EUNDEF) + 2: from pyric import pyw # for iw functionality + 3: from pyric.lib import libnl as nl # for netlink sockets + 4: + 5: nlsock = nl.nl_socket_alloc(timeout=1) + 6: card = pyw.getcard('wlan0',nlsock) + 7: print pyw.devmodes(card,nlsock) + 8: nl.nl_socket_free(nlsock) +\end{lstlisting} + +Listing \ref{lst:persistent}, shows the creation of a persistent netlink socket +that is used in the creation of a card and in retrieved the card's supported +modes. \\ + +Use Python's built in help features on pyw functions or see Appendex \ref{sec:pywapi} +to determine what type of socket is needed. + +\subsection{Additional Tools: channels.py, device.py and rfkill.py} +In addition to ifconfig and iw related functions found in pyw.py, PyRIC provides +a port of rfkill, channel/frequency enumeration and device chipset, driver +retrieval. More information can be found in the Appendices. + +\subsection{Interacting with the Kernel: libnl.py and libio.py} +The kernel interfaces, libnl.py and libio.py are located in the lib directory. +They handle socket creation/deletion, message creation/parsing and kernel +communication. Aside from creating and deleting persistent sockets, there is +little need to access their functions unless you plan on extending pyw +functionality. As such, a further discussion of libnl.py and libio.py can be +found in the next section. + +\section{Extending PyRIC}\label{sec:extending} +You may find that pyw does not offer some of the functionality you need. Using +libnl.py and/or libnl.io, additional functionality can be added to your program.\\ + +It is helpful if the reader has a basic knowledge of netlinks. For a review, see +"Communicating between the kernel and user-space in Linux using Netlink Sockets" +\cite{spae}. + +\subsection{Porting C} +All Python ports of C header files can be found in the net directory. C Enums +and \#defines are ported using constants. C structs are ported using three +Python structures and the Python struct package: +\begin{enumerate} +\item a format string for packing and unpacking the struct +\item a constant specifying the size of the struct in bytes +\item a function taking the attributes of the struct as arguments and returning +a packed string +\end{enumerate} +Listing \ref{lst:cstruct} shows the C definition of the nlmsghdr found in netlink.h. + +\begin{lstlisting}[caption={C Struct nlmsghdr}, + label={lst:cstruct}, + language=C] +struct nlmsghdr { + __u32 nlmsg_len; + __u16 nlmsg_type; + __u16 nlmsg_flags; + __u32 nlmsg_seq; + __u32 nlmsg_pid; +}; +\end{lstlisting} + +And Listing \ref{lst:pstruct} shows the ported version in Python. + +\begin{lstlisting}[caption={Corresponding Python Definition}, + label={lst:pstruct}, + language=Python] +nl_nlmsghdr = "IHHII" +NLMSGHDRLEN = struct.calcsize(nl_nlmsghdr) +def nlmsghdr(mlen,nltype,flags,seq,pid): + return struct.pack(nl_nlmsghdr,NLMSGHDRLEN+mlen,nltype,flags,seq,pid) +\end{lstlisting} + +When using pyw, dealing with these structures is handled transparently by libnl.py +and libio.py. When extending or customizing pyw, a basic understanding of the +definitions in netlink\_h.py, genetlink\_h.py and if\_h.py. + +\subsection{Input/Output Control (ioctl)} +PyRIC provides more than just iw-related functions, it also implements functions +from ifconfig and iwconfig. These command line tools still use ioctl (or the proc +directory). For example, interfaces() reads from '/proc/net/dev' to retrieve all +system interfaces and winterfaces() use ioctl to check if a device is wireless. +Input/Output control calls have only been used when there was no viable alternative +and, it should not be necessary to have to add any further ioctl commands. If you +find that you need an ioctl related command, search through if\_h.py for the +appropriate structure and add it's definitions to ifreq. + +\subsection{Netlink and nl80211} +Documentation on Netlink, and nl80211 in particular, is so minimal as to be +neglible. The clusterfuck of code and lack of comments in the iw source tree +make it impossible to use as any sort of roadmap. Fortunately Thomas Graf's +site\cite{libnl} has excellent coverage of libnl, the Netlink library. Using +this as a reference, a simple Netlink parser was put together which later became +libnl.py. Using the command line tool strace and libnl.py, Netlink messages could +be dissected and analyzed.\\ + +Let us consider adding a virtual interface with the command:\\ + + \texttt{sudo iw phy0 interface add test0 type monitor}\\ + +First, we need to see what is going on under the covers. Using strace:\\ + + \texttt{strace -f -x -s 4096 iw phy0 interface add test0 type monitor}\\ + +from a terminal will give a you a lot of output, most irrelevant (to us). Scroll +through this until the netlink socket creation as highlighted in Figure +\ref{fig:nlsock}. You can see that a socket of type PF\_NETLINK is created and +the send/receive buffers are set to 32768. +\begin{center} +\begin{figure}[h] +\includegraphics{nlsock} +\caption{Netlink socket creation} +\label{fig:nlsock} +\end{figure} +\end{center} +What we want to analyze are the messages sent and received over the netlink +socket. In Figure \ref{fig:nlsock}, iw is requesting the family id for nl80211. +This id will be used in subsequent requests related to nl80211 as we will see +shortly. The return message gives the nl80211 family id as 26 and returns other +nl80211 attributes. This is handled by the private function \_familyid\_ in +pyw.py. + +Figure \ref{fig:nlsend} shows the add interface message being sent to the kernel. +\begin{center} +\begin{figure}[h] +\includegraphics{nlsend} +\caption{Netlink sendmsg} +\label{fig:nlsend} +\end{figure} +\end{center} +We are interested in the byte sequence following msg\_iov(1). Copy this and paste +into in a python variable as in Listing \ref{lst:nlparse} and pass it to the +function nlmsg\_fromstream which parses the byte stream and returns the GENLMsg.\\ + +\begin{lstlisting}[caption={Parsing netlink messages}, + label={lst:nlparse}, + language=Python] +>>> from pyric.lib import libnl as nl +>>> sent = "\x30\x00\x00\x00\x1a...\x00\x00" +>>> msg = nl.nlmsg_fromstream(sent) +>>> msg +nlmsghdr(len=48,type=26,flags=5,seq=1463268720,pid=10982) +genlmsghdr(cmd=7) +attributes: + 0: type=1,datatype=3 + value=0 + 1: type=4,datatype=5 + value=test0 + 2: type=5,datatype=3 + value=6 +\end{lstlisting} + +The first thing to notice is nlmsghdr type = 26, which of course is nl80211 family +id. The rest of the nlmsghdr components len, flags, seq, and pid are handled by +libnl.py although you can supply your own flags if desired. At this time, you can +manually look up what values the cmd, type and datatype correspond to in +nl80211\_h.py and netlink\_h.py or you can use the tools provided in nlhelp.py.\\ + +\begin{lstlisting}[caption={Parsing netlink messages continued}, + label={lst:nlparse2}, + language=Python] +>>> from pyric.net.netlink_h import NLA_DATATYPES +>>> from pyric.docs import nlhelp +>>> nlhelp.cmdbynum(7) +u'@NL80211_CMD_NEW_INTERFACE' +>>> +>>> for attr in msg.attrs: +... print nlhelp.attrbynum(attr[0]), NLA_DATATYPES[attr[2]], attr[1] +... +@NL80211_ATTR_WIPHY u32 0 +@NL80211_ATTR_IFNAME string test0 +@NL80211_ATTR_IFTYPE u32 6 +>>> +>>> from pyric.net.wireless.nl80211_h import NL80211_IFTYPES +>>> NL80211_IFTYPES[6] +'monitor' +\end{lstlisting} + +In Listing \ref{lst:nlparse2} command number 7 corresponds to +NL80211\_CMD\_NEW\_INTERFACE and the attributes that need to be passed to the +kernel are NL80211\_ATTR\_WIPHY, NL80211\_ATTR\_IFNAME and NL80211\_ATTR\_IFTYPE. +The IFTYPE is also known as the mode i.e. 'monitor' which can be found in +nl80211\_h.py NL80211\_IFTYPES. We don't parse the return message from the kernel +but, it follows the same SOP. In this case, it returns the attributes of the new +virtual interface. \\ + +With this information, we can now code our function. Recall the fcttemplate as +defined in Listing \ref{lst:template} and fill in the command execution as shown +in Listing \ref{lst:coding}. \\ + +\begin{lstlisting}[caption={Coding the function}, + label={lst:coding}, + language=Python] +# construct the message +msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_NEW_INTERFACE, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) +nl.nla_put_u32(msg,card.phy,nl80211h.NL80211_ATTR_WIPHY) +nl.nla_put_string(msg,vdev,nl80211h.NL80211_ATTR_IFNAME) +nl.nla_put_u32(msg,IFTYPES.index(mode),nl80211h.NL80211_ATTR_IFTYPE) + +# send, receive and parse return results, returning the new Card +nl.nl_sendmsg(nlsock,msg) +rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes +return Card(card.phy,vdev,nl.nla_find(rmsg,nl80211h.NL80211_ATTR_IFINDEX)) +\end{lstlisting} + +We construct a new GENLMsg passing the nl80211 family id, the command we got +earlier and flags specifying that this is a request and we want to get an ACK +back\footnote{libnl.py always forces an ACK and handles the underlying process +of receiving it}. Now, add each attribute to the message. Note the order: value, +then attribute. With the message constructed, send it to the kernel, get the +results, parse and return them.\\ + +Rather simple, in fact the hardest part is figuring out what to send to the kernel. +Everything else is handled behind the scenes by libnl.py. + +\begin{appendices} +\section{Hierarchy/Architecture} +PyRIC's hierarchy is briefly discussed next. + +\begin{enumerate} +\item \textbf{\_\_init\_\_.py}: Initialize PyRIC, the root distribution directory +used for PyPI packaging +\item \textbf{README.md}: self-descriptive +\item \textbf{setup.py}: install file +\item \textbf{setup.cfg}: used by setup.py +\item \textbf{MANIFEST.in}: used by setup.py +\item \textbf{LICENSE}: GPLv3 License +\item \textbf{PyRIC.pdf}: this file +\item \textbf{TODO}: lists any outstanding TODOs, ideas for future revisions +\item \textbf{RFI}: comments and observations about netlinks, nl80211 etc +\item \textbf{examples}: examples directory +\begin{enumerate} +\item \textbf{pentest.py}: create wireless pentest environment +\item \textbf{device\_details.py}: display device information +\end{enumerate} +\item \textbf{tests}: test directory +\begin{enumerate} +\item \textbf{pyw.unittest.py}: pyw unittesting +\end{enumerate} +\item \textbf{pyric} package directory +\begin{enumerate} +\item \textbf{\_\_init\_\_.py}: Initialize pyric defines the EUNDEF error code +(PyRIC uses errno for all errorcodes adding EUNDEF) and the common exception +class, 'error' - all submodules use this class for any exceptions. +\item \textbf{pyw.py}: this is the interface, providing wireless interface +manipulation functions +\item \textbf{channels.py}: ISM and UNII frequencies and channels, with conversion +functions +\item \textbf{device.py}: device and chipset utility functions +\item \textbf{rfkill.py}: Python port of command line tool rfkill +\item \textbf{lib}: lib subpackage +\begin{enumerate} +\item \textbf{\_\_init\_\_.py}: initialize lib subpackage +\item \textbf{libnl.py}: netlink API +\item \textbf{libio.py}: ioctl API +\end{enumerate} +\item \textbf{net}: net subpackage +\begin{enumerate} +\item \textbf{\_\_init\_\_.py}: initialize net subpackage +\item \textbf{if\_h.py}: inet/ifreq definition +\item \textbf{sockios\_h.py}: socket-level I/O control call flags +\item \textbf{netlink\_h.py}: port of netlink.h +\item \textbf{genetlink\_h.py}: port of genetlink.h +\item \textbf{policy.py}: defines attribute datatypes +\item \textbf{wireless}: wireless subpackage +\begin{enumerate} +\item \textbf{\_\_init\_\_.py}: initialize lib subpackage +\item \textbf{nl80211\_h.py}: port of nl80211 (commands \& attributes) +\item \textbf{nl80211\_c.py}: nl80211 attribute datatypes/policies +\end{enumerate} +\end{enumerate} +\item \textbf{docs}: docs subpackage +\item \textbf{\_\_init\_\_.py}: initialize docs subpackage +\item \textbf{nlhelp.py}: functions to search display nl80211 constants +\item \textbf{commands.help}: nl80211 commands help data (json) +\item \textbf{attributes.help}: nl80211 attributes help data (json) +\item \textbf{res}:resource subpackage +\begin{enumerate} +\item \textbf{PyRIC.tex}: LaTeX for user guide +\item \textbf{PyRIC.bib}: bibliography for user guide +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\section{API: pyw.py}\label{sec:pywapi} + +\subsection{Constants} +\begin{itemize} +\item \textbf{\_FAM80211ID\_}: Global netlink family id of nl80211. Do not touch +\item \textbf{IFTYPES}: redefined (from nl80211\_h.py) interface modes +\item \textbf{MNTRFLAGS}: redefined (from nl80211\_h.py) monitor mode flags +\item \textbf{IPADDR}: Regular Expression for ip4 address validation +\item \textbf{MACADDR}: Regular Expression for mac address validation +\end{itemize} + +\subsection{Objects/Classes} +\textbf{Card} A wrapper around a tuple +\texttt{t = (physical index,device name,interface index)} +which exposes the following properties through '.': +\begin{itemize} +\item \textbf{phy}: physical index +\item \textbf{dev}: device name +\item \textbf{idx}: interface index (ifindex) +\end{itemize} +Because the underlying Netlink calls will sometimes require the physical index, +sometimes the device name, and sometimes the ifindex, pyw functions accept a Card, +object. This allows callers to use pyw functions without having to remember which +identifier the function requires. However, in some cases the function requires +a dev or accepts both. See the next section on functions.\\ + +While callers could create their own Cards, it is recommend to use one of the +following +\begin{itemize} +\item \textbf{pyw.getcard} returns a Card object from a given dev +\item \textbf{pyw.devinfo} returns the dict info where info['card'] is the Card +object. This function will take either a card or a dev +\item \textbf{pyw.devadd} returns a new Card object +\item \textbf{pyw.ifaces} returns a list of tuples t = (Card,mode) sharing the +same phy as a given device to do so. It is also recommended to periodically +validate the Card. On some cheaper usb wireless nics, there are periodic +disconnects which results in a new phy and ifindex. +\end{itemize} + +\subsection{Functions} +\begin{itemize} +\item interfaces(): (ifconfig), type: filesystem, returns list of all network dev +\item isinterface(dev): (ifconfig ) type: filesystem, check dev is an interface +\item winterfaces([iosock]): (iwconfig), type: ioctl, list wireless interfaces +\item iswireless(dev,[iosock]): (iwconfig ), type: ioctl, check dev is a +wireless interface +\item regget([nlsock]: (iw reg get), type: netlink, get regulatory domain +\item regset(rd,[nlsock]): (iw reg set ), type: netlink, set regulatory domain +to rd +\item getcard(dev,[nlsock]) (N/A), type: hybrid netlink and ioctl: get a Card +object for dev +\item validcard(card,[nlsock]): (N/A), type: (hyrbrid netlink and ioctl), verify +card is still valid +\item macget(card,[iosock]): (ifconfig card.), type: ioctl get card's hw +address +\item macset(card,mac,[iosock]): (ifconfig card. hw ether ), type: +ioctl, set card's hw address to mac +\item up(card,[iosock]) (ifconfig card. up), type: ioctl, bring card up +\item down(card,[iosock]): (ifconfig card. down), type: ioctl, bring card +down +\item inetget(card,[iosock]): (ifconfig card.), type: ioctl, get ip4 address, +netmask and broadcast address of card +\item inetset(card,ipaddr,netmask,broadcast,[iosock]): (ifconfig card/ +netmask broadcast ), type: ioctl, set the interface addresses +of the card +\item ip4set(card,ipaddr,[iosock]): (ifconfig card. ), type: ioctl, +set the card's ip4 address +\item netmaskset(card,netmask,[iosock]): (ifconfig card. netmask ), +type: ioctl, set the card's netmask +\item broadcastset(card,broadcast,[iosock]): (ifconfig card. broadcast +), type: ioctl, set the card's broadcast address +\item devfreqs(card,[nlsock]): (iw phy card.phy info), type: netlink, get card's +supported frequencies +\item devchs(card,[nlsock]): (iw phy card.phy info), type: netlink, get card's +supported channels +\item devstds(card,[iosock]): (iwconfig card. | grep IEEE), type: ioctl, get +list of card's 802.11 supported standards +\item devmodes(card,[nlsock]): (iw phy card.phy info | grep interface), type: +netlink, get card's supported modes +\item devcmds(card,[nlsock]): (iw phy card.phy info | grep commands), type: +netlink, get card's supported commands +\item devinfo(card,[nlsock]): (iw dev card. info), type: netlink, get info +for dev +\item phyinfo(card,[nlsock]): (iw phy card. info), type: netlink, get info +for phy +\item ifaces(card,[nlsock]): (APX iw card.dev | grep phy\#), type: netlink, get all +cards (w/ modes) of interfaces sharing the same phy as card +\item txget(card,[iosock]): (iwconfig card. | grep Tx-Power card), type: +ioctl, get card's transmission power +\item chget(card,[nlsock]): (iw dev info | grep channelS), type: +netlink, get card's current channel (only works for cards in mode managed) +\item chset(card,ch,chw,[nlsock]): iw phy set channel ), +type: netlink, set card's current channel to ch with width chw +\item freqset(card,rf,chw,[nlsock]): iw phy set freq ), +type: netlink, set card's current frequency to rf with width chw +\item devmodes(card,[iosock]): (iw phy card.), type: netlink, get modes +supported by card +\item modeset(card,mode,[flags],[nlsock]): (iw dev card. set type +[flags]), type: netlink, set card's mode to mode with flags (if mode is monitor) +\item modeget(card[nlsock]): (iw dev card. info | grep mode), type: netlink, +get card's mode +\item devadd(card,vnic,mode,[flags],[nlsock]): (iw phy card. interface add + type flags ), type: netlink, creates a new virtual interface +on card's phy with dev vdev, in mode and using flags. Note: flags are only supported +in when creating a monitor mode +\item devdel(card,[nlsock]): (iw card. del), type: netlink, deletes dev +\begin{itemize} +\item \_hex2mac\_(v): returns a ':' separated mac address from byte stream v +\item \_hex2ip4\_(v): returns a '.' separated ip4 address from byte stream v +\item \_validip4\_(addr): determines if addr is a valid ip4 address +\item \_validmac\_(addr): determines if addr is a valid mac address +\item \_issetf\_(flags,flag): determines if flag is set in flags +\item \_setf\_(flags,flag): set flag in flags to on +\item \_unsetf\_(flags,flag): set flag in flags to off +\item \_familyid\_(nlsock): returns and sets the Netlink family id for nl80211, +only called once per module import +\item \_ifindex\_(dev,[iosock]): returns dev's ifindex +\item \_flagsget\_(dev,[iosock]): get's the dev's interface flags +\item \_flagsset\_(dev,flags,[iosock]): set's the dev's interface flags +\item \_getfreqs\_(band): returns a list of frequencies from the packed byte string +band +\item \_iostub\_(fct,*argv): ioctl stub function, calls fct with parameter list argv +and an allocated ioctl socket +\item \_nlstub\_(fct,*argv): netlink stub function, calls fct with parameter list +argv and an allocated netlink socket +\end{itemize} +\end{itemize} + +\section{API: channels.py}\label{sec:channels.api} +Channel, Frequency enumeration and conversions can be found in channels.py. + +\subsection{Constants} +\begin{enumerate} +\item \textbf{CHWIDTHS}: imported channel widths from nl80211\_h +\item \textbf{ISM\_24\_C2F}: Dict containing ISM channel (key) to frequency (value) +pairs +\item \textbf{ISM\_24\_F2C}: Dict containing ISM frequency (key) to channel (value) +pairs +\item \textbf{UNII\_5\_C2F}: Dict containing UNII 5Ghz channel (key) to frequency +(value) pairs +\item \textbf{UNII\_5\_F2C}: Dict containing UNII 5Ghz frequency (key) to channel +(value) pairs +\item \textbf{UNII\_4\_C2F}: Dict containing UNII upper 4Ghz channel (key) to +frequency (value) pairs +\item \textbf{UNII\_4\_F2C}: Dict containing UNII upper 4Ghz frequency (key) to +channel (value) pairs +\end{enumerate} + +\subsection{Functions} +\begin{enumerate} +\item channels(): returns a list of all channels +\item freqs(): returns a list of all frequencies +\item ch2rf(c): convert channel c to frequency +\item rf2ch(f): convert frequency f to channel +\end{enumerate} + +\section{API: device.py}\label{sec:deviceapi} +Retrieval of the driver and chipset of a given card is found in device.py. + +\subsection{Constants} +\begin{enumerate} +\item \textbf{dpath}: path to system device details +\item \textbf{drvpath}: path to device drivers +\end{enumerate} + +\subsection{Functions} +\begin{enumerate} +\item ifcard(dev): returns the device driver and chipset +\item ifdriver(dev): returns the device driver +\item ifchipset(driver): returns the chipset associated with driver +\end{enumerate} + +\section{API: rfkill.py}\label{sec:rfkillapi} +A port of the command line tool rfkill, rfkill.py writes and reads rfkill\_event +structures to /dev/rfkill using fcntl provding functionality to block and unblock +devices. + +\subsection{Constants} +\begin{enumerate} +\item \textbf{RFKILL\_TYPES}: list of strings corresponding to the types of devices +supported by rfkill +\end{enumerate} + +\subsection{Functions} +\begin{enumerate} +\item rfkill\_list(): corresponds to rkill list, returns a dict of dicts name -> +\{idx, type, soft, hard\}. If type is 'wireless', then name will be of the form +phy such that n is the physical index of the wireless card +\item rfkill\_block(idx): soft blocks the device at rfkill index idx +\item rfkill\_blockby(rtype): soft blocks all devices of type rtype +\item rfkill\_unblock(idx): turns off the soft block at rfkill index idx +\item rfkill\_unblockby(rtype): turns off the soft blocks of all devices of type +rtype +\item soft\_blocked{idx}: determines soft block state of device at rfkill index idx +\item hard\_blocked{idx}: determines hard block state of device at rfkill index idx +\item getidx(phy): returns the rfkill index of the device with physical index phy +\item getname(idx): returns the name of the device at rfkill index idx +\item gettype(idx): returns the type of the device at rfkill index idx +\end{enumerate} + +\section{API: libnl.py}\label{sec:libnlapi} +Providing libnl similar functionality, libnl.py provides the interface between +pyw and the underlying nl80211 core. It relates similarily to libnl by providing +functions handling netlink messages and sockets and where possible uses similarly +named functions as those libnl to ease any transitions from C to PyRIC. However, +several liberties have been taken as libnl.py handles only nl80211 generic netlink +messages. + +\subsection{Constants} +\begin{itemize} +\item \textbf{BUFSZ} default rx and tx buffer size +\end{itemize} + +\subsection{Classes/Objects} +The two classes in libnl.py, NLSocket and GENLMsg, discussed in the following +sections subclass Python's builtin dict. This has been done IOT to take advantage +of dict's already existing functions and primarily their mutability and Python's +'pass by name' i.e. modifications in a function will be reflected in the caller. +This makes the classes very similar to the use C pointers to structs in libnl. + +\subsubsection{NLSocket} +NLSocket is a wrapper around a netlink socket which exposes the following +properties through '.': +\begin{itemize} +\item \textbf{sock}: the actual socket +\item \textbf{fd}: the socket's file descriptor (deprecated) +\item \textbf{tx}: size of the send buffer +\item \textbf{rx}: size of the receive buffer +\item \textbf{pid}: port id +\item \textbf{grpm}: group mask +\item \textbf{seq}: sequence number +\item \textbf{timeout}: socket timeout +\end{itemize} +and has the following methods: +\begin{itemize} +\item incr(): increment sequence number +\item send(pkt): sends pkt returning bytes sent +\item recv(): returns received message (will block unless timeout is set) +\item close(): close the socket +\end{itemize} + +NLSockets are created with nl\_socket\_alloc and must be freed with nl\_socket\_free. +See Section \ref{sec:libnlfct}. + +\subsubsection{GENLMsg} +GENLMsg is a wrapper around a dict with the following key->value pairs: +\begin{itemize} +\item \textbf{len}: total message length including the header +\item \textbf{nltype}: netlink type +\item \textbf{flags}: message flags +\item \textbf{seq}: seq. \# +\item \textbf{pid}: port id +\item \textbf{cmd}: generic netlink command +\item \textbf{attrs}: list of message attributes. Each attribute is a tuple t = +(attribute,value,datatype) where: +\begin{itemize} +\item \textbf{attribute}: netlink attribute type i.e. CTRL\_ATTR\_FAMILY\_ID +\item \textbf{value}: the unpacked attribute value +\item \textbf{datatype}: datatype of the attribute as defined in nelink\_h i.e. +NLA\_U8 +\end{itemize} +\end{itemize} +NOTE: as discussed below, on sending, the seq. \# and port id are overridden with +values of the netlink socket.\\ + +GENLMsg exposes the following properties: +\begin{itemize} +\item \textbf{len}: length of the message (get only) +\item \textbf{vers}: returns 1 (default version) (get only) +\item \textbf{nltype}: message content i.e. generic or nl80211 (get or set) +\item \textbf{flags}: message flags (get or set) +\item \textbf{seq}: current sequence \# (get or set) +\item \textbf{pid}: port id (get or set) +\item \textbf{cmd}: netlink command (get or set) +\item \textbf{attrs}: attribute list (get only) +\item \textbf{numattrs}: number of attributes (get only) +\end{itemize} + +GENLMsg has the following methods: +\begin{itemize} +\item \_\_repr\_\_(): returns a string representation useful for debugging +\item tostream(): returns a packed netlink message + +There are two methods of creating a GENLMsg. Create a new message (to send) with +nlmsg\_new and create a message from a received packet with nlmsg\_fromstream. +These are discussed below. + +\subsection{Functions}\label{sec:libnlfct} +\begin{itemize} +\item \textbf{Netlink Socket Related} +\begin{itemize} +\item nl\_socket\_alloc(pid,grps,seq,rx,tx,timeout): creates a netlink socket +with port id = pid, group mask = grps, initial seq. \# = seq, send and receive +buffer size = tx and rx respectively and blocking timeout = timeout +\item nl\_socket\_free(sock): closes the socket +\item nl\_socket\_pid(sock): (deprecated for NLSocket.pid) returns the port id +\item nl\_socket\_grpmask(sock): (deprecated for NLSocket.grpmask) returns the +group mask +\item nl\_sendmsg(sock,msg,override=False): sends the netlink msg over socket. +NOTE: NLSockets will automatically set the port id and seq. \# regardless of +their value in the message. If override is True, the message's pid and seq. \# +will be used instead. +\item nl\_recvmsg(sock): returns a GENLMsg or blocks unless the socket's timeout +is set. Should only be called once per every nl\_sendmsg. +\end{itemize} +\item \textbf{Netlink Message Related} +\begin{itemize} +\item nlmsg\_new(nltype=None,cmd=None,pid=None,flags=None,attrs=None): creates a +new GENLMsg with zero or more attributes defined. +\item nlmsg\_fromstream(stream): parses the message in stream returning the +corresponding GENLMsg +\item nla\_parse(msg,l,mtype,stream,idx): parses the attributes in stream appending +them to the attribute list of message where msg = the GENLMsg, l = the total +length of the message, mtype = the message content (i.e. netlink type) stream is +the original byte stream and idx is the index of the start of the attribute list +\item nla\_parse\_nested(nested): returns the list of packed nested attributes +extracted from the stream nested. Callers must unpack and parse the returned +attributes themselves +\item nla\_put(msg,v,a,t): appends the attribute a, with value v and datatype t +to the msg's attribute list +\item nla\_put\_(msg,v,a): eight specialized functions that append +attribute a with the value v and type to msg's attribute list +\item nla\_putat(msg,i,v,a,d): puts attribute a, with value v and datatype d at +index i in msg's attribute list. +\item nla\_pop(msg,i): removes the attribute tuple at index i, returning the popped +tuple +\item nla\_find(msg,a,value=True): returns the first attribute a in msg's attribute +list. If value returns only the value otherwise returns the attribute tuple +\item nla\_get(msg,i,value=True): returns the attribute at index i. If value returns +only the value otherwise returns the attribute tuple +\item \_nla\_strip(v): (private) strips padding bytes from the end of v +\item \_attrpack(a,v,d): (private) packs the attribute tuple +\end{itemize} +\item \_maxbufsz\_(): (private) returns the maximum allowable socket buffer size +\end{itemize} +\end{itemize} + +\section{API: libio.py}\label{sec:libioapi} +A very basic interface to ioctl, libio provides socket creation, deletion and +transfer. + +\subsection{Functions} +\begin{enumerate} +\item io\_socket\_alloc(): returns an ioctl socket +\item io\_socket\_free(iosock): closes the ioctl socket iosock +\item io\_transfer\_(iosock,flag,ifreq): sends the ifreq structure with sockios +control call flag to the kernel and returns the received ifreq structure +\end{enumerate} + +\section{Copyright and License}\label{sec:copy} +PYRIC: Python Radio Interface Controller v0.1.0\\ + +Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com)\\ + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License\cite{gplv3} as published by the Free +Software Foundation, either version 3 of the License, or (at your option) any +later version.\\ + +Redistribution and use in source and binary forms, with or without modifications, +are permitted provided that the following conditions are met: +\begin{itemize} +\item Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. +\item Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. +\item Neither the name of the orginal author Dale V. Patterson nor the names of +any contributors may be used to endorse or promote products derived from this +software without specific prior written permission. +\end{itemize} + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\ + +PyRIC is free software but use, duplication or disclosure by the United States +Government is subject to the restrictions set forth in DFARS 252.227-7014.\\ + +Use of this software is governed by all applicable federal, state and local +laws of the United States and subject to the laws of the country where you reside. +The copyright owner and contributors will be not be held liable for use of this +software in furtherance of or with intent to commit any fraudulent or other illegal +activities, or otherwise in violation of any applicable law, regulation or legal +agreement.\\ + +See http://www.gnu.org/licenses/licenses.html for a copy of the GNU General Public +License. +\end{appendices} + +\bibliographystyle{acm} +\bibliography{PyRIC} +%\addcontentsline{toc}{chapter}{Bibliography} + +\end{document} diff --git a/Help/nlsend.png b/Help/nlsend.png new file mode 100644 index 0000000000000000000000000000000000000000..c31e5b6a4098319276f1d39192176ac0d0681c72 GIT binary patch literal 90242 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 ND9NkK)ykNM{|`yXupe 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≪sab); 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�vzWU%8gW)rn36z&gBQyCYZx(QC%N7( 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 ND9NkK)ykNM{|`yXupe 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≪sab); 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�vzWU%8gW)rn36z&gBQyCYZx(QC%N7( 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 Date: Sat, 11 Jun 2016 09:53:30 -0600 Subject: [PATCH 036/121] v0.1.1 Issue #11 MemoryError Fix --- Help/PyRIC.bib | 48 -- Help/PyRIC.tex | 1124 ----------------------------------------------- Help/nlsend.png | Bin 90242 -> 0 bytes Help/nlsock.png | Bin 123683 -> 0 bytes 4 files changed, 1172 deletions(-) delete mode 100644 Help/PyRIC.bib delete mode 100644 Help/PyRIC.tex delete mode 100644 Help/nlsend.png delete mode 100644 Help/nlsock.png diff --git a/Help/PyRIC.bib b/Help/PyRIC.bib deleted file mode 100644 index d159770..0000000 --- a/Help/PyRIC.bib +++ /dev/null @@ -1,48 +0,0 @@ - -@Misc{libnl, - Title = {Netlink Library (libnl)}, - Author = {Thomas Graf}, - Month = {May}, - Year = {2011}, - Date = {2011-05-09}, - Language = {english}, - Organization = {Swiss Internet User Group}, - Shorthand = {libnl}, - Url = {http://www.carisma.slowglass.com/~tgr/libnl/doc/core.html}, - Version = {3.2} -} - -@Article{spae, - Title = {Communicating between the kernel and user-space in Linux using Netlink sockets}, - Author = {Pablo Neira Ayuso, Rafael M. Gasca, Laurent Lefevre}, - Journal = {Software - Practice And Experience}, - Year = {2010}, - Month = {August}, - Pages = {797-810}, - Volume = {40} -} - -@Misc{wraith, - Title = {Wireless Reconnaissance And Intelligent Target Harvesting}, - Author = {Dale V. Patterson}, - Month = {April}, - Year = {2016}, - Date = {2016-04-03}, - Language = {english}, - Shorthand = {wraith}, - Url = {https://github.com/wraith-wireless/wraith}, - Version = {0.0.6} -} - -@Misc{gplv3, - Title = {GNU General Public License}, - Month = {June}, - Year = {2007}, - Date = {2007-06-29}, - Language = {english}, - Organization = {Free Software Foundation}, - Pagination = {section}, - Shorthand = {GPL}, - Url = {http://www.gnu.org/licenses/gpl.html}, - Version = {3} -} diff --git a/Help/PyRIC.tex b/Help/PyRIC.tex deleted file mode 100644 index c076969..0000000 --- a/Help/PyRIC.tex +++ /dev/null @@ -1,1124 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) -% -%This program is free software: you can redistribute it and/or modify it under -%the terms of the GNU General Public License as published by the Free Software -%Foundation, either version 3 of the License, or (at your option) any later -%version. -% -%Redistribution and use in source and binary forms, with or without modifications, -%are permitted provided that the following conditions are met: -% o Redistributions of source code must retain the above copyright notice, this -% list of conditions and the following disclaimer. -% o Redistributions in binary form must reproduce the above copyright notice, -% this list of conditions and the following disclaimer in the documentation -% and/or other materials provided with the distribution. -% o Neither the name of the orginal author Dale V. Patterson nor the names of any -% contributors may be used to endorse or promote products derived from this -% software without specific prior written permission. -% -% __name__ = 'User Guide' -%__license__ = 'GPLv3' -%__version__ = '0.0.3' -%__date__ = 'June 2016' -%__author__ = 'Dale Patterson' -%__maintainer__ = 'Dale Patterson' -%__email__ = 'wraith.wireless@yandex.com' -%__status__ = 'Production' -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\documentclass[11pt]{article} -\usepackage[utf8]{inputenc} -\setlength{\parindent}{0pt} -\usepackage{graphicx} -\usepackage{listings} -\usepackage{caption} -\usepackage{geometry} -\usepackage{color} -\usepackage[titletoc,toc,title]{appendix} -\usepackage[T1]{fontenc} - -\definecolor{codegreen}{rgb}{0,0.6,0} -\definecolor{codegray}{rgb}{0.5,0.5,0.5} -\definecolor{codepurple}{rgb}{0.58,0,0.82} -\definecolor{backcolour}{rgb}{0.95,0.95,0.92} - -\geometry{left=1.0in,right=1.0in,top=1.0in,bottom=1.0in } - -\lstset{ - frame=top, - frame=bottom, - basicstyle=\small\normalfont\ , - stepnumber=1, - numbersep=10pt, - tabsize=2, - extendedchars=true, - breaklines=true, - captionpos=b, - mathescape=true, - showspaces=false, - showtabs=false, - xleftmargin=17pt, - framexleftmargin=17pt, - framexrightmargin=17pt, - framexbottommargin=5pt, - framextopmargin=5pt, - showstringspaces=false, - backgroundcolor=\color{backcolour}, - commentstyle=\color{codegreen}, - keywordstyle=\color{magenta}, - numberstyle=\tiny\color{codegray}, - stringstyle=\color{codepurple}, - basicstyle=\footnotesize -} - -\title{PyRIC v0.1.0: User Manual} -\author{Dale V. Patterson\\ wraith.wireless@yandex.com} - -\begin{document} -\maketitle -\tableofcontents - -\section{About PyRIC}\label{sec:About} -PyRIC provides wireless pentesters the ability to manipulate, identify and -enumerate your system's wireless cards programmatically in Python. PyRIC provides -functionality offered by command line tools like iw, ifconfig, iwconfig and rfkill. -Why use subprocess.Popen, regular expressions and str.find to interact with your -wireless cards? PyRIC is: -\begin{enumerate} -\item \textbf{Pythonic}: No ctypes, SWIG etc. PyRIC redefines C header files as -Python and uses sockets to communicate with kernel. -\item \textbf{Self-sufficient}: No third-party files used, PyRIC is completely self- -contained -\item \textbf{Fast}: (relatively speaking) PyRIC is faster than using iw through -subprocess.Popen -\item \textbf{Parseless}: Get the output you without parsing output from iw. Never -worry about iw updates and rewriting your parsers. -\item \textbf{Easy}: If you can use iw, you can use PyRIC -\end{enumerate} - -At it's heart, PyRIC is a python port of (a subset of) iw and by extension a -python port of Netlink\cite{spae} (w.r.t nl80211 functions). The original goal -of PyRIC was to provide a simple interface to the underlying nl80211 kernel -support, handling the complex operations of Netlink seamlessy while maintaining -a minimum of "code walking" to understand, modify and extend. PyRIC will only work -on Linux with Netlink support.\\ - -While users can utilize libnl(.py) to communicate directly with the kernel, the -true utility of PyRIC is pyw(.py). Like iw, pyw provides an interface/buffer -between the caller and the kernel, handling all message construction, parsing -and transfer transparently and without requiring any Netlink knowledge or -experience. \\ - -PyRIC does more though, via fcntl it implements rfkill, allowing users to list, -block and unblock devices as well as implement libio(.py) for ioctl communication -with the kernel providing users the ability to turn cards on/off and set addresses. - -At this time, PyRIC (through pyw, rfkill and device) can: -\begin{itemize} -\item enumerate interfaces and wireless interfaces, -\item get/set regulatory domain, -\item get/set hw address, -\item get/set ip4, netmask and broadcast address -\item identify a radio's chipset and driver, -\item turn device on/off, -\item get supported standards, -\item get supported commands, -\item get supported modes, -\item get dev/phy info on device, -\item get/set mode, -\item add/delete interfaces, and -\item block/unblock devices through rfkill. -\end{itemize} -It also provides users with the ability, through libnl(.py) to extend the above -functionality by creating additional commands.\\ - -Currently, PyRIC does handle multicast messages i.e. events or dumps although -plans for future versions include adding the ability to process dumps. \\ - -\subsection{Naming Conventions} -The terms interface, device and radio are all used interchangeably throughout to -refer to a network interface card (NIC). The following terms will always have one -meaning: -\begin{itemize} -\item \textbf{dev} - the device name i.e. wlan0 or eth0 of a NIC, -\item \textbf{phy} - the physical index of a NIC i.e. the 0 in phy0, -\item \textbf{ifindex} - the interface index of a NIC, -\item \textbf{card} or \textbf{Card} - a NIC abstraction, an object used in pyw -functions see the following section for a description. -\end{itemize} - -\subsection{Cards} -A Card is merely a wrapper around a tuple t = (phy index,device name,ifindex). -Since the underlying Netlink calls sometimes require the physical index, sometimes -the device name, and sometimes the ifindex, pyw functions\footnote{Not all functions -accept a Card, the function pyw.devinfo() will accept either a Card or a dev and -pyw.isinterface() only accepts a dev} take a Card object which doesn't require -callers to know which identifier to use for each function. There are four primary methods to creating a Card: -\begin{enumerate} -\item \textbf{pyw.getcard} returns a Card object from a given dev, -\item \textbf{pyw.devinfo} returns the dict info where info['card'] is the Card -object. This function will take either a card or a dev -\item \textbf{pyw.devadd} returns a new Card object, -\item \textbf{pyw.ifaces} returns a list of tuples t = (Card,mode) sharing the -same phy as a given dev. -\end{enumerate} - -A side affect of using Cards is that many of the netlink calls require the ifindex. -The ifindex is found through the use of ioctl, meaning two sockets have to be -created and two messages have to be sent, received and parsed in order to execute -the command. With Cards, the ifindex is requested for only once. \\ - -Keep in mind that any identifier (phy, dev, ifindex) can be invalidated outside -of your control. Another program can rename your interface, that is change the -dev without your knowledge. Depending on what functions are being used this may -not be noticed right away as the phy will remain the same. Also, usb devices (if -the usb is disconnected and reconnected) will have the same dev but the phy and -ifindex will be different. - -\subsection{Benchmarks} -PyRIC makes use of several "extensions" to speed up pyw functions: -\begin{enumerate} -\item \textbf{Persistent sockets}: pyw provides the caller with functions and -the ability to pass their own netlink (or ioctl socket) to pyw functions -\item \textbf{One-time request for the nl80211 family id}: pyw stores the family -id in a global variable -\item \textbf{Consolidation} different "reference" values are consolidated in one -class (see the previous section) -\end{enumerate} - -\begin{table} -\begin{center} -\begin{tabular}{| l | r | r | r | r|} -\hline -chset & Total & Avg & Longest & Shortest \\ -\hline -Popen(iw) & 588.3059 & 0.0588 & 0.0682 & 0.0021 \\ -\hline -one-time & 560.3559 & 0.0560 & 0.0645 & 0.0003 \\ -\hline -persistent & 257.8293 & 0.0257 & 0.0354 & 0.0004 \\ -\hline -\end{tabular} -\caption{Benchmark: Popen(iw) vs pyw} -\end{center} -\label{tab:benchmark} -\end{table} - -While small, these changes can improve the performance of any programs using pyw. -Table 1 shows benchmarks for hop time on an Alfa AWUS036NH conducted 10000 times. -Note that we are not implying that PyRIC is faster than iw. Rather, the table -shows that PyRIC is faster than using Popen to execute iw. Using one-time sockets, -there is a difference of 28 seconds over Popen and iw with a small decrease in -the average hoptime. Not a big difference. However, the performance increased -dramatically when persistent netlink sockets are used with the total time and -average hop time nearly halved. - -\section{Installing PyRIC}\label{sec:installing} -Starting with version 0.0.6, the structure (see Section \ref{sec:About} has -changed to facilitate packaging on PyPI. This restructing has of course led -to some minor difficulties especially when attempting to install (or even -just test) outside of a pip installation. \\ - -Obviously, the easiest way to install PyRIC is through PyPI:\\ - - \texttt{sudo pip install PyRIC}\\ - -You can also install PyRIC from source. The tarball can be downloaded from: - -\begin{itemize} -\item PyPi: https://pypi.python.org/pypi/PyRIC, -\item PyRIC Web: http://wraith-wireless.github.io/PyRIC, or -\item Github: https://github.com/wraith-wireless/PyRIC. -\end{itemize} - -After downloading, extract and run:\\ - - \texttt{sudo python setup.py install}\\ - -If you just want to test PyRIC out, download your choice from above. After -extraction, move the pyric folder (the package directory) to your location of -choice and from there start Python and import pyw. It is very important that you -do not try and run it from PyRIC which is the distribution directory. This will -break the imports pyw.py uses. \\ - -You will only be able to test PyRIC from the pyric directory but, if you want to, -you can add it to your Python path and run it from any program or any location. -To do so, assume you untared PyRIC to /home/bob/PyRIC. Create a text file named -pyric.pth with one line \\ - - /home/bob/PyRIC \\ - -and save this file to /usr/lib/python2.7/dist-packages (or -/usr/lib/python3/dist-packages if you want to try it in Python 3). - -\begin{table} -\begin{center} -\begin{tabular}{| l | r | r | r |} -\hline -Source & Stability & Recency & Installation \\ -\hline -pip & 5 & 3 & 5\\ -\hline -PyPI & 5 & 3 & 4\\ -\hline -PyRIC Web & 4 & 4 & 4\\ -\hline -Github & 3 & 5 & 3\\ -\hline -\end{tabular} -\caption{Stability vs Recency vs Installation} -\end{center} -\label{tab:install} -\end{table} - -\section{Using PyRIC}\label{sec:using} -As stated previously, PyRIC provides a set of functions to interact with your -system's radio(s) and the ability to interact directly with the kernel through -netlink and ioctl sockets. - -\subsection{Interacting with the Wireless Core and Wireless NICs: pyw.py} -If you can use iw, you can use pyw. The easist way to explain how to use pyw is -with an example. Imagine your wireless network, on ch 6, has been experiencing -difficulties lately and you want to capture some traffic to analyse it. Listing -\ref{lst:pentest} shows how to set up a wireless pentest environment. \\ - -\begin{lstlisting}[caption={Setting up a Wireless Pentest Environment}, - label={lst:pentest}, - language=Python] - 1: import pyric # pyric error (and ecode EUNDEF) - 2: from pyric import pyw # for iw functionality - 3: from pyric import device # for chipset/driver - 4: from pyric.channels import rf2ch # rf to channel conversion - 5: - 6: dev = 'wlan0' - 7: ifaces = pyw.interfaces() - 8: wifaces = pyw.winterfaces() - 9: if dev not in ifaces: -10: print "Device {0} is not valid, use one of {1}".format(dev,ifaces) -11: return -12: elif dev not in wifaces: -13: print "Device {0} is not wireless, use one of {1}".format(dev,wifaces) -14: -15: print "Regulatory Domain currently: ", pyw.regget() -16: dinfo = pyw.devinfo(dev) -17: card = dinfo['card'] -18: pinfo = pyw.phyinfo(card) -19: driver = device.ifdriver(card.dev) -20: chipset = device.ifchipset(driver) -21: -22: pyw.down(card) -23: pyw.macset(card,'00:03:93:57:54:46') -24: -25: msg = "Using {0} currently in mode: {1}\n".format(card,dinfo['mode']) -26: msg += "\tDriver: {0} Chipset: {1}\n".format(driver,chipset) -27: if dinfo['mode'] == 'managed': -28: msg += "\ton channel {0} width {1}\n".format(rf2ch(dinfo['RF']), -29: dinfo['CHW']) -30: msg += "\tSupports modes {0}\n".format(pinfo['modes']) -31: msg += "\tSupports commands {0}".format(pinfo['commands']) -32: msg += "\thw addr {0}".format(pyw.macget(card)) -33: print msg -34: -35: pdev = 'pent0' -36: for iface in pyw.ifaces(card): -37: pyw.devdel(iface[0]) -38: pcard = pyw.devadd(card, pdev, 'monitor') -39: pyw.up(pcard) -40: pyw.chset(pcard,6,None) -41: -42: # DO STUFF HERE -43: -44: pyw.devdel(pcard) -45: -46: card = pyw.devadd(card,card.dev,dinfo['mode']) -47: pyw.macset(card,dinfo['mac']) -48: pyw.up(card) -\end{lstlisting} - -Listing \ref{lst:pentest} attempts to show most of the available pyw functions -in use and is the basic shell used in another project, Wraith\cite{wraith}, to -instantiate a wireless (802.11) sensor - (for a full listing of all pyw functions -see Appendix \ref{sec:pywapi}) - with scanning capabilities. Lines 1 and 2 should -always be included as they import the pyric error and pyw functions. Line 3 -imports device which provides the ifchipset and ifdriver functions and Line 4 -imports the rf2ch conversion function. \\ - -In lines 6 through 13, the device wlan0 is confirmed wireless and lines 16 through -20 a Card object for 'wlan0' is created and details about the interface are printed. -Next, the mac address of wlan0 is changed on lines 23. Note, the device is brought -down first. \\ - -More information on the device is printed in lines 25 through 33. Starting on -line 35, a device named 'pent0' is created in monitor mode. First in lines 36 -and 37, all interfaces on the same phy are deleted \footnote{we have found that -it is better to delete all interfaces on the same phy ensuring that external -processes don't interfere with the new device} before creating the new device, -bringing the card up and setting it to channel 6 NOHT.\\ - -Restoring the device starts on line 45, where the virtual interface is deleted, -the previous interface is restored and the mac address is reset. - -\subsubsection{One-time vs Persistent Sockets} -The example in Listing \ref{lst:pentest} uses one-time sockets (netlink and -ioctl). When using iw, there are several things that occur prior to the actual -command or request being submitted. First, iw creates a netlink socket. Then, -iw will request the family id for nl80211. The relative time spent doing this -is neglible but, it is redundant and it may become noticeable in programs that -repeatedly use the Netlink service. Once comlete, iw closes the socket. In some -cases, the ifindex of the device is needed and iw will also initiate an ioctl -call to retrieve it. PyRIC eliminates these redundancies by using a global -variable in pyw that stores the family id after the first time it is requested -and by providing callers the option to use persistent sockets. -\begin{itemize} -\item \textbf{One-time Sockets} Similar to iw. The command, creates the netlink -socket (or ioctl socket), composes the message, sends the message and receives -the response, parses the results, closes the socket and returns the results to -the caller. At no time does the caller need to be aware of any underlying Netlink -processes or structures. -\item \textbf{Persistent Sockets} Communication and parsing only. The onus of -socket creation and deletion is on the caller which allows them to create one -(or more) socket(s). The pyw functions will only handle message construction, -message sending and receiving and message parsing. -\end{itemize} -The caller needs to be cognizant of whether the function requires a netlink or -ioctl socket. Passing the wrong type will result in an error. \\ - -NOTE: One must remember that there is an upper limit to the number of open netlink -sockets. It is advised to use one-time functions as much as possible and save the -use of persistent sockets for use in code that repeatedly makes use of netlink. \\ - -The latest version of pyw.py (v 0.1.*) implements this functionality through the -use of what I call templates\footnote{I use templates and stubs for the lack -of any better naming convention}, Listing \ref{lst:template} and stubs Listing -\ref{lst:stub}. - -\begin{lstlisting}[caption={A Basic Netlink Function Template}, - label={lst:template}, - language=Python] -def fcttemplate(arg0,arg1,..,argn,*argv): - # put parameter validation (if any) here - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(fcttemplate,arg0,arg1,...,argn) - - # command execution - ... - return results -\end{lstlisting} - -The template function in Listing \ref{lst:template} checks if argv has a netlink -socket\footnote{ioctl calls operate in the same manner} at index 0. If so, it -proceeds to execution. If there is no socket, the stub is executed which creates -one. If something other than a netlink socket is at argv[0], an error will be -raised during execution. \\ - -\begin{lstlisting}[caption={Function \_nlstub\_}, - label={lst:stub}, - language=Python] -def _nlstub_(fct,*argv): - nlsock = None - try: - nlsock = nlsock = nl.nl_socket_alloc() - argv = list(argv) + [nlsock] - return fct(*argv) - except pyric.error: - raise # catch & release - finally: - if nlsock: nl.nl_socket_free(nlsock) -\end{lstlisting} - -The stub function, Listing \ref{lst:stub} allocates a netlink socket, executes -the original (now with a netlink socket) and then destroys the netlink socket.\\ - -\begin{lstlisting}[caption={Using Persistent Sockets}, - label={lst:persistent}, - language=Python] - 1: import pyric # pyric error (and ecode EUNDEF) - 2: from pyric import pyw # for iw functionality - 3: from pyric.lib import libnl as nl # for netlink sockets - 4: - 5: nlsock = nl.nl_socket_alloc(timeout=1) - 6: card = pyw.getcard('wlan0',nlsock) - 7: print pyw.devmodes(card,nlsock) - 8: nl.nl_socket_free(nlsock) -\end{lstlisting} - -Listing \ref{lst:persistent}, shows the creation of a persistent netlink socket -that is used in the creation of a card and in retrieved the card's supported -modes. \\ - -Use Python's built in help features on pyw functions or see Appendex \ref{sec:pywapi} -to determine what type of socket is needed. - -\subsection{Additional Tools: channels.py, device.py and rfkill.py} -In addition to ifconfig and iw related functions found in pyw.py, PyRIC provides -a port of rfkill, channel/frequency enumeration and device chipset, driver -retrieval. More information can be found in the Appendices. - -\subsection{Interacting with the Kernel: libnl.py and libio.py} -The kernel interfaces, libnl.py and libio.py are located in the lib directory. -They handle socket creation/deletion, message creation/parsing and kernel -communication. Aside from creating and deleting persistent sockets, there is -little need to access their functions unless you plan on extending pyw -functionality. As such, a further discussion of libnl.py and libio.py can be -found in the next section. - -\section{Extending PyRIC}\label{sec:extending} -You may find that pyw does not offer some of the functionality you need. Using -libnl.py and/or libnl.io, additional functionality can be added to your program.\\ - -It is helpful if the reader has a basic knowledge of netlinks. For a review, see -"Communicating between the kernel and user-space in Linux using Netlink Sockets" -\cite{spae}. - -\subsection{Porting C} -All Python ports of C header files can be found in the net directory. C Enums -and \#defines are ported using constants. C structs are ported using three -Python structures and the Python struct package: -\begin{enumerate} -\item a format string for packing and unpacking the struct -\item a constant specifying the size of the struct in bytes -\item a function taking the attributes of the struct as arguments and returning -a packed string -\end{enumerate} -Listing \ref{lst:cstruct} shows the C definition of the nlmsghdr found in netlink.h. - -\begin{lstlisting}[caption={C Struct nlmsghdr}, - label={lst:cstruct}, - language=C] -struct nlmsghdr { - __u32 nlmsg_len; - __u16 nlmsg_type; - __u16 nlmsg_flags; - __u32 nlmsg_seq; - __u32 nlmsg_pid; -}; -\end{lstlisting} - -And Listing \ref{lst:pstruct} shows the ported version in Python. - -\begin{lstlisting}[caption={Corresponding Python Definition}, - label={lst:pstruct}, - language=Python] -nl_nlmsghdr = "IHHII" -NLMSGHDRLEN = struct.calcsize(nl_nlmsghdr) -def nlmsghdr(mlen,nltype,flags,seq,pid): - return struct.pack(nl_nlmsghdr,NLMSGHDRLEN+mlen,nltype,flags,seq,pid) -\end{lstlisting} - -When using pyw, dealing with these structures is handled transparently by libnl.py -and libio.py. When extending or customizing pyw, a basic understanding of the -definitions in netlink\_h.py, genetlink\_h.py and if\_h.py. - -\subsection{Input/Output Control (ioctl)} -PyRIC provides more than just iw-related functions, it also implements functions -from ifconfig and iwconfig. These command line tools still use ioctl (or the proc -directory). For example, interfaces() reads from '/proc/net/dev' to retrieve all -system interfaces and winterfaces() use ioctl to check if a device is wireless. -Input/Output control calls have only been used when there was no viable alternative -and, it should not be necessary to have to add any further ioctl commands. If you -find that you need an ioctl related command, search through if\_h.py for the -appropriate structure and add it's definitions to ifreq. - -\subsection{Netlink and nl80211} -Documentation on Netlink, and nl80211 in particular, is so minimal as to be -neglible. The clusterfuck of code and lack of comments in the iw source tree -make it impossible to use as any sort of roadmap. Fortunately Thomas Graf's -site\cite{libnl} has excellent coverage of libnl, the Netlink library. Using -this as a reference, a simple Netlink parser was put together which later became -libnl.py. Using the command line tool strace and libnl.py, Netlink messages could -be dissected and analyzed.\\ - -Let us consider adding a virtual interface with the command:\\ - - \texttt{sudo iw phy0 interface add test0 type monitor}\\ - -First, we need to see what is going on under the covers. Using strace:\\ - - \texttt{strace -f -x -s 4096 iw phy0 interface add test0 type monitor}\\ - -from a terminal will give a you a lot of output, most irrelevant (to us). Scroll -through this until the netlink socket creation as highlighted in Figure -\ref{fig:nlsock}. You can see that a socket of type PF\_NETLINK is created and -the send/receive buffers are set to 32768. -\begin{center} -\begin{figure}[h] -\includegraphics{nlsock} -\caption{Netlink socket creation} -\label{fig:nlsock} -\end{figure} -\end{center} -What we want to analyze are the messages sent and received over the netlink -socket. In Figure \ref{fig:nlsock}, iw is requesting the family id for nl80211. -This id will be used in subsequent requests related to nl80211 as we will see -shortly. The return message gives the nl80211 family id as 26 and returns other -nl80211 attributes. This is handled by the private function \_familyid\_ in -pyw.py. - -Figure \ref{fig:nlsend} shows the add interface message being sent to the kernel. -\begin{center} -\begin{figure}[h] -\includegraphics{nlsend} -\caption{Netlink sendmsg} -\label{fig:nlsend} -\end{figure} -\end{center} -We are interested in the byte sequence following msg\_iov(1). Copy this and paste -into in a python variable as in Listing \ref{lst:nlparse} and pass it to the -function nlmsg\_fromstream which parses the byte stream and returns the GENLMsg.\\ - -\begin{lstlisting}[caption={Parsing netlink messages}, - label={lst:nlparse}, - language=Python] ->>> from pyric.lib import libnl as nl ->>> sent = "\x30\x00\x00\x00\x1a...\x00\x00" ->>> msg = nl.nlmsg_fromstream(sent) ->>> msg -nlmsghdr(len=48,type=26,flags=5,seq=1463268720,pid=10982) -genlmsghdr(cmd=7) -attributes: - 0: type=1,datatype=3 - value=0 - 1: type=4,datatype=5 - value=test0 - 2: type=5,datatype=3 - value=6 -\end{lstlisting} - -The first thing to notice is nlmsghdr type = 26, which of course is nl80211 family -id. The rest of the nlmsghdr components len, flags, seq, and pid are handled by -libnl.py although you can supply your own flags if desired. At this time, you can -manually look up what values the cmd, type and datatype correspond to in -nl80211\_h.py and netlink\_h.py or you can use the tools provided in nlhelp.py.\\ - -\begin{lstlisting}[caption={Parsing netlink messages continued}, - label={lst:nlparse2}, - language=Python] ->>> from pyric.net.netlink_h import NLA_DATATYPES ->>> from pyric.docs import nlhelp ->>> nlhelp.cmdbynum(7) -u'@NL80211_CMD_NEW_INTERFACE' ->>> ->>> for attr in msg.attrs: -... print nlhelp.attrbynum(attr[0]), NLA_DATATYPES[attr[2]], attr[1] -... -@NL80211_ATTR_WIPHY u32 0 -@NL80211_ATTR_IFNAME string test0 -@NL80211_ATTR_IFTYPE u32 6 ->>> ->>> from pyric.net.wireless.nl80211_h import NL80211_IFTYPES ->>> NL80211_IFTYPES[6] -'monitor' -\end{lstlisting} - -In Listing \ref{lst:nlparse2} command number 7 corresponds to -NL80211\_CMD\_NEW\_INTERFACE and the attributes that need to be passed to the -kernel are NL80211\_ATTR\_WIPHY, NL80211\_ATTR\_IFNAME and NL80211\_ATTR\_IFTYPE. -The IFTYPE is also known as the mode i.e. 'monitor' which can be found in -nl80211\_h.py NL80211\_IFTYPES. We don't parse the return message from the kernel -but, it follows the same SOP. In this case, it returns the attributes of the new -virtual interface. \\ - -With this information, we can now code our function. Recall the fcttemplate as -defined in Listing \ref{lst:template} and fill in the command execution as shown -in Listing \ref{lst:coding}. \\ - -\begin{lstlisting}[caption={Coding the function}, - label={lst:coding}, - language=Python] -# construct the message -msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_NEW_INTERFACE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) -nl.nla_put_u32(msg,card.phy,nl80211h.NL80211_ATTR_WIPHY) -nl.nla_put_string(msg,vdev,nl80211h.NL80211_ATTR_IFNAME) -nl.nla_put_u32(msg,IFTYPES.index(mode),nl80211h.NL80211_ATTR_IFTYPE) - -# send, receive and parse return results, returning the new Card -nl.nl_sendmsg(nlsock,msg) -rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes -return Card(card.phy,vdev,nl.nla_find(rmsg,nl80211h.NL80211_ATTR_IFINDEX)) -\end{lstlisting} - -We construct a new GENLMsg passing the nl80211 family id, the command we got -earlier and flags specifying that this is a request and we want to get an ACK -back\footnote{libnl.py always forces an ACK and handles the underlying process -of receiving it}. Now, add each attribute to the message. Note the order: value, -then attribute. With the message constructed, send it to the kernel, get the -results, parse and return them.\\ - -Rather simple, in fact the hardest part is figuring out what to send to the kernel. -Everything else is handled behind the scenes by libnl.py. - -\begin{appendices} -\section{Hierarchy/Architecture} -PyRIC's hierarchy is briefly discussed next. - -\begin{enumerate} -\item \textbf{\_\_init\_\_.py}: Initialize PyRIC, the root distribution directory -used for PyPI packaging -\item \textbf{README.md}: self-descriptive -\item \textbf{setup.py}: install file -\item \textbf{setup.cfg}: used by setup.py -\item \textbf{MANIFEST.in}: used by setup.py -\item \textbf{LICENSE}: GPLv3 License -\item \textbf{PyRIC.pdf}: this file -\item \textbf{TODO}: lists any outstanding TODOs, ideas for future revisions -\item \textbf{RFI}: comments and observations about netlinks, nl80211 etc -\item \textbf{examples}: examples directory -\begin{enumerate} -\item \textbf{pentest.py}: create wireless pentest environment -\item \textbf{device\_details.py}: display device information -\end{enumerate} -\item \textbf{tests}: test directory -\begin{enumerate} -\item \textbf{pyw.unittest.py}: pyw unittesting -\end{enumerate} -\item \textbf{pyric} package directory -\begin{enumerate} -\item \textbf{\_\_init\_\_.py}: Initialize pyric defines the EUNDEF error code -(PyRIC uses errno for all errorcodes adding EUNDEF) and the common exception -class, 'error' - all submodules use this class for any exceptions. -\item \textbf{pyw.py}: this is the interface, providing wireless interface -manipulation functions -\item \textbf{channels.py}: ISM and UNII frequencies and channels, with conversion -functions -\item \textbf{device.py}: device and chipset utility functions -\item \textbf{rfkill.py}: Python port of command line tool rfkill -\item \textbf{lib}: lib subpackage -\begin{enumerate} -\item \textbf{\_\_init\_\_.py}: initialize lib subpackage -\item \textbf{libnl.py}: netlink API -\item \textbf{libio.py}: ioctl API -\end{enumerate} -\item \textbf{net}: net subpackage -\begin{enumerate} -\item \textbf{\_\_init\_\_.py}: initialize net subpackage -\item \textbf{if\_h.py}: inet/ifreq definition -\item \textbf{sockios\_h.py}: socket-level I/O control call flags -\item \textbf{netlink\_h.py}: port of netlink.h -\item \textbf{genetlink\_h.py}: port of genetlink.h -\item \textbf{policy.py}: defines attribute datatypes -\item \textbf{wireless}: wireless subpackage -\begin{enumerate} -\item \textbf{\_\_init\_\_.py}: initialize lib subpackage -\item \textbf{nl80211\_h.py}: port of nl80211 (commands \& attributes) -\item \textbf{nl80211\_c.py}: nl80211 attribute datatypes/policies -\end{enumerate} -\end{enumerate} -\item \textbf{docs}: docs subpackage -\item \textbf{\_\_init\_\_.py}: initialize docs subpackage -\item \textbf{nlhelp.py}: functions to search display nl80211 constants -\item \textbf{commands.help}: nl80211 commands help data (json) -\item \textbf{attributes.help}: nl80211 attributes help data (json) -\item \textbf{res}:resource subpackage -\begin{enumerate} -\item \textbf{PyRIC.tex}: LaTeX for user guide -\item \textbf{PyRIC.bib}: bibliography for user guide -\end{enumerate} -\end{enumerate} -\end{enumerate} - -\section{API: pyw.py}\label{sec:pywapi} - -\subsection{Constants} -\begin{itemize} -\item \textbf{\_FAM80211ID\_}: Global netlink family id of nl80211. Do not touch -\item \textbf{IFTYPES}: redefined (from nl80211\_h.py) interface modes -\item \textbf{MNTRFLAGS}: redefined (from nl80211\_h.py) monitor mode flags -\item \textbf{IPADDR}: Regular Expression for ip4 address validation -\item \textbf{MACADDR}: Regular Expression for mac address validation -\end{itemize} - -\subsection{Objects/Classes} -\textbf{Card} A wrapper around a tuple -\texttt{t = (physical index,device name,interface index)} -which exposes the following properties through '.': -\begin{itemize} -\item \textbf{phy}: physical index -\item \textbf{dev}: device name -\item \textbf{idx}: interface index (ifindex) -\end{itemize} -Because the underlying Netlink calls will sometimes require the physical index, -sometimes the device name, and sometimes the ifindex, pyw functions accept a Card, -object. This allows callers to use pyw functions without having to remember which -identifier the function requires. However, in some cases the function requires -a dev or accepts both. See the next section on functions.\\ - -While callers could create their own Cards, it is recommend to use one of the -following -\begin{itemize} -\item \textbf{pyw.getcard} returns a Card object from a given dev -\item \textbf{pyw.devinfo} returns the dict info where info['card'] is the Card -object. This function will take either a card or a dev -\item \textbf{pyw.devadd} returns a new Card object -\item \textbf{pyw.ifaces} returns a list of tuples t = (Card,mode) sharing the -same phy as a given device to do so. It is also recommended to periodically -validate the Card. On some cheaper usb wireless nics, there are periodic -disconnects which results in a new phy and ifindex. -\end{itemize} - -\subsection{Functions} -\begin{itemize} -\item interfaces(): (ifconfig), type: filesystem, returns list of all network dev -\item isinterface(dev): (ifconfig ) type: filesystem, check dev is an interface -\item winterfaces([iosock]): (iwconfig), type: ioctl, list wireless interfaces -\item iswireless(dev,[iosock]): (iwconfig ), type: ioctl, check dev is a -wireless interface -\item regget([nlsock]: (iw reg get), type: netlink, get regulatory domain -\item regset(rd,[nlsock]): (iw reg set ), type: netlink, set regulatory domain -to rd -\item getcard(dev,[nlsock]) (N/A), type: hybrid netlink and ioctl: get a Card -object for dev -\item validcard(card,[nlsock]): (N/A), type: (hyrbrid netlink and ioctl), verify -card is still valid -\item macget(card,[iosock]): (ifconfig card.), type: ioctl get card's hw -address -\item macset(card,mac,[iosock]): (ifconfig card. hw ether ), type: -ioctl, set card's hw address to mac -\item up(card,[iosock]) (ifconfig card. up), type: ioctl, bring card up -\item down(card,[iosock]): (ifconfig card. down), type: ioctl, bring card -down -\item inetget(card,[iosock]): (ifconfig card.), type: ioctl, get ip4 address, -netmask and broadcast address of card -\item inetset(card,ipaddr,netmask,broadcast,[iosock]): (ifconfig card/ -netmask broadcast ), type: ioctl, set the interface addresses -of the card -\item ip4set(card,ipaddr,[iosock]): (ifconfig card. ), type: ioctl, -set the card's ip4 address -\item netmaskset(card,netmask,[iosock]): (ifconfig card. netmask ), -type: ioctl, set the card's netmask -\item broadcastset(card,broadcast,[iosock]): (ifconfig card. broadcast -), type: ioctl, set the card's broadcast address -\item devfreqs(card,[nlsock]): (iw phy card.phy info), type: netlink, get card's -supported frequencies -\item devchs(card,[nlsock]): (iw phy card.phy info), type: netlink, get card's -supported channels -\item devstds(card,[iosock]): (iwconfig card. | grep IEEE), type: ioctl, get -list of card's 802.11 supported standards -\item devmodes(card,[nlsock]): (iw phy card.phy info | grep interface), type: -netlink, get card's supported modes -\item devcmds(card,[nlsock]): (iw phy card.phy info | grep commands), type: -netlink, get card's supported commands -\item devinfo(card,[nlsock]): (iw dev card. info), type: netlink, get info -for dev -\item phyinfo(card,[nlsock]): (iw phy card. info), type: netlink, get info -for phy -\item ifaces(card,[nlsock]): (APX iw card.dev | grep phy\#), type: netlink, get all -cards (w/ modes) of interfaces sharing the same phy as card -\item txget(card,[iosock]): (iwconfig card. | grep Tx-Power card), type: -ioctl, get card's transmission power -\item chget(card,[nlsock]): (iw dev info | grep channelS), type: -netlink, get card's current channel (only works for cards in mode managed) -\item chset(card,ch,chw,[nlsock]): iw phy set channel ), -type: netlink, set card's current channel to ch with width chw -\item freqset(card,rf,chw,[nlsock]): iw phy set freq ), -type: netlink, set card's current frequency to rf with width chw -\item devmodes(card,[iosock]): (iw phy card.), type: netlink, get modes -supported by card -\item modeset(card,mode,[flags],[nlsock]): (iw dev card. set type -[flags]), type: netlink, set card's mode to mode with flags (if mode is monitor) -\item modeget(card[nlsock]): (iw dev card. info | grep mode), type: netlink, -get card's mode -\item devadd(card,vnic,mode,[flags],[nlsock]): (iw phy card. interface add - type flags ), type: netlink, creates a new virtual interface -on card's phy with dev vdev, in mode and using flags. Note: flags are only supported -in when creating a monitor mode -\item devdel(card,[nlsock]): (iw card. del), type: netlink, deletes dev -\begin{itemize} -\item \_hex2mac\_(v): returns a ':' separated mac address from byte stream v -\item \_hex2ip4\_(v): returns a '.' separated ip4 address from byte stream v -\item \_validip4\_(addr): determines if addr is a valid ip4 address -\item \_validmac\_(addr): determines if addr is a valid mac address -\item \_issetf\_(flags,flag): determines if flag is set in flags -\item \_setf\_(flags,flag): set flag in flags to on -\item \_unsetf\_(flags,flag): set flag in flags to off -\item \_familyid\_(nlsock): returns and sets the Netlink family id for nl80211, -only called once per module import -\item \_ifindex\_(dev,[iosock]): returns dev's ifindex -\item \_flagsget\_(dev,[iosock]): get's the dev's interface flags -\item \_flagsset\_(dev,flags,[iosock]): set's the dev's interface flags -\item \_getfreqs\_(band): returns a list of frequencies from the packed byte string -band -\item \_iostub\_(fct,*argv): ioctl stub function, calls fct with parameter list argv -and an allocated ioctl socket -\item \_nlstub\_(fct,*argv): netlink stub function, calls fct with parameter list -argv and an allocated netlink socket -\end{itemize} -\end{itemize} - -\section{API: channels.py}\label{sec:channels.api} -Channel, Frequency enumeration and conversions can be found in channels.py. - -\subsection{Constants} -\begin{enumerate} -\item \textbf{CHWIDTHS}: imported channel widths from nl80211\_h -\item \textbf{ISM\_24\_C2F}: Dict containing ISM channel (key) to frequency (value) -pairs -\item \textbf{ISM\_24\_F2C}: Dict containing ISM frequency (key) to channel (value) -pairs -\item \textbf{UNII\_5\_C2F}: Dict containing UNII 5Ghz channel (key) to frequency -(value) pairs -\item \textbf{UNII\_5\_F2C}: Dict containing UNII 5Ghz frequency (key) to channel -(value) pairs -\item \textbf{UNII\_4\_C2F}: Dict containing UNII upper 4Ghz channel (key) to -frequency (value) pairs -\item \textbf{UNII\_4\_F2C}: Dict containing UNII upper 4Ghz frequency (key) to -channel (value) pairs -\end{enumerate} - -\subsection{Functions} -\begin{enumerate} -\item channels(): returns a list of all channels -\item freqs(): returns a list of all frequencies -\item ch2rf(c): convert channel c to frequency -\item rf2ch(f): convert frequency f to channel -\end{enumerate} - -\section{API: device.py}\label{sec:deviceapi} -Retrieval of the driver and chipset of a given card is found in device.py. - -\subsection{Constants} -\begin{enumerate} -\item \textbf{dpath}: path to system device details -\item \textbf{drvpath}: path to device drivers -\end{enumerate} - -\subsection{Functions} -\begin{enumerate} -\item ifcard(dev): returns the device driver and chipset -\item ifdriver(dev): returns the device driver -\item ifchipset(driver): returns the chipset associated with driver -\end{enumerate} - -\section{API: rfkill.py}\label{sec:rfkillapi} -A port of the command line tool rfkill, rfkill.py writes and reads rfkill\_event -structures to /dev/rfkill using fcntl provding functionality to block and unblock -devices. - -\subsection{Constants} -\begin{enumerate} -\item \textbf{RFKILL\_TYPES}: list of strings corresponding to the types of devices -supported by rfkill -\end{enumerate} - -\subsection{Functions} -\begin{enumerate} -\item rfkill\_list(): corresponds to rkill list, returns a dict of dicts name -> -\{idx, type, soft, hard\}. If type is 'wireless', then name will be of the form -phy such that n is the physical index of the wireless card -\item rfkill\_block(idx): soft blocks the device at rfkill index idx -\item rfkill\_blockby(rtype): soft blocks all devices of type rtype -\item rfkill\_unblock(idx): turns off the soft block at rfkill index idx -\item rfkill\_unblockby(rtype): turns off the soft blocks of all devices of type -rtype -\item soft\_blocked{idx}: determines soft block state of device at rfkill index idx -\item hard\_blocked{idx}: determines hard block state of device at rfkill index idx -\item getidx(phy): returns the rfkill index of the device with physical index phy -\item getname(idx): returns the name of the device at rfkill index idx -\item gettype(idx): returns the type of the device at rfkill index idx -\end{enumerate} - -\section{API: libnl.py}\label{sec:libnlapi} -Providing libnl similar functionality, libnl.py provides the interface between -pyw and the underlying nl80211 core. It relates similarily to libnl by providing -functions handling netlink messages and sockets and where possible uses similarly -named functions as those libnl to ease any transitions from C to PyRIC. However, -several liberties have been taken as libnl.py handles only nl80211 generic netlink -messages. - -\subsection{Constants} -\begin{itemize} -\item \textbf{BUFSZ} default rx and tx buffer size -\end{itemize} - -\subsection{Classes/Objects} -The two classes in libnl.py, NLSocket and GENLMsg, discussed in the following -sections subclass Python's builtin dict. This has been done IOT to take advantage -of dict's already existing functions and primarily their mutability and Python's -'pass by name' i.e. modifications in a function will be reflected in the caller. -This makes the classes very similar to the use C pointers to structs in libnl. - -\subsubsection{NLSocket} -NLSocket is a wrapper around a netlink socket which exposes the following -properties through '.': -\begin{itemize} -\item \textbf{sock}: the actual socket -\item \textbf{fd}: the socket's file descriptor (deprecated) -\item \textbf{tx}: size of the send buffer -\item \textbf{rx}: size of the receive buffer -\item \textbf{pid}: port id -\item \textbf{grpm}: group mask -\item \textbf{seq}: sequence number -\item \textbf{timeout}: socket timeout -\end{itemize} -and has the following methods: -\begin{itemize} -\item incr(): increment sequence number -\item send(pkt): sends pkt returning bytes sent -\item recv(): returns received message (will block unless timeout is set) -\item close(): close the socket -\end{itemize} - -NLSockets are created with nl\_socket\_alloc and must be freed with nl\_socket\_free. -See Section \ref{sec:libnlfct}. - -\subsubsection{GENLMsg} -GENLMsg is a wrapper around a dict with the following key->value pairs: -\begin{itemize} -\item \textbf{len}: total message length including the header -\item \textbf{nltype}: netlink type -\item \textbf{flags}: message flags -\item \textbf{seq}: seq. \# -\item \textbf{pid}: port id -\item \textbf{cmd}: generic netlink command -\item \textbf{attrs}: list of message attributes. Each attribute is a tuple t = -(attribute,value,datatype) where: -\begin{itemize} -\item \textbf{attribute}: netlink attribute type i.e. CTRL\_ATTR\_FAMILY\_ID -\item \textbf{value}: the unpacked attribute value -\item \textbf{datatype}: datatype of the attribute as defined in nelink\_h i.e. -NLA\_U8 -\end{itemize} -\end{itemize} -NOTE: as discussed below, on sending, the seq. \# and port id are overridden with -values of the netlink socket.\\ - -GENLMsg exposes the following properties: -\begin{itemize} -\item \textbf{len}: length of the message (get only) -\item \textbf{vers}: returns 1 (default version) (get only) -\item \textbf{nltype}: message content i.e. generic or nl80211 (get or set) -\item \textbf{flags}: message flags (get or set) -\item \textbf{seq}: current sequence \# (get or set) -\item \textbf{pid}: port id (get or set) -\item \textbf{cmd}: netlink command (get or set) -\item \textbf{attrs}: attribute list (get only) -\item \textbf{numattrs}: number of attributes (get only) -\end{itemize} - -GENLMsg has the following methods: -\begin{itemize} -\item \_\_repr\_\_(): returns a string representation useful for debugging -\item tostream(): returns a packed netlink message - -There are two methods of creating a GENLMsg. Create a new message (to send) with -nlmsg\_new and create a message from a received packet with nlmsg\_fromstream. -These are discussed below. - -\subsection{Functions}\label{sec:libnlfct} -\begin{itemize} -\item \textbf{Netlink Socket Related} -\begin{itemize} -\item nl\_socket\_alloc(pid,grps,seq,rx,tx,timeout): creates a netlink socket -with port id = pid, group mask = grps, initial seq. \# = seq, send and receive -buffer size = tx and rx respectively and blocking timeout = timeout -\item nl\_socket\_free(sock): closes the socket -\item nl\_socket\_pid(sock): (deprecated for NLSocket.pid) returns the port id -\item nl\_socket\_grpmask(sock): (deprecated for NLSocket.grpmask) returns the -group mask -\item nl\_sendmsg(sock,msg,override=False): sends the netlink msg over socket. -NOTE: NLSockets will automatically set the port id and seq. \# regardless of -their value in the message. If override is True, the message's pid and seq. \# -will be used instead. -\item nl\_recvmsg(sock): returns a GENLMsg or blocks unless the socket's timeout -is set. Should only be called once per every nl\_sendmsg. -\end{itemize} -\item \textbf{Netlink Message Related} -\begin{itemize} -\item nlmsg\_new(nltype=None,cmd=None,pid=None,flags=None,attrs=None): creates a -new GENLMsg with zero or more attributes defined. -\item nlmsg\_fromstream(stream): parses the message in stream returning the -corresponding GENLMsg -\item nla\_parse(msg,l,mtype,stream,idx): parses the attributes in stream appending -them to the attribute list of message where msg = the GENLMsg, l = the total -length of the message, mtype = the message content (i.e. netlink type) stream is -the original byte stream and idx is the index of the start of the attribute list -\item nla\_parse\_nested(nested): returns the list of packed nested attributes -extracted from the stream nested. Callers must unpack and parse the returned -attributes themselves -\item nla\_put(msg,v,a,t): appends the attribute a, with value v and datatype t -to the msg's attribute list -\item nla\_put\_(msg,v,a): eight specialized functions that append -attribute a with the value v and type to msg's attribute list -\item nla\_putat(msg,i,v,a,d): puts attribute a, with value v and datatype d at -index i in msg's attribute list. -\item nla\_pop(msg,i): removes the attribute tuple at index i, returning the popped -tuple -\item nla\_find(msg,a,value=True): returns the first attribute a in msg's attribute -list. If value returns only the value otherwise returns the attribute tuple -\item nla\_get(msg,i,value=True): returns the attribute at index i. If value returns -only the value otherwise returns the attribute tuple -\item \_nla\_strip(v): (private) strips padding bytes from the end of v -\item \_attrpack(a,v,d): (private) packs the attribute tuple -\end{itemize} -\item \_maxbufsz\_(): (private) returns the maximum allowable socket buffer size -\end{itemize} -\end{itemize} - -\section{API: libio.py}\label{sec:libioapi} -A very basic interface to ioctl, libio provides socket creation, deletion and -transfer. - -\subsection{Functions} -\begin{enumerate} -\item io\_socket\_alloc(): returns an ioctl socket -\item io\_socket\_free(iosock): closes the ioctl socket iosock -\item io\_transfer\_(iosock,flag,ifreq): sends the ifreq structure with sockios -control call flag to the kernel and returns the received ifreq structure -\end{enumerate} - -\section{Copyright and License}\label{sec:copy} -PYRIC: Python Radio Interface Controller v0.1.0\\ - -Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com)\\ - -This program is free software: you can redistribute it and/or modify it under -the terms of the GNU General Public License\cite{gplv3} as published by the Free -Software Foundation, either version 3 of the License, or (at your option) any -later version.\\ - -Redistribution and use in source and binary forms, with or without modifications, -are permitted provided that the following conditions are met: -\begin{itemize} -\item Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. -\item Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. -\item Neither the name of the orginal author Dale V. Patterson nor the names of -any contributors may be used to endorse or promote products derived from this -software without specific prior written permission. -\end{itemize} - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\ - -PyRIC is free software but use, duplication or disclosure by the United States -Government is subject to the restrictions set forth in DFARS 252.227-7014.\\ - -Use of this software is governed by all applicable federal, state and local -laws of the United States and subject to the laws of the country where you reside. -The copyright owner and contributors will be not be held liable for use of this -software in furtherance of or with intent to commit any fraudulent or other illegal -activities, or otherwise in violation of any applicable law, regulation or legal -agreement.\\ - -See http://www.gnu.org/licenses/licenses.html for a copy of the GNU General Public -License. -\end{appendices} - -\bibliographystyle{acm} -\bibliography{PyRIC} -%\addcontentsline{toc}{chapter}{Bibliography} - -\end{document} diff --git a/Help/nlsend.png b/Help/nlsend.png deleted file mode 100644 index c31e5b6a4098319276f1d39192176ac0d0681c72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90242 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 ND9NkK)ykNM{|`yXupe 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≪sab); zV#ZWq;mD_(xE@}g7@dTz{0a-2h7b}EKup^ad~x>9TbeGkBqS#g;Cqdodkc`1GDr$E zTx3k$FhYWZiAZ{YNn4Hoa=*IJlUOSrFORGIbnpg}LIQ;r>GDE4Ke`g1!4qiZ`8Nv< z@5!?bvw5z4OF9i4%d)K(G1={y3U4C3!_ff*1faDRaXn)Xxn3z$|Mfd$6`JyWOrJ87 zz2TkcS}O$Q-6W4Bfv{0tUQWr?ovc5gqDh--ke^LfW-c-PpC+j!gELtLgwzYBI3tsz zKf6fL9pvY$<=A!6gu)*V)$(reJY5{GlAO|!5wCy5{yZ0=@ET?60DP;gbah^PiVS+Lg(>IO{iFSGnZ3nM0XB1i#9E($JuMd$EPf_#06@4J9Q z2al4kk0Hiebzj%4HUAWs3(hm4O%gFFZJ6-ML5go}2S&Fdt#k`N-njeo=ih2eL~sZp zp`nC^1mhQ+!q8b?Q*!6dA@|@4T6%lX;=P-6?DYt#?o=^1{)=#1X(^Qo4jwti#P`49 ze4&8s-CPRkNQZCdoeTAiyu9^!ajDZVjvsT&KRp<1jrk|g0UXYpB&9i(xcO3n?cW2aBTGAsd7y+x*hQsN^_8X^CDLF+N!u-{@w@cJ2GkZRqPM7q0 z4BisQ{8i6WT`i&TsK(gi`Q+cc$>pt!=vDL1LPEF%+UR5wgM!H4x08IQ5*Y_p5_#w1 zb@H!YC-=-wUTf?5FL$JHxzNYfqNcAmc?W)?z^O#SiCxrS`ge=)U)+y*Xa1gNzbOMc z001BWNkl_Rk2}kI=w!)iq4=$a#oe)bmEc}DAhU?4$E(S50b!Q z@!^rl)96yLnpvApV!qoBlB_{pvY8kAw4ru#Cw4rzgoO{N$;&v$sZ%9rf&vM%W$^v6 zTs)GZF&+7l9TjaD^01Zf_FP64nuOmSidFeGV(yV54lR3vz%$Ev`k4uA$#kKTT~rZ+ zAsh}+XizDX2&e70TzkTaQ<1{7O|#G}c#L;1-hGQoR%(!c-v@V@_OdL4%lS(m%1RWH z3!zJA)zy6R3kt|Nu#V>&>ws%~y~9XCbTM1DU%(6?WP%fW@I%2h3W|%l`04Yc#~Q$H z#eSc6(S*y1rOe2H&1bm$etV9rS;>x5RUcZiHxZsjE*IVX`PgSxvG4F94jnwm!9#~R zet0WyJlz_vyVzP0^`GL$Qo*?iQEYtwefC{*x+SF>|9wi!>5_;KQ=!`aHe=>}#ub7v znDV%8mqB(?m|KcE&<`K20*kSjQtPdcR#%k^CYas}HZd%4Jrm{~#i{o}=i8W33%_9F zh7D}kxS93yy5WfnfxzW*A^qlbI}bv99Na9i-4@wan}LT$F5u9a(;V5hgg!M4w*{HC z?B2w_LlHuYI$@ZKPI4m4j3h~bz<#f!=#q@;PT2rz1(KvfBUkpKz=cB@#)I{ODZYM+ z(^t$$!j3YwBRyITW!6ifEFbn7CvGX~(z9&+`g<~p&38TVS8|vrHd@g})}`Ciuk*=_ znjGGE4sCP{n@n? z>I1a;_h$9aXUNXmOw--td3ARIH*$9K^XaQ>nm&omIT`Hw?j+@bNvIF3=U7xHnx%(v zY1;vasb0xM^1H^ktR)mxD2Zv(n<)z?(%i39A-likA$ zzn~y&*DqiM%Fkxu42>mFt3<+u{dW;MIqT=Ms-!VXzM6}E`E*vFx1v&1`e}btm58R) zmCy3y>7v{AcSU*CL^I{EXWLdzTq(YXKpYJUSw^MN0uuVj2BbvQBwh)G2H~T2Vk)m1 zXP1!zvw<+LyO);t#UuvyAHaYC0~j!%KYjWQXW_d2nC|G)GE!0X)exN!fn+S9xY&KB zmmB{*Q2w$zBq%m3a8-*TA!dE~A7)X^0ayW?ZteSIFO zArj8W&J67+W4Fpgq}8H#(o^huc^V5-CeynStY7*nc}bC|tVP&k2Qs=_Bwhi5csMip z{O$KBZ}%V%)s4eTr6;|81h0L65!$2z0;kPFSxGTP0=%VP6p__bj>YxY3d?D)puF6H zPf7#ARR-+m^ROYXm*?>1!a0}&WE`@A*t(tQ)+`)cHY&_k9Jg}Bgp=}u3v8UX2m)0UIkw`*MLYyy7M+L^>V&u*fncuxBkB*p6@`ef2 z`Mq%|9GJ_?C@w64_y>7yY6^{>7|!+jc|7pec0PFA51e1~aJ`l6clO37;}Dit>JS*3 zNkH~ClnJ4C-rCCB&b*~3@rm@qmUEl}eF90X2QuXN2tHXjhx}M4`+tgK=+b7S_-beo z`6i1dzRvzgDD&&W@W=|v%gV7JlQwWF9e;R|39}pU!T1OGJ?V!b`eBCm+`zlzrf@CI z1CuhDetl{p>_zNZwScz|`ynCY6IqA)jXDvrV-3^Z%EP>?fCu|FA;eIKx%d)m-(EnW zmjj0;h#DbIHh+4F#{C|nMq)AxMtn?*=N3_WQ5Z#+5AngQB^+0pu<8=&@@Q+uj%mn< zWwV%hx;i?S9Ya!o2Db~rmH91G$E=|7v{lrM^yO}3Ar%+*vUS%6e!6^)3rpWZ(X20z zx9UlUu<^`%^BtnD?ZFY&fSR#Y>D$+KaY)^g7eep445;?xd;IX^U4H!a%o8q(Pk+kX z^@RikNM!HdhhOp|#7DR(d)@f&fnw^UNmFezW}r|ix#k~0PWNH->+}GzzJa7Silsa& z7o$r@YLDj_)X)!wUo~pR_)<}jPpMfZC^3zc2ygU0A;i|ML-purV#B?W)G>7I(Hvh> z0R^QdZ1_+ky*>%S8Z_Si1P6Igaia)1B#wlL0JIA5jnVMkYwL*_{4f!+gj(lKWPBnC z(ZSs2z?Ee5zF{QRt4GYAt|bYj&WG@rWRj~#5f&OlY@NC^X^==ns6Q&Z8LQ2X!zJS# znn-etHLzl}NG@y_Yv?rva=|z3dtt$O>RV; z2!BFil1Pe;BI4G&8YL55y%r5>hoe>dQ6sH7TAPyUwPVRx^D!qQ+Vf<$W&~>Qk|U>3 z;3&REZhkQqn~TuqLm1sJ1wWri5~B57&&@BkfAjqBi3Qch5vG{UsMQ1%ey=fZZI-v9*tF}sX=vaq9gAz#+l;mb{t=NJh zpe7IZ=}nWkP*UpGL{X4Ofk{d2zArMgp&znm7|AKsaNWq^dKm;KrjeEqMM$+&8q^L$ zs}CR{DH<(WswGBa_+7V23J>BM)yKc=GTApBctylhD=C)HU_Z1j3pTq0yTggX5Jig) ztw;`*xOVvlzRmhEtb2XDbsD^Vyiq#L*z9)fLXD^1pX!ZU(xG`h{IwF^baA$iSVjP)B35TB>Pct;WE~sy7cPTgZkAxkb&c~NAqKo>Act^@NUcC zPuIxr|8-eQ$;rs3uv`$3+Lk9D>qMfz$}K6~_#cDwtFLe!I|fQ+mDi&xxfrDq?cl*E zmn``ote%B~OD1!u(Q6E=qq&bx0scDl>3;DE-V+I;lk2BWQ0Nmye1t#$8Ika>voqdP z2{{XBHA-gDlEEYeYuziZYMZe5@&&Hi^~A(Sp}${Yc;XW8y}X{96UNfa9W3F-|EI7H z8G>Ww%E~Ch-)s*8PKN{K|7i8Jq(3=<>W;rt3kw;Ce&)c5EUeNmpWd=kPxY2PX%?xx zH(7nZ2ypMI7zM#8bqM~C_H9+gT-VsTdNa8W>2_6x(}h01F>Mv2*SGA$I+A3X`n-Rh^VXwCGKn>i><3QpPtX@!!D57)FnmpT*Cuu-y1RgkNZ! zluDF?2BCTHz5iuR5IAf$Y<9=*6pw^bqeJax8vlcpXQ{AOu~pnMG6k|yjYh5d*U!Lm z*)Ul^r&Ir%&eIY&9d>M1JK}dA8Va=zjnbV>NT@YT3BMEUvR9~wu;aVxpt zgz}%~(z#YOLIVRyePkgQ?0~C`W9z2SIxz$vPk+*ef60~YkKtQ$2HAkK4L{=Vc(K|3@t95RQkp4+dF6k~J7S!s-6jCi3nz4FC%V=Jus#Z~#GJ zk)-#U$W9ZuE^K6EyJSLryohc+k-dfXyUwAE&&JUrK8%piU}Dqzu=>(XwoR>prdB^T z-2~20BBk})9Q&#-T1ib{L^!eay7A`bJP>D@*}pb=l?S1rfrQlT%94{NZfxm8wfeKU z32@;f`u7;j#|LuwymuTLohSbO{`d!m(d5Z>nEvMMx;(opkr5Fz9krbbpdx2I-K%+H z@bDxsp&f60bphc#&-^Ev6YlGcw{IkEU);b=+fBC4YK@=P6Tbj|bdrSBW(8L*g5pC9 z>5}M=&Lf0I{bq6+xVB{$o$JO?Ei#zMx`SAoV+Ua&W6Mh<`GxV&&_(3^!xduA-@~XR zEw%fsq!@rpyz$6j-rIi#$9>B!b8+d5;nWTZCL*y3&%bvNvs=!(abGuE%w}N(VN$6? z!6T1|Ggk}5^^ywV6ha6~p~${?UYt93UR=6TD6B50uoy3k&tK>#dX0Wd{BY{B$Sbu9 zmk`2Mc2#7YJ1fqezbJC@ON3nrA*>}LH}j%6clNBfm|I+VO$gyI7mF(y=fv5w=SAkV zG9g5%SpGnw7_!?ags_N$tV`lrnL`MtS=`LMB+i{VBhF_P2(wcN;Vctb=QBi3PL{~b z%o5j%Dul~fAxewSiaE_|ik>TWi;PQ`MZU>d`7&#!_+a`NG3A|~gjon7oJMh@tg0fW z17c)Kq!|9QxObFn6x|zl7w;S_s`~$|ID4}~oZmcIv}*C3I4Ok4UhCRXZQia6z^xJ@ttg z(6p79f2{J^yenp5+4GbLt@D<+T$Ur&z1&(fAM}wZ5mxcpgr~*Gx!(%wAKqvcKP~Po zI*mOj{x&YZE@FcEiXR=7|5^$&#r3kwV(IW+V$jUZ!X|{+Iv`5an0!RI?(}@&C!%#~ z5Ao53s#+DF73Z&A6WeCi6=+(BDW7Etap_f2ufqayY}2D6sO}1fx@(%~v!&>_ zb#S@im7_%4{u9NnOBcmY2QsVfIWAs^^%Re8wg0LV zhgkbWXE9>k8R4)V5zj=0iJ@C7Du1#Yg~M`6Ozhf0j9z_I2qDD&CxS)fi^p!gQ5;z} zM?5=hj>s1O0M0V;)9lWocDt^k`;+gB!m7*WO;3qNBi4!Q7N@u`Fn%Yx1=JJ^t_vY9 zt`|evcM^+Fx`Z2U{8Ly44;JN0r6@NTM7hBrZf_4Nl}e5rImC=-#?gD&3k+=^%h3;B zXWn-gu?T_CMACcgSZd_F%ks_pxTwlv{*{xY4Sk(g9`fY-X#;rWu#Qk~4-y~j&$yAD zxxV%-#;@FqS#nTntls&7aG2`P?xHK99nh$5rxaLSm$g-KNZ7Y~I|0n89 zT1p?~7N$*K%9(N*Q$+y%=PhGojcs(OF_f662N70w4O>(@#y(SL>UoIOhgdM%#S&t zsl${Q1E8b*6RC_@{5{7bkCGqIkwaxi}yydmQrr9MprWmuGpeW= zABPHPJ*X~M$L^zWdY#|WGTrJ!FBjPdc5v91K(&NK61=XHsgI^sj227w4$j3$C~g`4 zP77r~Sd9*JZ}KVMe|3&zwTUx7Z{b_-3miY9DedZmYqa} z*@}yQ7HCque<_O(G-LXZYb;;yxIHhm?Rpb1@na4Zccf#;oy)f7o?zeEt5n=J$7DPL ztCOA{S4k!ID>%+=;DBFGrdtp4!#Rn#8fr2QTzTmdfayT5Mr8nV|RVxTn zf}FpM=U>~)gRj2CgF!A%uAk1r0V65D4JPVDGo5h@boebK6DZ z@8^NCVka+uc%J4HK4#2=VH|rohKFYzq0^)iK3;i}E+72J@C2}$Y-m(wB!z?XYbNmI z54rT)u$jT}S9pKoRxIfg+5Sp<3Kq2_ec>LSTByd?JAr<47SLZDZYh6y@Kb%&4Sp%&!)tDB{3ZpRwse7LKsqr1<@f9`kF*i$hNF=9-U~ zx7&b6U>bd&9{{Fu(EC&hf4v79=Vi+6_Ip-Z`m|BJ((^^$pYbZ21A|Fv_c)J78?h@5 zXcd(zMd|H>qU;I)$dZ14h#bbeYaMa4KN=j^`id{MZE>>GhJ ziSxMg!IP4NtQ1_^^9`S0^+KWYqMmodzpb?Hv<+5KbcydiUB&lT)ifJWoq*eJRU3zv zPGDombG+ADdwVV(UbhQH?balQYjGXALP?p0FFrD3zIlUEWgJgU8BbzLIG-&4nRS^v z$gPNFNces5)t2pJ@%)o?n*R|=`dpt%idhepD3;4?AUsUB5M`x7D_^D zwk7!vO3PV#6^lnAB?ngV;SW)y_^YrQjc!Tn#{E}XvO+=5#p5g;Gmg4lhVg{qC|7-J z65%Z1%2n`fK88uvqX2=?Y{MqZlv^NB3&_ztK5IP7cdusF{&EaS-5AlXfHIG05_~Hi z=1HyNF}<2iafOu|B92B0mG9LU)PM~c6ImBcq!=WuR=`$_(E&lx5y(JDlj_)4=VKOr zsPxe!8Gs5cp58i23a$ZORM;FiD#{V~R7J)K>~=d2p+xg*86`#Y)Y~h0%66HhgSztS zr#<=XsgQg0XsJo=HJ*<;UgzxT6KtC|l##P*@lL82QdW6oE|b-aU130{RNixDl%$TJ z_lz}k$UDQqtsgUg?Q#O!`Jk5V*j$zLA5K#_E`1O_o>!s#CKkZ+7pE8^pgprcdxD)$ z4rcVn>3lH23!6TuxW&ZPwnHSHr8lZ}5Kr`Q?95{2B0&D7T`%egLWj0hE z23*Bq^cXpsalKO!dxjD9^fKDdQKOXQN=L0MRgxAXa99+izqo{zoq~Q{)W4YJAmbg? zf+?$7F#5+?JhAKxeri~cE=d|ruNcL|??QNK@mLaXd5z77*>KcGy>2Ol=s?zaqcoXm zKYbqU0AcoWFqE=cGkA~jhtIgZV52#O6MG>K0hcINw5C#wGMT3OO%p!%b zQDK+S-TsJl64-haZ_J#;pcavw`*Jxy*F4We~#2&FAo}QyqUp2qE%$cAu>Z zpQvyE4jfKBjYrO7(f9;D8$OEtwg^JBaQ$jFPT=Z~7f>gJqn9LXrKi}L2iT3|=ar%h z4gwUYoE4NfwZ9T{G9I3u=+zdAt0=97F`LV!w|;hFEH+|xRy~okfiXkIu<6{5yYjP>lea$mA$k7E5*3B6iIRw(Xy`_F#(HM;hg&Z)be1uB6tgQJ-i)PdD$*r^AN!ff2I z1QDgTaVh5t0EfOfj!(-5f3&gy$(+mS%wq5iBc*Xi9yx_WGGE)*C9DB6o3CnVj}&j=0qVEOTDQPboXdXrEdf^l2S-bNhLKkmDJQ^5~>B= zF)3b|(2?Z)jchZ5&Y91J3>#5t5pGHA#{IXnR4OIkeYcabr_y=kh1vwi)#lwv$9bVk zBjzd&8%xGJwOq)I4l-DPArR{R1 zF!$Boe_%v+mKgd>v=NAzc4t__t!!Y`!@lO}g1EwhLhCy$}lG9z~1 z*3A1j?asD zrTh*DB-(P%@YDVaG;5{#+qoacvn%O8WDWUF8Pwr)88egCp5M^-rP*vM4CCCvPmq+p zJUC$;^LjYhyzL+&s1>#1tE>*6F1$7VOGc!pGes>EklKsaMm&jb%Qaq}(S!Qa1r}F4 zZ!LZ3Ppz!$JHOzYOT&5p&y-f&15_SSW@f+nd$#1(plW+aA88_Zr7z4czGoZrnfol3c7(;dtZ`%qu>`O9H)G0geia zijCM^fULye<%@?#2B(#>QX>|-3ze52zFLX$;zG*p0!dP!^YF$?uL6gek`g0Urwdu_ zg`cm!@(6W%1*IiMtWHqsz3}zaU@I=d?%|J@TEby2q13Fx$48B&tdw$#15^h5{5(;W zuIGW2)l56}5vjHc6b5g+4eCnk%5I{l#DoJGt#@TvP|mKUbJ$!I!?1A!iNZ{AVHp;O z3nT?v4esv`QDon>Q)9yKY;4YP~1E-ugc%Md7qiT2zABA&_JxI!|xB^lBuBnd0IytWJSa z=Yzj@rRCtX{kji*@Y7i-G%E4;H=saZH{>gT!uu)c2g30DWk|fl6FTA~UC|ov-C8e0G4rHwt{=SC0 zSa=RhB_)(wDgy!(8V`JZ3^*%FF}n=-c&f0L6;WbS`X#D{ON(3WT#_L^p)-aBZBb%TDTs9+xMdjE9$Vx3<-rneyRtgKtusa1p2qZ~H;}wXnUSKws zW0N#^di=sRFKk8%i!0}=TJMFArxwXxK}l&jHirvT27LWIE6=OL!Qn6FvSPc;xFut% z&I~JLQNu=@n{$Lk&F?;Y(@%;OgO4! zhNsq@;qS&j$M2Ji|MxLsl&qt9@*3vmttI^)A8{2NW6OyW;?kOv5ODVeBwQ|pBq2-x zcUcvL(}|E3|0Xtz|FX6USEX-DmjBZCnEU=S^m=<6a;taQw%{TDqrB%XGZ(hJ!Xrb! zA?fi6%$+gdHU*f=>4bkeUalNAesYea_RWY7(7R72cEhc--1wt~asA=}Hh;UHGKK1w zFK(wqM4QLyp5*cWS#z(j@x2Y?ION+x)#Y&FncRx5%~SuBR4kVR001BWNkl1jjdF(8wnLN17W+w_(q_husY~+_;ZY^dG=xEXE`>czWu&Km4Q) zt{y%_Y4vn!`utNpDyXObJubCL{YnTB7u4v7xx}RN^MA- z$6vFa8*`3v=xjbVS%Y6x0!azs7_9jmKYW&gatDT}G#b?mL`GmO$>sEka}=0dctoX< z9#+Jmi+a)ZW8w)ZBC#v9DRJWhyOtA~4Bq7Nz>~;l#HENL> z6O8sA$=Pk!&#?c*6)I3*@Q)(7b^^Yx5;9JmBI|lNs*q$FrA6L3h`@T4qesqjv)q9Y zGQKf&s2A^tjKETq&8brtxoHx3#io(qyvPN0Etg9j6m{F zrFq?Ow9Xrx+<%lSM(_@)PVG9?F&M9M;?zZMmRpg%W2l=RkGJH+bmIbtPZr=A5l2#u z@P8BnFPvtw5AUPEP?NgJAt*6%=|nDGaj^vI@81DA&azAn9?YOzZVr(!WPDy#GXr-23@WCN>V~!Ow4>V|7cff7ld>WADu5XpdKU zHs#mbY&On*w~A#a^gQw62>dkpZ2x>Ud#;;sSWQ@zNsL(h1`qk)>wEI~X7QVRbf^HG zrw&Q-p|VD8aJ7J&QPQx6Sam+=heO*%OkViwmFOetFfbv3(4Ft|+VUT;=(SwGEaX)qC_boac*quk-my8(vx$>ITm_^-JW=zddUHZ(zC2z@jjPaP=3=)wa(8mCC8NJ28IR6C}6;2;I0}xWzqa)@sGxdUeHf zQ|F6Khq8o42qE%!izU-1h?mEW7c)QDB?_J8;@r-qVn~ZRqIRnu;)PdciVqK67fvBW z$%(aM#!D}Xu@k0?_ck67r9udC%FlJrfK=j|8ozy7iqGiJP) z^Ti=iCQ2%~2Y)gNA@aqy3*Qi*pEL~hIVnc?liW~5_m_OlJ@!G00l{|PZtEh0? zqJldjM%D}!!}t6RBCPAHMB4^^#HSakIOSZ0qQF=#j(s*vJka3{ktc*OZX6*R^qwWo z+&F#D+=IqlkBgA_S1Nh)gb;R{Rfxi`#Ul+L77GqkGR6HkJVGRlJ}7ebE)d;X^bwm1 zs(1^_g>dX2EJEwe6PGg9i&351i%~022q7xOr{kXyV-|0}!yCSAR`Sct%X_+EKjl=_w(E5C;ba zifWTi-R3Pkyl(bC=N`0Yie*oB5q(EKF1kOy{5JQXI6O%-?6FW}l-uw8+@JQ-9e%sI zLNp0#E4~pzh#NnO7khLNukR>#6X>~d-?#^Fe_IKci=dz&n%Ap=pNAHWxX7IGt0;+W zM5`7J@%Vr2on?Gg*Yfwj`$*h9fhZwL5(2?pf`;JkQe11av`A@bDHLguLJJgkcP;K3 zAcPP%Lfn(%`+0E!r7duwrT2gDeOP>WbF%l6*|Wyh%x}dk<%@Oc*m?QkB0+6EoNljZglC= zg)UvX(78)b#(%Mm>=(>Mop_pf`z9Fg{)mxZT*bP&8Cfxp-+2e`+S?Bg3IY@>1*BfJ z2=ldvxSv>k_$)5Pr93ba$xXUTX-NvUL)*|QbRWsuI<)QD0aqzNDF$V+oIQJ=w!_-d ztU(Qo3-@y{#)$CG2GXy-6U_@(5W4C*GyO_Ab<>Fchei=$1zHVAB_+t@WgHyQgdOzb zMAQ(1wXv+Y8;@n^NJjN)h{|{u)qcD|aik#@_O5daiRQ zYt)X2R!?h;bQIY;$STv}C2FnqwUw5kM?ZerTZNOSFK~L<2W&ssgIQfw2r@a+ zN&zbv8X-{?Q&v$1M&`dqBoGADIhi>2Z$s{>ZQP;(VTfq71_ZR~$>5mdwNY@Tq$T zo|YSm2pF2!yznMwouUM-p%uXML z4F9AWh&nV{5sB;-h!_Z%R}H3Pe}7u`7(qY(*0h;_iB>)Bkvz;s1sD_+p)|0;!qDLL z6@_MFhsdryK z`)oA#vYRns$~i7Cstr0Bb{>Azsb3q1*E_98tp%A(`ii;BaSUii-|F?~+%t*2OFv@I z?j&5zq^J~n{6$SpE^4bLFTP@4t3++tirGu2QM2F|`i$H~?A-2HSvf;~3dO+lr;^pX zN1}OeAGe(^Bi8>G2b8EpW2#oKL0D)#8kx7{>+lW4v@}L82$deSfK(<$5ClZ6fVFQe z8r1jr)48iwqXVhrnPKoIXQ*-$djjgW!`m>GOADfT5MM@MZ7F+(wc%%vc^v$>{%?S? zIp;WNMAnc_ewRFMO!G>O4>Je0C!^5jbxU_dGcZ;A-zmBwMSe5$kEyDTh)07Mx zg!$k2UKz(WbMROk_k34SQIJYT`EjP!cjcSW%`ipO7sr+6TC`uZgo&HGEB@*?qhi(2<>4j1DzgEC>mYVAAp#D8K5?`V1GU*%*_N zaGM<9+P3@HHuS?nBB0E>%FdfWb~?!^W!QPU19Hp_6l4`?p4+?vRyNj{o2banstkhV z-sW`m)>t#7SH*s56Dx=F*Y_NFD?s-qcc@~ z8)F>5pBq}ZfAl_bA8)GInjye%-p4DN`pHEOU4DX8Zh%aqqNJb+G`*bdzCnxjOl_HD`B?yAR>z=V! z9PWXILq9IR>fXxy>l`?riYPb2)JUKpEgu8#x&&G2cn}j!A!_#jd>@})jb5y@5D_IN z*x1=qt<`jv^o-%dY1i2G^)`w(+&C2( zSGkd@0(8XPjUlsKj-89Zg=rm_YxV_)ziZF)b?iyMULo7em7riRy`|{ajV8i%E~NwI zg`_7GW91isZFw588Bfpv_fEzmcdPQsLgu2KZ83EkM${{wsWR#mrA4Vch`P?!`GaZO zX)@DCH>>P7ji@4LYFBxA(VRoCMO?U-KvGf?Nl8hhBt7Kh`bkuIkrN%zi>75e+3--L z^l>Z?lB5JSe1|>wuKfc_%fLX+_VwFn@AtxoUn4wIo0kQ9_hU; zbu7yVgkWW9g?->~9(P{J4_);cZh3K!5#8(J=V0~nS^z_lM_b<~%*_r5J9~yj_ha+o z#&`txW^~I;`dFF}zRQGhBRf;o)DTmX0v0x~!^YYg3mbPjj9dHSa~^djTgQfCX=#gF z$9YJb4W(PFCVaJU5RYfK#nCR1HU2-aX`lnfKJAz~y%U$l`e0$^O5Y`C$=4cTVyyS< z%spE%adI$c=6=IHLEy-&{&-s3U~OTHL(3IpJ@rK7Mi?3VK8G&-W(pRKBk_M#vZJhw zvtP8v-r64LfQ}rt9>a`r4d^#!Fs`@0#NX0}PlQQq814HKCq=LDr2>e^37s?t|6gZt z(xDf#K5oj9q1CW7b7#=%s}!qsAP=B>(;_aV)}&hipp#=|l)|DBEpfE5#Al|2Ih!XD z{@W#uLnUg$}s-blr|c^7a*W-#ns(9 ziA$6Ja$c5r;)DL;r^n(%rB-~`-nIX(n~McNtx`Q#wD{s6xA3~L|9=XZyQ(;uN&n@V z{*fj;orfj;Htzg;o&0XO3bN9kP$3G>tyM&3W{abZIdaKg8%Ow?(|UTG8_<0W0k7GO zWoS$M*Y9A#rfRI1S|8)LF@@KCQl}#Q#x8cAN+Y00+h^xnqG-#oUHkv~ch}`(81X3| z*7JBvHCpf5yY_DoSO2}(gChLbL40Z{eEf);Hy%+gdG6p`6tJz?iUzL#V_>f8xSc< zKEbrU5wvd~LEkAqa5<&quf#Pd&A7^-D$E#0pgZ2a>iMT%Wg8gdn6q@ccycvj&vP2pOs&I z$(X*8L`HU}chAmr?$U+6BR*s6rSq&__%rt^p3lilV#&y!bne`P-rYOXYwRoz#l*6E z;TWcFJWrk|K8lZf&y2yUV1SEf%}M@;^obN?!0 zPqBL4R&HgzxO7^Pd7q8b1`ye>4;=;EW9>2^SOTQjH znX>veY5<**q%%ty)vYrFrvAvav~s<`$T`JVBm2{*-!SGLNYTHq%H-EI(;3vIGw;ni zLbg&@`JK1&exGji9W{+@Hwr+|a(~ZKCJr9MvP+q0#W!DSY5YZ&zu%iq?FX~&Rt9Q7 zERJHu2Lp&`A3@LeX0rcop`HgxVcne7L=`CCD!EIdH!-g{)^@wce|JvDA24W#G*Ul4@_w?e!JIwy>E>+$2l{W?!uCy31g_*Oa&`fon zg})pmq4Z64mWs5Sn>m>5N6#)zsPeXO%~B4r{Pc3KVUA-Eu$Vuj2Tt30Wr!#%pG(H{I0S`;V zKPyF5E)ULc;k&Q*5}gj@USRu?1Qee=1lnPJ*;D^O)#;QKkdaT)pnEj5=}zTq%W#5`8MH;sEi1DQ0u331|f2NSOQ^r%}*SX9%nu4f_W!{K6ltfHsP#psffB!Y7@}+n;?atu3DJ)xY zjZ)p4Yb~9`4Bz@;NYY}7Ny|e6h!r`g-8wMkvk&Q7J)d>o&gE1NfE$6Toy^=G|K`Xt zFO7#qGk^4aR9)YvUx11|OBZpz;GMGilhQIYFksiVjX2io%EDuDXatB^IGnakBbc!0 z0(xhrgtMFG(!X^CL;AEJsL^N+Bo+f&?)}&YUsoR*^_szj5)+Io;olX%r2eX$8~Ya1Bl1)B?%lvQpN!|zO|hs{$*kyK7at!# z0_#OEdrurCcYb1czt+_94yEUmA+)UFL)WDV=!#=mJ)ky?dQRu?oou~GklW(z7mBZg z3DTz;rRWwv%>0la_9f^o$c$w)Z}J6kFI#KDA$AtEW5yI0j<1cXwC*IBI(kwkJdCgg zO=wc5`X6rPeM%=S2JVgVEr{WEToUD?90R!okYH?8g$6A{snf7A4Qu)0I zRRvQUAL=)3K%Lq_I2nROCi_G2sVUyI>d>Hu1Lh7jXz1gKt+5uFM^pTBqPUTeM!9H! zfq?`;BFBJY&aC~MHIIUrHfKDc_OD-bEojcuC#W&~2lSv*#|{jhwU2xR@_${!r1lNz zGG!x)#d?h@YKl4Ybp+Mif(W0qf@p;ihDI-rfScHR)3i@NngmwWg9Hme@-{Xkg)wP( zb6T|TNSJdvCpVuUy3~Z44cgE+tSv*s73|({54C|5RfPdH8U)igz!{mQm~xXE^cc{a zh*phh+F>ve)(<%sUHnF@T@kg3VNC<5Ub6!uI@hG*s#HKp?62R_z12`A4sJteXeX9m zN+JKsVj^n=;OFa4`;YfhjE1W_moRO{M)C!L!X0CX{OTO##V6_R*MR;5y3?UUC&tV_ zMj-+u>|;t~eS!jg@vAqQGcTKJ!4Wpbcra{02O6~KO|Sa7>{)e=sJI6R9_{JfJe&!= ztT?mh0r@do*pk+ONrRfwwqt92Oj5bDXCDV+L>h&6pk>3ZOz5Iy>&jbX#vkRD*oM)a znlhw&0J#t1Nxrm&^$)!nF{m94TJ@rPoox25KFh5~k1+IZPtRuIOzdsJsU6W2Jlw+e zj7Cfz(3JKOt?-Z~aPdMeMz+q>u2&URemT0oAQa6#LTJ^iCt+R=`UDjbB=$`iF}e?} z8aJn7%O*ILKO#0$3kZY_YfHv2+jyiB|AKw+=RYbRZDV&<6DIX-LZ`^4*sJ2Was8dv z`jgU9snm4p*_)dS8**~v7A_?z@PB_b`u%M(;*o#!;rju)5hbbFRv%XO@3l65B zNL$`jJVc#MEi%O{{2x=0}E}@>0K!Xh;1N-;D|4o72 z1(A}}G*sr+l?y0h>)g%AhyKXL+tFOx^&vhoklEE>^iLOvi;w5<5EHiVK1^Kxi`dwN zu+EcNzhn$8x=&#FwxevC9EzdLmUdqr=E0+fTv#@U(zDCiekGMcrva>9P>ZYQ{aC*L z6N=YwAl<^3;VafMCBg$$am912_y;r&OCS8r;nCfTWB?DBuctgBg8a|Iu(Ghm*47qV z8!Jq#LYTJW4jI25Coix*&3g33_}DsP0J$8VoZPGEqW}OP07*naRNYE@rJf+$v6jk;Iv zH=QUViaPzXq86pZlU|)n`SoHPxh0kTi5gPQeZhdwuMjwF5_PQK*z6=LE&+!L>p8G~ zJ`J*$GHXX3HZ6zo{hH6HWh+CY)vvwy{xUw*AeMn^8kk3S^!!D9?P zdoyEb5p4tktD*Y|h#W>sPb1`Vz40KX?`B;>2!q4lfVnmInE%~gtcR@P&b9Bbi-{qv zRR1MZ1u4X27Sr_0W8A*Jo3XW0nf%@^>MlRc-P?y~fA@VxY{@{-l~Gt&iVo0~=aXHe zM5j}bm6(d#N8333^QU+wuH?tl=^R?Q17(LV`Sn&Tw+~FChP;duHFvwIg(vj3d+)-ke7O!T&rp%EoeqaukGM! zPQimaWSh8Pa()a|LOpcTq+DCfib-7=xBfmFQAvKnO|orkAlc9es~X>; z33Q}5`aU@tEwbbtM06a@!2%VfX_@4vMUiXaN$mXQ)E=-KoQ)~Y%+u4-%pU2JIC8Xa z9+Vd(0DnNmkr-fXC;_pQ*oW82Gz_MZU!|ew-kO^ECphz1`_d!Gj8y~htzuuvgSJ@N zx)DBNIhijo-&Bw9l4s_^t*=|sWXvJ3GoUy-|DCq_^O=^2AR17$K?v3rxje}!L@cw?1e1_A}MuxLjU7CkjqSF8PRB(Q%l#T1Q6J78IF1#j@@7nv(;d>Y`sqRxvK%EBmTwOYoPrh8j@pL1s6EL^M&Cj0fTMzUWv|NVdxdZy*nB(O552A^Q0e*p@ zgt$nt?({Wh9zG!_CtFY3?8n?XGy|^}8M*=>O7R=9nFBxd$GV~vg;gUy`KTwQ8;9WS z+n4AX)v=UGD0uiYGd8<%Tq}~brX#m^{KT=?%5#m9>wMDnYuuLXrmxK#tTppK@nRKf z`}$yN5I~|e0s2W?Gk#`c0pR1Fd;~cs6B2AI~H}vQlZc*P-O)s&A#C9 zo|%N0$q)qrL=lNiAj9UaW7d#57^&5WfKIK#sn=T0>=;KCjq10t{QIzU-S>12ang?k z2vQU3PT0cM`CYK6918%yiA=IzL6B!t=EwZCz}=sulBgl``c9Uujiv49GYEMW`i zqKMd>m!E4@8NQwesZT0-Fq^#WB#!@p^!UG)h#^P> zP^r-h5+qW6O14BI(W56kml*IHvY-CLN({`9YnAAoWi4u*2!aS0VPyiP73yaUpwp@< zFXJ8CurET{Pr{M@*TZ~%X=5lwc2Cm zG!EwDn`I=QoXfiGfn2(ClN+lhQpZV(?hRtxi@MFNqbnI0WPnnwtK67U z1SAN81VO9>#+B-^?j#b)bA%NT^!G15YldO136d0YcJT*X2pB*|4`Xi6ZjPI)2VP!Y zczL?x;@N_Ezbs)_Mj5xh>PP+h12|fq#nJ6CXbq&G)1rBuvtLn-%DfR{>t(RzVhRfF zZy{E#=5=#Ho+7gUzDXqlf*{rNhVXQ(CQPWG!iICHdVp0yif!l!W{e$9bE_NtxbzH9 zQ*U%d@!Y(fNa?>wL_t$Vegz=tP?l97$_@1Nl~h7hRT>Hs15@N$RiziGLuX(}{=u2F zujP%WrUg4wJw=8~8^R=D9as%ZO+Jqw7b2EN^IgC9h#Pf+HIY`&na}woK8zuw;1wY& znE^6UgSyglEG^gkCO8EtG6R#}(tTw{$ke5jYXuN=C`yz_O$?DDK0D7+E7WLpmFaZq zQVPlev?wbSsI?Njd(7kX{uK-iDPTeK5GG&Ac+I9GYfhi*7}M6mXeA=YIHq)Dm~ z>Tk^B=zMH~1931hLs?ou6&pj8DY+QAxnS#B6T7^7C#?HPPMg_@8j4iNMm7+E@!`3?t=i*q>B;M5YHzFgZ0Gps1I2svIQL4h# z&X9_vT#VhT=*P;xN1l;0)$Mf@=8IUn*y-t$@Doe2-s678IX?2QWL`}fnTZcbcwF=v zN&l{{%;CPLRMBPm)D&_SGOWh-6Dzq4y*<)*1%>DQ~JluPpn2gqX3-6^yy%v>5i}=)v zGqlImK_vdcUGASf%Gs!VIy;%5(dZC$8dPd6h&t3t73JlHJiK;|*u-SYR5!R7ZAWNz zC(I0_IMsCL$>H5xbMV92I|x@ZZ~8Tp&}MKfwKvwnS|Y=7)_F2!{lPvy{So!8d$a$* z$M~BAx5wkv=NIlrHU*9PH8!3Ojar4GOoHFY2+FFjq0B~)msehx!L?JDu`nt_A+^Id z&<|HzBM{ZU_eMnxg&FZ&Idu`aSp^Dgsaem1+`G}-zx9No%$uCPSA!r69imo^qFjRi z=txScZJ@+iji^(jD6arRfBFoF;Pl+3tZ(GcxW-q%Q-Un z>laug1*FEF;Z8ydsk*D2x>AG4dOaCbeFHzNJW9U#ZEogx(xbf-MGtRsJGB5^*>%3# zXV2(8HLxygj%Us`R-N>~?fyjyjXdyoEnr3e4lI;TV1s`ur_ZEe=Tny;7emDOU5x3q zl-e^lF{@{d7bl`P)uy4-A+Da;kGtHSU6(V_233AZod%WqIVI-afsS_L*|_I8s%qsN zIwa6)S{Rb%DW@D~o?RPB-xa@d^({bm@dPVLv~fIEatLp8fkx=({2mXBP#vrC;*n_Ashkcz}IC zH#{4(U~s@jR;}HKfnO%OZ#mIzQ!{GayT$&^huLyOBz}7-;o}0a@vBa6w;nA1`8biP zv!v*%Go)eVZLS6Bs9l<4rxkg6pe*LxWYL(R#MWER=Gkpuis`5+&L%bPEDzGt(cC!4 zDMve6R*PkNw?3R}v4)>bu5sq74L<(^9fc!OU5thH{$z~O^v=2gVO zH5>UgMv0@N$m66`%8dP~;bw@TRaF85+>n;#QfL`Wv--_w?3%>RJvS*(2~-VhK>b>^ z@UW6#R!!jGx2N#v9*&2RK-uFP>|D2vqvxY2bZ*7_6Z;b4Xb33yb?yREdVbHxO&tG) z_n_fP^dXMM`ZBny4+1)#+&IM6Jx923{wBKc&-to{4>tDIFibnf(QBC)IoabL+Kgr) z9$3EYdR|pA`I4&CuHl81u>`qO7+%H4*>f=!rC@+(gGPjTyJF>BjSzQJO117Zt8Ytj zo)jLdi$GF_}~;9H*Dn4O$9AJUCiV<*2o=d5@Z?Ap3MijSMEah zG2`gqp30G1<=BX6T)TLMn^CbST$|I-)0p%NM>(7AKxDt3_}RWB6f0N}5@<*I%?n(P zDZ()SE_n?nFtnyAYDFn(12^i_cCXB8wWDbRE3WO{$NAd{SazJwtgc?z+E}8_dBC{~ z2^f1;#VxosZT#}txFUw&8s%KNk%e#MM8>psC+GGNw(UN^nKRc>HJ{3ty?rrxp-pE* ztrpct+P|ISH=htVavqcGS!3zufsHbrgWHayY%-P^{pw(0U`O4?4&2zdiK_+HM2z`} zj-Fhjgq~iB*!kn?)DA z7}+NXfBLaZ zyt-z!cs}o6jHx;()-h=#p8v0gf7FQSH_nPDFWeCe{zZSeH;;+ymVGZSTRKO4uhUR* zW3u}1-6SlEqFA};9o3zT-=6kWu^RLPdQEQKv7G zQmlNoE>RSbTUDV(?J(TU|BGw(b(x&n8%I!=ra1h6fR9(2aFdI76DU&ZFsasr_I0Wt z{o9)*gOmFbsoAXwcK`c!IZy6g=31hH>P?#9Z)5lm^JfVuX)0V?ZIDaeVPpIw67vr* zPXEQ&gMX!ID9p~KOr`mK(wN)`OB*}P~XVrzt7&!osYOlNyJh6V;0NDS~9 z@gq?;meSb6mTo%|5rOnw5d=rBW#3PO7&zksq99OyW;*rik6>To+u%O|;${<6XFiYr z^e2JGEBg^X`#5>Z7nfcA0C9Og9G)(?IDhtVwpsp{ZJ zgNb|f7_G`&PJiDIUn>jTnvZ8+bP-U%=25NjuU407=Su%FYdxIa1P2d)+D*TX2q>OJ zv8b~bhJqPA=IkO10hG7+vP&>Fre;_=)?mbsH&G)%#eG&y>wuLskVV(hp8-Y`ChTTh zw^=-Vn+hxU3UdcF!rjJ-zyT{ss?hy2N=vKNp#+p_jlM8cr$MPupin4Ksx+1LB?{tC z?PlkRYdk5_ps7Tp6tyZ8mCvfwm32!xEh?n~g`xt*b0IlVr$MDqP*I^ksTKhdty+af zr&o$|U} z%0bkse@8=osepd{3WWlNQq9Xt$3#RR_s~L4_$?(m<~AEgdLW8g)XJyt>**qDRVb9d z(LnKZy`m1SQ4_xWb~LqI%n$$*zi}MAc!&=I)D%Ch^%6BGRnN^ur$(vNyc`ijeTPkF zZE5Oxhpjg&-S}cP{!>xti>QA24PA1M&+BiQm#3=jNLzEzRcqs+oitlu)kH{%(Fojvd&Sna=hv!s$Hy z3XfKeA;eCNh?1iV50jy(T$fslR;xyfgp!AA=rjER0~dZlgqQgnSiSmsCzVQxQmJ}Y zTP12Ws2m5eepUb9&W}VL8kG_?pi(JOX>>3B-p0NiSa5J3gZ-QlDoZblQ;+e@`~*Hr zDB{4EA{eIL}MTltBYE(*n>C4kSDr!|ID)i5)HM+_@ zt45=%q>)C6QX?XYdinB{hEHV)y65(cQvLFMSaF_@hVG&Jr92+49Yor?ne0l>X4TZC zl=S+Ur0o0jxiX5O`|>G{Kg9RzN|={k%z@4-ep$bl)Up_+_FRU~+J|JsY{6^CP-fgH z=GxYEoYO_{Ye6nw=~gjeYaH6rvwZyCL3&@!BYI^o;@5q}{>&$=cz+4XLF-A)j-va8 z_ZW7dfWn6dShh{YqQ}MTZCl7s>vj=WY)!wFC%HV=n2k$s|7C%#E-A-<`XP>fSqA}- zn!D2Ni`6XnWGIfBGQA>FLeRKvq?eVFb!`sHr30CD3ox$1h_6>Np|vlDI?XdpXyM$D zw*D7cxczORZWOV9$UQr&c&Iyd z-@k}bnauXjd(bd6gy7oYe6ap9d6kxV+@>XDcX+R|9!!pfg$2@zd@_^nkgTzzy0gif z+a00~oghIfkv|irkJb#QZq3@%YuJR&?|n}akbH6_L&ED)CoGh(@bT(Q0QbsIBb zV=BdW_V9Vn+61=vj4K(X&*r68YkrS_oxX++ttN3KUXO&5b$AedO}{6lG>6orWRjDU zNls28F*%bm9jNZC=bY1MCJk`n+U6VR3w1$}mq}7w8Y#)iJT82Rx2jPf2^dW8@=a`v ztw8b&;!B63IG3cvEYgybNXspIHb+%uZJb`mYI!MUzDk8gt3#)$baORIq=7@}UAm5q zv5IFHkP-=$+}q69srw0@_yr>yzFERUal$HUnz+(=U|%}4?ZO8uPLT&BuKI|c?P^o2 z`!D2HDx!jz!+abOO!a`qj9q<^9F>5&@G&XLPwARWQgSNU1?5LH?khNn#wLIb;+tND1mKz(6 zb3d;bXLm2eB9W%uJ&8FOLr(M#E}3d@Rus666#KQd>UD~dMFr~nHhre?;*nLG{1p0$W3iRE>K6!h0kn{3EDa}s(-8V=~eoX0$5QfU) zxtpWG$HSSDd?{`Ed2na@omYcKywM@g)59*6hF(1y;S*xP=u;Ama<(w!gKKnNy_wEc zbzJ-TJ!UQF#^q&e*rc4wPnvpsKB=4Dn$*Uyd(AyMuD{E7^-Mu3L!!LOxCIxfJ^K)Q z+qiLYlnVpq4&cH2`K(%Wf)>9#;#eq@7F1wnpah9X*5#iVvtc&@KV4#ay$TN8)MDRk z01K9lMLWA8k%to*S+fQa(|;k{KuYobBP`v%mfboJtm=KlftlB6{k|usZoEgoI-59p z+M1jbJ7x>a%b@*$_+DS+)NZ zs}*se?~G;i4$2_-+~=HJ6s8v;73Pdxw3X53hNP^X#I)UKsaplAbX>-nPIIX7X&d%! z5Lvk32%5p8`DU*XiQO+E7hZt|;yREqUR&99Gn01JwH#S`m4=_pC3(S6J~>*1p`jFX zY7~-S=4_vb#pV;(_WhW;b!C{X-A)`~7#azr>|4U5EBi6kX{kP83mb=2d%<8@lv+22 zPJGPdAFt52t$yWFiJJHeTY10VeJqsa*ma-B+7DV`Z~QmX21P9jod?4vr88mK6?(Rj zA_x+siZqVx-HTP@p)B)r<4rFL5Cl0^Rci3w#@%#F-^h?z2RL50E`3KWVqc^q!4VR@ zU{Pmr?$A~eeZMB@cy|sDtIae) zmxoy1-V;+pE#+C!Z2x8oKiyDZU?2gV8ntN)=8Q<7!n_p;>qqnbDL)$d8BvjuK#8#} zlG}^u@l7Z{kFY?MnL%Mm4jOF%JLXKLOrt?3x>KB)K&fRY%A*sBT-Su}`dgv6n?kWY zNFJYL>bRQ>YNkV-mrGG@GLPr+YXATs07*naROO~EiCsIIm1n&P^)jR^BasqQJ0v&f z(S24Jt4CR)dYnN~NiG_74x49BL6lUW)i_eF)EiN9moS{t_OdU^gT?{g*uIq{DeX(5 zH5Ei3TFy!1o-Atm3J#YTU}^7-W#M^Z6r-?zK}ncakZ~V}0mg4rX$gp^wdQzMtALz{#RO0}Swp-6 zRo*q$&RI%=xeJyRDa0395>Teb$Wnq@W`VVx9WtFE#+rPd#62Lf)RS{-7I0Fbp+SRC z94%!)F*zj$*qT3|hhk3iQQvZA)VExiT$9m1bl~Q^CcIw4tcbE8kt1985TmL~509rQ z5iaze+M5|W=kvv7E9|^mFtC3eGJf5_&wKBJy(7Bh5-LpffW!uW4q@x9`f@c|Wf>~K zKva_(bC@6I?W4rO6~n|t^6V9;9R*BnC8z{zY;0|jYjcr{<$BMgr0k_3Dd8En8Pk1K zExulGiS&?SR;ER;BGMIG=aIZ0phhMY038~^kzlhVzS)(IY{W@+97&=$`w}NoL>jBX zf7Alzf7bWKm}<`(ZYm`<5g*X_r-keb0RstWw1xynPT}iqvv7Z#=hrF)wh=t|-g$;sSuK74w|hzNorENi5NfE>L5hF{1f(j62&hOA3nE2| z2m&Hidap|FRl1bW5=ejq5(to9ciQfIy&raH9-1DX^FHUC=e{mJz`nUxn>Dl6%zyra zTfPLh`rR4qrF%qgCX@t5R(@&;AgR&;x!RX^zWD~t)#dd6?h+R7x0pR!#gzFQStSc5 zqD>X9O0yHgwwW(4@)gJyRvkSq*=949ynIbch8a&`X;XcXgvsxaOL)`Oq`|ChdhxIDPRMn z3fw#@+PxjVemLlp$YKW)~6%Clpo-(n{S~IJ7Cw2YVn>X;7)1klUc%M;mC?_B8WmFTv{P zk6fRJs`>Z)HXsz)j%`S^jwt0SWUi5XJb65h7p8JFR)?&dKwJ^nkVwN27OjrJd)yEj zy8O?fHg0a4%A_@=^jkEJYLe#%%M@}oDw%;oJv>barAkMl-uQ?SHBFCn0q#`we2Pa( zra)>oBC9rp^;7EOxc5z@8tvbP`g^RNmIQ^&NN!FxS$TToK9%v5`Oxv(X-u0ojcMOc z;DZiT02>lv#$c18elR#8qw2>$^UH!SY3rwB+w7_QRu+h-F`YZ*Y~Q!f-a%6-02j48 z?vhmE%3Yi`qh0u|W)+RcZ)N2`15-bm&Mh2J%fM!{$906w267d~tMmCOwmC}|%x2E` zfz;AI;4+jv0>B76EtST%I+2mh`Fi3Mewa3sSz~)q#ZwJ9Q^D6lMwb4eyQ;Xj=waCs z4>uXP>BaV7wN+2jfgkx{@llGNv*-?fb@*b*PrMP3&!w1h_<=AJ*n1l5myDx#Ghfb5 z8_ufOoBVd{5+3cpW5G|;8B*W>&*gVmN=Q8YE3wXlSUP706W?iwm%N;fT}b``{UZl( z)S!^7&^kCh{MBA>)r#dYu!yA5$8^;F%Gj^wA?r7cnzCZj6EAZ1>^Wj$Vu(3+jrueZ%k6EUa>X~a9YeqAPhk8e=I_47gUS*) zr)M$thn?g-cbnTNExbdb5h%*1&>&DdIorqJph6~7*=d3t9nflBu=PR+n6wR5%I;( zK~;H$;go%qRI3z;G>0oU3VFbQEs;r|kU6% zIUkDzB*IK#{#{aRKyD5?Ax9;Z;ooH-jDuXV$#AyiazEWnK$A8^ zm{Pc$CCA4B&h1PgsC6`ceo?5>&XWTa-@K2_%Nq|@`{7-GWd%olC$s0r#|&213Fc0n z%c;~t{u*4t8Ar7em0F8)`BL25GnL7ki|Ms!CA~r(sm5o4>x{+{N^LIqIz7u_VIn8# zNnLOzCV`x?r=ZQ80}0Xy?qw9qBigA3x>%QYjg?qxtsdI=K22((RpKW)1GfF%Jz+wR$sdNL>uY2Gp)DRBQJ= z{m#G3h_5{8;AO>VuqVvg48`b5^eDqR^SaAQhKwo1JNG=NbL4a~lu=?cVzube6`QaL z6UD_=LK^qy_1&ZB-t7qPawF0z?=oRX2ZCMI)bA3>m|a()Lw&Ghb7td@EZmt2G9x+J z75IE=G-^PYONiSvn-yg<88YyNz)F-F4MwxEyh^){J!8kPGu?{ZQi3GJ_DNw|v=VJfDu_^}w7wSc3uNAk|m zRXEGc;M$UjKQv|QN1yXc%xO|gISlapjxlu%lop#YnFKZ8{{;W9x^valjM-2`VL>4{ zyvnyDYSMD#Sk~2CLBFcbq->wgtTW&8#mMJbErB6FkrhJ+vi5E&$_D*tQANkEKh5Lp zg$-OiuVnZanbd0Z0i9dF#>pRM@adSUl=@a_jKrk`Z)YZ6-bMZN8fsfw%HaI#n6QCmlMXG|Fi_ z=v^v?*JRv~U-`0sSB^RxDAv5k`0iDyl<+Ete^^fUPHQO4tIUXbQ8)xf^3}V)GO=A3 z7O5CLA42zKW-{_SGpT0&VFr?7kG2*#{FL#Eh4e1?Q&gG(9M=Nk^XwZ=5M zJDXI2yf$b8A2e`$#(p$WkRC^oUkjq1aUGJXT&deYM2MQggAh)HYuXL2-Oj-%WH|VQ6BX)>MlM0*@1tMq z<@7kciFRruxv7aH-p<2llc4nur)E?j8YviZFY$fH4^hoO&*&G$0m`m0easw6YmH!h zpD4gg#2D@S^NaNO>42-C8Q0ggGSEf#w%QItWmYf9QiUO%!{*Kj9 zNNQ3Nc@_B6q1wbQKR| z*wE*vk`SMY#j_$2;la2mA#Z*YYMvcQ;+i*~Nhn%yErz@9HK^&U25giSq;ogZfU~2F z5}THwK%d8e1W(I0xKG?I8=;j0aZ;MO6LX$y=P0WAmyvMkCM8Jh%=y|7>PA<@Nh!sY z8&6!OFLkPUBE?FFMAz{l^;|6ZLXK2ek$YF7dLX3SwGkE(h@-;9 z?U)PXI#njrwSXL>FA*UwNUXVBy^xAim70V&q%o~QbJAwrV0M#d^Su?PtfEuuO0^0npGcwt;Qp;7GKwXrr3Osy5!9^UhWshsNK;M< z@i*^MY?UIcR^;y0XjH=sV@?uRuBBmi@TGEOCA=Nw6yCbT)ifPenG+SFY7y!#N0^GZ zn{fUS&-Fne1?8A&80Wnyy)A}X>XZsi+7x2geE4*o>?x<(JgFX0l&MIe({v1vl7TN$n=+{YwrSS>bCI1&(1lWlA2YF!nX>wBYaT&MMV7{lZzj6 z4;r;vvBTe6M7{Q*SaK{y82{rLtxV$9uIXY)OzHEP&@2W~kdY-yUyA;$RK#xnUc6PO zo*201oX9i%JIzP3m^-kw2o8HgEWK9zU(9r75(Vk$qUZ(ubh?{MMB}i&;@ZFUSgoQY zJ4+Pk%`bfO;-q&(B5m!U+wF}{TeimD?zPrCT$X)(*LiB;pf2!DrYF(>ApFqgMql73n& zox4wD|2uLIO5S@9+4AMcZK6Ej`Jep=n-v=}WYWL$n->AjxnC-c>a-|aagH0}MSZyGa{qH3Ad@hZXOeV9V<^D^EA0<-R-{xn1 z^i4TR)t|)4NCSB5qoM!5X9KxX_4o36$%A})|3;$xw{s5)i-F?eQX~%UI4S=g<7X=?Am6IN z-BFEH7|6}Yrqm*k$W%DHd*Z773&Rj53bL}%OEkE8dZ7I`)IY*lLZMOM;NXN(2FAi{ za*OoXWLmuZy--VR7)uJtD=5Zfm7sF+z}v$C8DKM)QCMif*~|GQgg{^{DWpJGhTO#q zcZa{}CMFEzXXa97lcIL<#?$dnuA{YttXwm$p02255^Sa-a&n5WNR>EydE@k#q+4Lf zOC#6hfUln$a==uaM{Yq$IZ72IDmMaro&Qk*S&GQaDnjn=ho?q{r7VYBy(8`pCUUb1 z>{L1kBpP>IMG*xCds00TJ9neX(HXVGhEQs8c2GY&joU0`y*6jC%U-gr7GK$s~m$U|3RLZWrY*TWH+#2&ZK&MCqoQ{&?9fwNi$*7CMY zkF_Pr+bSqUsGRZia78VbfVr5gtU^pYYRg=vBfp>osgnopPHJTTn-;*LBRvPa{ajwG zj~>LdO5}238aU{m_CK0$9u%Ydz9puewfs#UO|yuZ@}78a{xOkf6hi1uh#@U%iyAd* zi0ZYPi2+l#iM!@M|5Z!+FXFAxN}}DM3F2Vxzh^w+=C9w0PsT40v3d5IO=l-{7Y!mk zghtg!?9dA#M7B7x^mEZFy1J+q6)9@8{!HviEfYf6M1InCG5Ga?;_%Cq0kWlw&6E0y zhBcask-M&mV)NfLgp_%rRn_{UZKv*H?6$uUB`Mk|`n@|{T+Fn`2#OO|ioPuxh$>a; zitiKudhB6YV}vT8t2kn^%ir;FokfU;hlr?IN7Rn4E*kb;^>qJ#(nJv~Mbw-TD=b2Y zTPt4?K^-=UGdo9#KolZ0x}Kfns?}~R`c0lGM)i7I zygOsN$apLsT9ST945%F}JhTXzCP=iKyi43ZH%Mf#Mj}*r<41dph-T6theRGM(dCE`sr#2VWMjjG6^V1_OS;yy!-ff$R zMh$9-IvvJ}-wXb&3#2`KG7e7{U0XF4jbEuH>b*HZoGTK-R&YbC7~V!i*Qh0GHSQs1 zA50P^A;k5SgG8gcuZYHt8;UnRSte415M|eQh_AXg6ZPxV5H(s35xY`Kgs|$w(J7ro zt?G3|y~eMJp>ux|1wx3-gHy%ZEgOp_uSAOm9lsOjON6lIC5RMHNbJ#c}OMIznM2 zTklDe)(r@BR8W-o8+*=WA}LElr*g+fcb)U6?r=NRhB~sx@jv%@7Z)_s+5FSRy8^Hvyg!)M2ftA1H_1{rr5%mu};ta8&~Gx=cBI5eFIQ z&n@J=(JMIAwG$tN|4BdT?fqQw9ZmAWzDNyO#GgJ(e5w^Ue`ieD+1M(!;*GjK=PG6w=9Yx7EU2&&v`95{NJJmF3S48{y^#J>!JM$9zj$Wr21+IQkG;dK2+nrcW zU%W=1-ip$x{LKc6{6 zqQp0{GWV9PC4O*CTvg7vI4TelH`)xE!OVq2A7kQwk3K-&&JHwPHJqzk+5$#44?Rb= zQt<>@&cUxWi!a8|cJfCYaG1`L;bCwq4zJ3U$zHOW_>ZQdRXO3}q(-TA#m%PU%)0SR zJXwJsSC6NeukxjDnMPeQNB74gcau|W)Ka;2U8)8+QxJEIQ%O#A>QVaz`Sc0mvt;qCsS3(pdbK#PX=vKASWM1WT znwpwXF2o(WfLSZWU^F3ht4hm8VW^CG#K)W={%!$gnGcQHw;;^rX>)jkIaBvjal}S8 zbqHkh>z)i-^&VU6?BtgVl~@yZ5bsqV(__mKUaxwaQKQb&E#@M_0`D=sZ5w{r*_^i$ zc99YGDJM6+!{twEFlhA+S`WO=q}c_0n|^^#i5uxZW+exjxpL))gG7wl!qzrE{Mx~j z;j4PHvD!|yU9HOcxLLR^{eT{ukMm|^5~D_4qUYs{4Dm~0YTGxMyt^xl-sr=k^|`eA zGL1Z)k%}%aA1oIZJ!w}CaWdJ4vy%#mxfFv-P1-i9ggWms`;J_rNTR^SrwYwmR>!I2 zK4(w-&P|<$KzB3xz*cmq`t&*!MK{iJCPBvQU2Ea|@a9!YYV1i)+%BQ+ty_f1WDj%L z9x-A_B$Sqxa`W0XT>Zj{4z;rJhk2Y+_~WOwk#phzN#=3Xy19gJSKjB%4_lJD{zpzp z*D$L^22+QOAu+NQm5n#JbVp72&8DH7$!rLelY9IG`GFw>d3)G5vQ&enG?A4*{LIl? z8Mrs;PP3pte;ZYn6=G6o?8%%Naco>PgY!8K6dKgji!gC8DUVuvI&pZ^7wisvi~25L zb_k??v=f_u{GRpqov0e_!j`2!aOdj`E`|F(rIkd!>-hoh-+oI|NeZWqZ>DI;I$9TG za62WHBDs|Go!f|4FQV7Up$t0s27TNQ6Jx1~kH&=@i{K^GY?SOyP`j}Vl;O@{! zd~Y0N`HoZEFBaw179=?MzQTaP9q^Fb;nx<^gM2a_J4TOSl~Ws<`bfzw)l#QLHO$%R z+)hcQR4yTH+g9S0OPSEj<7s{-^3(5dC(DeaB!$Ztm4v9H2$kiLl9)`UOiA9MyIln2*L-Z(9y_noZMs~s$CN2x2=4}SIEqtLD$ zN)_DRHiysBPT(fB5zu}(A2)qUIYpZhQK377WjmOAY%~*P<*`DUiNvE@_-af6J{CRB z4f`_q^+>dGC@e8!HJ8}gPB373R*qXqAtibfCdmWlcO!)KV6buK-tjwNRE*Axy zSv!`~{?+;N#~*3w_h$&I1VyQP7}k3xEvAnq^v>_>j?3ih5xsEE&m{TWQoh~OkiG8T;q4`cx)DVt0jFB%U;?UczNXCEh6A&G^~(=-e@s z+Z*Gs4iA3G7*82j4zA+IWv6kEu0he(X&i31kECfWu-x9rpl*BUJo$YBOg2;j?(Et1 zE5F2>2@O(nbLj>Wr){La>M-Arieqlf&jiG-=lg9w{5Y-#-}UZ``pTa5U!<+Nv3v{d4&FWHu6MIqjCrm*zEdxvZ{EU)`^a{iz0BJBO3} z>qXN2u2AY6Mbe&4B$r9CeL~++o3r{WPiT zN7}k1a+)6?$*UD!zb|KgOc9;|YVIA`!&Plf`V_8X%#YRWZEZf!ea~wcoT?DNYcm>) z0#jx_nHOV-_3Xem$@3Vu+Mk-Q`f>DR61))&HYqkk38?-Y3Q8FBIlF2k6XNSpMVX4i z)16yc2?VbGkb7t7ArAlmAOJ~3K~&>DXQlR4n)=GfDN<9fWo52yTF9(j$pqA>#DTTn zaiZ5HQYY4Ws!P~hki*?eD;c?=C9n6bk24lBdAiFbz?^m3pYOjvCO9cgY&vS0uB_iv&6WORb9}XM@`aQJ2lueP#e3oZ) z=E}h@alY~^!zXOPWRu}m{VhhkdY#i_g8Axuf8y%yB(*Gz%#^!W8b$MV=lVnixgohR znmO_H*mh|OHN;J($L!}yxx@9&twJ2#opE%0boLYy4L-pk1QZmIR$M@-5qRlwf96VEA=itRMdN%gMRb}B`z6o8*A-3+j zO;0a(s=xUWgF?&5J@Y!9!f%s)VF@$$Tt!>GDNb5B#=Kazt~tfD9^J{$%Ew?<h(YK&h`c&T=#9Iy1WDgKXQE`V6DxLc@-|sadv~ zHRt;A`Ow+`n2Jj9bC+}TP7y`-PIF*?0^KU92x&ElQ7!Y?KfOJld|1emRhO|=7(nMC zeOP`p4!Ptxd5xS_y;Ri;F#0Apbe2ALx&IT$Tcds{_?=nW+ZjS~`^4VgxR)NH^|l#59dj#_HL zXqBUJQDDATPE!-yo{sLr`Lh22-uq!DA5?XIX&{NpqY~} z=SDnfb>E|2>n23ksf26s8Rnl&C8EnjCiJevphJ60> zEDoGJ$q%0_z_0ftz6nT2@7aPNxxi-fAUwp8xN>-{)hdukpDZva(^jB;|IcWfvX4;{ zR&d~SPinSvf62*L5!tpU-4YJ7@OnPrj|2%axdb6spj0~|6$+H-G0Q?2w008#N6)kN z`}Guub!S|sLQKv9_^AOLi3oLmSVH1y#zLq(2y_Gt7UWJ^r1{s`wt5{Wa;wngoyM5T z_HfEzMj%D0kz$iNpjNAq2^*IDWOCda^HrCQM0ly8eFxrmwv)SBt@eU#FN0D|-uMk; zPk1w8!iUsyl|K|hiA0K2V#6u{L-Hv$F8PJ)c~<*eOQg7mzs-*e2hjG-7F^g{KyID^ zLKJ`py;twR{m2D=TQQC~MNy2N`7Q~|S8_>Km$y6CrL1T>C-o*f#oROcWiVN>Sq%1f ztUBWM&1d;>C;EKW6RqP_F5I_awMtNGB$&~n)o77g3Xoy8Q*IfIJe5*W*jd~kJgL*bxEOVxUGAT7q>_%`$INHO$uiVR2?z@Yd3^%w6tjGP3TN)Mp(Pn4<$6#n!9XLV zcsJ-k-;cWBFMW|4#fYlT$MiMyWMP6EY8hB=%eq> zqHEr$r2>n}pXPl>^J#@0jQD9KjjMi5wCA6=ZAql4HEwtSXdO{n?JOq(!0=d^5VHZJ z#fFocHvkoaJ@zQ5~lODZQ z;NCa_bwwt1CJBawUg;HY&$ zDs!bx$8I>BNno-p$ZF=-ZS9-46fya^a99#1(b7n;{a(r`aay6dLcH*Yc5Z4z|)#*)-l|`~( z)EA?455fsBnI%sgN*``PtHna~1`YYDO#n$(E>aNKmMU2%xb9kydiCm2uZAy}WymC= zyvkGgp0ioeR&Ig!?ccZym`l=0xKW5i{`BgZRsqftuhW0TcMNOf!nG@L==_@yczX}$ zN+n1wi5xhYg|z(k5)j~kzNnNky}eCKP8?UW%MW0AY1~OGLs{;dwf;VgDpBuqs`z=z zK!HzWeY$q9LH3yhj6CO*ZZlx5sZ?^ETdFYo8q^6wYLOuU zT-}{f$qeKdJgNU=&JHM~avaL#G5ydSzB>eiCQab2$j8|^EtHhzQ-UuQ)S!-jhjFu( zv2x`KR;*aTisj3hHK8{Z6k2MuZ%rjv8(H_u+4w{mC64vz_Tex_em;=UySq7b?LH}4 zCPHerr+IWWN|LfMia(*0Eqb!jk}(IoM*HZhs0+&|DKUD1R`#%B_?V*N4BqI z&FUqL>E_OreHSQ|%fVvC^imZitXL%#={YQzZ8OheRLhY7QkncEodFUQ8V8*J2upT! zLaSE%fm6|jMOu*_LxS1%(^-sa84{Tawc3YQJ{Uu1({{dIaS4MB5EkMWx1)B4>7+fc zbzveqJ(kmXKuQX^HVtkb?sjFbRX*ZWbn(R9#RFq@G63;c?xQO<5!iJSD;~(uij}Nc z@gpA(_>d;@I~==_hlVn?FTX|gZnf>or!av9L)y}R%08Z1g459xPpz7qy9t1eQ)lm> zGdxxj|7l1PxuHw}^3TKH5m92mxApdSA+1X_vlOr#^%*L~&AT@LI zXgum_5y*uDku)WgIBH%=y@ z3h}|OL3bJ#?__4r$_~qO7j!PyT|HjDfxBnCYsMqq*=?R1O~m$x}~kz)u|%Ep%n?M)0bb9EhwZm zEEZdNF+(#ZlOB2GXUy+@nRa#C(DREqTvs?Dvs$oNtk`VU@}iJ7%qBCX88M81tpa`l z0d!hdK%i71_Ixc7(T?pyC z82|3y(66CgLuXxzBipkU!7p)ylPFb4t!8^nOW3elELd$e%w`Kh*f5(c*v$7?)+-YK zpkSH|S&L({-ZYPF#pKVzS=*~N5z!xV-P_|)>4&GdaLf;iJPLu;WWeNFi?^FqhbB+O>Ex1l9kJ+(!IVf&RPee$HdsjY$_%D_C>5wZ%`RP z>p@^hC}Ck?<$pp63G}oZ2Z!MDo<)R>4@X04`|%38}l#TM6XaHEGA4=8wiVCj)XvF zzQ?AYzot#S!R$To6WtnDqxq-5VE|NK!MxJ4BI{eaQfKgdF6P?Zk=;IxBE$STpS5)Y zh{NcDgqDpaXSbk!(|<8~8YAh10c`}40^m`oO|RtsKj zKc|DxQD6dvtc2fIj3ms(9akqMj&&z;O=l{f1A76?2aBjw6tnrGmUz0j;pXauSJlCs zzPpc(o&j_pyPaj9S0QTXT5japW!7f3;??$Z+S~FeG}`NknM_7(1o6e}zU0mv%G|3u zz(m@m8yExYJfDGIDo0wJ&g!=#@#(sWh>pEz8#Dgb^MZfL0sDm(%)DI=3T!9u-+!c_z!cd*fNFx3Jti6|kG+@^1 zZX9msgKwp7B)v9=@lDIGqE;)&704btP+HAp+`o1Y;a?5U=fpd07Bd#B4U5H!)oR0H zwjz@kvuAiCf-8nnt=R`$t@kwp>Qtgv?^fij=}kzLb{sGW6mr>9F9#Ca4SxFM9h$uQ z9dYNU^6D#%>G9nSYQ5Q?j^4Ye;-_96#ge-(^Kz`1I%J@jxZ<2B`M0Fdv5A-w z)kTd7@&C2tR95|U@mMzhKuBXQQF4+vzx@Ie#6Ak7chreOeSG6 zScDKpvFC#pqR-|eVg9Gl>nFwQ6+4RkMgKi=Q1aW?;?=&hL~Qz_G>FoSv*O$K9mU4n zzi+>pjV56-S%nZ~Vsn=|qR;-UzfP<+aNyG+?*KO2Un9o;EOzq0Y2Xax$mDK3F zkcE{V`UdDS=0mvUXg|3>%Qq^Vcz5%`mu^v2buc5F_UFUS!x+9`HXVIlzOSikNAl^a z(-i70_;y^##(EO;#YI>iKT8OZsxjPkGEF?peUN>2WmrtT$oak8Unn z-v*4|yZyP6@n`jU?uq4$p0bcjxmMg-jAngHH}u8DSpGp5sL;NEHtvsh=?U&Z`TOsq zTC(I{Kc7#VtG{dh{)sNU?2DF?6!vd9My^Eu1jn9hbbDT}>5Jk&eLpIcrsS>ANc%> zRm^|)W6R{wh6AKqAAu@_)rvO!63Hn>? zTDg+VyMH6m5=@;?NA6wP&fcpIR1bTJ`q`Fj&h1*yn)N%lSl~|e2w#*ED7$l*#dB72 zC@u|^UnGIDE3Dg^gnI>loL`2VH9v-xbC5$x0=@r^|@JhpOYIGu!k`TYtyr${2aayhd9 zck(3O_`AOZ5~lPzTb8b1>;B^;i%_CNoWWMgt>3q@Z0RrjeqTyxQXLY^~1?Jx0~Nnor$RM67^I~ zX&l?MhV`5F5?AU=bY)Lu*eJNMkHzy=bL4tHE)^p2F`r@Smb(N;1fYEx7Ib|QTNlh@ z)sACa&w}8pAvj6^k;U=#EBSTrQEphmsc1aN`jZN3S9wudhlx8^&Tu9+7yod-NAhh; zXWNXKtlj?`M~?hXa)FAY-)K zTe6KK$B%R3*l(Q7@S~RY6pMD7sawLX3V6;Zf94lmKv2@UqTn;a$(N~RA%u{(iVDsN%2v2fb6HiZ7O1TUoSU zP_O!nbpbX#cVf1)bn!+`rrM|w7J`c^lRXROvu4MBj-867KpRRGpCXPQJV}<-i$Kqp z&;@0QY+Jg5E&Gmf(-unYip~%9&XRqXaXxk$znuFIQQ8mXN-mcYckU+J_r_vY*>e$e z_tGda-)H66nOrhFcvA%_2U))DD0hlp+@H)Hvse&o!1eLE=;m~e?Oe~^OT{?5I@oiK z(l#++ejIs8YnZ+&1tfAZV-B!k^M3A&XC0v*nBp96q+}x;eF^j`VcW<-{FGqAbpI?1 zzF$bPqYnj#S1^0aX^LbvexEXmb$4ygKAAu4=WUh@AH^}N56bk@ESsA}5ewxh6 zxMDng;qcf``1z&!S~eXKbDuyH>Mk>v<%;&cx0d$&csqz?9755o0(h ze39Qf$>N_^anmd#Va1QEj?KjSqB$U+wZlJWbDk@n$_##;IF5rwki2UJi*{T_=Ih9% z8DH|_`646~viG}j?AJg2OHUXrLn+01X`I`;o$W{BuxAtGv3l4DwiUSHA-m7U?=R>t&)0N4)*~@pUO>--KZ-ye`4r z-5dXaKtjTON#Fc4>l1R3DD)hjFp_P$7s-}{lFV2(F4~D9Ae;&TzPMT? zE-1Q1>}?aCfj(I8{KlN=KNC~(`jrzE?k{6iWz5e zpQ?9mnB?48HH+1k(jF2wKfAL9tpDtDHs!kDrOIaWgwgEN!JWNpp3plp&K4q->e&C? z81|ICSQq3c9cRJx72J36CVTe+X6?90snLi5XMFwrag$}RW%6jY+>?-favSURoFw~& zeKl}s%6L{?H{tDV<=~jXEJ+2qrHtadG=AT^oursJWRKI(KR^$fG)l1|@KrH-^PNX1 zxsozrEbIJ}{yS!Qq95_O3y8H;?@gAyT%APkQwcOD>v4-sbm3z5W|Sma)9IHodrcY=QV@%vzBpgeW{P zLkyjPvV^qCyC=JWsjCRdA<0w&s32pgfL&g=GiADS3 zg+&N)bKZO6-38Z0?&XQ1e)Ug9q7XvFEfu|c4HtW_UlAjlz9lyN0lZ{LIV{F~+(-O$ z_%X;-?rt%-^C)r7B81Q-i}e$Si)BYni0?n>CB|;NDufW?+UTmH;^1>4_tFIMO7w7h z0mF+wi|)NX6T5ENMEdfMqWZu+k5HCYow%@lwwO3`mnalMWN#iV2K;nV6r?T{O+vbg z!%tLO)rk}9e-a-w@e!H|O-1*2`-*RVxg%`G4DrhsEya5a?>vU+JS|4QH&PtPwg@2% z;>4sLV&wK);`F9T;*Hu(MXw%hM6)hq#nJl)A;CipAA4^d zSk<+)d;fM^h(i(*B9K6kkc0>l+}*u6#jQ9LiWP@atVk*D1gE$J36|g<5+EV&?pwz9 zM+Dl_bKu<5``-87?_GcHwf0yeUX_|1kWIxHIya6iTjKn_FMnEdPvQy6~y2nlMLBye(!mezc;OjN0=? zo}HQ|9eVyOsUnhla=iEt+$gUT^Q5SBY@}V6F`jNR_l1b&;YR5{Vu4%@`&95UKjN^A zAFxc`h=?levaDXZR&G5$CEqmYF2B7j#*CZeD~s0;Z_9A!ww62vD8XJ{m50>GR z5&-}JAOJ~3K~#BKq7e)#SH#A{sca>rXKaX$w(t*UL~VSiUi6Wd(eWsOH>=y@TG<6x zS65tJtKd+j0W-E;r=Y}@)2NgbY5uqxDag!1t^JwzRbv6y_O!vi!D>#f@dd!ps}=r6 znS?wDCav`FtaS@|d){Z_sQsKivzt&Yimf#(|g32R-;1Dw^VDg9HoyvsgJ|JxEl5A)*#mkymK@YpN{AF*O^r^+a!9+7HTo?FZNGj!b}6owiyQgYBLdd9SR z&bZWQ%=q7)p#k(OdsE-lns>L(5ncLWRxKFT=qY1|9wzAAa`r{~(6L5737BK?ayfO| zEh4^(6{%0cNREF-y1p4#mkwa$)~BGWBqb)Dio@pMcWV{`cmSIM;{dQ|KOFyM5Lv#rkfviT8(1ggIJV6l~D`u zy0n1(DWzCY0lzx-ga@7FL zJi43SF$)=YA{{NOD%5RQpNuPecvFf6CXM;FMHmxD9Ol`%*(`lnhyL}oNy*b-7pioT>F3F|R&|=a+ zF8Hg$x$*Q>nJ2Gj+l=;AZ!>-39uAxeAY97_Z?h=kOsZ2pupcgsRv>Y(t-JA&xeoR_W$WnU4?#?BMSnRA30)wRekDnhG*2mPikVtD%+=qZa(tBb&}1@lH_ zvuf$nve%o|8N!^_`7D`!j5^;<8ag~qNu14-5R}Ew0tTJ zE1RQGt5BGf!fR&qs``@?@@{Y2KMzB`b~4*?p#BRYgY!e zt%RPY2sPR`bY8;dB|WGhMa7kfRfXu)?8lOolWE{+3Mv&Ez|y%nUFt=#YtJWs1czSh z`ML5|>VNZ=DF+tdZSqeBfm(?MU7Wfu<(EZWDX&qYQWgSs4DWBljo%*-n^8OivjC>W`740HsoedDHLNwsr_kdZ1P+Q7enkw)bcBoFC}j&>0=25{*U) z7Hya@D2+9%-;{}9*=RCL{NFHg^kq7)m`RID`e;;2C|8LVqn0vrNL`GSd1U2TG5W|| zUOa!zgOd}DB(H5&q}SKAwCm#@LjN>yY z*vX`_MWxH&-&kFKDSks^n0;^#ZhC48#0*a_Kbm+t(zJhl@_zwHN ztID}W_FOw~1arTe#|FuJ&a^LY&!IkbMspLKn$C|xPjt+NXePoD55vLvppZHE7ZP4tPI z%J_rjnYp4nW{G#X{p2z`mrP?|uU<^t6-xStP?ED#NzO>6?UuV78*0FgpZD@Ox(E!K zF@JO}tCl|ggaw}8FuR?w=KI6c7(I>-HA~345i&y0vvKo%8cd&0T|>}Bo@f5>9<*=Q ziv{Oj681U;FvP>xk4pNXT)bYoGS;Ey=v^!}oK3@tS6sQ5wzDxAkGrpms#N3wkw*X8X?QvOciyv6eM1J83xJHQ()@kFPl>iwe=Q z^{#fx)GvA(v5&CdjIWJuqN+`0IWsMO-Pww8enEypgV z?u!|$x?h#=W;VuHQHWBh!mRO3e*JkEl?@cAm8z1t^Vfk&txpkV1uBi8RDV@I2ZbsH z`Z_x3=)lWG{#cq>VrgZCm8Chx<~10%;SzcL`B;?#6NhGOzIv9CE-_pWjQ!%9jGGR? zKl341pTDPs$q98qG9Mxe(N)J0mHKHSacHbS|bLrhGIlLVYbEy3&J4;)VU6t_=G%AzPcg}Bso@|2)$<&1sh)^ztX z$IRZ9+U`cgzKZ_SYVp&g)vGAL?{w-v{f&V4xn=t-xml?sCFGEon@CD_>7rH(eM3Vm ztF)qDJ8f>A4lBM9agi%&HZ-o~Mk$Z5LdTfeeaB#Sb~$&-#L6T*q7YMJcoS3nE?omF zTwHB1D(6gx_H{AJNFq74c-&=NTFK>#;~Dx{^%A2-eQ1#Xg6p4o@|uDq-bWOor->yp z6;S6eZjm0C3#;a^b~mxk3b%1t3TJr@DoM*m2SvvW9A zwnv{wY+Npi{3Ie1Gbt*W9|ei`Svh_Yy5sjVy@4^Lo?yy~`}og4O33~D92s2|O$oh} zZe?HUx>yr&>l~#{H=1I7S!hQQ8V4AfQBGHvLX{C-)vS>C3=AsSVQK4z>F2nUqlJl8 zae|l4(E0cUt>RFWx@^xiGcAM6lnl}{Q^?2%tgB&}Rg4AAyv<3E%E7d%8|Aej?=##n zbS%LF;|h3n=!xROMxLlXVL|A7B^FxIyo$*O9bF8~Dx#H}gPmPPDyR!km|9_?uY;h4 zzOf1RHCocvPsRN!5ye>0ZY2IO7diJPzQmIklzAycMdd?LJh5qjg%cJ938WbmV?jn( z8s(}u{7d%#Pew}tS;=`M#(Wz5%ItKK;*-f$6_6UAL3WO^%%gdeWlA-hVg~8ji-O6@ z%_1u^lgz9f3Uk8PI=L-Iz+aJ$E6SN;Wn+OVJ^d>vLn||`za{0xr{x8?MR$%H6fsb8%E zQLpas_~R>f?N6d{zuJ_q(TC<*=hzVx#e;i~NfKM!y-FC;wHvT_WG*XL7q8y4-UhP! z&^_AjI7Qpk%j`V*kRqpE^f0^0*7IRRhTh@&BR!f7>OlQUCcJ-fm#0xL*|k5JW&^xR zD6;f%t>urG?ORStGarh0AY0aO^|`u1#xTRYH7fXxoO7ZKL^RTk(X5II@^6 zDa|-~do{_6XR_x_7A7@&P+xV9y}{Akx%r$zb7$P_(|P(TjE^z#M87)6zCgjRg;SX) z->l+pnfD_SiwH-`~s5E8%Edd()xZ zeNG0)6BquL&@d&HYTB0=2o0Klm^kI|t?NU1dC8SK#k5TK<_%z<$1Yw44&v(2(FCR| zFd%~`PaknVER9FU?_=QON5$M11U-!)F76}Gf&+OFXG-oW^hUfhQ9 zp`Y0OARblTYu5Jb!JVd?S=>rNLTVoBydreWZ7^39l9~R3fD>U9m95e(Xw|F+1qsgx zewhp8aeaDUjyE~UlM@{|JA4B7iYimr&5rmtw|V&SHG2*w(y(_etZMY7)n~X9S7eQc zPl>*?>aloa0jqzyj|RwjcauH)0%`i|8M@@(Wapv#6gu>xheZ%u&%Y(=?QO2y*QME@ zcKA71{1JEhdzG;4>)~9Z5%nCy2soPzXn6M1XnwO^#FM*|2pKVwlks{u)ohG)%4N>J zj^y;|cR18{$GY$#XK%eCIxd#*XVJpP(*_%JXkRdCMS?0Pf@6#3k~=Ms zb)D7hU9yKn^Hy}WkK)Aj7es%&#hzn@v>)nO>=2~6cb}#*YHcwMj_T=V88~{G+z8M9A_d2*nf}sr^UFWh3(a{Y zo9B&`SzDfeC6UJqnclRWthkpXX+iU(L*MO^A|jIVTz*?TTecnED|1G65I>(f;^pZf z9v(h2XlIm&>zTIzcHNx#*1-IL^} z>!ov#wZ)V;s%*Kvakz}%^io9iUiQuHFaEV_OS>7zB%!dlcanluNf+R9j)a$dtN zxqFDado`)iWuv^w5K)Hil0l7p#jkNEnSbohq(2X2v{wsR_aaM@u6-}vh8>Vh5s{di zvf}$WaxgeUBmL+vgcl~sjjiLQnR`uXI%0!7P0atC$VcKIZKu?>EPuq^}9`$W6yF#@`7Yuzb4{dtESZQ zY%1foJ(fS#)P5%`diRw1zlTa%$TDfy{TGQ55y^{_GpokP4+q|h6kBpX$S^ zZ_6OJrm{IKPa@CGk^z%WNUn%T_(_>HW3^lh3Xr)2nu}-c+EUxIv5ehxPYOgt)KPM9 z#T;36@Q!5t1oG)jd7uS1EJ@&1%o^VFq2CtCTHC@Ejt+q7z zW|3TfSJFzx85z)GtlZ4~OGJ^`Ej!4vpm<5Yvq0MS*;ZUdI_K$1= zypuF-;x7#vb(SAa$BRg=JUuu=+W2^gckAKu+wI6d%-g)E!_v#Ux15XqC;_Wy%TI@& zi&{jA0_RA_aRCzXWU2Vq@D$&=-r`ZSrug=lC1=BPBs5@=3>q*{hL4ye^QLx{fm(cA77UPvwcVxdv?CH*qVtr$ z!kx0Ny()cOn#sDyLj?|UYHWR-g)<9u7n&(AU?`T88`GI($C{E53GYv#_DJ$KSX zQm)ACp3SAMPkkA*Hds_5QW*0{HuUonJ5Mh;W>-;)j6Nk|lo_o&149XSbC5OL56Sa? z$;Fi~4|cAWpAKG=#INAIdo!o8c#U2wXG0P{87@`4oY^oJQvf1jwbP3upO*TFJ>_aqPXjk*)_h#JOF3a{@m6-g$mpAOqrZF<_YS!N> zYhKt**|GIExgGcSRxyv>Geu^civG7``O>A#jFyWV=gHoen!mN(l=DBy`~xBK_f{Y; zk|!I-%d()ne?wNy7oW*_a!NLAKO!&E{@$_mVcR&Fc`oVSlJ!eZ6ehfqW1CjW>39E5 zwfir(n{af2%no=hMSmj}Xp~uUXTua(A5!!mkFC%DmKn5LR_wkgA9Md+eT8lwBXcij z{H<7!|Nf5b-m*n*#QeRo#_XFeGfsZ|cLu>9ukqt0`!nvrPmCD4y6At?nb`Hep|3E* z*7To56(yIC5vdrMTVwMThe*@!9bxy)FmM~dcipR$g%Gl%AM^XM%jDPTM(;+||23E0 ze*vq(-}Z|Cn`HgJSit|Q^!4AJ5$S&jY5oTb{u>MUXBsD+&u5leuRKm>UpRHIFvh8h z@mC9M(V#C=8vNre69;d;nd1F*?fe&LMe*ORq5q?=`2SBI{8z}T_#b`!&)E7OEcm;w zKQgU|=3nQ!f2pY7pYMOI!15nfaQ*5Eu=1bx*uUEc|3_Cj|6OI3ul!a1cfIPX@5_HD z0QlSVCI8lU$yfjSziEDn{MYG0{`Lp|AHL-ONUv!9OA{G!kRgq{sO?#wk-t7KUNYvr z=g7i-__|cVfAmfw@*)5JOq%sSO5WEjDOK4#IXIa{u9flbF_$ahS;g(X-^U<-PilMl zGj{uHP)D$L_4oW75cU-vp@8IT%a&A{ucU)X4q8sz z8m@RWAHe1t@x`(xU13)DMtIb4r|Xhi6jI2OBU2c$=q{SC>4ThC?3msiZ&w$ZOgcoo z5>!donc3b0hl&o=Y&wiR53(TX7{f=d;XzE!R}BVL=yv-0)uOgsBsHYpoJyPFzf<%zvPv$mPA{TuEqlt_H)P?3(6XZkf4DM2_-XzE_FRkp zI(-#BW9`t!xH>!GR(}+iGXH9gqd@a)0Zn`FC;cnFzaai1!+o5ww|AsQlcDUs8wUzV zy1bmu^}VU%=}wE0+jy6s$@Lx6nYr;vNm=-RC21O$HcX(tYbEUMD${)8LE=<^rigcE z=g_QL6+Amk;Mj|Nh}l7pLB9}|RrD1xkB7``;f|A|6Rw_Zm>&=dWO9AWcQmfygq>YA zIxo0LCJ=pLGTkR#LG?v_<@5T|8rr(qV^`4;-~Ow4l2iZ`aC=ctysA{9L8n=q+cOc85qm?v^YM^HFAL=5f%(#J=sdZf8Yert`AE0j zuSHq#LT1%=mu2t2yvdsUDnJJLx0gK;=@PhTu=JR_Ut$X*WxjWH8FBWbWJFz)Nq*k4 zi`c0C+^fcMkzoiV=a!XP&p36KBNBQ<{8QZ9dYD-N z)$$@QMK-soCljxIMIlmUlDrO$mCWo6d4Fq%3~AL#wmglMhe6lnL0FRHW!#r(H7ZJv z)2X7250pubTFI`2FEy%?jMP|(h)R{h!f4ss*H>End{=VS1rmPccR71*qjd7>C4oi7 zIym`Ve;NJjRY@uO(lAJuu<%$(%gmCrsOvJNj;l<#s}f0#lvnqU%cORlWY(d3lC2RD zANH>>X95daa$r&vn1iwVHr@Xw#<84 zl9Uj#TsjO~Dnai)10PkcyuGzW`ZOOe|1XsjRi!_bCGFbE?$rN5RnW{fFglM~wJG5lF4it){lVg2;<2={9CP zPeP9Idu~I9HL8HFsVAM=>2qV}RbIr#VNs<%Zk844(Z_)&C!dn7>&}>2P8^nuih*?{fZ*;I6I^o4VOPB?c;SK&D+t|*_`^#s*>|QmY6&HIhEUlZyQ%Y*W8m1 zt+crw5KYZa^)Sr(KyYwe*=kT7`5SGj_vCCgX2jU8^&L>X_qDy(X1RvU&CUQ7)x9(W$Nz2IXoqaG)7icfP>1R$Ur+E4g^!#b@5f zNxD^U&#sRuG#Rg1+t;7(_674gF&k&MIyjg+(070x_YOX$$fhX+y8BSx*otbdHL%l3 zBR1WXZ>D*3Z^tD*=9QfK)8zB=^n7~uT*PbO{k9Rbp0uBc$A>sw(3(+=D`05lL9_Y_ z?(VxlNJ2hUYj|RB=1Bj66}hwjF-0bI7(B+BfMqv6oq#B~!^Dy5OnGnl|aNV~b2VZ&x};m&am#@1ohw~etiF~-8NCQinHCW|KlKhWIG9$OnHS}nLp zimD2e7FOfPoa1FI0I1%vdEyYJZMjZ18m^D?#Bbpv#K4y7Rc$cR(?uZ~w6(R+Ems~J zV=a_wZ4C6GNU4jJeFg06c;jN7&h>NeKItpzAnjc{aySu`F?U$hw>9%F6;jdO4%-T* z=;;VWDlLqSbjS`p&10iZ^l&r7-Oml(^l09MnKNo$9WJdtLtN?EPfa?vc1&mB=#4}I zFIRS>(d1(!sH~{rR*`ZB2Iwl(Xi%VQVuw$oX82aEfT3AE+E&vL8J&%eO&z-SD96bS zpIA1?y~1GMj%<37i74aP)wd=+cP3(HX@|3eC3?CFRB8o=hT5Rf$F)@_{Hv8mr!4$d zj&37-_;BeiZxc#9dC`z?ZxtPzOdwbT@uwEh^V>z-j5egIs~u+LjM3Ltqta+&sILu{ zPSmW|04EE56s4gdof?drQ<=l_&QazIDW9{re_!SwdrBb%oFC>!gJsW1kG#q|v-WhT zVvb*vsuV=U6BV?d(>b5xjxINjgo9x@EG^9`XJSc38xwT375|n;pl57L)hZP*(9=OQ zg07B$g*Sb=H^j-(1S@BM{Oxjxj4gJp49c6LgP>M_7Lw7{!_Y_{?f(TQEAwz~T>SiT zuTYUj1G?Z@)t!<1;vw-mKlG@Blf5lAF5L)-$OXyb>JLpRZ(@g+r#FrJjbZN#)jy4d zgq~kU+nU7~*L3D_VhSPZ$T&Rh?XY)rq3zTF(#Yk+@(HxB+k~E-e5q8uF9DH-NZ*q|={t*7xgBbxma8ewm4hOK8GcHECa zsn9`R*BFC8R5efl+87!9vACmX@_4#^7#?;Nuy(4$;MJGNCW2|rThXU?H##?Wr%Jua z+|2_-jY_3LO)*>3Uxo*@v~`Giafvx+Q|L5cD0NKY$uzG*(c$(uG+a-ms~(WVglJpp;D(GX#RF7J7Y>3)T_gfOIz}I&p`rK^<_r-Y|eb|PC-Hx z1x1N${;m&mj=x1Eg=9p(Cey-&f&*=FYWxcYl`YAOiUEt(bg)hMqOr*T>=Nvw#FU3kss5NKUxV)|IEIw=I&y#3+tWZ--+-9h_SQ@B$E`LVH-v91-xb2lWIT-$~;a0Yy)GBEcLTOO9s!Dt!c-f9GWd}8={ z*hpsIwPgJ0-c*(-vMj2Qv9kqL+igebY)S5ix1?(sp#6F?En7?@ShUHHi6I9aT-r{; z^Yu?0Ni2D=iq|HSZuYL_x`q9Je1D77WB(r3Wm8&t1HB+=$+H*Q<&OXAq!z9`}rjwJUYwEQfp}a4TpcRXL;WR?Af=L7uDvosI57W!ojIsus5y2I=eZnX=6!F;s^2+ zYEI1U!nYeApwd&5otlbvqj?NU*~I$CB>^%m3!3yCOns}@Y??5bsZTsvHl-c523kn& zeMZ)@#--Z|G+h=lxXNb}{Nrv`zwu#mcLz|IP_tQo>|bo=d?^EraclN$_G0(sbsXC? zicNY;IWXJ~$mRCV8Mv3L#Q4}|%<5Q^;z}0sj~fo|!|AIX#GwaK#oV9@Eo^M~+)EhD^T|VJX6)Wsk0~0 zb--*6Y#4xx<-c1&RLO_iTWD%&MduS5dUWl8OS#f}8j>FE;%G(-Mzks>AHbv{<~h-X zM}8!|=s&OME~-MxHQmU)6HSPG--$z~r=z-fkkjXaNOT^=+3*As-|V4-qcKHq)-iFf z6Bn}MxVW+>x-rS9|FX2NknuK%&1){uY-bdSiBTM#+JQ>B#~3{61>Zf2Bli6j+P+)F zjDR?FDL}vBU^bn7$hA&yS#{za#tl|-=WYO#nlxfbP%vlLOrpLefDWq2yX5rS%bj~6 z+`Y000=KaDT{CWFWb$~T0l#iN!~0bASNB0d_^*up2{ybgFWFZs>oDBtgW$?xO6sA%tum6H=EPM$P5p*LL`n*rJ=@^i87 zAHbvY-%&9yAJH>FTdhQ=`Zw%2wuzp#DxjmSgO)rTeE^FG)j?mSK}*jNML{mM1CR3X>;!D`@)2EaK$|vweMouo zm=_TlWpmD<>v9GZtYZ09C&rC+1EmHj$i}esI__UxNOdhW=xURd`hh5o2b~)he{hA0 z<{0V&xG;I1D~A@G{1kh)ZNa4G8n&#tLyL+1scr-c9euR5jc7LO3`bXX!Z^PGg}wob z{A`TdZY1Q|e5#=WT|ES-=I4W>X%aWDekhaGpxFji+OB5c5*>cn&;kky(I|`1^&CUM z?`vt}Xo9w`Zm}XXIXpSJjf27Zd^2Mtl@$QiOqg4nbE{4hS4L*%NQaKiNV;&4f*P%9 zUP~XebWs!*;57Us_l}LkDkm4wGeApOfUfsMPM%#uOM7Fq^z_gM%30T;QwKdxZ43G2 zZF$V%=h{c;J1w0bc6@`est{#vCMvVa{CM*<&*oXN^OtkHymf+Sc_|$Gei#GCe9y_q zN_aUaQDZ>wk=}%!yT#k&lFa~xHr2b%q*3fz4!x_zklvL*w8(#R2a}0MdGhKFE9`dh z?GN`z$V#NZ#Ea&h3P3@{O6KV40NS+}Kiz@Di_cRQ9(U}?+(sXnz3>GCmkh>1yLdR4 zck9EsL^Y9X8*%^OHf}vT&d@1O8GAjN_|$aPnJ%H*!nc4vbzAvhkolhA2cJB7vv%v5 zW3qx#+sv7{xN*q@DbIklXNb+uVjWBAv*{f=1_o#w+tYXH2{un@jA5Y?g_ZzzOj%Ha z+`FT<&T64BB{$J~ukKObfJa9{M5YP9qW(E0=J z#+hAduGXrV6bvsQ;v9Wv;Iyy$MV&Z7l zhot<+2?iqCnAqqc`W3LUw#7)Hhn7l7mAZ8>jSpnS^zZrU@I#UdAUE_HY3_sZ1I+Ad zQ{UYTjq0xqr;4S!k1Gh|H8!%=IAt zNety`R>4$T0owYwwjE9NHyb$~SJG%o5J%oR(Z8($=l9$oTVa4{#hMrOqMq_1PQa-F&Z+l!USNfTos#!2GN{;~ zK90I-5>gAWGlGbFQCQZgR!o3uV1awH9#}o!!R69gRq>ZN_}-oV9kn>M^FBp7CRjMt z$J4<9Yrv?AEqZy`6d7A%Y1^6=2M%*2;3&rr{l@J6p2dCOHIn{1H`sSCri5=yLu|-d zUKupR!z_ZE4|BlQ4JUhV{G5xAPPlkhq#!O8Z6jl}3sZU?&BC7JgbuQIE3(26%=KXSrR|fHFuy=c@6O& zGa=(4zbxED_P}4+-0ibLVCsZly#}bC93i+gE9K)!_D9vFe>0Q&K zJjvmS6sR?T0z*SRv=!PId}ad_4W=@%=m?wdm6%v5AUxy-$yR>Y6@?P=IvX^(WR-S- zjsvx8=n?U})I~Q$Pe%t`Jp+tN@kvXED(%NpJ9IrqN+U0+cL@l!r+*t`F6_HO7J8W2 zyJM92oGcV*rzBHkXo9tSQ!0OsJ0Z!~)^Yh)E(}S}PjTez(|?itA*c$n%J>Q$U2RaN zWsp;#BI{)UKQ1_q%c{%F{`>?^`~?n0da&vIH5N9q{+DSNl5mTC`z{l!{8FY}@nTFN z#lcijsxWi!%$frMtQb{?m-G5E`Emj}=62|&z9Sn@7iN%@R)pd&JuNNt4a#AtP9Zw& zv*b%-8;mkP6w9NdA|*Ntg9@f-BdALpZqY~?F|0zN0F4sOpN{5g=^CIYr4v(Vp{rjG zb!HrSfFxv~HZ(v_R~yhmOIt%x;UDw*w6ukyLP4*@Db}^BOqE)F`E~Chjs%?K_X9uD z*4rL!wHmd$m}^rsf~GK?d)sF*cKmmY9zB|e4<4YS^XYV!_QD_LE-YHQ6j3Os)~h9U z^)1{iftEP6ZPl<*TO3?V$o>o>L+vO@+q!Ad(5e;8MK)+f)>uEXeksJ z7@DGrzs#8zPIPaiWarFQU#b}a7~pOf!B1Pm@onD_i@4*={BA#0emu$?-$eHQatb}) z?ljbW%;EF*c>DY^$L<(2bjf%cS{qOh708iuFNqEf=3cZeu2t+Pr>6zlwm9ovV%Z@h z26wH<%`Hm_Nc3Xy#>vRhW5qEb@pEfA^iCz zj^8cEuqETDV_xi1JCx7n!nqK%o$6BCAcQ&Ju0k_*AKOM$;MAhkysy%Q_DOJ{TKH*cD0D^bH>of z&H&KDw46TiZ>|xNT%9(xlUX-m5$~EVX7@sW?*BNO%SJ8e>Q{k?z(ZVo9mS1PcMPXlZU^u<8~BLFYXZ-^q4e*>eR3|0F3aod&T_q(X{H_0Nv32%$au{zf}hrZU2%T zdv0Uv-yP4~TLfHxO4y4aPG5+{Yt(eU@hV5+>#Ll;@|uWOcex*LhI>^T40IG|>sP?4 z@B&*dmFJtbCY)aJBNuf$v2NWEQnt?LV5TPx%Uxyps^i=bzQOS`_fS@8M!#>`p!@hZ zXF@`G|Lg{*E+*kOdNOUR8v%N_+9a{>;4|!f{c$e5%FK})F`aRQpSx>uWaSRhZ0$(8 ze~8@yf!w`yngf?}X+32;ooYLfd3QVe?|$Uo&F2_+wWn8mj}p>YE8NYmGi!^QA${F= z74Q?k-Zf_OrX@Js+sgJ==J;29%DSJA5OnW07tUVfO;Ifd4e{X4;vvkuqQTp~fCsm3 z@`f7tIvWGplsDJ#{9X{z+MYCWe8-YeOGxRxiQO}6a&5tU?wfc~A@LaNw_YIl{zdkm ziNd4*5W4u-5PNzZEBBn@(zS;qXjQ<<%mHT`L!cbqc8{3(Q!?EK)}C7vcj zI$&M8-aRv%x|5>l_gz=)|49kt{D(W)p3#b-&Ug9cQWXZa%je3)cw9XVxU}aeFB5af zO3KB)ZExCpIT3eiBd0%R5O)6>cj9#MYu61gYps7UT80J&p(6n()3WGNDYkC_dv~xsDT}b5ZLmYpYgNR_^ z;DDLtIlpcWquG%5I2-GLmNvQy6|XMr=h}xDuAF&-Mf0BYXjm0v9W6AeH`sOPDMf|p zDC}xsZwv;SNY0+V$(xsNNh$Avcl9b{UfICDX9+|+y3WN%sZ??{;?~})*mdem9ourm zo?p#LlZmXD^({jN4`gWn{XX`)bs0>4RBz zIzvv&5XMb!A3~=+WgK1V8MMe&^95R*;Rg6CAreY1` z*aG%xH>Hzv5!rU#8PmxHOIsJ5D;l9^;zIqFzSu|}xhfOt4W7&(Pcszy7P!=|g?Ujr zc^F~qQiJMF9;TmGV&)F$JvvH2lrer)P06p&j`4kKU~F0q zZ#N?fwH&G6v<}W@y5!|3sMTu>LmO4%|6}jG!>YQLzyH~%a)3h-5NRS^Ko9{Hd!yK6 zFR?_8G4__kBwkxgj3vfsjJ>z0(b!|}y&{T=3Mw6>_jbyD{{Tx8YvRp&@9*+`9)0wj zefBCdYi8E0nOV}3EJ~}^qp_z6qF##1!X7u*8dw;XGpf?Vo2(y(vCp+XZR|wMz1z{o z-w_W_dt@>b9BOzF)Y1>5oJ{nl&V=^=h?e#Sm^r!QXeOnwK#EWI;S6kKkL*cj4NOtx z#&G2LHO#zfVPqLd-!1`|shw#QU`npWj{0?daI0ZPQAQqyUac9_t2x!HRHJ^AT1d0A zD3cpvR<#B`wQFK+TyCmKs{5c>GoFp6o#^CPOlkE_3=DC?+TMw37RIP8-D%j$7sLEq zN>Jj|YA{1PIAfryio2&X2BmqF3P#v^c;jhrhFl_mAjQbckcc%4N%C!jM^$^81vkO9 zS`8WoT9H>`g|~+}g=yK8NsO@dZAqVA?WkGJo`3*ngn}aUa$`JN58>kuPCPvkv2;Ot zd@-AHU1{kmBfn|~Ms{^aZSIDbvk?-N9kyycdHJOXiYf&37{$;KM-&Q6y!~AeGjcJj z9Zb(Ip}3envj&Y^+)184mXlt6X<;kJAs~#VUXJ+s*r5}v;NeykO;$FgC^575p=19+ zG;bwrPxw${2fRcdA>Ji+HKCFGY)ov!&Ym zbaW^|;@Xj3O=?ix*%4D?6Kw2lP?qFVsFk2HaiHaZ(e$oug0>)=__%be{F_k6$qGYr zSNv;LLn#qJW`LorgbUlYQ&Ou5wpHEf&@KquDo!*Bv>>jJ-iF zd1^me)V4rChJleOwl1}Bwva)_1vVZpreTYQ)Of12BMP7OaMP*X#L;CY!OBalcov2&4 zIueZxBcYhAViDiaj(C~9z!j^qz_peqCYl_IF~r8TCT>n{G-~9IJ~J0VZ9`Dk!F2Jl zLZ!CAxu!b~)@CS7s!_wk2XA|0WC|nf+-smLEJj(?0VfArOq51cvvXo;hn2h|Kg?% z&#y2;jJXvd#^t@+u*{;EOX7u?>~~OQ?73)7U8$H7d0vc6)4$WcmL}g3uiZ@$3$*Wc z4zh2Z5-%l`{`DGOFA8_fNfx7S-w{*Zac#7Md*{US5A)yYJN2anVtnLf@m}V;?Q2O~ zgn0S>W3lv|vVl&_h&(M`OV+$odTBBqi8t@Wh?yntb`J9HoE9&{7QNHH>WZ?&2e+<^ zk8;I-8}ynyG5XR~G3A}DHLVzbaho{4Z6mSE*T0IfdHUz(XqDKfWsuk~bb|Qoo?nfa zc00Og7m zm5JV!s6-|HXRADv6=d@`Efe-ejH|rB z6=#K$tJOcy2Pr1@ZkRmxiBUjHYWV4YAH^sLNM-+fBK$vW#NyNFK0zqIbych=kuCYR zR~;>nT&ZXsNkwFhs4r&}K_dBUgPj z#g@M?Zv7p!3RlMMyv+K+B8PUwy#4Iz&olnRJ+wI#%fq|B;C=EFzB*Y3*wC-5C1+1v z;lbl~R83NF=ga-~NK4Nk?aoSU4t~jZ7qqwrk6>3+Cb{_ujLZ0*VcX&>xxNyWsKkFQ z-fF|CPYY+|q@irMX^gR{A$EpYTo;FOZg+RCPy2vxqphi7roy#x55^A<=I-k0eD&)c z3~cNXFRmwgR6KXaIlSP_nH*ccgagOY$jMv7*E26txAUib(7=R(q7rn^YZ_e|N0-fI zUy2T~M1y(l_Ixs-8)>ViGHquxMmBcnF0LnbY$7-NXRzk;QS8dK!9rn9yRo0q(K?;; zHxntXNH7-#1=eO|MCR#nFw=47{9W8b9eKF^7Wtpl!CYH_My^7l`3pOg=zUx?>&U0t z!~C+xkbn?t0G2>$zm^`p2hDwuHVDOL>LP9=b;75b9WT0avn=Hn=dRr&qgekmvs_`~ zLi5l%zw>vOn;%A47-e&L?_nbDUnAEgl(w$s*ipdGEtFx@dA-I?oy~N&%o9ThB(`)C`3S7 z6vyG;^q6@o(B)=RA_6icRy6_;*3RUI{S$aUIDqF;2wsi6$CMg-p?`3Itp|PSU)vDP z?TRwJf(t%|DMY5^q1D?VeZkb|a#Of}>pF3H&y<#-wSu4*DJ=kf9#Q8{a3Us-5{q_J ze=Z?2Zr9hWpc9kZIaG3eB`Q&g|62S`RK70QK@>qI7ZBwNltyOA1SJL(QYttyV8IN0 zAMIkn*IzJs;USVAr&4I@h?80hm{8x(3du|APCjY1phSzVwD6A_4M7l|KBJA_&evaW zCAv_LRBnJ;t)evP0l8)_I2%gSUY6S7&r+ragSjoiEpR(}8ee#M+C@9D$ zKR=)R`~vdx^C{8_NJTw@Lm1!87)+pv44K-LCz}#MDn}4SqzXB26~|y?fjmD0)38~r zo819bW&u*Q$y0m5SgEJ5RQJ-lW}>!~!h(GA@}KlKpMt_tURu6W;>ZUxm$G^7540>= z$Gq+3^_d@VaoJL3<>if{_uJ(=-sH6|B#qGEs)KL3#sV-LfD5)359t&6ctJFWidP0^SBxR z8r+xuZ30ndW+7B_$0GYa(FHmnlN0At(F=gY6rcCTGHu3Wx?04u@AxHht^8=wDuj@b z@;_lAEeLAdh?*vH;vPLj050sji(LzE)B>O@BmLo3^g*97I@lMhisTGk_}8><`z7JU zujss68~n3>V^4w-V|6+gPNd`7+`ZztxZH=tJiRHgl#IuD=#)}QZf#-CFL8u@F^3`bt5$M+B`Q&g|7ysd?XpCYiVa99 zHsqy6Q}jAYONtORWfT>apw(+A$}2{%OJ;5Veyn<=M~VTyoyO6)Rx5n^A7=Q7maI`b zQeA3*{53l{eQ7><#lJ6gZ`Y;+?t7-t&T~F>zuC>I;L!|FkD+0MUtkNHUZe5ecAvNEKkV5V$CiQC1<;P_RsPOLaB|o;wV(sTMn78a6Hi!2z zU9ZLQ;~gCSvd#<7&?-@hN>t)M9ZxG_$mKH5w(C#cmQ{3q#Z@&=!Vz?U0w~piLJB&) zh7zp^f&_(Jh6>P#I*K)VWQu&&ht%iHjA%C1d-=OXbQB;huR{JDN<|$d8XZ!F0%M>| z)Ka3CAQePJL5e~ELDW&K5s@i!SQ`?=g_$vI2!tYS8D)A9Byv?VejJ0_>`gL7fae2(IENW`;+DR_Zl%W*`&pR&>aUK=lXXC*38iAq%BPxAbEJc}OG>;JtC zi~pd2e&=ny;C+9)jY@@8iAq$W5^o~Uf3LJ85+t>1As8F~$97nd%8;N(r!OykB$Y|a zBOOH%y`#uq@dHF6+sZBNF{o7 zdZGODrv{=99TKF!3q=(x%5VuF>i@vg0y3HGslh4gb?EdUmHx3U5xpoNphu_EgG5$7 zKU&>8Fp!>%540NH@2%g8H7Z4q_JwP)g4R+g5&=X}hgSE0!DRbA4?jOHLGo-Z>U0&C z&sKaURM1eX(}N&EBCS|k&#g~Ec*1jf^tuWeC%m{ViKP5lL_IpKuDopAb8YGM<(Di9 z5=r@U6*5!&kDAAF-qQVPUA;gSiK6%)&po=5M6MUx;A<{LftJgc&JtgsM`mbAO@Ci% zD*xJhZ{NH~qEHoYALn;=uJlhrPabzNMC>e0F$c0!qqul41)ZS-_3OG}1!U&N6Mi#> z>=FqU?)7NuXowsrqli1vMbvb&eDTG3e?U%t5)ro(G4!sFzxrJjt<-ZP;t~lZa;nx0 zq@LN^{yv{Gk$HIg*ii-0lEJx)(Uhpnaj#tyr@z>%%-D-u%&tz0I<^=BIazUBz4d@x zoq!xLRhCp{+q}OMn!Ph8I)I-Q?Z3Y+NL_9%UeR2&B1-8YQ3+Q#pO+E`^3w@v7s6s}w*(#LaNxbIQuw zvMFyXE9U{1BjV6mdJt60j`CCXT+Uv&NtS4UU9GwVm_UAUIuSP>B6kbK-$KfNR`N?4 zhp&k=4zPZCAYcWg)225a>P;{M5b60aYGLjp| z4sbpq8<(I!tlv^`X&)}-{SNafw6em*+ZUTR{e49N-!~chJD!d|iV3c*`HnRwALCWW z4@;$%sMRxBwsk!}PTocBPd=okG>t1e*0N>maUR?`$F3E7DGdmrZZ#!Ev1eHJ`Ao8c zy5eK{y2*OPmKjr6xh(=yPd{qem?D?_UAh9dzoPT7BPiuX2*zIcI;h@~h!Om}A_7Mr zH!M{$N)ykrZP9AhFJ3`mvyW(M`Sx^#RF<{yV(hwm)cWv!YAUr{`t~D6&)-dYdM3$H zH;7BGLenNLe^y%2b7>XOm#xJij0mYt;^q!?o?C@xCc7EYXBNpi4QaQ+iOsj7YRqr! zJ$;R9TfSuSqPrML^Uz6j+*&q|UCD+tty`0dJ2ffGjAZw`IV}5W7Mu4cVdh?&dYTQi zt=FGlwQU&L%9ckP-=oL3T5PkHu>PVe-I|xO{*y5*J*%N%V}Gitq<^1aS%>*)X)=vM zJpMHH%thVldCY-+&7I0Gf&7EQirPGl>B|m~^eCJ?OZTA&?m#Wm{|}{4UrP7CvTF6* zTKgqmtv*iLqigJ1wjWhkN8F39v1I%hevL>Za`zq{%AKk2ZNb^8eVMlR0r}Bq*uVV- z)!Vf|b!9Eze!G;2=(`+UwUZM6Rs>q*^2^BHEI50=N@7W-3jtE`S(ts(5x_#IRthq9NhZF4k{9O-hj*m(JrEWU-6yuC(HtA)cUl%=r_i zNJ=dwuOyzR$b72Tt4`LnD2&=n=Cd$k?jBgps=c?!m)jB6uRrYr9nswQnXi|grr6vC zZ$}Bn4M)=3M+tFz*%arzUsG|R?Xup#90sG z@R+{Ha-%u4ZW9NtYjE(aO3{M{Xah$vxrZw`SJpFc?L~6rRjA#(GkrP*V)*C?-!I-x zoZx_;eIZ4GpE0_j`UMWiSXNH?1(~A(sY#E~+qY%(phgtmILM~02Z+fjL*>?BV_{R6 zdY(n!9YSfZB%{!bCY`zwQp=j;eM?z={su*=&QEtzV(vrstzW^RM=I=6(vi8#ki9T} zBZ>{1Z%}i{0={ZrgENDxGjzp$dQJCyb1|3`!|rt}I25hK%Rx)N&qsXP#tD7OVSZeZ zfTK++*J5KJZ|m#ft45ZRI@TfD9s|zx;^6uG{HD_7vC*DN}6DRwOdPu3~x)-jGJs+xsLNG zruaA%lUsWD8@0)f1O7ZEXU@_xAJS(%lq0HK#+{ zAgm<<3ga>k%=v+vfS44;@jZLE6&uNc%Q-lhM6zJn4)HVdB1%# zydBL@>L0RT`ZA(T{b=2^3MXcN&4!yrFKI269Y4(Hl-!p_bv?-3HG`E=ItUy@_wZN+M1ba?rQ;>R(%cu9T=-bUawrfb&-o2?`yoxb%qRKb_ z_wVz#Ku0yNCr&U4MphQ6rMl;8HL9?%w5+h$qdAvkMKj-u5PgLa)!h6MZX6&6C_cZE zkv&@z91=okXec3}Ve}Zbm?QuxXiH1cJ$-R1tH;eE!M`iLI<_XrqoTf{x;phjI@9OF zK6u>xjxY8lzhquiIQa$9z|)2*j+4(3B&~bak zbbg7==fF2zY2G}TkkC*7 z)(ga}_?WQZ@^rJZNVtRJ~qr3vlBno*~EJ{xDu=UiEJf;+ZAw{$obODdb-xuDHFqTC)J;;;?olL@v1{H`R^7}&lb280&7(wH zHKY2mA%ykWhE)@LQcj*HUMs;o>lj1EEg;_3l#K9)q&+xId=-E4HjZKF+;EKTR6M?T zoEWt?&bR(WSl<;Gx2!?R$s44k$51NOvvuxQY`mXOSynFTw~i81wK?{OKc-FJome%r zAvOF#g_2O9&&x$?@OEAeQBy$l#oxG@32_nUNiNZFZO>8erQK)sxLL&cb*9&QZD{Ce zi9(;vzO^ek6sM+n8+UH4{GJu((_Z>+BbT}~@hs%f?(5`Ntb>P_w)4}v>o|Apid+14 zzFu{TJcXX4-!FLXXhLp^M;%|fv}=kTz`beweDoC7d6`^Niex3+MaaLxd1Vw?s@i-y zxGSCt&}u|v@_r1j(ST)_%J^4lG)eh2=-t_xB+LnJX~>!@PPFS{#nw5y$)Yj3wCfx? z9FG5>jx=zp0yn>6S5a$@4eEl6E}oRFYdKRUbOa5AT*rHx37>3G7}Hlwr@@oqf}D%FXQmtB8=+g zaCzraPR19J7jcY-CW(A%tH!B8OPV>}=F;URG_DatQpC^fIDVV5EB6SuG^8{+k~%4(wz07V#=2WP$_KZA?o9rnHD%99 zO_|aN>HR|tfBz%SxeZ}iqv{pk7*jK^Z<=j5^kdcB;D6>94Qw z6p4s}3Y#kVY~JvY#@~ifyIKhj3wLlPK|ruYJ6?c&=9D#9jq@+{4D=wm}tQf)EnfjqVC?D-+_w_O~#rbHZN-TWe zqmN)sm9#x*iV7*yYLVI1rF~sLJoC>&X$hLrLPV7XE)ARTo>4NF&LmS-luwyxfT3F` z@7s7`tJzf1RtbW+3k^bjF^b>L=1XOi73ZUo8em!bJ>C~AFiYBvwzT3li5flluzC-A zHfqA44ZE2VROO9XL!qulZJ%a1Khk63-xzt+Z)BFrFqg)0Xy-8+3~WnC>w1{wpXS1Y zd^}r>qep8e99vB1obu&D(#X++`Vt?k47KI-(H0ONb)GD{9t`Q&7K5rMSvTVee~u0$%xkcp+}BzAnf?BF*4u;Za(Q2ZIhyzmP!c`1=zO5I{gcU4nbfCD%QSIm@O~Uy;D=sH~?-tH-um>>1`o@}b%EYCD8u zNq1SZ7~u$!p`s6meiE_yMANC;axj~Z}!9>=n5&RQjhmLxT8zV z!N9=*Qzx7ij+66qiw^dDVIqKq4TKNs-8u z$fR;)Vi_gHhIISoCi_O#BJKEGdWL++ffNZcsSJaPWMDH>gV$f;`+S6}UXM;wg2X^w z?!s5A5X#CZ(O3{RwDv3R)2h{tx~W^(d|!`=sR`23L~cERS{~IXjE~^b?P8#SM-Q^m zicq!LM>w6H!jk=u@$D9fk@iK4Lqt-T-!F|7EV)r@}r^QiRBaE5}yEvAjMVEb@ zJ*OWdsW|C(s9{QRPCf-i<*G=Ve4aD+^8hVL(YLr0r^Uj){G>p0v_BTsT{)R2zH(8@ zm1?}2`l5?@K=G@rbX^{a>4pS#8ped-eW+1#mw0s`H4ATWIUy5K8_D(~iHK6k8@VJA zfU*MeG%~8%x?&?Qh~VxSazCRHk z{w;2Rv5PAmmlyrtE7TB!tWH)S6}{>001BWNklA9ki z7QL8Ib3eU5JWs1H+M`xEF?ee%1-Y5!W6j8+AY~_w@BPf3#v4gZd`R5G2v!fZ<@SN| z7PF%+0#H$>A2n9Fpk|j08+S;5y?F)^p zu(7nEH0dVA=(utvmh7BTJpXl)#~Bqol%7Fu+I4=IK83c%i5$NkONl;_O{o(kG5A`aihBFG1QNe)!;rStIbm>8rdJUSPj zY3IqvdNQs|^3tyG?Zip6GmK$>cp@5IESuIO(|BMI)oV1uD)j&-vvgcKb`K+G8|)hP zrL}OF)tB#Q$Hs@$?&OV?S9cl|{K}^LI#Qyeh|f|| zvqKMB8pW_LJQTD;%m6H!4Sk}t1mp@s zjE$7fI%E*cre6jUIWhRgvketU>k1bLMpdNnEJ zUUpr&c!3@z#wrC;nF>?20zpuqHZww-euD*l{c))7NSAHJbZFZg2ZwH~o8`!yX0@o_ zWdWt04j5MK{;gZo$2d8O#FT7AK%aY=uiLs{YGzH)h`rPv`ZWXn%eQ^;;fa_x>x{SI z8%&O*+=|pwUd3IdGDIO)Vr*=HR3gXNOpRQZ#;;?W;^^c;v$3182pdAMO9N(1YQV8^ zt?_O2C8>_q7`-%AhZ6G~DYH@eNhlF(;%0&|^tkepmDpS-35~K=4 zj1A?;6;ed=7R+BUoRTH)W+W#FdjCa&Zx!>>Cw`Wi%SO3=DiVwTia39NdD^ADorqZ@{H1ox~+O)dviQZ+xF$x z$0e9sn;|za!BizdkQ-rQEJvm=#N054eM`Tjb=Wk*Z~V;A_KgW1bDR=DQPqj2?ff~` zyE^qoEg?J;Ku*X&U$oYJ8B<^WQg_>>Ut{s@+qArln5qg+HS1!KdXZS238se1mligD z=C@X1W}-qWYEU;E&mdP5lqv-(BZ&NU20>M=urfEoy#5UC}2AfQ9d2MfnzzH=sPqVhp3Ch<-_HCnaD;Wg{RK$Fj*kA3hQb(#jfKOopCny>n_ zqe-8Qq&!?g`{r#Jy&|9XeS6}VyqMM@UD=#mhFWd#5(ChR4`+?0+L2H3wh3fcqb02B zSZ-(*=j4!EVu`z-|I5pZNp0!ayBCfz-x28Dg~PcTRL073x3E-&iHYht>)VSd-}WSZ z(FfFWs>#;|Q`k1n1=DJEX%m>l(15mlee5ohs+K4OJwg>%6q~x@<=uppig7F&UY+DK zn-~`Ag_DB=V{$t4bz8@m-0on_i1}kN-8KXdyG9&rxr!BSOfdCm&!|4eOmwrP@2RQ` z?cWv~0}tkG8_lDSeQ~NcjI6$^_?NE{L45|&RNPCbwG(sAM)Onm8c2+rGHY2!er;Bb zpb1Ct8}tRCR#h3cU@V3kKETbPDMv%rvOG*p74HrV>ni6n7b^x_a%5D$5UiA*e7AiR z(I0x_+;9v9{Z=x`@2PtO@wr%~{$)!)9^J6`nG-1t~AAt_mm zy?a8O{$2-hdHj>_O2wm-hl$hoTo((puX;zmxMTQ0apBFZH)^r;?i{gEosr_PxW{6i z?(OfKM=k^8D2>BO|i1qbF=Xgc@%H0qgDy(D zE-n~6LOfjf?#5b@ogpU2Cx~g8_r>L1TZ*5Y$$DoqDSMGdeY36Ms~&n=hrK}j?zwz( zJ{!4Af#-l9`RJ)RsG!yOVMyc5k%%vk{})ALIxkxN=7);zgPGQ63Y&gdjWFp8T3Eb! zUo+2c;M+Yn$S=`h-E#?ZyoyMOPNan2R|!y9*yB*e@a^v4dSgiO?b03XqY@0tbfA2@ zJRCt`OyJ;eX!0iGR(jCAXDEx8?Pc4AT8s(tz)1QAj3E}0^dN~M@%MQ$GE-~pEKO1T zBcvs$p+w^4D_M{$Tz7ZTw*kN|Y`P z|9O4+Stc)QOF&`bNKj*ue=icrw2VvXU>Z1-8O3dvfxv#wWb+Y&-etURIry(rrK}&X&&-K2%nIj9&56Yk1@B z##(UqI7?S;BPv^uS;I-pZJ;FSK{Q4BKga@;s@PhYy_NX-&!~v;&u8ZT^>nxwJg6&9 z=JKfsas^q1f)dedMU36*5#&+@nS}pM=rg%`{0bR5$0b}`p5MAE} z+6=CoxJst}*|_vNJ*w)psq10;)V2Lzjn^jO{vR0PKPzJXw;^V6?bsF4b;5J9KtyTh zNkC0U)NfIqua?b2J(>)j2k zQn>#gkQM(fS@0+3cvri%SMATAgXYmWe*SqAS5id;0Um7qh7UTlpk0>2GhYW=Q)m-W%{azg){IC#)F9 z_HPE$Hn;^LUB2K%W+~B!W;1o!%{O~#$s=}sKbo$gq4b}9nCyz&sO;-2`KVne?+u#B zj>sa&KE$MH8@Q8J{ATY>*u|$kI?%D(0OlS@EbnW{1Gdi@Ntdut27GsvTp;htY=%rd zgYFHOv?MKxjT5@ls!4lh?Y#Q5(u5edgYn(k)3N&?emIf}nkd#TTFlG9=y?&pDc?6U6`=(E|ABCU*|G!^Sw8d#zj$Vm^OsYty?pA{@L>6T2V*R*@X;f z9YW_}-*W7M22!^(cH&kNinMPw2RY}NJ+KW;nzdo@)QvpQR)p*89x1?2Q7yh*|54EnY#WGN4G6x&4IYTAq8|i4&TVA&dq7i zv^#SSMpO7;Jwqn!BJ&Lb+r->(ejMI~7EN2wuFvOezn=AyW=gn!cs7$3-FP!4P#VYH z`D5uC8bZIB2guNff08@fA_^hr7}KV&Co-kz&4!z}hY3A9(y?oQX77uykOhB`J0cWZ zo5SGAr{72xpv&XN&Tr@)8cg@kRuY+327*Y`+KKdT+k!5Azam^KAQaqTZM;Li^{ue9r)Q0oByjq~DGD6l zqhGKWrV=10f=1f5W0E&C4x^rwkRztReGJ4W7xUMoRWAn#Y9_I5T-1OA@>pKVu#<#)M!kmtv^4 zAYtDkju$;|al8m+T-vaL?a}58o;3-lgOm9Da4Hl>Fl*RPs6U>?h`O-rr+HkH`d}Tg ziM8QLXvEibHj&wVCiA%6M5YdFOw{+I*pQ;*`ugSUjI(Cw%!xSc{elUH(=l}PL$_-x zn=)TNf1=b7*P!OOSCQ~2I*xMn8PBY~Q^@Ezi76k|Cvxs6HmBKRn{ktaXU>tVeO+I( zSvzVP*K77;`d9raS@0-NpN4%C^W!aaR z^XWQlN6%)EO9q=(tmB?0mvtkj66rILuc!8(Pdv`?iW8(ee7)d+b6Mh`5I!>0a%_}#Il>YukS4BEbTpjqcujb z@W*fXxT80!Csy6fHLQsD=d*8S^I3ZbRF-uVlcgGQY^W8k=OzK9~q7RvRMNPx^#xr-p zd=@VLmQYeDwN#;YsgH8cL{=ofuCD?mc`3xD7&Ca@QWnpjLZ<+GWEM>sGi4^|HpUOL$`)xs~--<0;j@uCqye*KZQZt-oN}s1`(jKb$p5IwH5M{Jq>cn2Ld; zKkS;!`i$4nOC;sS0T!CLq11JV50pUKxtkjWHycKno|mQKR=-b%(TJ5H``5USl1p6L-W zEt(rqcQN)2#$Hms39Av(oo;RFVx^S+&LFjK*$~;?Tikw_{Q9hRL5kYW4R?FvXYbIJ zQlu5IaIA%!sj9q|nM{p^nG&hO1angvprmo@KxA2Wxpei}jOyZ6(=l)mr}YAw`v;jc z|mDMcWet)F+q+ua>6?;u9+Oasb@x^Rv=aaM$ex**e)p~Z_YzOZJ^)Pp>gSGpv& z&l<;PKkO$@fIHu|q1m)cWZ&Dup6r&4?Bq{yXhW)z#Et!1S%1TvfkXQeT)z(Wnzh2q zM23xLBO2DqV)y0;PZy<-vzs0Pz1W!v6vwf8NC=;9zC^^M$JqD;6XM^L5xtB!xbYTQ z_kUr3UMog)^d~elh$siYo{dU0KiQk&`)melI&7+R~$AbNm82GoVc|JC>g(`oR^l zEyL*EupR@uI}myJI*-LbzWAaFD<&U##%tObmVG*muQpz!M1X4(8`E?~1i3LgIawOQ z$8G%S*tQPR%sB2I+sf7l4)pHaoZ5k%=^t9ij&%=lZq^uQ^F)pucrI%xZ3~_J`f#8S zNRMFtkZ#P`eTK6Si>ck970vuwF`}o8-76!=h}q3qO(;WJ`_s9dANs^QM8-NY?sG@B z%{|OhJ6xZ`*>(S7=%;H*MId%bf5IjnB>mocmPWVY`>E~ms~teyfI8SJb2zYgB5isv z;QVh37&Wjz6E??U>eP&G?aKIh@vUd{Dm=!AO?$KHQ3;UC&X4QUe|-{aGbynLexQAj z3$}hAu$5;gg-bs3-OE4|H!gk=qF59GS}p zBWH0o-k5;K^$DosM?iops{9nP^-2_$?)drp;c1`2mD0KlZs~y1v< ziDc%$L41Gc9(v&1xIkKbcN>X;0<}eT0&2VC}Ra`j~1 z*++!3J5vTV#;<;30-Y=oq+U$;(uQ@@5Af91)TOff`%f4@dk;AR+@0Nl=95oQXxWs( zgF6xASCz~vLJUaz3TSj z*L0vXiSn;gy12NATi=PK68G5M4)~4v)ldd=l%BkeeZLvmBm`KZtl6}lH>H_{PhkG z6B6;P5l)BtEtt^XiL<*Nll3RuDPw-gjr*>QnHEUo_DGUTEP0Eb*wafGGGrO?D0sK; zGkVY1$;$_O`So=@CJbsuz2;qLUn`5#+s|_2#XEdH#GUQ;FnYFR{3t7a`R4Zf{nFoJ zR?neqxSI-?I5(*tomV|1HQ_3WE*%)uq9Mb2SK`IhMCtQ=w@{#s-oq!8W^?@NaSpvKL$7XO)UDTpQC)N#*zz3rpsoxZ z(4N{Mtr<9KFdHL$u(J;0+Z&PZg;s8A3Mq+NeCw2Z?>kf#`z!w}dR;;YRwVK`@f}9s z(U;9|cX7kr-5qx~SL|Jbn7HN)8Yu3c^QXeh!hCWva!@#YAjm?N5p}RD6w%uY&6Rn*sZqHi_4+L3o(7a|m1x+YF}fQ&i7rvxTzjx# zzM9Vm{J`1WGx8#k9*JA|<#DkfP}&h3+Lu;-5BUC*Sex6vd zWP$$ZMN54|hDQ*2Yn$TJd;^vMcXHzsA)r5 z`T`1r%8>v36*$$WWi?+CZyzPDM0@uhz`EH+ruSaW!F@|PXFrZlTPw)4IAL>V4gn2k z@XXDT{J2+Syn9Z*O2PimJJEmnP0ZFNa?-MJ=)8dLvEQ??#3WF<(!66gDq3!`VeV8W zoiD?*k!^6zh$h9shHX7Us2EU>Axn;uiYuKaF5$rPe$?x`m_z3x*)gFSs9XqX*B{sG zYq(f~t`2QkGtZrG#&6{Ej?v6d9?y@%s$k4XC%sH_=AC@Wt#R2bTzZBayt#TE(+)G$@0@ zsX13V?OpHGQ)_ber+u9Ic_1UA2lC6O zHBcIKytuTH`tD^22%F6BF&Q7Q*%-OAb_>culc)+%DU3E{EZo0ywbYVVl>dnDr{?o% z#P{s{eG4!B#xkKnJPT(2j_-u+Jc@tAh2b%b9($6UyjWhodBi6zt5BhKPgb0bLkoEH z`@o1PX}jz8Z>Ez>H1dgmT1N<-B>^0mM;eV!1-Mtv%YWw-}G@JOJhM5 z`!lWDPU4~-3SK9Yne>S44{^ssO-|xFtU{;LJ@r?%J}wpnN*k&*?N9qEk61SKb7r5^ z(6v`rs#so-;U0{BQ&T+auf`ncMc$J~WGK{s#GUvz6kttY&rb-vv6w?8x~5HIzMfT) zZC~!-;)aU2)Xu5G!j6AD%@wU;~fi<5}jmhTfmu z2W+X;xIX3V-f-c3O6f0f@9_((%Ppk+Y!!=t>4mL9hsmHvU1uD>?q5m!$}T7s3KR+@ zN*j0De!idWi#p+`*CUvL^30g&!>`|+D~-b`Tm$LbC!ECJHN0=~NZk@#Uspm=GR-+F}9BVB46Fr`Yn-;_L4fs-TZp()uNn zrr+hG6%z@z15qeZI`|T?a4+j-hGDPQBT6Nr)8gK96E}{}ppwOiMWFz!2yIszGGn=Q z@4cVYr~hUaI?Q9hDp%&O3dhQz$86AI({wgRk1VB$r!6RzC{Unu@~7Wdds+Q)3+(hp z1QQUz?9aXUdC?h4B9V$RO&HU?D(5!tqg=QCgaufmQYy)RaE=P!KjhV|byU3jEsJ-j z72ks*&Y|~V1}prkHlj(5EDrw`UpiNZ@U?8Lx`I~Y3R$ve1kPwNDBP(Z5<;*Wl<(LC z^|Kh>8iV*DUQa<<8d2*zaQFKutc?+%91|v2MXze4#~Mfo694abh_l%yvhoNg0=-CsnRZ7(G%sTUy%-30fn&A5Nspy)>*)vI{b9L*snIC)?(Qc-K#oPK~Z_r~h>QUDk z#kSv8)1{hwDHeQ)J5D-XF&6mp>2zQAe1DG2k~)9qDn#_@O4iYhq*d-jk7lk#Nfjm| z6^8BM@^9lPqt{_kDiPy9;tqgQ*~awhr03TSPfF)%-RvvY*V#pz(J3t4GnsN?#B8yk z@(Ja$bzAwgM=;iAbJ02d4?)6%LBj%xIen|tl2<5gs6FUw+9!X-+US~09v=*56BfM& zmoDqLcH(malqM7^C1xNiJ0Gpd8WT1}#0CNu3m-6IsBN)P8PNRMy=$dHp-`augOglO zo?eNQts1ozJX;w-NR1FeLP7|sRg=J)ZJ7JZC3Jtz^gw~5Ul?nzpJz(-B+j1t>%gk2 z-XJV%001BWNkl-zp{|9mLu7D@*v+YTEW@abj*O?;Kj7Ky@0LB@7)4-VzpHCRq*&;EZIh|@vVbr zW(=8XPyC$>_g--7lvJOCy2+XqnaBmpC!@M}P5fCuq6Pmxf(j*@+gNKcZyaJ)JrxjUG-r-cOA|8IVanE=_w%VQY4tnwmt#B(-#0}=y>r1*m zUCvKWiXFsKz{}?em~EXYOnJepY`~`uWwRgfN>zcNN-C1$^6;orhq6{?vI`Xicv+G0 z=p9Z$m5Uf3>^-Q}rWf|tH*mE?AJ9DD%yTcA1?O<#eEbInwiPO+5~WgA1YkaOD4P|- zYgKuwS5%S`Ux<4Z-=Zf&C(t$b6nmpniW$o-WW`7Eyr3LqtX>oI5-3xhvf5X?G5Zoy z*^W2&((tGqjJJz7l9PtBgEf+pg;m*dINKEE#aHS-mpV7TVs8o0jOh*6o++qV*~IN@ z&&U_BEmsql%qJA8T_~f}QfRWqvw9oS zcxjD^SBZREfd=JMxOS@$+{@#o(2}mTC8(SgsWGXz)~JGKxnP_!pP^Md{?>47i_|PmklM5G;0V|Z4DAegO0u&Ttwy{Hn4W1rF zImO=9n$oDUf|P_JGsvd>EV?CaWlL!s&OpkG$GkIpVXKYj*;^xEKv#n3&b0_{>A-_a zMR(Wo=pN>a6%2VAVky{VVV68^! z)q$^foZ-Ux^IW)ehbzAh!`HJWAp!LWwg#slf1J#Ph`k?6rcMA08IO*z?5p1hTDX@{K|uOGX03Tj*A-{Db^SU!hE&92D(+nDQ-@~N z{djxh7%xgNHS-#0;>**tY8sK3GQr6U4_j;U3rzTXSdsng9gbBi;8FfhxRa;Ety~eY ztwYa+bbY>(O^-?drjUfVc=Xn;=+j=1kXeES4|%2VC%B4=q}W_MYS*ExT0!myxZ_y8 zQV|x|x>2+J09>y9$fXj`i}n#`V?AgdoX5rUFAytRoIEO^%1*-0&K9f8Y!n{exD=Dn zs?;hJDE}ZQteTCbOW_6fM<*7?NW)+GAsk%Is^}n*{R24>b zC`-(*OIiQ8Jd4&%B4zz@uGrM2b+cOJomkDW{4(T5UF5N*B7G-+gwM0%oPAx0Xx?&a z`x%s-KW1pLhEF!2Y}uCv%9otGc8_dJ z2ET8KqUN+I^r%ybwBtW;s=%AfJCQs$S0!Rl8+>g6yr^$~kjYzJ7~Q)%88>#aVp|NI zmaU=2)4d#wwWV2jYiut4$leq;Y~Ebr#5FTL7fh#qel#bqKP2Dsj{U#fqt2%v)2X68 zpu*KbP12*2+{tf9yAVCU&zi)+DvLO=vJQJEe8rnuU1(ayK*FtK>^*RXr&$K9U8@pY zD+D?J1N+{&W0i1;Gq)A=m@$N4M*wH)yI$q9Eqc25tcyD7BHzzmjpK}cOsx>jmfepD z>d+mZC%>^b&V*g=Eq>kgmi9}&psjO0x6d5rxhS~0{~E4c`qQI+d2E!RvMq;4_HKT> z5zOE)SFW#}%jT>wHmo1Wy+w;GHJ~U*EvvnJvZoB=dQ>Li)CSg^ z%xBb^FL6AziIdrWvy3+3c7+jx&umaB7J^TPG|duW?&EQ!lV(Zxl9uWq7)GABnYwG9oB} zy@#WC{VJ9l7fx_3(SvRydlTpk;6?-IGfdsAVqo783{Q{o{kOjnxL^knmJ95a0 z^EnXW`hahDy`yQHMtErMuxj!bWQ{$-%C;$NTzLk+4iS`new?F^QV@ME@eeL@^|dz* zYkBhG)IOeCdyshc6pyWH5z(b7WgS&uRi3J*UCcXHi7}mgc)0gF)ixM2JC zGDjl~^jJ89hMI?*z7}1IJ0a7i(xtK^pv2kUhO{R~xR_Rl&h>;tvnO+){9KN$Zos~Y zi+B~%m9WaTJUq3JM`mkoAG(TdSWhCFS3&4Hygl-x~|um zy;Vb(ZuPNEy~K)H%d!6S0JEw-;^*zrgmmbJUrIEu%hso{Zys5u+6?Md2b}@jTaI!effeyr@Ax?b|wGn zZuTd6(zQ!F{9XR@O3L)JKXbynFQXcKpfZ^s}E`r~LxB}Y-2#vR&I&G3M8SEG56kcLA@3+nn76T})c6lhfVRt?0z ztaGvTr@+bIi>T$x$Y>UhU1k{$$*~%+zjuTCE0Zjyq~aq}1yb01jDCxp@9QPTfCe zUe7>mO5Cva&Zsh9aPiU;e5*O|FsTv~C$yuSXD!-POXk8;FPa1j*LQCx#^iy!RUYwa z?lfxBi0}@TNjPzgs8lOjjhoBBV8{0wR<$5fSAI@p)n0_kO>UYZm^ZQ>70Z{!l%Ijc zxi(#T)gt%CIWEV%quQu%n9o4seZR{B(;;K)YKDr?Zx@d>BXJM!)H#&~!J;%}eG%Ys0<_ic#v>nJWyNuL(AXci>g zd14{Beq+L0dT{UHF`|-<1a+Ipm<|<+cq)w=G)~oNRaH~ag|2JHV_oh)@KU~au@)Ga!)TS+;P3ulYB;UEfg&Q%%zS2@})FNiI zD}&OKO?--;s`XpYIMC}44KfvK8*EjDT>0%d4t1)KoZ>{UfgP#p7ea>`>70&nre4J~ zj_x?bjmK}GS{J5`=|y#SD=3KNMoLvik8FRgy`ws?UIabj?ZO@@yfM3YKRrJf+C z%4NCt?GoNK?}%e&8Woy!r(L~Tw5g%v(jyz{`loQ?wHy96Z@G6ThPX`dZ_u6GNI;Z^m}5O`WQC zym+O-w^~CwbqV0jsbk!JW1-o&1q`j>glE;tIORV70C$40EwPU69C31TL1|D?(L0OC zIA6w(3&+Q+7VQF)Is4d~&K;Xj)w6(WM=nxOvp3U*gyZL+BK6!RHl0tUeEllqzj%#! z)}cXF=i=~l5NSWm;bNs8wBROJ4G}CHU7rfRzDQvjDu-a&4eUi|Wml9|Zj`B984)Gc zHa0~e6Q%MWO9wvWbjpZ6AwT`JP3~v@=Nx}Gc5akkj@_2*zroq}YsQ|_PK zBbVODzjO`q?;VjnSK_4bU&=pdl2<2xmIF`p|26)&zj#KMa7Rv@yC$y-{H}}fU>xp9eS7L!#E3qfH%JDeUf0NJfkJHgS ziIwO!>l1ISBsUs8_u@>gnLK~WMvj$Wmnuv{IBXV6QZ~omj>Pq zX4+c}3nFIBCJRM|l?tVj;`u3x6O$CB(cb?vxCj3|{yqLZ{yqLZ{x`}h!DKXHwg^g< z5~WgsvRDWxl?whRh`K~9n2g4vCZ8rVDy0IYmAXifDpe?og;o(+;d`q_`G4Ei{h#rU z|1bUCf6xE_f6F2Nn^yM!viU+WieDNt?m0sUm!)S_|d7Y$5OO%+-|5jbA2G$IBXpb#9q_2ykHgvj@qSsNKBZdI6(s$QS89_E(aYZvYa2T}0z0$(#0xAy{H{-E zRK=ePer2iAbrDh7S)5uuf{zwl;;)ZE28WjnrK+nfHr9>=^;yL;jexn3=&d6Oa&^Y1 zL4SU_o(->lphesHL}lpy28!HZT%EGm+dJS=t~TS>-NHx~C%zj-kf%M?YF8SJ-9eHO zULE>~rhWIK`Aclk@ZiWI8hY5Ewz8#s*bFYbE&#Ng|Fji8_6q!Jf5dfBph!Q?xS=1j z^I8&rO}+PwMO|y*;pBj$vo9TI6>)dwKRV8g7G5Y6E=<}RMIj1w*CtRcbnV~jfQuoU zt7`{S&BY1drX$#O_uW6>PLHpzU@#`IdBJFAuD$#Bu;A4}CbX%6ucs#s#{X6{7jq$x ze*c^%D>HUmGGTOMtG=|RBt<-`zTN(@1$4HS)6*7^|!E~ z;MP)FS1gBb#b74w8e5O`w!jhBtN%Mj3OdtgJ?855qT>s zx`)Y#ZTCeaT~^k2m#znMiXJ!Wq#!p(a&mGcPh%31T=}VWbs2H?4=)wHwoo)WgIGkw zq|KK+twk(3XQiJ{4OyKel5=I94DK~bjwdC`$}TNr)UL-Ok}BWV^N^lLazzt&Ql|Il zEj#~^Bw&z&+yXIJM8skiePMx^ELn2wt1;4l`p=RoM%mppKw58#6Jz=fIa-`y@ODXnooXj%Hi80|abX$~YOz(r3CWBTA3Up!?5sO|U`C7Ax+>=qhmF2VhW|7Qm@=3FL z^7Z{JIkRY_4ETJzq>DjzcC09^H@_5%K2{bruO(kT`a@QV6y_I*uDG+Fu`pK(^m=)9 zd871h)?K#8iHPJ$dcHe4EBU!Ol9Q7w`Gp1%G0E*!pU8*>nL& zj(?aWV9`r{>3*3+S6CoAy;ibw3yRL0WXjq`uF`CKiWm}qmtNIc$j%&**Sls*&yfq| zPJu@D_HHD@eoy!y)NB!>UL%DXy;wxVtSgXwjZwsyBS{%Wo0|V{j|^`SCM%*+X0@0g`zQa(MCj~l#XbSTrPhZqL_29r- z()gPzQef7}o153<=B=I5t8Q<(U=R^8%7r;YWY~(MlJddQ{s9Y&S}7>hiP@MZ$r;6& z1lnksRili2bjc)=mnv`LF3H?py=C^E8a zT8&Obl4MQqw(`->x5XlvvbuqXbUBbIg>eUDV4Y^NGDbv1D_Qv(5y_LE+Xc%p$R5w?o;YOE@btx^|bX zum1@ah*|W7`C>F@%c*ZCO24V=BvH)rThBlVTmM*0qLtUTuE_b5>!n}Yv2xQ?w4X=E zb&{c*Z%V%L&sd->#exE@Sw!y3nDSL*W|UFH{8VDEoRRdbT*=8wldP;f(Q5Ug*Biua zHjCM87R&!a!bx^|n#8_%CGl@lYMQ=3!5esq) zq%b!_G7?`%enz4cW~GWzmoH|cwkQF^V*bm-8YN;T_0D<*cb&}HG#!t2e8!;ZKk@M9 zK`yG>GobuiVq)!S*VCJ*?PqzCnT?lUMRe%}H0)N17bhQ(V=2$@d5t-@a0jJKQ>JIE z88?KP+i#PvOJMWBM)djVIXQ2xlI9&oRYMNWfqocMGDy0*i}Ti<7+C%dG0z=n)768! z2jcPX+#EM;BDZhEmugt%qcXwOEt#t&jgzaVGk)GqUTZTsGA*2L%cIDC zdVt%mz3AwiLKM%0ioRg)jSeX5Rk$yvR3ErMwpzDLPvAtHh%N_t1GZp=-;c&X-Q^%l;u1RlO|qFEbPVs@V( zI$uFxd3REi^|T&PiHG~5(OL)4e@Y1FmhPvdmJs88zUtS9d552&D}2Vyqnguw%_C5|;_Z;fo2R#kO31^ltPgG;RcKPv zm8APoJbrM4SYs8M)Gdog&DsQ(H*odn{rA>Z)^SEO>B^5W`Q$x6&SwMrvf_pbS7!$b zQ{NI7bB&kEO4KcHOYYO-Joo5KBUJ_#?{e7dGKhO>MZYiGac{-$_ax7jJnroIl9A)T z=Rtlx7r*RB_l3tvGrQp9p(pWK47VP<#Nt_n3T4YuqfQyLtspyQUP>;ebkS+uK zIltxujy&B>W_IeqR~Hh|=fv=RpXN+Dn2nvi6IPlu5*}aSvBsUC^3JHlhVqS@5#*ub zy@G8;>(Q;qx^RUDNx8+^yM>JCpBUU}Jf~81Jl!>y!Bbao^PL^#JQSq9jOE_Vdt|x< zQPW!mPG#^52*lk+@qwqzmyZ@Si}&p0jS!FlKJKPM+>HTLv|v_lD=>ypAN< zt1UsMZ0xJ}BI#KqUf#ud>ko0qlRNuf;MbuU-jd4AD{-Y*ASwG9+BAaA&ordp-O1FC zCb08NBzH}fY2$C;LA;W#BmB9u{T6THFYwl90G-RdB`!V_rIi|RV#MOMTwk<}Qknxx z24~mJWbEuM#A~uR_Gw4DeRrFz$NRbI(wojM$t0USspPBR`O*DcHC3bi2e@-*$9-%n z)}}?63m3OuevbtO7n#_q3(Ia~pi8~Z*Zn#$d*1`%^R!g(D@#tQhUUF1@$~Qm3b3U@ zqfn~4DY2MK7S@`spSB@>*KwZYloS>lNVvFyVf{YmYLn76o^WDVX-p>WwZVdE$ zMe@5cxK;KeC%X_UwH-EUD^yl0R903f6pA9N=6@jx!`0J^$`#5{#?1vM2OAu1t+7_C zP^(lZRSFQWw^D#uFq@0eK$q|<6WR{IN}V~o?r2vwe>9AxckCH9VKgDmnP{ASF-6W}==38Pd|c5dza`IXMv;D#rC%)PcD@;7 zRwjie!7FSQJ@S8KT}gKis~XJuZa9W>zp`@17bn(M*VGhG*9>wV6g8p3!*oG1jsO0XQ>%1*yOjea2!sZ_vuy5Q1mhQcdf4_zF zuWh72?TYfjT1HOUPPUgb#&^l2yuHDejW_AK{SglzM)TXuPLx%Hs>wViD%Z0#vY3iS zS(Y9X#!^QS&6@FpS#24^j?WvQ&VGZ&-j�vzWU%8gW)rn36z&gBQyCYZx(QC%N7( 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 Date: Sat, 11 Jun 2016 10:05:39 -0600 Subject: [PATCH 037/121] v0.1.1 Issue #11 MemoryError Fix --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 354ccac..f923f24 100644 --- a/setup.py +++ b/setup.py @@ -52,7 +52,7 @@ setup(name='PyRIC', version=pyric.__version__, - description="Pythonic iw", + description="Python Wireless Card Library", long_description=long_desc, url='http://wraith-wireless.github.io/pyric', download_url="https://github.com/wraith-wireless/pyric/archive/"+pyric.__version__+".tar.gz", From e2577fc0460c497d32c79cf9e0069e750fd70501 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 11 Jun 2016 11:15:37 -0600 Subject: [PATCH 038/121] v0.1.1-2 Issue #13 fixed MANIFEST.in --- MANIFEST.in | 3 ++- pyric/__init__.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index b49c2c7..1d8b652 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -5,4 +5,5 @@ include LICENSE README.md TODO recursive-include examples recursive-include examples *.py recursive-include docs *.pdf -recursive-include pyric/utils/data *.txt \ No newline at end of file +recursive-include pyric/utils/data *.txt +recursive-include pyric/nlhelp *.help \ No newline at end of file diff --git a/pyric/__init__.py b/pyric/__init__.py index b6ded60..4fd607d 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -137,7 +137,7 @@ __name__ = 'pyric' __license__ = 'GPLv3' -__version__ = '0.1.1-1' +__version__ = '0.1.1-2' __date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' From 1302d1e9354625003d23d0d414ba5208e26125e2 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 11 Jun 2016 11:33:53 -0600 Subject: [PATCH 039/121] v0.1.1-2 Issue #13 fixed MANIFEST.in --- README.md | 1 + docs/logo.png | Bin 0 -> 118413 bytes 2 files changed, 1 insertion(+) create mode 100644 docs/logo.png diff --git a/README.md b/README.md index 7918f7d..fbde213 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # PyRIC: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester +![](docs/logo.png?raw=true) [![License: GPLv3](https://img.shields.io/pypi/l/PyRIC.svg)](https://github.com/wraith-wireless/PyRIC/blob/master/LICENSE) [![PyPI Version](https://img.shields.io/pypi/v/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) diff --git a/docs/logo.png b/docs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4a0a20cab80c6d8fab00e1a251080d72defa90b3 GIT binary patch literal 118413 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 edj6a2_doU9AoM5ZX(ig z?X~ zobMQOLGwh{_hf-yJT5Cy)_7?%X6HzU$1Gf8o%-7Djl#Gcxx7qVt`$%9O$$;xTk9#X zom^FqcY%Xdk2qoQGcL4txr3$O5>&W|%K4AP8o9n$rG+I@m;LO zW{9wzgknulv?P!SzLvl0!23i>Tk>ekB_KIdaF}$U&}+{a3&R46PpCzL4a6MyKG@hU$(_g2Vaq_@Gh;}ZyL05* z?_BWG;ewT)ky+@p2A|?8yxjz{3zP<u$b#TnQlX2?6qlD-f z@`jF?UNSC6GN;#L$abd8;Fbe<7?|e^mP#oL&tbg7%!gik@L08QlEk#(!GKFJ>bjU^Tn=X(e->d44gVgat_IfgOs>A%^a5M ziF6|H$a|iIj`OZ#BQPPHTRo_>MR7TEloKzBa2ygh*T!WjoLgZlRoddilA-Ilg>m2< zmu6gqKn_)@x0LEsYR%h-Yrw;<^JXvcMk#nvv=8{R%j92{# z8m-EdB3;+v)S+76J67n6ac3I&a?bo*j69xazL`=LG;Onp)4f9+n;cEQ=Vet|Fgo5< zNv(|+fV-+Z-*wzvELb|vgMhLp5i<(#DX7#*l`KV@FaGoMK_ zWj*oDQuwQsIB)ND2G**KB23LQC^zmD?LFUdju*NP>3g2^15+0oXRhGAuXCpcY^dMc zNGV}h^&iSrp!AahcTxri4@`K+InEHwRbf_@>bvArt`xL`bKG{0pBpFs;dVorCjJjI zzP_i>{xno+dJ07Rc~w5&_Z%;ml{@r`@zR~bC(kBUf0_8BQuxzS_@HIYtGz&X*4kHN z(_hp*xuN|^O$f6}QV<&Rb)$5A`Qp`-g#0^I1zdgZZrq%%ThRLAfc6W48V<)cmX(2xDdzNB0Ok5bLA#AIv2*)w>NHN{O6{Lw`1gSLq%DW7_v5qu0oZ~7P}N&iiFLU zG*66HK9<>(r?|L2P48=m+Iur4ZZ`4IFK#zD?}_a&x>CJ;yftA&5rQh`N0GO6;^fTu zUPI<=ooAbKb>TGQD9*fGjF(I1EF~TQ?>57=sSW>SnrpecGezq=Le~*;K}%*dW9>Yb z*p+0yD}_E6yb2e&puuyi6mF@~bsZ`ziBD zr`$B-j&p1~$B#|Wvh@)lxUStQA$D02r02h ziRW@=CBm}nI9Fv1fhcWnmV_FRGe;uabdG~kxRVQ?jx#A|zHP>j_hw2w!={_3SWujl z!duhKD>?H?5x(>-<2f@Pm%@KE;~R~PyW_p|tpdx9%$@csva;9a+*b+M3Br!K+EjE@ zyOvwtvzjLEltOUIlbAU3o=0(JYH~$0P-47tqWxGmLj*~gE*EZ;ncE`h9GRRl<-!ds z+zFnGlzAsb&eSnhG4`uVU0N%0AwqAv=U6ZPZAw?w`*F_PY?tg@3P0SVH0U$@&h#nB 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

=lC*rK4NVcW{0$~w#pIkL)1 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 Date: Sat, 11 Jun 2016 11:35:37 -0600 Subject: [PATCH 040/121] v0.1.1-2 Issue #13 fixed MANIFEST.in --- pyric/docs/res/nlsend.png | Bin 90242 -> 0 bytes pyric/docs/res/nlsock.png | Bin 123683 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 pyric/docs/res/nlsend.png delete mode 100644 pyric/docs/res/nlsock.png diff --git a/pyric/docs/res/nlsend.png b/pyric/docs/res/nlsend.png deleted file mode 100644 index c31e5b6a4098319276f1d39192176ac0d0681c72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90242 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 ND9NkK)ykNM{|`yXupe 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≪sab); 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�vzWU%8gW)rn36z&gBQyCYZx(QC%N7( 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 Date: Sat, 11 Jun 2016 14:08:26 -0600 Subject: [PATCH 041/121] v0.1.2 fixed pip install errors, Issue #13 --- MANIFEST.in | 2 ++ README.md | 2 +- docs/PyRIC.pdf | Bin 383238 -> 500729 bytes docs/PyRIC.tex | 27 +++++++++++----- docs/logo.png | Bin 118413 -> 79227 bytes pyric/__init__.py | 15 +++++++-- pyric/pyw_unittest.py | 0 pyric/utils/__init__.py | 5 +-- pyric/utils/hardware.py | 38 +++++----------------- pyric/utils/ouifetch.py | 68 +++++++++++++++++++++++++++------------- setup.py | 5 ++- 11 files changed, 95 insertions(+), 67 deletions(-) delete mode 100644 pyric/pyw_unittest.py diff --git a/MANIFEST.in b/MANIFEST.in index 1d8b652..89eec76 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,6 +2,8 @@ include LICENSE README.md TODO # Include subdirectories +# note to self: even including recursive-include here, have to follow up by +# ensuring data (non .py) files are also referenced in setup.py recursive-include examples recursive-include examples *.py recursive-include docs *.pdf diff --git a/README.md b/README.md index fbde213..cf38435 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PyRIC: Python Radio Interface Controller +# PyRIC 0.1.2: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester ![](docs/logo.png?raw=true) diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index cce769cf5f4de1e2a189fd49679fcb8fc075be65..8d8da946a3fa0a6ef117c6e85395d73899b5bf43 100644 GIT binary patch delta 189426 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%0AFZw?N`2P$L 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 delta 71287 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�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 LBrlIbn}hxh_u~ox diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 6efdead..f8ec2ed 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -35,6 +35,7 @@ \usepackage{caption} \usepackage{geometry} \usepackage{color} +\usepackage{graphicx} \usepackage[titletoc,toc,title]{appendix} \usepackage[T1]{fontenc} @@ -72,7 +73,7 @@ basicstyle=\footnotesize } -\title{PyRIC v0.1.1: User Manual} +\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.2: User Manual} \author{Dale V. Patterson\\ wraith.wireless@yandex.com} \begin{document} @@ -840,7 +841,7 @@ \subsection{Functions} \item rf2ch(f): convert frequency f to channel \end{enumerate} -\section{API: hardware.py}\label{sec:deviceapi} +\section{API: hardware.py}\label{sec:hardwareapi} Hardware related: driver, chipset, manufacturer and mac address utility functions can be found in device.py. @@ -852,12 +853,12 @@ \subsection{Constants} \subsection{Functions} \begin{enumerate} -\item parseoui(path): reads and stores oui data from optional into a dict \item oui(mac): returns the oui portion of address \item ulm(mac): returns the ulm portion of address \item manufacturer(ouis,mac): returns the manufacturer name of given the dict of -\item randhw(ouis): returns a random mac address given a dict of +\item randhw([ouis]): returns a random mac address. If the dict ouis is specified +will select a random oui from the dict otherwise will generate one \item ifcard(dev): returns the device driver and chipset \item ifdriver(dev): returns the device driver \item ifchipset(driver): returns the chipset associated with driver @@ -867,13 +868,25 @@ \section{API: ouifetch.py} The file ouifetch.py retrieves and saves a tab seperated file of oui to manufacturer name for use by hardware.py functions. From a command line, type: \\ -\texttt{python ouifetch.py}\\ +\subsection{Constants} +\begin{enumerate} +\item \textbf{OUIURL}: url of IEEE oui file +\item \textbf{OUIPATH}: path to default location PyRIC oui.txt file +\end{enumerate} -Optional arguments path and verbose can also be specified. +\subsection{Functions} +\begin{enumerate} +\item parse([opath]): returns a dict of oui:manufacturer key->value pairs stored +in the text file at opath. If opath is not specified, uses the default +\item fetch([opath]): retrieves oui.txt from the IEEE website, parses the files +and stores the results in a PyRIC friendly format in opath. If opath is not +specified, uses the default. User must have root permissions in order to write +to default opath +\end{enumerate} \section{API: rfkill.py}\label{sec:rfkillapi} A port of the command line tool rfkill, rfkill.py writes and reads rfkill\_event -structures to /dev/rfkill using fcntl provding functionality to block and unblock +structures to /dev/rfkill using fcntl providing functionality to block and unblock devices. \subsection{Constants} diff --git a/docs/logo.png b/docs/logo.png index 4a0a20cab80c6d8fab00e1a251080d72defa90b3..015b9f0c644d26c527731341523eb2a117106266 100644 GIT binary patch literal 79227 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 JPDHLkV1nup$p!!b literal 118413 zcmV)BK*PU@P))yAc7`?aFQj4 zq-1eYQnW5eU62SgC9;5Rj`7wg%fj3er3ED#A&!`#YD5Iy8e)lBDk%wKiD|z&A|(O^2Qg4@NL^47R2>bllo-_+vtbUkRw|k5PBbUX zz!KVKa?VUim`vD4VQ7V%8q;RO=4j+NRiqxMwc^7-iiUc_QL;KV9&xmt7)E254&0W? zvcF|_*|@!O=3P+8paKXYfkr?cNJ+4q8M2TKwxjUmde7x0_*^mTYayC38beYnDZ?a8 zV~|s27eaWTt#NQ;o1uwvakKE~!noQAizuN&(}V!pSCBA6>j9SpVk8YrjZrGeY<<=Z zQ^16*&ZHGhiloFQHPVn6$AL%#c}hHbdd=70RIaasayS>}<=)QP83=QJ6M~>*|dND3a)Z1dqP&sw9NKa1g<=5#G;V ziPX=s2kzh@cnu^P8cw84a>p$bt)Z=8X84d1X;@UI!P#yz4#<39slucUY(PXI8cQgt z6(R%$B!VdwWXOmGiW3NnWHJpEp^>Q}jP;ffn8w7k8PRr2c%?*Qw4g3Q| z4H6An!)xF!s3>(F;m$ zGs(b2fPQ$YC>Ur!vdZjAbEihI>=%CfY+!c~Hj;V3hId_fvo=zmnWlxjnX%N+S7)%o zK`S>juFJ@7m#AfAS+-p6wtU_aziEYwdB#);Z{%!vG=k^_BYGop>4(6~2pXzF%7&SN z2umrnP;^Kn5$b-=sKTIy5g{R1t56Dv;ngv5WJt79SVCBILAf_07-8NdtmN;TzN{FWWM426z-1w4A(=UNkSuI&2V>GgCq-{`d(S0151qpEm*3uiAr|I zY9fbX4Qf+d4OdWINLC?b#CvnuGa=gRf~Z3X=8cLH2qD6R(?lsDq-YcyNHh#5iK7J7 z45f0*K=IUpB~V4c8>k@O_p8+zCon(YYJ@4FPVyO3FcU%ypBIKf873pog>b0uWNWx2 zv_WNHl*a5J3StSfM3#!TnG%3h+?|vaQ75xN0x?071Giv}lwLN@Mj>;SW{$H`-KZqI zwcgl0BLuY>DutxM(HNu*p^1#ML_$<4E@WRgxS%Qw8Nk`KOp-$XdchZ8IOS?0RbeZ8 zreVkFQ7{g|eY+uF9k6AOBKX%Q)YCKe<0+f{36Gu)JmQ*HAM7|=f~=K|SEN*Sv!N`E z8FtISP!7xsh&gSmG;)l;W?!Sr6 zj~J#sFD@>?f^iIzw}yy7fB+GJnL-4YH@76qxVK&mBTx}!E_iE11gg6JeM6OA$Xg|R z#!~9tTNQhW?gT6eDzO5nU|A|yrc$__3m3OD^UaQ7p4pVbeRp=P@eue^psF&OF#vge zjR?tv;~QE>0YAOxE> z_%c(QBN3Q8mV-edn{j>~3{&Q4vc8Gho;?GnN6PVL%k}LZSr(Q8u9>YShG^_=4qRL{ zcEy-ym=8{=L3M?)P=-V<70;Q7Ap3%tGDu|*We{fu_J@kMgoTqV@GO9laBS#I@CM_f zN1Ywj5SA8%J03w*VbF!FMz|0@(84G!xLz8E);e-h#Z)-bM5Y%C6`?rn+RB=NxdnSF zH?^{;5T$W;yNBBykIKTWJLCE~1?~sD5B%^GVI#s95nKWz@IaL#t2|CSKGp+|x#SRi z->4d|jsyP637;*>-Sfs&1Ix~&pdy_)#DU_%E)uyd2#p#_jf|tDsC{2YkfP!-Flc2m zr6pyNpoJi+ByqCB5()Lj5RDc==RSSEsY4;51R=1KBmSRDSYEQSi2gH&sT~mQKt&>G>-&WVDiuc*5w&V(IKFNo4_`OM zLQ*AOHa-zrbcrwsTJw%HRWa=>0brgNmU$tTg;Xnhcjkaf@KBYjmC1z&09k|y$f7tx zQ6U6WItfP=565eeq>xpaQ^LK=c2i2IcI2#p=AkpCWY8dwBOuhW&|1SC#H=?GH6$t; zfu&56zyKMy;1ycXYJqUv25LZKT`%o&qnY*38%De?T}G9JMwd)A+A2FZUK?ryqS~8R zRB$11Ab};s8!8pcBPNh>BxPD%Fxw!s{>&|tRTxs2*Afkj2JVDIlo@P9eL+OY))=!e zO%r#=#>r+NkHTgvnD0m|m?YYG#5qDOjprAQo677i0 zE&(;54o8?c7G3TT@A76=VPjpo8fY|}i`j@44BF6~$X0PR)QmJ3F2-MdGV{@s${0b8 zK!n~{+%XlZ2aBw5!wik!$c$rm?&KiEF;UtqJaOlW;7}@}g1h(U(>kC?5uAx|EW%bR zwN{SG0<{pW@!XyLx`z|60X`AoIdBI2R)jAA16~(lqsmiNzC<_xn`Dd;Ox{TQJ;N6> z*N+E&wb_u56F+**c=N6@D$LHvCViuT|vKxGHC4z2g;=VY=L+Fv*RLj<3Sazk*f$|H9MRh~xhn+Tpn?@GtOyAdqk1pneUf&6Ds z-xlo3d2#7{eY4}6I`9|24-VD%gSU@(_jKT$w-WCjIkOr$HJp)3rC|(S$sWwr(AJ37 zXblbsa~MdbY3fW{1uvDuZqMmb*vCLfBAId^*wsWzmhe`9z7f1uZuWcjD2>W8&%H=R zP`yh_NtG7Ph|t_=L`TuRN6>%+oi3XQ=79>#wb4YV5nX>KR))4Ruz(;atx;=5T0_?& zasn*CRRmY7ZY?I*iYP;beRMr{;4XxmR`m2!;uvn#T!rp%!pwko0F{&;^d@gPW=8w z@QY`S@J3n+qrgxrd2Kv7f_=c=lp@MuzauPxH}0G9%57t-paxe3b{>4uDla_n2t-%5 z>rN8oT;LUVJ_PQn@;ri@2$l%$uohro5uvPL>lyH5ZA$0BH|x)DRoRK~4BRhFindGiOK$K}G|l90(kb)PEdK z@r2-1j4>}vQE4Su436!1+Sew-!-r4iL9~-j^@muA8_eM73 zEm6L+7#}^@^64(|aF_VO*lXFr4Q);h>CI7;LSpcSv_=!CButz_B1J`7Kvc2@k~;W3 zvP#vFNu0T5wl?D$EP6zUky*GYN)4mAFzHN$5^5wGC6v8v8KiQOgIR_yhf46(^%1{& zwBs*+d5avrV7qn3Q|CW{ogn4olpGul@0H_5xjp| zDQ-vvr9o-dtru6KIkgEmcvQ?Xh7yu#8bonkTsMw(jg*99$}lKtDa^%45>C#!qxtGx z!$lE^9&V_O!(oqzQd`B=27m{PdzXk>;}{s$UwALd6}^eg5hQOAP^B-*^0FyKbjc$i zMQ>al(b1RpgET}h%1%F!O9b;8y2xlZ>ZSWGO@vVG5+tmRgl|2Wu5$-VYnTT)C0aD1 zRmNf9rc`nm=Tm0Lsk27!J_6wcy83L>QY*ROOdBL`kTx@yh0;4Si!0^}gn=qS#sj35F7!u3x-NvI0Ud(V)EG=?zWN{{ z97(~FqS+XvQba(7#KQma@t!(2vNvi3m!&h7!HmmVyKxTG+PCCPaF}N<1Fls$6JZ<9 zJ$LddbG3kjH%jz1*Hs=V>%M*rJXo8|D9!yr6?6Tcxkt2$Bfzt$xZQ zRYa7A(0U7@d6#zFJLtFw=Mcf`X55M3emG~tNcDxk{OB>iNSPnKGw^ykfF!CW)=G?e zMO`TfRY#7ZkW?777wUb>oR||HEGWq;$9dtp7^4+58qNF3%3fI{lcdp18N<0@4@(46MMA{mKZv~yeKcA!aSVxjP|c_hp$ zM9GA2+XF)9=p*$WghU%c4z z=RbSI*ZV6@6<)b6ygC;il!d$7;QY4n;92A3m%%1G@?XLJL*>8wGhvq!pG0s0Y!P0= zd0m7@B0PUtSJ!>^3GlxF|L(7YlY7nyO8X5w7H5{g0=}=#*`3DC{le2xc~oxskDu=O zzyA)-UzzyBcaOP$9=tgo`tyliCz~6^mBp2@EgZ7_e*CTk- zd%=-aJ!tE*^R+Qq^#A{51WUk;z;}TMzRJ`BuZXf!r$$GwvHqVIz;h3Nq{NJDXMn_@T4xGP-V zRQ{geE9-%(lL%gkz`}VE&f@*l54|dMNff~dng<2AcBcRX!ibP1_~fP3nG$<~q8zl-2xhX48hgzX;(_dW>z$!Eb6Rh~s~i;z4x6=4fZ2n&5}?yl?n z5cmlAmzOY^^A*P5M{w!R0XTJd>l=9UsqiC&58o7SM0vO~e*W2xKly6mAi_WW?v@|C zzU6yI7kKNkXLZ3^p}CNk9i)-!Mws&}rXZPh?*dExu+@rcmxktA zS!xe85W%z-NTbJRB^+_bys@;7*z&pvr$8dOT@UzSl`Le9GADXrekq};{6j0Uo_EG0 zun0CHj1dg0RJW`;wuJ)FTza6AOc)hx z=uvNzAo)yfjnbSP3sGQpMUt?wLe07RIR>Iimf+Af%r^&ac83;^`HYVM$o(m zJ|257I8=+&EMrX;(}p>j^{^Xp%5|WxLAa z1A_@us?07tY!CRmUw_JU`VHTGuWO0ZLX+*xHc z`!?XPGNTnu#)>YDwMd#_syzm}vK#@Xl_iW3oFLp6AqmU@mW(N72G#BtiLT*=h6`jh z1{KPh6nx2~^kq7y3vxXW(JH7i&j)hu-Fsga_Pfff+bzW_DJv%FA7bQLH$v20OY8a+G@{H$)JPRZbB!32q5&Ls*yZ z+%locB7(|7K{-Ss(&V=z^pyUc zZ`}D@l%GqF?>AKlI1=Gbt!&hoqc#1N`$+_#dv6 zhi?^r{?(qx4_@Q7bio|P!iYu1sF+TSIWc8HtfC4BH;f)n-sH}ZN+`6I@wZH>ZB4Ls zY1_ofRI(_q+}ZM&%H}Ni@Yj{&+s3siBg$QZn-IQP{noZVy9j#FM3kfEOh6;piLlT; z7xn({TzXLCZQucYZ{GOo-Tf%@d`K)8!uxjPzO!Z7cDGW?${uYGJkq88lt{BwX({{xZra{)=Yk!@;{O#wQ9DmMF zKd8KRRXDzEj45baVgEunJTWe#`;FVyICAezWUaHuz(!yf!qtg#@y`u=-+1Tu(7uM- zP_E3l_8=47tBpS*_`$o*xi{ov=hY#I2g2qz!6WaoGtoc8=wXEe!42^FD!G~m>Xld4 z`fk9b85fU)|Mlr}BnAKVyBpp=?eX$jg=X48=33cXDDJ`O;FPU#ZQ3myw< z3DHDK$~0wm*L%ikqO{6l+Bd)|TTqtqqN3V1lOxa)OymJq;S)d{1k+j`MQ@9 z++fC-Guv@u%$Z>`t?9JYQ<83W0^F>I-LV>J&6^+`o`HZZ1yor) zh_wNUNDor1!>3*XkDjhlRmy%(%bA$_+{=^Qj?>LVaTun=C=gyzsi-J(b3An^%+z~= z&8(w#55l1Aouve&1t>jGp>&qIRBSVlG$ZR=7zi?KiB_=?QcjF3%drSTS+{54D(hN| z4B`x_hc48Dl%N*jSPGf~7hNOiPEqYX7=pX9NS8}fhAcgbKB$wnnJFtrDN~zpb=zn= zXI~N)6>WkgM>0&SAJL*4+OtE7nWZQtl&p<3jWi5uW!4RjpxV&dsAR&GiXqZ>%?2lt zNGUj*ppkiYJ8{@ovR9fUvg|>HCIfRbmMUC(qBh|t@0{^hzk5MJINus~HiBF@UpD2o zRlZrJ4PV*#DM9wmj81{`5JnMp;oL^>WR=@wmF$K!L3eD{Q>?0;Z3Q%e3o||%1}1v) z&8_bsv9(@MUoyHIZ`?-oCKw%&PVQ89zKq~! zz@ygqx90dMdi=;3y<=2>dsIznbtf>Pi3rAOJ~3K~%W9G(JW+sPN0< z#K)JJ!#?pxua3MZ3&=!EPN|UgJ7mnb_PBSbvU4HY@~s_k8Z%9loV%1bM8jI6NnUGD z<9J-yJ46W4x(_A_S%cgPLsoW+k;0kT@S6+aqrdqT@1O7ar<(&G{`E}ztHxvCt_bp$ zlJ54w?Q@i`0aN9H2k(n;E?sRp7Qx?wzj;IX{CVcfn~{qu_?bcrY!|Qy#e;1Go*F+p z6MpfI^WKT`&O3##x0Pdsx^LX9_4#&PUjof+gLB^F86wJHL0e{$1^2gmM%hv21UHyBTZ9AKm`M@c6A%%iRS0LB zl$w>>Fm$s8QEGTMSLd0^O2=AnNOhehNOXj=S$(Ax${xX`BOOPmtj!@An{niPd&Ir7 zW6r0HNidGEnUv!rRj*F{czh~8YyKEpTVAcZ=mhjaKrc^XncJs^- zPHC-2)>{Lj`#&o9nkdv&GHasDrE9siMp#j0jEry~W$OcjW=QHjRS!{sOLxVThRWJJ z!jYU&uYGV=gjx!kGszMR(%F|t*STM&{MPs?mV1O-I)(2yNC?_0A&D^hFrvX|eWqj3 z=mVW1Ok*O6Q>A~014_7%C^Q`zqR0NnI56wLXwJqO<6u3Upc%utn4#?V?Dv)3(&to? z2;=d%&aVWn+T*nmlrTJcT)3){Tj{c;CXCKp4X|36zjYB67wy?a>FGkv!X{Nr^U5+C z77I%Zr07%aRTC|gD1ATfTB6p4Ih1pAzIS)z%NN0-!AS_Q4R&*|EA;t`QW0$N4(u$;S zfWHJ@L~vPy|MAZXKmAbnv-pDBH{N5k%YM_yFmOEff$%X`j;FdZerLV{OHTz-RFTkaNfIyhtUDc8>YN-2X4M& z+-Bp`Ie0i27oK_cSh;Kirzgs*qj2{F;dIJOsx*wb1&3wk(Z2D~#lj~qoV%`^EgSB< zaN4v`)|t?)JG%%D(xqpAd4tbNIO?i$39wyn$N4AX{1|vGoHH|?SmNs1`IEnW#7{mr zXDt=&eg|l1T!`8f0yR3`_!xZb(`n86lb5xe#UHaByx8Mri{Bl{^GP9yrYv z#hJyh@GkvE;GtMlsw<9B*Th#hh5L;SLSv?fT#DpAtoSm`Xpju1vb_E6qg=UsKMS1pJx{Dx0Q$m@0`=@g(seXUq4#=xmP?KYAjh281gxnxA5mbzv7#xdp>zAe6uf{q=Cz*T)1;3!gXsb zYg5{b@FL*7e`IJs27bOG;IG{I!;cGhGJO8zbI!m2Ca;}da(0|KKF*w-IFh`}=;q|q zurf2d_1i*J5pi;K05+u{RcBWd8)}b`i&Ml94<=@|X~)0&PH?D+LrdH;;x(9M%V+k4 z@BG2Szxlgv75scnAU*)@6D%G*625}o>j?I(&lHIY8#S(mf#+?*k-f?vd;l9OnDp~k zBZ%D-4wAc9qN|^s`k*JZ5SEYt^Gb*^q}G9-bU818d6kK?FNg-J{TiwI65wgD3j=Y4 zU{LRzFTqVQe)UZG(_cU4ox2M^mOb;~z+aR?bN^Oh%D^LFOK@)n9pOQ4e7G2kz}6DK zcwqcagqu2WwFJv-{O7No@zW2^IImBcI53RL$)pTg$WpPC*_9q%8_f_kp0^V|zdGZy zPcQk{cic=$;mQ(^lktn+ z-|+Lv_}A}Ge6T&x@_-Mi-#}8G5=Mw(3W1VjWfz2_d01~wX-p~MQrLzBpF#}25+41_Z*i60v1zt zz;5*bM3tTNn+hTVlO8d@J?uH&Y&kgGtHBbb`*6}@(jiJDqbFn=SZ53&y?MPHQpWor zv8r~a<^48=sQn5Tq*Hb3f~JJ6G5i78ro=F2EEb~m>yRwKQYDF#lCZIcrp%BUqQ)f3 zTo>@5x{%rdC1_!oL=TLZqZ-sSGDssFZWm?QSE3c>0#s)y>-9g{NCVjB2+4_?dW(o* zG#Ytr<^dE6nI*Ij0!JmJBP)8!wd=(KmY@A9*i`9L6C<$Cqdrw7TbUyf*=kA191chaU{#O zB*T#{OQJe9S0pdV+n#2hy_z|zYK%OL+K1cM*FZLKuyOji)|#_w)EM9Q`<98_Tv#sm zOu6&UA!ZKy(m8KR-;NxPVF%ckN|_-~nf)%sSTz~DtA#Ip^30P9`1~t7e($}R-+yo8 z0G!9k+(yA9BCPH_!`XoS_`x_aeI2+4e#eZ@AWv`4qDMQ?`3{T%Pgy%vG>^%e|8^W+JJM)9jHh!yC-X8bVtvJk)Q8+lCrt`8n{RfptXW>0p z{%Lc*cM#rxtbF#7@)v*XH9o(*i*1jo+hd;jLRJO{A+efrbY56@KFChIt>e;?fS7`k1W;M>4C1j8=3C*SrVrhPsi< z9KA)`ViC=mD^0xA1g;M}#Q8k%si9iB`N($zUUug*W_%#RX$To|O6;bYmo8_foLIMz zHj{MF9eOPC4n-H@>rjw=UMCWp)O zN?BLDcV-LEL=)u(xE5GNu|7C-qfOvA$MqaC;NE$#n+TGRATpSF7NSs-5OYKe?zREm z5mLOq6zCG`4N=7{zB6tdvc_o)NF>A>Il(k3ms5x{q#4RKAh}_PO^Knri*}rP!yH!2 zh#AeJE$AYF781x(v0L&*U%7FmZ$rD3X`Di}p(R5B*9JK=mzZ&Vc!YBmwrZTa zqV>S$JDM4_$7ewb)l;&dOcYwQL&dS4=*d|vv-8URUEwWNu2bMouH89};%XgUnY&*$ zD22sg0bUb`RI5&z|w83)1OQz?7NeADk zUAb5`p6+&}XV=UQf9jRYr}q!*XDl=p7qAl+!2@m(jgAk00+3t420M zx0MGtzy9lQ@#!DhvHt(!WnNue#RF6&PDg`vxRXEzrMOitVC%kQ;K-JDk;>3O{ zX;OM@Op@98nX?D>C^o8FWvue-nR0vGvhnJO^TKv=4?2JL4~;jULT&O z?s0ON2Fj*)*fwW78>*d_GNzfOH9Y4i1XDpCt_o^p)8XmJ(TF^HCb+8u%Ou zkn2pNn{cW!B;r{JWQLgI+T(Nj zro&6mjKh~Q-!S2;-&Nju-*~l5{MSGCGN0Xl$m#SBoa5Qrtgx5C7acZ}@c9e9g%5G1 zpuO>Q&0}+2$y1C{zWCZ>{?u!YKl6n*_y=D(@CUzr%_}MKXJqBv8oy)4Q;(6ye#}tw z5a?9k1K?}JllKgG&x|J`T-3@-tudzt^UUA*=TG?5>#y)5J2*F|KCkGKF_c|0a)&I| zhq|lBsl?;Kk({8#BAlivB*+q`K{4l3b>jzH=L@61_(#Au#)DkPk?-k{AHM9)CxNFu zR5r6HyD4PLz1cv*D2sMdQc8kZJ4Fe&sVJL=SbWKiDMKCfXw8WV(T*CdIG5NQY_9=HtRgvPr(NpJ>+h| zu(K(A9`4cBlfDg=pU~R|Ca8vzOz{_NElLhbgN0!AEd`=xvx$p+v_R{2rX7R8e*YpEg%^6J zic>h_)>(b#aw^D_Smt214NNbK!WSQGJi7NX|K}fkz*d~opre>|HWAKu5JveUU5qy7 z0%`{9%Hq!7{=dG-%YXF;dHtfIDNdQkR+zHmo;hxXx*1*J!PM~@hUI4#W@VL*$p8-n z8?ivU2cE}9A*3{>A*rvf*tW90C4Bw4^GrhFI1eS_`>H%s<GGPTF1(evQOw#bs;m*l~{SZGGidhQlhIJ|$ zi@jzR=}2`_GA?o?B{YL~>plMZ-+P<6oO$CuTzz0Xxo*7Y;T>||Vkq3wP;0KYK1$$2 z5kB}Z@zxXN_q+1WGx#h2#;5u5Pu;Ni`&^$xG;~gd^C=K%p=AyjYEau@l1jA#l1S3I z>6uystKA3b= ziMou#$df^hsKZNlJA1u9RMDj=f9oGU<&9VG^O@y_zA4Q2xyT!JQ`W9z!CnmUOK%l4 zaQY&JB8}!DL)}TI0P4Y~GI2@{{CTSZa&*^y`xXRa&Dhp( zO|f8F8zP0<_i0cX2KNr@(89DVbfkwod{>O!oY*ae%bB3?ZVkUR_w{HgxPbOXN5`TX z*X{_3N)n@|%sy323yYkoKBH=!`^1Sv>KmIWn@;rMVH3d1%&Z4*gIo_N~iV9g%w07%8m4NtennNY%MzS+KPlFzPMm3SNlZ&D`Q@e0JZ#+3< zt`EZ2Ml1)RBGeShOclkokn9`=YgKwG1ArNdDMW(bHljk1@XTxj(t7Jx>vv4wx0P)h zX74@*z&aMITrw}cx?pLc>4Z#hu9*ve9=x@>QP(rQR`yfJbYjk#Sx(dzL~2*3bzv@N zRA;IvbMZkT&^QGfD8`#toxkuyukb71c!rG`m~6vrJf1^^f9aHW`@Idt>|879-KYH4 zuRi0?|GNQ06;+lDwPmcH>9tc=2UgC#v1mga9;8Y)#Uv;pO2jr~F;>zrT{vY>tyPRJ zq4pFDuHie?`5+~x-cg(zbFNi*>dv9{A(V7!wqcTq$;AZ%oIz0#ASl4CC18`?*qf-q|j0T@PZkcaT0yYTJv zBmTxOeS?P&otO5VtH-dt-Fe(Yc$9~b=JLgT6r1)A;dPwXMd+&hvy%D4w-WmD#DDYe zyvh$gIN*{gvSX*tHW}I?VWBnS(C1OObfn#o+&T4e2Y6+(#GE!HPq-9Lve27wpXe~` zb7!luK7HouF>n41{N}el!EgNI_qbX&9*OY0R=#D%^*D@7gXHsY&@_(2tD1lZgF%?h z!UnNzJZhbH-1+6-%KYV@sN^Xzb?4mEp!OSCMetssOo$|;R}>2YSPS{Gq#)~>htzkU zC%)7>pLXMqfZqci-^#r2JP0;6t9zrj{o1Wl-hF8QgI%UnY{;9NCz1=zpf(xg-Jo^X zE{JBP?9|-oUFcmXIYkSqLrOVj7A24NSa@~ZI=zPp@#11;>z#Q$bF7uax>9d_5*BiI zAAs87kEB|}FNhdyVQjn+j5p9ThUK&+m1=h01(~JZfgY3dq3;4?6 z`3+B>8c7ll?_H8SaXy|nc_aIVrkKaLX7+gl>C9>6I3)Jwp)!OTr%f`i&y7F#xhsD0 z4~;x8-0z*&%-9dc-m`Jt_K{8L_G=rYgsay0wcq##kN)JB_>mtxGf&Fa!yLVySGKj& zw~koj`8m^4=U%BSQ{u*k`F6aw#XBki5pJGIQlmXA!c66?%M0eESm)F_-Wr!?9Dyei zvyXKY1h+iN_JRZx4#Q^xe=Nei)_GtZ)d{mk+cs>C1=~_WTSd}>4iIup;ptnbxP+x5 zItYSdq~2(fSO%oHnNwYmR_T&R(&!3Ek3zzfwI_DsymflO-~6R-^5CNL^1gBJ8u$a_ zJ%^$}-#?7w_M;){IE;1k(>PxMZmxvi?aCje#3x_B;II9xvCPk?c}Ld?%|=>b*LrkH z_6x_eGo3o;YV-!jo{?Gu;5;R$ofSov#I)>Liqd3e(iJgbmn+@EUsa^BP-!?n{>Fzq z{JA&yg}?tjKD-HzGBfKOYakZDm%* zh2FLdZiX`BljH2M0aY~?|79Vks9dwIxbEo)wHxOiveRrU=E3As5#|gss)VyA5*4!$ zR5*gG;|7+7vasjKnCT<;Ni!D@E~v*N>okqiNn{L}2+hMhYJ-c_$3itc#1U@j&TgLg z;CSYxOJ$yCtQpmmlxDoQLCh7zl-w#4P<5vDPEIjj>kf@*F=m9ctxRT2)69Mnmejew zDASy3^w=tmBfKBdL=@RnYs~ki5!^yes zGb+m7I_IYB*~pVHPjO0(7FLU?fp^Yr;@mURwlUT=kUA=6m@Gb*z$>>fX^LT`j97!{ zZIfmsH3~+yPH(U@D5W4%=0rv1Oiz0rcjf&%p*Ni zRX)67lQ@2BbT%X5)K*ys8KI9VkURHuzq6pHJG{F~;0C|!&>HKwUUGqOf*(v_UJK4oeZvckQ&hmdJq*_x0LrZh9vjk$-A z;R(WHi6XGy@q%r`0Dl_~q8i@EC*7DBux0C<&MVI?L+Ny!!v@om5Q3#RIpo$!)o3}B znAxvNF3Pk!vCA#~A8WW2a!$Nljyx6PdR5kw;dy4>7bZEf8cf|eoD=W#m-*}e&o_9q zue^G%bN`9M?-^esAimH@3z$U!?{sXSEpu5OPyIw2p+yiB21g<9MX$*s-^0!oCG43^*O`6aa zmGAF(R5iZ~d~e*~c??$Dcv$E0^V^o*r+_!cru0=a9_twR6YZPLr(u}e$b>XE(-G@< zH+mCVlTaEBQg(pulmuuFYHh@4G`fM&LBcsCYBbxT&7{Jo9^PlIv3cYzvXrVOG-aB{ zCe_S_134aJw=f4bZyat8u*|$NU*IXOla%OnLo|i&=vIxVIohP&(G+nWIVap|w4B;0 z2DKS>%gjDI7bODq5QX)I6P?-=aSi&y$Yz>|UU-#x09J|LAMamxn5ANpNy(9Wy~Laxe&lpx z%v;53kj+<*R-#$7vT^_(f9sR{+dtaSzVYnfsI7=QMFxqb1^04G6O+O| zZ&cTqUr4m1+yg09#Hf zZbJ~GQCx`9TW4z^Tl@a!r#_-zJkpWfUc3*vuc%C+^>d@x7BMg4RFs7kV^W)8?Wv=kKTvp-+-?G&j#Z!7>UNqnt14)qRP>X!|(uo z%boWg3%|E0f8pof;NSbx8(j*$*_ew)tW2#MA|^Ao2D689?KFrH`$b6>$=*}jIGh~! z%IbyLqTRal4ei0jtln4_qfCO#nG04PA9KJCCZV*>%lU@C`qP;Zyjf>bwk7tHw-7 z7|@Z(ifV%4X|B2=&SM(vsRx6Y&F>`P$VYu|9qf#67GM1OR&2Q*c@qf;4+OoU|x zwR~omg^L0gQz6fVMK-E+4$bHQctD50YsYYwVt8SobUHR#Irgn1Pdw)3jU6 zend!;uu_6un3SdUal%MsuWUo%$(UoR#e}9;0Xj7Wog*R;0)>P(R-L#~0c&{-<OgpU^mZMPtI`@N>^rWWF1w1a*&L;(Z1!`wUn$1ndeKmBJuK|6Qa zal_V%w?wu^vy9XZT>^5PGHrx+x=a{G@FT=wQ5cX#B1SA6P&K zE>+pPa|t}?jV!`<-T5BEQ;B=|?UZk%39Y|W^xvH8;3 zwu~WUt;{Kc_?BJcpox3?GsWS9gL1PKW;1ez2TMcp#Dq{Atml=|&rCXVagiY>+IHq9 z=ZL+j4Mn+knfXtDrtr#ZU*v!O-@k%)VHq3i?Ych!i#s<%=pcjFsAIDdi?s5&Og!AJ zq;}?b$lRPW?YvP}Av1=PqA6w?eI$-bq?#soO43lPv@^@3Ob9osJR!Us_Af|f|3#J0 zd3YnP$Di#YTn;tPq>4yl_A|HIk>nW=rX(>~N64JHt_iE#i;Sf!JyXg`y#*kPh3J$|X0%gvr*}Y&@Lw);moLUcaBeb32QO z=!}h=ga_q}q=nu(VK37`Qx`~z=Mn>JX)j_zgs>RI=Gn<&%o0k|H1LX10Oc5fw>C&0 ze2o12`=^Y%_jn==*J4&7YGira@it`G zJMK-1gJqr{>X>JSuj_U^SxMa2Mp9$Cyx`A$VdkIw_8!~90C^ETkpJIb;de6Xla=52 z?Hyl!^Fz+Zif@k94mDyd(#V!dW_a7^Z9}I*(>YXJB=)v(@Dy`H4WHX;A)2~Kl_r^N z8{+V|1_=3yN7M~3O2Bx&`j|tHviL>P?Sk`3cgi4uY&E!irJm@PX*sZ6VndMP76g_EX3G6xIA>EF&uBfBUCTIlUj@rr-ErsMBPU5+XVHE+zs0rySCE1 z;axcOXy?*5rYxkQ=x9+tS`Oef)}DFcrG8{_~l!NbnRx#d%16#p9SOt8hZNzS9c$Xf@eB za$u&D>HU&mGIct~=YQ zvYnu7g^PumIJU2n$ZXg^+CW1z-Y_#~xw@pBE49_21Y5t=5sZQA06&h?(rxM4JkT^% zR*DEulX5Xdc9UcD)mhdyJ$ywygrZYv2qKzhnvlNmQv)LPp(tqScPA4Kqk3 z;ZxxxLhBpn+E{xg`9?_%ra~@-mL_Iffy`oc;QkU>oGuZmk*J6@nq)Sa!}DeRMH(tC zuunB*CW+4z5n7&ECXiVmH*!+wjkX%88w`O+Qf2Z=k`$hxks2dPL|vqWCTAIu@0!AW zzi189HPod&PFT~WQXbsn@Zb?Y{AV+# zzxNd`&bOrge|dxbxGx=l_Msb}?VWG^_WS(A>j$pS1?{n^wkj-A@p)m&p`?4dC9Ka} zS!bDhpr1ywbH~PNLeq?CL~nEwl6nN=StPkW7v+fuKhwV-k2&DDx8f6qZT0qAorUli zZoSd_hI?Z&p`}2EO>4B4CkdrvC!oaHwh)T6bF_M`Q&rIB?ABv!hekxbq?O4lbKdZ| zb0{;~oMId13%~LnJpSOotLMhGb-pu{X{$y-pT|A&D)5Qkd3n&i8}KH=#V3SsA$<2; zc=(yjfA#Z*)qq3S8lI`}-j9G)-)KFvm(E^e6!0WeLUba_EhT5x6HnV5a9gQN$=K(B zSf}Kywb9p=rWEic9Bb{^VmG{1>0(fBIYR za(Hj$GwytGbQ`{UhYi_B#8J9EDGh@8&;9Ttj;F^gxw4IeLfgXLF=DME0y+(~)|7;# zp-k#2lGeilG#)UK7yPfgH}pqa9CoLj7bhm+B*F>Usq(-&#zg9;sFW45Lsp4I^jL zgh@x`*2o#9>5H+@ofDIdg*B^^dMCGrZIzpov!9gsCoN_%V=yaI3F&aopkW}*$yn65 zyeM2uon^TQ-rKfO3Exv6zKJjuhr=E%k@aE`l@U_sM3ELVIuY8CQ#U4Z3Uc#pEHh5D zudbHWnL{hG}Z8xspB>J;%8sf4d=FXuq6SZw%>LL(^ZrEhGOP*X7B zR-@NEhtjeKJ;6QEv`~7bC1L6<;I_$`riqKGQ>Kh&W$iwqD*B6ASxPBdlhVl&^D-G8 ztegnGRt`i{QD@FQh#6@isSU8G@~Aa#hEHkx$O3+Mj&%2ae=t->?~Cvrj(5kNpCe*| zJV^73*ot|IHdlx2@#LrrtIbSa=}dG}R6EYh$^~Muv?Hfu%zd*kf*fmPDY=kx=JMr7 z>|VaYE+>BINAL41|0uGXuEuFX{}t`Kk4nbNaO6J#-u~lje*4`=ys9U>-^OTkyv$rq z(dMpo#alKRpxXsjV zy^v;1BH)Ti{QH_S-Xd5u{AiGxAyzRB;IWF)a$>QKlA@(gZK3j&LLyN`D7`~H!j!OS zWFefbUq?i`h%c&8TKd>R5-Kjmx>wDIB~Yty52x-JIw;aXD44dj!93nptMWN@g!7*3*g4y?o%m z{VRoE{IyGd^Vc5pl`%K^V9aJGgq=i}tOHq;jPRfT_yaySKMB!Dahk+Bp}mt`$Y~1x zS<(o%Dgs#|n+PJ-!q(F`HU}c~BUID!NrL6yi#yLHc-LzX}w zsWN9_H_u$8##tXMk+b-5YS8q)FPMoQzo7m30B$ax_Rj}Flma#1D;VMmruCw{FD zGC>`V`DBgS1Fh0b#>{8K=84?`yJf??QW3HmOKyWAA4ls*OI>4_=`lm9K7%!i9cdyQ zEJ5$A1j4FGjw;!rCCONTx)#);`WH8vMmAJZ$Vsp=qq$RZ7>RZ5WC0!dH(5Mr>l!DZ zq#;ldRp#7~q~v5THY`g@$*`mz6{AP=$q$=x&z-LgC270UhPIE{q%Ou_w*y}l;T;J> zWnC4MiA9_+&Q%UAv67G+8)qgwW-AvI3gVq<5KCNyc}_70tep>^-O!E|JZKnwfNGV7 zV9c}d;MGgYqZuyXbGhPH9>pez3L`d3&?I+gj5o{+*m#Cvn^#3frlzYT5v8pEWyKjGy*~G z`wfW~!iJAtyN%E3UEs=$PneAsXJ@j;DkVfWnh_T|6H_}y4wA$vZ}JsVVV=UfR0-Qc zlb~ZyIYdLpP1()Dy?Ns_DSd+Te8J!Tr{CuD_njX}@OkO%N94xWhwAah!%ucUC0=%C zFT%lLFJQ03cV10=?K<jpi4uB#Kq&TeSYGW36+uPQz#m(uF12 zfYVxVAbUqO(>*+k*R9YyTu5b_KwPP<2R);7uCj7ILYl&O-Mg^X&c$U5lEta%O3VjRntXU6685tXctU7M){1L3lZTqgh zcmRTEz>qcMm5d(( z3favlLycBF<8-XoFyVR(ki&)8S?0n{;^w~Yjhim4!V7Zs3j^ga?fK}HPMTsK;Xy!u zT05`j@aA}rDDi0j8Kl4k2~Jic&lB@pn9D>-mA(n*8grdeH+o9+;jx<4IChWFLNO$b z{|E@Xl;OMvC@~ddN>N9< zBud|?x5`G>0IW(xu{T#%3-N=A(k)Kcop?{WhJeIzOmni-<&b{8*PEPU4F_%CqnRD!gO%*(ZC28nN?}~;? z&n$Od*ETRj)r_4PU;p-jAAZHDEiq+hnFJ|H;>b-C7CUp(3p>u7n$j)E&!QR4!j!}F zhHuP-BCZYL(oD?%H05!hhCE+yNddPT(;a#KN3Z|F!wZuvjImLyRiwxBy6GIn+n6VH zPe^Y;tQTjUF4%j+r~ zPMp&j{MblKrW#n6u$h>Uq_L(@x2icOD-DM86R+&Mq-@B@D6M^}FHbFcHY$7kNU z-uU2bOhx&DUE*i2c6@ez#^v%HC8K#k@o4w9Q>;s*SR3!->|Ak5P_Mm5Oa&n~+$_;N zBUYd_Cbfvu9yd$7BP+e#l;(jqS?G|G6vj;zq|D?}*y)ORBh%1Q(0R{$=Mz6UjDAn)Pi-vgd%;=UBFlQN}_$~g)H3tZIHI{CDXcB4WPj-DvpxF`?tb7wA@l$F*R zyM5(p>wNp2M!~t+hfWxizuSC`)0t7w}3uZ}^(ARhfI`*b7rmbc}6lY^|f5 zXcrT^ESx+u`$k8R6f*5u3~49CFT!du3RWF6z4kFDyStmx4159jDKoxWB64EyHmnEH zrk1v0)gT4rHLyBDp^{Wt`iUtAm~}^Ip>nW^(l=~YbgoD^TCR z;S2qHd{W@wdMQPae08ilk~SzaDJQZwPQB1*m^rozlNedzK#}Jh)CA;=+ZI|7?@@K6 z%+gmphnzSqnLO`k&)W;O*j-8KHje+dF5hK*HxagBOnm^nLO8Zv;n9^dPYcsL^WY-U zOlY=pI6G|}Dz+Zxu*<8$ZkfsRj%5~3wR5uy-~I5K$JbCTvZ`$ap1CNgB$Cz8_)iPk zL*0c34^6G{U{S6$QOvQ{s3Qt{KdxPXHIU!|Iz%Y9utp1fOv#CqqxLLQ9x%jV=grDw zl{q!aZHq#L+Kl7z1SJn{nIRtW4ow8SZW8QF!s$&u#$SCLR z6N@#vD`zhetxaN;j1&)UmpUy?OewHGlLRTF_K1wGJzNIWBmK6KUr3UpZyteSSPS)5 zi;6T3bt9}0Lp-7Mh-kD8tyKn6f}*E#AWHEiybyC+|qaEpN+j!& zGumQydAa#pJ#5W4j~!p6)E> zcTX4Zjk(6r1Lm}CD``_~N`ueV5bNk_5s)_`zAcA{sHBEvWwU3HgbPhbnYp}NICtT2 zI8s-mZ_ZIWY0k{vIdNvz&PxyA6OWWFIo+HcmFA5{FB{)1!WZrd^W)ff?ruhYi|hF) zdPs(lVyN8?YvqHw@FyP`WiBCi-%i||3T<`rP-M<&@c()vx0NK$)H1u?sJh_5iJ3wh zn^R#Uzj&T_!4QlM$vtAaxiw|pIicR|$ovrS6Zf3A-vD1X^1fpd+iW4kK2779Hqii1 zYuuNT2(OP$XpdrZ(+TNAHD;Y^Wf=VTEbgdR-qZX1tzUkJV{1Hd=Z}aPP99Mq?>K=9 z0zNOo>%g%H-%=rUIKJ*YeHq?6Dc9HVKm5f{ka@~sOL0LjveEK@2Rt`##J_o2=}iF?NKJRjb}FrYYiIARx#tpA%3R^c!Vop)lM#~$9IKpI|O_gjd(qsvKRkE1*I6_rn=PRblMcP8}F|t+MJ(P16 zl#SlvbmrBeJ7+I}k0BCAtK^_tn34K9Hs&sDQex0*kw`2nMgCNU9hH1IrE3Zfc?*gLUj8`o2z_G%d3rh{Qi*rHlUg^ZxvB+3ho7~E1RY8 zf2qfYim_>7pDJbEm}bGVkdh$jg6;Z-ci%m8b5Is>q;6akA=7wvTuIt_@NlNj!jdb= zE63+&{B-6M`y;=4Kkv>r30BtiPV^%`!Hn756VXJ)U_67OK$X-$yTIMSJRdro~L z1Hb%M=EGy-D8lpM&$*?1+$FIeM0jbKNe|VzapU|zSljO9Q{rMNcy4SyvG~TJ z71S%O7g!_a#cfAUjn#lAJkgn#+R9QAUMBKx;iZ>$*u{eO6YX@MZJ@og^o^v((Rb)> z;g#14nx2y1JFy+Y0)FT-BEo$+L_ySJgKp*=4O;h5C#MxmhItkuF;bPKAMsKmDuM95 zw5}`~FTC4=koZ(C%)0T`h{?TMZLJ?ULG2LsBe?5J?!5X6eEsFbwHC^hcwQ5&Zk*Pq z+#H;(WhR9E)LC*Ol^w?_+&q2GhtD^j9F&`r1tq#i601w5+lrQnCU7<-HOQ^9O9|B; zvkD1`qL`CBV5T`Wns?qA^Mu3LL@)0UDcb07i-p1WVwi1@136z(WT!~_|LA(N9ow?( zJntK`S!?YkB2JT;l~tL=Dw1X=nzkex1_W8w1)o7S>^Jb!_#J%d3j;P_2(S&<7qTo{ zgb0EV$dana>asE`Gf$rA_TFpFW(;498K@y0 zG{2ZkT&$4Ae0LLlHlCtUW#pGMum%Cg#MA~_VeQ_j$}pmOrpbt7SMT&p1?xsv7h=#2 zl{7A%ku#;;GibD6aVA+KNOT{G8VSc-}Ml?@RHNlcYO6tp{+trN>U@n zi78J=EzCP*nv9&Qdw^2rW@#Me5ei7=p+>e3G8U51qtH@^2s;`Zu$v-n9;vN;kJQZhn_C{< zc4mZ|31SV*InmXqwXr+G^~(c=Kr4}UE=-roc7_*Od7CrmH}zeFMS5>9roTaf7t9=e z1ym7^7^P3l+|z2OTngo)v^rREl32q`=#4u3XFev2E(PB_?)|U?CM&qj6OwwSk%R=| zp0j-joJM9+dFqG;+%t^}>*><6XKKM$tMTdAoxlEWV<(l18lfq*8oe4)S0oF`8a>Z| zr)XQRNcY$esfL*+w9-4hLL;(>?`!7$nN0#;#B2VCfAJL;HSR}dRU4s@GNvm}nNKH! zM~piOd=0c1;l}8P%>BKxodW;ufB7w{p2>0^>f%aJMT>H$fx}+8+9lS~DVm(%GR~MD z5-}=Ci!(uo4I{P6#WGj1vp>vy_~0kb;qlYasI#+re+D?SFW)+kNb&KJ^gM+|{vW3G(4sVjNrP@W>Yd14b`d&13(uCF|+ zENyrU7BlA7FcH?6yz(19uUaY^8^IhnIz{0)8*}m>+In|bYH(<4i^-SwVRAXEDIFnN zq^7+~;w6*&<{(jo5_djA8_KzfPH2AccN@Ji#yMmMPo@zskrIcgQwLPCsGEVeD%2jC ztfAe5^I9DgY;&AV#Hh?fa|(ry)Xv_a#@PX~+D4w#gaxNfhrz+Z%wdw@2@9o;h6&Ck zoP(0X#hF=q4CR*E8pC%eEGKVa6Ylcgo#oNdR0!RUvRN0hxR*c;K1Z zR0lP|a39XH`2NhQ(Ryd?0m_D|AX6mBLJdNe?lNx*tr=NnmU$*m2g)ULciYi(lc)U;R?}{3!(Rd2#ig2{`-)pP`MP ztE$pUA@mKa?h#7_icAQTOQE(7YHk zI(_Zrl=$cW&O0rm`G{|Xo6aMY@Wza*A*=sLgpU!vBd|-t&u*Z668UDUynPe-r@y`M z_dnU_r^cDUoGLB27-%K4)xgx;-2KpI#Ecpub5xJXkivrmHgy&1L}%(7C-rS%kAbk8 zv8w~i3QY7yl4ikkN%V}lTDz!9Z zZOBwPodZ{gTjEWCt4wNp*2z4iGhWkr^a+tF_a#tkgJw7!WM)=4S14UcT>@3&Xse$x zi88S?w4Pa8B8sw`e1wJwt9HIMWxk&hKW>d5JtM}3XHrgmr|OZxM>1v;($~;qr@yMO zRcsTijbH5Cv3$fVakq6&tMd6*mCL1bs)0(R$3QbTfl8bl8D#Fw2x=rXa!d}{BrkGhpxasm>F&`eOkka2*(uyl5f6l+T=c~yb)$Aq*Q9wTr6XlG zj3ZAa4Wv+eVla%@<1tPf+RRih9OelP{*rxgNG#v^lxWH?e*8JV{6%Hm0?|AuF(w~h zkP5p+IV_#SzVYHHY~pomX~ymC#{Eh7@sA&PJj3ng;|`HVW<#eu)QFK?OnlrsuX|^E zx^SLJq<=X`_?Krwhus(uFMCEdvVf^;WrKxCCYSuX6N zVDSdiiHExfZr`lbvy!6GuU0fGS8DwM7QIrCDd&AFo(3fyD_zeNbj8=){ptW|IKH-P-SPvMU^^)8Pk}m+jV3XS_b08m7LL5xZMIfHZDE-v#*UgWqP@1+k9oS zES^R_@8R%bV*d6ul7;qA(6$oFg{5AYN@Xo+DEd0x>;XDP z-~)+t6H51Ybv;*l@APuwvMTAU4k7iRvM1TGAQtFM)K=LaBWa1m9O%7sZk3!9-xlG6 zk)u)GQz-SpJURm_zCTf%k(EU_)qqTqT8*ULrNTKKYX8A1{y0!c_F2oNTJiGm=xvrIzX zMQ*OI2xffq`5iy}+Y{%Du*(W@hos1HF3hoTnBnEIv&<9wWSrK-sWcwe%IR_A&Ao7Y zihTYHh?C2jkB5mo2d1zi=mqHf;8eIxiEq`)2lQX-h&~#0`)|f*_p8x0?MHS03Rna_ zGo$v7X(dh_%M;f-*fpbsMB6%5Bi)SJg{+Vf_CYw#3#}W+P$<2zp58*vy!a$@l)}x? zaW67O&I)-JzWx2z%&&Iz==Ot019HZ?kXiYLO2Lil(|fY^=NFWWKduG+6)|BqptikM zwu=%I?h^|UQ}f+S^f6@$kxOw3LL-pPHKKy6PtQF%0fK}|MyNbm2HikAc@Qwef|MvBvKJ+Vg-L~1%ZaUJuG_|1 zjYkU{j)~o(gk0&}&?&MzX0%uCdM4|Ldk>8wol|Y31bK-pSAnaSk=L(gmX}9lC#?4? z4|n%m9yjLRxm<)?0|&a}j^-UXG(>UllbDOdsxXB{SSphh zwoORqKw2AwI0ECWd!CZG#|1GgXO^3pd`N5v=dx1Nc-SY}ePW4`rFR~mE&ZOljVJce zlV>T4@F;LULaodk2$*qtbs|u@^0;;0+;_gZkKA4&&7gF5n8azOcV%mhoD%c#$m#Ov z2CUINNQi9PhKT!Ent`SO;^~qS1(Hjsv%nN1_r+g|=PDq_E&k@pQlIj9-sSHYON?W| z?_R1oXXa%lXrWi5FgdX}czBP6JVqtMH`OarePAf9qAB{Ea~PSQUb-f(T$)<(oehB| z*@NW7gYR}($&)cB-+g)O4A}-p&5YbVWUZ)oD3R_GbObXUsGx{xBld#!#>(uJ_VIfX zd`YQs@=j)mU;2RR%9A%}><)rEkVxXYrznb~Ot8XXmw5T@52(9|?TfGZ$=}}c_|~DS zyTb=SAlro(OJvE)As41)q1DKn3tY};zI+hgUf{9{_ZyryBVNyB0x6{t?pBbf%#)Im zkS62jL9h@wguum&^Ed=wnenZG#`@q@H1pLE`NC@n0k2cGM%0YPQC`d{Au8g zWaQvDu->7xK&fs5^+}KW>Y92AvPxj;l|E-eGR`W@z0$4HYlGJ5NsufYYvW71=AZxD zw=_52(Vwj(bac<(j0Jw9uw33# zw0bILjHq=t*`^3Gd9*r43F5n{TG2d{ZHNf)U5|~Ke5(%l$;rrRB2S5wBUA1!011$T zQF|ncaxR(P6|BS;NKK$fE`l}<4pMAz(|L}qHIdIr{TIWu`Aj54f+TW zpEc$Wg!@e?8i=70b7sn!R0?JF%P19R@9lyy2O+9qEmCS>m5B^K4GKQl5fdgNKlpmj z*1moh_x;&3tH6`bt3FFh_zv*LW~5Jr{$PA&#?Q<+nR0xY_$MD<*gaHIy-+vEAp^py znYBRPRwsZ+LpwZ{iH{D+Rk?j7^hY*647Mb=7rZUj<6gF_Ycgc&bQaX!+HVTn66=+5+P5- z7oQU5ObEt$Da>{zoF1S!aeRKbMYOXOVG=j%#~wWYY7=H@XmEME2&6W=CqbPbMoc6s zk~7O3InIIoGGhV!=LnSAD9(Xl8K`pJQ}q1We(8x4D{kz%3x41q14y2b`OLyq70?>EOhr6n*z1iB?xv)dVGmN)Lgpxj12M z!fmOJS|84uF#e0-H$@hRcY;-fhEP?Jt{g&O%85J)`(4z}9?0iu%un zn*VOBQ^mohSrp09jl?0+h=?dXfZ)sP76K>vRX&f6iuerNi}2+b)m;tb)FZAsJ&)%* zsST7-L|bLsI@^eTiBo5_D{l6%TwRgol~z~g6p41h(vkgfVZPdtt#LlDT+W?CKXEEX zRCw6jklbQqKYI}8Y)5XocH@A_qDql)q8j7&92&ZQ%+4kOr6rLUWG9=oo z858D-zzQn9yWKQ-$NMC5kbn%~hDsQ0%<#@&kD5n4h`2&EI8fEZY1ipv+moxku) zh|!72=Tqum97REYiS~ zwMUvLt-6U+)XmYG8NnL0hmnuA(G3m=#h~>}4&9lP-PajdAebwri$-eAgr>~aVG`5= zB7r#y`@`(wHWQ>9r9m9$JOGkkD_ z{eF)LXkD?b(ned%9PpG0`L(#^_YH@`l<+Q>zK6h@5IKavbxurEqRPTrBe#zyzWgR~ ze~G?7QXjpA7}4&SlCFLU)pZ4lgpkH=V~9qF_bA866r*duo|d%g0bWlClPVJd1{G2galKVKGc(zbYVY#Tl<8N!Y!35VUxVVPKa;Ng6xv_xx_8YgU9J@Q;# zg(zy{Vgf7cyI6HXLRx*dgticQVkoObqBf5Nh>4J37YaGToFX|Gg~Wt1N%J{5ou+}- z{Xof~vxRZNOnX#?UB5j23h9~#%E2y`-mLZs8<>>+kC z6NX3UskYRZI4qItLt?p}(HF1K?Zn^y=oftU%Z#cJLS|MtH5bd6xVd(#iSxN}U!fE~ z9OvlRDGAYu&~ftUbCe!tLiFyeFp>I3R;A`h9YvAia92@f8K1Ea-lGQLVVGp+;5!q4 z7Js#%Pce|D%rwF2Vys(mGI(vwbMyBq9l1VcUL6CqPXxQrtdpk1;d()K6WpD6xIH14 z6L)K)t%7veH2c_ZU)kgSHMUA>8^>^m^p&kQ)(XG;;)V`5eS@Vpf?$H=eShIyn2?EFL%srfjAX?ZYkW^j3 z6EoS0hfDTCs_^sO@35A?d528xjZ9Hk zFB@Op3HK$jZjBzH$=HWA(qA*6&{6e)$S`VI!E??Gm5TspqQ4`Yoh?jeeiuAQ|t_Df(n9H;`9vT~_DN+}Ap z7ee-~Mm?&`B1HF_Q2iwj5tt@=uh2V1CiJ`!1$v%|*+{7o#aL28TjL-?eo7hUS7Mg} zlo);AG)7xjX55%B`X53d6+ZQZc(%+?YxQTnAJ)5a7#CYhHzu()GRM&1RgB;;JU z|N6xFn_EH)ga+FgPAwB7To7(@BgBQ{K4DhaN~K-Sw5|Hs+Tce&xnoo1q%M2E5*H(F zqtdtcOsMax+f;-cycqe2TR#{jdP&s%If`TS7F5w`^8HX5c}yAyA>5-fqZrZ}#WJlb zXEM9gkr>&(m?%H*@P+VGQyxXQ8kf*F@a}ARfA^IJ%I7;~oCK;Gc_;MZM3FdBj74Be ziOD)aB2kPit{QE=Xd;M?1HNG~Ipt&|Bj0^?$Mq1nyg$a5XIo7=|Q%R;9y9d=x5^9RLnns=Uj;hrY6H-d$cj0-Zt(UK%0j0LQbrPJtW zkH4x5N4T8z#wx;;GM~NuhOHKAYePxq7@#LMSa{a)>AxPEO5lAsHnR(QB@I6$(CDS>>_0kB-#FTugpJ{yc%WwGcPa9vKXLhq65_Kz- zkO_GQwNlharKKq?faO3+E~Afea#f`@M=v$?$n{=O8<>__s2Z38D}He(iH zezptMXNj5f)1GvIh_fo+1O8+@8-H#_#gHiwLSwBSJ+k$HYG&60aqV1Erv+Ftyx0e} z`M~}IK?<7YRAiFB@}T(RIZ(C5n$+|JT2| z=Ufo*?OZ^ zw+4`e7(k-|HMH2O8Du$o0eagdww2)FUEMTj6e3C;Al7Yd_PkK z4eXW?S6-VZLz@u0XL+gk|366d(RlBJpkOeCcLJx_3tgg*Aj5=war+K=6raiGR%PoQZAL#AcDrk) z*9T7d0HW;Lg{YO*1GTxi-SOYe$8pUK^OGr7g{f`apN&=mF?4zmYO832DLjt2Nk^Tf zs9Y?0CRi|bDGW^V&e?ZnhOR4f?A%;UyuR7-!Hu)qPSudMaXjAe%eQV;RS{-8fwucb7<6o%n2ZrB(Oygp@|oqK~V3 zD}HMS5Qdap0`qQ960hJ=6kh_yj7leFCm)2~2;x-+=9wa2KNNm?cX4ITV1A|drQag& zjKNQ88#7};2}A9dgYd0MnCA&?g~zpUZjm}NjGitfF@dg5f>wdPdH01u^SBCW71BUs zn_(%rGV&?jT7(clLMDd(F2pazz&`r8WJjU&$P%mj0meursgLBMHPkwl$O!%%s=f&L z4k`E5JxQ&&uK-`xi#X>xnt}wUOGskwmqBaxotwsqBv94Wc2}v8_j|7Q$r(&~=5!YF zZsHeTR_^YE5RH_CPU12I5q3GbLdRyTLC*&y!jv16He!b5Nt=#1!6T!nCO$jEH+KA04 zvSTKpr7+bEsY))D0{rV=T=Ch%8;W>TiHh(ryhro1fVrn})cXhh9{50nD-r&a@4q0# zN8B7zFmsX06g%@2*+r$8jL~YKOYln|Mw&&;qKg3x7Ojq&QdeF{ZEj%gMw|n$Mfl$M zJa0#5^7VMv`VbO4mxfQnBle*gR|1=Krb&3w&(vYHJG%IJE!I=bgjJ*Br|MkRY( zg;u|CV*-rF7r({a|N7nJ#GXmgdG8{BB1{~CwuAna3nK19;A>SLF7O|He}~3So`u#j zaSEJDMw{<^P4QsPU`_{dem^NHb9BOf3Pxk(a5beW>=)R&XEjwz^cJ|D8byVvDQkt0 z8>uvcW=cpXfn8KCnmF0Q@pxd}-LNczogTQqy{BI`aLHe zX{(}}(u(hEA2c|(v^sFP#~DpZh>;}-2{!?oL}GH~wS~YjC@J*DJ_;|7GatR!^Wo8X zbFEkUh+H^#;aobK20~H~FjIdS+cSyg{+W8`{2md(fV~-iq{^RkJA{PTpqkFP30#OmqBzZcVd*{0^4)nTF9`ETzux7rP4}wN{ zM~w!-ni8}UlShk7?^u`|e-a{SN7Umkf~dzah&hHxD=7#PCM+d#*w~4qcQ*3CK_#*@ zdiU7rJ&j9Gs5*AO_2~PfE>w*kTqx>(Ci9oKSHVhSv&2TE60lYglpc4a5FFovbL;># zB+`K4W*m6A>nCzl!tTg!^6)|HE1lx|xY*H?M>;HXU=4e=suXMV-dI-%A(MI`NG2C` zt{@v(jCtC5ArcB9!?j@@1aG$O@=2#FC5!Zg90cTQw)4H1_KZy|7brWk!ZKS3gXGkfMgTr&BXL>c(YWy#M_CRfIq_w&iE+VWV7z{rbtHb)7xLan!NN8p({1GcRXnt6h3#0Bt~$zkA%= zYbZibKK*F;uBMxdcA`1yA#35JnKWoDY67o1A0Cav4~!p=4(S)qL=Nxcp5z((E_@1K zPn{NZ#9;^}y1#B}&BZu#q&4>}so}+-8q>(}qWdJ`DcvM%rIWe3D*VT0{N=OpraW6! z=rh3WbF0WEu$dDqQt#Y}upAfu(RUx2!$b>#K203=nMF2k*Un{2AWEj7VPT3-yLjK_ zigb!ay1_2GEF2A7x^Z7UU0bZ?>&(rcrHPGFB3T=yHd<32A3MEv$`;Y)5jq`Qh%w@Rl)xg@ z35ZsS(bJ_RB+^`I=DxTnjWp%N%fpUW*E6rLGZvN0cBa-w&Ia>=H;;|SHBeMo=16oy z5P3Yr`)6NJc`pY2N#w9M^Ch4v|M05tf5eS1?<>-h2hNF)c!)lp%X3Dn($uq*0Aft; z7O#bQw*w3GR(vF;9Si=#q$v<{CaBXJ2u9mFy(nUk=1jE8n@8cV-ds49&5e)t8*us0 z#&&*Dx!*?3uoy@&u%yH^FT8xU(8|W;?1R4;BW+VOMbw1W;qKwW8R22uoR|=NbP$3s zBDYfMYUG>|tL#L`-5p>TfY9G{B3%kGN2)c?IjMK#7HOV(=di`znNngR@?U(K_z%D1 z=$GD&wRj(Sn7H#DF<;!iEiMR_8E_4Bl0fIw8FX!qP#H`ddyQ0woR}}8+5RK#sO93fLZSHt) zy%IW(&C z?7kwHv6q6F+hIcxj$viV3#7^RJ`XWGTVK=$_1-(0B}M}9C*KXAuoehe zxY`*SW>!fY_xBuPqqPy85FkfaFdC70WM@TjBgNX2ORLogq0_sMPA@Gp(=ix;PCXO!4QzPZbJVCNf>w&c=(jR=(xjsBF=QDL% zXf4rtBS@#^BV3fnd&RcM!5X_Mvz5-3D&Ir+i3oo?X29#S`R_ZSz<7Z_0)7klJu^N$ z7C!mqng4UXLi-hSHqOxqDUf<2(XjzX3e`N+LXo&k^yc^AK56}bu6wO~~AR*64>&qCmh`rd0%Bh*3*fq(g<73n+v>l|zh7 zDNrm@wG*w;&BY5jRxETvHc}Q2lM%uK)reIvZEUUn+BhrXMOQZ1W4tuudd&Dg1AaOP z_#Y3c_#0qecBJoqi{HAsrLT9$qY;+GZLPGpXQzQfy%4*xw-w@^{Vt+!3;SlQ(}KL% zNU3moaBop5MhJ;7-wLOPjh8Q8bCs{z9s{*B;(p`Yll4P?b}CESDGcJAZS*n zLzq!w#JbXRLQK7oNfVJmtxzkR)-yRP(s^-$9~u|zUT7` z>3Td5XMt@NTk%wYa^dk3IZ8#+LX3N+ zdGU}vyKt&TNsVU8xhW||x+YeIV!~>H+GnB)slya9^L!ws4*h|WN_vOJOHM(D9>9~uqoml(gZB_Q%kRBt8_&%hs8@c-pILFQz zC4Ch5y$U~kw7(OB{`A)}zNl{lzc=*zvl)lS&RjNPZS*ph^&v1(C=!sE5gQ1%0Z9}Q ztX7ZujtQ%Un36|O#Dq0R@ANoPdMEaZcBOY;c=uKj#AozG9&a}uP8-{0_0iq?fo`Kh zPGfu%-ubOutYE=sp!4js>Th2!Y_)LK#A*|@t7kfeh??=TDYsjpJU;SJ3Tt;IT@3Co zm_y(ggym_GF2eWK_@})QTH{{~!{$)}zZ-<#8K%zoTCfj9X}9D5`pL@ic;LHpVYBI7^6Wb^uGzbcqmEzXF8MVC_jQEma`B)ZmbRVG{Kd}- zTUXAP3$<2P2$`{&I`LqLLTU`}1SEpc)s1}>p$Dh8XN)U@PlE6f5K`g?G4YdW;w)b6 zuC-8N;wSfon<>(Rk5e(HuSe3r;Y3&DwGCnAR|-lq-2|vgMg7_eo{^BnSU{ zL-=xj0e9bwOHh?nmG8dDg#H%F?4zpLlbK@xWJlOR%`;+wNM~vdks0EFt2t6a#x_IG zZhyI~2EB4#9pTkRhehzUL$XdZp<6)vg@?@}-gir4f4w8z+;IKjHK*N?UN$Hb>q)sh zR`TggyI(2i6}=cO`1q{|q;RI1aw&hU@DDm zklG(MW4Avd!I)BH$$|9ELnUe?Mn$x;EJ{d1iZaG@O5c<@8EFnI^Tb)tgw&BwjNkgg zFPrt5jPrJUaUTwe8CN3>)t(I`ux5U88SX{P|KS4Y}(zcyS( z{dDj|U$m>oHCPPvZfvc&7pS#&$eh~Mji(`Em(KR(E!XSHH|quK{T&)fpWc=+whPa) zbYw)18%`8XIWy&nIRy@(aN3MZb?-wpT*^K=s@qbqQb=V(FPEW?@|SM^bjgW>UH3y4 z`$t{*?cVtJz4ICH^QSqx2!Asq_Pd|M^=E^yEW$5E_#8NmL;fk3@3s_g&&SOB?I~ilq31KYZuH)%@48N56+cMC zAT;-%*zo%3JMP*TC51kiF4FAi);DEi`!(7IN^e{eO8qfR(;s){*6W6b= zX}8AJ2lwo6-f;gVRD>7<*hcTe=AC9Xn+RLs^mw5bC2}Ez#B`V(s27zsRUS`gsu|~; zDeJ~px3|3L*QDJb)LKhAApkm z(T(3fgny;NzZv3&rx9a(&oFxgUXBavJl=&L{eOJD+plHWb>8wYhT%H zvPn^tXi}D_2$2yv0_0c%k{Esnko*bpLx4Obc?$A(1cCDqnNqHOw1$60r+7sTL01oN@l}jCk)J++WeVfw*_L9GFcx z93s0bBi}6Ky+Epmo75tIjvWpynK?NmQ-x9Ls>n%e%iB}qZJZj#x;8T^l`s+wEfZJ! zM4XKACJ@4kZs=Hg@XyCUXF{ifw}NO-=an;Oth}(qroiZhVNimvr<_$1+ympc8XqjQ z8|85l$dVw%7L5=M-vy95NEK^_Mc2p( zC0972^Dh_Qm=e+!E)gN6TtTktiPs~$r&ny}iD6k-r^L>zN`Q~DPq{;KF!0h4Eo}qA zIq)8*%ID8I4q2F|h1qJHM;0jFW6sw_Iz~2D!IOtlxVF+T{&h2S4NX5%SRZeAE9`RN zFRc!MkG=NWlOVSGx1WZ%d21L|sa(6;M&>@33jd54Ke=7_;7bK8D#kb!x>A9p+Dy*wB?GZ4NsohcUtc)c3e$-+xt=?$RaeGD zJpeoa&Wf=WxG06>Jxf!SN!##u))7qcsfJZnGc}bTh_BLcD|o4n{UmkMjaKJOp>s&y zv7sV|)@?I7nq-e`yUFY`!}nt=X=BD~W?V0Y+zoV_iF^09tS+u7PcqpBoYaL_$OI9# zzB=9K!^Df*%!-*=AoxP(j3l0}Gu9aHF-+scM(gKtd;OGq^FwZm^1uE5#Q*-!pE6?A za&Q#rSlwu$`4CHOpG+9LR^^=?+fD5mec0a9*T3-q7oLJa7LONC)bz4-rQXp=;^{$I zW{-CTQ6pGp(ZHao26>c-qp)*b{S2zIrV0&Ef@N4Te{RPAYsS;IN%~hrw;zqP_uIzw zpsg+U%y_n`0D!19$17+Rig{lU2mhj%d*WkQOU+6c=#U}H|pFCx0 z{m#FCRbRuQy^b^BZQxgcuK~jYDDS}ToAA*a5WfZULzo^4KRX!vo#RW7XJ!fXQlo!L z>gZO&FjUj|l&kVpI;HQGmDP$mCLyQ7ZY<1c$IanD-YaK$A(*hr#+0{o0?EN#1d|$7 zp-xbjSzoM}@Yv8{=WF7{8D+g@G>4>w?;L5)_?k=zx9JvYHCN9Ii5~BO zE|QDVxkBd)**R#@I5=UlfniQ)sX0^GdA!a{F)@vfc@Ljl6}qmlS&yuTj9;dO;ylGE zK|6wUthKs|=i=GNiW3UK5nRAp$XFU@xGcQ&y3v1FPc0qr>v!DOPk_G!zSTA>1+L8a zX3l)B6s|-_DdDuS)T|~`T1%+3QY)NeUXe7Kx#B>j=K2U&$rLN~_m2;cXmj3I_124L z&v|-%Lm3Y|kCB-3OXJ(o7+dbB9ctU4F7%z%p1eAT^&Pfa)318gmN-ODbb;7ljs+p6 zrLMLJYp3)vGPJ7hG&+9WT7)BYu|A`oWJ@W0+X{cyHl%VAr%>(?lwEt%LEtgQn^iE+ z4MG$+SH(HcCkTV5&e+T-CF8Z8C_PJU$*3pf*t`=3FOFOy#atWw*RY3ZkFRLTdy`4Yvc~Mugr9_gV+z zD02?L@My(;is*&_&0<`Co|q-yY%fg3iu`vz7AJvtZX58tBwZs^i<`YGogr) zi%>eFGh?uJf>*6VELT|d!r59`tv%NFJo)R1@jXcY75v`&@Oyt%`-Y~UN)@H?g^EJH zsMTos_fY-?JUhVn(AXn9ICI>;cSepiu0ENu&I?3gk%D=TUpxHJL-6$w=BKS}FoA7f0_VoO;w%Qc2E*WCJNVRtis^ zRa=2`hWdnt8ZksH%odokQl`Y5g>jnkQ>-_r*OswEUF5S=*>p(}!-z%5#Z#t*!(o9U z$idL5LKMH-O4`r2a&~D|(O&@nuC<pH3Ye=K1 zU6*H8BQRbLbFG3L{~Y+BEr9-RJjflHYLU9IJOX}6YZdU+IVM%C>v+~uXTR{kv67iC zPfQjX%A_6$qV{xY0*e$0RVmZ_@g^DZo?wa2pc7A^Fr0Zz9SlQNqUFN6i2@E7R%+m# zD;a0i52mfUerY~DiM>7*nrzH?vlNz+d7ps!O2Wv+@TzQE%zB~vWUOJBYC5l{uz(oZ zq*l*4ktx;Q(ArX#Q&mn$HA0W2uxqcYYpuK6MhKsdm2>+%Zrb;I;L(d6|MLI&8NcyW zL7dQS1};`RW^;rNy56(udb;3PQpQb*J|2)%=$heKGE50Zl$B-%U6^oeywW{5=f|HY z|K}fM{@MTc?^sM~yUu%J$<-9zsyl0pzN*P-{~}~799rk%xZ$pwEd9ng{^8dyxf(0! zV8Yj^l(N*Uu~e$0-D`^uj|@)HQt+J+a%NX*?Dk{+L zTsgZq!SqAXFtCrUTqhYlH5IPYt`ym)fVl`b+KxOtwreU?~mjgsnp-n)SJ zu#1V_8LM?9Y*)ypW4-OzoUe%8KwkEUADD*?-PsDa?l1y7GfXp68R`2-w=LMb;`I{Q zdBqNnwA2)Vj)-bKq-2C_2`iQK9_i>1#_Wi(ke6Hyw<65W;YwG#C7S4Z$J$rRPS-{5 ztzb@uoa1Tc zC=EYSb+6h9=Qua`82Hzv@ZJ3Z`?K$IvtBW5)_h^RruP-}DbA7RiIOAYd%Sa4iC74j zWl&dp$ZfVmYtdz+QlRI^$GZc|e1)55$~>`O7IrDIZzKrr02P1U|Bef1FL2*EwCgDS zz*(<^5{WL5OO=|MWz-K)5~9=-K`EF-o^Dr^W#NGczl!mCN{prOT^3VF+pv)KR>{QbMiJOF{iW=V0ZGZ3n;o-Xs3-2hZRvG(%#o5WNUpjJWYY8OO>P zYYWhEes_!rxhu0h1Ktwhu_`}tj)Ql^u4i#d=L5N9?rl4AX|1bV&D|<>BdkzW#iS<9 z9_9QIN6ZOrtFlUsj-MMcYiyzb-`dPC4^k&#mZ$fRZ)v07eDaKM{jdL=-|x>@f8jp& z?rph}z`resy8ECnxhHuQW7eE8J!!zKHtIArG|Kb}D`IXI6Vumq$ z4i@m1p$OY9x7Mn!?b$T3pJDKsUNXrAaKfsQUo;s`1>bitFLW&{Xi=@flde>{Wc!@# z6`K&R2q#Rfef^Wxd3p1;7H~_fA&)V+nsb(wxp>wk;zMYPu%#yE`pnvABveyzsi8RZ zIuoq$(e;WSEynME4?g%_6)$`lSobx+cHG0i0sg2Rx?i+5=x?-tuiKi!rtbWqQx?BM z-GFr&Z$@zfox}P-xi}}UH@Nk{Gzx9N*%Zr))hgV#GaK(#{7GyG_3k08Wz2{&; ze?M||=~zFw$JzaXG4!lfM(OG`$hsnUMSEq!vmORg>FK4AQzXu7`aVEe^Wb43`b)%a zcsgBkvt-f~xt2hXOmsbKQcYBzjT8;sp(4CWAx)7u)e0y`#)Xatn=RQELN&%Rb}LHX zv+fJM8uyqW&b*j9N-TKOrnt)0$f&VkDHC%~UmB=1SJ^T>q*9YdFRm93A7=h<;7=Py z{&>@jCoR10PH*@Kdwd35=M3Y>92dfFhdoi=@g5C<()T#;Ie1Tuk+mxf-nEC%Q)1x| z3rM0^O|r~Z*rZIznHU$wapY==q-928WGRK^PJ1q$L~ZDa{JY$Vy*?9R;~ajqCZ3&> zR|CVUBgRb8Oil@0sGgUSssT3Fwj;$*FO;=sUcbo?uW#A=%*DF!&c`$N_ak3k7H(Vh zux$&-vu1K!KC=UTn(^e@>vbnc|JOu#)CF!=1Ao2k_-XOgt)2^i|E(2&_npj|h3J%> z-;k44m6m0qgi45(P^-OmtvWHH4>*%5dhmguLQnzM(OKrrOXYWd;Q{~b{VPTvD#E1s zWK6)7n)NcJ#MIiCpSDWvGuQe!)P4{6k}9d|cz?6ulVM=?q0SRkdF(xd)>d!UIwRAP zG0ID?QK7a$th7Um?{R70h$$KM)r>9Pu{$1~+Uq*4+@>bVIF$e&XEKl5VeGOLzJ8r} z7H;{At6QQOzg!CM_QK7VJdy5?|#3Ei~ZJDsyi7`NMamH;&#s5F2;*ziSIn0 zDYoFuNUk#Fiu2Thy!y#<$~dj9XKAxGRsD1`!e08lN`uH+8^G^HNFuy_U-{j4pVH^d zwGNPlkRm=MqK4WE%`lV%Ik8WLc*wYw;Cug4jcPQE6`9^u`afe~@jbz1yoX`|w6Iu} zjO!~lq;jHk)04E{BQ55ttvRplYfDW;=!OnU9X>6TSiLWXVhWx@R;70Z^#$<|xtUzoj|WnIqj=3I-W`Hp1$wpj(Xt&;1h>Fcf>=`uo*4jF_l zIHG!VJ>WJy>1@DnHY}+c-ff()DN$}Chvze&d~n6}Pp`QB#L-z{yIz>qJ!&0UjnBRP zi1P=Y_~1TqJJ5&393%4**>oeh?`k(ijBX9H1&Zrx2g8(37Y=jJsxxL2!e)=ZHsW&2 z%}r)rw3^}_3_5YeP>CFiF-FHoSC5r3vrNKa>LBInLGly9t%+9WwfmwxbR#w>i+KiD zxV$LjXb=)H3ci#KmZ~#o-H|Ys+@qs%Jqmph7!O>Y_e{4pEQ_&HAucn2mNS2B#qkY>5u|u@h#x%=$D3+@^ho5yzGOUbt4eT=*J6OUaO(pftOlO>z-Y~%kP<->E+tkN zPLxH2B_&)b3~^zT64%SZAx3VS@S(I>4tD^Qr<>F1_w8hnybnBZo_@XNYO^7)R-9jM zFlRMNxi~@>D0wEw8P$MUB7}~VE9o3@h#0eE`g1RO_~Ju0fAs+mOW||vb#}lG z4qWt!I{MzS6zCo*eP;!QtGvvaYLzTQYnYLMF;YnU9K+&23 zlInQR;;PXwXH-1SSI=1QGQPE#G7InA6aKs33iv*dvv7MG+3#ULt+|T#`NKc^K4WW5 zrdLE;>&Z2L4fuu#k9^=SFE9C%&5DF^sfM_M54ED0b0Uf-i;+}uuBm>gzc(uq001BW zNklnVR5%zcD#RtS!dNvG ziILW=^K*M5TR*-Jw+FL=O6EF0!EcP> zFW79)3F~{za*3=IZ&#$}&j@9vEQ*Yg_~C&ceQ(G0Pe-2q=o)7aICqIS?bzRDq>H@v zxbVj3?@_+|MV632W`u>^mN8U-YA!6m4TXd%eK!PRPcd}rq~9fN-PTFf<)si2*G>0wXZEbQC6V> zL7(KpWX6XlL-=(&Dfl}J%&I-S=O+l0o92kWIf*^)az;wwEG1-7uDxf;nK=YvsQF1w z6-}8-Gq%+DhbN^lmO_tFQsyQnKFXQf7DsWKsL3mW`%ck9cL%Lo5gt0n*4|>XV9vm0>e31u{h4L^}<$-;ugNUUE@>YLC(COnna(Q z@v{?A!^>0T@im?#`*yA6N0WvB>7ReZH{Q8ltDkHLRq@m_Gf7utFcelYGdfQ!T0{Fv zp)^l|SVaa^#C@rha5E4k6+?1iwhF=>gQJrgVWAmpUbtO)4wGY93UOW-S@D$^`43IO z#?RT1jxFGKfX}J&;{2RHxPQ(dbzwI7R6vqT#<$bIrHF;TN|b3;gnBGzELT8e64y53 z`ZI}D5kd zwReaYiUqtSQV~X5p?*Q75;jy}@&i&5!7^IPOEoPgREfLw^J((HaB3fbMz1$wY3bR; zSTSNrNku`F=z4saAyp(;MwqihCnH8Lg$s&-}d~{FTTmcFF#;^euhfzbll8FEJjaNLw2Du@%+lu4<5huOccCi zoJ~laNmFF)jrnjOsV4*>xsKp7XMx(HUnK@DcmiE;WMBWk<|(tgb?o+1EhnN3&KO#n zL5>qsETqm;5Y`8)qB>E=Vw4y;j2-K(XWJKYr+9JrUg|Ge2xzJ-t&#yvgiV!|o^OS5 zsz%nn>qyUbJfX6Xrk^v2v(@F%#IRvFERDh;0 z_>_rMnK&hpi*TTWTt8itDlwP1kUdNqSY;y)J-ss~6Ven(Q)G-CC4&XW*FG6pQsTMQ z3h-`z&*==|HQ>u4&~^M@Z$7581X8((;sYW|P7zb9xiUwQLoP4F9>sEvTadbdlWVj? z&Q@2l7Mf^{W235gRe~yx8eb8Pt-RJ23&;Drd3>}Ttd2^`FSZRUx4FV~6RG^G(}Pai z@U#U4?i={^h>r5@*_d0!=1wZ&b=#m)PMC%k|6QvfuN9M%^QUp;VwKb^R#lIEJ7k5{ zvg;lEkH7br-+cTO=(*Sw0-3Qa?4n?~(6?EshK{pUVBHmNXCpw!c?lE64lQKmmF@u!|&TyUJypg2xFiV*c?NL>FGUN1VEXL9l#K&rR-!>qB()qd9*0ibpES}sG zaRQwS<;ejd6qbW9E^x@6xvS4&%9%1R?5_7*Um4F|C~+_J!wpe9XAg`w-n!tu zue`>Ccki*B1vZ0mxK6}eaFUoxW@-y z3XaIsbr@SbiT;qQLUv`W)&5cOXlYZ z9F`NWj5ZmyFNKg2|KeL8^XB~xgVq6mF`<)0Hiwn^T4p?s%%Xk8&5Po!ZbnHJIWFLq zkdhH~I00AYw(!>=vVgHxkA*F+L}Hp*QZ=LEmFqO{wI6(!lya57-+3S94prbwz`Ne_ z##{C&J>*mfa-7kQ zZEk*%GqWm__aqU#_vDm`mZ21!RJg06DXjQ*i;w#rON=~H1|YHWy+n!d&6{xZ%3<&{``bKaoyH8JE^c2U^gb7e5VFz zmMC?W6BWsYgE=&GEE=jw^|0r~PT5Zmms3>|tMJAffiHdKH6Fh8nEsK2kkCBB1gah0 zN^1cphL8!xkru_f4D*hq8|Zwg@aVE*nQln82V~wc*g`(cM7Ls4W8N>wvn%GC8=Mt3 zrYy_CK6{3KCSjD6@J_hA6yDqlVd&_$D=xPK5N?oinm|yhvdXt1kIiZ(_7i#8XlxEicr9u zg%RR?y|M~%tIM{QrK^6;ZgAo;GwO}ktb zJkH~S5?o;}4KjuxDiyW=(a2R}{dLXwczZ$tIlj-K-4|b1WfKDb_VELJS!%_TBH}!y z#d{oQCzh*qprk}8H<+&rkNDcklAP*p=Bocn#c(AdZQer3EGRiuRaCvt>ig{F7!ThV zh{w%?TBR>XNbbogzJ4C^na}0;w|C{u<>Y{L8mYaU#7fNVd!fy_)~&rgAvKRn^(Cz| zm4%#BHDotbQg6mtJI%YcNuHlO{)d13nBRQx1UY1G7UeoCgHMs2#8@LF@c7o0Z@PrCW7q5K`_CTUg6n3F9uaZ>DUEsa5oXcUI9>KG%qlc5P2> z4#z5Kb!XQ2dV4=#0@e?zDlUY|p!CU@CLk4jPNV`}1Ew|pCPl}KQgf-MXcJof7$L$I|&y&+Fss2X*nOE$=bR@m+kvEJL88x((3!N0K$tp zZpMW{7D_gjSZMpaMIpeC(%bxvISZ|ftoiSKqoP@JJGbU?H zfl{B`jg9V!XPFPMugxsWqFipCp{GPhTSr!Qcf90#lE&&5?LZo(iM z%dD(e@VR8121=YOcS%Fd=_!e<6_p;dalQ&f3c2z#Uv5f=I}h05&H_5M?@cEs!zXPx zcn{dB;<_5a5P@AO%&#_)?LSDwc_EUdz@`HNLeVQa??~5)gG~>njXtiGf;}qS#@{h0y1UFp=Jq*f>UE~ znYA;5uVHi9bx6s4@xJh#i=K;=>I}<_4^C!WcUz7A6_VLwYw1zW{GDatlfQhz>yOWP zZIejFw{}mec#v58{!pr*L27h}Cs$%}uBO!*`QFt^wG@(5d@f|E%)I1;;HyE`N@hxx zH)!Hffe-hA{l`zaYM=k(wg5kGt*>Y8Ad}jI{)@nSs{G{PLrNU$r<|4=%%-j`!lg9j zkReWMIxR}nN}$lt*Ta?6{Yyma^;_mj*bt8pEBQcORpL>rac72Fc{#tZro20y>CGo; z%SRR7qxMq4YzgroUlX!;X+~g=6>RW`$CTDh{>`SgoM z_{6$fh*BfxduFs#`fbO0tz;+YT*!GMlj+qe3BJ^?&`29NBL_vb5^qa0E$6lg=Q|bB zakIX6g7xw3aC`rCcsC03POu_a66TaBv9MbdTa0mulq^i9{H7rMTj)lY@btwDF#uR7OWEQat*n+NN}0gddH<{DiZr#D>h9KOI|G%U6>0}3{H z))&I|!F|@}1CQ=6^d&P+BROTJ#aA+n)kEq1OQrLQ4UTDnY0T_yVH)?0i?z0M$GR+( zl=0CFU1mylSV;sQFc+Z3852B6#!Dp66A~eiUdq0gI}cYmshHB8-?`hi5a%evfNr;# z52R8-n|5r$NgWb8S0R&!l$)g6sy9U{(6dv;iM;H&&!xQN;iWr<%)1LjIg!xz-qUv- zXQAWX#gLf=*6 za)zu`>Rp0s2dnCZsd-ge{bLQiq>YnDHcF{gQl%19qDFT@(LO2$j}=ciQI@{ZHrqp! zDUWyBa{9LjJIX6&h3N!!b^O_(spdAv&p0QRMMzyovPckNNQp-|^B^bQ1}>aqROJ&9 zu6yCX{x9F5dcV(M|7akTX|nY7NAvQ^o7NttL4zl$tBunrs6tB&=s zFgVAMGv_Cjt)0w@p0}^@&NDi;_2pUnn=b+%EE(4Yh9VU8bS|>)3SD37IOIapc{mg|;co9O01a+88%)89dezuCSyEJ6J43QG7CxXh>WTg`zba9jj5d zTW16nq(tV4nw=xn({cNXKJe+hW4VJI`pf{+IWC8RH{N{2D1k{FRtl?}>zrs=a5>YN zRj!kPg&JipMKG-!Q;T4wqh{Ki<;+wH-HD`^SGdHrZAP7Qi1(~R;A~iNwpsJdx6gU~ z&5nz{@Zl#F=vt=X-)57kx~=W5)z5V1f@TQ$rDe6NI-c`44w zp)fhm=T--<-a6yi`%^>n*k?olykZF4om5W8)BV^yU|$vC$+w^I^qogM9vn-lNuNup z)y5!^Mb~sB5UZwBbFH$dnMp|kjCD>XQki%S&(oQ4Zk0b6i*aMdp_I>%qDz}+ymj=iv<2v= z?c|(ZQOVvl2m8A|xzDu!s=(r|adhA27T%1FeM(0e+wAKsXC9Tpqh^@Ba*h`&eDgOR z@LRuok6(OSkg1SdCc72*3EyWtsVXNGq6P*xu@r~&%7boUT7>KZVZEVSbsUyJ(kdI5 zeuZ?7&8i+cc2emeDutESF2P*1avmKuc~@p|LMMvr17B<#`=1rcDoVF8oL9D+4VN3` zXA;pyQa{djkKUyDjwGFvs`mK2zG%PmH8XyaU>XJ7&m+?kF(T&|i7*JhQ%af8L!rnD@6Vy%qRFa&L#q;aSqhSBuG?W0hIM4QjtqW8 zmK|jt*%A@ICORR%nDBTc8HYn+HyUY%DJi6ik#cHC3&TFY@LW9H;?FxM3pcw=pI}N3 zkI{Ky?K);1@LB_5yAFoVI9J$Df#N34wg*z$@bu}zMm+@RbjDk9?B+t(4VYJoE%+Q6 zoDm(2IiacJ`HMoZOe)HsWryh9n~N-gEEroL_jnCWnq^yM>XrmZOsiq!wTD=!XHJ*yliE!VHx6L>!h1Br;yVg%nEf%6vB{+}o zJHoKyY~AteZ(Z`*n;nlgBmI!LT7>IaSyHTnWN86}o#0Z&Cu%aNbfmCmQ)aq2g9=-j z*$#@XG9T?LA+5Mj!KY?uE+8F&g{~B~GUNTgqt9RRuYY{SA-9yzc8z&OnAox3KHLFV zUbkNNMJc#><~#4h*;lHHYm%PD8;G%3ttLvN9aNHbH6uDzOpR4a*es}b^d*tBBbOS$ z=Ziy&Cun^Xizv>|M1@&3_NYn+arzoX=~v=I#FhR9{9Wn&zTOtQxQK^2b&@qVNUB^6TI=89||5WNo$_28oUW@fW-I#zg zGd87Gf>%w&dACJrl*EGExU5(_wTm$mUcQv zgss$8-m)wd=Uy6qqxU>>j?_8+{(t;Bzxwy?@#|lRh$x*z4y@U3l+b&YduNqN<})SF zEHNQP>nyO;>&TMnEfAB($%49tl^AC(l2J6wr2DT?);;ca&+W8FXIP7?^u;){WJPc! zHMSw*J$P5g1YKv`|ElA6f0|ie*K2t=dB3#H|37N2-KTA?Crgf|?J-Q|651#H5L!Go2Q^Gkn+R^0J{!%Jr=Dq2RlKb_TX5 z>CE0DLr^Swx}1>32&u3e6I0x?dh0E^Zco0sV!plRq2EzbAb8JMdX^2W&U+*ou3WRh zv$|B|9)uQYUWmBC@!&y+JiKJJnVAkd^0+6Z$U)9IUu8l!R2@J89~TZwWE^LLz>=xe zRLYgg?v>#7Y+e`AQW-Gj9NsL~%paiSjFWn*P+uj5S$!RzWlt1AN+IT47mQc5!}QLB z_47{o>KxJ!EX9#xFRrJF z_hRHSMlN&a8u*baKNI1mNpP*}I6FV%-HU;TudjLUH6xg!n(Av)rPD~T+9;Do`xZ4U zOKk%k!LSrm6CE?sDT5|_=jl6#x}FDR&rRyc^9VWPyrQn7vxz9eAT!DL^seyU*@0)D zzsJY#f5PLOxj6w<4ks}h$4#j_x#s00{OtYacQP}c|L_I(UwgzChPlQ>myDH6#8+-v zs3@cf4@D|;RXtiIf+S`%R(Y+K8vQP+I4ATWvtB!5NtD?zOBjLcIq~f$BjY^3tdjD{ zVP)4An4h&pMyQ|dPwriEuTLcPSS%Pd&Lo?G`sxkS3f+vBtGW!sbpuG{v1L^xCg?q0 zjPs!;>`IA9*I_n;6)rZ)_Wpof1>{FJoSAXfymGfqx_)zqsG;p3@UVToXd7$?{HKrZ zbMd=h;Cuh{-|~}X;fH2iowTw!5jAutrqJVNl<#avuR`r)5q93A&a)1lEzpZ_yF}d3 z@pr!QfUke`HGciqlt*U;O$%{9LtH3nsl()uiA6}+2xVk-UX^@(ADFE})YAuJPMa!F zNQpETG{+iW?q-T}tb&k+fjsn>?^)D{a=^=oi87Z!PQsERW3(0}QfG~&KoCP_&zCO> zum7U(-~YbxUX#%uZ4sBi?*RXB1@g|x53J_mET04YF?exIb40Q+&#;S*vgGO~lr|Hy zLM~J~yf~uOR+FO&0&d2_MJ%k$@xqKzJ@AsB;uNy$5aGmkUp|0^o?rQxb@;c~HcN#mt)Wa}8b;)~(BEi0cf-=n>fSQxKC z^T@au-R6uluc#CDv%@Vr_Pd#7$tUx%2mnYBx9w59qlD|>($tv^tWwD?Zj&WvB`5&Zg_d8c<Ilw<8YMjRfuVDV zuF!qtw$ukfwcvaL5kfIs=fQhSD_;NIFLk{Cla8;agfvdsaZ@@HGhUn+`3`r}e%tlm zwZZs0XFm8zRhV%7 zipW?+2MVh$yG|$aD^VtP9oxJV@^v-e9bs{_ z1uE|DT-Uqand5a{178&3H{W~6jUpTI^+JEYku{swcR!zMqEkwn~Yi}kC|n6%kAMnZ$|2SOxL7X z$Z5nyMZGet9Oj|(3;W#TSDuAH-^0Ai^mbrcjAiLia*ZL_tSPH4Ne6saXV7!;1T#{B zlweGOwA2tu3602*m6?v)+r+Q@wea{Wh4nvy|K|L<`0PdM_*c&;)9ED}fELm#T&egd4*cz4ONJ*thr3AFFo0YTuo+b7K@g!9a?X$aE z)#krtTyct0`!VqC_BXfJ4$F}k3%846(NK&TSEc+^)O<19001BWNkl-yW-LjNSQmC(W^QJWM_Dm)NP-M2!uA49iLxZpvJe+T2xQ;Ug^Vr> zhoY=BaX1t#XT;TmPF9b@Sjhq3ow0NsV*$oJDHdjR^j-D1u2MD#` zom2v0aCmQI@wl9DT8U<+zRBVnUgcvM`t{ab;cx!sM5?@+Yq^IHlvtH$twEDZ$|S0p zoJwISiGu;|9%pXfJmP2py(WsxXenGqC@By#l;nv;xXjge>8>R1Q79Ifi=&f*^F4j2 z&ZwHks#Ks0(5k{~Ryj$k_5I>%3&8h*V3FPh7M5A{)e^i9fdidL8i-O@*@T+0SPY0N zE4|=y3n|yOlxQJ%p|~DFNtTh4d7+Q|?Vo*)pZUwT`Nf=>O5x!ig!*CI?B8xlW*sl7^5IfAoRz=#pDZ~)`8j^@Z@k;Z~-FYsZeH(@#}r1eaSGYdaa za=@pVi?hUhDdY^+Pb|C;OGT{7w1qy9rj8O4>tGE17Uu$s!I-)u!eJyPhjqd@6$YJ2 zzGn&tg#G{*I<}XE(KSybq z@wfvyXbb&+!5?10S6Zd|58s3@+=Frp#uGS=iOmL5l4^wzbCqK99x0_NT5G^cB$aBP zAvu!NQBtKAoNeH8lQ>!&l1ia(z!$q#%|7dHE7vOG_u8!N)4<|F*v86{Tl&OEr8OM7 z!ny>UYONx)B8@|-LDix#IB-RovoZu>OujnHmQ0!r7q?8CN`nc#G8;IXS#&*fH!xq! z^fHs?TwC9+-en0Pgo0NkCc~8tVug-`Qb>8mQsz8Xbfic@O~`pfajZJeuyVM3fsCFx zdTgA?5hN9)z?2-l)NY1R)yb<>P){dSjf6B~$*`h`7`_Xhoo8L|3Vm>N&Vw4!94W(6 zV=F{&N=F1v@#&#%QYZv3R2e;qBR=YhE%Y*Giy+z1Y;2{YIFE>%w={2%{YZ+FR1uxVWH3mPw189azTj3HYn$cAn(3@orBVtKd+##%w{PM*$A4`4a-aBfc%cRPPwW9mz7PDnrpo=();2A`Ykvmk6TJC0 zJieRQL?I`kl+0{(ziF=fEaNLxp;TgXH5-IdGV7$oPVq^2yaDU0Vd%oD>+p`iyxFUg z^eN+sat&d8-m2{taDK8OnQ{;y`JP2rU15uKtYTuzz~Colt0_+@ik3*uo>|xY@X1VSt{hxAs%K1yoTDj*`86c{%~1P_iNOOcG_?)PD!7`cm2CO5<++8wRu2AKw0;zAuHrtip9I z<4QyYoOk%9NR6|a&7ipIVCFA>!esC;$<-i+Dbqr#-7^_QT$*m0c zxH7Xz%3u>Bg)k_q!Es5?Hjb1zagjZ#OiYs}h%vYsdck|;`PIxH+&gEz!?r~~N+2t5{n9ATdM>FLDR-o8Mli4dy=wzPKb+yE(Mr?eqW zW~T4ykCwc8Tk*bQIaC;T(M;S{OL<=)szYO}ElB4pY+8jQ7dcue%hf zn!UA(TnU5m+`SdIp1Xw|bj0ljZ&eqr+q-o9Q@{z`o;Ax(g!8mjdMZNBkwHc_Yo(z4 zxBtzn{IlPix%uuHFU>RCocU3kGwpaTr%!{0KP9n?W;{L_`QQGa@K1m3jG?apob4tv zWg)u4vQO2FGZ)sAP?C_PdLv;l_`;lhRsJ?*?F8ooJ{5#SG2?7jx-JsDu^x}GUT`iF z&Ea~7_C3qqW2vx>!ofj6z0j+0X;m_4DmCG|EhEJV=WbESqQMw^LV9I5I3nF#AtCWl zgrArZ+kU>?Aod4)YA`=-Nx;14GVoPk_0=llG!`Sx%_&$r$TOutv5NdFja**?lvUwd zYBD>=RwZwRlZ!}LUXVmsN>%mPwawigh#@`YUfZvJ^IpO+0N;7EL6Q+e&)|)SAjAf~ z$T&u(1PeD(q;*o9F?0ojBAW1dBueJs8l-QNSCyu@4`h@x6O?Tb-TH3^%& z66efX1X3avtt!N+Ai0oAX0|{nwV#=Npc6;ZP%E=}CR2ysIaS-?PN5?*rUgSWLa(e` zLI@nVh&sb}9SffrT%r@@FpUV+1S^>!QgD`WuBkK^m`rdsF=rzuhnXjI4%a8*^c5jh`f8`}8=uYm;hPH{oMrx^6u#aL#NBpKKijg(Pqi#=+p@DKB7D#e(i7m3 z83#GzfTOxeQ3NdDKNdzw(49Y+K-OupHzyAaLhbMI9BYC9V z*9%w58P5hc>@L2^jDPv(A8_Z^3;fm>6PF& zK<^8iT%V;QGUaNXnUY~HlD(42tmlDShk}`-(}Frk5(wVmy<@%h^qqoKjc*a*V1Ntn zIP7MQUB;`!7b7bSeP&Xj_XU5nWOe5N2E*q>*8=rP`&r++Cc^6XB&d$s{y%74g3FeC zVX)2tmm{K)l!ZB0H&~~FG_Xvjw&05ildn8HQ(?}9i!F3#Gq;Bm%#3Xdl=~{>+RoYZ z4C3>?mE@w>YSo8(y19YBL5|qds6Fw&> z#*{ox48vp2h}{C$86|Bg9k4oJv2<7*E17#Ps3i`)k+eq^Qq}fLCZ(~p)eRRMeaXzl z)4PPAEW(UY!B4@@;HxdqG(|Ss#CELrn&eDKk!e<@2qjm&z2ZB(19cT-Q@pSU6XGi$ zFE}I5RZnwDhQE2}k(?-|SelrNFc(ME0cmD>q*zIwUYo$5u<;Iaj?#4Hp7ns9W)q=i z48^z=XG}9mLY1}=#bP99C6B4G@iTt4pcEsvNZOZ)LdR$d5xP8)iicb%#WAa|1I!Gu z)G0vcDo7#6T%oU4=TO-c2_A2$Eo@{E0eVD7)L_{g>H|I~D@k-^Vu%Te!bH#D=DPWm zsuySh6^E8OBZ>(wXXxfc?f~CG2lJ(IJ_?;>iaK1%th)}EjYZB3LC}|P@!(r)=5{c) zElYf3uYLC-u#{?lKJBsHb+2mrVJQqLp&y>{wRZm084^cvCJ(YeB$gzP&kO{gx=?f|ce!-a6v&kSBE8FI|{SPcx#YM(w$ z6^V7UT5xc5#ISIz$HYP%+X9~w;b(zww7@j&Yt!w$(q8Lr2PWA9TZ2~-Qp(kyA$F)M zy!t}NTfhDam;dU5$1(DLqb77sSh&A7rzp<=KkR0NXEE}7fA}7Y#S8rW-AnS6$8l`ad?GA2#oH4Mel2+s#UqR z7_3Lv?ByME@h}-a7(tE0kWpXg6>bc!+JL`Z;lD70wIcR|>U2A7{ z*N~?BNx`m_b_~2|#<@6BN+b!W)fQLEP)e+q`_4$xDuFknXr3q*P}ec%MA}SjJun$B zA2{B>tO>X51;~9~VAvM|cnadUG+f4y+WY_UlVg7I#s edj6a2_doU9AoM5ZX(ig z?X~ zobMQOLGwh{_hf-yJT5Cy)_7?%X6HzU$1Gf8o%-7Djl#Gcxx7qVt`$%9O$$;xTk9#X zom^FqcY%Xdk2qoQGcL4txr3$O5>&W|%K4AP8o9n$rG+I@m;LO zW{9wzgknulv?P!SzLvl0!23i>Tk>ekB_KIdaF}$U&}+{a3&R46PpCzL4a6MyKG@hU$(_g2Vaq_@Gh;}ZyL05* z?_BWG;ewT)ky+@p2A|?8yxjz{3zP<u$b#TnQlX2?6qlD-f z@`jF?UNSC6GN;#L$abd8;Fbe<7?|e^mP#oL&tbg7%!gik@L08QlEk#(!GKFJ>bjU^Tn=X(e->d44gVgat_IfgOs>A%^a5M ziF6|H$a|iIj`OZ#BQPPHTRo_>MR7TEloKzBa2ygh*T!WjoLgZlRoddilA-Ilg>m2< zmu6gqKn_)@x0LEsYR%h-Yrw;<^JXvcMk#nvv=8{R%j92{# z8m-EdB3;+v)S+76J67n6ac3I&a?bo*j69xazL`=LG;Onp)4f9+n;cEQ=Vet|Fgo5< zNv(|+fV-+Z-*wzvELb|vgMhLp5i<(#DX7#*l`KV@FaGoMK_ zWj*oDQuwQsIB)ND2G**KB23LQC^zmD?LFUdju*NP>3g2^15+0oXRhGAuXCpcY^dMc zNGV}h^&iSrp!AahcTxri4@`K+InEHwRbf_@>bvArt`xL`bKG{0pBpFs;dVorCjJjI zzP_i>{xno+dJ07Rc~w5&_Z%;ml{@r`@zR~bC(kBUf0_8BQuxzS_@HIYtGz&X*4kHN z(_hp*xuN|^O$f6}QV<&Rb)$5A`Qp`-g#0^I1zdgZZrq%%ThRLAfc6W48V<)cmX(2xDdzNB0Ok5bLA#AIv2*)w>NHN{O6{Lw`1gSLq%DW7_v5qu0oZ~7P}N&iiFLU zG*66HK9<>(r?|L2P48=m+Iur4ZZ`4IFK#zD?}_a&x>CJ;yftA&5rQh`N0GO6;^fTu zUPI<=ooAbKb>TGQD9*fGjF(I1EF~TQ?>57=sSW>SnrpecGezq=Le~*;K}%*dW9>Yb z*p+0yD}_E6yb2e&puuyi6mF@~bsZ`ziBD zr`$B-j&p1~$B#|Wvh@)lxUStQA$D02r02h ziRW@=CBm}nI9Fv1fhcWnmV_FRGe;uabdG~kxRVQ?jx#A|zHP>j_hw2w!={_3SWujl z!duhKD>?H?5x(>-<2f@Pm%@KE;~R~PyW_p|tpdx9%$@csva;9a+*b+M3Br!K+EjE@ zyOvwtvzjLEltOUIlbAU3o=0(JYH~$0P-47tqWxGmLj*~gE*EZ;ncE`h9GRRl<-!ds z+zFnGlzAsb&eSnhG4`uVU0N%0AwqAv=U6ZPZAw?w`*F_PY?tg@3P0SVH0U$@&h#nB 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

=lC*rK4NVcW{0$~w#pIkL)1 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 Date: Sat, 11 Jun 2016 15:56:24 -0600 Subject: [PATCH 042/121] v0.1.2 fixed pip install errors, Issue #13 --- pyric/__init__.py | 2 +- setup.cfg | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pyric/__init__.py b/pyric/__init__.py index cd1948b..6c782d3 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -148,7 +148,7 @@ __name__ = 'pyric' __license__ = 'GPLv3' -__version__ = '0.1.2' +__version__ = '0.1.2.1' __date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' diff --git a/setup.cfg b/setup.cfg index 2b5f45b..c06e077 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,4 +1,3 @@ # pip installation and distribution [bdist_wheel] -universal=1 -description-file = README.md \ No newline at end of file +universal=1 \ No newline at end of file From 4c2b629924514673cc7c2ccd3abe781cbfcf6a45 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 11 Jun 2016 17:25:49 -0600 Subject: [PATCH 043/121] v0.1.2.1 updated TODO --- TODO | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index abb0020..01cf308 100644 --- a/TODO +++ b/TODO @@ -16,9 +16,11 @@ - move to netlink (using ip ?) or is better to keep as ioctl since this allows us to set erroneous values for netmask, broadcast whereas ip forces validity - o Can we find the current channel of a radio in monitor mode that is actively - scanning? o parse NL80211_ATTR_WIPHY_BANDS (have workaround currently in place) + o iw dev wlan0 link sends two commands the first is to initiate a command, + the second is @NL80211_CMD_GET_STATION. The return from the kernel is a + @NL80211_CMD_NEW_STATION, one of the attributes of which is a @NL80211_ATTR_STA_INFO + What is this? ------- Request For Information RFI ---------- From 4b7d1a49293ad1783d6fa087a23f072f40ff6bfc Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 11 Jun 2016 18:22:13 -0600 Subject: [PATCH 044/121] v0.1.2.1 updated TODO --- TODO | 7 ++++++- pyric/net/wireless/nl80211_c.py | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/TODO b/TODO index 01cf308..0d680a8 100644 --- a/TODO +++ b/TODO @@ -20,7 +20,12 @@ o iw dev wlan0 link sends two commands the first is to initiate a command, the second is @NL80211_CMD_GET_STATION. The return from the kernel is a @NL80211_CMD_NEW_STATION, one of the attributes of which is a @NL80211_ATTR_STA_INFO - What is this? + Two questions: + - What is this? Looking at nl80211_h line 1648 we find the definition for + NL80211_STA_INFO - this has to be the corresponding data + Doesn't work, there is something I'm missing but cannot figure out + - iw requests info on the BSSID, can we request the info on any STA? + ------- Request For Information RFI ---------- diff --git a/pyric/net/wireless/nl80211_c.py b/pyric/net/wireless/nl80211_c.py index 247d8ca..af29612 100644 --- a/pyric/net/wireless/nl80211_c.py +++ b/pyric/net/wireless/nl80211_c.py @@ -208,6 +208,27 @@ #nl80211h.NL80211_ATTR_PBSS:nlh.NLA_FLAG } +# policy for sta_info +# static struct nla_policy stats_policy[NL80211_STA_INFO_MAX + 1] = { +nl80211_sta_info_polcy = { + nl80211h.NL80211_STA_INFO_INACTIVE_TIME:nlh.NLA_U32, + nl80211h.NL80211_STA_INFO_RX_BYTES:nlh.NLA_U32, + nl80211h.NL80211_STA_INFO_TX_BYTES:nlh.NLA_U32, + nl80211h.NL80211_STA_INFO_RX_PACKETS:nlh.NLA_U32, + nl80211h.NL80211_STA_INFO_TX_PACKETS:nlh.NLA_U32, + nl80211h.NL80211_STA_INFO_SIGNAL:nlh.NLA_U8, + nl80211h.NL80211_STA_INFO_TX_BITRATE:nlh.NLA_NESTED, + nl80211h.NL80211_STA_INFO_LLID:nlh.NLA_U16, + nl80211h.NL80211_STA_INFO_PLID:nlh.NLA_U16, + nl80211h.NL80211_STA_INFO_PLINK_STATE:nlh.NLA_U8 +} + +#static struct nla_policy rate_policy[NL80211_RATE_INFO_MAX + 1] = { +#[NL80211_RATE_INFO_BITRATE] = { .type = NLA_U16 }, +#[NL80211_RATE_INFO_MCS] = { .type = NLA_U8 }, +#[NL80211_RATE_INFO_40_MHZ_WIDTH] = { .type = NLA_FLAG }, +#[NL80211_RATE_INFO_SHORT_GI] = { .type = NLA_FLAG }, +#}; # policy for the key attributes #static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = { From bce1227c436aba0be34aaf00cdc5122d660700cb Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sun, 12 Jun 2016 02:52:28 -0600 Subject: [PATCH 045/121] v0.1.2.1 updated TODO --- TODO | 51 +++++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/TODO b/TODO index 0d680a8..de47f62 100644 --- a/TODO +++ b/TODO @@ -1,31 +1,26 @@ - 1) overall - o make a cli as well - o determine if rfkill issue is related only to ubuntu - o ethtool uses ioctl but does not follow same pattern as ifconfig seems - to use however, see below, may be something worth researching although it - is not vital information and therefore of low priority - - ethtool -i gives driver information including firmware-version - - ethool -S gives some statistics - 2) libnl.py - o see (1) in RFI - 4) pyw - o look at iw dev wlan0 link - has information about the AP connected to - o add txget from iw i.e. netlink perspective - o find a better way to find the supported standards of a card - o for now, using ioctl to set ip addresses - - move to netlink (using ip ?) or is better to keep as ioctl since this - allows us to set erroneous values for netmask, broadcast whereas ip forces - validity - o parse NL80211_ATTR_WIPHY_BANDS (have workaround currently in place) - o iw dev wlan0 link sends two commands the first is to initiate a command, - the second is @NL80211_CMD_GET_STATION. The return from the kernel is a - @NL80211_CMD_NEW_STATION, one of the attributes of which is a @NL80211_ATTR_STA_INFO - Two questions: - - What is this? Looking at nl80211_h line 1648 we find the definition for - NL80211_STA_INFO - this has to be the corresponding data - Doesn't work, there is something I'm missing but cannot figure out - - iw requests info on the BSSID, can we request the info on any STA? - +1) add a cli +2) rfkill - unblocks/blocks all devices (as does the cli rfkill) Is this an + an ubuntu, kernel or overall issue +3) parse NL80211_ATTR_WIPHY_BANDS (have workaround currently in place) +4) RFI (1) +5) Should we move to netlink for setting ip address? + - ioctl allows us to set erroneous values for netmask, broadcast whereas netlink + forces validity +6) find a better way to get supported standards of a card +7) code up txget, txset via netlink even though cards don't seem to support it +8) Two commands that would add information of minor value + o ethtool. uses ioctl but does not follow same pattern as ifconfig seems + to use + - ethtool -i gives driver information including firmware-version + - ethtool -S gives some statistics on rx/tx + o iw dev wlan0 link returns information related to associated station. It sends + two commands the first is to initiate a scan, the second is @NL80211_CMD_GET_STATION. + The return from the kernel is a @NL80211_CMD_NEW_STATION, one of the attributes + is a @NL80211_ATTR_STA_INFO + - What is this? Looking at nl80211_h line 1648 we find the definition for + NL80211_STA_INFO - this has to be the corresponding data. Doesn't work, there + is something I'm missing but cannot figure out + - iw requests info on the BSSID, can we request the info on any STA? ------- Request For Information RFI ---------- From 31d468b2a4d28e86f6f7ce8c0072bf733425ccb5 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sun, 12 Jun 2016 04:22:28 -0600 Subject: [PATCH 046/121] v0.1.2.1 updated README --- README.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cf38435..ffc0650 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ halved. ### b. Current State ATT, PyRIC accomplishes my core needs but it is still a work in progress. It -currently provides the following: +currently pyw provides the following: * enumerate interfaces and wireless interfaces * identify a cards chipset and driver * get/set hardware address @@ -81,9 +81,17 @@ currently provides the following: * enumerate ISM and UNII channels * block/unblock rfkill devices -It also provides limited help functionality concerning nl80211 commands/attributes -(for those who wish to add additional commands). However, it pulls directly from -the nl80211 header file and may be vague. +In utils, several helpers can be found that can be used to: +* enumerate channels and frequencies and convert between the two +* manipulate mac addresses and generate random ones +* fetch and parse the IEEE oui text file +* further rfkill operations to include listing all rfkill devices +For a full listing of every function offered by pyw and helpers see the user +guide PyRIC.pdf + +PyRIC also provides limited help functionality concerning nl80211 commands/attributes +for those who wish to add additional commands. However, it pulls directly from +the comments nl80211 header file and may be vague. ### c. What is PyRIC? From 1ca14307071560cd06d91cc54ca65b51a05e5a2f Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sun, 12 Jun 2016 04:23:42 -0600 Subject: [PATCH 047/121] v0.1.2.1 updated README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ffc0650..1b920ee 100644 --- a/README.md +++ b/README.md @@ -86,8 +86,9 @@ In utils, several helpers can be found that can be used to: * manipulate mac addresses and generate random ones * fetch and parse the IEEE oui text file * further rfkill operations to include listing all rfkill devices + For a full listing of every function offered by pyw and helpers see the user -guide PyRIC.pdf +guide PyRIC.pdf. PyRIC also provides limited help functionality concerning nl80211 commands/attributes for those who wish to add additional commands. However, it pulls directly from From b4f6359e0ff23ae70c58752b85f7b1672a2ee526 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sun, 12 Jun 2016 13:35:59 -0600 Subject: [PATCH 048/121] v0.1.2.1 added txset (does not work on my cards) --- TODO | 4 +++ pyric/net/wireless/nl80211_h.py | 1 + pyric/pyw.py | 43 +++++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index de47f62..7717737 100644 --- a/TODO +++ b/TODO @@ -21,6 +21,10 @@ NL80211_STA_INFO - this has to be the corresponding data. Doesn't work, there is something I'm missing but cannot figure out - iw requests info on the BSSID, can we request the info on any STA? + 9) add netlink txget/txset even if they don't work on my cards +10) @NL80211_CMD_GET_WIPHY: request information about a wiphy or dump request to + get a list of all present wiphys. + o can we send attrs we want values for? ------- Request For Information RFI ---------- diff --git a/pyric/net/wireless/nl80211_h.py b/pyric/net/wireless/nl80211_h.py index 62ea596..733a0b0 100644 --- a/pyric/net/wireless/nl80211_h.py +++ b/pyric/net/wireless/nl80211_h.py @@ -2645,6 +2645,7 @@ def nl80211_sta_flag_update(mask,setto): * @NL80211_TX_POWER_FIXED: fix TX power to the mBm parameter */ """ +NL80211_TX_POWER_LEVELS = ['auto','limit','fixed'] NL80211_TX_POWER_AUTOMATIC = 0 NL80211_TX_POWER_LIMITED = 1 NL80211_TX_POWER_FIXED = 2 diff --git a/pyric/pyw.py b/pyric/pyw.py index 4a7607e..4dad6f6 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -102,7 +102,7 @@ def _nlstub_(fct,*argv): __name__ = 'pyw' __license__ = 'GPLv3' -__version__ = '0.1.4' +__version__ = '0.1.5' __date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' @@ -130,6 +130,7 @@ def _nlstub_(fct,*argv): # redefine interface types and monitor flags IFTYPES = nl80211h.NL80211_IFTYPES MNTRFLAGS = nl80211h.NL80211_MNTR_FLAGS +TXPWRLVLS = nl80211h.NL80211_TX_POWER_LEVELS ################################################################################ #### WIRELESS CORE #### @@ -847,12 +848,50 @@ def phyinfo(card, *argv): #### TX/RX RELATED #### +def txset(card, lvl, pwr, *argv): + """ + sets cards tx power (iw phy card. * 100) + :param card: Card object + :param lvl: power level setting oneof {'auto' = automatically determine + transmit power|'limit' = limit power by |'fixed' = set to } + :param pwr: desired tx power in dBm or None. NOTE: ignored if lvl is 'auto' + :param argv: netlink socket at argv[0] (or empty) + :returns: True on success + NOTE: this does not work on my card(s) (nor does the corresponding iw + command) + """ + # sanity check on power level + if lvl not in TXPWRLVLS: raise pyric.error(errno.EINVAL, "Invalid pwr lvl") + + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(txset, card, lvl, pwr) + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_SET_WIPHY, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) + if lvl != 'auto': + # convert pwr from dBm to mBm + nl.nla_put_u32(msg, int(pwr*100), + nl80211h.NL80211_ATTR_WIPHY_TX_POWER_LEVEL) + nl.nl_sendmsg(nlsock, msg) + nl.nl_recvmsg(nlsock) + except ValueError: + raise pyric.error(errno.EINVAL, "Invalid txpwr {0}".format(pwr)) + except AttributeError as e: + raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + def txget(card, *argv): """ - gets the device's transimission power (iwconfig | grep Tx-Power) + gets card's transmission power (iwconfig | grep Tx-Power) :param card: Card object :param argv: ioctl socket at argv[0] (or empty) :returns: transmission power in dBm + info can be found by cat /sys/kernel/debug/ieee80211/phy<#>/power but + how valid is it? """ try: iosock = argv[0] From bc6870a2fef09e44a65120a0be481ae6ca19d8c3 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sun, 12 Jun 2016 13:39:06 -0600 Subject: [PATCH 049/121] v0.1.2.1 --- TODO | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/TODO b/TODO index 7717737..a6567f0 100644 --- a/TODO +++ b/TODO @@ -21,10 +21,9 @@ NL80211_STA_INFO - this has to be the corresponding data. Doesn't work, there is something I'm missing but cannot figure out - iw requests info on the BSSID, can we request the info on any STA? - 9) add netlink txget/txset even if they don't work on my cards -10) @NL80211_CMD_GET_WIPHY: request information about a wiphy or dump request to - get a list of all present wiphys. - o can we send attrs we want values for? + 11) tried NL80211_CMD_GET_WIPHY, setting _WIPHY_TX_POWER_LEVEL but did + not return the current power level - currently cannot find anything in nl80211.h + that could be used to get tx power ------- Request For Information RFI ---------- From 120e3041f87fe6b2414bdca8a8b870e0d2b1dad2 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sun, 12 Jun 2016 17:47:13 -0600 Subject: [PATCH 050/121] v0.1.2.1 phyinfo returns list of supported ciphers --- README.md | 4 + TODO | 1 + docs/PyRIC.pdf | Bin 500729 -> 490616 bytes docs/PyRIC.tex | 3 + examples/device_details.py | 7 +- pyric/net/wireless/__init__.py | 2 +- pyric/net/wireless/ieee80211_h.py | 126 +++++++++++++++++ pyric/pyw.py | 216 +++++++++++++++--------------- 8 files changed, 247 insertions(+), 112 deletions(-) create mode 100644 pyric/net/wireless/ieee80211_h.py diff --git a/README.md b/README.md index 1b920ee..ee9bf2e 100644 --- a/README.md +++ b/README.md @@ -294,6 +294,9 @@ pinfo['cov_class'] pinfo['freqs'] =>[2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484] + +pinfo['ciphers'] +=> ['WEP-40', 'WEP-104', 'TKIP', 'CCMP'] ``` Read the user guide, or type dir(pyw) in your console to get a full listing @@ -485,6 +488,7 @@ with (-) are not included in pip installs or PyPI downloads - nl80211_h.py nl80211 constants - nl80211_c.py nl80211 attribute policies - rfkill_h.py rfkill header file + - ieee80211_h.py ieee80211.h port (subset of) + lib library subpackages * \_\_init\_\_.py initialize lib subpackage * libnl.py netlink helper functions diff --git a/TODO b/TODO index a6567f0..c5e4b1b 100644 --- a/TODO +++ b/TODO @@ -2,6 +2,7 @@ 2) rfkill - unblocks/blocks all devices (as does the cli rfkill) Is this an an ubuntu, kernel or overall issue 3) parse NL80211_ATTR_WIPHY_BANDS (have workaround currently in place) + - after figuring out _CIPHER_SUITES, may be able to get a solution for the bands 4) RFI (1) 5) Should we move to netlink for setting ip address? - ioctl allows us to set erroneous values for netmask, broadcast whereas netlink diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 8d8da946a3fa0a6ef117c6e85395d73899b5bf43..154ef480365443aa298a4cb861d2509949fb6640 100644 GIT binary patch delta 57621 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 delta 67799 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�x)K8S2 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 + * Copyright (c) 2002-2003, Jouni Malinen + * Copyright (c) 2005, Devicescape Software, Inc. + * Copyright (c) 2006, Michael Wu + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +Redistribution and use in source and binary forms, with or without modifications, +are permitted provided that the following conditions are met: + o Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + o Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + o Neither the name of the orginal author Dale V. Patterson nor the names of any + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + python port of ieee80211.h + +""" + +__name__ = 'ieee80211_h' +__license__ = 'GPLv3' +__version__ = '0.0.1' +__date__ = 'June 2016' +__author__ = 'Dale Patterson' +__maintainer__ = 'Dale Patterson' +__email__ = 'wraith.wireless@yandex.com' +__status__ = 'Production' + +import struct + +""" + cipher suite selectors - decided to (over)document this because it was such a + hassle to figure out, want to make sure I can come back at a later date and + figure it out again faster + + From nl80211.h @NL80211_ATTR_CIPHER_SUITES: a set of u32 values indicating the + supported cipher suites + + The returned cipher suite (from phyinfo) for an alfa card is: + \x01\xac\x0f\x00\x05\xac\x0f\x00\x02\xac\x0f\x00\x04\xac\x0f\x00 + which is not a nested attribute. Does set mean something? I cannot find + any reference to sets, arrays or lists etc in + http://www.carisma.slowglass.com/~tgr/libnl/doc/core.html + Another way nl80211 breaks the rules or another way I'm just not getting it? + + iw 3.17 info.c includes, but where did these values come from? + case 0x000fac01: return "WEP40 (00-0f-ac:1)"; + case 0x000fac05: return "WEP104 (00-0f-ac:5)"; + case 0x000fac02: return "TKIP (00-0f-ac:2)"; + case 0x000fac04: return "CCMP (00-0f-ac:4)"; + case 0x000fac06: return "CMAC (00-0f-ac:6)"; + case 0x000fac08: return "GCMP (00-0f-ac:8)"; + case 0x00147201: return "WPI-SMS4 (00-14-72:1)"; + + The only reference is in nl80211.h which says: + @NL80211_KEY_CIPHER: key cipher suite (u32, as defined by IEEE 802.11 section + 7.3.2.25.1, e.g. 0x000FAC04) + Looking in the standard we find Table 8-99 in IEEE Std 802.11-2012 which defines + these values. + + Lets look in ieee80211.h and voila we find + #define WLAN_CIPHER_SUITE_USE_GROUP 0x000FAC00 + #define WLAN_CIPHER_SUITE_WEP40 0x000FAC01 + #define WLAN_CIPHER_SUITE_TKIP 0x000FAC02 + /* reserved: 0x000FAC03 */ + #define WLAN_CIPHER_SUITE_CCMP 0x000FAC04 + #define WLAN_CIPHER_SUITE_WEP104 0x000FAC05 + #define WLAN_CIPHER_SUITE_AES_CMAC 0x000FAC06 + #define WLAN_CIPHER_SUITE_GCMP 0x000FAC08 + #define WLAN_CIPHER_SUITE_SMS4 0x00147201 + + Recall our results for the cipher key + \x01\xac\x0f\x00\x05\xac\x0f\x00\x02\xac\x0f\x00\x04\xac\x0f\x00 + Looks similar to above. u32 is four bytes what does that give us? + \x01\xac\x0f\x00 + \x05\xac\x0f\x00 + \x02\xac\x0f\x00 + \x04\xac\x0f\x00 + Aha, it's reversed. All we have to do is: + hex(struct.unpack('I','\x01\xac\x0f\x00')[0]) + and we get + '0xfac01' => WEP-40 + + What a convoluted trip down the rabbit hole. This is why I hate when people + say read the source code. + +""" + +WLAN_CIPHER_SUITE_LEN = 4 +WLAN_CIPHER_SUITE_GROUP = 0x000fac00 +WLAN_CIPHER_SUITE_WEP40 = 0x000fac01 +WLAN_CIPHER_SUITE_TKIP = 0x000fac02 +WLAN_CIPHER_SUITE_CCMP = 0x000fac04 +WLAN_CIPHER_SUITE_WEP104 = 0x000fac05 +WLAN_CIPHER_SUITE_ACS_CMAC = 0x000fac06 +WLAN_CIPHER_SUITE_GCMP = 0x000fac08 +WLAN_CIPHER_SUITE_SMS4 = 0x00147201 +WLAN_CIPHER_SUITE_SELECTORS = { + WLAN_CIPHER_SUITE_GROUP:'GROUP', + WLAN_CIPHER_SUITE_WEP40:'WEP-40', + WLAN_CIPHER_SUITE_TKIP:'TKIP', + WLAN_CIPHER_SUITE_CCMP:'CCMP', + WLAN_CIPHER_SUITE_WEP104:'WEP-104', + WLAN_CIPHER_SUITE_ACS_CMAC:'AES-CMAC', + WLAN_CIPHER_SUITE_GCMP:'GCMP', + WLAN_CIPHER_SUITE_SMS4:'SMS4'} \ No newline at end of file diff --git a/pyric/pyw.py b/pyric/pyw.py index 4dad6f6..f3939ad 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -43,60 +43,25 @@ socket. However, if the caller is only using pyw periodically and/or does not want to bothered with socket maintenance, the one-time flavor would be better. -Previously (v 0.0.*), two functions were used, one named & one named -ex (which took an additional argument, namely the socket). This yielded -additional code, was unwieldy to use & did not look "pretty". - -pyw v 0.1.* uses (for lack of a better naming convention) templates & a stub -to accomplish this. - -A stripped-down function template (for netlink) is defined as: - -def fcttemplate(arg0,arg1,...,argn,*argv): - # parameter validation if necessary - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(fcttemplate,arg0,arg1,...argn) - - # command execution - ... - return results - -If argv has a netlink socket at index 0, the template will jump to execution. -If there is no socket, execute the stub to create one. (Also, if something -other than a socket is at argv[0], an error will rise during execution.) at The -stub function is then defined as: - -def _nlstub_(fct,*argv): - nlsock = None - try: - nlsock = nlsock = nl.nl_socket_alloc() - argv = list(argv) + [nlsock] - return fct(*argv) - except pyric.error: raise # catch & release - finally: - if nlsock: nl.nl_socket_free(nlsock) - -which creates a NLSocket & "recalls" the template with the socket now in *argv. -so, callers can now call for example, +for one-time execution, for example use regset('US') -for one-time execution, or +for persistent execution, use -regset('US',) +regset('US',nlsocket) -for persistent execution. +where nlsocket is created with libnl.nl_socket_alloc() -Additional changes in pyw v 0.1.* +NOTE: 1) All functions (excluding wireless core related) will use a Card object which encapsulates the physical index, device name and interface index (ifindex) under a tuple rather than a device name or physical index or ifindex as this will not require the caller to remember if a dev or a phy or a ifindex is needed. The only exception to this is devinfo which by necessity will accept a Card or a device name - 2) All functions allow pyric errors to pass through. + 2) All functions allow pyric errors to pass through. Callers must catch these + if they desire """ @@ -120,6 +85,7 @@ def _nlstub_(fct,*argv): import pyric.net.netlink_h as nlh # netlink definition import pyric.net.genetlink_h as genlh # genetlink definition import pyric.net.wireless.nl80211_h as nl80211h # nl80211 definition +import pyric.net.wireless.ieee80211_h as dotllh # ieee80211 definition import pyric.net.sockios_h as sioch # sockios constants import pyric.net.if_h as ifh # ifreq structure import pyric.lib.libnl as nl # netlink functions @@ -781,6 +747,7 @@ def phyinfo(card, *argv): cov_class -> coverage class swmodes -> supported software modes commands -> supported commands + ciphers -> supported ciphers """ try: nlsock = argv[0] @@ -802,7 +769,7 @@ def phyinfo(card, *argv): info = {'generation':None, 'retry_short':None, 'retry_long':None, 'frag_thresh':None, 'rts_thresh':None, 'cov_class':None, 'scan_ssids':None, 'freqs':[], 'modes':[], 'swmodes':[], - 'commands':[]} + 'commands':[],'ciphers':[]} info['generation'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_GENERATION) info['retry_short'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_SHORT) info['retry_long'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_LONG) @@ -811,13 +778,18 @@ def phyinfo(card, *argv): info['cov_class'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_COVERAGE_CLASS) info['scan_ssids'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS) - # nested attributes require additional processing. They must be unpacked - # beg-endian and may not be processed correctly by libnl. In the event of an - # unparsed nested attribute leave as empty list + # sets or arrays of attributes # get freqs _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_BANDS, False) if d != nlh.NLA_ERROR: info['freqs'] = _getfreqs_(bs) + # get cipher suites + _, cs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CIPHER_SUITES, False) + if d != nlh.NLA_ERROR: info['ciphers'] = _ciphers_(cs) + + # nested attributes require additional processing. They must be unpacked + # beg-endian and may not be processed correctly by libnl. In the event of an + # unparsed nested attribute leave as empty list # get supported modes _, ms, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_IFTYPES, False) if d != nlh.NLA_ERROR: @@ -1198,70 +1170,6 @@ def _unsetf_(flags, flag): """ return flags & ~flag -def _getfreqs_(band): - """ - extract list of supported freqs packed byte stream band - :param band: packed byte string from NL80211_ATTR_WIPHY_BANDS - :returns: list of supported frequencies - - NOTE: this is actually faster than nl80211_c.nl80211_parse_freqs - """ - rfs = [] - for freq in channels.freqs(): - if band.find(struct.pack("I", freq)) != -1: - rfs.append(freq) - return rfs - -def _familyid_(nlsock): - """ - extended version: get the family id - :param nlsock: netlink socket - :returns: the family id of nl80211 - NOTE: - In addition to the family id, we get: - CTRL_ATTR_FAMILY_NAME = nl80211\x00 - CTRL_ATTR_VERSION = \x01\x00\x00\x00 = 1 - CTRL_ATTR_HDRSIZE = \x00\x00\x00\x00 = 0 - CTRL_ATTR_MAXATTR = \xbf\x00\x00\x00 = 191 - CTRL_ATTR_OPS - CTRL_ATTR_MCAST_GROUPS - but for now, these are not used - """ - global _FAM80211ID_ - if _FAM80211ID_ is None: - # family id is not instantiated, do so now - msg = nl.nlmsg_new(nltype=genlh.GENL_ID_CTRL, - cmd=genlh.CTRL_CMD_GETFAMILY, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_string(msg, nl80211h.NL80211_GENL_NAME, - genlh.CTRL_ATTR_FAMILY_NAME) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) - _FAM80211ID_ = nl.nla_find(rmsg, genlh.CTRL_ATTR_FAMILY_ID) - return _FAM80211ID_ - -def _ifindex_(dev, *argv): - """ - gets the ifindex for device - :param dev: device name: - :param argv: ioctl socket at argv[0] (or empty) - :returns: ifindex of device - NOTE: the ifindex can aslo be found in /sys/class/net//ifindex - """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(_ifindex_, dev) - - try: - flag = sioch.SIOCGIFINDEX - ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag)) - return struct.unpack_from(ifh.ifr_ifindex, ret, ifh.IFNAMELEN)[0] - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "error parsing results {0}".format(e)) - def _flagsget_(dev, *argv): """ gets the device's flags @@ -1305,6 +1213,8 @@ def _flagsset_(dev, flags, *argv): except struct.error as e: raise pyric.error(pyric.EUNDEF, "error parsing results {0}".format(e)) +#### ADDITIONAL PARSING FOR PHYINFO #### + def _iftypes_(i): """ wraps the IFTYPES list to handle index errors @@ -1316,6 +1226,92 @@ def _iftypes_(i): except IndexError: return "Unknown mode ({0})".format(i) +def _getfreqs_(band): + """ + extract list of supported freqs packed byte stream band + :param band: packed byte string from NL80211_ATTR_WIPHY_BANDS + :returns: list of supported frequencies + + NOTE: this is actually faster than nl80211_c.nl80211_parse_freqs + """ + rfs = [] + for freq in channels.freqs(): + if band.find(struct.pack("I", freq)) != -1: + rfs.append(freq) + return rfs + +def _ciphers_(cipher): + """ + parses the cipher stream returning a list of supported ciphers + :param cipher: the cipher suite stream + :returns: a list of supported ciphers + """ + # to understand fully, see ieee80211_h.py. Basically cipher is a set + # of ciphers each cipher being 4 bytes, unpack each cipher as a u32 + # and find the value in the suite dict + ss = [] + for i in xrange(len(cipher) / dotllh.WLAN_CIPHER_SUITE_LEN): + s = struct.unpack_from('I', cipher, i * dotllh.WLAN_CIPHER_SUITE_LEN)[0] + try: + ss.append(dotllh.WLAN_CIPHER_SUITE_SELECTORS[s]) + except KeyError as e: + # we could do nothing, or append 'rsrv' but we'll add a little + # for testing/future identificaion purposes + ss.append('RSRV-{}'.format(e)) + return ss + +#### NETLINK/IOCTL PARAMETERS #### + +def _ifindex_(dev, *argv): + """ + gets the ifindex for device + :param dev: device name: + :param argv: ioctl socket at argv[0] (or empty) + :returns: ifindex of device + NOTE: the ifindex can aslo be found in /sys/class/net//ifindex + """ + try: + iosock = argv[0] + except IndexError: + return _iostub_(_ifindex_, dev) + + try: + flag = sioch.SIOCGIFINDEX + ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag)) + return struct.unpack_from(ifh.ifr_ifindex, ret, ifh.IFNAMELEN)[0] + except AttributeError as e: + raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) + except struct.error as e: + raise pyric.error(pyric.EUNDEF, "error parsing results {0}".format(e)) + +def _familyid_(nlsock): + """ + extended version: get the family id + :param nlsock: netlink socket + :returns: the family id of nl80211 + NOTE: + In addition to the family id, we get: + CTRL_ATTR_FAMILY_NAME = nl80211\x00 + CTRL_ATTR_VERSION = \x01\x00\x00\x00 = 1 + CTRL_ATTR_HDRSIZE = \x00\x00\x00\x00 = 0 + CTRL_ATTR_MAXATTR = \xbf\x00\x00\x00 = 191 + CTRL_ATTR_OPS + CTRL_ATTR_MCAST_GROUPS + but for now, these are not used + """ + global _FAM80211ID_ + if _FAM80211ID_ is None: + # family id is not instantiated, do so now + msg = nl.nlmsg_new(nltype=genlh.GENL_ID_CTRL, + cmd=genlh.CTRL_CMD_GETFAMILY, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_string(msg, nl80211h.NL80211_GENL_NAME, + genlh.CTRL_ATTR_FAMILY_NAME) + nl.nl_sendmsg(nlsock, msg) + rmsg = nl.nl_recvmsg(nlsock) + _FAM80211ID_ = nl.nla_find(rmsg, genlh.CTRL_ATTR_FAMILY_ID) + return _FAM80211ID_ + #### TRANSLATION FUNCTIONS #### def _iostub_(fct, *argv): From bf83b6dc6ff39a8e479bffe1497fe4ed291d6bf5 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Tue, 14 Jun 2016 16:48:11 -0600 Subject: [PATCH 051/121] v0.1.2.1 added getpwrsave, setpwrsave --- README.md | 106 +++++++++++++++++++++++------------------- docs/PyRIC.pdf | Bin 490616 -> 491058 bytes docs/PyRIC.tex | 4 ++ pyric/__init__.py | 2 + pyric/pyw.py | 50 ++++++++++++++++++++ tests/pyw.unittest.py | 41 +++++++--------- 6 files changed, 130 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index ee9bf2e..718ed2f 100644 --- a/README.md +++ b/README.md @@ -297,8 +297,66 @@ pinfo['freqs'] pinfo['ciphers'] => ['WEP-40', 'WEP-104', 'TKIP', 'CCMP'] + +pyw.getpwrsave(w0) +=> True + +pyw.setpwrsave(w0,False) + +pyw.getpwrsave(w0) +False + ``` +#### iii. Virtual Interfaces +In my experience, virtual interfaces are primarily used to recon, attack or some +other tomfoolery but can also be used to analyze your wireless network. In either +case, it is generally advised to create a virtual monitor interface and delete +all others (on the same phy) - this makes sure that some external process like +NetworkManager does not interfere with your shenanigans. In the below example, +in addition to creating an interface in monitor mode, we find all interfaces +on the same physical index and delete them. You may not need to do this. + +NOTE: When creating a device in monitor mode, you can also set flags (see +NL80211_MNTR_FLAGS in nl80211_h), although some cards (usually atheros) do not +always obey these requests. + +```python +'monitor' in pyw.devmodes(w0) # make sure we can set wlan0 to monitor +=> True + +m0 = pyw.devadd(w0,'mon0','monitor') # create mon0 in monitor mode + +for iface in pyw.ifaces(w0): # delete all interfaces + pyw.devdel(iface[0]) # on the this phy + +pyw.up(m0) # bring the new card up to use + +pyw.chset(m0,6,None) # and set the card to channel 6 +=> True + +m0 +=> Card(phy=0,dev='mon0',ifindex=3) +``` + +Of course, once you are done, you will probably want to restore your original set +up. + +```python +w0 = pyw.devadd(m0,'wlan0','managed') # restore wlan0 in managed mode + +pyw.devdel(m0) # delete the monitor interface + +pyw.setmac(w0,mac) # restore the original mac address + +pyw.up(w0) # and bring the card up + +w0 +=> Card(phy0,dev='wlan0',ifindex=4) + +``` + +#### iv. Additional Functions Read the user guide, or type dir(pyw) in your console to get a full listing of pyw functions. @@ -390,54 +448,6 @@ Note that rfkill_list lists all 'wireless' devices: wlan, bluetooth, wimax, wwan gps, fm and nfc. Another important thing to note is that the rfkill index is not the same as the interface index. -#### iii. Virtual Interfaces -In my experience, virtual interfaces are primarily used to recon, attack or some -other tomfoolery but can also be used to analyze your wireless network. In either -case, it is generally advised to create a virtual monitor interface and delete -all others (on the same phy) - this makes sure that some external process like -NetworkManager does not interfere with your shenanigans. In the below example, -in addition to creating an interface in monitor mode, we find all interfaces -on the same physical index and delete them. You may not need to do this. - -NOTE: When creating a device in monitor mode, you can also set flags (see -NL80211_MNTR_FLAGS in nl80211_h), although some cards (usually atheros) do not -always obey these requests. - -```python -'monitor' in pyw.devmodes(w0) # make sure we can set wlan0 to monitor -=> True - -m0 = pyw.devadd(w0,'mon0','monitor') # create mon0 in monitor mode - -for iface in pyw.ifaces(w0): # delete all interfaces - pyw.devdel(iface[0]) # on the this phy - -pyw.up(m0) # bring the new card up to use - -pyw.chset(m0,6,None) # and set the card to channel 6 -=> True - -m0 -=> Card(phy=0,dev='mon0',ifindex=3) -``` - -Of course, once you are done, you will probably want to restore your original set -up. - -```python -w0 = pyw.devadd(m0,'wlan0','managed') # restore wlan0 in managed mode - -pyw.devdel(m0) # delete the monitor interface - -pyw.setmac(w0,mac) # restore the original mac address - -pyw.up(w0) # and bring the card up - -w0 -=> Card(phy0,dev='wlan0',ifindex=4) - -``` - ## 4. EXTENDING: Extending PyRIC is fun and easy too, see the user guide PyRIC.pdf. diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 154ef480365443aa298a4cb861d2509949fb6640..0fbf0ec7cd8964f1a0ab9ce70a71c341158eba8b 100644 GIT binary patch delta 14558 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 M;K|9w6(!*R2S^>&NdN!< delta 14162 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 diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 0ecc533..e5c5ed3 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -745,6 +745,10 @@ \subsection{Functions} \item block(card): (rfkill block ) type: N/A, soft blocks card \item unblock(card): (rfkill unblock ) type: N/A, removes the soft block on card +\item getpwrsave(card,[nlsock]) (iw dev card. get power\_save) type: netlink +get card's power save state True = on, False = off +\item setpwrsave(card,on,[nlsock]) (iw dev card. set power\_save ) type: +netlink set card's power save state True = on, False = off \item inetget(card,[iosock]): (ifconfig card.), type: ioctl, get ip4 address, netmask and broadcast address of card \item inetset(card,ipaddr,netmask,broadcast,[iosock]): (ifconfig card/ diff --git a/pyric/__init__.py b/pyric/__init__.py index 6c782d3..f3d5f0a 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -144,6 +144,8 @@ o moved parseoui from hardware to ouifetch renaming to parse o removed ouifetch execution ability - parse and fetch must be called w/in python console. Will eventually add this capability as as top-level program + o added supported ciphers to pyw.phyinfo dict + o added functions getpwrsave and setpwrsave pyw """ __name__ = 'pyric' diff --git a/pyric/pyw.py b/pyric/pyw.py index f3939ad..6362204 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -601,6 +601,56 @@ def unblock(card): except AttributeError: raise pyric.error(errno.ENODEV, "Device no longer registered") +def getpwrsave(card, *argv): + """ + returns card's power save state + :param card: Card object + :param argv: netlink socket at argv[0] (or empty) + :returns: True if power save is on, False otherwise + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(getpwrsave, card) + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_GET_POWER_SAVE, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nl_sendmsg(nlsock, msg) + rmsg = nl.nl_recvmsg(nlsock) + except AttributeError as e: + raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + + return nl.nla_find(rmsg, nl80211h.NL80211_ATTR_PS_STATE) == 1 + +def setpwrsave(card, on, *argv): + """ + REQUIRES ROOT PRIVILEGES + sets card's power save state + :param card: Card object + :param on: {True = on|False = off} + :param argv: netlink socket at argv[0] (or empty) + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(setpwrsave, card, on) + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_SET_POWER_SAVE, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nla_put_u32(msg, int(on), nl80211h.NL80211_ATTR_PS_STATE) + nl.nl_sendmsg(nlsock, msg) + _ = nl.nl_recvmsg(nlsock) + except AttributeError as e: + raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + except ValueError: + raise pyric.error(errno.EINVAL, "Invalid parameter on") + #### INFO RELATED #### def devfreqs(card, *argv): diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 1a0ed53..1aa7159 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -172,6 +172,21 @@ class DownTestCase(CardTestCase): def test_down(self): self.assertTrue(pyw.down(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.down,'bad0') +# test get power_save +class GetSetPwrSave(CardTestCase): + def test_getsetpwrsave(self): + self.assertIsInstance(pyw.getpwrsave(self.card),bool) + pyw.setpwrsave(self.card,True) + self.assertTrue(pyw.getpwrsave(self.card)) + pyw.setpwrsave(self.card, False) + self.assertFalse(pyw.getpwrsave(self.card)) + pyw.setpwrsave(self.card,True) + def testinvalidcardarg(self): + self.assertRaises(error,pyw.getpwrsave,'bad0') + self.assertRaises(error, pyw.setpwrsave,'bad0',True) + def testinvalidonval(self): + self.assertRaises(error,pyw.setpwrsave,self.card,'b') + # test get freqs class DevFreqsTestCase(CardTestCase): def test_devfreqs(self): @@ -308,28 +323,4 @@ def test_invalidflagsarg(self): self.assertRaises(error,pyw.devadd,self.card,'test0','managed','fcsfail') if __name__ == '__main__': - unittest.main() - - - - - - - - - - - - - - - - - - - - - - - - + unittest.main() \ No newline at end of file From a397641e1a93e0f901654286cfea93bbcd8fcdaf Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Wed, 15 Jun 2016 16:24:16 -0600 Subject: [PATCH 052/121] v0.1.2.1 added nla_put_flag to libnl --- pyric/lib/libnl.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index e309642..25e395d 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -554,6 +554,7 @@ def nla_put(msg,v,a,d): msg['attrs'].append((a,v,d)) # nla_put_* append data of specified datatype +def nla_put_flag(msg,a): nla_put(msg,None,a,nlh.NLA_FLAG) def nla_put_unspec(msg,v,a): nla_put(msg,v,a,nlh.NLA_UNSPEC) def nla_put_u8(msg,v,a): nla_put(msg,v,a,nlh.NLA_U8) def nla_put_u16(msg,v,a): nla_put(msg,v,a,nlh.NLA_U16) From cee9f7f9aa6b149ec36794707c02fa6bda36ba21 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Thu, 16 Jun 2016 17:58:52 -0600 Subject: [PATCH 053/121] v0.1.3 Added five new functions, libnl fixes --- CHANGES | 92 ++++++++++++ MANIFEST.in | 2 +- README.md | 5 +- TODO | 2 + docs/PyRIC.pdf | Bin 491058 -> 492116 bytes docs/PyRIC.tex | 21 ++- pyric/__init__.py | 122 +--------------- pyric/lib/__init__.py | 1 + pyric/lib/libnl.py | 9 +- pyric/pyw.py | 318 ++++++++++++++++++++++++++++++++---------- setup.py | 2 +- 11 files changed, 371 insertions(+), 203 deletions(-) create mode 100644 CHANGES diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000..dd32496 --- /dev/null +++ b/CHANGES @@ -0,0 +1,92 @@ +PyRIC CHANGES + +v 0.0.2 to 0.1.0 + o added ifconfig/iwconfig functions to pyw + o reworked exception handling + - all exceptions from libnl, libio & pyw are pyric.error + - pyw will allow pyric to pass through + - reworked errorcodes to derive from errno + o added _iostub_, _nlstub_ and reworked traditiona commands to utilize these + o finished porting nl80211_h and nl80211_c (for attribute policies) + o pyw no longer provides familyid as a public function, rather it now uses a + private global value for the nl80211 family id and will instantiate it one + time only. In this way, callers do not not have to worry about retrieving and + passing it + o regdom get & set implemented + o info implemented + o removed radio/Radio class (shouldn't be the responsibility of this) + o added channels.py (provides channel/freq functions) + o added RFI page for notes/observations/questions + o changed utils.py to device.py + o updated libnl + o added channel set & get + - channel get only works when device is associated + - channel set only works when card is in monitor mode and all other interfaces + have been deleted + o added device add & delete + o rewrote pyw function to handle one-time & persistent functions using a + single function interface for each command + o added Card class and wrote functions to handle it in pyw + o implemented basic help functionality (for nl80211) + o added monitor flag(s) support in devadd + o began work on a user guide + o added nested attribute handling + o added partial phyinfo handles all but supported channels/bands + o fixed bugs in devinfo and phyinfo + o added setup.py and required files + o at least one card (ath9k_htc) has an unknown supported command, added a + wrapper around the list IFTYPES to handle commands not listed + o libnl: attribute related i.e. nla_* moved out of GENLMsg class and made as + standalone functions + o in pyw + - added modeset/modeget in pyw + - readded freqset in pyw + - added devcmds in pyw + - annotated (in comments) if fcts needed root privileges + - added functions to get/set ip address, netmask and broadcast + - fixed PEP8 errors + - added function pulling supported freqs out NL80211_ATTR_WIPHY_BANDS + * ATT using _getfreqs_ which attempts to find the packed version of every + freq + * nl80211_c.nl80211_parse_freqs works but is slower than _getfreqs_ and + uses several hacks which may make it invalid for certain cards + - added 4.9GHz frequencies to channels.py + - fixed _validmac_ to validate both uppercase & lowercase hex characters + - added devfreqs, devchs + o unittest completed 61 tests ran in 5.360s + o added rfkill (still working on it) + o production release + +v 0.1.1 - 0.1.2 + desc: wireless nic library: wireless radio identification, manipulation, enumeration + includes: /nlhelp /lib /net /utils pyw 0.1.2 + changes: + o restructured hierarchy + - renamed device to hardware + o added mac address related functions to hardware + o split rfkill into functions file and definition file + o added block/unblock to pyw + o updated pyw to handle the newest version of libnl.py's processing of nested + attributes + +v 0.1.3 + o added this File, a revision history + o fixed issues + - # 13: Failed to process commands.help + - # 14: nlmsg_fromstream can incorrectly return error based on stream size + - # 11: MemoryError on nla_parse_nested() + o added nla_put_flag to libnl + o identified (unopened issue) and fixed error with ouifetch having invalid path + of default oui file + o moved parseoui from hardware to ouifetch renaming to parse + o removed ouifetch execution ability - parse and fetch must be called w/in + python console. Will eventually add this capability as as top-level program + o added ieee80211_h.py to net/wireless + o added supported ciphers to pyw.phyinfo dict + o added functions + - pwrsaveset and pwrsaveget + - covclassset + - retryshortset + - retrylongset + - rtsthreshset + - fragthreshset \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in index 89eec76..956b44e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,5 @@ # setup paramaters -include LICENSE README.md TODO +include LICENSE CHANGES README.md TODO # Include subdirectories # note to self: even including recursive-include here, have to follow up by diff --git a/README.md b/README.md index 718ed2f..90f666c 100644 --- a/README.md +++ b/README.md @@ -357,10 +357,13 @@ w0 ``` #### iv. Additional Functions +PyRIC also provides functions to change Radio Parameters: coverage class, rts and +frag thresholds, and retry limits short and long + Read the user guide, or type dir(pyw) in your console to get a full listing of pyw functions. -c. Miscelleaneous Utilities +**** v. Miscelleaneous Utilities Several additional tools are located in the utils directory. Two of these are: * channels.py: defines ISM and UNII band channels/frequencies and provides functions to convert between channel and frequency and vice-versa diff --git a/TODO b/TODO index c5e4b1b..cc24f19 100644 --- a/TODO +++ b/TODO @@ -25,6 +25,8 @@ 11) tried NL80211_CMD_GET_WIPHY, setting _WIPHY_TX_POWER_LEVEL but did not return the current power level - currently cannot find anything in nl80211.h that could be used to get tx power + 12) add set retry short and long, set rts and set frag + 13) replace hardcoded values like cc limits in setcovclass to constants ------- Request For Information RFI ---------- diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 0fbf0ec7cd8964f1a0ab9ce70a71c341158eba8b..8f6dda10c9e7ca087c6d5e9f75e191d0a4185107 100644 GIT binary patch delta 35537 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 delta 34519 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 diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index e5c5ed3..f132432 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -19,7 +19,7 @@ % % __name__ = 'User Guide' %__license__ = 'GPLv3' -%__version__ = '0.0.3' +%__version__ = '0.0.4' %__date__ = 'June 2016' %__author__ = 'Dale Patterson' %__maintainer__ = 'Dale Patterson' @@ -73,7 +73,7 @@ basicstyle=\footnotesize } -\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.2: User Manual} +\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.3: User Manual} \author{Dale V. Patterson\\ wraith.wireless@yandex.com} \begin{document} @@ -687,6 +687,7 @@ \section{API: pyw.py}\label{sec:pywapi} \subsection{Constants} \begin{itemize} \item \textbf{\_FAM80211ID\_}: Global netlink family id of nl80211. Do not touch +\item \textbf{\_MAXTHRESH\_}: defines limit for thresholds or 'off'. Do not touch \item \textbf{IFTYPES}: redefined (from nl80211\_h.py) interface modes \item \textbf{MNTRFLAGS}: redefined (from nl80211\_h.py) monitor mode flags \item \textbf{IPADDR}: Regular Expression for ip4 address validation @@ -745,10 +746,20 @@ \subsection{Functions} \item block(card): (rfkill block ) type: N/A, soft blocks card \item unblock(card): (rfkill unblock ) type: N/A, removes the soft block on card -\item getpwrsave(card,[nlsock]) (iw dev card. get power\_save) type: netlink +\item pwrsaveget(card,[nlsock]) (iw dev card. get power\_save) type: netlink get card's power save state True = on, False = off -\item setpwrsave(card,on,[nlsock]) (iw dev card. set power\_save ) type: +\item pwrsaveset(card,on,[nlsock]) (iw dev card. set power\_save ) type: netlink set card's power save state True = on, False = off +\item covclassset(card,cc,[nlsock]) (iw phy card. set coverage ) type: +netlink set card's coverage class +\item retryshortset(card,lim,[nlsock]) (iw phy card. set retry short ) +type:netlink set card's retry short limit +\item retrylongset(card,lim,[nlsock]) (iw phy card. set retry long ) +type:netlink set card's retry long limit +\item rtsthreshset(card,thresh,[nlsock]) (iw phy card. set rts ) type: +netlink set card's RTS threshold +\item fragthreshset(card,thresh,[nlsock]) (iw phy card. set frag ) type: +netlink set card's fragmentation threshold \item inetget(card,[iosock]): (ifconfig card.), type: ioctl, get ip4 address, netmask and broadcast address of card \item inetset(card,ipaddr,netmask,broadcast,[iosock]): (ifconfig card/ @@ -1069,7 +1080,7 @@ \subsection{Functions} \end{enumerate} \section{Copyright and License}\label{sec:copy} -PYRIC: Python Radio Interface Controller v0.1.0\\ +PYRIC: Python Radio Interface Controller v0.1.3\\ Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com)\\ diff --git a/pyric/__init__.py b/pyric/__init__.py index f3d5f0a..513e874 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -25,132 +25,18 @@ Requires: linux (preferred 3.x kernel) Python 2.7 - - pyric 0.0.2 - desc: wireless nic (radio) manipulation, enumeration, and attribute enumeration - includes: /net /lib pyw 0.0.3 radio 0.0.4 utils 0.0.2 - changes: - o added ifconfig/iwconfig functions to pyw - o reworked exception handling - - all exceptions from libnl, libio & pyw are pyric.error - - pyw will allow pyric to pass through - - reworked errorcodes to derive from errno - o added _iostub_, _nlstub_ and reworked traditiona commands to utilize these - o finished porting nl80211_h and nl80211_c (for attribute policies) - o pyw no longer provides familyid as a public function, rather it now uses a - private global value for the nl80211 family id and will instantiate it one - time only. In this way, callers do not not have to worry about retrieving and - passing it - o regdom get & set implemented - o info implemented - pyric 0.0.3 - desc: wireless nic (radio) manipulation, enumeration, and attribute enumeration - includes: /net /lib pyw 0.0.3 device 0.0.3 channels 0.0.1 - changes: - o removed radio/Radio class (shouldn't be the responsibility of this) - o added channels.py (provides channel/freq functions) - o added RFI page for notes/observations/questions - o changed utils.py to device.py - o updated libnl - o added channel set & get - - channel get only works when device is associated - - channel set only works when card is in monitor mode and all other interfaces - have been deleted - o added device add & delete - - pyric 0.0.4 - desc: wireless nic (radio) manipulation, enumeration, and attribute enumeration - includes: /net /lib pyw 0.1.0 device 0.0.3 channels 0.0.1 setup 0.0.2 - changes: - o rewrote pyw function to handle one-time & persistent functions using a - single function interface for each command - - pyric 0.0.5 - desc: wireless nic (radio) manipulation, enumeration, and attribute enumeration - includes: /net /lib /docs pyw 0.1.2 device 0.0.3 channels 0.0.1 - changes: - o added Card class and wrote functions to handle it in pyw - o implemented basic help functionality (for nl80211) - o added monitor flag(s) support in devadd - o began work on a user guide - o added nested attribute handling - o added partial phyinfo handles all but supported channels/bands - o fixed bugs in devinfo and phyinfo - o added setup.py and required files - - pyric 0.0.6 - desc: Pythonic iw - wireless nic (radio) manipulation, enumeration, and attribute - enumeration - includes: /docs /examples /lib /net pyw 0.1.2 device 0.0.3 channels 0.0.1 - changes: - o move pyric under pyric to facilitate setuptools and packaging - - moved LICENSE, MANIFEST.in README.md setup.cfg setup.py examples/ PyRIC.pdf - to outer pyric - o at least one card (ath9k_htc) has an unknown supported command, added a - wrapper around the list IFTYPES to handle commands not listed - - pyric 0.0.7 - desc: Pythonic iw - wireless nic (radio) manipulation, enumeration, and attribute - enumeration - includes: /docs /examples /lib /net pyw 0.1.2 device 0.0.3 channels 0.0.1 - changes: - o libnl: attribute related i.e. nla_* moved out of GENLMsg class and made as - standalone functions - o in pyw - - added modeset/modeget in pyw - - readded freqset in pyw - - added devcmds in pyw - - annotated (in comments) if fcts needed root privileges - - added functions to get/set ip address, netmask and broadcast - - fixed PEP8 errors - - added function pulling supported freqs out NL80211_ATTR_WIPHY_BANDS - * ATT using _getfreqs_ which attempts to find the packed version of every - freq - * nl80211_c.nl80211_parse_freqs works but is slower than _getfreqs_ and - uses several hacks which may make it invalid for certain cards - - added 4.9GHz frequencies to channels.py - - fixed _validmac_ to validate both uppercase & lowercase hex characters - - added devfreqs, devchs - o unittest completed 61 tests ran in 5.360s - o added rfkill (still working on it) - - pyric 0.1.0 - desc: Pythonic iw - wireless nic (radio) manipulation, enumeration, and attribute - enumeration - includes: /docs /examples /lib /net pyw 0.1.2 device 0.0.3 channels 0.0.1 - changes: - o production release - - pyric 0.1.1 t0 0.1.1-* - desc: wireless nic library: wireless radio identification, manipulation, enumeration - includes: /nlhelp /lib /net /utils pyw 0.1.2 - changes: - o restructured hierarchy - - renamed device to hardware - o added mac address related functions to hardware - o split rfkill into functions file and definition file - o added block/unblock to pyw - o updated pyw to handle the newest version of libnl.py's processing of nested - attributes - - pyric 0.1.2 + pyric 0.1.3 desc: wireless nic library: wireless radio identification, manipulation, enumeration includes: /nlhelp /lib /net /utils pyw 0.1.4 changes: - o fixed install issues via pip where data files were not being loaded onto - the user's system - o identified and fixed error with ouifetch with invalid path of default oui file - o moved parseoui from hardware to ouifetch renaming to parse - o removed ouifetch execution ability - parse and fetch must be called w/in - python console. Will eventually add this capability as as top-level program - o added supported ciphers to pyw.phyinfo dict - o added functions getpwrsave and setpwrsave pyw + See CHANGES in top-level directory + """ __name__ = 'pyric' __license__ = 'GPLv3' -__version__ = '0.1.2.1' +__version__ = '0.1.3' __date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' diff --git a/pyric/lib/__init__.py b/pyric/lib/__init__.py index 360cb67..ff77081 100644 --- a/pyric/lib/__init__.py +++ b/pyric/lib/__init__.py @@ -37,6 +37,7 @@ and not full blow objects - added some error checking to nla_parse_nested, raising and handling error in situations where attribute len is 0 + - fixed nlmsg_fromstream to handle non-ack message parsing with a length of 36 """ __name__ = 'lib' diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 25e395d..5259c99 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -424,16 +424,17 @@ def nlmsg_new(nltype=None,cmd=None,seq=None,pid=None,flags=None,attrs=None): 'cmd':cmd or genlh.CTRL_CMD_UNSPEC, 'attrs':attrs or []}) -def nlmsg_fromstream(stream): +def nlmsg_fromstream(stream,override=False): """ create a GENLMsg from a stream :param stream: packed binary data + :param override: override ack processings - DO NOT USE for debugging only :returns: a GENLMsg """ # parse out netlink/generic netlink headers try: l,t,fs,s,p = struct.unpack_from(nlh.nl_nlmsghdr,stream,0) - if t == nlh.NLMSG_ERROR or l == nlh.NLMSGACKLEN: + if t == nlh.NLMSG_ERROR or (l == nlh.NLMSGACKLEN and not override): # have an (possible) ack/nack i.e. error msg e = struct.unpack_from(nlh.nl_nlmsgerr,stream,nlh.NLMSGHDRLEN)[0] raise pyric.error(abs(e),strerror(abs(e))) @@ -554,7 +555,7 @@ def nla_put(msg,v,a,d): msg['attrs'].append((a,v,d)) # nla_put_* append data of specified datatype -def nla_put_flag(msg,a): nla_put(msg,None,a,nlh.NLA_FLAG) +def nla_put_flag(msg,a): nla_put(msg,) def nla_put_unspec(msg,v,a): nla_put(msg,v,a,nlh.NLA_UNSPEC) def nla_put_u8(msg,v,a): nla_put(msg,v,a,nlh.NLA_U8) def nla_put_u16(msg,v,a): nla_put(msg,v,a,nlh.NLA_U16) @@ -667,4 +668,4 @@ def _maxbufsz_(): # return a hardcoded value return 2097152 finally: - if fin: fin.close() \ No newline at end of file + if fin: fin.close() diff --git a/pyric/pyw.py b/pyric/pyw.py index 6362204..e1dd015 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -92,6 +92,7 @@ import pyric.lib.libio as io # ioctl functions _FAM80211ID_ = None +_MAXTHRESH_ = 4294967295 #(2^32 -1 or the max value of a u32) # redefine interface types and monitor flags IFTYPES = nl80211h.NL80211_IFTYPES @@ -143,8 +144,6 @@ def winterfaces(*argv): wifaces = [] for dev in interfaces(): try: - #_ = io.io_transfer(iosock,sioch.SIOCGIWNAME,ifh.ifreq(dev)) - #wifaces.append(dev) if iswireless(dev, iosock): wifaces.append(dev) except pyric.error as e: # ENODEV & EOPNOTSUPP mean not wireless, reraise any others @@ -168,8 +167,6 @@ def iswireless(dev, *argv): # if the call succeeds, found to be wireless _ = io.io_transfer(iosock, sioch.SIOCGIWNAME, ifh.ifreq(dev)) return True - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) except pyric.error as e: # ENODEV or ENOTSUPP means not wireless, reraise any others if e.errno == errno.ENODEV or e.errno == errno.EOPNOTSUPP: return False @@ -199,7 +196,7 @@ def regset(rd, *argv): sets the current regulatory domain (iw reg set ) :param rd: regulatory domain code :param argv: netlink socket at argv[0] (or empty) - :returns: the two charactor regulatory domain + :returns: True on success """ if len(rd) != 2: raise pyric.error(errno.EINVAL, "Invalid reg. domain") try: @@ -216,10 +213,8 @@ def regset(rd, *argv): return True # we got here-it worked (or there were no complaints) ################################################################################ -#### WIRELESS INTERFACE FUNCTIONS #### -################################################################################ - #### CARD RELATED #### +################################################################################ class Card(tuple): """ @@ -270,7 +265,9 @@ def validcard(card, *argv): if e.errno == errno.ENODEV: return False else: raise +############################################################################### #### ADDRESS RELATED #### +################################################################################ def macget(card, *argv): """ @@ -292,10 +289,10 @@ def macget(card, *argv): return _hex2mac_(ret[18:24]) else: raise pyric.error(errno.EAFNOSUPPORT, "Invalid return addr family {0}".format(fam)) - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Ifreq error: {0}".format(e)) def macset(card, mac, *argv): """ @@ -320,10 +317,10 @@ def macset(card, mac, *argv): return _hex2mac_(ret[18:24]) else: raise pyric.error(errno.EAFNOSUPPORT, "Returned hw address family is not valid") - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except struct.error as e: - raise pyric.error(pyric.EUNDEF, "error parsing results {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) def inetget(card, *argv): """ @@ -369,10 +366,10 @@ def inetget(card, *argv): # catch error where no addresses are assigned to card if e.errno == errno.EADDRNOTAVAIL: return ip4, netmask, brdaddr else: raise - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except struct.error as e: - raise pyric.error(pyric.EUNDEF, "error parsing results {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) return ip4, netmask, brdaddr @@ -421,10 +418,10 @@ def inetset(card, ipaddr, netmask, broadcast, *argv): raise pyric.error(errno.EINVAL, "Cannot set netmask/broadcast. Set ip first") else: raise - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except struct.error as e: - raise pyric.error(pyric.EUNDEF, "ifreq error: {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) return True def ip4set(card, ipaddr, *argv): @@ -434,7 +431,7 @@ def ip4set(card, ipaddr, *argv): :param card: Card object :param ipaddr: ip address to set :param argv: ioctl socket at argv[0] (or empty) - :returns: True on success + :returns: the new ip address NOTE: setting the ip will set netmask and broadcast accordingly """ if not _validip4_(ipaddr): raise pyric.error(errno.EINVAL, "Invalid ip4 address") @@ -452,10 +449,10 @@ def ip4set(card, ipaddr, *argv): return _hex2ip4_(ipaddr) else: raise pyric.error(errno.EAFNOSUPPORT, "Returned ip family is invalid") - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except struct.error as e: - raise pyric.error(pyric.EUNDEF, "ifreq error: {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) def netmaskset(card, netmask, *argv): """ @@ -464,7 +461,7 @@ def netmaskset(card, netmask, *argv): :param card: Card object :param netmask: netmask to set :param argv: ioctl socket at argv[0] (or empty) - :returns: True on success + :returns: the new netmask NOTE: 1) throws error if netmask is set and card does not have an ip assigned """ @@ -490,10 +487,10 @@ def netmaskset(card, netmask, *argv): raise pyric.error(errno.EINVAL, "Cannot set netmask. Set ip first") else: raise - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except struct.error as e: - raise pyric.error(pyric.EUNDEF, "ifreq error: {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) def broadcastset(card, broadcast, *argv): """ @@ -502,7 +499,7 @@ def broadcastset(card, broadcast, *argv): :param card: Card object :param broadcast: netmask to set :param argv: ioctl socket at argv[0] (or empty) - :returns: True on success + :returns: the new broadcast address NOTE: 1) throws error if netmask is set and card does not have an ip assigned 2) can set broadcast to erroneous values i.e. ipaddr = 192.168.1.2 and @@ -530,12 +527,14 @@ def broadcastset(card, broadcast, *argv): raise pyric.error(errno.EINVAL, "Cannot set broadcast. Set ip first") else: raise - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except struct.error as e: - raise pyric.error(pyric.EUNDEF, "ifreq error: {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Ifreq error: {0}".format(e)) +################################################################################ #### ON/OFF #### +################################################################################ def up(card, *argv): """ @@ -554,8 +553,8 @@ def up(card, *argv): flags = _flagsget_(card.dev, iosock) if not _issetf_(flags, ifh.IFF_UP): _flagsset_(card.dev, _setf_(flags, ifh.IFF_UP), iosock) - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") return True def down(card, *argv): @@ -575,8 +574,8 @@ def down(card, *argv): flags = _flagsget_(card.dev, iosock) if _issetf_(flags, ifh.IFF_UP): _flagsset_(card.dev, _unsetf_(flags, ifh.IFF_UP), iosock) - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") return True def block(card): @@ -601,7 +600,11 @@ def unblock(card): except AttributeError: raise pyric.error(errno.ENODEV, "Device no longer registered") -def getpwrsave(card, *argv): +################################################################################ +#### RADIO PROPERTIES #### +################################################################################ + +def pwrsaveget(card, *argv): """ returns card's power save state :param card: Card object @@ -611,7 +614,7 @@ def getpwrsave(card, *argv): try: nlsock = argv[0] except IndexError: - return _nlstub_(getpwrsave, card) + return _nlstub_(pwrsaveget, card) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -620,23 +623,24 @@ def getpwrsave(card, *argv): nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") return nl.nla_find(rmsg, nl80211h.NL80211_ATTR_PS_STATE) == 1 -def setpwrsave(card, on, *argv): +def pwrsaveset(card, on, *argv): """ REQUIRES ROOT PRIVILEGES sets card's power save state :param card: Card object :param on: {True = on|False = off} :param argv: netlink socket at argv[0] (or empty) + sets card's power save """ try: nlsock = argv[0] except IndexError: - return _nlstub_(setpwrsave, card, on) + return _nlstub_(pwrsaveset, card, on) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -646,12 +650,176 @@ def setpwrsave(card, on, *argv): nl.nla_put_u32(msg, int(on), nl80211h.NL80211_ATTR_PS_STATE) nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except ValueError: raise pyric.error(errno.EINVAL, "Invalid parameter on") +def covclassset(card, cc, *argv): + """ + REQUIRES ROOT PRIVILEGES + sets the coverage class. The coverage class IAW IEEE Std 802.11-2012 is + defined as the Air propagation time & together with max tx power control + the BSS diamter + :param card: Card object + :param cc: coverage class 0 to 31 IAW IEEE Std 802.11-2012 Table 8-56 + :param argv: netlink socket at argv[0] (or empty) + sets card's coverage class + """ + if cc < 0 or cc> 31: + # this can work 'incorrectly' on non-int values but these will + # be caught later during conversion + raise pyric.error(errno.EINVAL, "Coverage class must be integer 0 - 31") + + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(covclassset, card, cc) + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_SET_WIPHY, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nla_put_u8(msg, int(cc), nl80211h.NL80211_ATTR_WIPHY_COVERAGE_CLASS) + nl.nl_sendmsg(nlsock, msg) + _ = nl.nl_recvmsg(nlsock) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") + except ValueError: + raise pyric.error(errno.EINVAL, "Invalid parameter value for cc") + +def retryshortset(card, lim, *argv): + """ + REQUIRES ROOT PRIVILEGES + sets the short retry limit. + :param card: Card object + :param lim: max # of short retries 1 - 255 + :param argv: netlink socket at argv[0] (or empty) + sets card's shorty retry + """ + if lim < 0 or lim > 255: + # this can work 'incorrectly' on non-int values but these will + # be caught later during conversion + raise pyric.error(errno.EINVAL, "Retry short must be integer 0 - 255") + + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(retryshortset, card, lim) + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_SET_WIPHY, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nla_put_u8(msg, int(lim), nl80211h.NL80211_ATTR_WIPHY_RETRY_SHORT) + nl.nl_sendmsg(nlsock, msg) + _ = nl.nl_recvmsg(nlsock) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") + except ValueError: + raise pyric.error(errno.EINVAL, "Invalid parameter value for lim") + +def retrylongset(card, lim, *argv): + """ + REQUIRES ROOT PRIVILEGES + sets the long retry limit. + :param card: Card object + :param lim: max # of short retries 1 - 255 + :param argv: netlink socket at argv[0] (or empty) + sets card's long retry + """ + if lim < 0 or lim > 255: + # this can work 'incorrectly' on non-int values but these will + # be caught later during conversion + raise pyric.error(errno.EINVAL, "Retry long must be integer 0 - 255") + + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(retrylongset, card, lim) + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_SET_WIPHY, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nla_put_u8(msg, int(lim), nl80211h.NL80211_ATTR_WIPHY_RETRY_LONG) + nl.nl_sendmsg(nlsock, msg) + _ = nl.nl_recvmsg(nlsock) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") + except ValueError: + raise pyric.error(errno.EINVAL, "Invalid parameter value for lim") + +def rtsthreshset(card, thresh, *argv): + """ + REQUIRES ROOT PRIVILEGES + sets the RTS threshold. If off, RTS is disabled. If an integer, sets the + smallest packet for which card will send an RTS prior to each transmission + :param card: Card object + :param thresh: rts threshold limit + :param argv: netlink socket at argv[0] (or empty) + sets the card's RTS threshold + """ + if thresh == 'off': thresh = _MAXTHRESH_ + else: + if thresh != _MAXTHRESH_ and (thresh < 0 or thresh > 65536): + raise pyric.error(errno.EINVAL, "Threshold must be 'off' or an integer 0 - 65536") + + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(rtsthreshset, card, thresh) + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_SET_WIPHY, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nla_put_u32(msg, thresh, nl80211h.NL80211_ATTR_WIPHY_RTS_THRESHOLD) + nl.nl_sendmsg(nlsock, msg) + _ = nl.nl_recvmsg(nlsock) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") + except ValueError: + raise pyric.error(errno.EINVAL, "Invalid parameter value for thresh") + +def fragthreshset(card, thresh, *argv): + """ + REQUIRES ROOT PRIVILEGES + sets the Frag threshold. If off, fragmentation is disabled. If an integer, + sets the largest packet before the card will enable fragmentation + :param card: Card object + :param thresh: frag threshold limit in octets + :param argv: netlink socket at argv[0] (or empty) + sets the card's Fragmentation threshold + """ + if thresh == 'off': thresh = _MAXTHRESH_ + else: + if thresh != _MAXTHRESH_ and (thresh < 256 or thresh > 8000): + raise pyric.error(errno.EINVAL, "Threshold must be 'off' or an integer 256 - 8000") + + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(fragthreshset, card, thresh) + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_SET_WIPHY, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nla_put_u32(msg, thresh, nl80211h.NL80211_ATTR_WIPHY_FRAG_THRESHOLD) + nl.nl_sendmsg(nlsock, msg) + _ = nl.nl_recvmsg(nlsock) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") + +################################################################################ #### INFO RELATED #### +################################################################################ def devfreqs(card, *argv): """ @@ -700,11 +868,11 @@ def devstds(card, *argv): stds = stds[:stds.find('\x00')] # remove nulls stds = stds.replace('IEEE 802.11', '') # remove IEEE 802.11 return [std for std in stds] - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except IndexError: return None except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) def devmodes(card, *argv): """ @@ -812,8 +980,8 @@ def phyinfo(card, *argv): nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") # pull out attributes info = {'generation':None, 'retry_short':None, 'retry_long':None, @@ -824,7 +992,9 @@ def phyinfo(card, *argv): info['retry_short'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_SHORT) info['retry_long'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_LONG) info['frag_thresh'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_FRAG_THRESHOLD) + if info['frag_thresh'] >= _MAXTHRESH_: info['frag_thresh'] = 'off' info['rts_thresh'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RTS_THRESHOLD) + if info['rts_thresh'] >= _MAXTHRESH_: info['rts_thresh'] = 'off' info['cov_class'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_COVERAGE_CLASS) info['scan_ssids'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS) @@ -868,7 +1038,9 @@ def phyinfo(card, *argv): info['commands'].append("unknown cmd ({0})".format(c)) return info +################################################################################ #### TX/RX RELATED #### +################################################################################ def txset(card, lvl, pwr, *argv): """ @@ -903,8 +1075,8 @@ def txset(card, lvl, pwr, *argv): nl.nl_recvmsg(nlsock) except ValueError: raise pyric.error(errno.EINVAL, "Invalid txpwr {0}".format(pwr)) - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") def txget(card, *argv): """ @@ -924,12 +1096,12 @@ def txget(card, *argv): flag = sioch.SIOCGIWTXPOW ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) return struct.unpack_from(ifh.ifr_iwtxpwr, ret, ifh.IFNAMELEN)[0] - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except IndexError: return None except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) def chget(card, *argv): """ @@ -997,8 +1169,8 @@ def freqset(card, rf, chw=None, *argv): nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) - except AttributeError as e: - raise pyric.error(errno.EINVAL,"Invalid paramter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL,"Invalid Card object") return True #### INTERFACE & MODE RELATED #### @@ -1056,8 +1228,8 @@ def modeset(card, mode, flags=None, *argv): nl80211h.NL80211_ATTR_MNTR_FLAGS) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") return True def ifaces(card, *argv): @@ -1079,8 +1251,8 @@ def ifaces(card, *argv): try: if info['card'].phy == card.phy: ifs.append((info['card'], info['mode'])) - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") return ifs def devadd(card, vdev, mode, flags=None, *argv): @@ -1124,8 +1296,8 @@ def devadd(card, vdev, mode, flags=None, *argv): nl80211h.NL80211_ATTR_MNTR_FLAGS) nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid paramter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") return Card(card.phy, vdev, nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) def devdel(card, *argv): @@ -1150,8 +1322,8 @@ def devdel(card, *argv): nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) - except AttributeError as e: - raise pyric.error(errno.EINVAL,"Invalid paramter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") return True ################################################################################ @@ -1236,10 +1408,10 @@ def _flagsget_(dev, *argv): flag = sioch.SIOCGIFFLAGS ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag)) return struct.unpack_from(ifh.ifr_flags, ret, ifh.IFNAMELEN)[0] - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except struct.error as e: - raise pyric.error(pyric.EUNDEF, "error parsing results {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) def _flagsset_(dev, flags, *argv): """ @@ -1258,10 +1430,10 @@ def _flagsset_(dev, flags, *argv): flag = sioch.SIOCSIFFLAGS ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag, [flags])) return struct.unpack_from(ifh.ifr_flags, ret, ifh.IFNAMELEN)[0] - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except struct.error as e: - raise pyric.error(pyric.EUNDEF, "error parsing results {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) #### ADDITIONAL PARSING FOR PHYINFO #### @@ -1329,10 +1501,10 @@ def _ifindex_(dev, *argv): flag = sioch.SIOCGIFINDEX ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag)) return struct.unpack_from(ifh.ifr_ifindex, ret, ifh.IFNAMELEN)[0] - except AttributeError as e: - raise pyric.error(errno.EINVAL, "Invalid parameter {0}".format(e)) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") except struct.error as e: - raise pyric.error(pyric.EUNDEF, "error parsing results {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) def _familyid_(nlsock): """ diff --git a/setup.py b/setup.py index ae73e57..b7db6b4 100644 --- a/setup.py +++ b/setup.py @@ -74,7 +74,7 @@ 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 2.7'], - keywords='Linux nl80211 iw wireless pentest', + keywords='Linux Python nl80211 iw iwconfig ifconfig wireless WLAN WiFi pentest', packages=find_packages(), package_data={'pyric':['nlhelp/*.help','utils/data/*.txt']} ) From c5323ea7dcfa6eb7d487907e84ff9ac6dce3b189 Mon Sep 17 00:00:00 2001 From: wraith-wireless Date: Sat, 18 Jun 2016 03:11:14 -0600 Subject: [PATCH 054/121] v0.1.3 + added isup, redid README.md --- README.md | 356 ++++++++++++++++++++++++++-------------------- docs/PyRIC.pdf | Bin 492116 -> 492770 bytes docs/PyRIC.tex | 9 +- pyric/__init__.py | 2 + pyric/pyw.py | 56 +++++--- setup.py | 2 +- 6 files changed, 246 insertions(+), 179 deletions(-) diff --git a/README.md b/README.md index 90f666c..789ce97 100644 --- a/README.md +++ b/README.md @@ -153,162 +153,204 @@ https://github.com/wraith-wireless/pyric/releases/ It is not guaranteed to be st fact not run at all. ## 3. USING -Once installed, see examples/pentest.py which covers most pyw functions or read -throuhg PyRIC.pdf. However, for those impatient types: +To use PyRIC, see the examples folder or read throuhg PyRIC.pdf. However, for +those impatient types: ```python import pyric # pyric error and EUNDEF error code from pyric import pyw iw functionality ``` -will import the basic requirements and is assumed for the examples below. It is also assumed -that the system is in the US and has three devices lo, eth0 and wlan0 (only wlan0 of course -being wireless). Keep in mind that these examples use one-time sockets. +will import the basic requirements and unless otherwise stated is assumed for the +examples below. It is also assumed that the system is in the US and has three +devices lo, eth0 and wlan0 (only wlan0 of course being wireless). Keep in mind +that these examples use one-time sockets. -### a. Wireless Core Functionality +Although not all functions require root, we assume that the below have been +executed with root permissions. + +### a. System/Wireless Core Functionality These functions do not work with a specific device rather with the system. ```python - -pyw.interfaces() # get all system interfaces -=> ['lo','eth0','wlan'] - -pyw.isinterface('eth0') # deterimine if eth0 is an interface -=> True - -pyw.isinterface('bob0') -=> False - -pyw.winterfaces() # get all system wireless interfaces -=> ['wlan0'] - -pyw.isinterface('eth0') # check eth0 for wireless -=> False - -pyw.iswinterface('wlan0') -=> True - -pyw.regget() # get the regulatory domain -=> 'US' - -pyw.regset('BO') # set the regulatory domain - -pyw.regget() -=> 'BO' +>>> pyw.interfaces() # get all system interfaces +['lo','eth0','wlan'] +>>> pyw.isinterface('eth0') # deterimine if eth0 is an interface +True +>>> pyw.isinterface('bob0') +False +>>> pyw.winterfaces() # get all system wireless interfaces +['wlan0'] +>>> pyw.isinterface('eth0') # check eth0 for wireless +False +>>> pyw.iswinterface('wlan0') +True +>>> pyw.regget() # get the regulatory domain +'US' +>>> pyw.regset('BO') # set the regulatory domain +True +>>> pyw.regget() +'BO' +>>> ``` ### b. Interface Specific -Recall that PyRIC utilizes a Card object - this removes the necessity of having to -remember what to pass each function i.e. whether it is a device name, physical index -or ifindex. +Recall that PyRIC utilizes a Card object - this removes the necessity of having +to remember what to pass each function i.e. whether you have to pass a device name, +physical index or ifindex. Unless otherwise stated, we will be using the card +w0 instantiated as: ```python -w0 = pyw.getcard('wlan0') # get a card for wlan0 - -w0 -=> Card(phy=0,dev='wlan0',ifindex=2) +>>> w0 = pyw.getcard('wlan0') # get a card for wlan0 +>>> w0 +Card(phy=0,dev='wlan0',ifindex=2) ``` -You can also use pyw.devinfo to get a Card object and pyw.devadd will return a card -object for the newly created virtual interface. The card, w0, will be used throughout -the remainder of the examples. +There are other methods to get a Card object: pyw.devinfo, in addition to +information, will return a Card object, pyw.devadd returns a card object for the +newly created virtual interface and pyw.ifaces returns a lists of Cards for every +interface sharing the same phy. -#### i. Setting Mac and IP Addresses +Before continuing you may find that a Card can become invalid. For example, I +have an older system where the USB tends to fall out. You can confirm that your +card is still valid: ```python -mac = pyw.macget(w0) # get the hw addr - -mac -=> 'a0:b1:c2:d3:e4:f5' - -pyw.down(w0) # turn the card off to set the mac - -pyw.macset(w0,'00:1F:32:00:01:00') # lets be a nintendo device - -pyw.up(w0) # bring wlan0 back up +>>> pyw.validcard(w0) +True +>>> +``` -pyw.macget(w0) # see if it worked -=> '00:1F:32:00:01:00' +#### i. Why is my Card not Working? +Sometimes you may need to turn your Card on, or possibly unblock it. -pyw.inetget(w0) # not associated, inet won't return an address -=> (None, None, None) +```python +>>> pyw.isup(w0) +True +>>> pyw.down(w0) +>>> pyw.isup(w0) +False +>>> pyw.up(w0) +>>> pyw.isblocked(w0) +(True,False) +>>> pyw.unblock(w0) # turn off the softblock +>>> pyw.block(w0) +>>> +``` -pyw.inetset(w0,'192.168.3.23','255.255.255.192','192.168.3.63') -=> True +#### ii. Working with Mac and IP Addresses -pyw.inetget(w0) -=> ('192.168.3.23', '255.255.255.192', '192.168.3.255') +```python +>>> mac = pyw.macget(w0) # get the hw addr +>>> mac +'a0:b1:c2:d3:e4:f5' +>>> +>>> pyw.down(w0): # turn the card off to set the mac +>>> pyw.macset(w0,'00:1F:32:00:01:00') # lets be a nintendo device +>>> pyw.up(w0) # bring wlan0 back up +>>> pyw.macget(w0) # see if it worked +'00:1F:32:00:01:00' +>>> +>>> pyw.inetget(w0) # not associated, inet won't return an address +(None, None, None) +>>> # NOTE: to set the inet, bcast or netmask, the card does not have to be down +... +>>> pyw.inetset(w0,'192.168.3.23','255.255.255.192','192.168.3.63') +True +>>> pyw.inetget(w0) +('192.168.3.23', '255.255.255.192', '192.168.3.255') +>>> +>>> # You can also use ip4set, netmaskset and broadcastset ``` It is important to note that (like ifconfig), erroneous values can be set when setting the inet addresses: for example you can set the ip address on 192.168.3.* network with a broadcast address of 10.255.255.255. -#### ii. Getting Info On Your Card +#### iii. WLAN Radio Properties +You may want to set power management or other radio properties when pentesting. +Particulary, if you are configuring a rogue AP. ```python -pyw.devinfo(w0) -=> {'wdev': 4294967297, 'RF': None, 'CF': None, 'mac': '00:c0:ca:59:af:a6', -'mode': 'managed', 'CHW': None, 'card': Card(phy=1,dev=alfa0,ifindex=4)} - -pyw.txget(w0) -=> 20 - -pyw.modeget(w0) -=> 'managed' +>>> pyw.pwrsaveget(w0) +True +>>> pyw.pwrsaveset(w0, False) # turn off powermanagement +>>> pyw.pwrsaveget(w0) +False +>>> pyw.covclassset(w0, 1) # set the coverage class +pyric.error: [Errno 95] Operation not supported +>>> # My internal intel card does not support setting the coverage class +... +>>> pyw.retryshortset(w0, 5) +>>> pyw.retrylongset(w0, 5) +>>> # We'll check these values out shortly +... +>>> pyw.rtsthreshset(w0, 1024) +>>> pyw.fragthreshset(w0, 8000) +>>> +``` -pyw.devstds(w0) -=> ['b', 'g', 'n'] +For a brief description of coverage class and retry limits, +see http://www.computerhope.com/unix/iwconfig.htm. For a description of the RTS +and Fragmentation thresholds see http://resources.infosecinstitute.com/rts-threshold-configuration-improved-wireless-network-performance/ -pyw.devmodes(w0) -=> ['ibss', 'managed', 'AP', 'AP VLAN', 'wds', 'monitor', 'mesh'] +#### iv. Getting Info On Your Card -pyw.devcmds(w0) -=> [u'new_interface', u'set_interface', u'new_key', u'start_ap', u'new_station', +```python +>>> dinfo = pyw.devinfo(w0) +>>> for d in dinfo: print d, dinfo[d] +... +wdev 1 +RF None +CF None +mac 00:1F:32:00:01:00 +mode managed +CHW None +card Card(phy=0,dev=wlan0,ifindex=3) +>>> # NOTE: since we are not associated, RF, CF and CHW are None +... +>>> pyw.txget(w0) +20 +>>> pyw.devstds(w0) +['b', 'g', 'n'] +>>> pinfo = pyw.phyinfo(w0) # returns a dict with 12 key->value pairs +>>> for p in pinfo: print p, pinfo[p] +... +>>> pinfo['retry_short'], pinfo['retry_long'] +(5, 5) +>>> pinfo['rts_thresh'], pinfo['frag_thresh'] +(1024, 8000) +>>> pinfo['cov_class'] +0 +>>> pinfo['generation'] +1 +>>> pinfo['scan_ssids'] +20 +>>> pinfo['ciphers'] +['WEP-40', 'WEP-104', 'TKIP', 'CCMP'] +>>> +>>> pinfo['modes'] +['ibss', 'managed', 'AP', 'AP VLAN', 'monitor'] +>>> pinfo['swmodes'] +['AP VLAN', 'monitor'] +>>> +>>> pinfo['commands'] +[u'new_interface', u'set_interface', u'new_key', u'start_ap', u'new_station', u'new_mpath', u'set_mesh_config', u'set_bss', u'authenticate', u'associate', -u'deauthenticate', u'disassociate', u'join_ibss', u'join_mesh', u'set_tx_bitrate_mask', -u'frame', u'frame_wait_cancel', u'set_wiphy_netns', u'set_channel', u'set_wds_peer', -u'probe_client', u'set_noack_map', u'register_beacons', u'start_p2p_device', -u'set_mcast_rate', u'connect', u'disconnect'] - -pinfo = pyw.phyinfo(w0) - -pinfo['scan_ssids'] -=> 4 - -pinfo['retry_short'] -=> 7 - -pinfo['retry_long'] -=> 4 - -pinfo['frag_thresh'] -=> 4294967295 - -pinfo['rts_thresh'] -=> 4294967295 - -pinfo['cov_class'] -=> 0 - -pinfo['freqs'] -=>[2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, -2484] - -pinfo['ciphers'] -=> ['WEP-40', 'WEP-104', 'TKIP', 'CCMP'] - -pyw.getpwrsave(w0) -=> True - -pyw.setpwrsave(w0,False) - -pyw.getpwrsave(w0) -False - +u'deauthenticate', u'disassociate', u'join_ibss', u'join_mesh', +u'set_tx_bitrate_mask', u'frame', u'frame_wait_cancel', u'set_wiphy_netns', +u'set_channel', u'set_wds_peer', u'probe_client', u'set_noack_map', +u'register_beacons', u'start_p2p_device', u'set_mcast_rate', u'connect', +u'disconnect'] +>>> +>>> pinfo['freqs'] +[2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, +5180, 5200, 5220, 5240, 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, +5600, 5620, 5640, 5660, 5680, 5700, 5745, 5765, 5785, 5805, 5825] +>>> ``` -#### iii. Virtual Interfaces +#### v. Virtual Interfaces In my experience, virtual interfaces are primarily used to recon, attack or some other tomfoolery but can also be used to analyze your wireless network. In either case, it is generally advised to create a virtual monitor interface and delete @@ -319,59 +361,63 @@ on the same physical index and delete them. You may not need to do this. NOTE: When creating a device in monitor mode, you can also set flags (see NL80211_MNTR_FLAGS in nl80211_h), although some cards (usually atheros) do not -always obey these requests. +always obey these flag requests. ```python -'monitor' in pyw.devmodes(w0) # make sure we can set wlan0 to monitor -=> True - -m0 = pyw.devadd(w0,'mon0','monitor') # create mon0 in monitor mode - -for iface in pyw.ifaces(w0): # delete all interfaces - pyw.devdel(iface[0]) # on the this phy - -pyw.up(m0) # bring the new card up to use - -pyw.chset(m0,6,None) # and set the card to channel 6 -=> True - -m0 -=> Card(phy=0,dev='mon0',ifindex=3) +>>> 'monitor' in pyw.devmodes(w0) # make sure we can set wlan0 to monitor +True +>>> +>>> m0 = pyw.devadd(w0,'mon0','monitor') # create mon0 in monitor mode +>>> m0 +Card(phy=0,dev=mon0,ifindex=4) +>>> pyw.winterfaces() +['mon0', 'wlan0'] +>>> for iface in pyw.ifaces(w0): # delete all interfaces +... print iface +... if not iface[0].dev == m0.dev: # that are not our monitor +... pyw.devdel(iface[0]) # on the this phy +... +(Card(phy=0,dev=mon0,ifindex=4), 'monitor') +(Card(phy=0,dev=wlan0,ifindex=3), 'managed') +>>> +>>> +>>> pyw.txget(w0) +15 +>>> pyw.txset(w0,30,'fixed') +>>> # NOTE: my card does not support setting the tx power. +... +>>> pyw.up(m0) # bring the new card up to use +>>> pyw.chset(m0,6,None) # and set the card to channel 6 +True +>>> ``` -Of course, once you are done, you will probably want to restore your original set -up. +NOTE: If you don't want to add a virtual interface, you can set the mode of a current +one with modeset. -```python -w0 = pyw.devadd(m0,'wlan0','managed') # restore wlan0 in managed mode - -pyw.devdel(m0) # delete the monitor interface - -pyw.setmac(w0,mac) # restore the original mac address - -pyw.up(w0) # and bring the card up - -w0 -=> Card(phy0,dev='wlan0',ifindex=4) +Once you are done, you will probably want to delete the virtual interface and +restore your original one. +```python +>>> w0 = pyw.devadd(m0,'wlan0','managed') # restore wlan0 in managed mode +>>> pyw.devdel(m0) # delete the monitor interface +True +>>> pyw.up(w0) # and bring the card up +>>> ``` -#### iv. Additional Functions -PyRIC also provides functions to change Radio Parameters: coverage class, rts and -frag thresholds, and retry limits short and long - Read the user guide, or type dir(pyw) in your console to get a full listing of pyw functions. -**** v. Miscelleaneous Utilities +**** vi. Miscelleaneous Utilities Several additional tools are located in the utils directory. Two of these are: * channels.py: defines ISM and UNII band channels/frequencies and provides functions to convert between channel and frequency and vice-versa * ouifetch.py: retrieves and parses oui.txt from the IEEE website and stores the oui data in a file that can be read by hardware.py functions -The others will be demonstrated in the following functions +The others will be demonstrated in the following -i. hardware.py +hardware.py Driver, chipset and mac address related functions can be found here: ``` python @@ -403,7 +449,7 @@ hw.ifcard('wlan0') # get driver & chipset => ('iwlwifi', 'Intel 4965/5xxx/6xxx/1xxx') ``` -ii. rfkill.py +rfkill.py Sometimes, your card has a soft block (or hard block) on it and it is not recognized by command line tools or pyw. Use rkill to list, turn on or turn off soft blocks. diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 8f6dda10c9e7ca087c6d5e9f75e191d0a4185107..f799ade30434ba9eb4511b25f5372868e873cb49 100644 GIT binary patch delta 14306 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 IDoMfr7q6plp8x;= delta 13782 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 diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index f132432..87897e8 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -736,13 +736,16 @@ \subsection{Functions} object for dev \item validcard(card,[nlsock]): (N/A), type: (hyrbrid netlink and ioctl), verify card is still valid -\item macget(card,[iosock]): (ifconfig card.), type: ioctl get card's hw -address +\item macget(card,[iosock]): (ifconfig), type: ioctl, determine if card is up +or down \item macset(card,mac,[iosock]): (ifconfig card. hw ether ), type: ioctl, set card's hw address to mac +\item isup(card,[iosock]): (ifconfig card.) \item up(card,[iosock]) (ifconfig card. up), type: ioctl, bring card up \item down(card,[iosock]): (ifconfig card. down), type: ioctl, bring card down +\item isblocked(card): (rfkill list ): type N/A returns tuple +(Soft Block State, Hard Block State) \item block(card): (rfkill block ) type: N/A, soft blocks card \item unblock(card): (rfkill unblock ) type: N/A, removes the soft block on card @@ -787,6 +790,8 @@ \subsection{Functions} for phy \item ifaces(card,[nlsock]): (APX iw card.dev | grep phy\#), type: netlink, get all cards (w/ modes) of interfaces sharing the same phy as card +\item txset(card,pwr,lvl,[nlsock]) (iw phy phy0 set txpower ), type: +netlink,sets the tx power to pwr (in dBm) with level setting lvl \item txget(card,[iosock]): (iwconfig card. | grep Tx-Power card), type: ioctl, get card's transmission power \item chget(card,[nlsock]): (iw dev info | grep channelS), type: diff --git a/pyric/__init__.py b/pyric/__init__.py index 513e874..ceee454 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -31,6 +31,8 @@ includes: /nlhelp /lib /net /utils pyw 0.1.4 changes: See CHANGES in top-level directory + Changes since 1.3: + o added isup """ diff --git a/pyric/pyw.py b/pyric/pyw.py index e1dd015..21ed451 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -196,7 +196,6 @@ def regset(rd, *argv): sets the current regulatory domain (iw reg set ) :param rd: regulatory domain code :param argv: netlink socket at argv[0] (or empty) - :returns: True on success """ if len(rd) != 2: raise pyric.error(errno.EINVAL, "Invalid reg. domain") try: @@ -210,7 +209,6 @@ def regset(rd, *argv): nl.nla_put_string(msg, rd.upper(), nl80211h.NL80211_ATTR_REG_ALPHA2) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) # throws exception on failure - return True # we got here-it worked (or there were no complaints) ################################################################################ #### CARD RELATED #### @@ -385,7 +383,6 @@ def inetset(card, ipaddr, netmask, broadcast, *argv): :param netmask: netmask to set :param broadcast: broadcast to set :param argv: ioctl socket at argv[0] (or empty) - :returns: True on success NOTE: 1) throws error if setting netmask or broadcast and card does not have an ip assigned @@ -422,7 +419,6 @@ def inetset(card, ipaddr, netmask, broadcast, *argv): raise pyric.error(errno.EINVAL, "Invalid Card object") except struct.error as e: raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) - return True def ip4set(card, ipaddr, *argv): """ @@ -536,13 +532,29 @@ def broadcastset(card, broadcast, *argv): #### ON/OFF #### ################################################################################ +def isup(card, *argv): + """ + determine on/off state of card + :param card: Card object + :param argv: ioctl socet at argv[0] (or empty) + :returns: True if card is up, False otherwise + """ + try: + iosock = argv[0] + except IndexError: + return _iostub_(isup, card) + + try: + return _issetf_(_flagsget_(card.dev, iosock), ifh.IFF_UP) + except AttributeError: + raise pyric.error(errno.EINVAL, "Invalid Card object") + def up(card, *argv): """ REQUIRES ROOT PRIVILEGES turns dev on (ifconfig up) :param card: Card object :param argv: ioctl socket at argv[0] (or empty) - :returns: True on succes, throws exception otherwise """ try: iosock = argv[0] @@ -555,7 +567,6 @@ def up(card, *argv): _flagsset_(card.dev, _setf_(flags, ifh.IFF_UP), iosock) except AttributeError: raise pyric.error(errno.EINVAL, "Invalid Card object") - return True def down(card, *argv): """ @@ -563,7 +574,6 @@ def down(card, *argv): turns def off (ifconfig down) :param card: Card object :param argv: ioctl socket at argv[0] (or empty) - :returns: True on succes, throws exception otherwise """ try: iosock = argv[0] @@ -576,7 +586,19 @@ def down(card, *argv): _flagsset_(card.dev, _unsetf_(flags, ifh.IFF_UP), iosock) except AttributeError: raise pyric.error(errno.EINVAL, "Invalid Card object") - return True + +def isblocked(card): + """ + determines blocked state of Card + :param card: Card object + :returns: tuple (Soft={True if soft blocked|False otherwise}, + Hard={True if hard blocked|False otherwise}) + """ + try: + idx = rfkill.getidx(card.phy) + return rfkill.soft_blocked(idx), rfkill.hard_blocked(idx) + except AttributeError: + raise pyric.error(errno.ENODEV, "Device is no longer regsitered") def block(card): """ @@ -757,7 +779,7 @@ def rtsthreshset(card, thresh, *argv): """ REQUIRES ROOT PRIVILEGES sets the RTS threshold. If off, RTS is disabled. If an integer, sets the - smallest packet for which card will send an RTS prior to each transmission + smallest packet for which card will send an RTS prior to each transmission :param card: Card object :param thresh: rts threshold limit :param argv: netlink socket at argv[0] (or empty) @@ -1042,13 +1064,13 @@ def phyinfo(card, *argv): #### TX/RX RELATED #### ################################################################################ -def txset(card, lvl, pwr, *argv): +def txset(card, pwr, lvl, *argv): """ sets cards tx power (iw phy card. * 100) :param card: Card object + :param pwr: desired tx power in dBm or None. NOTE: ignored if lvl is 'auto' :param lvl: power level setting oneof {'auto' = automatically determine transmit power|'limit' = limit power by |'fixed' = set to } - :param pwr: desired tx power in dBm or None. NOTE: ignored if lvl is 'auto' :param argv: netlink socket at argv[0] (or empty) :returns: True on success NOTE: this does not work on my card(s) (nor does the corresponding iw @@ -1060,7 +1082,7 @@ def txset(card, lvl, pwr, *argv): try: nlsock = argv[0] except IndexError: - return _nlstub_(txset, card, lvl, pwr) + return _nlstub_(txset, card, pwr, lvl) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -1150,7 +1172,6 @@ def freqset(card, rf, chw=None, *argv): :param rf: frequency :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} :param argv: netlink socket at argv[0] (or empty) - :returns: True on success """ if rf not in channels.freqs(): raise pyric.error(errno.EINVAL, "Invalid frequency") if chw not in channels.CHWIDTHS: raise pyric.error(errno.EINVAL, "Invalid channel width") @@ -1171,7 +1192,6 @@ def freqset(card, rf, chw=None, *argv): nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(errno.EINVAL,"Invalid Card object") - return True #### INTERFACE & MODE RELATED #### @@ -1201,7 +1221,6 @@ def modeset(card, mode, flags=None, *argv): :param flags: list of monitor flags (can only be used if card is being set to monitor mode) :param argv: netlink socket at argv[0] (or empty) - :returns: True on success """ if mode not in IFTYPES: raise pyric.error(errno.EINVAL, 'Invalid mode') if flags: @@ -1230,7 +1249,6 @@ def modeset(card, mode, flags=None, *argv): nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(errno.EINVAL, "Invalid Card object") - return True def ifaces(card, *argv): """ @@ -1306,7 +1324,6 @@ def devdel(card, *argv): deletes the device (dev del :param card: Card object :param argv: netlink socket at argv[0] (or empty) - :returns: True on success NOTE: the original card is no longer valid (i.e. the phy will still be present but the device name and ifindex are no longer 'present' in the system """ @@ -1324,7 +1341,6 @@ def devdel(card, *argv): nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(errno.EINVAL, "Invalid Card object") - return True ################################################################################ #### FILE PRIVATE #### @@ -1578,7 +1594,6 @@ def _fut_chset(card, ch, chw, *argv): :param ch: channel number :param chw: channel width oneof {None|'HT20'|'HT40-'|'HT40+'} :param argv: netlink socket at argv[0] (or empty) - :returns: True on success uses the newer NL80211_CMD_SET_CHANNEL vice iw's depecrated version which uses *_SET_WIPHY however, ATT does not work raise Errno 22 Invalid Argument """ @@ -1596,5 +1611,4 @@ def _fut_chset(card, ch, chw, *argv): nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) nl.nla_put_u32(msg, channels.CHWIDTHS.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) - return True + nl.nl_recvmsg(nlsock) \ No newline at end of file diff --git a/setup.py b/setup.py index b7db6b4..f8f64b7 100644 --- a/setup.py +++ b/setup.py @@ -52,7 +52,7 @@ setup(name='PyRIC', version=pyric.__version__, - description="Python Wireless Card Library", + description="Python Wireless Library", long_description=long_desc, url='http://wraith-wireless.github.io/pyric', download_url="https://github.com/wraith-wireless/pyric/archive/"+pyric.__version__+".tar.gz", From ce186333e9d0a0171904584dbbd08b05637f996f Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sat, 25 Jun 2016 05:06:58 -0600 Subject: [PATCH 055/121] v0.1.4 see CHANGES --- .gitignore | 2 +- CHANGES | 21 +- LICENSE | 1 + MANIFEST.in | 2 +- README.md | 3 +- TODO | 9 +- __init__.py | 3 +- docs/PyRIC.bib | 2 +- docs/PyRIC.pdf | Bin 492770 -> 506118 bytes docs/PyRIC.tex | 34 +- pyric/__init__.py | 2 - pyric/lib/__init__.py | 1 + pyric/lib/libio.py | 13 +- pyric/lib/libnl.py | 69 +-- pyric/net/if_h.py | 1 + pyric/net/wireless/__init__.py | 2 +- .../net/wireless/{ieee80211_h.py => wlan.py} | 70 ++- pyric/pyw.py | 495 ++++++++++++------ pyric/utils/channels.py | 8 +- setup.cfg | 1 + setup.py | 14 +- tests/pyw.unittest.py | 180 +++++-- 22 files changed, 627 insertions(+), 306 deletions(-) rename pyric/net/wireless/{ieee80211_h.py => wlan.py} (74%) diff --git a/.gitignore b/.gitignore index eb21fdd..40c0870 100644 --- a/.gitignore +++ b/.gitignore @@ -113,4 +113,4 @@ ENV/ .spyderproject # Rope project settings -.ropeproject \ No newline at end of file +.ropeproject diff --git a/CHANGES b/CHANGES index dd32496..578bd3d 100644 --- a/CHANGES +++ b/CHANGES @@ -89,4 +89,23 @@ v 0.1.3 - retryshortset - retrylongset - rtsthreshset - - fragthreshset \ No newline at end of file + - fragthreshset + +v 0.1.4 + o added functions: + - isup + - covclassget + - retryshortget + - retrylongget + o modified devadd. User is allowed to submit a Card object or a physical index + o removed hardcoded values for covclassset, retry(short|long)set, retsthreshet and + fragrthreshset + - constants defined in 80211.h + o removed return True where redundant i.e. when setting mac address we can assume + it worked if no error was thrown + o renamed ieee80211_h to wlan + o didn't like the incestual circular pyric error (libnl shouldn't know about pyric) + - replaced pyric.error with defined error in libnl and libio + - pyw has to catch libnl and libio errors and reraise as pyric errors + o retooled exception messages + o added new functions from 0.1.3 and 0.1.4 to unittests \ No newline at end of file diff --git a/LICENSE b/LICENSE index 0ac7396..f2eb1c3 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,5 @@ PyRIC: Python Radio Interface Controller + Python wireless library Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) diff --git a/MANIFEST.in b/MANIFEST.in index 956b44e..d288866 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -# setup paramaters +# setup paramaters for PyRIC via PyPi include LICENSE CHANGES README.md TODO # Include subdirectories diff --git a/README.md b/README.md index 789ce97..62e4b76 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PyRIC 0.1.2: Python Radio Interface Controller +# PyRIC 0.1.4: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester ![](docs/logo.png?raw=true) @@ -77,6 +77,7 @@ currently pyw provides the following: * get phy info * get/set regulatory domain * get/set mode +* get/set coverage class, RTS threshold, Fragmentation threshold & retry limits * add/delete interfaces * enumerate ISM and UNII channels * block/unblock rfkill devices diff --git a/TODO b/TODO index cc24f19..0aee33f 100644 --- a/TODO +++ b/TODO @@ -25,8 +25,10 @@ 11) tried NL80211_CMD_GET_WIPHY, setting _WIPHY_TX_POWER_LEVEL but did not return the current power level - currently cannot find anything in nl80211.h that could be used to get tx power - 12) add set retry short and long, set rts and set frag - 13) replace hardcoded values like cc limits in setcovclass to constants + 14) look at udevadm info --query=all --path /sys/class/net/ + o has devie driver, name and some other details + 15) fix unittest + 16) look into readthedocs. ------- Request For Information RFI ---------- @@ -147,3 +149,6 @@ dev set txpower [] phy set txpower [] Specify transmit power level and setting type. +6) Passwords + On ubuntu at least passwords for APs are stored in /etc/NetworkManager/system-connections + under directory for ssid diff --git a/__init__.py b/__init__.py index a4c8b62..648f69d 100644 --- a/__init__.py +++ b/__init__.py @@ -1,3 +1,4 @@ # PyRIC root Distribution directory # Do not import from this directory i.e from PyRIC import foobar -# use pip ('sudo pip install PyRIC') to install or import from pyric +# use pip ('sudo pip install PyRIC') or download latest tarbal to +# install. Then execute from pyric import ffobar diff --git a/docs/PyRIC.bib b/docs/PyRIC.bib index d159770..3857611 100644 --- a/docs/PyRIC.bib +++ b/docs/PyRIC.bib @@ -1,4 +1,4 @@ - +# PyRIC.bib for v 1.4 @Misc{libnl, Title = {Netlink Library (libnl)}, Author = {Thomas Graf}, diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index f799ade30434ba9eb4511b25f5372868e873cb49..4f6561ca61fb8cb4962ad5792d3022682b4773df 100644 GIT binary patch delta 75927 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 delta 62530 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

$)*r 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 diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 87897e8..641fe54 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -73,7 +73,7 @@ basicstyle=\footnotesize } -\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.3: User Manual} +\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.4: User Manual} \author{Dale V. Patterson\\ wraith.wireless@yandex.com} \begin{document} @@ -185,9 +185,10 @@ \subsection{Cards} A Card is merely a wrapper around a tuple t = (phy index,device name,ifindex). Since the underlying Netlink calls sometimes require the physical index, sometimes the device name, and sometimes the ifindex, pyw functions\footnote{Not all functions -accept a Card, the function pyw.devinfo() will accept either a Card or a dev and -pyw.isinterface() only accepts a dev} take a Card object which doesn't require -callers to know which identifier to use for each function. There are four primary methods to creating a Card: +accept a Card, devinfo() will accept either a Card or a dev and devadd will accept +either a Card or a physical index} take a Card object which doesn't require callers +to know which identifier to use for each function. There are four primary methods +to creating a Card: \begin{enumerate} \item \textbf{pyw.getcard} returns a Card object from a given dev, \item \textbf{pyw.devinfo} returns the dict info where info['card'] is the Card @@ -205,9 +206,9 @@ \subsection{Cards} Keep in mind that any identifier (phy, dev, ifindex) can be invalidated outside of your control. Another program can rename your interface, that is change the dev without your knowledge. Depending on what functions are being used this may -not be noticed right away as the phy will remain the same. Also, usb devices (if -the usb is disconnected and reconnected) will have the same dev but the phy and -ifindex will be different. +not be noticed right away as the phy will remain the same. Also for usb devices, +(if the usb is disconnected and reconnected) will have the same dev but the phy +and ifindex will be different. \subsection{Benchmarks} PyRIC makes use of several "extensions" to speed up pyw functions: @@ -687,7 +688,6 @@ \section{API: pyw.py}\label{sec:pywapi} \subsection{Constants} \begin{itemize} \item \textbf{\_FAM80211ID\_}: Global netlink family id of nl80211. Do not touch -\item \textbf{\_MAXTHRESH\_}: defines limit for thresholds or 'off'. Do not touch \item \textbf{IFTYPES}: redefined (from nl80211\_h.py) interface modes \item \textbf{MNTRFLAGS}: redefined (from nl80211\_h.py) monitor mode flags \item \textbf{IPADDR}: Regular Expression for ip4 address validation @@ -753,14 +753,24 @@ \subsection{Functions} get card's power save state True = on, False = off \item pwrsaveset(card,on,[nlsock]) (iw dev card. set power\_save ) type: netlink set card's power save state True = on, False = off +\item covclassget(card,[nlsock]) (iw phy card. get coverage ) type: +netlink get card's coverage class \item covclassset(card,cc,[nlsock]) (iw phy card. set coverage ) type: netlink set card's coverage class +\item retryshortget(card,[nlsock]) (iw phy card. info | grep 'retry short') +type:netlink get card's retry short limit \item retryshortset(card,lim,[nlsock]) (iw phy card. set retry short ) type:netlink set card's retry short limit +\item retrylongget(card,[nlsock]) (iw phy card. info | grep 'retry long') +type:netlink get card's retry long limit \item retrylongset(card,lim,[nlsock]) (iw phy card. set retry long ) type:netlink set card's retry long limit +\item rtsthreshget(card,[nlsock]) (iw phy card. info | grep rts) type: +netlink set card's RTS threshold \item rtsthreshset(card,thresh,[nlsock]) (iw phy card. set rts ) type: netlink set card's RTS threshold +\item fragthreshget(card,[nlsock]) (iw phy card. info | grep frag) type: +netlink get card's fragmentation threshold \item fragthreshset(card,thresh,[nlsock]) (iw phy card. set frag ) type: netlink set card's fragmentation threshold \item inetget(card,[iosock]): (ifconfig card.), type: ioctl, get ip4 address, @@ -824,9 +834,11 @@ \subsection{Functions} \item \_ifindex\_(dev,[iosock]): returns dev's ifindex \item \_flagsget\_(dev,[iosock]): get's the dev's interface flags \item \_flagsset\_(dev,flags,[iosock]): set's the dev's interface flags -\item \_getfreqs\_(band): returns a list of frequencies from the packed byte string -band \item \_iftypes\_(i): returns the mode corresponding to i +\item \_frequencies\_(band): returns a list of frequencies from the packed byte +string band +\item \_commands\_(command): converts the list of numeric commands to a list of +commands as strings \item \_ciphers\_(cipher): returns a list of ciphers from the packed byte string cipher \item \_iostub\_(fct,*argv): ioctl stub function, calls fct with parameter list argv @@ -1085,7 +1097,7 @@ \subsection{Functions} \end{enumerate} \section{Copyright and License}\label{sec:copy} -PYRIC: Python Radio Interface Controller v0.1.3\\ +PYRIC: Python Radio Interface Controller v0.1.4\\ Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com)\\ diff --git a/pyric/__init__.py b/pyric/__init__.py index ceee454..513e874 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -31,8 +31,6 @@ includes: /nlhelp /lib /net /utils pyw 0.1.4 changes: See CHANGES in top-level directory - Changes since 1.3: - o added isup """ diff --git a/pyric/lib/__init__.py b/pyric/lib/__init__.py index ff77081..ea01d09 100644 --- a/pyric/lib/__init__.py +++ b/pyric/lib/__init__.py @@ -38,6 +38,7 @@ - added some error checking to nla_parse_nested, raising and handling error in situations where attribute len is 0 - fixed nlmsg_fromstream to handle non-ack message parsing with a length of 36 + o libnl and libnl now report their own errors rather than use pyric.error """ __name__ = 'lib' diff --git a/pyric/lib/libio.py b/pyric/lib/libio.py index c652211..e865e88 100644 --- a/pyric/lib/libio.py +++ b/pyric/lib/libio.py @@ -37,7 +37,8 @@ import struct import errno from fcntl import ioctl -import pyric + +class error(EnvironmentError): pass def io_socket_alloc(): """ @@ -64,14 +65,14 @@ def io_transfer(iosock,flag,ifreq): except (AttributeError,struct.error) as e: # either sock is not valid or a bad value passed to ifreq # note: should not get these but just in case - if e.message.find('fileno'): raise pyric.error(errno.ENOTSOCK,"bad socket") - else: raise pyric.error(errno.EINVAL,e) + if e.message.find('fileno'): raise error(errno.ENOTSOCK,"bad socket") + else: raise error(errno.EINVAL,e) except IOError as e: # generally device cannot be found sort but can also be # permissions etc, catch and reraise as our own if e.errno is not None: # just in case we have a none 2-tuple error - raise pyric.error(e.errno,e.strerror) + raise error(e.errno,e.strerror) else: - raise pyric.error(pyric.EUNDEF,e) + raise error(-1,e) except Exception as e: - raise pyric.error(pyric.EUNDEF,e.args[0]) + raise error(-1,e.args[0]) diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 5259c99..38fb6ec 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -44,11 +44,13 @@ import struct import socket from binascii import hexlify -import pyric, errno +import errno import pyric.net.netlink_h as nlh import pyric.net.genetlink_h as genlh from pyric.net.policy import nla_datatype +class error(EnvironmentError): pass + BUFSZ = 32768 # Generic default buffersize """ @@ -87,7 +89,7 @@ def tx(self): return self['sock'].getsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF) @tx.setter def tx(self,v): if v < 128 or v > _maxbufsz_(): - raise pyric.error(errno.EINVAL,"Invalid buffer size") + raise error(errno.EINVAL,"Invalid buffer size") self['sock'].setsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF,v) @property @@ -96,7 +98,7 @@ def rx(self): return self['sock'].getsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF) @rx.setter def rx(self,v): if v < 128 or v > _maxbufsz_(): - raise pyric.error(errno.EINVAL,"Invalid buffer size") + raise error(errno.EINVAL,"Invalid buffer size") self['sock'].setsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF,v) @property @@ -104,7 +106,7 @@ def pid(self): return self['pid'] @pid.setter def pid(self,v): - if v < 1: raise pyric.error(errno.EINVAL,"Invalid port id") + if v < 1: raise error(errno.EINVAL,"Invalid port id") self['pid'] = v @property @@ -118,7 +120,7 @@ def seq(self): return self['seq'] @seq.setter def seq(self,v): - if v < 1: raise pyric.error(errno.EINVAL,"Invalid sequence number") + if v < 1: raise error(errno.EINVAL,"Invalid sequence number") self['seq'] = v @property @@ -126,7 +128,7 @@ def timeout(self): return self['sock'].gettimeout() @timeout.setter def timeout(self,v): - if v and v < 0: raise pyric.error(errno.EINVAL,"Invalid timeout value") + if v and v < 0: raise error(errno.EINVAL,"Invalid timeout value") self['sock'].settimeout(v) #### wrap socket functions @@ -170,13 +172,13 @@ def nl_socket_alloc(pid=None,grps=0,seq=None,rx=None,tx=None,timeout=None): """ # set & validate paramaters pid = pid or getpid() + int(time()) # allow multiple sockets on this host - if pid < 1: raise pyric.error(errno.EINVAL,"Invalid port id") + if pid < 1: raise error(errno.EINVAL,"Invalid port id") seq = seq or int(time()) - if seq < 1: raise pyric.error(errno.EINVAL,"Invalid sequence number") + if seq < 1: raise error(errno.EINVAL,"Invalid sequence number") rx = rx or BUFSZ - if rx < 128 or rx > _maxbufsz_(): raise pyric.error(errno.EINVAL,"Invalid rx size") + if rx < 128 or rx > _maxbufsz_(): raise error(errno.EINVAL,"Invalid rx size") tx = tx or BUFSZ - if tx < 128 or tx > _maxbufsz_(): raise pyric.error(errno.EINVAL,"Invalid tx size") + if tx < 128 or tx > _maxbufsz_(): raise error(errno.EINVAL,"Invalid tx size") # create the socket and rturn it try: @@ -186,7 +188,7 @@ def nl_socket_alloc(pid=None,grps=0,seq=None,rx=None,tx=None,timeout=None): s.settimeout(timeout) s.bind((pid,grps)) except socket.error as e: - raise pyric.error(e.errno,e.strerror) + raise error(e.errno,e.strerror) return NLSocket({'sock':s,'tx':tx,'rx':rx,'pid':pid,'grpm':grps,'seq':seq}) def nl_socket_free(sock): @@ -215,7 +217,7 @@ def nl_sendmsg(sock,msg,override=False): """ try: # change the msg's pid & seq to that of the sockets prior to sending & - # set the ack flag - I can't figure how to tell in recv if the an ack was + # set the ack flag - I can't figure how to tell in recv if an ack was # requested or not so I force an ACK here if not override: msg.pid = sock.pid @@ -223,11 +225,11 @@ def nl_sendmsg(sock,msg,override=False): msg.flags = msg.flags | nlh.NLM_F_ACK sent = sock.send(msg.tostream()) if sent != msg.len: - raise pyric.error(errno.EBADMSG,"Message sent incomplete") + raise error(errno.EBADMSG,"Message sent incomplete") except socket.error as e: - raise pyric.error(errno.ECOMM, e) + raise error(errno.ECOMM, e) except AttributeError: - raise pyric.error(errno.ENOTSOCK, "Invalid netlink socket") + raise error(errno.ENOTSOCK,"Invalid netlink socket") def nl_recvmsg(sock): """ @@ -242,17 +244,17 @@ def nl_recvmsg(sock): msg = nlmsg_fromstream(sock.recv()) try: _ = nlmsg_fromstream(sock.recv()) - except pyric.error as e: + except error as e: if e.errno == nlh.NLE_SUCCESS: pass else: raise if sock.seq != msg.seq: - raise pyric.error(errno.EBADMSG,"seq. # out of order") + raise error(errno.EBADMSG,"seq. # out of order") return msg except socket.timeout: - raise pyric.error(pyric.EUNDEF,"socket timed out") + raise error(-1,"socket timed out") except socket.error as e: - raise pyric.error(errno.ENOTSOCK,e) - except pyric.error as e: + raise error(errno.ENOTSOCK,e) + except error as e: if e.errno == nlh.NLE_SUCCESS: return nlh.NLE_SUCCESS raise # rethrow finally: @@ -351,7 +353,7 @@ def nltype(self): return self['type'] @nltype.setter def nltype(self,v): - if v < 0: raise pyric.error(errno.ERANGE,"nltype {0} is invalid".format(v)) + if v < 0: raise error(errno.ERANGE,"nltype {0} is invalid".format(v)) self['type'] = v @property @@ -365,7 +367,7 @@ def seq(self): return self['seq'] @seq.setter def seq(self,v): - if v < 1: raise pyric.error(errno.ERANGE,"invalid seq. number") + if v < 1: raise error(errno.ERANGE,"invalid seq. number") self['seq'] = v @property @@ -373,7 +375,7 @@ def pid(self): return self['pid'] @pid.setter def pid(self,v): - if v < 1: raise pyric.error(errno.ERANGE,"invalid port id") + if v < 1: raise error(errno.ERANGE,"invalid port id") self['pid'] = v @property @@ -381,7 +383,7 @@ def cmd(self): return self['cmd'] @cmd.setter def cmd(self,v): - if v < 0: raise pyric.error(errno.ERANGE,"invalid cmd") + if v < 0: raise error(errno.ERANGE,"invalid cmd") self['cmd'] = v @property @@ -399,7 +401,7 @@ def tostream(self): try: payload += _attrpack_(attr,v,data) except struct.error: - raise pyric.error(pyric.EUNDEF,"Packing {0} {1}".format(attr,v)) + raise error(-1,"Packing {0} {1}".format(attr,v)) return nlh.nlmsghdr(len(payload),self.nltype,self.flags,self.seq,self.pid) + payload def nlmsg_new(nltype=None,cmd=None,seq=None,pid=None,flags=None,attrs=None): @@ -437,10 +439,10 @@ def nlmsg_fromstream(stream,override=False): if t == nlh.NLMSG_ERROR or (l == nlh.NLMSGACKLEN and not override): # have an (possible) ack/nack i.e. error msg e = struct.unpack_from(nlh.nl_nlmsgerr,stream,nlh.NLMSGHDRLEN)[0] - raise pyric.error(abs(e),strerror(abs(e))) + raise error(abs(e),strerror(abs(e))) c,_,_ = struct.unpack_from(genlh.genl_genlmsghdr,stream,nlh.NLMSGHDRLEN) except struct.error as e: - raise pyric.error(pyric.EUNDEF,"error parsing headers: {0}".format(e)) + raise error(-1,"error parsing headers: {0}".format(e)) # create a new message with hdr values then parse the attributes msg = nlmsg_new(t,c,s,p,fs) @@ -486,7 +488,7 @@ def nla_parse(msg,l,mtype,stream,idx): except struct.error: # append as Error, stripping null bytes nla_put(msg,_nla_strip_(a),atype,nlh.NLA_ERROR) - except pyric.error as e: + except error as e: if e.errno == errno.EINVAL: # a nested attribute failed to parse correctly nla_put(msg, _nla_strip_(a), atype, nlh.NLA_ERROR) @@ -494,8 +496,7 @@ def nla_parse(msg,l,mtype,stream,idx): raise except MemoryError as e: # hopefully don't get here - emsg = "Attr type {0} of pol {1} failed: {2}".format(atype,pol,e) - raise pyric.error(pyric.EUNDEF,emsg) + raise error(-1,"Attr type {0} of pol {1} failed: {2}".format(atype,pol,e)) idx = nlh.NLMSG_ALIGN(idx + alen) # move index to next attr def nla_parse_nested(nested): @@ -538,7 +539,7 @@ def nla_parse_nested(nested): # not include additional pad bytes for proper alignment alen = struct.unpack_from('B',nested,idx)[0] if alen == 0: - raise pyric.error(errno.EINVAL,"attribute length is 0") + raise error(errno.EINVAL,"attribute length is 0") ns.append(nested[idx+1:idx+(alen-1)]) idx = nlh.NLMSG_ALIGN(idx + alen) return ns @@ -551,11 +552,11 @@ def nla_put(msg,v,a,d): :param a: attribute type :param d: attribute datatype """ - if d > nlh.NLA_TYPE_MAX: raise pyric.error(errno.ERANGE,"value type is invalid") + if d > nlh.NLA_TYPE_MAX: raise error(errno.ERANGE,"value type is invalid") msg['attrs'].append((a,v,d)) # nla_put_* append data of specified datatype -def nla_put_flag(msg,a): nla_put(msg,) +def nla_put_flag(msg,a): nla_put(msg,None,a,nlh.NLA_FLAG) def nla_put_unspec(msg,v,a): nla_put(msg,v,a,nlh.NLA_UNSPEC) def nla_put_u8(msg,v,a): nla_put(msg,v,a,nlh.NLA_U8) def nla_put_u16(msg,v,a): nla_put(msg,v,a,nlh.NLA_U16) @@ -574,7 +575,7 @@ def nla_putat(msg,i,v,a,d): :param a: attribute type :param d: attribute datatype """ - if d > nlh.NLA_TYPE_MAX: raise pyric.error(errno.ERANGE,"invalid datatype") + if d > nlh.NLA_TYPE_MAX: raise error(errno.ERANGE,"invalid datatype") msg['attrs'][i] = (a,v,d) def nla_pop(msg,i): diff --git a/pyric/net/if_h.py b/pyric/net/if_h.py index 0dd6318..cd794a7 100644 --- a/pyric/net/if_h.py +++ b/pyric/net/if_h.py @@ -248,6 +248,7 @@ def ifreq(ifrn,ifru=None,param=None): form "XXX.XXX.XXX.XXX", if flags must be an integer (c short) or (int) respectively :returns: packed ifreq + NOTE: ifreq will return AttributeError for any caught exception """ # pack the nic try: diff --git a/pyric/net/wireless/__init__.py b/pyric/net/wireless/__init__.py index 1b008e7..dac11e7 100644 --- a/pyric/net/wireless/__init__.py +++ b/pyric/net/wireless/__init__.py @@ -20,7 +20,7 @@ wireless 0.0.1 desc: linux port of nl80211.h, nl80211.c - includes: rfkill_h 0.0.1 nl80211_h 0.0.2 nl80211_c 0.0.1 ieee80211_h 0.0.1 + includes: rfkill_h 0.0.1 nl80211_h 0.0.2 nl80211_c 0.0.1 wlan 0.0.2 changes: o added nl80211_c to handle attribute policies - added nl80211_parse_freqs to parse out supported frequencies diff --git a/pyric/net/wireless/ieee80211_h.py b/pyric/net/wireless/wlan.py similarity index 74% rename from pyric/net/wireless/ieee80211_h.py rename to pyric/net/wireless/wlan.py index e37719d..e4223b8 100644 --- a/pyric/net/wireless/ieee80211_h.py +++ b/pyric/net/wireless/wlan.py @@ -1,19 +1,5 @@ #!/usr/bin/env python -""" ieee80211_h.py: 802.11 public header - -/* - * IEEE 802.11 defines - * - * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen - * - * Copyright (c) 2002-2003, Jouni Malinen - * Copyright (c) 2005, Devicescape Software, Inc. - * Copyright (c) 2006, Michael Wu - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ +""" wlan.py: IEEE Std 802.11-2012 Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) @@ -33,11 +19,13 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. - python port of ieee80211.h +Definition of constants et all found in IEEE Std 802.11-2012 + +Std will refer to IEEE Std 802.11-2012 """ -__name__ = 'ieee80211_h' +__name__ = 'wlan' __license__ = 'GPLv3' __version__ = '0.0.1' __date__ = 'June 2016' @@ -46,20 +34,18 @@ __email__ = 'wraith.wireless@yandex.com' __status__ = 'Production' -import struct - """ - cipher suite selectors - decided to (over)document this because it was such a - hassle to figure out, want to make sure I can come back at a later date and - figure it out again faster + cipher suite selectors - decided to (over)document this because it was such a hassle to + figure out, want to make sure I can come back at a later date and figure it out again + faster From nl80211.h @NL80211_ATTR_CIPHER_SUITES: a set of u32 values indicating the supported cipher suites The returned cipher suite (from phyinfo) for an alfa card is: \x01\xac\x0f\x00\x05\xac\x0f\x00\x02\xac\x0f\x00\x04\xac\x0f\x00 - which is not a nested attribute. Does set mean something? I cannot find - any reference to sets, arrays or lists etc in + which is not a nested attribute. Does 'set' mean something? I cannot find any + reference to sets, arrays or lists etc in http://www.carisma.slowglass.com/~tgr/libnl/doc/core.html Another way nl80211 breaks the rules or another way I'm just not getting it? @@ -75,7 +61,7 @@ The only reference is in nl80211.h which says: @NL80211_KEY_CIPHER: key cipher suite (u32, as defined by IEEE 802.11 section 7.3.2.25.1, e.g. 0x000FAC04) - Looking in the standard we find Table 8-99 in IEEE Std 802.11-2012 which defines + Looking in the standard we find Table 8-99 in Std which defines these values. Lets look in ieee80211.h and voila we find @@ -105,7 +91,6 @@ say read the source code. """ - WLAN_CIPHER_SUITE_LEN = 4 WLAN_CIPHER_SUITE_GROUP = 0x000fac00 WLAN_CIPHER_SUITE_WEP40 = 0x000fac01 @@ -123,4 +108,35 @@ WLAN_CIPHER_SUITE_WEP104:'WEP-104', WLAN_CIPHER_SUITE_ACS_CMAC:'AES-CMAC', WLAN_CIPHER_SUITE_GCMP:'GCMP', - WLAN_CIPHER_SUITE_SMS4:'SMS4'} \ No newline at end of file + WLAN_CIPHER_SUITE_SMS4:'SMS4' +} +def ciphers(stream): + """ + parses out ciphers from stream + :param stream: packed byte string + :returns: a list of cipher selectors + """ + + +""" Coverage Class Limits IAW Std Table 8-56 """ +COVERAGE_CLASS_MIN = 0 +COVERAGE_CLASS_MAX = 31 + +""" + Retry (short and long) Limits IAW Std dot11ShortRetryLimit pg 2133 and + dot11LongRetryLimit pg 2134 +""" +RETRY_MIN = 1 +RETRY_MAX = 255 + +""" RTS Threshold limits IAW Std dot11RTSThreshold definition pg 2133 """ +RTS_THRESHOLD_MIN = 0 +RTS_THRESHOLD_MAX = 65536 +RTS_THRESHOLD_OFF = 4294967295 #(2^32 -1 or the max value of a u32) + +""" + Fragmentation Threshold limits IAW Std dot11FragmentThreshold definition pg 2133 +""" +FRAG_THRESHOLD_MIN = 256 +FRAG_THRESHOLD_MAX = 8000 +FRAG_THRESHOLD_OFF = 4294967295 #(2^32 -1 or the max value of a u32) \ No newline at end of file diff --git a/pyric/pyw.py b/pyric/pyw.py index 21ed451..ea0f10c 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -85,14 +85,13 @@ import pyric.net.netlink_h as nlh # netlink definition import pyric.net.genetlink_h as genlh # genetlink definition import pyric.net.wireless.nl80211_h as nl80211h # nl80211 definition -import pyric.net.wireless.ieee80211_h as dotllh # ieee80211 definition +from pyric.net.wireless import wlan # IEEE 802.11 Std definition import pyric.net.sockios_h as sioch # sockios constants import pyric.net.if_h as ifh # ifreq structure import pyric.lib.libnl as nl # netlink functions import pyric.lib.libio as io # ioctl functions _FAM80211ID_ = None -_MAXTHRESH_ = 4294967295 #(2^32 -1 or the max value of a u32) # redefine interface types and monitor flags IFTYPES = nl80211h.NL80211_IFTYPES @@ -143,12 +142,8 @@ def winterfaces(*argv): wifaces = [] for dev in interfaces(): - try: - if iswireless(dev, iosock): wifaces.append(dev) - except pyric.error as e: - # ENODEV & EOPNOTSUPP mean not wireless, reraise any others - if e.errno == errno.ENODEV or e.errno == errno.EOPNOTSUPP: pass - else: raise + # no errors are caught here - but allowed to pass + if iswireless(dev, iosock): wifaces.append(dev) return wifaces def iswireless(dev, *argv): @@ -167,10 +162,12 @@ def iswireless(dev, *argv): # if the call succeeds, found to be wireless _ = io.io_transfer(iosock, sioch.SIOCGIWNAME, ifh.ifreq(dev)) return True - except pyric.error as e: + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) + except io.error as e: # ENODEV or ENOTSUPP means not wireless, reraise any others if e.errno == errno.ENODEV or e.errno == errno.EOPNOTSUPP: return False - else: raise + else: raise pyric.error(e.errno, e.strerror) def regget(*argv): """ @@ -183,11 +180,14 @@ def regget(*argv): except IndexError: return _nlstub_(regget) - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_GET_REG, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_GET_REG, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nl_sendmsg(nlsock, msg) + rmsg = nl.nl_recvmsg(nlsock) + except nl.error as e: + raise pyric.error(e.errno, e.strerror) return nl.nla_find(rmsg, nl80211h.NL80211_ATTR_REG_ALPHA2) def regset(rd, *argv): @@ -203,12 +203,15 @@ def regset(rd, *argv): except IndexError: return _nlstub_(regset, rd) - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_REQ_SET_REG, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_string(msg, rd.upper(), nl80211h.NL80211_ATTR_REG_ALPHA2) - nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) # throws exception on failure + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_REQ_SET_REG, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_string(msg, rd.upper(), nl80211h.NL80211_ATTR_REG_ALPHA2) + nl.nl_sendmsg(nlsock, msg) + nl.nl_recvmsg(nlsock) + except nl.error as e: + raise pyric.error(e.errno, e.strerror) ################################################################################ #### CARD RELATED #### @@ -223,9 +226,12 @@ class Card(tuple): dev: device name idx: interface index (ifindex) """ - def __new__(cls, p, d, i): return super(Card, cls).__new__(cls, tuple((p, d, i))) + def __new__(cls, p, d, i): + return super(Card, cls).__new__(cls, tuple((p, d, i))) def __repr__(self): - return "Card(phy={0},dev={1},ifindex={2})".format(self.phy, self.dev, self.idx) + return "Card(phy={0},dev={1},ifindex={2})".format(self.phy, + self.dev, + self.idx) @property def phy(self): return self[0] @property @@ -257,14 +263,15 @@ def validcard(card, *argv): nlsock = argv[0] except IndexError: return _nlstub_(validcard, card) + try: return card == devinfo(card.dev, nlsock)['card'] except pyric.error as e: if e.errno == errno.ENODEV: return False else: raise -############################################################################### -#### ADDRESS RELATED #### +################################################################################ +#### ADDRESS RELATED #### ################################################################################ def macget(card, *argv): @@ -283,14 +290,17 @@ def macget(card, *argv): flag = sioch.SIOCGIFHWADDR ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam == ifh.ARPHRD_ETHER or fam == ifh.AF_UNSPEC: # confirm we got a hwaddr back + if fam == ifh.ARPHRD_ETHER or fam == ifh.AF_UNSPEC: # confirm hwaddr return _hex2mac_(ret[18:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, "Invalid return addr family {0}".format(fam)) - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(errno.EAFNOSUPPORT, + "Invalid return hwaddr family {0}".format(fam)) + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Ifreq error: {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) + except io.error as e: + raise pyric.error(e.errno, e.strerror) def macset(card, mac, *argv): """ @@ -302,6 +312,7 @@ def macset(card, mac, *argv): :returns: mac address after operation """ if not _validmac_(mac): raise pyric.error(errno.EINVAL, "Invalid mac address") + try: iosock = argv[0] except IndexError: @@ -311,14 +322,17 @@ def macset(card, mac, *argv): flag = sioch.SIOCSIFHWADDR ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [mac])) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam == ifh.ARPHRD_ETHER or fam == ifh.AF_UNSPEC: # confirm we got a hwaddr back + if fam == ifh.ARPHRD_ETHER or fam == ifh.AF_UNSPEC: # confirm hwaddr return _hex2mac_(ret[18:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, "Returned hw address family is not valid") - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(errno.EAFNOSUPPORT, + "Invalid return hwaddr family {0}".format(fam)) + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) + except io.error as e: + raise pyric.error(e.errno, e.strerror) def inetget(card, *argv): """ @@ -332,7 +346,6 @@ def inetget(card, *argv): except IndexError: return _iostub_(inetget, card) - ip4 = netmask = brdaddr = None try: # ip flag = sioch.SIOCGIFADDR @@ -341,7 +354,8 @@ def inetget(card, *argv): if fam == ifh.AF_INET: ip4 = _hex2ip4_(ret[20:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, "Returned ip family is not valid") + raise pyric.error(errno.EAFNOSUPPORT, + "Invalid return ip family {0}".format(fam)) # netmask flag = sioch.SIOCGIFNETMASK @@ -350,7 +364,8 @@ def inetget(card, *argv): if fam == ifh.AF_INET: netmask = _hex2ip4_(ret[20:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, "Returned netmask family is not valid") + raise pyric.error(errno.EAFNOSUPPORT, + "Invalid return netmask family {0}".format(fam)) # broadcast flag = sioch.SIOCGIFBRDADDR @@ -359,15 +374,17 @@ def inetget(card, *argv): if fam == ifh.AF_INET: brdaddr = _hex2ip4_(ret[20:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, "Returned broadcast family is not valid") - except pyric.error as e: - # catch error where no addresses are assigned to card - if e.errno == errno.EADDRNOTAVAIL: return ip4, netmask, brdaddr - else: raise - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(errno.EAFNOSUPPORT, + "Invalid return broadcast family {0}".format(fam)) + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) + except io.error as e: + # catch address not available, which means the card currently does not + # have any addresses set - raise others + if e.errno == errno.EADDRNOTAVAIL: return None, None, None + raise pyric.error(e.errno, e.strerror) return ip4, netmask, brdaddr @@ -387,16 +404,22 @@ def inetset(card, ipaddr, netmask, broadcast, *argv): 1) throws error if setting netmask or broadcast and card does not have an ip assigned 2) if setting only the ip address, netmask and broadcast will be set - accordingly by the kernel. However, if setting multiple or setting the - netmask and/or broadcast after the ip is assigned, one can set them to - erroneous values i.e. ipaddr = 192.168.1.2 and broadcast = 10.0.0.31. + accordingly by the kernel. + 3) If setting multiple or setting the netmask and/or broadcast after the ip + is assigned, one can set them to erroneous values i.e. ip = 192.168.1.2 + and broadcast = 10.0.0.31. """ # ensure one of params is set & that all set params are valid ip address if not ipaddr and not netmask and not broadcast: - raise pyric.error(errno.EINVAL, "One of ipaddr/netmask/broadcast must be set") - if ipaddr and not _validip4_(ipaddr): raise pyric.error(errno.EINVAL, "Invalid ip4 address") - if netmask and not _validip4_(netmask): raise pyric.error(errno.EINVAL, "Invalid netmask") - if broadcast and not _validip4_(broadcast): raise pyric.error(errno.EINVAL, "Invalid broadcast") + raise pyric.error(errno.EINVAL, + "One of ipaddr/netmask/broadcast must be set") + if ipaddr and not _validip4_(ipaddr): + raise pyric.error(errno.EINVAL, "Invalid ip4 address") + if netmask and not _validip4_(netmask): + raise pyric.error(errno.EINVAL, "Invalid netmask") + if broadcast and not _validip4_(broadcast): + raise pyric.error(errno.EINVAL, "Invalid broadcast") + try: iosock = argv[0] except IndexError: @@ -412,13 +435,13 @@ def inetset(card, ipaddr, netmask, broadcast, *argv): # an ambiguous error is thrown if attempting to set netmask or broadcast # without an ip address already set on the card if not ipaddr and e.errno == errno.EADDRNOTAVAIL: - raise pyric.error(errno.EINVAL, "Cannot set netmask/broadcast. Set ip first") + raise pyric.error(errno.EINVAL, "Set ip4 addr first") else: raise - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) def ip4set(card, ipaddr, *argv): """ @@ -430,25 +453,28 @@ def ip4set(card, ipaddr, *argv): :returns: the new ip address NOTE: setting the ip will set netmask and broadcast accordingly """ - if not _validip4_(ipaddr): raise pyric.error(errno.EINVAL, "Invalid ip4 address") + if not _validip4_(ipaddr): raise pyric.error(errno.EINVAL, "Invalid ipaddr") + try: iosock = argv[0] except IndexError: return _iostub_(ip4set, card, ipaddr) - # we have to do one at a time try: flag = sioch.SIOCSIFADDR ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [ipaddr])) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam == ifh.AF_INET: # confirm we got ip4 back + if fam == ifh.AF_INET: return _hex2ip4_(ipaddr) else: - raise pyric.error(errno.EAFNOSUPPORT, "Returned ip family is invalid") - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(errno.EAFNOSUPPORT, + "Invalid return ip family {0}".format(fam)) + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) + except io.error as e: + raise pyric.error(e.errno, e.strerror) def netmaskset(card, netmask, *argv): """ @@ -467,7 +493,6 @@ def netmaskset(card, netmask, *argv): except IndexError: return _iostub_(netmaskset, card, netmask) - # we have to do one at a time try: flag = sioch.SIOCGIFNETMASK ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) @@ -475,18 +500,19 @@ def netmaskset(card, netmask, *argv): if fam == ifh.AF_INET: return _hex2ip4_(ret[20:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, "Returned netmask family is not valid") - except pyric.error as e: + raise pyric.error(errno.EAFNOSUPPORT, + "Invalid return netmask family {0}".format(fam)) + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) + except struct.error as e: + raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) + except io.error as e: # an ambiguous error is thrown if attempting to set netmask or broadcast # without an ip address already set on the card if e.errno == errno.EADDRNOTAVAIL: raise pyric.error(errno.EINVAL, "Cannot set netmask. Set ip first") else: - raise - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) + raise pyric.error(e, e.strerror) def broadcastset(card, broadcast, *argv): """ @@ -501,11 +527,12 @@ def broadcastset(card, broadcast, *argv): 2) can set broadcast to erroneous values i.e. ipaddr = 192.168.1.2 and broadcast = 10.0.0.31. """ - if not _validip4_(broadcast): raise pyric.error(errno.EINVAL, "Invalid broadcast") + if not _validip4_(broadcast): raise pyric.error(errno.EINVAL, "Invalid bcast") + try: iosock = argv[0] except IndexError: - return _iostub_(netmaskset, card, broadcast) + return _iostub_(broadcastset, card, broadcast) # we have to do one at a time try: @@ -515,7 +542,8 @@ def broadcastset(card, broadcast, *argv): if fam == ifh.AF_INET: return _hex2ip4_(ret[20:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, "Returned broadcast family is not valid") + raise pyric.error(errno.EAFNOSUPPORT, + "Invalid return broadcast family {0}".format(fam)) except pyric.error as e: # an ambiguous error is thrown if attempting to set netmask or broadcast # without an ip address already set on the card @@ -523,10 +551,17 @@ def broadcastset(card, broadcast, *argv): raise pyric.error(errno.EINVAL, "Cannot set broadcast. Set ip first") else: raise - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Ifreq error: {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) + except io.error as e: + # an ambiguous error is thrown if attempting to set netmask or broadcast + # without an ip address already set on the card + if e.errno == errno.EADDRNOTAVAIL: + raise pyric.error(errno.EINVAL, "Cannot set broadcast. Set ip first") + else: + raise pyric.error(e, e.strerror) ################################################################################ #### ON/OFF #### @@ -647,6 +682,8 @@ def pwrsaveget(card, *argv): rmsg = nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(errno.EINVAL, "Invalid Card object") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) return nl.nla_find(rmsg, nl80211h.NL80211_ATTR_PS_STATE) == 1 @@ -676,6 +713,22 @@ def pwrsaveset(card, on, *argv): raise pyric.error(errno.EINVAL, "Invalid Card object") except ValueError: raise pyric.error(errno.EINVAL, "Invalid parameter on") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + +def covclassget(card, *argv): + """ + gets the coverage class value + :param card: Card object + :param argv: netlink socket at argv[0] (or empty) + :returns: coverage class value + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(covclassget, card) + + return phyinfo(card, nlsock)['cov_class'] def covclassset(card, cc, *argv): """ @@ -688,10 +741,12 @@ def covclassset(card, cc, *argv): :param argv: netlink socket at argv[0] (or empty) sets card's coverage class """ - if cc < 0 or cc> 31: + if cc < wlan.COVERAGE_CLASS_MIN or cc > wlan.COVERAGE_CLASS_MAX: # this can work 'incorrectly' on non-int values but these will # be caught later during conversion - raise pyric.error(errno.EINVAL, "Coverage class must be integer 0 - 31") + msg = "Coverage class must be integer {0} - {1}" + raise pyric.error(errno.EINVAL, msg.format(wlan.COVERAGE_CLASS_MIN, + wlan.COVERAGE_CLASS_MAX)) try: nlsock = argv[0] @@ -710,6 +765,22 @@ def covclassset(card, cc, *argv): raise pyric.error(errno.EINVAL, "Invalid Card object") except ValueError: raise pyric.error(errno.EINVAL, "Invalid parameter value for cc") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + +def retryshortget(card, *argv): + """ + gets the short retry limit. + :param card: Card object + :param argv: netlink socket at argv[0] (or empty) + gets card's short retry + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(retryshortget, card) + + return phyinfo(card, nlsock)['retry_short'] def retryshortset(card, lim, *argv): """ @@ -720,10 +791,12 @@ def retryshortset(card, lim, *argv): :param argv: netlink socket at argv[0] (or empty) sets card's shorty retry """ - if lim < 0 or lim > 255: + if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: # this can work 'incorrectly' on non-int values but these will # be caught later during conversion - raise pyric.error(errno.EINVAL, "Retry short must be integer 0 - 255") + msg = "Retry short must be integer {0} - {1}".format(wlan.RETRY_MIN, + wlan.RETRY_MAX) + raise pyric.error(errno.EINVAL, msg) try: nlsock = argv[0] @@ -742,6 +815,22 @@ def retryshortset(card, lim, *argv): raise pyric.error(errno.EINVAL, "Invalid Card object") except ValueError: raise pyric.error(errno.EINVAL, "Invalid parameter value for lim") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + +def retrylongget(card, *argv): + """ + gets the long retry limit. + :param card: Card object + :param argv: netlink socket at argv[0] (or empty) + gets card's long retry + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(retrylongget, card) + + return phyinfo(card, nlsock)['retry_long'] def retrylongset(card, lim, *argv): """ @@ -752,10 +841,11 @@ def retrylongset(card, lim, *argv): :param argv: netlink socket at argv[0] (or empty) sets card's long retry """ - if lim < 0 or lim > 255: + if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: # this can work 'incorrectly' on non-int values but these will # be caught later during conversion - raise pyric.error(errno.EINVAL, "Retry long must be integer 0 - 255") + msg = "Retry long must be integer {0} - {1}" + raise pyric.error(errno.EINVAL, msg.format(wlan.RETRY_MIN, wlan.RETRY_MAX)) try: nlsock = argv[0] @@ -774,6 +864,22 @@ def retrylongset(card, lim, *argv): raise pyric.error(errno.EINVAL, "Invalid Card object") except ValueError: raise pyric.error(errno.EINVAL, "Invalid parameter value for lim") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + +def rtsthreshget(card, *argv): + """ + gets RTS Threshold + :param card: Card Object + :param argv: netlink socket at argv[0] (or empty) + :returns: RTS threshold + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(rtsthreshget, card) + + return phyinfo(card, nlsock)['rts_thresh'] def rtsthreshset(card, thresh, *argv): """ @@ -785,10 +891,12 @@ def rtsthreshset(card, thresh, *argv): :param argv: netlink socket at argv[0] (or empty) sets the card's RTS threshold """ - if thresh == 'off': thresh = _MAXTHRESH_ - else: - if thresh != _MAXTHRESH_ and (thresh < 0 or thresh > 65536): - raise pyric.error(errno.EINVAL, "Threshold must be 'off' or an integer 0 - 65536") + if thresh == 'off': thresh = wlan.RTS_THRESHOLD_OFF + elif thresh == wlan.RTS_THRESHOLD_OFF: pass + elif thresh < wlan.RTS_THRESHOLD_MIN or thresh > wlan.RTS_THRESHOLD_MAX: + msg = "Threshold must be 'off' or integer {0} - {1}" + raise pyric.error(errno.EINVAL, msg.format(wlan.RTS_THRESHOLD_MIN, + wlan.RTS_THRESHOLD_MAX)) try: nlsock = argv[0] @@ -807,6 +915,22 @@ def rtsthreshset(card, thresh, *argv): raise pyric.error(errno.EINVAL, "Invalid Card object") except ValueError: raise pyric.error(errno.EINVAL, "Invalid parameter value for thresh") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + +def fragthreshget(card, *argv): + """ + gets Fragmentation Threshold + :param card: Card Object + :param argv: netlink socket at argv[0] (or empty) + :returns: RTS threshold + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(fragthreshget, card) + + return phyinfo(card, nlsock)['frag_thresh'] def fragthreshset(card, thresh, *argv): """ @@ -818,10 +942,12 @@ def fragthreshset(card, thresh, *argv): :param argv: netlink socket at argv[0] (or empty) sets the card's Fragmentation threshold """ - if thresh == 'off': thresh = _MAXTHRESH_ - else: - if thresh != _MAXTHRESH_ and (thresh < 256 or thresh > 8000): - raise pyric.error(errno.EINVAL, "Threshold must be 'off' or an integer 256 - 8000") + if thresh == 'off': thresh = wlan.FRAG_THRESHOLD_OFF + elif thresh == wlan.FRAG_THRESHOLD_OFF: pass + elif thresh < wlan.FRAG_THRESHOLD_MIN or thresh > wlan.FRAG_THRESHOLD_MAX: + msg = "Threshold must be 'off' or an integer {0} - {1}" + raise pyric.error(errno.EINVAL, msg.format(wlan.FRAG_THRESHOLD_MIN, + wlan.FRAG_THRESHOLD_MAX)) try: nlsock = argv[0] @@ -838,9 +964,11 @@ def fragthreshset(card, thresh, *argv): _ = nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(errno.EINVAL, "Invalid Card object") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) ################################################################################ -#### INFO RELATED #### +#### INFO RELATED #### ################################################################################ def devfreqs(card, *argv): @@ -890,11 +1018,13 @@ def devstds(card, *argv): stds = stds[:stds.find('\x00')] # remove nulls stds = stds.replace('IEEE 802.11', '') # remove IEEE 802.11 return [std for std in stds] - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) except IndexError: return None except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) + except io.error as e: + raise pyric.error(e.errno, e.strerror) def devmodes(card, *argv): """ @@ -951,12 +1081,15 @@ def devinfo(card, *argv): dev = card idx = _ifindex_(dev) - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), cmd=nl80211h.NL80211_CMD_GET_INTERFACE, flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) + nl.nla_put_u32(msg, idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nl_sendmsg(nlsock, msg) + rmsg = nl.nl_recvmsg(nlsock) + except nl.error as e: + raise pyric.error(e.errno, e.strerror) # pull out attributes info = {'card':Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), dev, idx), @@ -994,7 +1127,7 @@ def phyinfo(card, *argv): except IndexError: return _nlstub_(phyinfo, card) - # iw sends a @NL80211_ATTR_SPLIT_WIPHY_DUMP, we don't & get full return at once + # iw sends @NL80211_ATTR_SPLIT_WIPHY_DUMP, we don't & get full return at once try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), cmd=nl80211h.NL80211_CMD_GET_WIPHY, @@ -1004,26 +1137,31 @@ def phyinfo(card, *argv): rmsg = nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(errno.EINVAL, "Invalid Card object") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) # pull out attributes - info = {'generation':None, 'retry_short':None, 'retry_long':None, - 'frag_thresh':None, 'rts_thresh':None, 'cov_class':None, - 'scan_ssids':None, 'freqs':[], 'modes':[], 'swmodes':[], - 'commands':[],'ciphers':[]} - info['generation'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_GENERATION) - info['retry_short'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_SHORT) - info['retry_long'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_LONG) - info['frag_thresh'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_FRAG_THRESHOLD) - if info['frag_thresh'] >= _MAXTHRESH_: info['frag_thresh'] = 'off' - info['rts_thresh'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RTS_THRESHOLD) - if info['rts_thresh'] >= _MAXTHRESH_: info['rts_thresh'] = 'off' - info['cov_class'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_COVERAGE_CLASS) - info['scan_ssids'] = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS) + info = {'generation':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_GENERATION), + 'retry_short':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_SHORT), + 'retry_long':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_LONG), + 'frag_thresh':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_FRAG_THRESHOLD), + 'rts_thresh':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RTS_THRESHOLD), + 'cov_class':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_COVERAGE_CLASS), + 'scan_ssids':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS), + 'freqs':[], + 'modes':[], + 'swmodes':[], + 'commands':[], + 'ciphers':[]} + + # modify frag_thresh and rts_thresh as necessary + if info['frag_thresh'] >= wlan.FRAG_THRESHOLD_MAX: info['frag_thresh'] = 'off' + if info['rts_thresh'] > wlan.RTS_THRESHOLD_MAX: info['rts_thresh'] = 'off' # sets or arrays of attributes # get freqs _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_BANDS, False) - if d != nlh.NLA_ERROR: info['freqs'] = _getfreqs_(bs) + if d != nlh.NLA_ERROR: info['freqs'] = _frequencies_(bs) # get cipher suites _, cs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CIPHER_SUITES, False) @@ -1044,20 +1182,8 @@ def phyinfo(card, *argv): # get supported commands _, cs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_COMMANDS, False) - if d != nlh.NLA_ERROR: - for c in cs: - try: - # convert the numeric command to the form @NL80211_CMD_ - # Some numeric commands may have multiple string synonyms, in - # that case, take the first one. Finally, strip off @NL80211_CMD_ - # to get only the command name and make it lowercase - c = cmdbynum(struct.unpack_from('>HH', c, 0)[1]) - if type(c) is type([]): c = c[0] - info['commands'].append(c[13:].lower()) - except KeyError: - # some cards (atheros) have proprietary commands not found - # in nlh8022.h. - info['commands'].append("unknown cmd ({0})".format(c)) + if d != nlh.NLA_ERROR: info['commands'] = _commands_(cs) + return info ################################################################################ @@ -1099,6 +1225,8 @@ def txset(card, pwr, lvl, *argv): raise pyric.error(errno.EINVAL, "Invalid txpwr {0}".format(pwr)) except AttributeError: raise pyric.error(errno.EINVAL, "Invalid Card object") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) def txget(card, *argv): """ @@ -1118,12 +1246,14 @@ def txget(card, *argv): flag = sioch.SIOCGIWTXPOW ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) return struct.unpack_from(ifh.ifr_iwtxpwr, ret, ifh.IFNAMELEN)[0] - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) except IndexError: return None except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) + except io.error as e: + raise pyric.error(e.errno, e.strerror) def chget(card, *argv): """ @@ -1137,6 +1267,7 @@ def chget(card, *argv): nlsock = argv[0] except IndexError: return _nlstub_(chget, card) + return channels.rf2ch(devinfo(card, nlsock)['RF']) def chset(card, ch, chw=None, *argv): @@ -1157,6 +1288,7 @@ def chset(card, ch, chw=None, *argv): """ if ch not in channels.channels(): raise pyric.error(errno.EINVAL, "Invalid channel") if chw not in channels.CHWIDTHS: raise pyric.error(errno.EINVAL, "Invalid width") + try: nlsock = argv[0] except IndexError: @@ -1174,7 +1306,8 @@ def freqset(card, rf, chw=None, *argv): :param argv: netlink socket at argv[0] (or empty) """ if rf not in channels.freqs(): raise pyric.error(errno.EINVAL, "Invalid frequency") - if chw not in channels.CHWIDTHS: raise pyric.error(errno.EINVAL, "Invalid channel width") + if chw not in channels.CHWIDTHS: raise pyric.error(errno.EINVAL, "Invalid width") + try: nlsock = argv[0] except IndexError: @@ -1192,6 +1325,8 @@ def freqset(card, rf, chw=None, *argv): nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(errno.EINVAL,"Invalid Card object") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) #### INTERFACE & MODE RELATED #### @@ -1243,12 +1378,15 @@ def modeset(card, mode, flags=None, *argv): nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) for flag in flags: - nl.nla_put_u32(msg, MNTRFLAGS.index(flag), + nl.nla_put_u32(msg, + MNTRFLAGS.index(flag), nl80211h.NL80211_ATTR_MNTR_FLAGS) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(errno.EINVAL, "Invalid Card object") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) def ifaces(card, *argv): """ @@ -1271,6 +1409,8 @@ def ifaces(card, *argv): ifs.append((info['card'], info['mode'])) except AttributeError: raise pyric.error(errno.EINVAL, "Invalid Card object") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) return ifs def devadd(card, vdev, mode, flags=None, *argv): @@ -1278,13 +1418,13 @@ def devadd(card, vdev, mode, flags=None, *argv): REQUIRES ROOT PRIVILEGES adds a virtual interface on device having type mode (iw phy interface add type - :param card: Card object + :param card: Card object or physical index :param vdev: device name of new interface :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} - :param flags: list of monitor flags (can only be used if vnic is being created - in monitor mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' - |'cook'|'active'} + :param flags: list of monitor flags (can only be used if creating monitor + mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' + |'cook'|'active'} :param argv: netlink socket at argv[0] (or empty) :returns: the new Card """ @@ -1302,20 +1442,30 @@ def devadd(card, vdev, mode, flags=None, *argv): except IndexError: return _nlstub_(devadd, card, vdev, mode, flags) + # if we have a Card, pull out phy index + try: + phy = card.phy + except AttributeError: + phy = card + try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), cmd=nl80211h.NL80211_CMD_NEW_INTERFACE, flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nla_put_u32(msg, phy, nl80211h.NL80211_ATTR_WIPHY) nl.nla_put_string(msg, vdev, nl80211h.NL80211_ATTR_IFNAME) nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) for flag in flags: - nl.nla_put_u32(msg, MNTRFLAGS.index(flag), + nl.nla_put_u32(msg, + MNTRFLAGS.index(flag), nl80211h.NL80211_ATTR_MNTR_FLAGS) nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + return Card(card.phy, vdev, nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) def devdel(card, *argv): @@ -1336,11 +1486,13 @@ def devdel(card, *argv): msg = nl.nlmsg_new(nltype=_familyid_(nlsock), cmd=nl80211h.NL80211_CMD_DEL_INTERFACE, flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_IFINDEX) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(errno.EINVAL, "Invalid Card object") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) ################################################################################ #### FILE PRIVATE #### @@ -1424,10 +1576,12 @@ def _flagsget_(dev, *argv): flag = sioch.SIOCGIFFLAGS ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag)) return struct.unpack_from(ifh.ifr_flags, ret, ifh.IFNAMELEN)[0] - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) + except io.error as e: + raise pyric.error(e.errno, e.strerror) def _flagsset_(dev, flags, *argv): """ @@ -1446,10 +1600,12 @@ def _flagsset_(dev, flags, *argv): flag = sioch.SIOCSIFFLAGS ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag, [flags])) return struct.unpack_from(ifh.ifr_flags, ret, ifh.IFNAMELEN)[0] - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) + except io.error as e: + raise pyric.error(e.errno, e.strerror) #### ADDITIONAL PARSING FOR PHYINFO #### @@ -1464,13 +1620,11 @@ def _iftypes_(i): except IndexError: return "Unknown mode ({0})".format(i) -def _getfreqs_(band): +def _frequencies_(band): """ extract list of supported freqs packed byte stream band :param band: packed byte string from NL80211_ATTR_WIPHY_BANDS :returns: list of supported frequencies - - NOTE: this is actually faster than nl80211_c.nl80211_parse_freqs """ rfs = [] for freq in channels.freqs(): @@ -1478,6 +1632,27 @@ def _getfreqs_(band): rfs.append(freq) return rfs +def _commands_(command): + """ + converts numeric commands to string version + :param command: list of command constants + :returns: list of supported commands as strings + """ + cs = [] + for cmd in command: + try: + # convert the numeric command to the form @NL80211_CMD_ + # Some numeric commands may have multiple string synonyms, in + # that case, take the first one. Finally, strip off @NL80211_CMD_ + # to get only the command name and make it lowercase + cmd = cmdbynum(struct.unpack_from('>HH', cmd, 0)[1]) + if type(cmd) is type([]): cmd = cmd[0] + cs.append(cmd[13:].lower()) # skil NL80211_CMD_ + except KeyError: + # some cards (atheros) have proprietary commands not found in nlh8022.h. + cs.append("unknown cmd ({0})".format(cmd)) + return cs + def _ciphers_(cipher): """ parses the cipher stream returning a list of supported ciphers @@ -1488,14 +1663,14 @@ def _ciphers_(cipher): # of ciphers each cipher being 4 bytes, unpack each cipher as a u32 # and find the value in the suite dict ss = [] - for i in xrange(len(cipher) / dotllh.WLAN_CIPHER_SUITE_LEN): - s = struct.unpack_from('I', cipher, i * dotllh.WLAN_CIPHER_SUITE_LEN)[0] + for i in xrange(len(cipher) / wlan.WLAN_CIPHER_SUITE_LEN): + s = struct.unpack_from('I', cipher, i * wlan.WLAN_CIPHER_SUITE_LEN)[0] try: - ss.append(dotllh.WLAN_CIPHER_SUITE_SELECTORS[s]) + ss.append(wlan.WLAN_CIPHER_SUITE_SELECTORS[s]) except KeyError as e: # we could do nothing, or append 'rsrv' but we'll add a little # for testing/future identificaion purposes - ss.append('RSRV-{}'.format(e)) + ss.append('RSRV-{0}'.format(e)) return ss #### NETLINK/IOCTL PARAMETERS #### @@ -1517,10 +1692,12 @@ def _ifindex_(dev, *argv): flag = sioch.SIOCGIFINDEX ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag)) return struct.unpack_from(ifh.ifr_ifindex, ret, ifh.IFNAMELEN)[0] - except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + except AttributeError as e: + raise pyric.error(errno.EINVAL, e) except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Ifreq error {0}".format(e)) + raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) + except io.error as e: + raise pyric.error(e.errno, e.strerror) def _familyid_(nlsock): """ diff --git a/pyric/utils/channels.py b/pyric/utils/channels.py index 91e443b..042af00 100644 --- a/pyric/utils/channels.py +++ b/pyric/utils/channels.py @@ -40,13 +40,13 @@ # redefined widths (allowed in nl80211h) CHWIDTHS = nl80211h.NL80211_CHAN_WIDTHS -# ISM Bands +# ISM Bands (ieee80211.h-> BAND_ID_2G) ISM_24_C2F={1:2412,2:2417,3:2422,4:2427,5:2432,6:2437,7:2442, 8:2447,9:2452,10:2457,11:2462,12:2467,13:2472,14:2484} ISM_24_F2C={2432:5,2467:12,2437:6,2472:13,2442:7,2484:14,2412:1, 2447:8,2417:2,2452:9,2422:3,2457:10,2427:4,2462:11} -# UNII 5 Bands +# UNII 5 Bands (ieee80211.h-> BAND_ID_5G) UNII_5_C2F={34:5170,36:5180,38:5190,40:5200,42:5210,44:5220,46:5230,48:5240,50:5250, 52:5260,54:5270,56:5280,58:5280,60:5300,62:5310,64:5320,100:5500, 102:5510,104:5520,106:5530,108:5540,110:5550,112:5560,114:5570,116:5580, @@ -60,11 +60,11 @@ 5720:144,5210:42,5600:120,5220:44,5610:122,5230:46,5745:149,5620:124, 5240:48,5755:151,5500:100,5630:126} -# UNII 4 Bands +# UNII 4 Bands (ieee80211.h-> BAND_ID_5G) UNII_4_C2F={183:4915,184:4920,185:4925,187:4935,188:4940,189:4945,192:4960,196:4980} UNII_4_F2C={4960:192,4935:187,4940:188,4945:189,4915:183,4980:196,4920:184,4925:185} -# US high powered backhaul +# US high powered backhaul (ieee80211.h-> BAND_ID_3G) #131 3657.5 132 36622.5 ? 132 3660.0 133 3667.5 133 3665.0 #134 3672.5 134 3670.0 135 3677.5 136 3682.5 136 3680.0 #137 3687.5 137 3685.0 138 3689.5 138 3690.0 diff --git a/setup.cfg b/setup.cfg index c06e077..3a56470 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,3 +1,4 @@ # pip installation and distribution + [bdist_wheel] universal=1 \ No newline at end of file diff --git a/setup.py b/setup.py index f8f64b7..1b0a8b7 100644 --- a/setup.py +++ b/setup.py @@ -38,16 +38,16 @@ PyRIC is Linux wireless network interface controller library. It provides the ability to manipuate, identify and enumerate your system's wireless cards. PyRIC is a pure python port of a subset of the functionality provided by iw, ifconfig, - and rfkill. + and rfkill.\n - PyRIC is: + PyRIC is:\n * Pythonic: No ctypes, SWIG etc. PyRIC redefines C header files as Python and - uses sockets to communicate with kernel. - * Self-sufficient: No third-party files used, PyRIC is completely self-contained - * Fast: (relatively speaking) PyRIC is faster than using iw through subprocess.Popen + uses sockets to communicate with kernel.\n + * Self-sufficient: No third-party files used, PyRIC is completely self-contained\n + * Fast: (relatively speaking) PyRIC is faster than using iw through subprocess.Popen\n * Parseless: Get the output you without parsing output from iw. Never worry about - iw updates and rewriting your parsers. - * Easy: If you can use iw, you can use PyRIC + iw updates and rewriting your parsers.\n + * Easy: If you can use iw, you can use PyRIC\n """ setup(name='PyRIC', diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 1aa7159..9749429 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -35,8 +35,10 @@ import unittest import time from pyric import error -from pyric.utils.channels import ISM_24_F2C,rf2ch from pyric import pyw +from pyric.utils.channels import ISM_24_F2C,rf2ch +from pyric.net.wireless import wlan + # modify below to fit your system pri = {'dev':'alfa0', @@ -64,54 +66,44 @@ # test functions interfaces and isinterface class InterfaceTestCase(unittest.TestCase): def test_enuminterfaces(self): - self.assertEqual(nics,pyw.interfaces()) + for nic in nics: self.assertTrue(nic in pyw.interfaces()) def test_isinterface(self): - for nic in nics: - self.assertTrue(pyw.isinterface(nic)) + for nic in pyw.interfaces(): self.assertTrue(pyw.isinterface(nic)) def test_not_isinterface(self): - for inic in inics: - self.assertFalse(pyw.isinterface(inic)) + for inic in inics: self.assertFalse(pyw.isinterface(inic)) def test_ininterfaces(self): - for nic in nics: - self.assertIn(nic,pyw.interfaces()) + for nic in nics: self.assertIn(nic,pyw.interfaces()) # test functions winterfaces and iswireless class WInterfaceTestCase(unittest.TestCase): def test_enumwinterfaces(self): - self.assertEqual(wnics,pyw.winterfaces()) + for wnic in wnics: self.assertTrue(wnic in pyw.winterfaces()) def test_iswinterface(self): - for wnic in wnics: - self.assertTrue(pyw.iswireless(wnic)) + for wnic in pyw.winterfaces(): self.assertTrue(pyw.iswireless(wnic)) def test_not_iswinterface(self): - for nic in inics + enics: - self.assertFalse(pyw.iswireless(nic)) + for nic in inics + enics: self.assertFalse(pyw.iswireless(nic)) def test_inwinterfaces(self): - for wnic in wnics: - self.assertIn(wnic,pyw.winterfaces()) + for wnic in pyw.winterfaces(): self.assertIn(wnic,pyw.winterfaces()) # test regget, regset class RegDomTestCase(unittest.TestCase): - def test_regget(self): - self.assertEqual(regdom,pyw.regget()) + def test_regget(self): self.assertEqual(regdom,pyw.regget()) def test_regset(self): - self.assertTrue(pyw.regset(newregdom)) + self.assertEqual(None,pyw.regset(newregdom)) time.sleep(0.25) # give sleep time self.assertEqual(newregdom,pyw.regget()) - self.assertTrue(pyw.regset(regdom)) + self.assertEqual(None,pyw.regset(regdom)) time.sleep(0.25) # give sleep time self.assertEqual(regdom, pyw.regget()) # test getcard,validcard class GetCardTestCase(unittest.TestCase): def test_getcard(self): - for wnic in wnics: - self.assertIsNotNone(pyw.getcard(wnic)) + for wnic in wnics: self.assertIsNotNone(pyw.getcard(wnic)) def test_notacard(self): - for enic in enics: - self.assertRaises(error,pyw.getcard,enic) + for enic in enics: self.assertRaises(error,pyw.getcard,enic) def test_validcard(self): - for wnic in wnics: - self.assertTrue(pyw.validcard(pyw.getcard(wnic))) + for wnic in wnics: self.assertTrue(pyw.validcard(pyw.getcard(wnic))) # super class for test cases requiring a Card object class CardTestCase(unittest.TestCase): @@ -147,14 +139,11 @@ def test_invalidmacarg(self): # broadcastset class InetGetSetTestCase(CardTestCase): def test_inetgetset(self): - self.assertTrue(pyw.inetset(self.card,pri['ip'],pri['mask'],pri['bcast']), - "InetGetSetTestCase.inetgetset->inetset Failed") - self.assertEqual(pri['ip'],pyw.inetget(self.card)[0], - "InetGetSetTestCase.inetgetset->inetget Failed") + self.assertEquals(None,pyw.inetset(self.card,pri['ip'],pri['mask'],pri['bcast'])) + self.assertEqual(pri['ip'],pyw.inetget(self.card)[0]) def test_invalidcardarg(self): self.assertRaises(error,pyw.inetget,'bad0') - self.assertRaises(error,pyw.inetset,'bad0',pri['ip'], - pri['mask'],pri['bcast']) + self.assertRaises(error,pyw.inetset,'bad0',pri['ip'],pri['mask'],pri['bcast']) def test_invalidiparg(self): self.assertRaises(error,pyw.inetset,self.card,'192.168',pri['mask'],pri['bcast']) def test_invalidmaskarg(self): @@ -162,30 +151,124 @@ def test_invalidmaskarg(self): def test_invalidbcastarg(self): self.assertRaises(error,pyw.inetset,self.card,pri['ip'],pri['mask'],'192.168') -# test up +# isup, test only card check +class IsUpTestCase(CardTestCase): + def test_invalidcardarg(self): self.assertRaises(error,pyw.isup,'bad0') + +# test up/isup class UpTestCase(CardTestCase): - def test_up(self): self.assertTrue(pyw.up(self.card)) + def test_up(self): + self.assertEquals(None,pyw.up(self.card)) + self.assertTrue(pyw.isup(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.up,'bad0') # test down class DownTestCase(CardTestCase): - def test_down(self): self.assertTrue(pyw.down(self.card)) + def test_down(self): + self.assertEqual(None,pyw.down(self.card)) + self.assertFalse(pyw.isup(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.down,'bad0') -# test get power_save +# isblocked, test only card check +class IsBlockedTestCase(unittest.TestCase): + def test_invalidcardarg(self): self.assertRaises(error,pyw.isup,'bad0') + +# test block/isblocked +class BlockTestCase(CardTestCase): + def test_block(self): + self.assertEquals(None,pyw.block(self.card)) + self.assertTrue(pyw.isblocked(self.card)) + self.assertEquals(None,pyw.unblock(self.card)) + def test_invalidcardarg(self): self.assertRaises(error,pyw.block,'bad0') + +# test block/isblocked +class UnblockTestCase(CardTestCase): + def test_unblock(self): + self.assertEquals(None,pyw.unblock(self.card)) + self.assertFalse(pyw.isblocked(self.card)[0]) + def test_invalidcardarg(self): self.assertRaises(error,pyw.block,'bad0') + +# test get/set power_save class GetSetPwrSave(CardTestCase): def test_getsetpwrsave(self): - self.assertIsInstance(pyw.getpwrsave(self.card),bool) - pyw.setpwrsave(self.card,True) - self.assertTrue(pyw.getpwrsave(self.card)) - pyw.setpwrsave(self.card, False) - self.assertFalse(pyw.getpwrsave(self.card)) - pyw.setpwrsave(self.card,True) + pyw.pwrsaveset(self.card,True) + self.assertTrue(pyw.pwrsaveget(self.card)) + pyw.pwrsaveset(self.card, False) + self.assertFalse(pyw.pwrsaveget(self.card)) + pyw.pwrsaveset(self.card,True) def testinvalidcardarg(self): - self.assertRaises(error,pyw.getpwrsave,'bad0') - self.assertRaises(error, pyw.setpwrsave,'bad0',True) + self.assertRaises(error,pyw.pwrsaveget,'bad0') + self.assertRaises(error,pyw.pwrsaveset,'bad0',True) def testinvalidonval(self): - self.assertRaises(error,pyw.setpwrsave,self.card,'b') + self.assertRaises(error,pyw.pwrsaveset,self.card,'b') + +# test covclass +# NOTE: cannot currently test set as my cards do not support it +# NOTEL covclassget uses phyinfo - if that works covclassget works + +# test get/set retryshort +class RetryShortTestCase(CardTestCase): + def test_retryshort(self): + rs = pyw.retryshortget(self.card) + self.assertEqual(None,pyw.retryshortset(self.card,5)) + self.assertEqual(5,pyw.retryshortget(self.card)) + self.assertEqual(None,pyw.retryshortset(self.card,rs)) + self.assertEqual(rs,pyw.retryshortget(self.card)) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.retryshortget,'bad0') + self.assertRaises(error,pyw.retryshortset,'bad0',0) + def test_invalidlim(self): + self.assertRaises(error,pyw.retryshortset,self.card,wlan.RETRY_MIN-1) + self.assertRaises(error,pyw.retryshortset,self.card,wlan.RETRY_MAX+1) + +# test get/set retrylong +class RetryLongTestCase(CardTestCase): + def test_retrylong(self): + rs = pyw.retrylongget(self.card) + self.assertEqual(None,pyw.retrylongset(self.card,5)) + self.assertEqual(5,pyw.retrylongget(self.card)) + self.assertEqual(None,pyw.retrylongset(self.card,rs)) + self.assertEqual(rs,pyw.retrylongget(self.card)) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.retrylongget,'bad0') + self.assertRaises(error,pyw.retrylongset,'bad0',0) + def test_invalidlim(self): + self.assertRaises(error,pyw.retrylongset,self.card,wlan.RETRY_MIN-1) + self.assertRaises(error,pyw.retrylongset,self.card,wlan.RETRY_MAX+1) + +# test get/set RTS thresh +class RTSThreshTestCase(CardTestCase): + def test_rtsthresh(self): + rt = pyw.rtsthreshget(self.card) + self.assertEqual(None,pyw.rtsthreshset(self.card,5)) + self.assertEqual(5,pyw.rtsthreshget(self.card)) + self.assertEqual(None,pyw.rtsthreshset(self.card,'off')) + self.assertEqual('off',pyw.rtsthreshget(self.card)) + self.assertEqual(None,pyw.rtsthreshset(self.card,rt)) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.rtsthreshget,'bad0') + self.assertRaises(error,pyw.rtsthreshset,'bad0',5) + def test_invalidthresh(self): + self.assertRaises(error,pyw.rtsthreshset,self.card,wlan.RTS_THRESHOLD_MIN-1) + self.assertRaises(error,pyw.rtsthreshset,self.card,wlan.RTS_THRESHOLD_MAX+1) + self.assertRaises(error, pyw.rtsthreshset,self.card,'on') + +# test get/set RTS thresh +class FragThreshTestCase(CardTestCase): + def test_fragthresh(self): + ft = pyw.fragthreshget(self.card) + self.assertEqual(None,pyw.fragthreshset(self.card,800)) + self.assertEqual(800,pyw.fragthreshget(self.card)) + self.assertEqual(None,pyw.fragthreshset(self.card,'off')) + self.assertEqual('off',pyw.fragthreshget(self.card)) + self.assertEqual(None,pyw.fragthreshset(self.card,ft)) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.fragthreshget,'bad0') + self.assertRaises(error,pyw.fragthreshset,'bad0',800) + def test_invalidthresh(self): + self.assertRaises(error,pyw.fragthreshset,self.card,wlan.FRAG_THRESHOLD_MIN-1) + self.assertRaises(error,pyw.fragthreshset,self.card,wlan.FRAG_THRESHOLD_MAX+1) + self.assertRaises(error,pyw.fragthreshset,self.card,'on') # test get freqs class DevFreqsTestCase(CardTestCase): @@ -238,6 +321,9 @@ def test_phyinfo(self): def test_invalidcardarg(self): self.assertRaises(error,pyw.phyinfo,'bad0') +# test txset +# currently txset is not supported by my cards + # test txget class TXGetTestCase(CardTestCase): def test_txget(self): @@ -255,7 +341,7 @@ def test_chsetget(self): pyw.down(self.card) pyw.modeset(self.card,'monitor') pyw.up(self.card) - self.assertTrue(pyw.chset(self.card,1)) + self.assertEqual(None,pyw.chset(self.card,1)) self.assertIsInstance(pyw.chget(self.card),int) pyw.down(self.card) pyw.modeset(self.card,'managed') @@ -287,8 +373,8 @@ def test_invalidcardarg(self): class ModeSetTestCase(CardTestCase): def test_modeset(self): pyw.down(self.card) - self.assertTrue(pyw.modeset(self.card,'monitor')) - self.assertTrue(pyw.modeset(self.card,'managed')) + self.assertEquals(None,pyw.modeset(self.card,'monitor')) + self.assertEquals(None,pyw.modeset(self.card,'managed')) pyw.up(self.card) def test_invalidcardarg(self): self.assertRaises(error,pyw.modeset,'bad0','monitor') From a937e2a2f21d9563b6cac647fc249e7d454db0c1 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 26 Jun 2016 09:22:33 -0600 Subject: [PATCH 056/121] v0.1.4 updated to support linux kernel v 4 --- CHANGES | 3 +- TODO | 40 +- docs/PyRIC.pdf | Bin 506118 -> 505829 bytes docs/PyRIC.tex | 1 + pyric/net/wireless/__init__.py | 6 +- pyric/net/wireless/nl80211_c.py | 44 +- pyric/net/wireless/nl80211_h.py | 1050 ++++++++++++++++++++++--------- pyric/nlhelp/attributes.help | 5 +- pyric/nlhelp/commands.help | 5 +- pyric/nlhelp/nlsearch.py | 22 +- pyric/pyw.py | 20 +- pyric/utils/channels.py | 1 + 12 files changed, 852 insertions(+), 345 deletions(-) diff --git a/CHANGES b/CHANGES index 578bd3d..10d16db 100644 --- a/CHANGES +++ b/CHANGES @@ -108,4 +108,5 @@ v 0.1.4 - replaced pyric.error with defined error in libnl and libio - pyw has to catch libnl and libio errors and reraise as pyric errors o retooled exception messages - o added new functions from 0.1.3 and 0.1.4 to unittests \ No newline at end of file + o added new functions from 0.1.3 and 0.1.4 to unittests + o updated nl80211_h w/ additional constants included in kernel v 4 header \ No newline at end of file diff --git a/TODO b/TODO index 0aee33f..4a15a21 100644 --- a/TODO +++ b/TODO @@ -22,29 +22,27 @@ NL80211_STA_INFO - this has to be the corresponding data. Doesn't work, there is something I'm missing but cannot figure out - iw requests info on the BSSID, can we request the info on any STA? + - Line 1806 These attribute types are used with %NL80211_ATTR_STA_INFO + when getting information about a station. 11) tried NL80211_CMD_GET_WIPHY, setting _WIPHY_TX_POWER_LEVEL but did not return the current power level - currently cannot find anything in nl80211.h that could be used to get tx power 14) look at udevadm info --query=all --path /sys/class/net/ - o has devie driver, name and some other details - 15) fix unittest + o has devie driver, name and some other details but appears to get these + the same way PyRIC does 16) look into readthedocs. + 17) distro tests + - openSUSE + - RedHat/Fedora + - Debian (g2g) + - Arch + - CentOs (?) + - slackware + - dd-wrt/OpenWRT + 18) port structs from new nl80211.h ------- Request For Information RFI ---------- -Reading through the iw source code to figure out how to get the regulatory domain -is like reading through a ham radio radio manual to figure out how to turn it on. -Even when I could see what iw was doing there were no comments or directions as -to why they were doing it a specific way. And, I could not find any definitive -resources on nl80211 via netlink. Fortunately, Thomas Graf provides excellent -documentation on libnl at http://www.carisma.slowglass.com/~tgr/libnl/doc/core.html. -Reading this, I was able to write a simple netlink message class and parser. I still -cannot follow the iw code but with strace, I was able to copy the hex strings and -parse the communications to and from the kernel. However, this leaves a lot of -questions unaswered which is the purpose of this document - to document my -observations, findings and questions in a central location rather than dispersed -throughout the code. - 1) Odd error on what should be a NLE_PERM When running a root level cmd (reg set) as non-root), I get a return message w/ the following format: @@ -119,6 +117,8 @@ msg.nla_put_u32(phy,nl80211h.NL80211_ATTR_WIPHY) msg.nla_put_u32(channels.ch2rf(ch),nl80211h.NL80211_ATTR_WIPHY_FREQ) msg.nla_put_u32(CHWIDTHS.index(chw),nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) +# Here as found during updating nl80211.h, _CHANNEL_TYPE is not CHANNEL_WIDTH + and results in a 'invalid argument' error. So, am I sending the wrong crap? The description for this command in nl80211_h @@ -152,3 +152,13 @@ phy set txpower [] 6) Passwords On ubuntu at least passwords for APs are stored in /etc/NetworkManager/system-connections under directory for ssid + +7) Kernel v4 introduces new constants in nl80211.h + - OCB support (Operation outside control of BSS) for vehicles in 5.9 + +8) channel widths + line 2638 of nl80211_h defines channels widths "used with the NL80211_ATTR_CHANNEL_WIDTH" + but these are not the channels as defined for iw which uses enum nl80211_channel_type + However, they are used in: + iw dev set freq [20|40|80|80+80|160] [

] [
] + diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 4f6561ca61fb8cb4962ad5792d3022682b4773df..efde8f24e610f674827b132bfd921d815f73ad82 100644 GIT binary patch delta 10351 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 PI~Ok^4UM#_4C4O*I(iF0 diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 641fe54..b725a2e 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -853,6 +853,7 @@ \section{API: channels.py}\label{sec:channels.api} \subsection{Constants} \begin{enumerate} +\item \textbf{CHTYPES}: imported channel types from nl80211\_h \item \textbf{CHWIDTHS}: imported channel widths from nl80211\_h \item \textbf{ISM\_24\_C2F}: Dict containing ISM channel (key) to frequency (value) pairs diff --git a/pyric/net/wireless/__init__.py b/pyric/net/wireless/__init__.py index dac11e7..aab2c9f 100644 --- a/pyric/net/wireless/__init__.py +++ b/pyric/net/wireless/__init__.py @@ -20,7 +20,7 @@ wireless 0.0.1 desc: linux port of nl80211.h, nl80211.c - includes: rfkill_h 0.0.1 nl80211_h 0.0.2 nl80211_c 0.0.1 wlan 0.0.2 + includes: rfkill_h 0.0.1 nl80211_h 0.0.4 nl80211_c 0.0.2 wlan 0.0.2 changes: o added nl80211_c to handle attribute policies - added nl80211_parse_freqs to parse out supported frequencies @@ -28,8 +28,8 @@ __name__ = 'wireless' __license__ = 'GPLv3' -__version__ = '0.0.2' -__date__ = 'April 2016' +__version__ = '0.0.4' +__date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' diff --git a/pyric/net/wireless/nl80211_c.py b/pyric/net/wireless/nl80211_c.py index af29612..31aa87a 100644 --- a/pyric/net/wireless/nl80211_c.py +++ b/pyric/net/wireless/nl80211_c.py @@ -26,8 +26,8 @@ __name__ = 'nl80211_c' __license__ = 'GPLv3' -__version__ = '0.0.3' -__date__ = 'April 2016' +__version__ = '0.0.4' +__date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' @@ -184,27 +184,27 @@ nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS:nlh.NLA_U8, nl80211h.NL80211_ATTR_GENERATION: nlh.NLA_U8, #nl80211h.NL80211_ATTR_MAC:nlh.NLA_STRING, - #Not defined in nl80211_h - #nl80211h.NL80211_ATTR_OPMODE_NOTIF:nlh.NLA_U8, - #nl80211h.NL80211_ATTR_VENDOR_ID:nlh.NLA_U32, - #nl80211h.NL80211_ATTR_VENDOR_SUBCMD:nlh.NLA_U32, - #nl80211h.NL80211_ATTR_VENDOR_DATA:nlh.NLA_UNSPEC, - #nl80211h.NL80211_ATTR_QOS_MAP:nlh.NLA_UNSPEC, - #nl80211h.NL80211_ATTR_MAC_HINT:nlh.NLA_UNSPEC, - #nl80211h.NL80211_ATTR_WIPHY_FREQ_HINT:nlh.NLA_U32, - #nl80211h.NL80211_ATTR_TDLS_PEER_CAPABILITY:nlh.NLA_U32, - #nl80211h.NL80211_ATTR_SOCKET_OWNER:nlh.NLA_FLAG, - #nl80211h.NL80211_ATTR_CSA_C_OFFSETS_TX:nlh.NLA_UNSPEC, - #nl80211h.NL80211_ATTR_USE_RRM:nlh.NLA_FLAG, - #nl80211h.NL80211_ATTR_TSID:nlh.NLA_U8, - #nl80211h.NL80211_ATTR_USER_PRIO:nlh.NLA_U8, - #nl80211h.NL80211_ATTR_ADMITTED_TIME:nlh.NLA_U16, - #nl80211h.NL80211_ATTR_SMPS_MODE:nlh.NLA_U8, - #nl80211h.NL80211_ATTR_MAC_MASK:nlh.NLA_UNSPEC, - #nl80211h.NL80211_ATTR_WIPHY_SELF_MANAGED_REG:nlh.NLA_FLAG, + #### defined in kernel v4 nl80211_h + nl80211h.NL80211_ATTR_OPMODE_NOTIF:nlh.NLA_U8, + nl80211h.NL80211_ATTR_VENDOR_ID:nlh.NLA_U32, + nl80211h.NL80211_ATTR_VENDOR_SUBCMD:nlh.NLA_U32, + nl80211h.NL80211_ATTR_VENDOR_DATA:nlh.NLA_UNSPEC, + nl80211h.NL80211_ATTR_QOS_MAP:nlh.NLA_UNSPEC, + nl80211h.NL80211_ATTR_MAC_HINT:nlh.NLA_UNSPEC, + nl80211h.NL80211_ATTR_WIPHY_FREQ_HINT:nlh.NLA_U32, + nl80211h.NL80211_ATTR_TDLS_PEER_CAPABILITY:nlh.NLA_U32, + nl80211h.NL80211_ATTR_SOCKET_OWNER:nlh.NLA_FLAG, + nl80211h.NL80211_ATTR_CSA_C_OFFSETS_TX:nlh.NLA_UNSPEC, + nl80211h.NL80211_ATTR_USE_RRM:nlh.NLA_FLAG, + nl80211h.NL80211_ATTR_TSID:nlh.NLA_U8, + nl80211h.NL80211_ATTR_USER_PRIO:nlh.NLA_U8, + nl80211h.NL80211_ATTR_ADMITTED_TIME:nlh.NLA_U16, + nl80211h.NL80211_ATTR_SMPS_MODE:nlh.NLA_U8, + nl80211h.NL80211_ATTR_MAC_MASK:nlh.NLA_UNSPEC, + nl80211h.NL80211_ATTR_WIPHY_SELF_MANAGED_REG:nlh.NLA_FLAG, #nl80211h.NL80211_ATTR_NETNS_FD:nlh.NLA_U32, - #nl80211h.NL80211_ATTR_SCHED_SCAN_DELAY:nlh.NLA_U32, - #nl80211h.NL80211_ATTR_REG_INDOOR:nlh.NLA_FLAG, + nl80211h.NL80211_ATTR_SCHED_SCAN_DELAY:nlh.NLA_U32, + nl80211h.NL80211_ATTR_REG_INDOOR:nlh.NLA_FLAG, #nl80211h.NL80211_ATTR_PBSS:nlh.NLA_FLAG } diff --git a/pyric/net/wireless/nl80211_h.py b/pyric/net/wireless/nl80211_h.py index 733a0b0..545d195 100644 --- a/pyric/net/wireless/nl80211_h.py +++ b/pyric/net/wireless/nl80211_h.py @@ -52,8 +52,8 @@ __name__ = 'nl80211_h' __license__ = 'GPLv3' -__version__ = '0.0.3' -__date__ = 'April 2016' +__version__ = '0.0.4' +__date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' @@ -63,6 +63,14 @@ NL80211_GENL_NAME = 'nl80211' +""" new in kernel 4 """ +NL80211_MULTICAST_GROUP_CONFIG = "config" +NL80211_MULTICAST_GROUP_SCAN = "scan" +NL80211_MULTICAST_GROUP_REG = "regulatory" +NL80211_MULTICAST_GROUP_MLME = "mlme" +NL80211_MULTICAST_GROUP_VENDOR = "vendor" +NL80211_MULTICAST_GROUP_TESTMODE = "testmode" + """ /** * enum nl80211_commands - supported nl80211 commands @@ -546,119 +554,168 @@ * width). %NL80211_ATTR_CH_SWITCH_BLOCK_TX may be supplied to inform * other station that transmission must be blocked until the channel * switch is complete. + #### NEW IN KERNEL VERSION 4 #### + * @NL80211_CMD_ADD_TX_TS: Ask the kernel to add a traffic stream for the given + * %NL80211_ATTR_TSID and %NL80211_ATTR_MAC with %NL80211_ATTR_USER_PRIO + * and %NL80211_ATTR_ADMITTED_TIME parameters. + * Note that the action frame handshake with the AP shall be handled by + * userspace via the normal management RX/TX framework, this only sets + * up the TX TS in the driver/device. + * If the admitted time attribute is not added then the request just checks + * if a subsequent setup could be successful, the intent is to use this to + * avoid setting up a session with the AP when local restrictions would + * make that impossible. However, the subsequent "real" setup may still + * fail even if the check was successful. + * @NL80211_CMD_DEL_TX_TS: Remove an existing TS with the %NL80211_ATTR_TSID + * and %NL80211_ATTR_MAC parameters. It isn't necessary to call this + * before removing a station entry entirely, or before disassociating + * or similar, cleanup will happen in the driver/device in this case. + * @NL80211_CMD_GET_MPP: Get mesh path attributes for mesh proxy path to + * destination %NL80211_ATTR_MAC on the interface identified by + * %NL80211_ATTR_IFINDEX. + * @NL80211_CMD_JOIN_OCB: Join the OCB network. The center frequency and + * bandwidth of a channel must be given. + * @NL80211_CMD_LEAVE_OCB: Leave the OCB network -- no special arguments, the + * network is determined by the network interface. + * @NL80211_CMD_TDLS_CHANNEL_SWITCH: Start channel-switching with a TDLS peer, + * identified by the %NL80211_ATTR_MAC parameter. A target channel is + * provided via %NL80211_ATTR_WIPHY_FREQ and other attributes determining + * channel width/type. The target operating class is given via + * %NL80211_ATTR_OPER_CLASS. + * The driver is responsible for continually initiating channel-switching + * operations and returning to the base channel for communication with the + * AP. + * @NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH: Stop channel-switching with a TDLS + * peer given by %NL80211_ATTR_MAC. Both peers must be on the base channel + * when this command completes. + * @NL80211_CMD_WIPHY_REG_CHANGE: Similar to %NL80211_CMD_REG_CHANGE, but used + * as an event to indicate changes for devices with wiphy-specific regdom + * management. * @NL80211_CMD_MAX: highest used command number */ """ -NL80211_CMD_UNSPEC = 0 -NL80211_CMD_GET_WIPHY = 1 -NL80211_CMD_SET_WIPHY = 2 -NL80211_CMD_NEW_WIPHY = 3 -NL80211_CMD_DEL_WIPHY = 4 -NL80211_CMD_GET_INTERFACE = 5 -NL80211_CMD_SET_INTERFACE = 6 -NL80211_CMD_NEW_INTERFACE = 7 -NL80211_CMD_DEL_INTERFACE = 8 -NL80211_CMD_GET_KEY = 9 -NL80211_CMD_SET_KEY = 10 -NL80211_CMD_NEW_KEY = 11 -NL80211_CMD_DEL_KEY = 12 -NL80211_CMD_GET_BEACON = 13 -NL80211_CMD_SET_BEACON = 14 -NL80211_CMD_START_AP = 15 -NL80211_CMD_NEW_BEACON = NL80211_CMD_START_AP -NL80211_CMD_STOP_AP = 16 -NL80211_CMD_DEL_BEACON = NL80211_CMD_STOP_AP -NL80211_CMD_GET_STATION = 17 -NL80211_CMD_SET_STATION = 18 -NL80211_CMD_NEW_STATION = 19 -NL80211_CMD_DEL_STATION = 20 -NL80211_CMD_GET_MPATH = 21 -NL80211_CMD_SET_MPATH = 22 -NL80211_CMD_NEW_MPATH = 23 -NL80211_CMD_DEL_MPATH = 24 -NL80211_CMD_SET_BSS = 25 -NL80211_CMD_SET_REG = 26 -NL80211_CMD_REQ_SET_REG = 27 -NL80211_CMD_GET_MESH_CONFIG = 28 -NL80211_CMD_SET_MESH_CONFIG = 29 -NL80211_CMD_SET_MGMT_EXTRA_IE = 30 # reserved; not used -NL80211_CMD_GET_REG = 31 -NL80211_CMD_GET_SCAN = 32 -NL80211_CMD_TRIGGER_SCAN = 33 -NL80211_CMD_NEW_SCAN_RESULTS = 34 -NL80211_CMD_SCAN_ABORTED = 35 -NL80211_CMD_REG_CHANGE = 36 -NL80211_CMD_AUTHENTICATE = 37 -NL80211_CMD_ASSOCIATE = 38 -NL80211_CMD_DEAUTHENTICATE = 39 -NL80211_CMD_DISASSOCIATE = 40 -NL80211_CMD_MICHAEL_MIC_FAILURE = 41 -NL80211_CMD_REG_BEACON_HINT = 42 -NL80211_CMD_JOIN_IBSS = 43 -NL80211_CMD_LEAVE_IBSS = 44 -NL80211_CMD_TESTMODE = 45 -NL80211_CMD_CONNECT = 46 -NL80211_CMD_ROAM = 47 -NL80211_CMD_DISCONNECT = 48 -NL80211_CMD_SET_WIPHY_NETNS = 49 -NL80211_CMD_GET_SURVEY = 50 -NL80211_CMD_NEW_SURVEY_RESULTS = 51 -NL80211_CMD_SET_PMKSA = 52 -NL80211_CMD_DEL_PMKSA = 53 -NL80211_CMD_FLUSH_PMKSA = 54 -NL80211_CMD_REMAIN_ON_CHANNEL = 55 -NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL = 56 -NL80211_CMD_SET_TX_BITRATE_MASK = 57 -NL80211_CMD_REGISTER_FRAME = 58 -NL80211_CMD_REGISTER_ACTION = NL80211_CMD_REGISTER_FRAME -NL80211_CMD_FRAME = 59 -NL80211_CMD_ACTION = NL80211_CMD_FRAME -NL80211_CMD_FRAME_TX_STATUS = 60 -NL80211_CMD_ACTION_TX_STATUS = NL80211_CMD_FRAME_TX_STATUS -NL80211_CMD_SET_POWER_SAVE = 61 -NL80211_CMD_GET_POWER_SAVE = 62 -NL80211_CMD_SET_CQM = 63 -NL80211_CMD_NOTIFY_CQM = 64 -NL80211_CMD_SET_CHANNEL = 65 -NL80211_CMD_SET_WDS_PEER = 66 -NL80211_CMD_FRAME_WAIT_CANCEL = 67 -NL80211_CMD_JOIN_MESH = 68 -NL80211_CMD_LEAVE_MESH = 69 -NL80211_CMD_UNPROT_DEAUTHENTICATE = 70 -NL80211_CMD_UNPROT_DISASSOCIATE = 71 -NL80211_CMD_NEW_PEER_CANDIDATE = 72 -NL80211_CMD_GET_WOWLAN = 73 -NL80211_CMD_SET_WOWLAN = 74 -NL80211_CMD_START_SCHED_SCAN = 75 -NL80211_CMD_STOP_SCHED_SCAN = 76 -NL80211_CMD_SCHED_SCAN_RESULTS = 77 -NL80211_CMD_SCHED_SCAN_STOPPED = 78 -NL80211_CMD_SET_REKEY_OFFLOAD = 79 -NL80211_CMD_PMKSA_CANDIDATE = 80 -NL80211_CMD_TDLS_OPER = 81 -NL80211_CMD_TDLS_MGMT = 82 -NL80211_CMD_UNEXPECTED_FRAME = 83 -NL80211_CMD_PROBE_CLIENT = 84 -NL80211_CMD_REGISTER_BEACONS = 85 -NL80211_CMD_UNEXPECTED_4ADDR_FRAME = 86 -NL80211_CMD_SET_NOACK_MAP = 87 -NL80211_CMD_CH_SWITCH_NOTIFY = 88 -NL80211_CMD_START_P2P_DEVICE = 89 -NL80211_CMD_STOP_P2P_DEVICE = 90 -NL80211_CMD_CONN_FAILED = 91 -NL80211_CMD_SET_MCAST_RATE = 92 -NL80211_CMD_SET_MAC_ACL = 93 -NL80211_CMD_RADAR_DETECT = 94 -NL80211_CMD_GET_PROTOCOL_FEATURES = 95 -NL80211_CMD_UPDATE_FT_IES = 96 -NL80211_CMD_FT_EVENT = 97 -NL80211_CMD_CRIT_PROTOCOL_START = 98 -NL80211_CMD_CRIT_PROTOCOL_STOP = 99 -NL80211_CMD_GET_COALESCE = 100 -NL80211_CMD_SET_COALESCE = 101 -NL80211_CMD_CHANNEL_SWITCH = 102 +NL80211_CMD_UNSPEC = 0 +NL80211_CMD_GET_WIPHY = 1 +NL80211_CMD_SET_WIPHY = 2 +NL80211_CMD_NEW_WIPHY = 3 +NL80211_CMD_DEL_WIPHY = 4 +NL80211_CMD_GET_INTERFACE = 5 +NL80211_CMD_SET_INTERFACE = 6 +NL80211_CMD_NEW_INTERFACE = 7 +NL80211_CMD_DEL_INTERFACE = 8 +NL80211_CMD_GET_KEY = 9 +NL80211_CMD_SET_KEY = 10 +NL80211_CMD_NEW_KEY = 11 +NL80211_CMD_DEL_KEY = 12 +NL80211_CMD_GET_BEACON = 13 +NL80211_CMD_SET_BEACON = 14 +NL80211_CMD_START_AP = 15 +NL80211_CMD_NEW_BEACON = NL80211_CMD_START_AP +NL80211_CMD_STOP_AP = 16 +NL80211_CMD_DEL_BEACON = NL80211_CMD_STOP_AP +NL80211_CMD_GET_STATION = 17 +NL80211_CMD_SET_STATION = 18 +NL80211_CMD_NEW_STATION = 19 +NL80211_CMD_DEL_STATION = 20 +NL80211_CMD_GET_MPATH = 21 +NL80211_CMD_SET_MPATH = 22 +NL80211_CMD_NEW_MPATH = 23 +NL80211_CMD_DEL_MPATH = 24 +NL80211_CMD_SET_BSS = 25 +NL80211_CMD_SET_REG = 26 +NL80211_CMD_REQ_SET_REG = 27 +NL80211_CMD_GET_MESH_CONFIG = 28 +NL80211_CMD_SET_MESH_CONFIG = 29 +NL80211_CMD_SET_MGMT_EXTRA_IE = 30 # reserved; not used +NL80211_CMD_GET_REG = 31 +NL80211_CMD_GET_SCAN = 32 +NL80211_CMD_TRIGGER_SCAN = 33 +NL80211_CMD_NEW_SCAN_RESULTS = 34 +NL80211_CMD_SCAN_ABORTED = 35 +NL80211_CMD_REG_CHANGE = 36 +NL80211_CMD_AUTHENTICATE = 37 +NL80211_CMD_ASSOCIATE = 38 +NL80211_CMD_DEAUTHENTICATE = 39 +NL80211_CMD_DISASSOCIATE = 40 +NL80211_CMD_MICHAEL_MIC_FAILURE = 41 +NL80211_CMD_REG_BEACON_HINT = 42 +NL80211_CMD_JOIN_IBSS = 43 +NL80211_CMD_LEAVE_IBSS = 44 +NL80211_CMD_TESTMODE = 45 +NL80211_CMD_CONNECT = 46 +NL80211_CMD_ROAM = 47 +NL80211_CMD_DISCONNECT = 48 +NL80211_CMD_SET_WIPHY_NETNS = 49 +NL80211_CMD_GET_SURVEY = 50 +NL80211_CMD_NEW_SURVEY_RESULTS = 51 +NL80211_CMD_SET_PMKSA = 52 +NL80211_CMD_DEL_PMKSA = 53 +NL80211_CMD_FLUSH_PMKSA = 54 +NL80211_CMD_REMAIN_ON_CHANNEL = 55 +NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL = 56 +NL80211_CMD_SET_TX_BITRATE_MASK = 57 +NL80211_CMD_REGISTER_FRAME = 58 +NL80211_CMD_REGISTER_ACTION = NL80211_CMD_REGISTER_FRAME +NL80211_CMD_FRAME = 59 +NL80211_CMD_ACTION = NL80211_CMD_FRAME +NL80211_CMD_FRAME_TX_STATUS = 60 +NL80211_CMD_ACTION_TX_STATUS = NL80211_CMD_FRAME_TX_STATUS +NL80211_CMD_SET_POWER_SAVE = 61 +NL80211_CMD_GET_POWER_SAVE = 62 +NL80211_CMD_SET_CQM = 63 +NL80211_CMD_NOTIFY_CQM = 64 +NL80211_CMD_SET_CHANNEL = 65 +NL80211_CMD_SET_WDS_PEER = 66 +NL80211_CMD_FRAME_WAIT_CANCEL = 67 +NL80211_CMD_JOIN_MESH = 68 +NL80211_CMD_LEAVE_MESH = 69 +NL80211_CMD_UNPROT_DEAUTHENTICATE = 70 +NL80211_CMD_UNPROT_DISASSOCIATE = 71 +NL80211_CMD_NEW_PEER_CANDIDATE = 72 +NL80211_CMD_GET_WOWLAN = 73 +NL80211_CMD_SET_WOWLAN = 74 +NL80211_CMD_START_SCHED_SCAN = 75 +NL80211_CMD_STOP_SCHED_SCAN = 76 +NL80211_CMD_SCHED_SCAN_RESULTS = 77 +NL80211_CMD_SCHED_SCAN_STOPPED = 78 +NL80211_CMD_SET_REKEY_OFFLOAD = 79 +NL80211_CMD_PMKSA_CANDIDATE = 80 +NL80211_CMD_TDLS_OPER = 81 +NL80211_CMD_TDLS_MGMT = 82 +NL80211_CMD_UNEXPECTED_FRAME = 83 +NL80211_CMD_PROBE_CLIENT = 84 +NL80211_CMD_REGISTER_BEACONS = 85 +NL80211_CMD_UNEXPECTED_4ADDR_FRAME = 86 +NL80211_CMD_SET_NOACK_MAP = 87 +NL80211_CMD_CH_SWITCH_NOTIFY = 88 +NL80211_CMD_START_P2P_DEVICE = 89 +NL80211_CMD_STOP_P2P_DEVICE = 90 +NL80211_CMD_CONN_FAILED = 91 +NL80211_CMD_SET_MCAST_RATE = 92 +NL80211_CMD_SET_MAC_ACL = 93 +NL80211_CMD_RADAR_DETECT = 94 +NL80211_CMD_GET_PROTOCOL_FEATURES = 95 +NL80211_CMD_UPDATE_FT_IES = 96 +NL80211_CMD_FT_EVENT = 97 +NL80211_CMD_CRIT_PROTOCOL_START = 98 +NL80211_CMD_CRIT_PROTOCOL_STOP = 99 +NL80211_CMD_GET_COALESCE = 100 +NL80211_CMD_SET_COALESCE = 101 +NL80211_CMD_CHANNEL_SWITCH = 102 +# added in kernel version 4 +NL80211_CMD_VENDOR = 103 +NL80211_CMD_SET_QOS_MAP = 104 +NL80211_CMD_ADD_TX_TS = 105 +NL80211_CMD_DEL_TX_TS = 106 +NL80211_CMD_GET_MPP = 107 +NL80211_CMD_JOIN_OCB = 108 +NL80211_CMD_LEAVE_OCB = 109 +NL80211_CMD_CH_SWITCH_STARTED_NOTIFY = 110 +NL80211_CMD_TDLS_CHANNEL_SWITCH = 111 +NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH = 112 +NL80211_CMD_WIPHY_REG_CHANGE = 113 # add new commands above here -MAX_NL80211_CMD = 102 +NL80211_CMD_MAX = NL80211_CMD_WIPHY_REG_CHANGE # source-level API compatibility NL80211_CMD_GET_MESH_PARAMS = NL80211_CMD_GET_MESH_CONFIG @@ -1177,6 +1234,106 @@ * channels and reports radar events to userspace. Userspace is required * to react to radar events, e.g. initiate a channel switch or leave the * IBSS network. + * @NL80211_ATTR_SUPPORT_5_MHZ: A flag indicating that the device supports + * 5 MHz channel bandwidth. + * @NL80211_ATTR_SUPPORT_10_MHZ: A flag indicating that the device supports + * 10 MHz channel bandwidth. + * @NL80211_ATTR_OPMODE_NOTIF: Operating mode field from Operating Mode + * Notification Element based on association request when used with + * %NL80211_CMD_NEW_STATION; u8 attribute. + * @NL80211_ATTR_VENDOR_ID: The vendor ID, either a 24-bit OUI or, if + * %NL80211_VENDOR_ID_IS_LINUX is set, a special Linux ID (not used yet) + * @NL80211_ATTR_VENDOR_SUBCMD: vendor sub-command + * @NL80211_ATTR_VENDOR_DATA: data for the vendor command, if any; this + * attribute is also used for vendor command feature advertisement + * @NL80211_ATTR_VENDOR_EVENTS: used for event list advertising in the wiphy + * info, containing a nested array of possible events + * @NL80211_ATTR_QOS_MAP: IP DSCP mapping for Interworking QoS mapping. This + * data is in the format defined for the payload of the QoS Map Set element + * in IEEE Std 802.11-2012, 8.4.2.97. + * @NL80211_ATTR_MAC_HINT: MAC address recommendation as initial BSS + * @NL80211_ATTR_WIPHY_FREQ_HINT: frequency of the recommended initial BSS + * @NL80211_ATTR_MAX_AP_ASSOC_STA: Device attribute that indicates how many + * associated stations are supported in AP mode (including P2P GO); u32. + * Since drivers may not have a fixed limit on the maximum number (e.g., + * other concurrent operations may affect this), drivers are allowed to + * advertise values that cannot always be met. In such cases, an attempt + * to add a new station entry with @NL80211_CMD_NEW_STATION may fail. + * @NL80211_ATTR_CSA_C_OFFSETS_TX: An array of csa counter offsets (u16) which + * should be updated when the frame is transmitted. + * @NL80211_ATTR_MAX_CSA_COUNTERS: U8 attribute used to advertise the maximum + * supported number of csa counters. + * @NL80211_ATTR_TDLS_PEER_CAPABILITY: flags for TDLS peer capabilities, u32. + * As specified in the &enum nl80211_tdls_peer_capability. + * @NL80211_ATTR_SOCKET_OWNER: Flag attribute, if set during interface + * creation then the new interface will be owned by the netlink socket + * that created it and will be destroyed when the socket is closed. + * If set during scheduled scan start then the new scan req will be + * owned by the netlink socket that created it and the scheduled scan will + * be stopped when the socket is closed. + * If set during configuration of regulatory indoor operation then the + * regulatory indoor configuration would be owned by the netlink socket + * that configured the indoor setting, and the indoor operation would be + * cleared when the socket is closed. + * @NL80211_ATTR_TDLS_INITIATOR: flag attribute indicating the current end is + * the TDLS link initiator. + * @NL80211_ATTR_USE_RRM: flag for indicating whether the current connection + * shall support Radio Resource Measurements (11k). This attribute can be + * used with %NL80211_CMD_ASSOCIATE and %NL80211_CMD_CONNECT requests. + * User space applications are expected to use this flag only if the + * underlying device supports these minimal RRM features: + * %NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES, + * %NL80211_FEATURE_QUIET, + * If this flag is used, driver must add the Power Capabilities IE to the + * association request. In addition, it must also set the RRM capability + * flag in the association request's Capability Info field. + * @NL80211_ATTR_WIPHY_DYN_ACK: flag attribute used to enable ACK timeout + * estimation algorithm (dynack). In order to activate dynack + * %NL80211_FEATURE_ACKTO_ESTIMATION feature flag must be set by lower + * drivers to indicate dynack capability. Dynack is automatically disabled + * setting valid value for coverage class. + * @NL80211_ATTR_TSID: a TSID value (u8 attribute) + * @NL80211_ATTR_USER_PRIO: user priority value (u8 attribute) + * @NL80211_ATTR_ADMITTED_TIME: admitted time in units of 32 microseconds + * (per second) (u16 attribute) + * @NL80211_ATTR_SMPS_MODE: SMPS mode to use (ap mode). see + * &enum nl80211_smps_mode. + * @NL80211_ATTR_OPER_CLASS: operating class + * @NL80211_ATTR_MAC_MASK: MAC address mask + * @NL80211_ATTR_WIPHY_SELF_MANAGED_REG: flag attribute indicating this device + * is self-managing its regulatory information and any regulatory domain + * obtained from it is coming from the device's wiphy and not the global + * cfg80211 regdomain. + * @NL80211_ATTR_EXT_FEATURES: extended feature flags contained in a byte + * array. The feature flags are identified by their bit index (see &enum + * nl80211_ext_feature_index). The bit index is ordered starting at the + * least-significant bit of the first byte in the array, ie. bit index 0 + * is located at bit 0 of byte 0. bit index 25 would be located at bit 1 + * of byte 3 (u8 array). + * @NL80211_ATTR_SURVEY_RADIO_STATS: Request overall radio statistics to be + * returned along with other survey data. If set, @NL80211_CMD_GET_SURVEY + * may return a survey entry without a channel indicating global radio + * statistics (only some values are valid and make sense.) + * For devices that don't return such an entry even then, the information + * should be contained in the result as the sum of the respective counters + * over all channels. + * @NL80211_ATTR_SCHED_SCAN_DELAY: delay before the first cycle of a + * scheduled scan (or a WoWLAN net-detect scan) is started, u32 + * in seconds. + * @NL80211_ATTR_REG_INDOOR: flag attribute, if set indicates that the device + * is operating in an indoor environment. + * @NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS: maximum number of scan plans for + * scheduled scan supported by the device (u32), a wiphy attribute. + * @NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL: maximum interval (in seconds) for + * a scan plan (u32), a wiphy attribute. + * @NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS: maximum number of iterations in + * a scan plan (u32), a wiphy attribute. + * @NL80211_ATTR_SCHED_SCAN_PLANS: a list of scan plans for scheduled scan. + * Each scan plan defines the number of scan iterations and the interval + * between scans. The last scan plan will always run infinitely, + * thus it must not specify the number of iterations, only the interval + * between scans. The scan plans are executed sequentially. + * Each scan plan is a nested attribute of &enum nl80211_sched_scan_plan. * @NL80211_ATTR_MAX: highest attribute number currently defined */ """ @@ -1374,9 +1531,43 @@ NL80211_ATTR_STA_SUPPORTED_CHANNELS = 189 NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES = 190 NL80211_ATTR_HANDLE_DFS = 191 +#### Kernel v4 additional +NL80211_ATTR_SUPPORT_5_MHZ = 192 +NL80211_ATTR_SUPPORT_10_MHZ = 193 +NL80211_ATTR_OPMODE_NOTIF = 194 +NL80211_ATTR_VENDOR_ID = 195 +NL80211_ATTR_VENDOR_SUBCMD = 196 +NL80211_ATTR_VENDOR_DATA = 197 +NL80211_ATTR_VENDOR_EVENTS = 198 +NL80211_ATTR_QOS_MAP = 199 +NL80211_ATTR_MAC_HINT = 200 +NL80211_ATTR_WIPHY_FREQ_HINT = 201 +NL80211_ATTR_MAX_AP_ASSOC_STA = 202 +NL80211_ATTR_TDLS_PEER_CAPABILITY = 203 +NL80211_ATTR_SOCKET_OWNER = 204 +NL80211_ATTR_CSA_C_OFFSETS_TX = 205 +NL80211_ATTR_MAX_CSA_COUNTERS = 206 +NL80211_ATTR_TDLS_INITIATOR = 207 +NL80211_ATTR_USE_RRM = 208 +NL80211_ATTR_WIPHY_DYN_ACK = 209 +NL80211_ATTR_TSID = 210 +NL80211_ATTR_USER_PRIO = 211 +NL80211_ATTR_ADMITTED_TIME = 212 +NL80211_ATTR_SMPS_MODE = 213 +NL80211_ATTR_OPER_CLASS = 214 +NL80211_ATTR_MAC_MASK = 215 +NL80211_ATTR_WIPHY_SELF_MANAGED_REG = 216 +NL80211_ATTR_EXT_FEATURES = 217 +NL80211_ATTR_SURVEY_RADIO_STATS = 218 +NL80211_ATTR_NETNS_FD = 219 +NL80211_ATTR_SCHED_SCAN_DELAY = 220 +NL80211_ATTR_REG_INDOOR = 221 +NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS = 222 +NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL = 223 +NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS = 224 +NL80211_ATTR_SCHED_SCAN_PLANS = 225 # add attributes here, update the policy in nl80211.c -__NL80211_ATTR_AFTER_LAST = 192 -NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1 +NL80211_ATTR_MAX = NL80211_ATTR_SCHED_SCAN_PLANS # source-level API compatibility NL80211_ATTR_SCAN_GENERATION = NL80211_ATTR_GENERATION @@ -1454,7 +1645,7 @@ """ # the below string names may not be the same as identified by other programs NL80211_IFTYPES = ['unspecified','ibss','managed','AP','AP VLAN','wds', - 'monitor','mesh','p2p_client','p2p_go','p2p_device'] + 'monitor','mesh','p2p_client','p2p_go','p2p_device','ocb'] NL80211_IFTYPE_UNSPECIFIED = 0 NL80211_IFTYPE_ADHOC = 1 NL80211_IFTYPE_STATION = 2 @@ -1466,6 +1657,7 @@ NL80211_IFTYPE_P2P_CLIENT = 8 NL80211_IFTYPE_P2P_GO = 9 NL80211_IFTYPE_P2P_DEVICE = 10 +NL80211_IFTYPE_OCB = 11 NUM_NL80211_IFTYPES = len(NL80211_IFTYPES) """ @@ -1557,6 +1749,11 @@ def nl80211_sta_flag_update(mask,setto): * @NL80211_RATE_INFO_80P80_MHZ_WIDTH: 80+80 MHz VHT rate * @NL80211_RATE_INFO_160_MHZ_WIDTH: 160 MHz VHT rate * @__NL80211_RATE_INFO_AFTER_LAST: internal use + * @NL80211_RATE_INFO_10_MHZ_WIDTH: 10 MHz width - note that this is + * a legacy rate and will be reported as the actual bitrate, i.e. + * half the base (20 MHz) rate + * @NL80211_RATE_INFO_5_MHZ_WIDTH: 5 MHz width - note that this is + * a legacy rate and will be reported as the ac */ """ __NL80211_RATE_INFO_INVALID = 0 @@ -1570,7 +1767,10 @@ def nl80211_sta_flag_update(mask,setto): NL80211_RATE_INFO_80_MHZ_WIDTH = 8 NL80211_RATE_INFO_80P80_MHZ_WIDTH = 9 NL80211_RATE_INFO_160_MHZ_WIDTH = 10 -NUM_NL80211_RATE_INFO = 10 +#### new kernel version 4 +NL80211_RATE_INFO_10_MHZ_WIDTH = 11 +NL80211_RATE_INFO_5_MHZ_WIDTH = 12 +NUM_NL80211_RATE_INFO = 12 """ /** @@ -1641,38 +1841,79 @@ def nl80211_sta_flag_update(mask,setto): * Contains a nested array of signal strength attributes (u8, dBm) * @NL80211_STA_INFO_CHAIN_SIGNAL_AVG: per-chain signal strength average * Same format as NL80211_STA_INFO_CHAIN_SIGNAL. + * @NL80211_STA_EXPECTED_THROUGHPUT: expected throughput considering also the + * 802.11 header (u32, kbps) + * @NL80211_STA_INFO_RX_DROP_MISC: RX packets dropped for unspecified reasons + * (u64) + * @NL80211_STA_INFO_BEACON_RX: number of beacons received from this peer (u64) + * @NL80211_STA_INFO_BEACON_SIGNAL_AVG: signal strength average + * for beacons only (u8, dBm) + * @NL80211_STA_INFO_TID_STATS: per-TID statistics (see &enum nl80211_tid_stats) + * This is a nested attribute where each the inner attribute number is the + * TID+1 and the special TID 16 (i.e. value 17) is used for non-QoS frames; + * each one of those is again nested with &enum nl80211_tid_stats + * attributes carrying the actual values. * @__NL80211_STA_INFO_AFTER_LAST: internal * @NL80211_STA_INFO_MAX: highest possible station info attribute */ """ -__NL80211_STA_INFO_INVALID = 0 -NL80211_STA_INFO_INACTIVE_TIME = 1 -NL80211_STA_INFO_RX_BYTES = 2 -NL80211_STA_INFO_TX_BYTES = 3 -NL80211_STA_INFO_LLID = 4 -NL80211_STA_INFO_PLID = 5 -NL80211_STA_INFO_PLINK_STATE = 6 -NL80211_STA_INFO_SIGNAL = 7 -NL80211_STA_INFO_TX_BITRATE = 8 -NL80211_STA_INFO_RX_PACKETS = 9 -NL80211_STA_INFO_TX_PACKETS = 10 -NL80211_STA_INFO_TX_RETRIES = 11 -NL80211_STA_INFO_TX_FAILED = 12 -NL80211_STA_INFO_SIGNAL_AVG = 13 -NL80211_STA_INFO_RX_BITRATE = 14 -NL80211_STA_INFO_BSS_PARAM = 15 -NL80211_STA_INFO_CONNECTED_TIME = 16 -NL80211_STA_INFO_STA_FLAGS = 17 -NL80211_STA_INFO_BEACON_LOSS = 18 -NL80211_STA_INFO_T_OFFSET = 19 -NL80211_STA_INFO_LOCAL_PM = 20 -NL80211_STA_INFO_PEER_PM = 21 -NL80211_STA_INFO_NONPEER_PM = 22 -NL80211_STA_INFO_RX_BYTES64 = 23 -NL80211_STA_INFO_TX_BYTES64 = 24 -NL80211_STA_INFO_CHAIN_SIGNAL = 25 -NL80211_STA_INFO_CHAIN_SIGNAL_AVG = 26 -NUM_NL80211_STA_INFO = 26 +__NL80211_STA_INFO_INVALID = 0 +NL80211_STA_INFO_INACTIVE_TIME = 1 +NL80211_STA_INFO_RX_BYTES = 2 +NL80211_STA_INFO_TX_BYTES = 3 +NL80211_STA_INFO_LLID = 4 +NL80211_STA_INFO_PLID = 5 +NL80211_STA_INFO_PLINK_STATE = 6 +NL80211_STA_INFO_SIGNAL = 7 +NL80211_STA_INFO_TX_BITRATE = 8 +NL80211_STA_INFO_RX_PACKETS = 9 +NL80211_STA_INFO_TX_PACKETS = 10 +NL80211_STA_INFO_TX_RETRIES = 11 +NL80211_STA_INFO_TX_FAILED = 12 +NL80211_STA_INFO_SIGNAL_AVG = 13 +NL80211_STA_INFO_RX_BITRATE = 14 +NL80211_STA_INFO_BSS_PARAM = 15 +NL80211_STA_INFO_CONNECTED_TIME = 16 +NL80211_STA_INFO_STA_FLAGS = 17 +NL80211_STA_INFO_BEACON_LOSS = 18 +NL80211_STA_INFO_T_OFFSET = 19 +NL80211_STA_INFO_LOCAL_PM = 20 +NL80211_STA_INFO_PEER_PM = 21 +NL80211_STA_INFO_NONPEER_PM = 22 +NL80211_STA_INFO_RX_BYTES64 = 23 +NL80211_STA_INFO_TX_BYTES64 = 24 +NL80211_STA_INFO_CHAIN_SIGNAL = 25 +NL80211_STA_INFO_CHAIN_SIGNAL_AVG = 26 +#### new in kernel v 4 +NL80211_STA_INFO_EXPECTED_THROUGHPUT = 27 +NL80211_STA_INFO_RX_DROP_MISC = 28 +NL80211_STA_INFO_BEACON_RX = 29 +NL80211_STA_INFO_BEACON_SIGNAL_AVG = 30 +NL80211_STA_INFO_TID_STATS = 31 +NL80211_STA_INFO_MAX = NL80211_STA_INFO_TID_STATS + +""" +new in kernel v 4 +/** + * enum nl80211_tid_stats - per TID statistics attributes + * @__NL80211_TID_STATS_INVALID: attribute number 0 is reserved + * @NL80211_TID_STATS_RX_MSDU: number of MSDUs received (u64) + * @NL80211_TID_STATS_TX_MSDU: number of MSDUs transmitted (or + * attempted to transmit; u64) + * @NL80211_TID_STATS_TX_MSDU_RETRIES: number of retries for + * transmitted MSDUs (not counting the first attempt; u64) + * @NL80211_TID_STATS_TX_MSDU_FAILED: number of failed transmitted + * MSDUs (u64) + * @NUM_NL80211_TID_STATS: number of attributes here + * @NL80211_TID_STATS_MAX: highest numbered attribute here + */ +""" +__NL80211_TID_STATS_INVALID = 0 +NL80211_TID_STATS_RX_MSDU = 1 +NL80211_TID_STATS_TX_MSDU = 2 +NL80211_TID_STATS_TX_MSDU_RETRIES = 3 +NL80211_TID_STATS_TX_MSDU_FAILED = 4 +NL80211_TID_STATS_MAX = NL80211_TID_STATS_TX_MSDU_FAILED """ /** @@ -1751,7 +1992,7 @@ def nl80211_sta_flag_update(mask,setto): NL80211_BAND_ATTR_HT_AMPDU_DENSITY = 6 NL80211_BAND_ATTR_VHT_MCS_SET = 7 NL80211_BAND_ATTR_VHT_CAPA = 8 -NUM_NL80211_BAND_ATTR = 8 +NL80211_BAND_ATTR_MAX = NL80211_BAND_ATTR_VHT_CAPA NL80211_BAND_ATTR_HT_CAPA = NL80211_BAND_ATTR_HT_CAPA @@ -1784,6 +2025,29 @@ def nl80211_sta_flag_update(mask,setto): * @NL80211_FREQUENCY_ATTR_NO_160MHZ: any 160 MHz (but not 80+80) channel * using this channel as the primary or any of the secondary channels * isn't possible + * @NL80211_FREQUENCY_ATTR_DFS_CAC_TIME: DFS CAC time in milliseconds. + * @NL80211_FREQUENCY_ATTR_INDOOR_ONLY: Only indoor use is permitted on this + * channel. A channel that has the INDOOR_ONLY attribute can only be + * used when there is a clear assessment that the device is operating in + * an indoor surroundings, i.e., it is connected to AC power (and not + * through portable DC inverters) or is under the control of a master + * that is acting as an AP and is connected to AC power. + * @NL80211_FREQUENCY_ATTR_IR_CONCURRENT: IR operation is allowed on this + * channel if it's connected concurrently to a BSS on the same channel on + * the 2 GHz band or to a channel in the same UNII band (on the 5 GHz + * band), and IEEE80211_CHAN_RADAR is not set. Instantiating a GO or TDLS + * off-channel on a channel that has the IR_CONCURRENT attribute set can be + * done when there is a clear assessment that the device is operating under + * the guidance of an authorized master, i.e., setting up a GO or TDLS + * off-channel while the device is also connected to an AP with DFS and + * radar detection on the UNII band (it is up to user-space, i.e., + * wpa_supplicant to perform the required verifications). Using this + * attribute for IR is disallowed for master interfaces (IBSS, AP). + * @NL80211_FREQUENCY_ATTR_NO_20MHZ: 20 MHz operation is not allowed + * on this channel in current regulatory domain. + * @NL80211_FREQUENCY_ATTR_NO_10MHZ: 10 MHz operation is not allowed + * on this channel in current regulatory domain. + * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number * currently defined * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use @@ -1792,8 +2056,8 @@ def nl80211_sta_flag_update(mask,setto): __NL80211_FREQUENCY_ATTR_INVALID = 0 NL80211_FREQUENCY_ATTR_FREQ = 1 NL80211_FREQUENCY_ATTR_DISABLED = 2 -NL80211_FREQUENCY_ATTR_PASSIVE_SCAN = 3 -NL80211_FREQUENCY_ATTR_NO_IBSS = 4 +NL80211_FREQUENCY_ATTR_NO_IR = 3 # changed in kernel v 4 +__NL80211_FREQUENCY_ATTR_NO_IBSS = 4 NL80211_FREQUENCY_ATTR_RADAR = 5 NL80211_FREQUENCY_ATTR_MAX_TX_POWER = 6 NL80211_FREQUENCY_ATTR_DFS_STATE = 7 @@ -1802,9 +2066,20 @@ def nl80211_sta_flag_update(mask,setto): NL80211_FREQUENCY_ATTR_NO_HT40_PLUS = 10 NL80211_FREQUENCY_ATTR_NO_80MHZ = 11 NL80211_FREQUENCY_ATTR_NO_160MHZ = 12 -NUM_NL80211_FREQUENCY_ATTR = 12 +#### new in kernel v 4 +NL80211_FREQUENCY_ATTR_DFS_CAC_TIME = 13 +NL80211_FREQUENCY_ATTR_INDOOR_ONLY = 14 +NL80211_FREQUENCY_ATTR_IR_CONCURRENT = 15 +NL80211_FREQUENCY_ATTR_NO_20MHZ = 16 +NL80211_FREQUENCY_ATTR_NO_10MHZ = 17 +NL80211_FREQUENCY_MAX = NL80211_FREQUENCY_ATTR_NO_10MHZ NL80211_FREQUENCY_ATTR_MAX_TX_POWER = NL80211_FREQUENCY_ATTR_MAX_TX_POWER +#### new in kernel v 4 +NL80211_FREQUENCY_ATTR_PASSIVE_SCAN = NL80211_FREQUENCY_ATTR_NO_IR +NL80211_FREQUENCY_ATTR_NO_IBSS = NL80211_FREQUENCY_ATTR_NO_IR +NL80211_FREQUENCY_ATTR_NO_IR = NL80211_FREQUENCY_ATTR_NO_IR +NL80211_FREQUENCY_ATTR_GO_CONCURRENT = NL80211_FREQUENCY_ATTR_IR_CONCURRENT """ /** @@ -1889,6 +2164,8 @@ def nl80211_sta_flag_update(mask,setto): * If you don't have one then don't send this. * @NL80211_ATTR_POWER_RULE_MAX_EIRP: the maximum allowed EIRP for * a given frequency range. The value is in mBm (100 * dBm). + * @NL80211_ATTR_DFS_CAC_TIME: DFS CAC time in milliseconds. + * If not present or 0 default CAC time will be used. * @NL80211_REG_RULE_ATTR_MAX: highest regulatory rule attribute number * currently defined * @__NL80211_REG_RULE_ATTR_AFTER_LAST: internal use @@ -1901,7 +2178,9 @@ def nl80211_sta_flag_update(mask,setto): NL80211_ATTR_FREQ_RANGE_MAX_BW = 4 NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN = 5 NL80211_ATTR_POWER_RULE_MAX_EIRP = 6 -NUM_NL80211_REG_RULE_ATTR = 6 +#### new in kernel v 4 +NL80211_ATTR_DFS_CAC_TIME = 7 +NL80211_REG_RULE_MAX = NL80211_ATTR_DFS_CAC_TIME """ /** @@ -1935,19 +2214,45 @@ def nl80211_sta_flag_update(mask,setto): * @NL80211_RRF_DFS: DFS support is required to be used * @NL80211_RRF_PTP_ONLY: this is only for Point To Point links * @NL80211_RRF_PTMP_ONLY: this is only for Point To Multi Point links - * @NL80211_RRF_PASSIVE_SCAN: passive scan is required + * @NL80211_RRF_NO_IR: no mechanisms that initiate radiation are allowed, + * this includes probe requests or modes of operation that require + * beaconing. * @NL80211_RRF_NO_IBSS: no IBSS is allowed - */ -""" -NL80211_RRF_NO_OFDM = 1<<0 -NL80211_RRF_NO_CCK = 1<<1 -NL80211_RRF_NO_INDOOR = 1<<2 -NL80211_RRF_NO_OUTDOOR = 1<<3 -NL80211_RRF_DFS = 1<<4 -NL80211_RRF_PTP_ONLY = 1<<5 -NL80211_RRF_PTMP_ONLY = 1<<6 -NL80211_RRF_PASSIVE_SCAN = 1<<7 -NL80211_RRF_NO_IBSS = 1<<8 + * @NL80211_RRF_AUTO_BW: maximum available bandwidth should be calculated + * base on contiguous rules and wider channels will be allowed to cross + * multiple contiguous/overlapping frequency ranges. + * @NL80211_RRF_IR_CONCURRENT: See &NL80211_FREQUENCY_ATTR_IR_CONCURRENT + * @NL80211_RRF_NO_HT40MINUS: channels can't be used in HT40- operation + * @NL80211_RRF_NO_HT40PLUS: channels can't be used in HT40+ operation + * @NL80211_RRF_NO_80MHZ: 80MHz operation not allowed + * @NL80211_RRF_NO_160MHZ: 160MHz operation not allowed + */ +""" +NL80211_RRF_NO_OFDM = 1<<0 +NL80211_RRF_NO_CCK = 1<<1 +NL80211_RRF_NO_INDOOR = 1<<2 +NL80211_RRF_NO_OUTDOOR = 1<<3 +NL80211_RRF_DFS = 1<<4 +NL80211_RRF_PTP_ONLY = 1<<5 +NL80211_RRF_PTMP_ONLY = 1<<6 +NL80211_RRF_NO_IR = 1<<7 # changed in kernel v 4 +__NL80211_RRF_NO_IBSS = 1<<8 +#### new in kernel v4 +NL80211_RRF_AUTO_BW = 1<<11 +NL80211_RRF_IR_CONCURRENT = 1<<12 +NL80211_RRF_NO_HT40MINUS = 1<<13 +NL80211_RRF_NO_HT40PLUS = 1<<14 +NL80211_RRF_NO_80MHZ = 1<<15 +NL80211_RRF_NO_160MHZ = 1<<16 + +#### new in kernel v 4 +NL80211_RRF_PASSIVE_SCAN = NL80211_RRF_NO_IR +NL80211_RRF_NO_IBSS = NL80211_RRF_NO_IR +NL80211_RRF_NO_IR = NL80211_RRF_NO_IR +NL80211_RRF_NO_HT40 = (NL80211_RRF_NO_HT40MINUS | NL80211_RRF_NO_HT40PLUS) +NL80211_RRF_GO_CONCURRENT = NL80211_RRF_IR_CONCURRENT +#/* For backport compatibility with older userspace */ +NL80211_RRF_NO_IR_ALL = (NL80211_RRF_NO_IR | NL80211_RRF_NO_IBSS) """ /** @@ -1979,10 +2284,13 @@ def nl80211_sta_flag_update(mask,setto): * present has been registered with the wireless core that * has listed NL80211_FEATURE_CELL_BASE_REG_HINTS as a * supported feature. + * @NL80211_USER_REG_HINT_INDOOR: a user sent an hint indicating that the + * platform is operating in an indoor environment. */ """ NL80211_USER_REG_HINT_USER = 0 NL80211_USER_REG_HINT_CELL_BASE = 1 +NL80211_USER_REG_HINT_INDOOR = 2 # new in kernel v 4 """ /** @@ -1995,31 +2303,43 @@ def nl80211_sta_flag_update(mask,setto): * @NL80211_SURVEY_INFO_FREQUENCY: center frequency of channel * @NL80211_SURVEY_INFO_NOISE: noise level of channel (u8, dBm) * @NL80211_SURVEY_INFO_IN_USE: channel is currently being used - * @NL80211_SURVEY_INFO_CHANNEL_TIME: amount of time (in ms) that the radio - * spent on this channel - * @NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY: amount of the time the primary + * @NL80211_SURVEY_INFO_TIME: amount of time (in ms) that the radio + * was turned on (on channel or globally) + * @NL80211_SURVEY_INFO_TIME_BUSY: amount of the time the primary * channel was sensed busy (either due to activity or energy detect) - * @NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY: amount of time the extension + * @NL80211_SURVEY_INFO_TIME_EXT_BUSY: amount of time the extension * channel was sensed busy - * @NL80211_SURVEY_INFO_CHANNEL_TIME_RX: amount of time the radio spent - * receiving data - * @NL80211_SURVEY_INFO_CHANNEL_TIME_TX: amount of time the radio spent - * transmitting data + * @NL80211_SURVEY_INFO_TIME_RX: amount of time the radio spent + * receiving data (on channel or globally) + * @NL80211_SURVEY_INFO_TIME_TX: amount of time the radio spent + * transmitting data (on channel or globally) + * @NL80211_SURVEY_INFO_TIME_SCAN: time the radio spent for scan + * (on this channel or globally) * @NL80211_SURVEY_INFO_MAX: highest survey info attribute number * currently defined * @__NL80211_SURVEY_INFO_AFTER_LAST: internal use */ """ -__NL80211_SURVEY_INFO_INVALID = 0 -NL80211_SURVEY_INFO_FREQUENCY = 1 -NL80211_SURVEY_INFO_NOISE = 2 -NL80211_SURVEY_INFO_IN_USE = 3 -NL80211_SURVEY_INFO_CHANNEL_TIME = 4 -NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY = 5 -NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY = 6 -NL80211_SURVEY_INFO_CHANNEL_TIME_RX = 7 -NL80211_SURVEY_INFO_CHANNEL_TIME_TX = 8 -NUM_NL80211_SURVEY_INFO = 8 +__NL80211_SURVEY_INFO_INVALID = 0 +NL80211_SURVEY_INFO_FREQUENCY = 1 +NL80211_SURVEY_INFO_NOISE = 2 +NL80211_SURVEY_INFO_IN_USE = 3 +#### new in kernel v 4 +NL80211_SURVEY_INFO_TIME = 4 +NL80211_SURVEY_INFO_TIME_BUSY = 5 +NL80211_SURVEY_INFO_TIME_EXT_BUSY = 6 +NL80211_SURVEY_INFO_TIME_RX = 7 +NL80211_SURVEY_INFO_TIME_TX = 8 +NL80211_SURVEY_INFO_TIME_SCAN = 9 +NL80211_SURVEY_INFO_MAX = NL80211_SURVEY_INFO_TIME_SCAN + +#### new in kernel v 4 +#/* keep old names for compatibility */ +NL80211_SURVEY_INFO_CHANNEL_TIME = NL80211_SURVEY_INFO_TIME +NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY = NL80211_SURVEY_INFO_TIME_BUSY +NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY = NL80211_SURVEY_INFO_TIME_EXT_BUSY +NL80211_SURVEY_INFO_CHANNEL_TIME_RX = NL80211_SURVEY_INFO_TIME_RX +NL80211_SURVEY_INFO_CHANNEL_TIME_TX = NL80211_SURVEY_INFO_TIME_TX """ /** @@ -2051,7 +2371,7 @@ def nl80211_sta_flag_update(mask,setto): NL80211_MNTR_FLAG_OTHER_BSS = 4 NL80211_MNTR_FLAG_COOK_FRAMES = 5 NL80211_MNTR_FLAG_ACTIVE = 6 -NUM_NL80211_MNTR_FLAG_MAX = 6 +NL80211_MNTR_FLAG_MAX = NL80211_MNTR_FLAG_ACTIVE """ /** @@ -2086,104 +2406,74 @@ def nl80211_sta_flag_update(mask,setto): * active. * * @__NL80211_MESHCONF_INVALID: internal use - * * @NL80211_MESHCONF_RETRY_TIMEOUT: specifies the initial retry timeout in * millisecond units, used by the Peer Link Open message - * * @NL80211_MESHCONF_CONFIRM_TIMEOUT: specifies the initial confirm timeout, in * millisecond units, used by the peer link management to close a peer link - * * @NL80211_MESHCONF_HOLDING_TIMEOUT: specifies the holding timeout, in * millisecond units - * * @NL80211_MESHCONF_MAX_PEER_LINKS: maximum number of peer links allowed * on this mesh interface - * * @NL80211_MESHCONF_MAX_RETRIES: specifies the maximum number of peer link * open retries that can be sent to establish a new peer link instance in a * mesh - * * @NL80211_MESHCONF_TTL: specifies the value of TTL field set at a source mesh * point. - * * @NL80211_MESHCONF_AUTO_OPEN_PLINKS: whether we should automatically open * peer links when we detect compatible mesh peers. Disabled if * @NL80211_MESH_SETUP_USERSPACE_MPM or @NL80211_MESH_SETUP_USERSPACE_AMPE are * set. - * * @NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES: the number of action frames * containing a PREQ that an MP can send to a particular destination (path * target) - * * @NL80211_MESHCONF_PATH_REFRESH_TIME: how frequently to refresh mesh paths * (in milliseconds) - * * @NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT: minimum length of time to wait * until giving up on a path discovery (in milliseconds) - * * @NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT: The time (in TUs) for which mesh * points receiving a PREQ shall consider the forwarding information from * the root to be valid. (TU = time unit) - * * @NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL: The minimum interval of time (in * TUs) during which an MP can send only one action frame containing a PREQ * reference element - * * @NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME: The interval of time (in TUs) * that it takes for an HWMP information element to propagate across the * mesh - * * @NL80211_MESHCONF_HWMP_ROOTMODE: whether root mode is enabled or not - * * @NL80211_MESHCONF_ELEMENT_TTL: specifies the value of TTL field set at a * source mesh point for path selection elements. - * * @NL80211_MESHCONF_HWMP_RANN_INTERVAL: The interval of time (in TUs) between * root announcements are transmitted. - * * @NL80211_MESHCONF_GATE_ANNOUNCEMENTS: Advertise that this mesh station has * access to a broader network beyond the MBSS. This is done via Root * Announcement frames. - * * @NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL: The minimum interval of time (in * TUs) during which a mesh STA can send only one Action frame containing a * PERR element. - * * @NL80211_MESHCONF_FORWARDING: set Mesh STA as forwarding or non-forwarding * or forwarding entity (default is TRUE - forwarding entity) - * * @NL80211_MESHCONF_RSSI_THRESHOLD: RSSI threshold in dBm. This specifies the * threshold for average signal strength of candidate station to establish * a peer link. - * * @NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR: maximum number of neighbors * to synchronize to for 11s default synchronization method * (see 11C.12.2.2) - * * @NL80211_MESHCONF_HT_OPMODE: set mesh HT protection mode. - * * @NL80211_MESHCONF_ATTR_MAX: highest possible mesh configuration attribute - * * @NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT: The time (in TUs) for * which mesh STAs receiving a proactive PREQ shall consider the forwarding * information to the root mesh STA to be valid. - * * @NL80211_MESHCONF_HWMP_ROOT_INTERVAL: The interval of time (in TUs) between * proactive PREQs are transmitted. - * * @NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL: The minimum interval of time * (in TUs) during which a mesh STA can send only one Action frame * containing a PREQ element for root path confirmation. - * * @NL80211_MESHCONF_POWER_MODE: Default mesh power mode for new peer links. * type &enum nl80211_mesh_power_mode (u32) - * * @NL80211_MESHCONF_AWAKE_WINDOW: awake window duration (in TUs) - * * @NL80211_MESHCONF_PLINK_TIMEOUT: If no tx activity is seen from a STA we've * established peering with for longer than this time (in seconds), then * remove it from the STA's list of peers. Default is 30 minutes. - * * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use */ """ @@ -2216,7 +2506,7 @@ def nl80211_sta_flag_update(mask,setto): NL80211_MESHCONF_POWER_MODE = 26 NL80211_MESHCONF_AWAKE_WINDOW = 27 NL80211_MESHCONF_PLINK_TIMEOUT = 28 -NUM_NL80211_MESHCONF_ATTR = 28 +NL80211_MESHCONF_ATTR_MAX = NL80211_MESHCONF_PLINK_TIMEOUT """ /** @@ -2226,23 +2516,18 @@ def nl80211_sta_flag_update(mask,setto): * changed while the mesh is active. * * @__NL80211_MESH_SETUP_INVALID: Internal use - * * @NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL: Enable this option to use a * vendor specific path selection algorithm or disable it to use the * default HWMP. - * * @NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC: Enable this option to use a * vendor specific path metric or disable it to use the default Airtime * metric. - * * @NL80211_MESH_SETUP_IE: Information elements for this mesh, for instance, a * robust security network ie, or a vendor specific information element * that vendors will use to identify the path selection methods and * metrics in use. - * * @NL80211_MESH_SETUP_USERSPACE_AUTH: Enable this option if an authentication * daemon will be authenticating mesh candidates. - * * @NL80211_MESH_SETUP_USERSPACE_AMPE: Enable this option if an authentication * daemon will be securing peer link frames. AMPE is a secured version of * Mesh Peering Management (MPM) and is implemented with the assistance of @@ -2252,20 +2537,15 @@ def nl80211_sta_flag_update(mask,setto): * key management). When the flag is unset (default), the kernel can * autonomously complete (unsecured) mesh peering without the need of a * userspace daemon. - * * @NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC: Enable this option to use a * vendor specific synchronization method or disable it to use the default * neighbor offset synchronization - * * @NL80211_MESH_SETUP_USERSPACE_MPM: Enable this option if userspace will * implement an MPM which handles peer allocation and state. - * * @NL80211_MESH_SETUP_AUTH_PROTOCOL: Inform the kernel of the authentication * method (u8, as defined in IEEE 8.4.2.100.6, e.g. 0x1 for SAE). * Default is no authentication method required. - * * @NL80211_MESH_SETUP_ATTR_MAX: highest possible mesh setup attribute number - * * @__NL80211_MESH_SETUP_ATTR_AFTER_LAST: Internal use */ """ @@ -2278,7 +2558,7 @@ def nl80211_sta_flag_update(mask,setto): NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC = 6 NL80211_MESH_SETUP_USERSPACE_MPM = 7 NL80211_MESH_SETUP_AUTH_PROTOCOL = 8 -NUM_NL80211_MESH_SETUP_ATTR = 8 +NL80211_MESH_SETUP_ATTR_MAX = NL80211_MESH_SETUP_AUTH_PROTOCOL """ /** @@ -2302,13 +2582,13 @@ def nl80211_sta_flag_update(mask,setto): NL80211_TXQ_ATTR_CWMIN = 3 NL80211_TXQ_ATTR_CWMAX = 4 NL80211_TXQ_ATTR_AIFS = 5 -NUM_NL80211_TXQ_ATTR = 5 +NL80211_TXQ_ATTR_MAX = NL80211_TXQ_ATTR_AIFS NL80211_AC_VO = 0 NL80211_AC_VI = 1 NL80211_AC_BE = 2 NL80211_AC_BK = 3 -NL80211_NUM_ACS = 3 +NL80211_NUM_ACS = 4 # backward compat NL80211_TXQ_ATTR_QUEUE = NL80211_TXQ_ATTR_AC @@ -2328,7 +2608,7 @@ def nl80211_sta_flag_update(mask,setto): * above the control channel */ """ -NL80211_CHAN_WIDTHS = [None,'HT20','HT40-','HT40+'] +NL80211_CHAN_TYPES = [None,'HT20','HT40-','HT40+'] NL80211_CHAN_NO_HT = 0 NL80211_CHAN_HT20 = 1 NL80211_CHAN_HT40MINUS = 2 @@ -2355,6 +2635,7 @@ def nl80211_sta_flag_update(mask,setto): * @NL80211_CHAN_WIDTH_10: 10 MHz OFDM channel */ """ +NL80211_CHAN_WIDTHS = ['20-NOHT','20','40','80','80P80','160','5','10'] NL80211_CHAN_WIDTH_20_NOHT = 0 NL80211_CHAN_WIDTH_20 = 1 NL80211_CHAN_WIDTH_40 = 2 @@ -2406,6 +2687,13 @@ def nl80211_sta_flag_update(mask,setto): * yet been received * @NL80211_BSS_CHAN_WIDTH: channel width of the control channel * (u32, enum nl80211_bss_scan_width) + * @NL80211_BSS_BEACON_TSF: TSF of the last received beacon (u64) + * (not present if no beacon frame has been received yet) + * @NL80211_BSS_PRESP_DATA: the data in @NL80211_BSS_INFORMATION_ELEMENTS and + * @NL80211_BSS_TSF is known to be from a probe response (flag attribute) + * @NL80211_BSS_LAST_SEEN_BOOTTIME: CLOCK_BOOTTIME timestamp when this entry + * was last updated by a received frame. The value is expected to be + * accurate to about 10ms. (u64, nanoseconds) * @__NL80211_BSS_AFTER_LAST: internal * @NL80211_BSS_MAX: highest BSS attribute */ @@ -2423,7 +2711,11 @@ def nl80211_sta_flag_update(mask,setto): NL80211_BSS_SEEN_MS_AGO = 10 NL80211_BSS_BEACON_IES = 11 NL80211_BSS_CHAN_WIDTH = 12 -NUM_NL80211_BSS = 12 +#### new in kernel v 4 +NL80211_BSS_BEACON_TSF = 13 +NL80211_BSS_PRESP_DATA = 14 +NL80211_BSS_LAST_SEEN_BOOTTIME = 15 +NL80211_BSS_MAX = NL80211_BSS_LAST_SEEN_BOOTTIME """ /** @@ -2461,7 +2753,7 @@ def nl80211_sta_flag_update(mask,setto): NL80211_AUTHTYPE_FT = 2 NL80211_AUTHTYPE_NETWORK_EAP = 3 NL80211_AUTHTYPE_SAE = 4 -NUM_NL80211_AUTHTYPE = 5 +NL80211_AUTHTYPE_MAX = NL80211_AUTHTYPE_SAE #NL80211_AUTHTYPE_AUTOMATIC = 7 invalid in netlink """ @@ -2550,16 +2842,41 @@ def nl80211_sta_flag_update(mask,setto): * in an array of rates as defined in IEEE 802.11 7.3.2.2 (u8 values with * 1 = 500 kbps) but without the IE length restriction (at most * %NL80211_MAX_SUPP_RATES in a single array). - * @NL80211_TXRATE_MCS: HT (MCS) rates allowed for TX rate selection + * @NL80211_TXRATE_HT: HT (MCS) rates allowed for TX rate selection * in an array of MCS numbers. + * @NL80211_TXRATE_VHT: VHT rates allowed for TX rate selection, + * see &struct nl80211_txrate_vht + * @NL80211_TXRATE_GI: configure GI, see &enum nl80211_txrate_gi * @__NL80211_TXRATE_AFTER_LAST: internal * @NL80211_TXRATE_MAX: highest TX rate attribute */ """ __NL80211_TXRATE_INVALID = 0 NL80211_TXRATE_LEGACY = 1 -NL80211_TXRATE_MCS = 2 -MAX_NL80211_TXRATE = 2 +#### new in kernel v 4 +NL80211_TXRATE_HT = 2 +NL80211_TXRATE_VHT = 3 +NL80211_TXRATE_GI = 4 +NL80211_TXRATE_MAX = NL80211_TXRATE_GI +# backward compat +NL80211_TXRATE_MCS = NL80211_TXRATE_HT +NL80211_VHT_NSS_MAX = 8 + +""" +new in kernel v 4 +/** + * struct nl80211_txrate_vht - VHT MCS/NSS txrate bitmap + * @mcs: MCS bitmap table for each NSS (array index 0 for 1 stream, etc.) + */ +""" +#struct nl80211_txrate_vht { +# __u16 mcs[NL80211_VHT_NSS_MAX]; +#}; + +# new in kernelv v 4 +NL80211_TXRATE_DEFAULT_GI = 0 +NL80211_TXRATE_FORCE_SGI = 1 +NL80211_TXRATE_FORCE_LGI = 2 """ /** @@ -2607,8 +2924,10 @@ def nl80211_sta_flag_update(mask,setto): * interval in which %NL80211_ATTR_CQM_TXE_PKTS and * %NL80211_ATTR_CQM_TXE_RATE must be satisfied before generating an * %NL80211_CMD_NOTIFY_CQM. Set to 0 to turn off TX error reporting. + * @NL80211_ATTR_CQM_BEACON_LOSS_EVENT: flag attribute that's set in a beacon + * loss event * @__NL80211_ATTR_CQM_AFTER_LAST: internal - * @NL80211_ATTR_CQM: highest key attribute + * @NL80211_ATTR_CQM_MAX: highest key attribute */ """ __NL80211_ATTR_CQM_INVALID = 0 @@ -2619,7 +2938,8 @@ def nl80211_sta_flag_update(mask,setto): NL80211_ATTR_CQM_TXE_RATE = 5 NL80211_ATTR_CQM_TXE_PKTS = 6 NL80211_ATTR_CQM_TXE_INTVL = 7 -MAX_NL80211_ATTR_CQM = 7 +NL80211_ATTR_CQM_BEACON_LOSS_EVENT = 8 # new in kernel v 4 +NL80211_ATTR_CQM_MAX = NL80211_ATTR_CQM_BEACON_LOSS_EVENT """ /** @@ -2677,8 +2997,7 @@ def nl80211_sta_flag_update(mask,setto): NL80211_PKTPAT_MASK = 1 NL80211_PKTPAT_PATTERN = 2 NL80211_PKTPAT_OFFSET = 3 -NUM_NL80211_PKTPAT = 4 -MAX_NL80211_PKTPAT = 3 +NL80211_PKTPAT_MAX = NL80211_PKTPAT_OFFSET """ /** @@ -2716,8 +3035,8 @@ def nl80211_pattern_support(max_patterns,min_len,max_len,max_offset): NL80211_WOWLAN_PKTPAT_MASK = NL80211_PKTPAT_MASK NL80211_WOWLAN_PKTPAT_PATTERN = NL80211_PKTPAT_PATTERN NL80211_WOWLAN_PKTPAT_OFFSET = NL80211_PKTPAT_OFFSET -NUM_NL80211_WOWLAN_PKTPAT = NUM_NL80211_PKTPAT -MAX_NL80211_WOWLAN_PKTPAT = MAX_NL80211_PKTPAT +NUM_NL80211_WOWLAN_PKTPAT = NL80211_PKTPAT_MAX +MAX_NL80211_WOWLAN_PKTPAT = NL80211_PKTPAT_MAX nl80211_wowlan_pattern_support = nl80211_pattern_support """ @@ -2805,8 +3124,10 @@ def nl80211_pattern_support(max_patterns,min_len,max_len,max_offset): NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH = 15 NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST = 16 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS = 17 -NUM_NL80211_WOWLAN_TRIG = 18 -MAX_NL80211_WOWLAN_TRIG = 17 +#### new in kernel v 4 +NL80211_WOWLAN_TRIG_NET_DETECT = 18 +NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS = 19 +NL80211_WOWLAN_TRIG_MAX = NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS """ /** @@ -2832,6 +3153,10 @@ def nl80211_pattern_support(max_patterns,min_len,max_len,max_offset): * response packets might not go through correctly. */ """ +#struct nl80211_wowlan_tcp_data_seq { +# __u32 start, offset, len; +#}; + """ /** * struct nl80211_wowlan_tcp_data_seq - WoWLAN TCP data sequence @@ -2847,9 +3172,9 @@ def nl80211_pattern_support(max_patterns,min_len,max_len,max_offset): __u32 start, offset, len; }; """ -dot11_nl80211_wowlan_tcp_data_seq = 'III' -NL80211WOWLANTCPDATASEQLEN = struct.calcsize(dot11_nl80211_wowlan_tcp_data_seq) -def dot11_nl80211_wowlan_tcp_data_seq(start,offset,slen): +nl80211_wowlan_tcp_data_seq = 'III' +NL80211WOWLANTCPDATASEQLEN = struct.calcsize(nl80211_wowlan_tcp_data_seq) +def nl80211_wowlan_tcp_data_seq(start,offset,slen): """ creates a dot11_nl80211_wowlan_tcp_data_seq :param start: start value @@ -2857,7 +3182,7 @@ def dot11_nl80211_wowlan_tcp_data_seq(start,offset,slen): :param slen: seq value length :returns: packed dot11_nl80211_wowlan_tcp_data_seq """ - return struct.pack(dot11_nl80211_wowlan_tcp_data_seq,start,offset,slen) + return struct.pack(nl80211_wowlan_tcp_data_seq,start,offset,slen) """ /** @@ -2872,6 +3197,10 @@ def dot11_nl80211_wowlan_tcp_data_seq(start,offset,slen): __u8 token_stream[]; }; """ +#struct nl80211_wowlan_tcp_data_token { +# __u32 offset, len; +# __u8 token_stream[]; +#}; """ /** @@ -2884,17 +3213,17 @@ def dot11_nl80211_wowlan_tcp_data_seq(start,offset,slen): __u32 min_len, max_len, bufsize; }; """ -dot11_nl80211_wowlan_tcp_data_token_feature = 'III' -NL80211WOWLANTCPDATATOKENFEATURELEN = struct.calcsize(dot11_nl80211_wowlan_tcp_data_token_feature) -def dot11_nl80211_wowlan_tcp_data_token_feature(min_len,max_len,bufsize): +nl80211_wowlan_tcp_data_token_feature = 'III' +NL80211WOWLANTCPDATATOKENFEATURELEN = struct.calcsize(nl80211_wowlan_tcp_data_token_feature) +def nl80211_wowlan_tcp_data_token_feature(min_len,max_len,bufsize): """ - creates a dot11_nl80211_wowlan_tcp_data_seq + creates a nl80211_wowlan_tcp_data_seq :param min_len: min. token length :param max_len: max. token length :param bufsize: max size of token stream :returns: packed dot11_nl80211_wowlan_tcp_data_seq """ - return struct.pack(dot11_nl80211_wowlan_tcp_data_token_feature,min_len,max_len,bufsize) + return struct.pack(nl80211_wowlan_tcp_data_token_feature,min_len,max_len,bufsize) """ /** @@ -2942,8 +3271,7 @@ def dot11_nl80211_wowlan_tcp_data_token_feature(min_len,max_len,bufsize): NL80211_WOWLAN_TCP_DATA_INTERVAL = 9 NL80211_WOWLAN_TCP_WAKE_PAYLOAD = 10 NL80211_WOWLAN_TCP_WAKE_MASK = 11 -NUM_NL80211_WOWLAN_TCP = 12 -MAX_NL80211_WOWLAN_TCP = 11 +NL80211_WOWLAN_TCP_MAX = NL80211_WOWLAN_TCP_WAKE_MASK """ /** @@ -2961,9 +3289,9 @@ def dot11_nl80211_wowlan_tcp_data_token_feature(min_len,max_len,bufsize): __u32 max_delay; } __attribute__((packed)); """ -dot11_nl80211_coalesce_rule_support = "I16sI" # 16s holds the byte string for pat -NL80211_COALESCE_RULE_SUPPORT = struct.calcsize(dot11_nl80211_coalesce_rule_support) -def dot11_nl80211_coalesce_rule_support(max_rules,pat,max_delay): +nl80211_coalesce_rule_support = "I16sI" # 16s holds the byte string for pat +NL80211COALESCERULESUPPORTLEN = struct.calcsize(nl80211_coalesce_rule_support) +def nl80211_coalesce_rule_support(max_rules,pat,max_delay): """ creates a dot11_nl80211_coalesce_rule_support :param max_rules: max # of supported rules @@ -2971,7 +3299,7 @@ def dot11_nl80211_coalesce_rule_support(max_rules,pat,max_delay): :param max_delay: max coalescing delay (msecs) :returns: a packed dot11_nl80211_coalesce_rule_support """ - return struct.pack(dot11_nl80211_coalesce_rule_support,max_rules,pat,max_delay) + return struct.pack(nl80211_coalesce_rule_support,max_rules,pat,max_delay) """ /** @@ -2990,8 +3318,7 @@ def dot11_nl80211_coalesce_rule_support(max_rules,pat,max_delay): NL80211_ATTR_COALESCE_RULE_DELAY = 1 NL80211_ATTR_COALESCE_RULE_CONDITION = 2 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN = 3 -NUM_NL80211_ATTR_COALESCE_RULE = 4 -MAX_NL80211_ATTR_COALESCE_RULE = 3 +NL80211_ATTR_COALESCE_RULE_MAX = NL80211_ATTR_COALESCE_RULE_PKT_PATTERN """ /** @@ -3020,8 +3347,6 @@ def dot11_nl80211_coalesce_rule_support(max_rules,pat,max_delay): NL80211_IFACE_LIMIT_UNSPEC = 1 NL80211_IFACE_LIMIT_MAX = 2 NL80211_IFACE_LIMIT_TYPES = 3 -NUM_NL80211_IFACE_LIMIT = 4 -MAX_NL80211_IFACE_LIMIT = 3 """ /** @@ -3075,8 +3400,7 @@ def dot11_nl80211_coalesce_rule_support(max_rules,pat,max_delay): NL80211_IFACE_COMB_STA_AP_BI_MATCH = 3 NL80211_IFACE_COMB_NUM_CHANNELS = 4 NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS = 5 -NUM_NL80211_IFACE_COMB = 6 -MAX_NL80211_IFACE_COMB = 5 +NL80211_IFACE_COMB_MAX = NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS """ /** @@ -3142,8 +3466,7 @@ def dot11_nl80211_coalesce_rule_support(max_rules,pat,max_delay): NL80211_REKEY_DATA_KEK = 1 NL80211_REKEY_DATA_KCK = 2 NL80211_REKEY_DATA_REPLAY_CTR = 3 -NUM_NL80211_REKEY_DATA = 4 -MAX_NL80211_REKEY_DATA = 3 +NL80211_REKEY_DATA_MAX = NL80211_REKEY_DATA_REPLAY_CTR """ /** @@ -3195,8 +3518,7 @@ def dot11_nl80211_coalesce_rule_support(max_rules,pat,max_delay): NL80211_PMKSA_CANDIDATE_INDEX = 1 NL80211_PMKSA_CANDIDATE_BSSID = 2 NL80211_PMKSA_CANDIDATE_PREAUTH = 3 -NUM_NL80211_PMKSA_CANDIDATE = 4 -MAX_NL80211_PMKSA_CANDIDATE = 3 +NL80211_PMKSA_CANDIDATE_MAX = NL80211_PMKSA_CANDIDATE_PREAUTH """ /** @@ -3276,26 +3598,100 @@ def dot11_nl80211_coalesce_rule_support(max_rules,pat,max_delay): * interface. An active monitor interface behaves like a normal monitor * interface, but gets added to the driver. It ensures that incoming * unicast packets directed at the configured interface address get ACKed. +* @NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE: This driver supports dynamic + * channel bandwidth change (e.g., HT 20 <-> 40 MHz channel) during the + * lifetime of a BSS. + * @NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES: This device adds a DS Parameter + * Set IE to probe requests. + * @NL80211_FEATURE_WFA_TPC_IE_IN_PROBES: This device adds a WFA TPC Report IE + * to probe requests. + * @NL80211_FEATURE_QUIET: This device, in client mode, supports Quiet Period + * requests sent to it by an AP. + * @NL80211_FEATURE_TX_POWER_INSERTION: This device is capable of inserting the + * current tx power value into the TPC Report IE in the spectrum + * management TPC Report action frame, and in the Radio Measurement Link + * Measurement Report action frame. + * @NL80211_FEATURE_ACKTO_ESTIMATION: This driver supports dynamic ACK timeout + * estimation (dynack). %NL80211_ATTR_WIPHY_DYN_ACK flag attribute is used + * to enable dynack. + * @NL80211_FEATURE_STATIC_SMPS: Device supports static spatial + * multiplexing powersave, ie. can turn off all but one chain + * even on HT connections that should be using more chains. + * @NL80211_FEATURE_DYNAMIC_SMPS: Device supports dynamic spatial + * multiplexing powersave, ie. can turn off all but one chain + * and then wake the rest up as required after, for example, + * rts/cts handshake. + * @NL80211_FEATURE_SUPPORTS_WMM_ADMISSION: the device supports setting up WMM + * TSPEC sessions (TID aka TSID 0-7) with the %NL80211_CMD_ADD_TX_TS + * command. Standard IEEE 802.11 TSPEC setup is not yet supported, it + * needs to be able to handle Block-Ack agreements and other things. + * @NL80211_FEATURE_MAC_ON_CREATE: Device supports configuring + * the vif's MAC address upon creation. + * See 'macaddr' field in the vif_params (cfg80211.h). + * @NL80211_FEATURE_TDLS_CHANNEL_SWITCH: Driver supports channel switching when + * operating as a TDLS peer. + * @NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR: This device/driver supports using a + * random MAC address during scan (if the device is unassociated); the + * %NL80211_SCAN_FLAG_RANDOM_ADDR flag may be set for scans and the MAC + * address mask/value will be used. + * @NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR: This device/driver supports + * using a random MAC address for every scan iteration during scheduled + * scan (while not associated), the %NL80211_SCAN_FLAG_RANDOM_ADDR may + * be set for scheduled scan and the MAC address mask/value will be used. + * @NL80211_FEATURE_ND_RANDOM_MAC_ADDR: This device/driver supports using a + * random MAC address for every scan iteration during "net detect", i.e. + * scan in unassociated WoWLAN, the %NL80211_SCAN_FLAG_RANDOM_ADDR may + * be set for scheduled scan and the MAC address mask/value will be used. + */ +""" +NL80211_FEATURE_SK_TX_STATUS = 1<<0 +NL80211_FEATURE_HT_IBSS = 1<<1 +NL80211_FEATURE_INACTIVITY_TIMER = 1<<2 +NL80211_FEATURE_CELL_BASE_REG_HINTS = 1<<3 +NL80211_FEATURE_P2P_DEVICE_NEEDS_CHANNEL = 1<<4 +NL80211_FEATURE_SAE = 1<<5 +NL80211_FEATURE_LOW_PRIORITY_SCAN = 1<<6 +NL80211_FEATURE_SCAN_FLUSH = 1<<7 +NL80211_FEATURE_AP_SCAN = 1<<8 +NL80211_FEATURE_VIF_TXPOWER = 1<<9 +NL80211_FEATURE_NEED_OBSS_SCAN = 1<<10 +NL80211_FEATURE_P2P_GO_CTWIN = 1<<11 +NL80211_FEATURE_P2P_GO_OPPPS = 1<<12 +# bit 13 is reserved +NL80211_FEATURE_ADVERTISE_CHAN_LIMITS = 1<<14 +NL80211_FEATURE_FULL_AP_CLIENT_STATE = 1<<15 +NL80211_FEATURE_USERSPACE_MPM = 1<<16 +NL80211_FEATURE_ACTIVE_MONITOR = 1<<17 +#### new in kernel v 4 +NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE = 1<<18 +NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES = 1<<19 +NL80211_FEATURE_WFA_TPC_IE_IN_PROBES = 1<<20 +NL80211_FEATURE_QUIET = 1<<21 +NL80211_FEATURE_TX_POWER_INSERTION = 1<<22 +NL80211_FEATURE_ACKTO_ESTIMATION = 1<<23 +NL80211_FEATURE_STATIC_SMPS = 1<<24 +NL80211_FEATURE_DYNAMIC_SMPS = 1<<25 +NL80211_FEATURE_SUPPORTS_WMM_ADMISSION = 1<<26 +NL80211_FEATURE_MAC_ON_CREATE = 1<<27 +NL80211_FEATURE_TDLS_CHANNEL_SWITCH = 1<<28 +NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR = 1<<29 +NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR = 1<<30 +NL80211_FEATURE_ND_RANDOM_MAC_ADDR = 1<<31 + +""" +new in kernel v 4 +/** + * enum nl80211_ext_feature_index - bit index of extended features. + * @NL80211_EXT_FEATURE_VHT_IBSS: This driver supports IBSS with VHT datarates. + * + * @NUM_NL80211_EXT_FEATURES: number of extended features. + * @MAX_NL80211_EXT_FEATURES: highest extended feature index. */ """ -NL80211_FEATURE_SK_TX_STATUS = 1<<0 -NL80211_FEATURE_HT_IBSS = 1<<1 -NL80211_FEATURE_INACTIVITY_TIMER = 1<<2 -NL80211_FEATURE_CELL_BASE_REG_HINTS = 1<<3 -NL80211_FEATURE_P2P_DEVICE_NEEDS_CHANNEL = 1<<4 -NL80211_FEATURE_SAE = 1<<5 -NL80211_FEATURE_LOW_PRIORITY_SCAN = 1<<6 -NL80211_FEATURE_SCAN_FLUSH = 1<<7 -NL80211_FEATURE_AP_SCAN = 1<<8 -NL80211_FEATURE_VIF_TXPOWER = 1<<9 -NL80211_FEATURE_NEED_OBSS_SCAN = 1<<10 -NL80211_FEATURE_P2P_GO_CTWIN = 1<<11 -NL80211_FEATURE_P2P_GO_OPPPS = 1<<12 -# bit 13 is reserved -NL80211_FEATURE_ADVERTISE_CHAN_LIMITS = 1<<14 -NL80211_FEATURE_FULL_AP_CLIENT_STATE = 1<<15 -NL80211_FEATURE_USERSPACE_MPM = 1<<16 -NL80211_FEATURE_ACTIVE_MONITOR = 1<<17 + +NL80211_EXT_FEATURE_VHT_IBSS = 0 +# /* add new features before the definition below */ +NL80211_EXT_FEATURES_MAX = NL80211_EXT_FEATURE_VHT_IBSS """ /** @@ -3344,11 +3740,21 @@ def dot11_nl80211_coalesce_rule_support(max_rules,pat,max_delay): * dangerous because will destroy stations performance as a lot of frames * will be lost while scanning off-channel, therefore it must be used only * when really needed + * @NL80211_SCAN_FLAG_RANDOM_ADDR: use a random MAC address for this scan (or + * for scheduled scan: a different one for every scan iteration). When the + * flag is set, depending on device capabilities the @NL80211_ATTR_MAC and + * @NL80211_ATTR_MAC_MASK attributes may also be given in which case only + * the masked bits will be preserved from the MAC address and the remainder + * randomised. If the attributes are not given full randomisation (46 bits, + * locally administered 1, multicast 0) is assumed. + * This flag must not be requested when the feature isn't supported, check + * the nl80211 feature flags for the device. */ """ NL80211_SCAN_FLAG_LOW_PRIORITY = 1<<0 NL80211_SCAN_FLAG_FLUSH = 1<<1 NL80211_SCAN_FLAG_AP = 1<<2 +NL80211_SCAN_FLAG_RANDOM_ADDR = 1<<3 # new in kernel v 4 """ /** @@ -3368,6 +3774,24 @@ def dot11_nl80211_coalesce_rule_support(max_rules,pat,max_delay): NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED = 0 NL80211_ACL_POLICY_DENY_UNLESS_LISTED = 1 +""" +new in kernel v 4 +/** + * enum nl80211_smps_mode - SMPS mode + * + * Requested SMPS mode (for AP mode) + * + * @NL80211_SMPS_OFF: SMPS off (use all antennas). + * @NL80211_SMPS_STATIC: static SMPS (use a single antenna) + * @NL80211_SMPS_DYNAMIC: dynamic smps (start with a single antenna and + * turn on other antennas after CTS/RTS). + */ +""" +NL80211_SMPS_OFF = 0 +NL80211_SMPS_STATIC = 1 +NL80211_SMPS_DYNAMIC = 2 +NL80211_SMPS_MAX = NL80211_SMPS_DYNAMIC + """ /** * enum nl80211_radar_event - type of radar event for DFS operation @@ -3449,4 +3873,68 @@ def dot11_nl80211_coalesce_rule_support(max_rules,pat,max_delay): * @NL80211_RXMGMT_FLAG_ANSWERED: frame was answered by device/driver. */ """ -NL80211_RXMGMT_FLAG_ANSWERED = 1<<0 \ No newline at end of file +NL80211_RXMGMT_FLAG_ANSWERED = 1<<0 + +""" +new in kernel v 4 +/* + * If this flag is unset, the lower 24 bits are an OUI, if set + * a Linux nl80211 vendor ID is used (no such IDs are allocated + * yet, so that's not valid so far) + */ +""" +NL80211_VENDOR_ID_IS_LINUX = 0x80000000 + +""" +new in kernel v 4 +/** + * struct nl80211_vendor_cmd_info - vendor command data + * @vendor_id: If the %NL80211_VENDOR_ID_IS_LINUX flag is clear, then the + * value is a 24-bit OUI; if it is set then a separately allocated ID + * may be used, but no such IDs are allocated yet. New IDs should be + * added to this file when needed. + * @subcmd: sub-command ID for the command + */ +""" +#struct nl80211_vendor_cmd_info { +# __u32 vendor_id; +# __u32 subcmd; +#}; + +""" +new in kernel v 4 +/** + * enum nl80211_tdls_peer_capability - TDLS peer flags. + * + * Used by tdls_mgmt() to determine which conditional elements need + * to be added to TDLS Setup frames. + * + * @NL80211_TDLS_PEER_HT: TDLS peer is HT capable. + * @NL80211_TDLS_PEER_VHT: TDLS peer is VHT capable. + * @NL80211_TDLS_PEER_WMM: TDLS peer is WMM capable. + */ +""" +NL80211_TDLS_PEER_HT = 1<<0 +NL80211_TDLS_PEER_VHT = 1<<1 +NL80211_TDLS_PEER_WMM = 1<<2 + +""" +new in kernel v 4 +/** + * enum nl80211_sched_scan_plan - scanning plan for scheduled scan + * @__NL80211_SCHED_SCAN_PLAN_INVALID: attribute number 0 is reserved + * @NL80211_SCHED_SCAN_PLAN_INTERVAL: interval between scan iterations. In + * seconds (u32). + * @NL80211_SCHED_SCAN_PLAN_ITERATIONS: number of scan iterations in this + * scan plan (u32). The last scan plan must not specify this attribute + * because it will run infinitely. A value of zero is invalid as it will + * make the scan plan meaningless. + * @NL80211_SCHED_SCAN_PLAN_MAX: highest scheduled scan plan attribute number + * currently defined + * @__NL80211_SCHED_SCAN_PLAN_AFTER_LAST: internal use + */ +""" +__NL80211_SCHED_SCAN_PLAN_INVALID = 0 +NL80211_SCHED_SCAN_PLAN_INTERVAL = 1 +NL80211_SCHED_SCAN_PLAN_ITERATIONS = 2 +NL80211_SCHED_SCAN_PLAN_MAX = NL80211_SCHED_SCAN_PLAN_ITERATIONS \ No newline at end of file diff --git a/pyric/nlhelp/attributes.help b/pyric/nlhelp/attributes.help index aeab1c5..52819f0 100644 --- a/pyric/nlhelp/attributes.help +++ b/pyric/nlhelp/attributes.help @@ -1,5 +1,6 @@ # attributes.help (stored in json format) # Automatically generated 2016-04-17T11:06:58.35097 from nl80211.h +# Additions for kernel version 4 added 2016-06-25T15:18:00.0 -{"@NL80211_ATTR_PMKID": {"cmds": [], "type": "unspec", "desc": "PMK material for PMKSA caching"}, "@NL80211_ATTR_WIPHY": {"cmds": [], "type": "unspec", "desc": "index of wiphy to operate on /sys/class/ieee80211//index"}, "@NL80211_ATTR_SCAN_SUPP_RATES": {"cmds": [], "type": "unspec", "desc": "rates per to be advertised as supported in scan nested array attribute containing an entry for each band, with the entry being a list of supported rates as defined by IEEE 802.11 7.3.2.2 but without the length restriction (at most %NL80211_MAX_SUPP_RATES)."}, "@NL80211_ATTR_AKM_SUITES": {"cmds": [], "type": "unspec", "desc": "Used with CONNECT indicate which key management algorithm(s) to use (an array of u32)."}, "@NL80211_ATTR_SCAN_FLAGS": {"cmds": [], "type": "unspec", "desc": "scan request control flags "}, "@NL80211_ATTR_IFTYPE": {"cmds": [], "type": "unspec", "desc": "type of virtual interface"}, "@NL80211_ATTR_MAX_SCAN_IE_LEN": {"cmds": [], "type": "unspec", "desc": "maximum length of information elements that can be added to a scan request"}, "@NL80211_ATTR_FREQ_BEFORE": {"cmds": [], "type": "unspec", "desc": "A channel which has suffered a regulatory change due to considerations from a beacon hint. This attribute reflects the state of the channel _before_ the beacon hint processing. This attributes consists of a nested attribute containing NL80211_FREQUENCY_ATTR_*"}, "@NL80211_ATTR_P2P_OPPPS": {"cmds": [], "type": "unspec", "desc": "P2P GO opportunistic PS START_AP and SET_BSS commands. This can have the values 0 or 1; if not given in START_AP 0 is assumed, if not given in SET_BSS no change is made."}, "@NL80211_ATTR_IE_ASSOC_RESP": {"cmds": ["%NL80211_CMD_NEW_BEACON", "%NL80211_CMD_SET_BEACON"], "type": "unspec", "desc": "Information element Response frames. This is used with %NL80211_CMD_NEW_BEACON and %NL80211_CMD_SET_BEACON to provide extra IEs (e.g., WPS/P2P IE) into (Re)Association Response frames when the driver (or firmware) replies to (Re)Association Request frames."}, "@NL80211_ATTR_MPATH_NEXT_HOP": {"cmds": [], "type": "unspec", "desc": "MAC address of the next hop for a mesh path"}, "@NL80211_ATTR_RXMGMT_FLAGS": {"cmds": [], "type": "unspec", "desc": "flags for nl80211_send_mgmt As specified in the &enum nl80211_rxmgmt_flags."}, "@NL80211_ATTR_MAX_CRIT_PROT_DURATION": {"cmds": [], "type": "unspec", "desc": "duration in milliseconds in which the connection should have increased reliability (u16)."}, "@NL80211_ATTR_STA_LISTEN_INTERVAL": {"cmds": [], "type": "unspec", "desc": "listen interval as defined by IEEE 802.11 7.3.1.6 (u16)."}, "@NL80211_ATTR_FRAME_TYPE": {"cmds": [], "type": "unspec", "desc": "A u16 indicating the frame type @NL80211_CMD_REGISTER_FRAME command."}, "@NL80211_ATTR_REG_RULES": {"cmds": [], "type": "unspec", "desc": "a nested array of regulatory domain regulatory rules."}, "@NL80211_ATTR_STATUS_CODE": {"cmds": [], "type": "unspec", "desc": "StatusCode for the event (u16)"}, "@NL80211_ATTR_VHT_CAPABILITY": {"cmds": [], "type": "unspec", "desc": "VHT Capability information element association request when used with NL80211_CMD_NEW_STATION)"}, "@NL80211_ATTR_CRIT_PROT_ID": {"cmds": [], "type": "unspec", "desc": "critical protocol identifier requiring increased reliability, see &enum nl80211_crit_proto_id (u16)."}, "@NL80211_ATTR_TDLS_ACTION": {"cmds": [], "type": "unspec", "desc": "Low level TDLS action code request, link setup confirm, link teardown, etc.). Values are described in the TDLS (802.11z) specification."}, "@NL80211_ATTR_RESP_IE": {"cmds": [], "type": "unspec", "desc": " sent by peer, for ROAM and successful CONNECT events."}, "@NL80211_ATTR_WDEV": {"cmds": [], "type": "unspec", "desc": "wireless device identifier that don't have a netdev (u64)"}, "@NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS": {"cmds": [], "type": "unspec", "desc": "number of SSIDs you can scan with a single scheduled scan request, a wiphy attribute."}, "@NL80211_ATTR_CONTROL_PORT_ETHERTYPE": {"cmds": [], "type": "unspec", "desc": "A 16 ethertype that will be used for key negotiation. It can be specified with the associate and connect commands. If it is not specified, the value defaults to 0x888E (PAE, 802.1X). This attribute is also used as a flag in the wiphy information to indicate that protocols other than PAE are supported."}, "@NL80211_ATTR_KEY_TYPE": {"cmds": [], "type": "unspec", "desc": "Key Type"}, "@NL80211_ATTR_ROAM_SUPPORT": {"cmds": [], "type": "unspec", "desc": "Indicates whether the firmware is capable of roaming to another AP in the same ESS if the signal lever is low."}, "@NL80211_ATTR_TX_NO_CCK_RATE": {"cmds": ["%NL80211_CMD_TRIGGER_SCAN", "%NL80211_CMD_FRAME"], "type": "unspec", "desc": "Indicates whether to use CCK rate or not for management frames transmission. In order to avoid p2p probe/action frames are being transmitted at CCK rate in 2GHz band, the user space applications use this attribute. This attribute is used with %NL80211_CMD_TRIGGER_SCAN and %NL80211_CMD_FRAME commands."}, "@NL80211_ATTR_MGMT_SUBTYPE": {"cmds": ["%NL80211_CMD_SET_MGMT_EXTRA_IE"], "type": "unspec", "desc": "Management frame subtype for %NL80211_CMD_SET_MGMT_EXTRA_IE."}, "@NL80211_ATTR_RX_FRAME_TYPES": {"cmds": [], "type": "unspec", "desc": "wiphy capability attribute nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing information about which frame types can be registered for RX."}, "@NL80211_ATTR_BSS_BASIC_RATES": {"cmds": [], "type": "unspec", "desc": "basic rates rates in format defined by IEEE 802.11 7.3.2.2 but without the length restriction (at most %NL80211_MAX_SUPP_RATES)."}, "@NL80211_ATTR_IE_PROBE_RESP": {"cmds": ["%NL80211_CMD_NEW_BEACON", "%NL80211_CMD_SET_BEACON"], "type": "unspec", "desc": "Information element This is used with %NL80211_CMD_NEW_BEACON and %NL80211_CMD_SET_BEACON to provide extra IEs (e.g., WPS/P2P IE) into Probe Response frames when the driver (or firmware) replies to Probe Request frames."}, "@NL80211_ATTR_SUPPORTED_IFTYPES": {"cmds": [], "type": "unspec", "desc": "nested attribute containing all supported interface types, each a flag attribute with the number of the interface mode."}, "@NL80211_ATTR_IFINDEX": {"cmds": [], "type": "unspec", "desc": "network interface index of the device to operate on"}, "@NL80211_ATTR_EXT_CAPA_MASK": {"cmds": [], "type": "unspec", "desc": "Extended capabilities that the kernel driver has set in the %NL80211_ATTR_EXT_CAPA value, for multibit fields."}, "@NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION": {"cmds": [], "type": "unspec", "desc": "Device attribute that specifies the maximum duration that can be requested with the remain-on-channel operation, in milliseconds, u32."}, "@NL80211_ATTR_REQ_IE": {"cmds": [], "type": "unspec", "desc": " sent out by the card, for ROAM and successful CONNECT events."}, "@NL80211_ATTR_REKEY_DATA": {"cmds": [], "type": "unspec", "desc": "nested attribute containing the information necessary for GTK rekeying in the device, see &enum nl80211_rekey_data."}, "@NL80211_ATTR_HT_CAPABILITY": {"cmds": [], "type": "unspec", "desc": "HT Capability information element association request when used with NL80211_CMD_NEW_STATION)"}, "@NL80211_ATTR_KEY_DATA": {"cmds": [], "type": "unspec", "desc": " 16 bytes encryption key followed by 8 bytes each for TX and RX MIC keys"}, "@NL80211_ATTR_KEY_DEFAULT": {"cmds": [], "type": "unspec", "desc": "Flag attribute indicating the key is default key"}, "@NL80211_ATTR_MESH_SETUP": {"cmds": [], "type": "unspec", "desc": "Optional mesh setup parameters changed once the mesh is active."}, "@NL80211_ATTR_PMKSA_CANDIDATE": {"cmds": [], "type": "unspec", "desc": "Nested attribute containing the PMKSA caching candidate information, see &enum nl80211_pmksa_candidate_attr."}, "@NL80211_ATTR_WIPHY_RTS_THRESHOLD": {"cmds": [], "type": "unspec", "desc": "RTS threshold larger than or equal to this use RTS/CTS handshake); allowed range: 0..65536, disable with (u32)-1; dot11RTSThreshold; u32"}, "@NL80211_ATTR_DTIM_PERIOD": {"cmds": [], "type": "unspec", "desc": "DTIM period for beaconing"}, "@NL80211_ATTR_MAX_NUM_SCAN_SSIDS": {"cmds": [], "type": "unspec", "desc": "number of SSIDs you can scan with a single scan request, a wiphy attribute."}, "@NL80211_ATTR_MESH_CONFIG": {"cmds": [], "type": "unspec", "desc": "Mesh configuration parameters containing attributes from &enum nl80211_meshconf_params."}, "@NL80211_ATTR_COOKIE": {"cmds": [], "type": "unspec", "desc": "Generic 64"}, "@NL80211_ATTR_MAX_MATCH_SETS": {"cmds": [], "type": "unspec", "desc": "maximum number of sets that can be used with @NL80211_ATTR_SCHED_SCAN_MATCH, a wiphy attribute."}, "@NL80211_ATTR_CH_SWITCH_COUNT": {"cmds": [], "type": "unspec", "desc": "u32 attribute specifying the number of TBTT until the channel switch event."}, "@NL80211_ATTR_OFFCHANNEL_TX_OK": {"cmds": [], "type": "unspec", "desc": "For management frame TX transmitted on another channel when the channel given doesn't match the current channel. If the current channel doesn't match and this flag isn't set, the frame will be rejected. This is also used as an nl80211 capability flag."}, "@NL80211_ATTR_SUPPORT_MESH_AUTH": {"cmds": [], "type": "unspec", "desc": "Currently allows auth frames in a mesh to be passed to userspace for processing via the @NL80211_MESH_SETUP_USERSPACE_AUTH flag."}, "@NL80211_ATTR_REASON_CODE": {"cmds": ["%NL80211_CMD_DISASSOCIATE"], "type": "unspec", "desc": "ReasonCode for %NL80211_CMD_DISASSOCIATE, u16"}, "@NL80211_ATTR_STA_WME": {"cmds": [], "type": "unspec", "desc": "Nested attribute containing the wme configuration of the station, see &enum nl80211_sta_wme_attr."}, "@NL80211_ATTR_AP_ISOLATE": {"cmds": [], "type": "unspec", "desc": " connected to this BSS."}, "@NL80211_ATTR_TESTDATA": {"cmds": [], "type": "unspec", "desc": "Testmode data blob We recommend using nested, driver-specific attributes within this."}, "@NL80211_ATTR_CIPHER_SUITES_PAIRWISE": {"cmds": [], "type": "unspec", "desc": "For crypto settings for connect or other commands, indicates which pairwise cipher suites are used"}, "@NL80211_ATTR_BSS_CTS_PROT": {"cmds": [], "type": "unspec", "desc": "whether CTS protection is enabled "}, "@NL80211_ATTR_BSS_SHORT_SLOT_TIME": {"cmds": [], "type": "unspec", "desc": "whether short slot time enabled (u8, 0 or 1)"}, "@NL80211_ATTR_PEER_AID": {"cmds": [], "type": "unspec", "desc": "Association ID for the peer TDLS station This is similar to @NL80211_ATTR_STA_AID but with a difference of being allowed to be used with the first @NL80211_CMD_SET_STATION command to update a TDLS peer STA entry."}, "@NL80211_ATTR_SPLIT_WIPHY_DUMP": {"cmds": [], "type": "unspec", "desc": "flag attribute receiving the data for a single wiphy split across multiple messages, given with wiphy dump message"}, "@NL80211_ATTR_SUPPORT_IBSS_RSN": {"cmds": [], "type": "unspec", "desc": "The device supports IBSS RSN means support for per-station GTKs."}, "@NL80211_ATTR_IE": {"cmds": ["%NL80211_CMD_SET_MGMT_EXTRA_IE"], "type": "unspec", "desc": "Information element %NL80211_CMD_SET_MGMT_EXTRA_IE)."}, "@NL80211_ATTR_AUTH_TYPE": {"cmds": [], "type": "unspec", "desc": "AuthenticationType represented as a u32"}, "@NL80211_ATTR_BSS": {"cmds": [], "type": "unspec", "desc": "scan result BSS"}, "@NL80211_ATTR_PROBE_RESP_OFFLOAD": {"cmds": [], "type": "unspec", "desc": "Indicates that the HW responds to probe requests while operating in AP-mode. This attribute holds a bitmap of the supported protocols for offloading (see &enum nl80211_probe_resp_offload_support_attr)."}, "@NL80211_ATTR_STA_SUPPORTED_CHANNELS": {"cmds": [], "type": "unspec", "desc": "array of supported channels"}, "@NL80211_ATTR_KEY_SEQ": {"cmds": [], "type": "unspec", "desc": "transmit key sequence number CCMP keys, each six bytes in little endian"}, "@NL80211_ATTR_4ADDR": {"cmds": [], "type": "unspec", "desc": "Use 4"}, "@NL80211_ATTR_TIMED_OUT": {"cmds": ["%NL80211_CMD_AUTHENTICATE"], "type": "unspec", "desc": "a flag indicating than an operation timed out is used, e.g., with %NL80211_CMD_AUTHENTICATE event"}, "@NL80211_ATTR_UNSPEC": {"cmds": [], "type": "unspec", "desc": "unspecified attribute to catch errors"}, "@NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT": {"cmds": [], "type": "unspec", "desc": "When included along with %NL80211_ATTR_CONTROL_PORT_ETHERTYPE, indicates that the custom ethertype frames used for key negotiation must not be encrypted."}, "@NL80211_ATTR_BEACON_TAIL": {"cmds": [], "type": "unspec", "desc": "portion of the beacon after the TIM IE"}, "@NL80211_ATTR_REG_INITIATOR": {"cmds": [], "type": "unspec", "desc": "indicates who requested the regulatory domain currently in effect. This could be any of the %NL80211_REGDOM_SET_BY_*"}, "@NL80211_ATTR_WIPHY_TX_POWER_LEVEL": {"cmds": [], "type": "unspec", "desc": "Transmit power level in signed mBm units This is used in association with @NL80211_ATTR_WIPHY_TX_POWER_SETTING for non-automatic settings."}, "@NL80211_ATTR_ACL_POLICY": {"cmds": [], "type": "unspec", "desc": "ACL policy carried in a u32 attribute"}, "@NL80211_ATTR_SAE_DATA": {"cmds": [], "type": "unspec", "desc": "SAE elements in Authentication frames with the Authentication transaction sequence number field."}, "@NL80211_ATTR_WIPHY_RETRY_LONG": {"cmds": [], "type": "unspec", "desc": "TX retry limit for frames whose length is greater than the RTS threshold; allowed range: 1..255; dot11ShortLongLimit; u8"}, "@NL80211_ATTR_INTERFACE_COMBINATIONS": {"cmds": [], "type": "unspec", "desc": "Nested attribute listing the supported interface combinations. In each nested item, it contains attributes defined in &enum nl80211_if_combination_attrs."}, "@NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX": {"cmds": [], "type": "unspec", "desc": "Bitmap of antennas which are available for configuration as TX antennas via the above parameters."}, "@NL80211_ATTR_KEY_DEFAULT_MGMT": {"cmds": [], "type": "unspec", "desc": "Flag attribute indicating the key is the default management key"}, "@NL80211_ATTR_BSS_HT_OPMODE": {"cmds": [], "type": "unspec", "desc": "HT operation mode "}, "@NL80211_ATTR_BEACON_HEAD": {"cmds": [], "type": "unspec", "desc": "portion of the beacon before the TIM IE"}, "@NL80211_ATTR_KEYS": {"cmds": [], "type": "unspec", "desc": "array of keys for static WEP keys for connect and join_ibss(), key information is in a nested attribute each with %NL80211_KEY_* sub-attributes"}, "@NL80211_ATTR_MDID": {"cmds": [], "type": "unspec", "desc": "Mobility Domain Identifier"}, "@NL80211_ATTR_STA_PLINK_ACTION": {"cmds": [], "type": "unspec", "desc": "action to perform on the mesh peer link (see &enum nl80211_plink_action)."}, "@NL80211_ATTR_ACK": {"cmds": [], "type": "unspec", "desc": "Flag attribute indicating that the frame was acknowledged by the recipient."}, "@NL80211_ATTR_WIPHY_FREQ": {"cmds": [], "type": "unspec", "desc": "frequency of the selected channel in MHz defines the channel together with the (deprecated) %NL80211_ATTR_WIPHY_CHANNEL_TYPE attribute or the attributes %NL80211_ATTR_CHANNEL_WIDTH and if needed %NL80211_ATTR_CENTER_FREQ1 and %NL80211_ATTR_CENTER_FREQ2"}, "@NL80211_ATTR_WPA_VERSIONS": {"cmds": [], "type": "unspec", "desc": "Used with CONNECT indicate which WPA version(s) the AP we want to associate with is using (a u32 with flags from &enum nl80211_wpa_versions)."}, "@NL80211_ATTR_SUPPORT_AP_UAPSD": {"cmds": [], "type": "unspec", "desc": "the device supports uapsd when working as AP."}, "@NL80211_ATTR_SCHED_SCAN_MATCH": {"cmds": [], "type": "unspec", "desc": "Nested attribute with one or more sets of attributes to match during scheduled scans. Only BSSs that match any of the sets will be reported. These are pass-thru filter rules. For a match to succeed, the BSS must match all attributes of a set. Since not every hardware supports matching all types of attributes, there is no guarantee that the reported BSSs are fully complying with the match sets and userspace needs to be able to ignore them by itself. Thus, the implementation is somewhat hardware-dependent, but this is only an optimization and the userspace application needs to handle all the non-filtered results anyway. If the match attributes don't make sense when combined with the values passed in @NL80211_ATTR_SCAN_SSIDS (eg. if an SSID is included in the probe request, but the match attributes will never let it go through), -EINVAL may be returned. If ommited, no filtering is done."}, "@NL80211_ATTR_LOCAL_MESH_POWER_MODE": {"cmds": [], "type": "unspec", "desc": "local mesh STA link defined in &enum nl80211_mesh_power_mode."}, "@NL80211_ATTR_SCHED_SCAN_INTERVAL": {"cmds": [], "type": "unspec", "desc": "Interval between scheduled scan cycles, in msecs."}, "@NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED": {"cmds": [], "type": "unspec", "desc": "indicates capabilities, the supported WoWLAN triggers"}, "@NL80211_ATTR_REG_TYPE": {"cmds": [], "type": "unspec", "desc": "indicates the type of the regulatory domain currently set. This can be one of the nl80211_reg_type (%NL80211_REGDOM_TYPE_*)"}, "@NL80211_ATTR_SUPPORTED_COMMANDS": {"cmds": [], "type": "unspec", "desc": "wiphy attribute that specifies an array of command numbers (i.e. a mapping index to command number) that the driver for the given wiphy supports."}, "@NL80211_ATTR_SCAN_FREQUENCIES": {"cmds": [], "type": "unspec", "desc": "nested attribute with frequencies "}, "@NL80211_ATTR_IFNAME": {"cmds": [], "type": "unspec", "desc": "network interface name"}, "@NL80211_ATTR_CSA_IES": {"cmds": [], "type": "unspec", "desc": "Nested set of attributes containing the IE information for the time while performing a channel switch."}, "@NL80211_ATTR_CONTROL_PORT": {"cmds": ["%NL80211_CMD_ASSOCIATE"], "type": "unspec", "desc": "A flag indicating whether user space controls IEEE 802.1X port, i.e., sets/clears %NL80211_STA_FLAG_AUTHORIZED, in station mode. If the flag is included in %NL80211_CMD_ASSOCIATE request, the driver will assume that the port is unauthorized until authorized by user space. Otherwise, port is marked authorized by default in station mode."}, "@NL80211_ATTR_CSA_C_OFF_PRESP": {"cmds": [], "type": "unspec", "desc": "Offset of the channel switch counter field in the probe response (%NL80211_ATTR_PROBE_RESP)."}, "@NL80211_ATTR_CIPHERS_PAIRWISE": {"cmds": [], "type": "unspec", "desc": "Used with CONNECT to indicate which unicast key ciphers will be used with the connection (an array of u32)."}, "@NL80211_ATTR_WIPHY_ANTENNA_RX": {"cmds": [], "type": "unspec", "desc": "Bitmap of allowed antennas for receiving This can be used to mask out antennas which are not attached or should not be used for receiving. If an antenna is not selected in this bitmap the hardware should not be configured to receive on this antenna. For a more detailed description see @NL80211_ATTR_WIPHY_ANTENNA_TX."}, "@NL80211_ATTR_DISCONNECTED_BY_AP": {"cmds": [], "type": "unspec", "desc": "A flag indicating that the DISCONNECT event was due to the AP disconnecting the station, and not due to a local disconnect request."}, "@NL80211_ATTR_INACTIVITY_TIMEOUT": {"cmds": [], "type": "unspec", "desc": "timeout value in seconds used by the drivers which has MLME in firmware and does not have support to report per station tx/rx activity to free up the staion entry from the list. This needs to be used when the driver advertises the capability to timeout the stations."}, "@NL80211_ATTR_TDLS_SUPPORT": {"cmds": [], "type": "unspec", "desc": "A flag indicating the device can operate as a TDLS peer sta."}, "@NL80211_ATTR_CENTER_FREQ2": {"cmds": [], "type": "unspec", "desc": "Center frequency of the second part of the channel, used only for 80+80 MHz bandwidth"}, "@NL80211_ATTR_STA_EXT_CAPABILITY": {"cmds": [], "type": "unspec", "desc": "Station extended capabilities are advertised to the driver, e.g., to enable TDLS off channel operations and PU-APSD."}, "@NL80211_ATTR_STA_PLINK_STATE": {"cmds": [], "type": "unspec", "desc": "The state of a mesh peer link as defined in &enum nl80211_plink_state. Used when userspace is driving the peer link management state machine. @NL80211_MESH_SETUP_USERSPACE_AMPE or @NL80211_MESH_SETUP_USERSPACE_MPM must be enabled."}, "@NL80211_ATTR_MAC": {"cmds": [], "type": "unspec", "desc": "MAC address "}, "@NL80211_ATTR_CSA_C_OFF_BEACON": {"cmds": [], "type": "unspec", "desc": "Offset of the channel switch counter field in the beacons tail (%NL80211_ATTR_BEACON_TAIL)."}, "@NL80211_ATTR_WIPHY_NAME": {"cmds": [], "type": "unspec", "desc": "wiphy name "}, "@NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX": {"cmds": [], "type": "unspec", "desc": "Bitmap of antennas which are available for configuration as RX antennas via the above parameters."}, "@NL80211_ATTR_CONN_FAILED_REASON": {"cmds": [], "type": "unspec", "desc": "The reason for which AP has rejected the connection request from a station. nl80211_connect_failed_reason enum has different reasons of connection failure."}, "@NL80211_ATTR_CENTER_FREQ1": {"cmds": [], "type": "unspec", "desc": "Center frequency of the first part of the channel, used for anything but 20 MHz bandwidth"}, "@NL80211_ATTR_FRAME": {"cmds": [], "type": "unspec", "desc": "frame data and body, but not FCS; used, e.g., with NL80211_CMD_AUTHENTICATE and NL80211_CMD_ASSOCIATE events"}, "@NL80211_ATTR_SOFTWARE_IFTYPES": {"cmds": [], "type": "unspec", "desc": "Nested attribute %NL80211_ATTR_SUPPORTED_IFTYPES) containing the interface types that are managed in software: interfaces of these types aren't subject to any restrictions in their number or combinations."}, "@NL80211_ATTR_PID": {"cmds": [], "type": "unspec", "desc": "Process ID of a network namespace"}, "@NL80211_ATTR_USE_MFP": {"cmds": ["%NL80211_CMD_ASSOCIATE", "%NL80211_CMD_CONNECT"], "type": "unspec", "desc": "Whether management frame protection used for the association (&enum nl80211_mfp, represented as a u32); this attribute can be used with %NL80211_CMD_ASSOCIATE and %NL80211_CMD_CONNECT requests"}, "@NL80211_ATTR_PS_STATE": {"cmds": [], "type": "unspec", "desc": "powersave state"}, "@NL80211_ATTR_PREV_BSSID": {"cmds": [], "type": "unspec", "desc": "previous BSSID commands to specify using a reassociate frame"}, "@NL80211_ATTR_DISABLE_HT": {"cmds": [], "type": "unspec", "desc": " Force HT capable interfaces to disable this feature. Currently, only supported in mac80211 drivers."}, "@NL80211_ATTR_TX_RATES": {"cmds": ["%NL80211_CMD_SET_TX_BITRATE_MASK"], "type": "unspec", "desc": "Nested set of attributes (enum nl80211_tx_rate_attributes) describing TX rates per band. The enum nl80211_band value is used as the index (nla_type() of the nested data. If a band is not included, it will be configured to allow all rates based on negotiated supported rates information. This attribute is used with %NL80211_CMD_SET_TX_BITRATE_MASK."}, "@NL80211_ATTR_MAC_ADDRS": {"cmds": [], "type": "unspec", "desc": "Array of nested MAC addresses"}, "@NL80211_ATTR_COALESCE_RULE": {"cmds": [], "type": "unspec", "desc": "Coalesce rule information"}, "@NL80211_ATTR_RADAR_EVENT": {"cmds": [], "type": "unspec", "desc": "Type of radar event for notification to userspace contains a value of enum nl80211_radar_event (u32)."}, "@NL80211_ATTR_STA_SUPPORTED_RATES": {"cmds": [], "type": "unspec", "desc": "supported rates rates as defined by IEEE 802.11 7.3.2.2 but without the length restriction (at most %NL80211_MAX_SUPP_RATES)."}, "@NL80211_ATTR_IE_RIC": {"cmds": [], "type": "unspec", "desc": "Resource Information Container Information element"}, "@NL80211_ATTR_STA_FLAGS2": {"cmds": [], "type": "unspec", "desc": "Attribute containing a &struct nl80211_sta_flag_update."}, "@NL80211_ATTR_PRIVACY": {"cmds": [], "type": "unspec", "desc": "Flag attribute that protected APs should be used. This is also used with NEW_BEACON to indicate that the BSS is to use protection."}, "@NL80211_ATTR_WIPHY_COVERAGE_CLASS": {"cmds": [], "type": "unspec", "desc": "Coverage Class as defined by IEEE 802 section 7.3.2.9; dot11CoverageClass; u8"}, "@NL80211_ATTR_BSS_SHORT_PREAMBLE": {"cmds": [], "type": "unspec", "desc": "whether short preamble is enabled (u8, 0 or 1)"}, "@NL80211_ATTR_MCAST_RATE": {"cmds": [], "type": "unspec", "desc": "Multicast tx rate "}, "@NL80211_ATTR_WIPHY_CHANNEL_TYPE": {"cmds": [], "type": "unspec", "desc": "included with NL80211_ATTR_WIPHY_FREQ if HT20 or HT40 are to be used (i.e., HT disabled if not included): NL80211_CHAN_NO_HT = HT not allowed (same as not including) NL80211_CHAN_HT20 = HT20 only NL80211_CHAN_HT40MINUS = secondary channel is below the primary channel NL80211_CHAN_HT40PLUS = secondary channel is above the primary channel This attribute is now deprecated."}, "@NL80211_ATTR_PROBE_RESP": {"cmds": [], "type": "unspec", "desc": "Probe Response template data probe-response frame. The DA field in the 802.11 header is zero-ed out, to be filled by the FW."}, "@NL80211_ATTR_CQM": {"cmds": [], "type": "unspec", "desc": "connection quality monitor configuration in a nested attribute with %NL80211_ATTR_CQM_* sub-attributes."}, "@NL80211_ATTR_DONT_WAIT_FOR_ACK": {"cmds": [], "type": "unspec", "desc": "Used with the driver to not wait for an acknowledgement. Note that due to this, it will also not give a status callback nor return a cookie. This is mostly useful for probe responses to save airtime."}, "@NL80211_ATTR_STA_VLAN": {"cmds": [], "type": "unspec", "desc": "interface index of VLAN interface to move station to, or the AP interface the station was originally added to to."}, "@NL80211_ATTR_FREQ_AFTER": {"cmds": [], "type": "unspec", "desc": "A channel which has suffered a regulatory change due to considerations from a beacon hint. This attribute reflects the state of the channel _after_ the beacon hint processing. This attributes consists of a nested attribute containing NL80211_FREQUENCY_ATTR_*"}, "@NL80211_ATTR_MESH_ID": {"cmds": [], "type": "unspec", "desc": "mesh id "}, "@NL80211_ATTR_DFS_REGION": {"cmds": [], "type": "unspec", "desc": "region for regulatory rules which this country abides to when initiating radiation on DFS channels. A country maps to one DFS region."}, "@NL80211_ATTR_MNTR_FLAGS": {"cmds": [], "type": "unspec", "desc": "flags &enum nl80211_mntr_flags."}, "@NL80211_ATTR_WIPHY_FRAG_THRESHOLD": {"cmds": [], "type": "unspec", "desc": "fragmentation threshold length in octets for frames; allowed range: 256..8000, disable fragmentation with (u32)-1; dot11FragmentationThreshold; u32"}, "@NL80211_ATTR_KEY_CIPHER": {"cmds": [], "type": "unspec", "desc": "key cipher suite section 7.3.2.25.1, e.g. 0x000FAC04)"}, "@NL80211_ATTR_KEY_IDX": {"cmds": [], "type": "unspec", "desc": "key ID "}, "@NL80211_ATTR_P2P_CTWINDOW": {"cmds": [], "type": "unspec", "desc": "P2P GO Client Traffic Window the START_AP and SET_BSS commands"}, "@NL80211_ATTR_TDLS_EXTERNAL_SETUP": {"cmds": ["%NL80211_CMD_TDLS_MGMT", "%NL80211_CMD_TDLS_OPER"], "type": "unspec", "desc": "The TDLS discovery procedures should be performed by sending TDLS packets via %NL80211_CMD_TDLS_MGMT. Otherwise %NL80211_CMD_TDLS_OPER should be used for asking the driver to perform a TDLS operation."}, "@NL80211_ATTR_PROTOCOL_FEATURES": {"cmds": [], "type": "unspec", "desc": "global nl80211 feature flags &enum nl80211_protocol_features, the attribute is a u32."}, "@NL80211_ATTR_MPATH_INFO": {"cmds": ["%NL80211_CMD_GET_MPATH"], "type": "unspec", "desc": "information about a mesh_path info given for %NL80211_CMD_GET_MPATH, nested attribute described at &enum nl80211_mpath_info."}, "@NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN": {"cmds": [], "type": "unspec", "desc": "maximum length of information elements that can be added to a scheduled scan request"}, "@NL80211_ATTR_TDLS_OPERATION": {"cmds": [], "type": "unspec", "desc": "High level TDLS operation &enum nl80211_tdls_operation, represented as a u8."}, "@NL80211_ATTR_FREQ_FIXED": {"cmds": [], "type": "unspec", "desc": "a flag indicating the IBSS should not try to look for other networks on different channels"}, "@NL80211_ATTR_STA_FLAGS": {"cmds": [], "type": "unspec", "desc": "flags &enum nl80211_sta_flags (deprecated, use %NL80211_ATTR_STA_FLAGS2)"}, "@NL80211_ATTR_MAX_NUM_PMKIDS": {"cmds": [], "type": "unspec", "desc": "maximum number of PMKIDs a firmware can cache, a wiphy attribute."}, "@NL80211_ATTR_MAC_ACL_MAX": {"cmds": [], "type": "unspec", "desc": "u32 attribute to advertise the maximum number of MAC addresses that a device can support for MAC ACL"}, "@NL80211_ATTR_STA_AID": {"cmds": [], "type": "unspec", "desc": "Association ID for the station "}, "@NL80211_ATTR_KEY": {"cmds": [], "type": "unspec", "desc": "key information in a nested attribute with %NL80211_KEY_* sub-attributes"}, "@NL80211_ATTR_STA_CAPABILITY": {"cmds": [], "type": "unspec", "desc": "Station capabilities the driver, e.g., to enable TDLS power save (PU-APSD)."}, "@NL80211_ATTR_DEVICE_AP_SME": {"cmds": [], "type": "unspec", "desc": "This u32 attribute may be listed for devices that have AP support to indicate that they have the AP SME integrated with support for the features listed in this attribute, see &enum nl80211_ap_sme_features."}, "@NL80211_ATTR_HIDDEN_SSID": {"cmds": [], "type": "unspec", "desc": "indicates whether SSID is to be hidden from Beacon and Probe Response (when response to wildcard Probe Request); see &enum nl80211_hidden_ssid, represented as a u32"}, "@NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES": {"cmds": [], "type": "unspec", "desc": "array of supported supported operating classes."}, "@NL80211_ATTR_FRAME_MATCH": {"cmds": [], "type": "unspec", "desc": "A binary attribute which typically must contain at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME."}, "@NL80211_ATTR_STA_INFO": {"cmds": ["%NL80211_CMD_GET_STATION"], "type": "unspec", "desc": "information about a station given for %NL80211_CMD_GET_STATION, nested attribute containing info as possible, see &enum nl80211_sta_info."}, "@NL80211_ATTR_GENERATION": {"cmds": [], "type": "unspec", "desc": "Used to indicate consistent snapshots for dumps. This number increases whenever the object list being dumped changes, and as such userspace can verify that it has obtained a complete and consistent snapshot by verifying that all dump messages contain the same generation number. If it changed then the list changed and the dump should be repeated completely from scratch."}, "@NL80211_ATTR_WIPHY_RETRY_SHORT": {"cmds": [], "type": "unspec", "desc": "TX retry limit for frames whose length is less than or equal to the RTS threshold; allowed range: 1..255; dot11ShortRetryLimit; u8"}, "@NL80211_ATTR_CIPHER_GROUP": {"cmds": [], "type": "unspec", "desc": "Used with CONNECT indicate which group key cipher will be used with the connection, a u32"}, "@NL80211_ATTR_DURATION": {"cmds": [], "type": "unspec", "desc": "Duration of an operation in milliseconds"}, "@NL80211_ATTR_BG_SCAN_PERIOD": {"cmds": [], "type": "unspec", "desc": "Background scan period in seconds or 0 to disable background scan."}, "@NL80211_ATTR_WIPHY_BANDS": {"cmds": [], "type": "unspec", "desc": "Information about an operating bands consisting of a nested array."}, "@NL80211_ATTR_CIPHER_SUITES": {"cmds": [], "type": "unspec", "desc": "a set of u32 values indicating the supported cipher suites"}, "@NL80211_ATTR_TDLS_DIALOG_TOKEN": {"cmds": [], "type": "unspec", "desc": "Non TDLS conversation between two devices."}, "@NL80211_ATTR_REG_ALPHA2": {"cmds": [], "type": "unspec", "desc": "an ISO current regulatory domain should be set to or is already set to. For example, 'CR', for Costa Rica. This attribute is used by the kernel to query the CRDA to retrieve one regulatory domain. This attribute can also be used by userspace to query the kernel for the currently set regulatory domain. We chose an alpha2 as that is also used by the IEEE-802.11 country information element to identify a country. Users can also simply ask the wireless core to set regulatory domain to a specific alpha2."}, "@NL80211_ATTR_LOCAL_STATE_CHANGE": {"cmds": [], "type": "unspec", "desc": "Flag attribute to indicate that a command is requesting a local authentication/association state change without invoking actual management frame exchange. This can be used with NL80211_CMD_AUTHENTICATE, NL80211_CMD_DEAUTHENTICATE, NL80211_CMD_DISASSOCIATE."}, "@NL80211_ATTR_USER_REG_HINT_TYPE": {"cmds": [], "type": "unspec", "desc": "type of regulatory hint passed from userspace. If unset it is assumed the hint comes directly from a user. If set code could specify exactly what type of source was used to provide the hint. For the different types of allowed user regulatory hints see nl80211_user_reg_hint_type."}, "@NL80211_ATTR_BEACON_INTERVAL": {"cmds": [], "type": "unspec", "desc": "beacon interval in TU"}, "@NL80211_ATTR_EXT_CAPA": {"cmds": [], "type": "unspec", "desc": "802 has and handles. The format is the same as the IE contents. See 802.11-2012 8.4.2.29 for more information."}, "@NL80211_ATTR_CH_SWITCH_BLOCK_TX": {"cmds": [], "type": "unspec", "desc": "flag attribute specifying that transmission must be blocked on the current channel (before the channel switch operation)."}, "@NL80211_ATTR_WIPHY_TXQ_PARAMS": {"cmds": [], "type": "unspec", "desc": "a nested array of TX queue parameters"}, "@NL80211_ATTR_WOWLAN_TRIGGERS": {"cmds": ["%NL80211_CMD_GET_WOWLAN"], "type": "unspec", "desc": "used by indicate which WoW triggers should be enabled. This is also used by %NL80211_CMD_GET_WOWLAN to get the currently enabled WoWLAN triggers."}, "@NL80211_ATTR_HT_CAPABILITY_MASK": {"cmds": [], "type": "unspec", "desc": "Specify which bits of the ATTR_HT_CAPABILITY to which attention should be paid. Currently, only mac80211 NICs support this feature. The values that may be configured are: MCS rates, MAX-AMSDU, HT-20-40 and HT_CAP_SGI_40 AMPDU density and AMPDU factor. All values are treated as suggestions and may be ignored by the driver as required. The actual values may be seen in the station debugfs ht_caps file."}, "@NL80211_ATTR_TX_FRAME_TYPES": {"cmds": ["%NL80211_CMD_FRAME"], "type": "unspec", "desc": "wiphy capability attribute nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing information about which frame types can be transmitted with %NL80211_CMD_FRAME."}, "@NL80211_ATTR_CIPHER_SUITE_GROUP": {"cmds": [], "type": "unspec", "desc": "For crypto settings for connect or other commands, indicates which group cipher suite is used"}, "@NL80211_ATTR_RX_SIGNAL_DBM": {"cmds": ["%NL80211_CMD_FRAME"], "type": "unspec", "desc": "signal strength in dBm this attribute is (depending on the driver capabilities) added to received frames indicated with %NL80211_CMD_FRAME."}, "@NL80211_ATTR_SSID": {"cmds": [], "type": "unspec", "desc": "SSID "}, "@NL80211_ATTR_KEY_DEFAULT_TYPES": {"cmds": [], "type": "unspec", "desc": "A nested attribute containing flags attributes, specifying what a key should be set as default as. See &enum nl80211_key_default_types."}, "@NL80211_ATTR_SURVEY_INFO": {"cmds": ["%NL80211_CMD_GET_SURVEY"], "type": "unspec", "desc": "survey information about a channel the survey response for %NL80211_CMD_GET_SURVEY, nested attribute containing info as possible, see &enum survey_info."}, "@NL80211_ATTR_WIPHY_TX_POWER_SETTING": {"cmds": [], "type": "unspec", "desc": "Transmit power setting type &enum nl80211_tx_power_setting for possible values."}, "@NL80211_ATTR_WIPHY_ANTENNA_TX": {"cmds": [], "type": "unspec", "desc": "Bitmap of allowed antennas for transmitting This can be used to mask out antennas which are not attached or should not be used for transmitting. If an antenna is not selected in this bitmap the hardware is not allowed to transmit on this antenna. Each bit represents one antenna, starting with antenna 1 at the first bit. Depending on which antennas are selected in the bitmap, 802.11n drivers can derive which chainmasks to use (if all antennas belonging to a particular chain are disabled this chain should be disabled) and if a chain has diversity antennas wether diversity should be used or not. HT capabilities (STBC, TX Beamforming, Antenna selection) can be derived from the available chains after applying the antenna mask. Non-802.11n drivers can derive wether to use diversity or not. Drivers may reject configurations or RX/TX mask combinations they cannot support by returning -EINVAL."}, "@NL80211_ATTR_CHANNEL_WIDTH": {"cmds": [], "type": "unspec", "desc": "u32 attribute containing one of the values of &enum nl80211_chan_width, describing the channel width. See the documentation of the enum for more information."}, "@NL80211_ATTR_NOACK_MAP": {"cmds": [], "type": "unspec", "desc": "This u16 bitmap contains the No Ack Policy of up to 16 TIDs."}, "@NL80211_ATTR_SCAN_SSIDS": {"cmds": [], "type": "unspec", "desc": "nested attribute with SSIDs scanning and include a zero-length SSID (wildcard) for wildcard scan"}, "@NL80211_ATTR_FEATURE_FLAGS": {"cmds": [], "type": "unspec", "desc": "This u32 attribute contains flags from &enum nl80211_feature_flags and is advertised in wiphy information."}, "@NL80211_ATTR_HANDLE_DFS": {"cmds": ["%NL80211_CMD_JOIN_IBSS"], "type": "unspec", "desc": "A flag indicating whether user space controls DFS operation in IBSS mode. If the flag is included in %NL80211_CMD_JOIN_IBSS request, the driver will allow use of DFS channels and reports radar events to userspace. Userspace is required to react to radar events, e.g. initiate a channel switch or leave the IBSS network."}} -{"0": ["@NL80211_ATTR_UNSPEC"], "1": ["@NL80211_ATTR_WIPHY"], "2": ["@NL80211_ATTR_WIPHY_NAME"], "3": ["@NL80211_ATTR_IFINDEX"], "4": ["@NL80211_ATTR_IFNAME"], "5": ["@NL80211_ATTR_IFTYPE"], "6": ["@NL80211_ATTR_MAC"], "7": ["@NL80211_ATTR_KEY_DATA"], "8": ["@NL80211_ATTR_KEY_IDX"], "9": ["@NL80211_ATTR_KEY_CIPHER"], "10": ["@NL80211_ATTR_KEY_SEQ"], "11": ["@NL80211_ATTR_KEY_DEFAULT"], "12": ["@NL80211_ATTR_BEACON_INTERVAL"], "13": ["@NL80211_ATTR_DTIM_PERIOD"], "14": ["@NL80211_ATTR_BEACON_HEAD"], "15": ["@NL80211_ATTR_BEACON_TAIL"], "16": ["@NL80211_ATTR_STA_AID"], "17": ["@NL80211_ATTR_STA_FLAGS"], "18": ["@NL80211_ATTR_STA_LISTEN_INTERVAL"], "19": ["@NL80211_ATTR_STA_SUPPORTED_RATES"], "20": ["@NL80211_ATTR_STA_VLAN"], "21": ["@NL80211_ATTR_STA_INFO"], "22": ["@NL80211_ATTR_WIPHY_BANDS"], "23": ["@NL80211_ATTR_MNTR_FLAGS"], "24": ["@NL80211_ATTR_MESH_ID"], "25": ["@NL80211_ATTR_STA_PLINK_ACTION"], "26": ["@NL80211_ATTR_MPATH_NEXT_HOP"], "27": ["@NL80211_ATTR_MPATH_INFO"], "28": ["@NL80211_ATTR_BSS_CTS_PROT"], "29": ["@NL80211_ATTR_BSS_SHORT_PREAMBLE"], "30": ["@NL80211_ATTR_BSS_SHORT_SLOT_TIME"], "31": ["@NL80211_ATTR_HT_CAPABILITY"], "32": ["@NL80211_ATTR_SUPPORTED_IFTYPES"], "33": ["@NL80211_ATTR_REG_ALPHA2"], "34": ["@NL80211_ATTR_REG_RULES"], "35": ["@NL80211_ATTR_MESH_CONFIG"], "36": ["@NL80211_ATTR_BSS_BASIC_RATES"], "37": ["@NL80211_ATTR_WIPHY_TXQ_PARAMS"], "38": ["@NL80211_ATTR_WIPHY_FREQ"], "39": ["@NL80211_ATTR_WIPHY_CHANNEL_TYPE"], "40": ["@NL80211_ATTR_KEY_DEFAULT_MGMT"], "41": ["@NL80211_ATTR_MGMT_SUBTYPE"], "42": ["@NL80211_ATTR_IE"], "43": ["@NL80211_ATTR_MAX_NUM_SCAN_SSIDS"], "44": ["@NL80211_ATTR_SCAN_FREQUENCIES"], "45": ["@NL80211_ATTR_SCAN_SSIDS"], "46": ["@NL80211_ATTR_GENERATION"], "47": ["@NL80211_ATTR_BSS"], "48": ["@NL80211_ATTR_REG_INITIATOR"], "49": ["@NL80211_ATTR_REG_TYPE"], "50": ["@NL80211_ATTR_SUPPORTED_COMMANDS"], "51": ["@NL80211_ATTR_FRAME"], "52": ["@NL80211_ATTR_SSID"], "53": ["@NL80211_ATTR_AUTH_TYPE"], "54": ["@NL80211_ATTR_REASON_CODE"], "55": ["@NL80211_ATTR_KEY_TYPE"], "56": ["@NL80211_ATTR_MAX_SCAN_IE_LEN"], "57": ["@NL80211_ATTR_CIPHER_SUITES"], "58": ["@NL80211_ATTR_FREQ_BEFORE"], "59": ["@NL80211_ATTR_FREQ_AFTER"], "60": ["@NL80211_ATTR_FREQ_FIXED"], "61": ["@NL80211_ATTR_WIPHY_RETRY_SHORT"], "62": ["@NL80211_ATTR_WIPHY_RETRY_LONG"], "63": ["@NL80211_ATTR_WIPHY_FRAG_THRESHOLD"], "64": ["@NL80211_ATTR_WIPHY_RTS_THRESHOLD"], "65": ["@NL80211_ATTR_TIMED_OUT"], "66": ["@NL80211_ATTR_USE_MFP"], "67": ["@NL80211_ATTR_STA_FLAGS2"], "68": ["@NL80211_ATTR_CONTROL_PORT"], "69": ["@NL80211_ATTR_TESTDATA"], "70": ["@NL80211_ATTR_PRIVACY"], "71": ["@NL80211_ATTR_DISCONNECTED_BY_AP"], "72": ["@NL80211_ATTR_STATUS_CODE"], "73": ["@NL80211_ATTR_CIPHER_SUITES_PAIRWISE"], "74": ["@NL80211_ATTR_CIPHER_SUITE_GROUP"], "75": ["@NL80211_ATTR_WPA_VERSIONS"], "76": ["@NL80211_ATTR_AKM_SUITES"], "77": ["@NL80211_ATTR_REQ_IE"], "78": ["@NL80211_ATTR_RESP_IE"], "79": ["@NL80211_ATTR_PREV_BSSID"], "80": ["@NL80211_ATTR_KEY"], "81": ["@NL80211_ATTR_KEYS"], "82": ["@NL80211_ATTR_PID"], "83": ["@NL80211_ATTR_4ADDR"], "84": ["@NL80211_ATTR_SURVEY_INFO"], "85": ["@NL80211_ATTR_PMKID"], "86": ["@NL80211_ATTR_MAX_NUM_PMKIDS"], "87": ["@NL80211_ATTR_DURATION"], "88": ["@NL80211_ATTR_COOKIE"], "89": ["@NL80211_ATTR_WIPHY_COVERAGE_CLASS"], "90": ["@NL80211_ATTR_TX_RATES"], "91": ["@NL80211_ATTR_FRAME_MATCH"], "92": ["@NL80211_ATTR_ACK"], "93": ["@NL80211_ATTR_PS_STATE"], "94": ["@NL80211_ATTR_CQM"], "95": ["@NL80211_ATTR_LOCAL_STATE_CHANGE"], "96": ["@NL80211_ATTR_AP_ISOLATE"], "97": ["@NL80211_ATTR_WIPHY_TX_POWER_SETTING"], "98": ["@NL80211_ATTR_WIPHY_TX_POWER_LEVEL"], "99": ["@NL80211_ATTR_TX_FRAME_TYPES"], "100": ["@NL80211_ATTR_RX_FRAME_TYPES"], "101": ["@NL80211_ATTR_FRAME_TYPE"], "102": ["@NL80211_ATTR_CONTROL_PORT_ETHERTYPE"], "103": ["@NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT"], "104": ["@NL80211_ATTR_SUPPORT_IBSS_RSN"], "105": ["@NL80211_ATTR_WIPHY_ANTENNA_TX"], "106": ["@NL80211_ATTR_WIPHY_ANTENNA_RX"], "107": ["@NL80211_ATTR_MCAST_RATE"], "108": ["@NL80211_ATTR_OFFCHANNEL_TX_OK"], "109": ["@NL80211_ATTR_BSS_HT_OPMODE"], "110": ["@NL80211_ATTR_KEY_DEFAULT_TYPES"], "111": ["@NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION"], "112": ["@NL80211_ATTR_MESH_SETUP"], "113": ["@NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX"], "114": ["@NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX"], "115": ["@NL80211_ATTR_SUPPORT_MESH_AUTH"], "116": ["@NL80211_ATTR_STA_PLINK_STATE"], "117": ["@NL80211_ATTR_WOWLAN_TRIGGERS"], "118": ["@NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED"], "119": ["@NL80211_ATTR_SCHED_SCAN_INTERVAL"], "120": ["@NL80211_ATTR_INTERFACE_COMBINATIONS"], "121": ["@NL80211_ATTR_SOFTWARE_IFTYPES"], "122": ["@NL80211_ATTR_REKEY_DATA"], "123": ["@NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS"], "124": ["@NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN"], "125": ["@NL80211_ATTR_SCAN_SUPP_RATES"], "126": ["@NL80211_ATTR_HIDDEN_SSID"], "127": ["@NL80211_ATTR_IE_PROBE_RESP"], "128": ["@NL80211_ATTR_IE_ASSOC_RESP"], "129": ["@NL80211_ATTR_STA_WME"], "130": ["@NL80211_ATTR_SUPPORT_AP_UAPSD"], "131": ["@NL80211_ATTR_ROAM_SUPPORT"], "132": ["@NL80211_ATTR_SCHED_SCAN_MATCH"], "133": ["@NL80211_ATTR_MAX_MATCH_SETS"], "134": ["@NL80211_ATTR_PMKSA_CANDIDATE"], "135": ["@NL80211_ATTR_TX_NO_CCK_RATE"], "136": ["@NL80211_ATTR_TDLS_ACTION"], "137": ["@NL80211_ATTR_TDLS_DIALOG_TOKEN"], "138": ["@NL80211_ATTR_TDLS_OPERATION"], "139": ["@NL80211_ATTR_TDLS_SUPPORT"], "140": ["@NL80211_ATTR_TDLS_EXTERNAL_SETUP"], "141": ["@NL80211_ATTR_DEVICE_AP_SME"], "142": ["@NL80211_ATTR_DONT_WAIT_FOR_ACK"], "143": ["@NL80211_ATTR_FEATURE_FLAGS"], "144": ["@NL80211_ATTR_PROBE_RESP_OFFLOAD"], "145": ["@NL80211_ATTR_PROBE_RESP"], "146": ["@NL80211_ATTR_DFS_REGION"], "147": ["@NL80211_ATTR_DISABLE_HT"], "148": ["@NL80211_ATTR_HT_CAPABILITY_MASK"], "149": ["@NL80211_ATTR_NOACK_MAP"], "150": ["@NL80211_ATTR_INACTIVITY_TIMEOUT"], "151": ["@NL80211_ATTR_RX_SIGNAL_DBM"], "152": ["@NL80211_ATTR_BG_SCAN_PERIOD"], "153": ["@NL80211_ATTR_WDEV"], "154": ["@NL80211_ATTR_USER_REG_HINT_TYPE"], "155": ["@NL80211_ATTR_CONN_FAILED_REASON"], "156": ["@NL80211_ATTR_SAE_DATA"], "157": ["@NL80211_ATTR_VHT_CAPABILITY"], "158": ["@NL80211_ATTR_SCAN_FLAGS"], "159": ["@NL80211_ATTR_CHANNEL_WIDTH"], "160": ["@NL80211_ATTR_CENTER_FREQ1"], "161": ["@NL80211_ATTR_CENTER_FREQ2"], "162": ["@NL80211_ATTR_P2P_CTWINDOW"], "163": ["@NL80211_ATTR_P2P_OPPPS"], "164": ["@NL80211_ATTR_LOCAL_MESH_POWER_MODE"], "165": ["@NL80211_ATTR_ACL_POLICY"], "166": ["@NL80211_ATTR_MAC_ADDRS"], "167": ["@NL80211_ATTR_MAC_ACL_MAX"], "168": ["@NL80211_ATTR_RADAR_EVENT"], "169": ["@NL80211_ATTR_EXT_CAPA"], "170": ["@NL80211_ATTR_EXT_CAPA_MASK"], "171": ["@NL80211_ATTR_STA_CAPABILITY"], "172": ["@NL80211_ATTR_STA_EXT_CAPABILITY"], "173": ["@NL80211_ATTR_PROTOCOL_FEATURES"], "174": ["@NL80211_ATTR_SPLIT_WIPHY_DUMP"], "177": ["@NL80211_ATTR_MDID"], "178": ["@NL80211_ATTR_IE_RIC"], "179": ["@NL80211_ATTR_CRIT_PROT_ID"], "180": ["@NL80211_ATTR_MAX_CRIT_PROT_DURATION"], "181": ["@NL80211_ATTR_PEER_AID"], "182": ["@NL80211_ATTR_COALESCE_RULE"], "183": ["@NL80211_ATTR_CH_SWITCH_COUNT"], "184": ["@NL80211_ATTR_CH_SWITCH_BLOCK_TX"], "185": ["@NL80211_ATTR_CSA_IES"], "186": ["@NL80211_ATTR_CSA_C_OFF_BEACON"], "187": ["@NL80211_ATTR_CSA_C_OFF_PRESP"], "188": ["@NL80211_ATTR_RXMGMT_FLAGS"], "189": ["@NL80211_ATTR_STA_SUPPORTED_CHANNELS"], "190": ["@NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES"], "191": ["@NL80211_ATTR_HANDLE_DFS"]} +{"@NL80211_ATTR_PMKID": {"cmds": [], "type": "unspec", "desc": "PMK material for PMKSA caching"}, "@NL80211_ATTR_WIPHY": {"cmds": [], "type": "unspec", "desc": "index of wiphy to operate on /sys/class/ieee80211//index"}, "@NL80211_ATTR_SCAN_SUPP_RATES": {"cmds": [], "type": "unspec", "desc": "rates per to be advertised as supported in scan nested array attribute containing an entry for each band, with the entry being a list of supported rates as defined by IEEE 802.11 7.3.2.2 but without the length restriction (at most %NL80211_MAX_SUPP_RATES)."}, "@NL80211_ATTR_AKM_SUITES": {"cmds": [], "type": "unspec", "desc": "Used with CONNECT indicate which key management algorithm(s) to use (an array of u32)."}, "@NL80211_ATTR_SCAN_FLAGS": {"cmds": [], "type": "unspec", "desc": "scan request control flags "}, "@NL80211_ATTR_IFTYPE": {"cmds": [], "type": "unspec", "desc": "type of virtual interface"}, "@NL80211_ATTR_MAX_SCAN_IE_LEN": {"cmds": [], "type": "unspec", "desc": "maximum length of information elements that can be added to a scan request"}, "@NL80211_ATTR_FREQ_BEFORE": {"cmds": [], "type": "unspec", "desc": "A channel which has suffered a regulatory change due to considerations from a beacon hint. This attribute reflects the state of the channel _before_ the beacon hint processing. This attributes consists of a nested attribute containing NL80211_FREQUENCY_ATTR_*"}, "@NL80211_ATTR_P2P_OPPPS": {"cmds": [], "type": "unspec", "desc": "P2P GO opportunistic PS START_AP and SET_BSS commands. This can have the values 0 or 1; if not given in START_AP 0 is assumed, if not given in SET_BSS no change is made."}, "@NL80211_ATTR_IE_ASSOC_RESP": {"cmds": ["%NL80211_CMD_NEW_BEACON", "%NL80211_CMD_SET_BEACON"], "type": "unspec", "desc": "Information element Response frames. This is used with %NL80211_CMD_NEW_BEACON and %NL80211_CMD_SET_BEACON to provide extra IEs (e.g., WPS/P2P IE) into (Re)Association Response frames when the driver (or firmware) replies to (Re)Association Request frames."}, "@NL80211_ATTR_MPATH_NEXT_HOP": {"cmds": [], "type": "unspec", "desc": "MAC address of the next hop for a mesh path"}, "@NL80211_ATTR_RXMGMT_FLAGS": {"cmds": [], "type": "unspec", "desc": "flags for nl80211_send_mgmt As specified in the &enum nl80211_rxmgmt_flags."}, "@NL80211_ATTR_MAX_CRIT_PROT_DURATION": {"cmds": [], "type": "unspec", "desc": "duration in milliseconds in which the connection should have increased reliability (u16)."}, "@NL80211_ATTR_STA_LISTEN_INTERVAL": {"cmds": [], "type": "unspec", "desc": "listen interval as defined by IEEE 802.11 7.3.1.6 (u16)."}, "@NL80211_ATTR_FRAME_TYPE": {"cmds": [], "type": "unspec", "desc": "A u16 indicating the frame type @NL80211_CMD_REGISTER_FRAME command."}, "@NL80211_ATTR_REG_RULES": {"cmds": [], "type": "unspec", "desc": "a nested array of regulatory domain regulatory rules."}, "@NL80211_ATTR_STATUS_CODE": {"cmds": [], "type": "unspec", "desc": "StatusCode for the event (u16)"}, "@NL80211_ATTR_VHT_CAPABILITY": {"cmds": [], "type": "unspec", "desc": "VHT Capability information element association request when used with NL80211_CMD_NEW_STATION)"}, "@NL80211_ATTR_CRIT_PROT_ID": {"cmds": [], "type": "unspec", "desc": "critical protocol identifier requiring increased reliability, see &enum nl80211_crit_proto_id (u16)."}, "@NL80211_ATTR_TDLS_ACTION": {"cmds": [], "type": "unspec", "desc": "Low level TDLS action code request, link setup confirm, link teardown, etc.). Values are described in the TDLS (802.11z) specification."}, "@NL80211_ATTR_RESP_IE": {"cmds": [], "type": "unspec", "desc": " sent by peer, for ROAM and successful CONNECT events."}, "@NL80211_ATTR_WDEV": {"cmds": [], "type": "unspec", "desc": "wireless device identifier that don't have a netdev (u64)"}, "@NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS": {"cmds": [], "type": "unspec", "desc": "number of SSIDs you can scan with a single scheduled scan request, a wiphy attribute."}, "@NL80211_ATTR_CONTROL_PORT_ETHERTYPE": {"cmds": [], "type": "unspec", "desc": "A 16 ethertype that will be used for key negotiation. It can be specified with the associate and connect commands. If it is not specified, the value defaults to 0x888E (PAE, 802.1X). This attribute is also used as a flag in the wiphy information to indicate that protocols other than PAE are supported."}, "@NL80211_ATTR_KEY_TYPE": {"cmds": [], "type": "unspec", "desc": "Key Type"}, "@NL80211_ATTR_ROAM_SUPPORT": {"cmds": [], "type": "unspec", "desc": "Indicates whether the firmware is capable of roaming to another AP in the same ESS if the signal lever is low."}, "@NL80211_ATTR_TX_NO_CCK_RATE": {"cmds": ["%NL80211_CMD_TRIGGER_SCAN", "%NL80211_CMD_FRAME"], "type": "unspec", "desc": "Indicates whether to use CCK rate or not for management frames transmission. In order to avoid p2p probe/action frames are being transmitted at CCK rate in 2GHz band, the user space applications use this attribute. This attribute is used with %NL80211_CMD_TRIGGER_SCAN and %NL80211_CMD_FRAME commands."}, "@NL80211_ATTR_MGMT_SUBTYPE": {"cmds": ["%NL80211_CMD_SET_MGMT_EXTRA_IE"], "type": "unspec", "desc": "Management frame subtype for %NL80211_CMD_SET_MGMT_EXTRA_IE."}, "@NL80211_ATTR_RX_FRAME_TYPES": {"cmds": [], "type": "unspec", "desc": "wiphy capability attribute nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing information about which frame types can be registered for RX."}, "@NL80211_ATTR_BSS_BASIC_RATES": {"cmds": [], "type": "unspec", "desc": "basic rates rates in format defined by IEEE 802.11 7.3.2.2 but without the length restriction (at most %NL80211_MAX_SUPP_RATES)."}, "@NL80211_ATTR_IE_PROBE_RESP": {"cmds": ["%NL80211_CMD_NEW_BEACON", "%NL80211_CMD_SET_BEACON"], "type": "unspec", "desc": "Information element This is used with %NL80211_CMD_NEW_BEACON and %NL80211_CMD_SET_BEACON to provide extra IEs (e.g., WPS/P2P IE) into Probe Response frames when the driver (or firmware) replies to Probe Request frames."}, "@NL80211_ATTR_SUPPORTED_IFTYPES": {"cmds": [], "type": "unspec", "desc": "nested attribute containing all supported interface types, each a flag attribute with the number of the interface mode."}, "@NL80211_ATTR_IFINDEX": {"cmds": [], "type": "unspec", "desc": "network interface index of the device to operate on"}, "@NL80211_ATTR_EXT_CAPA_MASK": {"cmds": [], "type": "unspec", "desc": "Extended capabilities that the kernel driver has set in the %NL80211_ATTR_EXT_CAPA value, for multibit fields."}, "@NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION": {"cmds": [], "type": "unspec", "desc": "Device attribute that specifies the maximum duration that can be requested with the remain-on-channel operation, in milliseconds, u32."}, "@NL80211_ATTR_REQ_IE": {"cmds": [], "type": "unspec", "desc": " sent out by the card, for ROAM and successful CONNECT events."}, "@NL80211_ATTR_REKEY_DATA": {"cmds": [], "type": "unspec", "desc": "nested attribute containing the information necessary for GTK rekeying in the device, see &enum nl80211_rekey_data."}, "@NL80211_ATTR_HT_CAPABILITY": {"cmds": [], "type": "unspec", "desc": "HT Capability information element association request when used with NL80211_CMD_NEW_STATION)"}, "@NL80211_ATTR_KEY_DATA": {"cmds": [], "type": "unspec", "desc": " 16 bytes encryption key followed by 8 bytes each for TX and RX MIC keys"}, "@NL80211_ATTR_KEY_DEFAULT": {"cmds": [], "type": "unspec", "desc": "Flag attribute indicating the key is default key"}, "@NL80211_ATTR_MESH_SETUP": {"cmds": [], "type": "unspec", "desc": "Optional mesh setup parameters changed once the mesh is active."}, "@NL80211_ATTR_PMKSA_CANDIDATE": {"cmds": [], "type": "unspec", "desc": "Nested attribute containing the PMKSA caching candidate information, see &enum nl80211_pmksa_candidate_attr."}, "@NL80211_ATTR_WIPHY_RTS_THRESHOLD": {"cmds": [], "type": "unspec", "desc": "RTS threshold larger than or equal to this use RTS/CTS handshake); allowed range: 0..65536, disable with (u32)-1; dot11RTSThreshold; u32"}, "@NL80211_ATTR_DTIM_PERIOD": {"cmds": [], "type": "unspec", "desc": "DTIM period for beaconing"}, "@NL80211_ATTR_MAX_NUM_SCAN_SSIDS": {"cmds": [], "type": "unspec", "desc": "number of SSIDs you can scan with a single scan request, a wiphy attribute."}, "@NL80211_ATTR_MESH_CONFIG": {"cmds": [], "type": "unspec", "desc": "Mesh configuration parameters containing attributes from &enum nl80211_meshconf_params."}, "@NL80211_ATTR_COOKIE": {"cmds": [], "type": "unspec", "desc": "Generic 64"}, "@NL80211_ATTR_MAX_MATCH_SETS": {"cmds": [], "type": "unspec", "desc": "maximum number of sets that can be used with @NL80211_ATTR_SCHED_SCAN_MATCH, a wiphy attribute."}, "@NL80211_ATTR_CH_SWITCH_COUNT": {"cmds": [], "type": "unspec", "desc": "u32 attribute specifying the number of TBTT until the channel switch event."}, "@NL80211_ATTR_OFFCHANNEL_TX_OK": {"cmds": [], "type": "unspec", "desc": "For management frame TX transmitted on another channel when the channel given doesn't match the current channel. If the current channel doesn't match and this flag isn't set, the frame will be rejected. This is also used as an nl80211 capability flag."}, "@NL80211_ATTR_SUPPORT_MESH_AUTH": {"cmds": [], "type": "unspec", "desc": "Currently allows auth frames in a mesh to be passed to userspace for processing via the @NL80211_MESH_SETUP_USERSPACE_AUTH flag."}, "@NL80211_ATTR_REASON_CODE": {"cmds": ["%NL80211_CMD_DISASSOCIATE"], "type": "unspec", "desc": "ReasonCode for %NL80211_CMD_DISASSOCIATE, u16"}, "@NL80211_ATTR_STA_WME": {"cmds": [], "type": "unspec", "desc": "Nested attribute containing the wme configuration of the station, see &enum nl80211_sta_wme_attr."}, "@NL80211_ATTR_AP_ISOLATE": {"cmds": [], "type": "unspec", "desc": " connected to this BSS."}, "@NL80211_ATTR_TESTDATA": {"cmds": [], "type": "unspec", "desc": "Testmode data blob We recommend using nested, driver-specific attributes within this."}, "@NL80211_ATTR_CIPHER_SUITES_PAIRWISE": {"cmds": [], "type": "unspec", "desc": "For crypto settings for connect or other commands, indicates which pairwise cipher suites are used"}, "@NL80211_ATTR_BSS_CTS_PROT": {"cmds": [], "type": "unspec", "desc": "whether CTS protection is enabled "}, "@NL80211_ATTR_BSS_SHORT_SLOT_TIME": {"cmds": [], "type": "unspec", "desc": "whether short slot time enabled (u8, 0 or 1)"}, "@NL80211_ATTR_PEER_AID": {"cmds": [], "type": "unspec", "desc": "Association ID for the peer TDLS station This is similar to @NL80211_ATTR_STA_AID but with a difference of being allowed to be used with the first @NL80211_CMD_SET_STATION command to update a TDLS peer STA entry."}, "@NL80211_ATTR_SPLIT_WIPHY_DUMP": {"cmds": [], "type": "unspec", "desc": "flag attribute receiving the data for a single wiphy split across multiple messages, given with wiphy dump message"}, "@NL80211_ATTR_SUPPORT_IBSS_RSN": {"cmds": [], "type": "unspec", "desc": "The device supports IBSS RSN means support for per-station GTKs."}, "@NL80211_ATTR_IE": {"cmds": ["%NL80211_CMD_SET_MGMT_EXTRA_IE"], "type": "unspec", "desc": "Information element %NL80211_CMD_SET_MGMT_EXTRA_IE)."}, "@NL80211_ATTR_AUTH_TYPE": {"cmds": [], "type": "unspec", "desc": "AuthenticationType represented as a u32"}, "@NL80211_ATTR_BSS": {"cmds": [], "type": "unspec", "desc": "scan result BSS"}, "@NL80211_ATTR_PROBE_RESP_OFFLOAD": {"cmds": [], "type": "unspec", "desc": "Indicates that the HW responds to probe requests while operating in AP-mode. This attribute holds a bitmap of the supported protocols for offloading (see &enum nl80211_probe_resp_offload_support_attr)."}, "@NL80211_ATTR_STA_SUPPORTED_CHANNELS": {"cmds": [], "type": "unspec", "desc": "array of supported channels"}, "@NL80211_ATTR_KEY_SEQ": {"cmds": [], "type": "unspec", "desc": "transmit key sequence number CCMP keys, each six bytes in little endian"}, "@NL80211_ATTR_4ADDR": {"cmds": [], "type": "unspec", "desc": "Use 4"}, "@NL80211_ATTR_TIMED_OUT": {"cmds": ["%NL80211_CMD_AUTHENTICATE"], "type": "unspec", "desc": "a flag indicating than an operation timed out is used, e.g., with %NL80211_CMD_AUTHENTICATE event"}, "@NL80211_ATTR_UNSPEC": {"cmds": [], "type": "unspec", "desc": "unspecified attribute to catch errors"}, "@NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT": {"cmds": [], "type": "unspec", "desc": "When included along with %NL80211_ATTR_CONTROL_PORT_ETHERTYPE, indicates that the custom ethertype frames used for key negotiation must not be encrypted."}, "@NL80211_ATTR_BEACON_TAIL": {"cmds": [], "type": "unspec", "desc": "portion of the beacon after the TIM IE"}, "@NL80211_ATTR_REG_INITIATOR": {"cmds": [], "type": "unspec", "desc": "indicates who requested the regulatory domain currently in effect. This could be any of the %NL80211_REGDOM_SET_BY_*"}, "@NL80211_ATTR_WIPHY_TX_POWER_LEVEL": {"cmds": [], "type": "unspec", "desc": "Transmit power level in signed mBm units This is used in association with @NL80211_ATTR_WIPHY_TX_POWER_SETTING for non-automatic settings."}, "@NL80211_ATTR_ACL_POLICY": {"cmds": [], "type": "unspec", "desc": "ACL policy carried in a u32 attribute"}, "@NL80211_ATTR_SAE_DATA": {"cmds": [], "type": "unspec", "desc": "SAE elements in Authentication frames with the Authentication transaction sequence number field."}, "@NL80211_ATTR_WIPHY_RETRY_LONG": {"cmds": [], "type": "unspec", "desc": "TX retry limit for frames whose length is greater than the RTS threshold; allowed range: 1..255; dot11ShortLongLimit; u8"}, "@NL80211_ATTR_INTERFACE_COMBINATIONS": {"cmds": [], "type": "unspec", "desc": "Nested attribute listing the supported interface combinations. In each nested item, it contains attributes defined in &enum nl80211_if_combination_attrs."}, "@NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX": {"cmds": [], "type": "unspec", "desc": "Bitmap of antennas which are available for configuration as TX antennas via the above parameters."}, "@NL80211_ATTR_KEY_DEFAULT_MGMT": {"cmds": [], "type": "unspec", "desc": "Flag attribute indicating the key is the default management key"}, "@NL80211_ATTR_BSS_HT_OPMODE": {"cmds": [], "type": "unspec", "desc": "HT operation mode "}, "@NL80211_ATTR_BEACON_HEAD": {"cmds": [], "type": "unspec", "desc": "portion of the beacon before the TIM IE"}, "@NL80211_ATTR_KEYS": {"cmds": [], "type": "unspec", "desc": "array of keys for static WEP keys for connect and join_ibss(), key information is in a nested attribute each with %NL80211_KEY_* sub-attributes"}, "@NL80211_ATTR_MDID": {"cmds": [], "type": "unspec", "desc": "Mobility Domain Identifier"}, "@NL80211_ATTR_STA_PLINK_ACTION": {"cmds": [], "type": "unspec", "desc": "action to perform on the mesh peer link (see &enum nl80211_plink_action)."}, "@NL80211_ATTR_ACK": {"cmds": [], "type": "unspec", "desc": "Flag attribute indicating that the frame was acknowledged by the recipient."}, "@NL80211_ATTR_WIPHY_FREQ": {"cmds": [], "type": "unspec", "desc": "frequency of the selected channel in MHz defines the channel together with the (deprecated) %NL80211_ATTR_WIPHY_CHANNEL_TYPE attribute or the attributes %NL80211_ATTR_CHANNEL_WIDTH and if needed %NL80211_ATTR_CENTER_FREQ1 and %NL80211_ATTR_CENTER_FREQ2"}, "@NL80211_ATTR_WPA_VERSIONS": {"cmds": [], "type": "unspec", "desc": "Used with CONNECT indicate which WPA version(s) the AP we want to associate with is using (a u32 with flags from &enum nl80211_wpa_versions)."}, "@NL80211_ATTR_SUPPORT_AP_UAPSD": {"cmds": [], "type": "unspec", "desc": "the device supports uapsd when working as AP."}, "@NL80211_ATTR_SCHED_SCAN_MATCH": {"cmds": [], "type": "unspec", "desc": "Nested attribute with one or more sets of attributes to match during scheduled scans. Only BSSs that match any of the sets will be reported. These are pass-thru filter rules. For a match to succeed, the BSS must match all attributes of a set. Since not every hardware supports matching all types of attributes, there is no guarantee that the reported BSSs are fully complying with the match sets and userspace needs to be able to ignore them by itself. Thus, the implementation is somewhat hardware-dependent, but this is only an optimization and the userspace application needs to handle all the non-filtered results anyway. If the match attributes don't make sense when combined with the values passed in @NL80211_ATTR_SCAN_SSIDS (eg. if an SSID is included in the probe request, but the match attributes will never let it go through), -EINVAL may be returned. If ommited, no filtering is done."}, "@NL80211_ATTR_LOCAL_MESH_POWER_MODE": {"cmds": [], "type": "unspec", "desc": "local mesh STA link defined in &enum nl80211_mesh_power_mode."}, "@NL80211_ATTR_SCHED_SCAN_INTERVAL": {"cmds": [], "type": "unspec", "desc": "Interval between scheduled scan cycles, in msecs."}, "@NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED": {"cmds": [], "type": "unspec", "desc": "indicates capabilities, the supported WoWLAN triggers"}, "@NL80211_ATTR_REG_TYPE": {"cmds": [], "type": "unspec", "desc": "indicates the type of the regulatory domain currently set. This can be one of the nl80211_reg_type (%NL80211_REGDOM_TYPE_*)"}, "@NL80211_ATTR_SUPPORTED_COMMANDS": {"cmds": [], "type": "unspec", "desc": "wiphy attribute that specifies an array of command numbers (i.e. a mapping index to command number) that the driver for the given wiphy supports."}, "@NL80211_ATTR_SCAN_FREQUENCIES": {"cmds": [], "type": "unspec", "desc": "nested attribute with frequencies "}, "@NL80211_ATTR_IFNAME": {"cmds": [], "type": "unspec", "desc": "network interface name"}, "@NL80211_ATTR_CSA_IES": {"cmds": [], "type": "unspec", "desc": "Nested set of attributes containing the IE information for the time while performing a channel switch."}, "@NL80211_ATTR_CONTROL_PORT": {"cmds": ["%NL80211_CMD_ASSOCIATE"], "type": "unspec", "desc": "A flag indicating whether user space controls IEEE 802.1X port, i.e., sets/clears %NL80211_STA_FLAG_AUTHORIZED, in station mode. If the flag is included in %NL80211_CMD_ASSOCIATE request, the driver will assume that the port is unauthorized until authorized by user space. Otherwise, port is marked authorized by default in station mode."}, "@NL80211_ATTR_CSA_C_OFF_PRESP": {"cmds": [], "type": "unspec", "desc": "Offset of the channel switch counter field in the probe response (%NL80211_ATTR_PROBE_RESP)."}, "@NL80211_ATTR_CIPHERS_PAIRWISE": {"cmds": [], "type": "unspec", "desc": "Used with CONNECT to indicate which unicast key ciphers will be used with the connection (an array of u32)."}, "@NL80211_ATTR_WIPHY_ANTENNA_RX": {"cmds": [], "type": "unspec", "desc": "Bitmap of allowed antennas for receiving This can be used to mask out antennas which are not attached or should not be used for receiving. If an antenna is not selected in this bitmap the hardware should not be configured to receive on this antenna. For a more detailed description see @NL80211_ATTR_WIPHY_ANTENNA_TX."}, "@NL80211_ATTR_DISCONNECTED_BY_AP": {"cmds": [], "type": "unspec", "desc": "A flag indicating that the DISCONNECT event was due to the AP disconnecting the station, and not due to a local disconnect request."}, "@NL80211_ATTR_INACTIVITY_TIMEOUT": {"cmds": [], "type": "unspec", "desc": "timeout value in seconds used by the drivers which has MLME in firmware and does not have support to report per station tx/rx activity to free up the staion entry from the list. This needs to be used when the driver advertises the capability to timeout the stations."}, "@NL80211_ATTR_TDLS_SUPPORT": {"cmds": [], "type": "unspec", "desc": "A flag indicating the device can operate as a TDLS peer sta."}, "@NL80211_ATTR_CENTER_FREQ2": {"cmds": [], "type": "unspec", "desc": "Center frequency of the second part of the channel, used only for 80+80 MHz bandwidth"}, "@NL80211_ATTR_STA_EXT_CAPABILITY": {"cmds": [], "type": "unspec", "desc": "Station extended capabilities are advertised to the driver, e.g., to enable TDLS off channel operations and PU-APSD."}, "@NL80211_ATTR_STA_PLINK_STATE": {"cmds": [], "type": "unspec", "desc": "The state of a mesh peer link as defined in &enum nl80211_plink_state. Used when userspace is driving the peer link management state machine. @NL80211_MESH_SETUP_USERSPACE_AMPE or @NL80211_MESH_SETUP_USERSPACE_MPM must be enabled."}, "@NL80211_ATTR_MAC": {"cmds": [], "type": "unspec", "desc": "MAC address "}, "@NL80211_ATTR_CSA_C_OFF_BEACON": {"cmds": [], "type": "unspec", "desc": "Offset of the channel switch counter field in the beacons tail (%NL80211_ATTR_BEACON_TAIL)."}, "@NL80211_ATTR_WIPHY_NAME": {"cmds": [], "type": "unspec", "desc": "wiphy name "}, "@NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX": {"cmds": [], "type": "unspec", "desc": "Bitmap of antennas which are available for configuration as RX antennas via the above parameters."}, "@NL80211_ATTR_CONN_FAILED_REASON": {"cmds": [], "type": "unspec", "desc": "The reason for which AP has rejected the connection request from a station. nl80211_connect_failed_reason enum has different reasons of connection failure."}, "@NL80211_ATTR_CENTER_FREQ1": {"cmds": [], "type": "unspec", "desc": "Center frequency of the first part of the channel, used for anything but 20 MHz bandwidth"}, "@NL80211_ATTR_FRAME": {"cmds": [], "type": "unspec", "desc": "frame data and body, but not FCS; used, e.g., with NL80211_CMD_AUTHENTICATE and NL80211_CMD_ASSOCIATE events"}, "@NL80211_ATTR_SOFTWARE_IFTYPES": {"cmds": [], "type": "unspec", "desc": "Nested attribute %NL80211_ATTR_SUPPORTED_IFTYPES) containing the interface types that are managed in software: interfaces of these types aren't subject to any restrictions in their number or combinations."}, "@NL80211_ATTR_PID": {"cmds": [], "type": "unspec", "desc": "Process ID of a network namespace"}, "@NL80211_ATTR_USE_MFP": {"cmds": ["%NL80211_CMD_ASSOCIATE", "%NL80211_CMD_CONNECT"], "type": "unspec", "desc": "Whether management frame protection used for the association (&enum nl80211_mfp, represented as a u32); this attribute can be used with %NL80211_CMD_ASSOCIATE and %NL80211_CMD_CONNECT requests"}, "@NL80211_ATTR_PS_STATE": {"cmds": [], "type": "unspec", "desc": "powersave state"}, "@NL80211_ATTR_PREV_BSSID": {"cmds": [], "type": "unspec", "desc": "previous BSSID commands to specify using a reassociate frame"}, "@NL80211_ATTR_DISABLE_HT": {"cmds": [], "type": "unspec", "desc": " Force HT capable interfaces to disable this feature. Currently, only supported in mac80211 drivers."}, "@NL80211_ATTR_TX_RATES": {"cmds": ["%NL80211_CMD_SET_TX_BITRATE_MASK"], "type": "unspec", "desc": "Nested set of attributes (enum nl80211_tx_rate_attributes) describing TX rates per band. The enum nl80211_band value is used as the index (nla_type() of the nested data. If a band is not included, it will be configured to allow all rates based on negotiated supported rates information. This attribute is used with %NL80211_CMD_SET_TX_BITRATE_MASK."}, "@NL80211_ATTR_MAC_ADDRS": {"cmds": [], "type": "unspec", "desc": "Array of nested MAC addresses"}, "@NL80211_ATTR_COALESCE_RULE": {"cmds": [], "type": "unspec", "desc": "Coalesce rule information"}, "@NL80211_ATTR_RADAR_EVENT": {"cmds": [], "type": "unspec", "desc": "Type of radar event for notification to userspace contains a value of enum nl80211_radar_event (u32)."}, "@NL80211_ATTR_STA_SUPPORTED_RATES": {"cmds": [], "type": "unspec", "desc": "supported rates rates as defined by IEEE 802.11 7.3.2.2 but without the length restriction (at most %NL80211_MAX_SUPP_RATES)."}, "@NL80211_ATTR_IE_RIC": {"cmds": [], "type": "unspec", "desc": "Resource Information Container Information element"}, "@NL80211_ATTR_STA_FLAGS2": {"cmds": [], "type": "unspec", "desc": "Attribute containing a &struct nl80211_sta_flag_update."}, "@NL80211_ATTR_PRIVACY": {"cmds": [], "type": "unspec", "desc": "Flag attribute that protected APs should be used. This is also used with NEW_BEACON to indicate that the BSS is to use protection."}, "@NL80211_ATTR_WIPHY_COVERAGE_CLASS": {"cmds": [], "type": "unspec", "desc": "Coverage Class as defined by IEEE 802 section 7.3.2.9; dot11CoverageClass; u8"}, "@NL80211_ATTR_BSS_SHORT_PREAMBLE": {"cmds": [], "type": "unspec", "desc": "whether short preamble is enabled (u8, 0 or 1)"}, "@NL80211_ATTR_MCAST_RATE": {"cmds": [], "type": "unspec", "desc": "Multicast tx rate "}, "@NL80211_ATTR_WIPHY_CHANNEL_TYPE": {"cmds": [], "type": "unspec", "desc": "included with NL80211_ATTR_WIPHY_FREQ if HT20 or HT40 are to be used (i.e., HT disabled if not included): NL80211_CHAN_NO_HT = HT not allowed (same as not including) NL80211_CHAN_HT20 = HT20 only NL80211_CHAN_HT40MINUS = secondary channel is below the primary channel NL80211_CHAN_HT40PLUS = secondary channel is above the primary channel This attribute is now deprecated."}, "@NL80211_ATTR_PROBE_RESP": {"cmds": [], "type": "unspec", "desc": "Probe Response template data probe-response frame. The DA field in the 802.11 header is zero-ed out, to be filled by the FW."}, "@NL80211_ATTR_CQM": {"cmds": [], "type": "unspec", "desc": "connection quality monitor configuration in a nested attribute with %NL80211_ATTR_CQM_* sub-attributes."}, "@NL80211_ATTR_DONT_WAIT_FOR_ACK": {"cmds": [], "type": "unspec", "desc": "Used with the driver to not wait for an acknowledgement. Note that due to this, it will also not give a status callback nor return a cookie. This is mostly useful for probe responses to save airtime."}, "@NL80211_ATTR_STA_VLAN": {"cmds": [], "type": "unspec", "desc": "interface index of VLAN interface to move station to, or the AP interface the station was originally added to to."}, "@NL80211_ATTR_FREQ_AFTER": {"cmds": [], "type": "unspec", "desc": "A channel which has suffered a regulatory change due to considerations from a beacon hint. This attribute reflects the state of the channel _after_ the beacon hint processing. This attributes consists of a nested attribute containing NL80211_FREQUENCY_ATTR_*"}, "@NL80211_ATTR_MESH_ID": {"cmds": [], "type": "unspec", "desc": "mesh id "}, "@NL80211_ATTR_DFS_REGION": {"cmds": [], "type": "unspec", "desc": "region for regulatory rules which this country abides to when initiating radiation on DFS channels. A country maps to one DFS region."}, "@NL80211_ATTR_MNTR_FLAGS": {"cmds": [], "type": "unspec", "desc": "flags &enum nl80211_mntr_flags."}, "@NL80211_ATTR_WIPHY_FRAG_THRESHOLD": {"cmds": [], "type": "unspec", "desc": "fragmentation threshold length in octets for frames; allowed range: 256..8000, disable fragmentation with (u32)-1; dot11FragmentationThreshold; u32"}, "@NL80211_ATTR_KEY_CIPHER": {"cmds": [], "type": "unspec", "desc": "key cipher suite section 7.3.2.25.1, e.g. 0x000FAC04)"}, "@NL80211_ATTR_KEY_IDX": {"cmds": [], "type": "unspec", "desc": "key ID "}, "@NL80211_ATTR_P2P_CTWINDOW": {"cmds": [], "type": "unspec", "desc": "P2P GO Client Traffic Window the START_AP and SET_BSS commands"}, "@NL80211_ATTR_TDLS_EXTERNAL_SETUP": {"cmds": ["%NL80211_CMD_TDLS_MGMT", "%NL80211_CMD_TDLS_OPER"], "type": "unspec", "desc": "The TDLS discovery procedures should be performed by sending TDLS packets via %NL80211_CMD_TDLS_MGMT. Otherwise %NL80211_CMD_TDLS_OPER should be used for asking the driver to perform a TDLS operation."}, "@NL80211_ATTR_PROTOCOL_FEATURES": {"cmds": [], "type": "unspec", "desc": "global nl80211 feature flags &enum nl80211_protocol_features, the attribute is a u32."}, "@NL80211_ATTR_MPATH_INFO": {"cmds": ["%NL80211_CMD_GET_MPATH"], "type": "unspec", "desc": "information about a mesh_path info given for %NL80211_CMD_GET_MPATH, nested attribute described at &enum nl80211_mpath_info."}, "@NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN": {"cmds": [], "type": "unspec", "desc": "maximum length of information elements that can be added to a scheduled scan request"}, "@NL80211_ATTR_TDLS_OPERATION": {"cmds": [], "type": "unspec", "desc": "High level TDLS operation &enum nl80211_tdls_operation, represented as a u8."}, "@NL80211_ATTR_FREQ_FIXED": {"cmds": [], "type": "unspec", "desc": "a flag indicating the IBSS should not try to look for other networks on different channels"}, "@NL80211_ATTR_STA_FLAGS": {"cmds": [], "type": "unspec", "desc": "flags &enum nl80211_sta_flags (deprecated, use %NL80211_ATTR_STA_FLAGS2)"}, "@NL80211_ATTR_MAX_NUM_PMKIDS": {"cmds": [], "type": "unspec", "desc": "maximum number of PMKIDs a firmware can cache, a wiphy attribute."}, "@NL80211_ATTR_MAC_ACL_MAX": {"cmds": [], "type": "unspec", "desc": "u32 attribute to advertise the maximum number of MAC addresses that a device can support for MAC ACL"}, "@NL80211_ATTR_STA_AID": {"cmds": [], "type": "unspec", "desc": "Association ID for the station "}, "@NL80211_ATTR_KEY": {"cmds": [], "type": "unspec", "desc": "key information in a nested attribute with %NL80211_KEY_* sub-attributes"}, "@NL80211_ATTR_STA_CAPABILITY": {"cmds": [], "type": "unspec", "desc": "Station capabilities the driver, e.g., to enable TDLS power save (PU-APSD)."}, "@NL80211_ATTR_DEVICE_AP_SME": {"cmds": [], "type": "unspec", "desc": "This u32 attribute may be listed for devices that have AP support to indicate that they have the AP SME integrated with support for the features listed in this attribute, see &enum nl80211_ap_sme_features."}, "@NL80211_ATTR_HIDDEN_SSID": {"cmds": [], "type": "unspec", "desc": "indicates whether SSID is to be hidden from Beacon and Probe Response (when response to wildcard Probe Request); see &enum nl80211_hidden_ssid, represented as a u32"}, "@NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES": {"cmds": [], "type": "unspec", "desc": "array of supported supported operating classes."}, "@NL80211_ATTR_FRAME_MATCH": {"cmds": [], "type": "unspec", "desc": "A binary attribute which typically must contain at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME."}, "@NL80211_ATTR_STA_INFO": {"cmds": ["%NL80211_CMD_GET_STATION"], "type": "unspec", "desc": "information about a station given for %NL80211_CMD_GET_STATION, nested attribute containing info as possible, see &enum nl80211_sta_info."}, "@NL80211_ATTR_GENERATION": {"cmds": [], "type": "unspec", "desc": "Used to indicate consistent snapshots for dumps. This number increases whenever the object list being dumped changes, and as such userspace can verify that it has obtained a complete and consistent snapshot by verifying that all dump messages contain the same generation number. If it changed then the list changed and the dump should be repeated completely from scratch."}, "@NL80211_ATTR_WIPHY_RETRY_SHORT": {"cmds": [], "type": "unspec", "desc": "TX retry limit for frames whose length is less than or equal to the RTS threshold; allowed range: 1..255; dot11ShortRetryLimit; u8"}, "@NL80211_ATTR_CIPHER_GROUP": {"cmds": [], "type": "unspec", "desc": "Used with CONNECT indicate which group key cipher will be used with the connection, a u32"}, "@NL80211_ATTR_DURATION": {"cmds": [], "type": "unspec", "desc": "Duration of an operation in milliseconds"}, "@NL80211_ATTR_BG_SCAN_PERIOD": {"cmds": [], "type": "unspec", "desc": "Background scan period in seconds or 0 to disable background scan."}, "@NL80211_ATTR_WIPHY_BANDS": {"cmds": [], "type": "unspec", "desc": "Information about an operating bands consisting of a nested array."}, "@NL80211_ATTR_CIPHER_SUITES": {"cmds": [], "type": "unspec", "desc": "a set of u32 values indicating the supported cipher suites"}, "@NL80211_ATTR_TDLS_DIALOG_TOKEN": {"cmds": [], "type": "unspec", "desc": "Non TDLS conversation between two devices."}, "@NL80211_ATTR_REG_ALPHA2": {"cmds": [], "type": "unspec", "desc": "an ISO current regulatory domain should be set to or is already set to. For example, 'CR', for Costa Rica. This attribute is used by the kernel to query the CRDA to retrieve one regulatory domain. This attribute can also be used by userspace to query the kernel for the currently set regulatory domain. We chose an alpha2 as that is also used by the IEEE-802.11 country information element to identify a country. Users can also simply ask the wireless core to set regulatory domain to a specific alpha2."}, "@NL80211_ATTR_LOCAL_STATE_CHANGE": {"cmds": [], "type": "unspec", "desc": "Flag attribute to indicate that a command is requesting a local authentication/association state change without invoking actual management frame exchange. This can be used with NL80211_CMD_AUTHENTICATE, NL80211_CMD_DEAUTHENTICATE, NL80211_CMD_DISASSOCIATE."}, "@NL80211_ATTR_USER_REG_HINT_TYPE": {"cmds": [], "type": "unspec", "desc": "type of regulatory hint passed from userspace. If unset it is assumed the hint comes directly from a user. If set code could specify exactly what type of source was used to provide the hint. For the different types of allowed user regulatory hints see nl80211_user_reg_hint_type."}, "@NL80211_ATTR_BEACON_INTERVAL": {"cmds": [], "type": "unspec", "desc": "beacon interval in TU"}, "@NL80211_ATTR_EXT_CAPA": {"cmds": [], "type": "unspec", "desc": "802 has and handles. The format is the same as the IE contents. See 802.11-2012 8.4.2.29 for more information."}, "@NL80211_ATTR_CH_SWITCH_BLOCK_TX": {"cmds": [], "type": "unspec", "desc": "flag attribute specifying that transmission must be blocked on the current channel (before the channel switch operation)."}, "@NL80211_ATTR_WIPHY_TXQ_PARAMS": {"cmds": [], "type": "unspec", "desc": "a nested array of TX queue parameters"}, "@NL80211_ATTR_WOWLAN_TRIGGERS": {"cmds": ["%NL80211_CMD_GET_WOWLAN"], "type": "unspec", "desc": "used by indicate which WoW triggers should be enabled. This is also used by %NL80211_CMD_GET_WOWLAN to get the currently enabled WoWLAN triggers."}, "@NL80211_ATTR_HT_CAPABILITY_MASK": {"cmds": [], "type": "unspec", "desc": "Specify which bits of the ATTR_HT_CAPABILITY to which attention should be paid. Currently, only mac80211 NICs support this feature. The values that may be configured are: MCS rates, MAX-AMSDU, HT-20-40 and HT_CAP_SGI_40 AMPDU density and AMPDU factor. All values are treated as suggestions and may be ignored by the driver as required. The actual values may be seen in the station debugfs ht_caps file."}, "@NL80211_ATTR_TX_FRAME_TYPES": {"cmds": ["%NL80211_CMD_FRAME"], "type": "unspec", "desc": "wiphy capability attribute nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing information about which frame types can be transmitted with %NL80211_CMD_FRAME."}, "@NL80211_ATTR_CIPHER_SUITE_GROUP": {"cmds": [], "type": "unspec", "desc": "For crypto settings for connect or other commands, indicates which group cipher suite is used"}, "@NL80211_ATTR_RX_SIGNAL_DBM": {"cmds": ["%NL80211_CMD_FRAME"], "type": "unspec", "desc": "signal strength in dBm this attribute is (depending on the driver capabilities) added to received frames indicated with %NL80211_CMD_FRAME."}, "@NL80211_ATTR_SSID": {"cmds": [], "type": "unspec", "desc": "SSID "}, "@NL80211_ATTR_KEY_DEFAULT_TYPES": {"cmds": [], "type": "unspec", "desc": "A nested attribute containing flags attributes, specifying what a key should be set as default as. See &enum nl80211_key_default_types."}, "@NL80211_ATTR_SURVEY_INFO": {"cmds": ["%NL80211_CMD_GET_SURVEY"], "type": "unspec", "desc": "survey information about a channel the survey response for %NL80211_CMD_GET_SURVEY, nested attribute containing info as possible, see &enum survey_info."}, "@NL80211_ATTR_WIPHY_TX_POWER_SETTING": {"cmds": [], "type": "unspec", "desc": "Transmit power setting type &enum nl80211_tx_power_setting for possible values."}, "@NL80211_ATTR_WIPHY_ANTENNA_TX": {"cmds": [], "type": "unspec", "desc": "Bitmap of allowed antennas for transmitting This can be used to mask out antennas which are not attached or should not be used for transmitting. If an antenna is not selected in this bitmap the hardware is not allowed to transmit on this antenna. Each bit represents one antenna, starting with antenna 1 at the first bit. Depending on which antennas are selected in the bitmap, 802.11n drivers can derive which chainmasks to use (if all antennas belonging to a particular chain are disabled this chain should be disabled) and if a chain has diversity antennas wether diversity should be used or not. HT capabilities (STBC, TX Beamforming, Antenna selection) can be derived from the available chains after applying the antenna mask. Non-802.11n drivers can derive wether to use diversity or not. Drivers may reject configurations or RX/TX mask combinations they cannot support by returning -EINVAL."}, "@NL80211_ATTR_CHANNEL_WIDTH": {"cmds": [], "type": "unspec", "desc": "u32 attribute containing one of the values of &enum nl80211_chan_width, describing the channel width. See the documentation of the enum for more information."}, "@NL80211_ATTR_NOACK_MAP": {"cmds": [], "type": "unspec", "desc": "This u16 bitmap contains the No Ack Policy of up to 16 TIDs."}, "@NL80211_ATTR_SCAN_SSIDS": {"cmds": [], "type": "unspec", "desc": "nested attribute with SSIDs scanning and include a zero-length SSID (wildcard) for wildcard scan"}, "@NL80211_ATTR_FEATURE_FLAGS": {"cmds": [], "type": "unspec", "desc": "This u32 attribute contains flags from &enum nl80211_feature_flags and is advertised in wiphy information."}, "@NL80211_ATTR_HANDLE_DFS": {"cmds": ["%NL80211_CMD_JOIN_IBSS"], "type": "unspec", "desc": "A flag indicating whether user space controls DFS operation in IBSS mode. If the flag is included in %NL80211_CMD_JOIN_IBSS request, the driver will allow use of DFS channels and reports radar events to userspace. Userspace is required to react to radar events, e.g. initiate a channel switch or leave the IBSS network."}, "@NL80211_ATTR_SUPPORT_5_MHZ": {"cmds": [], "type": "unspec" , "desc": "A flag indicating that the device supports 5 MHz channel bandwidth."}, "@NL80211_ATTR_SUPPORT_10_MHZ": {"cmds": [], "type": "unspec" , "desc": "A flag indicating that the device supports 10 MHz channel bandwidth."},"@NL80211_ATTR_OPMODE_NOTIF": {"cmds": ["%NL80211_CMD_NEW_STATION"], "type": "u8" , "desc": "Operating mode field from Operating Mode Notification Element based on association request when used with %NL80211_CMD_NEW_STATION; u8 attribute."}, "@NL80211_ATTR_VENDOR_ID": {"cmds": [], "type": "u32" , "desc": "The vendor ID, either a 24-bit OUI or, if %NL80211_VENDOR_ID_IS_LINUX is set, a special Linux ID (not used yet)."}, "@NL80211_ATTR_VENDOR_SUBCMD": {"cmds": [], "type": "u32" , "desc": "vendor sub-command."}, "@NL80211_ATTR_VENDOR_DATA": {"cmds": [], "type": "unspec" , "desc": "data for the vendor command, if any; this attribute is also used for vendor command feature advertisement."}, "@NL80211_ATTR_VENDOR_EVENTS": {"cmds": [], "type": "unspec" , "desc": "used for event list advertising in the wiphy info, containing a nested array of possible events."}, "@NL80211_ATTR_QOS_MAP": {"cmds": [], "type": "unspec" , "desc": "IP DSCP mapping for Interworking QoS mapping. This data is in the format defined for the payload of the QoS Map Set element in IEEE Std 802.11-2012, 8.4.2.97"}, "@NL80211_ATTR_MAC_HINT": {"cmds": [], "type": "unspec" , "desc": "MAC address recommendation as initial BSS"}, "@NL80211_ATTR_WIPHY_FREQ_HINT": {"cmds": [], "type": "u32" , "desc": "frequency of the recommended initial BSS"}, "@NL80211_ATTR_MAX_AP_ASSOC_STA": {"cmds": ["%NL80211_CMD_NEW_STATION"], "type": "u32" , "desc": "Device attribute that indicates how many associated stations are supported in AP mode (including P2P GO); u32. Since drivers may not have a fixed limit on the maximum number (e.g.), other concurrent operations may affect this), drivers are allowed to advertise values that cannot always be met. In such cases, an attempt to add a new station entry with %NL80211_CMD_NEW_STATION may fail."}, "@NL80211_ATTR_CSA_C_OFFSETS_TX": {"cmds": [], "type": "unspec" , "desc": "An array of csa counter offsets (u16) which should be updated when the frame is transmitted."}, "@NL80211_ATTR_MAX_CSA_COUNTERS": {"cmds": [], "type": "unspec" , "desc": "U8 attribute used to advertise the maximum supported number of csa counters."}, "@NL80211_ATTR_TDLS_PEER_CAPABILITY": {"cmds": [], "type": "u32" , "desc": "flags for TDLS peer capabilities, u32. As specified in the &enum nl80211_tdls_peer_capability."}, "@NL80211_ATTR_SOCKET_OWNER": {"cmds": [], "type": "flag" , "desc": "Flag attribute, if set during interface creation then the new interface will be owned by the netlink socket that created it and will be destroyed when the socket is closed. If set during scheduled scan start then the new scan req will be owned by the netlink socket that created it and the scheduled scan will be stopped when the socket is closed. If set during configuration of regulatory indoor operation then the regulatory indoor configuration would be owned by the netlink socket that configured the indoor setting, and the indoor operation would be cleared when the socket is closed."}, "@NL80211_ATTR_TDLS_INITIATOR": {"cmds": [], "type": "flag" , "desc": "flag attribute indicating the current end is the TDLS link initiator."}, "@NL80211_ATTR_USE_RRM": {"cmds": [], "type": "flag" , "desc": "flag for indicating whether the current connection shall support Radio Resource Measurements (11k). This attribute can be used with %NL80211_CMD_ASSOCIATE and %NL80211_CMD_CONNECT requests. User space applications are expected to use this flag only if the underlying device supports these minimal RRM features: %NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES, %NL80211_FEATURE_QUIET, If this flag is used, driver must add the Power Capabilities IE to the association request. In addition, it must also set the RRM capability flag in the association request's Capability Info field."}, "@NL80211_ATTR_WIPHY_DYN_ACK": {"cmds": [], "type": "unspec" , "desc": "flag attribute used to enable ACK timeout estimation algorithm (dynack). In order to activate dynack %NL80211_FEATURE_ACKTO_ESTIMATION feature flag must be set by lower drivers to indicate dynack capability. Dynack is automatically disabled setting valid value for coverage class."}, "@NL80211_ATTR_TSID": {"cmds": [], "type": "u8" , "desc": "a TSID value (u8 attribute)"}, "@NL80211_ATTR_USER_PRIO": {"cmds": [], "type": "u8" , "desc": "user priority value (u8 attribute)"}, "@NL80211_ATTR_ADMITTED_TIME": {"cmds": [], "type": "u16" , "desc": "admitted time in units of 32 microseconds (per second) (u16 attribute)."}, "@NL80211_ATTR_SMPS_MODE": {"cmds": [], "type": "u8" , "desc": "SMPS mode to use (ap mode). see &enum nl80211_smps_mode."}, "@NL80211_ATTR_OPER_CLASS": {"cmds": [], "type": "unspec" , "desc": "operating class"}, "@NL80211_ATTR_MAC_MASK": {"cmds": [], "type": "unspec" , "desc": "MAC address mask"}, "@NL80211_ATTR_WIPHY_SELF_MANAGED_REG": {"cmds": [], "type": "flag" , "desc": "flag attribute indicating this device is self-managing its regulatory information and any regulatory domain obtained from it is coming from the device's wiphy and not the global cfg80211 regdomain."}, "@NL80211_ATTR_EXT_FEATURES": {"cmds": [], "type": "unspec" , "desc": "extended feature flags contained in a byte array. The feature flags are identified by their bit index (see &enum nl80211_ext_feature_index). The bit index is ordered starting at the least-significant bit of the first byte in the array, ie. bit index 0 is located at bit 0 of byte 0. bit index 25 would be located at bit 1 of byte 3 (u8 array)."}, "@NL80211_ATTR_SURVEY_RADIO_STATS": {"cmds": [], "type": "unspec" , "desc": "Request overall radio statistics to be returned along with other survey data. If set, %NL80211_CMD_GET_SURVEY may return a survey entry without a channel indicating global radio statistics (only some values are valid and make sense.) For devices that don't return such an entry even then, the information should be contained in the result as the sum of the respective counters over all channels."}, "@NL80211_ATTR_SCHED_SCAN_DELAY": {"cmds": [], "type": "u32" , "desc": "delay before the first cycle of a scheduled scan (or a WoWLAN net-detect scan) is started, u32 in seconds."}, "@NL80211_ATTR_REG_INDOOR": {"cmds": [], "type": "flag" , "desc": "flag attribute, if set indicates that the device is operating in an indoor environment."}, "@NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS": {"cmds": [], "type": "unspec" , "desc": "maximum number of scan plans for scheduled scan supported by the device (u32), a wiphy attribute."}, "@NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL": {"cmds": [], "type": "unspec" , "desc": "maximum interval (in seconds) for a scan plan (u32), a wiphy attribute."}, "@NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS": {"cmds": [], "type": "unspec" , "desc": "maximum number of iterations in a scan plan (u32), a wiphy attribute."}, "@NL80211_ATTR_SCHED_SCAN_PLANS": {"cmds": [], "type": "unspec" , "desc": "a list of scan plans for scheduled scan. Each scan plan defines the number of scan iterations and the interval between scans. The last scan plan will always run infinitely, thus it must not specify the number of iterations, only the interval between scans. The scan plans are executed sequentially. Each scan plan is a nested attribute of &enum nl80211_sched_scan_plan."}} +{"0": ["@NL80211_ATTR_UNSPEC"], "1": ["@NL80211_ATTR_WIPHY"], "2": ["@NL80211_ATTR_WIPHY_NAME"], "3": ["@NL80211_ATTR_IFINDEX"], "4": ["@NL80211_ATTR_IFNAME"], "5": ["@NL80211_ATTR_IFTYPE"], "6": ["@NL80211_ATTR_MAC"], "7": ["@NL80211_ATTR_KEY_DATA"], "8": ["@NL80211_ATTR_KEY_IDX"], "9": ["@NL80211_ATTR_KEY_CIPHER"], "10": ["@NL80211_ATTR_KEY_SEQ"], "11": ["@NL80211_ATTR_KEY_DEFAULT"], "12": ["@NL80211_ATTR_BEACON_INTERVAL"], "13": ["@NL80211_ATTR_DTIM_PERIOD"], "14": ["@NL80211_ATTR_BEACON_HEAD"], "15": ["@NL80211_ATTR_BEACON_TAIL"], "16": ["@NL80211_ATTR_STA_AID"], "17": ["@NL80211_ATTR_STA_FLAGS"], "18": ["@NL80211_ATTR_STA_LISTEN_INTERVAL"], "19": ["@NL80211_ATTR_STA_SUPPORTED_RATES"], "20": ["@NL80211_ATTR_STA_VLAN"], "21": ["@NL80211_ATTR_STA_INFO"], "22": ["@NL80211_ATTR_WIPHY_BANDS"], "23": ["@NL80211_ATTR_MNTR_FLAGS"], "24": ["@NL80211_ATTR_MESH_ID"], "25": ["@NL80211_ATTR_STA_PLINK_ACTION"], "26": ["@NL80211_ATTR_MPATH_NEXT_HOP"], "27": ["@NL80211_ATTR_MPATH_INFO"], "28": ["@NL80211_ATTR_BSS_CTS_PROT"], "29": ["@NL80211_ATTR_BSS_SHORT_PREAMBLE"], "30": ["@NL80211_ATTR_BSS_SHORT_SLOT_TIME"], "31": ["@NL80211_ATTR_HT_CAPABILITY"], "32": ["@NL80211_ATTR_SUPPORTED_IFTYPES"], "33": ["@NL80211_ATTR_REG_ALPHA2"], "34": ["@NL80211_ATTR_REG_RULES"], "35": ["@NL80211_ATTR_MESH_CONFIG"], "36": ["@NL80211_ATTR_BSS_BASIC_RATES"], "37": ["@NL80211_ATTR_WIPHY_TXQ_PARAMS"], "38": ["@NL80211_ATTR_WIPHY_FREQ"], "39": ["@NL80211_ATTR_WIPHY_CHANNEL_TYPE"], "40": ["@NL80211_ATTR_KEY_DEFAULT_MGMT"], "41": ["@NL80211_ATTR_MGMT_SUBTYPE"], "42": ["@NL80211_ATTR_IE"], "43": ["@NL80211_ATTR_MAX_NUM_SCAN_SSIDS"], "44": ["@NL80211_ATTR_SCAN_FREQUENCIES"], "45": ["@NL80211_ATTR_SCAN_SSIDS"], "46": ["@NL80211_ATTR_GENERATION"], "47": ["@NL80211_ATTR_BSS"], "48": ["@NL80211_ATTR_REG_INITIATOR"], "49": ["@NL80211_ATTR_REG_TYPE"], "50": ["@NL80211_ATTR_SUPPORTED_COMMANDS"], "51": ["@NL80211_ATTR_FRAME"], "52": ["@NL80211_ATTR_SSID"], "53": ["@NL80211_ATTR_AUTH_TYPE"], "54": ["@NL80211_ATTR_REASON_CODE"], "55": ["@NL80211_ATTR_KEY_TYPE"], "56": ["@NL80211_ATTR_MAX_SCAN_IE_LEN"], "57": ["@NL80211_ATTR_CIPHER_SUITES"], "58": ["@NL80211_ATTR_FREQ_BEFORE"], "59": ["@NL80211_ATTR_FREQ_AFTER"], "60": ["@NL80211_ATTR_FREQ_FIXED"], "61": ["@NL80211_ATTR_WIPHY_RETRY_SHORT"], "62": ["@NL80211_ATTR_WIPHY_RETRY_LONG"], "63": ["@NL80211_ATTR_WIPHY_FRAG_THRESHOLD"], "64": ["@NL80211_ATTR_WIPHY_RTS_THRESHOLD"], "65": ["@NL80211_ATTR_TIMED_OUT"], "66": ["@NL80211_ATTR_USE_MFP"], "67": ["@NL80211_ATTR_STA_FLAGS2"], "68": ["@NL80211_ATTR_CONTROL_PORT"], "69": ["@NL80211_ATTR_TESTDATA"], "70": ["@NL80211_ATTR_PRIVACY"], "71": ["@NL80211_ATTR_DISCONNECTED_BY_AP"], "72": ["@NL80211_ATTR_STATUS_CODE"], "73": ["@NL80211_ATTR_CIPHER_SUITES_PAIRWISE"], "74": ["@NL80211_ATTR_CIPHER_SUITE_GROUP"], "75": ["@NL80211_ATTR_WPA_VERSIONS"], "76": ["@NL80211_ATTR_AKM_SUITES"], "77": ["@NL80211_ATTR_REQ_IE"], "78": ["@NL80211_ATTR_RESP_IE"], "79": ["@NL80211_ATTR_PREV_BSSID"], "80": ["@NL80211_ATTR_KEY"], "81": ["@NL80211_ATTR_KEYS"], "82": ["@NL80211_ATTR_PID"], "83": ["@NL80211_ATTR_4ADDR"], "84": ["@NL80211_ATTR_SURVEY_INFO"], "85": ["@NL80211_ATTR_PMKID"], "86": ["@NL80211_ATTR_MAX_NUM_PMKIDS"], "87": ["@NL80211_ATTR_DURATION"], "88": ["@NL80211_ATTR_COOKIE"], "89": ["@NL80211_ATTR_WIPHY_COVERAGE_CLASS"], "90": ["@NL80211_ATTR_TX_RATES"], "91": ["@NL80211_ATTR_FRAME_MATCH"], "92": ["@NL80211_ATTR_ACK"], "93": ["@NL80211_ATTR_PS_STATE"], "94": ["@NL80211_ATTR_CQM"], "95": ["@NL80211_ATTR_LOCAL_STATE_CHANGE"], "96": ["@NL80211_ATTR_AP_ISOLATE"], "97": ["@NL80211_ATTR_WIPHY_TX_POWER_SETTING"], "98": ["@NL80211_ATTR_WIPHY_TX_POWER_LEVEL"], "99": ["@NL80211_ATTR_TX_FRAME_TYPES"], "100": ["@NL80211_ATTR_RX_FRAME_TYPES"], "101": ["@NL80211_ATTR_FRAME_TYPE"], "102": ["@NL80211_ATTR_CONTROL_PORT_ETHERTYPE"], "103": ["@NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT"], "104": ["@NL80211_ATTR_SUPPORT_IBSS_RSN"], "105": ["@NL80211_ATTR_WIPHY_ANTENNA_TX"], "106": ["@NL80211_ATTR_WIPHY_ANTENNA_RX"], "107": ["@NL80211_ATTR_MCAST_RATE"], "108": ["@NL80211_ATTR_OFFCHANNEL_TX_OK"], "109": ["@NL80211_ATTR_BSS_HT_OPMODE"], "110": ["@NL80211_ATTR_KEY_DEFAULT_TYPES"], "111": ["@NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION"], "112": ["@NL80211_ATTR_MESH_SETUP"], "113": ["@NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX"], "114": ["@NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX"], "115": ["@NL80211_ATTR_SUPPORT_MESH_AUTH"], "116": ["@NL80211_ATTR_STA_PLINK_STATE"], "117": ["@NL80211_ATTR_WOWLAN_TRIGGERS"], "118": ["@NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED"], "119": ["@NL80211_ATTR_SCHED_SCAN_INTERVAL"], "120": ["@NL80211_ATTR_INTERFACE_COMBINATIONS"], "121": ["@NL80211_ATTR_SOFTWARE_IFTYPES"], "122": ["@NL80211_ATTR_REKEY_DATA"], "123": ["@NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS"], "124": ["@NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN"], "125": ["@NL80211_ATTR_SCAN_SUPP_RATES"], "126": ["@NL80211_ATTR_HIDDEN_SSID"], "127": ["@NL80211_ATTR_IE_PROBE_RESP"], "128": ["@NL80211_ATTR_IE_ASSOC_RESP"], "129": ["@NL80211_ATTR_STA_WME"], "130": ["@NL80211_ATTR_SUPPORT_AP_UAPSD"], "131": ["@NL80211_ATTR_ROAM_SUPPORT"], "132": ["@NL80211_ATTR_SCHED_SCAN_MATCH"], "133": ["@NL80211_ATTR_MAX_MATCH_SETS"], "134": ["@NL80211_ATTR_PMKSA_CANDIDATE"], "135": ["@NL80211_ATTR_TX_NO_CCK_RATE"], "136": ["@NL80211_ATTR_TDLS_ACTION"], "137": ["@NL80211_ATTR_TDLS_DIALOG_TOKEN"], "138": ["@NL80211_ATTR_TDLS_OPERATION"], "139": ["@NL80211_ATTR_TDLS_SUPPORT"], "140": ["@NL80211_ATTR_TDLS_EXTERNAL_SETUP"], "141": ["@NL80211_ATTR_DEVICE_AP_SME"], "142": ["@NL80211_ATTR_DONT_WAIT_FOR_ACK"], "143": ["@NL80211_ATTR_FEATURE_FLAGS"], "144": ["@NL80211_ATTR_PROBE_RESP_OFFLOAD"], "145": ["@NL80211_ATTR_PROBE_RESP"], "146": ["@NL80211_ATTR_DFS_REGION"], "147": ["@NL80211_ATTR_DISABLE_HT"], "148": ["@NL80211_ATTR_HT_CAPABILITY_MASK"], "149": ["@NL80211_ATTR_NOACK_MAP"], "150": ["@NL80211_ATTR_INACTIVITY_TIMEOUT"], "151": ["@NL80211_ATTR_RX_SIGNAL_DBM"], "152": ["@NL80211_ATTR_BG_SCAN_PERIOD"], "153": ["@NL80211_ATTR_WDEV"], "154": ["@NL80211_ATTR_USER_REG_HINT_TYPE"], "155": ["@NL80211_ATTR_CONN_FAILED_REASON"], "156": ["@NL80211_ATTR_SAE_DATA"], "157": ["@NL80211_ATTR_VHT_CAPABILITY"], "158": ["@NL80211_ATTR_SCAN_FLAGS"], "159": ["@NL80211_ATTR_CHANNEL_WIDTH"], "160": ["@NL80211_ATTR_CENTER_FREQ1"], "161": ["@NL80211_ATTR_CENTER_FREQ2"], "162": ["@NL80211_ATTR_P2P_CTWINDOW"], "163": ["@NL80211_ATTR_P2P_OPPPS"], "164": ["@NL80211_ATTR_LOCAL_MESH_POWER_MODE"], "165": ["@NL80211_ATTR_ACL_POLICY"], "166": ["@NL80211_ATTR_MAC_ADDRS"], "167": ["@NL80211_ATTR_MAC_ACL_MAX"], "168": ["@NL80211_ATTR_RADAR_EVENT"], "169": ["@NL80211_ATTR_EXT_CAPA"], "170": ["@NL80211_ATTR_EXT_CAPA_MASK"], "171": ["@NL80211_ATTR_STA_CAPABILITY"], "172": ["@NL80211_ATTR_STA_EXT_CAPABILITY"], "173": ["@NL80211_ATTR_PROTOCOL_FEATURES"], "174": ["@NL80211_ATTR_SPLIT_WIPHY_DUMP"], "177": ["@NL80211_ATTR_MDID"], "178": ["@NL80211_ATTR_IE_RIC"], "179": ["@NL80211_ATTR_CRIT_PROT_ID"], "180": ["@NL80211_ATTR_MAX_CRIT_PROT_DURATION"], "181": ["@NL80211_ATTR_PEER_AID"], "182": ["@NL80211_ATTR_COALESCE_RULE"], "183": ["@NL80211_ATTR_CH_SWITCH_COUNT"], "184": ["@NL80211_ATTR_CH_SWITCH_BLOCK_TX"], "185": ["@NL80211_ATTR_CSA_IES"], "186": ["@NL80211_ATTR_CSA_C_OFF_BEACON"], "187": ["@NL80211_ATTR_CSA_C_OFF_PRESP"], "188": ["@NL80211_ATTR_RXMGMT_FLAGS"], "189": ["@NL80211_ATTR_STA_SUPPORTED_CHANNELS"], "190": ["@NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES"], "191": ["@NL80211_ATTR_HANDLE_DFS"],"192":["NL80211_ATTR_SUPPORT_5_MHZ"],"193":["NL80211_ATTR_SUPPORT_10_MHZ"], "194":["NL80211_ATTR_OPMODE_NOTIF"], "195":["NL80211_ATTR_VENDOR_ID"], "196":["NL80211_ATTR_VENDOR_SUBCMD"], "197":["NL80211_ATTR_VENDOR_DATA"], "198":["NL80211_ATTR_VENDOR_EVENTS"], "199":["NL80211_ATTR_QOS_MAP"], "200":["NL80211_ATTR_MAC_HINT"], "201":["NL80211_ATTR_WIPHY_FREQ_HINT"], "202":["NL80211_ATTR_MAX_AP_ASSOC_STA"], "203":["NL80211_ATTR_TDLS_PEER_CAPABILITY"], "204":["NL80211_ATTR_SOCKET_OWNER"], "205":["NL80211_ATTR_CSA_C_OFFSETS_TX"], "206":["NL80211_ATTR_MAX_CSA_COUNTERS"], "207":["NL80211_ATTR_TDLS_INITIATOR"], "208":["NL80211_ATTR_USE_RRM"], "209":["NL80211_ATTR_WIPHY_DYN_ACK"], "210":["NL80211_ATTR_TSID"], "211":["NL80211_ATTR_USER_PRIO"], "212":["NL80211_ATTR_ADMITTED_TIME"], "213":["NL80211_ATTR_SMPS_MODE"], "214":["NL80211_ATTR_OPER_CLASS"], "215":["NL80211_ATTR_MAC_MASK"], "216":["NL80211_ATTR_WIPHY_SELF_MANAGED_REG"], "217":["NL80211_ATTR_EXT_FEATURES"], "218":["NL80211_ATTR_SURVEY_RADIO_STATS"], "219":["NL80211_ATTR_NETNS_FD"], "220":["NL80211_ATTR_SCHED_SCAN_DELAY"], "221":["NL80211_ATTR_REG_INDOOR"], "222":["NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS"], "223":["NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL"],"224":["NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS"], "225":["NL80211_ATTR_SCHED_SCAN_PLANS"]} \ No newline at end of file diff --git a/pyric/nlhelp/commands.help b/pyric/nlhelp/commands.help index fd06fd7..f4eb3f1 100644 --- a/pyric/nlhelp/commands.help +++ b/pyric/nlhelp/commands.help @@ -1,5 +1,6 @@ # commands.help (stored in json format) # Automatically generated 2016-04-17T11:06:57.694132 from nl80211.h +# Additions for kernel version 4 added 2016-06-25T10:29:00.0 -{"@NL80211_CMD_GET_REG": {"attrs": [], "desc": "ask the wireless core to send us its currently set\tregulatory domain."}, "@NL80211_CMD_STOP_SCHED_SCAN": {"attrs": [], "desc": "stop if scheduled scan is not running."}, "@NL80211_CMD_START_SCHED_SCAN": {"attrs": ["%NL80211_ATTR_SCHED_SCAN_INTERVAL", "%NL80211_ATTR_SCAN_SSIDS", "%NL80211_ATTR_SCAN_FREQUENCIES", "%NL80211_ATTR_IE"], "desc": "start intervals, as specified by %NL80211_ATTR_SCHED_SCAN_INTERVAL. Like with normal scans, if SSIDs (%NL80211_ATTR_SCAN_SSIDS) are passed, they are used in the probe requests. For broadcast, a broadcast SSID must be passed (ie. an empty string). If no SSID is passed, no probe requests are sent and a passive scan is performed. %NL80211_ATTR_SCAN_FREQUENCIES, if passed, define which channels should be scanned; if not passed, all channels allowed for the current regulatory domain are used. Extra IEs can also be passed from the userspace by using the %NL80211_ATTR_IE attribute."}, "@NL80211_CMD_NEW_SURVEY_RESULTS": {"attrs": [], "desc": "survey NL80211_CMD_GET_SURVEY and on the \"scan\" multicast group)"}, "@NL80211_CMD_SET_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_IFTYPE"], "desc": "Set %NL80211_ATTR_IFINDEX and %NL80211_ATTR_IFTYPE."}, "@NL80211_CMD_DISASSOCIATE": {"attrs": [], "desc": "disassociation NL80211_CMD_AUTHENTICATE but for Disassociation frames (similar to MLME-DISASSOCIATE.request and MLME-DISASSOCIATE.indication primitives)."}, "@NL80211_CMD_FRAME": {"attrs": ["%NL80211_ATTR_FRAME", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_DURATION", "%NL80211_ATTR_COOKIE", "%NL80211_ATTR_TX_NO_CCK_RATE"], "desc": "Management command is used both as a request to transmit a management frame and as an event indicating reception of a frame that was not processed in kernel code, but is for us (i.e., which may need to be processed in a user space application). %NL80211_ATTR_FRAME is used to specify the frame contents (including header). %NL80211_ATTR_WIPHY_FREQ is used to indicate on which channel the frame is to be transmitted or was received. If this channel is not the current channel (remain-on-channel or the operational channel) the device will switch to the given channel and transmit the frame, optionally waiting for a response for the time specified using %NL80211_ATTR_DURATION. When called, this operation returns a cookie (%NL80211_ATTR_COOKIE) that will be included with the TX status event pertaining to the TX request. %NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the management frames at CCK rate or not in 2GHz band."}, "@NL80211_CMD_NEW_KEY": {"attrs": ["%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_KEY_CIPHER", "%NL80211_ATTR_KEY_SEQ"], "desc": "add %NL80211_ATTR_KEY_IDX, %NL80211_ATTR_MAC, %NL80211_ATTR_KEY_CIPHER, and %NL80211_ATTR_KEY_SEQ attributes."}, "@NL80211_CMD_STOP_AP": {"attrs": [], "desc": "Stop"}, "@NL80211_CMD_DEL_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX"], "desc": "Virtual %NL80211_ATTR_IFINDEX and %NL80211_ATTR_WIPHY. Can also be sent from userspace to request deletion of a virtual interface, then requires attribute %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNEXPECTED_4ADDR_FRAME": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Sent associated station identified by %NL80211_ATTR_MAC sent a 4addr frame and wasn't already in a 4-addr VLAN. The event will be sent similarly to the %NL80211_CMD_UNEXPECTED_FRAME event, to the same listener."}, "@NL80211_CMD_SET_MESH_CONFIG": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set interface identified by %NL80211_ATTR_IFINDEX"}, "@NL80211_CMD_STOP_P2P_DEVICE": {"attrs": ["%NL80211_ATTR_WDEV"], "desc": "Stop its %NL80211_ATTR_WDEV identifier."}, "@NL80211_CMD_START_P2P_DEVICE": {"attrs": ["%NL80211_ATTR_WDEV"], "desc": "Start its %NL80211_ATTR_WDEV identifier. It must have been created with %NL80211_CMD_NEW_INTERFACE previously. After it has been started, the P2P Device can be used for P2P operations, e.g. remain-on-channel and public action frame TX."}, "@NL80211_CMD_SET_COALESCE": {"attrs": [], "desc": "Configure"}, "@NL80211_CMD_DEL_WIPHY": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_WIPHY_NAME"], "desc": "Wiphy %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME."}, "@NL80211_CMD_SET_STATION": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Set %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_LEAVE_MESH": {"attrs": [], "desc": "Leave network is determined by the network interface."}, "@NL80211_CMD_GET_KEY": {"attrs": ["%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_MAC"], "desc": "Get by %NL80211_ATTR_KEY_IDX and/or %NL80211_ATTR_MAC."}, "@NL80211_CMD_GET_SURVEY": {"attrs": [], "desc": "get"}, "@NL80211_CMD_TDLS_MGMT": {"attrs": [], "desc": "Send"}, "@NL80211_CMD_SET_BSS": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_SET_WOWLAN": {"attrs": ["%NL80211_ATTR_WOWLAN_TRIGGERS"], "desc": "set Since wireless is more complex than wired ethernet, it supports various triggers. These triggers can be configured through this command with the %NL80211_ATTR_WOWLAN_TRIGGERS attribute. For more background information, see http://wireless.kernel.org/en/users/Documentation/WoWLAN. The @NL80211_CMD_SET_WOWLAN command can also be used as a notification from the driver reporting the wakeup reason. In this case, the @NL80211_ATTR_WOWLAN_TRIGGERS attribute will contain the reason for the wakeup, if it was caused by wireless. If it is not present in the wakeup notification, the wireless device didn't cause the wakeup but reports that it was woken up."}, "@NL80211_CMD_NEW_STATION": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Add the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_SET_PMKSA": {"attrs": ["%NL80211_ATTR_PMKID"], "desc": "Add (for the BSSID) and %NL80211_ATTR_PMKID."}, "@NL80211_CMD_SET_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": " destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_DEL_STATION": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Remove or, if no MAC address given, all stations, on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNPROT_DISASSOCIATE": {"attrs": [], "desc": "Unprotected notification. This event is used to indicate that an unprotected disassociation frame was dropped when MFP is in use."}, "@NL80211_CMD_CH_SWITCH_NOTIFY": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_FREQ"], "desc": "An independently of the userspace SME, send this event indicating %NL80211_ATTR_IFINDEX is now on %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width."}, "@NL80211_CMD_SET_KEY": {"attrs": ["%NL80211_ATTR_KEY_DEFAULT_MGMT", "%NL80211_ATTR_KEY_THRESHOLD"], "desc": "Set %NL80211_ATTR_KEY_DEFAULT_MGMT, or %NL80211_ATTR_KEY_THRESHOLD."}, "@NL80211_CMD_SET_MAC_ACL": {"attrs": ["%NL80211_ATTR_MAC_ADDRS", "%NL80211_ATTR_ACL_POLICY"], "desc": "sets This is to be used with the drivers advertising the support of MAC address based access control. List of MAC addresses is passed in %NL80211_ATTR_MAC_ADDRS and ACL policy is passed in %NL80211_ATTR_ACL_POLICY. Driver will enable ACL with this list, if it is not already done. The new list will replace any existing list. Driver will clear its ACL when the list of MAC addresses passed is empty. This command is used in AP/P2P GO mode. Driver has to make sure to clear its ACL list during %NL80211_CMD_STOP_AP."}, "@NL80211_CMD_GET_WOWLAN": {"attrs": [], "desc": "get"}, "@NL80211_CMD_GET_STATION": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Get %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNSPEC": {"attrs": [], "desc": "unspecified"}, "@NL80211_CMD_NEW_PEER_CANDIDATE": {"attrs": [], "desc": "Notification beacon or probe response from a compatible mesh peer. This is only sent while no station information (sta_info) exists for the new peer candidate and when @NL80211_MESH_SETUP_USERSPACE_AUTH, @NL80211_MESH_SETUP_USERSPACE_AMPE, or @NL80211_MESH_SETUP_USERSPACE_MPM is set. On reception of this notification, userspace may decide to create a new station (@NL80211_CMD_NEW_STATION). To stop this notification from reoccurring, the userspace authentication daemon may want to create the new station with the AUTHENTICATED flag unset and maybe change it later depending on the authentication result."}, "@NL80211_CMD_REGISTER_ACTION": {"attrs": [], "desc": "Alias backward compatibility"}, "@NL80211_CMD_REG_CHANGE": {"attrs": ["%NL80211_ATTR_REG_INITIATOR", "%NL80211_ATTR_REG_ALPHA2", "%NL80211_ATTR_REG_TYPE", "%NL80211_ATTR_REG_ALPHA2"], "desc": "indicates has been changed and provides details of the request information that caused the change such as who initiated the regulatory request (%NL80211_ATTR_REG_INITIATOR), the wiphy_idx (%NL80211_ATTR_REG_ALPHA2) on which the request was made from if the initiator was %NL80211_REGDOM_SET_BY_COUNTRY_IE or %NL80211_REGDOM_SET_BY_DRIVER, the type of regulatory domain set (%NL80211_ATTR_REG_TYPE), if the type of regulatory domain is %NL80211_REG_TYPE_COUNTRY the alpha2 to which we have moved on to (%NL80211_ATTR_REG_ALPHA2)."}, "@NL80211_CMD_CONN_FAILED": {"attrs": ["%NL80211_ATTR_CONN_FAILED_REASON"], "desc": "connection notify userspace that AP has rejected the connection request from a station, due to particular reason. %NL80211_ATTR_CONN_FAILED_REASON is used for this."}, "@NL80211_CMD_SCAN_ABORTED": {"attrs": [], "desc": "scan partial scan results may be available"}, "@NL80211_CMD_SET_POWER_SAVE": {"attrs": [], "desc": "Set"}, "@NL80211_CMD_SET_MGMT_EXTRA_IE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MGMT_SUBTYPE", "%NL80211_ATTR_IE"], "desc": "Set interface is identified with %NL80211_ATTR_IFINDEX and the management frame subtype with %NL80211_ATTR_MGMT_SUBTYPE. The extra IE data to be added to the end of the specified management frame is specified with %NL80211_ATTR_IE. If the command succeeds, the requested data will be added to all specified management frames generated by kernel/firmware/driver. Note: This command has been removed and it is only reserved at this point to avoid re-using existing command number. The functionality this command was planned for has been provided with cleaner design with the option to specify additional IEs in NL80211_CMD_TRIGGER_SCAN, NL80211_CMD_AUTHENTICATE, NL80211_CMD_ASSOCIATE, NL80211_CMD_DEAUTHENTICATE, and NL80211_CMD_DISASSOCIATE."}, "@NL80211_CMD_SET_REKEY_OFFLOAD": {"attrs": ["%NL80211_ATTR_REKEY_DATA"], "desc": "This the necessary information for supporting GTK rekey offload. This feature is typically used during WoWLAN. The configuration data is contained in %NL80211_ATTR_REKEY_DATA (which is nested and contains the data in sub-attributes). After rekeying happened, this command may also be sent by the driver as an MLME event to inform userspace of the new replay counter."}, "@NL80211_CMD_SET_CHANNEL": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set and the attributes determining channel width) the given interface (identifed by %NL80211_ATTR_IFINDEX) shall operate on. In case multiple channels are supported by the device, the mechanism with which it switches channels is implementation-defined. When a monitor interface is given, it can only switch channel while no other interfaces are operating to avoid disturbing the operation of any other interfaces, and other interfaces will again take precedence when they are used."}, "@NL80211_CMD_START_AP": {"attrs": ["%NL80211_ATTR_BEACON_INTERVAL", "%NL80211_ATTR_DTIM_PERIOD", "%NL80211_ATTR_SSID", "%NL80211_ATTR_HIDDEN_SSID", "%NL80211_ATTR_CIPHERS_PAIRWISE", "%NL80211_ATTR_CIPHER_GROUP", "%NL80211_ATTR_WPA_VERSIONS", "%NL80211_ATTR_AKM_SUITES", "%NL80211_ATTR_PRIVACY", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_INACTIVITY_TIMEOUT", "%NL80211_ATTR_ACL_POLICY", "%NL80211_ATTR_MAC_ADDRS", "%NL80211_ATTR_WIPHY_FREQ"], "desc": "Start are like for %NL80211_CMD_SET_BEACON, and additionally parameters that do not change are used, these include %NL80211_ATTR_BEACON_INTERVAL, %NL80211_ATTR_DTIM_PERIOD, %NL80211_ATTR_SSID, %NL80211_ATTR_HIDDEN_SSID, %NL80211_ATTR_CIPHERS_PAIRWISE, %NL80211_ATTR_CIPHER_GROUP, %NL80211_ATTR_WPA_VERSIONS, %NL80211_ATTR_AKM_SUITES, %NL80211_ATTR_PRIVACY, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_INACTIVITY_TIMEOUT, %NL80211_ATTR_ACL_POLICY and %NL80211_ATTR_MAC_ADDRS. The channel to use can be set on the interface or be given using the %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width."}, "@NL80211_CMD_DEL_PMKSA": {"attrs": ["%NL80211_ATTR_PMKID"], "desc": "Delete (for the BSSID) and %NL80211_ATTR_PMKID."}, "@NL80211_CMD_UNEXPECTED_FRAME": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Used (or GO) interface (i.e. hostapd) to ask for unexpected frames to implement sending deauth to stations that send unexpected class 3 frames. Also used as the event sent by the kernel when such a frame is received. For the event, the %NL80211_ATTR_MAC attribute carries the TA and other attributes like the interface index are present. If used as the command it must have an interface index and you can only unsubscribe from the event by closing the socket. Subscription is also for %NL80211_CMD_UNEXPECTED_4ADDR_FRAME events."}, "@NL80211_CMD_GET_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Get destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_GET_BEACON": {"attrs": [], "desc": ""}, "@NL80211_CMD_PMKSA_CANDIDATE": {"attrs": [], "desc": "This of PMKSA caching dandidates."}, "@NL80211_CMD_PROBE_CLIENT": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_COOKIE", "%NL80211_ATTR_ACK"], "desc": "Probe by sending a null data frame to it and reporting when the frame is acknowleged. This is used to allow timing out inactive clients. Uses %NL80211_ATTR_IFINDEX and %NL80211_ATTR_MAC. The command returns a direct reply with an %NL80211_ATTR_COOKIE that is later used to match up the event with the request. The event includes the same data and has %NL80211_ATTR_ACK set if the frame was ACKed."}, "@NL80211_CMD_NEW_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFTYPE", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFTYPE", "%NL80211_ATTR_IFNAME"], "desc": "Newly to %NL80211_CMD_GET_INTERFACE. Has %NL80211_ATTR_IFINDEX, %NL80211_ATTR_WIPHY and %NL80211_ATTR_IFTYPE attributes. Can also be sent from userspace to request creation of a new virtual interface, then requires attributes %NL80211_ATTR_WIPHY, %NL80211_ATTR_IFTYPE and %NL80211_ATTR_IFNAME."}, "@NL80211_CMD_SET_TX_BITRATE_MASK": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface and @NL80211_ATTR_TX_RATES the set of allowed rates."}, "@NL80211_CMD_NEW_SCAN_RESULTS": {"attrs": [], "desc": "scan NL80211_CMD_GET_SCAN and on the \"scan\" multicast group)"}, "@NL80211_CMD_GET_WIPHY": {"attrs": [], "desc": "request to get a list of all present wiphys."}, "@NL80211_CMD_SET_NOACK_MAP": {"attrs": [], "desc": "sets No Acknowledgement Policy should be applied."}, "@NL80211_CMD_ACTION": {"attrs": [], "desc": "Alias"}, "@NL80211_CMD_FLUSH_PMKSA": {"attrs": [], "desc": "Flush"}, "@NL80211_CMD_ASSOCIATE": {"attrs": [], "desc": "association NL80211_CMD_AUTHENTICATE but for Association and Reassociation (similar to MLME-ASSOCIATE.request, MLME-REASSOCIATE.request, MLME-ASSOCIATE.confirm or MLME-REASSOCIATE.confirm primitives)."}, "@NL80211_CMD_GET_PROTOCOL_FEATURES": {"attrs": ["%NL80211_ATTR_PROTOCOL_FEATURES"], "desc": "Get i.e. features for the nl80211 protocol rather than device features. Returns the features in the %NL80211_ATTR_PROTOCOL_FEATURES bitmap."}, "@NL80211_CMD_DEAUTHENTICATE": {"attrs": [], "desc": "deauthentication NL80211_CMD_AUTHENTICATE but for Deauthentication frames (similar to MLME-DEAUTHENTICATION.request and MLME-DEAUTHENTICATE.indication primitives)."}, "@NL80211_CMD_CRIT_PROTOCOL_STOP": {"attrs": [], "desc": "Indicates return back to normal."}, "@NL80211_CMD_FT_EVENT": {"attrs": [], "desc": "Send to the supplicant. This will carry the target AP's MAC address along with the relevant Information Elements. This event is used to report received FT IEs (MDIE, FTIE, RSN IE, TIE, RICIE)."}, "@NL80211_CMD_NEW_WIPHY": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_WIPHY_NAME"], "desc": "Newly or rename notification. Has attributes %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME."}, "@NL80211_CMD_UPDATE_FT_IES": {"attrs": [], "desc": "Pass Information Element to the WLAN driver"}, "@NL80211_CMD_SET_WDS_PEER": {"attrs": [], "desc": "Set"}, "@NL80211_CMD_SCHED_SCAN_STOPPED": {"attrs": [], "desc": "indicates stopped. The driver may issue this event at any time during a scheduled scan. One reason for stopping the scan is if the hardware does not support starting an association or a normal scan while running a scheduled scan. This event is also sent when the %NL80211_CMD_STOP_SCHED_SCAN command is received or when the interface is brought down while a scheduled scan was running."}, "@NL80211_CMD_FRAME_TX_STATUS": {"attrs": ["%NL80211_ATTR_COOKIE", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_ACK"], "desc": "Report transmitted with %NL80211_CMD_FRAME. %NL80211_ATTR_COOKIE identifies the TX command and %NL80211_ATTR_FRAME includes the contents of the frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged the frame."}, "@NL80211_CMD_TDLS_OPER": {"attrs": ["%NL80211_ATTR_TDLS_OPERATION", "%NL80211_ATTR_MAC", "%NL80211_ATTR_REASON_CODE"], "desc": "Perform In addition, this can be used as an event to request userspace to take actions on TDLS links (set up a new link or tear down an existing one). In such events, %NL80211_ATTR_TDLS_OPERATION indicates the requested operation, %NL80211_ATTR_MAC contains the peer MAC address, and %NL80211_ATTR_REASON_CODE the reason code to be used (only with %NL80211_TDLS_TEARDOWN)."}, "@NL80211_CMD_GET_SCAN": {"attrs": [], "desc": "get"}, "@NL80211_CMD_SET_WIPHY": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_NAME", "%NL80211_ATTR_WIPHY_TXQ_PARAMS", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_WIPHY_RETRY_SHORT", "%NL80211_ATTR_WIPHY_RETRY_LONG", "%NL80211_ATTR_WIPHY_FRAG_THRESHOLD", "%NL80211_ATTR_WIPHY_RTS_THRESHOLD"], "desc": "set %NL80211_ATTR_IFINDEX; can be used to set %NL80211_ATTR_WIPHY_NAME, %NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ (and the attributes determining the channel width; this is used for setting monitor mode channel), %NL80211_ATTR_WIPHY_RETRY_SHORT, %NL80211_ATTR_WIPHY_RETRY_LONG, %NL80211_ATTR_WIPHY_FRAG_THRESHOLD, and/or %NL80211_ATTR_WIPHY_RTS_THRESHOLD. However, for setting the channel, see %NL80211_CMD_SET_CHANNEL instead, the support here is for backward compatibility only."}, "@NL80211_CMD_AUTHENTICATE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_SSID", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_IE", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_TIMED_OUT", "%NL80211_ATTR_MAC"], "desc": "authentication This command is used both as a command (request to authenticate) and as an event on the \"mlme\" multicast group indicating completion of the authentication process. When used as a command, %NL80211_ATTR_IFINDEX is used to identify the interface. %NL80211_ATTR_MAC is used to specify PeerSTAAddress (and BSSID in case of station mode). %NL80211_ATTR_SSID is used to specify the SSID (mainly for association, but is included in authentication request, too, to help BSS selection. %NL80211_ATTR_WIPHY_FREQ is used to specify the frequence of the channel in MHz. %NL80211_ATTR_AUTH_TYPE is used to specify the authentication type. %NL80211_ATTR_IE is used to define IEs (VendorSpecificInfo, but also including RSN IE and FT IEs) to be added to the frame. When used as an event, this reports reception of an Authentication frame in station and IBSS modes when the local MLME processed the frame, i.e., it was for the local STA and was received in correct state. This is similar to MLME-AUTHENTICATE.confirm primitive in the MLME SAP interface (kernel providing MLME, userspace SME). The included %NL80211_ATTR_FRAME attribute contains the management frame (including both the header and frame body, but not FCS). This event is also used to indicate if the authentication attempt timed out. In that case the %NL80211_ATTR_FRAME attribute is replaced with a %NL80211_ATTR_TIMED_OUT flag (and %NL80211_ATTR_MAC to indicate which pending authentication timed out)."}, "@NL80211_CMD_DEL_PATH": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Remove or, if no MAC address given, all mesh paths, on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_GET_MESH_CONFIG": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Get interface identified by %NL80211_ATTR_IFINDEX"}, "@NL80211_CMD_NEW_PATH": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Add the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_NEW_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_MPATH_NEXT_HOP"], "desc": "Create %NL80211_ATTR_MAC via %NL80211_ATTR_MPATH_NEXT_HOP."}, "@NL80211_CMD_MICHAEL_MIC_FAILURE": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_KEY_TYPE", "%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_KEY_SEQ"], "desc": "notification MIC (part of TKIP) failure; sent on the \"mlme\" multicast group; the event includes %NL80211_ATTR_MAC to describe the source MAC address of the frame with invalid MIC, %NL80211_ATTR_KEY_TYPE to show the key type, %NL80211_ATTR_KEY_IDX to indicate the key identifier, and %NL80211_ATTR_KEY_SEQ to indicate the TSC value of the frame; this event matches with MLME-MICHAELMICFAILURE.indication() primitive"}, "@NL80211_CMD_SET_WIPHY_NETNS": {"attrs": [], "desc": "Set associated with this wiphy must be down and will follow."}, "@NL80211_CMD_DEL_KEY": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "delete or %NL80211_ATTR_MAC."}, "@NL80211_CMD_SET_CQM": {"attrs": [], "desc": "Connection is used to configure connection quality monitoring notification trigger levels."}, "@NL80211_CMD_REMAIN_ON_CHANNEL": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_DURATION", "%NL80211_ATTR_COOKIE"], "desc": "Request channel for the specified amount of time. This can be used to do off-channel operations like transmit a Public Action frame and wait for a response while being associated to an AP on another channel. %NL80211_ATTR_IFINDEX is used to specify which interface (and thus radio) is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the frequency for the operation. %NL80211_ATTR_DURATION is used to specify the duration in milliseconds to remain on the channel. This command is also used as an event to notify when the requested duration starts (it may take a while for the driver to schedule this time due to other concurrent needs for the radio). When called, this operation returns a cookie (%NL80211_ATTR_COOKIE) that will be included with any events pertaining to this request; the cookie is also used to cancel the request."}, "@NL80211_CMD_JOIN_IBSS": {"attrs": ["%NL80211_ATTR_BEACON_INTERVAL"], "desc": "Join FREQ attribute (for the initial frequency if no peer can be found) and optionally a MAC (as BSSID) and FREQ_FIXED attribute if those should be fixed rather than automatically determined. Can only be executed on a network interface that is UP, and fixed BSSID/FREQ may be rejected. Another optional parameter is the beacon interval, given in the %NL80211_ATTR_BEACON_INTERVAL attribute, which if not given defaults to 100 TU (102.4ms)."}, "@NL80211_CMD_REG_BEACON_HINT": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_FREQ_BEFORE", "%NL80211_ATTR_FREQ_AFTER"], "desc": "indicates has been found while world roaming thus enabling active scan or any mode of operation that initiates TX (beacons) on a channel where we would not have been able to do either before. As an example if you are world roaming (regulatory domain set to world or if your driver is using a custom world roaming regulatory domain) and while doing a passive scan on the 5 GHz band you find an AP there (if not on a DFS channel) you will now be able to actively scan for that AP or use AP mode on your card on that same channel. Note that this will never be used for channels 1-11 on the 2 GHz band as they are always enabled world wide. This beacon hint is only sent if your device had either disabled active scanning or beaconing on a channel. We send to userspace the wiphy on which we removed a restriction from (%NL80211_ATTR_WIPHY) and the channel on which this occurred before (%NL80211_ATTR_FREQ_BEFORE) and after (%NL80211_ATTR_FREQ_AFTER) the beacon hint was processed."}, "@NL80211_CMD_CRIT_PROTOCOL_START": {"attrs": [], "desc": "Indicates a critical protocol that needs more reliability in the connection to complete."}, "@NL80211_CMD_UNPROT_DEAUTHENTICATE": {"attrs": [], "desc": "Unprotected notification. This event is used to indicate that an unprotected deauthentication frame was dropped when MFP is in use."}, "@NL80211_CMD_REQ_SET_REG": {"attrs": [], "desc": "ask to the specified ISO/IEC 3166-1 alpha2 country code. The core will store this as a valid request and then query userspace for it."}, "@NL80211_CMD_SCHED_SCAN_RESULTS": {"attrs": [], "desc": "indicates results available."}, "@NL80211_CMD_REGISTER_BEACONS": {"attrs": [], "desc": "Register other BSSes when any interfaces are in AP mode. This helps implement OLBC handling in hostapd. Beacons are reported in %NL80211_CMD_FRAME messages. Note that per PHY only one application may register."}, "@NL80211_CMD_NEW_BEACON": {"attrs": [], "desc": "old"}, "@NL80211_CMD_NOTIFY_CQM": {"attrs": [], "desc": "Connection command is used as an event to indicate the that a trigger level was reached."}, "@NL80211_CMD_TRIGGER_SCAN": {"attrs": ["%NL80211_ATTR_TX_NO_CCK_RATE"], "desc": "trigger %NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the probe requests at CCK rate or not."}, "@NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_COOKIE"], "desc": "This pending remain-on-channel duration if the desired operation has been completed prior to expiration of the originally requested duration. %NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify the radio. The %NL80211_ATTR_COOKIE attribute must be given as well to uniquely identify the request. This command is also used as an event to notify when a requested remain-on-channel duration has expired."}, "@NL80211_CMD_REGISTER_FRAME": {"attrs": [], "desc": "Register (via @NL80211_CMD_FRAME) for processing in userspace. This command requires an interface index, a frame type attribute (optional for backward compatibility reasons, if not given assumes action frames) and a match attribute containing the first few bytes of the frame that should match, e.g. a single byte for only a category match or four bytes for vendor frames including the OUI. The registration cannot be dropped, but is removed automatically when the netlink socket is closed. Multiple registrations can be made."}, "@NL80211_CMD_CHANNEL_SWITCH": {"attrs": ["%NL80211_ATTR_CH_SWITCH_COUNT", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_CH_SWITCH_BLOCK_TX"], "desc": "Perform the new channel information (Channel Switch Announcement - CSA) in the beacon for some time (as defined in the %NL80211_ATTR_CH_SWITCH_COUNT parameter) and then change to the new channel. Userspace provides the new channel information (using %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width). %NL80211_ATTR_CH_SWITCH_BLOCK_TX may be supplied to inform other station that transmission must be blocked until the channel switch is complete."}, "@NL80211_CMD_GET_INTERFACE": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX"], "desc": "Request either a dump request on a %NL80211_ATTR_WIPHY or a specific get on an %NL80211_ATTR_IFINDEX is supported."}, "@NL80211_CMD_RADAR_DETECT": {"attrs": ["%NL80211_ATTR_RADAR_EVENT"], "desc": "Start a radar is detected or the channel availability scan (CAC) has finished or was aborted, or a radar was detected, usermode will be notified with this event. This command is also used to notify userspace about radars while operating on this channel. %NL80211_ATTR_RADAR_EVENT is used to inform about the type of the event."}, "@NL80211_CMD_GET_POWER_SAVE": {"attrs": [], "desc": "Get"}, "@NL80211_CMD_DISCONNECT": {"attrs": ["%NL80211_ATTR_DISCONNECTED_BY_AP", "%NL80211_ATTR_REASON_CODE"], "desc": "drop userspace that a connection was dropped by the AP or due to other reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and %NL80211_ATTR_REASON_CODE attributes are used."}, "@NL80211_CMD_CONNECT": {"attrs": ["%NL80211_ATTR_SSID", "%NL80211_ATTR_IE", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_USE_MFP", "%NL80211_ATTR_MAC", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_CONTROL_PORT", "%NL80211_ATTR_CONTROL_PORT_ETHERTYPE", "%NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT", "%NL80211_ATTR_BG_SCAN_PERIOD"], "desc": "connection requests to connect to a specified network but without separating auth and assoc steps. For this, you need to specify the SSID in a %NL80211_ATTR_SSID attribute, and can optionally specify the association IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_USE_MFP, %NL80211_ATTR_MAC, %NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT, %NL80211_ATTR_CONTROL_PORT_ETHERTYPE and %NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT. Background scan period can optionally be specified in %NL80211_ATTR_BG_SCAN_PERIOD, if not specified default background scan configuration in driver is used and if period value is 0, bg scan will be disabled. This attribute is ignored if driver does not support roam scan. It is also sent as an event, with the BSSID and response IEs when the connection is established or failed to be established. This can be determined by the STATUS_CODE attribute."}, "@NL80211_CMD_SET_BEACON": {"attrs": ["%NL80211_ATTR_BEACON_HEAD", "%NL80211_ATTR_BEACON_TAIL", "%NL80211_ATTR_IE", "%NL80211_ATTR_IE_PROBE_RESP", "%NL80211_ATTR_IE_ASSOC_RESP"], "desc": "change using the %NL80211_ATTR_BEACON_HEAD and %NL80211_ATTR_BEACON_TAIL attributes. For drivers that generate the beacon and probe responses internally, the following attributes must be provided: %NL80211_ATTR_IE, %NL80211_ATTR_IE_PROBE_RESP and %NL80211_ATTR_IE_ASSOC_RESP."}, "@NL80211_CMD_ACTION_TX_STATUS": {"attrs": [], "desc": "Alias backward compatibility."}, "@NL80211_CMD_JOIN_MESH": {"attrs": [], "desc": "Join mesh config parameters may be given."}, "@NL80211_CMD_ROAM": {"attrs": [], "desc": "request sent as an event when the card/driver roamed by itself."}, "@NL80211_CMD_SET_REG": {"attrs": ["%NL80211_ATTR_REG_ALPHA", "%NL80211_ATTR_REG_RULE_FREQ_", "%NL80211_ATTR_FREQ_RANGE_MAX_BW", "%NL80211_ATTR_REG_RULE_POWER_MAX_ANT_GAIN", "%NL80211_ATTR_REG_RULE_POWER_MAX_EIRP"], "desc": "Set after being queried by the kernel. CRDA replies by sending a regulatory domain structure which consists of %NL80211_ATTR_REG_ALPHA set to our current alpha2 if it found a match. It also provides NL80211_ATTR_REG_RULE_FLAGS, and a set of regulatory rules. Each regulatory rule is a nested set of attributes given by %NL80211_ATTR_REG_RULE_FREQ_[START|END] and %NL80211_ATTR_FREQ_RANGE_MAX_BW with an attached power rule given by %NL80211_ATTR_REG_RULE_POWER_MAX_ANT_GAIN and %NL80211_ATTR_REG_RULE_POWER_MAX_EIRP."}, "@NL80211_CMD_GET_COALESCE": {"attrs": [], "desc": "Get"}, "@NL80211_CMD_FRAME_WAIT_CANCEL": {"attrs": [], "desc": "When command may be used with the corresponding cookie to cancel the wait time if it is known that it is no longer necessary."}, "@NL80211_CMD_DEL_BEACON": {"attrs": [], "desc": "old"}, "@NL80211_CMD_LEAVE_IBSS": {"attrs": [], "desc": "Leave determined by the network interface."}, "@NL80211_CMD_SET_MCAST_RATE": {"attrs": [], "desc": "Change for IBSS or MESH vif."}, "@NL80211_CMD_TESTMODE": {"attrs": [], "desc": "testmode to identify the device, and the TESTDATA blob attribute to pass through to the driver."}, "@NL80211_CMD_DEL_MPATH": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Delete %NL80211_ATTR_MAC."}} -{"0": "@NL80211_CMD_UNSPEC", "1": "@NL80211_CMD_GET_WIPHY", "2": "@NL80211_CMD_SET_WIPHY", "3": "@NL80211_CMD_NEW_WIPHY", "4": "@NL80211_CMD_DEL_WIPHY", "5": "@NL80211_CMD_GET_INTERFACE", "6": "@NL80211_CMD_SET_INTERFACE", "7": "@NL80211_CMD_NEW_INTERFACE", "8": "@NL80211_CMD_DEL_INTERFACE", "9": "@NL80211_CMD_GET_KEY", "10": "@NL80211_CMD_SET_KEY", "11": "@NL80211_CMD_NEW_KEY", "12": "@NL80211_CMD_DEL_KEY", "13": "@NL80211_CMD_GET_BEACON", "14": "@NL80211_CMD_SET_BEACON", "15": ["@NL80211_CMD_START_AP", "@NL80211_CMD_NEW_BEACON"], "16": ["@NL80211_CMD_STOP_AP", "@NL80211_CMD_DEL_BEACON"], "17": "@NL80211_CMD_GET_STATION", "18": "@NL80211_CMD_SET_STATION", "19": "@NL80211_CMD_NEW_STATION", "20": "@NL80211_CMD_DEL_STATION", "21": "@NL80211_CMD_GET_MPATH", "22": "@NL80211_CMD_SET_MPATH", "23": "@NL80211_CMD_NEW_MPATH", "24": "@NL80211_CMD_DEL_MPATH", "25": "@NL80211_CMD_SET_BSS", "26": "@NL80211_CMD_SET_REG", "27": "@NL80211_CMD_REQ_SET_REG", "28": "@NL80211_CMD_GET_MESH_CONFIG", "29": "@NL80211_CMD_SET_MESH_CONFIG", "30": "@NL80211_CMD_SET_MGMT_EXTRA_IE", "31": "@NL80211_CMD_GET_REG", "32": "@NL80211_CMD_GET_SCAN", "33": "@NL80211_CMD_TRIGGER_SCAN", "34": "@NL80211_CMD_NEW_SCAN_RESULTS", "35": "@NL80211_CMD_SCAN_ABORTED", "36": "@NL80211_CMD_REG_CHANGE", "37": "@NL80211_CMD_AUTHENTICATE", "38": "@NL80211_CMD_ASSOCIATE", "39": "@NL80211_CMD_DEAUTHENTICATE", "40": "@NL80211_CMD_DISASSOCIATE", "41": "@NL80211_CMD_MICHAEL_MIC_FAILURE", "42": "@NL80211_CMD_REG_BEACON_HINT", "43": "@NL80211_CMD_JOIN_IBSS", "44": "@NL80211_CMD_LEAVE_IBSS", "45": "@NL80211_CMD_TESTMODE", "46": "@NL80211_CMD_CONNECT", "47": "@NL80211_CMD_ROAM", "48": "@NL80211_CMD_DISCONNECT", "49": "@NL80211_CMD_SET_WIPHY_NETNS", "50": "@NL80211_CMD_GET_SURVEY", "51": "@NL80211_CMD_NEW_SURVEY_RESULTS", "52": "@NL80211_CMD_SET_PMKSA", "53": "@NL80211_CMD_DEL_PMKSA", "54": "@NL80211_CMD_FLUSH_PMKSA", "55": "@NL80211_CMD_REMAIN_ON_CHANNEL", "56": "@NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL", "57": "@NL80211_CMD_SET_TX_BITRATE_MASK", "58": ["@NL80211_CMD_REGISTER_ACTION", "@NL80211_CMD_REGISTER_FRAME"], "59": ["@NL80211_CMD_FRAME", "@NL80211_CMD_ACTION"], "60": ["@NL80211_CMD_FRAME_TX_STATUS", "@NL80211_CMD_ACTION_TX_STATUS"], "61": "@NL80211_CMD_SET_POWER_SAVE", "62": "@NL80211_CMD_GET_POWER_SAVE", "63": "@NL80211_CMD_SET_CQM", "64": "@NL80211_CMD_NOTIFY_CQM", "65": "@NL80211_CMD_SET_CHANNEL", "66": "@NL80211_CMD_SET_WDS_PEER", "67": "@NL80211_CMD_FRAME_WAIT_CANCEL", "68": "@NL80211_CMD_JOIN_MESH", "69": "@NL80211_CMD_LEAVE_MESH", "70": "@NL80211_CMD_UNPROT_DEAUTHENTICATE", "71": "@NL80211_CMD_UNPROT_DISASSOCIATE", "72": "@NL80211_CMD_NEW_PEER_CANDIDATE", "73": "@NL80211_CMD_GET_WOWLAN", "74": "@NL80211_CMD_SET_WOWLAN", "75": "@NL80211_CMD_START_SCHED_SCAN", "76": "@NL80211_CMD_STOP_SCHED_SCAN", "77": "@NL80211_CMD_SCHED_SCAN_RESULTS", "78": "@NL80211_CMD_SCHED_SCAN_STOPPED", "79": "@NL80211_CMD_SET_REKEY_OFFLOAD", "80": "@NL80211_CMD_PMKSA_CANDIDATE", "81": "@NL80211_CMD_TDLS_OPER", "82": "@NL80211_CMD_TDLS_MGMT", "83": "@NL80211_CMD_UNEXPECTED_FRAME", "84": "@NL80211_CMD_PROBE_CLIENT", "85": "@NL80211_CMD_REGISTER_BEACONS", "86": "@NL80211_CMD_UNEXPECTED_4ADDR_FRAME", "87": "@NL80211_CMD_SET_NOACK_MAP", "88": "@NL80211_CMD_CH_SWITCH_NOTIFY", "89": "@NL80211_CMD_START_P2P_DEVICE", "90": "@NL80211_CMD_STOP_P2P_DEVICE", "91": "@NL80211_CMD_CONN_FAILED", "92": "@NL80211_CMD_SET_MCAST_RATE", "93": "@NL80211_CMD_SET_MAC_ACL", "94": "@NL80211_CMD_RADAR_DETECT", "95": "@NL80211_CMD_GET_PROTOCOL_FEATURES", "96": "@NL80211_CMD_UPDATE_FT_IES", "97": "@NL80211_CMD_FT_EVENT", "98": "@NL80211_CMD_CRIT_PROTOCOL_START", "99": "@NL80211_CMD_CRIT_PROTOCOL_STOP", "100": "@NL80211_CMD_GET_COALESCE", "101": "@NL80211_CMD_SET_COALESCE", "102": "@NL80211_CMD_CHANNEL_SWITCH"} \ No newline at end of file +{"@NL80211_CMD_GET_REG": {"attrs": [], "desc": "ask the wireless core to send us its currently set\tregulatory domain."}, "@NL80211_CMD_STOP_SCHED_SCAN": {"attrs": [], "desc": "stop if scheduled scan is not running."}, "@NL80211_CMD_START_SCHED_SCAN": {"attrs": ["%NL80211_ATTR_SCHED_SCAN_INTERVAL", "%NL80211_ATTR_SCAN_SSIDS", "%NL80211_ATTR_SCAN_FREQUENCIES", "%NL80211_ATTR_IE"], "desc": "start intervals, as specified by %NL80211_ATTR_SCHED_SCAN_INTERVAL. Like with normal scans, if SSIDs (%NL80211_ATTR_SCAN_SSIDS) are passed, they are used in the probe requests. For broadcast, a broadcast SSID must be passed (ie. an empty string). If no SSID is passed, no probe requests are sent and a passive scan is performed. %NL80211_ATTR_SCAN_FREQUENCIES, if passed, define which channels should be scanned; if not passed, all channels allowed for the current regulatory domain are used. Extra IEs can also be passed from the userspace by using the %NL80211_ATTR_IE attribute."}, "@NL80211_CMD_NEW_SURVEY_RESULTS": {"attrs": [], "desc": "survey NL80211_CMD_GET_SURVEY and on the \"scan\" multicast group)"}, "@NL80211_CMD_SET_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_IFTYPE"], "desc": "Set %NL80211_ATTR_IFINDEX and %NL80211_ATTR_IFTYPE."}, "@NL80211_CMD_DISASSOCIATE": {"attrs": [], "desc": "disassociation NL80211_CMD_AUTHENTICATE but for Disassociation frames (similar to MLME-DISASSOCIATE.request and MLME-DISASSOCIATE.indication primitives)."}, "@NL80211_CMD_FRAME": {"attrs": ["%NL80211_ATTR_FRAME", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_DURATION", "%NL80211_ATTR_COOKIE", "%NL80211_ATTR_TX_NO_CCK_RATE"], "desc": "Management command is used both as a request to transmit a management frame and as an event indicating reception of a frame that was not processed in kernel code, but is for us (i.e., which may need to be processed in a user space application). %NL80211_ATTR_FRAME is used to specify the frame contents (including header). %NL80211_ATTR_WIPHY_FREQ is used to indicate on which channel the frame is to be transmitted or was received. If this channel is not the current channel (remain-on-channel or the operational channel) the device will switch to the given channel and transmit the frame, optionally waiting for a response for the time specified using %NL80211_ATTR_DURATION. When called, this operation returns a cookie (%NL80211_ATTR_COOKIE) that will be included with the TX status event pertaining to the TX request. %NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the management frames at CCK rate or not in 2GHz band."}, "@NL80211_CMD_NEW_KEY": {"attrs": ["%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_KEY_CIPHER", "%NL80211_ATTR_KEY_SEQ"], "desc": "add %NL80211_ATTR_KEY_IDX, %NL80211_ATTR_MAC, %NL80211_ATTR_KEY_CIPHER, and %NL80211_ATTR_KEY_SEQ attributes."}, "@NL80211_CMD_STOP_AP": {"attrs": [], "desc": "Stop"}, "@NL80211_CMD_DEL_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX"], "desc": "Virtual %NL80211_ATTR_IFINDEX and %NL80211_ATTR_WIPHY. Can also be sent from userspace to request deletion of a virtual interface, then requires attribute %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNEXPECTED_4ADDR_FRAME": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Sent associated station identified by %NL80211_ATTR_MAC sent a 4addr frame and wasn't already in a 4-addr VLAN. The event will be sent similarly to the %NL80211_CMD_UNEXPECTED_FRAME event, to the same listener."}, "@NL80211_CMD_SET_MESH_CONFIG": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set interface identified by %NL80211_ATTR_IFINDEX"}, "@NL80211_CMD_STOP_P2P_DEVICE": {"attrs": ["%NL80211_ATTR_WDEV"], "desc": "Stop its %NL80211_ATTR_WDEV identifier."}, "@NL80211_CMD_START_P2P_DEVICE": {"attrs": ["%NL80211_ATTR_WDEV"], "desc": "Start its %NL80211_ATTR_WDEV identifier. It must have been created with %NL80211_CMD_NEW_INTERFACE previously. After it has been started, the P2P Device can be used for P2P operations, e.g. remain-on-channel and public action frame TX."}, "@NL80211_CMD_SET_COALESCE": {"attrs": [], "desc": "Configure"}, "@NL80211_CMD_DEL_WIPHY": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_WIPHY_NAME"], "desc": "Wiphy %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME."}, "@NL80211_CMD_SET_STATION": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Set %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_LEAVE_MESH": {"attrs": [], "desc": "Leave network is determined by the network interface."}, "@NL80211_CMD_GET_KEY": {"attrs": ["%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_MAC"], "desc": "Get by %NL80211_ATTR_KEY_IDX and/or %NL80211_ATTR_MAC."}, "@NL80211_CMD_GET_SURVEY": {"attrs": [], "desc": "get"}, "@NL80211_CMD_TDLS_MGMT": {"attrs": [], "desc": "Send"}, "@NL80211_CMD_SET_BSS": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_SET_WOWLAN": {"attrs": ["%NL80211_ATTR_WOWLAN_TRIGGERS"], "desc": "set Since wireless is more complex than wired ethernet, it supports various triggers. These triggers can be configured through this command with the %NL80211_ATTR_WOWLAN_TRIGGERS attribute. For more background information, see http://wireless.kernel.org/en/users/Documentation/WoWLAN. The @NL80211_CMD_SET_WOWLAN command can also be used as a notification from the driver reporting the wakeup reason. In this case, the @NL80211_ATTR_WOWLAN_TRIGGERS attribute will contain the reason for the wakeup, if it was caused by wireless. If it is not present in the wakeup notification, the wireless device didn't cause the wakeup but reports that it was woken up."}, "@NL80211_CMD_NEW_STATION": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Add the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_SET_PMKSA": {"attrs": ["%NL80211_ATTR_PMKID"], "desc": "Add (for the BSSID) and %NL80211_ATTR_PMKID."}, "@NL80211_CMD_SET_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": " destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_DEL_STATION": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Remove or, if no MAC address given, all stations, on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNPROT_DISASSOCIATE": {"attrs": [], "desc": "Unprotected notification. This event is used to indicate that an unprotected disassociation frame was dropped when MFP is in use."}, "@NL80211_CMD_CH_SWITCH_NOTIFY": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_FREQ"], "desc": "An independently of the userspace SME, send this event indicating %NL80211_ATTR_IFINDEX is now on %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width."}, "@NL80211_CMD_SET_KEY": {"attrs": ["%NL80211_ATTR_KEY_DEFAULT_MGMT", "%NL80211_ATTR_KEY_THRESHOLD"], "desc": "Set %NL80211_ATTR_KEY_DEFAULT_MGMT, or %NL80211_ATTR_KEY_THRESHOLD."}, "@NL80211_CMD_SET_MAC_ACL": {"attrs": ["%NL80211_ATTR_MAC_ADDRS", "%NL80211_ATTR_ACL_POLICY"], "desc": "sets This is to be used with the drivers advertising the support of MAC address based access control. List of MAC addresses is passed in %NL80211_ATTR_MAC_ADDRS and ACL policy is passed in %NL80211_ATTR_ACL_POLICY. Driver will enable ACL with this list, if it is not already done. The new list will replace any existing list. Driver will clear its ACL when the list of MAC addresses passed is empty. This command is used in AP/P2P GO mode. Driver has to make sure to clear its ACL list during %NL80211_CMD_STOP_AP."}, "@NL80211_CMD_GET_WOWLAN": {"attrs": [], "desc": "get"}, "@NL80211_CMD_GET_STATION": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Get %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNSPEC": {"attrs": [], "desc": "unspecified"}, "@NL80211_CMD_NEW_PEER_CANDIDATE": {"attrs": [], "desc": "Notification beacon or probe response from a compatible mesh peer. This is only sent while no station information (sta_info) exists for the new peer candidate and when @NL80211_MESH_SETUP_USERSPACE_AUTH, @NL80211_MESH_SETUP_USERSPACE_AMPE, or @NL80211_MESH_SETUP_USERSPACE_MPM is set. On reception of this notification, userspace may decide to create a new station (@NL80211_CMD_NEW_STATION). To stop this notification from reoccurring, the userspace authentication daemon may want to create the new station with the AUTHENTICATED flag unset and maybe change it later depending on the authentication result."}, "@NL80211_CMD_REGISTER_ACTION": {"attrs": [], "desc": "Alias backward compatibility"}, "@NL80211_CMD_REG_CHANGE": {"attrs": ["%NL80211_ATTR_REG_INITIATOR", "%NL80211_ATTR_REG_ALPHA2", "%NL80211_ATTR_REG_TYPE", "%NL80211_ATTR_REG_ALPHA2"], "desc": "indicates has been changed and provides details of the request information that caused the change such as who initiated the regulatory request (%NL80211_ATTR_REG_INITIATOR), the wiphy_idx (%NL80211_ATTR_REG_ALPHA2) on which the request was made from if the initiator was %NL80211_REGDOM_SET_BY_COUNTRY_IE or %NL80211_REGDOM_SET_BY_DRIVER, the type of regulatory domain set (%NL80211_ATTR_REG_TYPE), if the type of regulatory domain is %NL80211_REG_TYPE_COUNTRY the alpha2 to which we have moved on to (%NL80211_ATTR_REG_ALPHA2)."}, "@NL80211_CMD_CONN_FAILED": {"attrs": ["%NL80211_ATTR_CONN_FAILED_REASON"], "desc": "connection notify userspace that AP has rejected the connection request from a station, due to particular reason. %NL80211_ATTR_CONN_FAILED_REASON is used for this."}, "@NL80211_CMD_SCAN_ABORTED": {"attrs": [], "desc": "scan partial scan results may be available"}, "@NL80211_CMD_SET_POWER_SAVE": {"attrs": [], "desc": "Set"}, "@NL80211_CMD_SET_MGMT_EXTRA_IE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MGMT_SUBTYPE", "%NL80211_ATTR_IE"], "desc": "Set interface is identified with %NL80211_ATTR_IFINDEX and the management frame subtype with %NL80211_ATTR_MGMT_SUBTYPE. The extra IE data to be added to the end of the specified management frame is specified with %NL80211_ATTR_IE. If the command succeeds, the requested data will be added to all specified management frames generated by kernel/firmware/driver. Note: This command has been removed and it is only reserved at this point to avoid re-using existing command number. The functionality this command was planned for has been provided with cleaner design with the option to specify additional IEs in NL80211_CMD_TRIGGER_SCAN, NL80211_CMD_AUTHENTICATE, NL80211_CMD_ASSOCIATE, NL80211_CMD_DEAUTHENTICATE, and NL80211_CMD_DISASSOCIATE."}, "@NL80211_CMD_SET_REKEY_OFFLOAD": {"attrs": ["%NL80211_ATTR_REKEY_DATA"], "desc": "This the necessary information for supporting GTK rekey offload. This feature is typically used during WoWLAN. The configuration data is contained in %NL80211_ATTR_REKEY_DATA (which is nested and contains the data in sub-attributes). After rekeying happened, this command may also be sent by the driver as an MLME event to inform userspace of the new replay counter."}, "@NL80211_CMD_SET_CHANNEL": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set and the attributes determining channel width) the given interface (identifed by %NL80211_ATTR_IFINDEX) shall operate on. In case multiple channels are supported by the device, the mechanism with which it switches channels is implementation-defined. When a monitor interface is given, it can only switch channel while no other interfaces are operating to avoid disturbing the operation of any other interfaces, and other interfaces will again take precedence when they are used."}, "@NL80211_CMD_START_AP": {"attrs": ["%NL80211_ATTR_BEACON_INTERVAL", "%NL80211_ATTR_DTIM_PERIOD", "%NL80211_ATTR_SSID", "%NL80211_ATTR_HIDDEN_SSID", "%NL80211_ATTR_CIPHERS_PAIRWISE", "%NL80211_ATTR_CIPHER_GROUP", "%NL80211_ATTR_WPA_VERSIONS", "%NL80211_ATTR_AKM_SUITES", "%NL80211_ATTR_PRIVACY", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_INACTIVITY_TIMEOUT", "%NL80211_ATTR_ACL_POLICY", "%NL80211_ATTR_MAC_ADDRS", "%NL80211_ATTR_WIPHY_FREQ"], "desc": "Start are like for %NL80211_CMD_SET_BEACON, and additionally parameters that do not change are used, these include %NL80211_ATTR_BEACON_INTERVAL, %NL80211_ATTR_DTIM_PERIOD, %NL80211_ATTR_SSID, %NL80211_ATTR_HIDDEN_SSID, %NL80211_ATTR_CIPHERS_PAIRWISE, %NL80211_ATTR_CIPHER_GROUP, %NL80211_ATTR_WPA_VERSIONS, %NL80211_ATTR_AKM_SUITES, %NL80211_ATTR_PRIVACY, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_INACTIVITY_TIMEOUT, %NL80211_ATTR_ACL_POLICY and %NL80211_ATTR_MAC_ADDRS. The channel to use can be set on the interface or be given using the %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width."}, "@NL80211_CMD_DEL_PMKSA": {"attrs": ["%NL80211_ATTR_PMKID"], "desc": "Delete (for the BSSID) and %NL80211_ATTR_PMKID."}, "@NL80211_CMD_UNEXPECTED_FRAME": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Used (or GO) interface (i.e. hostapd) to ask for unexpected frames to implement sending deauth to stations that send unexpected class 3 frames. Also used as the event sent by the kernel when such a frame is received. For the event, the %NL80211_ATTR_MAC attribute carries the TA and other attributes like the interface index are present. If used as the command it must have an interface index and you can only unsubscribe from the event by closing the socket. Subscription is also for %NL80211_CMD_UNEXPECTED_4ADDR_FRAME events."}, "@NL80211_CMD_GET_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Get destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_GET_BEACON": {"attrs": [], "desc": ""}, "@NL80211_CMD_PMKSA_CANDIDATE": {"attrs": [], "desc": "This of PMKSA caching dandidates."}, "@NL80211_CMD_PROBE_CLIENT": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_COOKIE", "%NL80211_ATTR_ACK"], "desc": "Probe by sending a null data frame to it and reporting when the frame is acknowleged. This is used to allow timing out inactive clients. Uses %NL80211_ATTR_IFINDEX and %NL80211_ATTR_MAC. The command returns a direct reply with an %NL80211_ATTR_COOKIE that is later used to match up the event with the request. The event includes the same data and has %NL80211_ATTR_ACK set if the frame was ACKed."}, "@NL80211_CMD_NEW_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFTYPE", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFTYPE", "%NL80211_ATTR_IFNAME"], "desc": "Newly to %NL80211_CMD_GET_INTERFACE. Has %NL80211_ATTR_IFINDEX, %NL80211_ATTR_WIPHY and %NL80211_ATTR_IFTYPE attributes. Can also be sent from userspace to request creation of a new virtual interface, then requires attributes %NL80211_ATTR_WIPHY, %NL80211_ATTR_IFTYPE and %NL80211_ATTR_IFNAME."}, "@NL80211_CMD_SET_TX_BITRATE_MASK": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface and @NL80211_ATTR_TX_RATES the set of allowed rates."}, "@NL80211_CMD_NEW_SCAN_RESULTS": {"attrs": [], "desc": "scan NL80211_CMD_GET_SCAN and on the \"scan\" multicast group)"}, "@NL80211_CMD_GET_WIPHY": {"attrs": [], "desc": "request to get a list of all present wiphys."}, "@NL80211_CMD_SET_NOACK_MAP": {"attrs": [], "desc": "sets No Acknowledgement Policy should be applied."}, "@NL80211_CMD_ACTION": {"attrs": [], "desc": "Alias"}, "@NL80211_CMD_FLUSH_PMKSA": {"attrs": [], "desc": "Flush"}, "@NL80211_CMD_ASSOCIATE": {"attrs": [], "desc": "association NL80211_CMD_AUTHENTICATE but for Association and Reassociation (similar to MLME-ASSOCIATE.request, MLME-REASSOCIATE.request, MLME-ASSOCIATE.confirm or MLME-REASSOCIATE.confirm primitives)."}, "@NL80211_CMD_GET_PROTOCOL_FEATURES": {"attrs": ["%NL80211_ATTR_PROTOCOL_FEATURES"], "desc": "Get i.e. features for the nl80211 protocol rather than device features. Returns the features in the %NL80211_ATTR_PROTOCOL_FEATURES bitmap."}, "@NL80211_CMD_DEAUTHENTICATE": {"attrs": [], "desc": "deauthentication NL80211_CMD_AUTHENTICATE but for Deauthentication frames (similar to MLME-DEAUTHENTICATION.request and MLME-DEAUTHENTICATE.indication primitives)."}, "@NL80211_CMD_CRIT_PROTOCOL_STOP": {"attrs": [], "desc": "Indicates return back to normal."}, "@NL80211_CMD_FT_EVENT": {"attrs": [], "desc": "Send to the supplicant. This will carry the target AP's MAC address along with the relevant Information Elements. This event is used to report received FT IEs (MDIE, FTIE, RSN IE, TIE, RICIE)."}, "@NL80211_CMD_NEW_WIPHY": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_WIPHY_NAME"], "desc": "Newly or rename notification. Has attributes %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME."}, "@NL80211_CMD_UPDATE_FT_IES": {"attrs": [], "desc": "Pass Information Element to the WLAN driver"}, "@NL80211_CMD_SET_WDS_PEER": {"attrs": [], "desc": "Set"}, "@NL80211_CMD_SCHED_SCAN_STOPPED": {"attrs": [], "desc": "indicates stopped. The driver may issue this event at any time during a scheduled scan. One reason for stopping the scan is if the hardware does not support starting an association or a normal scan while running a scheduled scan. This event is also sent when the %NL80211_CMD_STOP_SCHED_SCAN command is received or when the interface is brought down while a scheduled scan was running."}, "@NL80211_CMD_FRAME_TX_STATUS": {"attrs": ["%NL80211_ATTR_COOKIE", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_ACK"], "desc": "Report transmitted with %NL80211_CMD_FRAME. %NL80211_ATTR_COOKIE identifies the TX command and %NL80211_ATTR_FRAME includes the contents of the frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged the frame."}, "@NL80211_CMD_TDLS_OPER": {"attrs": ["%NL80211_ATTR_TDLS_OPERATION", "%NL80211_ATTR_MAC", "%NL80211_ATTR_REASON_CODE"], "desc": "Perform In addition, this can be used as an event to request userspace to take actions on TDLS links (set up a new link or tear down an existing one). In such events, %NL80211_ATTR_TDLS_OPERATION indicates the requested operation, %NL80211_ATTR_MAC contains the peer MAC address, and %NL80211_ATTR_REASON_CODE the reason code to be used (only with %NL80211_TDLS_TEARDOWN)."}, "@NL80211_CMD_GET_SCAN": {"attrs": [], "desc": "get"}, "@NL80211_CMD_SET_WIPHY": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_NAME", "%NL80211_ATTR_WIPHY_TXQ_PARAMS", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_WIPHY_RETRY_SHORT", "%NL80211_ATTR_WIPHY_RETRY_LONG", "%NL80211_ATTR_WIPHY_FRAG_THRESHOLD", "%NL80211_ATTR_WIPHY_RTS_THRESHOLD"], "desc": "set %NL80211_ATTR_IFINDEX; can be used to set %NL80211_ATTR_WIPHY_NAME, %NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ (and the attributes determining the channel width; this is used for setting monitor mode channel), %NL80211_ATTR_WIPHY_RETRY_SHORT, %NL80211_ATTR_WIPHY_RETRY_LONG, %NL80211_ATTR_WIPHY_FRAG_THRESHOLD, and/or %NL80211_ATTR_WIPHY_RTS_THRESHOLD. However, for setting the channel, see %NL80211_CMD_SET_CHANNEL instead, the support here is for backward compatibility only."}, "@NL80211_CMD_AUTHENTICATE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_SSID", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_IE", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_TIMED_OUT", "%NL80211_ATTR_MAC"], "desc": "authentication This command is used both as a command (request to authenticate) and as an event on the \"mlme\" multicast group indicating completion of the authentication process. When used as a command, %NL80211_ATTR_IFINDEX is used to identify the interface. %NL80211_ATTR_MAC is used to specify PeerSTAAddress (and BSSID in case of station mode). %NL80211_ATTR_SSID is used to specify the SSID (mainly for association, but is included in authentication request, too, to help BSS selection. %NL80211_ATTR_WIPHY_FREQ is used to specify the frequence of the channel in MHz. %NL80211_ATTR_AUTH_TYPE is used to specify the authentication type. %NL80211_ATTR_IE is used to define IEs (VendorSpecificInfo, but also including RSN IE and FT IEs) to be added to the frame. When used as an event, this reports reception of an Authentication frame in station and IBSS modes when the local MLME processed the frame, i.e., it was for the local STA and was received in correct state. This is similar to MLME-AUTHENTICATE.confirm primitive in the MLME SAP interface (kernel providing MLME, userspace SME). The included %NL80211_ATTR_FRAME attribute contains the management frame (including both the header and frame body, but not FCS). This event is also used to indicate if the authentication attempt timed out. In that case the %NL80211_ATTR_FRAME attribute is replaced with a %NL80211_ATTR_TIMED_OUT flag (and %NL80211_ATTR_MAC to indicate which pending authentication timed out)."}, "@NL80211_CMD_DEL_PATH": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Remove or, if no MAC address given, all mesh paths, on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_GET_MESH_CONFIG": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Get interface identified by %NL80211_ATTR_IFINDEX"}, "@NL80211_CMD_NEW_PATH": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Add the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_NEW_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_MPATH_NEXT_HOP"], "desc": "Create %NL80211_ATTR_MAC via %NL80211_ATTR_MPATH_NEXT_HOP."}, "@NL80211_CMD_MICHAEL_MIC_FAILURE": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_KEY_TYPE", "%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_KEY_SEQ"], "desc": "notification MIC (part of TKIP) failure; sent on the \"mlme\" multicast group; the event includes %NL80211_ATTR_MAC to describe the source MAC address of the frame with invalid MIC, %NL80211_ATTR_KEY_TYPE to show the key type, %NL80211_ATTR_KEY_IDX to indicate the key identifier, and %NL80211_ATTR_KEY_SEQ to indicate the TSC value of the frame; this event matches with MLME-MICHAELMICFAILURE.indication() primitive"}, "@NL80211_CMD_SET_WIPHY_NETNS": {"attrs": [], "desc": "Set associated with this wiphy must be down and will follow."}, "@NL80211_CMD_DEL_KEY": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "delete or %NL80211_ATTR_MAC."}, "@NL80211_CMD_SET_CQM": {"attrs": [], "desc": "Connection is used to configure connection quality monitoring notification trigger levels."}, "@NL80211_CMD_REMAIN_ON_CHANNEL": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_DURATION", "%NL80211_ATTR_COOKIE"], "desc": "Request channel for the specified amount of time. This can be used to do off-channel operations like transmit a Public Action frame and wait for a response while being associated to an AP on another channel. %NL80211_ATTR_IFINDEX is used to specify which interface (and thus radio) is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the frequency for the operation. %NL80211_ATTR_DURATION is used to specify the duration in milliseconds to remain on the channel. This command is also used as an event to notify when the requested duration starts (it may take a while for the driver to schedule this time due to other concurrent needs for the radio). When called, this operation returns a cookie (%NL80211_ATTR_COOKIE) that will be included with any events pertaining to this request; the cookie is also used to cancel the request."}, "@NL80211_CMD_JOIN_IBSS": {"attrs": ["%NL80211_ATTR_BEACON_INTERVAL"], "desc": "Join FREQ attribute (for the initial frequency if no peer can be found) and optionally a MAC (as BSSID) and FREQ_FIXED attribute if those should be fixed rather than automatically determined. Can only be executed on a network interface that is UP, and fixed BSSID/FREQ may be rejected. Another optional parameter is the beacon interval, given in the %NL80211_ATTR_BEACON_INTERVAL attribute, which if not given defaults to 100 TU (102.4ms)."}, "@NL80211_CMD_REG_BEACON_HINT": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_FREQ_BEFORE", "%NL80211_ATTR_FREQ_AFTER"], "desc": "indicates has been found while world roaming thus enabling active scan or any mode of operation that initiates TX (beacons) on a channel where we would not have been able to do either before. As an example if you are world roaming (regulatory domain set to world or if your driver is using a custom world roaming regulatory domain) and while doing a passive scan on the 5 GHz band you find an AP there (if not on a DFS channel) you will now be able to actively scan for that AP or use AP mode on your card on that same channel. Note that this will never be used for channels 1-11 on the 2 GHz band as they are always enabled world wide. This beacon hint is only sent if your device had either disabled active scanning or beaconing on a channel. We send to userspace the wiphy on which we removed a restriction from (%NL80211_ATTR_WIPHY) and the channel on which this occurred before (%NL80211_ATTR_FREQ_BEFORE) and after (%NL80211_ATTR_FREQ_AFTER) the beacon hint was processed."}, "@NL80211_CMD_CRIT_PROTOCOL_START": {"attrs": [], "desc": "Indicates a critical protocol that needs more reliability in the connection to complete."}, "@NL80211_CMD_UNPROT_DEAUTHENTICATE": {"attrs": [], "desc": "Unprotected notification. This event is used to indicate that an unprotected deauthentication frame was dropped when MFP is in use."}, "@NL80211_CMD_REQ_SET_REG": {"attrs": [], "desc": "ask to the specified ISO/IEC 3166-1 alpha2 country code. The core will store this as a valid request and then query userspace for it."}, "@NL80211_CMD_SCHED_SCAN_RESULTS": {"attrs": [], "desc": "indicates results available."}, "@NL80211_CMD_REGISTER_BEACONS": {"attrs": [], "desc": "Register other BSSes when any interfaces are in AP mode. This helps implement OLBC handling in hostapd. Beacons are reported in %NL80211_CMD_FRAME messages. Note that per PHY only one application may register."}, "@NL80211_CMD_NEW_BEACON": {"attrs": [], "desc": "old"}, "@NL80211_CMD_NOTIFY_CQM": {"attrs": [], "desc": "Connection command is used as an event to indicate the that a trigger level was reached."}, "@NL80211_CMD_TRIGGER_SCAN": {"attrs": ["%NL80211_ATTR_TX_NO_CCK_RATE"], "desc": "trigger %NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the probe requests at CCK rate or not."}, "@NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_COOKIE"], "desc": "This pending remain-on-channel duration if the desired operation has been completed prior to expiration of the originally requested duration. %NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify the radio. The %NL80211_ATTR_COOKIE attribute must be given as well to uniquely identify the request. This command is also used as an event to notify when a requested remain-on-channel duration has expired."}, "@NL80211_CMD_REGISTER_FRAME": {"attrs": [], "desc": "Register (via @NL80211_CMD_FRAME) for processing in userspace. This command requires an interface index, a frame type attribute (optional for backward compatibility reasons, if not given assumes action frames) and a match attribute containing the first few bytes of the frame that should match, e.g. a single byte for only a category match or four bytes for vendor frames including the OUI. The registration cannot be dropped, but is removed automatically when the netlink socket is closed. Multiple registrations can be made."}, "@NL80211_CMD_CHANNEL_SWITCH": {"attrs": ["%NL80211_ATTR_CH_SWITCH_COUNT", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_CH_SWITCH_BLOCK_TX"], "desc": "Perform the new channel information (Channel Switch Announcement - CSA) in the beacon for some time (as defined in the %NL80211_ATTR_CH_SWITCH_COUNT parameter) and then change to the new channel. Userspace provides the new channel information (using %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width). %NL80211_ATTR_CH_SWITCH_BLOCK_TX may be supplied to inform other station that transmission must be blocked until the channel switch is complete."}, "@NL80211_CMD_GET_INTERFACE": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX"], "desc": "Request either a dump request on a %NL80211_ATTR_WIPHY or a specific get on an %NL80211_ATTR_IFINDEX is supported."}, "@NL80211_CMD_RADAR_DETECT": {"attrs": ["%NL80211_ATTR_RADAR_EVENT"], "desc": "Start a radar is detected or the channel availability scan (CAC) has finished or was aborted, or a radar was detected, usermode will be notified with this event. This command is also used to notify userspace about radars while operating on this channel. %NL80211_ATTR_RADAR_EVENT is used to inform about the type of the event."}, "@NL80211_CMD_GET_POWER_SAVE": {"attrs": [], "desc": "Get"}, "@NL80211_CMD_DISCONNECT": {"attrs": ["%NL80211_ATTR_DISCONNECTED_BY_AP", "%NL80211_ATTR_REASON_CODE"], "desc": "drop userspace that a connection was dropped by the AP or due to other reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and %NL80211_ATTR_REASON_CODE attributes are used."}, "@NL80211_CMD_CONNECT": {"attrs": ["%NL80211_ATTR_SSID", "%NL80211_ATTR_IE", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_USE_MFP", "%NL80211_ATTR_MAC", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_CONTROL_PORT", "%NL80211_ATTR_CONTROL_PORT_ETHERTYPE", "%NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT", "%NL80211_ATTR_BG_SCAN_PERIOD"], "desc": "connection requests to connect to a specified network but without separating auth and assoc steps. For this, you need to specify the SSID in a %NL80211_ATTR_SSID attribute, and can optionally specify the association IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_USE_MFP, %NL80211_ATTR_MAC, %NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT, %NL80211_ATTR_CONTROL_PORT_ETHERTYPE and %NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT. Background scan period can optionally be specified in %NL80211_ATTR_BG_SCAN_PERIOD, if not specified default background scan configuration in driver is used and if period value is 0, bg scan will be disabled. This attribute is ignored if driver does not support roam scan. It is also sent as an event, with the BSSID and response IEs when the connection is established or failed to be established. This can be determined by the STATUS_CODE attribute."}, "@NL80211_CMD_SET_BEACON": {"attrs": ["%NL80211_ATTR_BEACON_HEAD", "%NL80211_ATTR_BEACON_TAIL", "%NL80211_ATTR_IE", "%NL80211_ATTR_IE_PROBE_RESP", "%NL80211_ATTR_IE_ASSOC_RESP"], "desc": "change using the %NL80211_ATTR_BEACON_HEAD and %NL80211_ATTR_BEACON_TAIL attributes. For drivers that generate the beacon and probe responses internally, the following attributes must be provided: %NL80211_ATTR_IE, %NL80211_ATTR_IE_PROBE_RESP and %NL80211_ATTR_IE_ASSOC_RESP."}, "@NL80211_CMD_ACTION_TX_STATUS": {"attrs": [], "desc": "Alias backward compatibility."}, "@NL80211_CMD_JOIN_MESH": {"attrs": [], "desc": "Join mesh config parameters may be given."}, "@NL80211_CMD_ROAM": {"attrs": [], "desc": "request sent as an event when the card/driver roamed by itself."}, "@NL80211_CMD_SET_REG": {"attrs": ["%NL80211_ATTR_REG_ALPHA", "%NL80211_ATTR_REG_RULE_FREQ_", "%NL80211_ATTR_FREQ_RANGE_MAX_BW", "%NL80211_ATTR_REG_RULE_POWER_MAX_ANT_GAIN", "%NL80211_ATTR_REG_RULE_POWER_MAX_EIRP"], "desc": "Set after being queried by the kernel. CRDA replies by sending a regulatory domain structure which consists of %NL80211_ATTR_REG_ALPHA set to our current alpha2 if it found a match. It also provides NL80211_ATTR_REG_RULE_FLAGS, and a set of regulatory rules. Each regulatory rule is a nested set of attributes given by %NL80211_ATTR_REG_RULE_FREQ_[START|END] and %NL80211_ATTR_FREQ_RANGE_MAX_BW with an attached power rule given by %NL80211_ATTR_REG_RULE_POWER_MAX_ANT_GAIN and %NL80211_ATTR_REG_RULE_POWER_MAX_EIRP."}, "@NL80211_CMD_GET_COALESCE": {"attrs": [], "desc": "Get"}, "@NL80211_CMD_FRAME_WAIT_CANCEL": {"attrs": [], "desc": "When command may be used with the corresponding cookie to cancel the wait time if it is known that it is no longer necessary."}, "@NL80211_CMD_DEL_BEACON": {"attrs": [], "desc": "old"}, "@NL80211_CMD_LEAVE_IBSS": {"attrs": [], "desc": "Leave determined by the network interface."}, "@NL80211_CMD_SET_MCAST_RATE": {"attrs": [], "desc": "Change for IBSS or MESH vif."}, "@NL80211_CMD_TESTMODE": {"attrs": [], "desc": "testmode to identify the device, and the TESTDATA blob attribute to pass through to the driver."}, "@NL80211_CMD_DEL_MPATH": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Delete %NL80211_ATTR_MAC."}, "@NL80211_CMD_ADD_TX_TS": {"attrs": ["%NL80211_ATTR_TSID", "%NL80211_ATTR_MAC","%NL80211_ATTR_USER_PRIO","%NL80211_ATTR_ADMITTED_TIME"],"desc": "Ask the kernel to add a traffic stream for the given %NL80211_ATTR_TSID and %NL80211_ATTR_MAC with %NL80211_ATTR_USER_PRIO and %NL80211_ATTR_ADMITTED_TIME parameters. Note that the action frame handshake with the AP shall be handled by userspace via the normal management RX/TX framework, this only sets up the TX TS in the driver/device. If the admitted time attribute is not added then the request just checksif a subsequent setup could be successful, the intent is to use this to avoid setting up a session with the AP when local restrictions would make that impossible. However, the subsequent real setup may still fail even if the check was successful."}, "@NL80211_CMD_DEL_TX_TS": {"attrs": ["%NL80211_ATTR_MAC","%NL80211_ATTR_TSID"], "desc": "Remove an existing TS with the %NL80211_ATTR_TSID and %NL80211_ATTR_MAC parameters. It isn't necessary to call this before removing a station entry entirely, or before disassociating or similar, cleanup will happen in the driver/device in this case."}, "@NL80211_CMD_GET_MPP": {"attrs": ["%NL80211_ATTR_MAC","%NL80211_ATTR_IFINDEX"], "desc": "Get mesh path attributes for mesh proxy path to destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_JOIN_OCB": {"attrs": [], "desc": "Join the OCB network. The center frequency and bandwidth of a channel must be given."}, "@NL80211_CMD_LEAVE_OCB": {"attrs": [], "desc": "Leave the OCB network -- no special arguments, the network is determined by the network interface."}, "@NL80211_CMD_TDLS_CHANNEL_SWITCH": {"attrs": ["%NL80211_ATTR_MAC","%NL80211_ATTR_MAC","%NL80211_ATTR_WIPHY_FREQ","%NL80211_ATTR_OPER_CLASS"], "desc": "Start channel-switching with a TDLS peer, identified by the %NL80211_ATTR_MAC parameter. A target channel is provided via %NL80211_ATTR_WIPHY_FREQ and other attributes determining channel width/type. The target operating class is given via %NL80211_ATTR_OPER_CLASS. The driver is responsible for continually initiating channel-switching operations and returning to the base channel for communication with the AP."}, "@NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Stop channel-switching with a TDLS peer given by %NL80211_ATTR_MAC. Both peers must be on the base channel when this command completes."}, "@NL80211_CMD_WIPHY_REG_CHANGE": {"attrs": [], "desc": "Similar to %NL80211_CMD_REG_CHANGE, but used as an event to indicate changes for devices with wiphy-specific regdom management."}} +{"0": "@NL80211_CMD_UNSPEC", "1": "@NL80211_CMD_GET_WIPHY", "2": "@NL80211_CMD_SET_WIPHY", "3": "@NL80211_CMD_NEW_WIPHY", "4": "@NL80211_CMD_DEL_WIPHY", "5": "@NL80211_CMD_GET_INTERFACE", "6": "@NL80211_CMD_SET_INTERFACE", "7": "@NL80211_CMD_NEW_INTERFACE", "8": "@NL80211_CMD_DEL_INTERFACE", "9": "@NL80211_CMD_GET_KEY", "10": "@NL80211_CMD_SET_KEY", "11": "@NL80211_CMD_NEW_KEY", "12": "@NL80211_CMD_DEL_KEY", "13": "@NL80211_CMD_GET_BEACON", "14": "@NL80211_CMD_SET_BEACON", "15": ["@NL80211_CMD_START_AP", "@NL80211_CMD_NEW_BEACON"], "16": ["@NL80211_CMD_STOP_AP", "@NL80211_CMD_DEL_BEACON"], "17": "@NL80211_CMD_GET_STATION", "18": "@NL80211_CMD_SET_STATION", "19": "@NL80211_CMD_NEW_STATION", "20": "@NL80211_CMD_DEL_STATION", "21": "@NL80211_CMD_GET_MPATH", "22": "@NL80211_CMD_SET_MPATH", "23": "@NL80211_CMD_NEW_MPATH", "24": "@NL80211_CMD_DEL_MPATH", "25": "@NL80211_CMD_SET_BSS", "26": "@NL80211_CMD_SET_REG", "27": "@NL80211_CMD_REQ_SET_REG", "28": "@NL80211_CMD_GET_MESH_CONFIG", "29": "@NL80211_CMD_SET_MESH_CONFIG", "30": "@NL80211_CMD_SET_MGMT_EXTRA_IE", "31": "@NL80211_CMD_GET_REG", "32": "@NL80211_CMD_GET_SCAN", "33": "@NL80211_CMD_TRIGGER_SCAN", "34": "@NL80211_CMD_NEW_SCAN_RESULTS", "35": "@NL80211_CMD_SCAN_ABORTED", "36": "@NL80211_CMD_REG_CHANGE", "37": "@NL80211_CMD_AUTHENTICATE", "38": "@NL80211_CMD_ASSOCIATE", "39": "@NL80211_CMD_DEAUTHENTICATE", "40": "@NL80211_CMD_DISASSOCIATE", "41": "@NL80211_CMD_MICHAEL_MIC_FAILURE", "42": "@NL80211_CMD_REG_BEACON_HINT", "43": "@NL80211_CMD_JOIN_IBSS", "44": "@NL80211_CMD_LEAVE_IBSS", "45": "@NL80211_CMD_TESTMODE", "46": "@NL80211_CMD_CONNECT", "47": "@NL80211_CMD_ROAM", "48": "@NL80211_CMD_DISCONNECT", "49": "@NL80211_CMD_SET_WIPHY_NETNS", "50": "@NL80211_CMD_GET_SURVEY", "51": "@NL80211_CMD_NEW_SURVEY_RESULTS", "52": "@NL80211_CMD_SET_PMKSA", "53": "@NL80211_CMD_DEL_PMKSA", "54": "@NL80211_CMD_FLUSH_PMKSA", "55": "@NL80211_CMD_REMAIN_ON_CHANNEL", "56": "@NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL", "57": "@NL80211_CMD_SET_TX_BITRATE_MASK", "58": ["@NL80211_CMD_REGISTER_ACTION", "@NL80211_CMD_REGISTER_FRAME"], "59": ["@NL80211_CMD_FRAME", "@NL80211_CMD_ACTION"], "60": ["@NL80211_CMD_FRAME_TX_STATUS", "@NL80211_CMD_ACTION_TX_STATUS"], "61": "@NL80211_CMD_SET_POWER_SAVE", "62": "@NL80211_CMD_GET_POWER_SAVE", "63": "@NL80211_CMD_SET_CQM", "64": "@NL80211_CMD_NOTIFY_CQM", "65": "@NL80211_CMD_SET_CHANNEL", "66": "@NL80211_CMD_SET_WDS_PEER", "67": "@NL80211_CMD_FRAME_WAIT_CANCEL", "68": "@NL80211_CMD_JOIN_MESH", "69": "@NL80211_CMD_LEAVE_MESH", "70": "@NL80211_CMD_UNPROT_DEAUTHENTICATE", "71": "@NL80211_CMD_UNPROT_DISASSOCIATE", "72": "@NL80211_CMD_NEW_PEER_CANDIDATE", "73": "@NL80211_CMD_GET_WOWLAN", "74": "@NL80211_CMD_SET_WOWLAN", "75": "@NL80211_CMD_START_SCHED_SCAN", "76": "@NL80211_CMD_STOP_SCHED_SCAN", "77": "@NL80211_CMD_SCHED_SCAN_RESULTS", "78": "@NL80211_CMD_SCHED_SCAN_STOPPED", "79": "@NL80211_CMD_SET_REKEY_OFFLOAD", "80": "@NL80211_CMD_PMKSA_CANDIDATE", "81": "@NL80211_CMD_TDLS_OPER", "82": "@NL80211_CMD_TDLS_MGMT", "83": "@NL80211_CMD_UNEXPECTED_FRAME", "84": "@NL80211_CMD_PROBE_CLIENT", "85": "@NL80211_CMD_REGISTER_BEACONS", "86": "@NL80211_CMD_UNEXPECTED_4ADDR_FRAME", "87": "@NL80211_CMD_SET_NOACK_MAP", "88": "@NL80211_CMD_CH_SWITCH_NOTIFY", "89": "@NL80211_CMD_START_P2P_DEVICE", "90": "@NL80211_CMD_STOP_P2P_DEVICE", "91": "@NL80211_CMD_CONN_FAILED", "92": "@NL80211_CMD_SET_MCAST_RATE", "93": "@NL80211_CMD_SET_MAC_ACL", "94": "@NL80211_CMD_RADAR_DETECT", "95": "@NL80211_CMD_GET_PROTOCOL_FEATURES", "96": "@NL80211_CMD_UPDATE_FT_IES", "97": "@NL80211_CMD_FT_EVENT", "98": "@NL80211_CMD_CRIT_PROTOCOL_START", "99": "@NL80211_CMD_CRIT_PROTOCOL_STOP", "100": "@NL80211_CMD_GET_COALESCE", "101": "@NL80211_CMD_SET_COALESCE", "102": "@NL80211_CMD_CHANNEL_SWITCH", "103": "@NL80211_CMD_VENDOR", "104": "@NL80211_CMD_SET_QOS_MAP", "105": "@NL80211_CMD_ADD_TX_TS", "106": "@NL80211_CMD_DEL_TX_TS", "107": "@NL80211_CMD_GET_MPP", "108": "@NL80211_CMD_JOIN_OCB", "109": "@NL80211_CMD_LEAVE_OCB", "110": "@NL80211_CMD_SWITCH_STARTED_NOTIFY", "111": "@NL80211_CMD_TDLS_CHANNEL_SWITCH", "112": "@NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH", "113": "@NL80211_CMD_WIPHY_REG_CHANGE"} \ No newline at end of file diff --git a/pyric/nlhelp/nlsearch.py b/pyric/nlhelp/nlsearch.py index 356dc4e..e4d0e52 100644 --- a/pyric/nlhelp/nlsearch.py +++ b/pyric/nlhelp/nlsearch.py @@ -48,9 +48,9 @@ cmdlookup = None # reverse lookup for command constants cin = None try: - # first two lines are comments, 3rd line is empty + # first three lines are comments, 4th line is empty cin = open(cmdpath,'r') - for _ in xrange(3): _in = cin.readline() + for _ in xrange(4): _in = cin.readline() commands = json.loads(cin.readline()) cmdlookup = json.loads(cin.readline()) except: @@ -62,16 +62,16 @@ attributes = None # attr -> desc, commands used by, datatype attrlookup = None # reverse lookup for attribute constants ain = None -try: +#try: # first two lines are comments, 3rd line is empty - ain = open(attrpath,'r') - for _ in xrange(3): _in = ain.readline() - attributes = json.loads(ain.readline()) - attrlookup = json.loads(ain.readline()) -except: - raise pyric.error(pyric.EUNDEF, "Failed to process attributes.help") -finally: - if ain: ain.close() +ain = open(attrpath,'r') +for _ in xrange(4): _in = ain.readline() +attributes = json.loads(ain.readline()) +attrlookup = json.loads(ain.readline()) +#except: +# raise pyric.error(pyric.EUNDEF, "Failed to process attributes.help") +#finally: +# if ain: ain.close() def command(cmd): """ diff --git a/pyric/pyw.py b/pyric/pyw.py index ea0f10c..66114f6 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -1100,7 +1100,11 @@ def devinfo(card, *argv): 'CF':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CENTER_FREQ1), 'CHW':None} chw = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CHANNEL_WIDTH) - if chw: info['CHW'] = channels.CHWIDTHS[chw] + if chw: + try: + info['CHW'] = channels.CHTYPES[chw] + except IndexError: + info['CHW'] = chw return info def phyinfo(card, *argv): @@ -1287,7 +1291,7 @@ def chset(card, ch, chw=None, *argv): device's channels to be changed """ if ch not in channels.channels(): raise pyric.error(errno.EINVAL, "Invalid channel") - if chw not in channels.CHWIDTHS: raise pyric.error(errno.EINVAL, "Invalid width") + if chw not in channels.CHTYPES: raise pyric.error(errno.EINVAL, "Invalid width") try: nlsock = argv[0] @@ -1306,7 +1310,7 @@ def freqset(card, rf, chw=None, *argv): :param argv: netlink socket at argv[0] (or empty) """ if rf not in channels.freqs(): raise pyric.error(errno.EINVAL, "Invalid frequency") - if chw not in channels.CHWIDTHS: raise pyric.error(errno.EINVAL, "Invalid width") + if chw not in channels.CHTYPES: raise pyric.error(errno.EINVAL, "Invalid width") try: nlsock = argv[0] @@ -1319,7 +1323,7 @@ def freqset(card, rf, chw=None, *argv): flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) nl.nla_put_u32(msg, rf, nl80211h.NL80211_ATTR_WIPHY_FREQ) - nl.nla_put_u32(msg, channels.CHWIDTHS.index(chw), + nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) @@ -1647,9 +1651,9 @@ def _commands_(command): # to get only the command name and make it lowercase cmd = cmdbynum(struct.unpack_from('>HH', cmd, 0)[1]) if type(cmd) is type([]): cmd = cmd[0] - cs.append(cmd[13:].lower()) # skil NL80211_CMD_ + cs.append(cmd[13:].lower()) # skip NL80211_CMD_ except KeyError: - # some cards (atheros) have proprietary commands not found in nlh8022.h. + # kernel 4 added commands not found in kernel 3 nlh8022.h. cs.append("unknown cmd ({0})".format(cmd)) return cs @@ -1775,7 +1779,7 @@ def _fut_chset(card, ch, chw, *argv): uses *_SET_WIPHY however, ATT does not work raise Errno 22 Invalid Argument """ if ch not in channels.channels(): raise pyric.error(errno.EINVAL, "Invalid channel") - if chw not in channels.CHWIDTHS: raise pyric.error(errno.EINVAL, "Invalid channel width") + if chw not in channels.CHTYPES: raise pyric.error(errno.EINVAL, "Invalid channel width") try: nlsock = argv[0] except IndexError: @@ -1786,6 +1790,6 @@ def _fut_chset(card, ch, chw, *argv): flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) - nl.nla_put_u32(msg, channels.CHWIDTHS.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) + nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) \ No newline at end of file diff --git a/pyric/utils/channels.py b/pyric/utils/channels.py index 042af00..4a15f51 100644 --- a/pyric/utils/channels.py +++ b/pyric/utils/channels.py @@ -38,6 +38,7 @@ import pyric.net.wireless.nl80211_h as nl80211h # redefined widths (allowed in nl80211h) +CHTYPES = nl80211h.NL80211_CHAN_TYPES CHWIDTHS = nl80211h.NL80211_CHAN_WIDTHS # ISM Bands (ieee80211.h-> BAND_ID_2G) From 669818a9736e8025eb5b13ff534bd3fcf3d812aa Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 26 Jun 2016 09:48:49 -0600 Subject: [PATCH 057/121] v0.1.4 updated to support linux kernel v 4 --- TODO | 33 ++++++++++++--------------------- pyric/net/wireless/nl80211_h.py | 2 +- pyric/pyw.py | 10 +++++----- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/TODO b/TODO index 4a15a21..1e5bc84 100644 --- a/TODO +++ b/TODO @@ -4,11 +4,7 @@ 3) parse NL80211_ATTR_WIPHY_BANDS (have workaround currently in place) - after figuring out _CIPHER_SUITES, may be able to get a solution for the bands 4) RFI (1) -5) Should we move to netlink for setting ip address? - - ioctl allows us to set erroneous values for netmask, broadcast whereas netlink - forces validity 6) find a better way to get supported standards of a card -7) code up txget, txset via netlink even though cards don't seem to support it 8) Two commands that would add information of minor value o ethtool. uses ioctl but does not follow same pattern as ifconfig seems to use @@ -109,18 +105,17 @@ error strings and test for NLE_SUCCESS in netlink error message 6) Setting the channel/Frequency nl80211.h states that using NL80211_CMD_SET_WIPHY to set the channel is deprecated in place of NL80211_CMD_SET_CHANNEL. Below is the attempted code: -phy = devinfoex(nlsock,nic)['phy'] -msg = nl.nlmsg_new(nl_type=_FAM80211ID_, - cmd=nl80211h.NL80211_CMD_SET_CHANNEL, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) -msg.nla_put_u32(phy,nl80211h.NL80211_ATTR_WIPHY) -msg.nla_put_u32(channels.ch2rf(ch),nl80211h.NL80211_ATTR_WIPHY_FREQ) -msg.nla_put_u32(CHWIDTHS.index(chw),nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) - -# Here as found during updating nl80211.h, _CHANNEL_TYPE is not CHANNEL_WIDTH - -and results in a 'invalid argument' error. So, am I sending the wrong crap? The -description for this command in nl80211_h +msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_SET_CHANNEL, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) + nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) + nl.nl_sendmsg(nlsock, msg) + nl.nl_recvmsg(nlsock) + +and results in a 'Operation not supported' error. +The description for this command in nl80211_h * @NL80211_CMD_SET_CHANNEL: Set the channel (using %NL80211_ATTR_WIPHY_FREQ * and the attributes determining channel width) the given interface @@ -132,11 +127,7 @@ description for this command in nl80211_h * of any other interfaces, and other interfaces will again take * precedence when they are used. -mentions ifindex. Adding the ifindex with: - -msg.nla_put_u32(nl80211h.NL80211_ATTR_IFINDEX,8) - -still gives an 'invalid argument' error. Took out channel width and still no go +This works if the card is in monitor mode * workaround in place, using the deprecated NL80211_CMD_SET_WIPHY diff --git a/pyric/net/wireless/nl80211_h.py b/pyric/net/wireless/nl80211_h.py index 545d195..8af48f7 100644 --- a/pyric/net/wireless/nl80211_h.py +++ b/pyric/net/wireless/nl80211_h.py @@ -422,7 +422,7 @@ * mesh config parameters may be given. * @NL80211_CMD_LEAVE_MESH: Leave the mesh network -- no special arguments, the * network is determined by the network interface. - * @NL80211_CMD_UNPROT_DEAUTHENTICATE: Unprotected deauthentication frame + * @NL80211_CMD_UNPR_OT_DEAUTHENTICATE: Unprotected deauthentication frame * notification. This event is used to indicate that an unprotected * deauthentication frame was dropped when MFP is in use. * @NL80211_CMD_UNPROT_DISASSOCIATE: Unprotected disassociation frame diff --git a/pyric/pyw.py b/pyric/pyw.py index 66114f6..5841a08 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -1291,7 +1291,6 @@ def chset(card, ch, chw=None, *argv): device's channels to be changed """ if ch not in channels.channels(): raise pyric.error(errno.EINVAL, "Invalid channel") - if chw not in channels.CHTYPES: raise pyric.error(errno.EINVAL, "Invalid width") try: nlsock = argv[0] @@ -1310,7 +1309,8 @@ def freqset(card, rf, chw=None, *argv): :param argv: netlink socket at argv[0] (or empty) """ if rf not in channels.freqs(): raise pyric.error(errno.EINVAL, "Invalid frequency") - if chw not in channels.CHTYPES: raise pyric.error(errno.EINVAL, "Invalid width") + if chw in channels.CHTYPES: chw = channels.CHTYPES.index(chw) + else: raise pyric.error(errno.EINVAL, "Invalid width") try: nlsock = argv[0] @@ -1323,8 +1323,7 @@ def freqset(card, rf, chw=None, *argv): flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) nl.nla_put_u32(msg, rf, nl80211h.NL80211_ATTR_WIPHY_FREQ) - nl.nla_put_u32(msg, channels.CHTYPES.index(chw), - nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) + nl.nla_put_u32(msg, chw, nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) except AttributeError: @@ -1777,6 +1776,7 @@ def _fut_chset(card, ch, chw, *argv): :param argv: netlink socket at argv[0] (or empty) uses the newer NL80211_CMD_SET_CHANNEL vice iw's depecrated version which uses *_SET_WIPHY however, ATT does not work raise Errno 22 Invalid Argument + NOTE: This only works for cards in monitor mode """ if ch not in channels.channels(): raise pyric.error(errno.EINVAL, "Invalid channel") if chw not in channels.CHTYPES: raise pyric.error(errno.EINVAL, "Invalid channel width") @@ -1788,7 +1788,7 @@ def _fut_chset(card, ch, chw, *argv): msg = nl.nlmsg_new(nltype=_familyid_(nlsock), cmd=nl80211h.NL80211_CMD_SET_CHANNEL, flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) From a67e6886a9e548b872af8326ee7b2eaf3cb75176 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 26 Jun 2016 11:30:44 -0600 Subject: [PATCH 058/121] v0.1.4 updated to support linux kernel v 4 --- TODO | 120 +---------------------------------------------------------- 1 file changed, 1 insertion(+), 119 deletions(-) diff --git a/TODO b/TODO index 1e5bc84..7e082b5 100644 --- a/TODO +++ b/TODO @@ -3,7 +3,6 @@ an ubuntu, kernel or overall issue 3) parse NL80211_ATTR_WIPHY_BANDS (have workaround currently in place) - after figuring out _CIPHER_SUITES, may be able to get a solution for the bands -4) RFI (1) 6) find a better way to get supported standards of a card 8) Two commands that would add information of minor value o ethtool. uses ioctl but does not follow same pattern as ifconfig seems @@ -35,121 +34,4 @@ - CentOs (?) - slackware - dd-wrt/OpenWRT - 18) port structs from new nl80211.h - -------- Request For Information RFI ---------- - -1) Odd error on what should be a NLE_PERM -When running a root level cmd (reg set) as non-root), I get a return message w/ -the following format: - - nlmsghdr(len=48, type=2, flags=5, seq=1460441619, pid=9865) - genlmsghdr(cmd=255) - attributes: - 0: type = 0, datatype = 0 - value = 1a00050013920c57892600001b000000070021005553 - -and the hex of this message is: - -"\x30\x00\x00\x00\x02\x00\x00\x00\x13\x92\x0c\x57\x89\x26\x00\x00\xff\xff\xff\xff\x1c\x00\x00\x00\x1a\x00\x05\x00\x13\x92\x0c\x57\x89\x26\x00\x00\x1b\x00\x00\x00\x07\x00\x21\x00\x55\x53\x00\x00" - -First, type=2 generally designates an error (at least when executing nl80211). -Second, there is no cmd = 255. Third attempting to parse it as an netlink error -results in a errno of -1. Finally, it does not follow the correct error message -format which should be nlmsghdr+errno+nlmsghdr. - -I checked and this is the same response iw gets. - -* workaround is in place in libnl.nlmsg_fromstream() - -2) ACK messages -PyRIC is set up in a simple send a message & receive the response method. However, -if the caller designates the message with a NLM_F_ACK flag and the ack is not -pulled off the socket subsequent messages will fail due to sequence numbers -mismatching. This is only a problem when using a persistent netlink socket. -ATT I set the NLM_F_ACK flag on all sent packets to ensure we get ack messages -back. - -* workaround is in place in libnl.nl_recvmsg - -3) Hanging terminal -I don't attempt to parse attributes of type nested or unspec. In some situations -when printing the hex values of these attributes on the terminal some character -or set of characters causes the terminal to hang. No combinination of keys etc -can then kill the terminal. I haven't yet looked into trying to determine what -hex value(s) is causing this. - -* workaround is in place in GENLMsg.__repr__ using hexlify - -4) Using deprecated programs/processes -IOT to replicate iw dev info, one has to pass the ifindex (I've tried using -the device name with appropriate attribute type but it fails). The only way to -get the ifindex is by using the supposedly deprecated ioctl (iw does the same). -Seems kind of ironic that the 'new and improved' relies on the old and deprecated - -* no workaround at this point - -5) Error -Netlink provides error codes in netlink/errno.h. However these do not match those -found in /usr/include/asm-generic/errno-base.h and /usr/include/asm-generic/errno.h. -In most cases, it appears that using the netlink errors results in reporting an -incorrect error - there doesn't seem to be any rhyme or reason for this as even -the error codes reporting in the nlmsgerr struct fit linux errors over netlink -errors (in most cases). But, of course there is a catch. NLE_SUCCESS (0) and -NLE_FAILURE (1) as reported in ack/error messages are correct but do not correspond -to the same error code in the linux asm header files. - -* workaround in place, added '-1' as an undefined, use errno for error codes, -error strings and test for NLE_SUCCESS in netlink error message - -6) Setting the channel/Frequency -nl80211.h states that using NL80211_CMD_SET_WIPHY to set the channel is deprecated -in place of NL80211_CMD_SET_CHANNEL. Below is the attempted code: -msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_CHANNEL, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) - nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) - nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) - -and results in a 'Operation not supported' error. -The description for this command in nl80211_h - - * @NL80211_CMD_SET_CHANNEL: Set the channel (using %NL80211_ATTR_WIPHY_FREQ - * and the attributes determining channel width) the given interface - * (identifed by %NL80211_ATTR_IFINDEX) shall operate on. - * In case multiple channels are supported by the device, the mechanism - * with which it switches channels is implementation-defined. - * When a monitor interface is given, it can only switch channel while - * no other interfaces are operating to avoid disturbing the operation - * of any other interfaces, and other interfaces will again take - * precedence when they are used. - -This works if the card is in monitor mode - -* workaround in place, using the deprecated NL80211_CMD_SET_WIPHY - -7) Would like to be able set the tx-power, not just to the max but lower or raise -as desired, neither of the below work in iw or through netlinks - -dev set txpower [] - Specify transmit power level and setting type. - -phy set txpower [] - Specify transmit power level and setting type. - -6) Passwords - On ubuntu at least passwords for APs are stored in /etc/NetworkManager/system-connections - under directory for ssid - -7) Kernel v4 introduces new constants in nl80211.h - - OCB support (Operation outside control of BSS) for vehicles in 5.9 - -8) channel widths - line 2638 of nl80211_h defines channels widths "used with the NL80211_ATTR_CHANNEL_WIDTH" - but these are not the channels as defined for iw which uses enum nl80211_channel_type - However, they are used in: - iw dev set freq [20|40|80|80+80|160] [
] [
] - + 18) port structs from new nl80211.h \ No newline at end of file From ae369e86ce9021b1701dcad84e8515738e6e7c54 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 26 Jun 2016 18:01:00 -0600 Subject: [PATCH 059/121] v0.1.4 updated to support linux kernel v 4 --- pyric/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyric/__init__.py b/pyric/__init__.py index 513e874..0164fab 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -26,7 +26,7 @@ linux (preferred 3.x kernel) Python 2.7 - pyric 0.1.3 + pyric 0.1.4 desc: wireless nic library: wireless radio identification, manipulation, enumeration includes: /nlhelp /lib /net /utils pyw 0.1.4 changes: @@ -36,7 +36,7 @@ __name__ = 'pyric' __license__ = 'GPLv3' -__version__ = '0.1.3' +__version__ = '0.1.4' __date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' From f8bbb4309827838d393ffa2a7e2ebd2055773b76 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Tue, 28 Jun 2016 06:28:47 -0600 Subject: [PATCH 060/121] v0.1.4 added set to libnl processing/ Issue #15 --- CHANGES | 8 +++--- TODO | 4 +-- examples/pentest.py | 4 +++ pyric/lib/__init__.py | 3 ++- pyric/lib/libnl.py | 48 +++++++++++++++++++++++++++++++-- pyric/net/if_h.py | 7 +++-- pyric/net/netlink_h.py | 17 +++++++++--- pyric/net/policy.py | 23 ++++++++-------- pyric/net/wireless/nl80211_c.py | 25 ++++++++++------- pyric/net/wireless/wlan.py | 15 +++-------- pyric/nlhelp/nlsearch.py | 20 +++++++------- pyric/pyw.py | 19 +++++++------ 12 files changed, 129 insertions(+), 64 deletions(-) diff --git a/CHANGES b/CHANGES index 10d16db..d4302dd 100644 --- a/CHANGES +++ b/CHANGES @@ -100,13 +100,15 @@ v 0.1.4 o modified devadd. User is allowed to submit a Card object or a physical index o removed hardcoded values for covclassset, retry(short|long)set, retsthreshet and fragrthreshset - - constants defined in 80211.h + - constants now defined in wlan.h o removed return True where redundant i.e. when setting mac address we can assume it worked if no error was thrown o renamed ieee80211_h to wlan o didn't like the incestual circular pyric error (libnl shouldn't know about pyric) - replaced pyric.error with defined error in libnl and libio - pyw has to catch libnl and libio errors and reraise as pyric errors - o retooled exception messages + - retooled exception messages o added new functions from 0.1.3 and 0.1.4 to unittests - o updated nl80211_h w/ additional constants included in kernel v 4 header \ No newline at end of file + o updated nl80211_h w/ additional constants included in kernel v 4 header + o added propietary concept of set to netlink processing + - nl80211 appears to define a set of like-sized elements (see cipher_suites) \ No newline at end of file diff --git a/TODO b/TODO index 7e082b5..42fcc7d 100644 --- a/TODO +++ b/TODO @@ -25,7 +25,6 @@ 14) look at udevadm info --query=all --path /sys/class/net/ o has devie driver, name and some other details but appears to get these the same way PyRIC does - 16) look into readthedocs. 17) distro tests - openSUSE - RedHat/Fedora @@ -34,4 +33,5 @@ - CentOs (?) - slackware - dd-wrt/OpenWRT - 18) port structs from new nl80211.h \ No newline at end of file + 18) port structs from new nl80211.h + 19) iw is showing a command that doesn't exist \ No newline at end of file diff --git a/examples/pentest.py b/examples/pentest.py index 10c5d77..3651db8 100644 --- a/examples/pentest.py +++ b/examples/pentest.py @@ -53,6 +53,10 @@ def execute(dev): for iface in pyw.ifaces(card): print "deleting {0} in mode {1}".format(iface[0],iface[1]) pyw.devdel(iface[0]) + + # not we use the card that was deleted here. We can do this because + # devadd uses the physical index so even though the ifindex and dev are + # no longer valid, the physical index still is pcard = pyw.devadd(card, pdev, 'monitor') pyw.up(pcard) print "Using", pcard diff --git a/pyric/lib/__init__.py b/pyric/lib/__init__.py index ea01d09..26ad1ac 100644 --- a/pyric/lib/__init__.py +++ b/pyric/lib/__init__.py @@ -23,7 +23,7 @@ lib 0.0.2 desc: lib subpackage - includes: libnl 0.0.7 libio 0.0.1 + includes: libnl 0.0.8 libio 0.0.1 changes: o added libio o updated libnl @@ -39,6 +39,7 @@ in situations where attribute len is 0 - fixed nlmsg_fromstream to handle non-ack message parsing with a length of 36 o libnl and libnl now report their own errors rather than use pyric.error + o added support for NLA_SET """ __name__ = 'lib' diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 38fb6ec..95e44c3 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -32,7 +32,7 @@ __name__ = 'libnl' __license__ = 'GPLv3' -__version__ = '0.0.7' +__version__ = '0.0.8' __date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' @@ -484,13 +484,17 @@ def nla_parse(msg,l,mtype,stream,idx): elif dt == nlh.NLA_U64: a = struct.unpack_from("Q",a,0)[0] elif dt == nlh.NLA_FLAG: a = '' # flags should be 0 size elif dt == nlh.NLA_MSECS: a = struct.unpack_from("Q",a,0)[0] + elif dt == nlh.NLA_SET_U8: a = nla_parse_set(a,nlh.NLA_U8) + elif dt == nlh.NLA_SET_U16: a = nla_parse_set(a,nlh.NLA_U16) + elif dt == nlh.NLA_SET_U32: a = nla_parse_set(a,nlh.NLA_U32) + elif dt == nlh.NLA_SET_U64: a = nla_parse_set(a,nlh.NLA_U64) nla_put(msg,a,atype,dt) except struct.error: # append as Error, stripping null bytes nla_put(msg,_nla_strip_(a),atype,nlh.NLA_ERROR) except error as e: if e.errno == errno.EINVAL: - # a nested attribute failed to parse correctly + # a nested or set attribute failed to parse correctly nla_put(msg, _nla_strip_(a), atype, nlh.NLA_ERROR) else: raise @@ -544,6 +548,35 @@ def nla_parse_nested(nested): idx = nlh.NLMSG_ALIGN(idx + alen) return ns +def nla_parse_set(aset,etype): + """ + parses out a set of like sized elements + :param aset: a netlink nl80211 set + :param etype: data type of each element in the set + :returns: list of elements in aset + """ + # get the struct format and element size + if etype == nlh.NLA_U8: fmt = "B" + elif etype == nlh.NLA_U16: fmt = "H" + elif etype == nlh.NLA_U32: fmt = "I" + elif etype == nlh.NLA_U64: fmt = "Q" + else: + raise error(errno.EINVAL,"set elements are not valid datatype") + esize = struct.calcsize(fmt) + + ss = [] + idx = 0 + asize = len(aset) + while idx < asize: + if asize - idx < esize: break # don't attempt to parse pad bytes + try: + s = struct.unpack_from(fmt,aset,idx)[0] + ss.append(s) + idx += esize + except struct.error: + raise error(errno.EINVAL,"set elements failed to unpack") + return ss + def nla_put(msg,v,a,d): """ append attribute to msg's attribute list @@ -565,6 +598,10 @@ def nla_put_u64(msg,v,a): nla_put(msg,v,a,nlh.NLA_U64) def nla_put_string(msg,v,a): nla_put(msg,v,a,nlh.NLA_STRING) def nla_put_msecs(msg,v,a): nla_put(msg,v,a,nlh.NLA_MSECS) def nla_put_nested(msg,v,a): nla_put(msg,v,a,nlh.NLA_NESTED) +def nla_put_set_u8(msg,v,a): nla_put(msg,v,a,nlh.NLA_SET_U8) +def nla_put_set_u16(msg,v,a): nla_put(msg,v,a,nlh.NLA_SET_U16) +def nla_put_set_u32(msg,v,a): nla_put(msg,v,a,nlh.NLA_SET_U32) +def nla_put_set_u64(msg,v,a): nla_put(msg,v,a,nlh.NLA_SET_U64) def nla_putat(msg,i,v,a,d): """ @@ -654,6 +691,13 @@ def _attrpack_(a,v,d): nattr = struct.pack('B',nlen) + nested + '\x00' nattr += struct.pack("{0}x".format(nlh.NLMSG_ALIGNBY(len(nattr)))) attr += nattr + else: + fmt = "" # appease PyCharm + if d == nlh.NLA_U8: fmt = "B" + elif d == nlh.NLA_U16: fmt = "H" + elif d == nlh.NLA_U32: fmt = "I" + elif d == nlh.NLA_U64: fmt = "Q" + for el in v: attr += struct.pack(fmt,el) attr = nlh.nlattrhdr(len(attr),a) + attr # this is nlmsg_padlen attr += struct.pack("{0}x".format(nlh.NLMSG_ALIGNBY(len(attr)))) diff --git a/pyric/net/if_h.py b/pyric/net/if_h.py index cd794a7..baab202 100644 --- a/pyric/net/if_h.py +++ b/pyric/net/if_h.py @@ -162,8 +162,11 @@ # 2) For whatever reason, all ioctl calls accept and return ip4 addresses # prefixed by two null bytes -AF_UNSPEC = 0 # from socket.h sa_family unspecified -ARPHRD_ETHER = 1 # from net/if_arp.h sa_family ethernet a.k.a AF_LOCAL +AF_UNSPEC = 0 # from socket.h sa_family unspecified +ARPHRD_ETHER = 1 # from net/if_arp.h sa_family ethernet a.k.a AF_LOCAL +ARPHRD_IEEE80211 = 801 # net/if_arp.h sa_family IEEE 802.11 +ARPHRD_IEEE80211_PRISM = 802 # net/if_arp.h sa_family Prism2 header +ARPHRD_IEEE80211_RADIOTAP = 803 # net/if_arp.h sa_family radiotap header AF_INET = 2 # from socket.h ip address (ip4) sa_addr = 'H6B' def sockaddr(sa_family,sa_data=None): diff --git a/pyric/net/netlink_h.py b/pyric/net/netlink_h.py index c230bc7..5ea3905 100644 --- a/pyric/net/netlink_h.py +++ b/pyric/net/netlink_h.py @@ -268,7 +268,14 @@ def nlmsgerr(error,mlen,nltype,flags,seq,pid): """ # Attribute Datatypes -NLA_DATATYPES = ['unspec','u8','u16','u32','u64','string','flag','msecs','nested'] +""" + I add two datatypes to the netlink definition: + NLA_ERROR: designates an attribute that failed during unpacking + NLA_SET_*: designates an array of like sized attributes Sets are similar to nested + attributes but are not seperated by pad bytes. +""" +NLA_DATATYPES = ['unspec','u8','u16','u32','u64','string','flag','msecs','nested', + 'set_u8','set_u16','set_u32','set_u64'] NLA_ERROR = -1 # my own -> failed to unpack attribute, treat as unspec NLA_UNSPEC = 0 # Unspecified type, binary data chunk NLA_U8 = 1 # 8 bit integer @@ -279,8 +286,12 @@ def nlmsgerr(error,mlen,nltype,flags,seq,pid): NLA_FLAG = 6 # Flag NLA_MSECS = 7 # Micro seconds (64bit) NLA_NESTED = 8 # Nested attributes -__NLA_TYPE_MAX = 9 -NLA_TYPE_MAX = __NLA_TYPE_MAX - 1 +# the below are my own added to support nl80211 data like cipher_suites +NLA_SET_U8 = 9 # set of u8s +NLA_SET_U16 = 10 # set of u16s +NLA_SET_U32 = 11 # set of u32s +NLA_SET_U64 = 12 # set of u64s +NLA_TYPE_MAX = NLA_SET_U64 """ struct nlattr { diff --git a/pyric/net/policy.py b/pyric/net/policy.py index 3d467ed..bd9a745 100644 --- a/pyric/net/policy.py +++ b/pyric/net/policy.py @@ -54,11 +54,12 @@ def nla_datatype(policy,attr): # map string names to datatype lists nla_dts = {} +nla_dts_set = {} #### CTRL_ATTR_* # commented out below to determine if nested _OPS and _MCAST_GROUPS # was causing an infinite loop in nla_parse_nested -nla_dts["ctrl_attr"] = {genlh.CTRL_ATTR_UNSPEC:nlh.NLA_UNSPEC, +nla_dts['ctrl_attr'] = {genlh.CTRL_ATTR_UNSPEC:nlh.NLA_UNSPEC, genlh.CTRL_ATTR_FAMILY_ID:nlh.NLA_U16, genlh.CTRL_ATTR_FAMILY_NAME:nlh.NLA_STRING, genlh.CTRL_ATTR_VERSION:nlh.NLA_U32, @@ -70,22 +71,22 @@ def nla_datatype(policy,attr): #genlh.CTRL_ATTR_MCAST_GROUPS: nlh.NLA_UNSPEC} #### CTRL_ATTR_OP_* -nla_dts["ctrl_attr_op"] = {genlh.CTRL_ATTR_OP_UNSPEC:nlh.NLA_UNSPEC, +nla_dts['ctrl_attr_op'] = {genlh.CTRL_ATTR_OP_UNSPEC:nlh.NLA_UNSPEC, genlh.CTRL_ATTR_OP_ID:nlh.NLA_U32, genlh.CTRL_ATTR_OP_FLAGS:nlh.NLA_U32} #### CTRL_ATTR_MCAST_* -nla_dts["ctrl_attr_mcast"] = {genlh.CTRL_ATTR_MCAST_GRP_UNSPEC:nlh.NLA_UNSPEC, +nla_dts['ctrl_attr_mcast'] = {genlh.CTRL_ATTR_MCAST_GRP_UNSPEC:nlh.NLA_UNSPEC, genlh.CTRL_ATTR_MCAST_GRP_NAME:nlh.NLA_STRING, genlh.CTRL_ATTR_MCAST_GRP_ID:nlh.NLA_U32} -nla_dts["nl80211_attr"] = nl80211c.nl80211_policy +nla_dts['nl80211_attr'] = nl80211c.nl80211_policy # ATT we do include the below as defined in nl80211_c -#nla_dts["nl80211_key"] = nl80211c.nl80211_key_policy -#nla_dts["nl80211_wowlan_trig"] = nl80211_wowlan_trig_policy -#nla_dts["nl80211_wowlan_tcp"] = nl80211_wowlan_tcp_policy -#nla_dts["nl80211_coalesce"] = nl80211_coalesce_policy -#nla_dts["nl80211_rekey"] = nl80211_rekey_policy -#nla_dts["nl80211_match"] = nl80211_match_policy -#nla_dts["nl80211_plan"] = nl80211_plan_policy \ No newline at end of file +#nla_dts['nl80211_key'] = nl80211c.nl80211_key_policy +#nla_dts['nl80211_wowlan_trig'] = nl80211_wowlan_trig_policy +#nla_dts['nl80211_wowlan_tcp'] = nl80211_wowlan_tcp_policy +#nla_dts['nl80211_coalesce'] = nl80211_coalesce_policy +#nla_dts['nl80211_rekey'] = nl80211_rekey_policy +#nla_dts['nl80211_match'] = nl80211_match_policy +#nla_dts['nl80211_plan'] = nl80211_plan_policy \ No newline at end of file diff --git a/pyric/net/wireless/nl80211_c.py b/pyric/net/wireless/nl80211_c.py index 31aa87a..1d9c1ab 100644 --- a/pyric/net/wireless/nl80211_c.py +++ b/pyric/net/wireless/nl80211_c.py @@ -176,14 +176,14 @@ nl80211h.NL80211_ATTR_STA_SUPPORTED_CHANNELS:nlh.NLA_UNSPEC, nl80211h.NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES:nlh.NLA_UNSPEC, nl80211h.NL80211_ATTR_HANDLE_DFS:nlh.NLA_FLAG, - # not present in nl80211.c nl80211h.NL80211_ATTR_SUPPORTED_IFTYPES:nlh.NLA_NESTED, nl80211h.NL80211_ATTR_SOFTWARE_IFTYPES:nlh.NLA_NESTED, - #nl80211h.NL80211_ATTR_WIPHY_BANDS:nlh.NLA_NESTED, + #nl80211h.NL80211_ATTR_WIPHY_BANDS:nlh.NLA_NESTED, # we don't want to parse this nl80211h.NL80211_ATTR_SUPPORTED_COMMANDS:nlh.NLA_NESTED, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS:nlh.NLA_U8, - nl80211h.NL80211_ATTR_GENERATION: nlh.NLA_U8, - #nl80211h.NL80211_ATTR_MAC:nlh.NLA_STRING, + nl80211h.NL80211_ATTR_GENERATION:nlh.NLA_U8, + #nl80211h.NL80211_ATTR_MAC:nlh.NLA_STRING, # we don't want to parse this + nl80211h.NL80211_ATTR_CIPHER_SUITES:nlh.NLA_SET_U32, # my own - set of U32s #### defined in kernel v4 nl80211_h nl80211h.NL80211_ATTR_OPMODE_NOTIF:nlh.NLA_U8, nl80211h.NL80211_ATTR_VENDOR_ID:nlh.NLA_U32, @@ -202,7 +202,7 @@ nl80211h.NL80211_ATTR_SMPS_MODE:nlh.NLA_U8, nl80211h.NL80211_ATTR_MAC_MASK:nlh.NLA_UNSPEC, nl80211h.NL80211_ATTR_WIPHY_SELF_MANAGED_REG:nlh.NLA_FLAG, - #nl80211h.NL80211_ATTR_NETNS_FD:nlh.NLA_U32, + nl80211h.NL80211_ATTR_NETNS_FD:nlh.NLA_U32, nl80211h.NL80211_ATTR_SCHED_SCAN_DELAY:nlh.NLA_U32, nl80211h.NL80211_ATTR_REG_INDOOR:nlh.NLA_FLAG, #nl80211h.NL80211_ATTR_PBSS:nlh.NLA_FLAG @@ -303,11 +303,18 @@ } #static const struct nla_policy nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = { -#nl80211_sched_scan_plan_policy = { -# nl80211h.NL80211_SCHED_SCAN_PLAN_INTERVAL:nlh.NLA_U32, -# nl80211h.NL80211_SCHED_SCAN_PLAN_ITERATIONS:nlh.NLA_U32 -#} +nl80211_sched_scan_plan_policy = { + nl80211h.NL80211_SCHED_SCAN_PLAN_INTERVAL:nlh.NLA_U32, + nl80211h.NL80211_SCHED_SCAN_PLAN_ITERATIONS:nlh.NLA_U32 +} +""" + set definitions + NLA_SETs are futher defined here +""" +nl80211_set_policy = { + nl80211h.NL80211_ATTR_CIPHER_SUITES:nlh.NLA_U32 +} """ Parsing NL80211_ATTR_WIPHY_BANDS diff --git a/pyric/net/wireless/wlan.py b/pyric/net/wireless/wlan.py index e4223b8..43291a1 100644 --- a/pyric/net/wireless/wlan.py +++ b/pyric/net/wireless/wlan.py @@ -35,9 +35,9 @@ __status__ = 'Production' """ - cipher suite selectors - decided to (over)document this because it was such a hassle to - figure out, want to make sure I can come back at a later date and figure it out again - faster + cipher suite selectors - decided to (over)document this because it was such a + hassle to figure out, want to make sure I can come back at a later date and + figure it out again faster From nl80211.h @NL80211_ATTR_CIPHER_SUITES: a set of u32 values indicating the supported cipher suites @@ -91,7 +91,7 @@ say read the source code. """ -WLAN_CIPHER_SUITE_LEN = 4 +#WLAN_CIPHER_SUITE_LEN = 4 WLAN_CIPHER_SUITE_GROUP = 0x000fac00 WLAN_CIPHER_SUITE_WEP40 = 0x000fac01 WLAN_CIPHER_SUITE_TKIP = 0x000fac02 @@ -110,13 +110,6 @@ WLAN_CIPHER_SUITE_GCMP:'GCMP', WLAN_CIPHER_SUITE_SMS4:'SMS4' } -def ciphers(stream): - """ - parses out ciphers from stream - :param stream: packed byte string - :returns: a list of cipher selectors - """ - """ Coverage Class Limits IAW Std Table 8-56 """ COVERAGE_CLASS_MIN = 0 diff --git a/pyric/nlhelp/nlsearch.py b/pyric/nlhelp/nlsearch.py index e4d0e52..da7b69c 100644 --- a/pyric/nlhelp/nlsearch.py +++ b/pyric/nlhelp/nlsearch.py @@ -62,16 +62,16 @@ attributes = None # attr -> desc, commands used by, datatype attrlookup = None # reverse lookup for attribute constants ain = None -#try: - # first two lines are comments, 3rd line is empty -ain = open(attrpath,'r') -for _ in xrange(4): _in = ain.readline() -attributes = json.loads(ain.readline()) -attrlookup = json.loads(ain.readline()) -#except: -# raise pyric.error(pyric.EUNDEF, "Failed to process attributes.help") -#finally: -# if ain: ain.close() +try: + # first three lines are comments, 3th line is empty + ain = open(attrpath,'r') + for _ in xrange(4): _in = ain.readline() + attributes = json.loads(ain.readline()) + attrlookup = json.loads(ain.readline()) +except: + raise pyric.error(pyric.EUNDEF, "Failed to process attributes.help") +finally: + if ain: ain.close() def command(cmd): """ diff --git a/pyric/pyw.py b/pyric/pyw.py index 5841a08..a1e017e 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -290,7 +290,8 @@ def macget(card, *argv): flag = sioch.SIOCGIFHWADDR ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam == ifh.ARPHRD_ETHER or fam == ifh.AF_UNSPEC: # confirm hwaddr + if fam in [ifh.ARPHRD_ETHER, ifh.AF_UNSPEC,ifh.ARPHRD_IEEE80211_RADIOTAP]: + #if fam == ifh.ARPHRD_ETHER or fam == ifh.AF_UNSPEC: # confirm hwaddr return _hex2mac_(ret[18:24]) else: raise pyric.error(errno.EAFNOSUPPORT, @@ -322,7 +323,8 @@ def macset(card, mac, *argv): flag = sioch.SIOCSIFHWADDR ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [mac])) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam == ifh.ARPHRD_ETHER or fam == ifh.AF_UNSPEC: # confirm hwaddr + if fam in [ifh.ARPHRD_ETHER, ifh.AF_UNSPEC, ifh.ARPHRD_IEEE80211_RADIOTAP]: + #if fam == ifh.ARPHRD_ETHER or fam == ifh.AF_UNSPEC: # confirm hwaddr return _hex2mac_(ret[18:24]) else: raise pyric.error(errno.EAFNOSUPPORT, @@ -1489,7 +1491,7 @@ def devdel(card, *argv): msg = nl.nlmsg_new(nltype=_familyid_(nlsock), cmd=nl80211h.NL80211_CMD_DEL_INTERFACE, flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_IFINDEX) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) except AttributeError: @@ -1653,27 +1655,24 @@ def _commands_(command): cs.append(cmd[13:].lower()) # skip NL80211_CMD_ except KeyError: # kernel 4 added commands not found in kernel 3 nlh8022.h. + # keep this just in case new commands pop up again cs.append("unknown cmd ({0})".format(cmd)) return cs def _ciphers_(cipher): """ - parses the cipher stream returning a list of supported ciphers + identifies supported ciphers :param cipher: the cipher suite stream :returns: a list of supported ciphers """ - # to understand fully, see ieee80211_h.py. Basically cipher is a set - # of ciphers each cipher being 4 bytes, unpack each cipher as a u32 - # and find the value in the suite dict ss = [] - for i in xrange(len(cipher) / wlan.WLAN_CIPHER_SUITE_LEN): - s = struct.unpack_from('I', cipher, i * wlan.WLAN_CIPHER_SUITE_LEN)[0] + for s in cipher: try: ss.append(wlan.WLAN_CIPHER_SUITE_SELECTORS[s]) except KeyError as e: # we could do nothing, or append 'rsrv' but we'll add a little # for testing/future identificaion purposes - ss.append('RSRV-{0}'.format(e)) + ss.append('RSRV-{0}'.format(hex(int(e.__str__())))) return ss #### NETLINK/IOCTL PARAMETERS #### From b0485f42f30b9caaba0731e31ccaae777345e213 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Wed, 29 Jun 2016 11:29:13 -0600 Subject: [PATCH 061/121] v0.1.4 support for kernel 4 --- TODO | 50 ++++++++++-- __init__.py | 2 +- docs/PyRIC.tex | 3 +- examples/{device_details.py => info.py} | 16 ++-- pyric/__init__.py | 104 +++++++++++++++++++++++- pyric/lib/libio.py | 2 +- pyric/lib/libnl.py | 13 ++- pyric/net/sockios_h.py | 3 + pyric/net/wireless/nl80211_c.py | 2 + pyric/net/wireless/nl80211_h.py | 15 +++- pyric/nlhelp/commands.help | 4 +- pyric/pyw.py | 38 +++++---- pyric/utils/channels.py | 10 ++- setup.py | 18 +--- 14 files changed, 214 insertions(+), 66 deletions(-) rename examples/{device_details.py => info.py} (91%) diff --git a/TODO b/TODO index 42fcc7d..c9060c5 100644 --- a/TODO +++ b/TODO @@ -26,12 +26,46 @@ o has devie driver, name and some other details but appears to get these the same way PyRIC does 17) distro tests - - openSUSE - - RedHat/Fedora - - Debian (g2g) - - Arch - - CentOs (?) - - slackware - - dd-wrt/OpenWRT + o openSUSE + o RedHat/Fedora + o Debian (g2g) + o Arch + o CentOs (?) + o slackware + o dd-wrt/OpenWRT 18) port structs from new nl80211.h - 19) iw is showing a command that doesn't exist \ No newline at end of file + 19) iw is showing a command that doesn't exist + 21) look at NL80211_CMD_START_AP - no need to try and recreate the wheel by + replicate hostap but could be useful + 22) txset + o NOTE: the following is consistent with what iw gives us + o when using dBm + - get Operation not supported for setting tx power (see pyw.txset) + - have tried using the ifindex and phy. Both methods are accepted, returning + only Errno 95. + - Is the operation not supported by my cards? or is it not supported by the + kernel? + o when using mBm + - no errors reported but tx power is not changed + 23) Unknown Command 104. After updating to kernel 4, iw phy info returns + a Unknown command (104). pyw.phyinfo does not return this. + - iw 3.17 being used + - command 104 is NL80211_CMD_SET_QOS_MAP + - iw->util.c: + const char *command_name(enum nl80211_commands cmd) + { + if (cmd <= NL80211_CMD_MAX && commands[cmd]) + return commands[cmd]; + sprintf(cmdbuf, "Unknown command (%d)", cmd); + return cmdbuf; + } + + iw's nl80211.h defines NL80211_CMD_SET_QOS_MAP but util.c does not specify + this command in commands which explains the unknown command. + - I've gone through the stream returned from the kernel for a wiphy request + and pyw is not getting this command + - It does not look like iw is hardcoding this but I cannot see any other way. + - If this command was being returned, pyw would correctly identify it as + NL80211_CMD_SET_QOS_MAP - need to identify a card that supports this command + and determine that pyw does correctly identify it + 24) confirm download_url in setup.py is valid diff --git a/__init__.py b/__init__.py index 648f69d..ec95299 100644 --- a/__init__.py +++ b/__init__.py @@ -1,4 +1,4 @@ # PyRIC root Distribution directory # Do not import from this directory i.e from PyRIC import foobar # use pip ('sudo pip install PyRIC') or download latest tarbal to -# install. Then execute from pyric import ffobar +# install. Then execute from pyric import foobar diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index b725a2e..3e093ad 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -690,8 +690,7 @@ \subsection{Constants} \item \textbf{\_FAM80211ID\_}: Global netlink family id of nl80211. Do not touch \item \textbf{IFTYPES}: redefined (from nl80211\_h.py) interface modes \item \textbf{MNTRFLAGS}: redefined (from nl80211\_h.py) monitor mode flags -\item \textbf{IPADDR}: Regular Expression for ip4 address validation -\item \textbf{MACADDR}: Regular Expression for mac address validation +\item \textbf{TXPOWERSETTINGS}: redefined (from nl80211\_h.py) power level settings \end{itemize} \subsection{Objects/Classes} diff --git a/examples/device_details.py b/examples/info.py similarity index 91% rename from examples/device_details.py rename to examples/info.py index 0d7699b..7fd0345 100644 --- a/examples/device_details.py +++ b/examples/info.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -""" details.py +""" info.py Example for displaying device details @@ -36,9 +36,9 @@ def execute(dev): msg += "\twiphy: {0}\n".format(card.phy) if dinfo['mode'] == 'managed': msg += "\tchannel: {0} ({1} MHz), width: {2}, CF: {3}\n".format(rf2ch(dinfo['RF']), - dinfo['RF'], - dinfo['CHW'], - dinfo['CF']) + dinfo['RF'], + dinfo['CHW'], + dinfo['CF']) else: msg += "\tDevice not associated\n" print msg @@ -57,9 +57,11 @@ def execute(dev): msg += "\tSupported Commands:\n" for cmd in pinfo['commands']: msg += "\t * {0}\n".format(cmd) - msg += "\tSupported Channels:\n" - for ch in map(rf2ch,pinfo['freqs']): - msg += "\t * {0}\n".format(ch) + msg += "\tSupported Frequencies:\n" + for rf in pinfo['freqs']: + msg += "\t * {0} ({1})\n".format(rf,rf2ch(rf)) + #for ch in map(rf2ch,pinfo['freqs']): + # msg += "\t * {0}\n".format(ch) msg += "\tSupported Ciphers:\n" for cipher in pinfo['ciphers']: msg += "\t * {0}\n".format(cipher) diff --git a/pyric/__init__.py b/pyric/__init__.py index 0164fab..7b94d95 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -56,4 +56,106 @@ def perror(e): :returns: string description of error code """ # anything less than 0 is an unknown - return strerror(e) \ No newline at end of file + return strerror(e) + +long_desc = """ +# PyRIC 0.1.4: Python Radio Interface Controller +## Linux wireless library for the Python Wireless Developer and Pentester + +## 1 DESCRIPTION: +PyRIC (is a Linux only) library providing wireless developers and pentesters the +ability to identify, enumerate and manipulate their system's wireless cards +programmatically in Python. Pentesting applications and scripts written in Python +have increased dramatically in recent years. However, these tools still rely on +Linux command lines tools to setup and prepare and restore the system for use. +Until now. Why use subprocess.Popen, regular expressions and str.find to interact +with your wireless cards? PyRIC is: + +1. Pythonic: no ctypes, SWIG etc. PyRIC redefines C header files as Python and +uses sockets to communicate with the kernel. +2. Self-sufficient: No third-party files used. PyRIC is completely self-contained. +3. Fast: (relatively speaking) PyRIC is faster than using command line tools +through subprocess.Popen +4. Parseless: Get the output you want without parsing output from command line +tools. Never worry about newer iw versions and having to rewrite your parsers. +5. Easy: If you can use iw, you can use PyRIC. + +At it's heart, PyRIC is a Python port of (a subset of) iw and by extension, a +Python port of Netlink w.r.t nl80211 functionality. The original goal of PyRIC +was to provide a simple interface to the underlying nl80211 kernel support, +handling the complex operations of Netlink seamlessy while maintaining a minimum +of "code walking" to understand, modify and extend. But, why stop there? Since +it's initial inception, PyRIC has grown to include ioctl support to replicate +features of ifconfig such as getting or setting the mac address and has recently +implemented rkill support to soft block or unblock wireless cards. + +### a. Additions to iw +Several "extensions" have been added to iw: +* Persistent sockets: pyw provides the caller with functions & ability to pass +their own netlink (or ioctl socket) to pyw functions; +* One-time request for the nl80211 family id: pyw stores the family id in a +global variable +* Consolidating different "reference" values to wireless NICs in one class +(Cards are tuples t=(dev,phy #,ifindex) + +These are minimal changes but they can improve the performance of any progams +that needs to access the wireless nic repeatedly as shown in the table below. + +| chset | Total | Avg | Longest | Shortest | +|------------|----------|--------|-----------|----------| +| Popen(iw) | 588.3059 | 0.0588 | 0.0682 | 0.0021 | +| one-time | 560.3559 | 0.0560 | 0.0645 | 0.0003 | +| persistent | 257.8293 | 0.0257 | 0.0354 | 0.0004 | + +The table shows benchmarks for hop time on a Alfa AWUS036NH 10000 times. Note that +there is no implication that PyRIC is faster than iw. Rather, the table shows that +PyRIC is faster than using Popen to execute iw. Using one-time sockets, there is +a difference of 28 seconds over Popen and iw with a small decrease in the average +hoptime. Not a big difference. However, the performance increased dramatically when +persistent netlink sockets are used with the total time and average hop time nearly +halved. + +### b. Current State +ATT, PyRIC accomplishes my core needs but it is still a work in progress. It +currently pyw provides the following: +* enumerate interfaces and wireless interfaces +* identify a cards chipset and driver +* get/set hardware address +* get/set ip4 address, netmask and or broadcast +* turn card on/off +* get supported standards +* get supported commands +* get supported modes +* get dev info +* get phy info +* get/set regulatory domain +* get/set mode +* get/set coverage class, RTS threshold, Fragmentation threshold & retry limits +* add/delete interfaces +* enumerate ISM and UNII channels +* block/unblock rfkill devices + +In utils, several helpers can be found that can be used to: +* enumerate channels and frequencies and convert between the two +* manipulate mac addresses and generate random ones +* fetch and parse the IEEE oui text file +* further rfkill operations to include listing all rfkill devices + +For a full listing of every function offered by pyw and helpers see the user +guide PyRIC.pdf. + +PyRIC also provides limited help functionality concerning nl80211 commands/attributes +for those who wish to add additional commands. However, it pulls directly from +the comments nl80211 header file and may be vague. + +### c. What is PyRIC? + +To avoid confusion, PyRIC is the system as a whole, including all header files +and "libraries" that are required to communicate with the kernel. pyw is a +interface to these libraries providing specific funtions. + +What it does - defines programmatic access to a subset of iw, ifconfig and rkill. +In short, PyRIC provides Python wireless pentesters the ability to work with +wireless cards directly from Python without having to use command line tools +through Popen. +""" \ No newline at end of file diff --git a/pyric/lib/libio.py b/pyric/lib/libio.py index e865e88..a6d3b20 100644 --- a/pyric/lib/libio.py +++ b/pyric/lib/libio.py @@ -64,7 +64,6 @@ def io_transfer(iosock,flag,ifreq): return ioctl(iosock.fileno(),flag,ifreq) except (AttributeError,struct.error) as e: # either sock is not valid or a bad value passed to ifreq - # note: should not get these but just in case if e.message.find('fileno'): raise error(errno.ENOTSOCK,"bad socket") else: raise error(errno.EINVAL,e) except IOError as e: @@ -75,4 +74,5 @@ def io_transfer(iosock,flag,ifreq): else: raise error(-1,e) except Exception as e: + # blanket catchall raise error(-1,e.args[0]) diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 95e44c3..7453dc4 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -400,8 +400,8 @@ def tostream(self): for attr,v,data in self['attrs']: try: payload += _attrpack_(attr,v,data) - except struct.error: - raise error(-1,"Packing {0} {1}".format(attr,v)) + except struct.error as e: + raise error(-1,"Packing {0} {1}: {2}".format(attr,v,e)) return nlh.nlmsghdr(len(payload),self.nltype,self.flags,self.seq,self.pid) + payload def nlmsg_new(nltype=None,cmd=None,seq=None,pid=None,flags=None,attrs=None): @@ -685,7 +685,6 @@ def _attrpack_(a,v,d): elif d == nlh.NLA_FLAG: attr = '' # a 0 sized attribute elif d == nlh.NLA_MSECS: attr = struct.pack("Q",v) elif d == nlh.NLA_NESTED: - attr = '' for nested in v: nlen = len(v) + 2 nattr = struct.pack('B',nlen) + nested + '\x00' @@ -693,10 +692,10 @@ def _attrpack_(a,v,d): attr += nattr else: fmt = "" # appease PyCharm - if d == nlh.NLA_U8: fmt = "B" - elif d == nlh.NLA_U16: fmt = "H" - elif d == nlh.NLA_U32: fmt = "I" - elif d == nlh.NLA_U64: fmt = "Q" + if d == nlh.NLA_SET_U8: fmt = "B" + elif d == nlh.NLA_SET_U16: fmt = "H" + elif d == nlh.NLA_SET_U32: fmt = "I" + elif d == nlh.NLA_SET_U64: fmt = "Q" for el in v: attr += struct.pack(fmt,el) attr = nlh.nlattrhdr(len(attr),a) + attr # this is nlmsg_padlen diff --git a/pyric/net/sockios_h.py b/pyric/net/sockios_h.py index dd9c901..e01930c 100644 --- a/pyric/net/sockios_h.py +++ b/pyric/net/sockios_h.py @@ -61,6 +61,9 @@ SIOCGIWNAME = 0x8B01 # get name (standards can be retrieved here) SIOCGIWTXPOW = 0x8B27 # get transmit power SIOCGIWFREQ = 0x8B05 # get frequency +SIOCSIWSENS = 0x8B08 # set sensitivity (dBm) -> not supported +SIOCGIWSENS = 0x8B09 # get sensitivity (dBm) -> not supported +SIOCSIWTXPOW = 0x8B26 # set transmit power (dBm) # Socket configuration controls SIOCGIFNAME = 0x8910 # get iface name diff --git a/pyric/net/wireless/nl80211_c.py b/pyric/net/wireless/nl80211_c.py index 1d9c1ab..d2a1776 100644 --- a/pyric/net/wireless/nl80211_c.py +++ b/pyric/net/wireless/nl80211_c.py @@ -126,6 +126,8 @@ nl80211h.NL80211_ATTR_MCAST_RATE:nlh.NLA_U32, nl80211h.NL80211_ATTR_OFFCHANNEL_TX_OK:nlh.NLA_FLAG, nl80211h.NL80211_ATTR_KEY_DEFAULT_TYPES:nlh.NLA_NESTED, + nl80211h.NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX:nlh.NLA_U32, + nl80211h.NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX:nlh.NLA_U32, nl80211h.NL80211_ATTR_WOWLAN_TRIGGERS:nlh.NLA_NESTED, nl80211h.NL80211_ATTR_STA_PLINK_STATE:nlh.NLA_U8, nl80211h.NL80211_ATTR_SCHED_SCAN_INTERVAL:nlh.NLA_U32, diff --git a/pyric/net/wireless/nl80211_h.py b/pyric/net/wireless/nl80211_h.py index 8af48f7..3488fe8 100644 --- a/pyric/net/wireless/nl80211_h.py +++ b/pyric/net/wireless/nl80211_h.py @@ -555,6 +555,19 @@ * other station that transmission must be blocked until the channel * switch is complete. #### NEW IN KERNEL VERSION 4 #### + * @NL80211_CMD_VENDOR: Vendor-specified command/event. The command is specified + * by the %NL80211_ATTR_VENDOR_ID attribute and a sub-command in + * %NL80211_ATTR_VENDOR_SUBCMD. Parameter(s) can be transported in + * %NL80211_ATTR_VENDOR_DATA. + * For feature advertisement, the %NL80211_ATTR_VENDOR_DATA attribute is + * used in the wiphy data as a nested attribute containing descriptions + * (&struct nl80211_vendor_cmd_info) of the supported vendor commands. + * This may also be sent as an event with the same attributes. + * @NL80211_CMD_SET_QOS_MAP: Set Interworking QoS mapping for IP DSCP values. + * The QoS mapping information is included in %NL80211_ATTR_QOS_MAP. If + * that attribute is not included, QoS mapping is disabled. Since this + * QoS mapping is relevant for IP packets, it is only valid during an + * association. This is cleared on disassociation and AP restart. * @NL80211_CMD_ADD_TX_TS: Ask the kernel to add a traffic stream for the given * %NL80211_ATTR_TSID and %NL80211_ATTR_MAC with %NL80211_ATTR_USER_PRIO * and %NL80211_ATTR_ADMITTED_TIME parameters. @@ -2965,7 +2978,7 @@ def nl80211_sta_flag_update(mask,setto): * @NL80211_TX_POWER_FIXED: fix TX power to the mBm parameter */ """ -NL80211_TX_POWER_LEVELS = ['auto','limit','fixed'] +NL80211_TX_POWER_SETTINGS = ['auto','limit','fixed'] NL80211_TX_POWER_AUTOMATIC = 0 NL80211_TX_POWER_LIMITED = 1 NL80211_TX_POWER_FIXED = 2 diff --git a/pyric/nlhelp/commands.help b/pyric/nlhelp/commands.help index f4eb3f1..2bd6099 100644 --- a/pyric/nlhelp/commands.help +++ b/pyric/nlhelp/commands.help @@ -1,6 +1,6 @@ # commands.help (stored in json format) # Automatically generated 2016-04-17T11:06:57.694132 from nl80211.h -# Additions for kernel version 4 added 2016-06-25T10:29:00.0 +# Additions for kernel version 4 added 2016-06-29T03:50:00.0 -{"@NL80211_CMD_GET_REG": {"attrs": [], "desc": "ask the wireless core to send us its currently set\tregulatory domain."}, "@NL80211_CMD_STOP_SCHED_SCAN": {"attrs": [], "desc": "stop if scheduled scan is not running."}, "@NL80211_CMD_START_SCHED_SCAN": {"attrs": ["%NL80211_ATTR_SCHED_SCAN_INTERVAL", "%NL80211_ATTR_SCAN_SSIDS", "%NL80211_ATTR_SCAN_FREQUENCIES", "%NL80211_ATTR_IE"], "desc": "start intervals, as specified by %NL80211_ATTR_SCHED_SCAN_INTERVAL. Like with normal scans, if SSIDs (%NL80211_ATTR_SCAN_SSIDS) are passed, they are used in the probe requests. For broadcast, a broadcast SSID must be passed (ie. an empty string). If no SSID is passed, no probe requests are sent and a passive scan is performed. %NL80211_ATTR_SCAN_FREQUENCIES, if passed, define which channels should be scanned; if not passed, all channels allowed for the current regulatory domain are used. Extra IEs can also be passed from the userspace by using the %NL80211_ATTR_IE attribute."}, "@NL80211_CMD_NEW_SURVEY_RESULTS": {"attrs": [], "desc": "survey NL80211_CMD_GET_SURVEY and on the \"scan\" multicast group)"}, "@NL80211_CMD_SET_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_IFTYPE"], "desc": "Set %NL80211_ATTR_IFINDEX and %NL80211_ATTR_IFTYPE."}, "@NL80211_CMD_DISASSOCIATE": {"attrs": [], "desc": "disassociation NL80211_CMD_AUTHENTICATE but for Disassociation frames (similar to MLME-DISASSOCIATE.request and MLME-DISASSOCIATE.indication primitives)."}, "@NL80211_CMD_FRAME": {"attrs": ["%NL80211_ATTR_FRAME", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_DURATION", "%NL80211_ATTR_COOKIE", "%NL80211_ATTR_TX_NO_CCK_RATE"], "desc": "Management command is used both as a request to transmit a management frame and as an event indicating reception of a frame that was not processed in kernel code, but is for us (i.e., which may need to be processed in a user space application). %NL80211_ATTR_FRAME is used to specify the frame contents (including header). %NL80211_ATTR_WIPHY_FREQ is used to indicate on which channel the frame is to be transmitted or was received. If this channel is not the current channel (remain-on-channel or the operational channel) the device will switch to the given channel and transmit the frame, optionally waiting for a response for the time specified using %NL80211_ATTR_DURATION. When called, this operation returns a cookie (%NL80211_ATTR_COOKIE) that will be included with the TX status event pertaining to the TX request. %NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the management frames at CCK rate or not in 2GHz band."}, "@NL80211_CMD_NEW_KEY": {"attrs": ["%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_KEY_CIPHER", "%NL80211_ATTR_KEY_SEQ"], "desc": "add %NL80211_ATTR_KEY_IDX, %NL80211_ATTR_MAC, %NL80211_ATTR_KEY_CIPHER, and %NL80211_ATTR_KEY_SEQ attributes."}, "@NL80211_CMD_STOP_AP": {"attrs": [], "desc": "Stop"}, "@NL80211_CMD_DEL_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX"], "desc": "Virtual %NL80211_ATTR_IFINDEX and %NL80211_ATTR_WIPHY. Can also be sent from userspace to request deletion of a virtual interface, then requires attribute %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNEXPECTED_4ADDR_FRAME": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Sent associated station identified by %NL80211_ATTR_MAC sent a 4addr frame and wasn't already in a 4-addr VLAN. The event will be sent similarly to the %NL80211_CMD_UNEXPECTED_FRAME event, to the same listener."}, "@NL80211_CMD_SET_MESH_CONFIG": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set interface identified by %NL80211_ATTR_IFINDEX"}, "@NL80211_CMD_STOP_P2P_DEVICE": {"attrs": ["%NL80211_ATTR_WDEV"], "desc": "Stop its %NL80211_ATTR_WDEV identifier."}, "@NL80211_CMD_START_P2P_DEVICE": {"attrs": ["%NL80211_ATTR_WDEV"], "desc": "Start its %NL80211_ATTR_WDEV identifier. It must have been created with %NL80211_CMD_NEW_INTERFACE previously. After it has been started, the P2P Device can be used for P2P operations, e.g. remain-on-channel and public action frame TX."}, "@NL80211_CMD_SET_COALESCE": {"attrs": [], "desc": "Configure"}, "@NL80211_CMD_DEL_WIPHY": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_WIPHY_NAME"], "desc": "Wiphy %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME."}, "@NL80211_CMD_SET_STATION": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Set %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_LEAVE_MESH": {"attrs": [], "desc": "Leave network is determined by the network interface."}, "@NL80211_CMD_GET_KEY": {"attrs": ["%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_MAC"], "desc": "Get by %NL80211_ATTR_KEY_IDX and/or %NL80211_ATTR_MAC."}, "@NL80211_CMD_GET_SURVEY": {"attrs": [], "desc": "get"}, "@NL80211_CMD_TDLS_MGMT": {"attrs": [], "desc": "Send"}, "@NL80211_CMD_SET_BSS": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_SET_WOWLAN": {"attrs": ["%NL80211_ATTR_WOWLAN_TRIGGERS"], "desc": "set Since wireless is more complex than wired ethernet, it supports various triggers. These triggers can be configured through this command with the %NL80211_ATTR_WOWLAN_TRIGGERS attribute. For more background information, see http://wireless.kernel.org/en/users/Documentation/WoWLAN. The @NL80211_CMD_SET_WOWLAN command can also be used as a notification from the driver reporting the wakeup reason. In this case, the @NL80211_ATTR_WOWLAN_TRIGGERS attribute will contain the reason for the wakeup, if it was caused by wireless. If it is not present in the wakeup notification, the wireless device didn't cause the wakeup but reports that it was woken up."}, "@NL80211_CMD_NEW_STATION": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Add the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_SET_PMKSA": {"attrs": ["%NL80211_ATTR_PMKID"], "desc": "Add (for the BSSID) and %NL80211_ATTR_PMKID."}, "@NL80211_CMD_SET_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": " destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_DEL_STATION": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Remove or, if no MAC address given, all stations, on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNPROT_DISASSOCIATE": {"attrs": [], "desc": "Unprotected notification. This event is used to indicate that an unprotected disassociation frame was dropped when MFP is in use."}, "@NL80211_CMD_CH_SWITCH_NOTIFY": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_FREQ"], "desc": "An independently of the userspace SME, send this event indicating %NL80211_ATTR_IFINDEX is now on %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width."}, "@NL80211_CMD_SET_KEY": {"attrs": ["%NL80211_ATTR_KEY_DEFAULT_MGMT", "%NL80211_ATTR_KEY_THRESHOLD"], "desc": "Set %NL80211_ATTR_KEY_DEFAULT_MGMT, or %NL80211_ATTR_KEY_THRESHOLD."}, "@NL80211_CMD_SET_MAC_ACL": {"attrs": ["%NL80211_ATTR_MAC_ADDRS", "%NL80211_ATTR_ACL_POLICY"], "desc": "sets This is to be used with the drivers advertising the support of MAC address based access control. List of MAC addresses is passed in %NL80211_ATTR_MAC_ADDRS and ACL policy is passed in %NL80211_ATTR_ACL_POLICY. Driver will enable ACL with this list, if it is not already done. The new list will replace any existing list. Driver will clear its ACL when the list of MAC addresses passed is empty. This command is used in AP/P2P GO mode. Driver has to make sure to clear its ACL list during %NL80211_CMD_STOP_AP."}, "@NL80211_CMD_GET_WOWLAN": {"attrs": [], "desc": "get"}, "@NL80211_CMD_GET_STATION": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Get %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNSPEC": {"attrs": [], "desc": "unspecified"}, "@NL80211_CMD_NEW_PEER_CANDIDATE": {"attrs": [], "desc": "Notification beacon or probe response from a compatible mesh peer. This is only sent while no station information (sta_info) exists for the new peer candidate and when @NL80211_MESH_SETUP_USERSPACE_AUTH, @NL80211_MESH_SETUP_USERSPACE_AMPE, or @NL80211_MESH_SETUP_USERSPACE_MPM is set. On reception of this notification, userspace may decide to create a new station (@NL80211_CMD_NEW_STATION). To stop this notification from reoccurring, the userspace authentication daemon may want to create the new station with the AUTHENTICATED flag unset and maybe change it later depending on the authentication result."}, "@NL80211_CMD_REGISTER_ACTION": {"attrs": [], "desc": "Alias backward compatibility"}, "@NL80211_CMD_REG_CHANGE": {"attrs": ["%NL80211_ATTR_REG_INITIATOR", "%NL80211_ATTR_REG_ALPHA2", "%NL80211_ATTR_REG_TYPE", "%NL80211_ATTR_REG_ALPHA2"], "desc": "indicates has been changed and provides details of the request information that caused the change such as who initiated the regulatory request (%NL80211_ATTR_REG_INITIATOR), the wiphy_idx (%NL80211_ATTR_REG_ALPHA2) on which the request was made from if the initiator was %NL80211_REGDOM_SET_BY_COUNTRY_IE or %NL80211_REGDOM_SET_BY_DRIVER, the type of regulatory domain set (%NL80211_ATTR_REG_TYPE), if the type of regulatory domain is %NL80211_REG_TYPE_COUNTRY the alpha2 to which we have moved on to (%NL80211_ATTR_REG_ALPHA2)."}, "@NL80211_CMD_CONN_FAILED": {"attrs": ["%NL80211_ATTR_CONN_FAILED_REASON"], "desc": "connection notify userspace that AP has rejected the connection request from a station, due to particular reason. %NL80211_ATTR_CONN_FAILED_REASON is used for this."}, "@NL80211_CMD_SCAN_ABORTED": {"attrs": [], "desc": "scan partial scan results may be available"}, "@NL80211_CMD_SET_POWER_SAVE": {"attrs": [], "desc": "Set"}, "@NL80211_CMD_SET_MGMT_EXTRA_IE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MGMT_SUBTYPE", "%NL80211_ATTR_IE"], "desc": "Set interface is identified with %NL80211_ATTR_IFINDEX and the management frame subtype with %NL80211_ATTR_MGMT_SUBTYPE. The extra IE data to be added to the end of the specified management frame is specified with %NL80211_ATTR_IE. If the command succeeds, the requested data will be added to all specified management frames generated by kernel/firmware/driver. Note: This command has been removed and it is only reserved at this point to avoid re-using existing command number. The functionality this command was planned for has been provided with cleaner design with the option to specify additional IEs in NL80211_CMD_TRIGGER_SCAN, NL80211_CMD_AUTHENTICATE, NL80211_CMD_ASSOCIATE, NL80211_CMD_DEAUTHENTICATE, and NL80211_CMD_DISASSOCIATE."}, "@NL80211_CMD_SET_REKEY_OFFLOAD": {"attrs": ["%NL80211_ATTR_REKEY_DATA"], "desc": "This the necessary information for supporting GTK rekey offload. This feature is typically used during WoWLAN. The configuration data is contained in %NL80211_ATTR_REKEY_DATA (which is nested and contains the data in sub-attributes). After rekeying happened, this command may also be sent by the driver as an MLME event to inform userspace of the new replay counter."}, "@NL80211_CMD_SET_CHANNEL": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set and the attributes determining channel width) the given interface (identifed by %NL80211_ATTR_IFINDEX) shall operate on. In case multiple channels are supported by the device, the mechanism with which it switches channels is implementation-defined. When a monitor interface is given, it can only switch channel while no other interfaces are operating to avoid disturbing the operation of any other interfaces, and other interfaces will again take precedence when they are used."}, "@NL80211_CMD_START_AP": {"attrs": ["%NL80211_ATTR_BEACON_INTERVAL", "%NL80211_ATTR_DTIM_PERIOD", "%NL80211_ATTR_SSID", "%NL80211_ATTR_HIDDEN_SSID", "%NL80211_ATTR_CIPHERS_PAIRWISE", "%NL80211_ATTR_CIPHER_GROUP", "%NL80211_ATTR_WPA_VERSIONS", "%NL80211_ATTR_AKM_SUITES", "%NL80211_ATTR_PRIVACY", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_INACTIVITY_TIMEOUT", "%NL80211_ATTR_ACL_POLICY", "%NL80211_ATTR_MAC_ADDRS", "%NL80211_ATTR_WIPHY_FREQ"], "desc": "Start are like for %NL80211_CMD_SET_BEACON, and additionally parameters that do not change are used, these include %NL80211_ATTR_BEACON_INTERVAL, %NL80211_ATTR_DTIM_PERIOD, %NL80211_ATTR_SSID, %NL80211_ATTR_HIDDEN_SSID, %NL80211_ATTR_CIPHERS_PAIRWISE, %NL80211_ATTR_CIPHER_GROUP, %NL80211_ATTR_WPA_VERSIONS, %NL80211_ATTR_AKM_SUITES, %NL80211_ATTR_PRIVACY, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_INACTIVITY_TIMEOUT, %NL80211_ATTR_ACL_POLICY and %NL80211_ATTR_MAC_ADDRS. The channel to use can be set on the interface or be given using the %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width."}, "@NL80211_CMD_DEL_PMKSA": {"attrs": ["%NL80211_ATTR_PMKID"], "desc": "Delete (for the BSSID) and %NL80211_ATTR_PMKID."}, "@NL80211_CMD_UNEXPECTED_FRAME": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Used (or GO) interface (i.e. hostapd) to ask for unexpected frames to implement sending deauth to stations that send unexpected class 3 frames. Also used as the event sent by the kernel when such a frame is received. For the event, the %NL80211_ATTR_MAC attribute carries the TA and other attributes like the interface index are present. If used as the command it must have an interface index and you can only unsubscribe from the event by closing the socket. Subscription is also for %NL80211_CMD_UNEXPECTED_4ADDR_FRAME events."}, "@NL80211_CMD_GET_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Get destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_GET_BEACON": {"attrs": [], "desc": ""}, "@NL80211_CMD_PMKSA_CANDIDATE": {"attrs": [], "desc": "This of PMKSA caching dandidates."}, "@NL80211_CMD_PROBE_CLIENT": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_COOKIE", "%NL80211_ATTR_ACK"], "desc": "Probe by sending a null data frame to it and reporting when the frame is acknowleged. This is used to allow timing out inactive clients. Uses %NL80211_ATTR_IFINDEX and %NL80211_ATTR_MAC. The command returns a direct reply with an %NL80211_ATTR_COOKIE that is later used to match up the event with the request. The event includes the same data and has %NL80211_ATTR_ACK set if the frame was ACKed."}, "@NL80211_CMD_NEW_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFTYPE", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFTYPE", "%NL80211_ATTR_IFNAME"], "desc": "Newly to %NL80211_CMD_GET_INTERFACE. Has %NL80211_ATTR_IFINDEX, %NL80211_ATTR_WIPHY and %NL80211_ATTR_IFTYPE attributes. Can also be sent from userspace to request creation of a new virtual interface, then requires attributes %NL80211_ATTR_WIPHY, %NL80211_ATTR_IFTYPE and %NL80211_ATTR_IFNAME."}, "@NL80211_CMD_SET_TX_BITRATE_MASK": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface and @NL80211_ATTR_TX_RATES the set of allowed rates."}, "@NL80211_CMD_NEW_SCAN_RESULTS": {"attrs": [], "desc": "scan NL80211_CMD_GET_SCAN and on the \"scan\" multicast group)"}, "@NL80211_CMD_GET_WIPHY": {"attrs": [], "desc": "request to get a list of all present wiphys."}, "@NL80211_CMD_SET_NOACK_MAP": {"attrs": [], "desc": "sets No Acknowledgement Policy should be applied."}, "@NL80211_CMD_ACTION": {"attrs": [], "desc": "Alias"}, "@NL80211_CMD_FLUSH_PMKSA": {"attrs": [], "desc": "Flush"}, "@NL80211_CMD_ASSOCIATE": {"attrs": [], "desc": "association NL80211_CMD_AUTHENTICATE but for Association and Reassociation (similar to MLME-ASSOCIATE.request, MLME-REASSOCIATE.request, MLME-ASSOCIATE.confirm or MLME-REASSOCIATE.confirm primitives)."}, "@NL80211_CMD_GET_PROTOCOL_FEATURES": {"attrs": ["%NL80211_ATTR_PROTOCOL_FEATURES"], "desc": "Get i.e. features for the nl80211 protocol rather than device features. Returns the features in the %NL80211_ATTR_PROTOCOL_FEATURES bitmap."}, "@NL80211_CMD_DEAUTHENTICATE": {"attrs": [], "desc": "deauthentication NL80211_CMD_AUTHENTICATE but for Deauthentication frames (similar to MLME-DEAUTHENTICATION.request and MLME-DEAUTHENTICATE.indication primitives)."}, "@NL80211_CMD_CRIT_PROTOCOL_STOP": {"attrs": [], "desc": "Indicates return back to normal."}, "@NL80211_CMD_FT_EVENT": {"attrs": [], "desc": "Send to the supplicant. This will carry the target AP's MAC address along with the relevant Information Elements. This event is used to report received FT IEs (MDIE, FTIE, RSN IE, TIE, RICIE)."}, "@NL80211_CMD_NEW_WIPHY": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_WIPHY_NAME"], "desc": "Newly or rename notification. Has attributes %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME."}, "@NL80211_CMD_UPDATE_FT_IES": {"attrs": [], "desc": "Pass Information Element to the WLAN driver"}, "@NL80211_CMD_SET_WDS_PEER": {"attrs": [], "desc": "Set"}, "@NL80211_CMD_SCHED_SCAN_STOPPED": {"attrs": [], "desc": "indicates stopped. The driver may issue this event at any time during a scheduled scan. One reason for stopping the scan is if the hardware does not support starting an association or a normal scan while running a scheduled scan. This event is also sent when the %NL80211_CMD_STOP_SCHED_SCAN command is received or when the interface is brought down while a scheduled scan was running."}, "@NL80211_CMD_FRAME_TX_STATUS": {"attrs": ["%NL80211_ATTR_COOKIE", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_ACK"], "desc": "Report transmitted with %NL80211_CMD_FRAME. %NL80211_ATTR_COOKIE identifies the TX command and %NL80211_ATTR_FRAME includes the contents of the frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged the frame."}, "@NL80211_CMD_TDLS_OPER": {"attrs": ["%NL80211_ATTR_TDLS_OPERATION", "%NL80211_ATTR_MAC", "%NL80211_ATTR_REASON_CODE"], "desc": "Perform In addition, this can be used as an event to request userspace to take actions on TDLS links (set up a new link or tear down an existing one). In such events, %NL80211_ATTR_TDLS_OPERATION indicates the requested operation, %NL80211_ATTR_MAC contains the peer MAC address, and %NL80211_ATTR_REASON_CODE the reason code to be used (only with %NL80211_TDLS_TEARDOWN)."}, "@NL80211_CMD_GET_SCAN": {"attrs": [], "desc": "get"}, "@NL80211_CMD_SET_WIPHY": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_NAME", "%NL80211_ATTR_WIPHY_TXQ_PARAMS", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_WIPHY_RETRY_SHORT", "%NL80211_ATTR_WIPHY_RETRY_LONG", "%NL80211_ATTR_WIPHY_FRAG_THRESHOLD", "%NL80211_ATTR_WIPHY_RTS_THRESHOLD"], "desc": "set %NL80211_ATTR_IFINDEX; can be used to set %NL80211_ATTR_WIPHY_NAME, %NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ (and the attributes determining the channel width; this is used for setting monitor mode channel), %NL80211_ATTR_WIPHY_RETRY_SHORT, %NL80211_ATTR_WIPHY_RETRY_LONG, %NL80211_ATTR_WIPHY_FRAG_THRESHOLD, and/or %NL80211_ATTR_WIPHY_RTS_THRESHOLD. However, for setting the channel, see %NL80211_CMD_SET_CHANNEL instead, the support here is for backward compatibility only."}, "@NL80211_CMD_AUTHENTICATE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_SSID", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_IE", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_TIMED_OUT", "%NL80211_ATTR_MAC"], "desc": "authentication This command is used both as a command (request to authenticate) and as an event on the \"mlme\" multicast group indicating completion of the authentication process. When used as a command, %NL80211_ATTR_IFINDEX is used to identify the interface. %NL80211_ATTR_MAC is used to specify PeerSTAAddress (and BSSID in case of station mode). %NL80211_ATTR_SSID is used to specify the SSID (mainly for association, but is included in authentication request, too, to help BSS selection. %NL80211_ATTR_WIPHY_FREQ is used to specify the frequence of the channel in MHz. %NL80211_ATTR_AUTH_TYPE is used to specify the authentication type. %NL80211_ATTR_IE is used to define IEs (VendorSpecificInfo, but also including RSN IE and FT IEs) to be added to the frame. When used as an event, this reports reception of an Authentication frame in station and IBSS modes when the local MLME processed the frame, i.e., it was for the local STA and was received in correct state. This is similar to MLME-AUTHENTICATE.confirm primitive in the MLME SAP interface (kernel providing MLME, userspace SME). The included %NL80211_ATTR_FRAME attribute contains the management frame (including both the header and frame body, but not FCS). This event is also used to indicate if the authentication attempt timed out. In that case the %NL80211_ATTR_FRAME attribute is replaced with a %NL80211_ATTR_TIMED_OUT flag (and %NL80211_ATTR_MAC to indicate which pending authentication timed out)."}, "@NL80211_CMD_DEL_PATH": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Remove or, if no MAC address given, all mesh paths, on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_GET_MESH_CONFIG": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Get interface identified by %NL80211_ATTR_IFINDEX"}, "@NL80211_CMD_NEW_PATH": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Add the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_NEW_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_MPATH_NEXT_HOP"], "desc": "Create %NL80211_ATTR_MAC via %NL80211_ATTR_MPATH_NEXT_HOP."}, "@NL80211_CMD_MICHAEL_MIC_FAILURE": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_KEY_TYPE", "%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_KEY_SEQ"], "desc": "notification MIC (part of TKIP) failure; sent on the \"mlme\" multicast group; the event includes %NL80211_ATTR_MAC to describe the source MAC address of the frame with invalid MIC, %NL80211_ATTR_KEY_TYPE to show the key type, %NL80211_ATTR_KEY_IDX to indicate the key identifier, and %NL80211_ATTR_KEY_SEQ to indicate the TSC value of the frame; this event matches with MLME-MICHAELMICFAILURE.indication() primitive"}, "@NL80211_CMD_SET_WIPHY_NETNS": {"attrs": [], "desc": "Set associated with this wiphy must be down and will follow."}, "@NL80211_CMD_DEL_KEY": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "delete or %NL80211_ATTR_MAC."}, "@NL80211_CMD_SET_CQM": {"attrs": [], "desc": "Connection is used to configure connection quality monitoring notification trigger levels."}, "@NL80211_CMD_REMAIN_ON_CHANNEL": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_DURATION", "%NL80211_ATTR_COOKIE"], "desc": "Request channel for the specified amount of time. This can be used to do off-channel operations like transmit a Public Action frame and wait for a response while being associated to an AP on another channel. %NL80211_ATTR_IFINDEX is used to specify which interface (and thus radio) is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the frequency for the operation. %NL80211_ATTR_DURATION is used to specify the duration in milliseconds to remain on the channel. This command is also used as an event to notify when the requested duration starts (it may take a while for the driver to schedule this time due to other concurrent needs for the radio). When called, this operation returns a cookie (%NL80211_ATTR_COOKIE) that will be included with any events pertaining to this request; the cookie is also used to cancel the request."}, "@NL80211_CMD_JOIN_IBSS": {"attrs": ["%NL80211_ATTR_BEACON_INTERVAL"], "desc": "Join FREQ attribute (for the initial frequency if no peer can be found) and optionally a MAC (as BSSID) and FREQ_FIXED attribute if those should be fixed rather than automatically determined. Can only be executed on a network interface that is UP, and fixed BSSID/FREQ may be rejected. Another optional parameter is the beacon interval, given in the %NL80211_ATTR_BEACON_INTERVAL attribute, which if not given defaults to 100 TU (102.4ms)."}, "@NL80211_CMD_REG_BEACON_HINT": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_FREQ_BEFORE", "%NL80211_ATTR_FREQ_AFTER"], "desc": "indicates has been found while world roaming thus enabling active scan or any mode of operation that initiates TX (beacons) on a channel where we would not have been able to do either before. As an example if you are world roaming (regulatory domain set to world or if your driver is using a custom world roaming regulatory domain) and while doing a passive scan on the 5 GHz band you find an AP there (if not on a DFS channel) you will now be able to actively scan for that AP or use AP mode on your card on that same channel. Note that this will never be used for channels 1-11 on the 2 GHz band as they are always enabled world wide. This beacon hint is only sent if your device had either disabled active scanning or beaconing on a channel. We send to userspace the wiphy on which we removed a restriction from (%NL80211_ATTR_WIPHY) and the channel on which this occurred before (%NL80211_ATTR_FREQ_BEFORE) and after (%NL80211_ATTR_FREQ_AFTER) the beacon hint was processed."}, "@NL80211_CMD_CRIT_PROTOCOL_START": {"attrs": [], "desc": "Indicates a critical protocol that needs more reliability in the connection to complete."}, "@NL80211_CMD_UNPROT_DEAUTHENTICATE": {"attrs": [], "desc": "Unprotected notification. This event is used to indicate that an unprotected deauthentication frame was dropped when MFP is in use."}, "@NL80211_CMD_REQ_SET_REG": {"attrs": [], "desc": "ask to the specified ISO/IEC 3166-1 alpha2 country code. The core will store this as a valid request and then query userspace for it."}, "@NL80211_CMD_SCHED_SCAN_RESULTS": {"attrs": [], "desc": "indicates results available."}, "@NL80211_CMD_REGISTER_BEACONS": {"attrs": [], "desc": "Register other BSSes when any interfaces are in AP mode. This helps implement OLBC handling in hostapd. Beacons are reported in %NL80211_CMD_FRAME messages. Note that per PHY only one application may register."}, "@NL80211_CMD_NEW_BEACON": {"attrs": [], "desc": "old"}, "@NL80211_CMD_NOTIFY_CQM": {"attrs": [], "desc": "Connection command is used as an event to indicate the that a trigger level was reached."}, "@NL80211_CMD_TRIGGER_SCAN": {"attrs": ["%NL80211_ATTR_TX_NO_CCK_RATE"], "desc": "trigger %NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the probe requests at CCK rate or not."}, "@NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_COOKIE"], "desc": "This pending remain-on-channel duration if the desired operation has been completed prior to expiration of the originally requested duration. %NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify the radio. The %NL80211_ATTR_COOKIE attribute must be given as well to uniquely identify the request. This command is also used as an event to notify when a requested remain-on-channel duration has expired."}, "@NL80211_CMD_REGISTER_FRAME": {"attrs": [], "desc": "Register (via @NL80211_CMD_FRAME) for processing in userspace. This command requires an interface index, a frame type attribute (optional for backward compatibility reasons, if not given assumes action frames) and a match attribute containing the first few bytes of the frame that should match, e.g. a single byte for only a category match or four bytes for vendor frames including the OUI. The registration cannot be dropped, but is removed automatically when the netlink socket is closed. Multiple registrations can be made."}, "@NL80211_CMD_CHANNEL_SWITCH": {"attrs": ["%NL80211_ATTR_CH_SWITCH_COUNT", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_CH_SWITCH_BLOCK_TX"], "desc": "Perform the new channel information (Channel Switch Announcement - CSA) in the beacon for some time (as defined in the %NL80211_ATTR_CH_SWITCH_COUNT parameter) and then change to the new channel. Userspace provides the new channel information (using %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width). %NL80211_ATTR_CH_SWITCH_BLOCK_TX may be supplied to inform other station that transmission must be blocked until the channel switch is complete."}, "@NL80211_CMD_GET_INTERFACE": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX"], "desc": "Request either a dump request on a %NL80211_ATTR_WIPHY or a specific get on an %NL80211_ATTR_IFINDEX is supported."}, "@NL80211_CMD_RADAR_DETECT": {"attrs": ["%NL80211_ATTR_RADAR_EVENT"], "desc": "Start a radar is detected or the channel availability scan (CAC) has finished or was aborted, or a radar was detected, usermode will be notified with this event. This command is also used to notify userspace about radars while operating on this channel. %NL80211_ATTR_RADAR_EVENT is used to inform about the type of the event."}, "@NL80211_CMD_GET_POWER_SAVE": {"attrs": [], "desc": "Get"}, "@NL80211_CMD_DISCONNECT": {"attrs": ["%NL80211_ATTR_DISCONNECTED_BY_AP", "%NL80211_ATTR_REASON_CODE"], "desc": "drop userspace that a connection was dropped by the AP or due to other reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and %NL80211_ATTR_REASON_CODE attributes are used."}, "@NL80211_CMD_CONNECT": {"attrs": ["%NL80211_ATTR_SSID", "%NL80211_ATTR_IE", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_USE_MFP", "%NL80211_ATTR_MAC", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_CONTROL_PORT", "%NL80211_ATTR_CONTROL_PORT_ETHERTYPE", "%NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT", "%NL80211_ATTR_BG_SCAN_PERIOD"], "desc": "connection requests to connect to a specified network but without separating auth and assoc steps. For this, you need to specify the SSID in a %NL80211_ATTR_SSID attribute, and can optionally specify the association IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_USE_MFP, %NL80211_ATTR_MAC, %NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT, %NL80211_ATTR_CONTROL_PORT_ETHERTYPE and %NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT. Background scan period can optionally be specified in %NL80211_ATTR_BG_SCAN_PERIOD, if not specified default background scan configuration in driver is used and if period value is 0, bg scan will be disabled. This attribute is ignored if driver does not support roam scan. It is also sent as an event, with the BSSID and response IEs when the connection is established or failed to be established. This can be determined by the STATUS_CODE attribute."}, "@NL80211_CMD_SET_BEACON": {"attrs": ["%NL80211_ATTR_BEACON_HEAD", "%NL80211_ATTR_BEACON_TAIL", "%NL80211_ATTR_IE", "%NL80211_ATTR_IE_PROBE_RESP", "%NL80211_ATTR_IE_ASSOC_RESP"], "desc": "change using the %NL80211_ATTR_BEACON_HEAD and %NL80211_ATTR_BEACON_TAIL attributes. For drivers that generate the beacon and probe responses internally, the following attributes must be provided: %NL80211_ATTR_IE, %NL80211_ATTR_IE_PROBE_RESP and %NL80211_ATTR_IE_ASSOC_RESP."}, "@NL80211_CMD_ACTION_TX_STATUS": {"attrs": [], "desc": "Alias backward compatibility."}, "@NL80211_CMD_JOIN_MESH": {"attrs": [], "desc": "Join mesh config parameters may be given."}, "@NL80211_CMD_ROAM": {"attrs": [], "desc": "request sent as an event when the card/driver roamed by itself."}, "@NL80211_CMD_SET_REG": {"attrs": ["%NL80211_ATTR_REG_ALPHA", "%NL80211_ATTR_REG_RULE_FREQ_", "%NL80211_ATTR_FREQ_RANGE_MAX_BW", "%NL80211_ATTR_REG_RULE_POWER_MAX_ANT_GAIN", "%NL80211_ATTR_REG_RULE_POWER_MAX_EIRP"], "desc": "Set after being queried by the kernel. CRDA replies by sending a regulatory domain structure which consists of %NL80211_ATTR_REG_ALPHA set to our current alpha2 if it found a match. It also provides NL80211_ATTR_REG_RULE_FLAGS, and a set of regulatory rules. Each regulatory rule is a nested set of attributes given by %NL80211_ATTR_REG_RULE_FREQ_[START|END] and %NL80211_ATTR_FREQ_RANGE_MAX_BW with an attached power rule given by %NL80211_ATTR_REG_RULE_POWER_MAX_ANT_GAIN and %NL80211_ATTR_REG_RULE_POWER_MAX_EIRP."}, "@NL80211_CMD_GET_COALESCE": {"attrs": [], "desc": "Get"}, "@NL80211_CMD_FRAME_WAIT_CANCEL": {"attrs": [], "desc": "When command may be used with the corresponding cookie to cancel the wait time if it is known that it is no longer necessary."}, "@NL80211_CMD_DEL_BEACON": {"attrs": [], "desc": "old"}, "@NL80211_CMD_LEAVE_IBSS": {"attrs": [], "desc": "Leave determined by the network interface."}, "@NL80211_CMD_SET_MCAST_RATE": {"attrs": [], "desc": "Change for IBSS or MESH vif."}, "@NL80211_CMD_TESTMODE": {"attrs": [], "desc": "testmode to identify the device, and the TESTDATA blob attribute to pass through to the driver."}, "@NL80211_CMD_DEL_MPATH": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Delete %NL80211_ATTR_MAC."}, "@NL80211_CMD_ADD_TX_TS": {"attrs": ["%NL80211_ATTR_TSID", "%NL80211_ATTR_MAC","%NL80211_ATTR_USER_PRIO","%NL80211_ATTR_ADMITTED_TIME"],"desc": "Ask the kernel to add a traffic stream for the given %NL80211_ATTR_TSID and %NL80211_ATTR_MAC with %NL80211_ATTR_USER_PRIO and %NL80211_ATTR_ADMITTED_TIME parameters. Note that the action frame handshake with the AP shall be handled by userspace via the normal management RX/TX framework, this only sets up the TX TS in the driver/device. If the admitted time attribute is not added then the request just checksif a subsequent setup could be successful, the intent is to use this to avoid setting up a session with the AP when local restrictions would make that impossible. However, the subsequent real setup may still fail even if the check was successful."}, "@NL80211_CMD_DEL_TX_TS": {"attrs": ["%NL80211_ATTR_MAC","%NL80211_ATTR_TSID"], "desc": "Remove an existing TS with the %NL80211_ATTR_TSID and %NL80211_ATTR_MAC parameters. It isn't necessary to call this before removing a station entry entirely, or before disassociating or similar, cleanup will happen in the driver/device in this case."}, "@NL80211_CMD_GET_MPP": {"attrs": ["%NL80211_ATTR_MAC","%NL80211_ATTR_IFINDEX"], "desc": "Get mesh path attributes for mesh proxy path to destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_JOIN_OCB": {"attrs": [], "desc": "Join the OCB network. The center frequency and bandwidth of a channel must be given."}, "@NL80211_CMD_LEAVE_OCB": {"attrs": [], "desc": "Leave the OCB network -- no special arguments, the network is determined by the network interface."}, "@NL80211_CMD_TDLS_CHANNEL_SWITCH": {"attrs": ["%NL80211_ATTR_MAC","%NL80211_ATTR_MAC","%NL80211_ATTR_WIPHY_FREQ","%NL80211_ATTR_OPER_CLASS"], "desc": "Start channel-switching with a TDLS peer, identified by the %NL80211_ATTR_MAC parameter. A target channel is provided via %NL80211_ATTR_WIPHY_FREQ and other attributes determining channel width/type. The target operating class is given via %NL80211_ATTR_OPER_CLASS. The driver is responsible for continually initiating channel-switching operations and returning to the base channel for communication with the AP."}, "@NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Stop channel-switching with a TDLS peer given by %NL80211_ATTR_MAC. Both peers must be on the base channel when this command completes."}, "@NL80211_CMD_WIPHY_REG_CHANGE": {"attrs": [], "desc": "Similar to %NL80211_CMD_REG_CHANGE, but used as an event to indicate changes for devices with wiphy-specific regdom management."}} +{"@NL80211_CMD_GET_REG": {"attrs": [], "desc": "ask the wireless core to send us its currently set\tregulatory domain."}, "@NL80211_CMD_STOP_SCHED_SCAN": {"attrs": [], "desc": "stop if scheduled scan is not running."}, "@NL80211_CMD_START_SCHED_SCAN": {"attrs": ["%NL80211_ATTR_SCHED_SCAN_INTERVAL", "%NL80211_ATTR_SCAN_SSIDS", "%NL80211_ATTR_SCAN_FREQUENCIES", "%NL80211_ATTR_IE"], "desc": "start intervals, as specified by %NL80211_ATTR_SCHED_SCAN_INTERVAL. Like with normal scans, if SSIDs (%NL80211_ATTR_SCAN_SSIDS) are passed, they are used in the probe requests. For broadcast, a broadcast SSID must be passed (ie. an empty string). If no SSID is passed, no probe requests are sent and a passive scan is performed. %NL80211_ATTR_SCAN_FREQUENCIES, if passed, define which channels should be scanned; if not passed, all channels allowed for the current regulatory domain are used. Extra IEs can also be passed from the userspace by using the %NL80211_ATTR_IE attribute."}, "@NL80211_CMD_NEW_SURVEY_RESULTS": {"attrs": [], "desc": "survey NL80211_CMD_GET_SURVEY and on the \"scan\" multicast group)"}, "@NL80211_CMD_SET_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_IFTYPE"], "desc": "Set %NL80211_ATTR_IFINDEX and %NL80211_ATTR_IFTYPE."}, "@NL80211_CMD_DISASSOCIATE": {"attrs": [], "desc": "disassociation NL80211_CMD_AUTHENTICATE but for Disassociation frames (similar to MLME-DISASSOCIATE.request and MLME-DISASSOCIATE.indication primitives)."}, "@NL80211_CMD_FRAME": {"attrs": ["%NL80211_ATTR_FRAME", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_DURATION", "%NL80211_ATTR_COOKIE", "%NL80211_ATTR_TX_NO_CCK_RATE"], "desc": "Management command is used both as a request to transmit a management frame and as an event indicating reception of a frame that was not processed in kernel code, but is for us (i.e., which may need to be processed in a user space application). %NL80211_ATTR_FRAME is used to specify the frame contents (including header). %NL80211_ATTR_WIPHY_FREQ is used to indicate on which channel the frame is to be transmitted or was received. If this channel is not the current channel (remain-on-channel or the operational channel) the device will switch to the given channel and transmit the frame, optionally waiting for a response for the time specified using %NL80211_ATTR_DURATION. When called, this operation returns a cookie (%NL80211_ATTR_COOKIE) that will be included with the TX status event pertaining to the TX request. %NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the management frames at CCK rate or not in 2GHz band."}, "@NL80211_CMD_NEW_KEY": {"attrs": ["%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_KEY_CIPHER", "%NL80211_ATTR_KEY_SEQ"], "desc": "add %NL80211_ATTR_KEY_IDX, %NL80211_ATTR_MAC, %NL80211_ATTR_KEY_CIPHER, and %NL80211_ATTR_KEY_SEQ attributes."}, "@NL80211_CMD_STOP_AP": {"attrs": [], "desc": "Stop"}, "@NL80211_CMD_DEL_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX"], "desc": "Virtual %NL80211_ATTR_IFINDEX and %NL80211_ATTR_WIPHY. Can also be sent from userspace to request deletion of a virtual interface, then requires attribute %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNEXPECTED_4ADDR_FRAME": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Sent associated station identified by %NL80211_ATTR_MAC sent a 4addr frame and wasn't already in a 4-addr VLAN. The event will be sent similarly to the %NL80211_CMD_UNEXPECTED_FRAME event, to the same listener."}, "@NL80211_CMD_SET_MESH_CONFIG": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set interface identified by %NL80211_ATTR_IFINDEX"}, "@NL80211_CMD_STOP_P2P_DEVICE": {"attrs": ["%NL80211_ATTR_WDEV"], "desc": "Stop its %NL80211_ATTR_WDEV identifier."}, "@NL80211_CMD_START_P2P_DEVICE": {"attrs": ["%NL80211_ATTR_WDEV"], "desc": "Start its %NL80211_ATTR_WDEV identifier. It must have been created with %NL80211_CMD_NEW_INTERFACE previously. After it has been started, the P2P Device can be used for P2P operations, e.g. remain-on-channel and public action frame TX."}, "@NL80211_CMD_SET_COALESCE": {"attrs": [], "desc": "Configure"}, "@NL80211_CMD_DEL_WIPHY": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_WIPHY_NAME"], "desc": "Wiphy %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME."}, "@NL80211_CMD_SET_STATION": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Set %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_LEAVE_MESH": {"attrs": [], "desc": "Leave network is determined by the network interface."}, "@NL80211_CMD_GET_KEY": {"attrs": ["%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_MAC"], "desc": "Get by %NL80211_ATTR_KEY_IDX and/or %NL80211_ATTR_MAC."}, "@NL80211_CMD_GET_SURVEY": {"attrs": [], "desc": "get"}, "@NL80211_CMD_TDLS_MGMT": {"attrs": [], "desc": "Send"}, "@NL80211_CMD_SET_BSS": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_SET_WOWLAN": {"attrs": ["%NL80211_ATTR_WOWLAN_TRIGGERS"], "desc": "set Since wireless is more complex than wired ethernet, it supports various triggers. These triggers can be configured through this command with the %NL80211_ATTR_WOWLAN_TRIGGERS attribute. For more background information, see http://wireless.kernel.org/en/users/Documentation/WoWLAN. The @NL80211_CMD_SET_WOWLAN command can also be used as a notification from the driver reporting the wakeup reason. In this case, the @NL80211_ATTR_WOWLAN_TRIGGERS attribute will contain the reason for the wakeup, if it was caused by wireless. If it is not present in the wakeup notification, the wireless device didn't cause the wakeup but reports that it was woken up."}, "@NL80211_CMD_NEW_STATION": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Add the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_SET_PMKSA": {"attrs": ["%NL80211_ATTR_PMKID"], "desc": "Add (for the BSSID) and %NL80211_ATTR_PMKID."}, "@NL80211_CMD_SET_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": " destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_DEL_STATION": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Remove or, if no MAC address given, all stations, on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNPROT_DISASSOCIATE": {"attrs": [], "desc": "Unprotected notification. This event is used to indicate that an unprotected disassociation frame was dropped when MFP is in use."}, "@NL80211_CMD_CH_SWITCH_NOTIFY": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_FREQ"], "desc": "An independently of the userspace SME, send this event indicating %NL80211_ATTR_IFINDEX is now on %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width."}, "@NL80211_CMD_SET_KEY": {"attrs": ["%NL80211_ATTR_KEY_DEFAULT_MGMT", "%NL80211_ATTR_KEY_THRESHOLD"], "desc": "Set %NL80211_ATTR_KEY_DEFAULT_MGMT, or %NL80211_ATTR_KEY_THRESHOLD."}, "@NL80211_CMD_SET_MAC_ACL": {"attrs": ["%NL80211_ATTR_MAC_ADDRS", "%NL80211_ATTR_ACL_POLICY"], "desc": "sets This is to be used with the drivers advertising the support of MAC address based access control. List of MAC addresses is passed in %NL80211_ATTR_MAC_ADDRS and ACL policy is passed in %NL80211_ATTR_ACL_POLICY. Driver will enable ACL with this list, if it is not already done. The new list will replace any existing list. Driver will clear its ACL when the list of MAC addresses passed is empty. This command is used in AP/P2P GO mode. Driver has to make sure to clear its ACL list during %NL80211_CMD_STOP_AP."}, "@NL80211_CMD_GET_WOWLAN": {"attrs": [], "desc": "get"}, "@NL80211_CMD_GET_STATION": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Get %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_UNSPEC": {"attrs": [], "desc": "unspecified"}, "@NL80211_CMD_NEW_PEER_CANDIDATE": {"attrs": [], "desc": "Notification beacon or probe response from a compatible mesh peer. This is only sent while no station information (sta_info) exists for the new peer candidate and when @NL80211_MESH_SETUP_USERSPACE_AUTH, @NL80211_MESH_SETUP_USERSPACE_AMPE, or @NL80211_MESH_SETUP_USERSPACE_MPM is set. On reception of this notification, userspace may decide to create a new station (@NL80211_CMD_NEW_STATION). To stop this notification from reoccurring, the userspace authentication daemon may want to create the new station with the AUTHENTICATED flag unset and maybe change it later depending on the authentication result."}, "@NL80211_CMD_REGISTER_ACTION": {"attrs": [], "desc": "Alias backward compatibility"}, "@NL80211_CMD_REG_CHANGE": {"attrs": ["%NL80211_ATTR_REG_INITIATOR", "%NL80211_ATTR_REG_ALPHA2", "%NL80211_ATTR_REG_TYPE", "%NL80211_ATTR_REG_ALPHA2"], "desc": "indicates has been changed and provides details of the request information that caused the change such as who initiated the regulatory request (%NL80211_ATTR_REG_INITIATOR), the wiphy_idx (%NL80211_ATTR_REG_ALPHA2) on which the request was made from if the initiator was %NL80211_REGDOM_SET_BY_COUNTRY_IE or %NL80211_REGDOM_SET_BY_DRIVER, the type of regulatory domain set (%NL80211_ATTR_REG_TYPE), if the type of regulatory domain is %NL80211_REG_TYPE_COUNTRY the alpha2 to which we have moved on to (%NL80211_ATTR_REG_ALPHA2)."}, "@NL80211_CMD_CONN_FAILED": {"attrs": ["%NL80211_ATTR_CONN_FAILED_REASON"], "desc": "connection notify userspace that AP has rejected the connection request from a station, due to particular reason. %NL80211_ATTR_CONN_FAILED_REASON is used for this."}, "@NL80211_CMD_SCAN_ABORTED": {"attrs": [], "desc": "scan partial scan results may be available"}, "@NL80211_CMD_SET_POWER_SAVE": {"attrs": [], "desc": "Set"}, "@NL80211_CMD_SET_MGMT_EXTRA_IE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MGMT_SUBTYPE", "%NL80211_ATTR_IE"], "desc": "Set interface is identified with %NL80211_ATTR_IFINDEX and the management frame subtype with %NL80211_ATTR_MGMT_SUBTYPE. The extra IE data to be added to the end of the specified management frame is specified with %NL80211_ATTR_IE. If the command succeeds, the requested data will be added to all specified management frames generated by kernel/firmware/driver. Note: This command has been removed and it is only reserved at this point to avoid re-using existing command number. The functionality this command was planned for has been provided with cleaner design with the option to specify additional IEs in NL80211_CMD_TRIGGER_SCAN, NL80211_CMD_AUTHENTICATE, NL80211_CMD_ASSOCIATE, NL80211_CMD_DEAUTHENTICATE, and NL80211_CMD_DISASSOCIATE."}, "@NL80211_CMD_SET_REKEY_OFFLOAD": {"attrs": ["%NL80211_ATTR_REKEY_DATA"], "desc": "This the necessary information for supporting GTK rekey offload. This feature is typically used during WoWLAN. The configuration data is contained in %NL80211_ATTR_REKEY_DATA (which is nested and contains the data in sub-attributes). After rekeying happened, this command may also be sent by the driver as an MLME event to inform userspace of the new replay counter."}, "@NL80211_CMD_SET_CHANNEL": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set and the attributes determining channel width) the given interface (identifed by %NL80211_ATTR_IFINDEX) shall operate on. In case multiple channels are supported by the device, the mechanism with which it switches channels is implementation-defined. When a monitor interface is given, it can only switch channel while no other interfaces are operating to avoid disturbing the operation of any other interfaces, and other interfaces will again take precedence when they are used."}, "@NL80211_CMD_START_AP": {"attrs": ["%NL80211_ATTR_BEACON_INTERVAL", "%NL80211_ATTR_DTIM_PERIOD", "%NL80211_ATTR_SSID", "%NL80211_ATTR_HIDDEN_SSID", "%NL80211_ATTR_CIPHERS_PAIRWISE", "%NL80211_ATTR_CIPHER_GROUP", "%NL80211_ATTR_WPA_VERSIONS", "%NL80211_ATTR_AKM_SUITES", "%NL80211_ATTR_PRIVACY", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_INACTIVITY_TIMEOUT", "%NL80211_ATTR_ACL_POLICY", "%NL80211_ATTR_MAC_ADDRS", "%NL80211_ATTR_WIPHY_FREQ"], "desc": "Start are like for %NL80211_CMD_SET_BEACON, and additionally parameters that do not change are used, these include %NL80211_ATTR_BEACON_INTERVAL, %NL80211_ATTR_DTIM_PERIOD, %NL80211_ATTR_SSID, %NL80211_ATTR_HIDDEN_SSID, %NL80211_ATTR_CIPHERS_PAIRWISE, %NL80211_ATTR_CIPHER_GROUP, %NL80211_ATTR_WPA_VERSIONS, %NL80211_ATTR_AKM_SUITES, %NL80211_ATTR_PRIVACY, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_INACTIVITY_TIMEOUT, %NL80211_ATTR_ACL_POLICY and %NL80211_ATTR_MAC_ADDRS. The channel to use can be set on the interface or be given using the %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width."}, "@NL80211_CMD_DEL_PMKSA": {"attrs": ["%NL80211_ATTR_PMKID"], "desc": "Delete (for the BSSID) and %NL80211_ATTR_PMKID."}, "@NL80211_CMD_UNEXPECTED_FRAME": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Used (or GO) interface (i.e. hostapd) to ask for unexpected frames to implement sending deauth to stations that send unexpected class 3 frames. Also used as the event sent by the kernel when such a frame is received. For the event, the %NL80211_ATTR_MAC attribute carries the TA and other attributes like the interface index are present. If used as the command it must have an interface index and you can only unsubscribe from the event by closing the socket. Subscription is also for %NL80211_CMD_UNEXPECTED_4ADDR_FRAME events."}, "@NL80211_CMD_GET_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_IFINDEX"], "desc": "Get destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_GET_BEACON": {"attrs": [], "desc": ""}, "@NL80211_CMD_PMKSA_CANDIDATE": {"attrs": [], "desc": "This of PMKSA caching dandidates."}, "@NL80211_CMD_PROBE_CLIENT": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_COOKIE", "%NL80211_ATTR_ACK"], "desc": "Probe by sending a null data frame to it and reporting when the frame is acknowleged. This is used to allow timing out inactive clients. Uses %NL80211_ATTR_IFINDEX and %NL80211_ATTR_MAC. The command returns a direct reply with an %NL80211_ATTR_COOKIE that is later used to match up the event with the request. The event includes the same data and has %NL80211_ATTR_ACK set if the frame was ACKed."}, "@NL80211_CMD_NEW_INTERFACE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFTYPE", "%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFTYPE", "%NL80211_ATTR_IFNAME"], "desc": "Newly to %NL80211_CMD_GET_INTERFACE. Has %NL80211_ATTR_IFINDEX, %NL80211_ATTR_WIPHY and %NL80211_ATTR_IFTYPE attributes. Can also be sent from userspace to request creation of a new virtual interface, then requires attributes %NL80211_ATTR_WIPHY, %NL80211_ATTR_IFTYPE and %NL80211_ATTR_IFNAME."}, "@NL80211_CMD_SET_TX_BITRATE_MASK": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Set rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface and @NL80211_ATTR_TX_RATES the set of allowed rates."}, "@NL80211_CMD_NEW_SCAN_RESULTS": {"attrs": [], "desc": "scan NL80211_CMD_GET_SCAN and on the \"scan\" multicast group)"}, "@NL80211_CMD_GET_WIPHY": {"attrs": [], "desc": "request to get a list of all present wiphys."}, "@NL80211_CMD_SET_NOACK_MAP": {"attrs": [], "desc": "sets No Acknowledgement Policy should be applied."}, "@NL80211_CMD_ACTION": {"attrs": [], "desc": "Alias"}, "@NL80211_CMD_FLUSH_PMKSA": {"attrs": [], "desc": "Flush"}, "@NL80211_CMD_ASSOCIATE": {"attrs": [], "desc": "association NL80211_CMD_AUTHENTICATE but for Association and Reassociation (similar to MLME-ASSOCIATE.request, MLME-REASSOCIATE.request, MLME-ASSOCIATE.confirm or MLME-REASSOCIATE.confirm primitives)."}, "@NL80211_CMD_GET_PROTOCOL_FEATURES": {"attrs": ["%NL80211_ATTR_PROTOCOL_FEATURES"], "desc": "Get i.e. features for the nl80211 protocol rather than device features. Returns the features in the %NL80211_ATTR_PROTOCOL_FEATURES bitmap."}, "@NL80211_CMD_DEAUTHENTICATE": {"attrs": [], "desc": "deauthentication NL80211_CMD_AUTHENTICATE but for Deauthentication frames (similar to MLME-DEAUTHENTICATION.request and MLME-DEAUTHENTICATE.indication primitives)."}, "@NL80211_CMD_CRIT_PROTOCOL_STOP": {"attrs": [], "desc": "Indicates return back to normal."}, "@NL80211_CMD_FT_EVENT": {"attrs": [], "desc": "Send to the supplicant. This will carry the target AP's MAC address along with the relevant Information Elements. This event is used to report received FT IEs (MDIE, FTIE, RSN IE, TIE, RICIE)."}, "@NL80211_CMD_NEW_WIPHY": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_WIPHY_NAME"], "desc": "Newly or rename notification. Has attributes %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME."}, "@NL80211_CMD_UPDATE_FT_IES": {"attrs": [], "desc": "Pass Information Element to the WLAN driver"}, "@NL80211_CMD_SET_WDS_PEER": {"attrs": [], "desc": "Set"}, "@NL80211_CMD_SCHED_SCAN_STOPPED": {"attrs": [], "desc": "indicates stopped. The driver may issue this event at any time during a scheduled scan. One reason for stopping the scan is if the hardware does not support starting an association or a normal scan while running a scheduled scan. This event is also sent when the %NL80211_CMD_STOP_SCHED_SCAN command is received or when the interface is brought down while a scheduled scan was running."}, "@NL80211_CMD_FRAME_TX_STATUS": {"attrs": ["%NL80211_ATTR_COOKIE", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_ACK"], "desc": "Report transmitted with %NL80211_CMD_FRAME. %NL80211_ATTR_COOKIE identifies the TX command and %NL80211_ATTR_FRAME includes the contents of the frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged the frame."}, "@NL80211_CMD_TDLS_OPER": {"attrs": ["%NL80211_ATTR_TDLS_OPERATION", "%NL80211_ATTR_MAC", "%NL80211_ATTR_REASON_CODE"], "desc": "Perform In addition, this can be used as an event to request userspace to take actions on TDLS links (set up a new link or tear down an existing one). In such events, %NL80211_ATTR_TDLS_OPERATION indicates the requested operation, %NL80211_ATTR_MAC contains the peer MAC address, and %NL80211_ATTR_REASON_CODE the reason code to be used (only with %NL80211_TDLS_TEARDOWN)."}, "@NL80211_CMD_GET_SCAN": {"attrs": [], "desc": "get"}, "@NL80211_CMD_SET_WIPHY": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_NAME", "%NL80211_ATTR_WIPHY_TXQ_PARAMS", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_WIPHY_RETRY_SHORT", "%NL80211_ATTR_WIPHY_RETRY_LONG", "%NL80211_ATTR_WIPHY_FRAG_THRESHOLD", "%NL80211_ATTR_WIPHY_RTS_THRESHOLD"], "desc": "set %NL80211_ATTR_IFINDEX; can be used to set %NL80211_ATTR_WIPHY_NAME, %NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ (and the attributes determining the channel width; this is used for setting monitor mode channel), %NL80211_ATTR_WIPHY_RETRY_SHORT, %NL80211_ATTR_WIPHY_RETRY_LONG, %NL80211_ATTR_WIPHY_FRAG_THRESHOLD, and/or %NL80211_ATTR_WIPHY_RTS_THRESHOLD. However, for setting the channel, see %NL80211_CMD_SET_CHANNEL instead, the support here is for backward compatibility only."}, "@NL80211_CMD_AUTHENTICATE": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_MAC", "%NL80211_ATTR_SSID", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_IE", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_FRAME", "%NL80211_ATTR_TIMED_OUT", "%NL80211_ATTR_MAC"], "desc": "authentication This command is used both as a command (request to authenticate) and as an event on the \"mlme\" multicast group indicating completion of the authentication process. When used as a command, %NL80211_ATTR_IFINDEX is used to identify the interface. %NL80211_ATTR_MAC is used to specify PeerSTAAddress (and BSSID in case of station mode). %NL80211_ATTR_SSID is used to specify the SSID (mainly for association, but is included in authentication request, too, to help BSS selection. %NL80211_ATTR_WIPHY_FREQ is used to specify the frequence of the channel in MHz. %NL80211_ATTR_AUTH_TYPE is used to specify the authentication type. %NL80211_ATTR_IE is used to define IEs (VendorSpecificInfo, but also including RSN IE and FT IEs) to be added to the frame. When used as an event, this reports reception of an Authentication frame in station and IBSS modes when the local MLME processed the frame, i.e., it was for the local STA and was received in correct state. This is similar to MLME-AUTHENTICATE.confirm primitive in the MLME SAP interface (kernel providing MLME, userspace SME). The included %NL80211_ATTR_FRAME attribute contains the management frame (including both the header and frame body, but not FCS). This event is also used to indicate if the authentication attempt timed out. In that case the %NL80211_ATTR_FRAME attribute is replaced with a %NL80211_ATTR_TIMED_OUT flag (and %NL80211_ATTR_MAC to indicate which pending authentication timed out)."}, "@NL80211_CMD_DEL_PATH": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Remove or, if no MAC address given, all mesh paths, on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_GET_MESH_CONFIG": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Get interface identified by %NL80211_ATTR_IFINDEX"}, "@NL80211_CMD_NEW_PATH": {"attrs": ["%NL80211_ATTR_IFINDEX"], "desc": "Add the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_NEW_MPATH": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_MPATH_NEXT_HOP"], "desc": "Create %NL80211_ATTR_MAC via %NL80211_ATTR_MPATH_NEXT_HOP."}, "@NL80211_CMD_MICHAEL_MIC_FAILURE": {"attrs": ["%NL80211_ATTR_MAC", "%NL80211_ATTR_KEY_TYPE", "%NL80211_ATTR_KEY_IDX", "%NL80211_ATTR_KEY_SEQ"], "desc": "notification MIC (part of TKIP) failure; sent on the \"mlme\" multicast group; the event includes %NL80211_ATTR_MAC to describe the source MAC address of the frame with invalid MIC, %NL80211_ATTR_KEY_TYPE to show the key type, %NL80211_ATTR_KEY_IDX to indicate the key identifier, and %NL80211_ATTR_KEY_SEQ to indicate the TSC value of the frame; this event matches with MLME-MICHAELMICFAILURE.indication() primitive"}, "@NL80211_CMD_SET_WIPHY_NETNS": {"attrs": [], "desc": "Set associated with this wiphy must be down and will follow."}, "@NL80211_CMD_DEL_KEY": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "delete or %NL80211_ATTR_MAC."}, "@NL80211_CMD_SET_CQM": {"attrs": [], "desc": "Connection is used to configure connection quality monitoring notification trigger levels."}, "@NL80211_CMD_REMAIN_ON_CHANNEL": {"attrs": ["%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_DURATION", "%NL80211_ATTR_COOKIE"], "desc": "Request channel for the specified amount of time. This can be used to do off-channel operations like transmit a Public Action frame and wait for a response while being associated to an AP on another channel. %NL80211_ATTR_IFINDEX is used to specify which interface (and thus radio) is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the frequency for the operation. %NL80211_ATTR_DURATION is used to specify the duration in milliseconds to remain on the channel. This command is also used as an event to notify when the requested duration starts (it may take a while for the driver to schedule this time due to other concurrent needs for the radio). When called, this operation returns a cookie (%NL80211_ATTR_COOKIE) that will be included with any events pertaining to this request; the cookie is also used to cancel the request."}, "@NL80211_CMD_JOIN_IBSS": {"attrs": ["%NL80211_ATTR_BEACON_INTERVAL"], "desc": "Join FREQ attribute (for the initial frequency if no peer can be found) and optionally a MAC (as BSSID) and FREQ_FIXED attribute if those should be fixed rather than automatically determined. Can only be executed on a network interface that is UP, and fixed BSSID/FREQ may be rejected. Another optional parameter is the beacon interval, given in the %NL80211_ATTR_BEACON_INTERVAL attribute, which if not given defaults to 100 TU (102.4ms)."}, "@NL80211_CMD_REG_BEACON_HINT": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_FREQ_BEFORE", "%NL80211_ATTR_FREQ_AFTER"], "desc": "indicates has been found while world roaming thus enabling active scan or any mode of operation that initiates TX (beacons) on a channel where we would not have been able to do either before. As an example if you are world roaming (regulatory domain set to world or if your driver is using a custom world roaming regulatory domain) and while doing a passive scan on the 5 GHz band you find an AP there (if not on a DFS channel) you will now be able to actively scan for that AP or use AP mode on your card on that same channel. Note that this will never be used for channels 1-11 on the 2 GHz band as they are always enabled world wide. This beacon hint is only sent if your device had either disabled active scanning or beaconing on a channel. We send to userspace the wiphy on which we removed a restriction from (%NL80211_ATTR_WIPHY) and the channel on which this occurred before (%NL80211_ATTR_FREQ_BEFORE) and after (%NL80211_ATTR_FREQ_AFTER) the beacon hint was processed."}, "@NL80211_CMD_CRIT_PROTOCOL_START": {"attrs": [], "desc": "Indicates a critical protocol that needs more reliability in the connection to complete."}, "@NL80211_CMD_UNPROT_DEAUTHENTICATE": {"attrs": [], "desc": "Unprotected notification. This event is used to indicate that an unprotected deauthentication frame was dropped when MFP is in use."}, "@NL80211_CMD_REQ_SET_REG": {"attrs": [], "desc": "ask to the specified ISO/IEC 3166-1 alpha2 country code. The core will store this as a valid request and then query userspace for it."}, "@NL80211_CMD_SCHED_SCAN_RESULTS": {"attrs": [], "desc": "indicates results available."}, "@NL80211_CMD_REGISTER_BEACONS": {"attrs": [], "desc": "Register other BSSes when any interfaces are in AP mode. This helps implement OLBC handling in hostapd. Beacons are reported in %NL80211_CMD_FRAME messages. Note that per PHY only one application may register."}, "@NL80211_CMD_NEW_BEACON": {"attrs": [], "desc": "old"}, "@NL80211_CMD_NOTIFY_CQM": {"attrs": [], "desc": "Connection command is used as an event to indicate the that a trigger level was reached."}, "@NL80211_CMD_TRIGGER_SCAN": {"attrs": ["%NL80211_ATTR_TX_NO_CCK_RATE"], "desc": "trigger %NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the probe requests at CCK rate or not."}, "@NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX", "%NL80211_ATTR_COOKIE"], "desc": "This pending remain-on-channel duration if the desired operation has been completed prior to expiration of the originally requested duration. %NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify the radio. The %NL80211_ATTR_COOKIE attribute must be given as well to uniquely identify the request. This command is also used as an event to notify when a requested remain-on-channel duration has expired."}, "@NL80211_CMD_REGISTER_FRAME": {"attrs": [], "desc": "Register (via @NL80211_CMD_FRAME) for processing in userspace. This command requires an interface index, a frame type attribute (optional for backward compatibility reasons, if not given assumes action frames) and a match attribute containing the first few bytes of the frame that should match, e.g. a single byte for only a category match or four bytes for vendor frames including the OUI. The registration cannot be dropped, but is removed automatically when the netlink socket is closed. Multiple registrations can be made."}, "@NL80211_CMD_CHANNEL_SWITCH": {"attrs": ["%NL80211_ATTR_CH_SWITCH_COUNT", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_CH_SWITCH_BLOCK_TX"], "desc": "Perform the new channel information (Channel Switch Announcement - CSA) in the beacon for some time (as defined in the %NL80211_ATTR_CH_SWITCH_COUNT parameter) and then change to the new channel. Userspace provides the new channel information (using %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width). %NL80211_ATTR_CH_SWITCH_BLOCK_TX may be supplied to inform other station that transmission must be blocked until the channel switch is complete."}, "@NL80211_CMD_GET_INTERFACE": {"attrs": ["%NL80211_ATTR_WIPHY", "%NL80211_ATTR_IFINDEX"], "desc": "Request either a dump request on a %NL80211_ATTR_WIPHY or a specific get on an %NL80211_ATTR_IFINDEX is supported."}, "@NL80211_CMD_RADAR_DETECT": {"attrs": ["%NL80211_ATTR_RADAR_EVENT"], "desc": "Start a radar is detected or the channel availability scan (CAC) has finished or was aborted, or a radar was detected, usermode will be notified with this event. This command is also used to notify userspace about radars while operating on this channel. %NL80211_ATTR_RADAR_EVENT is used to inform about the type of the event."}, "@NL80211_CMD_GET_POWER_SAVE": {"attrs": [], "desc": "Get"}, "@NL80211_CMD_DISCONNECT": {"attrs": ["%NL80211_ATTR_DISCONNECTED_BY_AP", "%NL80211_ATTR_REASON_CODE"], "desc": "drop userspace that a connection was dropped by the AP or due to other reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and %NL80211_ATTR_REASON_CODE attributes are used."}, "@NL80211_CMD_CONNECT": {"attrs": ["%NL80211_ATTR_SSID", "%NL80211_ATTR_IE", "%NL80211_ATTR_AUTH_TYPE", "%NL80211_ATTR_USE_MFP", "%NL80211_ATTR_MAC", "%NL80211_ATTR_WIPHY_FREQ", "%NL80211_ATTR_CONTROL_PORT", "%NL80211_ATTR_CONTROL_PORT_ETHERTYPE", "%NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT", "%NL80211_ATTR_BG_SCAN_PERIOD"], "desc": "connection requests to connect to a specified network but without separating auth and assoc steps. For this, you need to specify the SSID in a %NL80211_ATTR_SSID attribute, and can optionally specify the association IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_USE_MFP, %NL80211_ATTR_MAC, %NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT, %NL80211_ATTR_CONTROL_PORT_ETHERTYPE and %NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT. Background scan period can optionally be specified in %NL80211_ATTR_BG_SCAN_PERIOD, if not specified default background scan configuration in driver is used and if period value is 0, bg scan will be disabled. This attribute is ignored if driver does not support roam scan. It is also sent as an event, with the BSSID and response IEs when the connection is established or failed to be established. This can be determined by the STATUS_CODE attribute."}, "@NL80211_CMD_SET_BEACON": {"attrs": ["%NL80211_ATTR_BEACON_HEAD", "%NL80211_ATTR_BEACON_TAIL", "%NL80211_ATTR_IE", "%NL80211_ATTR_IE_PROBE_RESP", "%NL80211_ATTR_IE_ASSOC_RESP"], "desc": "change using the %NL80211_ATTR_BEACON_HEAD and %NL80211_ATTR_BEACON_TAIL attributes. For drivers that generate the beacon and probe responses internally, the following attributes must be provided: %NL80211_ATTR_IE, %NL80211_ATTR_IE_PROBE_RESP and %NL80211_ATTR_IE_ASSOC_RESP."}, "@NL80211_CMD_ACTION_TX_STATUS": {"attrs": [], "desc": "Alias backward compatibility."}, "@NL80211_CMD_JOIN_MESH": {"attrs": [], "desc": "Join mesh config parameters may be given."}, "@NL80211_CMD_ROAM": {"attrs": [], "desc": "request sent as an event when the card/driver roamed by itself."}, "@NL80211_CMD_SET_REG": {"attrs": ["%NL80211_ATTR_REG_ALPHA", "%NL80211_ATTR_REG_RULE_FREQ_", "%NL80211_ATTR_FREQ_RANGE_MAX_BW", "%NL80211_ATTR_REG_RULE_POWER_MAX_ANT_GAIN", "%NL80211_ATTR_REG_RULE_POWER_MAX_EIRP"], "desc": "Set after being queried by the kernel. CRDA replies by sending a regulatory domain structure which consists of %NL80211_ATTR_REG_ALPHA set to our current alpha2 if it found a match. It also provides NL80211_ATTR_REG_RULE_FLAGS, and a set of regulatory rules. Each regulatory rule is a nested set of attributes given by %NL80211_ATTR_REG_RULE_FREQ_[START|END] and %NL80211_ATTR_FREQ_RANGE_MAX_BW with an attached power rule given by %NL80211_ATTR_REG_RULE_POWER_MAX_ANT_GAIN and %NL80211_ATTR_REG_RULE_POWER_MAX_EIRP."}, "@NL80211_CMD_GET_COALESCE": {"attrs": [], "desc": "Get"}, "@NL80211_CMD_FRAME_WAIT_CANCEL": {"attrs": [], "desc": "When command may be used with the corresponding cookie to cancel the wait time if it is known that it is no longer necessary."}, "@NL80211_CMD_DEL_BEACON": {"attrs": [], "desc": "old"}, "@NL80211_CMD_LEAVE_IBSS": {"attrs": [], "desc": "Leave determined by the network interface."}, "@NL80211_CMD_SET_MCAST_RATE": {"attrs": [], "desc": "Change for IBSS or MESH vif."}, "@NL80211_CMD_TESTMODE": {"attrs": [], "desc": "testmode to identify the device, and the TESTDATA blob attribute to pass through to the driver."}, "@NL80211_CMD_DEL_MPATH": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Delete %NL80211_ATTR_MAC."}, "@NL80211_CMD_ADD_TX_TS": {"attrs": ["%NL80211_ATTR_TSID", "%NL80211_ATTR_MAC","%NL80211_ATTR_USER_PRIO","%NL80211_ATTR_ADMITTED_TIME"],"desc": "Ask the kernel to add a traffic stream for the given %NL80211_ATTR_TSID and %NL80211_ATTR_MAC with %NL80211_ATTR_USER_PRIO and %NL80211_ATTR_ADMITTED_TIME parameters. Note that the action frame handshake with the AP shall be handled by userspace via the normal management RX/TX framework, this only sets up the TX TS in the driver/device. If the admitted time attribute is not added then the request just checksif a subsequent setup could be successful, the intent is to use this to avoid setting up a session with the AP when local restrictions would make that impossible. However, the subsequent real setup may still fail even if the check was successful."}, "@NL80211_CMD_DEL_TX_TS": {"attrs": ["%NL80211_ATTR_MAC","%NL80211_ATTR_TSID"], "desc": "Remove an existing TS with the %NL80211_ATTR_TSID and %NL80211_ATTR_MAC parameters. It isn't necessary to call this before removing a station entry entirely, or before disassociating or similar, cleanup will happen in the driver/device in this case."}, "@NL80211_CMD_GET_MPP": {"attrs": ["%NL80211_ATTR_MAC","%NL80211_ATTR_IFINDEX"], "desc": "Get mesh path attributes for mesh proxy path to destination %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX."}, "@NL80211_CMD_JOIN_OCB": {"attrs": [], "desc": "Join the OCB network. The center frequency and bandwidth of a channel must be given."}, "@NL80211_CMD_LEAVE_OCB": {"attrs": [], "desc": "Leave the OCB network -- no special arguments, the network is determined by the network interface."}, "@NL80211_CMD_TDLS_CHANNEL_SWITCH": {"attrs": ["%NL80211_ATTR_MAC","%NL80211_ATTR_MAC","%NL80211_ATTR_WIPHY_FREQ","%NL80211_ATTR_OPER_CLASS"], "desc": "Start channel-switching with a TDLS peer, identified by the %NL80211_ATTR_MAC parameter. A target channel is provided via %NL80211_ATTR_WIPHY_FREQ and other attributes determining channel width/type. The target operating class is given via %NL80211_ATTR_OPER_CLASS. The driver is responsible for continually initiating channel-switching operations and returning to the base channel for communication with the AP."}, "@NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH": {"attrs": ["%NL80211_ATTR_MAC"], "desc": "Stop channel-switching with a TDLS peer given by %NL80211_ATTR_MAC. Both peers must be on the base channel when this command completes."}, "@NL80211_CMD_WIPHY_REG_CHANGE": {"attrs": [], "desc": "Similar to %NL80211_CMD_REG_CHANGE, but used as an event to indicate changes for devices with wiphy-specific regdom management."},"@NL80211_CMD_VENDOR":{"attrs":["%NL80211_ATTR_VENDOR_ID","%NL80211_ATTR_VENDOR_SUBCMD","%NL80211_ATTR_VENDOR_DATA"], "desc":"Vendor-specified command/event. The command is specified by the %NL80211_ATTR_VENDOR_ID attribute and a sub-command in %NL80211_ATTR_VENDOR_SUBCMD. Parameter(s) can be transported in %NL80211_ATTR_VENDOR_DATA. For feature advertisement, the %NL80211_ATTR_VENDOR_DATA attribute is used in the wiphy data as a nested attribute containing descriptions (&struct nl80211_vendor_cmd_info) of the supported vendor commands. This may also be sent as an event with the same attributes."}, "@NL80211_CMD_SET_QOS_MAP": {"attrs":["%NL80211_ATTR_QOS_MAP"], "desc":"Set Interworking QoS mapping for IP DSCP values. The QoS mapping information is included in %NL80211_ATTR_QOS_MAP. If that attribute is not included, QoS mapping is disabled. Since this QoS mapping is relevant for IP packets, it is only valid during an association. This is cleared on disassociation and AP restart."}} {"0": "@NL80211_CMD_UNSPEC", "1": "@NL80211_CMD_GET_WIPHY", "2": "@NL80211_CMD_SET_WIPHY", "3": "@NL80211_CMD_NEW_WIPHY", "4": "@NL80211_CMD_DEL_WIPHY", "5": "@NL80211_CMD_GET_INTERFACE", "6": "@NL80211_CMD_SET_INTERFACE", "7": "@NL80211_CMD_NEW_INTERFACE", "8": "@NL80211_CMD_DEL_INTERFACE", "9": "@NL80211_CMD_GET_KEY", "10": "@NL80211_CMD_SET_KEY", "11": "@NL80211_CMD_NEW_KEY", "12": "@NL80211_CMD_DEL_KEY", "13": "@NL80211_CMD_GET_BEACON", "14": "@NL80211_CMD_SET_BEACON", "15": ["@NL80211_CMD_START_AP", "@NL80211_CMD_NEW_BEACON"], "16": ["@NL80211_CMD_STOP_AP", "@NL80211_CMD_DEL_BEACON"], "17": "@NL80211_CMD_GET_STATION", "18": "@NL80211_CMD_SET_STATION", "19": "@NL80211_CMD_NEW_STATION", "20": "@NL80211_CMD_DEL_STATION", "21": "@NL80211_CMD_GET_MPATH", "22": "@NL80211_CMD_SET_MPATH", "23": "@NL80211_CMD_NEW_MPATH", "24": "@NL80211_CMD_DEL_MPATH", "25": "@NL80211_CMD_SET_BSS", "26": "@NL80211_CMD_SET_REG", "27": "@NL80211_CMD_REQ_SET_REG", "28": "@NL80211_CMD_GET_MESH_CONFIG", "29": "@NL80211_CMD_SET_MESH_CONFIG", "30": "@NL80211_CMD_SET_MGMT_EXTRA_IE", "31": "@NL80211_CMD_GET_REG", "32": "@NL80211_CMD_GET_SCAN", "33": "@NL80211_CMD_TRIGGER_SCAN", "34": "@NL80211_CMD_NEW_SCAN_RESULTS", "35": "@NL80211_CMD_SCAN_ABORTED", "36": "@NL80211_CMD_REG_CHANGE", "37": "@NL80211_CMD_AUTHENTICATE", "38": "@NL80211_CMD_ASSOCIATE", "39": "@NL80211_CMD_DEAUTHENTICATE", "40": "@NL80211_CMD_DISASSOCIATE", "41": "@NL80211_CMD_MICHAEL_MIC_FAILURE", "42": "@NL80211_CMD_REG_BEACON_HINT", "43": "@NL80211_CMD_JOIN_IBSS", "44": "@NL80211_CMD_LEAVE_IBSS", "45": "@NL80211_CMD_TESTMODE", "46": "@NL80211_CMD_CONNECT", "47": "@NL80211_CMD_ROAM", "48": "@NL80211_CMD_DISCONNECT", "49": "@NL80211_CMD_SET_WIPHY_NETNS", "50": "@NL80211_CMD_GET_SURVEY", "51": "@NL80211_CMD_NEW_SURVEY_RESULTS", "52": "@NL80211_CMD_SET_PMKSA", "53": "@NL80211_CMD_DEL_PMKSA", "54": "@NL80211_CMD_FLUSH_PMKSA", "55": "@NL80211_CMD_REMAIN_ON_CHANNEL", "56": "@NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL", "57": "@NL80211_CMD_SET_TX_BITRATE_MASK", "58": ["@NL80211_CMD_REGISTER_ACTION", "@NL80211_CMD_REGISTER_FRAME"], "59": ["@NL80211_CMD_FRAME", "@NL80211_CMD_ACTION"], "60": ["@NL80211_CMD_FRAME_TX_STATUS", "@NL80211_CMD_ACTION_TX_STATUS"], "61": "@NL80211_CMD_SET_POWER_SAVE", "62": "@NL80211_CMD_GET_POWER_SAVE", "63": "@NL80211_CMD_SET_CQM", "64": "@NL80211_CMD_NOTIFY_CQM", "65": "@NL80211_CMD_SET_CHANNEL", "66": "@NL80211_CMD_SET_WDS_PEER", "67": "@NL80211_CMD_FRAME_WAIT_CANCEL", "68": "@NL80211_CMD_JOIN_MESH", "69": "@NL80211_CMD_LEAVE_MESH", "70": "@NL80211_CMD_UNPROT_DEAUTHENTICATE", "71": "@NL80211_CMD_UNPROT_DISASSOCIATE", "72": "@NL80211_CMD_NEW_PEER_CANDIDATE", "73": "@NL80211_CMD_GET_WOWLAN", "74": "@NL80211_CMD_SET_WOWLAN", "75": "@NL80211_CMD_START_SCHED_SCAN", "76": "@NL80211_CMD_STOP_SCHED_SCAN", "77": "@NL80211_CMD_SCHED_SCAN_RESULTS", "78": "@NL80211_CMD_SCHED_SCAN_STOPPED", "79": "@NL80211_CMD_SET_REKEY_OFFLOAD", "80": "@NL80211_CMD_PMKSA_CANDIDATE", "81": "@NL80211_CMD_TDLS_OPER", "82": "@NL80211_CMD_TDLS_MGMT", "83": "@NL80211_CMD_UNEXPECTED_FRAME", "84": "@NL80211_CMD_PROBE_CLIENT", "85": "@NL80211_CMD_REGISTER_BEACONS", "86": "@NL80211_CMD_UNEXPECTED_4ADDR_FRAME", "87": "@NL80211_CMD_SET_NOACK_MAP", "88": "@NL80211_CMD_CH_SWITCH_NOTIFY", "89": "@NL80211_CMD_START_P2P_DEVICE", "90": "@NL80211_CMD_STOP_P2P_DEVICE", "91": "@NL80211_CMD_CONN_FAILED", "92": "@NL80211_CMD_SET_MCAST_RATE", "93": "@NL80211_CMD_SET_MAC_ACL", "94": "@NL80211_CMD_RADAR_DETECT", "95": "@NL80211_CMD_GET_PROTOCOL_FEATURES", "96": "@NL80211_CMD_UPDATE_FT_IES", "97": "@NL80211_CMD_FT_EVENT", "98": "@NL80211_CMD_CRIT_PROTOCOL_START", "99": "@NL80211_CMD_CRIT_PROTOCOL_STOP", "100": "@NL80211_CMD_GET_COALESCE", "101": "@NL80211_CMD_SET_COALESCE", "102": "@NL80211_CMD_CHANNEL_SWITCH", "103": "@NL80211_CMD_VENDOR", "104": "@NL80211_CMD_SET_QOS_MAP", "105": "@NL80211_CMD_ADD_TX_TS", "106": "@NL80211_CMD_DEL_TX_TS", "107": "@NL80211_CMD_GET_MPP", "108": "@NL80211_CMD_JOIN_OCB", "109": "@NL80211_CMD_LEAVE_OCB", "110": "@NL80211_CMD_SWITCH_STARTED_NOTIFY", "111": "@NL80211_CMD_TDLS_CHANNEL_SWITCH", "112": "@NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH", "113": "@NL80211_CMD_WIPHY_REG_CHANGE"} \ No newline at end of file diff --git a/pyric/pyw.py b/pyric/pyw.py index a1e017e..534f5ef 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -96,7 +96,7 @@ # redefine interface types and monitor flags IFTYPES = nl80211h.NL80211_IFTYPES MNTRFLAGS = nl80211h.NL80211_MNTR_FLAGS -TXPWRLVLS = nl80211h.NL80211_TX_POWER_LEVELS +TXPWRSETTINGS = nl80211h.NL80211_TX_POWER_SETTINGS ################################################################################ #### WIRELESS CORE #### @@ -1085,8 +1085,8 @@ def devinfo(card, *argv): try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_GET_INTERFACE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + cmd=nl80211h.NL80211_CMD_GET_INTERFACE, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) nl.nla_put_u32(msg, idx, nl80211h.NL80211_ATTR_IFINDEX) nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) @@ -1196,39 +1196,47 @@ def phyinfo(card, *argv): #### TX/RX RELATED #### ################################################################################ -def txset(card, pwr, lvl, *argv): +def txset(card, setting, lvl, *argv): """ + ROOT Required sets cards tx power (iw phy card. * 100) :param card: Card object - :param pwr: desired tx power in dBm or None. NOTE: ignored if lvl is 'auto' - :param lvl: power level setting oneof {'auto' = automatically determine + :param setting: power level setting oneof {'auto' = automatically determine transmit power|'limit' = limit power by |'fixed' = set to } + :param lvl: desired tx power in dBm or None. NOTE: ignored if lvl is 'auto' :param argv: netlink socket at argv[0] (or empty) :returns: True on success NOTE: this does not work on my card(s) (nor does the corresponding iw command) """ - # sanity check on power level - if lvl not in TXPWRLVLS: raise pyric.error(errno.EINVAL, "Invalid pwr lvl") + # sanity check on power setting and power level + if not setting in TXPWRSETTINGS: + raise pyric.error(errno.EINVAL, "Invalid power setting {0}".format(setting)) + if setting != 'auto': + if lvl is None: + raise pyric.error(errno.EINVAL, "Power level must be specified") try: nlsock = argv[0] except IndexError: - return _nlstub_(txset, card, pwr, lvl) + return _nlstub_(txset, card, setting, lvl) try: + setting = TXPWRSETTINGS.index(setting) msg = nl.nlmsg_new(nltype=_familyid_(nlsock), cmd=nl80211h.NL80211_CMD_SET_WIPHY, flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) - if lvl != 'auto': - # convert pwr from dBm to mBm - nl.nla_put_u32(msg, int(pwr*100), - nl80211h.NL80211_ATTR_WIPHY_TX_POWER_LEVEL) + # neither sending the phy or ifindex works + #nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nla_put_u32(msg, setting, nl80211h.NL80211_ATTR_WIPHY_TX_POWER_SETTING) + if setting != nl80211h.NL80211_TX_POWER_AUTOMATIC: + nl.nla_put_u32(msg, 100*lvl, nl80211h.NL80211_ATTR_WIPHY_TX_POWER_LEVEL) nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) except ValueError: - raise pyric.error(errno.EINVAL, "Invalid txpwr {0}".format(pwr)) + # only relevent when converting to mbm + raise pyric.error(errno.EINVAL, "Invalid txpwr {0}".format(lvl)) except AttributeError: raise pyric.error(errno.EINVAL, "Invalid Card object") except nl.error as e: diff --git a/pyric/utils/channels.py b/pyric/utils/channels.py index 4a15f51..bfad7ad 100644 --- a/pyric/utils/channels.py +++ b/pyric/utils/channels.py @@ -84,8 +84,9 @@ def ch2rf(c): :param c:channel :returns:frequency in MHz corresponding to channel """ - if c in ISM_24_C2F:return ISM_24_C2F[c] - if c in UNII_5_C2F:return UNII_5_C2F[c] + if c in ISM_24_C2F: return ISM_24_C2F[c] + if c in UNII_5_C2F: return UNII_5_C2F[c] + if c in UNII_4_C2F: return UNII_4_C2F[c] return None def rf2ch(f): @@ -94,6 +95,7 @@ def rf2ch(f): :param f:frequency (in MHz) :returns:channel number corresponding to frequency """ - if f in ISM_24_F2C:return ISM_24_F2C[f] - if f in UNII_5_F2C:return UNII_5_F2C[f] + if f in ISM_24_F2C: return ISM_24_F2C[f] + if f in UNII_5_F2C: return UNII_5_F2C[f] + if f in UNII_4_F2C: return UNII_4_F2C[f] return None \ No newline at end of file diff --git a/setup.py b/setup.py index 1b0a8b7..47ac11b 100644 --- a/setup.py +++ b/setup.py @@ -34,26 +34,10 @@ from setuptools import setup, find_packages import pyric -long_desc = """ - PyRIC is Linux wireless network interface controller library. It provides the - ability to manipuate, identify and enumerate your system's wireless cards. PyRIC - is a pure python port of a subset of the functionality provided by iw, ifconfig, - and rfkill.\n - - PyRIC is:\n - * Pythonic: No ctypes, SWIG etc. PyRIC redefines C header files as Python and - uses sockets to communicate with kernel.\n - * Self-sufficient: No third-party files used, PyRIC is completely self-contained\n - * Fast: (relatively speaking) PyRIC is faster than using iw through subprocess.Popen\n - * Parseless: Get the output you without parsing output from iw. Never worry about - iw updates and rewriting your parsers.\n - * Easy: If you can use iw, you can use PyRIC\n -""" - setup(name='PyRIC', version=pyric.__version__, description="Python Wireless Library", - long_description=long_desc, + long_description=pyric.long_desc, url='http://wraith-wireless.github.io/pyric', download_url="https://github.com/wraith-wireless/pyric/archive/"+pyric.__version__+".tar.gz", author=pyric.__author__, From 0ba078b21ab1e3f46f42f1712cc776608d7c32ed Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Wed, 29 Jun 2016 13:09:07 -0600 Subject: [PATCH 062/121] v0.1.4 updated TODO --- TODO | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index c9060c5..61edb94 100644 --- a/TODO +++ b/TODO @@ -43,10 +43,10 @@ - get Operation not supported for setting tx power (see pyw.txset) - have tried using the ifindex and phy. Both methods are accepted, returning only Errno 95. - - Is the operation not supported by my cards? or is it not supported by the - kernel? o when using mBm - no errors reported but tx power is not changed + o Is the operation not supported by my cards? or is it not supported by the + kernel? 23) Unknown Command 104. After updating to kernel 4, iw phy info returns a Unknown command (104). pyw.phyinfo does not return this. - iw 3.17 being used From d94f5fbaf24fcecd726a315b5078da8390ac1426 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Thu, 30 Jun 2016 05:49:32 -0600 Subject: [PATCH 063/121] v0.1.4 added ifinfo, modified error handling --- CHANGES | 5 +- README.md | 37 +++++-- docs/PyRIC.pdf | Bin 505829 -> 506488 bytes docs/PyRIC.tex | 4 +- examples/info.py | 106 +++++++++++--------- pyric/__init__.py | 38 ++++--- pyric/net/if_h.py | 2 +- pyric/pyw.py | 217 ++++++++++++++++++++++++---------------- pyric/utils/hardware.py | 2 +- pyric/utils/ouifetch.py | 2 +- setup.py | 4 +- 11 files changed, 250 insertions(+), 167 deletions(-) diff --git a/CHANGES b/CHANGES index d4302dd..777613f 100644 --- a/CHANGES +++ b/CHANGES @@ -97,6 +97,7 @@ v 0.1.4 - covclassget - retryshortget - retrylongget + - ifinfo o modified devadd. User is allowed to submit a Card object or a physical index o removed hardcoded values for covclassset, retry(short|long)set, retsthreshet and fragrthreshset @@ -111,4 +112,6 @@ v 0.1.4 o added new functions from 0.1.3 and 0.1.4 to unittests o updated nl80211_h w/ additional constants included in kernel v 4 header o added propietary concept of set to netlink processing - - nl80211 appears to define a set of like-sized elements (see cipher_suites) \ No newline at end of file + - nl80211 appears to define a set of like-sized elements (see cipher_suites) + o modified pyric exceptions + - imports errno codes into pyric, conforming how functions access error codes \ No newline at end of file diff --git a/README.md b/README.md index 62e4b76..5f21c21 100644 --- a/README.md +++ b/README.md @@ -66,13 +66,12 @@ halved. ATT, PyRIC accomplishes my core needs but it is still a work in progress. It currently pyw provides the following: * enumerate interfaces and wireless interfaces -* identify a cards chipset and driver +* identify a cards driver, chipset and manufacturer * get/set hardware address * get/set ip4 address, netmask and or broadcast * turn card on/off -* get supported standards -* get supported commands -* get supported modes +* get supported standards, commands or modes +* get if info * get dev info * get phy info * get/set regulatory domain @@ -158,8 +157,8 @@ To use PyRIC, see the examples folder or read throuhg PyRIC.pdf. However, for those impatient types: ```python -import pyric # pyric error and EUNDEF error code -from pyric import pyw iw functionality +import pyric # pyric errors +from pyric import pyw # iw functionality ``` will import the basic requirements and unless otherwise stated is assumed for the @@ -170,6 +169,21 @@ that these examples use one-time sockets. Although not all functions require root, we assume that the below have been executed with root permissions. +Before proceeding with the examples, let's talk about pyric error handling. The +pyric module imports the errorcodes found in the errno module as its own. The +pyric error subclasses EnvironmentError and all pyric errors are tuples of the +form t = (error code,error message). + +```python +>>> try: +... #some pyric code +... except pyric.error as e: +... #handle the error +``` + +Work is ongoing to help clarify some of the error messages returned by default +by os.strerror for example. + ### a. System/Wireless Core Functionality These functions do not work with a specific device rather with the system. @@ -298,6 +312,17 @@ and Fragmentation thresholds see http://resources.infosecinstitute.com/rts-thres #### iv. Getting Info On Your Card ```python +>>> iinfo = pyw.ifinfo(w0) +>>> for i in iinfo: print i, iinfo[i] +... +mask 255.255.255.192 +driver iwlwifi +hwaddr a0:88:b4:9e:68:58 +chipset Intel 4965/5xxx/6xxx/1xxx +bcast 192.168.3.63 +inet 192.168.3.7 +manufacturer Intel Corporate +>>> >>> dinfo = pyw.devinfo(w0) >>> for d in dinfo: print d, dinfo[d] ... diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index efde8f24e610f674827b132bfd921d815f73ad82..eeebb3a7a869e630f11d8c4bff487f46b1423c89 100644 GIT binary patch delta 24194 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 diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 3e093ad..7cd4382 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -464,7 +464,7 @@ \subsubsection{One-time vs Persistent Sockets} \begin{lstlisting}[caption={Using Persistent Sockets}, label={lst:persistent}, language=Python] - 1: import pyric # pyric error (and ecode EUNDEF) + 1: import pyric # pyric errors 2: from pyric import pyw # for iw functionality 3: from pyric.lib import libnl as nl # for netlink sockets 4: @@ -911,7 +911,7 @@ \subsection{Constants} \subsection{Functions} \begin{enumerate} -\item parse([opath]): returns a dict of oui:manufacturer key->value pairs stored +\item load([opath]): returns a dict of oui:manufacturer key->value pairs stored in the text file at opath. If opath is not specified, uses the default \item fetch([opath]): retrieves oui.txt from the IEEE website, parses the files and stores the results in a PyRIC friendly format in opath. If opath is not diff --git a/examples/info.py b/examples/info.py index 7fd0345..5c3eb2e 100644 --- a/examples/info.py +++ b/examples/info.py @@ -6,79 +6,85 @@ """ import argparse as ap +import sys import pyric # pyric error (and ecode EUNDEF) from pyric import pyw # for iw functionality -import pyric.utils.hardware as hw # for chipset/driver -from pyric.utils import ouifetch # for oui dict from pyric.utils.channels import rf2ch # rf to channel conversion -def execute(dev): +def execute(dev,itype): # ensure dev is a wireless interfaces wifaces = pyw.winterfaces() if dev not in wifaces: print "Device {0} is not wireless, use one of {1}".format(dev,wifaces) + # get info dicts dinfo = pyw.devinfo(dev) card = dinfo['card'] pinfo = pyw.phyinfo(card) - driver = hw.ifdriver(card.dev) - chipset = hw.ifchipset(driver) + iinfo = pyw.ifinfo(card) - manuf = hw.manufacturer(ouifetch.parse(),dinfo['mac']) + if itype == 'all' or itype == 'if': + msg = "Interface {0}\n".format(card.idx) + msg += "\tDriver: {0} Chipset: {1}\n".format(iinfo['driver'],iinfo['chipset']) + msg += "\tHW Addr: {0} Manufacturer: {1}\n".format(iinfo['hwaddr'], + iinfo['manufacturer']) + msg += "\tInet: {0} Bcast: {1} Mask: {2}\n".format(iinfo['inet'], + iinfo['bcast'], + iinfo['mask']) + print msg - msg = "Device {0}\n".format(dev) - msg += "\tDriver: {0} Chipset: {1}\n".format(driver,chipset) - msg += "\tManufacturer: {0}\n".format(manuf) - msg += "\tifindex: {0}\n".format(card.idx) - msg += "\twdev: {0}\n".format(dinfo['wdev']) - msg += "\taddr: {0}\n".format(dinfo['mac']) - msg += "\tmode: {0}\n".format(dinfo['mode']) - msg += "\twiphy: {0}\n".format(card.phy) - if dinfo['mode'] == 'managed': - msg += "\tchannel: {0} ({1} MHz), width: {2}, CF: {3}\n".format(rf2ch(dinfo['RF']), - dinfo['RF'], - dinfo['CHW'], - dinfo['CF']) - else: - msg += "\tDevice not associated\n" - print msg + if itype == 'all' or itype == 'dev': + msg = "Device {0}\n".format(card.dev) + msg += "\tifindex: {0}\n".format(card.idx) + msg += "\twdev: {0}\n".format(dinfo['wdev']) + msg += "\taddr: {0}\n".format(dinfo['mac']) + msg += "\tmode: {0}\n".format(dinfo['mode']) + msg += "\twiphy: {0}\n".format(card.phy) + if dinfo['mode'] != 'managed': msg += "\tDevice not associated\n" + else: + msg += "\tchannel: {0} ({1} MHz), width: {2}, CF: {3} MHz\n".format(rf2ch(dinfo['RF']), + dinfo['RF'], + dinfo['CHW'], + dinfo['CF']) + print msg - msg = "Wiphy phy{0}\n".format(card.phy) - msg += "\tGeneration: {0}m Coverage Class: {1}\n".format(pinfo['generation'], - pinfo['cov_class']) - msg += "\tMax # scan SSIDs: {0}\n".format(pinfo['scan_ssids']) - msg += "\tRetry Short: {0}, Long: {1}\n".format(pinfo['retry_short'], - pinfo['retry_long']) - msg += "\tThreshold Frag: {0}, RTS: {1}\n".format(pinfo['frag_thresh'], - pinfo['rts_thresh']) - msg += "\tSupported Modes:\n" - for mode in pinfo['modes']: - msg += "\t * {0}\n".format(mode) - msg += "\tSupported Commands:\n" - for cmd in pinfo['commands']: - msg += "\t * {0}\n".format(cmd) - msg += "\tSupported Frequencies:\n" - for rf in pinfo['freqs']: - msg += "\t * {0} ({1})\n".format(rf,rf2ch(rf)) - #for ch in map(rf2ch,pinfo['freqs']): - # msg += "\t * {0}\n".format(ch) - msg += "\tSupported Ciphers:\n" - for cipher in pinfo['ciphers']: - msg += "\t * {0}\n".format(cipher) + if itype == 'all' or itype == 'phy': + msg = "Wiphy phy{0}\n".format(card.phy) + msg += "\tGeneration: {0}m Coverage Class: {1}\n".format(pinfo['generation'], + pinfo['cov_class']) + msg += "\tMax # scan SSIDs: {0}\n".format(pinfo['scan_ssids']) + msg += "\tRetry Short: {0}, Long: {1}\n".format(pinfo['retry_short'], + pinfo['retry_long']) + msg += "\tThreshold Frag: {0}, RTS: {1}\n".format(pinfo['frag_thresh'], + pinfo['rts_thresh']) + msg += "\tSupported Modes:\n" + for mode in pinfo['modes']: msg += "\t * {0}\n".format(mode) + msg += "\tSupported Commands:\n" + for cmd in pinfo['commands']: msg += "\t * {0}\n".format(cmd) + msg += "\tSupported Frequencies:\n" + for rf in pinfo['freqs']: msg += "\t * {0} ({1})\n".format(rf,rf2ch(rf)) + msg += "\tSupported Ciphers:\n" + for cipher in pinfo['ciphers']: msg += "\t * {0}\n".format(cipher) - print msg + print msg if __name__ == '__main__': # create arg parser and parse command line args print "Wireless Device Info Display using PyRIC v{0}".format(pyric.__version__) argp = ap.ArgumentParser(description="Wireless Device Data") argp.add_argument('-d','--dev',help="Wireless Device") + argp.add_argument('-t','--type',help="Info type one of {all|if|dev|phy}") args = argp.parse_args() try: - dev = args.dev - if dev is None: - print "usage: python details.py -d " - else: - execute(dev) + dname = args.dev + infotype = args.type + if dname is None: + print "usage: python details.py -d [-t ]" + sys.exit(0) + if infotype is None: infotype = 'all' + if infotype not in ['all','if','dev','phy']: + print "usage: python details.py -d [-t one of {all|if|dev|phy}]" + sys.exit(0) + execute(dname,infotype) except pyric.error as e: print e \ No newline at end of file diff --git a/pyric/__init__.py b/pyric/__init__.py index 7b94d95..14cbfcc 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -32,6 +32,8 @@ changes: See CHANGES in top-level directory + WARNING: DO NOT import * + """ __name__ = 'pyric' @@ -43,21 +45,29 @@ __email__ = 'wraith.wireless@yandex.com' __status__ = 'Production' -from os import strerror - -# all exceptions are tuples t=(error code,error message) -# we use errno.errocodes and use codes < 0 as an undefined error code -EUNDEF = -1 +# define pyric exceptions +# all exceptions are tuples t=(error code,error message) +# we use error codes defined in errno, adding -1 to define the undefined error +# EUNDEF. I don't like importing all from errno but it provides conformity in +# error handling i.e modules using pyric.error do not need to call pyric.EUNDEF +# and errno.EINVAL but can call pyric.EUNDEF and pyric.EINVAL +EUNDEF = -1 # undefined error +from errno import * # make all errno errors pyric errors +errorcode['EUNDEF'] = -1 # add ours to errorcode dicts class error(EnvironmentError): pass - -def perror(e): - """ - :param e: error code - :returns: string description of error code - """ - # anything less than 0 is an unknown - return strerror(e) - +# BELOW IS STILL A WORK IN PRGORESS +def strerror(errno): + import os + if errno < 0: return "Undefined error" + elif errno == EPERM: return "Superuser privileges required" + elif errno == EINVAL: return "Invalid parameter" + else: + return os.strerror(errno) + +# for setup.py use +# redefine version for easier access +version = __version__ +# define long description long_desc = """ # PyRIC 0.1.4: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester diff --git a/pyric/net/if_h.py b/pyric/net/if_h.py index baab202..865512b 100644 --- a/pyric/net/if_h.py +++ b/pyric/net/if_h.py @@ -287,6 +287,6 @@ def ifreq(ifrn,ifru=None,param=None): else: raise AttributeError("ifru {0} not supported".format(ifru)) except (TypeError,IndexError): - raise AttributeError("param is invalid") + raise AttributeError("parameters are invalid") return ifr \ No newline at end of file diff --git a/pyric/pyw.py b/pyric/pyw.py index 534f5ef..826cdca 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -76,12 +76,12 @@ import struct # ioctl unpacking import pyric # pyric exception -import errno # error codes import re # check addr validity +from pyric.nlhelp.nlsearch import cmdbynum # get command name from pyric.utils import channels # channel related from pyric.utils import rfkill # block/unblock -from pyric.nlhelp.nlsearch import cmdbynum # get command name import pyric.utils.hardware as hw # device related +from pyric.utils import ouifetch # get oui dict import pyric.net.netlink_h as nlh # netlink definition import pyric.net.genetlink_h as genlh # genetlink definition import pyric.net.wireless.nl80211_h as nl80211h # nl80211 definition @@ -163,10 +163,10 @@ def iswireless(dev, *argv): _ = io.io_transfer(iosock, sioch.SIOCGIWNAME, ifh.ifreq(dev)) return True except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except io.error as e: # ENODEV or ENOTSUPP means not wireless, reraise any others - if e.errno == errno.ENODEV or e.errno == errno.EOPNOTSUPP: return False + if e.errno == pyric.ENODEV or e.errno == pyric.EOPNOTSUPP: return False else: raise pyric.error(e.errno, e.strerror) def regget(*argv): @@ -197,7 +197,8 @@ def regset(rd, *argv): :param rd: regulatory domain code :param argv: netlink socket at argv[0] (or empty) """ - if len(rd) != 2: raise pyric.error(errno.EINVAL, "Invalid reg. domain") + if len(rd) != 2: + raise pyric.error(pyric.EINVAL, "Invalid reg. domain {0}".format(rd)) try: nlsock = argv[0] except IndexError: @@ -267,7 +268,7 @@ def validcard(card, *argv): try: return card == devinfo(card.dev, nlsock)['card'] except pyric.error as e: - if e.errno == errno.ENODEV: return False + if e.errno == pyric.ENODEV: return False else: raise ################################################################################ @@ -291,13 +292,12 @@ def macget(card, *argv): ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] if fam in [ifh.ARPHRD_ETHER, ifh.AF_UNSPEC,ifh.ARPHRD_IEEE80211_RADIOTAP]: - #if fam == ifh.ARPHRD_ETHER or fam == ifh.AF_UNSPEC: # confirm hwaddr return _hex2mac_(ret[18:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return hwaddr family {0}".format(fam)) except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) except io.error as e: @@ -312,7 +312,7 @@ def macset(card, mac, *argv): :param argv: ioctl socket at argv[0] (or empty) :returns: mac address after operation """ - if not _validmac_(mac): raise pyric.error(errno.EINVAL, "Invalid mac address") + if not _validmac_(mac): raise pyric.error(pyric.EINVAL, "Invalid mac address") try: iosock = argv[0] @@ -324,13 +324,13 @@ def macset(card, mac, *argv): ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [mac])) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] if fam in [ifh.ARPHRD_ETHER, ifh.AF_UNSPEC, ifh.ARPHRD_IEEE80211_RADIOTAP]: - #if fam == ifh.ARPHRD_ETHER or fam == ifh.AF_UNSPEC: # confirm hwaddr return _hex2mac_(ret[18:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, + + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return hwaddr family {0}".format(fam)) except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) except io.error as e: @@ -356,7 +356,7 @@ def inetget(card, *argv): if fam == ifh.AF_INET: ip4 = _hex2ip4_(ret[20:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return ip family {0}".format(fam)) # netmask @@ -366,7 +366,7 @@ def inetget(card, *argv): if fam == ifh.AF_INET: netmask = _hex2ip4_(ret[20:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return netmask family {0}".format(fam)) # broadcast @@ -376,16 +376,16 @@ def inetget(card, *argv): if fam == ifh.AF_INET: brdaddr = _hex2ip4_(ret[20:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return broadcast family {0}".format(fam)) except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) except io.error as e: # catch address not available, which means the card currently does not # have any addresses set - raise others - if e.errno == errno.EADDRNOTAVAIL: return None, None, None + if e.errno == pyric.EADDRNOTAVAIL: return None, None, None raise pyric.error(e.errno, e.strerror) return ip4, netmask, brdaddr @@ -413,14 +413,14 @@ def inetset(card, ipaddr, netmask, broadcast, *argv): """ # ensure one of params is set & that all set params are valid ip address if not ipaddr and not netmask and not broadcast: - raise pyric.error(errno.EINVAL, + raise pyric.error(pyric.EINVAL, "One of ipaddr/netmask/broadcast must be set") if ipaddr and not _validip4_(ipaddr): - raise pyric.error(errno.EINVAL, "Invalid ip4 address") + raise pyric.error(pyric.EINVAL, "Invalid ip4 address") if netmask and not _validip4_(netmask): - raise pyric.error(errno.EINVAL, "Invalid netmask") + raise pyric.error(pyric.EINVAL, "Invalid netmask") if broadcast and not _validip4_(broadcast): - raise pyric.error(errno.EINVAL, "Invalid broadcast") + raise pyric.error(pyric.EINVAL, "Invalid broadcast") try: iosock = argv[0] @@ -436,12 +436,12 @@ def inetset(card, ipaddr, netmask, broadcast, *argv): except pyric.error as e: # an ambiguous error is thrown if attempting to set netmask or broadcast # without an ip address already set on the card - if not ipaddr and e.errno == errno.EADDRNOTAVAIL: - raise pyric.error(errno.EINVAL, "Set ip4 addr first") + if not ipaddr and e.errno == pyric.EADDRNOTAVAIL: + raise pyric.error(pyric.EINVAL, "Set ip4 addr first") else: raise except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) @@ -455,7 +455,7 @@ def ip4set(card, ipaddr, *argv): :returns: the new ip address NOTE: setting the ip will set netmask and broadcast accordingly """ - if not _validip4_(ipaddr): raise pyric.error(errno.EINVAL, "Invalid ipaddr") + if not _validip4_(ipaddr): raise pyric.error(pyric.EINVAL, "Invalid ipaddr") try: iosock = argv[0] @@ -469,10 +469,10 @@ def ip4set(card, ipaddr, *argv): if fam == ifh.AF_INET: return _hex2ip4_(ipaddr) else: - raise pyric.error(errno.EAFNOSUPPORT, + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return ip family {0}".format(fam)) except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) except io.error as e: @@ -489,7 +489,7 @@ def netmaskset(card, netmask, *argv): NOTE: 1) throws error if netmask is set and card does not have an ip assigned """ - if not _validip4_(netmask): raise pyric.error(errno.EINVAL, "Invalid netmask") + if not _validip4_(netmask): raise pyric.error(pyric.EINVAL, "Invalid netmask") try: iosock = argv[0] except IndexError: @@ -502,17 +502,17 @@ def netmaskset(card, netmask, *argv): if fam == ifh.AF_INET: return _hex2ip4_(ret[20:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return netmask family {0}".format(fam)) except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) except io.error as e: # an ambiguous error is thrown if attempting to set netmask or broadcast # without an ip address already set on the card - if e.errno == errno.EADDRNOTAVAIL: - raise pyric.error(errno.EINVAL, "Cannot set netmask. Set ip first") + if e.errno == pyric.EADDRNOTAVAIL: + raise pyric.error(pyric.EINVAL, "Cannot set netmask. Set ip first") else: raise pyric.error(e, e.strerror) @@ -529,7 +529,7 @@ def broadcastset(card, broadcast, *argv): 2) can set broadcast to erroneous values i.e. ipaddr = 192.168.1.2 and broadcast = 10.0.0.31. """ - if not _validip4_(broadcast): raise pyric.error(errno.EINVAL, "Invalid bcast") + if not _validip4_(broadcast): raise pyric.error(pyric.EINVAL, "Invalid bcast") try: iosock = argv[0] @@ -544,24 +544,24 @@ def broadcastset(card, broadcast, *argv): if fam == ifh.AF_INET: return _hex2ip4_(ret[20:24]) else: - raise pyric.error(errno.EAFNOSUPPORT, + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return broadcast family {0}".format(fam)) except pyric.error as e: # an ambiguous error is thrown if attempting to set netmask or broadcast # without an ip address already set on the card - if e.errno == errno.EADDRNOTAVAIL: - raise pyric.error(errno.EINVAL, "Cannot set broadcast. Set ip first") + if e.errno == pyric.EADDRNOTAVAIL: + raise pyric.error(pyric.EINVAL, "Cannot set broadcast. Set ip first") else: raise except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) except io.error as e: # an ambiguous error is thrown if attempting to set netmask or broadcast # without an ip address already set on the card - if e.errno == errno.EADDRNOTAVAIL: - raise pyric.error(errno.EINVAL, "Cannot set broadcast. Set ip first") + if e.errno == pyric.EADDRNOTAVAIL: + raise pyric.error(pyric.EINVAL, "Cannot set broadcast. Set ip first") else: raise pyric.error(e, e.strerror) @@ -584,7 +584,7 @@ def isup(card, *argv): try: return _issetf_(_flagsget_(card.dev, iosock), ifh.IFF_UP) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") def up(card, *argv): """ @@ -603,7 +603,7 @@ def up(card, *argv): if not _issetf_(flags, ifh.IFF_UP): _flagsset_(card.dev, _setf_(flags, ifh.IFF_UP), iosock) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") def down(card, *argv): """ @@ -622,7 +622,7 @@ def down(card, *argv): if _issetf_(flags, ifh.IFF_UP): _flagsset_(card.dev, _unsetf_(flags, ifh.IFF_UP), iosock) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") def isblocked(card): """ @@ -635,7 +635,7 @@ def isblocked(card): idx = rfkill.getidx(card.phy) return rfkill.soft_blocked(idx), rfkill.hard_blocked(idx) except AttributeError: - raise pyric.error(errno.ENODEV, "Device is no longer regsitered") + raise pyric.error(pyric.ENODEV, "Device is no longer regsitered") def block(card): """ @@ -646,7 +646,7 @@ def block(card): idx = rfkill.getidx(card.phy) rfkill.rfkill_block(idx) except AttributeError: - raise pyric.error(errno.ENODEV, "Device no longer registered") + raise pyric.error(pyric.ENODEV, "Device no longer registered") def unblock(card): """ @@ -657,7 +657,7 @@ def unblock(card): idx = rfkill.getidx(card.phy) rfkill.rfkill_unblock(idx) except AttributeError: - raise pyric.error(errno.ENODEV, "Device no longer registered") + raise pyric.error(pyric.ENODEV, "Device no longer registered") ################################################################################ #### RADIO PROPERTIES #### @@ -683,7 +683,7 @@ def pwrsaveget(card, *argv): nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -712,9 +712,9 @@ def pwrsaveset(card, on, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except ValueError: - raise pyric.error(errno.EINVAL, "Invalid parameter on") + raise pyric.error(pyric.EINVAL, "Invalid parameter on") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -747,7 +747,7 @@ def covclassset(card, cc, *argv): # this can work 'incorrectly' on non-int values but these will # be caught later during conversion msg = "Coverage class must be integer {0} - {1}" - raise pyric.error(errno.EINVAL, msg.format(wlan.COVERAGE_CLASS_MIN, + raise pyric.error(pyric.EINVAL, msg.format(wlan.COVERAGE_CLASS_MIN, wlan.COVERAGE_CLASS_MAX)) try: @@ -764,9 +764,9 @@ def covclassset(card, cc, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except ValueError: - raise pyric.error(errno.EINVAL, "Invalid parameter value for cc") + raise pyric.error(pyric.EINVAL, "Invalid parameter value for cc") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -798,7 +798,7 @@ def retryshortset(card, lim, *argv): # be caught later during conversion msg = "Retry short must be integer {0} - {1}".format(wlan.RETRY_MIN, wlan.RETRY_MAX) - raise pyric.error(errno.EINVAL, msg) + raise pyric.error(pyric.EINVAL, msg) try: nlsock = argv[0] @@ -814,9 +814,9 @@ def retryshortset(card, lim, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except ValueError: - raise pyric.error(errno.EINVAL, "Invalid parameter value for lim") + raise pyric.error(pyric.EINVAL, "Invalid parameter value for lim") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -847,7 +847,7 @@ def retrylongset(card, lim, *argv): # this can work 'incorrectly' on non-int values but these will # be caught later during conversion msg = "Retry long must be integer {0} - {1}" - raise pyric.error(errno.EINVAL, msg.format(wlan.RETRY_MIN, wlan.RETRY_MAX)) + raise pyric.error(pyric.EINVAL, msg.format(wlan.RETRY_MIN, wlan.RETRY_MAX)) try: nlsock = argv[0] @@ -863,9 +863,9 @@ def retrylongset(card, lim, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except ValueError: - raise pyric.error(errno.EINVAL, "Invalid parameter value for lim") + raise pyric.error(pyric.EINVAL, "Invalid parameter value for lim") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -897,7 +897,7 @@ def rtsthreshset(card, thresh, *argv): elif thresh == wlan.RTS_THRESHOLD_OFF: pass elif thresh < wlan.RTS_THRESHOLD_MIN or thresh > wlan.RTS_THRESHOLD_MAX: msg = "Threshold must be 'off' or integer {0} - {1}" - raise pyric.error(errno.EINVAL, msg.format(wlan.RTS_THRESHOLD_MIN, + raise pyric.error(pyric.EINVAL, msg.format(wlan.RTS_THRESHOLD_MIN, wlan.RTS_THRESHOLD_MAX)) try: @@ -914,9 +914,9 @@ def rtsthreshset(card, thresh, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except ValueError: - raise pyric.error(errno.EINVAL, "Invalid parameter value for thresh") + raise pyric.error(pyric.EINVAL, "Invalid parameter value for thresh") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -948,7 +948,7 @@ def fragthreshset(card, thresh, *argv): elif thresh == wlan.FRAG_THRESHOLD_OFF: pass elif thresh < wlan.FRAG_THRESHOLD_MIN or thresh > wlan.FRAG_THRESHOLD_MAX: msg = "Threshold must be 'off' or an integer {0} - {1}" - raise pyric.error(errno.EINVAL, msg.format(wlan.FRAG_THRESHOLD_MIN, + raise pyric.error(pyric.EINVAL, msg.format(wlan.FRAG_THRESHOLD_MIN, wlan.FRAG_THRESHOLD_MAX)) try: @@ -965,7 +965,7 @@ def fragthreshset(card, thresh, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -1021,7 +1021,7 @@ def devstds(card, *argv): stds = stds.replace('IEEE 802.11', '') # remove IEEE 802.11 return [std for std in stds] except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except IndexError: return None except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) @@ -1056,6 +1056,45 @@ def devcmds(card, *argv): return phyinfo(card, nlsock)['commands'] +def ifinfo(card, *argv): + """ + get info for interface (ifconfig ) + :param card: Card object + :param argv: ioctl socket at argv[0] (or empty) + :returns: dict with the following key:value pairs + driver -> card's driver + chipset -> card's chipset + manufacturer -> card's manufacturer + hwaddr -> card's mac address + inet -> card's inet address + bcast -> card's broadcast address + mask -> card's netmask address + """ + try: + iosock = argv[0] + except IndexError: + return _iostub_(ifinfo, card) + + # get oui dict + ouis = {} + try: + ouis = ouifetch.load() + except pyric.error: + pass + + try: + drvr, chips = hw.ifcard(card.dev) + mac = macget(card, iosock) + ip4, nmask, bcast = inetget(card, iosock) + info = {'driver':drvr, 'chipset':chips, + 'hwaddr':mac, 'manufacturer':hw.manufacturer(ouis,mac), + 'inet':ip4, 'bcast':bcast, 'mask':nmask} + #except pyric.error # allow pyric errors to fall through + except AttributeError: + raise pyric.error(pyric.EINVAL, "Invalid Card object") + + return info + def devinfo(card, *argv): """ get info for device (iw dev info) @@ -1142,7 +1181,7 @@ def phyinfo(card, *argv): nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -1211,10 +1250,10 @@ def txset(card, setting, lvl, *argv): """ # sanity check on power setting and power level if not setting in TXPWRSETTINGS: - raise pyric.error(errno.EINVAL, "Invalid power setting {0}".format(setting)) + raise pyric.error(pyric.EINVAL, "Invalid power setting {0}".format(setting)) if setting != 'auto': if lvl is None: - raise pyric.error(errno.EINVAL, "Power level must be specified") + raise pyric.error(pyric.EINVAL, "Power level must be specified") try: nlsock = argv[0] @@ -1236,9 +1275,9 @@ def txset(card, setting, lvl, *argv): nl.nl_recvmsg(nlsock) except ValueError: # only relevent when converting to mbm - raise pyric.error(errno.EINVAL, "Invalid txpwr {0}".format(lvl)) + raise pyric.error(pyric.EINVAL, "Invalid txpwr {0}".format(lvl)) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -1261,7 +1300,7 @@ def txget(card, *argv): ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) return struct.unpack_from(ifh.ifr_iwtxpwr, ret, ifh.IFNAMELEN)[0] except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except IndexError: return None except struct.error as e: @@ -1300,7 +1339,7 @@ def chset(card, ch, chw=None, *argv): deleting all other existing managed interfaces allows for the new virtual device's channels to be changed """ - if ch not in channels.channels(): raise pyric.error(errno.EINVAL, "Invalid channel") + if ch not in channels.channels(): raise pyric.error(pyric.EINVAL, "Invalid channel") try: nlsock = argv[0] @@ -1318,9 +1357,9 @@ def freqset(card, rf, chw=None, *argv): :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} :param argv: netlink socket at argv[0] (or empty) """ - if rf not in channels.freqs(): raise pyric.error(errno.EINVAL, "Invalid frequency") + if rf not in channels.freqs(): raise pyric.error(pyric.EINVAL, "Invalid RF") if chw in channels.CHTYPES: chw = channels.CHTYPES.index(chw) - else: raise pyric.error(errno.EINVAL, "Invalid width") + else: raise pyric.error(pyric.EINVAL, "Invalid width") try: nlsock = argv[0] @@ -1337,7 +1376,7 @@ def freqset(card, rf, chw=None, *argv): nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(errno.EINVAL,"Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -1370,13 +1409,13 @@ def modeset(card, mode, flags=None, *argv): to monitor mode) :param argv: netlink socket at argv[0] (or empty) """ - if mode not in IFTYPES: raise pyric.error(errno.EINVAL, 'Invalid mode') + if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') if flags: if mode != 'monitor': - raise pyric.error(errno.EINVAL, 'Can only set flags in monitor mode') + raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') for flag in flags: if flag not in MNTRFLAGS: - raise pyric.error(errno.EINVAL, 'Invalid flag: {0}'.format(flag)) + raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) else: flags = [] try: @@ -1397,7 +1436,7 @@ def modeset(card, mode, flags=None, *argv): nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -1421,7 +1460,7 @@ def ifaces(card, *argv): if info['card'].phy == card.phy: ifs.append((info['card'], info['mode'])) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except nl.error as e: raise pyric.error(e.errno, e.strerror) return ifs @@ -1441,13 +1480,13 @@ def devadd(card, vdev, mode, flags=None, *argv): :param argv: netlink socket at argv[0] (or empty) :returns: the new Card """ - if mode not in IFTYPES: raise pyric.error(errno.EINVAL, 'Invalid mode') + if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') if flags: if mode != 'monitor': - raise pyric.error(errno.EINVAL, 'Can only set flags in monitor mode') + raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') for flag in flags: if flag not in MNTRFLAGS: - raise pyric.error(errno.EINVAL, 'Invalid flag: {0}'.format(flag)) + raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) else: flags = [] try: @@ -1475,7 +1514,7 @@ def devadd(card, vdev, mode, flags=None, *argv): nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -1503,7 +1542,7 @@ def devdel(card, *argv): nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(errno.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card object") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -1590,7 +1629,7 @@ def _flagsget_(dev, *argv): ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag)) return struct.unpack_from(ifh.ifr_flags, ret, ifh.IFNAMELEN)[0] except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) except io.error as e: @@ -1614,7 +1653,7 @@ def _flagsset_(dev, flags, *argv): ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag, [flags])) return struct.unpack_from(ifh.ifr_flags, ret, ifh.IFNAMELEN)[0] except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) except io.error as e: @@ -1703,7 +1742,7 @@ def _ifindex_(dev, *argv): ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag)) return struct.unpack_from(ifh.ifr_ifindex, ret, ifh.IFNAMELEN)[0] except AttributeError as e: - raise pyric.error(errno.EINVAL, e) + raise pyric.error(pyric.EINVAL, e) except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) except io.error as e: @@ -1785,8 +1824,8 @@ def _fut_chset(card, ch, chw, *argv): uses *_SET_WIPHY however, ATT does not work raise Errno 22 Invalid Argument NOTE: This only works for cards in monitor mode """ - if ch not in channels.channels(): raise pyric.error(errno.EINVAL, "Invalid channel") - if chw not in channels.CHTYPES: raise pyric.error(errno.EINVAL, "Invalid channel width") + if ch not in channels.channels(): raise pyric.error(pyric.EINVAL, "Invalid channel") + if chw not in channels.CHTYPES: raise pyric.error(pyric.EINVAL, "Invalid channel width") try: nlsock = argv[0] except IndexError: diff --git a/pyric/utils/hardware.py b/pyric/utils/hardware.py index 8c1dca5..f68777a 100644 --- a/pyric/utils/hardware.py +++ b/pyric/utils/hardware.py @@ -84,7 +84,7 @@ def ifcard(dev): :returns: tuple t = (driver,chipset) """ driver = ifdriver(dev) - return driver, ifchipset(driver) + return driver,ifchipset(driver) def ifdriver(dev): """ diff --git a/pyric/utils/ouifetch.py b/pyric/utils/ouifetch.py index 23defd3..d801822 100644 --- a/pyric/utils/ouifetch.py +++ b/pyric/utils/ouifetch.py @@ -40,7 +40,7 @@ OUIURL = 'http://standards-oui.ieee.org/oui.txt' OUIPATH = os.path.join(os.path.dirname(os.path.abspath(__file__)),'data/oui.txt') -def parse(opath=None): +def load(opath=None): """ parse oui.txt file :param opath: path of oui text file diff --git a/setup.py b/setup.py index 47ac11b..75f21ed 100644 --- a/setup.py +++ b/setup.py @@ -35,11 +35,11 @@ import pyric setup(name='PyRIC', - version=pyric.__version__, + version=pyric.version, description="Python Wireless Library", long_description=pyric.long_desc, url='http://wraith-wireless.github.io/pyric', - download_url="https://github.com/wraith-wireless/pyric/archive/"+pyric.__version__+".tar.gz", + download_url="https://github.com/wraith-wireless/pyric/archive/"+pyric.version+".tar.gz", author=pyric.__author__, author_email=pyric.__email__, maintainer=pyric.__maintainer__, From 252afbb2f8d6431d46104fd2b4cd92510f00a3b3 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Thu, 30 Jun 2016 14:22:59 -0600 Subject: [PATCH 064/121] v0.1.4 updated setup.py --- pyric/__init__.py | 37 +++++-------------------------------- 1 file changed, 5 insertions(+), 32 deletions(-) diff --git a/pyric/__init__.py b/pyric/__init__.py index 14cbfcc..768be2e 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -69,10 +69,10 @@ def strerror(errno): version = __version__ # define long description long_desc = """ -# PyRIC 0.1.4: Python Radio Interface Controller -## Linux wireless library for the Python Wireless Developer and Pentester +PyRIC 0.1.4: Python Radio Interface Controller +Linux wireless library for the Python Wireless Developer and Pentester -## 1 DESCRIPTION: +DESCRIPTION: PyRIC (is a Linux only) library providing wireless developers and pentesters the ability to identify, enumerate and manipulate their system's wireless cards programmatically in Python. Pentesting applications and scripts written in Python @@ -99,33 +99,7 @@ def strerror(errno): features of ifconfig such as getting or setting the mac address and has recently implemented rkill support to soft block or unblock wireless cards. -### a. Additions to iw -Several "extensions" have been added to iw: -* Persistent sockets: pyw provides the caller with functions & ability to pass -their own netlink (or ioctl socket) to pyw functions; -* One-time request for the nl80211 family id: pyw stores the family id in a -global variable -* Consolidating different "reference" values to wireless NICs in one class -(Cards are tuples t=(dev,phy #,ifindex) - -These are minimal changes but they can improve the performance of any progams -that needs to access the wireless nic repeatedly as shown in the table below. - -| chset | Total | Avg | Longest | Shortest | -|------------|----------|--------|-----------|----------| -| Popen(iw) | 588.3059 | 0.0588 | 0.0682 | 0.0021 | -| one-time | 560.3559 | 0.0560 | 0.0645 | 0.0003 | -| persistent | 257.8293 | 0.0257 | 0.0354 | 0.0004 | - -The table shows benchmarks for hop time on a Alfa AWUS036NH 10000 times. Note that -there is no implication that PyRIC is faster than iw. Rather, the table shows that -PyRIC is faster than using Popen to execute iw. Using one-time sockets, there is -a difference of 28 seconds over Popen and iw with a small decrease in the average -hoptime. Not a big difference. However, the performance increased dramatically when -persistent netlink sockets are used with the total time and average hop time nearly -halved. - -### b. Current State +CURRENT STATE ATT, PyRIC accomplishes my core needs but it is still a work in progress. It currently pyw provides the following: * enumerate interfaces and wireless interfaces @@ -158,8 +132,7 @@ def strerror(errno): for those who wish to add additional commands. However, it pulls directly from the comments nl80211 header file and may be vague. -### c. What is PyRIC? - +WHAT IS PyRIC? To avoid confusion, PyRIC is the system as a whole, including all header files and "libraries" that are required to communicate with the kernel. pyw is a interface to these libraries providing specific funtions. From 92a76677e13722cc3a5c653354f2dc3f44d3cf69 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Thu, 30 Jun 2016 16:31:13 -0600 Subject: [PATCH 065/121] v0.1.5 added STA related functions disconnect, isconnected --- CHANGES | 7 +++- README.md | 2 +- docs/PyRIC.pdf | Bin 506488 -> 506702 bytes docs/PyRIC.tex | 12 +++++-- pyric/__init__.py | 9 +++--- pyric/pyw.py | 81 +++++++++++++++++++++++++++++++++++----------- 6 files changed, 83 insertions(+), 28 deletions(-) diff --git a/CHANGES b/CHANGES index 777613f..8b76d8f 100644 --- a/CHANGES +++ b/CHANGES @@ -114,4 +114,9 @@ v 0.1.4 o added propietary concept of set to netlink processing - nl80211 appears to define a set of like-sized elements (see cipher_suites) o modified pyric exceptions - - imports errno codes into pyric, conforming how functions access error codes \ No newline at end of file + - imports errno codes into pyric, conforming how functions access error codes + +v 0.1.5 Begin STA associated functionality + o added functions: + - isconnected + - disconnect diff --git a/README.md b/README.md index 5f21c21..e71cad2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PyRIC 0.1.4: Python Radio Interface Controller +# PyRIC 0.1.5: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester ![](docs/logo.png?raw=true) diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index eeebb3a7a869e630f11d8c4bff487f46b1423c89..6dc66daf345d659ed2bac0adfa8d9520b2d0741c 100644 GIT binary patch delta 14681 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 OWaC7nrj}5YMEpO{*CZYQ diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 7cd4382..c96feae 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -73,7 +73,7 @@ basicstyle=\footnotesize } -\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.4: User Manual} +\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.5: User Manual} \author{Dale V. Patterson\\ wraith.wireless@yandex.com} \begin{document} @@ -793,6 +793,8 @@ \subsection{Functions} netlink, get card's supported modes \item devcmds(card,[nlsock]): (iw phy card.phy info | grep commands), type: netlink, get card's supported commands +\item ifinfo(card,[iosock]): (ifconfig card.), type: ioctl, get hardware +related info for card \item devinfo(card,[nlsock]): (iw dev card. info), type: netlink, get info for dev \item phyinfo(card,[nlsock]): (iw phy card. info), type: netlink, get info @@ -819,8 +821,12 @@ \subsection{Functions} type flags ), type: netlink, creates a new virtual interface on card's phy with dev vdev, in mode and using flags. Note: flags are only supported in when creating a monitor mode -\item devdel(card,[nlsock]): (iw card. del), type: netlink, deletes dev +\item devdel(card,[nlsock]): (iw card. del), type: netlink, deletes card \begin{itemize} +\item isconnected(card, [nlsock]): (iw card. info | grep channel), type: +netlink, determines if card is connected +\item disconnect(card, [nlsock]): (iw card. disconnect), type: netlink, +disconnects card from AP \item \_hex2mac\_(v): returns a ':' separated mac address from byte stream v \item \_hex2ip4\_(v): returns a '.' separated ip4 address from byte stream v \item \_validip4\_(addr): determines if addr is a valid ip4 address @@ -1097,7 +1103,7 @@ \subsection{Functions} \end{enumerate} \section{Copyright and License}\label{sec:copy} -PYRIC: Python Radio Interface Controller v0.1.4\\ +PYRIC: Python Radio Interface Controller v0.1.5\\ Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com)\\ diff --git a/pyric/__init__.py b/pyric/__init__.py index 768be2e..70688bd 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -23,22 +23,23 @@ will follow the 2-tuple form of EnvironmentError Requires: - linux (preferred 3.x kernel) + linux (3.x or 4.x kernel) Python 2.7 - pyric 0.1.4 + pyric 0.1.5 desc: wireless nic library: wireless radio identification, manipulation, enumeration - includes: /nlhelp /lib /net /utils pyw 0.1.4 + includes: /nlhelp /lib /net /utils pyw.py changes: See CHANGES in top-level directory + WARNING: DO NOT import * """ __name__ = 'pyric' __license__ = 'GPLv3' -__version__ = '0.1.4' +__version__ = '0.1.5' __date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' diff --git a/pyric/pyw.py b/pyric/pyw.py index 826cdca..cccbaf1 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -67,7 +67,7 @@ __name__ = 'pyw' __license__ = 'GPLv3' -__version__ = '0.1.5' +__version__ = '0.1.6' __date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' @@ -566,7 +566,7 @@ def broadcastset(card, broadcast, *argv): raise pyric.error(e, e.strerror) ################################################################################ -#### ON/OFF #### +#### HARDWARE ON/OFF #### ################################################################################ def isup(card, *argv): @@ -584,7 +584,7 @@ def isup(card, *argv): try: return _issetf_(_flagsget_(card.dev, iosock), ifh.IFF_UP) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") def up(card, *argv): """ @@ -603,7 +603,7 @@ def up(card, *argv): if not _issetf_(flags, ifh.IFF_UP): _flagsset_(card.dev, _setf_(flags, ifh.IFF_UP), iosock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") def down(card, *argv): """ @@ -622,7 +622,7 @@ def down(card, *argv): if _issetf_(flags, ifh.IFF_UP): _flagsset_(card.dev, _unsetf_(flags, ifh.IFF_UP), iosock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") def isblocked(card): """ @@ -683,7 +683,7 @@ def pwrsaveget(card, *argv): nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -712,7 +712,7 @@ def pwrsaveset(card, on, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") except ValueError: raise pyric.error(pyric.EINVAL, "Invalid parameter on") except nl.error as e: @@ -764,7 +764,7 @@ def covclassset(card, cc, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") except ValueError: raise pyric.error(pyric.EINVAL, "Invalid parameter value for cc") except nl.error as e: @@ -814,7 +814,7 @@ def retryshortset(card, lim, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") except ValueError: raise pyric.error(pyric.EINVAL, "Invalid parameter value for lim") except nl.error as e: @@ -863,7 +863,7 @@ def retrylongset(card, lim, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") except ValueError: raise pyric.error(pyric.EINVAL, "Invalid parameter value for lim") except nl.error as e: @@ -914,7 +914,7 @@ def rtsthreshset(card, thresh, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") except ValueError: raise pyric.error(pyric.EINVAL, "Invalid parameter value for thresh") except nl.error as e: @@ -965,7 +965,7 @@ def fragthreshset(card, thresh, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -1091,7 +1091,7 @@ def ifinfo(card, *argv): 'inet':ip4, 'bcast':bcast, 'mask':nmask} #except pyric.error # allow pyric errors to fall through except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") return info @@ -1181,7 +1181,7 @@ def phyinfo(card, *argv): nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -1277,7 +1277,7 @@ def txset(card, setting, lvl, *argv): # only relevent when converting to mbm raise pyric.error(pyric.EINVAL, "Invalid txpwr {0}".format(lvl)) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -1376,7 +1376,7 @@ def freqset(card, rf, chw=None, *argv): nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -1436,7 +1436,7 @@ def modeset(card, mode, flags=None, *argv): nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -1460,7 +1460,7 @@ def ifaces(card, *argv): if info['card'].phy == card.phy: ifs.append((info['card'], info['mode'])) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: raise pyric.error(e.errno, e.strerror) return ifs @@ -1542,7 +1542,50 @@ def devdel(card, *argv): nl.nl_sendmsg(nlsock, msg) nl.nl_recvmsg(nlsock) except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card object") + raise pyric.error(pyric.EINVAL, "Invalid Card") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + +################################################################################ +#### STA FUNCTIONS #### +################################################################################ + +def isconnected(card, *argv): + """ + disconnect the card from an AP + :param card: Card object + :param argv: netlink socket at argv[0] (or empty) + NOTE: does not return error if card is not connected + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(isconnected, card) + + return devinfo(card, nlsock)['RF'] is not None + +def disconnect(card, *argv): + """ + REQUIRES ROOT PRIVILEGES + disconnect the card from an AP + :param card: Card object + :param argv: netlink socket at argv[0] (or empty) + NOTE: does not return error if card is not connected + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(disconnect, card) + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_DISCONNECT, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nl_sendmsg(nlsock, msg) + nl.nl_recvmsg(nlsock) + except AttributeError: + raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: raise pyric.error(e.errno, e.strerror) From 1af05c4ae985c9ebd002ea52438fc05e3b6d99c1 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Fri, 1 Jul 2016 15:32:44 -0600 Subject: [PATCH 066/121] v0.1.5 updated handling of nested functions --- CHANGES | 3 + TODO | 6 ++ examples/pentest.py | 8 +-- pyric/lib/libnl.py | 32 +++++---- pyric/net/wireless/nl80211_c.py | 115 ++------------------------------ pyric/net/wireless/nl80211_h.py | 7 +- pyric/net/wireless/wlan.py | 7 +- pyric/pyw.py | 62 ++++++++++++----- 8 files changed, 88 insertions(+), 152 deletions(-) diff --git a/CHANGES b/CHANGES index 8b76d8f..df6fbad 100644 --- a/CHANGES +++ b/CHANGES @@ -120,3 +120,6 @@ v 0.1.5 Begin STA associated functionality o added functions: - isconnected - disconnect + o updated nested netlink attribute handling - my understanding of it was incomplete + - still having occasional errors. intel card does not parse CMD_SCAN correctly + but alfa does diff --git a/TODO b/TODO index 61edb94..eafb3da 100644 --- a/TODO +++ b/TODO @@ -69,3 +69,9 @@ NL80211_CMD_SET_QOS_MAP - need to identify a card that supports this command and determine that pyw does correctly identify it 24) confirm download_url in setup.py is valid + 25) nested attribute handling + o parsing iw dev wlan0 link fails on nla_parse_nested(... @NL80211_ATTR_BSS) + o parsing on iw dev alfa0 link succeeds + o need to try this on the bands structure + 26) need to parse dumps NLM_F_DUMP, for now we're good with link so long as the + card is connected but it will come up eventually \ No newline at end of file diff --git a/examples/pentest.py b/examples/pentest.py index 3651db8..fd6634b 100644 --- a/examples/pentest.py +++ b/examples/pentest.py @@ -88,15 +88,15 @@ def execute(dev): if __name__ == '__main__': # create arg parser and parse command line args - print "Wireless Pentest Environment using PyRIC v{0}".format(pyric.__version__) + print "Wireless Pentest Environment using PyRIC v{0}".format(pyric.version) argp = ap.ArgumentParser(description="Wireless Pentest") argp.add_argument('-d','--dev',help="Pentesting Wireless Device") args = argp.parse_args() try: - dev = args.dev - if dev is None: + dname = args.dev + if dname is None: print "usage: python pentest.py -d " else: - execute(dev) + execute(dname) except pyric.error as e: print e \ No newline at end of file diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 7453dc4..93dd3b1 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -32,8 +32,8 @@ __name__ = 'libnl' __license__ = 'GPLv3' -__version__ = '0.0.8' -__date__ = 'June 2016' +__version__ = '0.1.0' +__date__ = 'July 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' @@ -224,8 +224,7 @@ def nl_sendmsg(sock,msg,override=False): msg.seq = sock.seq msg.flags = msg.flags | nlh.NLM_F_ACK sent = sock.send(msg.tostream()) - if sent != msg.len: - raise error(errno.EBADMSG,"Message sent incomplete") + if sent != msg.len: raise error(errno.EBADMSG,"Message sent incomplete") except socket.error as e: raise error(errno.ECOMM, e) except AttributeError: @@ -237,11 +236,12 @@ def nl_recvmsg(sock): :returns: a GENLMsg received from the socket """ try: - # pull of the message and following ack message - # NOTE: nlmsg_fromstream will throw an exception if msg is an ack/nack - # catch it and test for ack. If it was an ack, return the success code - # otherwise, reraise it. If it wasn't an ack/nack, return the message + # pull off the message and following ack message NOTE: nlmsg_fromstream + # will throw an exception if msg is an ack/nack catch it and test for ack. + # If it was an ack, return the success code otherwise, reraise it. If it + # wasn't an ack/nack, return the message msg = nlmsg_fromstream(sock.recv()) + #if msg.flags == nlh.NLM_F_DUMP: try: _ = nlmsg_fromstream(sock.recv()) except error as e: @@ -539,13 +539,19 @@ def nla_parse_nested(nested): idx = 0 l = len(nested) while idx < l: - # first byte is the length, including this byte and one pad byte - does - # not include additional pad bytes for proper alignment - alen = struct.unpack_from('B',nested,idx)[0] + # first byte is the length, including this byte and one pad byte, length + # does not include additional pad bytes for proper alignment + alen = struct.unpack_from('B', nested, idx)[0] + # two options - 1) skip parsing and raise an error or + # 2) eat a byte of padding until we get a length if alen == 0: + # option 1: raise error, treating it as unspec raise error(errno.EINVAL,"attribute length is 0") - ns.append(nested[idx+1:idx+(alen-1)]) - idx = nlh.NLMSG_ALIGN(idx + alen) + # option 2: eat padding (NOTE: we can't here unless we comment above) + idx += 1 + continue + ns.append(nested[idx + 1:idx + alen]) + idx += nlh.NLMSG_ALIGN(alen) return ns def nla_parse_set(aset,etype): diff --git a/pyric/net/wireless/nl80211_c.py b/pyric/net/wireless/nl80211_c.py index d2a1776..580a267 100644 --- a/pyric/net/wireless/nl80211_c.py +++ b/pyric/net/wireless/nl80211_c.py @@ -26,14 +26,13 @@ __name__ = 'nl80211_c' __license__ = 'GPLv3' -__version__ = '0.0.4' -__date__ = 'June 2016' +__version__ = '0.0.5' +__date__ = 'July 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' __status__ = 'Production' -import struct import pyric.net.netlink_h as nlh import pyric.net.wireless.nl80211_h as nl80211h @@ -184,6 +183,7 @@ nl80211h.NL80211_ATTR_SUPPORTED_COMMANDS:nlh.NLA_NESTED, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS:nlh.NLA_U8, nl80211h.NL80211_ATTR_GENERATION:nlh.NLA_U8, + nl80211h.NL80211_ATTR_BSS:nlh.NLA_NESTED, #nl80211h.NL80211_ATTR_MAC:nlh.NLA_STRING, # we don't want to parse this nl80211h.NL80211_ATTR_CIPHER_SUITES:nlh.NLA_SET_U32, # my own - set of U32s #### defined in kernel v4 nl80211_h @@ -316,111 +316,4 @@ """ nl80211_set_policy = { nl80211h.NL80211_ATTR_CIPHER_SUITES:nlh.NLA_U32 -} - -""" -Parsing NL80211_ATTR_WIPHY_BANDS - -A hack for extracting supported frequencies from the NL80211_ATTR_WIPHY_BANDS -libnl.nla_parse_nested does not parse the bands structure correctly - - 1) Each band( or frequency list) begins with < n > \x01 (\x01 = NL80211_BAND_ATTR_FREQS) - where n (starting at 1) appears to be the band number - - the first one seems to happen at 209 (on alfa, intel and rosewill cards at - least) - - there may be erroneous band delimiters - o if valid, the first freq is directly following the band delimiter - - rosewill card skips \x02\x01, \x03\x01 and uses \x04\x01 for UNII 5 and 4 GHz - - 2) Each freq structure appears to be listed as - - +-------+-----+-------+-------+-----------+-----+ - | buff1 | RF | [unk] | buff2 | freq data | pad | - +-------+-----+-------+-------+-----------+-----+ - 9 4 7 4 2 - - where - - - buff1 = - - +------+-----+------+-----+----------------------+ - | \x00 | | \x00 | cnt | \x00\x08\x00\x01\x00 | - +------+-----+------+-----+----------------------+ - - such that l is the length in bytes of the complete freq.structure to include - the first and last null byte.and cnt is the number (starting at 0) of the - current freq in this band. - - - RF is a 4-octet frequency - - - unk = \x04\x00\x03\x00\x04\x00\x04 if present - - - buff2 = \x08\x00\x06\x00 - - - pad = < n > \x00 where < n > has been seen as \x05 and \x07 - - 3) we can determine where to start identifying frequencies - - find the band marker - - if there is buff1 with cnt = 0 4 bytes after the start of the marker - o 2 bytes for the band marker and 2 bytes for the null byte and flag - - 4) we need to identify something other than band markers to determine where - to pull frequencies from - -""" -fSz = 'B' -iSz = 1 -fCnt = 'B' -iCnt = 3 -fFreq = 'I' -iFreq = 9 -first = '\x00{0}\x00\x08\x00\x01\x00'.format(struct.pack(fCnt,0)) -lFirst = len(first) -def nl80211_parse_freqs(bands): - """ - extracts frequencies from bands - :param bands: packed bytes containing band data - :returns: list of frequencies found in bands - """ - # get the band markers - # for each possible bandmarker determine validity by identifying if there is - # a freq structure w/ count = 9 following immediately after the bandmarker - # we have to skip the length portion as well of the freq structure. If so - # append the index (the end) of the bandmarker - bandmarkers = [] - #for i in _bandmarkers_('\x01\x01',bands) + _bandmarkers_('\x02\x01',bands): - # if bands[i+4:i+4+len(first)] == first: bandmarkers.append(i+2) - - # this works but, how do we know which band number to stop trying? - for i in xrange(10): - for j in _bandmarkers_(struct.pack('B',i) + '\x01',bands): - if bands[j+4:j+4+lFirst] == first: - bandmarkers.append(j+2) - break - - l = len(bands) - rfs = [] - for bm in bandmarkers: - # get freq structure length and parse out freq - idx = bm - cnt = 0 - while idx < l: - try: - sz = struct.unpack_from(fSz,bands,idx+iSz)[0] - if cnt != struct.unpack_from(fCnt,bands,idx+iCnt)[0]: break - rfs.append(struct.unpack_from(fFreq,bands,idx+iFreq)[0]) - except (struct.error,IndexError): - break - cnt += 1 - idx += sz - return rfs - -def _bandmarkers_(marker,bands): - ms = [] - idx = 0 - while idx < len(bands): - idx = bands.find(marker,idx) - if idx == -1: break - ms.append(idx) - idx += 2 - return ms \ No newline at end of file +} \ No newline at end of file diff --git a/pyric/net/wireless/nl80211_h.py b/pyric/net/wireless/nl80211_h.py index 3488fe8..1d606eb 100644 --- a/pyric/net/wireless/nl80211_h.py +++ b/pyric/net/wireless/nl80211_h.py @@ -52,8 +52,8 @@ __name__ = 'nl80211_h' __license__ = 'GPLv3' -__version__ = '0.0.4' -__date__ = 'June 2016' +__version__ = '0.0.5' +__date__ = 'July 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' @@ -1651,8 +1651,7 @@ * @NL80211_IFTYPE_MAX: highest interface type number currently defined * @NUM_NL80211_IFTYPES: number of defined interface types * - * These values are used with the %NL80211_ATTR_IFTYPE - * to set the type of an interface. + * These values are used with the %NL80211_ATTR_IFTYPE to set the type of an interface. * */ """ diff --git a/pyric/net/wireless/wlan.py b/pyric/net/wireless/wlan.py index 43291a1..f22be7b 100644 --- a/pyric/net/wireless/wlan.py +++ b/pyric/net/wireless/wlan.py @@ -44,8 +44,8 @@ The returned cipher suite (from phyinfo) for an alfa card is: \x01\xac\x0f\x00\x05\xac\x0f\x00\x02\xac\x0f\x00\x04\xac\x0f\x00 - which is not a nested attribute. Does 'set' mean something? I cannot find any - reference to sets, arrays or lists etc in + which is not a nested attribute. Does 'set' mean something? There is no set + or array or list defined netlink.h and I cannot find any reference to such in http://www.carisma.slowglass.com/~tgr/libnl/doc/core.html Another way nl80211 breaks the rules or another way I'm just not getting it? @@ -61,8 +61,7 @@ The only reference is in nl80211.h which says: @NL80211_KEY_CIPHER: key cipher suite (u32, as defined by IEEE 802.11 section 7.3.2.25.1, e.g. 0x000FAC04) - Looking in the standard we find Table 8-99 in Std which defines - these values. + Looking in the standard we find Table 8-99 in Std which defines these values. Lets look in ieee80211.h and voila we find #define WLAN_CIPHER_SUITE_USE_GROUP 0x000FAC00 diff --git a/pyric/pyw.py b/pyric/pyw.py index cccbaf1..08f3229 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -67,8 +67,8 @@ __name__ = 'pyw' __license__ = 'GPLv3' -__version__ = '0.1.6' -__date__ = 'June 2016' +__version__ = '0.1.7' +__date__ = 'July 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' @@ -1203,27 +1203,24 @@ def phyinfo(card, *argv): if info['frag_thresh'] >= wlan.FRAG_THRESHOLD_MAX: info['frag_thresh'] = 'off' if info['rts_thresh'] > wlan.RTS_THRESHOLD_MAX: info['rts_thresh'] = 'off' - # sets or arrays of attributes - # get freqs + # complex attributes _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_BANDS, False) if d != nlh.NLA_ERROR: info['freqs'] = _frequencies_(bs) - # get cipher suites _, cs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CIPHER_SUITES, False) if d != nlh.NLA_ERROR: info['ciphers'] = _ciphers_(cs) - # nested attributes require additional processing. They must be unpacked - # beg-endian and may not be processed correctly by libnl. In the event of an - # unparsed nested attribute leave as empty list - # get supported modes + # nested attributes require additional processing & in the event of an + # unparsed nested attribute, leave as empty list + + # supported iftypes, sw iftypes are IAW nl80211.h flags i.e. pad/flag/pad _, ms, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_IFTYPES, False) if d != nlh.NLA_ERROR: - info['modes'] = [_iftypes_(struct.unpack('>H', m)[0]) for m in ms] + info['modes'] = [_iftypes_(struct.unpack_from('B', m, 1)[0]) for m in ms] - # get supported sw modes _, ms, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SOFTWARE_IFTYPES, False) if d != nlh.NLA_ERROR: - info['swmodes'] = [_iftypes_(struct.unpack('>H', m)[0]) for m in ms] + info['swmodes'] = [_iftypes_(struct.unpack_from('B', m, 1)[0]) for m in ms] # get supported commands _, cs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_COMMANDS, False) @@ -1555,13 +1552,13 @@ def isconnected(card, *argv): disconnect the card from an AP :param card: Card object :param argv: netlink socket at argv[0] (or empty) - NOTE: does not return error if card is not connected """ try: nlsock = argv[0] except IndexError: return _nlstub_(isconnected, card) + # dirty hack - using the precence of an RF to determine connected-ness return devinfo(card, nlsock)['RF'] is not None def disconnect(card, *argv): @@ -1589,10 +1586,46 @@ def disconnect(card, *argv): except nl.error as e: raise pyric.error(e.errno, e.strerror) +def link(card, *argv): + """ + returns info about link (iw dev card. link) + :param card: Card object + :param argv: netlink socket at argv[0] (or empty) + :returns: link info or None if not connected + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(link, card) + + # if we're not connected GET_SCAN will dump scan results, we don't want that + if not isconnected(card, nlsock): return None + + try: + # we need to set additional flags or the kernel will return ERRNO 95 + flags = nlh.NLM_F_REQUEST | nlh.NLM_F_ACK | nlh.NLM_F_ROOT | nlh.NLM_F_MATCH + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_GET_SCAN, + flags=flags) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nl_sendmsg(nlsock, msg) + rmsg = nl.nl_recvmsg(nlsock) + except AttributeError: + raise pyric.error(pyric.EINVAL, "Invalid Card") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + + # link returns multiple attributes but we are only concerned w/ @NL80211_ATTR_BSS + #_, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_BSS, False) + return rmsg + ################################################################################ #### FILE PRIVATE #### ################################################################################ +IPADDR = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") # re for ip addr +MACADDR = re.compile("^([0-9a-fA-F]{2}:){5}([0-9a-fA-F]{2})$") # re for mac addr + def _hex2mac_(v): """ :returns: a ':' separated mac address from byte stream v """ return ":".join(['{0:02x}'.format(ord(c)) for c in v]) @@ -1601,9 +1634,6 @@ def _hex2ip4_(v): """ :returns: a '.' separated ip4 address from byte stream v """ return '.'.join([str(ord(c)) for c in v]) -IPADDR = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") # re for ip addr -MACADDR = re.compile("^([0-9a-fA-F]{2}:){5}([0-9a-fA-F]{2})$") # re for mac addr - def _validip4_(addr): """ determines validity of ip4 address From c44d83313baf6502ee3778f1faaf1351485ec579 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sat, 2 Jul 2016 12:50:45 -0600 Subject: [PATCH 067/121] v0.1.5 updated nl_parse_nested, added link --- CHANGES | 5 ++- README.md | 5 ++- TODO | 14 ++++--- docs/PyRIC.pdf | Bin 506702 -> 506534 bytes docs/PyRIC.tex | 2 + pyric/lib/libnl.py | 65 ++++++++++++++++++-------------- pyric/net/wireless/nl80211_c.py | 8 ---- pyric/net/wireless/nl80211_h.py | 2 + pyric/pyw.py | 57 ++++++++++++++++++++++++++-- 9 files changed, 110 insertions(+), 48 deletions(-) diff --git a/CHANGES b/CHANGES index df6fbad..b74b909 100644 --- a/CHANGES +++ b/CHANGES @@ -120,6 +120,7 @@ v 0.1.5 Begin STA associated functionality o added functions: - isconnected - disconnect + - link o updated nested netlink attribute handling - my understanding of it was incomplete - - still having occasional errors. intel card does not parse CMD_SCAN correctly - but alfa does + - There are still occasional errors see + - nested attributes are parsed as 'far' as possible diff --git a/README.md b/README.md index e71cad2..21898b3 100644 --- a/README.md +++ b/README.md @@ -63,8 +63,7 @@ persistent netlink sockets are used with the total time and average hop time nea halved. ### b. Current State -ATT, PyRIC accomplishes my core needs but it is still a work in progress. It -currently pyw provides the following: +ATT, PyRIC provides the following: * enumerate interfaces and wireless interfaces * identify a cards driver, chipset and manufacturer * get/set hardware address @@ -78,6 +77,8 @@ currently pyw provides the following: * get/set mode * get/set coverage class, RTS threshold, Fragmentation threshold & retry limits * add/delete interfaces +* determine if a card is connected +* get link info for a connected card * enumerate ISM and UNII channels * block/unblock rfkill devices diff --git a/TODO b/TODO index eafb3da..2c349c4 100644 --- a/TODO +++ b/TODO @@ -70,8 +70,12 @@ and determine that pyw does correctly identify it 24) confirm download_url in setup.py is valid 25) nested attribute handling - o parsing iw dev wlan0 link fails on nla_parse_nested(... @NL80211_ATTR_BSS) - o parsing on iw dev alfa0 link succeeds - o need to try this on the bands structure - 26) need to parse dumps NLM_F_DUMP, for now we're good with link so long as the - card is connected but it will come up eventually \ No newline at end of file + o parsing link info on intel fails on nla_parse_nested(... @NL80211_ATTR_BSS) + o parsing link on alfa and rosewill succeeds + 26) need to parse dumps NLM_F_DUMP, for now we're good with link etc, so long + as the card is connected but it will come up eventually + 27) fix tostream for some nested structures + o if the nested attribute failed to parse correctly, it will not be able to + be packed + 29) parse the information element in pyw.link - there's some good shit in it + including the router os, type \ No newline at end of file diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 6dc66daf345d659ed2bac0adfa8d9520b2d0741c..7c9e448c05d5a08a0e645d81a9aee9b279aa6742 100644 GIT binary patch delta 17417 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 delta 17566 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

$TNv0732(NLi_R3y!8WujrLjDf0?p&Ccr#w9`Z zu~0*u#*-1Y7M0)DZUl9-gt{3}Zz$B)ZyRW!hJB%tmeBYeXrfgnkYTndNoborg2ac= zoE)-A1tD3ZwV+VgmQNss^J`mCP;9E!(R!I*d5U;Jv=XVtw$0Dme|D9jeIlf#2zAgg zBovKK6ad>t;>sU@}>nP|H!5ZyIo`g_oWOtd}YpqB#CYajIHB-=jEiaYQUNn>B0 z2d|J^_EpZR?K>6zu^#$y*lmBRg&m*?4b<{qC$sG!y%?=gAkRnz!D z)0ox*rYi+zXnSUAMYEd1Y(1N!44a!1<`shZ3dsU3f1v{Lp$1>n3>NobK+@(B2ZN@G`O$Q6%al@eq%RoSkY4r}+qIvtnwe-$BfhTqUOqOE9W>;@&* z#`&XWD)?5;jwJ?Up65^-tKwnYP=t0Xry`_KV}NQ<<}?hTxpruN3y( zTHEg5VGm`=?%f3YHJ1Yl(?N}Ph)d2M=5nw{Hp5Y6#IZ;?uK4|18}&Vv(4NqVI;nu2 zQiM*ogC7*3e;*gZ86BLnT!HqS^8UPHb%86vUZkGdOB6hNS-W*bIdqj;Y_Dl9*VX+` zTE`7;CVP{6#{Nr>;<-*!PI2FW2e;k5<^5yIs;O0O!2iYmUE(iU& z$a|2h7DVa0XwJ0DE%Nq&eElFl*OMziG+aUbRVWn-zY9f9LeXPToXvAF)u047yDLe_ zb)}f3E4>QJ5FA&Q9dxn(uX>$D7tz(Y^6ZwYK)_tZ22kk+RG}2Os=1*W7o>ZRGVJ2E zLG}MYe+}}*)#Tc7we(%BD^PnG)FFPZE~m%U)2!;VAFctV$~8OyjdlRF+qeXUsVQmU zno;#!BK68O*DsPv`T2Dh>7s{m$&^FaqO9OLaVfjt1uZ|70^nM=f;JkXT_tEw*10rJ zt?Td&bkx*3k!G$-C+JG@yKWjNo$Yo#c0cB*^9=_N%sF8^4+Fl l{x2tWIV+hxUt{s+UA6S|jux(6Q$HZnB|B_%~qMhX$J5k3F_ diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index c96feae..e48fb4d 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -827,6 +827,8 @@ \subsection{Functions} netlink, determines if card is connected \item disconnect(card, [nlsock]): (iw card. disconnect), type: netlink, disconnects card from AP +\item link(card, [nlsock]): (iw card. link), type: netlink, displays +link specific details, i.e. AP details card is connected to \item \_hex2mac\_(v): returns a ':' separated mac address from byte stream v \item \_hex2ip4\_(v): returns a '.' separated ip4 address from byte stream v \item \_validip4\_(addr): determines if addr is a valid ip4 address diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 93dd3b1..148978f 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -397,11 +397,12 @@ def numattrs(self): return len(self['attrs']) def tostream(self): """ :returns packed netlink message """ payload = genlh.genlmsghdr(self['cmd']) # nlhsghdr, genlmsghdr end at boundary of 4 - for attr,v,data in self['attrs']: + for a,v,d in self['attrs']: try: - payload += _attrpack_(attr,v,data) + payload += _attrpack_(a,v,d) except struct.error as e: - raise error(-1,"Packing {0} {1}: {2}".format(attr,v,e)) + if d == nlh.NLA_NESTED: pass # we need to fix here + raise error(-1,"Packing {0} {1}: {2}".format(a,v,e)) return nlh.nlmsghdr(len(payload),self.nltype,self.flags,self.seq,self.pid) + payload def nlmsg_new(nltype=None,cmd=None,seq=None,pid=None,flags=None,attrs=None): @@ -477,7 +478,6 @@ def nla_parse(msg,l,mtype,stream,idx): # datatypes & for strings, strip trailing null bytes # dt == nlh.NLA_UNSPEC: ignore if dt == nlh.NLA_STRING: a = _nla_strip_(a) - elif dt == nlh.NLA_NESTED: a = nla_parse_nested(a) elif dt == nlh.NLA_U8: a = struct.unpack_from("B",a,0)[0] elif dt == nlh.NLA_U16: a = struct.unpack_from("H",a,0)[0] elif dt == nlh.NLA_U32: a = struct.unpack_from("I",a,0)[0] @@ -488,6 +488,9 @@ def nla_parse(msg,l,mtype,stream,idx): elif dt == nlh.NLA_SET_U16: a = nla_parse_set(a,nlh.NLA_U16) elif dt == nlh.NLA_SET_U32: a = nla_parse_set(a,nlh.NLA_U32) elif dt == nlh.NLA_SET_U64: a = nla_parse_set(a,nlh.NLA_U64) + elif dt == nlh.NLA_NESTED: + a,status = nla_parse_nested(a) + if not status: dt = nlh.NLA_ERROR nla_put(msg,a,atype,dt) except struct.error: # append as Error, stripping null bytes @@ -508,15 +511,11 @@ def nla_parse_nested(nested): :param nested: the nested attribute with attribute header removed :returns: list of 'packed' nested attributes after length and padding are stripped - Callers must parse these themselves - NOTE: experimental ATT still determining if nl80211 has taken some + NOTE: experimental ATT still determining if nl80211 has taken some propietary treament(s) of nested attributes or if this is how nested attributes should be handled - From nl80211.h - @NL80211_ATTR_SUPPORTED_IFTYPES: nested attribute containing all - supported interface types, each a flag attribute with the number - of the interface mode. - and from libnl (Thomas Graf) + From libnl (Thomas Graf) When nesting attributes, the nested attributes are included as payload of a container attribute. Attributes are nested by surrounding them with calls to nla_nest_start() and nla_nest_end(). @@ -526,33 +525,41 @@ def nla_parse_nested(nested): | Attribute Header | Pad | Payload | Pad | +------------------+-----+------------------+-----+ - Looking at nl80211 nested attributes, it appears that inside the payload - there are no dataypes or attribute types, with each nested atrribute as: + It seems that a nested attribute (after removing the Attribute header has + the form: - +--------+---------+------+-----+ - | Length | Payload | Null | Pad | - +--------+---------+------+-----+ + +-----+--------+-----+---------+-----+ + | Pad | Length | Pad | Payload | Pad | + +-----+--------+-----+---------+-----+ - where length is total length of the nested payload exluding the pad bytes. - """ + where Length is the length of the nested attribute (not including padding + placed at the end to align the attribute + + """ ns = [] - idx = 0 + idx = lastidx = 0 l = len(nested) while idx < l: - # first byte is the length, including this byte and one pad byte, length - # does not include additional pad bytes for proper alignment + # first byte is the length, including this byte, length does not include + # pad bytes for proper alignment alen = struct.unpack_from('B', nested, idx)[0] - # two options - 1) skip parsing and raise an error or - # 2) eat a byte of padding until we get a length + # three options: + # 1) skip parsing and raise an error + # 2) eat a byte of padding until we get a length + # 3) return an error code along with correctly parsed elements if alen == 0: # option 1: raise error, treating it as unspec - raise error(errno.EINVAL,"attribute length is 0") - # option 2: eat padding (NOTE: we can't here unless we comment above) - idx += 1 - continue - ns.append(nested[idx + 1:idx + alen]) + #raise error(errno.EINVAL,"attribute length is 0") + # option 2: eat padding + #idx += 1 + #continue + # option 3: return what we have + if not ns: ns = [nested] + else: ns[len(ns)-1] = nested[lastidx:] + return ns, False + ns.append(nested[idx+1:idx+alen]) idx += nlh.NLMSG_ALIGN(alen) - return ns + return ns, True def nla_parse_set(aset,etype): """ @@ -691,6 +698,8 @@ def _attrpack_(a,v,d): elif d == nlh.NLA_FLAG: attr = '' # a 0 sized attribute elif d == nlh.NLA_MSECS: attr = struct.pack("Q",v) elif d == nlh.NLA_NESTED: + # should it be '\x00' + struct.pack('B',nlen) + '\x00' ? & the + # pad at the end of '\x00' needs to be removed for nested in v: nlen = len(v) + 2 nattr = struct.pack('B',nlen) + nested + '\x00' diff --git a/pyric/net/wireless/nl80211_c.py b/pyric/net/wireless/nl80211_c.py index 580a267..16e92a9 100644 --- a/pyric/net/wireless/nl80211_c.py +++ b/pyric/net/wireless/nl80211_c.py @@ -309,11 +309,3 @@ nl80211h.NL80211_SCHED_SCAN_PLAN_INTERVAL:nlh.NLA_U32, nl80211h.NL80211_SCHED_SCAN_PLAN_ITERATIONS:nlh.NLA_U32 } - -""" - set definitions - NLA_SETs are futher defined here -""" -nl80211_set_policy = { - nl80211h.NL80211_ATTR_CIPHER_SUITES:nlh.NLA_U32 -} \ No newline at end of file diff --git a/pyric/net/wireless/nl80211_h.py b/pyric/net/wireless/nl80211_h.py index 1d606eb..7369dc8 100644 --- a/pyric/net/wireless/nl80211_h.py +++ b/pyric/net/wireless/nl80211_h.py @@ -2668,6 +2668,7 @@ def nl80211_sta_flag_update(mask,setto): * @NL80211_BSS_CHAN_WIDTH_5: control channel is 5 MHz wide */ """ +NL80211_BSS_CHAN_WIDTHS = ['20','10','5'] NL80211_BSS_CHAN_WIDTH_20 = 0 NL80211_BSS_CHAN_WIDTH_10 = 1 NL80211_BSS_CHAN_WIDTH_5 = 2 @@ -2740,6 +2741,7 @@ def nl80211_sta_flag_update(mask,setto): * indicates the status the interface has wrt. this BSS. */ """ +NL80211_BSS_STATUSES = ['authenticated','associated','ibss'] NL80211_BSS_STATUS_AUTHENTICATED = 0 NL80211_BSS_STATUS_ASSOCIATED = 1 NL80211_BSS_STATUS_IBSS_JOINED = 2 diff --git a/pyric/pyw.py b/pyric/pyw.py index 08f3229..bb85ffd 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -1591,7 +1591,17 @@ def link(card, *argv): returns info about link (iw dev card. link) :param card: Card object :param argv: netlink socket at argv[0] (or empty) - :returns: link info or None if not connected + :returns: link info as dict with the following key:value pairs + bssid -> AP mac/ net BSSID + ssid -> the ssid (Experimental) + freq -> BSSID frequency in MHz + chw -> width of the BSS control channel + rss -> Received signal strength in dBm + int -> beacon interval (ms) + stat -> status w.r.t of card to BSS one of {'authenticated','associated','ibss'} + or None if the card is not connected + NOTE: if the nested attribute was not parsed correctly will attempt to pull + out the bssid """ try: nlsock = argv[0] @@ -1616,8 +1626,49 @@ def link(card, *argv): raise pyric.error(e.errno, e.strerror) # link returns multiple attributes but we are only concerned w/ @NL80211_ATTR_BSS - #_, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_BSS, False) - return rmsg + # some cards (my integrated intel) do not parse correctly + info = {'bssid': None, + 'ssid': None, + 'freq': None, + 'rss': None, + 'int': None, + 'chw': None, + 'stat': None} + + # ensure it was parsed correctly - we can (possibly) hack out the bssid on + # failed parsings bssid appears to be the first attribute returned by the + # kernel + _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_BSS, False) + for b in bs: + # each attribute is pad | index | pad where is index identifies nl80211_bss + # enum parameter + try: + i = struct.unpack_from('b', b, 1)[0] + if i == nl80211h.NL80211_BSS_BSSID: + info['bssid'] = _hex2mac_(b[3:]) + if i == nl80211h.NL80211_BSS_FREQUENCY: + info['freq'] = struct.unpack_from('I', b, 3)[0] + if i == nl80211h.NL80211_BSS_SIGNAL_MBM: + info['rss'] = struct.unpack_from('i', b, 3)[0] / 100 + if i == nl80211h.NL80211_BSS_INFORMATION_ELEMENTS: + # after removing the length, the first element in the ies should + # be the ssid following the pattern \x00 Date: Sun, 10 Jul 2016 08:34:56 -0600 Subject: [PATCH 068/121] v0.1.5 fixed nl_parse_nested, fixed issue #7, added stainfo, see Changes for additional --- CHANGES | 12 +- README.md | 76 ++++- TODO | 56 ++-- docs/PyRIC.pdf | Bin 506534 -> 506717 bytes docs/PyRIC.tex | 27 +- examples/info.py | 18 +- examples/pentest.py | 2 +- pyric/__init__.py | 14 +- pyric/lib/__init__.py | 2 +- pyric/lib/libnl.py | 66 ++-- pyric/net/if_h.py | 1 + pyric/net/wireless/nl80211_c.py | 5 +- pyric/net/wireless/nl80211_h.py | 5 +- pyric/net/wireless/wlan.py | 24 +- pyric/pyw.py | 574 ++++++++++++++++++++++++-------- pyric/utils/channels.py | 2 +- setup.py | 2 +- 17 files changed, 645 insertions(+), 241 deletions(-) diff --git a/CHANGES b/CHANGES index b74b909..15417f7 100644 --- a/CHANGES +++ b/CHANGES @@ -101,7 +101,7 @@ v 0.1.4 o modified devadd. User is allowed to submit a Card object or a physical index o removed hardcoded values for covclassset, retry(short|long)set, retsthreshet and fragrthreshset - - constants now defined in wlan.h + - constants now defined in wlan.h (see below) o removed return True where redundant i.e. when setting mac address we can assume it worked if no error was thrown o renamed ieee80211_h to wlan @@ -121,6 +121,14 @@ v 0.1.5 Begin STA associated functionality - isconnected - disconnect - link + - stainfo o updated nested netlink attribute handling - my understanding of it was incomplete - - There are still occasional errors see + - There are still occasional errors - nested attributes are parsed as 'far' as possible + o reupdated nested netlink attribute handling - this time it really works + - nested attributes are now parsed correctly, any errors are a result of + incorrect packing on the other side or packet corruption and the entire + unparsed attribute will be returned. For wiphy bands, the legacy frequency + pull will be used. + o parsing wiphy bands (issue #7) is now fully functional and no longer relies + on a hacked fix \ No newline at end of file diff --git a/README.md b/README.md index 21898b3..214c8f5 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,8 @@ ATT, PyRIC provides the following: * get if info * get dev info * get phy info +* get link info +* get STA (connected AP) info * get/set regulatory domain * get/set mode * get/set coverage class, RTS threshold, Fragmentation threshold & retry limits @@ -247,10 +249,11 @@ True >>> pyw.isup(w0) False >>> pyw.up(w0) ->>> pyw.isblocked(w0) +>>> pyw.isblocked(w0) # returns tup;e (Soft Block, Hard Block) (True,False) >>> pyw.unblock(w0) # turn off the softblock ->>> pyw.block(w0) +>>> pyw.isblocked(w0) +(False,False) >>> ``` @@ -340,7 +343,7 @@ card Card(phy=0,dev=wlan0,ifindex=3) 20 >>> pyw.devstds(w0) ['b', 'g', 'n'] ->>> pinfo = pyw.phyinfo(w0) # returns a dict with 12 key->value pairs +>>> pinfo = pyw.phyinfo(w0) # dict with 12 key->value pairs see info.py >>> for p in pinfo: print p, pinfo[p] ... >>> pinfo['retry_short'], pinfo['retry_long'] @@ -370,6 +373,20 @@ u'set_channel', u'set_wds_peer', u'probe_client', u'set_noack_map', u'register_beacons', u'start_p2p_device', u'set_mcast_rate', u'connect', u'disconnect'] >>> +>>> for d in pinfo['bands']: +... print 'Band: ', d, pinfo['bands'][d]['HT'], pinfo['bands'][d]['VHT'] +... pinfo['bands'][d]['rates'] +... pinfo['bands'][d]['rfs'] +... +Band: 5GHz True False +[6.0, 9.0, 12.0, 18.0, 24.0, 36.0, 48.0, 54.0] +[5180, 5200, 5220, 5240, 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, +5580, 5600, 5620, 5640, 5660, 5680, 5700, 5745, 5765, 5785, 5805, 5825] +Band: 2GHz HT True False +[1.0, 2.0, 5.5, 11.0, 6.0, 9.0, 12.0, 18.0, 24.0, 36.0, 48.0, 54.0] +[2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, +2472] + >>> pinfo['freqs'] [2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 5180, 5200, 5220, 5240, 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, @@ -433,10 +450,61 @@ True >>> ``` +#### vi. STA Related Functions +I have recently begun adding STA functionality to PyRIC. These are not +necessarily required for a pentester, although the ability to disconnect +a Card may come in handy. The difficulty is that iw only provides connect +functionality through Open or WEP enabled APs which means that I am +attempting to determine which commands and attributes are required. If all +else fails I will look to wpa_supplicant for more information. ATT two +two functions related to STA->AP exist: a) determine if the Card is connected +and b) disconnect the Card + +```python +>>> pyw.isconnected(w0) +True +>>> pyw.disconnect(w0) +>>> pyw.isconnected(w0) +False +>>> +``` + +From a pentester's point of view iw link provides information of limited +quality/concern but can be useful at times. As such, link has now been +implemented. + +```python +>>> link=pyw.link(w0) +>>> for d in link: +... print d, link[d] +... +stat associated +ssid ****net +bssid XX:YY:ZZ:00:11:22 +chw 20 +int 100 +freq 5765 +tx {'pkts': 256, 'failed': 0, 'bytes': 22969, 'bitrate': {'rate': 6.0}, + 'retries': 31} +rx {'pkts': 29634, 'bitrate': {'width': 40, 'rate': 270.0, + 'mcs-index': 14, 'gi': 0}, 'bytes': 2365454} +rss -50 +>>> +``` + +NOTE: the rx gives additional key->value pairs for bitrate. Depending on +whether the Card is transmitting (or receiving) 802.11n, the bitrate may +include values for width, mcs-index and guard interval (gi). If we look +up these values in Table 20-35 of IEEE Std 802.11-2012, we see that at +40 MHz width, an mcs-index of 14 with a short guard interval (400ns) +gives 270. + +One can also use pyw.stainfo to retrieve only tx/rx metrics. + Read the user guide, or type dir(pyw) in your console to get a full listing of pyw functions. -**** vi. Miscelleaneous Utilities +#### vii. Miscelleaneous Utilities Several additional tools are located in the utils directory. Two of these are: * channels.py: defines ISM and UNII band channels/frequencies and provides functions to convert between channel and frequency and vice-versa diff --git a/TODO b/TODO index 2c349c4..5f9e351 100644 --- a/TODO +++ b/TODO @@ -1,30 +1,15 @@ -1) add a cli -2) rfkill - unblocks/blocks all devices (as does the cli rfkill) Is this an - an ubuntu, kernel or overall issue -3) parse NL80211_ATTR_WIPHY_BANDS (have workaround currently in place) - - after figuring out _CIPHER_SUITES, may be able to get a solution for the bands 6) find a better way to get supported standards of a card + o once complete phyinfo should give us enought data to determine the standards + the Card supports 8) Two commands that would add information of minor value o ethtool. uses ioctl but does not follow same pattern as ifconfig seems to use - ethtool -i gives driver information including firmware-version - ethtool -S gives some statistics on rx/tx - o iw dev wlan0 link returns information related to associated station. It sends - two commands the first is to initiate a scan, the second is @NL80211_CMD_GET_STATION. - The return from the kernel is a @NL80211_CMD_NEW_STATION, one of the attributes - is a @NL80211_ATTR_STA_INFO - - What is this? Looking at nl80211_h line 1648 we find the definition for - NL80211_STA_INFO - this has to be the corresponding data. Doesn't work, there - is something I'm missing but cannot figure out - - iw requests info on the BSSID, can we request the info on any STA? - - Line 1806 These attribute types are used with %NL80211_ATTR_STA_INFO - when getting information about a station. + and udevadm (does what hardware.py does) 11) tried NL80211_CMD_GET_WIPHY, setting _WIPHY_TX_POWER_LEVEL but did not return the current power level - currently cannot find anything in nl80211.h that could be used to get tx power - 14) look at udevadm info --query=all --path /sys/class/net/ - o has devie driver, name and some other details but appears to get these - the same way PyRIC does 17) distro tests o openSUSE o RedHat/Fedora @@ -33,8 +18,6 @@ o CentOs (?) o slackware o dd-wrt/OpenWRT - 18) port structs from new nl80211.h - 19) iw is showing a command that doesn't exist 21) look at NL80211_CMD_START_AP - no need to try and recreate the wheel by replicate hostap but could be useful 22) txset @@ -68,14 +51,29 @@ - If this command was being returned, pyw would correctly identify it as NL80211_CMD_SET_QOS_MAP - need to identify a card that supports this command and determine that pyw does correctly identify it - 24) confirm download_url in setup.py is valid - 25) nested attribute handling - o parsing link info on intel fails on nla_parse_nested(... @NL80211_ATTR_BSS) - o parsing link on alfa and rosewill succeeds 26) need to parse dumps NLM_F_DUMP, for now we're good with link etc, so long as the card is connected but it will come up eventually - 27) fix tostream for some nested structures - o if the nested attribute failed to parse correctly, it will not be able to - be packed - 29) parse the information element in pyw.link - there's some good shit in it - including the router os, type \ No newline at end of file + 29) figure out how to parse the information element in pyw.link - there's some + good shit in it including the router os, type + 31) add VHT processing to sta_info bitrate + 32) should we move wraith.standards.mcs here? It's only used once in PyRIC but + might make more sense here regardless. If so, we need to fix the "Table" IAW + IEEE Std 802.11-2012 Table 20-35 + 33) seq. # out of order error messages when preceding (persistent) socket.send + resulted in error + 35) iw connect (on open) returns status of successful connect but card is + not connected -> move to wpa_supplicant to see how they do it + 36) do we need to write a find nested attribute? so we don't need to go iterate + a list of attributes to find one + 39) parsing wiphy_bands + o _HT_MCS_SET: a 16-bit attr containing the MCS set as defined in 802.11n (find this) + o _HT_CAPA: as in the HT information IE + 40) look at packing netlink messages to ensure nesting still works + 41) would it be worthwhile to have nested return a tuple + t = (index,data) + instead of the function calling pulling index out, then parsing data? + 42) is there a simple way to set the format strings as constants keeping in + mind that things like strings require a length in the format string + 43) add nameset (iw phy set name + 45) find out if some the 'flags' for bands are actually supported such as + HT40+ which should be disabled for channel 11 \ No newline at end of file diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 7c9e448c05d5a08a0e645d81a9aee9b279aa6742..c245af6f6e308b45c3d7a3e7c3adf332923caf91 100644 GIT binary patch delta 25801 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 E0LdpG8UO$Q delta 25575 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

)ITn|6m_iTiLU zl*I{7Ou!@TMdJq!whr<&yb7M()Hx4CXR@3nC4A&LwLR{-1fXUu%?;@qkukK5D`qyy zuEu&vHYn#z0-`mu2E;&vaX9^x7Jfkq1q7mK1yHs4?62TBIDT!z5)WE@haT7pfO!zc z8IHqZm4mjey!BELWgspe|BYEIC3#ZY@>r{ZHckq96PWhO?hGD@H#kjG&%(fnMOZsY z@CY6(GxYhMp~1=aKy~(xRsZ)Hu6Uib!KS#YBkwxo6;R+n^O9mgQ$_i>?-L*j{FYoM6_6RU5PFp#kz*&zQB1vi4 z-#x<0K1GV5`y1A*@tM~bvFSYcgdqGVVO8L6O51-H^YqPM79SR9by==PS)SLxmE2JBzP|^ zEiEtEEJ_{{75!$I?o{oo_Tc`h#7GmRBtM0x&Q@}`-z>qAjwoG(H?N}FK4>bAxCd(u z-@vBoi>K>gqReDYRv!AR zVg#~4L)QSmVW2UAUpxO$LKx^npbOkT@&-K=eVY(0G&?A;1|AxtEgTM-3KWQd_)i>w zhn58e8X)}>Nf4n0L4k$H|0;}N{hM?S5;P&e z6xe|CuTW9w-;g`8h_g`ZP%+L(LyZpectyVm>T`|d-j~O*38@?h5kgGl7rlj z2Vex(WYBBG*Bul>1dSI8OCuKr6c2(BrUIpzD8Q~mD4{KgBx=yC8WmImg2<);yQVxr zVL^;hgLXdAf_5rtKoe|qpiDC@)B}Qu`!@jMbWmjof&d1Bc`u-z5X2z}BIseDmyQfj zqQd{=T??Z2LeLt7 zurTO5+bbvz1VJSNa@2&OBM2!`kjNk!ToVD~F=;859!L(#yRmIU#t2{51v39y>~N`awvNJ8Nd1fdM5c&rT$Igd1S z4YB(VWsm_YNmvd_)Oarg6@ws7UW3D#XAEU-43L8oKoDXIpio{Rm~cP=iiuc|hgu_U z{?TY|z}Xk90QE=AD}nA}DME)Jh>yx3=RgVcicJ+H)+$5&AqZPF5ENI1GW^FnL8HGK z)CYo)(E#0iO$C-br~1FCSf>g4psxWn0xOjmWYH*r)90@ylnR1a)&{MuvOq!6WMiPNcl%(Pm&YBc}g%Tkr+ z%9*40T1J_Y*$$W_`KoNR{46KtF^rp3m1mowDF743LnAkg|2ktFW1l!vLsD~E1$}rM z|5J~SL%TequF?nO^ZGdN`!I)vmv2b8<=>GCtm#BGF?nGywJ>e8Yh{i}4-_jik}Eoq z2o{Q^;Y*qECNC0Fg)!pxO0`SAe{T9?S5iSUWB@N5;}lkhq+TFi5_2c`DK_Q~wn~1@ z@(8>Dx;f2=2c_#ES-7-NQ)?g7_dIK%NeUFoKc+R?rvQ-{SgqII2M&n4ra zPfI=hQz#XK^8zZs-CHTG3T>SokdRe-5%FBMF4*UtaLxv(Mx3$-@Kd2^lXL-}NCfnzu zW#AhSvd+&K8DjAD{$#tmszZ6O7x)ttY2(kbf4H2zJj;*x;{upx`aI@%SN%E=ZMnHU zZz->OxcXgpYth_teO`uWo(sed`J^VA>7BPRIr1e@K{*xv!zDmPb|{_=i9trKFl+hO z!_DENNtcgIm8aY3%IeVyt#V3V^hEwuT0Y zrsk5CyMM*h{(H6U^dTbWP=4f;Rj|VKeeHqZM7S@b@$o1{??BbHFKJ{^zzZt$KEq}_ zof%KLd|OY}=E8(&1cmn`Wb)UJYMSp~?gD@-6QalU!I$g;X{KGc9%-ut$z2C((Pqo{ zn^&MGl|deH_ulhRf8tOD9eDMA_;2;(iYKb}Cs*D-c?&f!tlzK8kzRzVE>LGAu3op5 z%C-F%-5(Z7va)^fSd&c-=iGu4=exJa z*Y4DtwvU@DOP{+E0?4}NO^Xn6Gyw^TzqdlEUX@}VX|Gtai@H5*6{-OuJGSS&7&mVM z)f4{8I6q2G6ifY9yh5AEBze%1NR*d&Z;S3g|2sFw`@5*-wm&j#OPH~A^lBiN&2^~!9ACjSU0M67mJJ*tV2M2U`N|ETlirRg=%pk z=!iX=;M?Emrf*B8*?j4Dn0<2`=~j#$>>~a0@i*ylO5=LA{eA=sOX+XlY3c3zIht(o zF_W~6R(3o-#N={g-tjAVBdQxUR)+tGEd~0ViyROwg>X&%O$b}IzNFjx5U1fA>6iKw z%V$9=XQkBH2fYo@yl*0KV|Y4uuFBG)G_bta6zcEmyW@K*?8VWxeXQ!6k~=rvdO6gd zqlao5fB7j+tyRJHOGb7k|L;1sZF-77pI84nuHx2v`MbH^ZJ(_-`F4DVMIyVqki_pl z-A6%vcdy4`Vd|~NzT4ns-(r@jt>lU}C)ajLa9_Vj1TEeJv@exhbpO%^eAYEW9Q(`o zg_?ND)tk66CY!($X1s~?Y#YWruqChL=%k;BkI6l<2FnLLS%ZqdNxym$HI?whqQ*f; zJWS{r)a>?g5rB={_tK?p*Ll`&vemys8viy@Y>cz#(;`MLCY*Pv{~{&)NUr8?b^5$bL|tKb`o9dWewiqt1V zNRr3q#c|#=Pcb_&4~m7&KCO0#_rT&_m3*cNMvqgr#|e2Rj)7d0kVq}y5nZYkX+-2T zjcMckL|kC+=0q@*=RqB9liB4Wtzfdc2j>skd*9@TL*PUUjsAt2*+v%y>GwQAu4sEiQ!CchY4%hU^1?Y`9YD>}y`vrOwtkJ&| z??O35M}Wh_`Q2^mXlG~taMTbU@Hho^>aBgX4Fmv*#-wqHZO*e$<|Mkw7n zu5AV9OtK)82bdW)&oTu`Q-{XgJ91cUY-%zxp}F*xw}!~W({y&!zA?l@&RvZk{BG@*g~5@a?h zd2wBCdFC+|t^<*nJew~f$bOn-aQ>Q@GWFnJB7MJZ+f1{7DPTHstG0C0fp~joUlCLR z9-0^2*Ur2hLJ{nNKK&Y%Nnf4HQ=v8#d*BZ=@6h#PIx3)Y562UmF=XCf8*FI!D}?TG z7ZlGn*Ht&@G9S*=FZqvpdYM`^E*b4b+ecvWOprDSNR?-^8vfoKs6&*0*^+DD^7G^^ zb3@(NUkM3pj%q8Ky)%CD!bUAOpNCGol7_oCBo&WyHql$7@X6q<+dH=n#xQP5MixeZ zCD$(E1^$5R6LlCtzbkDXXXTzaVztweuTS*nxn*9551Uk_f+k7Qjy&8gOv+eu%tkEr z$A(>x3}tSTd`iX?eq>TnxvJz*&_`(}O^Rf`)P3mB1_AhnhPV>ejDLIN28|s@?s^+@ ztbwiIhbcqhUXL^)HC8-5x@zg9{LUue;M0uA?8a16|19BDmM!h9t2C}uwz_{d0|@~# zQByu7REUmrm^g6m?B6fqb>b}{c1J>k8o~Gx5>=Pln!< zD9eW?kJX!E)u5M>SrGL6YZMj)FG;~hZb6W0o;-()C-vqXrU$`S#`~i1qeb6z(xg(| zx9D3nVI@>}bRWg%(Z@9!F}`=qIZ8LoGk?1@v~x{PDE^AD zKlFZpb5XY^kR}2qa&a48MFL2&>1W%-(YbFaqRRY}$SW5UPicxgSZ#&9t64wtCHy`vWx`hXg^J7d)LcS60tyj$RqG8{(cgcYBta{97n~>tk zw-DPeaG|3cGD2?VuD%Qz*jzk`-*Ib6gS@5F^l_^IG5NR^<+J!D1voLey+mTT>`^57 zvv@nE1Q1Ff10j~1H@+r+dyiXp%h&wI`Mb|7T!D!B-c_vH*yp4+BvQOX>=9NO#+Vjh z^RA&qt<_sabF;3Tl>gw-M|yFuDm-H1czj(`LyV5W%8gGy%dpSk@FgXovQ8gX)-iD* zh;^SflUTOTF@_p@YtFu$A68>BQd}id`4D8Y9j{`I{M(h|?;-0>efxPx_K(egW-;G8 zz@Di!N6F`Ij%QiSP>6&%Z3yPToxddh(0FFF1`&D2hsZtZm zWBK&U^ac40Z)(Y(jrB&IblKZ)`Ckr}=ljg>O!xHV+)Eh+*`F@*S}GL`f5rap-co+) zC4N(`7n?;MKpe>87r=kKoz;s5%J0by) z_(d9`J8ZK+yXRi8TsFcubXD@eFoJR}7UCr5<>V$>;>hA&>qzxbSCSATyq-Zpt@YD`DDZ zy!cuGdg!ZDS|;^C;$1)sA!9SwLXq20auhq{%z{`GH6wFwEMe~&;$X%3NibcAxc<8L zQCOX%u!%x{wje3WA)P>Tigkw?Fn|w!^Uxo5e_6mTh3DW!6ho2ag@+Mc;`q8q!NDV$ zzI0e2tB8*QU)@R7Ibfz<{3sm!`O0McY}0u+OU_7IOHnbmIF&HEB(?5Oj(7JflIf1= zrV=wscXbiHmkvMS3R7A7VsXQjG<`O+IF_~hk!}LH@{0yFbrtizadTNfzS9pusm0{8 zhz1x5rjrso`9iu8cO6?iDL->C-bSBS4&DZ8aW3jPa0d?6sh%z zkGUavhTN&_nWX%EDmELrvEaF0BwqbXBjv>Sh*-5~68)!7J^Y!l`QPH&XXA!;JEeSg zZL%q}+-{&rpf@h$*uj_pG^jB*f`8}!9@Zy;2RNy{a`DROY!SN5beKVkE?X%LfJB00=Bx$BK; z^Gm5(8C@$nz_|$XXY!O!*X3t+?5~8=c2-Pf;{zI6h3|_?WM3$$$IGS{kjHCkY7^-z z@~os3mBp~iz|*Rq0p`asMQ`Kw|NQLlWSRKL%2+stY4SexYp`yS)jDm;o>l}4W0R!` z%$ReJx|_R1TEky&&W=KhjtLz(P2NJXErs+Vsi!*fWrWB}u7l@Hu{{C|#VvQ*M8%b9 zhi~wCBWk{N;Uza$M4`^RhFMw0O_;=~FT`>w25`wT873rs-2%}5J(c6|x`y?2I4$A^ zFhCe7rO+CMzAtJVyk9dUnoIF+o^}#=ra_{bCDtw4`o(iU>;>kw+a4m#?dm%-K^OXYtjmTDdLuhus407UXsVJ9D~P8^ zUcVO!qGsK8b31b{p*NL1T&5udE($t{y=b>*aJ0Rk(!k^e(Wx+bZL=p(dRqn{Jidmn$2j;DGcPT^l8 zUsq|0@TI7Hz7pXW)d-?a|3$kZ9ObLm$noDaMIbvu6srN^kN)sfL?>d@D4EKCLQuR#j0v@LGYCL2J@2den3Ooc@IV zl?r?wI4!HI;j~KaO7~OY5L{}u!kV%PwioLd6a5s31oaZbE$`@2!Ed0MJ4${*9LawG5L8gr6+( zBV#dx3H?R_!M->_@n7j)yeHs28xS*TnVP{&fX-V`Q}zjIjWcqv;Dc46-X;ae5v_S( z!`uIb4?cd(bin4_b$_I{C^jrI3sk$@SIqegW$Y6b?BjhWBYa)sGAoB%J{W})6v#+R?z^f+6_prbL zz50)jBL^LX^^Vbc4l~JXLDD!UI2SW{+!}uL^=}25@7BB(iG`vlstk@? zVrQbC2nPYT2_4Sr$TB9T52v5Y_i2J!yL*u2Ysf?cwkW`*v7^(^`#v4OqiDC9Zc`|Q z%TZ;}Llw2dWn;ZoOb`TpeYE2+m|d5Dw(;@uY->5O#Ra(k{kgmaFzva%BTti`Tpf9Y z5;7hj@`F(bz=h@ajNk^BTPn1H0wG@uF0u1eL&ecJxw*J`1-N(-0o727|HE>tp=l67 z#7ZEP0-;s|ZVf=LQJ8@bDa#HNT)5$X&Ivu{HR6h<#lpl7z$56qSZ-MjVMZkhdK~p_ zHpSvM7ayiyesfiP77;!^B>#(ys)pVdcWjjbYZo<@n3iHpC*;%&+(+mlhnT#ZB>&P0 z^Zt^A8)hLV7iW6E0$V)`GF(}5*3>m}n>ed$I{FJ366FX&{!(R`EioDK zyABA>Rv<9LkApJRqwFlPZ7}#{HlXC-#f`2X@p>JW1)s;9s9PVXScwls;?FLhS}j%* z=u}rT+IwJ;^9KRK#c9$5%-FG7t3-+4it-0L_-ekGOj4dMN%%K|4s6T=& zRfmto6}iR5?>UM&EV8+qXMPnXS!duB?rhxZ?tVUE?~bP?Kz?1~KgLTaiB)FP7}=?P zj$QXr+@N^@IYK&4FvHnSR7p=sPtHJ9y&5`6H7*h&yxb$C$u)Mc)=|rUgU;|fiY~I^ zWzO9*GvX6q*HE@-r^a=ZhF=TW7{l7x%EQy$+T7_M6C`rca?)yGa40z2xPTb<|6h{ zo(KP^Vejo=WR4*{dpX4)8*4$|W4x9kLvUZ~s{Vabk8-UACu{6Q=p7K7O!po6h1lir zL_sRLY~JxOH{Aqsx%I70Dx>2&H^ac%9N!gW0*)IS6!jJ4l-L`tw|C4jb_8$Q7XS@? zE$%M9owv1RB^K}Owcql{YVmYYlf12sC~cHTFii+OHO9Ym4tWWNajO!1374aazbi|``{Oa(}eZXIp_(xmjol< zTQ1Ete6DO?WC#;{xF|kO>^`M80%c?G0IWJ!X7+&PS>7InuJnOQ66EsDM#UFSM%* zBzlFpoJ9}13O@r><3ds}ZkdMvPMHXZkhL2=vBmg4|J&7>C+87~J*=}M{&l<27l;^g zk9U(N1v`t5?%xwNj2`Xq%`DW8AdH|OH2%Hs!>(7wyh~Xq9eaQaN#w7=ZmRQ~iqd73 zFfqcDfSAp|;?dAg$FI@vx{HvnrB+LhjK68zf6v2ljok3EUE}( z$HHg~rBirlp{JAKg*VtynGgm(?Trp$!-KAIJ+y2WgxlG_L5^*J&6^rJz*B?B=x!x5 zFcn~i<#HSwVn^Z(JnBzER#Ik@& zq62Af=^Zj#z6tZo^zfUTU#R3I=6H5Ru$S5qRux~l$ZWEc!uYHO!MDut!1KjB7Q51M zlaH_GbXfA?JF}lOUcWJ{C^Rt0el(TL^tW=r6nm?r-rCEKvDwa1$8To`6 zrH7ftM8h{!Hv99?pVfk3`I6jfgLzfrtYfRsjyf6q!jjiCt#2h&OYW6R8}%Zs ze#q)67S{~&Zk~>shvQqpwC5|!aLS?Gu8xLJ zbLfzGq;A;&uR-1C@M5Og66Ii1dC_n2UmlWTN4Ve2t~WmJ?Rgcog*xgkN&76 zgh2iyZ)mKLfS4=Fg3`}hrI=~!O5}iWe+Qswb-sL|!trPR{*=XS?e?ju7a+CY^kdix zSj(+x40`vgY3#s>N|i`BKrT8}1*O5KbmbyfW9#9GuQ*Br4$XCjH@-dH@|>8L0F9$$ zB9q5OG$xBv+yB>i;D=w%p8YJ@E*c76YJEN`#{_tZH2 z=}jfA?E(>g__fMz3?YG$TBTm=m}&3hyJG`fE{LLyBop6gT07eNrGrXV*sKhff^H>2 zDuY1f(^tF94;_16#KzLP8_YF^mG1AF(6x8O;ff)#*Z5@~63u!)tIMx3rpR&JHi6jk z;rfmBbK?(}`Ob#&v_X~BpZj4BI_L8^v%wl$%15LhTS8vJyzGLA5$_hv zuzm>0q5l9g$rQ7U@~g582 del), type: netlink, deletes card \begin{itemize} -\item isconnected(card, [nlsock]): (iw card. info | grep channel), type: +\item isconnected(card, [nlsock]): (iw dev card. info | grep channel), type: netlink, determines if card is connected -\item disconnect(card, [nlsock]): (iw card. disconnect), type: netlink, +\item disconnect(card, [nlsock]): (iw dev card. disconnect), type: netlink, disconnects card from AP -\item link(card, [nlsock]): (iw card. link), type: netlink, displays -link specific details, i.e. AP details card is connected to +\item link(card, [nlsock]): (iw dev card. link), type: netlink, displays +link specific details, i.e. AP details that card is connected to +\item stainfo(card, mac, [nlsock]): (iw dev card. link) type: netlink, displays +tx, rx metrics of the AP that card is connected to \item \_hex2mac\_(v): returns a ':' separated mac address from byte stream v +\item \_mac2hex\_(v): returns a hex string corresponding to mac address v \item \_hex2ip4\_(v): returns a '.' separated ip4 address from byte stream v \item \_validip4\_(addr): determines if addr is a valid ip4 address \item \_validmac\_(addr): determines if addr is a valid mac address @@ -842,14 +845,20 @@ \subsection{Functions} \item \_flagsget\_(dev,[iosock]): get's the dev's interface flags \item \_flagsset\_(dev,flags,[iosock]): set's the dev's interface flags \item \_iftypes\_(i): returns the mode corresponding to i -\item \_frequencies\_(band): returns a list of frequencies from the packed byte -string band +\item \_bands\_(band): futher parses band attribute returns dict of bands +containting rf information and rate information +\item \_band\_rates\_(rs): extracts list of rates from the unpacked rates rs +\item \_band\_rfs\_(rfs): extracts list of RFs (and other data) from the unpacked +frequencies rfs +\item \_unparsed\_rfs\_(band): (legacy) returns a list of frequencies from the +unparsed byte string band \item \_commands\_(command): converts the list of numeric commands to a list of commands as strings \item \_ciphers\_(cipher): returns a list of ciphers from the packed byte string cipher -\item \_iostub\_(fct,*argv): ioctl stub function, calls fct with parameter list argv -and an allocated ioctl socket +\item \_rateinfo\_(ri): returns parsed rate info from the packed byte string ri +\item \_iostub\_(fct,*argv): ioctl stub function, calls fct with parameter list +argv and an allocated ioctl socket \item \_nlstub\_(fct,*argv): netlink stub function, calls fct with parameter list argv and an allocated netlink socket \end{itemize} diff --git a/examples/info.py b/examples/info.py index 5c3eb2e..1d3203b 100644 --- a/examples/info.py +++ b/examples/info.py @@ -61,11 +61,23 @@ def execute(dev,itype): for mode in pinfo['modes']: msg += "\t * {0}\n".format(mode) msg += "\tSupported Commands:\n" for cmd in pinfo['commands']: msg += "\t * {0}\n".format(cmd) - msg += "\tSupported Frequencies:\n" - for rf in pinfo['freqs']: msg += "\t * {0} ({1})\n".format(rf,rf2ch(rf)) msg += "\tSupported Ciphers:\n" for cipher in pinfo['ciphers']: msg += "\t * {0}\n".format(cipher) - + for band in pinfo['bands']: + msg += "\tBand {0}: (HT: {1} VHT: {2})\n".format(band, + pinfo['bands'][band]['HT'], + pinfo['bands'][band]['VHT']) + msg += "\t Rates:\n" + for rate in pinfo['bands'][band]['rates']: + msg += "\t * {0} Mbps\n".format(rate) + msg += "\t Frequencies:\n" + for i,rf in enumerate(pinfo['bands'][band]['rfs']): + msg += "\t * {0} Mbps ({1} dBm)".format(rf, + pinfo['bands'][band]['rf-data'][i]['max-tx']) + if not pinfo['bands'][band]['rf-data'][i]['enabled']: + msg += " (disabled)\n" + else: + msg += "\n" print msg if __name__ == '__main__': diff --git a/examples/pentest.py b/examples/pentest.py index fd6634b..0691fd6 100644 --- a/examples/pentest.py +++ b/examples/pentest.py @@ -81,7 +81,7 @@ def execute(dev): pyw.devdel(pcard) print 'Restoring', card, 'mode =', dinfo['mode'], 'mac =', dinfo['mac'] - card = pyw.devadd(card,card.dev,dinfo['mode']) + card = pyw.devadd(card,card,dinfo['mode']) pyw.macset(card,dinfo['mac']) pyw.up(card) print "card ", card, " restored" diff --git a/pyric/__init__.py b/pyric/__init__.py index 70688bd..7bf9a8a 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -70,10 +70,10 @@ def strerror(errno): version = __version__ # define long description long_desc = """ -PyRIC 0.1.4: Python Radio Interface Controller -Linux wireless library for the Python Wireless Developer and Pentester +# PyRIC 0.1.4: Python Radio Interface Controller +## Linux wireless library for the Python Wireless Developer and Pentester -DESCRIPTION: +## DESCRIPTION: PyRIC (is a Linux only) library providing wireless developers and pentesters the ability to identify, enumerate and manipulate their system's wireless cards programmatically in Python. Pentesting applications and scripts written in Python @@ -100,9 +100,8 @@ def strerror(errno): features of ifconfig such as getting or setting the mac address and has recently implemented rkill support to soft block or unblock wireless cards. -CURRENT STATE -ATT, PyRIC accomplishes my core needs but it is still a work in progress. It -currently pyw provides the following: +## CURRENT STATE +ATT, PyRIC pyw provides the following: * enumerate interfaces and wireless interfaces * identify a cards chipset and driver * get/set hardware address @@ -113,6 +112,7 @@ def strerror(errno): * get supported modes * get dev info * get phy info +* get link info * get/set regulatory domain * get/set mode * get/set coverage class, RTS threshold, Fragmentation threshold & retry limits @@ -133,7 +133,7 @@ def strerror(errno): for those who wish to add additional commands. However, it pulls directly from the comments nl80211 header file and may be vague. -WHAT IS PyRIC? +## WHAT IS PyRIC? To avoid confusion, PyRIC is the system as a whole, including all header files and "libraries" that are required to communicate with the kernel. pyw is a interface to these libraries providing specific funtions. diff --git a/pyric/lib/__init__.py b/pyric/lib/__init__.py index 26ad1ac..5f6fa6f 100644 --- a/pyric/lib/__init__.py +++ b/pyric/lib/__init__.py @@ -23,7 +23,7 @@ lib 0.0.2 desc: lib subpackage - includes: libnl 0.0.8 libio 0.0.1 + includes: libnl 0.1.0 libio 0.0.1 changes: o added libio o updated libnl diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 148978f..0be56fe 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -489,8 +489,10 @@ def nla_parse(msg,l,mtype,stream,idx): elif dt == nlh.NLA_SET_U32: a = nla_parse_set(a,nlh.NLA_U32) elif dt == nlh.NLA_SET_U64: a = nla_parse_set(a,nlh.NLA_U64) elif dt == nlh.NLA_NESTED: - a,status = nla_parse_nested(a) - if not status: dt = nlh.NLA_ERROR + try: + a = nla_parse_nested(a) + except error: + dt = nlh.NLA_ERROR nla_put(msg,a,atype,dt) except struct.error: # append as Error, stripping null bytes @@ -508,7 +510,7 @@ def nla_parse(msg,l,mtype,stream,idx): def nla_parse_nested(nested): """ - :param nested: the nested attribute with attribute header removed + :param nested: the nested attribute with attribute header & pad removed :returns: list of 'packed' nested attributes after length and padding are stripped - Callers must parse these themselves NOTE: experimental ATT still determining if nl80211 has taken some @@ -525,41 +527,41 @@ def nla_parse_nested(nested): | Attribute Header | Pad | Payload | Pad | +------------------+-----+------------------+-----+ - It seems that a nested attribute (after removing the Attribute header has - the form: + Nested attributes (after removing the Attribute header) should have the + form: - +-----+--------+-----+---------+-----+ - | Pad | Length | Pad | Payload | Pad | - +-----+--------+-----+---------+-----+ + +--------+--------+-----+ + | Length |Payload | Pad | + +--------+--------+-----+ + <-- 2 --><- var ->< var > - where Length is the length of the nested attribute (not including padding - placed at the end to align the attribute + where: + Length (u16) is the length of the nested attribute (excluding padding + affixed to the end to align the attribute) + size of padding is determined by NLMSG_ALIGN + Individual payloads will have the format + + +-------+--------+-----+ + | Index | Data | Pad | + +-------+--------+-----+ + <-- 2 --><- var ->< var > + + where index is the index into an enum structure as determined by the + attribute type of the nested attribute which is found in the Attribute + Header """ ns = [] - idx = lastidx = 0 + idx = 0 l = len(nested) while idx < l: - # first byte is the length, including this byte, length does not include - # pad bytes for proper alignment - alen = struct.unpack_from('B', nested, idx)[0] - # three options: - # 1) skip parsing and raise an error - # 2) eat a byte of padding until we get a length - # 3) return an error code along with correctly parsed elements - if alen == 0: - # option 1: raise error, treating it as unspec - #raise error(errno.EINVAL,"attribute length is 0") - # option 2: eat padding - #idx += 1 - #continue - # option 3: return what we have - if not ns: ns = [nested] - else: ns[len(ns)-1] = nested[lastidx:] - return ns, False - ns.append(nested[idx+1:idx+alen]) + # first two bytes define length, including these bytes, length does not + # include pad byte(s) affixed to end for proper alignment + alen = struct.unpack_from('H', nested, idx)[0] + if alen == 0: raise error(errno.EINVAL, "Invalid nesting") + ns.append(nested[idx+2:idx+alen]) # don't include the length bytes idx += nlh.NLMSG_ALIGN(alen) - return ns, True + return ns def nla_parse_set(aset,etype): """ @@ -702,7 +704,8 @@ def _attrpack_(a,v,d): # pad at the end of '\x00' needs to be removed for nested in v: nlen = len(v) + 2 - nattr = struct.pack('B',nlen) + nested + '\x00' + #nattr = struct.pack('B',nlen) + nested + '\x00' + nattr = struct.pack('xBx', nlen) + nested nattr += struct.pack("{0}x".format(nlh.NLMSG_ALIGNBY(len(nattr)))) attr += nattr else: @@ -713,7 +716,6 @@ def _attrpack_(a,v,d): elif d == nlh.NLA_SET_U64: fmt = "Q" for el in v: attr += struct.pack(fmt,el) attr = nlh.nlattrhdr(len(attr),a) + attr - # this is nlmsg_padlen attr += struct.pack("{0}x".format(nlh.NLMSG_ALIGNBY(len(attr)))) return attr diff --git a/pyric/net/if_h.py b/pyric/net/if_h.py index 865512b..dd2b227 100644 --- a/pyric/net/if_h.py +++ b/pyric/net/if_h.py @@ -183,6 +183,7 @@ def sockaddr(sa_family,sa_data=None): if sa_family == ARPHRD_ETHER: vs.extend([int(x,16) for x in sa_data.split(':')]) elif sa_family == AF_INET: + # we need 6 octets - so prepend two 0's to the ip addr vs.extend([int(x) for x in ('0.0.'+sa_data).split('.')]) else: raise AttributeError("sa_family {0} not supported".format(sa_family)) diff --git a/pyric/net/wireless/nl80211_c.py b/pyric/net/wireless/nl80211_c.py index 16e92a9..e3eb9c1 100644 --- a/pyric/net/wireless/nl80211_c.py +++ b/pyric/net/wireless/nl80211_c.py @@ -179,13 +179,14 @@ nl80211h.NL80211_ATTR_HANDLE_DFS:nlh.NLA_FLAG, nl80211h.NL80211_ATTR_SUPPORTED_IFTYPES:nlh.NLA_NESTED, nl80211h.NL80211_ATTR_SOFTWARE_IFTYPES:nlh.NLA_NESTED, - #nl80211h.NL80211_ATTR_WIPHY_BANDS:nlh.NLA_NESTED, # we don't want to parse this + nl80211h.NL80211_ATTR_WIPHY_BANDS:nlh.NLA_NESTED, nl80211h.NL80211_ATTR_SUPPORTED_COMMANDS:nlh.NLA_NESTED, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS:nlh.NLA_U8, nl80211h.NL80211_ATTR_GENERATION:nlh.NLA_U8, nl80211h.NL80211_ATTR_BSS:nlh.NLA_NESTED, - #nl80211h.NL80211_ATTR_MAC:nlh.NLA_STRING, # we don't want to parse this + #nl80211h.NL80211_ATTR_MAC:nlh.NLA_STRING, # we don't nl want to parse this nl80211h.NL80211_ATTR_CIPHER_SUITES:nlh.NLA_SET_U32, # my own - set of U32s + nl80211h.NL80211_ATTR_STA_INFO:nlh.NLA_NESTED, #### defined in kernel v4 nl80211_h nl80211h.NL80211_ATTR_OPMODE_NOTIF:nlh.NLA_U8, nl80211h.NL80211_ATTR_VENDOR_ID:nlh.NLA_U32, diff --git a/pyric/net/wireless/nl80211_h.py b/pyric/net/wireless/nl80211_h.py index 7369dc8..7c6f4d7 100644 --- a/pyric/net/wireless/nl80211_h.py +++ b/pyric/net/wireless/nl80211_h.py @@ -72,7 +72,6 @@ NL80211_MULTICAST_GROUP_TESTMODE = "testmode" """ -/** * enum nl80211_commands - supported nl80211 commands * * @NL80211_CMD_UNSPEC: unspecified command to catch errors @@ -605,7 +604,6 @@ * as an event to indicate changes for devices with wiphy-specific regdom * management. * @NL80211_CMD_MAX: highest used command number - */ """ NL80211_CMD_UNSPEC = 0 NL80211_CMD_GET_WIPHY = 1 @@ -736,7 +734,6 @@ #NL80211_MESH_SETUP_VENDOR_PATH_SEL_IE = NL80211_MESH_SETUP_IE """ -/** * enum nl80211_attrs - nl80211 netlink attributes * * @NL80211_ATTR_UNSPEC: unspecified attribute to catch errors @@ -1348,7 +1345,6 @@ * between scans. The scan plans are executed sequentially. * Each scan plan is a nested attribute of &enum nl80211_sched_scan_plan. * @NL80211_ATTR_MAX: highest attribute number currently defined - */ """ # don't change the order or add anything between, this is ABI! @@ -2900,6 +2896,7 @@ def nl80211_sta_flag_update(mask,setto): * @NL80211_BAND_60GHZ: around 60 GHz band (58.32 - 64.80 GHz) */ """ +NL80211_BANDS = ['2GHz','5GHz','60GHz'] NL80211_BAND_2GHZ = 0 NL80211_BAND_5GHZ = 1 NL80211_BAND_60GHZ = 2 diff --git a/pyric/net/wireless/wlan.py b/pyric/net/wireless/wlan.py index f22be7b..fe84a71 100644 --- a/pyric/net/wireless/wlan.py +++ b/pyric/net/wireless/wlan.py @@ -110,9 +110,9 @@ WLAN_CIPHER_SUITE_SMS4:'SMS4' } -""" Coverage Class Limits IAW Std Table 8-56 """ -COVERAGE_CLASS_MIN = 0 -COVERAGE_CLASS_MAX = 31 +""" COV Class Limits IAW Std Table 8-56 """ +COV_CLASS_MIN = 0 +COV_CLASS_MAX = 31 """ Retry (short and long) Limits IAW Std dot11ShortRetryLimit pg 2133 and @@ -121,14 +121,12 @@ RETRY_MIN = 1 RETRY_MAX = 255 -""" RTS Threshold limits IAW Std dot11RTSThreshold definition pg 2133 """ -RTS_THRESHOLD_MIN = 0 -RTS_THRESHOLD_MAX = 65536 -RTS_THRESHOLD_OFF = 4294967295 #(2^32 -1 or the max value of a u32) +""" RTS THRESH limits IAW Std dot11RTSTHRESH definition pg 2133 """ +RTS_THRESH_MIN = 0 +RTS_THRESH_MAX = 65536 +RTS_THRESH_OFF = 4294967295 #(2^32 -1 or the max value of a u32) -""" - Fragmentation Threshold limits IAW Std dot11FragmentThreshold definition pg 2133 -""" -FRAG_THRESHOLD_MIN = 256 -FRAG_THRESHOLD_MAX = 8000 -FRAG_THRESHOLD_OFF = 4294967295 #(2^32 -1 or the max value of a u32) \ No newline at end of file +""" Fragmentation THRESH limits IAW Std dot11FragmentTHRESH def. pg 2133 """ +FRAG_THRESH_MIN = 256 +FRAG_THRESH_MAX = 8000 +FRAG_THRESH_OFF = 4294967295 #(2^32 -1 or the max value of a u32) \ No newline at end of file diff --git a/pyric/pyw.py b/pyric/pyw.py index bb85ffd..3374515 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -54,14 +54,15 @@ where nlsocket is created with libnl.nl_socket_alloc() NOTE: - 1) All functions (excluding wireless core related) will use a Card object - which encapsulates the physical index, device name and interface index - (ifindex) under a tuple rather than a device name or physical index or - ifindex as this will not require the caller to remember if a dev or a phy - or a ifindex is needed. The only exception to this is devinfo which by - necessity will accept a Card or a device name + 1) All functions (excluding wireless core related) will use a Card object which + collates the physical index, device name and interface index (ifindex) in a + tuple rather than a device name or physical index or ifindex as this will not + require the caller to remember if a dev or a phy or a ifindex is needed. The + Exceptions to this are: + devinfo which will accept a Card or a dev + devadd which will accept a Card or a phy 2) All functions allow pyric errors to pass through. Callers must catch these - if they desire + if they desire """ @@ -93,7 +94,7 @@ _FAM80211ID_ = None -# redefine interface types and monitor flags +# redefine some nl80211 enum lists for ease of use IFTYPES = nl80211h.NL80211_IFTYPES MNTRFLAGS = nl80211h.NL80211_MNTR_FLAGS TXPWRSETTINGS = nl80211h.NL80211_TX_POWER_SETTINGS @@ -294,8 +295,7 @@ def macget(card, *argv): if fam in [ifh.ARPHRD_ETHER, ifh.AF_UNSPEC,ifh.ARPHRD_IEEE80211_RADIOTAP]: return _hex2mac_(ret[18:24]) else: - raise pyric.error(pyric.EAFNOSUPPORT, - "Invalid return hwaddr family {0}".format(fam)) + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return hwaddr family") except AttributeError as e: raise pyric.error(pyric.EINVAL, e) except struct.error as e: @@ -326,9 +326,7 @@ def macset(card, mac, *argv): if fam in [ifh.ARPHRD_ETHER, ifh.AF_UNSPEC, ifh.ARPHRD_IEEE80211_RADIOTAP]: return _hex2mac_(ret[18:24]) else: - - raise pyric.error(pyric.EAFNOSUPPORT, - "Invalid return hwaddr family {0}".format(fam)) + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return hwaddr family") except AttributeError as e: raise pyric.error(pyric.EINVAL, e) except struct.error as e: @@ -356,8 +354,7 @@ def inetget(card, *argv): if fam == ifh.AF_INET: ip4 = _hex2ip4_(ret[20:24]) else: - raise pyric.error(pyric.EAFNOSUPPORT, - "Invalid return ip family {0}".format(fam)) + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return ip family") # netmask flag = sioch.SIOCGIFNETMASK @@ -366,8 +363,7 @@ def inetget(card, *argv): if fam == ifh.AF_INET: netmask = _hex2ip4_(ret[20:24]) else: - raise pyric.error(pyric.EAFNOSUPPORT, - "Invalid return netmask family {0}".format(fam)) + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return netmask family") # broadcast flag = sioch.SIOCGIFBRDADDR @@ -376,8 +372,7 @@ def inetget(card, *argv): if fam == ifh.AF_INET: brdaddr = _hex2ip4_(ret[20:24]) else: - raise pyric.error(pyric.EAFNOSUPPORT, - "Invalid return broadcast family {0}".format(fam)) + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return broadcast family") except AttributeError as e: raise pyric.error(pyric.EINVAL, e) except struct.error as e: @@ -413,8 +408,7 @@ def inetset(card, ipaddr, netmask, broadcast, *argv): """ # ensure one of params is set & that all set params are valid ip address if not ipaddr and not netmask and not broadcast: - raise pyric.error(pyric.EINVAL, - "One of ipaddr/netmask/broadcast must be set") + raise pyric.error(pyric.EINVAL, "No parameters specified") if ipaddr and not _validip4_(ipaddr): raise pyric.error(pyric.EINVAL, "Invalid ip4 address") if netmask and not _validip4_(netmask): @@ -469,8 +463,7 @@ def ip4set(card, ipaddr, *argv): if fam == ifh.AF_INET: return _hex2ip4_(ipaddr) else: - raise pyric.error(pyric.EAFNOSUPPORT, - "Invalid return ip family {0}".format(fam)) + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return ip family") except AttributeError as e: raise pyric.error(pyric.EINVAL, e) except struct.error as e: @@ -502,8 +495,7 @@ def netmaskset(card, netmask, *argv): if fam == ifh.AF_INET: return _hex2ip4_(ret[20:24]) else: - raise pyric.error(pyric.EAFNOSUPPORT, - "Invalid return netmask family {0}".format(fam)) + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return netmask family") except AttributeError as e: raise pyric.error(pyric.EINVAL, e) except struct.error as e: @@ -544,8 +536,7 @@ def broadcastset(card, broadcast, *argv): if fam == ifh.AF_INET: return _hex2ip4_(ret[20:24]) else: - raise pyric.error(pyric.EAFNOSUPPORT, - "Invalid return broadcast family {0}".format(fam)) + raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return broadcast family") except pyric.error as e: # an ambiguous error is thrown if attempting to set netmask or broadcast # without an ip address already set on the card @@ -635,7 +626,7 @@ def isblocked(card): idx = rfkill.getidx(card.phy) return rfkill.soft_blocked(idx), rfkill.hard_blocked(idx) except AttributeError: - raise pyric.error(pyric.ENODEV, "Device is no longer regsitered") + raise pyric.error(pyric.ENODEV, "Card is no longer regsitered") def block(card): """ @@ -646,7 +637,7 @@ def block(card): idx = rfkill.getidx(card.phy) rfkill.rfkill_block(idx) except AttributeError: - raise pyric.error(pyric.ENODEV, "Device no longer registered") + raise pyric.error(pyric.ENODEV, "Card is no longer registered") def unblock(card): """ @@ -657,7 +648,7 @@ def unblock(card): idx = rfkill.getidx(card.phy) rfkill.rfkill_unblock(idx) except AttributeError: - raise pyric.error(pyric.ENODEV, "Device no longer registered") + raise pyric.error(pyric.ENODEV, "Card no longer registered") ################################################################################ #### RADIO PROPERTIES #### @@ -743,12 +734,12 @@ def covclassset(card, cc, *argv): :param argv: netlink socket at argv[0] (or empty) sets card's coverage class """ - if cc < wlan.COVERAGE_CLASS_MIN or cc > wlan.COVERAGE_CLASS_MAX: + if cc < wlan.COV_CLASS_MIN or cc > wlan.COV_CLASS_MAX: # this can work 'incorrectly' on non-int values but these will # be caught later during conversion - msg = "Coverage class must be integer {0} - {1}" - raise pyric.error(pyric.EINVAL, msg.format(wlan.COVERAGE_CLASS_MIN, - wlan.COVERAGE_CLASS_MAX)) + msg = "Cov class must be integer {0}-{1}".format(wlan.COV_CLASS_MIN, + wlan.COV_CLASS_MAX) + raise pyric.error(pyric.EINVAL, msg) try: nlsock = argv[0] @@ -766,7 +757,7 @@ def covclassset(card, cc, *argv): except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except ValueError: - raise pyric.error(pyric.EINVAL, "Invalid parameter value for cc") + raise pyric.error(pyric.EINVAL, "Invalid value for Cov. Class") except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -796,8 +787,8 @@ def retryshortset(card, lim, *argv): if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: # this can work 'incorrectly' on non-int values but these will # be caught later during conversion - msg = "Retry short must be integer {0} - {1}".format(wlan.RETRY_MIN, - wlan.RETRY_MAX) + msg = "Retry short must be integer {0}-{1}".format(wlan.RETRY_MIN, + wlan.RETRY_MAX) raise pyric.error(pyric.EINVAL, msg) try: @@ -846,8 +837,9 @@ def retrylongset(card, lim, *argv): if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: # this can work 'incorrectly' on non-int values but these will # be caught later during conversion - msg = "Retry long must be integer {0} - {1}" - raise pyric.error(pyric.EINVAL, msg.format(wlan.RETRY_MIN, wlan.RETRY_MAX)) + msg = "Retry long must be integer {0}-{1}".format(wlan.RETRY_MIN, + wlan.RETRY_MAX) + raise pyric.error(pyric.EINVAL, msg) try: nlsock = argv[0] @@ -893,12 +885,12 @@ def rtsthreshset(card, thresh, *argv): :param argv: netlink socket at argv[0] (or empty) sets the card's RTS threshold """ - if thresh == 'off': thresh = wlan.RTS_THRESHOLD_OFF - elif thresh == wlan.RTS_THRESHOLD_OFF: pass - elif thresh < wlan.RTS_THRESHOLD_MIN or thresh > wlan.RTS_THRESHOLD_MAX: - msg = "Threshold must be 'off' or integer {0} - {1}" - raise pyric.error(pyric.EINVAL, msg.format(wlan.RTS_THRESHOLD_MIN, - wlan.RTS_THRESHOLD_MAX)) + if thresh == 'off': thresh = wlan.RTS_THRESH_OFF + elif thresh == wlan.RTS_THRESH_OFF: pass + elif thresh < wlan.RTS_THRESH_MIN or thresh > wlan.RTS_THRESH_MAX: + msg = "Thresh must be 'off' or integer {0}-{1}".format(wlan.RTS_THRESH_MIN, + wlan.RTS_THRESH_MAX) + raise pyric.error(pyric.EINVAL, msg) try: nlsock = argv[0] @@ -942,14 +934,14 @@ def fragthreshset(card, thresh, *argv): :param card: Card object :param thresh: frag threshold limit in octets :param argv: netlink socket at argv[0] (or empty) - sets the card's Fragmentation threshold + sets the card's Fragmentation THRESH """ - if thresh == 'off': thresh = wlan.FRAG_THRESHOLD_OFF - elif thresh == wlan.FRAG_THRESHOLD_OFF: pass - elif thresh < wlan.FRAG_THRESHOLD_MIN or thresh > wlan.FRAG_THRESHOLD_MAX: - msg = "Threshold must be 'off' or an integer {0} - {1}" - raise pyric.error(pyric.EINVAL, msg.format(wlan.FRAG_THRESHOLD_MIN, - wlan.FRAG_THRESHOLD_MAX)) + if thresh == 'off': thresh = wlan.FRAG_THRESH_OFF + elif thresh == wlan.FRAG_THRESH_OFF: pass + elif thresh < wlan.FRAG_THRESH_MIN or thresh > wlan.FRAG_THRESH_MAX: + msg = "Thresh must be 'off' or integer {0}-{1}".format(wlan.FRAG_THRESH_MIN, + wlan.FRAG_THRESH_MAX) + raise pyric.error(pyric.EINVAL, msg) try: nlsock = argv[0] @@ -1086,10 +1078,9 @@ def ifinfo(card, *argv): drvr, chips = hw.ifcard(card.dev) mac = macget(card, iosock) ip4, nmask, bcast = inetget(card, iosock) - info = {'driver':drvr, 'chipset':chips, - 'hwaddr':mac, 'manufacturer':hw.manufacturer(ouis,mac), + info = {'driver':drvr, 'chipset':chips, 'hwaddr':mac, + 'manufacturer':hw.manufacturer(ouis,mac), 'inet':ip4, 'bcast':bcast, 'mask':nmask} - #except pyric.error # allow pyric errors to fall through except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") @@ -1133,19 +1124,21 @@ def devinfo(card, *argv): raise pyric.error(e.errno, e.strerror) # pull out attributes - info = {'card':Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), dev, idx), - 'mode':IFTYPES[nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFTYPE)], - 'wdev':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WDEV), - 'mac':_hex2mac_(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAC)), - 'RF':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_FREQ), - 'CF':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CENTER_FREQ1), - 'CHW':None} - chw = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CHANNEL_WIDTH) - if chw: - try: - info['CHW'] = channels.CHTYPES[chw] - except IndexError: - info['CHW'] = chw + info = { + 'card': Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), dev, idx), + 'mode': IFTYPES[nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFTYPE)], + 'wdev': nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WDEV), + 'mac': _hex2mac_(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAC)), + 'RF': nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_FREQ), + 'CF': nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CENTER_FREQ1), + 'CHW': nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CHANNEL_WIDTH) + } + + # convert CHW to string version + try: + info['CHW'] = channels.CHTYPES[info['CHW']] + except (IndexError,TypeError): # invalid index and NoneType + info['CHW'] = None return info def phyinfo(card, *argv): @@ -1156,7 +1149,12 @@ def phyinfo(card, *argv): :returns: dict with the following key:value pairs generation -> wiphy generation modes -> list of supported modes - freqs -> list of supported freqs + bands -> dict of supported bands of the form + bandid -> {'rates': list of supported rates, + 'rfs': list of supported freqs, + 'rd-data': list of data corresponding to rfs, + 'HT': 802.11n HT supported, + 'VHT': 802.11ac VHT supported} scan_ssids -> max number of scan SSIDS retry_short -> retry short limit retry_long -> retry long limit @@ -1186,41 +1184,43 @@ def phyinfo(card, *argv): raise pyric.error(e.errno, e.strerror) # pull out attributes - info = {'generation':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_GENERATION), - 'retry_short':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_SHORT), - 'retry_long':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_LONG), - 'frag_thresh':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_FRAG_THRESHOLD), - 'rts_thresh':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RTS_THRESHOLD), - 'cov_class':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_COVERAGE_CLASS), - 'scan_ssids':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS), - 'freqs':[], - 'modes':[], - 'swmodes':[], - 'commands':[], - 'ciphers':[]} + info = { + 'generation':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_GENERATION), + 'retry_short':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_SHORT), + 'retry_long':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_LONG), + 'frag_thresh':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_FRAG_THRESHOLD), + 'rts_thresh':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RTS_THRESHOLD), + 'cov_class':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_COVERAGE_CLASS), + 'scan_ssids':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS), + 'bands':[], + 'modes':[], + 'swmodes':[], + 'commands':[], + 'ciphers':[] + } # modify frag_thresh and rts_thresh as necessary - if info['frag_thresh'] >= wlan.FRAG_THRESHOLD_MAX: info['frag_thresh'] = 'off' - if info['rts_thresh'] > wlan.RTS_THRESHOLD_MAX: info['rts_thresh'] = 'off' + if info['frag_thresh'] >= wlan.FRAG_THRESH_MAX: info['frag_thresh'] = 'off' + if info['rts_thresh'] >= wlan.RTS_THRESH_MAX: info['rts_thresh'] = 'off' # complex attributes + # NOTE: after correcting my understanding of how to parsed nested attributes + # they should no longer result in a NLA_ERROR but just in case... _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_BANDS, False) - if d != nlh.NLA_ERROR: info['freqs'] = _frequencies_(bs) + if d != nlh.NLA_ERROR: info['bands'] = _bands_(bs) + #else: info['freqs'] = _unparsed_rf_(bs) _, cs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CIPHER_SUITES, False) if d != nlh.NLA_ERROR: info['ciphers'] = _ciphers_(cs) - # nested attributes require additional processing & in the event of an - # unparsed nested attribute, leave as empty list - - # supported iftypes, sw iftypes are IAW nl80211.h flags i.e. pad/flag/pad + # supported iftypes, sw iftypes are IAW nl80211.h flags _, ms, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_IFTYPES, False) if d != nlh.NLA_ERROR: - info['modes'] = [_iftypes_(struct.unpack_from('B', m, 1)[0]) for m in ms] + info['modes'] = [_iftypes_(struct.unpack_from('H', m, 0)[0]) for m in ms] _, ms, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SOFTWARE_IFTYPES, False) if d != nlh.NLA_ERROR: - info['swmodes'] = [_iftypes_(struct.unpack_from('B', m, 1)[0]) for m in ms] + info['swmodes'] = [_iftypes_(struct.unpack_from('H', m, 0)[0]) for m in ms] # get supported commands _, cs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_COMMANDS, False) @@ -1318,6 +1318,7 @@ def chget(card, *argv): except IndexError: return _nlstub_(chget, card) + # rf2ch will return None if Card is not on a channel return channels.rf2ch(devinfo(card, nlsock)['RF']) def chset(card, ch, chw=None, *argv): @@ -1330,13 +1331,14 @@ def chset(card, ch, chw=None, *argv): :param argv: netlink socket at argv[0] (or empty) :returns: True on success NOTE: - o ATT can throw a device busy for several reason. Most likely due to - the network manager etc. + o Can throw a device busy for several reason. Most likely due to + the network manager etc. o On my system at least (Ubuntu), creating a new dev in monitor mode and deleting all other existing managed interfaces allows for the new virtual - device's channels to be changed + device's channels to be changed w/out interference from network manager """ - if ch not in channels.channels(): raise pyric.error(pyric.EINVAL, "Invalid channel") + if ch not in channels.channels(): + raise pyric.error(pyric.EINVAL, "Invalid channel") try: nlsock = argv[0] @@ -1356,7 +1358,7 @@ def freqset(card, rf, chw=None, *argv): """ if rf not in channels.freqs(): raise pyric.error(pyric.EINVAL, "Invalid RF") if chw in channels.CHTYPES: chw = channels.CHTYPES.index(chw) - else: raise pyric.error(pyric.EINVAL, "Invalid width") + else: raise pyric.error(pyric.EINVAL, "Invalid channel width") try: nlsock = argv[0] @@ -1599,9 +1601,21 @@ def link(card, *argv): rss -> Received signal strength in dBm int -> beacon interval (ms) stat -> status w.r.t of card to BSS one of {'authenticated','associated','ibss'} + tx -> tx metrics dict of the form + pkts -> total sent packets to connected STA (AP) + bytes -> total sent in bytes to connected STA (AP) + retries -> total # of retries + failed -> total # of failed + bitrate -> dict of form + rate -> tx rate in Mbits + width -> channel width oneof {None|20|40} + mcs-index -> mcs index (0..32) or None + gaurd -> guard interval oneof {None|0=short|1=long} + Note: width, mcs-index, guard will be None unless 802.11n is being used + rx -> rx metrics dict (see tx for format exluces retries and fails) or None if the card is not connected NOTE: if the nested attribute was not parsed correctly will attempt to pull - out the bssid + out as much as possible """ try: nlsock = argv[0] @@ -1620,6 +1634,7 @@ def link(card, *argv): nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) + #return rmsg except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: @@ -1627,47 +1642,148 @@ def link(card, *argv): # link returns multiple attributes but we are only concerned w/ @NL80211_ATTR_BSS # some cards (my integrated intel) do not parse correctly - info = {'bssid': None, - 'ssid': None, - 'freq': None, - 'rss': None, - 'int': None, - 'chw': None, - 'stat': None} - - # ensure it was parsed correctly - we can (possibly) hack out the bssid on - # failed parsings bssid appears to be the first attribute returned by the - # kernel + info = {'bssid': None, 'ssid': None, 'freq': None, 'rss': None, 'int': None, + 'chw': None, 'stat': None,'tx': {}, 'rx': {}} + _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_BSS, False) for b in bs: - # each attribute is pad | index | pad where is index identifies nl80211_bss - # enum parameter try: - i = struct.unpack_from('b', b, 1)[0] + # pull of the two-byte index into the nl80211_bss enum + i = struct.unpack_from('H', b, 0)[0] # pull off the two-byte index if i == nl80211h.NL80211_BSS_BSSID: - info['bssid'] = _hex2mac_(b[3:]) + info['bssid'] = _hex2mac_(b[2:]) if i == nl80211h.NL80211_BSS_FREQUENCY: - info['freq'] = struct.unpack_from('I', b, 3)[0] + info['freq'] = struct.unpack_from('I', b, 2)[0] if i == nl80211h.NL80211_BSS_SIGNAL_MBM: - info['rss'] = struct.unpack_from('i', b, 3)[0] / 100 + info['rss'] = struct.unpack_from('i', b, 2)[0] / 100 if i == nl80211h.NL80211_BSS_INFORMATION_ELEMENTS: - # after removing the length, the first element in the ies should - # be the ssid following the pattern \x00SSID..... + # the ssid is the first element (from what I've seen). Get the + # length of the ssid which is the fourth byte, then unpack + # the string starting at the fifth byte up to the length + l = struct.unpack_from('B',b,3)[0] + info['ssid'] = struct.unpack_from('{0}s'.format(l),b,4)[0] if i == nl80211h.NL80211_BSS_BEACON_INTERVAL: - info['int'] = struct.unpack_from('H', b, 3)[0] + info['int'] = struct.unpack_from('H', b, 2)[0] if i == nl80211h.NL80211_BSS_CHAN_WIDTH: - j = struct.unpack_from('I', b, 3)[0] + j = struct.unpack_from('I', b, 2)[0] info['chw'] = nl80211h.NL80211_BSS_CHAN_WIDTHS[j] if i == nl80211h.NL80211_BSS_STATUS: - j = struct.unpack_from('I', b, 3)[0] + j = struct.unpack_from('I', b, 2)[0] info['stat'] = nl80211h.NL80211_BSS_STATUSES[j] except (struct.error,IndexError): pass + # process stainfo of AP + if info['bssid']: + sinfo = stainfo(card, info['bssid'], nlsock) + if sinfo is not None: # just in case + try: + # tx data + info['tx'] = { + 'bytes': sinfo['tx-bytes'], + 'pkts': sinfo['tx-pkts'], + 'failed': sinfo['tx-failed'], + 'retries': sinfo['tx-retries'], + 'bitrate': {'rate': sinfo['tx-bitrate']['rate'] * 0.1} + } + if sinfo['tx-bitrate'].has_key('mcs-index'): + info['tx']['bitrate']['mcs-index'] = sinfo['tx-bitrate']['mcs-index'] + info['tx']['bitrate']['gi'] = sinfo['tx-bitrate']['gi'] + info['tx']['bitrate']['width'] = sinfo['tx-bitrate']['width'] + + # rx data + info['rx'] = { + 'bytes': sinfo['rx-bytes'], + 'pkts':sinfo['rx-pkts'], + 'bitrate': {'rate': sinfo['rx-bitrate']['rate'] * 0.1} + } + if sinfo['rx-bitrate'].has_key('mcs-index'): + info['rx']['bitrate']['mcs-index'] = sinfo['rx-bitrate']['mcs-index'] + info['rx']['bitrate']['gi'] = sinfo['rx-bitrate']['gi'] + info['rx']['bitrate']['width'] = sinfo['rx-bitrate']['width'] + except (KeyError,TypeError,AttributeError): + # ignore for now, returning what we got + pass + + return info + +def stainfo(card, mac, *argv): + """ + returns info about sta (AP) the card is associated with (iw dev card. link) + :param card: Card object + :param mac: mac address of STA + :param argv: netlink socket at argv[0] (or empty) + :returns: sta info as dict with the following key:value pairs + rx-bytes: total received bytes (from STA) + tx-bytes: total sent bytes (to STA) + rx-pkts: total received packets (from STA) + tx-pkts: total sent packets (to STA) + tx-bitrate: dict of the form + rate: bitrate in 100kbits/s + legacy: fallback bitrate in 100kbits/s (only present if rate is not determined) + mcs-index: mcs index (0..32) (only present if 802.11n) + gi: guard interval oneof {0=short|1=long} (only present if 802.11n) + width: channel width oneof {20|40} + rx-bitrate: see tx-bitrate + NOTE: + - if the nested attribute was not parsed correctly will attempt to pull + out as much as possible + - given msc index, guard interval and channel width, one can calculate the + 802.11n rate (see wraith->standards->mcs) + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(stainfo, card, mac) + + # if we're not connected GET_SCAN will dump scan results, we don't want that + if not isconnected(card, nlsock): return None + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_GET_STATION, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nla_put_unspec(msg, _mac2hex_(mac), nl80211h.NL80211_ATTR_MAC) + nl.nl_sendmsg(nlsock, msg) + rmsg = nl.nl_recvmsg(nlsock) + except AttributeError: + raise pyric.error(pyric.EINVAL, "Invalid Card") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + + # we are only concerned w/ @NL80211_ATTR_STA_INFO + info = {'rx-bytes': None, 'tx-bytes': None, 'rx-pkts': None, 'tx-pkts': None, + 'tx-bitrate':{}, 'rx-bitrate':{}} + + _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_STA_INFO, False) + for b in bs: + try: + # pull of the two-byte index into the nl80211_bss enum + i = struct.unpack_from('H', b, 0)[0] + if i == nl80211h.NL80211_STA_INFO_RX_BYTES: + info['rx-bytes'] = struct.unpack_from('I', b, 2)[0] + elif i == nl80211h.NL80211_STA_INFO_TX_BYTES: + info['tx-bytes'] = struct.unpack_from('I', b, 2)[0] + elif i == nl80211h.NL80211_STA_INFO_RX_PACKETS: + info['rx-pkts'] = struct.unpack_from('I', b, 2)[0] + elif i == nl80211h.NL80211_STA_INFO_TX_PACKETS: + info['tx-pkts'] = struct.unpack_from('I', b, 2)[0] + elif i == nl80211h.NL80211_STA_INFO_TX_RETRIES: + info['tx-retries'] = struct.unpack_from('I', b, 2)[0] + elif i == nl80211h.NL80211_STA_INFO_TX_FAILED: + info['tx-failed'] = struct.unpack_from('I', b, 2)[0] + elif i == nl80211h.NL80211_STA_INFO_TX_BITRATE: + info['tx-bitrate'] = _rateinfo_(b[2:]) + elif i == nl80211h.NL80211_STA_INFO_RX_BITRATE: + info['rx-bitrate'] = _rateinfo_(b[2:]) + except (struct.error, IndexError): + pass + return info ################################################################################ @@ -1677,14 +1793,31 @@ def link(card, *argv): IPADDR = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") # re for ip addr MACADDR = re.compile("^([0-9a-fA-F]{2}:){5}([0-9a-fA-F]{2})$") # re for mac addr -def _hex2mac_(v): - """ :returns: a ':' separated mac address from byte stream v """ - return ":".join(['{0:02x}'.format(ord(c)) for c in v]) def _hex2ip4_(v): """ :returns: a '.' separated ip4 address from byte stream v """ return '.'.join([str(ord(c)) for c in v]) +def _hex2mac_(v): + """ + :param v: packed bytestream of form \xd8\xc7\xc8\x00\x11\x22 + :returns: a ':' separated mac address from byte stream v + """ + return ":".join(['{0:02x}'.format(ord(c)) for c in v]) + +def _mac2hex_(v): + """ + converts mac address to hex string + :param v: mac address of form xx:yy:zz:00:11:22 + :returns: mac address as hex string + """ + try: + return struct.pack('6B',*[int(x,16) for x in v.split(':')]) + except AttributeError: + raise pyric.error(pyric.EINVAL, 'Mac address is not valid') + except struct.error: + raise pyric.error(pyric.EINVAL, 'Mac address is not 6 octets') + def _validip4_(addr): """ determines validity of ip4 address @@ -1796,9 +1929,138 @@ def _iftypes_(i): except IndexError: return "Unknown mode ({0})".format(i) -def _frequencies_(band): +def _bands_(bs): + """ + extracts supported freqs, rates from bands + :param bs: a list of one or more unparsed band attributes + :returns: dict of the form + band: one of {'2GHz'|'5GHz'|'UNK (n)'} -> band dict + band dict -> + HT: HT is supported by the Card on this band + VHT: VHT is supported by the Card on this band + rates: list of supported rates + rfs: list of supported frequencies + rf-data: list of dicts of rf-data where rf-data[i] contains info + regarding rf[i] + """ + # NOTE: in addition to RF and rates there are HT data included in the + # band info ATT we do not parse these (see "phy info notes 3.txt") + bands = {} + for band in bs: + # the first two bytes tell us what band were in (enum nl80211_band) + bi = struct.unpack_from('H', band, 0)[0] + try: + bi = nl80211h.NL80211_BANDS[bi] + except IndexError: + bi = "UNK ({0})".format(bi) + bands[bi] = {'HT': False, + 'VHT': False, + 'rates': None, + 'rfs': None, + 'rf-data': None} + + # now we delve into multiple levels of nesting + battrs = nl.nla_parse_nested(band[2:]) # skip the band index + for battr in battrs: + # Here is were a find nested would come in handy + # Also, there are other data here (see nl80211_h nl80211_band_attr) + i = struct.unpack_from('H', battr, 0)[0] + if i == nl80211h.NL80211_BAND_ATTR_RATES: + try: + bands[bi]['rates'] = _band_rates_(battr[2:]) + except (nl.error,struct.error): + bands[bi]['rates'] = [] + elif i == nl80211h.NL80211_BAND_ATTR_FREQS: + try: + bands[bi]['rfs'], bands[bi]['rf-data'] = _band_rfs_(battr[2:]) + except (nl.error,struct.error): + bands[bi]['freqs'], bands[bi]['rf-data'] = [], [] + elif i in [nl80211h.NL80211_BAND_ATTR_HT_MCS_SET, + nl80211h.NL80211_BAND_ATTR_HT_CAPA, + nl80211h.NL80211_BAND_ATTR_HT_AMPDU_FACTOR, + nl80211h.NL80211_BAND_ATTR_HT_AMPDU_DENSITY]: + bands[bi]['HT'] = True + elif i in [nl80211h.NL80211_BAND_ATTR_VHT_MCS_SET, + nl80211h.NL80211_BAND_ATTR_VHT_CAPA]: + bands[bi]['VHT'] = True + return bands + +def _band_rates_(rs): + """ + unpacks individual rates from packed rates + :param rs: packed rates + :returns: a list of rates in Mbits + NOTE: ATT we ignore any short preamble specifier + """ + # rs is an unpacked nested attribute, get the nested attributes are a list + # of bitrates each bitrate itself being a nested attribute. The bitrate + # attribute will be: a counter and another nested attribute containing + # a rate (index = \x01) and a flag (= \x02) if the rate supports + # short preamble - these indexes index the enum nl80211_bitrate_attr + rates = [] + for attr in nl.nla_parse_nested(rs): + for bitrate in nl.nla_parse_nested(attr[2:]): # first two bytes are a counter + i = struct.unpack_from('H', bitrate, 0)[0] + if i == nl80211h.NL80211_BITRATE_ATTR_RATE: + rates.append(struct.unpack_from('I', bitrate, 2)[0] * 0.1) + return rates + +def _band_rfs_(rs): + """ + unpacks individual RFs (and accompanying data) from packed rfs + :param rfs: packed frequencies + :returns: a tuple t = (freqs: list of supported RFS (MHz), data: list of dicts) + where for each i in freqs, data[i] is the corresponding data having the + form {} """ - extract list of supported freqs packed byte stream band + rfs = [] + rfds = [] + for attr in nl.nla_parse_nested(rs): + # attr is a counter and a nested attribute (nl80211_frequency_attr) + + # RF data being compiled ATT we are ignoring DFS related and infrared + # related. rfd is initially defined with max-tx, radar, 20Mhz and 10Mhz + # with 'default' values. + # Additional values may be returned by the kernel. If present they will + # be appended to not-permitted as the following strings + # HT40-, HT40+, 80MHz, 160MHz and outdoor. + # If present in not-permitted, they represent False Flags + rfd = {'max-tx': 0, # Card's maximum tx-power on this RF + 'enabled': True, # w/ current reg. dom. RF is enabled + '20Mhz': True, # w/ current reg. dom. 20MHz operation is allowed + '10Mhz': True, # w/ current reg. dom. 10MHz operation is allowed + 'radar': False, # w/ current reg. dom. radar detec. required on RF + 'not-permitted': []} # additional flags + for fattr in nl.nla_parse_nested(attr[2:]): + # first two bytes are index into enum nl80211_frequency_attr + i = struct.unpack_from('H', fattr, 0)[0] + if i == nl80211h.NL80211_FREQUENCY_ATTR_FREQ: + rfs.append(struct.unpack_from('I', fattr[2:], 0)[0]) + elif i == nl80211h.NL80211_FREQUENCY_ATTR_DISABLED: + rfd['enabled'] = False + elif i == nl80211h.NL80211_FREQUENCY_ATTR_MAX_TX_POWER: + # convert mBm to dBm + rfd['max-tx'] = struct.unpack_from('I', fattr[2:], 0)[0] * 0.01 + elif i == nl80211h.NL80211_FREQUENCY_ATTR_NO_HT40_MINUS: + rfd['not-permitted'].append('HT40-') + elif i == nl80211h.NL80211_FREQUENCY_ATTR_NO_HT40_PLUS: + rfd['not-permitted'].append('HT40+') + elif i == nl80211h.NL80211_FREQUENCY_ATTR_NO_80MHZ: + rfd['not-permitted'].append('80MHz') + elif i == nl80211h.NL80211_FREQUENCY_ATTR_NO_160MHZ: + rfd['not-permitted'].append('160MHz') + elif i == nl80211h.NL80211_FREQUENCY_ATTR_INDOOR_ONLY: + rfd['not-permitted'].append('outdoor') + elif i == nl80211h.NL80211_FREQUENCY_ATTR_NO_20MHZ: + rfd['20MHz'] = False + elif i == nl80211h.NL80211_FREQUENCY_ATTR_NO_10MHZ: + rfd['10MHz'] = False + rfds.append(rfd) + return rfs, rfds + +def _unparsed_rf_(band): + """ + (LEGACY) extract list of supported freqs packed byte stream band :param band: packed byte string from NL80211_ATTR_WIPHY_BANDS :returns: list of supported frequencies """ @@ -1817,11 +2079,13 @@ def _commands_(command): cs = [] for cmd in command: try: - # convert the numeric command to the form @NL80211_CMD_ - # Some numeric commands may have multiple string synonyms, in - # that case, take the first one. Finally, strip off @NL80211_CMD_ - # to get only the command name and make it lowercase - cmd = cmdbynum(struct.unpack_from('>HH', cmd, 0)[1]) + # commands are listed |count|command| + # <- 2 -><- 4 -> + # ignore count, use numeric command to lookup string version in form + # @NL80211_CMD_ and strip "@NL80211_CMD_". NOTE: some numeric + # commands may have multiple string synonyms, in that case, take the + # first one. Finally, make it lowercase + cmd = cmdbynum(struct.unpack_from('I', cmd, 2)[0]) if type(cmd) is type([]): cmd = cmd[0] cs.append(cmd[13:].lower()) # skip NL80211_CMD_ except KeyError: @@ -1846,6 +2110,52 @@ def _ciphers_(cipher): ss.append('RSRV-{0}'.format(hex(int(e.__str__())))) return ss +#### ADDITIONAL PARSING FOR STAINFO + +def _rateinfo_(ri): + """ + parses the rate info stream returning a bitrate dict + :param ri: rate info stream + :returns: bitrate dict having the key->value pairs + rate: bitrate in 100kbits/s + legacy: fallback bitrate in 100kbits/s (only present if rate is not determined) + mcs-index: mcs index (0..32) (only present if 802.11n) + gi: guard interval oneof {0=short|1=long} (only present if 802.11n) + width: channel width oneof {20|40} + NOTE: references enum nl80211_rate_info + """ + bitrate = {'rate': None, 'legacy': None, 'mcs-index': None, 'gi': 1, 'width': 20} + + try: + brs = nl.nla_parse_nested(ri) + except nl.error: + return {} + + for br in brs: + i = struct.unpack_from('H', br, 0)[0] + if i == nl80211h.NL80211_RATE_INFO_BITRATE32: + bitrate['rate'] = struct.unpack_from('I', br, 2)[0] + elif i == nl80211h.NL80211_RATE_INFO_BITRATE: # legacy fallback rate + bitrate['legacy'] = struct.unpack_from('H', br, 2)[0] + elif i == nl80211h.NL80211_RATE_INFO_MCS: + bitrate['mcs-index'] = struct.unpack_from('B', br, 2)[0] + elif i == nl80211h.NL80211_RATE_INFO_40_MHZ_WIDTH: # flag + bitrate['width'] = 40 + elif i == nl80211h.NL80211_RATE_INFO_SHORT_GI: # flag + bitrate['gi'] = 0 + + # clean it up before returning + # remove legacy if we have rate or make rate = legacy if we dont have rate + # remove mcs-index and short gi and 40 MHz if there is no mcs-index + if bitrate['legacy'] and not bitrate['rate']: bitrate['rate'] = bitrate['legacy'] + if bitrate['rate'] and bitrate['legacy']: del bitrate['legacy'] + if bitrate['mcs-index'] is None: + del bitrate['mcs-index'] + del bitrate['gi'] + del bitrate['width'] + + return bitrate + #### NETLINK/IOCTL PARAMETERS #### def _ifindex_(dev, *argv): diff --git a/pyric/utils/channels.py b/pyric/utils/channels.py index bfad7ad..1d47f06 100644 --- a/pyric/utils/channels.py +++ b/pyric/utils/channels.py @@ -20,7 +20,7 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. -Defines ISM 2.4Ghz,UNII 5Ghz and 4.9GHz frequencies and channels +Defines ISM 2.4Ghz, UNII 5Ghz and 4.9GHz frequencies and channels Need to define 3GHz channels/freqs diff --git a/setup.py b/setup.py index 75f21ed..1dc003c 100644 --- a/setup.py +++ b/setup.py @@ -38,7 +38,7 @@ version=pyric.version, description="Python Wireless Library", long_description=pyric.long_desc, - url='http://wraith-wireless.github.io/pyric', + url='https://github.com/wraith-wireless/PyRIC/', download_url="https://github.com/wraith-wireless/pyric/archive/"+pyric.version+".tar.gz", author=pyric.__author__, author_email=pyric.__email__, From be46dc6165ecd6b6badb19fd9c4f06903750b3bd Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Wed, 13 Jul 2016 10:11:18 -0600 Subject: [PATCH 069/121] v0.1.5 see CHANGES --- CHANGES | 17 +- README.md | 105 +++++++++++- TODO | 24 +-- docs/PyRIC.pdf | Bin 506717 -> 506817 bytes docs/PyRIC.tex | 5 +- examples/info.py | 8 +- examples/pentest.py | 2 +- pyric/lib/libnl.py | 64 ++++--- pyric/pyw.py | 395 +++++++++++++++++++++++--------------------- 9 files changed, 362 insertions(+), 258 deletions(-) diff --git a/CHANGES b/CHANGES index 15417f7..b073b2e 100644 --- a/CHANGES +++ b/CHANGES @@ -122,13 +122,24 @@ v 0.1.5 Begin STA associated functionality - disconnect - link - stainfo + - devset o updated nested netlink attribute handling - my understanding of it was incomplete - There are still occasional errors - nested attributes are parsed as 'far' as possible o reupdated nested netlink attribute handling - this time it really works - nested attributes are now parsed correctly, any errors are a result of incorrect packing on the other side or packet corruption and the entire - unparsed attribute will be returned. For wiphy bands, the legacy frequency - pull will be used. + unparsed attribute will be returned. + - nla_parse_nested has been changed to return a list of tuples + t = (index,attribute) which (TODO #41) eases the burden on the calling + function + - fixed 're'nesting of nested attributes o parsing wiphy bands (issue #7) is now fully functional and no longer relies - on a hacked fix \ No newline at end of file + on a hacked fix + o devstds now uses phyinfo to determine standards Card supports + o completely 'remodeled' functions in pyw to take advantage of new parsing + from libnl (have left some of the error checking in place as a backup until + testing confirms that the new nla_parse_nested is bug-free) + o fixed error on devadd during restoration in examples/pentest.py + o fixed output error, incorrect labeling + o fixed output error ASW max tx power \ No newline at end of file diff --git a/README.md b/README.md index 214c8f5..9e5f258 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,10 @@ Python port of Netlink w.r.t nl80211 functionality. The original goal of PyRIC was to provide a simple interface to the underlying nl80211 kernel support, handling the complex operations of Netlink seamlessy while maintaining a minimum of "code walking" to understand, modify and extend. But, why stop there? Since -it's initial inception, PyRIC has grown to include ioctl support to replicate +it's initial inception, PyRIC has grown. PyRIC puts iw, ifconfig, rfkill, +udevadm, airmon-ng and macchanger + + to include ioctl support to replicate features of ifconfig such as getting or setting the mac address and has recently implemented rkill support to soft block or unblock wireless cards. @@ -187,6 +190,9 @@ form t = (error code,error message). Work is ongoing to help clarify some of the error messages returned by default by os.strerror for example. +Read the user guide, or type dir(pyw) in your console to get a full listing +of all pyw functions. + ### a. System/Wireless Core Functionality These functions do not work with a specific device rather with the system. @@ -450,6 +456,98 @@ True >>> ``` +So, perhaps you do not care for the previous method of creating a card +in monitor mode and deleting all associated interfaces and would prefer +to execute an airmon-ng(ish) method. + +```python +>>> w0 +Card(phy=0,dev='wlan0',ifindex=2) +>>> w1 = pyw.devset(w0, 'wlan1') +>>> w1 +Card(phy=0,dev=wlan1,ifindex=3) +>>> pyw.modeset(w1, 'monitor') +>>> pyw.up(w1) +>>> pyw.chset(w1, 1, None) +``` + +The above commands execute the same internal commands as does airmon-ng. +To verify, open a command prompt and execute the following: + +```bash +?> iw dev wlan0 info # replace wlan0 with your nic +Interface wlan0 + ifindex 3 + wdev 0x1 + addr a0:88:b4:9e:68:58 + type managed + wiphy 0 +?> sudo airmon-ng start wlan0 +Found 2 processes ... +?> +?> iw dev wlan0mon info +Interface wlan0mon + ifindex 6 + wdev 0x2 + addr a0:88:b4:9e:68:58 + type monitor + wiphy 0 + channel 10 (2457 MHz), width: 20 MHz (no HT), center1: 2457 MHz +?> +?> sudo airmon-ng stop wlan0mon +... +?> iw dev wlan0 info +Interface wlan0 + ifindex 7 + wdev 0x3 + addr a0:88:b4:9e:68:59 + type managed + wiphy 0 +``` + +As you can see, under the covers, airmon-ng deletes the specified nic +(wlan0 in this example), creates a new one, sets the mode to monitor and +sets the channel (10 in this case). While the physical index remains the +same, wiphy 0, the ifindex and wdev change. So, what looks like a simple +renaming of your nic and setting the mode to monitor is in face multiple +steps requiring several communications with the kernel. As stated previously, +I prefer the first method of setting a card to monitor because by +deleting all associated interfaces, there is a smaller risk of some other +process interfering with you. + +If you wanted, you could easily write your own python function to replicate +airmon-ng programmatically. as done below + +```python +import pyric +from pyric import pyw +from pyric.lib import libnl as nl + +def pymon(card, start=True, ch=None): + """ + sets the Card card monitor mode or returns it to managed mode + :param card: a Card object + :param start: True = set|False = reset + :param ch: initial ch to start on + :returns: the new card + """ + newcard = None + if start: + if pyw.modeget(card) == 'monitor': + raise RuntimeError("Card is already in monitor mode") + newcard = pyw.devset(card, card.dev + 'mon') + pyw.modeset(newcard, 'monitor') + if ch: pyw.chset(w1, ch, None) + pyw.up(newcard) + else: + if pyw.modeget(card) == 'managed': + raise RuntimeError("Card is not in monitor mode") + newcard = pyw.devset(card, card.dev[:-3) + pyw.modeset(newcard, 'managed') + pyw.up(newcard) + return newcard +``` + #### vi. STA Related Functions I have recently begun adding STA functionality to PyRIC. These are not necessarily required for a pentester, although the ability to disconnect @@ -497,13 +595,10 @@ whether the Card is transmitting (or receiving) 802.11n, the bitrate may include values for width, mcs-index and guard interval (gi). If we look up these values in Table 20-35 of IEEE Std 802.11-2012, we see that at 40 MHz width, an mcs-index of 14 with a short guard interval (400ns) -gives 270. +the rate = 270. One can also use pyw.stainfo to retrieve only tx/rx metrics. -Read the user guide, or type dir(pyw) in your console to get a full listing -of pyw functions. - #### vii. Miscelleaneous Utilities Several additional tools are located in the utils directory. Two of these are: * channels.py: defines ISM and UNII band channels/frequencies and provides diff --git a/TODO b/TODO index 5f9e351..43c3142 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,4 @@ -6) find a better way to get supported standards of a card - o once complete phyinfo should give us enought data to determine the standards - the Card supports -8) Two commands that would add information of minor value + 8) Two commands that would add information of minor value o ethtool. uses ioctl but does not follow same pattern as ifconfig seems to use - ethtool -i gives driver information including firmware-version @@ -52,15 +49,10 @@ NL80211_CMD_SET_QOS_MAP - need to identify a card that supports this command and determine that pyw does correctly identify it 26) need to parse dumps NLM_F_DUMP, for now we're good with link etc, so long - as the card is connected but it will come up eventually + as the card is connected but it may come up eventually 29) figure out how to parse the information element in pyw.link - there's some - good shit in it including the router os, type + good shit in it including sometimes the router os and type 31) add VHT processing to sta_info bitrate - 32) should we move wraith.standards.mcs here? It's only used once in PyRIC but - might make more sense here regardless. If so, we need to fix the "Table" IAW - IEEE Std 802.11-2012 Table 20-35 - 33) seq. # out of order error messages when preceding (persistent) socket.send - resulted in error 35) iw connect (on open) returns status of successful connect but card is not connected -> move to wpa_supplicant to see how they do it 36) do we need to write a find nested attribute? so we don't need to go iterate @@ -68,12 +60,10 @@ 39) parsing wiphy_bands o _HT_MCS_SET: a 16-bit attr containing the MCS set as defined in 802.11n (find this) o _HT_CAPA: as in the HT information IE - 40) look at packing netlink messages to ensure nesting still works - 41) would it be worthwhile to have nested return a tuple - t = (index,data) - instead of the function calling pulling index out, then parsing data? 42) is there a simple way to set the format strings as constants keeping in mind that things like strings require a length in the format string - 43) add nameset (iw phy set name 45) find out if some the 'flags' for bands are actually supported such as - HT40+ which should be disabled for channel 11 \ No newline at end of file + HT40+ which should be disabled for channel 11 + 46) max-tx for bands is showing 15 when iwconfig shows 30 + 47) in link, NL80211_BSS_BEACON_IES vs NL80211_BSS_INFORMATION_ELEMENT + BEACON_IES may not always be present \ No newline at end of file diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index c245af6f6e308b45c3d7a3e7c3adf332923caf91..137d5c0f04e08594ecbf1f691fe36b1e8ed72284 100644 GIT binary patch delta 13140 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 delta 13031 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 z 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 diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index be86903..71634bc 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -787,8 +787,8 @@ \subsection{Functions} supported frequencies \item devchs(card,[nlsock]): (iw phy card.phy info), type: netlink, get card's supported channels -\item devstds(card,[iosock]): (iwconfig card. | grep IEEE), type: ioctl, get -list of card's 802.11 supported standards +\item devstds(card,[nlsock]): (iwconfig card. | grep IEEE), type: nlsock, +returns a list of card's 802.11 supported standards by letter designator \item devmodes(card,[nlsock]): (iw phy card.phy info | grep interface), type: netlink, get card's supported modes \item devcmds(card,[nlsock]): (iw phy card.phy info | grep commands), type: @@ -817,6 +817,7 @@ \subsection{Functions} [flags]), type: netlink, set card's mode to mode with flags (if mode is monitor) \item modeget(card[nlsock]): (iw dev card. info | grep mode), type: netlink, get card's mode +\item devset(card,ndev,[nlsock]): (N/A) sets the dev (name) of card to ndev \item devadd(card,vnic,mode,[flags],[nlsock]): (iw phy card. interface add type flags ), type: netlink, creates a new virtual interface on card's phy with dev vdev, in mode and using flags. Note: flags are only supported diff --git a/examples/info.py b/examples/info.py index 1d3203b..7c095e3 100644 --- a/examples/info.py +++ b/examples/info.py @@ -72,8 +72,8 @@ def execute(dev,itype): msg += "\t * {0} Mbps\n".format(rate) msg += "\t Frequencies:\n" for i,rf in enumerate(pinfo['bands'][band]['rfs']): - msg += "\t * {0} Mbps ({1} dBm)".format(rf, - pinfo['bands'][band]['rf-data'][i]['max-tx']) + dbm = pinfo['bands'][band]['rf-data'][i]['max-tx'] + msg += "\t * {0} MHz ({1} dBm)".format(rf,dbm) if not pinfo['bands'][band]['rf-data'][i]['enabled']: msg += " (disabled)\n" else: @@ -91,11 +91,11 @@ def execute(dev,itype): dname = args.dev infotype = args.type if dname is None: - print "usage: python details.py -d [-t ]" + print "usage: python info.py -d [-t one of {all|if|dev|phy}]" sys.exit(0) if infotype is None: infotype = 'all' if infotype not in ['all','if','dev','phy']: - print "usage: python details.py -d [-t one of {all|if|dev|phy}]" + print "usage: python info.py -d [-t one of {all|if|dev|phy}]" sys.exit(0) execute(dname,infotype) except pyric.error as e: diff --git a/examples/pentest.py b/examples/pentest.py index 0691fd6..fd6634b 100644 --- a/examples/pentest.py +++ b/examples/pentest.py @@ -81,7 +81,7 @@ def execute(dev): pyw.devdel(pcard) print 'Restoring', card, 'mode =', dinfo['mode'], 'mac =', dinfo['mac'] - card = pyw.devadd(card,card,dinfo['mode']) + card = pyw.devadd(card,card.dev,dinfo['mode']) pyw.macset(card,dinfo['mac']) pyw.up(card) print "card ", card, " restored" diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 0be56fe..105d5fd 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -32,7 +32,7 @@ __name__ = 'libnl' __license__ = 'GPLv3' -__version__ = '0.1.0' +__version__ = '0.1.1' __date__ = 'July 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' @@ -241,14 +241,12 @@ def nl_recvmsg(sock): # If it was an ack, return the success code otherwise, reraise it. If it # wasn't an ack/nack, return the message msg = nlmsg_fromstream(sock.recv()) - #if msg.flags == nlh.NLM_F_DUMP: try: _ = nlmsg_fromstream(sock.recv()) except error as e: if e.errno == nlh.NLE_SUCCESS: pass else: raise - if sock.seq != msg.seq: - raise error(errno.EBADMSG,"seq. # out of order") + if sock.seq != msg.seq: raise error(errno.EBADMSG,"seq. # out of order") return msg except socket.timeout: raise error(-1,"socket timed out") @@ -331,12 +329,12 @@ def __repr__(self): ret += "genlmsghdr(cmd={0})\n".format(self.cmd) ret += "attributes:\n" for i,(a,v,d) in enumerate(self.attrs): + # getting character(s) in some bytestrings that cause the terminal to + # hang (why?) hexlify unspec and unpacked nested to avoid this if d == nlh.NLA_UNSPEC: - # getting character(s) in some bytestrings that cause the - # terminal to hang (why?) hexlify to avoid this v = hexlify(v) elif d == nlh.NLA_NESTED: - v = [hexlify(vi) for vi in v] + v = [(idx,hexlify(attr)) for idx,attr in v] ret += "\t{0}: type={1},datatype={2}\n\tvalue={3}\n".format(i,a,d,v) return ret @@ -488,34 +486,25 @@ def nla_parse(msg,l,mtype,stream,idx): elif dt == nlh.NLA_SET_U16: a = nla_parse_set(a,nlh.NLA_U16) elif dt == nlh.NLA_SET_U32: a = nla_parse_set(a,nlh.NLA_U32) elif dt == nlh.NLA_SET_U64: a = nla_parse_set(a,nlh.NLA_U64) - elif dt == nlh.NLA_NESTED: - try: - a = nla_parse_nested(a) - except error: - dt = nlh.NLA_ERROR + elif dt == nlh.NLA_NESTED: a = nla_parse_nested(a) nla_put(msg,a,atype,dt) - except struct.error: - # append as Error, stripping null bytes + except struct.error: # append as Error, stripping null bytes nla_put(msg,_nla_strip_(a),atype,nlh.NLA_ERROR) except error as e: - if e.errno == errno.EINVAL: - # a nested or set attribute failed to parse correctly + if e.errno == errno.EINVAL: # a nested or set failed to parse correctly nla_put(msg, _nla_strip_(a), atype, nlh.NLA_ERROR) else: raise - except MemoryError as e: - # hopefully don't get here + except MemoryError as e: # hopefully don't get here raise error(-1,"Attr type {0} of pol {1} failed: {2}".format(atype,pol,e)) idx = nlh.NLMSG_ALIGN(idx + alen) # move index to next attr def nla_parse_nested(nested): """ - :param nested: the nested attribute with attribute header & pad removed - :returns: list of 'packed' nested attributes after length and padding are - stripped - Callers must parse these themselves - NOTE: experimental ATT still determining if nl80211 has taken some - propietary treament(s) of nested attributes or if this is how nested - attributes should be handled + :param nested: the nested attribute with attribute header removed + :returns: list of tuples (index, data) where index is the index + into an enum structure and attribute is the packed attribute) + Callers must parse these themselves - see below for details From libnl (Thomas Graf) When nesting attributes, the nested attributes are included as payload of @@ -537,10 +526,9 @@ def nla_parse_nested(nested): where: Length (u16) is the length of the nested attribute (excluding padding - affixed to the end to align the attribute) - size of padding is determined by NLMSG_ALIGN - - Individual payloads will have the format + affixed to the end to align the attribute). The size of padding is + determined by NLMSG_ALIGN + Payload has the format: +-------+--------+-----+ | Index | Data | Pad | @@ -550,7 +538,7 @@ def nla_parse_nested(nested): where index is the index into an enum structure as determined by the attribute type of the nested attribute which is found in the Attribute Header - """ + """ ns = [] idx = 0 l = len(nested) @@ -559,7 +547,9 @@ def nla_parse_nested(nested): # include pad byte(s) affixed to end for proper alignment alen = struct.unpack_from('H', nested, idx)[0] if alen == 0: raise error(errno.EINVAL, "Invalid nesting") - ns.append(nested[idx+2:idx+alen]) # don't include the length bytes + #ns.append(nested[idx+2:idx+alen]) # don't include the length bytes + nattr = nested[idx + 2:idx + alen] + ns.append((struct.unpack_from('H',nattr,0)[0],nattr[2:])) idx += nlh.NLMSG_ALIGN(alen) return ns @@ -700,14 +690,18 @@ def _attrpack_(a,v,d): elif d == nlh.NLA_FLAG: attr = '' # a 0 sized attribute elif d == nlh.NLA_MSECS: attr = struct.pack("Q",v) elif d == nlh.NLA_NESTED: - # should it be '\x00' + struct.pack('B',nlen) + '\x00' ? & the - # pad at the end of '\x00' needs to be removed + # assumes a single layer of nesting for nested in v: - nlen = len(v) + 2 - #nattr = struct.pack('B',nlen) + nested + '\x00' - nattr = struct.pack('xBx', nlen) + nested + # prepend the packed index to the already packed attribute + # the align it + nattr = struct.pack('H',nested[0]) + nested[1] nattr += struct.pack("{0}x".format(nlh.NLMSG_ALIGNBY(len(nattr)))) attr += nattr + #for nested in v: + # nlen = len(v) + 2 + # nattr = struct.pack('xBx', nlen) + nested + # nattr += struct.pack("{0}x".format(nlh.NLMSG_ALIGNBY(len(nattr)))) + # attr += nattr else: fmt = "" # appease PyCharm if d == nlh.NLA_SET_U8: fmt = "B" diff --git a/pyric/pyw.py b/pyric/pyw.py index 3374515..3df5811 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -68,7 +68,7 @@ __name__ = 'pyw' __license__ = 'GPLv3' -__version__ = '0.1.7' +__version__ = '0.1.8' __date__ = 'July 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' @@ -211,7 +211,7 @@ def regset(rd, *argv): flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) nl.nla_put_string(msg, rd.upper(), nl80211h.NL80211_ATTR_REG_ALPHA2) nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) + _ = nl.nl_recvmsg(nlsock) except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -997,28 +997,25 @@ def devstds(card, *argv): """ gets card's wireless standards (iwconfig | grep IEEE :param card: Card object - :param argv: ioctl socket at argv[0] (or empty) + :param argv: netlink socket at argv[0] (or empty) :returns: list of standards (letter designators) """ try: - iosock = argv[0] + nlsock = argv[0] except IndexError: - return _iostub_(devstds, card) - - try: - flag = sioch.SIOCGIWNAME - ret = io.io_transfer(iosock, flag,ifh.ifreq(card.dev, flag)) - stds = ret[ifh.IFNAMELEN:] # get the standards - stds = stds[:stds.find('\x00')] # remove nulls - stds = stds.replace('IEEE 802.11', '') # remove IEEE 802.11 - return [std for std in stds] - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except IndexError: return None - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - except io.error as e: - raise pyric.error(e.errno, e.strerror) + return _nlstub_(devstds, card) + + stds = [] + bands = phyinfo(card,nlsock)['bands'] + if '5GHz' in bands: stds.append('a') + if '2GHz' in bands: stds.extend(['b','g']) # assume backward compat with b + HT = VHT = True + for band in bands: + HT &= bands[band]['HT'] + VHT &= bands[band]['VHT'] + if HT: stds.append('n') + if VHT: stds.append('ac') + return stds def devmodes(card, *argv): """ @@ -1208,19 +1205,16 @@ def phyinfo(card, *argv): # they should no longer result in a NLA_ERROR but just in case... _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_BANDS, False) if d != nlh.NLA_ERROR: info['bands'] = _bands_(bs) - #else: info['freqs'] = _unparsed_rf_(bs) _, cs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CIPHER_SUITES, False) if d != nlh.NLA_ERROR: info['ciphers'] = _ciphers_(cs) - # supported iftypes, sw iftypes are IAW nl80211.h flags + # supported iftypes, sw iftypes are IAW nl80211.h flags (no attribute data) _, ms, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_IFTYPES, False) - if d != nlh.NLA_ERROR: - info['modes'] = [_iftypes_(struct.unpack_from('H', m, 0)[0]) for m in ms] + if d != nlh.NLA_ERROR: info['modes'] = [_iftypes_(iftype) for iftype,_ in ms] _, ms, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SOFTWARE_IFTYPES, False) - if d != nlh.NLA_ERROR: - info['swmodes'] = [_iftypes_(struct.unpack_from('H', m, 0)[0]) for m in ms] + if d != nlh.NLA_ERROR: info['swmodes'] = [_iftypes_(iftype) for iftype,_ in ms] # get supported commands _, cs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_COMMANDS, False) @@ -1269,9 +1263,9 @@ def txset(card, setting, lvl, *argv): if setting != nl80211h.NL80211_TX_POWER_AUTOMATIC: nl.nla_put_u32(msg, 100*lvl, nl80211h.NL80211_ATTR_WIPHY_TX_POWER_LEVEL) nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) + _ = nl.nl_recvmsg(nlsock) except ValueError: - # only relevent when converting to mbm + # converting to mBm raise pyric.error(pyric.EINVAL, "Invalid txpwr {0}".format(lvl)) except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") @@ -1373,7 +1367,7 @@ def freqset(card, rf, chw=None, *argv): nl.nla_put_u32(msg, rf, nl80211h.NL80211_ATTR_WIPHY_FREQ) nl.nla_put_u32(msg, chw, nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) + _ = nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: @@ -1405,7 +1399,8 @@ def modeset(card, mode, flags=None, *argv): :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} :param flags: list of monitor flags (can only be used if card is being set - to monitor mode) + to monitor mode) neof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' + |'cook'|'active'} :param argv: netlink socket at argv[0] (or empty) """ if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') @@ -1433,7 +1428,7 @@ def modeset(card, mode, flags=None, *argv): MNTRFLAGS.index(flag), nl80211h.NL80211_ATTR_MNTR_FLAGS) nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) + _ = nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: @@ -1464,6 +1459,41 @@ def ifaces(card, *argv): raise pyric.error(e.errno, e.strerror) return ifs +def devset(card, ndev, *argv): + """ + REQUIRES ROOT PRIVILEGES + changes card's dev to ndev + :param card: Card object + :param ndev: new dev name + :param argv: netlink socket at argv[0] (or empty) + :returns: the new card object + #NOTE: + o via netlink one can set a new physical name but we want the ability to + set a new dev. + o this is not a true set name: it adds a new card with ndev as the dev then + deletes the current card, returning the new card + - in effect, it will appear as if the card as a new name but, it will also + have a new ifindex + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(devset, card, ndev) + + new = None # appease PyCharm + try: + new = devadd(card, ndev, modeget(card, nlsock), None, nlsock) + devdel(card, nlsock) + except pyric.error: + # try and restore the system i.e. delete new if possible + if new: + try: + devdel(new, nlsock) + except pyric.error: + pass + raise + return new + def devadd(card, vdev, mode, flags=None, *argv): """ REQUIRES ROOT PRIVILEGES @@ -1539,7 +1569,7 @@ def devdel(card, *argv): flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) + _ = nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: @@ -1582,7 +1612,7 @@ def disconnect(card, *argv): flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) + _ = nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: @@ -1634,7 +1664,6 @@ def link(card, *argv): nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) - #return rmsg except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: @@ -1646,68 +1675,64 @@ def link(card, *argv): 'chw': None, 'stat': None,'tx': {}, 'rx': {}} _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_BSS, False) - for b in bs: + if d == nlh.NLA_ERROR: return info + for idx, attr in bs: + # any errors attempting to parse -> leave as default None, empty try: - # pull of the two-byte index into the nl80211_bss enum - i = struct.unpack_from('H', b, 0)[0] # pull off the two-byte index - if i == nl80211h.NL80211_BSS_BSSID: - info['bssid'] = _hex2mac_(b[2:]) - if i == nl80211h.NL80211_BSS_FREQUENCY: - info['freq'] = struct.unpack_from('I', b, 2)[0] - if i == nl80211h.NL80211_BSS_SIGNAL_MBM: - info['rss'] = struct.unpack_from('i', b, 2)[0] / 100 - if i == nl80211h.NL80211_BSS_INFORMATION_ELEMENTS: + if idx == nl80211h.NL80211_BSS_BSSID: + info['bssid'] = _hex2mac_(attr) + if idx == nl80211h.NL80211_BSS_FREQUENCY: + info['freq'] = struct.unpack_from('I', attr, 0)[0] + if idx == nl80211h.NL80211_BSS_SIGNAL_MBM: + info['rss'] = struct.unpack_from('i', attr, 0)[0] / 100 + if idx == nl80211h.NL80211_BSS_INFORMATION_ELEMENTS: # hacking the proprietary info element attribute: (it should # be a nested attribute itself, but I have currently no way of # knowing what the individual indexes would mean - # "\x06\x00\x00SSID..... - # the ssid is the first element (from what I've seen). Get the - # length of the ssid which is the fourth byte, then unpack + # "\x06\x00\x00SSID..... + # '\x06\x00' is the ie index & the ssid is the first element + # (from what I've seen). This is not nested. Not sure if the + # length is the first two bytes or just the second Get the length of the ssid which is the 3rd,4th byte, then unpack # the string starting at the fifth byte up to the length - l = struct.unpack_from('B',b,3)[0] - info['ssid'] = struct.unpack_from('{0}s'.format(l),b,4)[0] - if i == nl80211h.NL80211_BSS_BEACON_INTERVAL: - info['int'] = struct.unpack_from('H', b, 2)[0] - if i == nl80211h.NL80211_BSS_CHAN_WIDTH: - j = struct.unpack_from('I', b, 2)[0] + try: + l = struct.unpack_from('>H', attr, 0)[0] # have to change the format + info['ssid'] = struct.unpack_from('{0}s'.format(l), attr, 2)[0] + except struct.error: + pass + if idx == nl80211h.NL80211_BSS_BEACON_INTERVAL: + info['int'] = struct.unpack_from('H', attr, 0)[0] + if idx == nl80211h.NL80211_BSS_CHAN_WIDTH: + j = struct.unpack_from('I', attr, 0)[0] info['chw'] = nl80211h.NL80211_BSS_CHAN_WIDTHS[j] - if i == nl80211h.NL80211_BSS_STATUS: - j = struct.unpack_from('I', b, 2)[0] + if idx == nl80211h.NL80211_BSS_STATUS: + j = struct.unpack_from('I', attr, 0)[0] info['stat'] = nl80211h.NL80211_BSS_STATUSES[j] - except (struct.error,IndexError): + except struct.error: pass # process stainfo of AP - if info['bssid']: + try: sinfo = stainfo(card, info['bssid'], nlsock) - if sinfo is not None: # just in case - try: - # tx data - info['tx'] = { - 'bytes': sinfo['tx-bytes'], - 'pkts': sinfo['tx-pkts'], - 'failed': sinfo['tx-failed'], - 'retries': sinfo['tx-retries'], - 'bitrate': {'rate': sinfo['tx-bitrate']['rate'] * 0.1} - } - if sinfo['tx-bitrate'].has_key('mcs-index'): - info['tx']['bitrate']['mcs-index'] = sinfo['tx-bitrate']['mcs-index'] - info['tx']['bitrate']['gi'] = sinfo['tx-bitrate']['gi'] - info['tx']['bitrate']['width'] = sinfo['tx-bitrate']['width'] - - # rx data - info['rx'] = { - 'bytes': sinfo['rx-bytes'], - 'pkts':sinfo['rx-pkts'], - 'bitrate': {'rate': sinfo['rx-bitrate']['rate'] * 0.1} - } - if sinfo['rx-bitrate'].has_key('mcs-index'): - info['rx']['bitrate']['mcs-index'] = sinfo['rx-bitrate']['mcs-index'] - info['rx']['bitrate']['gi'] = sinfo['rx-bitrate']['gi'] - info['rx']['bitrate']['width'] = sinfo['rx-bitrate']['width'] - except (KeyError,TypeError,AttributeError): - # ignore for now, returning what we got - pass + info['tx'] = {'bytes': sinfo['tx-bytes'], + 'pkts': sinfo['tx-pkts'], + 'failed': sinfo['tx-failed'], + 'retries': sinfo['tx-retries'], + 'bitrate': {'rate': sinfo['tx-bitrate']['rate']}} + if sinfo['tx-bitrate'].has_key('mcs-index'): + info['tx']['bitrate']['mcs-index'] = sinfo['tx-bitrate']['mcs-index'] + info['tx']['bitrate']['gi'] = sinfo['tx-bitrate']['gi'] + info['tx']['bitrate']['width'] = sinfo['tx-bitrate']['width'] + + info['rx'] = {'bytes': sinfo['rx-bytes'], + 'pkts':sinfo['rx-pkts'], + 'bitrate': {'rate': sinfo['rx-bitrate']['rate']}} + if sinfo['rx-bitrate'].has_key('mcs-index'): + info['rx']['bitrate']['mcs-index'] = sinfo['rx-bitrate']['mcs-index'] + info['rx']['bitrate']['gi'] = sinfo['rx-bitrate']['gi'] + info['rx']['bitrate']['width'] = sinfo['rx-bitrate']['width'] + except (KeyError,TypeError,AttributeError): + # ignore for now, returning what we got + pass return info @@ -1750,7 +1775,7 @@ def stainfo(card, mac, *argv): nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) nl.nla_put_unspec(msg, _mac2hex_(mac), nl80211h.NL80211_ATTR_MAC) nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) + rmsg = nl.nl_recvmsg(nlsock) except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: @@ -1761,27 +1786,26 @@ def stainfo(card, mac, *argv): 'tx-bitrate':{}, 'rx-bitrate':{}} _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_STA_INFO, False) - for b in bs: + for sidx, sattr in bs: # sidx indexes the enum nl80211_sta_info try: - # pull of the two-byte index into the nl80211_bss enum - i = struct.unpack_from('H', b, 0)[0] - if i == nl80211h.NL80211_STA_INFO_RX_BYTES: - info['rx-bytes'] = struct.unpack_from('I', b, 2)[0] - elif i == nl80211h.NL80211_STA_INFO_TX_BYTES: - info['tx-bytes'] = struct.unpack_from('I', b, 2)[0] - elif i == nl80211h.NL80211_STA_INFO_RX_PACKETS: - info['rx-pkts'] = struct.unpack_from('I', b, 2)[0] - elif i == nl80211h.NL80211_STA_INFO_TX_PACKETS: - info['tx-pkts'] = struct.unpack_from('I', b, 2)[0] - elif i == nl80211h.NL80211_STA_INFO_TX_RETRIES: - info['tx-retries'] = struct.unpack_from('I', b, 2)[0] - elif i == nl80211h.NL80211_STA_INFO_TX_FAILED: - info['tx-failed'] = struct.unpack_from('I', b, 2)[0] - elif i == nl80211h.NL80211_STA_INFO_TX_BITRATE: - info['tx-bitrate'] = _rateinfo_(b[2:]) - elif i == nl80211h.NL80211_STA_INFO_RX_BITRATE: - info['rx-bitrate'] = _rateinfo_(b[2:]) - except (struct.error, IndexError): + if sidx == nl80211h.NL80211_STA_INFO_RX_BYTES: + info['rx-bytes'] = struct.unpack_from('I', sattr, 0)[0] + elif sidx == nl80211h.NL80211_STA_INFO_TX_BYTES: + info['tx-bytes'] = struct.unpack_from('I', sattr, 0)[0] + elif sidx == nl80211h.NL80211_STA_INFO_RX_PACKETS: + info['rx-pkts'] = struct.unpack_from('I', sattr, 0)[0] + elif sidx == nl80211h.NL80211_STA_INFO_TX_PACKETS: + info['tx-pkts'] = struct.unpack_from('I', sattr, 0)[0] + elif sidx == nl80211h.NL80211_STA_INFO_TX_RETRIES: + info['tx-retries'] = struct.unpack_from('I', sattr, 0)[0] + elif sidx == nl80211h.NL80211_STA_INFO_TX_FAILED: + info['tx-failed'] = struct.unpack_from('I', sattr, 0)[0] + elif sidx == nl80211h.NL80211_STA_INFO_TX_BITRATE: + info['tx-bitrate'] = _rateinfo_(sattr) + elif sidx == nl80211h.NL80211_STA_INFO_RX_BITRATE: + info['rx-bitrate'] = _rateinfo_(sattr) + except struct.error: + # ignore this and hope other elements still work pass return info @@ -1946,43 +1970,40 @@ def _bands_(bs): # NOTE: in addition to RF and rates there are HT data included in the # band info ATT we do not parse these (see "phy info notes 3.txt") bands = {} - for band in bs: - # the first two bytes tell us what band were in (enum nl80211_band) - bi = struct.unpack_from('H', band, 0)[0] + for idx, band in bs: + # the index tell us what band were in (enum nl80211_band) try: - bi = nl80211h.NL80211_BANDS[bi] + idx = nl80211h.NL80211_BANDS[idx] except IndexError: - bi = "UNK ({0})".format(bi) - bands[bi] = {'HT': False, + idx = "UNK ({0})".format(idx) + bands[idx] = {'HT': False, 'VHT': False, 'rates': None, 'rfs': None, 'rf-data': None} # now we delve into multiple levels of nesting - battrs = nl.nla_parse_nested(band[2:]) # skip the band index - for battr in battrs: - # Here is were a find nested would come in handy - # Also, there are other data here (see nl80211_h nl80211_band_attr) - i = struct.unpack_from('H', battr, 0)[0] - if i == nl80211h.NL80211_BAND_ATTR_RATES: + for bidx,battr in nl.nla_parse_nested(band): + # There are other data here (see nl80211_h nl80211_band_attr) + # that we are not currently using + if bidx == nl80211h.NL80211_BAND_ATTR_RATES: try: - bands[bi]['rates'] = _band_rates_(battr[2:]) - except (nl.error,struct.error): - bands[bi]['rates'] = [] - elif i == nl80211h.NL80211_BAND_ATTR_FREQS: + bands[idx]['rates'] = _band_rates_(battr) + except nl.error: + bands[idx]['rates'] = [] + elif bidx == nl80211h.NL80211_BAND_ATTR_FREQS: try: - bands[bi]['rfs'], bands[bi]['rf-data'] = _band_rfs_(battr[2:]) - except (nl.error,struct.error): - bands[bi]['freqs'], bands[bi]['rf-data'] = [], [] - elif i in [nl80211h.NL80211_BAND_ATTR_HT_MCS_SET, - nl80211h.NL80211_BAND_ATTR_HT_CAPA, - nl80211h.NL80211_BAND_ATTR_HT_AMPDU_FACTOR, - nl80211h.NL80211_BAND_ATTR_HT_AMPDU_DENSITY]: - bands[bi]['HT'] = True - elif i in [nl80211h.NL80211_BAND_ATTR_VHT_MCS_SET, - nl80211h.NL80211_BAND_ATTR_VHT_CAPA]: - bands[bi]['VHT'] = True + bands[idx]['rfs'], bands[idx]['rf-data'] = _band_rfs_(battr) + except nl.error: + bands[idx]['rfs'], bands[idx]['rf-data'] = [], [] + elif bidx in [nl80211h.NL80211_BAND_ATTR_HT_MCS_SET, + nl80211h.NL80211_BAND_ATTR_HT_CAPA, + nl80211h.NL80211_BAND_ATTR_HT_AMPDU_FACTOR, + nl80211h.NL80211_BAND_ATTR_HT_AMPDU_DENSITY]: + bands[idx]['HT'] = True + elif bidx in [nl80211h.NL80211_BAND_ATTR_VHT_MCS_SET, + nl80211h.NL80211_BAND_ATTR_VHT_CAPA]: + bands[idx]['VHT'] = True return bands def _band_rates_(rs): @@ -1992,32 +2013,29 @@ def _band_rates_(rs): :returns: a list of rates in Mbits NOTE: ATT we ignore any short preamble specifier """ - # rs is an unpacked nested attribute, get the nested attributes are a list - # of bitrates each bitrate itself being a nested attribute. The bitrate - # attribute will be: a counter and another nested attribute containing - # a rate (index = \x01) and a flag (= \x02) if the rate supports - # short preamble - these indexes index the enum nl80211_bitrate_attr rates = [] - for attr in nl.nla_parse_nested(rs): - for bitrate in nl.nla_parse_nested(attr[2:]): # first two bytes are a counter - i = struct.unpack_from('H', bitrate, 0)[0] - if i == nl80211h.NL80211_BITRATE_ATTR_RATE: - rates.append(struct.unpack_from('I', bitrate, 2)[0] * 0.1) + # unlike other nested attributes, the 'index' into rates is actually + # a counter (which we'll ignore) + for _, attr in nl.nla_parse_nested(rs): + # the nested attribute itself is a nested attribute. The idx indexes + # the enum nl80211_bitrate_attr of which we are only concerned w/ rate + for idx, bitattr in nl.nla_parse_nested(attr): + if idx == nl80211h.NL80211_BITRATE_ATTR_RATE: + rates.append(struct.unpack_from('I', bitattr, 0)[0] * 0.1) return rates def _band_rfs_(rs): """ unpacks individual RFs (and accompanying data) from packed rfs - :param rfs: packed frequencies - :returns: a tuple t = (freqs: list of supported RFS (MHz), data: list of dicts) + :param rs: packed frequencies + :returns: a tuple t = (freqs: list of supported RFS (MHz), data: list of dicts) where for each i in freqs, data[i] is the corresponding data having the form {} """ rfs = [] rfds = [] - for attr in nl.nla_parse_nested(rs): - # attr is a counter and a nested attribute (nl80211_frequency_attr) - + # like rates, the index here is a counter and fattr is a nested attribute + for _, fattr in nl.nla_parse_nested(rs): # RF data being compiled ATT we are ignoring DFS related and infrared # related. rfd is initially defined with max-tx, radar, 20Mhz and 10Mhz # with 'default' values. @@ -2025,35 +2043,35 @@ def _band_rfs_(rs): # be appended to not-permitted as the following strings # HT40-, HT40+, 80MHz, 160MHz and outdoor. # If present in not-permitted, they represent False Flags - rfd = {'max-tx': 0, # Card's maximum tx-power on this RF - 'enabled': True, # w/ current reg. dom. RF is enabled - '20Mhz': True, # w/ current reg. dom. 20MHz operation is allowed - '10Mhz': True, # w/ current reg. dom. 10MHz operation is allowed - 'radar': False, # w/ current reg. dom. radar detec. required on RF - 'not-permitted': []} # additional flags - for fattr in nl.nla_parse_nested(attr[2:]): - # first two bytes are index into enum nl80211_frequency_attr - i = struct.unpack_from('H', fattr, 0)[0] - if i == nl80211h.NL80211_FREQUENCY_ATTR_FREQ: - rfs.append(struct.unpack_from('I', fattr[2:], 0)[0]) - elif i == nl80211h.NL80211_FREQUENCY_ATTR_DISABLED: + rfd = { + 'max-tx': 0, # Card's maximum tx-power on this RF + 'enabled': True, # w/ current reg. dom. RF is enabled + '20Mhz': True, # w/ current reg. dom. 20MHz operation is allowed + '10Mhz': True, # w/ current reg. dom. 10MHz operation is allowed + 'radar': False, # w/ current reg. dom. radar detec. required on RF + 'not-permitted': [] # additional flags + } + for rfi, rfattr in nl.nla_parse_nested(fattr): + # rfi is the index into enum nl80211_frequency_attr + if rfi == nl80211h.NL80211_FREQUENCY_ATTR_FREQ: + rfs.append(struct.unpack_from('I', rfattr, 0)[0]) + elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_DISABLED: rfd['enabled'] = False - elif i == nl80211h.NL80211_FREQUENCY_ATTR_MAX_TX_POWER: - # convert mBm to dBm - rfd['max-tx'] = struct.unpack_from('I', fattr[2:], 0)[0] * 0.01 - elif i == nl80211h.NL80211_FREQUENCY_ATTR_NO_HT40_MINUS: + elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_MAX_TX_POWER: # in mBm + rfd['max-tx'] = struct.unpack_from('I', rfattr, 0)[0] / 100 + elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_NO_HT40_MINUS: rfd['not-permitted'].append('HT40-') - elif i == nl80211h.NL80211_FREQUENCY_ATTR_NO_HT40_PLUS: + elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_NO_HT40_PLUS: rfd['not-permitted'].append('HT40+') - elif i == nl80211h.NL80211_FREQUENCY_ATTR_NO_80MHZ: + elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_NO_80MHZ: rfd['not-permitted'].append('80MHz') - elif i == nl80211h.NL80211_FREQUENCY_ATTR_NO_160MHZ: + elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_NO_160MHZ: rfd['not-permitted'].append('160MHz') - elif i == nl80211h.NL80211_FREQUENCY_ATTR_INDOOR_ONLY: + elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_INDOOR_ONLY: rfd['not-permitted'].append('outdoor') - elif i == nl80211h.NL80211_FREQUENCY_ATTR_NO_20MHZ: + elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_NO_20MHZ: rfd['20MHz'] = False - elif i == nl80211h.NL80211_FREQUENCY_ATTR_NO_10MHZ: + elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_NO_10MHZ: rfd['10MHz'] = False rfds.append(rfd) return rfs, rfds @@ -2077,15 +2095,15 @@ def _commands_(command): :returns: list of supported commands as strings """ cs = [] - for cmd in command: + for _,cmd in command: # rather than index, commands use a counter, ignore it try: - # commands are listed |count|command| + # <- 2 -><- 4 -> # ignore count, use numeric command to lookup string version in form # @NL80211_CMD_ and strip "@NL80211_CMD_". NOTE: some numeric # commands may have multiple string synonyms, in that case, take the # first one. Finally, make it lowercase - cmd = cmdbynum(struct.unpack_from('I', cmd, 2)[0]) + cmd = cmdbynum(struct.unpack_from('I', cmd, 0)[0]) if type(cmd) is type([]): cmd = cmd[0] cs.append(cmd[13:].lower()) # skip NL80211_CMD_ except KeyError: @@ -2094,16 +2112,16 @@ def _commands_(command): cs.append("unknown cmd ({0})".format(cmd)) return cs -def _ciphers_(cipher): +def _ciphers_(ciphers): """ identifies supported ciphers - :param cipher: the cipher suite stream + :param ciphers: the cipher suite stream :returns: a list of supported ciphers """ ss = [] - for s in cipher: + for cipher in ciphers: # ciphers is a set and not nested try: - ss.append(wlan.WLAN_CIPHER_SUITE_SELECTORS[s]) + ss.append(wlan.WLAN_CIPHER_SUITE_SELECTORS[cipher]) except KeyError as e: # we could do nothing, or append 'rsrv' but we'll add a little # for testing/future identificaion purposes @@ -2124,21 +2142,15 @@ def _rateinfo_(ri): width: channel width oneof {20|40} NOTE: references enum nl80211_rate_info """ - bitrate = {'rate': None, 'legacy': None, 'mcs-index': None, 'gi': 1, 'width': 20} - - try: - brs = nl.nla_parse_nested(ri) - except nl.error: - return {} - - for br in brs: - i = struct.unpack_from('H', br, 0)[0] + bitrate = {'rate': None, 'legacy': None, 'mcs-index': None, + 'gi': 1, 'width': 20} + for i, attr in nl.nla_parse_nested(ri): if i == nl80211h.NL80211_RATE_INFO_BITRATE32: - bitrate['rate'] = struct.unpack_from('I', br, 2)[0] + bitrate['rate'] = struct.unpack_from('I', attr, 0)[0] * 0.1 elif i == nl80211h.NL80211_RATE_INFO_BITRATE: # legacy fallback rate - bitrate['legacy'] = struct.unpack_from('H', br, 2)[0] + bitrate['legacy'] = struct.unpack_from('H', attr, 0)[0] elif i == nl80211h.NL80211_RATE_INFO_MCS: - bitrate['mcs-index'] = struct.unpack_from('B', br, 2)[0] + bitrate['mcs-index'] = struct.unpack_from('B', attr, 0)[0] elif i == nl80211h.NL80211_RATE_INFO_40_MHZ_WIDTH: # flag bitrate['width'] = 40 elif i == nl80211h.NL80211_RATE_INFO_SHORT_GI: # flag @@ -2203,7 +2215,8 @@ def _familyid_(nlsock): msg = nl.nlmsg_new(nltype=genlh.GENL_ID_CTRL, cmd=genlh.CTRL_CMD_GETFAMILY, flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_string(msg, nl80211h.NL80211_GENL_NAME, + nl.nla_put_string(msg, + nl80211h.NL80211_GENL_NAME, genlh.CTRL_ATTR_FAMILY_NAME) nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) @@ -2272,4 +2285,4 @@ def _fut_chset(card, ch, chw, *argv): nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) - nl.nl_recvmsg(nlsock) \ No newline at end of file + _ = nl.nl_recvmsg(nlsock) \ No newline at end of file From a40dc23b821d236f419c69d1f25efa6b560d1071 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Wed, 13 Jul 2016 10:34:58 -0600 Subject: [PATCH 070/121] v0.1.5 README formatting --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 9e5f258..f29510c 100644 --- a/README.md +++ b/README.md @@ -392,11 +392,6 @@ Band: 2GHz HT True False [1.0, 2.0, 5.5, 11.0, 6.0, 9.0, 12.0, 18.0, 24.0, 36.0, 48.0, 54.0] [2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472] - ->>> pinfo['freqs'] -[2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, -5180, 5200, 5220, 5240, 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, -5600, 5620, 5640, 5660, 5680, 5700, 5745, 5765, 5785, 5805, 5825] >>> ``` From e3d93caafcff3ce2c90b57b0c9c748a7fce8bbb5 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Wed, 13 Jul 2016 11:47:14 -0600 Subject: [PATCH 071/121] v0.1.5 README formatting --- README.md | 6 +----- TODO | 21 --------------------- 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/README.md b/README.md index f29510c..734bd14 100644 --- a/README.md +++ b/README.md @@ -33,11 +33,7 @@ was to provide a simple interface to the underlying nl80211 kernel support, handling the complex operations of Netlink seamlessy while maintaining a minimum of "code walking" to understand, modify and extend. But, why stop there? Since it's initial inception, PyRIC has grown. PyRIC puts iw, ifconfig, rfkill, -udevadm, airmon-ng and macchanger - - to include ioctl support to replicate -features of ifconfig such as getting or setting the mac address and has recently -implemented rkill support to soft block or unblock wireless cards. +udevadm, airmon-ng and macchanger. ### a. Additions to iw Several "extensions" have been added to iw: diff --git a/TODO b/TODO index 43c3142..5e0a762 100644 --- a/TODO +++ b/TODO @@ -27,27 +27,6 @@ - no errors reported but tx power is not changed o Is the operation not supported by my cards? or is it not supported by the kernel? - 23) Unknown Command 104. After updating to kernel 4, iw phy info returns - a Unknown command (104). pyw.phyinfo does not return this. - - iw 3.17 being used - - command 104 is NL80211_CMD_SET_QOS_MAP - - iw->util.c: - const char *command_name(enum nl80211_commands cmd) - { - if (cmd <= NL80211_CMD_MAX && commands[cmd]) - return commands[cmd]; - sprintf(cmdbuf, "Unknown command (%d)", cmd); - return cmdbuf; - } - - iw's nl80211.h defines NL80211_CMD_SET_QOS_MAP but util.c does not specify - this command in commands which explains the unknown command. - - I've gone through the stream returned from the kernel for a wiphy request - and pyw is not getting this command - - It does not look like iw is hardcoding this but I cannot see any other way. - - If this command was being returned, pyw would correctly identify it as - NL80211_CMD_SET_QOS_MAP - need to identify a card that supports this command - and determine that pyw does correctly identify it 26) need to parse dumps NLM_F_DUMP, for now we're good with link etc, so long as the card is connected but it may come up eventually 29) figure out how to parse the information element in pyw.link - there's some From 569a9f752653687000935df2ff132fb1091a5c62 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Wed, 13 Jul 2016 22:51:33 -0600 Subject: [PATCH 072/121] v0.1.5 phylist w.r.t Issue #17 --- CHANGES | 4 +++- README.md | 2 ++ docs/PyRIC.pdf | Bin 506817 -> 507207 bytes docs/PyRIC.tex | 2 ++ pyric/pyw.py | 12 ++++++++++++ pyric/utils/hardware.py | 2 +- 6 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index b073b2e..22ab545 100644 --- a/CHANGES +++ b/CHANGES @@ -123,6 +123,7 @@ v 0.1.5 Begin STA associated functionality - link - stainfo - devset + - phylist o updated nested netlink attribute handling - my understanding of it was incomplete - There are still occasional errors - nested attributes are parsed as 'far' as possible @@ -142,4 +143,5 @@ v 0.1.5 Begin STA associated functionality testing confirms that the new nla_parse_nested is bug-free) o fixed error on devadd during restoration in examples/pentest.py o fixed output error, incorrect labeling - o fixed output error ASW max tx power \ No newline at end of file + o fixed output error ASW max tx power + o added phylist w.r.t issue #17 \ No newline at end of file diff --git a/README.md b/README.md index 734bd14..93b6db4 100644 --- a/README.md +++ b/README.md @@ -205,6 +205,8 @@ False False >>> pyw.iswinterface('wlan0') True +>>> pyw.phylist() # list all current phys (Note device ASW phy1) +[(1,'phy1), (0, 'phy0')] >>> pyw.regget() # get the regulatory domain 'US' >>> pyw.regset('BO') # set the regulatory domain diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 137d5c0f04e08594ecbf1f691fe36b1e8ed72284..2f9bbfe0e1c654ab739a520dba6ea06783f8c882 100644 GIT binary patch delta 17306 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, type: ioctl, check dev is a wireless interface +\item phylist(): (iw phy | grep wiphy) type: N/A, list phy indexes and phy names +present on system \item regget([nlsock]: (iw reg get), type: netlink, get regulatory domain \item regset(rd,[nlsock]): (iw reg set ), type: netlink, set regulatory domain to rd diff --git a/pyric/pyw.py b/pyric/pyw.py index 3df5811..feba91b 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -170,6 +170,18 @@ def iswireless(dev, *argv): if e.errno == pyric.ENODEV or e.errno == pyric.EOPNOTSUPP: return False else: raise pyric.error(e.errno, e.strerror) +def phylist(): + """ :returns: a list of tuples t = (physical indexe, physical name) """ + # we could walk the directory /sys/class/ieee80211 as well but we'll + # let rfkill do it (just in case the above path differs across distros or + # in future upgrades + phys = [] + rfdevs = rfkill.rfkill_list() + for rfk in rfdevs: + if rfdevs[rfk]['type'] == 'wlan': + phys.append((int(rfk.split('phy')[1]),rfk)) + return phys + def regget(*argv): """ gets the current regulatory domain (iw reg get) diff --git a/pyric/utils/hardware.py b/pyric/utils/hardware.py index f68777a..022860e 100644 --- a/pyric/utils/hardware.py +++ b/pyric/utils/hardware.py @@ -20,7 +20,7 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. -Defines device hardware related functions: mac address, driver, chipset +Defines device hardware related functions: mac address, driver, chipset etc """ From 59dec69fa2a8d7474404ac0ecca2c42c9141ddae Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Thu, 14 Jul 2016 22:14:32 -0600 Subject: [PATCH 073/121] v0.1.5 minor --- TODO | 10 +++++----- setup.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/TODO b/TODO index 5e0a762..fc2db6d 100644 --- a/TODO +++ b/TODO @@ -31,8 +31,10 @@ as the card is connected but it may come up eventually 29) figure out how to parse the information element in pyw.link - there's some good shit in it including sometimes the router os and type + o in link, NL80211_BSS_BEACON_IES vs NL80211_BSS_INFORMATION_ELEMENT + BEACON_IES may not always be presenet but appears to contain more 31) add VHT processing to sta_info bitrate - 35) iw connect (on open) returns status of successful connect but card is + 35) iw connect (open) returns status of successful connect but card is not connected -> move to wpa_supplicant to see how they do it 36) do we need to write a find nested attribute? so we don't need to go iterate a list of attributes to find one @@ -41,8 +43,6 @@ o _HT_CAPA: as in the HT information IE 42) is there a simple way to set the format strings as constants keeping in mind that things like strings require a length in the format string - 45) find out if some the 'flags' for bands are actually supported such as + 45) find out if some of the 'flags' for bands are actually correct such as HT40+ which should be disabled for channel 11 - 46) max-tx for bands is showing 15 when iwconfig shows 30 - 47) in link, NL80211_BSS_BEACON_IES vs NL80211_BSS_INFORMATION_ELEMENT - BEACON_IES may not always be present \ No newline at end of file + 46) max-tx for bands is showing 15 when iwconfig shows 30 \ No newline at end of file diff --git a/setup.py b/setup.py index 1dc003c..e896bc6 100644 --- a/setup.py +++ b/setup.py @@ -38,7 +38,7 @@ version=pyric.version, description="Python Wireless Library", long_description=pyric.long_desc, - url='https://github.com/wraith-wireless/PyRIC/', + url='http://wraith-wireless.github.io/PyRIC/', download_url="https://github.com/wraith-wireless/pyric/archive/"+pyric.version+".tar.gz", author=pyric.__author__, author_email=pyric.__email__, From ac5eda89deb1c1ad7c038cece8e4c9117ee084ec Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Thu, 14 Jul 2016 22:36:44 -0600 Subject: [PATCH 074/121] v0.1.5 move two TODO to Issues page --- TODO | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/TODO b/TODO index fc2db6d..abfe313 100644 --- a/TODO +++ b/TODO @@ -17,32 +17,20 @@ o dd-wrt/OpenWRT 21) look at NL80211_CMD_START_AP - no need to try and recreate the wheel by replicate hostap but could be useful - 22) txset - o NOTE: the following is consistent with what iw gives us - o when using dBm - - get Operation not supported for setting tx power (see pyw.txset) - - have tried using the ifindex and phy. Both methods are accepted, returning - only Errno 95. - o when using mBm - - no errors reported but tx power is not changed - o Is the operation not supported by my cards? or is it not supported by the - kernel? - 26) need to parse dumps NLM_F_DUMP, for now we're good with link etc, so long + 26) need to parse dumps NLM_F_DUMP, for now we're good with link etc, so long as the card is connected but it may come up eventually - 29) figure out how to parse the information element in pyw.link - there's some + 29) figure out how to parse the information element in pyw.link - there's some good shit in it including sometimes the router os and type o in link, NL80211_BSS_BEACON_IES vs NL80211_BSS_INFORMATION_ELEMENT BEACON_IES may not always be presenet but appears to contain more - 31) add VHT processing to sta_info bitrate - 35) iw connect (open) returns status of successful connect but card is - not connected -> move to wpa_supplicant to see how they do it - 36) do we need to write a find nested attribute? so we don't need to go iterate + 31) add VHT processing to sta_info bitrate + 36) do we need to write a find nested attribute? so we don't need to go iterate a list of attributes to find one - 39) parsing wiphy_bands + 39) parsing wiphy_bands o _HT_MCS_SET: a 16-bit attr containing the MCS set as defined in 802.11n (find this) o _HT_CAPA: as in the HT information IE - 42) is there a simple way to set the format strings as constants keeping in + 42) is there a simple way to set the format strings as constants keeping in mind that things like strings require a length in the format string - 45) find out if some of the 'flags' for bands are actually correct such as + 45) find out if some of the 'flags' for bands are actually correct such as HT40+ which should be disabled for channel 11 - 46) max-tx for bands is showing 15 when iwconfig shows 30 \ No newline at end of file + 46) max-tx for bands is showing 15 when iwconfig shows 30 \ No newline at end of file From 4d8117eadb7b708ef4e6cc51c9a18cc041c40454 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sat, 16 Jul 2016 09:18:45 -0600 Subject: [PATCH 075/121] v0.1.5 minor changes --- README.md | 2 +- pyric/lib/libnl.py | 3 ++- pyric/pyw.py | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 93b6db4..4a5aa19 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ was to provide a simple interface to the underlying nl80211 kernel support, handling the complex operations of Netlink seamlessy while maintaining a minimum of "code walking" to understand, modify and extend. But, why stop there? Since it's initial inception, PyRIC has grown. PyRIC puts iw, ifconfig, rfkill, -udevadm, airmon-ng and macchanger. +udevadm, airmon-ng and macchanger in your hands (or your program). ### a. Additions to iw Several "extensions" have been added to iw: diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 105d5fd..0db2783 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -237,13 +237,14 @@ def nl_recvmsg(sock): """ try: # pull off the message and following ack message NOTE: nlmsg_fromstream - # will throw an exception if msg is an ack/nack catch it and test for ack. + # will throw an exception if msg is an ack/nack, catch it and test for ack. # If it was an ack, return the success code otherwise, reraise it. If it # wasn't an ack/nack, return the message msg = nlmsg_fromstream(sock.recv()) try: _ = nlmsg_fromstream(sock.recv()) except error as e: + # here, we don't want to return the original message if e.errno == nlh.NLE_SUCCESS: pass else: raise if sock.seq != msg.seq: raise error(errno.EBADMSG,"seq. # out of order") diff --git a/pyric/pyw.py b/pyric/pyw.py index feba91b..5dfbea4 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -86,11 +86,11 @@ import pyric.net.netlink_h as nlh # netlink definition import pyric.net.genetlink_h as genlh # genetlink definition import pyric.net.wireless.nl80211_h as nl80211h # nl80211 definition +import pyric.lib.libnl as nl # netlink (library) functions from pyric.net.wireless import wlan # IEEE 802.11 Std definition import pyric.net.sockios_h as sioch # sockios constants import pyric.net.if_h as ifh # ifreq structure -import pyric.lib.libnl as nl # netlink functions -import pyric.lib.libio as io # ioctl functions +import pyric.lib.libio as io # ioctl (library) functions _FAM80211ID_ = None From 0098d2752f57acd0096845fc7d1208d38d39616b Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sat, 16 Jul 2016 10:21:41 -0600 Subject: [PATCH 076/121] v0.1.5 minor changes --- pyric/net/netlink_h.py | 1 - tests/pyw.unittest.py | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pyric/net/netlink_h.py b/pyric/net/netlink_h.py index 5ea3905..961dcd4 100644 --- a/pyric/net/netlink_h.py +++ b/pyric/net/netlink_h.py @@ -332,6 +332,5 @@ def nlattrhdr(alen,atype): # defined error codes # only use success and failure -> using errno for other error numbers -NLE = ['Success','Unspecified failure'] NLE_SUCCESS = 0 NLE_FAILURE = 1 \ No newline at end of file diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 9749429..30271ef 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -249,8 +249,8 @@ def test_invalidcardarg(self): self.assertRaises(error,pyw.rtsthreshget,'bad0') self.assertRaises(error,pyw.rtsthreshset,'bad0',5) def test_invalidthresh(self): - self.assertRaises(error,pyw.rtsthreshset,self.card,wlan.RTS_THRESHOLD_MIN-1) - self.assertRaises(error,pyw.rtsthreshset,self.card,wlan.RTS_THRESHOLD_MAX+1) + self.assertRaises(error,pyw.rtsthreshset,self.card,wlan.RTS_THRESH_MIN-1) + self.assertRaises(error,pyw.rtsthreshset,self.card,wlan.RTS_THRESH_MAX+1) self.assertRaises(error, pyw.rtsthreshset,self.card,'on') # test get/set RTS thresh @@ -266,8 +266,8 @@ def test_invalidcardarg(self): self.assertRaises(error,pyw.fragthreshget,'bad0') self.assertRaises(error,pyw.fragthreshset,'bad0',800) def test_invalidthresh(self): - self.assertRaises(error,pyw.fragthreshset,self.card,wlan.FRAG_THRESHOLD_MIN-1) - self.assertRaises(error,pyw.fragthreshset,self.card,wlan.FRAG_THRESHOLD_MAX+1) + self.assertRaises(error,pyw.fragthreshset,self.card,wlan.FRAG_THRESH_MIN-1) + self.assertRaises(error,pyw.fragthreshset,self.card,wlan.FRAG_THRESH_MAX+1) self.assertRaises(error,pyw.fragthreshset,self.card,'on') # test get freqs From d4a678302144d5f0a35fdf55be7ae69f7e469998 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 17 Jul 2016 10:59:17 -0600 Subject: [PATCH 077/121] v0.1.5 minor changes --- TODO | 3 ++- pyric/utils/channels.py | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/TODO b/TODO index abfe313..75e94ed 100644 --- a/TODO +++ b/TODO @@ -33,4 +33,5 @@ mind that things like strings require a length in the format string 45) find out if some of the 'flags' for bands are actually correct such as HT40+ which should be disabled for channel 11 - 46) max-tx for bands is showing 15 when iwconfig shows 30 \ No newline at end of file + 46) max-tx for bands is showing 15 when iwconfig shows 30 + 47) where is udevadm getting firmware vers from diff --git a/pyric/utils/channels.py b/pyric/utils/channels.py index 1d47f06..94f5169 100644 --- a/pyric/utils/channels.py +++ b/pyric/utils/channels.py @@ -38,8 +38,8 @@ import pyric.net.wireless.nl80211_h as nl80211h # redefined widths (allowed in nl80211h) -CHTYPES = nl80211h.NL80211_CHAN_TYPES -CHWIDTHS = nl80211h.NL80211_CHAN_WIDTHS +CHTYPES = nl80211h.NL80211_CHAN_TYPES # widths nl80211 supports i.e HT40- +CHWIDTHS = nl80211h.NL80211_CHAN_WIDTHS # actual widths # ISM Bands (ieee80211.h-> BAND_ID_2G) ISM_24_C2F={1:2412,2:2417,3:2422,4:2427,5:2432,6:2437,7:2442, @@ -98,4 +98,4 @@ def rf2ch(f): if f in ISM_24_F2C: return ISM_24_F2C[f] if f in UNII_5_F2C: return UNII_5_F2C[f] if f in UNII_4_F2C: return UNII_4_F2C[f] - return None \ No newline at end of file + return None From 9a3add8006ca362b1bf49ed52d8051b24d96557b Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Mon, 18 Jul 2016 10:44:30 -0600 Subject: [PATCH 078/121] v0.1.5 fixed devfreqs, devchs --- CHANGES | 3 ++- LICENSE | 2 +- TODO | 1 + examples/info.py | 17 +++++++++-------- examples/pentest.py | 39 +++++++++++++++++++-------------------- pyric/pyw.py | 36 ++++++++++++++++++++---------------- 6 files changed, 52 insertions(+), 46 deletions(-) diff --git a/CHANGES b/CHANGES index 22ab545..d9122f2 100644 --- a/CHANGES +++ b/CHANGES @@ -144,4 +144,5 @@ v 0.1.5 Begin STA associated functionality o fixed error on devadd during restoration in examples/pentest.py o fixed output error, incorrect labeling o fixed output error ASW max tx power - o added phylist w.r.t issue #17 \ No newline at end of file + o added phylist w.r.t issue #17 + o fixed devfreqs, devchs after updating phyinfo \ No newline at end of file diff --git a/LICENSE b/LICENSE index f2eb1c3..6add54b 100644 --- a/LICENSE +++ b/LICENSE @@ -39,4 +39,4 @@ software in furtherance of or with intent to commit any fraudulent or other ille activities, or otherwise in violation of any applicable law, regulation or legal agreement. -See for a copy of the GNU General Public License. +See for a copy of the GNU General Public License. \ No newline at end of file diff --git a/TODO b/TODO index 75e94ed..e20dbfb 100644 --- a/TODO +++ b/TODO @@ -35,3 +35,4 @@ HT40+ which should be disabled for channel 11 46) max-tx for bands is showing 15 when iwconfig shows 30 47) where is udevadm getting firmware vers from + 48) need to redo pyw.unittest after adding/updating functions diff --git a/examples/info.py b/examples/info.py index 7c095e3..e80c2f7 100644 --- a/examples/info.py +++ b/examples/info.py @@ -15,7 +15,7 @@ def execute(dev,itype): # ensure dev is a wireless interfaces wifaces = pyw.winterfaces() if dev not in wifaces: - print "Device {0} is not wireless, use one of {1}".format(dev,wifaces) + print("Device {0} is not wireless, use one of {1}".format(dev,wifaces)) # get info dicts dinfo = pyw.devinfo(dev) @@ -31,7 +31,7 @@ def execute(dev,itype): msg += "\tInet: {0} Bcast: {1} Mask: {2}\n".format(iinfo['inet'], iinfo['bcast'], iinfo['mask']) - print msg + print(msg) if itype == 'all' or itype == 'dev': msg = "Device {0}\n".format(card.dev) @@ -46,7 +46,7 @@ def execute(dev,itype): dinfo['RF'], dinfo['CHW'], dinfo['CF']) - print msg + print(msg) if itype == 'all' or itype == 'phy': msg = "Wiphy phy{0}\n".format(card.phy) @@ -78,25 +78,26 @@ def execute(dev,itype): msg += " (disabled)\n" else: msg += "\n" - print msg + print(msg) if __name__ == '__main__': # create arg parser and parse command line args - print "Wireless Device Info Display using PyRIC v{0}".format(pyric.__version__) + print("Wireless Device Info Display using PyRIC v{0}".format(pyric.version)) argp = ap.ArgumentParser(description="Wireless Device Data") argp.add_argument('-d','--dev',help="Wireless Device") argp.add_argument('-t','--type',help="Info type one of {all|if|dev|phy}") args = argp.parse_args() + usage = "usage: python info.py -d [-t one of {all|if|dev|phy}]" try: dname = args.dev infotype = args.type if dname is None: - print "usage: python info.py -d [-t one of {all|if|dev|phy}]" + print(usage) sys.exit(0) if infotype is None: infotype = 'all' if infotype not in ['all','if','dev','phy']: - print "usage: python info.py -d [-t one of {all|if|dev|phy}]" + print(usage) sys.exit(0) execute(dname,infotype) except pyric.error as e: - print e \ No newline at end of file + print(e) \ No newline at end of file diff --git a/examples/pentest.py b/examples/pentest.py index fd6634b..5dec8fe 100644 --- a/examples/pentest.py +++ b/examples/pentest.py @@ -13,18 +13,18 @@ from pyric.utils.channels import rf2ch # rf to channel conversion def execute(dev): - print 'Setting up...' + print('Setting up...') # ensure dev is a wireless interfaces ifaces = pyw.interfaces() wifaces = pyw.winterfaces() if dev not in ifaces: - print "Device {0} is not valid, use one of {1}".format(dev,ifaces) + print("Device {0} is not valid, use one of {1}".format(dev,ifaces)) return elif dev not in wifaces: - print "Device {0} is not wireless, use one of {1}".format(dev,wifaces) + print("Device {0} is not wireless, use one of {1}".format(dev,wifaces)) # get a Card & info for dev - print "Regulatory Domain currently: ", pyw.regget() + print("Regulatory Domain currently: ", pyw.regget()) dinfo = pyw.devinfo(dev) card = dinfo['card'] pinfo = pyw.phyinfo(card) @@ -44,14 +44,14 @@ def execute(dev): msg += "\tSupports modes {0}\n".format(pinfo['modes']) msg += "\tSupports commands {0}".format(pinfo['commands']) msg += "\thw addr {0}".format(pyw.macget(card)) - print msg + print(msg) # prepare a virtual interface named pent0 in monitor mode # delete all ifaces on the phy to avoid interference - print 'Preparing pent0 for monitor mode' + print('Preparing pent0 for monitor mode') pdev = 'pent0' for iface in pyw.ifaces(card): - print "deleting {0} in mode {1}".format(iface[0],iface[1]) + print("deleting {0} in mode {1}".format(iface[0],iface[1])) pyw.devdel(iface[0]) # not we use the card that was deleted here. We can do this because @@ -59,44 +59,43 @@ def execute(dev): # no longer valid, the physical index still is pcard = pyw.devadd(card, pdev, 'monitor') pyw.up(pcard) - print "Using", pcard + print("Using", pcard) - print "Setting channel to 6 NOHT" + print("Setting channel to 6 NOHT") pyw.chset(pcard,6,None) msg = "Virtual interface {0} in monitor mode on ch 6".format(pcard) - print msg + ", using hwaddr: {0}".format(pyw.macget(pcard)) + print(msg + ", using hwaddr: {0}".format(pyw.macget(pcard))) # DO stuff here try: - print 'Now ready to do stuff' - print 'For example, run wireshark to verify card is seeing all packets' - print 'Hit Ctrl-C to quit and restore' + print('Now ready to do stuff') + print('For example, run wireshark to verify card is seeing all packets') + print('Hit Ctrl-C to quit and restore') while True: time.sleep(1) except KeyboardInterrupt: pass # restore original - print "Restoring..." - print "deleting ", pcard + print("Restoring...\ndeleting ", pcard) pyw.devdel(pcard) - print 'Restoring', card, 'mode =', dinfo['mode'], 'mac =', dinfo['mac'] + print('Restoring', card, 'mode =', dinfo['mode'], 'mac =', dinfo['mac']) card = pyw.devadd(card,card.dev,dinfo['mode']) pyw.macset(card,dinfo['mac']) pyw.up(card) - print "card ", card, " restored" + print("card ", card, " restored") if __name__ == '__main__': # create arg parser and parse command line args - print "Wireless Pentest Environment using PyRIC v{0}".format(pyric.version) + print("Wireless Pentest Environment using PyRIC v{0}".format(pyric.version)) argp = ap.ArgumentParser(description="Wireless Pentest") argp.add_argument('-d','--dev',help="Pentesting Wireless Device") args = argp.parse_args() try: dname = args.dev if dname is None: - print "usage: python pentest.py -d " + print("usage: python pentest.py -d ") else: execute(dname) except pyric.error as e: - print e \ No newline at end of file + print(e) \ No newline at end of file diff --git a/pyric/pyw.py b/pyric/pyw.py index 5dfbea4..299b304 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -76,18 +76,18 @@ __status__ = 'Production' import struct # ioctl unpacking -import pyric # pyric exception import re # check addr validity -from pyric.nlhelp.nlsearch import cmdbynum # get command name -from pyric.utils import channels # channel related -from pyric.utils import rfkill # block/unblock +import pyric # pyric exception +import pyric.nlhelp.nlsearch as nlsearch # get command name +import pyric.utils.channels as channels # channel related +import pyric.utils.rfkill as rfkill # block/unblock import pyric.utils.hardware as hw # device related -from pyric.utils import ouifetch # get oui dict +import pyric.utils.ouifetch as ouifetch # get oui dict import pyric.net.netlink_h as nlh # netlink definition import pyric.net.genetlink_h as genlh # genetlink definition import pyric.net.wireless.nl80211_h as nl80211h # nl80211 definition import pyric.lib.libnl as nl # netlink (library) functions -from pyric.net.wireless import wlan # IEEE 802.11 Std definition +import pyric.net.wireless.wlan as wlan # IEEE 802.11 Std definition import pyric.net.sockios_h as sioch # sockios constants import pyric.net.if_h as ifh # ifreq structure import pyric.lib.libio as io # ioctl (library) functions @@ -989,7 +989,12 @@ def devfreqs(card, *argv): except IndexError: return _nlstub_(devfreqs, card) - return phyinfo(card, nlsock)['freqs'] + rfs = [] + pinfo = phyinfo(card, nlsock) + for band in pinfo['bands']: + rfs.extend(pinfo['bands'][band]['rfs']) + rfs = sorted(rfs) + return rfs def devchs(card, *argv): """ @@ -1003,7 +1008,7 @@ def devchs(card, *argv): except IndexError: return _nlstub_(devchs, card) - return map(channels.rf2ch, phyinfo(card, nlsock)['freqs']) + return [channels.rf2ch(rf) for rf in devfreqs(card)] def devstds(card, *argv): """ @@ -2107,15 +2112,14 @@ def _commands_(command): :returns: list of supported commands as strings """ cs = [] - for _,cmd in command: # rather than index, commands use a counter, ignore it + for _,cmd in command: # rather than an index, commands use a counter, ignore it try: - - # <- 2 -><- 4 -> - # ignore count, use numeric command to lookup string version in form - # @NL80211_CMD_ and strip "@NL80211_CMD_". NOTE: some numeric - # commands may have multiple string synonyms, in that case, take the - # first one. Finally, make it lowercase - cmd = cmdbynum(struct.unpack_from('I', cmd, 0)[0]) + # use numeric command to lookup string version in form + # @NL80211_CMD_ + # and strip "@NL80211_CMD_". NOTE: some commands may have multiple + # string synonyms, in that case, take the first one. Finally, make + # it lowercase + cmd = nlsearch.cmdbynum(struct.unpack_from('I', cmd, 0)[0]) if type(cmd) is type([]): cmd = cmd[0] cs.append(cmd[13:].lower()) # skip NL80211_CMD_ except KeyError: From 6bfa2f354d9d5a3cc0e753035c40c18efc42757c Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Mon, 18 Jul 2016 10:50:45 -0600 Subject: [PATCH 079/121] v0.1.5 minor changes --- .gitignore | 1 - pyric/__init__.py | 33 ++++++++------------------------- setup.cfg | 2 +- 3 files changed, 9 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 40c0870..7445f02 100644 --- a/.gitignore +++ b/.gitignore @@ -45,7 +45,6 @@ var/ *.egg-info/ .installed.cfg *.egg -PyRIC.egg-info # PyCharm .idea diff --git a/pyric/__init__.py b/pyric/__init__.py index 7bf9a8a..e7dce3a 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -91,15 +91,6 @@ def strerror(errno): tools. Never worry about newer iw versions and having to rewrite your parsers. 5. Easy: If you can use iw, you can use PyRIC. -At it's heart, PyRIC is a Python port of (a subset of) iw and by extension, a -Python port of Netlink w.r.t nl80211 functionality. The original goal of PyRIC -was to provide a simple interface to the underlying nl80211 kernel support, -handling the complex operations of Netlink seamlessy while maintaining a minimum -of "code walking" to understand, modify and extend. But, why stop there? Since -it's initial inception, PyRIC has grown to include ioctl support to replicate -features of ifconfig such as getting or setting the mac address and has recently -implemented rkill support to soft block or unblock wireless cards. - ## CURRENT STATE ATT, PyRIC pyw provides the following: * enumerate interfaces and wireless interfaces @@ -119,6 +110,7 @@ def strerror(errno): * add/delete interfaces * enumerate ISM and UNII channels * block/unblock rfkill devices +* check 'connectivity', disconnect from AP In utils, several helpers can be found that can be used to: * enumerate channels and frequencies and convert between the two @@ -126,20 +118,11 @@ def strerror(errno): * fetch and parse the IEEE oui text file * further rfkill operations to include listing all rfkill devices -For a full listing of every function offered by pyw and helpers see the user -guide PyRIC.pdf. - -PyRIC also provides limited help functionality concerning nl80211 commands/attributes -for those who wish to add additional commands. However, it pulls directly from -the comments nl80211 header file and may be vague. - -## WHAT IS PyRIC? -To avoid confusion, PyRIC is the system as a whole, including all header files -and "libraries" that are required to communicate with the kernel. pyw is a -interface to these libraries providing specific funtions. - -What it does - defines programmatic access to a subset of iw, ifconfig and rkill. -In short, PyRIC provides Python wireless pentesters the ability to work with -wireless cards directly from Python without having to use command line tools -through Popen. +At it's heart, PyRIC is a Python port of (a subset of) iw and by extension, a +Python port of Netlink w.r.t nl80211 functionality. The original goal of PyRIC +was to provide a simple interface to the underlying nl80211 kernel support, +handling the complex operations of Netlink seamlessy while maintaining a minimum +of "code walking" to understand, modify and extend. But, why stop there? Since +it's initial inception, PyRIC has grown. PyRIC puts iw, ifconfig, rfkill, udevadm, +airmon-ng and macchanger in your hands (or your program). """ \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index 3a56470..f008ff1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,4 +1,4 @@ -# pip installation and distribution +# pip installation and distribution sudo pip install PyRIC [bdist_wheel] universal=1 \ No newline at end of file From 3e5a994a7650e5cbee193e026f8f574c5d678c36 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Mon, 18 Jul 2016 10:53:02 -0600 Subject: [PATCH 080/121] v0.1.5 minor changes --- pyric/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyric/__init__.py b/pyric/__init__.py index e7dce3a..ac81cd4 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -68,6 +68,7 @@ def strerror(errno): # for setup.py use # redefine version for easier access version = __version__ + # define long description long_desc = """ # PyRIC 0.1.4: Python Radio Interface Controller From 259ece318751b55b20ffad945ce927bacf46507e Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Mon, 18 Jul 2016 10:55:40 -0600 Subject: [PATCH 081/121] v0.1.5 minor changes --- pyric/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyric/__init__.py b/pyric/__init__.py index ac81cd4..77690eb 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -65,7 +65,8 @@ def strerror(errno): else: return os.strerror(errno) -# for setup.py use +# for us in setup.py + # redefine version for easier access version = __version__ From 409368c7e17780e02da82e25681fbd813c255457 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Mon, 18 Jul 2016 10:56:46 -0600 Subject: [PATCH 082/121] v0.1.5 minor changes --- MANIFEST.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index d288866..dc77fa7 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -# setup paramaters for PyRIC via PyPi +# setup paramaters for PyRIC via PyPi/pip install include LICENSE CHANGES README.md TODO # Include subdirectories From af451b97be3a7fb8ee70bf55735697754a486443 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Mon, 18 Jul 2016 10:59:12 -0600 Subject: [PATCH 083/121] v0.1.5 minor changes --- __init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/__init__.py b/__init__.py index ec95299..a7a28c5 100644 --- a/__init__.py +++ b/__init__.py @@ -1,4 +1,6 @@ # PyRIC root Distribution directory # Do not import from this directory i.e from PyRIC import foobar -# use pip ('sudo pip install PyRIC') or download latest tarbal to -# install. Then execute from pyric import foobar +# To install +# use pip ('sudo pip install PyRIC') +# or download latest tarbal and untar. +# excute either sudo python setup.py or rund from the PyRIC/pyric directory From 3677e5f983befe07ad453f4b595fa7a2c546baf6 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Tue, 19 Jul 2016 22:36:29 -0600 Subject: [PATCH 084/121] v0.1.5 port to python3 --- CHANGES | 6 +++++- README.md | 10 +++++----- TODO | 7 +++++++ examples/info.py | 7 ++++--- examples/pentest.py | 9 ++++++--- pyric/nlhelp/nlsearch.py | 4 ++-- pyric/pyw.py | 14 ++++++------- pyric/utils/__init__.py | 2 +- pyric/utils/hardware.py | 4 ++-- pyric/utils/ouifetch.py | 43 ++++++++++++++++++++++++---------------- tests/pyw.unittest.py | 8 +++++--- 11 files changed, 70 insertions(+), 44 deletions(-) diff --git a/CHANGES b/CHANGES index d9122f2..6bcf531 100644 --- a/CHANGES +++ b/CHANGES @@ -145,4 +145,8 @@ v 0.1.5 Begin STA associated functionality o fixed output error, incorrect labeling o fixed output error ASW max tx power o added phylist w.r.t issue #17 - o fixed devfreqs, devchs after updating phyinfo \ No newline at end of file + o fixed devfreqs, devchs after updating phyinfo + o add support for python3 (keeping compability with python2.7) + - urllib2 vs urllib + - replaced map with list comprehensions + - replaced xrange with range \ No newline at end of file diff --git a/README.md b/README.md index 4a5aa19..a021126 100644 --- a/README.md +++ b/README.md @@ -159,8 +159,8 @@ To use PyRIC, see the examples folder or read throuhg PyRIC.pdf. However, for those impatient types: ```python -import pyric # pyric errors -from pyric import pyw # iw functionality +import pyric # pyric errors +import pyric.pyw as pyw # iw functionality ``` will import the basic requirements and unless otherwise stated is assumed for the @@ -513,8 +513,8 @@ airmon-ng programmatically. as done below ```python import pyric -from pyric import pyw -from pyric.lib import libnl as nl +import pyric.pyw as pyw +import pyric.lib.libnl as nl def pymon(card, start=True, ch=None): """ @@ -638,7 +638,7 @@ recognized by command line tools or pyw. Use rkill to list, turn on or turn off soft blocks. ``` python -from pyric.utils import rfkill +import pyric.utils.rfkill as rfkill rfkill.rfkill_list() # list rfkill devices => {'tpacpi_bluetooth_sw': {'soft': True, 'hard': False, 'type': 'bluetooth', 'idx': 1}, diff --git a/TODO b/TODO index e20dbfb..4f0a179 100644 --- a/TODO +++ b/TODO @@ -36,3 +36,10 @@ 46) max-tx for bands is showing 15 when iwconfig shows 30 47) where is udevadm getting firmware vers from 48) need to redo pyw.unittest after adding/updating functions + 49) import statements + In python 3.5 + from pyric.utils import ouifetch ImportError: No module named 'utils' + import pyric.utils.ouifetch No error + and + import urllib.request.Request as url_request: ImportError: no module name 'request' + from urllib.request import Request as url_request No Error \ No newline at end of file diff --git a/examples/info.py b/examples/info.py index e80c2f7..3421951 100644 --- a/examples/info.py +++ b/examples/info.py @@ -5,10 +5,11 @@ """ -import argparse as ap -import sys +from __future__ import print_function # python 2to3 compability +import argparse as ap # cli arg parsing +import sys # cli exiting import pyric # pyric error (and ecode EUNDEF) -from pyric import pyw # for iw functionality +import pyric.pyw as pyw # for iw functionality from pyric.utils.channels import rf2ch # rf to channel conversion def execute(dev,itype): diff --git a/examples/pentest.py b/examples/pentest.py index 5dec8fe..c4212b1 100644 --- a/examples/pentest.py +++ b/examples/pentest.py @@ -5,10 +5,12 @@ """ -import argparse as ap -import time +from __future__ import print_function # python 2to3 compability +import argparse as ap # cli arg. parsing +import time # sleeping +import sys # cli exiting import pyric # pyric error (and ecode EUNDEF) -from pyric import pyw # for iw functionality +import pyric.pyw as pyw # for iw functionality import pyric.utils.hardware as hw # for chipset/driver from pyric.utils.channels import rf2ch # rf to channel conversion @@ -95,6 +97,7 @@ def execute(dev): dname = args.dev if dname is None: print("usage: python pentest.py -d ") + sys.exit(0) else: execute(dname) except pyric.error as e: diff --git a/pyric/nlhelp/nlsearch.py b/pyric/nlhelp/nlsearch.py index da7b69c..ae519f6 100644 --- a/pyric/nlhelp/nlsearch.py +++ b/pyric/nlhelp/nlsearch.py @@ -50,7 +50,7 @@ try: # first three lines are comments, 4th line is empty cin = open(cmdpath,'r') - for _ in xrange(4): _in = cin.readline() + for _ in range(4): _in = cin.readline() commands = json.loads(cin.readline()) cmdlookup = json.loads(cin.readline()) except: @@ -65,7 +65,7 @@ try: # first three lines are comments, 3th line is empty ain = open(attrpath,'r') - for _ in xrange(4): _in = ain.readline() + for _ in range(4): _in = ain.readline() attributes = json.loads(ain.readline()) attrlookup = json.loads(ain.readline()) except: diff --git a/pyric/pyw.py b/pyric/pyw.py index 299b304..8afa211 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -78,16 +78,16 @@ import struct # ioctl unpacking import re # check addr validity import pyric # pyric exception -import pyric.nlhelp.nlsearch as nlsearch # get command name -import pyric.utils.channels as channels # channel related -import pyric.utils.rfkill as rfkill # block/unblock +from pyric.nlhelp.nlsearch import cmdbynum # get command name +from pyric.utils import channels # channel related +from pyric.utils import rfkill # block/unblock import pyric.utils.hardware as hw # device related -import pyric.utils.ouifetch as ouifetch # get oui dict +from pyric.utils import ouifetch # get oui dict import pyric.net.netlink_h as nlh # netlink definition import pyric.net.genetlink_h as genlh # genetlink definition import pyric.net.wireless.nl80211_h as nl80211h # nl80211 definition import pyric.lib.libnl as nl # netlink (library) functions -import pyric.net.wireless.wlan as wlan # IEEE 802.11 Std definition +from pyric.net.wireless import wlan # IEEE 802.11 Std definition import pyric.net.sockios_h as sioch # sockios constants import pyric.net.if_h as ifh # ifreq structure import pyric.lib.libio as io # ioctl (library) functions @@ -1008,7 +1008,7 @@ def devchs(card, *argv): except IndexError: return _nlstub_(devchs, card) - return [channels.rf2ch(rf) for rf in devfreqs(card)] + return [channels.rf2ch(rf) for rf in devfreqs(card,nlsock)] def devstds(card, *argv): """ @@ -2119,7 +2119,7 @@ def _commands_(command): # and strip "@NL80211_CMD_". NOTE: some commands may have multiple # string synonyms, in that case, take the first one. Finally, make # it lowercase - cmd = nlsearch.cmdbynum(struct.unpack_from('I', cmd, 0)[0]) + cmd = cmdbynum(struct.unpack_from('I', cmd, 0)[0]) if type(cmd) is type([]): cmd = cmd[0] cs.append(cmd[13:].lower()) # skip NL80211_CMD_ except KeyError: diff --git a/pyric/utils/__init__.py b/pyric/utils/__init__.py index 12fcaf3..bedc290 100644 --- a/pyric/utils/__init__.py +++ b/pyric/utils/__init__.py @@ -21,7 +21,7 @@ utils 0.0.1 desc: utilities - includes: hardware 0.0.5 ouifetch 0.0.1 channels 0.0.1 rfkill 0.0.1 + includes: hardware 0.0.5 ouifetch 0.0.2 channels 0.0.1 rfkill 0.0.1 changes: o added mac address related to hardware.py o randhw does not force an ouis dict, if not present, randomly generates the diff --git a/pyric/utils/hardware.py b/pyric/utils/hardware.py index 022860e..7872724 100644 --- a/pyric/utils/hardware.py +++ b/pyric/utils/hardware.py @@ -72,10 +72,10 @@ def randhw(ouis=None): :returns: random hw address """ if ouis is None or ouis == []: - o = ":".join(['{0:02x}'.format(random.randint(0,255)) for _ in xrange(3)]) + o = ":".join(['{0:02x}'.format(random.randint(0,255)) for _ in range(3)]) else: o = random.choice(ouis.keys()) - u = ":".join(['{0:02x}'.format(random.randint(0,255)) for _ in xrange(3)]) + u = ":".join(['{0:02x}'.format(random.randint(0,255)) for _ in range(3)]) return o + ':' + u def ifcard(dev): diff --git a/pyric/utils/ouifetch.py b/pyric/utils/ouifetch.py index d801822..815d9d9 100644 --- a/pyric/utils/ouifetch.py +++ b/pyric/utils/ouifetch.py @@ -23,18 +23,27 @@ Fetchs and stores oui data from IEEE """ +from __future__ import print_function # python 2to3 compability -#__name__ = 'ouifetch' +__name__ = 'ouifetch' __license__ = 'GPLv3' -__version__ = '0.0.1' -__date__ = 'August 2014' +__version__ = '0.0.2' +__date__ = 'July 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' __status__ = 'Production' -import urllib2,os,sys,datetime,time -#import argparse as ap +try: + # load urllib related for python 2 + from urllib2 import Request as url_request + from urllib2 import urlopen as url_open + from urllib2 import URLError as url_error +except ImportError: + from urllib.request import Request as url_request + from urllib.request import urlopen as url_open + from urllib import error as url_error +import os,sys,datetime,time import pyric OUIURL = 'http://standards-oui.ieee.org/oui.txt' @@ -75,22 +84,22 @@ def fetch(opath=None,verbose=False): # determine if data path is legit if opath is None: opath = OUIPATH if not os.path.isdir(os.path.dirname(opath)): - print "Path to data is incorrect {0}".format(opath) + print("Path to data is incorrect {0}".format(opath)) sys.exit(1) # fetch oui file from ieee fout = None # set up url request - req = urllib2.Request(OUIURL) + req = url_request(OUIURL) req.add_header('User-Agent',"PyRIC +https://github.com/wraith-wireless/PyRIC/") try: # retrieve the oui file and parse out generated date - if verbose: print 'Fetching ', OUIURL - res = urllib2.urlopen(req) - if verbose: print "Parsing OUI file" + if verbose: print('Fetching ', OUIURL) + res = url_open(req) + if verbose: print("Parsing OUI file") - if verbose: print "Opening data file {0} for writing".format(opath) + if verbose: print("Opening data file {0} for writing".format(opath)) fout = open(opath,'w') gen = datetime.datetime.utcnow().isoformat() # use current time as the first line fout.write(gen+'\n') @@ -110,14 +119,14 @@ def fetch(opath=None,verbose=False): # write to file & update count fout.write('{0}\t{1}\n'.format(oui,manuf)) cnt += 1 - if verbose: print "{0}:\t{1}\t{2}".format(cnt,oui,manuf) - print "Wrote {0} OUIs in {1:.3} secs".format(cnt,time.time()-t) - except urllib2.URLError as e: - print "Error fetching oui file: {0}".format(e) + if verbose: print("{0}:\t{1}\t{2}".format(cnt,oui,manuf)) + print("Wrote {0} OUIs in {1:.3} secs".format(cnt,time.time()-t)) + except url_error as e: + print("Error fetching oui file: {0}".format(e)) except IOError as e: - print "Error opening output file {0}".format(e) + print("Error opening output file {0}".format(e)) except Exception as e: - print "Error parsing oui file: {0}".format(e) + print("Error parsing oui file: {0}".format(e)) finally: if fout: fout.close() diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 30271ef..154439a 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -35,9 +35,9 @@ import unittest import time from pyric import error -from pyric import pyw +import pyric.pyw as pyw from pyric.utils.channels import ISM_24_F2C,rf2ch -from pyric.net.wireless import wlan +import pyric.net.wireless.wlan as wlan # modify below to fit your system @@ -280,7 +280,9 @@ def test_invalidcardarg(self): # test get chs class DevCHsTestCase(CardTestCase): def test_devchs(self): - self.assertItemsEqual(map(rf2ch,pri['freqs']),pyw.devchs(self.card)) + [rf2ch(rf) for rf in pri['freqs']] + self.assertItemsEqual([rf2ch(rf) for rf in pri['freqs']], + pyw.devchs(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.devchs,'bad0') From 234ff534bc5bdcba2d6754b2e75c41dc8ea9b066 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Tue, 19 Jul 2016 22:40:02 -0600 Subject: [PATCH 085/121] v0.1.5 port to python3 --- setup.py | 4 +++- tests/pyw.unittest.py | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index e896bc6..9322b41 100644 --- a/setup.py +++ b/setup.py @@ -57,7 +57,9 @@ 'Topic :: Utilities', 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', - 'Programming Language :: Python :: 2.7'], + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.0', + 'Programming Language :: Python :: 3.5'], keywords='Linux Python nl80211 iw iwconfig ifconfig wireless WLAN WiFi pentest', packages=find_packages(), package_data={'pyric':['nlhelp/*.help','utils/data/*.txt']} diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 154439a..7b73fe9 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -273,7 +273,7 @@ def test_invalidthresh(self): # test get freqs class DevFreqsTestCase(CardTestCase): def test_devfreqs(self): - self.assertItemsEqual(pri['freqs'],pyw.devfreqs(self.card)) + self.assertItemsEquals(pri['freqs'],pyw.devfreqs(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.devfreqs,'bad0') @@ -281,7 +281,7 @@ def test_invalidcardarg(self): class DevCHsTestCase(CardTestCase): def test_devchs(self): [rf2ch(rf) for rf in pri['freqs']] - self.assertItemsEqual([rf2ch(rf) for rf in pri['freqs']], + self.assertItemsEquals([rf2ch(rf) for rf in pri['freqs']], pyw.devchs(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.devchs,'bad0') @@ -289,7 +289,7 @@ def test_invalidcardarg(self): # test get stds class DevSTDsTestCase(CardTestCase): def test_devchs(self): - self.assertItemsEqual(pri['stds'],pyw.devstds(self.card)) + self.assertItemsEquals(pri['stds'],pyw.devstds(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.devstds,'bad0') From 81cfd672476bc98410dac2ad8ac78fe865039f0a Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Tue, 19 Jul 2016 22:44:16 -0600 Subject: [PATCH 086/121] v0.1.5 port to python3 --- setup.py | 2 ++ tests/pyw.unittest.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/setup.py b/setup.py index 9322b41..46f32d2 100644 --- a/setup.py +++ b/setup.py @@ -20,6 +20,8 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. +sudo pip install PyRIC + """ #__name__ = 'setup' diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 7b73fe9..53843f2 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -22,6 +22,7 @@ OK """ +from __future__ import print_function # python 2to3 compability #__name__ = 'pyw.unittest' __license__ = 'GPLv3' @@ -411,4 +412,5 @@ def test_invalidflagsarg(self): self.assertRaises(error,pyw.devadd,self.card,'test0','managed','fcsfail') if __name__ == '__main__': + print('Not currently stable') unittest.main() \ No newline at end of file From 5fd75eaf284eaeb64f6f3449bbf4ef57bc781874 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Wed, 20 Jul 2016 22:28:15 -0600 Subject: [PATCH 087/121] v0.1.5 port to python3 --- pyric/net/genetlink_h.py | 2 +- pyric/net/if_h.py | 97 ++++++++++++++++++++-------------------- pyric/net/netlink_h.py | 6 +-- pyric/pyw.py | 8 ++-- 4 files changed, 55 insertions(+), 58 deletions(-) diff --git a/pyric/net/genetlink_h.py b/pyric/net/genetlink_h.py index cffdf00..4472b79 100644 --- a/pyric/net/genetlink_h.py +++ b/pyric/net/genetlink_h.py @@ -32,7 +32,7 @@ """ -#__name__ = 'genetlink_h.py' +__name__ = 'genetlink_h' __license__ = 'GPLv3' __version__ = '0.0.1' __date__ = 'March 2016' diff --git a/pyric/net/if_h.py b/pyric/net/if_h.py index dd2b227..3377ded 100644 --- a/pyric/net/if_h.py +++ b/pyric/net/if_h.py @@ -152,16 +152,17 @@ IF_LINK_MODE_DEFAULT = 0 IF_LINK_MODE_DORMANT = 1 # limit upward transition to dormant -#struct sockaddr { -# sa_family_t sa_family; /* address family, AF_xxx */ -# char sa_data[14]; /* 14 bytes of protocol address */ -#}; -# NOTE: -# 1) for our purposes, we use only 6 characters, 6 octets for a hw addr and 4 -# octets for an ip4 addr. -# 2) For whatever reason, all ioctl calls accept and return ip4 addresses -# prefixed by two null bytes - +""" +struct sockaddr { + sa_family_t sa_family; /* address family, AF_xxx */ + char sa_data[14]; /* 14 bytes of protocol address */ +}; + NOTE: + 1) for our purposes, we use only 6 characters, 6 octets for a hw addr and 4 + octets for an ip4 addr. + 2) For whatever reason, all ioctl calls accept and return ip4 addresses + prefixed by two null bytes +""" AF_UNSPEC = 0 # from socket.h sa_family unspecified ARPHRD_ETHER = 1 # from net/if_arp.h sa_family ethernet a.k.a AF_LOCAL ARPHRD_IEEE80211 = 801 # net/if_arp.h sa_family IEEE 802.11 @@ -189,45 +190,45 @@ def sockaddr(sa_family,sa_data=None): raise AttributeError("sa_family {0} not supported".format(sa_family)) return struct.pack(sa_addr,*vs) -#### Interface request structure used for socket -# ioctl's. All interface ioctl's must have parameter -# definitions which begin with ifr_name. The -# remainder may be interface specific. -# -#struct ifreq { -# -# union -# { -# char ifrn_name[IFNAMSIZ]; # if name, e.g. "en0" -# } ifr_ifrn; -# -# union { -# struct sockaddr ifru_addr; -# struct sockaddr ifru_dstaddr; -# struct sockaddr ifru_broadaddr; -# struct sockaddr ifru_netmask; -# struct sockaddr ifru_hwaddr; -# short ifru_flags; -# int ifru_ivalue; -# int ifru_mtu; -# struct ifmap ifru_map; -# char ifru_slave[IFNAMSIZ]; # Just fits the size -# char ifru_newname[IFNAMSIZ]; -# void * ifru_data; -# struct if_settings ifru_settings; -# } ifr_ifru; -#}; -# -# from wireless.h we build -#struct iw_param -#{ -# __s32 value; /* The value of the parameter itself */ -# __u8 fixed; /* Hardware should not use auto select */ -# __u8 disabled; /* Disable the feature */ -# __u16 flags; /* Various specifc flags (if any) */ -# to get the txpower and verify the presense of wireless extensions -#}; +""" + Interface request structure used for socket ioctl's. All interface ioctl's must + have parameter definitions which begin with ifr_name. The remainder may be + interface specific. + +struct ifreq { + + union + { + char ifrn_name[IFNAMSIZ]; # if name, e.g. "en0" + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short ifru_flags; + int ifru_ivalue; + int ifru_mtu; + struct ifmap ifru_map; + char ifru_slave[IFNAMSIZ]; # Just fits the size + char ifru_newname[IFNAMSIZ]; + void * ifru_data; + struct if_settings ifru_settings; + } ifr_ifru; +}; + + from wireless.h we build +struct iw_param +{ + __s32 value; /* The value of the parameter itself */ + __u8 fixed; /* Hardware should not use auto select */ + __u8 disabled; /* Disable the feature */ + __u16 flags; /* Various specifc flags (if any) */ + to get the txpower and verify the presense of wireless extensions +}; +""" ifr_name = '{0}s'.format(IFNAMSIZ) # formats for ifreq struct ifr_flags = 'h' ifr_ifindex = 'i' diff --git a/pyric/net/netlink_h.py b/pyric/net/netlink_h.py index 961dcd4..b732214 100644 --- a/pyric/net/netlink_h.py +++ b/pyric/net/netlink_h.py @@ -34,11 +34,7 @@ """ -# NOTE: get the below error when calling import netlink_h -#RuntimeWarning: Parent module 'netlink_h' not found while handling absolute import -# import struct -# unless I comment out the name -#__name__ = 'netlink_h.py' +__name__ = 'netlink_h' __license__ = 'GPLv3' __version__ = '0.0.3' __date__ = 'March 2016' diff --git a/pyric/pyw.py b/pyric/pyw.py index 8afa211..eaa5060 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -79,15 +79,15 @@ import re # check addr validity import pyric # pyric exception from pyric.nlhelp.nlsearch import cmdbynum # get command name -from pyric.utils import channels # channel related -from pyric.utils import rfkill # block/unblock +import pyric.utils.channels as channels # channel related +import pyric.utils.rfkill as rfkill # block/unblock import pyric.utils.hardware as hw # device related -from pyric.utils import ouifetch # get oui dict +import pyric.utils.ouifetch as ouifetch # get oui dict import pyric.net.netlink_h as nlh # netlink definition import pyric.net.genetlink_h as genlh # genetlink definition import pyric.net.wireless.nl80211_h as nl80211h # nl80211 definition import pyric.lib.libnl as nl # netlink (library) functions -from pyric.net.wireless import wlan # IEEE 802.11 Std definition +import pyric.net.wireless.wlan as wlan # IEEE 802.11 Std definition import pyric.net.sockios_h as sioch # sockios constants import pyric.net.if_h as ifh # ifreq structure import pyric.lib.libio as io # ioctl (library) functions From 28b3bcfc792ec58fda4a90827fab7d882fcf7727 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Wed, 20 Jul 2016 22:47:36 -0600 Subject: [PATCH 088/121] v0.1.5 port to python3 --- TODO | 9 +-------- tests/pyw.unittest.py | 13 ++++++++----- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/TODO b/TODO index 4f0a179..226cc8d 100644 --- a/TODO +++ b/TODO @@ -35,11 +35,4 @@ HT40+ which should be disabled for channel 11 46) max-tx for bands is showing 15 when iwconfig shows 30 47) where is udevadm getting firmware vers from - 48) need to redo pyw.unittest after adding/updating functions - 49) import statements - In python 3.5 - from pyric.utils import ouifetch ImportError: No module named 'utils' - import pyric.utils.ouifetch No error - and - import urllib.request.Request as url_request: ImportError: no module name 'request' - from urllib.request import Request as url_request No Error \ No newline at end of file + 48) need to redo pyw.unittest after adding/updating functions \ No newline at end of file diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 53843f2..84c269f 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -26,8 +26,8 @@ #__name__ = 'pyw.unittest' __license__ = 'GPLv3' -__version__ = '0.0.1' -__date__ = 'June 2016' +__version__ = '0.0.2' +__date__ = 'July 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' @@ -39,6 +39,8 @@ import pyric.pyw as pyw from pyric.utils.channels import ISM_24_F2C,rf2ch import pyric.net.wireless.wlan as wlan +import sys +_PVER_ = sys.version_info.major # modify below to fit your system @@ -111,6 +113,7 @@ class CardTestCase(unittest.TestCase): def setUp(self): self.card = pyw.getcard(pri['dev']) def tearDown(self): pass + # test macget class MacGetTestCase(CardTestCase): def test_macget(self): @@ -274,7 +277,7 @@ def test_invalidthresh(self): # test get freqs class DevFreqsTestCase(CardTestCase): def test_devfreqs(self): - self.assertItemsEquals(pri['freqs'],pyw.devfreqs(self.card)) + self.assertListEqual(pri['freqs'],pyw.devfreqs(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.devfreqs,'bad0') @@ -282,7 +285,7 @@ def test_invalidcardarg(self): class DevCHsTestCase(CardTestCase): def test_devchs(self): [rf2ch(rf) for rf in pri['freqs']] - self.assertItemsEquals([rf2ch(rf) for rf in pri['freqs']], + self.assertListEqual([rf2ch(rf) for rf in pri['freqs']], pyw.devchs(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.devchs,'bad0') @@ -290,7 +293,7 @@ def test_invalidcardarg(self): # test get stds class DevSTDsTestCase(CardTestCase): def test_devchs(self): - self.assertItemsEquals(pri['stds'],pyw.devstds(self.card)) + self.assertListEqual(pri['stds'],pyw.devstds(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.devstds,'bad0') From d83a9cfc6ae813d94515b639b081543420e29456 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Wed, 20 Jul 2016 22:52:01 -0600 Subject: [PATCH 089/121] v0.1.5 updated README --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index a021126..386f659 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,11 @@ persistent netlink sockets are used with the total time and average hop time nea halved. ### b. Current State +PyRIC is in the process of porting compatibility to Python 3. At present, it will +work on Python 2.7 and Python 3.5. It will also work on Python 3.0 except you +will have to manually enter your devices in the examples (as argparse is not +supported) and you will not be able to run pyw.unittest.py. + ATT, PyRIC provides the following: * enumerate interfaces and wireless interfaces * identify a cards driver, chipset and manufacturer From 76ac2daa8c4e186e23d2e9688f6774a6cf405de9 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 24 Jul 2016 02:42:51 -0600 Subject: [PATCH 090/121] v0.1.5 ready for packaging --- CHANGES | 18 +++-- README.md | 61 +++++++++++----- TODO | 8 +-- docs/PyRIC.pdf | Bin 507207 -> 508771 bytes docs/PyRIC.tex | 77 ++++++++++++-------- pyric/lib/libnl.py | 38 +++++----- pyric/net/if_h.py | 33 +++++---- pyric/pyw.py | 153 ++++++++++++++++++++++++++++++++++------ pyric/utils/channels.py | 48 +++++++++---- pyric/utils/rfkill.py | 10 ++- tests/pyw.unittest.py | 122 +++++++++++++++++++++++--------- 11 files changed, 414 insertions(+), 154 deletions(-) diff --git a/CHANGES b/CHANGES index 6bcf531..4256607 100644 --- a/CHANGES +++ b/CHANGES @@ -124,10 +124,13 @@ v 0.1.5 Begin STA associated functionality - stainfo - devset - phylist + - openconnect (doesn't currently work) + - phyadd (renamed from original devadd, iw phy interface add ...) + - devadd (iw dev interface add ....) o updated nested netlink attribute handling - my understanding of it was incomplete - There are still occasional errors - nested attributes are parsed as 'far' as possible - o reupdated nested netlink attribute handling - this time it really works + o reupdated nested netlink attribute handling - this time it really works :) - nested attributes are now parsed correctly, any errors are a result of incorrect packing on the other side or packet corruption and the entire unparsed attribute will be returned. @@ -135,8 +138,8 @@ v 0.1.5 Begin STA associated functionality t = (index,attribute) which (TODO #41) eases the burden on the calling function - fixed 're'nesting of nested attributes - o parsing wiphy bands (issue #7) is now fully functional and no longer relies - on a hacked fix + - parsing wiphy bands (issue #7) is now fully functional and no longer relies + on a hacked fix o devstds now uses phyinfo to determine standards Card supports o completely 'remodeled' functions in pyw to take advantage of new parsing from libnl (have left some of the error checking in place as a backup until @@ -149,4 +152,11 @@ v 0.1.5 Begin STA associated functionality o add support for python3 (keeping compability with python2.7) - urllib2 vs urllib - replaced map with list comprehensions - - replaced xrange with range \ No newline at end of file + - replaced xrange with range + - python 3.5 compatible. python 3.0 is compatible except for examples and + pyw.unittest.pyw (see corresponding files for reasons) + - python 2.7 is the preferred (for me at least) 'medium' and compatibly issues + with python 3 have been rectified at the expense of python 3 and not python 2 + o fixed incorrect frequencies in unii_5_C2F in utils/channels + o updated pyw.unittest for python 3.5 and for added functions + o added by band to channels and freqs in utils/channels.py \ No newline at end of file diff --git a/README.md b/README.md index 386f659..68b8c1b 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Several "extensions" have been added to iw: their own netlink (or ioctl socket) to pyw functions; * One-time request for the nl80211 family id: pyw stores the family id in a global variable -* Consolidating different "reference" values to wireless NICs in one class +* Consolidate different "reference" values to wireless NICs in one class (Cards are tuples t=(dev,phy #,ifindex) These are minimal changes but they can improve the performance of any progams @@ -233,10 +233,15 @@ w0 instantiated as: Card(phy=0,dev='wlan0',ifindex=2) ``` -There are other methods to get a Card object: pyw.devinfo, in addition to -information, will return a Card object, pyw.devadd returns a card object for the -newly created virtual interface and pyw.ifaces returns a lists of Cards for every -interface sharing the same phy. +There are other methods to get a Card object: +* pyw.devinfo, in addition to information, will return a Card object, +* pyw.devadd and pyw.phyadd return a card object for the newly created virtual +interface, and +* pyw.ifaces returns a lists of Cards for every interface sharing the same phy. + +It is also important to note while most functions require a Card object, some +do not and some will take a Card or a specific identifier. Read the user +guide or code for additional information. Before continuing you may find that a Card can become invalid. For example, I have an older system where the USB tends to fall out. You can confirm that your @@ -320,7 +325,8 @@ pyric.error: [Errno 95] Operation not supported For a brief description of coverage class and retry limits, see http://www.computerhope.com/unix/iwconfig.htm. For a description of the RTS -and Fragmentation thresholds see http://resources.infosecinstitute.com/rts-threshold-configuration-improved-wireless-network-performance/ +and Fragmentation thresholds see http://resources.infosecinstitute.com/rts-threshold-configuration-improved-wireless-network-performance/. +The IEEE 802.11-2012 also covers these. #### iv. Getting Info On Your Card @@ -469,8 +475,8 @@ Card(phy=0,dev=wlan1,ifindex=3) >>> pyw.chset(w1, 1, None) ``` -The above commands execute the same internal commands as does airmon-ng. -To verify, open a command prompt and execute the following: +The above commands replicate the behaviour of airmon-ng. To verify, open a +command prompt and execute the following: ```bash ?> iw dev wlan0 info # replace wlan0 with your nic @@ -546,15 +552,38 @@ def pymon(card, start=True, ch=None): return newcard ``` +NOTE: After a recent kernel upgrade (see my post at +https://wraithwireless.wordpress.com/2016/07/24/linux-kernel-bug/ for more details) +devadd became unusable. I have currently put a workaround in place and there are +now two methods to create a new card: phyadd and devadd. The function phyadd uses the +physical number of card and does not work as expected. In short, it will create a new +radio but not with the specified name. The function devadd uses the ifindex and works +as expected. For those individuals who system's start without devices the following +will work. + +```python +phys = pyw.phylist() +cards = [] +for i, phy in enumerate(phys): + dcard = pyw.phyadd(phy, "wlan{0}".format(i),'managed') + card = pyw.devadd(card,"wlan{0}".format(i),'managed') + pyw.devdel(dcard) + cards.append(card) +``` + +What this does is create a new card, dcard, for each phy using the phy as an +identifier. Then, because dcard does not have the name wlan but a system +generated one, we use it to create a new one, card with devadd which will have the +correct dev name. We finish up by deleting dcard and appending card to our list +of cards. + #### vi. STA Related Functions -I have recently begun adding STA functionality to PyRIC. These are not -necessarily required for a pentester, although the ability to disconnect -a Card may come in handy. The difficulty is that iw only provides connect -functionality through Open or WEP enabled APs which means that I am -attempting to determine which commands and attributes are required. If all -else fails I will look to wpa_supplicant for more information. ATT two -two functions related to STA->AP exist: a) determine if the Card is connected -and b) disconnect the Card +I have recently begun adding STA functionality to PyRIC. These are not necessarily +required for a pentester, although the ability to disconnect a Card may come in +handy. The difficulty is that iw only provides connect functionality through Open +or WEP enabled APs which means that I am attempting to determine which commands +and attributes are required. If all else fails I will look to wpa_supplicant for +more information. Additionally, iw will not connect if wpa_supplicant is running. ```python >>> pyw.isconnected(w0) diff --git a/TODO b/TODO index 226cc8d..523f8d9 100644 --- a/TODO +++ b/TODO @@ -24,15 +24,11 @@ o in link, NL80211_BSS_BEACON_IES vs NL80211_BSS_INFORMATION_ELEMENT BEACON_IES may not always be presenet but appears to contain more 31) add VHT processing to sta_info bitrate - 36) do we need to write a find nested attribute? so we don't need to go iterate - a list of attributes to find one - 39) parsing wiphy_bands - o _HT_MCS_SET: a 16-bit attr containing the MCS set as defined in 802.11n (find this) + 39) parsing wiphy_bands (should we add the below?) + o _HT_MCS_SET: a 16-bit attr containing the MCS set as defined in 802.11n o _HT_CAPA: as in the HT information IE 42) is there a simple way to set the format strings as constants keeping in mind that things like strings require a length in the format string 45) find out if some of the 'flags' for bands are actually correct such as HT40+ which should be disabled for channel 11 46) max-tx for bands is showing 15 when iwconfig shows 30 - 47) where is udevadm getting firmware vers from - 48) need to redo pyw.unittest after adding/updating functions \ No newline at end of file diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 2f9bbfe0e1c654ab739a520dba6ea06783f8c882..460c7bc7c0aa374a961dab2817651a989666204e 100644 GIT binary patch delta 90847 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

K(&;a-l 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 delta 89768 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 info | grep 'retry short') type:netlink get card's retry short limit \item retryshortset(card,lim,[nlsock]) (iw phy card. set retry short ) -type:netlink set card's retry short limit +type:netlink set card's retry short limit. NOTE: although 255 is specified as the +max limit for this and the long retry, kernel v4 will not allow it. \item retrylongget(card,[nlsock]) (iw phy card. info | grep 'retry long') type:netlink get card's retry long limit \item retrylongset(card,lim,[nlsock]) (iw phy card. set retry long ) @@ -820,10 +833,16 @@ \subsection{Functions} \item modeget(card[nlsock]): (iw dev card. info | grep mode), type: netlink, get card's mode \item devset(card,ndev,[nlsock]): (N/A) sets the dev (name) of card to ndev -\item devadd(card,vnic,mode,[flags],[nlsock]): (iw phy card. interface add - type flags ), type: netlink, creates a new virtual interface -on card's phy with dev vdev, in mode and using flags. Note: flags are only supported -in when creating a monitor mode +\item phyadd(card (or phy),vnic,mode,[flags],[nlsock]): (iw phy card. interface +add type flags )\footnote{There is a bug in some kernel v4.4.0-x +where the given dev name is ignored and a system chosen one is used instead. See +https://wraithwireless.wordpress.com. Whenever possible, use devadd to create +interfaces instead.}, type: netlink, creates a new virtual interface with dev vdev, +in mode and using flags. Note: flags are only supported when creating a monitor mode +\item devadd(card (or ifindex),vnic,mode,[flags],[nlsock]): (iw phy card. +interface add type flags ), type: netlink, creates a new virtual +interface with dev vdev, in mode and using flags. Note: flags are only supported +when creating a monitor mode \item devdel(card,[nlsock]): (iw card. del), type: netlink, deletes card \begin{itemize} \item isconnected(card, [nlsock]): (iw dev card. info | grep channel), type: diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 0db2783..aeaddb4 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -48,6 +48,8 @@ import pyric.net.netlink_h as nlh import pyric.net.genetlink_h as genlh from pyric.net.policy import nla_datatype +import sys +_PY3_ = sys.version_info.major == 3 class error(EnvironmentError): pass @@ -236,23 +238,23 @@ def nl_recvmsg(sock): :returns: a GENLMsg received from the socket """ try: - # pull off the message and following ack message NOTE: nlmsg_fromstream - # will throw an exception if msg is an ack/nack, catch it and test for ack. - # If it was an ack, return the success code otherwise, reraise it. If it - # wasn't an ack/nack, return the message + # we can expect two types of messages 1) an instant success message + # or 2) a data message. If it's a data message, we need to catch + # the ack msg = nlmsg_fromstream(sock.recv()) try: + # catch the follow on ack _ = nlmsg_fromstream(sock.recv()) except error as e: - # here, we don't want to return the original message + # on success, just return the orginal message if e.errno == nlh.NLE_SUCCESS: pass else: raise if sock.seq != msg.seq: raise error(errno.EBADMSG,"seq. # out of order") return msg except socket.timeout: raise error(-1,"socket timed out") - except socket.error as e: - raise error(errno.ENOTSOCK,e) + #except socket.error as e: # this became in issue in python 3 + # raise error(errno.ENOTSOCK,e) except error as e: if e.errno == nlh.NLE_SUCCESS: return nlh.NLE_SUCCESS raise # rethrow @@ -399,8 +401,8 @@ def tostream(self): for a,v,d in self['attrs']: try: payload += _attrpack_(a,v,d) - except struct.error as e: - if d == nlh.NLA_NESTED: pass # we need to fix here + except (TypeError,AttributeError,struct.error) as e: + #if d == nlh.NLA_NESTED: pass # we need to fix here raise error(-1,"Packing {0} {1}: {2}".format(a,v,e)) return nlh.nlmsghdr(len(payload),self.nltype,self.flags,self.seq,self.pid) + payload @@ -476,6 +478,12 @@ def nla_parse(msg,l,mtype,stream,idx): # Note: we use unpack_from which will ignore the null bytes in numeric # datatypes & for strings, strip trailing null bytes # dt == nlh.NLA_UNSPEC: ignore + if _PY3_ and (dt == nlh.NLA_STRING or dt == nlh.NLA_UNSPEC): + # python 3 returns a bytes object, convert to string + try: + a = a.decode('ascii') + except UnicodeDecodeError: + pass # Fuck You Python 3 if dt == nlh.NLA_STRING: a = _nla_strip_(a) elif dt == nlh.NLA_U8: a = struct.unpack_from("B",a,0)[0] elif dt == nlh.NLA_U16: a = struct.unpack_from("H",a,0)[0] @@ -687,22 +695,18 @@ def _attrpack_(a,v,d): elif d == nlh.NLA_U16: attr = struct.pack("H",v) elif d == nlh.NLA_U32: attr = struct.pack("I",v) elif d == nlh.NLA_U64: attr = struct.pack("Q",v) - elif d == nlh.NLA_STRING: attr = struct.pack("{0}sx".format(len(v)),v) + elif d == nlh.NLA_STRING: + if _PY3_: v = bytes(v,'ascii') + attr = struct.pack("{0}sx".format(len(v)),v) elif d == nlh.NLA_FLAG: attr = '' # a 0 sized attribute elif d == nlh.NLA_MSECS: attr = struct.pack("Q",v) elif d == nlh.NLA_NESTED: # assumes a single layer of nesting for nested in v: - # prepend the packed index to the already packed attribute - # the align it + # prepend packed index to the already packed attribute & align it nattr = struct.pack('H',nested[0]) + nested[1] nattr += struct.pack("{0}x".format(nlh.NLMSG_ALIGNBY(len(nattr)))) attr += nattr - #for nested in v: - # nlen = len(v) + 2 - # nattr = struct.pack('xBx', nlen) + nested - # nattr += struct.pack("{0}x".format(nlh.NLMSG_ALIGNBY(len(nattr)))) - # attr += nattr else: fmt = "" # appease PyCharm if d == nlh.NLA_SET_U8: fmt = "B" diff --git a/pyric/net/if_h.py b/pyric/net/if_h.py index 3377ded..0483123 100644 --- a/pyric/net/if_h.py +++ b/pyric/net/if_h.py @@ -58,7 +58,9 @@ __status__ = 'Production' import struct -import pyric.net.sockios_h as sioc +import pyric.net.sockios_h as sioch +import sys +_PY3_ = sys.version_info.major == 3 IFNAMSIZ = 16 IFALIASZ = 256 @@ -229,7 +231,7 @@ def sockaddr(sa_family,sa_data=None): to get the txpower and verify the presense of wireless extensions }; """ -ifr_name = '{0}s'.format(IFNAMSIZ) # formats for ifreq struct +ifr_name = '{0}s'.format(IFNAMSIZ) # formats for ifreq struct ifr_flags = 'h' ifr_ifindex = 'i' ifr_iwname = '{0}s'.format(256-IFNAMSIZ) # dirty hack to get an unknown string back @@ -256,6 +258,7 @@ def ifreq(ifrn,ifru=None,param=None): NOTE: ifreq will return AttributeError for any caught exception """ # pack the nic + if _PY3_: ifrn = bytes(ifrn,'ascii') try: # NOTE: don't need to keep the name to 16 chars as struct does it for us ifr = struct.pack(ifr_name,ifrn) @@ -264,27 +267,27 @@ def ifreq(ifrn,ifru=None,param=None): try: if not ifru: pass # only pass the device name - elif ifru == sioc.SIOCGIFHWADDR: # get hwaddr + elif ifru == sioch.SIOCGIFHWADDR: # get hwaddr ifr += sockaddr(ARPHRD_ETHER,None) - elif ifru == sioc.SIOCSIFHWADDR: # set hwaddr + elif ifru == sioch.SIOCSIFHWADDR: # set hwaddr ifr += sockaddr(ARPHRD_ETHER,param[0]) - elif ifru == sioc.SIOCGIFADDR or \ - ifru == sioc.SIOCGIFNETMASK or \ - ifru == sioc.SIOCGIFBRDADDR: # get ip4, netmask or broadcast address + elif ifru == sioch.SIOCGIFADDR or \ + ifru == sioch.SIOCGIFNETMASK or \ + ifru == sioch.SIOCGIFBRDADDR: # get ip4, netmask or broadcast address ifr += sockaddr(AF_INET,None) - elif ifru == sioc.SIOCSIFADDR or \ - ifru == sioc.SIOCSIFNETMASK or \ - ifru == sioc.SIOCSIFBRDADDR: # set ip4, netmask or broadcast address + elif ifru == sioch.SIOCSIFADDR or \ + ifru == sioch.SIOCSIFNETMASK or \ + ifru == sioch.SIOCSIFBRDADDR: # set ip4, netmask or broadcast address ifr += sockaddr(AF_INET,param[0]) - elif ifru == sioc.SIOCGIFFLAGS: # get flags + elif ifru == sioch.SIOCGIFFLAGS: # get flags ifr += struct.pack('{0}x'.format(IFFLAGLEN)) - elif ifru == sioc.SIOCSIFFLAGS: # set flags + elif ifru == sioch.SIOCSIFFLAGS: # set flags ifr += struct.pack(ifr_flags,param[0]) - elif ifru == sioc.SIOCGIFINDEX: # get if index + elif ifru == sioch.SIOCGIFINDEX: # get if index ifr += struct.pack('{0}x'.format(IFIFINDEXLEN)) - elif ifru == sioc.SIOCGIWNAME: # get iw name + elif ifru == sioch.SIOCGIWNAME: # get iw name ifr += struct.pack('{0}x'.format(IWNAMELEN)) - elif ifru == sioc.SIOCGIWTXPOW: # get tx pwr + elif ifru == sioch.SIOCGIWTXPOW: # get tx pwr ifr += struct.pack('{0}x'.format(IWTXPWRLEN)) else: raise AttributeError("ifru {0} not supported".format(ifru)) diff --git a/pyric/pyw.py b/pyric/pyw.py index eaa5060..a8747d2 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -68,7 +68,7 @@ __name__ = 'pyw' __license__ = 'GPLv3' -__version__ = '0.1.8' +__version__ = '0.1.9' __date__ = 'July 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' @@ -737,7 +737,7 @@ def covclassget(card, *argv): def covclassset(card, cc, *argv): """ - REQUIRES ROOT PRIVILEGES + REQUIRES ROOT PRIVILEGES/DOES NOT WORK ON ALL SYSTEMS sets the coverage class. The coverage class IAW IEEE Std 802.11-2012 is defined as the Air propagation time & together with max tx power control the BSS diamter @@ -794,7 +794,8 @@ def retryshortset(card, lim, *argv): :param card: Card object :param lim: max # of short retries 1 - 255 :param argv: netlink socket at argv[0] (or empty) - sets card's shorty retry + NOTE: after moving to kernel 4, the kernel does not allow setting up to + the max """ if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: # this can work 'incorrectly' on non-int values but these will @@ -844,7 +845,8 @@ def retrylongset(card, lim, *argv): :param card: Card object :param lim: max # of short retries 1 - 255 :param argv: netlink socket at argv[0] (or empty) - sets card's long retry + NOTE: after moving to kernel 4, the kernel does not allow setting up to + the max """ if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: # this can work 'incorrectly' on non-int values but these will @@ -1343,14 +1345,11 @@ def chset(card, ch, chw=None, *argv): :returns: True on success NOTE: o Can throw a device busy for several reason. Most likely due to - the network manager etc. + NetworkManager or wpa_supplicant o On my system at least (Ubuntu), creating a new dev in monitor mode and deleting all other existing managed interfaces allows for the new virtual device's channels to be changed w/out interference from network manager """ - if ch not in channels.channels(): - raise pyric.error(pyric.EINVAL, "Invalid channel") - try: nlsock = argv[0] except IndexError: @@ -1367,16 +1366,13 @@ def freqset(card, rf, chw=None, *argv): :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} :param argv: netlink socket at argv[0] (or empty) """ - if rf not in channels.freqs(): raise pyric.error(pyric.EINVAL, "Invalid RF") - if chw in channels.CHTYPES: chw = channels.CHTYPES.index(chw) - else: raise pyric.error(pyric.EINVAL, "Invalid channel width") - try: nlsock = argv[0] except IndexError: return _nlstub_(freqset, card, rf, chw) try: + chw = channels.CHTYPES.index(chw) msg = nl.nlmsg_new(nltype=_familyid_(nlsock), cmd=nl80211h.NL80211_CMD_SET_WIPHY, flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) @@ -1385,6 +1381,8 @@ def freqset(card, rf, chw=None, *argv): nl.nla_put_u32(msg, chw, nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) + except ValueError: + raise pyric.error(pyric.EINVAL, "Invalide channel width") except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: @@ -1511,7 +1509,7 @@ def devset(card, ndev, *argv): raise return new -def devadd(card, vdev, mode, flags=None, *argv): +def phyadd(card, vdev, mode, flags=None, *argv): """ REQUIRES ROOT PRIVILEGES adds a virtual interface on device having type mode (iw phy @@ -1525,6 +1523,11 @@ def devadd(card, vdev, mode, flags=None, *argv): |'cook'|'active'} :param argv: netlink socket at argv[0] (or empty) :returns: the new Card + NOTE: due to a recent bug in kernel 4.4.0-x where x is APX 28, nl80211 + commands to add interface are not "respected" by the kernel. Namely, + the vdev is not used and the kernel adds a card with a "predictable" + name and furthermore, the new card has a different hw address (1 up from + the original card) """ if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') if flags: @@ -1538,7 +1541,7 @@ def devadd(card, vdev, mode, flags=None, *argv): try: nlsock = argv[0] except IndexError: - return _nlstub_(devadd, card, vdev, mode, flags) + return _nlstub_(phyadd, card, vdev, mode, flags) # if we have a Card, pull out phy index try: @@ -1564,7 +1567,68 @@ def devadd(card, vdev, mode, flags=None, *argv): except nl.error as e: raise pyric.error(e.errno, e.strerror) - return Card(card.phy, vdev, nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) + # return the new Card with info from the results msg + return Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), + nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFNAME), + nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) + +def devadd(card, vdev, mode, flags=None, *argv): + """ + REQUIRES ROOT PRIVILEGES + adds a virtual interface on device having type mode (iw dev + interface add type + :param card: Card object or ifindex + :param vdev: device name of new interface + :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| + 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} + :param flags: list of monitor flags (can only be used if creating monitor + mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' + |'cook'|'active'} + :param argv: netlink socket at argv[0] (or empty) + :returns: the new Card + """ + if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') + if flags: + if mode != 'monitor': + raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') + for flag in flags: + if flag not in MNTRFLAGS: + raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) + else: flags = [] + + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(devadd, card, vdev, mode, flags) + + # if we have a Card, pull out phy index + try: + idx = card.idx + except AttributeError: + idx = card + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_NEW_INTERFACE, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nla_put_string(msg, vdev, nl80211h.NL80211_ATTR_IFNAME) + nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) + for flag in flags: + nl.nla_put_u32(msg, + MNTRFLAGS.index(flag), + nl80211h.NL80211_ATTR_MNTR_FLAGS) + nl.nl_sendmsg(nlsock, msg) + rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes + except AttributeError as e: + raise pyric.error(pyric.EINVAL, e) + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + + # return the new Card with info from the results msg + return Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), + nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFNAME), + nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) def devdel(card, *argv): """ @@ -1610,13 +1674,50 @@ def isconnected(card, *argv): # dirty hack - using the precence of an RF to determine connected-ness return devinfo(card, nlsock)['RF'] is not None +def openconnect(card, ssid, bssid=None, rf=None, *argv): + """ + REQUIRES ROOT PRIVILEGES & WPA_SUPPLICANT MUST BE DISABLED + NOTE: DOES NOT WORK AT THIS TIME, returns Success but does not connect + connects to open network ssid + :param card: Card object + :param ssid: the SSID, network name + :param bssid: the AP's BSSID + :param rf: the frequency of the AP + :param argv: netlink socket at argv[0] (or empty) + :returns: True on successful connect, False otherwise + NOTE: although connected, traffic will not be route, card will not have + an IP assigned + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(openconnect, card, ssid, bssid, rf) + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_CONNECT, # step 1 + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nla_put_string(msg, ssid, nl80211h.NL80211_ATTR_SSID) + #nl.nla_put_u16(msg, 0, nl80211h.NL80211_ATTR_BG_SCAN_PERIOD) + #nl.nla_put_unspec(msg, _mac2hex_(bssid), nl80211h.NL80211_ATTR_MAC) + nl.nl_sendmsg(nlsock, msg) + if not nl.nl_recvmsg(nlsock) == nlh.NLE_SUCCESS: return False + + except AttributeError: + raise pyric.error(pyric.EINVAL, "Invalid Card") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + return True + def disconnect(card, *argv): """ REQUIRES ROOT PRIVILEGES disconnect the card from an AP :param card: Card object :param argv: netlink socket at argv[0] (or empty) - NOTE: does not return error if card is not connected + NOTE: does not return error if card is not connected. May not work if + wpa_supplicant is running """ try: nlsock = argv[0] @@ -1803,6 +1904,7 @@ def stainfo(card, mac, *argv): 'tx-bitrate':{}, 'rx-bitrate':{}} _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_STA_INFO, False) + if d == nlh.NLA_ERROR: return info for sidx, sattr in bs: # sidx indexes the enum nl80211_sta_info try: if sidx == nl80211h.NL80211_STA_INFO_RX_BYTES: @@ -1836,15 +1938,26 @@ def stainfo(card, mac, *argv): def _hex2ip4_(v): - """ :returns: a '.' separated ip4 address from byte stream v """ - return '.'.join([str(ord(c)) for c in v]) + """ + :param v: packed by string + :returns: a '.' separated ip4 address from byte stream v + """ + try: + return '.'.join([str(ord(c)) for c in v]) + except TypeError: + # python 3 c is already numeric + return '.'.join([str(c) for c in v]) def _hex2mac_(v): """ :param v: packed bytestream of form \xd8\xc7\xc8\x00\x11\x22 :returns: a ':' separated mac address from byte stream v """ - return ":".join(['{0:02x}'.format(ord(c)) for c in v]) + try: + return ":".join(['{0:02x}'.format(ord(c)) for c in v]) + except TypeError: + # it appears that in Python 3.5 c is already numeric + return ":".join(['{0:02x}'.format(c) for c in v]) def _mac2hex_(v): """ @@ -2301,4 +2414,4 @@ def _fut_chset(card, ch, chw, *argv): nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) \ No newline at end of file + _ = nl.nl_recvmsg(nlsock) diff --git a/pyric/utils/channels.py b/pyric/utils/channels.py index 94f5169..63f4224 100644 --- a/pyric/utils/channels.py +++ b/pyric/utils/channels.py @@ -48,18 +48,20 @@ 2447:8,2417:2,2452:9,2422:3,2457:10,2427:4,2462:11} # UNII 5 Bands (ieee80211.h-> BAND_ID_5G) +# confirm that ch 34, ch 54, 58, 62, 102, 106, 110, 114 118, 122, 126, 138, 144, 151, +# 155, 159, UNII_5_C2F={34:5170,36:5180,38:5190,40:5200,42:5210,44:5220,46:5230,48:5240,50:5250, - 52:5260,54:5270,56:5280,58:5280,60:5300,62:5310,64:5320,100:5500, + 52:5260,54:5270,56:5280,58:5290,60:5300,62:5310,64:5320,100:5500, 102:5510,104:5520,106:5530,108:5540,110:5550,112:5560,114:5570,116:5580, 118:5590,120:5600,122:5610,124:5620,126:5630,128:5640,132:5660,136:5680, 138:5690,140:5700,142:5710,144:5720,149:5745,151:5755,153:5765,155:5775, 157:5785,159:5795,161:5805,165:5825} UNII_5_F2C={5250:50,5765:153,5510:102,5640:128,5260:52,5775:155,5520:104,5270:54, - 5785:157,5530:106,5660:132,5280:58,5795:159,5540:108,5805:161,5550:110, - 5680:136,5170:34,5300:60,5560:112,5690:138,5180:36,5310:62,5825:165, - 5570:114,5700:140,5190:38,5320:64,5580:116,5710:142,5200:40,5590:118, - 5720:144,5210:42,5600:120,5220:44,5610:122,5230:46,5745:149,5620:124, - 5240:48,5755:151,5500:100,5630:126} + 5785:157,5530:106,5660:132,5280:56,5795:159,5540:108,5290:58,5805:161, + 5550:110,5680:136,5170:34,5300:60,5560:112,5690:138,5180:36,5310:62, + 5825:165,5570:114,5700:140,5190:38,5320:64,5580:116,5710:142,5200:40, + 5590:118,5720:144,5210:42,5600:120,5220:44,5610:122,5230:46,5745:149, + 5620:124,5240:48,5755:151,5500:100,5630:126} # UNII 4 Bands (ieee80211.h-> BAND_ID_5G) UNII_4_C2F={183:4915,184:4920,185:4925,187:4935,188:4940,189:4945,192:4960,196:4980} @@ -70,12 +72,34 @@ #134 3672.5 134 3670.0 135 3677.5 136 3682.5 136 3680.0 #137 3687.5 137 3685.0 138 3689.5 138 3690.0 -def channels(): - """ :returns:list of all channels """ - return sorted(ISM_24_C2F.keys() + UNII_5_C2F.keys() + UNII_4_C2F.keys()) - -def freqs(): - """ :returns:list of frequencies """ +def channels(band=None): + """ + returns list of channels + :param band: one of {None=all|'ISM'=2.4GHz|'UNII'=4.9/5GHz|'UNII5'=5GHz, + 'UNII4'=4GHz} + :returns:list of channels + """ + if band == 'ISM': return ISM_24_C2F.keys() + elif band == 'UNII': return UNII_5_C2F.keys() + UNII_4_C2F.keys() + elif band == 'UNII4': return UNII_4_C2F.keys() + elif band == 'UNII5': return UNII_5_C2F.keys() + try: + return sorted(ISM_24_C2F.keys() + UNII_5_C2F.keys() + UNII_4_C2F.keys()) + except TypeError: + # python 3 doesn't like the above (uses dict_keys obj instead of list) + return sorted(list(ISM_24_C2F.keys()) + list(UNII_5_C2F.keys()) + list(UNII_4_C2F.keys())) + +def freqs(band=None): + """ + returns list of channels + :param band: one of {None=all|'ISM'=2.4GHz|'UNII'=4.9/5GHz|'UNII5'=5GHz, + 'UNII4'=4GHz} + :returns:list of frequencies + """ + if band == 'ISM': return sorted(ISM_24_F2C.keys()) + elif band == 'UNII': return sorted(UNII_5_F2C.keys() + UNII_4_F2C.keys()) + elif band == 'UNII4': return sorted(UNII_4_F2C.keys()) + elif band == 'UNII5': return sorted(UNII_5_F2C.keys()) return sorted(ISM_24_F2C.keys() + UNII_5_F2C.keys()+ UNII_4_F2C.keys()) def ch2rf(c): diff --git a/pyric/utils/rfkill.py b/pyric/utils/rfkill.py index d726a02..05500e6 100644 --- a/pyric/utils/rfkill.py +++ b/pyric/utils/rfkill.py @@ -45,6 +45,8 @@ import pyric import errno import pyric.net.wireless.rfkill_h as rfkh +import sys +_PY3_ = sys.version_info.major == 3 RFKILL_STATE = [False,True] # Unblocked = 0, Blocked = 1 @@ -70,8 +72,11 @@ def rfkill_list(): fcntl.fcntl(fin.fileno(),fcntl.F_SETFL,flags|os.O_NONBLOCK) while True: try: - idx,t,op,s,h = struct.unpack(rfkh.rfk_rfkill_event, - fin.read(rfkh.RFKILLEVENTLEN)) + stream = fin.read(rfkh.RFKILLEVENTLEN) + if _PY3_: + stream = bytes(stream,'ascii') + if len(stream) < rfkh.RFKILLEVENTLEN: raise IOError('python 3') + idx,t,op,s,h = struct.unpack(rfkh.rfk_rfkill_event,stream) if op == rfkh.RFKILL_OP_ADD: rfks[getname(idx)] = {'idx':idx, 'type':rfkh.RFKILL_TYPES[t], @@ -92,6 +97,7 @@ def rfkill_block(idx): fout = None try: rfke = rfkh.rfkill_event(idx,rfkh.RFKILL_TYPE_ALL,rfkh.RFKILL_OP_CHANGE,1,0) + if _PY3_: rfke = rfke.decode('ascii') fout = open(dpath, 'w') fout.write(rfke) except struct.error as e: diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 84c269f..829f7ed 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -13,20 +13,36 @@ usage: sudo python pyw.unittest.py -v -Results as of 31-May-15 +Results as of 24-July-16 + sudo python pyw.unittest.py -............................................................. +Testing PyRIC v0.1.5 pyw v0.1.8 on Python 2.7.12 +................................................................................... ---------------------------------------------------------------------- -Ran 61 tests in 5.360s +Ran 83 tests in 5.919s OK + +NOTE: + 1) functions disconnect and link require a connection, they are tested/confirmed + manually + 2) function devadd (and subsequently devset) are commented out. There is a + peculiar behavior in netlink/nl80211 (appearing in kernel 4.4.0-x) where + regardless of the name passed to create a new device as in + iw phy interface add type + pyw.devadd(, , ) + the kernel or driver or whoever will instead assign a predicatable name + of the form: + wlx00c0ca59afa7 + devadd has been fixed but this is currently not reflected in the below unittests + it has been manually tested and confirmed """ from __future__ import print_function # python 2to3 compability #__name__ = 'pyw.unittest' __license__ = 'GPLv3' -__version__ = '0.0.2' +__version__ = '0.0.3' __date__ = 'July 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' @@ -35,33 +51,36 @@ import unittest import time +import pyric from pyric import error import pyric.pyw as pyw -from pyric.utils.channels import ISM_24_F2C,rf2ch +import pyric.utils.channels as channels import pyric.net.wireless.wlan as wlan import sys -_PVER_ = sys.version_info.major - # modify below to fit your system pri = {'dev':'alfa0', 'mac':'00:c0:ca:59:af:a6', - 'ifindex':4, - 'phy':1, + 'ifindex':18, + 'phy':7, + 'driver':'rt2800usb', + 'chipset':'Ralink RT2870/3070', 'mode':'managed', 'tx':20, - 'freqs':sorted(ISM_24_F2C.keys()), + 'freqs':[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484], + #'freqs':[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472, + # 5180,5200,5220,5240,5260,5280,5300,5320, 5500,5520,5540,5560, + # 5580,5600,5620,5640,5660,5680,5700,5745,5765,5785,5805, 5825], 'stds':['b','g','n'], - 'ip':'192.168.3.23', - 'bcast':'192.168.3.63', - 'mask':'255.255.255.192'} + 'modes':['ibss', 'managed', 'AP', 'AP VLAN', 'wds','monitor', 'mesh'], + 'ip':'10.0.0.2', + 'bcast':'10.0.0.255', + 'mask':'255.255.255.0'} newhw = '00:c0:ca:60:b0:a7' -newip = '192.168.3.30' -newbcast = '192.168.3.255' -newmask = '255.255.255.0' -nics = ['alfa0','eth0','lo','wlan0'] +newip = '10.0.0.3' +nics = ['eth0','lo','wlan0','alfa0'] enics = ['eth0','lo'] -wnics = ['alfa0','wlan0'] +wnics = ['wlan0','alfa0'] inics = ['foo0','bar0'] regdom = '00' newregdom = 'BO' @@ -137,7 +156,7 @@ def test_invalidmacarg(self): self.assertRaises(error,pyw.macset,self.card,'00:0A') # test inetget/inetset -# testing both together as the test card alfa0 is never associated thus +# testing both together as the test card is never associated thus # never has an ip etc # NOTE: through inetset, we get the side-effect of testing ip4set, netmaskset, # broadcastset @@ -173,7 +192,7 @@ def test_down(self): self.assertFalse(pyw.isup(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.down,'bad0') -# isblocked, test only card check +# isblocked, test only valid card arg see below class IsBlockedTestCase(unittest.TestCase): def test_invalidcardarg(self): self.assertRaises(error,pyw.isup,'bad0') @@ -208,7 +227,7 @@ def testinvalidonval(self): # test covclass # NOTE: cannot currently test set as my cards do not support it -# NOTEL covclassget uses phyinfo - if that works covclassget works +# NOTE: covclassget uses phyinfo - if that works covclassget works # test get/set retryshort class RetryShortTestCase(CardTestCase): @@ -284,8 +303,8 @@ def test_invalidcardarg(self): # test get chs class DevCHsTestCase(CardTestCase): def test_devchs(self): - [rf2ch(rf) for rf in pri['freqs']] - self.assertListEqual([rf2ch(rf) for rf in pri['freqs']], + [channels.rf2ch(rf) for rf in pri['freqs']] + self.assertListEqual([channels.rf2ch(rf) for rf in pri['freqs']], pyw.devchs(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.devchs,'bad0') @@ -300,7 +319,7 @@ def test_invalidcardarg(self): # test get modes class DevModesTestCase(CardTestCase): def test_devmodes(self): - self.assertIn('managed',pyw.devmodes(self.card)) + self.assertListEqual(pri['modes'],pyw.devmodes(self.card)) def test_invalidcardarg(self): self.assertRaises(error,pyw.devmodes,'bad0') @@ -311,7 +330,7 @@ def test_devcmds(self): def test_invalidcardarg(self): self.assertRaises(error,pyw.devmodes,'bad0') -# test devinfo +# test devinfo - the key-value pairs of devinfo are tested via others class DevInfoTestCase(CardTestCase): def test_devinfobycard(self): self.assertIsInstance(pyw.devinfo(self.card),dict) @@ -364,9 +383,9 @@ def test_invalidchwarg(self): # because freqset was already tested in chgetset, we only test invalid args class FreqSetTestCase(CardTestCase): def test_invalidrfarg(self): - # we test both an invalid RF and an RF the card does not support + # we test both an invalid RF and an RF the card does not support self.assertRaises(error,pyw.freqset,self.card,2410) - self.assertRaises(error,pyw.freqset,self.card,5250) + self.assertRaises(error,pyw.freqset,self.card,4960) # test modeget class ModeGetTestCase(CardTestCase): @@ -395,25 +414,62 @@ class IfacesTestCase(CardTestCase): def test_ifaces(self): self.assertIsInstance(pyw.ifaces(self.card),list) def test_invalidcardarg(self): - self.assertRaises(error,pyw.ifaces,'b0b0') + self.assertRaises(error,pyw.ifaces,'bad0') # test devadd/devdel +""" class DevAddDelTestCase(CardTestCase): def test_devadddel(self): card = pyw.devadd(self.card,'test0','monitor') - self.assertTrue(pyw.devdel(card)) + self.assertTrue(card.dev in pyw.winterfaces()) + pyw.devdel(card) + self.assertFalse(card.dev in pyw.winterfaces()) def test_invalidcardarg(self): self.assertRaises(error,pyw.devadd,'bad0','test0','monitor') self.assertRaises(error,pyw.devdel,'bad0') - card = pyw.devadd(self.card,'test0','monitor') - pyw.devdel(card) - self.assertRaises(error,pyw.devdel,card) def test_invalidmodearg(self): self.assertRaises(error,pyw.devadd,self.card,'test0','foobar') def test_invalidflagsarg(self): self.assertRaises(error,pyw.devadd,self.card,'test0','monitor','foobar') self.assertRaises(error,pyw.devadd,self.card,'test0','managed','fcsfail') +# test devset +class DevSetTestCase(CardTestCase): + def test_devset(self): + card = pyw.devset(self.card,'unittest0') + self.assertTrue(pyw.iswireless('unittest0')) + self.assertFalse(pyw.iswireless(pri['dev'])) + pyw.devset(card,pri['dev']) + self.assertFalse(pyw.iswireless('unittest0')) + def test_invalidcardarg(self): + self.assertRaises(error,pyw.devset,'bad0','managed') + def test_invalidndevarg(self): + self.assertRaises(error,pyw.devset,self.card,None) +""" +class IsConnectedTestCase(CardTestCase): + def test_isconnected(self): + self.assertFalse(pyw.isconnected(self.card)) + def test_invalidcardarg(self): + self.assertRaises(error, pyw.isconnected, 'bad0') + +class PhyListTestCase(unittest.TestCase): + def test_phylist(self): + self.assertTrue((pri['phy'],'phy{0}'.format(pri['phy'])) in pyw.phylist()) + +class IfInfoTestCase(CardTestCase): + def test_ifinfo(self): + iinfo = pyw.ifinfo(self.card) + self.assertTrue(pri['driver'] == iinfo['driver']) + self.assertTrue(pri['chipset'] == iinfo['chipset']) + def test_invalidcardarg(self): + self.assertRaises(error, pyw.ifinfo, 'bad0') + +def pyvers(): + return "{0}.{1}.{2}".format(sys.version_info.major, + sys.version_info.minor, + sys.version_info.micro) if __name__ == '__main__': - print('Not currently stable') + print("Testing PyRIC v{0} pyw v{1} on Python {2}".format(pyric.version, + pyw.__version__, + pyvers())) unittest.main() \ No newline at end of file From cb3f4e7ce64b950db91feaafdbb025ab1ad8f68d Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 24 Jul 2016 05:30:09 -0600 Subject: [PATCH 091/121] v0.1.5 --- pyric/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyric/__init__.py b/pyric/__init__.py index 77690eb..1a92f94 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -72,7 +72,7 @@ def strerror(errno): # define long description long_desc = """ -# PyRIC 0.1.4: Python Radio Interface Controller +# PyRIC 0.1.5: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester ## DESCRIPTION: From 004bf7bbab329556a830175dcad0519dd35b03df Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 24 Jul 2016 09:07:29 -0600 Subject: [PATCH 092/121] v0.1.6 Issue #21 resolved, connect works --- CHANGES | 10 +++++++++- README.md | 2 +- TODO | 10 ++++------ docs/PyRIC.pdf | Bin 508771 -> 508881 bytes docs/PyRIC.tex | 6 ++++-- pyric/__init__.py | 8 ++++---- pyric/pyw.py | 12 +++++------- 7 files changed, 27 insertions(+), 21 deletions(-) diff --git a/CHANGES b/CHANGES index 4256607..8b1c2b3 100644 --- a/CHANGES +++ b/CHANGES @@ -159,4 +159,12 @@ v 0.1.5 Begin STA associated functionality with python 3 have been rectified at the expense of python 3 and not python 2 o fixed incorrect frequencies in unii_5_C2F in utils/channels o updated pyw.unittest for python 3.5 and for added functions - o added by band to channels and freqs in utils/channels.py \ No newline at end of file + o added by band to channels and freqs in utils/channels.py + +v 0.1.6 Continue with STA functionality + o Issue #21 resolved. openconnect (renamed to connect) now works. (had to fix + how the ssid was being passed. as a string with a affixed null byte, it would + fail but as unspec, it succeeded) + - issue 1: wpa_supplicant must be turned off + - issue 2: caller/user must configure dhcp request or inet themselves + - issue 3: only works on open networks diff --git a/README.md b/README.md index 68b8c1b..7ba207a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PyRIC 0.1.5: Python Radio Interface Controller +# PyRIC 0.1.6: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester ![](docs/logo.png?raw=true) diff --git a/TODO b/TODO index 523f8d9..2ed1299 100644 --- a/TODO +++ b/TODO @@ -2,7 +2,6 @@ o ethtool. uses ioctl but does not follow same pattern as ifconfig seems to use - ethtool -i gives driver information including firmware-version - - ethtool -S gives some statistics on rx/tx and udevadm (does what hardware.py does) 11) tried NL80211_CMD_GET_WIPHY, setting _WIPHY_TX_POWER_LEVEL but did not return the current power level - currently cannot find anything in nl80211.h @@ -16,9 +15,10 @@ o slackware o dd-wrt/OpenWRT 21) look at NL80211_CMD_START_AP - no need to try and recreate the wheel by - replicate hostap but could be useful - 26) need to parse dumps NLM_F_DUMP, for now we're good with link etc, so long - as the card is connected but it may come up eventually + replicating hostap but could be useful + 26) need to parse dumps (NLM_F_DUMP), for now we're good with link etc, so long + as the card is connected but it may come up eventually especially if we want + to add scan results 29) figure out how to parse the information element in pyw.link - there's some good shit in it including sometimes the router os and type o in link, NL80211_BSS_BEACON_IES vs NL80211_BSS_INFORMATION_ELEMENT @@ -29,6 +29,4 @@ o _HT_CAPA: as in the HT information IE 42) is there a simple way to set the format strings as constants keeping in mind that things like strings require a length in the format string - 45) find out if some of the 'flags' for bands are actually correct such as - HT40+ which should be disabled for channel 11 46) max-tx for bands is showing 15 when iwconfig shows 30 diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 460c7bc7c0aa374a961dab2817651a989666204e..49b830657d29fd783b20d5d7f65782268a75716b 100644 GIT binary patch delta 8738 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 MH#rI=B}Gq03e8y6&;S4c delta 8632 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 HWsv?Kj>N5F diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 4b501f9..554ef8e 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -73,7 +73,7 @@ basicstyle=\footnotesize } -\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.5: User Manual} +\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.6: User Manual} \author{Dale V. Patterson\\ wraith.wireless@yandex.com} \begin{document} @@ -847,6 +847,8 @@ \subsection{Functions} \begin{itemize} \item isconnected(card, [nlsock]): (iw dev card. info | grep channel), type: netlink, determines if card is connected +\item connect(card, ssid, bssid, rf, [nlsock]): (iw dev card. connect + ) connects to AP SSID with BSSID \item disconnect(card, [nlsock]): (iw dev card. disconnect), type: netlink, disconnects card from AP \item link(card, [nlsock]): (iw dev card. link), type: netlink, displays @@ -1136,7 +1138,7 @@ \subsection{Functions} \end{enumerate} \section{Copyright and License}\label{sec:copy} -PYRIC: Python Radio Interface Controller v0.1.5\\ +PYRIC: Python Radio Interface Controller v0.1.6\\ Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com)\\ diff --git a/pyric/__init__.py b/pyric/__init__.py index 1a92f94..33bae80 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -26,20 +26,20 @@ linux (3.x or 4.x kernel) Python 2.7 - pyric 0.1.5 + pyric 0.1.5 through 0.1.6 desc: wireless nic library: wireless radio identification, manipulation, enumeration + concentrate on STA/AP related functionality includes: /nlhelp /lib /net /utils pyw.py changes: See CHANGES in top-level directory - WARNING: DO NOT import * """ __name__ = 'pyric' __license__ = 'GPLv3' -__version__ = '0.1.5' +__version__ = '0.1.6' __date__ = 'June 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' @@ -72,7 +72,7 @@ def strerror(errno): # define long description long_desc = """ -# PyRIC 0.1.5: Python Radio Interface Controller +# PyRIC 0.1.6: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester ## DESCRIPTION: diff --git a/pyric/pyw.py b/pyric/pyw.py index a8747d2..05c6e57 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -1674,11 +1674,10 @@ def isconnected(card, *argv): # dirty hack - using the precence of an RF to determine connected-ness return devinfo(card, nlsock)['RF'] is not None -def openconnect(card, ssid, bssid=None, rf=None, *argv): +def connect(card, ssid, bssid=None, rf=None, *argv): """ REQUIRES ROOT PRIVILEGES & WPA_SUPPLICANT MUST BE DISABLED - NOTE: DOES NOT WORK AT THIS TIME, returns Success but does not connect - connects to open network ssid + connects to (Open) AP :param card: Card object :param ssid: the SSID, network name :param bssid: the AP's BSSID @@ -1691,16 +1690,15 @@ def openconnect(card, ssid, bssid=None, rf=None, *argv): try: nlsock = argv[0] except IndexError: - return _nlstub_(openconnect, card, ssid, bssid, rf) + return _nlstub_(connect, card, ssid, bssid, rf) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), cmd=nl80211h.NL80211_CMD_CONNECT, # step 1 flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nla_put_string(msg, ssid, nl80211h.NL80211_ATTR_SSID) - #nl.nla_put_u16(msg, 0, nl80211h.NL80211_ATTR_BG_SCAN_PERIOD) - #nl.nla_put_unspec(msg, _mac2hex_(bssid), nl80211h.NL80211_ATTR_MAC) + nl.nla_put_unspec(msg, ssid, nl80211h.NL80211_ATTR_SSID) + nl.nla_put_unspec(msg, _mac2hex_(bssid), nl80211h.NL80211_ATTR_MAC) nl.nl_sendmsg(nlsock, msg) if not nl.nl_recvmsg(nlsock) == nlh.NLE_SUCCESS: return False From 80928d39615b8544b7731282dcc9eefaa85b2f6e Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Tue, 26 Jul 2016 12:03:46 -0600 Subject: [PATCH 093/121] v0.1.6 added TODOs --- TODO | 5 +++++ pyric/pyw.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/TODO b/TODO index 2ed1299..582affa 100644 --- a/TODO +++ b/TODO @@ -30,3 +30,8 @@ 42) is there a simple way to set the format strings as constants keeping in mind that things like strings require a length in the format string 46) max-tx for bands is showing 15 when iwconfig shows 30 + 50) need a check cards script that tests the current system for compatibility + with ioctl, netlink and pyw + - add error check and throw different exception if errno 19, no such device + is in fact caused by lack of support for netlink/nl80211 + 51) with respect to phyadd, airmon-ng mentions something about udev changing then name \ No newline at end of file diff --git a/pyric/pyw.py b/pyric/pyw.py index 05c6e57..e726fd2 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -""" pyw.py: python iw +""" pyw.py: Linux wireless library for the Python Wireless Developer and Pentester Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) From 7a39aed934a22433e2a70608079e3f0a6e521fe2 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Wed, 27 Jul 2016 09:54:47 -0600 Subject: [PATCH 094/121] v0.1.6 issue #24 resolved --- CHANGES | 5 +++++ TODO | 4 ---- pyric/pyw.py | 27 ++++++++++++++++++--------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/CHANGES b/CHANGES index 8b1c2b3..bf0f859 100644 --- a/CHANGES +++ b/CHANGES @@ -168,3 +168,8 @@ v 0.1.6 Continue with STA functionality - issue 1: wpa_supplicant must be turned off - issue 2: caller/user must configure dhcp request or inet themselves - issue 3: only works on open networks + o Issue #24 (TODO #50) resolved. getcard which is the entry point for any + nl80211 functionality uses devinfo to retrieve the Card tuple. devinfo will now + report No Such device as two seperate errors one identifying when there is + no device currently present on the machine and one identifying when the + specified dev's driver does not support nl80211 diff --git a/TODO b/TODO index 582affa..d1e5256 100644 --- a/TODO +++ b/TODO @@ -30,8 +30,4 @@ 42) is there a simple way to set the format strings as constants keeping in mind that things like strings require a length in the format string 46) max-tx for bands is showing 15 when iwconfig shows 30 - 50) need a check cards script that tests the current system for compatibility - with ioctl, netlink and pyw - - add error check and throw different exception if errno 19, no such device - is in fact caused by lack of support for netlink/nl80211 51) with respect to phyadd, airmon-ng mentions something about udev changing then name \ No newline at end of file diff --git a/pyric/pyw.py b/pyric/pyw.py index e726fd2..69ac86b 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -1121,22 +1121,33 @@ def devinfo(card, *argv): except IndexError: return _nlstub_(devinfo, card) - # if we have a Card, pull out dev name, ifindex itherwise get ifindex + dev = None # appease pycharm try: - dev = card.dev - idx = card.idx - except AttributeError: - dev = card - idx = _ifindex_(dev) + # if we have a Card object, pull at dev,ifindex. otherwise get ifindex + try: + dev = card.dev + idx = card.idx + except AttributeError: + dev = card + idx = _ifindex_(dev) - try: + # using the ifindex, get the phy and details about the Card msg = nl.nlmsg_new(nltype=_familyid_(nlsock), cmd=nl80211h.NL80211_CMD_GET_INTERFACE, flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) nl.nla_put_u32(msg, idx, nl80211h.NL80211_ATTR_IFINDEX) nl.nl_sendmsg(nlsock, msg) rmsg = nl.nl_recvmsg(nlsock) + except io.error as e: + # if we get a errno -19, it means ifindex failed & there is no device dev + if e.errno == pyric.ENODEV: + raise(pyric.ENODEV, "No device {0} found".format(dev)) + raise pyric.error(e.errno, e.strerror) except nl.error as e: + # if we get a errno -19, it means ifindex succeeded but netlink failed + # most likely because the given device does not support nl80211 + if e.errno == pyric.ENODEV: + raise pyric.error(pyric.EPROTONOSUPPORT, "Device does not support nl80211") raise pyric.error(e.errno, e.strerror) # pull out attributes @@ -2318,8 +2329,6 @@ def _ifindex_(dev, *argv): raise pyric.error(pyric.EINVAL, e) except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - except io.error as e: - raise pyric.error(e.errno, e.strerror) def _familyid_(nlsock): """ From 5f9a8f8daa2e450dfd3c6ea933ed3382f43c6351 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Wed, 27 Jul 2016 09:56:10 -0600 Subject: [PATCH 095/121] v0.1.6 issue #24 resolved --- CHANGES | 2 +- TODO | 2 +- pyric/pyw.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index bf0f859..7b4bbb8 100644 --- a/CHANGES +++ b/CHANGES @@ -172,4 +172,4 @@ v 0.1.6 Continue with STA functionality nl80211 functionality uses devinfo to retrieve the Card tuple. devinfo will now report No Such device as two seperate errors one identifying when there is no device currently present on the machine and one identifying when the - specified dev's driver does not support nl80211 + specified dev's driver does not support nl80211 \ No newline at end of file diff --git a/TODO b/TODO index d1e5256..31f6464 100644 --- a/TODO +++ b/TODO @@ -30,4 +30,4 @@ 42) is there a simple way to set the format strings as constants keeping in mind that things like strings require a length in the format string 46) max-tx for bands is showing 15 when iwconfig shows 30 - 51) with respect to phyadd, airmon-ng mentions something about udev changing then name \ No newline at end of file + 51) with respect to phyadd, airmon-ng mentions something about udev changing then name diff --git a/pyric/pyw.py b/pyric/pyw.py index 69ac86b..15e02bf 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -2421,4 +2421,4 @@ def _fut_chset(card, ch, chw, *argv): nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) + _ = nl.nl_recvmsg(nlsock) \ No newline at end of file From d7db099f32ba113fd5495928e80efa2e190d23b2 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sat, 30 Jul 2016 22:28:22 -0600 Subject: [PATCH 096/121] v0.1.6 aesthetics --- TODO | 2 +- pyric/__init__.py | 7 ++++--- pyric/pyw.py | 13 +++++-------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/TODO b/TODO index 31f6464..d1e5256 100644 --- a/TODO +++ b/TODO @@ -30,4 +30,4 @@ 42) is there a simple way to set the format strings as constants keeping in mind that things like strings require a length in the format string 46) max-tx for bands is showing 15 when iwconfig shows 30 - 51) with respect to phyadd, airmon-ng mentions something about udev changing then name + 51) with respect to phyadd, airmon-ng mentions something about udev changing then name \ No newline at end of file diff --git a/pyric/__init__.py b/pyric/__init__.py index 33bae80..36dcfdd 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -52,10 +52,11 @@ # EUNDEF. I don't like importing all from errno but it provides conformity in # error handling i.e modules using pyric.error do not need to call pyric.EUNDEF # and errno.EINVAL but can call pyric.EUNDEF and pyric.EINVAL -EUNDEF = -1 # undefined error -from errno import * # make all errno errors pyric errors -errorcode['EUNDEF'] = -1 # add ours to errorcode dicts +EUNDEF = -1 # undefined error +from errno import * # make all errno errors pyric errors +errorcode[EUNDEF] = "EUNDEF" # add ours to errorcode dicts class error(EnvironmentError): pass + # BELOW IS STILL A WORK IN PRGORESS def strerror(errno): import os diff --git a/pyric/pyw.py b/pyric/pyw.py index 15e02bf..3cc8f9a 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -63,7 +63,6 @@ devadd which will accept a Card or a phy 2) All functions allow pyric errors to pass through. Callers must catch these if they desire - """ __name__ = 'pyw' @@ -174,7 +173,7 @@ def phylist(): """ :returns: a list of tuples t = (physical indexe, physical name) """ # we could walk the directory /sys/class/ieee80211 as well but we'll # let rfkill do it (just in case the above path differs across distros or - # in future upgrades + # in future upgrades) phys = [] rfdevs = rfkill.rfkill_list() for rfk in rfdevs: @@ -210,8 +209,8 @@ def regset(rd, *argv): :param rd: regulatory domain code :param argv: netlink socket at argv[0] (or empty) """ - if len(rd) != 2: - raise pyric.error(pyric.EINVAL, "Invalid reg. domain {0}".format(rd)) + if len(rd) != 2: raise pyric.error(pyric.EINVAL, "Invalid reg. domain") + try: nlsock = argv[0] except IndexError: @@ -243,9 +242,7 @@ class Card(tuple): def __new__(cls, p, d, i): return super(Card, cls).__new__(cls, tuple((p, d, i))) def __repr__(self): - return "Card(phy={0},dev={1},ifindex={2})".format(self.phy, - self.dev, - self.idx) + return "Card(phy={0},dev={1},ifindex={2})".format(self.phy,self.dev,self.idx) @property def phy(self): return self[0] @property @@ -324,7 +321,7 @@ def macset(card, mac, *argv): :param argv: ioctl socket at argv[0] (or empty) :returns: mac address after operation """ - if not _validmac_(mac): raise pyric.error(pyric.EINVAL, "Invalid mac address") + if not _validmac_(mac): raise pyric.error(pyric.EINVAL, "Invalid mac address") try: iosock = argv[0] From 520c9be2f36adaaba3cd3ffa6b5619828d9dfb00 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Mon, 1 Aug 2016 09:27:19 -0600 Subject: [PATCH 097/121] v0.1.6 removed downloads badge --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 7ba207a..1ef301f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ [![License: GPLv3](https://img.shields.io/pypi/l/PyRIC.svg)](https://github.com/wraith-wireless/PyRIC/blob/master/LICENSE) [![PyPI Version](https://img.shields.io/pypi/v/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) -[![Downloads per month on PyPI](https://img.shields.io/pypi/dm/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) ![Supported Python Versions](https://img.shields.io/pypi/pyversions/PyRIC.svg) ![Software status](https://img.shields.io/pypi/status/PyRIC.svg) [![Documentation Status](https://readthedocs.org/projects/pyric/badge/?version=latest)](http://pyric.readthedocs.io/en/latest/?badge=latest) From 1a05696315ebf7a64918eaa12957649b48247d35 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Tue, 2 Aug 2016 22:16:02 -0600 Subject: [PATCH 098/121] v0.1.6 fixed typo in exception raise --- CHANGES | 3 ++- pyric/pyw.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 7b4bbb8..a9dc6d8 100644 --- a/CHANGES +++ b/CHANGES @@ -172,4 +172,5 @@ v 0.1.6 Continue with STA functionality nl80211 functionality uses devinfo to retrieve the Card tuple. devinfo will now report No Such device as two seperate errors one identifying when there is no device currently present on the machine and one identifying when the - specified dev's driver does not support nl80211 \ No newline at end of file + specified dev's driver does not support nl80211 + o fixed TypeError resulting from raising pyric.error incorrectly \ No newline at end of file diff --git a/pyric/pyw.py b/pyric/pyw.py index 3cc8f9a..17fdea0 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -1138,7 +1138,7 @@ def devinfo(card, *argv): except io.error as e: # if we get a errno -19, it means ifindex failed & there is no device dev if e.errno == pyric.ENODEV: - raise(pyric.ENODEV, "No device {0} found".format(dev)) + raise pyric.error(pyric.ENODEV, "No device {0} found".format(dev)) raise pyric.error(e.errno, e.strerror) except nl.error as e: # if we get a errno -19, it means ifindex succeeded but netlink failed From 4918477e27fccd32dd74ddf709695f68414ce8ef Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Tue, 2 Aug 2016 22:50:17 -0600 Subject: [PATCH 099/121] v0.1.6 move phyadd to _depr_phyadd Issue #23 --- CHANGES | 3 +- pyric/pyw.py | 133 ++++++++++++++++++++++++++------------------------- 2 files changed, 69 insertions(+), 67 deletions(-) diff --git a/CHANGES b/CHANGES index a9dc6d8..eb71c3d 100644 --- a/CHANGES +++ b/CHANGES @@ -173,4 +173,5 @@ v 0.1.6 Continue with STA functionality report No Such device as two seperate errors one identifying when there is no device currently present on the machine and one identifying when the specified dev's driver does not support nl80211 - o fixed TypeError resulting from raising pyric.error incorrectly \ No newline at end of file + o fixed TypeError resulting from raising pyric.error incorrectly + o moved phyadd to _depr_phyadd issue #23 \ No newline at end of file diff --git a/pyric/pyw.py b/pyric/pyw.py index 17fdea0..2fe2c99 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -1517,69 +1517,6 @@ def devset(card, ndev, *argv): raise return new -def phyadd(card, vdev, mode, flags=None, *argv): - """ - REQUIRES ROOT PRIVILEGES - adds a virtual interface on device having type mode (iw phy - interface add type - :param card: Card object or physical index - :param vdev: device name of new interface - :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| - 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} - :param flags: list of monitor flags (can only be used if creating monitor - mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' - |'cook'|'active'} - :param argv: netlink socket at argv[0] (or empty) - :returns: the new Card - NOTE: due to a recent bug in kernel 4.4.0-x where x is APX 28, nl80211 - commands to add interface are not "respected" by the kernel. Namely, - the vdev is not used and the kernel adds a card with a "predictable" - name and furthermore, the new card has a different hw address (1 up from - the original card) - """ - if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') - if flags: - if mode != 'monitor': - raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') - for flag in flags: - if flag not in MNTRFLAGS: - raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) - else: flags = [] - - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(phyadd, card, vdev, mode, flags) - - # if we have a Card, pull out phy index - try: - phy = card.phy - except AttributeError: - phy = card - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_NEW_INTERFACE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nla_put_string(msg, vdev, nl80211h.NL80211_ATTR_IFNAME) - nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) - for flag in flags: - nl.nla_put_u32(msg, - MNTRFLAGS.index(flag), - nl80211h.NL80211_ATTR_MNTR_FLAGS) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - - # return the new Card with info from the results msg - return Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), - nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFNAME), - nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) - def devadd(card, vdev, mode, flags=None, *argv): """ REQUIRES ROOT PRIVILEGES @@ -1816,8 +1753,9 @@ def link(card, *argv): # "\x06\x00\x00SSID..... # '\x06\x00' is the ie index & the ssid is the first element # (from what I've seen). This is not nested. Not sure if the - # length is the first two bytes or just the second Get the length of the ssid which is the 3rd,4th byte, then unpack - # the string starting at the fifth byte up to the length + # length is the first two bytes or just the second Get the length + # of the ssid which is the 3rd,4th byte, then unpack the string + # starting at the fifth byte up to the specified length try: l = struct.unpack_from('>H', attr, 0)[0] # have to change the format info['ssid'] = struct.unpack_from('{0}s'.format(l), attr, 2)[0] @@ -2418,4 +2356,67 @@ def _fut_chset(card, ch, chw, *argv): nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) \ No newline at end of file + _ = nl.nl_recvmsg(nlsock) + +def _depr_phyadd(card, vdev, mode, flags=None, *argv): + """ + REQUIRES ROOT PRIVILEGES + adds a virtual interface on device having type mode (iw phy + interface add type + :param card: Card object or physical index + :param vdev: device name of new interface + :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| + 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} + :param flags: list of monitor flags (can only be used if creating monitor + mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' + |'cook'|'active'} + :param argv: netlink socket at argv[0] (or empty) + :returns: the new Card + NOTE: due to a recent bug in kernel 4.4.0-x where x is APX 28, nl80211 + commands to add interface are not "respected" by the kernel. Namely, + the vdev is not used and the kernel adds a card with a "predictable" + name and furthermore, the new card has a different hw address (1 up from + the original card) + """ + if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') + if flags: + if mode != 'monitor': + raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') + for flag in flags: + if flag not in MNTRFLAGS: + raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) + else: flags = [] + + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(phyadd, card, vdev, mode, flags) + + # if we have a Card, pull out phy index + try: + phy = card.phy + except AttributeError: + phy = card + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_NEW_INTERFACE, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nla_put_string(msg, vdev, nl80211h.NL80211_ATTR_IFNAME) + nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) + for flag in flags: + nl.nla_put_u32(msg, + MNTRFLAGS.index(flag), + nl80211h.NL80211_ATTR_MNTR_FLAGS) + nl.nl_sendmsg(nlsock, msg) + rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes + except AttributeError as e: + raise pyric.error(pyric.EINVAL, e) + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + + # return the new Card with info from the results msg + return Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), + nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFNAME), + nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) \ No newline at end of file From 4383106f25fc411f5dd1c0639e0453a9f5c36de6 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Fri, 5 Aug 2016 10:45:36 -0600 Subject: [PATCH 100/121] v0.1.6 phyadd creates new card from phy index Issue #23 --- CHANGES | 3 +- README.md | 34 +++-------- docs/PyRIC.pdf | Bin 508881 -> 508367 bytes docs/PyRIC.tex | 136 +++++++++++++++++++------------------------- examples/pentest.py | 15 ++--- pyric/__init__.py | 2 +- pyric/pyw.py | 127 ++++++++++++++++++++--------------------- 7 files changed, 139 insertions(+), 178 deletions(-) diff --git a/CHANGES b/CHANGES index eb71c3d..8ab42ea 100644 --- a/CHANGES +++ b/CHANGES @@ -174,4 +174,5 @@ v 0.1.6 Continue with STA functionality no device currently present on the machine and one identifying when the specified dev's driver does not support nl80211 o fixed TypeError resulting from raising pyric.error incorrectly - o moved phyadd to _depr_phyadd issue #23 \ No newline at end of file + o made phyadd which accepts only the physical index and returns a card with + correct dev (w.r.t https://wraithwireless.wordpress.com/2016/07/24/linux-kernel-bug/) \ No newline at end of file diff --git a/README.md b/README.md index 1ef301f..dd77563 100644 --- a/README.md +++ b/README.md @@ -425,10 +425,10 @@ True Card(phy=0,dev=mon0,ifindex=4) >>> pyw.winterfaces() ['mon0', 'wlan0'] ->>> for iface in pyw.ifaces(w0): # delete all interfaces -... print iface -... if not iface[0].dev == m0.dev: # that are not our monitor -... pyw.devdel(iface[0]) # on the this phy +>>> for card,_ in pyw.ifaces(w0): # delete all interfaces +... print card +... if not card.dev == m0.dev: # that are not our monitor +... pyw.devdel(card) # on the this phy ... (Card(phy=0,dev=mon0,ifindex=4), 'monitor') (Card(phy=0,dev=wlan0,ifindex=3), 'managed') @@ -553,28 +553,10 @@ def pymon(card, start=True, ch=None): NOTE: After a recent kernel upgrade (see my post at https://wraithwireless.wordpress.com/2016/07/24/linux-kernel-bug/ for more details) -devadd became unusable. I have currently put a workaround in place and there are -now two methods to create a new card: phyadd and devadd. The function phyadd uses the -physical number of card and does not work as expected. In short, it will create a new -radio but not with the specified name. The function devadd uses the ifindex and works -as expected. For those individuals who system's start without devices the following -will work. - -```python -phys = pyw.phylist() -cards = [] -for i, phy in enumerate(phys): - dcard = pyw.phyadd(phy, "wlan{0}".format(i),'managed') - card = pyw.devadd(card,"wlan{0}".format(i),'managed') - pyw.devdel(dcard) - cards.append(card) -``` - -What this does is create a new card, dcard, for each phy using the phy as an -identifier. Then, because dcard does not have the name wlan but a system -generated one, we use it to create a new one, card with devadd which will have the -correct dev name. We finish up by deleting dcard and appending card to our list -of cards. +devadd became unusable. ATT, I have "fixed" devadd. Basically the original used +the physical index (iw phy interface add ...). Now, it uses the ifindex. +The function phyadd which only accepts the physical index (phy) is now implemented +to allow users whose systems start with any devs. #### vi. STA Related Functions I have recently begun adding STA functionality to PyRIC. These are not necessarily diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 49b830657d29fd783b20d5d7f65782268a75716b..99397ab78ed51c4198ecc5bc161d6928fed228cb 100644 GIT binary patch delta 82909 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

px{qY&GUJ5&2o~1VwqrFj4SR^gsCP5* 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�pGB`yw)o6nyrcC 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 diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 554ef8e..1c65ce1 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -19,8 +19,8 @@ % % __name__ = 'User Guide' %__license__ = 'GPLv3' -%__version__ = '0.0.5' -%__date__ = 'July 2016' +%__version__ = '0.0.6' +%__date__ = 'August 2016' %__author__ = 'Dale Patterson' %__maintainer__ = 'Dale Patterson' %__email__ = 'wraith.wireless@yandex.com' @@ -196,15 +196,16 @@ \subsection{Cards} A Card is merely a wrapper around a tuple t = (phy index,device name,ifindex). Since the underlying Netlink calls sometimes require the physical index, sometimes the device name, and sometimes the ifindex, pyw functions\footnote{Not all functions -accept a Card, devinfo() accept either a Card or a dev, devadd accepts either a Card -or a ifindex and phyadd accepts a card or a physical index} take a Card object which +accept only a Card, devinfo() accepts either a Card or a dev, devadd accepts either a +Card or a ifindex and phyadd accepts only a physical index} take a Card object which doesn't require callers to know which identifier to use for each function. There are four primary methods to creating a Card: \begin{enumerate} \item \textbf{pyw.getcard} returns a Card object from a given dev, \item \textbf{pyw.devinfo} returns the dict info where info['card'] is the Card -object. This function will take either a card or a dev -\item \textbf{pyw.devadd} returns a new Card object, +object. (This function will take either a card or a ifindex), +\item \textbf{pyw.devadd} returns a new Card object (this function will only take +a phy), \item \textbf{pyw.ifaces} returns a list of tuples t = (Card,mode) sharing the same phy as a given dev. \end{enumerate} @@ -328,76 +329,56 @@ \subsection{Interacting with the Wireless Core and Wireless NICs: pyw.py} language=Python] 1: import pyric # pyric error (and ecode EUNDEF) 2: from pyric import pyw # for iw functionality - 3: import pyric.utils.hardware as hw # for chipset/driver - 4: from pyric.utils.channels import rf2ch # rf to channel conversion - 5: - 6: dev = 'wlan0' - 7: ifaces = pyw.interfaces() - 8: wifaces = pyw.winterfaces() - 9: if dev not in ifaces: -10: print "Device {0} is not valid, use one of {1}".format(dev,ifaces) -11: return -12: elif dev not in wifaces: -13: print "Device {0} is not wireless, use one of {1}".format(dev,wifaces) -14: -15: print "Regulatory Domain currently: ", pyw.regget() -16: dinfo = pyw.devinfo(dev) -17: card = dinfo['card'] -18: pinfo = pyw.phyinfo(card) -19: driver = hw.ifdriver(card.dev) -20: chipset = hw.ifchipset(driver) -21: -22: pyw.down(card) -23: pyw.macset(card,'00:03:93:57:54:46') -24: -25: msg = "Using {0} currently in mode: {1}\n".format(card,dinfo['mode']) -26: msg += "\tDriver: {0} Chipset: {1}\n".format(driver,chipset) -27: if dinfo['mode'] == 'managed': -28: msg += "\ton channel {0} width {1}\n".format(rf2ch(dinfo['RF']), -29: dinfo['CHW']) -30: msg += "\tSupports modes {0}\n".format(pinfo['modes']) -31: msg += "\tSupports commands {0}".format(pinfo['commands']) -32: msg += "\thw addr {0}".format(pyw.macget(card)) -33: print msg -34: -35: pdev = 'pent0' -36: for iface in pyw.ifaces(card): -37: pyw.devdel(iface[0]) -38: pcard = pyw.devadd(card, pdev, 'monitor') -39: pyw.up(pcard) -40: pyw.chset(pcard,6,None) -41: -42: # DO STUFF HERE -43: -44: pyw.devdel(pcard) -45: -46: card = pyw.devadd(card,card.dev,dinfo['mode']) -47: pyw.macset(card,dinfo['mac']) -48: pyw.up(card) + 3: from pyric.utils.channels import rf2ch # rf to channel conversion + 4: + 5: dev = 'wlan0' + 6: dinfo = pyw.devinfo(dev) + 7: card = dinfo['card'] + 8: + 9: pyw.down(card) +10: pyw.macset(card,'00:03:93:57:54:46') +11: +12: pdev = 'pent0' +13: pcard = pyw.devadd(card, pdev, 'monitor') +14: for iface in pyw.ifaces(card): +15: if iface[0].dev != pcard.dev: +16: pyw.devdel(iface[0]) +17: pyw.up(pcard) +18: +19: pyw.chset(pcard,6,None) +20: +21: # DO stuff here +22: +23: card = pyw.devadd(pcard,card.dev,dinfo['mode']) +24: pyw.devdel(pcard) +25: pyw.macset(card,dinfo['mac']) +26: pyw.up(card) \end{lstlisting} -Listing \ref{lst:pentest} attempts to show most of the available pyw functions -in use and is the basic shell used in another project, Wraith\cite{wraith}, to -instantiate a wireless (802.11) sensor - (for a full listing of all pyw functions -see Appendix \ref{sec:pywapi}) - with scanning capabilities. Lines 1 and 2 should -always be included as they import the pyric error and pyw functions. Line 3 -imports hardware which provides the ifchipset and ifdriver functions and Line 4 -imports the rf2ch conversion function. \\ - -In lines 6 through 13, the device wlan0 is confirmed wireless and lines 16 through -20 a Card object for 'wlan0' is created and details about the interface are printed. -Next, the mac address of wlan0 is changed on lines 23. Note, the device is brought -down first. \\ - -More information on the device is printed in lines 25 through 33. Starting on -line 35, a device named 'pent0' is created in monitor mode. First in lines 36 -and 37, all interfaces on the same phy are deleted \footnote{we have found that -it is better to delete all interfaces on the same phy ensuring that external -processes don't interfere with the new device} before creating the new device, -bringing the card up and setting it to channel 6 NOHT.\\ - -Restoring the device starts on line 45, where the virtual interface is deleted, -the previous interface is restored and the mac address is reset. +Listing \ref{lst:pentest} shows basic pyw functions and is the basic shell used in +another project, Wraith\cite{wraith}, to instantiate a wireless (802.11) sensor - +(for a full listing of all pyw functions see Appendix \ref{sec:pywapi}) - with +scanning capabilities. \\ + +Lines 1 and 2 should always be included as they import the pyric error and pyw +functions. Line 3 imports the rf2ch conversion function. \\ + +In lines 5 through 10, a Card is created from the device wlan0. The info dict is save +IOT to restore later. Next, the mac address of wlan0 is changed. Note, the device has +to be brought down first. \\ + +Starting on line 12, a device named 'pent0' is created in monitor mode. First, a new +Card, pcard is create in monitor mode. Then, all interfaces on the same phy are +deleted \footnote{we have found that it is better to delete all interfaces on the +same phy ensuring that external processes don't interfere with the new device}. The +new Card is brought up and set to channel 6 NOHT.\\ + +Restoring the device starts on line 23, where the virtual interface is deleted, +the previous interface is restored, the mac address is reset and the old Card is +brought up. \\ + +An extended version of Listing \ref{lst:pentest} can be found in the examples +directory. \subsubsection{One-time vs Persistent Sockets} The example in Listing \ref{lst:pentest} uses one-time sockets (netlink and @@ -833,8 +814,8 @@ \subsection{Functions} \item modeget(card[nlsock]): (iw dev card. info | grep mode), type: netlink, get card's mode \item devset(card,ndev,[nlsock]): (N/A) sets the dev (name) of card to ndev -\item phyadd(card (or phy),vnic,mode,[flags],[nlsock]): (iw phy card. interface -add type flags )\footnote{There is a bug in some kernel v4.4.0-x +\item phyadd(phy,vnic,mode,[flags],[nlsock]): (iw phy interface add +type flags )\footnote{There is a bug in some kernel v4.4.0-x where the given dev name is ignored and a system chosen one is used instead. See https://wraithwireless.wordpress.com. Whenever possible, use devadd to create interfaces instead.}, type: netlink, creates a new virtual interface with dev vdev, @@ -842,7 +823,8 @@ \subsection{Functions} \item devadd(card (or ifindex),vnic,mode,[flags],[nlsock]): (iw phy card. interface add type flags ), type: netlink, creates a new virtual interface with dev vdev, in mode and using flags. Note: flags are only supported -when creating a monitor mode +when creating a monitor mode. This function accepts either a Card object or a +ifindex. \item devdel(card,[nlsock]): (iw card. del), type: netlink, deletes card \begin{itemize} \item isconnected(card, [nlsock]): (iw dev card. info | grep channel), type: diff --git a/examples/pentest.py b/examples/pentest.py index c4212b1..74e16f9 100644 --- a/examples/pentest.py +++ b/examples/pentest.py @@ -50,16 +50,14 @@ def execute(dev): # prepare a virtual interface named pent0 in monitor mode # delete all ifaces on the phy to avoid interference + # bring the card up when down print('Preparing pent0 for monitor mode') pdev = 'pent0' + pcard = pyw.devadd(card, pdev, 'monitor') for iface in pyw.ifaces(card): + if iface[0].dev != pcard.dev: print("deleting {0} in mode {1}".format(iface[0],iface[1])) pyw.devdel(iface[0]) - - # not we use the card that was deleted here. We can do this because - # devadd uses the physical index so even though the ifindex and dev are - # no longer valid, the physical index still is - pcard = pyw.devadd(card, pdev, 'monitor') pyw.up(pcard) print("Using", pcard) @@ -78,11 +76,10 @@ def execute(dev): pass # restore original - print("Restoring...\ndeleting ", pcard) - pyw.devdel(pcard) - print('Restoring', card, 'mode =', dinfo['mode'], 'mac =', dinfo['mac']) - card = pyw.devadd(card,card.dev,dinfo['mode']) + card = pyw.devadd(pcard,card.dev,dinfo['mode']) + print('Deleting', pcard) + pyw.devdel(pcard) pyw.macset(card,dinfo['mac']) pyw.up(card) print("card ", card, " restored") diff --git a/pyric/__init__.py b/pyric/__init__.py index 36dcfdd..89a4a4e 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -40,7 +40,7 @@ __name__ = 'pyric' __license__ = 'GPLv3' __version__ = '0.1.6' -__date__ = 'June 2016' +__date__ = 'August 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' diff --git a/pyric/pyw.py b/pyric/pyw.py index 2fe2c99..8659b73 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -1601,6 +1601,68 @@ def devdel(card, *argv): except nl.error as e: raise pyric.error(e.errno, e.strerror) +def phyadd(phy, vdev, mode, flags=None, *argv): + """ + REQUIRES ROOT PRIVILEGES + adds a virtual interface on device having type mode (iw phy + interface add type + :param phy: physical index + :param vdev: device name of new interface + :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| + 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} + :param flags: list of monitor flags (can only be used if creating monitor + mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' + |'cook'|'active'} + :param argv: netlink socket at argv[0] (or empty) + :returns: the new Card + NOTE: due to a recent bug in kernel 4.4.0-x where x is APX 28, nl80211 + commands to add interface are not "respected" by the kernel. Namely, + the vdev is not used and the kernel adds a card with a "predictable" + name and furthermore, the new card has a different hw address (1 up from + the original card) + """ + if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') + if flags: + if mode != 'monitor': + raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') + for flag in flags: + if flag not in MNTRFLAGS: + raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) + else: flags = [] + + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(phyadd, phy, vdev, mode, flags) + + try: + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_NEW_INTERFACE, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, phy, nl80211h.NL80211_ATTR_WIPHY) + nl.nla_put_string(msg, vdev, nl80211h.NL80211_ATTR_IFNAME) + nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) + for flag in flags: + nl.nla_put_u32(msg, + MNTRFLAGS.index(flag), + nl80211h.NL80211_ATTR_MNTR_FLAGS) + nl.nl_sendmsg(nlsock, msg) + rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes + except AttributeError as e: + raise pyric.error(pyric.EINVAL, e) + except nl.error as e: + raise pyric.error(e.errno, e.strerror) + + # get card & determine if we got a card with the specified name + card = Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), + nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFNAME), + nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) + if card.dev != vdev: + newcard = devadd(card,vdev,mode,flags) + devdel(card) + card = newcard + return card + ################################################################################ #### STA FUNCTIONS #### ################################################################################ @@ -2356,67 +2418,4 @@ def _fut_chset(card, ch, chw, *argv): nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - -def _depr_phyadd(card, vdev, mode, flags=None, *argv): - """ - REQUIRES ROOT PRIVILEGES - adds a virtual interface on device having type mode (iw phy - interface add type - :param card: Card object or physical index - :param vdev: device name of new interface - :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| - 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} - :param flags: list of monitor flags (can only be used if creating monitor - mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' - |'cook'|'active'} - :param argv: netlink socket at argv[0] (or empty) - :returns: the new Card - NOTE: due to a recent bug in kernel 4.4.0-x where x is APX 28, nl80211 - commands to add interface are not "respected" by the kernel. Namely, - the vdev is not used and the kernel adds a card with a "predictable" - name and furthermore, the new card has a different hw address (1 up from - the original card) - """ - if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') - if flags: - if mode != 'monitor': - raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') - for flag in flags: - if flag not in MNTRFLAGS: - raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) - else: flags = [] - - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(phyadd, card, vdev, mode, flags) - - # if we have a Card, pull out phy index - try: - phy = card.phy - except AttributeError: - phy = card - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_NEW_INTERFACE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nla_put_string(msg, vdev, nl80211h.NL80211_ATTR_IFNAME) - nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) - for flag in flags: - nl.nla_put_u32(msg, - MNTRFLAGS.index(flag), - nl80211h.NL80211_ATTR_MNTR_FLAGS) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - - # return the new Card with info from the results msg - return Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), - nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFNAME), - nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) \ No newline at end of file + _ = nl.nl_recvmsg(nlsock) \ No newline at end of file From a2e811d8167e4c1b841bfd336284a0ac51d2cdce Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 7 Aug 2016 04:46:19 -0600 Subject: [PATCH 101/121] v0.1.6 added freqget --- CHANGES | 9 +++++---- docs/PyRIC.pdf | Bin 508367 -> 508420 bytes docs/PyRIC.tex | 6 ++++-- pyric/pyw.py | 20 ++++++++++++++++++-- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 8ab42ea..e9afa78 100644 --- a/CHANGES +++ b/CHANGES @@ -169,10 +169,11 @@ v 0.1.6 Continue with STA functionality - issue 2: caller/user must configure dhcp request or inet themselves - issue 3: only works on open networks o Issue #24 (TODO #50) resolved. getcard which is the entry point for any - nl80211 functionality uses devinfo to retrieve the Card tuple. devinfo will now - report No Such device as two seperate errors one identifying when there is - no device currently present on the machine and one identifying when the + nl80211 functionality uses devinfo to retrieve the Card tuple. devinfo will + now report No Such device as two seperate errors one identifying when there + is no device currently present on the machine and one identifying when the specified dev's driver does not support nl80211 o fixed TypeError resulting from raising pyric.error incorrectly o made phyadd which accepts only the physical index and returns a card with - correct dev (w.r.t https://wraithwireless.wordpress.com/2016/07/24/linux-kernel-bug/) \ No newline at end of file + correct dev (w.r.t https://wraithwireless.wordpress.com/2016/07/24/linux-kernel-bug/) + o added freqget diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 99397ab78ed51c4198ecc5bc161d6928fed228cb..fb1a4c4e1b955f52ce29efb806bd0474623fa38c 100644 GIT binary patch delta 7278 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 IB}Gq03P_e0yZ`_I delta 7214 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 diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 1c65ce1..557d540 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -801,10 +801,12 @@ \subsection{Functions} netlink,sets the tx power to pwr (in dBm) with level setting lvl \item txget(card,[iosock]): (iwconfig card. | grep Tx-Power card), type: ioctl, get card's transmission power -\item chget(card,[nlsock]): (iw dev info | grep channelS), type: -netlink, get card's current channel (only works for cards in mode managed) +\item chget(card,[nlsock]): (iw dev info | grep channel), type: +netlink, get card's current channel \item chset(card,ch,chw,[nlsock]): iw phy set channel ), type: netlink, set card's current channel to ch with width chw +\item freqget(card,[nlsock]): (iw dev info | grep channel), type: +netlink, get card's current frequency \item freqset(card,rf,chw,[nlsock]): iw phy set freq ), type: netlink, set card's current frequency to rf with width chw \item devmodes(card,[iosock]): (iw phy card.), type: netlink, get modes diff --git a/pyric/pyw.py b/pyric/pyw.py index 8659b73..27dccda 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -254,6 +254,7 @@ def getcard(dev, *argv): """ get the Card object from device name :param dev: device name + :param argv: netlink socket at argv[0] or empty :returns: a Card with device name dev """ try: @@ -1365,6 +1366,21 @@ def chset(card, ch, chw=None, *argv): return freqset(card, channels.ch2rf(ch), chw, nlsock) +def freqget(card, *argv): + """ + gets the current frequency for device (iw dev info | grep channel) + :param card: Card object + :param argv: netlink socket at argv[0] (or empty) + NOTE: will only work if dev is associated w/ AP or device is in monitor mode + and has had [ch|freq]set previously + """ + try: + nlsock = argv[0] + except IndexError: + return _nlstub_(chget, card) + + return devinfo(card, nlsock)['RF'] + def freqset(card, rf, chw=None, *argv): """ REQUIRES ROOT PRIVILEGES @@ -1495,7 +1511,7 @@ def devset(card, ndev, *argv): set a new dev. o this is not a true set name: it adds a new card with ndev as the dev then deletes the current card, returning the new card - - in effect, it will appear as if the card as a new name but, it will also + - in effect, it will appear as if the card has a new name but, it will also have a new ifindex """ try: @@ -2418,4 +2434,4 @@ def _fut_chset(card, ch, chw, *argv): nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) \ No newline at end of file + _ = nl.nl_recvmsg(nlsock) From 5708d8f8f4d3bd4d708bf76323c351f15b304eac Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sat, 13 Aug 2016 09:15:43 -0600 Subject: [PATCH 102/121] v0.1.6 added freqget --- CHANGES | 8 ++++++-- docs/PyRIC.pdf | Bin 508420 -> 508406 bytes pyric/__init__.py | 22 ++++++++++++---------- pyric/pyw.py | 43 ++++++++++++++++++++++++++----------------- 4 files changed, 44 insertions(+), 29 deletions(-) diff --git a/CHANGES b/CHANGES index e9afa78..e02fe20 100644 --- a/CHANGES +++ b/CHANGES @@ -174,6 +174,10 @@ v 0.1.6 Continue with STA functionality is no device currently present on the machine and one identifying when the specified dev's driver does not support nl80211 o fixed TypeError resulting from raising pyric.error incorrectly - o made phyadd which accepts only the physical index and returns a card with - correct dev (w.r.t https://wraithwireless.wordpress.com/2016/07/24/linux-kernel-bug/) + o phyadd accepts either a card or a phy o added freqget + o Note: w.r.t https://wraithwireless.wordpress.com/2016/07/24/linux-kernel-bug/ + have tested further, phyadd,devadd will work (i.e. not rename the card) + under the following conditions a) the type is not managed or b) there is no + other device currently associated with the new card's phy. Have also determined + that integrated cards are also suspect to this bug? diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index fb1a4c4e1b955f52ce29efb806bd0474623fa38c..921bc5d9e673173db752326aeacce7115150fe2a 100644 GIT binary patch delta 8128 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 delta 8112 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 H interface add type - :param phy: physical index + :param card: Card object or physical index :param vdev: device name of new interface :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} @@ -1631,7 +1637,9 @@ def phyadd(phy, vdev, mode, flags=None, *argv): |'cook'|'active'} :param argv: netlink socket at argv[0] (or empty) :returns: the new Card - NOTE: due to a recent bug in kernel 4.4.0-x where x is APX 28, nl80211 + NOTE: + o the new Card will be 'down' + o due to a recent bug in kernel 4.4.0-x where x is APX 28, nl80211 commands to add interface are not "respected" by the kernel. Namely, the vdev is not used and the kernel adds a card with a "predictable" name and furthermore, the new card has a different hw address (1 up from @@ -1649,7 +1657,13 @@ def phyadd(phy, vdev, mode, flags=None, *argv): try: nlsock = argv[0] except IndexError: - return _nlstub_(phyadd, phy, vdev, mode, flags) + return _nlstub_(phyadd, card, vdev, mode, flags) + + # if we have a Card, pull out phy + try: + phy = card.phy + except AttributeError: + phy = card try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -1670,14 +1684,9 @@ def phyadd(phy, vdev, mode, flags=None, *argv): raise pyric.error(e.errno, e.strerror) # get card & determine if we got a card with the specified name - card = Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), + return Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFNAME), nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) - if card.dev != vdev: - newcard = devadd(card,vdev,mode,flags) - devdel(card) - card = newcard - return card ################################################################################ #### STA FUNCTIONS #### From d03c1cad739337dff196bd90726c5216ccb6f30b Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sat, 13 Aug 2016 09:17:44 -0600 Subject: [PATCH 103/121] v0.1.6 phyadd takes phy or card --- CHANGES | 1 + docs/PyRIC.pdf | Bin 508406 -> 508453 bytes pyric/__init__.py | 1 - pyric/pyw.py | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index e02fe20..0d15492 100644 --- a/CHANGES +++ b/CHANGES @@ -181,3 +181,4 @@ v 0.1.6 Continue with STA functionality under the following conditions a) the type is not managed or b) there is no other device currently associated with the new card's phy. Have also determined that integrated cards are also suspect to this bug? + diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 921bc5d9e673173db752326aeacce7115150fe2a..5dd750e96e3186707f681763d457fafa24b3fedf 100644 GIT binary patch delta 8885 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 diff --git a/pyric/__init__.py b/pyric/__init__.py index 67a7fe9..9c2486d 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -69,7 +69,6 @@ class error(EnvironmentError): pass # no open files if attempt to create a virtual card with same name as orginal # for setup.py use - # redefine version for easier access version = __version__ diff --git a/pyric/pyw.py b/pyric/pyw.py index 264d78b..8a5a0f8 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -68,7 +68,7 @@ __name__ = 'pyw' __license__ = 'GPLv3' __version__ = '0.1.9' -__date__ = 'July 2016' +__date__ = 'August 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' From 0beea3192e88d9f499b1d87bb56ae588d4939222 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sat, 13 Aug 2016 09:23:54 -0600 Subject: [PATCH 104/121] v0.1.6 phyadd takes phy or card --- CHANGES | 1 - TODO | 4 ++-- docs/PyRIC.pdf | Bin 508453 -> 508453 bytes pyric/__init__.py | 1 + pyric/pyw.py | 15 ++------------- 5 files changed, 5 insertions(+), 16 deletions(-) diff --git a/CHANGES b/CHANGES index 0d15492..e02fe20 100644 --- a/CHANGES +++ b/CHANGES @@ -181,4 +181,3 @@ v 0.1.6 Continue with STA functionality under the following conditions a) the type is not managed or b) there is no other device currently associated with the new card's phy. Have also determined that integrated cards are also suspect to this bug? - diff --git a/TODO b/TODO index d1e5256..ab251ad 100644 --- a/TODO +++ b/TODO @@ -2,7 +2,7 @@ o ethtool. uses ioctl but does not follow same pattern as ifconfig seems to use - ethtool -i gives driver information including firmware-version - and udevadm (does what hardware.py does) + and udevadm (does what hardware.py does) 11) tried NL80211_CMD_GET_WIPHY, setting _WIPHY_TX_POWER_LEVEL but did not return the current power level - currently cannot find anything in nl80211.h that could be used to get tx power @@ -30,4 +30,4 @@ 42) is there a simple way to set the format strings as constants keeping in mind that things like strings require a length in the format string 46) max-tx for bands is showing 15 when iwconfig shows 30 - 51) with respect to phyadd, airmon-ng mentions something about udev changing then name \ No newline at end of file + 47) add an explain() to errors? or hard-code additional error reporting? \ No newline at end of file diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 5dd750e96e3186707f681763d457fafa24b3fedf..9292cb6d6534be475daa9bed43c63bbfa9fc411c 100644 GIT binary patch delta 142 zcmZ45BEPgnzM+M&g{g(Pg{6hHg>4JF!ge(y0|R4S12c6419eR4JF!ge)7Gb3YN12c6419eR Date: Sat, 13 Aug 2016 09:26:39 -0600 Subject: [PATCH 105/121] v0.1.6 phyadd takes phy or card --- CHANGES | 2 +- TODO | 2 +- docs/PyRIC.pdf | Bin 508453 -> 508453 bytes pyric/__init__.py | 1 - pyric/pyw.py | 3 +-- 5 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index e02fe20..ce219f8 100644 --- a/CHANGES +++ b/CHANGES @@ -180,4 +180,4 @@ v 0.1.6 Continue with STA functionality have tested further, phyadd,devadd will work (i.e. not rename the card) under the following conditions a) the type is not managed or b) there is no other device currently associated with the new card's phy. Have also determined - that integrated cards are also suspect to this bug? + that integrated cards are also suspect to this bug? \ No newline at end of file diff --git a/TODO b/TODO index ab251ad..ab54432 100644 --- a/TODO +++ b/TODO @@ -30,4 +30,4 @@ 42) is there a simple way to set the format strings as constants keeping in mind that things like strings require a length in the format string 46) max-tx for bands is showing 15 when iwconfig shows 30 - 47) add an explain() to errors? or hard-code additional error reporting? \ No newline at end of file + 47) add an explain() to errors? or hard-code additional error reporting? diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 9292cb6d6534be475daa9bed43c63bbfa9fc411c..fc243120fb6e74a3c3cf78f68e8240131d27a9f4 100644 GIT binary patch delta 116 zcmZ45BEPgnzM+M&g{g(Pg{6hHg>4JF;&x_JW7Fv>+u0RBjP35**;$yKEe(t4JF;&x^O1LNr`+u0RBjP35**;$yKU7RdUEe$OU oEsc#`%?vF~%neNpjoqBwoDE&goXjju>=bMWDcRn)i+wsf04Mey8~^|S diff --git a/pyric/__init__.py b/pyric/__init__.py index 16490ff..9c2486d 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -65,7 +65,6 @@ class error(EnvironmentError): pass # elif errno == EINVAL: return "Invalid parameter" # else: # return os.strerror(errno) -# # device busy if setting channel when card is down # no open files if attempt to create a virtual card with same name as orginal diff --git a/pyric/pyw.py b/pyric/pyw.py index dd3fa09..1861f56 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -1546,8 +1546,7 @@ def devadd(card, vdev, mode, flags=None, *argv): |'cook'|'active'} :param argv: netlink socket at argv[0] (or empty) :returns: the new Card - NOTE: - o the new Card will be 'down' + NOTE: the new Card will be 'down' """ if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') if flags: From 2a0015c281db7bdf8959ca93eb6113dc8b7ff145 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 14 Aug 2016 02:13:37 -0600 Subject: [PATCH 106/121] v0.1.6 updated readme --- README.md | 135 ++++++++++++++++++++++++++++++++++--- pyric/net/wireless/wlan.py | 2 +- 2 files changed, 125 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index dd77563..ef776d4 100644 --- a/README.md +++ b/README.md @@ -539,24 +539,134 @@ def pymon(card, start=True, ch=None): if pyw.modeget(card) == 'monitor': raise RuntimeError("Card is already in monitor mode") newcard = pyw.devset(card, card.dev + 'mon') - pyw.modeset(newcard, 'monitor') - if ch: pyw.chset(w1, ch, None) + pyw.modeset(newcard, 'monitor') pyw.up(newcard) + if ch: pyw.chset(w1, ch, None) else: if pyw.modeget(card) == 'managed': raise RuntimeError("Card is not in monitor mode") - newcard = pyw.devset(card, card.dev[:-3) + newcard = pyw.devset(card, card.dev[:-3]) pyw.modeset(newcard, 'managed') pyw.up(newcard) return newcard ``` -NOTE: After a recent kernel upgrade (see my post at -https://wraithwireless.wordpress.com/2016/07/24/linux-kernel-bug/ for more details) -devadd became unusable. ATT, I have "fixed" devadd. Basically the original used -the physical index (iw phy interface add ...). Now, it uses the ifindex. -The function phyadd which only accepts the physical index (phy) is now implemented -to allow users whose systems start with any devs. +##### o Virtual Interfaces and Issues in Kernel 4.x +After recently upgrading my distro, my kernel was upgraded from 3.x to 4.x. I +noticed that in some situations, adding a virtual interface (VIF) did not have +the desired effect. Namely, new VIFs did not have the dev name I had specified. +Furthermore, regardless of the naming convention I was currently using (old +school like wlan0, eth0 etc or the newer predictable names i.e. wlp3s0) the +new VIF would have a predictable name and the MAC address would be one up from +that of the actual cards MAC address. For more details, check out my blog +at https://wraithwireless.wordpress.com/2016/07/24/linux-kernel-bug/. This is +an issue at the kernel and nl80211 level and not a PyRIC bug. + +This situtation will only occur if you are attempting to (a) create a VIF with +the same dev name as the original, (b) in managed mode and (c) there are currently +other VIFs sharing the same phy. + +```python +>>> pyw.winterfaces() +['alfa0'] +>>> card = pyw.getcard('alfa0') +>>> card +Card(phy=1,dev=alfa0,ifindex=5) +>>> mcard +Card(phy=1,dev=mon0,ifindex=6) +>>> pyw.devdel(card) +>>> pyw.winterfaces() +['mon0'] +>>> pyw.devadd(mcard,'alfa0','managed') +Card(phy=1,dev=alfa0,ifindex=7) +>>> pyw.winterfaces() +['mon0', 'wlx00c0ca59afa7'] +>>> pyw.devdel(pyw.getcard('wlx00c0ca59afa7')) +>>> pyw.winterfaces() +['wlan0mon', 'mon0'] +>>> pyw.phyadd(mcard,'alfa0','managed') +Card(phy=1,dev=alfa0,ifindex=8) +>>> pyw.winterfaces() +['wlan0mon', 'mon0', 'wlx00c0ca59afa7'] +``` + +All three of the above most be True for this to occur. So, for example: + +```python +>>> pyw.winterfaces() +['mon0'] +>>> pyw.devadd(mcard,'alfa0','monitor') +Card(phy=1,dev=alfa0,ifindex=10) +>>> pyw.winterfaces() +['mon0', 'alfa0'] +``` + +works because case (b) is false. + +Some things to note: +* it does not matter if you are using devadd (creating a VIF via the ifindex) or +phyadd (creating a VIF via the physical index) +* nl80211 believes that new VIF has the name you specified so I believe this is +something related to the kernel itself or possibly udev. If you look at the source +code for phyadd or devadd, the returned card uses the indicators returned by the +kernel. + +I had considered several options of rectifying this for PyRIC but, doing so would +require either mutliple checks on kernel version or breaking backward compatibility +for users with kernel 3.x and possibly breaking forward compatibility (if this +issue does get fixed at some future kernel version). Besides, being aware of +the state that must be true for this to happen, users can easily workaround it. + +One way, as we saw earlier, is to create a VIF in monitor mode and then set it +to managed. + +```python +>>> pyw.winterfaces() +['mon0'] +>>> pyw.devadd(mcard,'alfa0','monitor') +Card(phy=1,dev=alfa0,ifindex=10) +>>> pyw.winterfaces() +['mon0', 'alfa0'] +>>> pyw.devdel(pyw.getcard('mon0')) +>>> card = pyw.getcard('alfa0') +>>> pyw.down(card) +>>> pyw.modeset(card,'managed') +>>> pyw.up + +>>> pyw.up() +Traceback (most recent call last): + File "", line 1, in +TypeError: up() takes at least 1 argument (0 given) +>>> pyw.up(card) +>>> pyw.winterfaces() +['wlan0mon', 'alfa0'] +>>> pyw.devinfo(card) +{'wdev': 4294967302, 'RF': None, 'CF': None, 'mac': '00:c0:ca:59:af:a6', +'mode': 'managed', 'CHW': None, 'card': Card(phy=1,dev=alfa0,ifindex=10)} +``` + +But, I think this is sloppy. The better way is to use phyadd. Recall that +phyadd accepts either a Card or the phy and that even though a card is deleted, +some of its reference values are still valid. In the case of deleting a card, +the phy is still present. So, you could use a phy or a Card that was previously +deleted because the phy is still valid. + +```python +>>> pyw.winterfaces() +['mon0'] +>>> phy = mcard.phy +>>> pyw.devdel(mcard) +>>> pyw.winterfaces() +[] +>>> card = pyw.phyadd(phy,'alfa0','managed') +>>> card +Card(phy=1,dev=alfa0,ifindex=12) +>>> pyw.winterfaces() +['alfa0'] +``` + +This works, but remember you have to delete all interfaces with the same phy +as the one you are creating before creating it. #### vi. STA Related Functions I have recently begun adding STA functionality to PyRIC. These are not necessarily @@ -707,12 +817,13 @@ with (-) are not included in pip installs or PyPI downloads - \_\_init\_\_.py initialize distrubution PyRIC module - examples example folder + pentest.py create wireless pentest environment example - + device_details.py display device information + + info.py display device information - tests (-) test folder + pyw.unittest.py unit test for pyw functions - docs User Guide resources + nlsend.png (-) image for user guide + nlsock.png (-) image for user guide + + logo.png (-) pyric logo + PyRIC.tex (-) User tex file + PyRIC.bib (-) User Guide bibliography + PyRIC.pdf User Guide @@ -721,6 +832,7 @@ with (-) are not included in pip installs or PyPI downloads - MANIFEST.in used by setup.py - README.md this file - LICENSE GPLv3 License + - CHANGES revision file - TODO todos for PyRIC - pyric package directory + \_\_init\_\_.py initialize pyric module @@ -745,12 +857,13 @@ with (-) are not included in pip installs or PyPI downloads - nl80211_h.py nl80211 constants - nl80211_c.py nl80211 attribute policies - rfkill_h.py rfkill header file - - ieee80211_h.py ieee80211.h port (subset of) + - wlan.py ieee80211.h port (subset of) + lib library subpackages * \_\_init\_\_.py initialize lib subpackage * libnl.py netlink helper functions * libio.py sockios helper functions + nlhelp netlinke documentation/help + * \_\_init\_\_.py initialize nlhelp subpackage * nsearch.py nl80211 search * commands.help nl80211 commands help data * attributes.help nl80211 attributes help data \ No newline at end of file diff --git a/pyric/net/wireless/wlan.py b/pyric/net/wireless/wlan.py index fe84a71..ebc31ff 100644 --- a/pyric/net/wireless/wlan.py +++ b/pyric/net/wireless/wlan.py @@ -19,7 +19,7 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. -Definition of constants et all found in IEEE Std 802.11-2012 +Definition of constants et al found in IEEE Std 802.11-2012 Std will refer to IEEE Std 802.11-2012 From e811e723b556a48d564415527cba04665073bdb0 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Tue, 16 Aug 2016 21:58:53 -0600 Subject: [PATCH 107/121] v0.1.6 error reports less ambiguous errors --- CHANGES | 3 +- TODO | 12 ++---- pyric/__init__.py | 52 ++++++++++++----------- pyric/lib/libio.py | 2 +- pyric/lib/libnl.py | 22 +++++----- pyric/pyw.py | 95 +++++++++++++++++++++++-------------------- pyric/utils/rfkill.py | 1 + 7 files changed, 99 insertions(+), 88 deletions(-) diff --git a/CHANGES b/CHANGES index ce219f8..438a9ea 100644 --- a/CHANGES +++ b/CHANGES @@ -180,4 +180,5 @@ v 0.1.6 Continue with STA functionality have tested further, phyadd,devadd will work (i.e. not rename the card) under the following conditions a) the type is not managed or b) there is no other device currently associated with the new card's phy. Have also determined - that integrated cards are also suspect to this bug? \ No newline at end of file + that integrated cards are also suspect to this bug? + o made pyric error messages less ambiguous \ No newline at end of file diff --git a/TODO b/TODO index ab54432..570f4f2 100644 --- a/TODO +++ b/TODO @@ -19,15 +19,11 @@ 26) need to parse dumps (NLM_F_DUMP), for now we're good with link etc, so long as the card is connected but it may come up eventually especially if we want to add scan results - 29) figure out how to parse the information element in pyw.link - there's some - good shit in it including sometimes the router os and type + 29) figure out how to parse the information element in pyw.link - sometimes + the router os and type are included o in link, NL80211_BSS_BEACON_IES vs NL80211_BSS_INFORMATION_ELEMENT - BEACON_IES may not always be presenet but appears to contain more + BEACON_IES may not always be present but appears to contain more 31) add VHT processing to sta_info bitrate 39) parsing wiphy_bands (should we add the below?) o _HT_MCS_SET: a 16-bit attr containing the MCS set as defined in 802.11n - o _HT_CAPA: as in the HT information IE - 42) is there a simple way to set the format strings as constants keeping in - mind that things like strings require a length in the format string - 46) max-tx for bands is showing 15 when iwconfig shows 30 - 47) add an explain() to errors? or hard-code additional error reporting? + o _HT_CAPA: as in the HT information IE \ No newline at end of file diff --git a/pyric/__init__.py b/pyric/__init__.py index 9c2486d..601c7bc 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -19,8 +19,11 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. -Defines the Pyric error class and constants for some errors. All pyric errors -will follow the 2-tuple form of EnvironmentError +Defines the PyRIC error class and constants for some errors. All pyric errors +will follow the 2-tuple form of EnvironmentError. Also defines constansts for +PyPI packaging. + +WARNING: DO NOT import * Requires: linux (3.x or 4.x kernel) @@ -32,9 +35,6 @@ includes: /nlhelp /lib /net /utils pyw.py changes: See CHANGES in top-level directory - - WARNING: DO NOT import * - """ __name__ = 'pyric' @@ -46,27 +46,33 @@ __email__ = 'wraith.wireless@yandex.com' __status__ = 'Production' -# define pyric exceptions -# all exceptions are tuples t=(error code,error message) -# we use error codes defined in errno, adding -1 to define the undefined error -# EUNDEF. I don't like importing all from errno but it provides conformity in -# error handling i.e modules using pyric.error do not need to call pyric.EUNDEF -# and errno.EINVAL but can call pyric.EUNDEF and pyric.EINVAL +""" + define pyric exceptions + all exceptions are tuples t=(error code,error message) + we use error codes defined in errno, using EUNDEF = -1 to define an undefined + error I don't like importing all from errno but it provides conformity in + error handling i.e modules using pyric.error do not need to call pyric.EUNDEF + and errno.EINVAL but can call pyric.EUNDEF and pyric.EINVAL +""" EUNDEF = -1 # undefined error from errno import * # make all errno errors pyric errors errorcode[EUNDEF] = "EUNDEF" # add ours to errorcode dicts -class error(EnvironmentError): pass - -# BELOW IS STILL A WORK IN PRGORESS -#def strerror(errno): -# import os -# if errno < 0: return "Undefined error" -# elif errno == EPERM: return "Superuser privileges required" -# elif errno == EINVAL: return "Invalid parameter" -# else: -# return os.strerror(errno) -# device busy if setting channel when card is down -# no open files if attempt to create a virtual card with same name as orginal +class error(EnvironmentError): + def __init__(self,errno,errmsg=None): + if not errmsg: errmsg = strerror(errno) + EnvironmentError.__init__(self,errno,errmsg) + +def strerror(errno): + import os + if errno < 0: return "Undefined error" + elif errno == EPERM: return "Superuser privileges required" + elif errno == EINVAL: return "Invalid parameter" + elif errno == EBUSY: + msg = "{0}. Make sure Card is up and no other devices share the same phy" + return msg.format(os.strerror(EBUSY)) + elif errno == ENFILE: return "There are no available netlink sockets" + else: + return os.strerror(errno) # for setup.py use # redefine version for easier access diff --git a/pyric/lib/libio.py b/pyric/lib/libio.py index a6d3b20..2f19232 100644 --- a/pyric/lib/libio.py +++ b/pyric/lib/libio.py @@ -64,7 +64,7 @@ def io_transfer(iosock,flag,ifreq): return ioctl(iosock.fileno(),flag,ifreq) except (AttributeError,struct.error) as e: # either sock is not valid or a bad value passed to ifreq - if e.message.find('fileno'): raise error(errno.ENOTSOCK,"bad socket") + if e.message.find('fileno'): raise error(errno.ENOTSOCK,"Bad socket") else: raise error(errno.EINVAL,e) except IOError as e: # generally device cannot be found sort but can also be diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index aeaddb4..6fe7599 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -249,10 +249,10 @@ def nl_recvmsg(sock): # on success, just return the orginal message if e.errno == nlh.NLE_SUCCESS: pass else: raise - if sock.seq != msg.seq: raise error(errno.EBADMSG,"seq. # out of order") + if sock.seq != msg.seq: raise error(errno.EBADMSG,"Seq. # out of order") return msg except socket.timeout: - raise error(-1,"socket timed out") + raise error(-1,"Socket timed out") #except socket.error as e: # this became in issue in python 3 # raise error(errno.ENOTSOCK,e) except error as e: @@ -354,7 +354,7 @@ def nltype(self): return self['type'] @nltype.setter def nltype(self,v): - if v < 0: raise error(errno.ERANGE,"nltype {0} is invalid".format(v)) + if v < 0: raise error(errno.ERANGE,"Netlink type {0} is invalid".format(v)) self['type'] = v @property @@ -368,7 +368,7 @@ def seq(self): return self['seq'] @seq.setter def seq(self,v): - if v < 1: raise error(errno.ERANGE,"invalid seq. number") + if v < 1: raise error(errno.ERANGE,"Invalid seq. number") self['seq'] = v @property @@ -376,7 +376,7 @@ def pid(self): return self['pid'] @pid.setter def pid(self,v): - if v < 1: raise error(errno.ERANGE,"invalid port id") + if v < 1: raise error(errno.ERANGE,"Invalid port id") self['pid'] = v @property @@ -384,7 +384,7 @@ def cmd(self): return self['cmd'] @cmd.setter def cmd(self,v): - if v < 0: raise error(errno.ERANGE,"invalid cmd") + if v < 0: raise error(errno.ERANGE,"Invalid cmd") self['cmd'] = v @property @@ -444,7 +444,7 @@ def nlmsg_fromstream(stream,override=False): raise error(abs(e),strerror(abs(e))) c,_,_ = struct.unpack_from(genlh.genl_genlmsghdr,stream,nlh.NLMSGHDRLEN) except struct.error as e: - raise error(-1,"error parsing headers: {0}".format(e)) + raise error(-1,"Error parsing headers: {0}".format(e)) # create a new message with hdr values then parse the attributes msg = nlmsg_new(t,c,s,p,fs) @@ -575,7 +575,7 @@ def nla_parse_set(aset,etype): elif etype == nlh.NLA_U32: fmt = "I" elif etype == nlh.NLA_U64: fmt = "Q" else: - raise error(errno.EINVAL,"set elements are not valid datatype") + raise error(errno.EINVAL,"Set elements are not valid datatype") esize = struct.calcsize(fmt) ss = [] @@ -588,7 +588,7 @@ def nla_parse_set(aset,etype): ss.append(s) idx += esize except struct.error: - raise error(errno.EINVAL,"set elements failed to unpack") + raise error(errno.EINVAL,"Set elements failed to unpack") return ss def nla_put(msg,v,a,d): @@ -599,7 +599,7 @@ def nla_put(msg,v,a,d): :param a: attribute type :param d: attribute datatype """ - if d > nlh.NLA_TYPE_MAX: raise error(errno.ERANGE,"value type is invalid") + if d > nlh.NLA_TYPE_MAX: raise error(errno.ERANGE,"Value type is invalid") msg['attrs'].append((a,v,d)) # nla_put_* append data of specified datatype @@ -626,7 +626,7 @@ def nla_putat(msg,i,v,a,d): :param a: attribute type :param d: attribute datatype """ - if d > nlh.NLA_TYPE_MAX: raise error(errno.ERANGE,"invalid datatype") + if d > nlh.NLA_TYPE_MAX: raise error(errno.ERANGE,"Invalid datatype") msg['attrs'][i] = (a,v,d) def nla_pop(msg,i): diff --git a/pyric/pyw.py b/pyric/pyw.py index 1861f56..4915680 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -159,7 +159,7 @@ def iswireless(dev, *argv): return _iostub_(iswireless, dev) try: - # if the call succeeds, found to be wireless + # if the call succeeds, dev is found to be wireless _ = io.io_transfer(iosock, sioch.SIOCGIWNAME, ifh.ifreq(dev)) return True except AttributeError as e: @@ -167,7 +167,7 @@ def iswireless(dev, *argv): except io.error as e: # ENODEV or ENOTSUPP means not wireless, reraise any others if e.errno == pyric.ENODEV or e.errno == pyric.EOPNOTSUPP: return False - else: raise pyric.error(e.errno, e.strerror) + else: raise pyric.error(e.errno) def phylist(): """ :returns: a list of tuples t = (physical indexe, physical name) """ @@ -636,7 +636,7 @@ def isblocked(card): idx = rfkill.getidx(card.phy) return rfkill.soft_blocked(idx), rfkill.hard_blocked(idx) except AttributeError: - raise pyric.error(pyric.ENODEV, "Card is no longer regsitered") + raise pyric.error(pyric.ENODEV, "Card is no longer registered") def block(card): """ @@ -658,7 +658,7 @@ def unblock(card): idx = rfkill.getidx(card.phy) rfkill.rfkill_unblock(idx) except AttributeError: - raise pyric.error(pyric.ENODEV, "Card no longer registered") + raise pyric.error(pyric.ENODEV, "Card is no longer registered") ################################################################################ #### RADIO PROPERTIES #### @@ -715,7 +715,7 @@ def pwrsaveset(card, on, *argv): except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except ValueError: - raise pyric.error(pyric.EINVAL, "Invalid parameter on") + raise pyric.error(pyric.EINVAL, "Invalid parameter {0} for on".format(on)) except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -747,9 +747,9 @@ def covclassset(card, cc, *argv): if cc < wlan.COV_CLASS_MIN or cc > wlan.COV_CLASS_MAX: # this can work 'incorrectly' on non-int values but these will # be caught later during conversion - msg = "Cov class must be integer {0}-{1}".format(wlan.COV_CLASS_MIN, - wlan.COV_CLASS_MAX) - raise pyric.error(pyric.EINVAL, msg) + emsg = "Cov class must be integer {0}-{1}".format(wlan.COV_CLASS_MIN, + wlan.COV_CLASS_MAX) + raise pyric.error(pyric.EINVAL, emsg) try: nlsock = argv[0] @@ -767,7 +767,7 @@ def covclassset(card, cc, *argv): except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except ValueError: - raise pyric.error(pyric.EINVAL, "Invalid value for Cov. Class") + raise pyric.error(pyric.EINVAL, "Invalid value {0} for Cov. Class".format(cc)) except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -798,9 +798,9 @@ def retryshortset(card, lim, *argv): if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: # this can work 'incorrectly' on non-int values but these will # be caught later during conversion - msg = "Retry short must be integer {0}-{1}".format(wlan.RETRY_MIN, - wlan.RETRY_MAX) - raise pyric.error(pyric.EINVAL, msg) + emsg = "Retry short must be integer {0}-{1}".format(wlan.RETRY_MIN, + wlan.RETRY_MAX) + raise pyric.error(pyric.EINVAL, emsg) try: nlsock = argv[0] @@ -818,7 +818,7 @@ def retryshortset(card, lim, *argv): except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except ValueError: - raise pyric.error(pyric.EINVAL, "Invalid parameter value for lim") + raise pyric.error(pyric.EINVAL, "Invalid value {0} for lim".format(lim)) except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -849,9 +849,9 @@ def retrylongset(card, lim, *argv): if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: # this can work 'incorrectly' on non-int values but these will # be caught later during conversion - msg = "Retry long must be integer {0}-{1}".format(wlan.RETRY_MIN, - wlan.RETRY_MAX) - raise pyric.error(pyric.EINVAL, msg) + emsg = "Retry long must be integer {0}-{1}".format(wlan.RETRY_MIN, + wlan.RETRY_MAX) + raise pyric.error(pyric.EINVAL, emsg) try: nlsock = argv[0] @@ -869,7 +869,7 @@ def retrylongset(card, lim, *argv): except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except ValueError: - raise pyric.error(pyric.EINVAL, "Invalid parameter value for lim") + raise pyric.error(pyric.EINVAL, "Invalid value {0} for lim".format(lim)) except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -900,9 +900,9 @@ def rtsthreshset(card, thresh, *argv): if thresh == 'off': thresh = wlan.RTS_THRESH_OFF elif thresh == wlan.RTS_THRESH_OFF: pass elif thresh < wlan.RTS_THRESH_MIN or thresh > wlan.RTS_THRESH_MAX: - msg = "Thresh must be 'off' or integer {0}-{1}".format(wlan.RTS_THRESH_MIN, - wlan.RTS_THRESH_MAX) - raise pyric.error(pyric.EINVAL, msg) + emsg = "Thresh must be 'off' or integer {0}-{1}".format(wlan.RTS_THRESH_MIN, + wlan.RTS_THRESH_MAX) + raise pyric.error(pyric.EINVAL, emsg) try: nlsock = argv[0] @@ -920,7 +920,7 @@ def rtsthreshset(card, thresh, *argv): except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except ValueError: - raise pyric.error(pyric.EINVAL, "Invalid parameter value for thresh") + raise pyric.error(pyric.EINVAL, "Invalid value {0} for thresh".format(thresh)) except nl.error as e: raise pyric.error(e.errno, e.strerror) @@ -951,9 +951,9 @@ def fragthreshset(card, thresh, *argv): if thresh == 'off': thresh = wlan.FRAG_THRESH_OFF elif thresh == wlan.FRAG_THRESH_OFF: pass elif thresh < wlan.FRAG_THRESH_MIN or thresh > wlan.FRAG_THRESH_MAX: - msg = "Thresh must be 'off' or integer {0}-{1}".format(wlan.FRAG_THRESH_MIN, - wlan.FRAG_THRESH_MAX) - raise pyric.error(pyric.EINVAL, msg) + emsg = "Thresh must be 'off' or integer {0}-{1}".format(wlan.FRAG_THRESH_MIN, + wlan.FRAG_THRESH_MAX) + raise pyric.error(pyric.EINVAL, emsg) try: nlsock = argv[0] @@ -1121,7 +1121,7 @@ def devinfo(card, *argv): dev = None # appease pycharm try: - # if we have a Card object, pull at dev,ifindex. otherwise get ifindex + # if we have a Card, pull out ifindex. otherwise get ifindex from dev try: dev = card.dev idx = card.idx @@ -1138,13 +1138,16 @@ def devinfo(card, *argv): rmsg = nl.nl_recvmsg(nlsock) except io.error as e: # if we get a errno -19, it means ifindex failed & there is no device dev - if e.errno == pyric.ENODEV: - raise pyric.error(pyric.ENODEV, "No device {0} found".format(dev)) raise pyric.error(e.errno, e.strerror) except nl.error as e: - # if we get a errno -19, it means ifindex succeeded but netlink failed - # most likely because the given device does not support nl80211 + # if we get a errno -19, it is mostly likely because the card does + # not support nl80211. However check to ensure the card hasn't been + # unplugged. if e.errno == pyric.ENODEV: + try: + _ = _ifindex_(dev) + except io.error as e: + raise pyric.error(e.errno, "{0}. Check Card".format(e.strerror)) raise pyric.error(pyric.EPROTONOSUPPORT, "Device does not support nl80211") raise pyric.error(e.errno, e.strerror) @@ -1294,7 +1297,7 @@ def txset(card, setting, lvl, *argv): _ = nl.nl_recvmsg(nlsock) except ValueError: # converting to mBm - raise pyric.error(pyric.EINVAL, "Invalid txpwr {0}".format(lvl)) + raise pyric.error(pyric.EINVAL, "Invalid value {0} for txpwr".format(lvl)) except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: @@ -1352,8 +1355,8 @@ def chset(card, ch, chw=None, *argv): :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} :param argv: netlink socket at argv[0] (or empty) NOTE: - Can throw a device busy for several reason. Card should be "up" when - setting channel + Can throw a device busy for several reason. 1) Card is down, 2) Another + device is sharing the phy and wpa_supplicant/Network Manage is using it """ try: nlsock = argv[0] @@ -1386,8 +1389,8 @@ def freqset(card, rf, chw=None, *argv): :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} :param argv: netlink socket at argv[0] (or empty) NOTE: - Can throw a device busy for several reason. Card should be "up" when - setting channel + Can throw a device busy for several reason. 1) Card is down, 2) Another + device is sharing the phy and wpa_supplicant/Network Manage is using it """ try: nlsock = argv[0] @@ -1405,10 +1408,11 @@ def freqset(card, rf, chw=None, *argv): nl.nl_sendmsg(nlsock, msg) _ = nl.nl_recvmsg(nlsock) except ValueError: - raise pyric.error(pyric.EINVAL, "Invalide channel width") + raise pyric.error(pyric.EINVAL, "Invalid channel width") except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: + if e.errno == pyric.EBUSY: raise pyric.error(e.errno,pyric.strerror(e.errno)) raise pyric.error(e.errno, e.strerror) #### INTERFACE & MODE RELATED #### @@ -1548,6 +1552,7 @@ def devadd(card, vdev, mode, flags=None, *argv): :returns: the new Card NOTE: the new Card will be 'down' """ + if iswireless(vdev): raise pyric.error(pyric.ENOTUNIQ,"{0} already exists".format(vdev)) if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') if flags: if mode != 'monitor': @@ -1822,15 +1827,17 @@ def link(card, *argv): if idx == nl80211h.NL80211_BSS_SIGNAL_MBM: info['rss'] = struct.unpack_from('i', attr, 0)[0] / 100 if idx == nl80211h.NL80211_BSS_INFORMATION_ELEMENTS: - # hacking the proprietary info element attribute: (it should - # be a nested attribute itself, but I have currently no way of - # knowing what the individual indexes would mean - # "\x06\x00\x00SSID..... - # '\x06\x00' is the ie index & the ssid is the first element - # (from what I've seen). This is not nested. Not sure if the - # length is the first two bytes or just the second Get the length - # of the ssid which is the 3rd,4th byte, then unpack the string - # starting at the fifth byte up to the specified length + """ + hack the proprietary info element attribute: (it should + be a nested attribute itself, but I have currently no way of + knowing what the individual indexes would mean + \x06\x00\x00SSID..... + '\x06\x00' is the ie index & the ssid is the first element + (from what I've seen). This is not nested. Not sure if the + length is the first two bytes or just the second Get the length + of the ssid which is the 3rd,4th byte, then unpack the string + starting at the fifth byte up to the specified length + """ try: l = struct.unpack_from('>H', attr, 0)[0] # have to change the format info['ssid'] = struct.unpack_from('{0}s'.format(l), attr, 2)[0] diff --git a/pyric/utils/rfkill.py b/pyric/utils/rfkill.py index 05500e6..cbbb4bd 100644 --- a/pyric/utils/rfkill.py +++ b/pyric/utils/rfkill.py @@ -74,6 +74,7 @@ def rfkill_list(): try: stream = fin.read(rfkh.RFKILLEVENTLEN) if _PY3_: + # noinspection PyArgumentList stream = bytes(stream,'ascii') if len(stream) < rfkh.RFKILLEVENTLEN: raise IOError('python 3') idx,t,op,s,h = struct.unpack(rfkh.rfk_rfkill_event,stream) From f563ad43752f2f28a2229f8c486636b7770ef10c Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sat, 20 Aug 2016 23:09:18 -0600 Subject: [PATCH 108/121] v0.1.6 See Changes --- .gitignore | 1 + CHANGES | 15 +- LICENSE | 2 +- MANIFEST.in | 2 +- README.md | 3 +- TODO | 5 - __init__.py | 2 +- docs/PyRIC.pdf | Bin 508453 -> 508101 bytes docs/PyRIC.tex | 149 ++++--- examples/info.py | 17 + examples/pentest.py | 18 + pyric/__init__.py | 4 + pyric/lib/__init__.py | 2 +- pyric/lib/libio.py | 4 +- pyric/lib/libnl.py | 6 +- pyric/net/__init__.py | 1 + pyric/net/genetlink_h.py | 1 - pyric/net/if_h.py | 2 + pyric/net/netlink_h.py | 53 --- pyric/net/policy.py | 11 +- pyric/net/sockios_h.py | 110 ++--- pyric/net/wireless/__init__.py | 1 + pyric/net/wireless/nl80211_c.py | 1 - pyric/net/wireless/nl80211_h.py | 1 - pyric/net/wireless/rfkill_h.py | 1 + pyric/net/wireless/wlan.py | 1 - pyric/nlhelp/__init__.py | 1 + pyric/nlhelp/attributes.help | 2 +- pyric/nlhelp/commands.help | 2 +- pyric/nlhelp/nlsearch.py | 2 +- pyric/pyw.py | 717 ++++++++++++-------------------- pyric/utils/__init__.py | 1 + pyric/utils/channels.py | 4 +- pyric/utils/hardware.py | 2 + pyric/utils/ouifetch.py | 6 + pyric/utils/rfkill.py | 1 + setup.cfg | 2 +- setup.py | 2 +- tests/pyw.unittest.py | 15 +- 39 files changed, 493 insertions(+), 677 deletions(-) diff --git a/.gitignore b/.gitignore index 7445f02..5ef15f1 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ # #DEALINGS IN THE SOFTWARE. + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/CHANGES b/CHANGES index 438a9ea..f808979 100644 --- a/CHANGES +++ b/CHANGES @@ -181,4 +181,17 @@ v 0.1.6 Continue with STA functionality under the following conditions a) the type is not managed or b) there is no other device currently associated with the new card's phy. Have also determined that integrated cards are also suspect to this bug? - o made pyric error messages less ambiguous \ No newline at end of file + o made pyric error messages less ambiguous + o changed template and stub so that all pyw functions can now use named parameters + if desired + - i.e. pyw.freqset(card=,rf=2412,nlsock=) or + pyw.freqset(,2412,None,) + o renamed the following functions: + - inetget to ifaddrget + - inetset to ifaddrset + - ip4set to inetset + - netmaskset to maskset + - broadcastset to bcastset + o adddres related functions mac and ifaddr return True on success, False otherwise + o commented out constants in sockios_h that are not being used + - no significant change but will reduce bytecode size \ No newline at end of file diff --git a/LICENSE b/LICENSE index 6add54b..f2eb1c3 100644 --- a/LICENSE +++ b/LICENSE @@ -39,4 +39,4 @@ software in furtherance of or with intent to commit any fraudulent or other ille activities, or otherwise in violation of any applicable law, regulation or legal agreement. -See for a copy of the GNU General Public License. \ No newline at end of file +See for a copy of the GNU General Public License. diff --git a/MANIFEST.in b/MANIFEST.in index dc77fa7..516526e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,7 +4,7 @@ include LICENSE CHANGES README.md TODO # Include subdirectories # note to self: even including recursive-include here, have to follow up by # ensuring data (non .py) files are also referenced in setup.py -recursive-include examples +#recursive-include examples recursive-include examples *.py recursive-include docs *.pdf recursive-include pyric/utils/data *.txt diff --git a/README.md b/README.md index ef776d4..108d1da 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,8 @@ it's initial inception, PyRIC has grown. PyRIC puts iw, ifconfig, rfkill, udevadm, airmon-ng and macchanger in your hands (or your program). ### a. Additions to iw -Several "extensions" have been added to iw: +Several "extensions" have been added to iw (See docs/PyRIC.pdf for more +information): * Persistent sockets: pyw provides the caller with functions & ability to pass their own netlink (or ioctl socket) to pyw functions; * One-time request for the nl80211 family id: pyw stores the family id in a diff --git a/TODO b/TODO index 570f4f2..aa5b527 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,3 @@ - 8) Two commands that would add information of minor value - o ethtool. uses ioctl but does not follow same pattern as ifconfig seems - to use - - ethtool -i gives driver information including firmware-version - and udevadm (does what hardware.py does) 11) tried NL80211_CMD_GET_WIPHY, setting _WIPHY_TX_POWER_LEVEL but did not return the current power level - currently cannot find anything in nl80211.h that could be used to get tx power diff --git a/__init__.py b/__init__.py index a7a28c5..1067754 100644 --- a/__init__.py +++ b/__init__.py @@ -1,4 +1,4 @@ -# PyRIC root Distribution directory +# PyRIC v 1.6 root Distribution directory # Do not import from this directory i.e from PyRIC import foobar # To install # use pip ('sudo pip install PyRIC') diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index fc243120fb6e74a3c3cf78f68e8240131d27a9f4..964aacbb0e462b199db07fee6cdc4202168a808f 100644 GIT binary patch delta 24546 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 delta 24799 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 P#={Fjqob2nl|lOtmAgOf diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 557d540..3624d59 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -417,23 +417,19 @@ \subsubsection{One-time vs Persistent Sockets} \begin{lstlisting}[caption={A Basic Netlink Function Template}, label={lst:template}, language=Python] -def fcttemplate(arg0,arg1,..,argn,*argv): +def fcttemplate(arg0,arg1,..,argn,nlsock=None): # put parameter validation (if any) here - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(fcttemplate,arg0,arg1,...,argn) - + if nlsock is None: _nlstub_(fcttemplate,arg0,arg1,...,argn) + # command execution ... return results \end{lstlisting} -The template function in Listing \ref{lst:template} checks if argv has a netlink -socket\footnote{ioctl calls operate in the same manner} at index 0. If so, it -proceeds to execution. If there is no socket, the stub is executed which creates -one. If something other than a netlink socket is at argv[0], an error will be -raised during execution. \\ +The template function in Listing \ref{lst:template} checks if nlsock is instantiatd +\footnote{ioctl calls operate in the same manner}. If so, it proceeds to execution. +If there is no socket, the stub is executed which creates one. If something other +than a netlink socket is at argv[0], an error will be raised during execution. \\ \begin{lstlisting}[caption={Function \_nlstub\_}, label={lst:stub}, @@ -442,7 +438,7 @@ \subsubsection{One-time vs Persistent Sockets} nlsock = None try: nlsock = nlsock = nl.nl_socket_alloc() - argv = list(argv) + [nlsock] + argv = list(argv) + nlsock=None return fct(*argv) except pyric.error: raise # catch & release @@ -716,128 +712,131 @@ \subsection{Objects/Classes} \subsection{Functions} \begin{itemize} -\item interfaces(): (ifconfig), type: filesystem, returns list of all network dev -\item isinterface(dev): (ifconfig ) type: filesystem, check dev is an interface -\item winterfaces([iosock]): (iwconfig), type: ioctl, list wireless interfaces -\item iswireless(dev,[iosock]): (iwconfig ), type: ioctl, check dev is a +\item interfaces(): (ifconfig), type: filesystem, returns list of all network +device names +\item isinterface(dev): (ifconfig ) type: filesystem, checks that dev is a +device name +\item winterfaces(iosock=None): (iwconfig), type: ioctl, list wireless device +names +\item iswireless(dev,iosock=None): (iwconfig ), type: ioctl, check dev is a wireless interface \item phylist(): (iw phy | grep wiphy) type: N/A, list phy indexes and phy names present on system -\item regget([nlsock]: (iw reg get), type: netlink, get regulatory domain -\item regset(rd,[nlsock]): (iw reg set ), type: netlink, set regulatory domain +\item regget(nlsock=None: (iw reg get), type: netlink, get regulatory domain +\item regset(rd,nlsock=None): (iw reg set ), type: netlink, set regulatory domain to rd -\item getcard(dev,[nlsock]) (N/A), type: hybrid netlink and ioctl: get a Card +\item getcard(dev,nlsock=None) (N/A), type: hybrid netlink and ioctl: get a Card object for dev -\item validcard(card,[nlsock]): (N/A), type: (hyrbrid netlink and ioctl), verify +\item validcard(card,nlsock=None): (N/A), type: (hyrbrid netlink and ioctl), verify card is still valid -\item macget(card,[iosock]): (ifconfig), type: ioctl, determine if card is up +\item macget(card,iosock=None): (ifconfig), type: ioctl, determine if card is up or down -\item macset(card,mac,[iosock]): (ifconfig card. hw ether ), type: +\item macset(card,mac,iosock=None): (ifconfig card. hw ether ), type: ioctl, set card's hw address to mac -\item isup(card,[iosock]): (ifconfig card.) -\item up(card,[iosock]) (ifconfig card. up), type: ioctl, bring card up -\item down(card,[iosock]): (ifconfig card. down), type: ioctl, bring card +\item isup(card,iosock=None): (ifconfig card.) +\item up(card,iosock=None) (ifconfig card. up), type: ioctl, bring card up +\item down(card,iosock=None): (ifconfig card. down), type: ioctl, bring card down \item isblocked(card): (rfkill list ): type N/A returns tuple (Soft Block State, Hard Block State) \item block(card): (rfkill block ) type: N/A, soft blocks card \item unblock(card): (rfkill unblock ) type: N/A, removes the soft block on card -\item pwrsaveget(card,[nlsock]) (iw dev card. get power\_save) type: netlink +\item pwrsaveget(card,nlsock=None) (iw dev card. get power\_save) type: netlink get card's power save state True = on, False = off -\item pwrsaveset(card,on,[nlsock]) (iw dev card. set power\_save ) type: -netlink set card's power save state True = on, False = off -\item covclassget(card,[nlsock]) (iw phy card. get coverage ) type: +\item pwrsaveset(card,on,nlsock=None) (iw dev card. set power\_save ) type: +netlink, set card's power save state True = on, False = off +\item covclassget(card,nlsock=None) (iw phy card. get coverage ) type: netlink get card's coverage class -\item covclassset(card,cc,[nlsock]) (iw phy card. set coverage ) type: +\item covclassset(card,cc,nlsock=None) (iw phy card. set coverage ) type: netlink set card's coverage class -\item retryshortget(card,[nlsock]) (iw phy card. info | grep 'retry short') +\item retryshortget(card,nlsock=None) (iw phy card. info | grep 'retry short') type:netlink get card's retry short limit -\item retryshortset(card,lim,[nlsock]) (iw phy card. set retry short ) +\item retryshortset(card,lim,nlsock=None) (iw phy card. set retry short ) type:netlink set card's retry short limit. NOTE: although 255 is specified as the max limit for this and the long retry, kernel v4 will not allow it. -\item retrylongget(card,[nlsock]) (iw phy card. info | grep 'retry long') +\item retrylongget(card,nlsock=None) (iw phy card. info | grep 'retry long') type:netlink get card's retry long limit -\item retrylongset(card,lim,[nlsock]) (iw phy card. set retry long ) +\item retrylongset(card,lim,nlsock=None) (iw phy card. set retry long ) type:netlink set card's retry long limit -\item rtsthreshget(card,[nlsock]) (iw phy card. info | grep rts) type: +\item rtsthreshget(card,nlsock=None) (iw phy card. info | grep rts) type: netlink set card's RTS threshold -\item rtsthreshset(card,thresh,[nlsock]) (iw phy card. set rts ) type: +\item rtsthreshset(card,thresh,nlsock=None) (iw phy card. set rts ) type: netlink set card's RTS threshold -\item fragthreshget(card,[nlsock]) (iw phy card. info | grep frag) type: +\item fragthreshget(card,nlsock=None) (iw phy card. info | grep frag) type: netlink get card's fragmentation threshold -\item fragthreshset(card,thresh,[nlsock]) (iw phy card. set frag ) type: +\item fragthreshset(card,thresh,nlsock=None) (iw phy card. set frag ) type: netlink set card's fragmentation threshold -\item inetget(card,[iosock]): (ifconfig card.), type: ioctl, get ip4 address, +\item ifaddrget(card,iosock=None): (ifconfig card.), type: ioctl, get ip4 address, netmask and broadcast address of card -\item inetset(card,ipaddr,netmask,broadcast,[iosock]): (ifconfig card/ -netmask broadcast ), type: ioctl, set the interface addresses -of the card -\item ip4set(card,ipaddr,[iosock]): (ifconfig card. ), type: ioctl, +\item ifaddrset(card,ipaddr,netmask,broadcast,iosock=None): (ifconfig card/ + netmask broadcast ), type: ioctl, set the interface +addresses of the card +\item inetset(card,ipaddr,iosock=None): (ifconfig card. ), type: ioctl, set the card's ip4 address -\item netmaskset(card,netmask,[iosock]): (ifconfig card. netmask ), +\item maskset(card,netmask,iosock=None): (ifconfig card. netmask ), type: ioctl, set the card's netmask -\item broadcastset(card,broadcast,[iosock]): (ifconfig card. broadcast +\item bcastset(card,broadcast,iosock=None): (ifconfig card. broadcast ), type: ioctl, set the card's broadcast address -\item devfreqs(card,[nlsock]): (iw phy card.phy info), type: netlink, get card's +\item devfreqs(card,nlsock=None): (iw phy card.phy info), type: netlink, get card's supported frequencies -\item devchs(card,[nlsock]): (iw phy card.phy info), type: netlink, get card's +\item devchs(card,nlsock=None): (iw phy card.phy info), type: netlink, get card's supported channels -\item devstds(card,[nlsock]): (iwconfig card. | grep IEEE), type: nlsock, +\item devstds(card,nlsock=None): (iwconfig card. | grep IEEE), type: nlsock, returns a list of card's 802.11 supported standards by letter designator -\item devmodes(card,[nlsock]): (iw phy card.phy info | grep interface), type: +\item devmodes(card,nlsock=None): (iw phy card.phy info | grep interface), type: netlink, get card's supported modes -\item devcmds(card,[nlsock]): (iw phy card.phy info | grep commands), type: +\item devcmds(card,nlsock=None): (iw phy card.phy info | grep commands), type: netlink, get card's supported commands -\item ifinfo(card,[iosock]): (ifconfig card.), type: ioctl, get hardware +\item ifinfo(card,iosock=None): (ifconfig card.), type: ioctl, get hardware related info for card -\item devinfo(card,[nlsock]): (iw dev card. info), type: netlink, get info +\item devinfo(card,nlsock=None): (iw dev card. info), type: netlink, get info for dev -\item phyinfo(card,[nlsock]): (iw phy card. info), type: netlink, get info +\item phyinfo(card,nlsock=None): (iw phy card. info), type: netlink, get info for phy -\item ifaces(card,[nlsock]): (APX iw card.dev | grep phy\#), type: netlink, get all +\item ifaces(card,nlsock=None): (APX iw card.dev | grep phy\#), type: netlink, get all cards (w/ modes) of interfaces sharing the same phy as card -\item txset(card,pwr,lvl,[nlsock]) (iw phy phy0 set txpower ), type: +\item txset(card,pwr,lvl,nlsock=None) (iw phy phy0 set txpower ), type: netlink,sets the tx power to pwr (in dBm) with level setting lvl -\item txget(card,[iosock]): (iwconfig card. | grep Tx-Power card), type: +\item txget(card,iosock=None): (iwconfig card. | grep Tx-Power card), type: ioctl, get card's transmission power -\item chget(card,[nlsock]): (iw dev info | grep channel), type: +\item chget(card,nlsock=None): (iw dev info | grep channel), type: netlink, get card's current channel -\item chset(card,ch,chw,[nlsock]): iw phy set channel ), +\item chset(card,ch,chw=None,nlsock=None): iw phy set channel ), type: netlink, set card's current channel to ch with width chw -\item freqget(card,[nlsock]): (iw dev info | grep channel), type: +\item freqget(card,nlsock=None): (iw dev info | grep channel), type: netlink, get card's current frequency -\item freqset(card,rf,chw,[nlsock]): iw phy set freq ), +\item freqset(card,rf,chw=None,nlsock=None): iw phy set freq ), type: netlink, set card's current frequency to rf with width chw -\item devmodes(card,[iosock]): (iw phy card.), type: netlink, get modes +\item devmodes(card,iosock=None): (iw phy card.), type: netlink, get modes supported by card -\item modeset(card,mode,[flags],[nlsock]): (iw dev card. set type +\item modeset(card,mode,flags=None,nlsock=None): (iw dev card. set type [flags]), type: netlink, set card's mode to mode with flags (if mode is monitor) -\item modeget(card[nlsock]): (iw dev card. info | grep mode), type: netlink, +\item modeget(card,nlsock=None): (iw dev card. info | grep mode), type: netlink, get card's mode -\item devset(card,ndev,[nlsock]): (N/A) sets the dev (name) of card to ndev -\item phyadd(phy,vnic,mode,[flags],[nlsock]): (iw phy interface add +\item devset(card,ndev,nlsock=None): (N/A) sets the dev (name) of card to ndev +\item phyadd(phy,vnic,mode,flags=None,nlsock=None): (iw phy interface add type flags )\footnote{There is a bug in some kernel v4.4.0-x where the given dev name is ignored and a system chosen one is used instead. See https://wraithwireless.wordpress.com. Whenever possible, use devadd to create interfaces instead.}, type: netlink, creates a new virtual interface with dev vdev, in mode and using flags. Note: flags are only supported when creating a monitor mode -\item devadd(card (or ifindex),vnic,mode,[flags],[nlsock]): (iw phy card. +\item devadd(card (or ifindex),vnic,mode,[flags],nlsock=None): (iw phy card. interface add type flags ), type: netlink, creates a new virtual interface with dev vdev, in mode and using flags. Note: flags are only supported when creating a monitor mode. This function accepts either a Card object or a ifindex. -\item devdel(card,[nlsock]): (iw card. del), type: netlink, deletes card +\item devdel(card,nlsock=None): (iw card. del), type: netlink, deletes card \begin{itemize} -\item isconnected(card, [nlsock]): (iw dev card. info | grep channel), type: +\item isconnected(card,nlsock=None): (iw dev card. info | grep channel), type: netlink, determines if card is connected -\item connect(card, ssid, bssid, rf, [nlsock]): (iw dev card. connect +\item connect(card,ssid,bssid=None,rf=None,nlsock=None): (iw dev card. connect ) connects to AP SSID with BSSID -\item disconnect(card, [nlsock]): (iw dev card. disconnect), type: netlink, +\item disconnect(card, nlsock=None): (iw dev card. disconnect), type: netlink, disconnects card from AP -\item link(card, [nlsock]): (iw dev card. link), type: netlink, displays +\item link(card, nlsock=None): (iw dev card. link), type: netlink, displays link specific details, i.e. AP details that card is connected to -\item stainfo(card, mac, [nlsock]): (iw dev card. link) type: netlink, displays +\item stainfo(card, mac, nlsock=None): (iw dev card. link) type: netlink, displays tx, rx metrics of the AP that card is connected to \item \_hex2mac\_(v): returns a ':' separated mac address from byte stream v \item \_mac2hex\_(v): returns a hex string corresponding to mac address v @@ -849,9 +848,9 @@ \subsection{Functions} \item \_unsetf\_(flags,flag): set flag in flags to off \item \_familyid\_(nlsock): returns and sets the Netlink family id for nl80211, only called once per module import -\item \_ifindex\_(dev,[iosock]): returns dev's ifindex -\item \_flagsget\_(dev,[iosock]): get's the dev's interface flags -\item \_flagsset\_(dev,flags,[iosock]): set's the dev's interface flags +\item \_ifindex\_(dev,iosock=None): returns dev's ifindex +\item \_flagsget\_(dev,iosock=None): get's the dev's interface flags +\item \_flagsset\_(dev,flags,iosock=None): set's the dev's interface flags \item \_iftypes\_(i): returns the mode corresponding to i \item \_bands\_(band): futher parses band attribute returns dict of bands containting rf information and rate information diff --git a/examples/info.py b/examples/info.py index 3421951..6b4492f 100644 --- a/examples/info.py +++ b/examples/info.py @@ -1,5 +1,22 @@ #!/usr/bin/env python """ info.py +Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +Redistribution and use in source and binary forms, with or without +modifications, are permitted provided that the following conditions are met: + o Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + o Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + o Neither the name of the orginal author Dale V. Patterson nor the names of + any contributors may be used to endorse or promote products derived from + this software without specific prior written permission. Example for displaying device details diff --git a/examples/pentest.py b/examples/pentest.py index 74e16f9..812cb79 100644 --- a/examples/pentest.py +++ b/examples/pentest.py @@ -1,6 +1,24 @@ #!/usr/bin/env python """ pentest.py +Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +Redistribution and use in source and binary forms, with or without +modifications, are permitted provided that the following conditions are met: + o Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + o Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + o Neither the name of the orginal author Dale V. Patterson nor the names of + any contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + Example for setting up a wireless environment - must be done as root """ diff --git a/pyric/__init__.py b/pyric/__init__.py index 601c7bc..fe9943b 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -63,6 +63,10 @@ def __init__(self,errno,errmsg=None): EnvironmentError.__init__(self,errno,errmsg) def strerror(errno): + """ + :param errno: error code + :returns: error message + """ import os if errno < 0: return "Undefined error" elif errno == EPERM: return "Superuser privileges required" diff --git a/pyric/lib/__init__.py b/pyric/lib/__init__.py index 5f6fa6f..42c3ddc 100644 --- a/pyric/lib/__init__.py +++ b/pyric/lib/__init__.py @@ -23,7 +23,7 @@ lib 0.0.2 desc: lib subpackage - includes: libnl 0.1.0 libio 0.0.1 + includes: libnl 0.1.1 libio 0.0.1 changes: o added libio o updated libnl diff --git a/pyric/lib/libio.py b/pyric/lib/libio.py index 2f19232..b379854 100644 --- a/pyric/lib/libio.py +++ b/pyric/lib/libio.py @@ -19,8 +19,8 @@ contributors may be used to endorse or promote products derived from this software without specific prior written permission. -Basic wrappers providing functionality for socket creation/deletion and send/recv -w.r.t ioctl calls +Basic wrappers providing functionality for socket creation/deletion and transfer +i.e. send/recv w.r.t ioctl calls """ diff --git a/pyric/lib/libnl.py b/pyric/lib/libnl.py index 6fe7599..ce0535c 100644 --- a/pyric/lib/libnl.py +++ b/pyric/lib/libnl.py @@ -182,7 +182,7 @@ def nl_socket_alloc(pid=None,grps=0,seq=None,rx=None,tx=None,timeout=None): tx = tx or BUFSZ if tx < 128 or tx > _maxbufsz_(): raise error(errno.EINVAL,"Invalid tx size") - # create the socket and rturn it + # create the socket and return it try: s = socket.socket(socket.AF_NETLINK,socket.SOCK_RAW,nlh.NETLINK_GENERIC) s.setsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF,tx) @@ -696,7 +696,9 @@ def _attrpack_(a,v,d): elif d == nlh.NLA_U32: attr = struct.pack("I",v) elif d == nlh.NLA_U64: attr = struct.pack("Q",v) elif d == nlh.NLA_STRING: - if _PY3_: v = bytes(v,'ascii') + if _PY3_: + # noinspection PyArgumentList + v = bytes(v,'ascii') attr = struct.pack("{0}sx".format(len(v)),v) elif d == nlh.NLA_FLAG: attr = '' # a 0 sized attribute elif d == nlh.NLA_MSECS: attr = struct.pack("Q",v) diff --git a/pyric/net/__init__.py b/pyric/net/__init__.py index 3f9f2dd..879b09e 100644 --- a/pyric/net/__init__.py +++ b/pyric/net/__init__.py @@ -32,6 +32,7 @@ o changed policies from list to dict o removed nle_error related as we use python errno o added ip4 to sockaddr and set ip4 to ifreq + o commented out sockios flags that are not currently being used """ diff --git a/pyric/net/genetlink_h.py b/pyric/net/genetlink_h.py index 4472b79..5b0b9d2 100644 --- a/pyric/net/genetlink_h.py +++ b/pyric/net/genetlink_h.py @@ -44,7 +44,6 @@ import struct GENL_NAMSIZ = 16 # length of family name - GENL_MIN_ID = 0x10 # hardcoded from netlink_h GENL_MAX_ID = 1023 diff --git a/pyric/net/if_h.py b/pyric/net/if_h.py index 0483123..cda9f4c 100644 --- a/pyric/net/if_h.py +++ b/pyric/net/if_h.py @@ -242,6 +242,8 @@ def sockaddr(sa_family,sa_data=None): IFIFINDEXLEN = struct.calcsize(ifr_ifindex) IWNAMELEN = struct.calcsize(ifr_iwname) IWTXPWRLEN = struct.calcsize(ifr_iwtxpwr) + +# noinspection PyArgumentList def ifreq(ifrn,ifru=None,param=None): """ creates a 'packed' struct cooresponding loosely to the ifreq struct. Padded diff --git a/pyric/net/netlink_h.py b/pyric/net/netlink_h.py index b732214..5ced49e 100644 --- a/pyric/net/netlink_h.py +++ b/pyric/net/netlink_h.py @@ -74,15 +74,6 @@ MAX_LINKS = 32 -""" -struct sockaddr_nl { - __kernel_sa_family_t nl_family; /* AF_NETLINK */ - unsigned short nl_pad; /* zero */ - __u32 nl_pid; /* port ID */ - __u32 nl_groups; /* multicast groups mask */ -}; -""" - """ struct nlmsghdr { __u32 nlmsg_len; /* Length of message including header */ @@ -152,14 +143,6 @@ def NLMSG_ALIGN(l): return (l+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) def NLMSG_LENGTH(l): return l+NLMSGHDRLEN def NLMSG_SPACE(l): return NLMSG_ALIGN(NLMSG_LENGTH(l)) def NLMSG_ALIGNBY(l): return NLMSG_ALIGN(l) - l -# still working the below out -#NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSGHDRLEN)) -#NLMSG_NEXT(hl,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \ -# (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) -#NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \ -# (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \ -# (nlh)->nlmsg_len <= (len)) -#NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len))) NLMSG_NOOP = 0x1 # Nothing. NLMSG_ERROR = 0x2 # Error @@ -200,33 +183,6 @@ def nlmsgerr(error,mlen,nltype,flags,seq,pid): NETLINK_RX_RING = 6 NETLINK_TX_RING = 7 -""" -struct nl_pktinfo { - __u32 group; -}; -""" - -""" -struct nl_mmap_req { - unsigned int nm_block_size; - unsigned int nm_block_nr; - unsigned int nm_frame_size; - unsigned int nm_frame_nr; -}; -""" - -""" -struct nl_mmap_hdr { - unsigned int nm_status; - unsigned int nm_len; - __u32 nm_group; - /* credentials */ - __u32 nm_pid; - __u32 nm_uid; - __u32 nm_gid; -}; -""" - # nume nl_nmap_status NL_MMAP_STATUS_UNUSED = 0 NL_MMAP_STATUS_RESERVED = 1 @@ -234,10 +190,6 @@ def nlmsgerr(error,mlen,nltype,flags,seq,pid): NL_MMAP_STATUS_COPY = 3 NL_MMAP_STATUS_SKIP = 4 -#NL_MMAP_MSG_ALIGNMENT NLMSG_ALIGNTO -#NL_MMAP_MSG_ALIGN(sz) __ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT) -#NL_MMAP_HDRLEN NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr)) - NET_MAJOR = 36 # Major 36 is reserved for networking NETLINK_UNCONNECTED = 0 @@ -263,7 +215,6 @@ def nlmsgerr(error,mlen,nltype,flags,seq,pid): */ """ -# Attribute Datatypes """ I add two datatypes to the netlink definition: NLA_ERROR: designates an attribute that failed during unpacking @@ -322,10 +273,6 @@ def nlattrhdr(alen,atype): NLA_F_NET_BYTEORDER = (1 << 14) NLA_TYPE_MASK = ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) -#NLA_ALIGNTO = 4 -#NLA_ALIGN(len) = (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) -#NLA_HDRLEN = ((int) NLA_ALIGN(sizeof(struct nlattr))) - # defined error codes # only use success and failure -> using errno for other error numbers NLE_SUCCESS = 0 diff --git a/pyric/net/policy.py b/pyric/net/policy.py index bd9a745..4c6797f 100644 --- a/pyric/net/policy.py +++ b/pyric/net/policy.py @@ -80,13 +80,4 @@ def nla_datatype(policy,attr): genlh.CTRL_ATTR_MCAST_GRP_NAME:nlh.NLA_STRING, genlh.CTRL_ATTR_MCAST_GRP_ID:nlh.NLA_U32} -nla_dts['nl80211_attr'] = nl80211c.nl80211_policy - -# ATT we do include the below as defined in nl80211_c -#nla_dts['nl80211_key'] = nl80211c.nl80211_key_policy -#nla_dts['nl80211_wowlan_trig'] = nl80211_wowlan_trig_policy -#nla_dts['nl80211_wowlan_tcp'] = nl80211_wowlan_tcp_policy -#nla_dts['nl80211_coalesce'] = nl80211_coalesce_policy -#nla_dts['nl80211_rekey'] = nl80211_rekey_policy -#nla_dts['nl80211_match'] = nl80211_match_policy -#nla_dts['nl80211_plan'] = nl80211_plan_policy \ No newline at end of file +nla_dts['nl80211_attr'] = nl80211c.nl80211_policy \ No newline at end of file diff --git a/pyric/net/sockios_h.py b/pyric/net/sockios_h.py index e01930c..cbc8522 100644 --- a/pyric/net/sockios_h.py +++ b/pyric/net/sockios_h.py @@ -67,86 +67,86 @@ # Socket configuration controls SIOCGIFNAME = 0x8910 # get iface name -SIOCSIFLINK = 0x8911 # set iface channel -SIOCGIFCONF = 0x8912 # get iface list +#SIOCSIFLINK = 0x8911 # set iface channel +#SIOCGIFCONF = 0x8912 # get iface list SIOCGIFFLAGS = 0x8913 # get flags SIOCSIFFLAGS = 0x8914 # set flags SIOCGIFADDR = 0x8915 # get PA address SIOCSIFADDR = 0x8916 # set PA address -SIOCGIFDSTADDR = 0x8917 # get remote PA address -SIOCSIFDSTADDR = 0x8918 # set remote PA address +#SIOCGIFDSTADDR = 0x8917 # get remote PA address +#SIOCSIFDSTADDR = 0x8918 # set remote PA address SIOCGIFBRDADDR = 0x8919 # get broadcast PA address SIOCSIFBRDADDR = 0x891a # set broadcast PA address SIOCGIFNETMASK = 0x891b # get network PA mask SIOCSIFNETMASK = 0x891c # set network PA mask -SIOCGIFMETRIC = 0x891d # get metric -SIOCSIFMETRIC = 0x891e # set metric -SIOCGIFMEM = 0x891f # get memory address (BSD) -SIOCSIFMEM = 0x8920 # set memory address (BSD) -SIOCGIFMTU = 0x8921 # get MTU size -SIOCSIFMTU = 0x8922 # set MTU size -SIOCSIFNAME = 0x8923 # set interface name +#SIOCGIFMETRIC = 0x891d # get metric +#SIOCSIFMETRIC = 0x891e # set metric +#SIOCGIFMEM = 0x891f # get memory address (BSD) +#SIOCSIFMEM = 0x8920 # set memory address (BSD) +#SIOCGIFMTU = 0x8921 # get MTU size +#SIOCSIFMTU = 0x8922 # set MTU size +#SIOCSIFNAME = 0x8923 # set interface name SIOCSIFHWADDR = 0x8924 # set hardware address -SIOCGIFENCAP = 0x8925 # get/set encapsulations -SIOCSIFENCAP = 0x8926 +#SIOCGIFENCAP = 0x8925 # get/set encapsulations +#SIOCSIFENCAP = 0x8926 SIOCGIFHWADDR = 0x8927 # Get hardware address -SIOCGIFSLAVE = 0x8929 # Driver slaving support -SIOCSIFSLAVE = 0x8930 -SIOCADDMULTI = 0x8931 # Multicast address lists -SIOCDELMULTI = 0x8932 +#SIOCGIFSLAVE = 0x8929 # Driver slaving support +#SIOCSIFSLAVE = 0x8930 +#SIOCADDMULTI = 0x8931 # Multicast address lists +#SIOCDELMULTI = 0x8932 SIOCGIFINDEX = 0x8933 # name -> if_index mapping SIOGIFINDEX = SIOCGIFINDEX # misprint compatibility :-) -SIOCSIFPFLAGS = 0x8934 # set/get extended flags set -SIOCGIFPFLAGS = 0x8935 -SIOCDIFADDR = 0x8936 # delete PA address +#SIOCSIFPFLAGS = 0x8934 # set/get extended flags set +#SIOCGIFPFLAGS = 0x8935 +#SIOCDIFADDR = 0x8936 # delete PA address SIOCSIFHWBROADCAST = 0x8937 # set hardware broadcast addr -SIOCGIFCOUNT = 0x8938 # get number of devices -SIOCGIFBR = 0x8940 # Bridging support -SIOCSIFBR = 0x8941 # Set bridging options -SIOCGIFTXQLEN = 0x8942 # Get the tx queue length -SIOCSIFTXQLEN = 0x8943 # Set the tx queue length -SIOCETHTOOL = 0x8946 # Ethtool interface -SIOCGMIIPHY = 0x8947 # Get address of MII PHY in use -SIOCGMIIREG = 0x8948 # Read MII PHY register. -SIOCSMIIREG = 0x8949 # Write MII PHY register. -SIOCWANDEV = 0x894A # get/set netdev parameters -SIOCOUTQNSD = 0x894B # output queue size (not sent only) +#SIOCGIFCOUNT = 0x8938 # get number of devices +#SIOCGIFBR = 0x8940 # Bridging support +#SIOCSIFBR = 0x8941 # Set bridging options +#SIOCGIFTXQLEN = 0x8942 # Get the tx queue length +#SIOCSIFTXQLEN = 0x8943 # Set the tx queue length +#SIOCETHTOOL = 0x8946 # Ethtool interface +#SIOCGMIIPHY = 0x8947 # Get address of MII PHY in use +#SIOCGMIIREG = 0x8948 # Read MII PHY register. +#SIOCSMIIREG = 0x8949 # Write MII PHY register. +#SIOCWANDEV = 0x894A # get/set netdev parameters +#SIOCOUTQNSD = 0x894B # output queue size (not sent only) # ARP cache control calls -SIOCDARP = 0x8953 # delete ARP table entry -SIOCGARP = 0x8954 # get ARP table entry -SIOCSARP = 0x8955 # set ARP table entry +#SIOCDARP = 0x8953 # delete ARP table entry +#SIOCGARP = 0x8954 # get ARP table entry +#SIOCSARP = 0x8955 # set ARP table entry # RARP cache control calls -SIOCDRARP = 0x8960 # delete RARP table entry -SIOCGRARP = 0x8961 # get RARP table entry -SIOCSRARP = 0x8962 # set RARP table entry +#SIOCDRARP = 0x8960 # delete RARP table entry +#SIOCGRARP = 0x8961 # get RARP table entry +#SIOCSRARP = 0x8962 # set RARP table entry # Driver configuration calls -SIOCGIFMAP = 0x8970 # Get device parameters -SIOCSIFMAP = 0x8971 # Set device parameters +#SIOCGIFMAP = 0x8970 # Get device parameters +#SIOCSIFMAP = 0x8971 # Set device parameters # DLCI configuration calls -SIOCADDDLCI = 0x8980 # Create new DLCI device -SIOCDELDLCI = 0x8981 # Delete DLCI device +#SIOCADDDLCI = 0x8980 # Create new DLCI device +#SIOCDELDLCI = 0x8981 # Delete DLCI device -SIOCGIFVLAN = 0x8982 # 802.1Q VLAN support -SIOCSIFVLAN = 0x8983 # Set 802.1Q VLAN options +#SIOCGIFVLAN = 0x8982 # 802.1Q VLAN support +#SIOCSIFVLAN = 0x8983 # Set 802.1Q VLAN options # bonding calls -SIOCBONDENSLAVE = 0x8990 # enslave a device to the bond -SIOCBONDRELEASE = 0x8991 # release a slave from the bond -SIOCBONDSETHWADDR = 0x8992 # set the hw addr of the bond -SIOCBONDSLAVEINFOQUERY = 0x8993 # rtn info about slave state -SIOCBONDINFOQUERY = 0x8994 # rtn info about bond state -SIOCBONDCHANGEACTIVE = 0x8995 # update to a new active slave +#SIOCBONDENSLAVE = 0x8990 # enslave a device to the bond +#SIOCBONDRELEASE = 0x8991 # release a slave from the bond +#SIOCBONDSETHWADDR = 0x8992 # set the hw addr of the bond +#SIOCBONDSLAVEINFOQUERY = 0x8993 # rtn info about slave state +#SIOCBONDINFOQUERY = 0x8994 # rtn info about bond state +#SIOCBONDCHANGEACTIVE = 0x8995 # update to a new active slave # bridge calls -SIOCBRADDBR = 0x89a0 # create new bridge device -SIOCBRDELBR = 0x89a1 # remove bridge device -SIOCBRADDIF = 0x89a2 # add interface to bridge -SIOCBRDELIF = 0x89a3 # remove interface from bridge +#SIOCBRADDBR = 0x89a0 # create new bridge device +#SIOCBRDELBR = 0x89a1 # remove bridge device +#SIOCBRADDIF = 0x89a2 # add interface to bridge +#SIOCBRDELIF = 0x89a3 # remove interface from bridge # hardware time stamping: parameters in linux/net_tstamp.h -SIOCSHWTSTAMP = 0x89b0 # set and get config -SIOCGHWTSTAMP = 0x89b1 # get config \ No newline at end of file +#SIOCSHWTSTAMP = 0x89b0 # set and get config +#SIOCGHWTSTAMP = 0x89b1 # get config \ No newline at end of file diff --git a/pyric/net/wireless/__init__.py b/pyric/net/wireless/__init__.py index aab2c9f..9257c72 100644 --- a/pyric/net/wireless/__init__.py +++ b/pyric/net/wireless/__init__.py @@ -24,6 +24,7 @@ changes: o added nl80211_c to handle attribute policies - added nl80211_parse_freqs to parse out supported frequencies + """ __name__ = 'wireless' diff --git a/pyric/net/wireless/nl80211_c.py b/pyric/net/wireless/nl80211_c.py index e3eb9c1..219aa99 100644 --- a/pyric/net/wireless/nl80211_c.py +++ b/pyric/net/wireless/nl80211_c.py @@ -74,7 +74,6 @@ nl80211h.NL80211_ATTR_STA_SUPPORTED_RATES:nlh.NLA_UNSPEC, nl80211h.NL80211_ATTR_STA_PLINK_ACTION:nlh.NLA_U8, nl80211h.NL80211_ATTR_STA_VLAN:nlh.NLA_U32, - #nl80211h.NL80211_ATTR_MNTR_FLAGS:nlh.NLA_NESTED, nl80211h.NL80211_ATTR_MNTR_FLAGS:nlh.NLA_U32, # it seems to work by adding this attribute for each flag nl80211h.NL80211_ATTR_MESH_ID:nlh.NLA_UNSPEC, nl80211h.NL80211_ATTR_MPATH_NEXT_HOP:nlh.NLA_U32, diff --git a/pyric/net/wireless/nl80211_h.py b/pyric/net/wireless/nl80211_h.py index 7c6f4d7..89c65b2 100644 --- a/pyric/net/wireless/nl80211_h.py +++ b/pyric/net/wireless/nl80211_h.py @@ -3869,7 +3869,6 @@ def nl80211_coalesce_rule_support(max_rules,pat,max_delay): NL80211_CRIT_PROTO_DHCP = 1 NL80211_CRIT_PROTO_EAPOL = 2 NL80211_CRIT_PROTO_APIPA = 3 -# add other protocols before this one NUM_NL80211_CRIT_PROTO = 4 # maximum duration for critical protocol measures diff --git a/pyric/net/wireless/rfkill_h.py b/pyric/net/wireless/rfkill_h.py index 3c66b99..61a6a0c 100644 --- a/pyric/net/wireless/rfkill_h.py +++ b/pyric/net/wireless/rfkill_h.py @@ -47,6 +47,7 @@ - this may be due to bug in ubuntu and not present in other distros o rfkill does not do sanity checks on the index, rfkill.py will through error if the index does not exist + """ __name__ = 'rfkill_h' diff --git a/pyric/net/wireless/wlan.py b/pyric/net/wireless/wlan.py index ebc31ff..191a668 100644 --- a/pyric/net/wireless/wlan.py +++ b/pyric/net/wireless/wlan.py @@ -22,7 +22,6 @@ Definition of constants et al found in IEEE Std 802.11-2012 Std will refer to IEEE Std 802.11-2012 - """ __name__ = 'wlan' diff --git a/pyric/nlhelp/__init__.py b/pyric/nlhelp/__init__.py index 6b07387..d11f870 100644 --- a/pyric/nlhelp/__init__.py +++ b/pyric/nlhelp/__init__.py @@ -26,6 +26,7 @@ includes: attributes.help commands.help nlsearch 0.0.1 changes: o name changes + """ __name__ = 'nlhelp' diff --git a/pyric/nlhelp/attributes.help b/pyric/nlhelp/attributes.help index 52819f0..6ee25fd 100644 --- a/pyric/nlhelp/attributes.help +++ b/pyric/nlhelp/attributes.help @@ -1,4 +1,4 @@ -# attributes.help (stored in json format) +# attributes.help for nlsearch.py (stored in json format) # Automatically generated 2016-04-17T11:06:58.35097 from nl80211.h # Additions for kernel version 4 added 2016-06-25T15:18:00.0 diff --git a/pyric/nlhelp/commands.help b/pyric/nlhelp/commands.help index 2bd6099..9c6281b 100644 --- a/pyric/nlhelp/commands.help +++ b/pyric/nlhelp/commands.help @@ -1,4 +1,4 @@ -# commands.help (stored in json format) +# commands.help for nlsearch.py (stored in json format) # Automatically generated 2016-04-17T11:06:57.694132 from nl80211.h # Additions for kernel version 4 added 2016-06-29T03:50:00.0 diff --git a/pyric/nlhelp/nlsearch.py b/pyric/nlhelp/nlsearch.py index ae519f6..bed61e5 100644 --- a/pyric/nlhelp/nlsearch.py +++ b/pyric/nlhelp/nlsearch.py @@ -39,7 +39,7 @@ import pyric import pyric.net.wireless.nl80211_h as nl80211h -# where are we? +# get current working directory fpath = os.path.dirname(os.path.realpath(__file__)) # read in the files here diff --git a/pyric/pyw.py b/pyric/pyw.py index 4915680..82a4371 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -21,7 +21,7 @@ this software without specific prior written permission. Provides a python version of a subset of the iw command & additionally, a -smaller subset of ifconfig/iwconfig. +smaller subset of ifconfig, rfkill and macchanger. Each command/function (excluding interfaces & isinterface which do not rely on ioctl/netlink sockets) comes in two flavors - one-time & persistent. @@ -39,9 +39,9 @@ use a persistent netlink/ioctl socket. Socket creation & deletion are relatively fast however, if a program is repeatedly using pyw function(s) (such as a scanner that is changing channels mulitple times per second) it -makes sense for the caller to create a socket one time only & use the same -socket. However, if the caller is only using pyw periodically and/or does not -want to bothered with socket maintenance, the one-time flavor would be better. +makes sense for the caller to create one socket and use it throughout execution. +However, if the caller is only using pyw periodically and/or does not +want to bother with socket maintenance, the one-time flavor would be better. for one-time execution, for example use @@ -53,6 +53,10 @@ where nlsocket is created with libnl.nl_socket_alloc() +to create/delete sockets use the libraries alloc functions: + o ioctl: libio.io_socket_alloc() and libio.io_socket_free() + o netlink: libnl.nl_socket_alloc() and libnl.nl_socket_free() + NOTE: 1) All functions (excluding wireless core related) will use a Card object which collates the physical index, device name and interface index (ifindex) in a @@ -67,7 +71,7 @@ __name__ = 'pyw' __license__ = 'GPLv3' -__version__ = '0.1.9' +__version__ = '0.2.0' __date__ = 'August 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' @@ -129,34 +133,27 @@ def isinterface(dev): """ return dev in interfaces() -def winterfaces(*argv): +def winterfaces(iosock=None): """ retrieve all wireless interfaces (APX iwconfig) - :param argv: ioctl socket at argv[0] (or empty) + :param iosock: ioctl socket :returns: list of device names of current wireless NICs """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(winterfaces) + if iosock is None: return _iostub_(winterfaces) wifaces = [] for dev in interfaces(): - # no errors are caught here - but allowed to pass if iswireless(dev, iosock): wifaces.append(dev) return wifaces -def iswireless(dev, *argv): +def iswireless(dev, iosock=None): """ determines if given device is wireless (APX iwconfig ) :param dev: device name - :param argv: ioctl socket at argv[0] (or empty) + :param iosock: ioctl socket :returns: {True:device is wireless|False:device is not wireless/not present} """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(iswireless, dev) + if iosock is None: _iostub_(iswireless, dev) try: # if the call succeeds, dev is found to be wireless @@ -170,7 +167,10 @@ def iswireless(dev, *argv): else: raise pyric.error(e.errno) def phylist(): - """ :returns: a list of tuples t = (physical indexe, physical name) """ + """ + uses rfkill to return all phys of wireless devices + :returns: a list of tuples t = (physical index, physical name) + """ # we could walk the directory /sys/class/ieee80211 as well but we'll # let rfkill do it (just in case the above path differs across distros or # in future upgrades) @@ -181,16 +181,13 @@ def phylist(): phys.append((int(rfk.split('phy')[1]),rfk)) return phys -def regget(*argv): +def regget(nlsock=None): """ gets the current regulatory domain (iw reg get) - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: the two charactor regulatory domain """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(regget) + if nlsock is None: return _nlstub_(regget) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -202,19 +199,15 @@ def regget(*argv): raise pyric.error(e.errno, e.strerror) return nl.nla_find(rmsg, nl80211h.NL80211_ATTR_REG_ALPHA2) -def regset(rd, *argv): +def regset(rd, nlsock=None): """ REQUIRES ROOT PRIVILEGES sets the current regulatory domain (iw reg set ) :param rd: regulatory domain code - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket """ if len(rd) != 2: raise pyric.error(pyric.EINVAL, "Invalid reg. domain") - - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(regset, rd) + if nlsock is None: return _nlstub_(regset, rd) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -239,6 +232,7 @@ class Card(tuple): dev: device name idx: interface index (ifindex) """ + # noinspection PyInitNewSignature def __new__(cls, p, d, i): return super(Card, cls).__new__(cls, tuple((p, d, i))) def __repr__(self): @@ -250,31 +244,24 @@ def dev(self): return self[1] @property def idx(self): return self[2] -def getcard(dev, *argv): +def getcard(dev, nlsock=None): """ get the Card object from device name :param dev: device name - :param argv: netlink socket at argv[0] or empty + :param nlsock: netlink socket :returns: a Card with device name dev """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(getcard, dev) - + if nlsock is None: return _nlstub_(getcard, dev) return devinfo(dev, nlsock)['card'] -def validcard(card, *argv): +def validcard(card, nlsock=None): """ determines if card is still valid i.e. another program has not changed it :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: True if card is still valid, False otherwise """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(validcard, card) + if nlsock is None: return _nlstub_(validcard, card) try: return card == devinfo(card.dev, nlsock)['card'] @@ -286,17 +273,14 @@ def validcard(card, *argv): #### ADDRESS RELATED #### ################################################################################ -def macget(card, *argv): +def macget(card, iosock=None): """ gets the interface's hw address (APX ifconfig | grep HWaddr) :param card: Card object - :param argv: ioctl socket at argv[0] (or empty) + :param iosock: ioctl socket :returns: device mac after operation """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(macget, card) + if iosock is None: return _iostub_(macget, card) try: flag = sioch.SIOCGIFHWADDR @@ -313,28 +297,24 @@ def macget(card, *argv): except io.error as e: raise pyric.error(e.errno, e.strerror) -def macset(card, mac, *argv): +def macset(card, mac, iosock=None): """ REQUIRES ROOT PRIVILEGES/CARD DOWN set nic's hwaddr (ifconfig hw ether ) :param card: Card object :param mac: macaddr to set - :param argv: ioctl socket at argv[0] (or empty) - :returns: mac address after operation + :param iosock: ioctl socket + returns True on success, False otherwise """ if not _validmac_(mac): raise pyric.error(pyric.EINVAL, "Invalid mac address") - - try: - iosock = argv[0] - except IndexError: - return _iostub_(macset, card, mac) + if iosock is None: return _iostub_(macset, card, mac) try: flag = sioch.SIOCSIFHWADDR ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [mac])) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] if fam in [ifh.ARPHRD_ETHER, ifh.AF_UNSPEC, ifh.ARPHRD_IEEE80211_RADIOTAP]: - return _hex2mac_(ret[18:24]) + return _hex2mac_(ret[18:24]) == mac else: raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return hwaddr family") except AttributeError as e: @@ -344,17 +324,14 @@ def macset(card, mac, *argv): except io.error as e: raise pyric.error(e.errno, e.strerror) -def inetget(card, *argv): +def ifaddrget(card, iosock=None): """ get nic's ip, netmask and broadcast addresses :param card: Card object - :param argv: ioctl socket at argv[0] (or empty) - :returns: the tuple t = (ip4,netmask,broadcast) + :param iosock: ioctl socket + :returns: the tuple t = (inet,mask,bcast) """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(inetget, card) + if iosock is None: return _iostub_(ifaddrget, card) try: # ip @@ -362,7 +339,7 @@ def inetget(card, *argv): ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] if fam == ifh.AF_INET: - ip4 = _hex2ip4_(ret[20:24]) + inet = _hex2ip4_(ret[20:24]) else: raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return ip family") @@ -371,7 +348,7 @@ def inetget(card, *argv): ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] if fam == ifh.AF_INET: - netmask = _hex2ip4_(ret[20:24]) + mask = _hex2ip4_(ret[20:24]) else: raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return netmask family") @@ -380,7 +357,7 @@ def inetget(card, *argv): ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] if fam == ifh.AF_INET: - brdaddr = _hex2ip4_(ret[20:24]) + bcast = _hex2ip4_(ret[20:24]) else: raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return broadcast family") except AttributeError as e: @@ -393,20 +370,21 @@ def inetget(card, *argv): if e.errno == pyric.EADDRNOTAVAIL: return None, None, None raise pyric.error(e.errno, e.strerror) - return ip4, netmask, brdaddr + return inet, mask, bcast -def inetset(card, ipaddr, netmask, broadcast, *argv): +def ifaddrset(card, inet=None, mask=None, bcast=None, iosock=None): """ REQUIRES ROOT PRIVILEGES set nic's ip4 addr, netmask and/or broadcast - (ifconfig netmask broadcast ) + (ifconfig netmask broadcast ) can set ipaddr,netmask and/or broadcast to None but one or more of ipaddr, netmask, broadcast must be set :param card: Card object - :param ipaddr: ip address to set - :param netmask: netmask to set - :param broadcast: broadcast to set - :param argv: ioctl socket at argv[0] (or empty) + :param inet: ip address to set + :param mask: netmask to set + :param bcast: broadcast to set + :param iosock: ioctl socket + :returns: True on success, False otherwise NOTE: 1) throws error if setting netmask or broadcast and card does not have an ip assigned @@ -417,30 +395,27 @@ def inetset(card, ipaddr, netmask, broadcast, *argv): and broadcast = 10.0.0.31. """ # ensure one of params is set & that all set params are valid ip address - if not ipaddr and not netmask and not broadcast: + if not inet and not mask and not bcast: raise pyric.error(pyric.EINVAL, "No parameters specified") - if ipaddr and not _validip4_(ipaddr): - raise pyric.error(pyric.EINVAL, "Invalid ip4 address") - if netmask and not _validip4_(netmask): + if inet and not _validip4_(inet): + raise pyric.error(pyric.EINVAL, "Invalid IP address") + if mask and not _validip4_(mask): raise pyric.error(pyric.EINVAL, "Invalid netmask") - if broadcast and not _validip4_(broadcast): + if bcast and not _validip4_(bcast): raise pyric.error(pyric.EINVAL, "Invalid broadcast") + if iosock is None: return _iostub_(ifaddrset, card, inet, mask, bcast) try: - iosock = argv[0] - except IndexError: - return _iostub_(inetset, card, ipaddr, netmask, broadcast) - - # we have to do one at a time - try: - # ip address first - if ipaddr: ip4set(card, ipaddr, iosock) - if netmask: netmaskset(card, netmask, iosock) - if broadcast: broadcastset(card, broadcast, iosock) + success = True + # we have to do one at a time + if inet: success &= inetset(card, inet, iosock) + if mask: success &= maskset(card, mask, iosock) + if bcast: success &= bcastset(card, bcast, iosock) + return success except pyric.error as e: # an ambiguous error is thrown if attempting to set netmask or broadcast # without an ip address already set on the card - if not ipaddr and e.errno == pyric.EADDRNOTAVAIL: + if e.errno == pyric.EADDRNOTAVAIL and inet is None: raise pyric.error(pyric.EINVAL, "Set ip4 addr first") else: raise @@ -449,29 +424,25 @@ def inetset(card, ipaddr, netmask, broadcast, *argv): except struct.error as e: raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) -def ip4set(card, ipaddr, *argv): +def inetset(card, inet, iosock=None): """ REQUIRES ROOT PRIVILEGES - set nic's ip4 addr (ifconfig + set nic's ip4 addr (ifconfig :param card: Card object - :param ipaddr: ip address to set - :param argv: ioctl socket at argv[0] (or empty) - :returns: the new ip address + :param inet: ip address to set + :param iosock: ioctl socket + :returns: True on success, False otherwise NOTE: setting the ip will set netmask and broadcast accordingly """ - if not _validip4_(ipaddr): raise pyric.error(pyric.EINVAL, "Invalid ipaddr") - - try: - iosock = argv[0] - except IndexError: - return _iostub_(ip4set, card, ipaddr) + if not _validip4_(inet): raise pyric.error(pyric.EINVAL, "Invalid IP") + if iosock is None: return _iostub_(inetset, card, inet) try: flag = sioch.SIOCSIFADDR - ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [ipaddr])) + ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [inet])) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] if fam == ifh.AF_INET: - return _hex2ip4_(ipaddr) + return _hex2ip4_(ret[20:24]) == inet else: raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return ip family") except AttributeError as e: @@ -481,29 +452,25 @@ def ip4set(card, ipaddr, *argv): except io.error as e: raise pyric.error(e.errno, e.strerror) -def netmaskset(card, netmask, *argv): +def maskset(card, mask, iosock=None): """ REQUIRES ROOT PRIVILEGES set nic's ip4 netmask (ifconfig netmask :param card: Card object - :param netmask: netmask to set - :param argv: ioctl socket at argv[0] (or empty) - :returns: the new netmask + :param mask: netmask to set + :param iosock: ioctl socket + :returns: True on success, False otherwise NOTE: 1) throws error if netmask is set and card does not have an ip assigned """ - if not _validip4_(netmask): raise pyric.error(pyric.EINVAL, "Invalid netmask") - try: - iosock = argv[0] - except IndexError: - return _iostub_(netmaskset, card, netmask) - + if not _validip4_(mask): raise pyric.error(pyric.EINVAL, "Invalid netmask") + if iosock is None: return _iostub_(maskset, card, mask) try: - flag = sioch.SIOCGIFNETMASK - ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) + flag = sioch.SIOCSIFNETMASK + ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [mask])) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] if fam == ifh.AF_INET: - return _hex2ip4_(ret[20:24]) + return _hex2ip4_(ret[20:24]) == mask else: raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return netmask family") except AttributeError as e: @@ -518,33 +485,29 @@ def netmaskset(card, netmask, *argv): else: raise pyric.error(e, e.strerror) -def broadcastset(card, broadcast, *argv): +def bcastset(card, bcast, iosock=None): """ REQUIRES ROOT PRIVILEGES set nic's ip4 netmask (ifconfig broadcast :param card: Card object - :param broadcast: netmask to set - :param argv: ioctl socket at argv[0] (or empty) - :returns: the new broadcast address + :param bcast: netmask to set + :param iosock: ioctl socket + :returns: True on success, False otherwise NOTE: 1) throws error if netmask is set and card does not have an ip assigned 2) can set broadcast to erroneous values i.e. ipaddr = 192.168.1.2 and broadcast = 10.0.0.31. """ - if not _validip4_(broadcast): raise pyric.error(pyric.EINVAL, "Invalid bcast") - - try: - iosock = argv[0] - except IndexError: - return _iostub_(broadcastset, card, broadcast) + if not _validip4_(bcast): raise pyric.error(pyric.EINVAL, "Invalid bcast") + if iosock is None: return _iostub_(bcastset, card, bcast) # we have to do one at a time try: - flag = sioch.SIOCGIFBRDADDR - ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) + flag = sioch.SIOCSIFBRDADDR + ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [bcast])) fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] if fam == ifh.AF_INET: - return _hex2ip4_(ret[20:24]) + return _hex2ip4_(ret[20:24]) == bcast else: raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return broadcast family") except pyric.error as e: @@ -570,34 +533,28 @@ def broadcastset(card, broadcast, *argv): #### HARDWARE ON/OFF #### ################################################################################ -def isup(card, *argv): +def isup(card, iosock=None): """ determine on/off state of card :param card: Card object - :param argv: ioctl socet at argv[0] (or empty) + :param iosock: ioctl socket :returns: True if card is up, False otherwise """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(isup, card) + if iosock is None: return _iostub_(isup, card) try: return _issetf_(_flagsget_(card.dev, iosock), ifh.IFF_UP) except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") -def up(card, *argv): +def up(card, iosock=None): """ REQUIRES ROOT PRIVILEGES turns dev on (ifconfig up) :param card: Card object - :param argv: ioctl socket at argv[0] (or empty) + :param iosock: ioctl socket """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(up, card) + if iosock is None: return _iostub_(up, card) try: flags = _flagsget_(card.dev, iosock) @@ -606,17 +563,14 @@ def up(card, *argv): except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") -def down(card, *argv): +def down(card, iosock=None): """ REQUIRES ROOT PRIVILEGES turns def off (ifconfig down) :param card: Card object - :param argv: ioctl socket at argv[0] (or empty) + :param iosock: ioctl socket """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(down, card) + if iosock is None: return _iostub_(down, card) try: flags = _flagsget_(card.dev, iosock) @@ -664,17 +618,14 @@ def unblock(card): #### RADIO PROPERTIES #### ################################################################################ -def pwrsaveget(card, *argv): +def pwrsaveget(card, nlsock=None): """ returns card's power save state :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: True if power save is on, False otherwise """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(pwrsaveget, card) + if nlsock is None: return _nlstub_(pwrsaveget, card) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -690,19 +641,16 @@ def pwrsaveget(card, *argv): return nl.nla_find(rmsg, nl80211h.NL80211_ATTR_PS_STATE) == 1 -def pwrsaveset(card, on, *argv): +def pwrsaveset(card, on, nlsock=None): """ REQUIRES ROOT PRIVILEGES sets card's power save state :param card: Card object :param on: {True = on|False = off} - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket sets card's power save """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(pwrsaveset, card, on) + if nlsock is None: return _nlstub_(pwrsaveset, card, on) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -719,21 +667,17 @@ def pwrsaveset(card, on, *argv): except nl.error as e: raise pyric.error(e.errno, e.strerror) -def covclassget(card, *argv): +def covclassget(card, nlsock=None): """ gets the coverage class value :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: coverage class value """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(covclassget, card) - + if nlsock is None: return _nlstub_(covclassget, card) return phyinfo(card, nlsock)['cov_class'] -def covclassset(card, cc, *argv): +def covclassset(card, cc, nlsock=None): """ REQUIRES ROOT PRIVILEGES/DOES NOT WORK ON ALL SYSTEMS sets the coverage class. The coverage class IAW IEEE Std 802.11-2012 is @@ -741,7 +685,7 @@ def covclassset(card, cc, *argv): the BSS diamter :param card: Card object :param cc: coverage class 0 to 31 IAW IEEE Std 802.11-2012 Table 8-56 - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket sets card's coverage class """ if cc < wlan.COV_CLASS_MIN or cc > wlan.COV_CLASS_MAX: @@ -750,11 +694,7 @@ def covclassset(card, cc, *argv): emsg = "Cov class must be integer {0}-{1}".format(wlan.COV_CLASS_MIN, wlan.COV_CLASS_MAX) raise pyric.error(pyric.EINVAL, emsg) - - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(covclassset, card, cc) + if nlsock is None: return _nlstub_(covclassset, card, cc) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -771,29 +711,24 @@ def covclassset(card, cc, *argv): except nl.error as e: raise pyric.error(e.errno, e.strerror) -def retryshortget(card, *argv): +def retryshortget(card, nlsock=None): """ gets the short retry limit. :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket gets card's short retry """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(retryshortget, card) - + if nlsock is None: return _nlstub_(retryshortget, card) return phyinfo(card, nlsock)['retry_short'] -def retryshortset(card, lim, *argv): +def retryshortset(card, lim, nlsock=None): """ REQUIRES ROOT PRIVILEGES sets the short retry limit. :param card: Card object :param lim: max # of short retries 1 - 255 - :param argv: netlink socket at argv[0] (or empty) - NOTE: after moving to kernel 4, the kernel does not allow setting up to - the max + :param nlsock: netlink socket + NOTE: with kernel 4, the kernel does not allow setting up to the max """ if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: # this can work 'incorrectly' on non-int values but these will @@ -801,11 +736,7 @@ def retryshortset(card, lim, *argv): emsg = "Retry short must be integer {0}-{1}".format(wlan.RETRY_MIN, wlan.RETRY_MAX) raise pyric.error(pyric.EINVAL, emsg) - - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(retryshortset, card, lim) + if nlsock is None: return _nlstub_(retryshortset, card, lim) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -822,27 +753,23 @@ def retryshortset(card, lim, *argv): except nl.error as e: raise pyric.error(e.errno, e.strerror) -def retrylongget(card, *argv): +def retrylongget(card, nlsock=None): """ gets the long retry limit. :param card: Card object - :param argv: netlink socket at argv[0] (or empty) - gets card's long retry + :param nlsock: netlink socket + :returns: card's long retry """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(retrylongget, card) - + if nlsock is None: return _nlstub_(retrylongget, card) return phyinfo(card, nlsock)['retry_long'] -def retrylongset(card, lim, *argv): +def retrylongset(card, lim, nlsock=None): """ REQUIRES ROOT PRIVILEGES sets the long retry limit. :param card: Card object :param lim: max # of short retries 1 - 255 - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket NOTE: after moving to kernel 4, the kernel does not allow setting up to the max """ @@ -852,11 +779,7 @@ def retrylongset(card, lim, *argv): emsg = "Retry long must be integer {0}-{1}".format(wlan.RETRY_MIN, wlan.RETRY_MAX) raise pyric.error(pyric.EINVAL, emsg) - - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(retrylongset, card, lim) + if nlsock is None: return _nlstub_(retrylongset, card, lim) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -873,28 +796,24 @@ def retrylongset(card, lim, *argv): except nl.error as e: raise pyric.error(e.errno, e.strerror) -def rtsthreshget(card, *argv): +def rtsthreshget(card, nlsock=None): """ gets RTS Threshold :param card: Card Object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: RTS threshold """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(rtsthreshget, card) - + if nlsock is None: return _nlstub_(rtsthreshget, card) return phyinfo(card, nlsock)['rts_thresh'] -def rtsthreshset(card, thresh, *argv): +def rtsthreshset(card, thresh, nlsock=None): """ REQUIRES ROOT PRIVILEGES sets the RTS threshold. If off, RTS is disabled. If an integer, sets the smallest packet for which card will send an RTS prior to each transmission :param card: Card object :param thresh: rts threshold limit - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket sets the card's RTS threshold """ if thresh == 'off': thresh = wlan.RTS_THRESH_OFF @@ -903,11 +822,7 @@ def rtsthreshset(card, thresh, *argv): emsg = "Thresh must be 'off' or integer {0}-{1}".format(wlan.RTS_THRESH_MIN, wlan.RTS_THRESH_MAX) raise pyric.error(pyric.EINVAL, emsg) - - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(rtsthreshset, card, thresh) + if nlsock is None: return _nlstub_(rtsthreshset, card, thresh) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -924,28 +839,24 @@ def rtsthreshset(card, thresh, *argv): except nl.error as e: raise pyric.error(e.errno, e.strerror) -def fragthreshget(card, *argv): +def fragthreshget(card, nlsock=None): """ gets Fragmentation Threshold :param card: Card Object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: RTS threshold """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(fragthreshget, card) - + if nlsock is None: return _nlstub_(fragthreshget, card) return phyinfo(card, nlsock)['frag_thresh'] -def fragthreshset(card, thresh, *argv): +def fragthreshset(card, thresh, nlsock=None): """ REQUIRES ROOT PRIVILEGES sets the Frag threshold. If off, fragmentation is disabled. If an integer, sets the largest packet before the card will enable fragmentation :param card: Card object :param thresh: frag threshold limit in octets - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket sets the card's Fragmentation THRESH """ if thresh == 'off': thresh = wlan.FRAG_THRESH_OFF @@ -954,11 +865,7 @@ def fragthreshset(card, thresh, *argv): emsg = "Thresh must be 'off' or integer {0}-{1}".format(wlan.FRAG_THRESH_MIN, wlan.FRAG_THRESH_MAX) raise pyric.error(pyric.EINVAL, emsg) - - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(fragthreshset, card, thresh) + if nlsock is None: return _nlstub_(fragthreshset, card, thresh) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -977,17 +884,14 @@ def fragthreshset(card, thresh, *argv): #### INFO RELATED #### ################################################################################ -def devfreqs(card, *argv): +def devfreqs(card, nlsock=None): """ returns card's supported frequencies :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: list of supported frequencies """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(devfreqs, card) + if nlsock is None: return _nlstub_(devfreqs, card) rfs = [] pinfo = phyinfo(card, nlsock) @@ -996,31 +900,24 @@ def devfreqs(card, *argv): rfs = sorted(rfs) return rfs -def devchs(card, *argv): +def devchs(card, nlsock=None): """ returns card's supported channels :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: list of supported channels """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(devchs, card) - + if nlsock is None: return _nlstub_(devchs, card) return [channels.rf2ch(rf) for rf in devfreqs(card,nlsock)] -def devstds(card, *argv): +def devstds(card, nlsock=None): """ gets card's wireless standards (iwconfig | grep IEEE :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: list of standards (letter designators) """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(devstds, card) + if nlsock is None: return _nlstub_(devstds, card) stds = [] bands = phyinfo(card,nlsock)['bands'] @@ -1034,39 +931,31 @@ def devstds(card, *argv): if VHT: stds.append('ac') return stds -def devmodes(card, *argv): +def devmodes(card, nlsock=None): """ gets supported modes card can operate in :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: list of card's supported modes """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(devmodes, card) - + if nlsock is None: return _nlstub_(devmodes, card) return phyinfo(card, nlsock)['modes'] -def devcmds(card, *argv): +def devcmds(card, nlsock=None): """ get supported commands card can execute :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: supported commands """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(devcmds, card) - + if nlsock is None: return _nlstub_(devcmds, card) return phyinfo(card, nlsock)['commands'] -def ifinfo(card, *argv): +def ifinfo(card, iosock=None): """ get info for interface (ifconfig ) :param card: Card object - :param argv: ioctl socket at argv[0] (or empty) + :param iosock: ioctl socket :returns: dict with the following key:value pairs driver -> card's driver chipset -> card's chipset @@ -1076,10 +965,7 @@ def ifinfo(card, *argv): bcast -> card's broadcast address mask -> card's netmask address """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(ifinfo, card) + if iosock is None: return _iostub_(ifinfo, card) # get oui dict ouis = {} @@ -1091,7 +977,7 @@ def ifinfo(card, *argv): try: drvr, chips = hw.ifcard(card.dev) mac = macget(card, iosock) - ip4, nmask, bcast = inetget(card, iosock) + ip4, nmask, bcast = ifaddrget(card, iosock) info = {'driver':drvr, 'chipset':chips, 'hwaddr':mac, 'manufacturer':hw.manufacturer(ouis,mac), 'inet':ip4, 'bcast':bcast, 'mask':nmask} @@ -1100,11 +986,11 @@ def ifinfo(card, *argv): return info -def devinfo(card, *argv): +def devinfo(card, nlsock=None): """ get info for device (iw dev info) :param card: Card object or dev - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: dict with the following key:value pairs card -> Card(phy,dev,ifindex) mode -> i.e. monitor or managed @@ -1114,10 +1000,7 @@ def devinfo(card, *argv): CF (if assoicate) -> center frequency CHW -> channel width i.e. NOHT,HT40- etc """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(devinfo, card) + if nlsock is None: return _nlstub_(devinfo, card) dev = None # appease pycharm try: @@ -1169,11 +1052,11 @@ def devinfo(card, *argv): info['CHW'] = None return info -def phyinfo(card, *argv): +def phyinfo(card, nlsock=None): """ get info for phy (iw phy info) :param card: Card - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: dict with the following key:value pairs generation -> wiphy generation modes -> list of supported modes @@ -1193,10 +1076,7 @@ def phyinfo(card, *argv): commands -> supported commands ciphers -> supported ciphers """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(phyinfo, card) + if nlsock is None: return _nlstub_(phyinfo, card) # iw sends @NL80211_ATTR_SPLIT_WIPHY_DUMP, we don't & get full return at once try: @@ -1257,7 +1137,7 @@ def phyinfo(card, *argv): #### TX/RX RELATED #### ################################################################################ -def txset(card, setting, lvl, *argv): +def txset(card, setting, lvl, nlsock=None): """ ROOT Required sets cards tx power (iw phy card. * 100) @@ -1265,7 +1145,7 @@ def txset(card, setting, lvl, *argv): :param setting: power level setting oneof {'auto' = automatically determine transmit power|'limit' = limit power by |'fixed' = set to } :param lvl: desired tx power in dBm or None. NOTE: ignored if lvl is 'auto' - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: True on success NOTE: this does not work on my card(s) (nor does the corresponding iw command) @@ -1273,14 +1153,9 @@ def txset(card, setting, lvl, *argv): # sanity check on power setting and power level if not setting in TXPWRSETTINGS: raise pyric.error(pyric.EINVAL, "Invalid power setting {0}".format(setting)) - if setting != 'auto': - if lvl is None: - raise pyric.error(pyric.EINVAL, "Power level must be specified") - - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(txset, card, setting, lvl) + if setting != 'auto' and lvl is None: + raise pyric.error(pyric.EINVAL, "Power level must be specified") + if nlsock is None: return _nlstub_(txset, card, setting, lvl) try: setting = TXPWRSETTINGS.index(setting) @@ -1303,19 +1178,16 @@ def txset(card, setting, lvl, *argv): except nl.error as e: raise pyric.error(e.errno, e.strerror) -def txget(card, *argv): +def txget(card, iosock=None): """ gets card's transmission power (iwconfig | grep Tx-Power) :param card: Card object - :param argv: ioctl socket at argv[0] (or empty) + :param iosock: ioctl socket :returns: transmission power in dBm info can be found by cat /sys/kernel/debug/ieee80211/phy<#>/power but how valid is it? """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(txget, card) + if iosock is None: return _iostub_(txget, card) try: flag = sioch.SIOCGIWTXPOW @@ -1330,72 +1202,56 @@ def txget(card, *argv): except io.error as e: raise pyric.error(e.errno, e.strerror) -def chget(card, *argv): +def chget(card, nlsock=None): """ gets the current channel for device (iw dev info | grep channel) :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket NOTE: will only work if dev is associated w/ AP or device is in monitor mode and has had chset previously """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(chget, card) - - # rf2ch will return None if Card is not on a channel + if nlsock is None: return _nlstub_(chget, card) return channels.rf2ch(devinfo(card, nlsock)['RF']) -def chset(card, ch, chw=None, *argv): +def chset(card, ch, chw=None, nlsock=None): """ REQUIRES ROOT PRIVILEGES sets current channel on device (iw phy set channel ) :param card: Card object :param ch: channel number :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket NOTE: Can throw a device busy for several reason. 1) Card is down, 2) Another device is sharing the phy and wpa_supplicant/Network Manage is using it """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(chset, card, ch, chw) - + if nlsock is None: return _nlstub_(chset, card, ch, chw) return freqset(card, channels.ch2rf(ch), chw, nlsock) -def freqget(card, *argv): +def freqget(card, nlsock=None): """ gets the current frequency for device (iw dev info | grep channel) :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket NOTE: will only work if dev is associated w/ AP or device is in monitor mode and has had [ch|freq]set previously """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(chget, card) - + if nlsock is None: return _nlstub_(chget, card) return devinfo(card, nlsock)['RF'] -def freqset(card, rf, chw=None, *argv): +def freqset(card, rf, chw=None, nlsock = None): """ REQUIRES ROOT PRIVILEGES set the frequency and width :param card: Card object :param rf: frequency :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket NOTE: Can throw a device busy for several reason. 1) Card is down, 2) Another device is sharing the phy and wpa_supplicant/Network Manage is using it """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(freqset, card, rf, chw) + if nlsock is None: return _nlstub_(freqset, card, rf, chw) try: chw = channels.CHTYPES.index(chw) @@ -1417,21 +1273,17 @@ def freqset(card, rf, chw=None, *argv): #### INTERFACE & MODE RELATED #### -def modeget(card, *argv): +def modeget(card, nlsock=None): """ get current mode of card :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :return: """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(modeget, card) - + if nlsock is None: return _nlstub_(modeget, card) return devinfo(card, nlsock)['mode'] -def modeset(card, mode, flags=None, *argv): +def modeset(card, mode, flags=None, nlsock=None): """ REQUIRES ROOT PRIVILEGES/CARD DOWN sets card to mode (with optional flags if mode is monitor) @@ -1443,21 +1295,17 @@ def modeset(card, mode, flags=None, *argv): :param flags: list of monitor flags (can only be used if card is being set to monitor mode) neof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' |'cook'|'active'} - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket """ if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') + if flags and mode != 'monitor': + raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') if flags: - if mode != 'monitor': - raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') for flag in flags: if flag not in MNTRFLAGS: raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) else: flags = [] - - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(modeset, card, mode, flags) + if nlsock is None: return _nlstub_(modeset, card, mode, flags) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -1476,18 +1324,15 @@ def modeset(card, mode, flags=None, *argv): except nl.error as e: raise pyric.error(e.errno, e.strerror) -def ifaces(card, *argv): +def ifaces(card, nlsock=None): """ returns all interfaces sharing the same phy as card (APX iw dev | grep phy#) :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: a list of tuples t = (Card,mode) for each device having the same phyiscal index as that of card """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(ifaces, card) + if nlsock is None: return _nlstub_(ifaces, card) ifs = [] for dev in winterfaces(): @@ -1501,31 +1346,30 @@ def ifaces(card, *argv): raise pyric.error(e.errno, e.strerror) return ifs -def devset(card, ndev, *argv): +def devset(card, ndev, nlsock=None): """ REQUIRES ROOT PRIVILEGES changes card's dev to ndev :param card: Card object :param ndev: new dev name - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: the new card object - #NOTE: + NOTE: o via netlink one can set a new physical name but we want the ability to set a new dev. o this is not a true set name: it adds a new card with ndev as the dev then deletes the current card, returning the new card - - in effect, it will appear as if the card has a new name but, it will also + o in effect, it will appear as if the card has a new name but, it will also have a new ifindex """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(devset, card, ndev) + if nlsock is None: return _nlstub_(devset, card, ndev) new = None # appease PyCharm try: - new = devadd(card, ndev, modeget(card, nlsock), None, nlsock) + mode = modeget(card, nlsock) + phy = card.phy devdel(card, nlsock) + new = phyadd(phy, ndev, mode, None, nlsock) except pyric.error: # try and restore the system i.e. delete new if possible if new: @@ -1533,10 +1377,15 @@ def devset(card, ndev, *argv): devdel(new, nlsock) except pyric.error: pass + if not validcard(card): + try: + pass + except pyric.error: + pass raise return new -def devadd(card, vdev, mode, flags=None, *argv): +def devadd(card, vdev, mode, flags=None, nlsock=None): """ REQUIRES ROOT PRIVILEGES adds a virtual interface on device having type mode (iw dev @@ -1548,24 +1397,20 @@ def devadd(card, vdev, mode, flags=None, *argv): :param flags: list of monitor flags (can only be used if creating monitor mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' |'cook'|'active'} - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: the new Card NOTE: the new Card will be 'down' """ if iswireless(vdev): raise pyric.error(pyric.ENOTUNIQ,"{0} already exists".format(vdev)) if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') + if flags and mode != 'monitor': + raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') if flags: - if mode != 'monitor': - raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') for flag in flags: if flag not in MNTRFLAGS: raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) else: flags = [] - - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(devadd, card, vdev, mode, flags) + if nlsock is None: return _nlstub_(devadd, card, vdev, mode, flags) # if we have a Card, pull out ifindex try: @@ -1596,19 +1441,16 @@ def devadd(card, vdev, mode, flags=None, *argv): nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFNAME), nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) -def devdel(card, *argv): +def devdel(card, nlsock=None): """ REQUIRES ROOT PRIVILEGES deletes the device (dev del :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket NOTE: the original card is no longer valid (i.e. the phy will still be present but the device name and ifindex are no longer 'present' in the system """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(devdel, card) + if nlsock is None: return _nlstub_(devdel, card) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -1622,7 +1464,7 @@ def devdel(card, *argv): except nl.error as e: raise pyric.error(e.errno, e.strerror) -def phyadd(card, vdev, mode, flags=None, *argv): +def phyadd(card, vdev, mode, flags=None, nlsock=None): """ REQUIRES ROOT PRIVILEGES adds a virtual interface on device having type mode (iw phy @@ -1634,7 +1476,7 @@ def phyadd(card, vdev, mode, flags=None, *argv): :param flags: list of monitor flags (can only be used if creating monitor mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' |'cook'|'active'} - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: the new Card NOTE: the new Card will be 'down' """ @@ -1646,11 +1488,7 @@ def phyadd(card, vdev, mode, flags=None, *argv): if flag not in MNTRFLAGS: raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) else: flags = [] - - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(phyadd, card, vdev, mode, flags) + if nlsock is None: return _nlstub_(phyadd, card, vdev, mode, flags) # if we have a Card, pull out phy try: @@ -1685,21 +1523,16 @@ def phyadd(card, vdev, mode, flags=None, *argv): #### STA FUNCTIONS #### ################################################################################ -def isconnected(card, *argv): +def isconnected(card, nlsock=None): """ disconnect the card from an AP :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(isconnected, card) - - # dirty hack - using the precence of an RF to determine connected-ness + if nlsock is None: return _nlstub_(isconnected, card) return devinfo(card, nlsock)['RF'] is not None -def connect(card, ssid, bssid=None, rf=None, *argv): +def connect(card, ssid, bssid=None, rf=None, nlsock=None): """ REQUIRES ROOT PRIVILEGES & WPA_SUPPLICANT MUST BE DISABLED connects to (Open) AP @@ -1707,15 +1540,12 @@ def connect(card, ssid, bssid=None, rf=None, *argv): :param ssid: the SSID, network name :param bssid: the AP's BSSID :param rf: the frequency of the AP - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: True on successful connect, False otherwise - NOTE: although connected, traffic will not be route, card will not have + NOTE: although connected, traffic will not be routed, card will not have an IP assigned """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(connect, card, ssid, bssid, rf) + if nlsock is None: return _nlstub_(connect, card, ssid, bssid, rf) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -1726,26 +1556,22 @@ def connect(card, ssid, bssid=None, rf=None, *argv): nl.nla_put_unspec(msg, _mac2hex_(bssid), nl80211h.NL80211_ATTR_MAC) nl.nl_sendmsg(nlsock, msg) if not nl.nl_recvmsg(nlsock) == nlh.NLE_SUCCESS: return False - except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: raise pyric.error(e.errno, e.strerror) return True -def disconnect(card, *argv): +def disconnect(card, nlsock=None): """ REQUIRES ROOT PRIVILEGES disconnect the card from an AP :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket NOTE: does not return error if card is not connected. May not work if wpa_supplicant is running """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(disconnect, card) + if nlsock is None: return _nlstub_(disconnect, card) try: msg = nl.nlmsg_new(nltype=_familyid_(nlsock), @@ -1759,11 +1585,11 @@ def disconnect(card, *argv): except nl.error as e: raise pyric.error(e.errno, e.strerror) -def link(card, *argv): +def link(card, nlsock=None): """ returns info about link (iw dev card. link) :param card: Card object - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: link info as dict with the following key:value pairs bssid -> AP mac/ net BSSID ssid -> the ssid (Experimental) @@ -1788,10 +1614,7 @@ def link(card, *argv): NOTE: if the nested attribute was not parsed correctly will attempt to pull out as much as possible """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(link, card) + if nlsock is None: return _nlstub_(link, card) # if we're not connected GET_SCAN will dump scan results, we don't want that if not isconnected(card, nlsock): return None @@ -1880,12 +1703,12 @@ def link(card, *argv): return info -def stainfo(card, mac, *argv): +def stainfo(card, mac, nlsock=None): """ returns info about sta (AP) the card is associated with (iw dev card. link) :param card: Card object :param mac: mac address of STA - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket :returns: sta info as dict with the following key:value pairs rx-bytes: total received bytes (from STA) tx-bytes: total sent bytes (to STA) @@ -1904,10 +1727,7 @@ def stainfo(card, mac, *argv): - given msc index, guard interval and channel width, one can calculate the 802.11n rate (see wraith->standards->mcs) """ - try: - nlsock = argv[0] - except IndexError: - return _nlstub_(stainfo, card, mac) + if nlsock is None: return _nlstub_(stainfo, card, mac) # if we're not connected GET_SCAN will dump scan results, we don't want that if not isconnected(card, nlsock): return None @@ -2049,17 +1869,14 @@ def _unsetf_(flags, flag): """ return flags & ~flag -def _flagsget_(dev, *argv): +def _flagsget_(dev, iosock=None): """ gets the device's flags :param dev: device name: - :param argv: ioctl socket at argv[0] (or empty) + :param iosock: ioctl socket :returns: device flags """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(_flagsget_, dev) + if iosock is None: return _iostub_(_flagsget_, dev) try: flag = sioch.SIOCGIFFLAGS @@ -2072,18 +1889,15 @@ def _flagsget_(dev, *argv): except io.error as e: raise pyric.error(e.errno, e.strerror) -def _flagsset_(dev, flags, *argv): +def _flagsset_(dev, flags, iosock=None): """ gets the device's flags :param dev: device name: :param flags: flags to set - :param argv: ioctl socket at argv[0] (or empty) + :param iosock: ioctl socket :returns: device flags after operation """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(_flagsset_, dev, flags) + if iosock is None: return _iostub_(_flagsset_, dev, flags) try: flag = sioch.SIOCSIFFLAGS @@ -2325,18 +2139,15 @@ def _rateinfo_(ri): #### NETLINK/IOCTL PARAMETERS #### -def _ifindex_(dev, *argv): +def _ifindex_(dev, iosock=None): """ gets the ifindex for device :param dev: device name: - :param argv: ioctl socket at argv[0] (or empty) + :param iosock: ioctl socket :returns: ifindex of device NOTE: the ifindex can aslo be found in /sys/class/net//ifindex """ - try: - iosock = argv[0] - except IndexError: - return _iostub_(_ifindex_, dev) + if iosock is None: return _iostub_(_ifindex_, dev) try: flag = sioch.SIOCGIFINDEX @@ -2389,6 +2200,8 @@ def _iostub_(fct, *argv): try: argv = list(argv) + [iosock] return fct(*argv) + except io.error as e: + raise pyric.error(e.errno, pyric.strerror(e.errno)) except pyric.error: raise # catch and rethrow finally: @@ -2406,6 +2219,8 @@ def _nlstub_(fct, *argv): nlsock = nl.nl_socket_alloc(timeout=2) argv = list(argv) + [nlsock] return fct(*argv) + except nl.error as e: + raise pyric.error(e.errno, pyric.strerror(e.errno)) except pyric.error: raise finally: @@ -2413,29 +2228,31 @@ def _nlstub_(fct, *argv): #### PENDING #### -def _fut_chset(card, ch, chw, *argv): +def _fut_chset(card, ch, chw, nlsock=None): """ set current channel on device (iw phy set channel :param card: Card object :param ch: channel number :param chw: channel width oneof {None|'HT20'|'HT40-'|'HT40+'} - :param argv: netlink socket at argv[0] (or empty) + :param nlsock: netlink socket uses the newer NL80211_CMD_SET_CHANNEL vice iw's depecrated version which uses *_SET_WIPHY however, ATT does not work raise Errno 22 Invalid Argument NOTE: This only works for cards in monitor mode """ if ch not in channels.channels(): raise pyric.error(pyric.EINVAL, "Invalid channel") if chw not in channels.CHTYPES: raise pyric.error(pyric.EINVAL, "Invalid channel width") + if nlsock is None: return _nlstub_(_fut_chset, card, ch, chw) + try: - nlsock = argv[0] - except IndexError: - return _nlstub_(_fut_chset, card, ch, chw) - - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_CHANNEL, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) - nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) + msg = nl.nlmsg_new(nltype=_familyid_(nlsock), + cmd=nl80211h.NL80211_CMD_SET_CHANNEL, + flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) + nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) + nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) + nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) + nl.nl_sendmsg(nlsock, msg) + _ = nl.nl_recvmsg(nlsock) + except AttributeError: + raise pyric.error(pyric.EINVAL, "Invalid Card") + except nl.error as e: + raise pyric.error(e.errno, e.strerror) \ No newline at end of file diff --git a/pyric/utils/__init__.py b/pyric/utils/__init__.py index bedc290..bf3395d 100644 --- a/pyric/utils/__init__.py +++ b/pyric/utils/__init__.py @@ -26,6 +26,7 @@ o added mac address related to hardware.py o randhw does not force an ouis dict, if not present, randomly generates the oui and the ulm + """ __name__ = 'utils' diff --git a/pyric/utils/channels.py b/pyric/utils/channels.py index 63f4224..79a11f9 100644 --- a/pyric/utils/channels.py +++ b/pyric/utils/channels.py @@ -28,8 +28,8 @@ __name__ = 'channels' __license__ = 'GPLv3' -__version__ = '0.0.1' -__date__ = 'August 2014' +__version__ = '0.0.2' +__date__ = 'August 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' diff --git a/pyric/utils/hardware.py b/pyric/utils/hardware.py index 7872724..bc9502d 100644 --- a/pyric/utils/hardware.py +++ b/pyric/utils/hardware.py @@ -80,6 +80,7 @@ def randhw(ouis=None): def ifcard(dev): """ + get driver and chipset for dev :param dev: device name :returns: tuple t = (driver,chipset) """ @@ -88,6 +89,7 @@ def ifcard(dev): def ifdriver(dev): """ + get driver for dev :param dev: device name :returns: driver (or unknown) """ diff --git a/pyric/utils/ouifetch.py b/pyric/utils/ouifetch.py index 815d9d9..426d80e 100644 --- a/pyric/utils/ouifetch.py +++ b/pyric/utils/ouifetch.py @@ -36,12 +36,18 @@ try: # load urllib related for python 2 + # noinspection PyCompatibility from urllib2 import Request as url_request + # noinspection PyCompatibility from urllib2 import urlopen as url_open + # noinspection PyCompatibility from urllib2 import URLError as url_error except ImportError: + # noinspection PyCompatibility,PyUnresolvedReferences from urllib.request import Request as url_request + # noinspection PyCompatibility,PyUnresolvedReferences from urllib.request import urlopen as url_open + # noinspection PyUnresolvedReferences from urllib import error as url_error import os,sys,datetime,time import pyric diff --git a/pyric/utils/rfkill.py b/pyric/utils/rfkill.py index cbbb4bd..9156539 100644 --- a/pyric/utils/rfkill.py +++ b/pyric/utils/rfkill.py @@ -28,6 +28,7 @@ - this may be due to bug in ubuntu and not present in other distros o rfkill does not do sanity checks on the index, rfkill.py will through error if the index does not exist + """ __name__ = 'rfkill' diff --git a/setup.cfg b/setup.cfg index f008ff1..c4d6bc4 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,4 +1,4 @@ -# pip installation and distribution sudo pip install PyRIC +# pip installation and distribution to install type sudo pip install PyRIC [bdist_wheel] universal=1 \ No newline at end of file diff --git a/setup.py b/setup.py index 46f32d2..d9ccb6e 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -""" setup.py: install PyRIC +""" setup.py: install PyRIC v 0.1.6 Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) diff --git a/tests/pyw.unittest.py b/tests/pyw.unittest.py index 829f7ed..55300ed 100644 --- a/tests/pyw.unittest.py +++ b/tests/pyw.unittest.py @@ -23,7 +23,6 @@ OK - NOTE: 1) functions disconnect and link require a connection, they are tested/confirmed manually @@ -162,17 +161,17 @@ def test_invalidmacarg(self): # broadcastset class InetGetSetTestCase(CardTestCase): def test_inetgetset(self): - self.assertEquals(None,pyw.inetset(self.card,pri['ip'],pri['mask'],pri['bcast'])) - self.assertEqual(pri['ip'],pyw.inetget(self.card)[0]) + self.assertEquals(None,pyw.ifaddrset(self.card,pri['ip'],pri['mask'],pri['bcast'])) + self.assertEqual(pri['ip'],pyw.ifaddrget(self.card)[0]) def test_invalidcardarg(self): - self.assertRaises(error,pyw.inetget,'bad0') - self.assertRaises(error,pyw.inetset,'bad0',pri['ip'],pri['mask'],pri['bcast']) + self.assertRaises(error,pyw.ifaddrget,'bad0') + self.assertRaises(error,pyw.ifaddrset,'bad0',pri['ip'],pri['mask'],pri['bcast']) def test_invalidiparg(self): - self.assertRaises(error,pyw.inetset,self.card,'192.168',pri['mask'],pri['bcast']) + self.assertRaises(error,pyw.ifaddrset,self.card,'192.168',pri['mask'],pri['bcast']) def test_invalidmaskarg(self): - self.assertRaises(error,pyw.inetset,self.card,pri['ip'],'255.255',pri['bcast']) + self.assertRaises(error,pyw.ifaddrset,self.card,pri['ip'],'255.255',pri['bcast']) def test_invalidbcastarg(self): - self.assertRaises(error,pyw.inetset,self.card,pri['ip'],pri['mask'],'192.168') + self.assertRaises(error,pyw.ifaddrset,self.card,pri['ip'],pri['mask'],'192.168') # isup, test only card check class IsUpTestCase(CardTestCase): From 0944551a25185b741372af52d011352b23451adb Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sat, 3 Sep 2016 22:11:34 -0600 Subject: [PATCH 109/121] v0.1.6(.1) fixed error in iswireless --- CHANGES | 3 ++- README.md | 2 +- docs/PyRIC.pdf | Bin 508101 -> 508474 bytes docs/PyRIC.tex | 4 ++-- pyric/__init__.py | 4 ++-- pyric/pyw.py | 2 +- setup.py | 2 +- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index f808979..bf4a408 100644 --- a/CHANGES +++ b/CHANGES @@ -194,4 +194,5 @@ v 0.1.6 Continue with STA functionality - broadcastset to bcastset o adddres related functions mac and ifaddr return True on success, False otherwise o commented out constants in sockios_h that are not being used - - no significant change but will reduce bytecode size \ No newline at end of file + - no significant change but will reduce bytecode size + o fixed error in iswireless \ No newline at end of file diff --git a/README.md b/README.md index 108d1da..2acc92f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PyRIC 0.1.6: Python Radio Interface Controller +# PyRIC 0.1.6.1: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester ![](docs/logo.png?raw=true) diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 964aacbb0e462b199db07fee6cdc4202168a808f..9695bd265c4e568d4e27e048b72ff0d218aa76e0 100644 GIT binary patch delta 11059 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 h#VtJiC178{qrXUaAm4kzq{|~scH7x)D delta 10776 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 Bj0pe$ diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 3624d59..c49bbee 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -73,7 +73,7 @@ basicstyle=\footnotesize } -\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.6: User Manual} +\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.6.1: User Manual} \author{Dale V. Patterson\\ wraith.wireless@yandex.com} \begin{document} @@ -1121,7 +1121,7 @@ \subsection{Functions} \end{enumerate} \section{Copyright and License}\label{sec:copy} -PYRIC: Python Radio Interface Controller v0.1.6\\ +PYRIC: Python Radio Interface Controller v0.1.6.1\\ Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com)\\ diff --git a/pyric/__init__.py b/pyric/__init__.py index fe9943b..49a47dd 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -39,7 +39,7 @@ __name__ = 'pyric' __license__ = 'GPLv3' -__version__ = '0.1.6' +__version__ = '0.1.6.1' __date__ = 'August 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' @@ -84,7 +84,7 @@ def strerror(errno): # define long description long_desc = """ -# PyRIC 0.1.6: Python Radio Interface Controller +# PyRIC 0.1.6.1: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester ## DESCRIPTION: diff --git a/pyric/pyw.py b/pyric/pyw.py index 82a4371..bdd3490 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -153,7 +153,7 @@ def iswireless(dev, iosock=None): :param iosock: ioctl socket :returns: {True:device is wireless|False:device is not wireless/not present} """ - if iosock is None: _iostub_(iswireless, dev) + if iosock is None: return _iostub_(iswireless, dev) try: # if the call succeeds, dev is found to be wireless diff --git a/setup.py b/setup.py index d9ccb6e..b608caf 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -""" setup.py: install PyRIC v 0.1.6 +""" setup.py: install PyRIC v 0.1.6.1 Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) From 2933efb36f573b2fe011bf77e1f6407971e35c56 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sat, 3 Sep 2016 22:21:29 -0600 Subject: [PATCH 110/121] v0.1.6(.1) fixed error in iswireless --- CHANGES | 2 +- README.md | 2 +- docs/PyRIC.tex | 2 +- pyric/__init__.py | 8 ++++---- pyric/pyw.py | 1 + setup.py | 1 - 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index bf4a408..cf18be3 100644 --- a/CHANGES +++ b/CHANGES @@ -195,4 +195,4 @@ v 0.1.6 Continue with STA functionality o adddres related functions mac and ifaddr return True on success, False otherwise o commented out constants in sockios_h that are not being used - no significant change but will reduce bytecode size - o fixed error in iswireless \ No newline at end of file + o fixed error in iswireless (referenced in wifiphisher #329) \ No newline at end of file diff --git a/README.md b/README.md index 2acc92f..6db1bce 100644 --- a/README.md +++ b/README.md @@ -867,4 +867,4 @@ with (-) are not included in pip installs or PyPI downloads * \_\_init\_\_.py initialize nlhelp subpackage * nsearch.py nl80211 search * commands.help nl80211 commands help data - * attributes.help nl80211 attributes help data \ No newline at end of file + * attributes.help nl80211 attributes help data diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index c49bbee..73f41f9 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -20,7 +20,7 @@ % __name__ = 'User Guide' %__license__ = 'GPLv3' %__version__ = '0.0.6' -%__date__ = 'August 2016' +%__date__ = 'September 2016' %__author__ = 'Dale Patterson' %__maintainer__ = 'Dale Patterson' %__email__ = 'wraith.wireless@yandex.com' diff --git a/pyric/__init__.py b/pyric/__init__.py index 49a47dd..b896dbe 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -40,7 +40,7 @@ __name__ = 'pyric' __license__ = 'GPLv3' __version__ = '0.1.6.1' -__date__ = 'August 2016' +__date__ = 'September 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' @@ -92,9 +92,9 @@ def strerror(errno): ability to identify, enumerate and manipulate their system's wireless cards programmatically in Python. Pentesting applications and scripts written in Python have increased dramatically in recent years. However, these tools still rely on -Linux command lines tools to setup and prepare and restore the system for use. -Until now. Why use subprocess.Popen, regular expressions and str.find to interact -with your wireless cards? PyRIC is: +Linux command lines tools for setup/preparation and restoration of the system for +use. Until now. Why use subprocess.Popen, regular expressions and str.find to +interact with your wireless cards? PyRIC is: 1. Pythonic: no ctypes, SWIG etc. PyRIC redefines C header files as Python and uses sockets to communicate with the kernel. diff --git a/pyric/pyw.py b/pyric/pyw.py index bdd3490..6ef90b4 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -67,6 +67,7 @@ devadd which will accept a Card or a phy 2) All functions allow pyric errors to pass through. Callers must catch these if they desire + """ __name__ = 'pyw' diff --git a/setup.py b/setup.py index b608caf..2fca1a6 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,6 @@ software without specific prior written permission. sudo pip install PyRIC - """ #__name__ = 'setup' From 2966251a109f73eae960e612fc9b9eda19f02f8d Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Fri, 16 Sep 2016 09:08:20 -0600 Subject: [PATCH 111/121] v0.1.6(.2) line 167/168 in pyw --- README.md | 2 +- TODO | 3 ++- docs/PyRIC.pdf | Bin 508474 -> 508537 bytes docs/PyRIC.tex | 4 ++-- pyric/__init__.py | 4 ++-- pyric/pyw.py | 4 +--- setup.py | 2 +- 7 files changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 6db1bce..ec41ab8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PyRIC 0.1.6.1: Python Radio Interface Controller +# PyRIC 0.1.6.2: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester ![](docs/logo.png?raw=true) diff --git a/TODO b/TODO index aa5b527..95ee978 100644 --- a/TODO +++ b/TODO @@ -21,4 +21,5 @@ 31) add VHT processing to sta_info bitrate 39) parsing wiphy_bands (should we add the below?) o _HT_MCS_SET: a 16-bit attr containing the MCS set as defined in 802.11n - o _HT_CAPA: as in the HT information IE \ No newline at end of file + o _HT_CAPA: as in the HT information IE + diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 9695bd265c4e568d4e27e048b72ff0d218aa76e0..f569f8bd6e2b311048fcef021bd4442e45d7333e 100644 GIT binary patch delta 9750 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 diff --git a/docs/PyRIC.tex b/docs/PyRIC.tex index 73f41f9..d79b188 100644 --- a/docs/PyRIC.tex +++ b/docs/PyRIC.tex @@ -73,7 +73,7 @@ basicstyle=\footnotesize } -\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.6.1: User Manual} +\title{\includegraphics[scale=1]{logo}\\ PyRIC v0.1.6.2: User Manual} \author{Dale V. Patterson\\ wraith.wireless@yandex.com} \begin{document} @@ -1121,7 +1121,7 @@ \subsection{Functions} \end{enumerate} \section{Copyright and License}\label{sec:copy} -PYRIC: Python Radio Interface Controller v0.1.6.1\\ +PYRIC: Python Radio Interface Controller v0.1.6.2\\ Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com)\\ diff --git a/pyric/__init__.py b/pyric/__init__.py index b896dbe..f5d0fab 100644 --- a/pyric/__init__.py +++ b/pyric/__init__.py @@ -39,7 +39,7 @@ __name__ = 'pyric' __license__ = 'GPLv3' -__version__ = '0.1.6.1' +__version__ = '0.1.6.2' __date__ = 'September 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' @@ -84,7 +84,7 @@ def strerror(errno): # define long description long_desc = """ -# PyRIC 0.1.6.1: Python Radio Interface Controller +# PyRIC 0.1.6.2: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester ## DESCRIPTION: diff --git a/pyric/pyw.py b/pyric/pyw.py index 6ef90b4..2b29513 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -163,9 +163,7 @@ def iswireless(dev, iosock=None): except AttributeError as e: raise pyric.error(pyric.EINVAL, e) except io.error as e: - # ENODEV or ENOTSUPP means not wireless, reraise any others - if e.errno == pyric.ENODEV or e.errno == pyric.EOPNOTSUPP: return False - else: raise pyric.error(e.errno) + return False def phylist(): """ diff --git a/setup.py b/setup.py index 2fca1a6..78f1be4 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -""" setup.py: install PyRIC v 0.1.6.1 +""" setup.py: install PyRIC v 0.1.6.2 Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) From 601741a70a7600424f6d103e2be34cde70c0ff3f Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 13 Nov 2016 03:09:24 -0700 Subject: [PATCH 112/121] v0.1.6(.2) fixed README.doc Issue #25 --- README.md | 2 +- pyric/pyw.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ec41ab8..7622487 100644 --- a/README.md +++ b/README.md @@ -208,7 +208,7 @@ False ['wlan0'] >>> pyw.isinterface('eth0') # check eth0 for wireless False ->>> pyw.iswinterface('wlan0') +>>> pyw.iswireless('wlan0') True >>> pyw.phylist() # list all current phys (Note device ASW phy1) [(1,'phy1), (0, 'phy0')] diff --git a/pyric/pyw.py b/pyric/pyw.py index 2b29513..1c70a23 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -162,7 +162,7 @@ def iswireless(dev, iosock=None): return True except AttributeError as e: raise pyric.error(pyric.EINVAL, e) - except io.error as e: + except io.error: return False def phylist(): From 26cda36e3348731e7ac87482fcc080edec9af5b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20R=C3=B6sler?= Date: Thu, 17 Nov 2016 21:11:28 +0100 Subject: [PATCH 113/121] make PyRIC uasable for openwrt without rfkill --- pyric/pyw.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/pyric/pyw.py b/pyric/pyw.py index 1c70a23..44fd599 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -95,6 +95,7 @@ import pyric.net.sockios_h as sioch # sockios constants import pyric.net.if_h as ifh # ifreq structure import pyric.lib.libio as io # ioctl (library) functions +import os _FAM80211ID_ = None @@ -174,9 +175,18 @@ def phylist(): # let rfkill do it (just in case the above path differs across distros or # in future upgrades) phys = [] - rfdevs = rfkill.rfkill_list() - for rfk in rfdevs: - if rfdevs[rfk]['type'] == 'wlan': + try: + rfdevs = rfkill.rfkill_list() + for rfk in rfdevs: + if rfdevs[rfk]['type'] == 'wlan': + phys.append((int(rfk.split('phy')[1]),rfk)) + except IOError as error: + #catch 'No such file or directory' errors, caused by + #missing rfkill + if error.errno != 2: + raise + rfdevs = os.listdir("/sys/class/ieee80211") + for rfk in rfdevs: phys.append((int(rfk.split('phy')[1]),rfk)) return phys @@ -2254,4 +2264,4 @@ def _fut_chset(card, ch, chw, nlsock=None): except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: - raise pyric.error(e.errno, e.strerror) \ No newline at end of file + raise pyric.error(e.errno, e.strerror) From ef31e9e1799a0f07fe8fbc03c1a898677f09a505 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 4 Dec 2016 00:18:11 -0700 Subject: [PATCH 114/121] v0.1.6(.2) fixed phylist fail on OpenWRT devices see Pull Request #26 --- CHANGES | 3 ++- pyric/pyw.py | 18 ++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index cf18be3..3447ae7 100644 --- a/CHANGES +++ b/CHANGES @@ -195,4 +195,5 @@ v 0.1.6 Continue with STA functionality o adddres related functions mac and ifaddr return True on success, False otherwise o commented out constants in sockios_h that are not being used - no significant change but will reduce bytecode size - o fixed error in iswireless (referenced in wifiphisher #329) \ No newline at end of file + o fixed error in iswireless (referenced in wifiphisher #329) + o fixed phylist failure for OpenWRT as pointed out by sarom5 \ No newline at end of file diff --git a/pyric/pyw.py b/pyric/pyw.py index 44fd599..1dd267c 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -80,6 +80,7 @@ __status__ = 'Production' import struct # ioctl unpacking +import os # for listdir import re # check addr validity import pyric # pyric exception from pyric.nlhelp.nlsearch import cmdbynum # get command name @@ -95,7 +96,6 @@ import pyric.net.sockios_h as sioch # sockios constants import pyric.net.if_h as ifh # ifreq structure import pyric.lib.libio as io # ioctl (library) functions -import os _FAM80211ID_ = None @@ -171,7 +171,8 @@ def phylist(): uses rfkill to return all phys of wireless devices :returns: a list of tuples t = (physical index, physical name) """ - # we could walk the directory /sys/class/ieee80211 as well but we'll + # Some devices like OpenWRT do not have rfkill support - in the event of + # a rfkill error, fall back to reading the /sys/class/ieee80211 dir otherwise # let rfkill do it (just in case the above path differs across distros or # in future upgrades) phys = [] @@ -179,15 +180,12 @@ def phylist(): rfdevs = rfkill.rfkill_list() for rfk in rfdevs: if rfdevs[rfk]['type'] == 'wlan': - phys.append((int(rfk.split('phy')[1]),rfk)) - except IOError as error: - #catch 'No such file or directory' errors, caused by - #missing rfkill - if error.errno != 2: - raise + phys.append((int(rfk.split('phy')[1]), rfk)) + except IOError as e: + if e.errno != 2: raise pyric.error(e.errno, e.strerror) rfdevs = os.listdir("/sys/class/ieee80211") for rfk in rfdevs: - phys.append((int(rfk.split('phy')[1]),rfk)) + phys.append((int(rfk.split('phy')[1]), rfk)) return phys def regget(nlsock=None): @@ -2264,4 +2262,4 @@ def _fut_chset(card, ch, chw, nlsock=None): except AttributeError: raise pyric.error(pyric.EINVAL, "Invalid Card") except nl.error as e: - raise pyric.error(e.errno, e.strerror) + raise pyric.error(e.errno, e.strerror) \ No newline at end of file From 253a85fed4f43f1f896ebf4848c3df463d6999e7 Mon Sep 17 00:00:00 2001 From: Wraith Wireless Date: Sun, 4 Dec 2016 00:21:30 -0700 Subject: [PATCH 115/121] Delete pyw.py --- pyric/pyw.py | 2267 -------------------------------------------------- 1 file changed, 2267 deletions(-) delete mode 100644 pyric/pyw.py diff --git a/pyric/pyw.py b/pyric/pyw.py deleted file mode 100644 index 44fd599..0000000 --- a/pyric/pyw.py +++ /dev/null @@ -1,2267 +0,0 @@ -#!/usr/bin/env python - -""" pyw.py: Linux wireless library for the Python Wireless Developer and Pentester - -Copyright (C) 2016 Dale V. Patterson (wraith.wireless@yandex.com) - -This program is free software: you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation, either version 3 of the License, or (at your option) any later -version. - -Redistribution and use in source and binary forms, with or without -modifications, are permitted provided that the following conditions are met: - o Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - o Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - o Neither the name of the orginal author Dale V. Patterson nor the names of - any contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -Provides a python version of a subset of the iw command & additionally, a -smaller subset of ifconfig, rfkill and macchanger. - -Each command/function (excluding interfaces & isinterface which do not rely on -ioctl/netlink sockets) comes in two flavors - one-time & persistent. - 1) one-time: similar to iw. The command, creates the netlink socket - (or ioctl), composes the message, sends the message & receives the - response, parses the results, closes the socket & returns the results to - the caller. At no time does the caller need to be aware of any underlying - netlink processes or structures. - 2) persistent: communication & parsing only. The onus of socket creation and - deletion is on the caller which allows them to create one (or more) - socket(s). The pyw functions will only handle message construction, message - sending and receiving & message parsing. - -Callers that intend to use pyw functionality often & repeatedly may prefer to -use a persistent netlink/ioctl socket. Socket creation & deletion are -relatively fast however, if a program is repeatedly using pyw function(s) -(such as a scanner that is changing channels mulitple times per second) it -makes sense for the caller to create one socket and use it throughout execution. -However, if the caller is only using pyw periodically and/or does not -want to bother with socket maintenance, the one-time flavor would be better. - -for one-time execution, for example use - -regset('US') - -for persistent execution, use - -regset('US',nlsocket) - -where nlsocket is created with libnl.nl_socket_alloc() - -to create/delete sockets use the libraries alloc functions: - o ioctl: libio.io_socket_alloc() and libio.io_socket_free() - o netlink: libnl.nl_socket_alloc() and libnl.nl_socket_free() - -NOTE: - 1) All functions (excluding wireless core related) will use a Card object which - collates the physical index, device name and interface index (ifindex) in a - tuple rather than a device name or physical index or ifindex as this will not - require the caller to remember if a dev or a phy or a ifindex is needed. The - Exceptions to this are: - devinfo which will accept a Card or a dev - devadd which will accept a Card or a phy - 2) All functions allow pyric errors to pass through. Callers must catch these - if they desire - -""" - -__name__ = 'pyw' -__license__ = 'GPLv3' -__version__ = '0.2.0' -__date__ = 'August 2016' -__author__ = 'Dale Patterson' -__maintainer__ = 'Dale Patterson' -__email__ = 'wraith.wireless@yandex.com' -__status__ = 'Production' - -import struct # ioctl unpacking -import re # check addr validity -import pyric # pyric exception -from pyric.nlhelp.nlsearch import cmdbynum # get command name -import pyric.utils.channels as channels # channel related -import pyric.utils.rfkill as rfkill # block/unblock -import pyric.utils.hardware as hw # device related -import pyric.utils.ouifetch as ouifetch # get oui dict -import pyric.net.netlink_h as nlh # netlink definition -import pyric.net.genetlink_h as genlh # genetlink definition -import pyric.net.wireless.nl80211_h as nl80211h # nl80211 definition -import pyric.lib.libnl as nl # netlink (library) functions -import pyric.net.wireless.wlan as wlan # IEEE 802.11 Std definition -import pyric.net.sockios_h as sioch # sockios constants -import pyric.net.if_h as ifh # ifreq structure -import pyric.lib.libio as io # ioctl (library) functions -import os - -_FAM80211ID_ = None - -# redefine some nl80211 enum lists for ease of use -IFTYPES = nl80211h.NL80211_IFTYPES -MNTRFLAGS = nl80211h.NL80211_MNTR_FLAGS -TXPWRSETTINGS = nl80211h.NL80211_TX_POWER_SETTINGS - -################################################################################ -#### WIRELESS CORE #### -################################################################################ - -def interfaces(): - """ - retrieves all network interfaces (APX ifconfig) - :returns: a list of device names of current network interfaces cards - """ - fin = None - try: - # read in devices from /proc/net/dev. After splitting on newlines, the - # first 2 lines are headers and the last line is empty so we remove them - fin = open(hw.dpath, 'r') - ds = fin.read().split('\n')[2:-1] - except IOError: - return [] - finally: - if fin: fin.close() - - # the remaining lines are : p1 p2 ... p3, split on ':' & strip whitespace - return [d.split(':')[0].strip() for d in ds] - -def isinterface(dev): - """ - determines if device name belongs to a network card (APX ifconfig ) - :param dev: device name - :returns: {True if dev is a device|False otherwise} - """ - return dev in interfaces() - -def winterfaces(iosock=None): - """ - retrieve all wireless interfaces (APX iwconfig) - :param iosock: ioctl socket - :returns: list of device names of current wireless NICs - """ - if iosock is None: return _iostub_(winterfaces) - - wifaces = [] - for dev in interfaces(): - if iswireless(dev, iosock): wifaces.append(dev) - return wifaces - -def iswireless(dev, iosock=None): - """ - determines if given device is wireless (APX iwconfig ) - :param dev: device name - :param iosock: ioctl socket - :returns: {True:device is wireless|False:device is not wireless/not present} - """ - if iosock is None: return _iostub_(iswireless, dev) - - try: - # if the call succeeds, dev is found to be wireless - _ = io.io_transfer(iosock, sioch.SIOCGIWNAME, ifh.ifreq(dev)) - return True - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except io.error: - return False - -def phylist(): - """ - uses rfkill to return all phys of wireless devices - :returns: a list of tuples t = (physical index, physical name) - """ - # we could walk the directory /sys/class/ieee80211 as well but we'll - # let rfkill do it (just in case the above path differs across distros or - # in future upgrades) - phys = [] - try: - rfdevs = rfkill.rfkill_list() - for rfk in rfdevs: - if rfdevs[rfk]['type'] == 'wlan': - phys.append((int(rfk.split('phy')[1]),rfk)) - except IOError as error: - #catch 'No such file or directory' errors, caused by - #missing rfkill - if error.errno != 2: - raise - rfdevs = os.listdir("/sys/class/ieee80211") - for rfk in rfdevs: - phys.append((int(rfk.split('phy')[1]),rfk)) - return phys - -def regget(nlsock=None): - """ - gets the current regulatory domain (iw reg get) - :param nlsock: netlink socket - :returns: the two charactor regulatory domain - """ - if nlsock is None: return _nlstub_(regget) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_GET_REG, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - return nl.nla_find(rmsg, nl80211h.NL80211_ATTR_REG_ALPHA2) - -def regset(rd, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES - sets the current regulatory domain (iw reg set ) - :param rd: regulatory domain code - :param nlsock: netlink socket - """ - if len(rd) != 2: raise pyric.error(pyric.EINVAL, "Invalid reg. domain") - if nlsock is None: return _nlstub_(regset, rd) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_REQ_SET_REG, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_string(msg, rd.upper(), nl80211h.NL80211_ATTR_REG_ALPHA2) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - -################################################################################ -#### CARD RELATED #### -################################################################################ - -class Card(tuple): - """ - A wireless network interface controller - Wrapper around a tuple - t = (physical index,device name, interface index) - Exposes the following properties: (callable by '.'): - phy: physical index - dev: device name - idx: interface index (ifindex) - """ - # noinspection PyInitNewSignature - def __new__(cls, p, d, i): - return super(Card, cls).__new__(cls, tuple((p, d, i))) - def __repr__(self): - return "Card(phy={0},dev={1},ifindex={2})".format(self.phy,self.dev,self.idx) - @property - def phy(self): return self[0] - @property - def dev(self): return self[1] - @property - def idx(self): return self[2] - -def getcard(dev, nlsock=None): - """ - get the Card object from device name - :param dev: device name - :param nlsock: netlink socket - :returns: a Card with device name dev - """ - if nlsock is None: return _nlstub_(getcard, dev) - return devinfo(dev, nlsock)['card'] - -def validcard(card, nlsock=None): - """ - determines if card is still valid i.e. another program has not changed it - :param card: Card object - :param nlsock: netlink socket - :returns: True if card is still valid, False otherwise - """ - if nlsock is None: return _nlstub_(validcard, card) - - try: - return card == devinfo(card.dev, nlsock)['card'] - except pyric.error as e: - if e.errno == pyric.ENODEV: return False - else: raise - -################################################################################ -#### ADDRESS RELATED #### -################################################################################ - -def macget(card, iosock=None): - """ - gets the interface's hw address (APX ifconfig | grep HWaddr) - :param card: Card object - :param iosock: ioctl socket - :returns: device mac after operation - """ - if iosock is None: return _iostub_(macget, card) - - try: - flag = sioch.SIOCGIFHWADDR - ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) - fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam in [ifh.ARPHRD_ETHER, ifh.AF_UNSPEC,ifh.ARPHRD_IEEE80211_RADIOTAP]: - return _hex2mac_(ret[18:24]) - else: - raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return hwaddr family") - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - except io.error as e: - raise pyric.error(e.errno, e.strerror) - -def macset(card, mac, iosock=None): - """ - REQUIRES ROOT PRIVILEGES/CARD DOWN - set nic's hwaddr (ifconfig hw ether ) - :param card: Card object - :param mac: macaddr to set - :param iosock: ioctl socket - returns True on success, False otherwise - """ - if not _validmac_(mac): raise pyric.error(pyric.EINVAL, "Invalid mac address") - if iosock is None: return _iostub_(macset, card, mac) - - try: - flag = sioch.SIOCSIFHWADDR - ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [mac])) - fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam in [ifh.ARPHRD_ETHER, ifh.AF_UNSPEC, ifh.ARPHRD_IEEE80211_RADIOTAP]: - return _hex2mac_(ret[18:24]) == mac - else: - raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return hwaddr family") - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - except io.error as e: - raise pyric.error(e.errno, e.strerror) - -def ifaddrget(card, iosock=None): - """ - get nic's ip, netmask and broadcast addresses - :param card: Card object - :param iosock: ioctl socket - :returns: the tuple t = (inet,mask,bcast) - """ - if iosock is None: return _iostub_(ifaddrget, card) - - try: - # ip - flag = sioch.SIOCGIFADDR - ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) - fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam == ifh.AF_INET: - inet = _hex2ip4_(ret[20:24]) - else: - raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return ip family") - - # netmask - flag = sioch.SIOCGIFNETMASK - ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) - fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam == ifh.AF_INET: - mask = _hex2ip4_(ret[20:24]) - else: - raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return netmask family") - - # broadcast - flag = sioch.SIOCGIFBRDADDR - ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) - fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam == ifh.AF_INET: - bcast = _hex2ip4_(ret[20:24]) - else: - raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return broadcast family") - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - except io.error as e: - # catch address not available, which means the card currently does not - # have any addresses set - raise others - if e.errno == pyric.EADDRNOTAVAIL: return None, None, None - raise pyric.error(e.errno, e.strerror) - - return inet, mask, bcast - -def ifaddrset(card, inet=None, mask=None, bcast=None, iosock=None): - """ - REQUIRES ROOT PRIVILEGES - set nic's ip4 addr, netmask and/or broadcast - (ifconfig netmask broadcast ) - can set ipaddr,netmask and/or broadcast to None but one or more of ipaddr, - netmask, broadcast must be set - :param card: Card object - :param inet: ip address to set - :param mask: netmask to set - :param bcast: broadcast to set - :param iosock: ioctl socket - :returns: True on success, False otherwise - NOTE: - 1) throws error if setting netmask or broadcast and card does not have - an ip assigned - 2) if setting only the ip address, netmask and broadcast will be set - accordingly by the kernel. - 3) If setting multiple or setting the netmask and/or broadcast after the ip - is assigned, one can set them to erroneous values i.e. ip = 192.168.1.2 - and broadcast = 10.0.0.31. - """ - # ensure one of params is set & that all set params are valid ip address - if not inet and not mask and not bcast: - raise pyric.error(pyric.EINVAL, "No parameters specified") - if inet and not _validip4_(inet): - raise pyric.error(pyric.EINVAL, "Invalid IP address") - if mask and not _validip4_(mask): - raise pyric.error(pyric.EINVAL, "Invalid netmask") - if bcast and not _validip4_(bcast): - raise pyric.error(pyric.EINVAL, "Invalid broadcast") - if iosock is None: return _iostub_(ifaddrset, card, inet, mask, bcast) - - try: - success = True - # we have to do one at a time - if inet: success &= inetset(card, inet, iosock) - if mask: success &= maskset(card, mask, iosock) - if bcast: success &= bcastset(card, bcast, iosock) - return success - except pyric.error as e: - # an ambiguous error is thrown if attempting to set netmask or broadcast - # without an ip address already set on the card - if e.errno == pyric.EADDRNOTAVAIL and inet is None: - raise pyric.error(pyric.EINVAL, "Set ip4 addr first") - else: - raise - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - -def inetset(card, inet, iosock=None): - """ - REQUIRES ROOT PRIVILEGES - set nic's ip4 addr (ifconfig - :param card: Card object - :param inet: ip address to set - :param iosock: ioctl socket - :returns: True on success, False otherwise - NOTE: setting the ip will set netmask and broadcast accordingly - """ - if not _validip4_(inet): raise pyric.error(pyric.EINVAL, "Invalid IP") - if iosock is None: return _iostub_(inetset, card, inet) - - try: - flag = sioch.SIOCSIFADDR - ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [inet])) - fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam == ifh.AF_INET: - return _hex2ip4_(ret[20:24]) == inet - else: - raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return ip family") - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - except io.error as e: - raise pyric.error(e.errno, e.strerror) - -def maskset(card, mask, iosock=None): - """ - REQUIRES ROOT PRIVILEGES - set nic's ip4 netmask (ifconfig netmask - :param card: Card object - :param mask: netmask to set - :param iosock: ioctl socket - :returns: True on success, False otherwise - NOTE: - 1) throws error if netmask is set and card does not have an ip assigned - """ - if not _validip4_(mask): raise pyric.error(pyric.EINVAL, "Invalid netmask") - if iosock is None: return _iostub_(maskset, card, mask) - try: - flag = sioch.SIOCSIFNETMASK - ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [mask])) - fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam == ifh.AF_INET: - return _hex2ip4_(ret[20:24]) == mask - else: - raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return netmask family") - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - except io.error as e: - # an ambiguous error is thrown if attempting to set netmask or broadcast - # without an ip address already set on the card - if e.errno == pyric.EADDRNOTAVAIL: - raise pyric.error(pyric.EINVAL, "Cannot set netmask. Set ip first") - else: - raise pyric.error(e, e.strerror) - -def bcastset(card, bcast, iosock=None): - """ - REQUIRES ROOT PRIVILEGES - set nic's ip4 netmask (ifconfig broadcast - :param card: Card object - :param bcast: netmask to set - :param iosock: ioctl socket - :returns: True on success, False otherwise - NOTE: - 1) throws error if netmask is set and card does not have an ip assigned - 2) can set broadcast to erroneous values i.e. ipaddr = 192.168.1.2 and - broadcast = 10.0.0.31. - """ - if not _validip4_(bcast): raise pyric.error(pyric.EINVAL, "Invalid bcast") - if iosock is None: return _iostub_(bcastset, card, bcast) - - # we have to do one at a time - try: - flag = sioch.SIOCSIFBRDADDR - ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag, [bcast])) - fam = struct.unpack_from(ifh.sa_addr, ret, ifh.IFNAMELEN)[0] - if fam == ifh.AF_INET: - return _hex2ip4_(ret[20:24]) == bcast - else: - raise pyric.error(pyric.EAFNOSUPPORT, "Invalid return broadcast family") - except pyric.error as e: - # an ambiguous error is thrown if attempting to set netmask or broadcast - # without an ip address already set on the card - if e.errno == pyric.EADDRNOTAVAIL: - raise pyric.error(pyric.EINVAL, "Cannot set broadcast. Set ip first") - else: - raise - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - except io.error as e: - # an ambiguous error is thrown if attempting to set netmask or broadcast - # without an ip address already set on the card - if e.errno == pyric.EADDRNOTAVAIL: - raise pyric.error(pyric.EINVAL, "Cannot set broadcast. Set ip first") - else: - raise pyric.error(e, e.strerror) - -################################################################################ -#### HARDWARE ON/OFF #### -################################################################################ - -def isup(card, iosock=None): - """ - determine on/off state of card - :param card: Card object - :param iosock: ioctl socket - :returns: True if card is up, False otherwise - """ - if iosock is None: return _iostub_(isup, card) - - try: - return _issetf_(_flagsget_(card.dev, iosock), ifh.IFF_UP) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - -def up(card, iosock=None): - """ - REQUIRES ROOT PRIVILEGES - turns dev on (ifconfig up) - :param card: Card object - :param iosock: ioctl socket - """ - if iosock is None: return _iostub_(up, card) - - try: - flags = _flagsget_(card.dev, iosock) - if not _issetf_(flags, ifh.IFF_UP): - _flagsset_(card.dev, _setf_(flags, ifh.IFF_UP), iosock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - -def down(card, iosock=None): - """ - REQUIRES ROOT PRIVILEGES - turns def off (ifconfig down) - :param card: Card object - :param iosock: ioctl socket - """ - if iosock is None: return _iostub_(down, card) - - try: - flags = _flagsget_(card.dev, iosock) - if _issetf_(flags, ifh.IFF_UP): - _flagsset_(card.dev, _unsetf_(flags, ifh.IFF_UP), iosock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - -def isblocked(card): - """ - determines blocked state of Card - :param card: Card object - :returns: tuple (Soft={True if soft blocked|False otherwise}, - Hard={True if hard blocked|False otherwise}) - """ - try: - idx = rfkill.getidx(card.phy) - return rfkill.soft_blocked(idx), rfkill.hard_blocked(idx) - except AttributeError: - raise pyric.error(pyric.ENODEV, "Card is no longer registered") - -def block(card): - """ - soft blocks card - :param card: Card object - """ - try: - idx = rfkill.getidx(card.phy) - rfkill.rfkill_block(idx) - except AttributeError: - raise pyric.error(pyric.ENODEV, "Card is no longer registered") - -def unblock(card): - """ - turns off soft block - :param card: - """ - try: - idx = rfkill.getidx(card.phy) - rfkill.rfkill_unblock(idx) - except AttributeError: - raise pyric.error(pyric.ENODEV, "Card is no longer registered") - -################################################################################ -#### RADIO PROPERTIES #### -################################################################################ - -def pwrsaveget(card, nlsock=None): - """ - returns card's power save state - :param card: Card object - :param nlsock: netlink socket - :returns: True if power save is on, False otherwise - """ - if nlsock is None: return _nlstub_(pwrsaveget, card) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_GET_POWER_SAVE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - - return nl.nla_find(rmsg, nl80211h.NL80211_ATTR_PS_STATE) == 1 - -def pwrsaveset(card, on, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES - sets card's power save state - :param card: Card object - :param on: {True = on|False = off} - :param nlsock: netlink socket - sets card's power save - """ - if nlsock is None: return _nlstub_(pwrsaveset, card, on) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_POWER_SAVE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nla_put_u32(msg, int(on), nl80211h.NL80211_ATTR_PS_STATE) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except ValueError: - raise pyric.error(pyric.EINVAL, "Invalid parameter {0} for on".format(on)) - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - -def covclassget(card, nlsock=None): - """ - gets the coverage class value - :param card: Card object - :param nlsock: netlink socket - :returns: coverage class value - """ - if nlsock is None: return _nlstub_(covclassget, card) - return phyinfo(card, nlsock)['cov_class'] - -def covclassset(card, cc, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES/DOES NOT WORK ON ALL SYSTEMS - sets the coverage class. The coverage class IAW IEEE Std 802.11-2012 is - defined as the Air propagation time & together with max tx power control - the BSS diamter - :param card: Card object - :param cc: coverage class 0 to 31 IAW IEEE Std 802.11-2012 Table 8-56 - :param nlsock: netlink socket - sets card's coverage class - """ - if cc < wlan.COV_CLASS_MIN or cc > wlan.COV_CLASS_MAX: - # this can work 'incorrectly' on non-int values but these will - # be caught later during conversion - emsg = "Cov class must be integer {0}-{1}".format(wlan.COV_CLASS_MIN, - wlan.COV_CLASS_MAX) - raise pyric.error(pyric.EINVAL, emsg) - if nlsock is None: return _nlstub_(covclassset, card, cc) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_WIPHY, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nla_put_u8(msg, int(cc), nl80211h.NL80211_ATTR_WIPHY_COVERAGE_CLASS) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except ValueError: - raise pyric.error(pyric.EINVAL, "Invalid value {0} for Cov. Class".format(cc)) - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - -def retryshortget(card, nlsock=None): - """ - gets the short retry limit. - :param card: Card object - :param nlsock: netlink socket - gets card's short retry - """ - if nlsock is None: return _nlstub_(retryshortget, card) - return phyinfo(card, nlsock)['retry_short'] - -def retryshortset(card, lim, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES - sets the short retry limit. - :param card: Card object - :param lim: max # of short retries 1 - 255 - :param nlsock: netlink socket - NOTE: with kernel 4, the kernel does not allow setting up to the max - """ - if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: - # this can work 'incorrectly' on non-int values but these will - # be caught later during conversion - emsg = "Retry short must be integer {0}-{1}".format(wlan.RETRY_MIN, - wlan.RETRY_MAX) - raise pyric.error(pyric.EINVAL, emsg) - if nlsock is None: return _nlstub_(retryshortset, card, lim) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_WIPHY, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nla_put_u8(msg, int(lim), nl80211h.NL80211_ATTR_WIPHY_RETRY_SHORT) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except ValueError: - raise pyric.error(pyric.EINVAL, "Invalid value {0} for lim".format(lim)) - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - -def retrylongget(card, nlsock=None): - """ - gets the long retry limit. - :param card: Card object - :param nlsock: netlink socket - :returns: card's long retry - """ - if nlsock is None: return _nlstub_(retrylongget, card) - return phyinfo(card, nlsock)['retry_long'] - -def retrylongset(card, lim, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES - sets the long retry limit. - :param card: Card object - :param lim: max # of short retries 1 - 255 - :param nlsock: netlink socket - NOTE: after moving to kernel 4, the kernel does not allow setting up to - the max - """ - if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: - # this can work 'incorrectly' on non-int values but these will - # be caught later during conversion - emsg = "Retry long must be integer {0}-{1}".format(wlan.RETRY_MIN, - wlan.RETRY_MAX) - raise pyric.error(pyric.EINVAL, emsg) - if nlsock is None: return _nlstub_(retrylongset, card, lim) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_WIPHY, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nla_put_u8(msg, int(lim), nl80211h.NL80211_ATTR_WIPHY_RETRY_LONG) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except ValueError: - raise pyric.error(pyric.EINVAL, "Invalid value {0} for lim".format(lim)) - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - -def rtsthreshget(card, nlsock=None): - """ - gets RTS Threshold - :param card: Card Object - :param nlsock: netlink socket - :returns: RTS threshold - """ - if nlsock is None: return _nlstub_(rtsthreshget, card) - return phyinfo(card, nlsock)['rts_thresh'] - -def rtsthreshset(card, thresh, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES - sets the RTS threshold. If off, RTS is disabled. If an integer, sets the - smallest packet for which card will send an RTS prior to each transmission - :param card: Card object - :param thresh: rts threshold limit - :param nlsock: netlink socket - sets the card's RTS threshold - """ - if thresh == 'off': thresh = wlan.RTS_THRESH_OFF - elif thresh == wlan.RTS_THRESH_OFF: pass - elif thresh < wlan.RTS_THRESH_MIN or thresh > wlan.RTS_THRESH_MAX: - emsg = "Thresh must be 'off' or integer {0}-{1}".format(wlan.RTS_THRESH_MIN, - wlan.RTS_THRESH_MAX) - raise pyric.error(pyric.EINVAL, emsg) - if nlsock is None: return _nlstub_(rtsthreshset, card, thresh) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_WIPHY, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nla_put_u32(msg, thresh, nl80211h.NL80211_ATTR_WIPHY_RTS_THRESHOLD) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except ValueError: - raise pyric.error(pyric.EINVAL, "Invalid value {0} for thresh".format(thresh)) - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - -def fragthreshget(card, nlsock=None): - """ - gets Fragmentation Threshold - :param card: Card Object - :param nlsock: netlink socket - :returns: RTS threshold - """ - if nlsock is None: return _nlstub_(fragthreshget, card) - return phyinfo(card, nlsock)['frag_thresh'] - -def fragthreshset(card, thresh, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES - sets the Frag threshold. If off, fragmentation is disabled. If an integer, - sets the largest packet before the card will enable fragmentation - :param card: Card object - :param thresh: frag threshold limit in octets - :param nlsock: netlink socket - sets the card's Fragmentation THRESH - """ - if thresh == 'off': thresh = wlan.FRAG_THRESH_OFF - elif thresh == wlan.FRAG_THRESH_OFF: pass - elif thresh < wlan.FRAG_THRESH_MIN or thresh > wlan.FRAG_THRESH_MAX: - emsg = "Thresh must be 'off' or integer {0}-{1}".format(wlan.FRAG_THRESH_MIN, - wlan.FRAG_THRESH_MAX) - raise pyric.error(pyric.EINVAL, emsg) - if nlsock is None: return _nlstub_(fragthreshset, card, thresh) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_WIPHY, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nla_put_u32(msg, thresh, nl80211h.NL80211_ATTR_WIPHY_FRAG_THRESHOLD) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - -################################################################################ -#### INFO RELATED #### -################################################################################ - -def devfreqs(card, nlsock=None): - """ - returns card's supported frequencies - :param card: Card object - :param nlsock: netlink socket - :returns: list of supported frequencies - """ - if nlsock is None: return _nlstub_(devfreqs, card) - - rfs = [] - pinfo = phyinfo(card, nlsock) - for band in pinfo['bands']: - rfs.extend(pinfo['bands'][band]['rfs']) - rfs = sorted(rfs) - return rfs - -def devchs(card, nlsock=None): - """ - returns card's supported channels - :param card: Card object - :param nlsock: netlink socket - :returns: list of supported channels - """ - if nlsock is None: return _nlstub_(devchs, card) - return [channels.rf2ch(rf) for rf in devfreqs(card,nlsock)] - -def devstds(card, nlsock=None): - """ - gets card's wireless standards (iwconfig | grep IEEE - :param card: Card object - :param nlsock: netlink socket - :returns: list of standards (letter designators) - """ - if nlsock is None: return _nlstub_(devstds, card) - - stds = [] - bands = phyinfo(card,nlsock)['bands'] - if '5GHz' in bands: stds.append('a') - if '2GHz' in bands: stds.extend(['b','g']) # assume backward compat with b - HT = VHT = True - for band in bands: - HT &= bands[band]['HT'] - VHT &= bands[band]['VHT'] - if HT: stds.append('n') - if VHT: stds.append('ac') - return stds - -def devmodes(card, nlsock=None): - """ - gets supported modes card can operate in - :param card: Card object - :param nlsock: netlink socket - :returns: list of card's supported modes - """ - if nlsock is None: return _nlstub_(devmodes, card) - return phyinfo(card, nlsock)['modes'] - -def devcmds(card, nlsock=None): - """ - get supported commands card can execute - :param card: Card object - :param nlsock: netlink socket - :returns: supported commands - """ - if nlsock is None: return _nlstub_(devcmds, card) - return phyinfo(card, nlsock)['commands'] - -def ifinfo(card, iosock=None): - """ - get info for interface (ifconfig ) - :param card: Card object - :param iosock: ioctl socket - :returns: dict with the following key:value pairs - driver -> card's driver - chipset -> card's chipset - manufacturer -> card's manufacturer - hwaddr -> card's mac address - inet -> card's inet address - bcast -> card's broadcast address - mask -> card's netmask address - """ - if iosock is None: return _iostub_(ifinfo, card) - - # get oui dict - ouis = {} - try: - ouis = ouifetch.load() - except pyric.error: - pass - - try: - drvr, chips = hw.ifcard(card.dev) - mac = macget(card, iosock) - ip4, nmask, bcast = ifaddrget(card, iosock) - info = {'driver':drvr, 'chipset':chips, 'hwaddr':mac, - 'manufacturer':hw.manufacturer(ouis,mac), - 'inet':ip4, 'bcast':bcast, 'mask':nmask} - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - - return info - -def devinfo(card, nlsock=None): - """ - get info for device (iw dev info) - :param card: Card object or dev - :param nlsock: netlink socket - :returns: dict with the following key:value pairs - card -> Card(phy,dev,ifindex) - mode -> i.e. monitor or managed - wdev -> wireless device id - mac -> hw address - RF (if associated) -> frequency - CF (if assoicate) -> center frequency - CHW -> channel width i.e. NOHT,HT40- etc - """ - if nlsock is None: return _nlstub_(devinfo, card) - - dev = None # appease pycharm - try: - # if we have a Card, pull out ifindex. otherwise get ifindex from dev - try: - dev = card.dev - idx = card.idx - except AttributeError: - dev = card - idx = _ifindex_(dev) - - # using the ifindex, get the phy and details about the Card - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_GET_INTERFACE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) - except io.error as e: - # if we get a errno -19, it means ifindex failed & there is no device dev - raise pyric.error(e.errno, e.strerror) - except nl.error as e: - # if we get a errno -19, it is mostly likely because the card does - # not support nl80211. However check to ensure the card hasn't been - # unplugged. - if e.errno == pyric.ENODEV: - try: - _ = _ifindex_(dev) - except io.error as e: - raise pyric.error(e.errno, "{0}. Check Card".format(e.strerror)) - raise pyric.error(pyric.EPROTONOSUPPORT, "Device does not support nl80211") - raise pyric.error(e.errno, e.strerror) - - # pull out attributes - info = { - 'card': Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), dev, idx), - 'mode': IFTYPES[nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFTYPE)], - 'wdev': nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WDEV), - 'mac': _hex2mac_(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAC)), - 'RF': nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_FREQ), - 'CF': nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CENTER_FREQ1), - 'CHW': nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CHANNEL_WIDTH) - } - - # convert CHW to string version - try: - info['CHW'] = channels.CHTYPES[info['CHW']] - except (IndexError,TypeError): # invalid index and NoneType - info['CHW'] = None - return info - -def phyinfo(card, nlsock=None): - """ - get info for phy (iw phy info) - :param card: Card - :param nlsock: netlink socket - :returns: dict with the following key:value pairs - generation -> wiphy generation - modes -> list of supported modes - bands -> dict of supported bands of the form - bandid -> {'rates': list of supported rates, - 'rfs': list of supported freqs, - 'rd-data': list of data corresponding to rfs, - 'HT': 802.11n HT supported, - 'VHT': 802.11ac VHT supported} - scan_ssids -> max number of scan SSIDS - retry_short -> retry short limit - retry_long -> retry long limit - frag_thresh -> frag threshold - rts_thresh -> rts threshold - cov_class -> coverage class - swmodes -> supported software modes - commands -> supported commands - ciphers -> supported ciphers - """ - if nlsock is None: return _nlstub_(phyinfo, card) - - # iw sends @NL80211_ATTR_SPLIT_WIPHY_DUMP, we don't & get full return at once - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_GET_WIPHY, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - - # pull out attributes - info = { - 'generation':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_GENERATION), - 'retry_short':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_SHORT), - 'retry_long':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RETRY_LONG), - 'frag_thresh':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_FRAG_THRESHOLD), - 'rts_thresh':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_RTS_THRESHOLD), - 'cov_class':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_COVERAGE_CLASS), - 'scan_ssids':nl.nla_find(rmsg, nl80211h.NL80211_ATTR_MAX_NUM_SCAN_SSIDS), - 'bands':[], - 'modes':[], - 'swmodes':[], - 'commands':[], - 'ciphers':[] - } - - # modify frag_thresh and rts_thresh as necessary - if info['frag_thresh'] >= wlan.FRAG_THRESH_MAX: info['frag_thresh'] = 'off' - if info['rts_thresh'] >= wlan.RTS_THRESH_MAX: info['rts_thresh'] = 'off' - - # complex attributes - # NOTE: after correcting my understanding of how to parsed nested attributes - # they should no longer result in a NLA_ERROR but just in case... - _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY_BANDS, False) - if d != nlh.NLA_ERROR: info['bands'] = _bands_(bs) - - _, cs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_CIPHER_SUITES, False) - if d != nlh.NLA_ERROR: info['ciphers'] = _ciphers_(cs) - - # supported iftypes, sw iftypes are IAW nl80211.h flags (no attribute data) - _, ms, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_IFTYPES, False) - if d != nlh.NLA_ERROR: info['modes'] = [_iftypes_(iftype) for iftype,_ in ms] - - _, ms, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SOFTWARE_IFTYPES, False) - if d != nlh.NLA_ERROR: info['swmodes'] = [_iftypes_(iftype) for iftype,_ in ms] - - # get supported commands - _, cs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_SUPPORTED_COMMANDS, False) - if d != nlh.NLA_ERROR: info['commands'] = _commands_(cs) - - return info - -################################################################################ -#### TX/RX RELATED #### -################################################################################ - -def txset(card, setting, lvl, nlsock=None): - """ - ROOT Required - sets cards tx power (iw phy card. * 100) - :param card: Card object - :param setting: power level setting oneof {'auto' = automatically determine - transmit power|'limit' = limit power by |'fixed' = set to } - :param lvl: desired tx power in dBm or None. NOTE: ignored if lvl is 'auto' - :param nlsock: netlink socket - :returns: True on success - NOTE: this does not work on my card(s) (nor does the corresponding iw - command) - """ - # sanity check on power setting and power level - if not setting in TXPWRSETTINGS: - raise pyric.error(pyric.EINVAL, "Invalid power setting {0}".format(setting)) - if setting != 'auto' and lvl is None: - raise pyric.error(pyric.EINVAL, "Power level must be specified") - if nlsock is None: return _nlstub_(txset, card, setting, lvl) - - try: - setting = TXPWRSETTINGS.index(setting) - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_WIPHY, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - # neither sending the phy or ifindex works - #nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nla_put_u32(msg, setting, nl80211h.NL80211_ATTR_WIPHY_TX_POWER_SETTING) - if setting != nl80211h.NL80211_TX_POWER_AUTOMATIC: - nl.nla_put_u32(msg, 100*lvl, nl80211h.NL80211_ATTR_WIPHY_TX_POWER_LEVEL) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except ValueError: - # converting to mBm - raise pyric.error(pyric.EINVAL, "Invalid value {0} for txpwr".format(lvl)) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - -def txget(card, iosock=None): - """ - gets card's transmission power (iwconfig | grep Tx-Power) - :param card: Card object - :param iosock: ioctl socket - :returns: transmission power in dBm - info can be found by cat /sys/kernel/debug/ieee80211/phy<#>/power but - how valid is it? - """ - if iosock is None: return _iostub_(txget, card) - - try: - flag = sioch.SIOCGIWTXPOW - ret = io.io_transfer(iosock, flag, ifh.ifreq(card.dev, flag)) - return struct.unpack_from(ifh.ifr_iwtxpwr, ret, ifh.IFNAMELEN)[0] - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except IndexError: - return None - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - except io.error as e: - raise pyric.error(e.errno, e.strerror) - -def chget(card, nlsock=None): - """ - gets the current channel for device (iw dev info | grep channel) - :param card: Card object - :param nlsock: netlink socket - NOTE: will only work if dev is associated w/ AP or device is in monitor mode - and has had chset previously - """ - if nlsock is None: return _nlstub_(chget, card) - return channels.rf2ch(devinfo(card, nlsock)['RF']) - -def chset(card, ch, chw=None, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES - sets current channel on device (iw phy set channel ) - :param card: Card object - :param ch: channel number - :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} - :param nlsock: netlink socket - NOTE: - Can throw a device busy for several reason. 1) Card is down, 2) Another - device is sharing the phy and wpa_supplicant/Network Manage is using it - """ - if nlsock is None: return _nlstub_(chset, card, ch, chw) - return freqset(card, channels.ch2rf(ch), chw, nlsock) - -def freqget(card, nlsock=None): - """ - gets the current frequency for device (iw dev info | grep channel) - :param card: Card object - :param nlsock: netlink socket - NOTE: will only work if dev is associated w/ AP or device is in monitor mode - and has had [ch|freq]set previously - """ - if nlsock is None: return _nlstub_(chget, card) - return devinfo(card, nlsock)['RF'] - -def freqset(card, rf, chw=None, nlsock = None): - """ - REQUIRES ROOT PRIVILEGES - set the frequency and width - :param card: Card object - :param rf: frequency - :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} - :param nlsock: netlink socket - NOTE: - Can throw a device busy for several reason. 1) Card is down, 2) Another - device is sharing the phy and wpa_supplicant/Network Manage is using it - """ - if nlsock is None: return _nlstub_(freqset, card, rf, chw) - - try: - chw = channels.CHTYPES.index(chw) - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_WIPHY, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nla_put_u32(msg, rf, nl80211h.NL80211_ATTR_WIPHY_FREQ) - nl.nla_put_u32(msg, chw, nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except ValueError: - raise pyric.error(pyric.EINVAL, "Invalid channel width") - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - if e.errno == pyric.EBUSY: raise pyric.error(e.errno,pyric.strerror(e.errno)) - raise pyric.error(e.errno, e.strerror) - -#### INTERFACE & MODE RELATED #### - -def modeget(card, nlsock=None): - """ - get current mode of card - :param card: Card object - :param nlsock: netlink socket - :return: - """ - if nlsock is None: return _nlstub_(modeget, card) - return devinfo(card, nlsock)['mode'] - -def modeset(card, mode, flags=None, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES/CARD DOWN - sets card to mode (with optional flags if mode is monitor) - (APX iw dev set type [flags]) - NOTE: as far - :param card: Card object - :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| - 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} - :param flags: list of monitor flags (can only be used if card is being set - to monitor mode) neof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' - |'cook'|'active'} - :param nlsock: netlink socket - """ - if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') - if flags and mode != 'monitor': - raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') - if flags: - for flag in flags: - if flag not in MNTRFLAGS: - raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) - else: flags = [] - if nlsock is None: return _nlstub_(modeset, card, mode, flags) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_INTERFACE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) - for flag in flags: - nl.nla_put_u32(msg, - MNTRFLAGS.index(flag), - nl80211h.NL80211_ATTR_MNTR_FLAGS) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - -def ifaces(card, nlsock=None): - """ - returns all interfaces sharing the same phy as card (APX iw dev | grep phy#) - :param card: Card object - :param nlsock: netlink socket - :returns: a list of tuples t = (Card,mode) for each device having the same - phyiscal index as that of card - """ - if nlsock is None: return _nlstub_(ifaces, card) - - ifs = [] - for dev in winterfaces(): - info = devinfo(dev, nlsock) - try: - if info['card'].phy == card.phy: - ifs.append((info['card'], info['mode'])) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - return ifs - -def devset(card, ndev, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES - changes card's dev to ndev - :param card: Card object - :param ndev: new dev name - :param nlsock: netlink socket - :returns: the new card object - NOTE: - o via netlink one can set a new physical name but we want the ability to - set a new dev. - o this is not a true set name: it adds a new card with ndev as the dev then - deletes the current card, returning the new card - o in effect, it will appear as if the card has a new name but, it will also - have a new ifindex - """ - if nlsock is None: return _nlstub_(devset, card, ndev) - - new = None # appease PyCharm - try: - mode = modeget(card, nlsock) - phy = card.phy - devdel(card, nlsock) - new = phyadd(phy, ndev, mode, None, nlsock) - except pyric.error: - # try and restore the system i.e. delete new if possible - if new: - try: - devdel(new, nlsock) - except pyric.error: - pass - if not validcard(card): - try: - pass - except pyric.error: - pass - raise - return new - -def devadd(card, vdev, mode, flags=None, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES - adds a virtual interface on device having type mode (iw dev - interface add type - :param card: Card object or ifindex - :param vdev: device name of new interface - :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| - 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} - :param flags: list of monitor flags (can only be used if creating monitor - mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' - |'cook'|'active'} - :param nlsock: netlink socket - :returns: the new Card - NOTE: the new Card will be 'down' - """ - if iswireless(vdev): raise pyric.error(pyric.ENOTUNIQ,"{0} already exists".format(vdev)) - if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') - if flags and mode != 'monitor': - raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') - if flags: - for flag in flags: - if flag not in MNTRFLAGS: - raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) - else: flags = [] - if nlsock is None: return _nlstub_(devadd, card, vdev, mode, flags) - - # if we have a Card, pull out ifindex - try: - idx = card.idx - except AttributeError: - idx = card - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_NEW_INTERFACE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nla_put_string(msg, vdev, nl80211h.NL80211_ATTR_IFNAME) - nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) - for flag in flags: - nl.nla_put_u32(msg, - MNTRFLAGS.index(flag), - nl80211h.NL80211_ATTR_MNTR_FLAGS) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - - # return the new Card with info from the results msg - return Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), - nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFNAME), - nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) - -def devdel(card, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES - deletes the device (dev del - :param card: Card object - :param nlsock: netlink socket - NOTE: the original card is no longer valid (i.e. the phy will still be present - but the device name and ifindex are no longer 'present' in the system - """ - if nlsock is None: return _nlstub_(devdel, card) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_DEL_INTERFACE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - -def phyadd(card, vdev, mode, flags=None, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES - adds a virtual interface on device having type mode (iw phy - interface add type - :param card: Card object or physical index - :param vdev: device name of new interface - :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| - 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} - :param flags: list of monitor flags (can only be used if creating monitor - mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' - |'cook'|'active'} - :param nlsock: netlink socket - :returns: the new Card - NOTE: the new Card will be 'down' - """ - if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') - if flags: - if mode != 'monitor': - raise pyric.error(pyric.EINVAL, 'Can only set flags in monitor mode') - for flag in flags: - if flag not in MNTRFLAGS: - raise pyric.error(pyric.EINVAL, 'Invalid flag: {0}'.format(flag)) - else: flags = [] - if nlsock is None: return _nlstub_(phyadd, card, vdev, mode, flags) - - # if we have a Card, pull out phy - try: - phy = card.phy - except AttributeError: - phy = card - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_NEW_INTERFACE, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, phy, nl80211h.NL80211_ATTR_WIPHY) - nl.nla_put_string(msg, vdev, nl80211h.NL80211_ATTR_IFNAME) - nl.nla_put_u32(msg, IFTYPES.index(mode), nl80211h.NL80211_ATTR_IFTYPE) - for flag in flags: - nl.nla_put_u32(msg, - MNTRFLAGS.index(flag), - nl80211h.NL80211_ATTR_MNTR_FLAGS) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) # success returns new device attributes - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - - # get card & determine if we got a card with the specified name - return Card(nl.nla_find(rmsg, nl80211h.NL80211_ATTR_WIPHY), - nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFNAME), - nl.nla_find(rmsg, nl80211h.NL80211_ATTR_IFINDEX)) - -################################################################################ -#### STA FUNCTIONS #### -################################################################################ - -def isconnected(card, nlsock=None): - """ - disconnect the card from an AP - :param card: Card object - :param nlsock: netlink socket - """ - if nlsock is None: return _nlstub_(isconnected, card) - return devinfo(card, nlsock)['RF'] is not None - -def connect(card, ssid, bssid=None, rf=None, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES & WPA_SUPPLICANT MUST BE DISABLED - connects to (Open) AP - :param card: Card object - :param ssid: the SSID, network name - :param bssid: the AP's BSSID - :param rf: the frequency of the AP - :param nlsock: netlink socket - :returns: True on successful connect, False otherwise - NOTE: although connected, traffic will not be routed, card will not have - an IP assigned - """ - if nlsock is None: return _nlstub_(connect, card, ssid, bssid, rf) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_CONNECT, # step 1 - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nla_put_unspec(msg, ssid, nl80211h.NL80211_ATTR_SSID) - nl.nla_put_unspec(msg, _mac2hex_(bssid), nl80211h.NL80211_ATTR_MAC) - nl.nl_sendmsg(nlsock, msg) - if not nl.nl_recvmsg(nlsock) == nlh.NLE_SUCCESS: return False - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - return True - -def disconnect(card, nlsock=None): - """ - REQUIRES ROOT PRIVILEGES - disconnect the card from an AP - :param card: Card object - :param nlsock: netlink socket - NOTE: does not return error if card is not connected. May not work if - wpa_supplicant is running - """ - if nlsock is None: return _nlstub_(disconnect, card) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_DISCONNECT, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - -def link(card, nlsock=None): - """ - returns info about link (iw dev card. link) - :param card: Card object - :param nlsock: netlink socket - :returns: link info as dict with the following key:value pairs - bssid -> AP mac/ net BSSID - ssid -> the ssid (Experimental) - freq -> BSSID frequency in MHz - chw -> width of the BSS control channel - rss -> Received signal strength in dBm - int -> beacon interval (ms) - stat -> status w.r.t of card to BSS one of {'authenticated','associated','ibss'} - tx -> tx metrics dict of the form - pkts -> total sent packets to connected STA (AP) - bytes -> total sent in bytes to connected STA (AP) - retries -> total # of retries - failed -> total # of failed - bitrate -> dict of form - rate -> tx rate in Mbits - width -> channel width oneof {None|20|40} - mcs-index -> mcs index (0..32) or None - gaurd -> guard interval oneof {None|0=short|1=long} - Note: width, mcs-index, guard will be None unless 802.11n is being used - rx -> rx metrics dict (see tx for format exluces retries and fails) - or None if the card is not connected - NOTE: if the nested attribute was not parsed correctly will attempt to pull - out as much as possible - """ - if nlsock is None: return _nlstub_(link, card) - - # if we're not connected GET_SCAN will dump scan results, we don't want that - if not isconnected(card, nlsock): return None - - try: - # we need to set additional flags or the kernel will return ERRNO 95 - flags = nlh.NLM_F_REQUEST | nlh.NLM_F_ACK | nlh.NLM_F_ROOT | nlh.NLM_F_MATCH - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_GET_SCAN, - flags=flags) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - - # link returns multiple attributes but we are only concerned w/ @NL80211_ATTR_BSS - # some cards (my integrated intel) do not parse correctly - info = {'bssid': None, 'ssid': None, 'freq': None, 'rss': None, 'int': None, - 'chw': None, 'stat': None,'tx': {}, 'rx': {}} - - _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_BSS, False) - if d == nlh.NLA_ERROR: return info - for idx, attr in bs: - # any errors attempting to parse -> leave as default None, empty - try: - if idx == nl80211h.NL80211_BSS_BSSID: - info['bssid'] = _hex2mac_(attr) - if idx == nl80211h.NL80211_BSS_FREQUENCY: - info['freq'] = struct.unpack_from('I', attr, 0)[0] - if idx == nl80211h.NL80211_BSS_SIGNAL_MBM: - info['rss'] = struct.unpack_from('i', attr, 0)[0] / 100 - if idx == nl80211h.NL80211_BSS_INFORMATION_ELEMENTS: - """ - hack the proprietary info element attribute: (it should - be a nested attribute itself, but I have currently no way of - knowing what the individual indexes would mean - \x06\x00\x00SSID..... - '\x06\x00' is the ie index & the ssid is the first element - (from what I've seen). This is not nested. Not sure if the - length is the first two bytes or just the second Get the length - of the ssid which is the 3rd,4th byte, then unpack the string - starting at the fifth byte up to the specified length - """ - try: - l = struct.unpack_from('>H', attr, 0)[0] # have to change the format - info['ssid'] = struct.unpack_from('{0}s'.format(l), attr, 2)[0] - except struct.error: - pass - if idx == nl80211h.NL80211_BSS_BEACON_INTERVAL: - info['int'] = struct.unpack_from('H', attr, 0)[0] - if idx == nl80211h.NL80211_BSS_CHAN_WIDTH: - j = struct.unpack_from('I', attr, 0)[0] - info['chw'] = nl80211h.NL80211_BSS_CHAN_WIDTHS[j] - if idx == nl80211h.NL80211_BSS_STATUS: - j = struct.unpack_from('I', attr, 0)[0] - info['stat'] = nl80211h.NL80211_BSS_STATUSES[j] - except struct.error: - pass - - # process stainfo of AP - try: - sinfo = stainfo(card, info['bssid'], nlsock) - info['tx'] = {'bytes': sinfo['tx-bytes'], - 'pkts': sinfo['tx-pkts'], - 'failed': sinfo['tx-failed'], - 'retries': sinfo['tx-retries'], - 'bitrate': {'rate': sinfo['tx-bitrate']['rate']}} - if sinfo['tx-bitrate'].has_key('mcs-index'): - info['tx']['bitrate']['mcs-index'] = sinfo['tx-bitrate']['mcs-index'] - info['tx']['bitrate']['gi'] = sinfo['tx-bitrate']['gi'] - info['tx']['bitrate']['width'] = sinfo['tx-bitrate']['width'] - - info['rx'] = {'bytes': sinfo['rx-bytes'], - 'pkts':sinfo['rx-pkts'], - 'bitrate': {'rate': sinfo['rx-bitrate']['rate']}} - if sinfo['rx-bitrate'].has_key('mcs-index'): - info['rx']['bitrate']['mcs-index'] = sinfo['rx-bitrate']['mcs-index'] - info['rx']['bitrate']['gi'] = sinfo['rx-bitrate']['gi'] - info['rx']['bitrate']['width'] = sinfo['rx-bitrate']['width'] - except (KeyError,TypeError,AttributeError): - # ignore for now, returning what we got - pass - - return info - -def stainfo(card, mac, nlsock=None): - """ - returns info about sta (AP) the card is associated with (iw dev card. link) - :param card: Card object - :param mac: mac address of STA - :param nlsock: netlink socket - :returns: sta info as dict with the following key:value pairs - rx-bytes: total received bytes (from STA) - tx-bytes: total sent bytes (to STA) - rx-pkts: total received packets (from STA) - tx-pkts: total sent packets (to STA) - tx-bitrate: dict of the form - rate: bitrate in 100kbits/s - legacy: fallback bitrate in 100kbits/s (only present if rate is not determined) - mcs-index: mcs index (0..32) (only present if 802.11n) - gi: guard interval oneof {0=short|1=long} (only present if 802.11n) - width: channel width oneof {20|40} - rx-bitrate: see tx-bitrate - NOTE: - - if the nested attribute was not parsed correctly will attempt to pull - out as much as possible - - given msc index, guard interval and channel width, one can calculate the - 802.11n rate (see wraith->standards->mcs) - """ - if nlsock is None: return _nlstub_(stainfo, card, mac) - - # if we're not connected GET_SCAN will dump scan results, we don't want that - if not isconnected(card, nlsock): return None - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_GET_STATION, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nla_put_unspec(msg, _mac2hex_(mac), nl80211h.NL80211_ATTR_MAC) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - raise pyric.error(e.errno, e.strerror) - - # we are only concerned w/ @NL80211_ATTR_STA_INFO - info = {'rx-bytes': None, 'tx-bytes': None, 'rx-pkts': None, 'tx-pkts': None, - 'tx-bitrate':{}, 'rx-bitrate':{}} - - _, bs, d = nl.nla_find(rmsg, nl80211h.NL80211_ATTR_STA_INFO, False) - if d == nlh.NLA_ERROR: return info - for sidx, sattr in bs: # sidx indexes the enum nl80211_sta_info - try: - if sidx == nl80211h.NL80211_STA_INFO_RX_BYTES: - info['rx-bytes'] = struct.unpack_from('I', sattr, 0)[0] - elif sidx == nl80211h.NL80211_STA_INFO_TX_BYTES: - info['tx-bytes'] = struct.unpack_from('I', sattr, 0)[0] - elif sidx == nl80211h.NL80211_STA_INFO_RX_PACKETS: - info['rx-pkts'] = struct.unpack_from('I', sattr, 0)[0] - elif sidx == nl80211h.NL80211_STA_INFO_TX_PACKETS: - info['tx-pkts'] = struct.unpack_from('I', sattr, 0)[0] - elif sidx == nl80211h.NL80211_STA_INFO_TX_RETRIES: - info['tx-retries'] = struct.unpack_from('I', sattr, 0)[0] - elif sidx == nl80211h.NL80211_STA_INFO_TX_FAILED: - info['tx-failed'] = struct.unpack_from('I', sattr, 0)[0] - elif sidx == nl80211h.NL80211_STA_INFO_TX_BITRATE: - info['tx-bitrate'] = _rateinfo_(sattr) - elif sidx == nl80211h.NL80211_STA_INFO_RX_BITRATE: - info['rx-bitrate'] = _rateinfo_(sattr) - except struct.error: - # ignore this and hope other elements still work - pass - - return info - -################################################################################ -#### FILE PRIVATE #### -################################################################################ - -IPADDR = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") # re for ip addr -MACADDR = re.compile("^([0-9a-fA-F]{2}:){5}([0-9a-fA-F]{2})$") # re for mac addr - - -def _hex2ip4_(v): - """ - :param v: packed by string - :returns: a '.' separated ip4 address from byte stream v - """ - try: - return '.'.join([str(ord(c)) for c in v]) - except TypeError: - # python 3 c is already numeric - return '.'.join([str(c) for c in v]) - -def _hex2mac_(v): - """ - :param v: packed bytestream of form \xd8\xc7\xc8\x00\x11\x22 - :returns: a ':' separated mac address from byte stream v - """ - try: - return ":".join(['{0:02x}'.format(ord(c)) for c in v]) - except TypeError: - # it appears that in Python 3.5 c is already numeric - return ":".join(['{0:02x}'.format(c) for c in v]) - -def _mac2hex_(v): - """ - converts mac address to hex string - :param v: mac address of form xx:yy:zz:00:11:22 - :returns: mac address as hex string - """ - try: - return struct.pack('6B',*[int(x,16) for x in v.split(':')]) - except AttributeError: - raise pyric.error(pyric.EINVAL, 'Mac address is not valid') - except struct.error: - raise pyric.error(pyric.EINVAL, 'Mac address is not 6 octets') - -def _validip4_(addr): - """ - determines validity of ip4 address - :param addr: ip addr to check - :returns: True if addr is valid ip, False otherwise - """ - try: - if re.match(IPADDR, addr): return True - except TypeError: - return False - return False - -def _validmac_(addr): - """ - determines validity of hw addr - :param addr: address to check - :returns: True if addr is valid hw address, False otherwise - """ - try: - if re.match(MACADDR, addr): return True - except TypeError: - return False - return False - -def _issetf_(flags, flag): - """ - determines if flag is set - :param flags: current flag value - :param flag: flag to check - :return: True if flag is set - """ - return (flags & flag) == flag - -def _setf_(flags, flag): - """ - sets flag, adding to flags - :param flags: current flag value - :param flag: flag to set - :return: new flag value - """ - return flags | flag - -def _unsetf_(flags, flag): - """ - unsets flag, adding to flags - :param flags: current flag value - :param flag: flag to unset - :return: new flag value - """ - return flags & ~flag - -def _flagsget_(dev, iosock=None): - """ - gets the device's flags - :param dev: device name: - :param iosock: ioctl socket - :returns: device flags - """ - if iosock is None: return _iostub_(_flagsget_, dev) - - try: - flag = sioch.SIOCGIFFLAGS - ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag)) - return struct.unpack_from(ifh.ifr_flags, ret, ifh.IFNAMELEN)[0] - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - except io.error as e: - raise pyric.error(e.errno, e.strerror) - -def _flagsset_(dev, flags, iosock=None): - """ - gets the device's flags - :param dev: device name: - :param flags: flags to set - :param iosock: ioctl socket - :returns: device flags after operation - """ - if iosock is None: return _iostub_(_flagsset_, dev, flags) - - try: - flag = sioch.SIOCSIFFLAGS - ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag, [flags])) - return struct.unpack_from(ifh.ifr_flags, ret, ifh.IFNAMELEN)[0] - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - except io.error as e: - raise pyric.error(e.errno, e.strerror) - -#### ADDITIONAL PARSING FOR PHYINFO #### - -def _iftypes_(i): - """ - wraps the IFTYPES list to handle index errors - :param i: - :returns: the string IFTYPE corresponding to i - """ - try: - return IFTYPES[i] - except IndexError: - return "Unknown mode ({0})".format(i) - -def _bands_(bs): - """ - extracts supported freqs, rates from bands - :param bs: a list of one or more unparsed band attributes - :returns: dict of the form - band: one of {'2GHz'|'5GHz'|'UNK (n)'} -> band dict - band dict -> - HT: HT is supported by the Card on this band - VHT: VHT is supported by the Card on this band - rates: list of supported rates - rfs: list of supported frequencies - rf-data: list of dicts of rf-data where rf-data[i] contains info - regarding rf[i] - """ - # NOTE: in addition to RF and rates there are HT data included in the - # band info ATT we do not parse these (see "phy info notes 3.txt") - bands = {} - for idx, band in bs: - # the index tell us what band were in (enum nl80211_band) - try: - idx = nl80211h.NL80211_BANDS[idx] - except IndexError: - idx = "UNK ({0})".format(idx) - bands[idx] = {'HT': False, - 'VHT': False, - 'rates': None, - 'rfs': None, - 'rf-data': None} - - # now we delve into multiple levels of nesting - for bidx,battr in nl.nla_parse_nested(band): - # There are other data here (see nl80211_h nl80211_band_attr) - # that we are not currently using - if bidx == nl80211h.NL80211_BAND_ATTR_RATES: - try: - bands[idx]['rates'] = _band_rates_(battr) - except nl.error: - bands[idx]['rates'] = [] - elif bidx == nl80211h.NL80211_BAND_ATTR_FREQS: - try: - bands[idx]['rfs'], bands[idx]['rf-data'] = _band_rfs_(battr) - except nl.error: - bands[idx]['rfs'], bands[idx]['rf-data'] = [], [] - elif bidx in [nl80211h.NL80211_BAND_ATTR_HT_MCS_SET, - nl80211h.NL80211_BAND_ATTR_HT_CAPA, - nl80211h.NL80211_BAND_ATTR_HT_AMPDU_FACTOR, - nl80211h.NL80211_BAND_ATTR_HT_AMPDU_DENSITY]: - bands[idx]['HT'] = True - elif bidx in [nl80211h.NL80211_BAND_ATTR_VHT_MCS_SET, - nl80211h.NL80211_BAND_ATTR_VHT_CAPA]: - bands[idx]['VHT'] = True - return bands - -def _band_rates_(rs): - """ - unpacks individual rates from packed rates - :param rs: packed rates - :returns: a list of rates in Mbits - NOTE: ATT we ignore any short preamble specifier - """ - rates = [] - # unlike other nested attributes, the 'index' into rates is actually - # a counter (which we'll ignore) - for _, attr in nl.nla_parse_nested(rs): - # the nested attribute itself is a nested attribute. The idx indexes - # the enum nl80211_bitrate_attr of which we are only concerned w/ rate - for idx, bitattr in nl.nla_parse_nested(attr): - if idx == nl80211h.NL80211_BITRATE_ATTR_RATE: - rates.append(struct.unpack_from('I', bitattr, 0)[0] * 0.1) - return rates - -def _band_rfs_(rs): - """ - unpacks individual RFs (and accompanying data) from packed rfs - :param rs: packed frequencies - :returns: a tuple t = (freqs: list of supported RFS (MHz), data: list of dicts) - where for each i in freqs, data[i] is the corresponding data having the - form {} - """ - rfs = [] - rfds = [] - # like rates, the index here is a counter and fattr is a nested attribute - for _, fattr in nl.nla_parse_nested(rs): - # RF data being compiled ATT we are ignoring DFS related and infrared - # related. rfd is initially defined with max-tx, radar, 20Mhz and 10Mhz - # with 'default' values. - # Additional values may be returned by the kernel. If present they will - # be appended to not-permitted as the following strings - # HT40-, HT40+, 80MHz, 160MHz and outdoor. - # If present in not-permitted, they represent False Flags - rfd = { - 'max-tx': 0, # Card's maximum tx-power on this RF - 'enabled': True, # w/ current reg. dom. RF is enabled - '20Mhz': True, # w/ current reg. dom. 20MHz operation is allowed - '10Mhz': True, # w/ current reg. dom. 10MHz operation is allowed - 'radar': False, # w/ current reg. dom. radar detec. required on RF - 'not-permitted': [] # additional flags - } - for rfi, rfattr in nl.nla_parse_nested(fattr): - # rfi is the index into enum nl80211_frequency_attr - if rfi == nl80211h.NL80211_FREQUENCY_ATTR_FREQ: - rfs.append(struct.unpack_from('I', rfattr, 0)[0]) - elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_DISABLED: - rfd['enabled'] = False - elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_MAX_TX_POWER: # in mBm - rfd['max-tx'] = struct.unpack_from('I', rfattr, 0)[0] / 100 - elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_NO_HT40_MINUS: - rfd['not-permitted'].append('HT40-') - elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_NO_HT40_PLUS: - rfd['not-permitted'].append('HT40+') - elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_NO_80MHZ: - rfd['not-permitted'].append('80MHz') - elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_NO_160MHZ: - rfd['not-permitted'].append('160MHz') - elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_INDOOR_ONLY: - rfd['not-permitted'].append('outdoor') - elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_NO_20MHZ: - rfd['20MHz'] = False - elif rfi == nl80211h.NL80211_FREQUENCY_ATTR_NO_10MHZ: - rfd['10MHz'] = False - rfds.append(rfd) - return rfs, rfds - -def _unparsed_rf_(band): - """ - (LEGACY) extract list of supported freqs packed byte stream band - :param band: packed byte string from NL80211_ATTR_WIPHY_BANDS - :returns: list of supported frequencies - """ - rfs = [] - for freq in channels.freqs(): - if band.find(struct.pack("I", freq)) != -1: - rfs.append(freq) - return rfs - -def _commands_(command): - """ - converts numeric commands to string version - :param command: list of command constants - :returns: list of supported commands as strings - """ - cs = [] - for _,cmd in command: # rather than an index, commands use a counter, ignore it - try: - # use numeric command to lookup string version in form - # @NL80211_CMD_ - # and strip "@NL80211_CMD_". NOTE: some commands may have multiple - # string synonyms, in that case, take the first one. Finally, make - # it lowercase - cmd = cmdbynum(struct.unpack_from('I', cmd, 0)[0]) - if type(cmd) is type([]): cmd = cmd[0] - cs.append(cmd[13:].lower()) # skip NL80211_CMD_ - except KeyError: - # kernel 4 added commands not found in kernel 3 nlh8022.h. - # keep this just in case new commands pop up again - cs.append("unknown cmd ({0})".format(cmd)) - return cs - -def _ciphers_(ciphers): - """ - identifies supported ciphers - :param ciphers: the cipher suite stream - :returns: a list of supported ciphers - """ - ss = [] - for cipher in ciphers: # ciphers is a set and not nested - try: - ss.append(wlan.WLAN_CIPHER_SUITE_SELECTORS[cipher]) - except KeyError as e: - # we could do nothing, or append 'rsrv' but we'll add a little - # for testing/future identificaion purposes - ss.append('RSRV-{0}'.format(hex(int(e.__str__())))) - return ss - -#### ADDITIONAL PARSING FOR STAINFO - -def _rateinfo_(ri): - """ - parses the rate info stream returning a bitrate dict - :param ri: rate info stream - :returns: bitrate dict having the key->value pairs - rate: bitrate in 100kbits/s - legacy: fallback bitrate in 100kbits/s (only present if rate is not determined) - mcs-index: mcs index (0..32) (only present if 802.11n) - gi: guard interval oneof {0=short|1=long} (only present if 802.11n) - width: channel width oneof {20|40} - NOTE: references enum nl80211_rate_info - """ - bitrate = {'rate': None, 'legacy': None, 'mcs-index': None, - 'gi': 1, 'width': 20} - for i, attr in nl.nla_parse_nested(ri): - if i == nl80211h.NL80211_RATE_INFO_BITRATE32: - bitrate['rate'] = struct.unpack_from('I', attr, 0)[0] * 0.1 - elif i == nl80211h.NL80211_RATE_INFO_BITRATE: # legacy fallback rate - bitrate['legacy'] = struct.unpack_from('H', attr, 0)[0] - elif i == nl80211h.NL80211_RATE_INFO_MCS: - bitrate['mcs-index'] = struct.unpack_from('B', attr, 0)[0] - elif i == nl80211h.NL80211_RATE_INFO_40_MHZ_WIDTH: # flag - bitrate['width'] = 40 - elif i == nl80211h.NL80211_RATE_INFO_SHORT_GI: # flag - bitrate['gi'] = 0 - - # clean it up before returning - # remove legacy if we have rate or make rate = legacy if we dont have rate - # remove mcs-index and short gi and 40 MHz if there is no mcs-index - if bitrate['legacy'] and not bitrate['rate']: bitrate['rate'] = bitrate['legacy'] - if bitrate['rate'] and bitrate['legacy']: del bitrate['legacy'] - if bitrate['mcs-index'] is None: - del bitrate['mcs-index'] - del bitrate['gi'] - del bitrate['width'] - - return bitrate - -#### NETLINK/IOCTL PARAMETERS #### - -def _ifindex_(dev, iosock=None): - """ - gets the ifindex for device - :param dev: device name: - :param iosock: ioctl socket - :returns: ifindex of device - NOTE: the ifindex can aslo be found in /sys/class/net//ifindex - """ - if iosock is None: return _iostub_(_ifindex_, dev) - - try: - flag = sioch.SIOCGIFINDEX - ret = io.io_transfer(iosock, flag, ifh.ifreq(dev, flag)) - return struct.unpack_from(ifh.ifr_ifindex, ret, ifh.IFNAMELEN)[0] - except AttributeError as e: - raise pyric.error(pyric.EINVAL, e) - except struct.error as e: - raise pyric.error(pyric.EUNDEF, "Error parsing results: {0}".format(e)) - -def _familyid_(nlsock): - """ - extended version: get the family id - :param nlsock: netlink socket - :returns: the family id of nl80211 - NOTE: - In addition to the family id, we get: - CTRL_ATTR_FAMILY_NAME = nl80211\x00 - CTRL_ATTR_VERSION = \x01\x00\x00\x00 = 1 - CTRL_ATTR_HDRSIZE = \x00\x00\x00\x00 = 0 - CTRL_ATTR_MAXATTR = \xbf\x00\x00\x00 = 191 - CTRL_ATTR_OPS - CTRL_ATTR_MCAST_GROUPS - but for now, these are not used - """ - global _FAM80211ID_ - if _FAM80211ID_ is None: - # family id is not instantiated, do so now - msg = nl.nlmsg_new(nltype=genlh.GENL_ID_CTRL, - cmd=genlh.CTRL_CMD_GETFAMILY, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_string(msg, - nl80211h.NL80211_GENL_NAME, - genlh.CTRL_ATTR_FAMILY_NAME) - nl.nl_sendmsg(nlsock, msg) - rmsg = nl.nl_recvmsg(nlsock) - _FAM80211ID_ = nl.nla_find(rmsg, genlh.CTRL_ATTR_FAMILY_ID) - return _FAM80211ID_ - -#### TRANSLATION FUNCTIONS #### - -def _iostub_(fct, *argv): - """ - translates from traditional ioctl to extended ex - :param fct: function to translate to - :param argv: parameters to the function - :returns: the results of fct - """ - iosock = io.io_socket_alloc() - try: - argv = list(argv) + [iosock] - return fct(*argv) - except io.error as e: - raise pyric.error(e.errno, pyric.strerror(e.errno)) - except pyric.error: - raise # catch and rethrow - finally: - io.io_socket_free(iosock) - -def _nlstub_(fct, *argv): - """ - translates from traditional netlink to extended ex - :param fct: function to translate to - :param argv: parameters to the function - :returns: rresults of fucntion - """ - nlsock = None - try: - nlsock = nl.nl_socket_alloc(timeout=2) - argv = list(argv) + [nlsock] - return fct(*argv) - except nl.error as e: - raise pyric.error(e.errno, pyric.strerror(e.errno)) - except pyric.error: - raise - finally: - if nlsock: nl.nl_socket_free(nlsock) - -#### PENDING #### - -def _fut_chset(card, ch, chw, nlsock=None): - """ - set current channel on device (iw phy set channel - :param card: Card object - :param ch: channel number - :param chw: channel width oneof {None|'HT20'|'HT40-'|'HT40+'} - :param nlsock: netlink socket - uses the newer NL80211_CMD_SET_CHANNEL vice iw's depecrated version which - uses *_SET_WIPHY however, ATT does not work raise Errno 22 Invalid Argument - NOTE: This only works for cards in monitor mode - """ - if ch not in channels.channels(): raise pyric.error(pyric.EINVAL, "Invalid channel") - if chw not in channels.CHTYPES: raise pyric.error(pyric.EINVAL, "Invalid channel width") - if nlsock is None: return _nlstub_(_fut_chset, card, ch, chw) - - try: - msg = nl.nlmsg_new(nltype=_familyid_(nlsock), - cmd=nl80211h.NL80211_CMD_SET_CHANNEL, - flags=nlh.NLM_F_REQUEST | nlh.NLM_F_ACK) - nl.nla_put_u32(msg, card.idx, nl80211h.NL80211_ATTR_IFINDEX) - nl.nla_put_u32(msg, channels.ch2rf(ch), nl80211h.NL80211_ATTR_WIPHY_FREQ) - nl.nla_put_u32(msg, channels.CHTYPES.index(chw), nl80211h.NL80211_ATTR_WIPHY_CHANNEL_TYPE) - nl.nl_sendmsg(nlsock, msg) - _ = nl.nl_recvmsg(nlsock) - except AttributeError: - raise pyric.error(pyric.EINVAL, "Invalid Card") - except nl.error as e: - raise pyric.error(e.errno, e.strerror) From 2b496f9396e086fa73ddcc2a2106e237584fcc61 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 4 Dec 2016 00:21:42 -0700 Subject: [PATCH 116/121] v0.1.6(.2) fixed phylist fail on OpenWRT devices see Pull Request #26 --- CHANGES | 2 +- pyric/pyw.py | 2 +- pyric/utils/rfkill.py | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 3447ae7..def2b71 100644 --- a/CHANGES +++ b/CHANGES @@ -196,4 +196,4 @@ v 0.1.6 Continue with STA functionality o commented out constants in sockios_h that are not being used - no significant change but will reduce bytecode size o fixed error in iswireless (referenced in wifiphisher #329) - o fixed phylist failure for OpenWRT as pointed out by sarom5 \ No newline at end of file + o fixed phylist failure for OpenWRT as pointed out by sarom5 diff --git a/pyric/pyw.py b/pyric/pyw.py index 1dd267c..07f7070 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -183,7 +183,7 @@ def phylist(): phys.append((int(rfk.split('phy')[1]), rfk)) except IOError as e: if e.errno != 2: raise pyric.error(e.errno, e.strerror) - rfdevs = os.listdir("/sys/class/ieee80211") + rfdevs = os.listdir(rfkill.ipath) for rfk in rfdevs: phys.append((int(rfk.split('phy')[1]), rfk)) return phys diff --git a/pyric/utils/rfkill.py b/pyric/utils/rfkill.py index 9156539..e47156d 100644 --- a/pyric/utils/rfkill.py +++ b/pyric/utils/rfkill.py @@ -61,6 +61,7 @@ """ dpath = '/dev/rfkill' spath = '/sys/class/rfkill' +ipath = 'sys/class/ieee80211' # directory contains phy def rfkill_list(): """ From da94ca697d1e0ce81d7f3488ec206141524744d6 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 4 Dec 2016 00:42:00 -0700 Subject: [PATCH 117/121] v0.1.6(.2) fixed phylist fail on OpenWRT devices see Pull Request #26 --- CHANGES | 2 +- pyric/pyw.py | 32 +++++++++++++++++++------------- pyric/utils/rfkill.py | 4 ++-- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/CHANGES b/CHANGES index def2b71..3447ae7 100644 --- a/CHANGES +++ b/CHANGES @@ -196,4 +196,4 @@ v 0.1.6 Continue with STA functionality o commented out constants in sockios_h that are not being used - no significant change but will reduce bytecode size o fixed error in iswireless (referenced in wifiphisher #329) - o fixed phylist failure for OpenWRT as pointed out by sarom5 + o fixed phylist failure for OpenWRT as pointed out by sarom5 \ No newline at end of file diff --git a/pyric/pyw.py b/pyric/pyw.py index 44fd599..bbf1eda 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -72,8 +72,8 @@ __name__ = 'pyw' __license__ = 'GPLv3' -__version__ = '0.2.0' -__date__ = 'August 2016' +__version__ = '0.2.1' +__date__ = 'December 2016' __author__ = 'Dale Patterson' __maintainer__ = 'Dale Patterson' __email__ = 'wraith.wireless@yandex.com' @@ -171,23 +171,29 @@ def phylist(): uses rfkill to return all phys of wireless devices :returns: a list of tuples t = (physical index, physical name) """ - # we could walk the directory /sys/class/ieee80211 as well but we'll - # let rfkill do it (just in case the above path differs across distros or - # in future upgrades) + # these are stroed in /sys/class/ieee80211 but we let rfkill do it (just in + # case the above path differs across distros or in future upgrades). However, + # in some cases like OpenWRT which does not support rfkill we have to walk the + # directory phys = [] try: rfdevs = rfkill.rfkill_list() for rfk in rfdevs: if rfdevs[rfk]['type'] == 'wlan': phys.append((int(rfk.split('phy')[1]),rfk)) - except IOError as error: - #catch 'No such file or directory' errors, caused by - #missing rfkill - if error.errno != 2: - raise - rfdevs = os.listdir("/sys/class/ieee80211") - for rfk in rfdevs: - phys.append((int(rfk.split('phy')[1]),rfk)) + except IOError as e: + #catch 'No such file or directory' errors when rfkill is not supported + if e.errno == pyric.ENOENT: + try: + rfdevs = os.listdir(rfkill.ipath) + except OSError: + emsg = "{} is not a directory & rfkill is not supported".format(rfkill.ipath) + raise pyric.error(pyric.ENOTDIR,emsg) + else: + for rfk in rfdevs: phys.append((int(rfk.split('phy')[1]),rfk)) + else: + raise pyric.error(pyric.EUNDEF, + "PHY listing failed: {}-{}".format(e.errno,e.strerror)) return phys def regget(nlsock=None): diff --git a/pyric/utils/rfkill.py b/pyric/utils/rfkill.py index e47156d..ce0416e 100644 --- a/pyric/utils/rfkill.py +++ b/pyric/utils/rfkill.py @@ -61,7 +61,7 @@ """ dpath = '/dev/rfkill' spath = '/sys/class/rfkill' -ipath = 'sys/class/ieee80211' # directory contains phy +ipath = 'sys/class/ieee80211' # directory of physical indexes def rfkill_list(): """ @@ -69,7 +69,7 @@ def rfkill_list(): :returns: a dict of dicts name -> {idx,type,soft,hard} """ rfks = {} - fin = open(dpath,'r') + fin = open(dpath,'r') # this will raise an IOError if rfkill is not supported flags = fcntl.fcntl(fin.fileno(),fcntl.F_GETFL) fcntl.fcntl(fin.fileno(),fcntl.F_SETFL,flags|os.O_NONBLOCK) while True: From 949e40c46fb2f728c2a7c64108231d695749751e Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Sun, 4 Dec 2016 00:52:50 -0700 Subject: [PATCH 118/121] v0.1.6(.3) updated package for v 1.6.3 to PyPI --- README.md | 2 +- docs/PyRIC.pdf | Bin 508537 -> 508149 bytes docs/PyRIC.tex | 8 ++++---- pyric/__init__.py | 6 +++--- setup.py | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7622487..10b6bfa 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PyRIC 0.1.6.2: Python Radio Interface Controller +# PyRIC 0.1.6.3: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester ![](docs/logo.png?raw=true) diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index f569f8bd6e2b311048fcef021bd4442e45d7333e..55537bee85e1f1b57f08eaee93af948a201eec58 100644 GIT binary patch delta 10657 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 Date: Thu, 29 Dec 2016 03:29:37 -0700 Subject: [PATCH 119/121] v0.1.6(.3) README.md corrected (Issue #24) --- CHANGES | 5 +++-- README.md | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 3447ae7..c32e3bb 100644 --- a/CHANGES +++ b/CHANGES @@ -163,7 +163,7 @@ v 0.1.5 Begin STA associated functionality v 0.1.6 Continue with STA functionality o Issue #21 resolved. openconnect (renamed to connect) now works. (had to fix - how the ssid was being passed. as a string with a affixed null byte, it would + how the ssid was being passed. as a string with an affixed null byte, it would fail but as unspec, it succeeded) - issue 1: wpa_supplicant must be turned off - issue 2: caller/user must configure dhcp request or inet themselves @@ -196,4 +196,5 @@ v 0.1.6 Continue with STA functionality o commented out constants in sockios_h that are not being used - no significant change but will reduce bytecode size o fixed error in iswireless (referenced in wifiphisher #329) - o fixed phylist failure for OpenWRT as pointed out by sarom5 \ No newline at end of file + o fixed phylist failure for OpenWRT as pointed out by sarom5 + o Corrected README.md (Issue #27) \ No newline at end of file diff --git a/README.md b/README.md index 10b6bfa..d856115 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,6 @@ [![PyPI Version](https://img.shields.io/pypi/v/PyRIC.svg)](https://pypi.python.org/pypi/PyRIC) ![Supported Python Versions](https://img.shields.io/pypi/pyversions/PyRIC.svg) ![Software status](https://img.shields.io/pypi/status/PyRIC.svg) -[![Documentation Status](https://readthedocs.org/projects/pyric/badge/?version=latest)](http://pyric.readthedocs.io/en/latest/?badge=latest) ## 1 DESCRIPTION: PyRIC (is a Linux only) library providing wireless developers and pentesters the From 2f0214f51d02719cc08e60b88508725d7b4c8405 Mon Sep 17 00:00:00 2001 From: WraithWireless Date: Mon, 2 Jan 2017 10:49:38 -0700 Subject: [PATCH 120/121] v0.1.6(.4) Added scripts directory & ouiupdate.py --- CHANGES | 4 +- README.md | 9 +- TODO | 2 + docs/PyRIC.pdf | Bin 508149 -> 507967 bytes docs/PyRIC.tex | 4 +- pyric/__init__.py | 6 +- pyric/scripts/__init__.py | 37 + pyric/scripts/ouiupdate.py | 52 + pyric/utils/data/oui.txt | 5965 +++++------------------------------- pyric/utils/ouifetch.py | 5 +- setup.py | 4 +- 11 files changed, 939 insertions(+), 5149 deletions(-) create mode 100644 pyric/scripts/__init__.py create mode 100644 pyric/scripts/ouiupdate.py diff --git a/CHANGES b/CHANGES index c32e3bb..0683b4c 100644 --- a/CHANGES +++ b/CHANGES @@ -197,4 +197,6 @@ v 0.1.6 Continue with STA functionality - no significant change but will reduce bytecode size o fixed error in iswireless (referenced in wifiphisher #329) o fixed phylist failure for OpenWRT as pointed out by sarom5 - o Corrected README.md (Issue #27) \ No newline at end of file + o Corrected README.md (Issue #27) + o Added scripts directory + - added ouiupdate.py to scripts directory \ No newline at end of file diff --git a/README.md b/README.md index d856115..b59a1be 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PyRIC 0.1.6.3: Python Radio Interface Controller +# PyRIC 0.1.6.4: Python Radio Interface Controller ## Linux wireless library for the Python Wireless Developer and Pentester ![](docs/logo.png?raw=true) @@ -187,12 +187,11 @@ form t = (error code,error message). ... #handle the error ``` -Work is ongoing to help clarify some of the error messages returned by default -by os.strerror for example. - Read the user guide, or type dir(pyw) in your console to get a full listing of all pyw functions. +The examples below can also be run with named arguments. + ### a. System/Wireless Core Functionality These functions do not work with a specific device rather with the system. @@ -867,3 +866,5 @@ with (-) are not included in pip installs or PyPI downloads * nsearch.py nl80211 search * commands.help nl80211 commands help data * attributes.help nl80211 attributes help data + + scripts script subpackage + * ouiupdate fetch oui.txt & update oui dict diff --git a/TODO b/TODO index 95ee978..b828579 100644 --- a/TODO +++ b/TODO @@ -22,4 +22,6 @@ 39) parsing wiphy_bands (should we add the below?) o _HT_MCS_SET: a 16-bit attr containing the MCS set as defined in 802.11n o _HT_CAPA: as in the HT information IE + 40) add IEEE update (should we modify to use pickle or keep as?) + 41) add command line versions as scripts? i.e. up, down, macchanger etc diff --git a/docs/PyRIC.pdf b/docs/PyRIC.pdf index 55537bee85e1f1b57f08eaee93af948a201eec58..355b07fab3ad19c0c2b5915a111bbdb8583fd52f 100644 GIT binary patch delta 9861 zcmaiaWl$VIw%48bK>@Zj$5?(XhxFW-AxwYybY zwLeau+xMLNM>I#{5XRdS|(6iEAhAN zVex65{NFFl*)((3N^y*GkC*qPn7^49?MUj+x;=S6AebU{AndKd@(a+U`*Ur9Ro{5y zr?&9vU{Zr>6tNwH<KEe=dx@zd7*r!$hx%ROq|c*NMpZXrEA<2<>ahU z!B=r)ChzPSz$$n-Hhwtkl&_z9QLvuM2ahH$jPzx?COq|lV&iMM%kZ)`%J!S9cKsc; zSPIcpjT^UG`j(*YGUvb8SVW>P=p2_zo&HQUf39LzbWt#m9bq6wV>{+{9$&CBwvnFW zHZk$G-lc3dzqVUkluNgyoG|1t1G4)agKa>rkXugzZU0#)i9KutLb||NhryMT<)I>bFuhmE^kpP@jP^0!F#K2DSC1rE z>z`81{y_s694hC_w6ufgmsyO3ru0XzQXaws-MY1j+;Pjhts=X+|yd5cu^O% zdLYL)@MEj{+wT=WhYB1IewdFL;1V}N$B9oOjYwyiej?e_Q4Y+B1bi;@wsS6#M5DLH z`|4N;H}Ac~&XUH<64gOZ>?q!d31-bHz>YM?r3~F{-b)@O6XCc&9&{nvkx?zk(9gvy zyso1Y%!bmp1Ya#xGiwGMSoxTC38I=X45=PkfvPIjH$A2vNFZQLbrX)b{Qc(3iTMFT+* zXA7RIfDWJKxl+N)e%tZlCTNu+(W3pWm-0UT+oD;-II}$aC&?eoWhgN}X5Zc2AYw6f z&(z@IpLT&xJ%MSnR@x5}CsdUKDnlXR{3oIHCwX{jZtK%@Nh4siR^|?{-t`JxN&}rH zF4FBSF63(K-muBxGV2I=ma0 zriHLByHzrhvSlsr#U{DQ z0;ET62=g~2f`wz8hpRo5*#+go<%+OEdv!agFw=J~j9J;fpc$GDjx8F#pyt#({~fn{ zrxV=R=ktma9UW81CfUo__0cGIR{?yb6o2C+7BStIIbAB}&umslG}C9|_VdLJw>jqH z9VGk35-D0F!?z_ydE$FPyY+RQKnjlSw590#3c2UFw#Xf2>6wHsV%Rz`^7rvs6X$uB z(}_vztEj=#a_`F?0R$n{ReWs$8wf4>e1H#SZm^kMM+t{f7_# z0QV2@^`7tuyoRtR^`)i=05^5gWSA3BZM(a{%t3%G>~)`bSQH7A!Q32Y>?&VdVZ)R6d(4ZIL-Jab$Y790d7I@#ekVex^c&$#G9@7Z=2OzVj520Kr3HBko6WLU~4yHOP=n$mf zTnuBL0Ifm-U_;-f0J!y|k^nAPsEG8xUQp)#^&$oYyg?x{|F&%|h)nhV(f|}#Xo2iM z`+5W-GqhI*umSb`@=wkXLu7&O$pR9gV{-py68!}r4hub%|EG+&A~1pT$4BM6#W4XF z=&*27w&i3|8TggW$d9^gc;=|1IoX9|QJAVRlFX+{)G^7jhg3c{sxzx#3f38^9IgwY zk&&}8+OP42rTn|cDcGZWW8*uv|}{Ke5f5fqKWk%EOI?F^oeE7Uh$R`F~YhYmx`pVG%F!~3#m9{H^lZq`>Y!i zdK*}Fy4@&eEPElwi3HW#1Q=RfX?3h8D5Hb|^gEsME-w)HdMoc((bGRoG6A6ID=_9qG z+)BP@+BW(19#P4dOhe*pKuv=;psSxcmXPyT775w0;xdoeRAG4A@UB{v+Xz?MQs`(X zvpol26Me7Yk7n~Dh1ZuGH#Tcu&jNQ2rhv3#2bNoT0562%p%~odVjfl<3BbmG5Olpa zxIIH_bsifS4&W$AF%36xaOqepWA5C&2wMBg|ij|Y4 zyN8>VnIn{B1p%oZ$qL{@1}gv!4h1lQZDV%pl3tD5CCP2rK_aa8Zm>UKT!oa;sIj{p zM=VWmBHWrC?tiR0YC=PI*2e`Bfot_z?fPi&2*vb~zZ(u$-0?+!t>Dm}Z{g5Y5ccE9 zXS66*Jq$wSe7IB?JyFc$KPz>r5MsnKvYH@d$d_qY(ugX43U84*4133|J=&21Ps*+A zSPW`dt~M%n&CjwU59L!PT(Ibs!|%$=Cu{|3Wz48_((o~?r)`HBeBR;Q)c#f^JIOp4 zC?A5@D4hT89i%dJ5aF&kb5}~m#8F-QAQ-^)p+PP0;(@~} zh2&C)%pyY?-g}}kcVKG*xrN%aCW^5SIiMmME-G-Qhe7%$YduZSp_>*z*eA2N%P&XC zu@ware9ytk)GHe;vUJ>PN*F$bOF;r|Sz*#A5I7WdA80@e>E}0#jhp&`+es6Y(;u=y zgpBY#sDyzLFK2_Lh}RWIErT8sygFvcnPQzq;#Mp*7#4wDI8qpO6@HBDsHSZ~LX>Cd zj=!MqA^NyucYiAeZv5qCV*KvnUhDVxwz@jn+>DX1W&eC+cRxECao@hy*7z6{ zQ@;8zJnHRSAr|l+b4VOPj66EP)6yn+X^_}0&a(LC^ZYh%Qn0%P_HOUCUox0mZq{k8 zaIRPncnG&zdvRZC^{;(C**kY$U-7@~S1DY@pI$w!;47P%J#*&b9gCo0K_%`31y9Nux0f?qQ`oX4(@*`ACJA*J5g_$!fX8iZkk53r2MZIz{qx zK9lisKNO;aoF^snsKg#ZKML1PJ{CUeUC zUd4c<(7;uW!%9M2qYf>)+1G zb42BqM$gyQ1H7+AX2@28m9?Hp(VOkjRau@g^up9ry1C`^ql7$%%GVj3ywM3YUmCDo z=|1c{XQX=1C(Z4+0&XuZ#x8e!?GWEGyM=a@q|IB_{H#rsnWYT=@>#W9SXUpUrbY7E z9**zPnye{z-c|%lY0g7~A^~{dW9!(D%hC>H-*-Q(-YeIkChO54Mg#?%=+s#52lh%Z zyhgFDE$!QWyDK-D%szd_T_%3Qm8HI8`WSx0q~Gdi@Zney55g*e^e!HT1oKT2?*b<% zRwU>Gj)FHl5GHJfDoA&x84)vQM5%Y>4gA8^->Af_&N)0an_f4A@)5WX<_uMLYSc(g zTgrT0q1X4S9x`@}0H<1mYKd&J+lEL4IHFRyM3)7^&;_+G;)LsInvxl-nOoH|sN};I zcWaYrA_DqpFhiUb4)BRELogJu*8Ip#VXU!8^x zg3+$u^6P0TlUKxiZe7bO*kt(b#Xa1oQCl$S6SuY}M>C}A<3CP1PRpP*B{`+OAfn~^ zy6!K@skX13MHim+v}&lVhR>hv2#rlqCtUjrogWWBzChF2BqaQIPCL+I#{D~Gt|Fv> zEn(IS@{(8w;_L`uZH9@jLBJ0()MELUV`0KO3sfqImqVX84<#NR`Q2oI2Fit(afM%z zb%exaGKaFQBRY^=CO-an_`@gU6RNn{0mHw+C*;;WJ{q?2W!2gq^t;>vmps)+mTH8Z|3yk-a0o!FXKL9U3)kR^PLWb>WrZ zR4ySc5rw`OD(;oc9J1fb^_ZKiYY$Qrq~}+bw+MSwnX^V_uLif6Kb|u+;%_+5SiJls z4j?=XK)X{ykS<|&jp^M`y<^uELX2<}{?DQaK#cG-B}R-8K&Rn+AiN@B%usYZO5==J z84f7&33>qU`dgSW1Gb0(LF!Sv@rDZZhL)LT zEQAB1Ot{^BBFopcefc->h;Y_DY9*e&-A`?XMPuc=bAAOS&q`jyqxqTiT$*WdeVDz3 zU2B$$^53aoP0H2T#I9Jz^YY4nx)&XDFBB?NLvO&T?K~aa)ii9FG_d^m1YITx45({Zxj_tRNfEoy1aw{lB9{qZfu@no`irc)vE{Ay4Yq?dbJ}> zSp_iDP%WI5efpm&!3`y}9(kLYAUN254PmBP`jq5pxye3_7R}7d9;{%R4+`+4oY4xo zC1+^N$9Tw1;!RI6x1XBs$n~t@+?s$*z9CrEnp7P2U@SsD-X5C+2&x%Sk8q32g9*a^ zR}sRDZqzrKK5IpicsyZ6VnNmXt$UxmDGa>bzkra=$^AFYU?PNdjX-lTpP1VHpbI^O z-$MxHQ*oLa793~&5>_5}^Hk6H42CD8hXzt8Y%>kDD{#8OwM%vRLcOFeJg06mU&>KRr5U`` zH!)DIE@^>elpj`(*(4c}j|GwJ-HV;b}4AK;r z>C=|-?^1=W!t7RsB`g!r6fbRK*A!O_Bw)<8;4UOm$AO?6=);$PmX?V6hd=)S2*_Qz zg-{}(|3j^HZMHeRx+)J20~o}K!{G5%J_<)Lk6Ic<@Bmv3Dv`y1Bvot$4|3Mqpx%j4 zFZl{A3nKB&(>C~;r9auEqT`U*Z(l#l&Xgok%KL}^+pIi3OBJKp!rdyflJ>fL8?d-! zf9JQF$QPd;7(=>#_=d5c$SxT~^%uM5Fitdm7%86xXxop}>Duj|7Qih-L86oErjU=V zY&m4UCXzgB`1y@jZ`WL76RP{5aa=Abql|5|BunceOD?H=VGqdGC7J+T0A%ha_&c)_ z+e7aMmA|6xarAxNdQooN3Tl1Ka_O)t!@e3CxpbQVD**pG_zbd>Y&@jbt^5h=$#2< z>^6(Sp{QWHjkNqv#=}Yx9(@eQQnH18*WVh60pqmfDhb|1$KdA-bB349q{9W;btK_} z$2`k)GH$7sZCJK_hE}{B`t)Bd5}?J6<5H-{K7BMJz+1m@llzK7550W z!nqaWnPQ%MFp0pn#5W@?dYnd2myw0rgdtQhU9+1$61-NP2x;e0GuH;%#>Zg;cio#g z61>-qWC9TrbfzDjgxUn5e5LFVQ(ZH($;vK*o`0CR=pcyS4Cb)xhO?lD0QywXF@8)E zk`d(bjj;7eI5rs2!)*_7t3%T{AmzB7u2nJJg%RLBA0&9)WxnL0ZFGmXAHhnzO8LWV zi=u^}+bv&J4U{uAz^I!@{i9x2jmLK#4ajjY^FNk@0; zF}rl&0#CHB+#E?}kq4L3JjxkC<#gBJP6-aE?%IrvSXeu_XT zZ$Px>lyo%Zn+T)yo%mGEdi$Lcw)DUBvEny3mXrYq3mW(hHGgQtgv#|eHEt+RZ?;G} zcANAry-<);8GHh5k%^Xf1+;{^d}03@3!ev&``_e&3@P}6Z>l8c(hbI;GxBHfrhuA7 zeP8_+x8S&~@O?EqZlGQW8tiipY3=zmE8%N?Z~6(b2@Vw-xA{FPv5@KDx3G}}-R>cZ zAV)sa!HQ1CPd+xUajk;k9zssd7xwkuGs&H?jdJ&RTF;CG?&9P0-*QI#K&7hV^p#?x zp?|u$B)d7^TpjvKAh^e($IijGipapYv@aRIq-wX<>2fRj-swUzdBIVi+HN-G+?;2x zS-0$wRolJ|+h){ztMpMhoo79=dQZsJ9F&$)#9zvajT?dBl)KgNvz1_pmXbv15y zyXB(3A%%@#6C6Ayaau45i_1sfHB^Xe7T_pUxHoyShr`DQ1NSMuX{LjHvxb(7(DcSV zxy+(vwO@K6W;e=$ao8fkeGpbzo@0Z+`Ggcn$DryPs99S9=9ac`2npaL#qEIzSp2KPbIKceo^^TmGh;(oLc{MivowT4}sp? zFzElL+cE2wVY1M0D;&|3`+zE z$rsKY@pu|Q{M~@W8Wq4dhGa*?E%tsuqOMJ3aIT(i@#&7*U_I0Fcsao#z)!u@StaWB zRIaK`gyEmq`*inPcRds5pJ@I+;*gYx_~wG_zWfPUHcP+`EQ%wOly67^m^CBrgfU`{ zFp28;$57>1PYrz2^?ne2Q}nn@)P2jcNf|fB4FC0h^|slrzk!ip=DkS^oaW+~<}WRJrJO0ujB8$i4aUcXrzH5;1XY(oSaPgb0eM z@@LDx9fI(2UZa4bKSq~k2N`^SWt*2Y1_G^+a8Kn`HY-x|gI|`kz+@EdUOx-nKIw$M z*g2enVykNN?#%4Hf1v$9eDqvc;y@uPr7Y@X3?X8kv#->x=rnI7G7ws0cQ`%B?=zh+ zvfw@_pLB|u0@cgf)-0oNi*oOEL1iDli(I6G`pCce-JxqV4Xy<5r>*e#w4tomnK82Y z)V>1N;#X7LF%H+8!AC?%V^-Y{D~2^=X8{hVP2KFO#vkj9XQ!6|bKY{6n6%v3QHKq{ zz^2=;_Lp;BN48D7r;a~=brzv*E82e@+|)MVQBC8Y7#pu~wKHj!ScR*oUEJU%1)5>i zoiAF_jD{uMiiU|+D;>3!!2re<0cRh49_EUkvs2oW3Z=SL!5l;oueU`_OB?Z~YL#d^ zUbA39hqxls3qM;iCV>m}(KdQ5?41g`mefCUCB=5Fse+W<-~6dKe+=;b3q1b??OTOj z*M+prj~WS9e^Z$gW-Wh}(hggCI`C7>{X_@!G*xW|=|ahfh_|mfyp?MEp^k?ZXH6$^ zyB#88eyd=do?x%EWY9$UT&MB%3X<~>+QR;zqmGjy-%PAan7nBk$9bOS53JrvoR}8rN=6x zjnXee07f8$rLq0}95>gT)7{+JYBgr6uM;{5+l;69QFr8{7mFXgcByE&48S^kF?Vtz zI8r8G|D|{gG^Ot-95&}deexNyA?Bj+ns&)A?gM< zy@5BosqqZIF|*m(X~@1x!?Lx%UqHm#;&7#njo+^d)9S@ud?K`v2)6AXPQojS_P#eC zXRWn8zBZEwHg%G&_;`9>UxRDuTiVO=sh<#JzNx;~!M&}lw7p({#Z1;;8=mjxvjUqM zpYQVpvf8C-25*%P-Z22ecy9me&KcUs2SBag`vt%zVdZ1zVCUpu=N4dRXJO}~V`ryh zKw(pIwgj4aSW(ae1v%L{{trt%T^#@sPMw{Pi=PX~$0^At1?1%ykd~6+kOJ~Zvdi%B z2=MZq;C~S&WPBtDO3J!iQf&Y0Zrs+84jqA>eIaJZ& zM*!)vZogn%Y*oem9F^n%78D4qOUsbQlK*R?;+AHpK&jT4a>9{Fqmc9bmHb_p{Mu-b zIqUk-zpY)B9_MK}j1mIrlFXr}>H-dgNpidyJ5L%3vt?qR{z&6aEi@D9`l-j=(~kcc z++ZlYXrlj#pjvpieP1>jXDns*`jx2+s2tawqU8PB$~~#ejX6mwzM2JHO<5DRBj?N zQIf0~0x{UB%cpj}}X{HF#2;r{SpF5M<8G zzCVA9EJNDvU#-y9dg0lO(0`duND}ztKoY}qNX-^#eRi4A+L5VrKznv-ZgLTe zy5hx~cqS_tT{H!b3DOa9Nr?*9W|Sniz0#UCy>-ydixiy$+QU6)a_G*JirQlwPn(7! zF2te};|?kjnO@T@q+*E1ggffb-dQfFp?URnmdjT*vz+)6w=E$0VRW~}2i|&0i>R%` zoBZ7Ae4F1CtKK-)9GJ=e<-L)nvJn*WYT~$=edqOMQ@HdS`5RgE!Fn6`6kXOmO7>#) zEB_rH$-Ga0(uZ|>Lb{J#av3)aELZ(1n}rrGf*3C<&mtOFV^f?V?n{!%V=Tu2esY#X z7yR3+d}|k9G{c;ikdoAGeb|Qb>7jCTzN5}j^o!=Vdu^qLRroW|PV?b~EaJ*B!hKRM zMqgL=+l39~i+oJ3(a_a7U`m=@9O7)%s5>*qgKMN4kmDr_i&IzFq5Lf>> zV&IVp_z8*lm1~C<*%3{xx(X+HwEK_4npf<(?fMs7bZIJ!Yv)agU^P`2ew?p_DAg_o zzpKHGks!uYLW4y0YFC6DT~GS*IE9*^_|=!;QEAl4sRbW&eLE^}V!;Q8Use}rHcrEL zVerxYwCbpJB!$iioH@d__6dVPgDP@O%3}wss}Aj)0|%Zhn-UBNQ9!n~Z;=R$IyWdI zKoy#@^pu|y{2^J8kjN`s=4rhzwMdQ_^v8(z7}ZuI=aCg8;kle_lbxiTbL$Ga#;=)m zIQ5e9iyHHyKt2V#M>)}*=3S=+?w3gu$FVLEE$@C-X;xR{4dtp|Wkg1wc%{5i<^Jjw zVoa1@f1sfo>rz+oVNylojvOA&gA5K831N#|Gv<|!(AoqEe%IWj1&uAv+G~QJKp5GW z3`J_MYa)sL1QBgML{Tcgof#Cv7^g0u*LD6SVi0#$^WV!cL z5|vXdP(Q&Lz1w3*`GcKaV5L}iyGY3GB$VJ~VPl)SxNH{PmsVocl4mti0&|`80o6ko zwKh*0xl;E&Srfb7l%duc%0PW?_k7NTIn47281F)191kqA)RimwORg2BCEq%0Z;Br7 zD2Cjruha;>BPrDg@&EUmKxfGLfq-`^`DAaU(ke`B;x0Gz0Cb{FGrwPB)?5bhfmzmq z3S~xQcrY}7KaW^_MLfwVUTTfI$p2`%?st*&$E%%l|5$SCgC*n1I>;HISqrdbxts9k zFRdj}ONq9tI|s$xEx_}S;g4jh%Dh|%rK`UL&Pae?YX}3ir8BfU#^@z&Y!&X(DHD0f z0@XIt3munGhn~Mj&C(FHw3fQH#l!1(>bEmSlwU4Z&DSP7po68J8yax}x4Uheaf6q+ zef(s5ed_@)Ilv}w46+IAQ>px+ET#>$8Vnn{Nj(payDIGqAd^p*4=b?V6JmVQB`XD= z1p?a$aPET!Sl!rmQeXuH-0`LL8xF=|k70VkB$&4wg?l=7X}%i;w(6J);^2fIzLX;& zZ$;^U+pZ5{Drk@D7mwUijmK>EVeC!HeQuZn&L?eJ8tNSl(17A1*~AZ3|kZp_qOzMgvS$ob>H$?!}c1o+`-1yqf)CkIt0m9A48zwxLd20c&Wr$Lavqe1?OYh)}YW z%2V*M5=w)pP_{{8_IVR5&udEn&}4GFAsGLq^{tOZ`KFz~*ZG+09f}>-=cra$-w%1i asNyHKhK_Uq$WVFs`8ZK%XrxtSQ2q;%^#iH^ delta 10048 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 Date: Thu, 16 Mar 2017 16:02:55 -0400 Subject: [PATCH 121/121] docs(pyw):simplify docstrings for some functions This patch will simplify the docstring for some of the functions in pyw. This includes moving the requires privilage to the warning section of the docsring. --- pyric/pyw.py | 687 +++++++++++++++++++++++++++------------------------ 1 file changed, 365 insertions(+), 322 deletions(-) diff --git a/pyric/pyw.py b/pyric/pyw.py index bbf1eda..b0d4833 100644 --- a/pyric/pyw.py +++ b/pyric/pyw.py @@ -110,8 +110,9 @@ def interfaces(): """ - retrieves all network interfaces (APX ifconfig) - :returns: a list of device names of current network interfaces cards + Retrieves all network interfaces (APX ifconfig) + + :returns: a list of device names of current network interfaces cards """ fin = None try: @@ -129,17 +130,19 @@ def interfaces(): def isinterface(dev): """ - determines if device name belongs to a network card (APX ifconfig ) - :param dev: device name - :returns: {True if dev is a device|False otherwise} + Determines if device name belongs to a network card (APX ifconfig ) + + :param dev: device name + :returns: {True if dev is a device|False otherwise} """ return dev in interfaces() def winterfaces(iosock=None): """ - retrieve all wireless interfaces (APX iwconfig) - :param iosock: ioctl socket - :returns: list of device names of current wireless NICs + Retrieve all wireless interfaces (APX iwconfig) + + :param iosock: ioctl socket + :returns: list of device names of current wireless NICs """ if iosock is None: return _iostub_(winterfaces) @@ -150,10 +153,11 @@ def winterfaces(iosock=None): def iswireless(dev, iosock=None): """ - determines if given device is wireless (APX iwconfig ) - :param dev: device name - :param iosock: ioctl socket - :returns: {True:device is wireless|False:device is not wireless/not present} + Determines if given device is wireless (APX iwconfig ) + + :param dev: device name + :param iosock: ioctl socket + :returns: {True:device is wireless|False:device is not wireless/not present} """ if iosock is None: return _iostub_(iswireless, dev) @@ -168,8 +172,9 @@ def iswireless(dev, iosock=None): def phylist(): """ - uses rfkill to return all phys of wireless devices - :returns: a list of tuples t = (physical index, physical name) + Use rfkill to return all phys of wireless devices + + :returns: a list of tuples t = (physical index, physical name) """ # these are stroed in /sys/class/ieee80211 but we let rfkill do it (just in # case the above path differs across distros or in future upgrades). However, @@ -198,9 +203,10 @@ def phylist(): def regget(nlsock=None): """ - gets the current regulatory domain (iw reg get) - :param nlsock: netlink socket - :returns: the two charactor regulatory domain + Get the current regulatory domain (iw reg get) + + :param nlsock: netlink socket + :returns: the two charactor regulatory domain """ if nlsock is None: return _nlstub_(regget) @@ -216,10 +222,11 @@ def regget(nlsock=None): def regset(rd, nlsock=None): """ - REQUIRES ROOT PRIVILEGES - sets the current regulatory domain (iw reg set ) - :param rd: regulatory domain code - :param nlsock: netlink socket + Sets the current regulatory domain (iw reg set ) + + :param rd: regulatory domain code + :param nlsock: netlink socket + .. warning:: Requires root privileges """ if len(rd) != 2: raise pyric.error(pyric.EINVAL, "Invalid reg. domain") if nlsock is None: return _nlstub_(regset, rd) @@ -240,12 +247,12 @@ def regset(rd, nlsock=None): class Card(tuple): """ - A wireless network interface controller - Wrapper around a tuple - t = (physical index,device name, interface index) - Exposes the following properties: (callable by '.'): - phy: physical index - dev: device name - idx: interface index (ifindex) + A wireless network interface controller - Wrapper around a tuple + t = (physical index,device name, interface index) + Exposes the following properties: (callable by '.'): + phy: physical index + dev: device name + idx: interface index (ifindex) """ # noinspection PyInitNewSignature def __new__(cls, p, d, i): @@ -261,20 +268,22 @@ def idx(self): return self[2] def getcard(dev, nlsock=None): """ - get the Card object from device name - :param dev: device name - :param nlsock: netlink socket - :returns: a Card with device name dev + Get the Card object from device name + + :param dev: device name + :param nlsock: netlink socket + :returns: a Card with device name dev """ if nlsock is None: return _nlstub_(getcard, dev) return devinfo(dev, nlsock)['card'] def validcard(card, nlsock=None): """ - determines if card is still valid i.e. another program has not changed it - :param card: Card object - :param nlsock: netlink socket - :returns: True if card is still valid, False otherwise + Determines if card is still valid i.e. another program has not changed it + + :param card: Card object + :param nlsock: netlink socket + :returns: True if card is still valid, False otherwise """ if nlsock is None: return _nlstub_(validcard, card) @@ -290,10 +299,11 @@ def validcard(card, nlsock=None): def macget(card, iosock=None): """ - gets the interface's hw address (APX ifconfig | grep HWaddr) - :param card: Card object - :param iosock: ioctl socket - :returns: device mac after operation + Gets the interface's hw address (APX ifconfig | grep HWaddr) + + :param card: Card object + :param iosock: ioctl socket + :returns: device mac after operation """ if iosock is None: return _iostub_(macget, card) @@ -314,12 +324,13 @@ def macget(card, iosock=None): def macset(card, mac, iosock=None): """ - REQUIRES ROOT PRIVILEGES/CARD DOWN - set nic's hwaddr (ifconfig hw ether ) - :param card: Card object - :param mac: macaddr to set - :param iosock: ioctl socket - returns True on success, False otherwise + Set nic's hwaddr (ifconfig hw ether ) + + :param card: Card object + :param mac: macaddr to set + :param iosock: ioctl socket + :returns True on success, False otherwise + .. warning:: Requires root privileges """ if not _validmac_(mac): raise pyric.error(pyric.EINVAL, "Invalid mac address") if iosock is None: return _iostub_(macset, card, mac) @@ -341,10 +352,11 @@ def macset(card, mac, iosock=None): def ifaddrget(card, iosock=None): """ - get nic's ip, netmask and broadcast addresses - :param card: Card object - :param iosock: ioctl socket - :returns: the tuple t = (inet,mask,bcast) + Get nic's ip, netmask and broadcast addresses + + :param card: Card object + :param iosock: ioctl socket + :returns: the tuple t = (inet,mask,bcast) """ if iosock is None: return _iostub_(ifaddrget, card) @@ -389,25 +401,26 @@ def ifaddrget(card, iosock=None): def ifaddrset(card, inet=None, mask=None, bcast=None, iosock=None): """ - REQUIRES ROOT PRIVILEGES - set nic's ip4 addr, netmask and/or broadcast - (ifconfig netmask broadcast ) + Set nic's ip4 addr, netmask and/or broadcast + (ifconfig netmask broadcast ) can set ipaddr,netmask and/or broadcast to None but one or more of ipaddr, netmask, broadcast must be set - :param card: Card object - :param inet: ip address to set - :param mask: netmask to set - :param bcast: broadcast to set - :param iosock: ioctl socket - :returns: True on success, False otherwise - NOTE: - 1) throws error if setting netmask or broadcast and card does not have - an ip assigned - 2) if setting only the ip address, netmask and broadcast will be set - accordingly by the kernel. - 3) If setting multiple or setting the netmask and/or broadcast after the ip - is assigned, one can set them to erroneous values i.e. ip = 192.168.1.2 - and broadcast = 10.0.0.31. + + :param card: Card object + :param inet: ip address to set + :param mask: netmask to set + :param bcast: broadcast to set + :param iosock: ioctl socket + :returns: True on success, False otherwise + .. note: + 1) throws error if setting netmask or broadcast and card does not have + an ip assigned + 2) if setting only the ip address, netmask and broadcast will be set + accordingly by the kernel. + 3) If setting multiple or setting the netmask and/or broadcast after the ip + is assigned, one can set them to erroneous values i.e. ip = 192.168.1.2 + and broadcast = 10.0.0.31. + .. warning:: Requires root privileges """ # ensure one of params is set & that all set params are valid ip address if not inet and not mask and not bcast: @@ -441,13 +454,14 @@ def ifaddrset(card, inet=None, mask=None, bcast=None, iosock=None): def inetset(card, inet, iosock=None): """ - REQUIRES ROOT PRIVILEGES - set nic's ip4 addr (ifconfig - :param card: Card object - :param inet: ip address to set - :param iosock: ioctl socket - :returns: True on success, False otherwise - NOTE: setting the ip will set netmask and broadcast accordingly + Set nic's ip4 addr (ifconfig + + :param card: Card object + :param inet: ip address to set + :param iosock: ioctl socket + :returns: True on success, False otherwise + .. note: setting the ip will set netmask and broadcast accordingly + .. warning:: Requires root privileges """ if not _validip4_(inet): raise pyric.error(pyric.EINVAL, "Invalid IP") if iosock is None: return _iostub_(inetset, card, inet) @@ -469,14 +483,15 @@ def inetset(card, inet, iosock=None): def maskset(card, mask, iosock=None): """ - REQUIRES ROOT PRIVILEGES - set nic's ip4 netmask (ifconfig netmask - :param card: Card object - :param mask: netmask to set - :param iosock: ioctl socket - :returns: True on success, False otherwise - NOTE: - 1) throws error if netmask is set and card does not have an ip assigned + Set nic's ip4 netmask (ifconfig netmask + + :param card: Card object + :param mask: netmask to set + :param iosock: ioctl socket + :returns: True on success, False otherwise + .. note: + throws error if netmask is set and card does not have an ip assigned + .. warning:: Requires root privileges """ if not _validip4_(mask): raise pyric.error(pyric.EINVAL, "Invalid netmask") if iosock is None: return _iostub_(maskset, card, mask) @@ -502,16 +517,17 @@ def maskset(card, mask, iosock=None): def bcastset(card, bcast, iosock=None): """ - REQUIRES ROOT PRIVILEGES - set nic's ip4 netmask (ifconfig broadcast - :param card: Card object - :param bcast: netmask to set - :param iosock: ioctl socket - :returns: True on success, False otherwise - NOTE: - 1) throws error if netmask is set and card does not have an ip assigned - 2) can set broadcast to erroneous values i.e. ipaddr = 192.168.1.2 and - broadcast = 10.0.0.31. + Set nic's ip4 netmask (ifconfig broadcast + + :param card: Card object + :param bcast: netmask to set + :param iosock: ioctl socket + :returns: True on success, False otherwise + .. note: + 1) throws error if netmask is set and card does not have an ip assigned + 2) can set broadcast to erroneous values i.e. ipaddr = 192.168.1.2 and + broadcast = 10.0.0.31. + .. warning:: Requires root privileges """ if not _validip4_(bcast): raise pyric.error(pyric.EINVAL, "Invalid bcast") if iosock is None: return _iostub_(bcastset, card, bcast) @@ -550,10 +566,10 @@ def bcastset(card, bcast, iosock=None): def isup(card, iosock=None): """ - determine on/off state of card - :param card: Card object - :param iosock: ioctl socket - :returns: True if card is up, False otherwise + Determine on/off state of card + :param card: Card object + :param iosock: ioctl socket + :returns: True if card is up, False otherwise """ if iosock is None: return _iostub_(isup, card) @@ -564,10 +580,11 @@ def isup(card, iosock=None): def up(card, iosock=None): """ - REQUIRES ROOT PRIVILEGES - turns dev on (ifconfig up) - :param card: Card object - :param iosock: ioctl socket + Turns dev on (ifconfig up) + + :param card: Card object + :param iosock: ioctl socket + .. warning:: Requires root privileges """ if iosock is None: return _iostub_(up, card) @@ -580,10 +597,11 @@ def up(card, iosock=None): def down(card, iosock=None): """ - REQUIRES ROOT PRIVILEGES - turns def off (ifconfig down) - :param card: Card object - :param iosock: ioctl socket + Turns def off (ifconfig down) + + :param card: Card object + :param iosock: ioctl socket + .. warning:: Requires root privileges """ if iosock is None: return _iostub_(down, card) @@ -596,10 +614,11 @@ def down(card, iosock=None): def isblocked(card): """ - determines blocked state of Card - :param card: Card object - :returns: tuple (Soft={True if soft blocked|False otherwise}, - Hard={True if hard blocked|False otherwise}) + Determines blocked state of Card + + :param card: Card object + :returns: tuple (Soft={True if soft blocked|False otherwise}, + Hard={True if hard blocked|False otherwise}) """ try: idx = rfkill.getidx(card.phy) @@ -609,8 +628,9 @@ def isblocked(card): def block(card): """ - soft blocks card - :param card: Card object + Soft blocks card + + :param card: Card object """ try: idx = rfkill.getidx(card.phy) @@ -620,8 +640,9 @@ def block(card): def unblock(card): """ - turns off soft block - :param card: + Turns off soft block + + :param card: """ try: idx = rfkill.getidx(card.phy) @@ -635,10 +656,11 @@ def unblock(card): def pwrsaveget(card, nlsock=None): """ - returns card's power save state - :param card: Card object - :param nlsock: netlink socket - :returns: True if power save is on, False otherwise + Returns card's power save state + + :param card: Card object + :param nlsock: netlink socket + :returns: True if power save is on, False otherwise """ if nlsock is None: return _nlstub_(pwrsaveget, card) @@ -658,12 +680,12 @@ def pwrsaveget(card, nlsock=None): def pwrsaveset(card, on, nlsock=None): """ - REQUIRES ROOT PRIVILEGES - sets card's power save state - :param card: Card object - :param on: {True = on|False = off} - :param nlsock: netlink socket - sets card's power save + Sets card's power save state + + :param card: Card object + :param on: {True = on|False = off} + :param nlsock: netlink socket + .. warning:: Requires root privileges """ if nlsock is None: return _nlstub_(pwrsaveset, card, on) @@ -684,24 +706,26 @@ def pwrsaveset(card, on, nlsock=None): def covclassget(card, nlsock=None): """ - gets the coverage class value - :param card: Card object - :param nlsock: netlink socket - :returns: coverage class value + Gets the coverage class value + + :param card: Card object + :param nlsock: netlink socket + :returns: coverage class value """ if nlsock is None: return _nlstub_(covclassget, card) return phyinfo(card, nlsock)['cov_class'] def covclassset(card, cc, nlsock=None): """ - REQUIRES ROOT PRIVILEGES/DOES NOT WORK ON ALL SYSTEMS - sets the coverage class. The coverage class IAW IEEE Std 802.11-2012 is - defined as the Air propagation time & together with max tx power control - the BSS diamter - :param card: Card object - :param cc: coverage class 0 to 31 IAW IEEE Std 802.11-2012 Table 8-56 - :param nlsock: netlink socket - sets card's coverage class + Sets the coverage class. The coverage class IAW IEEE Std 802.11-2012 is + defined as the Air propagation time & together with max tx power control + the BSS diamter + + :param card: Card object + :param cc: coverage class 0 to 31 IAW IEEE Std 802.11-2012 Table 8-56 + :param nlsock: netlink socket + .. warning:: Requires root privileges. Also this might not work on all + systems. """ if cc < wlan.COV_CLASS_MIN or cc > wlan.COV_CLASS_MAX: # this can work 'incorrectly' on non-int values but these will @@ -728,22 +752,22 @@ def covclassset(card, cc, nlsock=None): def retryshortget(card, nlsock=None): """ - gets the short retry limit. - :param card: Card object - :param nlsock: netlink socket - gets card's short retry + Gets the short retry limit. + + :param card: Card object + :param nlsock: netlink socket """ if nlsock is None: return _nlstub_(retryshortget, card) return phyinfo(card, nlsock)['retry_short'] def retryshortset(card, lim, nlsock=None): """ - REQUIRES ROOT PRIVILEGES - sets the short retry limit. - :param card: Card object - :param lim: max # of short retries 1 - 255 - :param nlsock: netlink socket - NOTE: with kernel 4, the kernel does not allow setting up to the max + Sets the short retry limit. + :param card: Card object + :param lim: max # of short retries 1 - 255 + :param nlsock: netlink socket + .. note: with kernel 4, the kernel does not allow setting up to the max + .. warning:: Requires root privileges """ if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: # this can work 'incorrectly' on non-int values but these will @@ -770,23 +794,24 @@ def retryshortset(card, lim, nlsock=None): def retrylongget(card, nlsock=None): """ - gets the long retry limit. - :param card: Card object - :param nlsock: netlink socket - :returns: card's long retry + Gets the long retry limit. + + :param card: Card object + :param nlsock: netlink socket + :returns: card's long retry """ if nlsock is None: return _nlstub_(retrylongget, card) return phyinfo(card, nlsock)['retry_long'] def retrylongset(card, lim, nlsock=None): """ - REQUIRES ROOT PRIVILEGES - sets the long retry limit. - :param card: Card object - :param lim: max # of short retries 1 - 255 - :param nlsock: netlink socket - NOTE: after moving to kernel 4, the kernel does not allow setting up to - the max + Sets the long retry limit. + :param card: Card object + :param lim: max # of short retries 1 - 255 + :param nlsock: netlink socket + .. note: after moving to kernel 4, the kernel does not allow setting up to + the max + .. warning:: Requires root privileges """ if lim < wlan.RETRY_MIN or lim > wlan.RETRY_MAX: # this can work 'incorrectly' on non-int values but these will @@ -813,23 +838,24 @@ def retrylongset(card, lim, nlsock=None): def rtsthreshget(card, nlsock=None): """ - gets RTS Threshold - :param card: Card Object - :param nlsock: netlink socket - :returns: RTS threshold + Gets RTS Threshold + + :param card: Card Object + :param nlsock: netlink socket + :returns: RTS threshold """ if nlsock is None: return _nlstub_(rtsthreshget, card) return phyinfo(card, nlsock)['rts_thresh'] def rtsthreshset(card, thresh, nlsock=None): """ - REQUIRES ROOT PRIVILEGES - sets the RTS threshold. If off, RTS is disabled. If an integer, sets the - smallest packet for which card will send an RTS prior to each transmission - :param card: Card object - :param thresh: rts threshold limit - :param nlsock: netlink socket - sets the card's RTS threshold + Sets the RTS threshold. If off, RTS is disabled. If an integer, sets the + smallest packet for which card will send an RTS prior to each transmission + + :param card: Card object + :param thresh: rts threshold limit + :param nlsock: netlink socket + .. warning:: Requires root privileges """ if thresh == 'off': thresh = wlan.RTS_THRESH_OFF elif thresh == wlan.RTS_THRESH_OFF: pass @@ -856,23 +882,24 @@ def rtsthreshset(card, thresh, nlsock=None): def fragthreshget(card, nlsock=None): """ - gets Fragmentation Threshold - :param card: Card Object - :param nlsock: netlink socket - :returns: RTS threshold + Gets Fragmentation Threshold + + :param card: Card Object + :param nlsock: netlink socket + :returns: RTS threshold """ if nlsock is None: return _nlstub_(fragthreshget, card) return phyinfo(card, nlsock)['frag_thresh'] def fragthreshset(card, thresh, nlsock=None): """ - REQUIRES ROOT PRIVILEGES - sets the Frag threshold. If off, fragmentation is disabled. If an integer, - sets the largest packet before the card will enable fragmentation - :param card: Card object - :param thresh: frag threshold limit in octets - :param nlsock: netlink socket - sets the card's Fragmentation THRESH + Sets the Frag threshold. If off, fragmentation is disabled. If an integer, + sets the largest packet before the card will enable fragmentation + + :param card: Card object + :param thresh: frag threshold limit in octets + :param nlsock: netlink socket + .. warning:: Requires root privileges """ if thresh == 'off': thresh = wlan.FRAG_THRESH_OFF elif thresh == wlan.FRAG_THRESH_OFF: pass @@ -901,10 +928,11 @@ def fragthreshset(card, thresh, nlsock=None): def devfreqs(card, nlsock=None): """ - returns card's supported frequencies - :param card: Card object - :param nlsock: netlink socket - :returns: list of supported frequencies + Returns card's supported frequencies + + :param card: Card object + :param nlsock: netlink socket + :returns: list of supported frequencies """ if nlsock is None: return _nlstub_(devfreqs, card) @@ -917,20 +945,22 @@ def devfreqs(card, nlsock=None): def devchs(card, nlsock=None): """ - returns card's supported channels - :param card: Card object - :param nlsock: netlink socket - :returns: list of supported channels + Returns card's supported channels + + :param card: Card object + :param nlsock: netlink socket + :returns: list of supported channels """ if nlsock is None: return _nlstub_(devchs, card) return [channels.rf2ch(rf) for rf in devfreqs(card,nlsock)] def devstds(card, nlsock=None): """ - gets card's wireless standards (iwconfig | grep IEEE - :param card: Card object - :param nlsock: netlink socket - :returns: list of standards (letter designators) + Gets card's wireless standards (iwconfig | grep IEEE + + :param card: Card object + :param nlsock: netlink socket + :returns: list of standards (letter designators) """ if nlsock is None: return _nlstub_(devstds, card) @@ -948,37 +978,40 @@ def devstds(card, nlsock=None): def devmodes(card, nlsock=None): """ - gets supported modes card can operate in - :param card: Card object - :param nlsock: netlink socket - :returns: list of card's supported modes + Gets supported modes card can operate in + + :param card: Card object + :param nlsock: netlink socket + :returns: list of card's supported modes """ if nlsock is None: return _nlstub_(devmodes, card) return phyinfo(card, nlsock)['modes'] def devcmds(card, nlsock=None): """ - get supported commands card can execute - :param card: Card object - :param nlsock: netlink socket - :returns: supported commands + Get supported commands card can execute + + :param card: Card object + :param nlsock: netlink socket + :returns: supported commands """ if nlsock is None: return _nlstub_(devcmds, card) return phyinfo(card, nlsock)['commands'] def ifinfo(card, iosock=None): """ - get info for interface (ifconfig ) - :param card: Card object - :param iosock: ioctl socket - :returns: dict with the following key:value pairs - driver -> card's driver - chipset -> card's chipset - manufacturer -> card's manufacturer - hwaddr -> card's mac address - inet -> card's inet address - bcast -> card's broadcast address - mask -> card's netmask address + Get info for interface (ifconfig ) + + :param card: Card object + :param iosock: ioctl socket + :returns: dict with the following key:value pairs + driver -> card's driver + chipset -> card's chipset + manufacturer -> card's manufacturer + hwaddr -> card's mac address + inet -> card's inet address + bcast -> card's broadcast address + mask -> card's netmask address """ if iosock is None: return _iostub_(ifinfo, card) @@ -1003,17 +1036,18 @@ def ifinfo(card, iosock=None): def devinfo(card, nlsock=None): """ - get info for device (iw dev info) - :param card: Card object or dev - :param nlsock: netlink socket - :returns: dict with the following key:value pairs - card -> Card(phy,dev,ifindex) - mode -> i.e. monitor or managed - wdev -> wireless device id - mac -> hw address - RF (if associated) -> frequency - CF (if assoicate) -> center frequency - CHW -> channel width i.e. NOHT,HT40- etc + Get info for device (iw dev info) + + :param card: Card object or dev + :param nlsock: netlink socket + :returns: dict with the following key:value pairs + card -> Card(phy,dev,ifindex) + mode -> i.e. monitor or managed + wdev -> wireless device id + mac -> hw address + RF (if associated) -> frequency + CF (if assoicate) -> center frequency + CHW -> channel width i.e. NOHT,HT40- etc """ if nlsock is None: return _nlstub_(devinfo, card) @@ -1069,27 +1103,28 @@ def devinfo(card, nlsock=None): def phyinfo(card, nlsock=None): """ - get info for phy (iw phy info) - :param card: Card - :param nlsock: netlink socket - :returns: dict with the following key:value pairs - generation -> wiphy generation - modes -> list of supported modes - bands -> dict of supported bands of the form - bandid -> {'rates': list of supported rates, + Get info for phy (iw phy info) + + :param card: Card + :param nlsock: netlink socket + :returns: dict with the following key:value pairs + generation -> wiphy generation + modes -> list of supported modes + bands -> dict of supported bands of the form + bandid -> {'rates': list of supported rates, 'rfs': list of supported freqs, 'rd-data': list of data corresponding to rfs, 'HT': 802.11n HT supported, 'VHT': 802.11ac VHT supported} - scan_ssids -> max number of scan SSIDS - retry_short -> retry short limit - retry_long -> retry long limit - frag_thresh -> frag threshold - rts_thresh -> rts threshold - cov_class -> coverage class - swmodes -> supported software modes - commands -> supported commands - ciphers -> supported ciphers + scan_ssids -> max number of scan SSIDS + retry_short -> retry short limit + retry_long -> retry long limit + frag_thresh -> frag threshold + rts_thresh -> rts threshold + cov_class -> coverage class + swmodes -> supported software modes + commands -> supported commands + ciphers -> supported ciphers """ if nlsock is None: return _nlstub_(phyinfo, card) @@ -1154,16 +1189,17 @@ def phyinfo(card, nlsock=None): def txset(card, setting, lvl, nlsock=None): """ - ROOT Required - sets cards tx power (iw phy card. * 100) - :param card: Card object - :param setting: power level setting oneof {'auto' = automatically determine - transmit power|'limit' = limit power by |'fixed' = set to } - :param lvl: desired tx power in dBm or None. NOTE: ignored if lvl is 'auto' - :param nlsock: netlink socket - :returns: True on success - NOTE: this does not work on my card(s) (nor does the corresponding iw - command) + Sets cards tx power (iw phy card. * 100) + + :param card: Card object + :param setting: power level setting oneof {'auto' = automatically determine + transmit power|'limit' = limit power by |'fixed' = set to } + :param lvl: desired tx power in dBm or None. NOTE: ignored if lvl is 'auto' + :param nlsock: netlink socket + :returns: True on success + .. note: this does not work on my card(s) (nor does the corresponding iw + command) + .. warning:: Requires root privileges """ # sanity check on power setting and power level if not setting in TXPWRSETTINGS: @@ -1195,12 +1231,13 @@ def txset(card, setting, lvl, nlsock=None): def txget(card, iosock=None): """ - gets card's transmission power (iwconfig | grep Tx-Power) - :param card: Card object - :param iosock: ioctl socket - :returns: transmission power in dBm - info can be found by cat /sys/kernel/debug/ieee80211/phy<#>/power but - how valid is it? + Gets card's transmission power (iwconfig | grep Tx-Power) + + :param card: Card object + :param iosock: ioctl socket + :returns: transmission power in dBm + .. note: info can be found by cat /sys/kernel/debug/ieee80211/phy<#>/power but + how valid is it? """ if iosock is None: return _iostub_(txget, card) @@ -1219,52 +1256,56 @@ def txget(card, iosock=None): def chget(card, nlsock=None): """ - gets the current channel for device (iw dev info | grep channel) - :param card: Card object - :param nlsock: netlink socket - NOTE: will only work if dev is associated w/ AP or device is in monitor mode - and has had chset previously + Gets the current channel for device (iw dev info | grep channel) + + :param card: Card object + :param nlsock: netlink socket + .. note: will only work if dev is associated w/ AP or device is in monitor mode + and has had chset previously """ if nlsock is None: return _nlstub_(chget, card) return channels.rf2ch(devinfo(card, nlsock)['RF']) def chset(card, ch, chw=None, nlsock=None): """ - REQUIRES ROOT PRIVILEGES - sets current channel on device (iw phy set channel ) - :param card: Card object - :param ch: channel number - :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} - :param nlsock: netlink socket - NOTE: + Sets current channel on device (iw phy set channel ) + + :param card: Card object + :param ch: channel number + :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} + :param nlsock: netlink socket + .. note: Can throw a device busy for several reason. 1) Card is down, 2) Another device is sharing the phy and wpa_supplicant/Network Manage is using it + .. warning:: Requires root privileges """ if nlsock is None: return _nlstub_(chset, card, ch, chw) return freqset(card, channels.ch2rf(ch), chw, nlsock) def freqget(card, nlsock=None): """ - gets the current frequency for device (iw dev info | grep channel) - :param card: Card object - :param nlsock: netlink socket - NOTE: will only work if dev is associated w/ AP or device is in monitor mode - and has had [ch|freq]set previously + Gets the current frequency for device (iw dev info | grep channel) + + :param card: Card object + :param nlsock: netlink socket + .. note: will only work if dev is associated w/ AP or device is in monitor mode + and has had [ch|freq]set previously """ if nlsock is None: return _nlstub_(chget, card) return devinfo(card, nlsock)['RF'] def freqset(card, rf, chw=None, nlsock = None): """ - REQUIRES ROOT PRIVILEGES - set the frequency and width - :param card: Card object - :param rf: frequency - :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} - :param nlsock: netlink socket - NOTE: - Can throw a device busy for several reason. 1) Card is down, 2) Another - device is sharing the phy and wpa_supplicant/Network Manage is using it + Set the frequency and width + + :param card: Card object + :param rf: frequency + :param chw: channel width oneof {[None|'HT20'|'HT40-'|'HT40+'} + :param nlsock: netlink socket + .. note: + Can throw a device busy for several reason. 1) Card is down, 2) Another + device is sharing the phy and wpa_supplicant/Network Manage is using it + .. warning:: Requires root privileges """ if nlsock is None: return _nlstub_(freqset, card, rf, chw) @@ -1290,27 +1331,28 @@ def freqset(card, rf, chw=None, nlsock = None): def modeget(card, nlsock=None): """ - get current mode of card - :param card: Card object - :param nlsock: netlink socket - :return: + Get current mode of card + + :param card: Card object + :param nlsock: netlink socket + :return: """ if nlsock is None: return _nlstub_(modeget, card) return devinfo(card, nlsock)['mode'] def modeset(card, mode, flags=None, nlsock=None): """ - REQUIRES ROOT PRIVILEGES/CARD DOWN - sets card to mode (with optional flags if mode is monitor) - (APX iw dev set type [flags]) - NOTE: as far - :param card: Card object - :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| - 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} - :param flags: list of monitor flags (can only be used if card is being set - to monitor mode) neof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' + Sets card to mode (with optional flags if mode is monitor) + (APX iw dev set type [flags]) + + :param card: Card object + :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| + 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} + :param flags: list of monitor flags (can only be used if card is being set + to monitor mode) neof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' |'cook'|'active'} - :param nlsock: netlink socket + :param nlsock: netlink socket + .. note: as far """ if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode') if flags and mode != 'monitor': @@ -1341,11 +1383,12 @@ def modeset(card, mode, flags=None, nlsock=None): def ifaces(card, nlsock=None): """ - returns all interfaces sharing the same phy as card (APX iw dev | grep phy#) - :param card: Card object - :param nlsock: netlink socket - :returns: a list of tuples t = (Card,mode) for each device having the same - phyiscal index as that of card + Returns all interfaces sharing the same phy as card (APX iw dev | grep phy#) + + :param card: Card object + :param nlsock: netlink socket + :returns: a list of tuples t = (Card,mode) for each device having the same + phyiscal index as that of card """ if nlsock is None: return _nlstub_(ifaces, card) @@ -1363,19 +1406,19 @@ def ifaces(card, nlsock=None): def devset(card, ndev, nlsock=None): """ - REQUIRES ROOT PRIVILEGES - changes card's dev to ndev - :param card: Card object - :param ndev: new dev name - :param nlsock: netlink socket - :returns: the new card object - NOTE: - o via netlink one can set a new physical name but we want the ability to - set a new dev. - o this is not a true set name: it adds a new card with ndev as the dev then - deletes the current card, returning the new card - o in effect, it will appear as if the card has a new name but, it will also - have a new ifindex + Change card's dev to ndev + :param card: Card object + :param ndev: new dev name + :param nlsock: netlink socket + :returns: the new card object + .. note: + - via netlink one can set a new physical name but we want the ability to + set a new dev. + - this is not a true set name: it adds a new card with ndev as the dev then + deletes the current card, returning the new card + - in effect, it will appear as if the card has a new name but, it will also + have a new ifindex + .. warning:: Requires root privileges """ if nlsock is None: return _nlstub_(devset, card, ndev) @@ -1402,19 +1445,19 @@ def devset(card, ndev, nlsock=None): def devadd(card, vdev, mode, flags=None, nlsock=None): """ - REQUIRES ROOT PRIVILEGES - adds a virtual interface on device having type mode (iw dev - interface add type - :param card: Card object or ifindex - :param vdev: device name of new interface - :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| - 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} - :param flags: list of monitor flags (can only be used if creating monitor - mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' - |'cook'|'active'} - :param nlsock: netlink socket - :returns: the new Card - NOTE: the new Card will be 'down' + Adds a virtual interface on device having type mode (iw dev + interface add type + :param card: Card object or ifindex + :param vdev: device name of new interface + :param mode: 'name' of mode to operate in (must be one of in {'unspecified'| + 'ibss'|'managed'|'AP'|'AP VLAN'|'wds'|'monitor'|'mesh'|'p2p'} + :param flags: list of monitor flags (can only be used if creating monitor + mode) oneof {'invalid'|'fcsfail'|'plcpfail'|'control'|'other bss' + |'cook'|'active'} + :param nlsock: netlink socket + :returns: the new Card + .. note: the new Card will be 'down' + .. warning:: Requires root privileges """ if iswireless(vdev): raise pyric.error(pyric.ENOTUNIQ,"{0} already exists".format(vdev)) if mode not in IFTYPES: raise pyric.error(pyric.EINVAL, 'Invalid mode')

=;FafP*N;;f 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�^XAM_ywb((_4O(aHAeD{!Y0GYsosT;PnrH+4 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 M>c|l-!;@7158x1?AOHXW delta 83427 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ν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