docs: def get_working_ifaces():
      """
      Returns an ordered list of interfaces that could be used with BPF.
      Note: the order mimics pcap_findalldevs() behavior
      """
  
      # Only root is allowed to perform the following ioctl() call
      if os.getuid() != 0:
          return []
  
      # Test all network interfaces
      interfaces = []
      for ifname in get_if_list():
  
          # Unlike pcap_findalldevs(), we do not care of loopback interfaces.
          if ifname == LOOPBACK_NAME:
              continue
  
          # Get interface flags
          try:
              result = get_if(ifname, SIOCGIFFLAGS)
          except IOError:
              warning("ioctl(SIOCGIFFLAGS) failed on %s !", ifname)
              continue
  
          # Convert flags
          ifflags = struct.unpack("16xH14x", result)[0]
          if ifflags & 0x1:  # IFF_UP
  
              # Get a BPF handle
              fd = get_dev_bpf()[0]
              if fd is None:
                  raise Scapy_Exception("No /dev/bpf are available !")
  
              # Check if the interface can be used
              try:
                  fcntl.ioctl(fd, BIOCSETIF, struct.pack("16s16x",
                                                         ifname.encode()))
              except IOError:
                  pass
              else:
                  ifnum, ifab = _IFNUM.search(ifname).groups()
                  interfaces.append((ifname, int(ifnum) if ifnum else -1, ifab))
              finally:
                  # Close the file descriptor
                  os.close(fd)
  
      # Sort to mimic pcap_findalldevs() order
      interfaces.sort(key=lambda elt: (elt[1], elt[2], elt[0]))
  
      return [iface[0] for iface in interfaces]