Beispiel #1
0
    def scan(self, ifindex, ssids=None, flush_cache=False):
        '''
        Trigger scan and get results.

        Triggering scan usually requires root, and can take a
        couple of seconds.
        '''
        # Prepare a second netlink socket to get the scan results.
        # The issue is that the kernel can send the results notification
        # before we get answer for the NL80211_CMD_TRIGGER_SCAN
        nsock = NL80211()
        nsock.bind()
        nsock.add_membership('scan')

        # send scan request
        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_TRIGGER_SCAN']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]

        # If a list of SSIDs is provided, active scanning should be performed
        if ssids is not None:
            if isinstance(ssids, list):
                msg['attrs'].append(['NL80211_ATTR_SCAN_SSIDS', ssids])

        scan_flags = 0
        if flush_cache:
            # Flush the cache before scanning
            scan_flags |= SCAN_FLAGS_NAMES['NL80211_SCAN_FLAG_FLUSH']
            msg['attrs'].append(['NL80211_ATTR_SCAN_FLAGS', scan_flags])

        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)

        # monitor the results notification on the secondary socket
        scanResultNotFound = True
        while scanResultNotFound:
            listMsg = nsock.get()
            for msg in listMsg:
                if msg["event"] == "NL80211_CMD_NEW_SCAN_RESULTS":
                    scanResultNotFound = False
                    break
        # close the secondary socket
        nsock.close()

        # request the results
        msg2 = nl80211cmd()
        msg2['cmd'] = NL80211_NAMES['NL80211_CMD_GET_SCAN']
        msg2['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]
        return self.nlm_request(msg2,
                                msg_type=self.prid,
                                msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
Beispiel #2
0
    def scan(self, ifindex, ssids=None, flush_cache=False):
        '''
        Trigger scan and get results.

        Triggering scan usually requires root, and can take a
        couple of seconds.
        '''
        # Prepare a second netlink socket to get the scan results.
        # The issue is that the kernel can send the results notification
        # before we get answer for the NL80211_CMD_TRIGGER_SCAN
        nsock = NL80211()
        nsock.bind()
        nsock.add_membership('scan')

        # send scan request
        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_TRIGGER_SCAN']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]

        # If a list of SSIDs is provided, active scanning should be performed
        if ssids is not None:
            if isinstance(ssids, list):
                msg['attrs'].append(['NL80211_ATTR_SCAN_SSIDS', ssids])

        scan_flags = 0
        if flush_cache:
            # Flush the cache before scanning
            scan_flags |= SCAN_FLAGS_NAMES['NL80211_SCAN_FLAG_FLUSH']
            msg['attrs'].append(['NL80211_ATTR_SCAN_FLAGS', scan_flags])

        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)

        # monitor the results notification on the secondary socket
        scanResultNotFound = True
        while scanResultNotFound:
            listMsg = nsock.get()
            for msg in listMsg:
                if msg["event"] == "NL80211_CMD_NEW_SCAN_RESULTS":
                    scanResultNotFound = False
                    break
        # close the secondary socket
        nsock.close()

        # request the results
        msg2 = nl80211cmd()
        msg2['cmd'] = NL80211_NAMES['NL80211_CMD_GET_SCAN']
        msg2['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]
        return self.nlm_request(msg2, msg_type=self.prid,
                                msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
Beispiel #3
0
    def get_associated_bss(self, ifindex):
        '''
        Returns the same info like scan() does, but only about the
        currently associated BSS.

        Unlike scan(), it returns immediately and doesn't require root.
        '''
        # When getting scan results without triggering scan first,
        # you'll always get the information about currently associated BSS
        #
        # However, it may return other BSS, if last scan wasn't very
        # long time go

        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_SCAN']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]

        res = self.nlm_request(msg, msg_type=self.prid,
                               msg_flags=NLM_F_REQUEST | NLM_F_DUMP)

        for x in res:
            attr_bss = x.get_attr('NL80211_ATTR_BSS')
            if attr_bss is not None:
                status = attr_bss.get_attr('NL80211_BSS_STATUS')
                if status in (BSS_STATUS_NAMES['associated'],
                              BSS_STATUS_NAMES['ibss_joined']):

                    return x

        return None
Beispiel #4
0
    def get_associated_bss(self, ifindex):
        '''
        Returns the same info like scan() does, but only about the
        currently associated BSS.

        Unlike scan(), it returns immediately and doesn't require root.
        '''
        # When getting scan results without triggering scan first,
        # you'll always get the information about currently associated BSS
        #
        # However, it may return other BSS, if last scan wasn't very
        # long time go

        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_SCAN']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]

        res = self.nlm_request(msg,
                               msg_type=self.prid,
                               msg_flags=NLM_F_REQUEST | NLM_F_DUMP)

        for x in res:
            attr_bss = x.get_attr('NL80211_ATTR_BSS')
            if attr_bss is not None:
                status = attr_bss.get_attr('NL80211_BSS_STATUS')
                if status in (BSS_STATUS_NAMES['associated'],
                              BSS_STATUS_NAMES['ibss_joined']):

                    return x

        return None
 def disconnect(self, ifindex):
     '''
     Disconnect the device
     '''
     msg = nl80211cmd()
     msg['cmd'] = NL80211_NAMES['NL80211_CMD_DISCONNECT']
     msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]
     self.put(msg, msg_type=self.prid, msg_flags=NLM_F_REQUEST)
Beispiel #6
0
 def disconnect(self, ifindex):
     '''
     Disconnect the device
     '''
     msg = nl80211cmd()
     msg['cmd'] = NL80211_NAMES['NL80211_CMD_DISCONNECT']
     msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]
     self.put(msg, msg_type=self.prid, msg_flags=NLM_F_REQUEST)
Beispiel #7
0
 def list_wiphy(self):
     '''
     Get list of all phy devices
     '''
     msg = nl80211cmd()
     msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_WIPHY']
     return self.nlm_request(msg,
                             msg_type=self.prid,
                             msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
Beispiel #8
0
 def list_wiphy(self):
     '''
     Get list of all phy devices
     '''
     msg = nl80211cmd()
     msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_WIPHY']
     return self.nlm_request(msg,
                             msg_type=self.prid,
                             msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
Beispiel #9
0
 def get_interfaces_dump(self):
     '''
     Get interfaces dump
     '''
     msg = nl80211cmd()
     msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_INTERFACE']
     return self.nlm_request(msg,
                             msg_type=self.prid,
                             msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
Beispiel #10
0
 def get_interfaces_dump(self):
     '''
     Get interfaces dump
     '''
     msg = nl80211cmd()
     msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_INTERFACE']
     return self.nlm_request(msg,
                             msg_type=self.prid,
                             msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
Beispiel #11
0
    def join_ibss(self, ifindex, ssid, freq, bssid=None,
                  channel_fixed=False, width=None, center=None, center2=None):
        '''
        Connect to network by ssid
            - ifindex - IFINDEX of the interface to perform the connection
            - ssid - Service set identification
            - freq - Frequency in MHz
            - bssid - The MAC address of target interface
            - channel_fixed: Boolean flag
            - width - Channel width
            - center - Central frequency of the 40/80/160 MHz channel
            - center2 - Center frequency of second segment if 80P80

        If the flag of channel_fixed is True, one should specify both the width
        and center of the channel

        `width` can be integer of string:

        0. 20_noht
        1. 20
        2. 40
        3. 80
        4. 80p80
        5. 160
        6. 5
        7. 10
        '''

        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_JOIN_IBSS']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex],
                        ['NL80211_ATTR_SSID', ssid],
                        ['NL80211_ATTR_WIPHY_FREQ', freq]]

        if channel_fixed:
            msg['attrs'].append(['NL80211_ATTR_FREQ_FIXED', None])
            width = CHAN_WIDTH.get(width, width)
            assert isinstance(width, int)
            if width in [2, 3, 5] and center:
                msg['attrs'].append(['NL80211_ATTR_CHANNEL_WIDTH', width])
                msg['attrs'].append(['NL80211_ATTR_CENTER_FREQ1', center])
            elif width == 4 and center and center2:
                msg['attrs'].append(['NL80211_ATTR_CHANNEL_WIDTH', width])
                msg['attrs'].append(['NL80211_ATTR_CENTER_FREQ1', center])
                msg['attrs'].append(['NL80211_ATTR_CENTER_FREQ2', center2])
            elif width in [0, 1, 6, 7]:
                msg['attrs'].append(['NL80211_ATTR_CHANNEL_WIDTH', width])
            else:
                raise TypeError('No channel specified')

        if bssid is not None:
            msg['attrs'].append(['NL80211_ATTR_MAC', bssid])

        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)
Beispiel #12
0
    def join_ibss(self, ifindex, ssid, freq, bssid=None,
                  channel_fixed=False, width=None, center=None, center2=None):
        '''
        Connect to network by ssid
            - ifindex - IFINDEX of the interface to perform the connection
            - ssid - Service set identification
            - freq - Frequency in MHz
            - bssid - The MAC address of target interface
            - channel_fixed: Boolean flag
            - width - Channel width
            - center - Central frequency of the 40/80/160 MHz channel
            - center2 - Center frequency of second segment if 80P80

        If the flag of channel_fixed is True, one should specify both the width
        and center of the channel

        `width` can be integer of string:

        0. 20_noht
        1. 20
        2. 40
        3. 80
        4. 80p80
        5. 160
        6. 5
        7. 10
        '''

        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_JOIN_IBSS']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex],
                        ['NL80211_ATTR_SSID', ssid],
                        ['NL80211_ATTR_WIPHY_FREQ', freq]]

        if channel_fixed:
            msg['attrs'].append(['NL80211_ATTR_FREQ_FIXED', None])
            width = CHAN_WIDTH.get(width, width)
            assert isinstance(width, int)
            if width in [2, 3, 5] and center:
                msg['attrs'].append(['NL80211_ATTR_CHANNEL_WIDTH', width])
                msg['attrs'].append(['NL80211_ATTR_CENTER_FREQ1', center])
            elif width == 4 and center and center2:
                msg['attrs'].append(['NL80211_ATTR_CHANNEL_WIDTH', width])
                msg['attrs'].append(['NL80211_ATTR_CENTER_FREQ1', center])
                msg['attrs'].append(['NL80211_ATTR_CENTER_FREQ2', center2])
            elif width in [0, 1, 6, 7]:
                msg['attrs'].append(['NL80211_ATTR_CHANNEL_WIDTH', width])
            else:
                raise TypeError('No channel specified')

        if bssid is not None:
            msg['attrs'].append(['NL80211_ATTR_MAC', bssid])

        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)
Beispiel #13
0
 def get_stations(self, ifindex):
     '''
     Get stations by ifindex
     '''
     msg = nl80211cmd()
     msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_STATION']
     msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]
     return self.nlm_request(msg,
                             msg_type=self.prid,
                             msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
Beispiel #14
0
 def get_interface_by_phy(self, attr):
     '''
     Get interface by phy ( use x.get_attr('NL80211_ATTR_WIPHY') )
     '''
     msg = nl80211cmd()
     msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_INTERFACE']
     msg['attrs'] = [['NL80211_ATTR_WIPHY', attr]]
     return self.nlm_request(msg,
                             msg_type=self.prid,
                             msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
Beispiel #15
0
 def get_interface_by_phy(self, attr):
     '''
     Get interface by phy ( use x.get_attr('NL80211_ATTR_WIPHY') )
     '''
     msg = nl80211cmd()
     msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_INTERFACE']
     msg['attrs'] = [['NL80211_ATTR_WIPHY', attr]]
     return self.nlm_request(msg,
                             msg_type=self.prid,
                             msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
Beispiel #16
0
 def get_interface_by_ifindex(self, ifindex):
     '''
     Get interface by ifindex ( use x.get_attr('NL80211_ATTR_IFINDEX')
     '''
     msg = nl80211cmd()
     msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_INTERFACE']
     msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]
     return self.nlm_request(msg,
                             msg_type=self.prid,
                             msg_flags=NLM_F_REQUEST)
Beispiel #17
0
 def get_stations(self, ifindex):
     '''
     Get stations by ifindex
     '''
     msg = nl80211cmd()
     msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_STATION']
     msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]
     return self.nlm_request(msg,
                             msg_type=self.prid,
                             msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
Beispiel #18
0
 def get_interface_by_ifindex(self, ifindex):
     '''
     Get interface by ifindex ( use x.get_attr('NL80211_ATTR_IFINDEX')
     '''
     msg = nl80211cmd()
     msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_INTERFACE']
     msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]
     return self.nlm_request(msg,
                             msg_type=self.prid,
                             msg_flags=NLM_F_REQUEST)
Beispiel #19
0
    def leave_ibss(self, ifindex):
        '''
        Leave the IBSS -- the IBSS is determined by the network interface
        '''
        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_LEAVE_IBSS']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]

        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)
