docs: def sniff(count=0, store=1, offline=None, prn = None, lfilter=None, L2socket=None, timeout=None, stop_callback=None, *arg, **karg):
      """Sniff packets
  sniff([count=0,] [prn=None,] [store=1,] [offline=None,] [lfilter=None,] + L2ListenSocket args) -> list of packets
  Select interface to sniff by setting conf.iface. Use show_interfaces() to see interface names.
    count: number of packets to capture. 0 means infinity
    store: wether to store sniffed packets or discard them
      prn: function to apply to each packet. If something is returned,
           it is displayed. Ex:
           ex: prn = lambda x: x.summary()
  lfilter: python function applied to each packet to determine
           if further action may be done
           ex: lfilter = lambda x: x.haslayer(Padding)
  offline: pcap file to read packets from, instead of sniffing them
  timeout: stop sniffing after a given time (default: None)
  L2socket: use the provided L2socket
  stop_callback: Call every loop to determine if we need
                 to stop the capture
      """
      c = 0
  
      if offline is None:
          log_runtime.info('Sniffing on %s' % conf.iface)
          if L2socket is None:
              L2socket = conf.L2listen
          s = L2socket(type=ETH_P_ALL, *arg, **karg)
      else:
          s = PcapReader(offline)
  
      lst = []
      if timeout is not None:
          stoptime = time.time()+timeout
      remain = None
      while 1:
          try:
              if timeout is not None:
                  remain = stoptime-time.time()
                  if remain <= 0:
                      break
  
              if stop_callback and stop_callback():
                  break
              try:
                  p = s.recv(MTU)
              except PcapTimeoutElapsed:
                  continue
              if p is None:
                  break
              if lfilter and not lfilter(p):
                  continue
              if store:
                  lst.append(p)
              c += 1
              if prn:
                  r = prn(p)
                  if r is not None:
                      print(r)
              if count > 0 and c >= count:
                  break
          except KeyboardInterrupt:
              break
      s.close()
      return plist.PacketList(lst,"Sniffed")