docs: def adjust_ip (self, ip=None):
      """Called to explicitely fixup an associated IP header
  
      The function adjusts the IP header based on conformance rules 
      and the group address encoded in the IGMP message.
      The rules are:
      1. Send General Group Query to 224.0.0.1 (all systems)
      2. Send Leave Group to 224.0.0.2 (all routers)
      3a.Otherwise send the packet to the group address
      3b.Send reports/joins to the group address
      4. ttl = 1 (RFC 2236, section 2)
      5. send the packet with the router alert IP option (RFC 2236, section 2)
      """
      if ip != None and ip.haslayer(IP):
        if (self.type == 0x11):
          if (self.gaddr == "0.0.0.0"):
            ip.dst = "224.0.0.1"                   # IP rule 1
            retCode = True                     
          elif isValidMCAddr(self.gaddr):
            ip.dst = self.gaddr                    # IP rule 3a
            retCode = True
          else:
            print("Warning: Using invalid Group Address")
            retCode = False
        elif ((self.type == 0x17) and isValidMCAddr(self.gaddr)):
            ip.dst = "224.0.0.2"                   # IP rule 2
            retCode = True
        elif ((self.type == 0x12) or (self.type == 0x16)) and (isValidMCAddr(self.gaddr)):
            ip.dst = self.gaddr                    # IP rule 3b
            retCode = True
        else:
          print("Warning: Using invalid IGMP Type")
          retCode = False
      else:
        print("Warning: No IGMP Group Address set")
        retCode = False
      if retCode == True:
         ip.ttl=1                                  # IP Rule 4
         ip.options=[IPOption_Router_Alert()]      # IP rule 5
      return retCode