Beispiel #20
0
    def leave_ibss(self, ifindex):
        '''
        Leave the IBSS -- the IBSS is determined by the network interface
        '''
        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_LEAVE_IBSS']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]

        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)
Beispiel #21
0
    def del_interface(self, dev):
        '''
        Delete a virtual interface

            - dev — device index
        '''
        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_DEL_INTERFACE']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', dev]]
        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)
Beispiel #22
0
    def scan(self, ifindex):
        '''
        Trigger scan and get results.

        Triggering scan usually requires root, and can take a
        couple of seconds.
        '''
        # Prepare a second netlink socket to get the scan results.
        # The issue is that the kernel can send the results notification
        # before we get answer for the NL80211_CMD_TRIGGER_SCAN
        nsock = NL80211()
        nsock.bind()
        nsock.add_membership('scan')

        # send scan request
        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_TRIGGER_SCAN']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]
        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)

        # monitor the results notification on the secondary socket
        scanResultNotFound = True
        while scanResultNotFound:
            listMsg = nsock.get()
            for msg in listMsg:
                if msg["event"] == "NL80211_CMD_NEW_SCAN_RESULTS":
                    scanResultNotFound = False
                    break
        # close the secondary socket
        nsock.close()

        # request the results
        msg2 = nl80211cmd()
        msg2['cmd'] = NL80211_NAMES['NL80211_CMD_GET_SCAN']
        msg2['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]
        return self.nlm_request(msg2,
                                msg_type=self.prid,
                                msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
    def scan(self, ifindex):
        '''
        Scan wifi
        '''
        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_TRIGGER_SCAN']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]
        self.put(msg, msg_type=self.prid, msg_flags=NLM_F_REQUEST)

        scanResultNotFound = True
        while scanResultNotFound:
            listMsg = self.get()
            for msg in listMsg:
                if msg["event"] == "NL80211_CMD_NEW_SCAN_RESULTS":
                    scanResultNotFound = False
                    break
        msg2 = nl80211cmd()
        msg2['cmd'] = NL80211_NAMES['NL80211_CMD_GET_SCAN']
        msg2['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]
        return self.nlm_request(msg2,
                                msg_type=self.prid,
                                msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
Beispiel #24
0
    def connect(self, ifindex, ssid, bssid=None):
        '''
        Connect to the ap with ssid and bssid
        '''
        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_CONNECT']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex],
                        ['NL80211_ATTR_SSID', ssid]]
        if bssid is not None:
            msg['attrs'].append(['NL80211_ATTR_MAC', bssid])

        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)
Beispiel #25
0
    def disassociate(self, ifindex, bssid, reason_code=0x03):
        '''
        Send a Disassociation management frame.
        '''

        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_DISASSOCIATE']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex],
                        ['NL80211_ATTR_MAC', bssid],
                        ['NL80211_ATTR_REASON_CODE', reason_code]]

        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)
    def connect(self, ifindex, ssid, bssid=None):
        '''
        Connect to the ap with ssid and bssid
        Warn: Use of put because message does return nothing,
        Use this function with the good right (Root or may be setcap )
        '''
        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_CONNECT']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex],
                        ['NL80211_ATTR_SSID', ssid]]
        if bssid is not None:
            msg['attrs'].append(['NL80211_ATTR_MAC', bssid])

        self.put(msg, msg_type=self.prid, msg_flags=NLM_F_REQUEST)
