[
  [
    "linux-2.6.23/net/ipv4/igmp.c.orig", 
    "linux-2.6.23/net/ipv4/igmp.c", 
    [
      "--- linux-2.6.23/net/ipv4/igmp.c.orig", 
      "+++ linux-2.6.23/net/ipv4/igmp.c", 
      "@@ -922,6 +922,8 @@", 
      "read_unlock(&in_dev->mc_list_lock);", 
      "}", 
      "", 
      "+static char supress_report_listening = 0;", 
      "+", 
      "int igmp_rcv(struct sk_buff *skb)", 
      "{", 
      "/* This basically follows the spec line by line -- see RFC1112 */", 
      "@@ -960,9 +962,11 @@", 
      "if (((struct rtable*)skb->dst)->fl.iif == 0)", 
      "break;", 
      "/* don't rely on MC router hearing unicast reports */", 
      "-\t\tif (skb->pkt_type == PACKET_MULTICAST ||", 
      "-\t\t    skb->pkt_type == PACKET_BROADCAST)", 
      "-\t\t\tigmp_heard_report(in_dev, ih->group);", 
      "+                if (!supress_report_listening) {", 
      "+                  if (skb->pkt_type == PACKET_MULTICAST ||", 
      "+                      skb->pkt_type == PACKET_BROADCAST)", 
      "+                    igmp_heard_report(in_dev, ih->group);", 
      "+                }", 
      "break;", 
      "case IGMP_PIM:", 
      "#ifdef CONFIG_IP_PIMSM_V1", 
      "@@ -2611,10 +2615,45 @@", 
      ".release\t=\tseq_release_private,", 
      "};", 
      "", 
      "+static int proc_read_supress_report_listening(char *page, char **start,", 
      "+\t\t\t    off_t off, int count,", 
      "+\t\t\t    int *eof, void *data) {", 
      "+  int len;", 
      "+  char *supress_report_listening = (char*)data;", 
      "+", 
      "+  len = sprintf(page, \"%d\\n\", *supress_report_listening);", 
      "+", 
      "+  return len;", 
      "+}", 
      "+", 
      "+static int proc_write_supress_report_listening(struct file *file,", 
      "+\t\t\t     const char *buffer,", 
      "+\t\t\t     unsigned long count,", 
      "+\t\t\t     void *data)", 
      "+{", 
      "+\tchar *supress_report_listening = (char*)data;", 
      "+", 
      "+\tif(count == 0 || copy_from_user(supress_report_listening, buffer, 1))", 
      "+          return -EFAULT;", 
      "+", 
      "+       *supress_report_listening = *supress_report_listening == '0' ? 0 : 1;", 
      "+", 
      "+\treturn count;", 
      "+}", 
      "+", 
      "+", 
      "int __init igmp_mc_proc_init(void)", 
      "{", 
      "+", 
      "+  struct proc_dir_entry *supress_report_listening_proc;", 
      "proc_net_fops_create(\"igmp\", S_IRUGO, &igmp_mc_seq_fops);", 
      "proc_net_fops_create(\"mcfilter\", S_IRUGO, &igmp_mcf_seq_fops);", 
      "+\tsupress_report_listening_proc = create_proc_entry(\"igmp_supress_report_listening\", S_IWUGO, NULL);", 
      "+", 
      "+        supress_report_listening_proc->owner = THIS_MODULE;", 
      "+        supress_report_listening_proc->data = &supress_report_listening;", 
      "+        supress_report_listening_proc->read_proc = proc_read_supress_report_listening;", 
      "+        supress_report_listening_proc->write_proc = proc_write_supress_report_listening;", 
      "return 0;", 
      "}", 
      "#endif"
    ]
  ]
]