code: def packet_in_handler(self, req_pkt, req_igmp, msg):
          
          dpid = msg.datapath.id
          ofproto = msg.datapath.ofproto
          if ofproto.OFP_VERSION == ofproto_v1_0.OFP_VERSION:
              in_port = msg.in_port
          else:
              in_port = msg.match['in_port']
  
          log = "SW=%s PORT=%d IGMP received. " % (
              dpid_to_str(dpid), in_port)
          self.logger.debug(str(req_igmp))
          if igmp.IGMP_TYPE_QUERY == req_igmp.msgtype:
              self.logger.info(log + "[QUERY]")
              (req_ipv4, ) = req_pkt.get_protocols(ipv4.ipv4)
              (req_eth, ) = req_pkt.get_protocols(ethernet.ethernet)
              self._do_query(req_igmp, req_ipv4, req_eth, in_port, msg)
          elif (igmp.IGMP_TYPE_REPORT_V1 == req_igmp.msgtype or
                igmp.IGMP_TYPE_REPORT_V2 == req_igmp.msgtype):
              self.logger.info(log + "[REPORT]")
              self._do_report(req_igmp, in_port, msg)
          elif igmp.IGMP_TYPE_LEAVE == req_igmp.msgtype:
              self.logger.info(log + "[LEAVE]")
              self._do_leave(req_igmp, in_port, msg)
          elif igmp.IGMP_TYPE_REPORT_V3 == req_igmp.msgtype:
              self.logger.info(log + "V3 is not supported yet.")
              self._do_flood(in_port, msg)
          else:
              self.logger.info(log + "[unknown type:%d]",
                               req_igmp.msgtype)
              self._do_flood(in_port, msg)
docs: the process when the snooper received IGMP.