Beispiel #27
0
    def authenticate(self, ifindex, bssid, ssid, freq, auth_type=0):
        '''
        Send an Authentication management frame.
        '''

        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_AUTHENTICATE']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex],
                        ['NL80211_ATTR_MAC', bssid],
                        ['NL80211_ATTR_SSID', ssid],
                        ['NL80211_ATTR_WIPHY_FREQ', freq],
                        ['NL80211_ATTR_AUTH_TYPE', auth_type]]

        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)
Beispiel #28
0
    def associate(self, ifindex, bssid, ssid, freq, info_elements=None):
        '''
        Send an Association request frame.
        '''

        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_ASSOCIATE']
        msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex],
                        ['NL80211_ATTR_MAC', bssid],
                        ['NL80211_ATTR_SSID', ssid],
                        ['NL80211_ATTR_WIPHY_FREQ', freq]]

        if info_elements is not None:
            msg['attrs'].append(['NL80211_ATTR_IE', info_elements])

        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)
Beispiel #29
0
    def add_interface(self, ifname, iftype, dev=None, phy=0):
        '''
        Create a virtual interface

            - ifname — name of the interface to create
            - iftype — interface type to create
            - dev — device index
            - phy — phy index

        One should specify `dev` (device index) or `phy`
        (phy index). If no one specified, phy == 0.

        `iftype` can be integer or string:

        1. adhoc
        2. station
        3. ap
        4. ap_vlan
        5. wds
        6. monitor
        7. mesh_point
        8. p2p_client
        9. p2p_go
        10. p2p_device
        11. ocb
        '''
        # lookup the interface type
        iftype = IFTYPE_NAMES.get(iftype, iftype)
        assert isinstance(iftype, int)

        msg = nl80211cmd()
        msg['cmd'] = NL80211_NAMES['NL80211_CMD_NEW_INTERFACE']
        msg['attrs'] = [['NL80211_ATTR_IFNAME', ifname],
                        ['NL80211_ATTR_IFTYPE', iftype]]
        if dev is not None:
            msg['attrs'].append(['NL80211_ATTR_IFINDEX', dev])
        elif phy is not None:
            msg['attrs'].append(['NL80211_ATTR_WIPHY', phy])
        else:
            raise TypeError('no device specified')
        self.nlm_request(msg,
                         msg_type=self.prid,
                         msg_flags=NLM_F_REQUEST | NLM_F_ACK)
