docs: def discoverdevs(self):
          '''
          Find all the pcap-eligible devices on the local system.
          '''
          if len(self._interfaces):
              raise PcapException("Device discovery should only be done once.")
              
          ppintf = self._ffi.new("pcap_if_t * *")
          errbuf = self._ffi.new("char []", 128)
          rv = self._libpcap.pcap_findalldevs(ppintf, errbuf)
          if rv:
              raise PcapException("pcap_findalldevs returned failure: {}".format(self._ffi.string(errbuf)))
          pintf = ppintf[0]
          tmp = pintf
          pindex = 0
          while tmp != self._ffi.NULL:
              xname = self._ffi.string(tmp.name) # "internal name"; still stored as bytes object
              xname = xname.decode('ascii', 'ignore')
  
              if self._windoze:
                  ext_name = "port{}".format(pindex)
              else:
                  ext_name = xname
              pindex += 1
  
              if tmp.description == self._ffi.NULL:
                  xdesc = ext_name
              else:
                  xdesc = self._ffi.string(tmp.description)
                  xdesc = xdesc.decode('ascii', 'ignore')
  
              # NB: on WinPcap, only loop flag is set
              isloop = (tmp.flags & 0x1) == 0x1
              isup = (tmp.flags & 0x2) == 0x2
              isrunning = (tmp.flags & 0x4) == 0x4
  
              # JS: I've observed that the isup and isrunning flags
              # are patently false on some systems.  As a result, we
              # blindly include all interfaces, regardless of their
              # reported status (though we still include status flags
              # in the interface object).
              # if isup and isrunning:
              xif = PcapInterface(ext_name, xname, xdesc, isloop, isup, isrunning)
              self._interfaces.append(xif)
  
              tmp = tmp.next
          self._libpcap.pcap_freealldevs(pintf)