Beispiel #30
0
def load(dumpfilename):
    with open(dumpfilename, "r") as infile:
        data = load_dump(infile)

    print("load len={}".format(len(data)))

    # from tests/decoder/decoder.py
    offset = 0
    scan_dump = []
    counter = 0
    while offset < len(data):
        print("counter={} offset={} len={}".format(counter, offset, len(data)))
        msg = nl80211cmd(data[offset:])
        msg.decode()

        offset += msg['header']['length']
        counter += 1
        scan_dump.append(msg)

    return scan_dump
Beispiel #31
0
logger.setLevel(level=logging.INFO)

# interface name to dump scan results
ifname = sys.argv[1]

iw = IW()

ip = IPRoute()
ifindex = ip.link_lookup(ifname=ifname)[0]
ip.close()

# CMD_GET_SCAN doesn't require root privileges.
# Can use 'nmcli device wifi' or 'nmcli d w' to trigger a scan which will fill
# the scan results cache for ~30 seconds.
# See also 'iw dev $yourdev scan dump'
msg = nl80211cmd()
msg['cmd'] = NL80211_NAMES['NL80211_CMD_GET_SCAN']
msg['attrs'] = [['NL80211_ATTR_IFINDEX', ifindex]]

scan_dump = iw.nlm_request(msg,
                           msg_type=iw.prid,
                           msg_flags=NLM_F_REQUEST | NLM_F_DUMP)
for network in scan_dump:
    for attr in network['attrs']:
        if attr[0] == 'NL80211_ATTR_BSS':
            # handy debugging; see everything we captured
            for bss_attr in attr[1]['attrs']:
                logger.debug("bss attr=%r", bss_attr)

            bss = dict(attr[1]['attrs'])
Beispiel #32
0
def decode_netlink(buf):
    nl_msg = nl80211cmd(buf)
    nl_msg.decode()
    print(textwrap.indent(pformat(nl_msg), "  "))