igmp
"Type = %d (%s)", igmp->igmp_type, pt);
"Max Response Time = %d", igmp->igmp_code);
"Checksum = %x", ntohs(igmp->igmp_cksum));
if (igmp->igmp_type == IGMP_MEMBERSHIP_QUERY &&
interpret_igmpv3qry(igmp, ilen);
} else if (igmp->igmp_type == IGMP_V3_MEMBERSHIP_REPORT) {
interpret_igmpv3rpt(igmp, ilen);
inet_ntop(AF_INET, &igmp->igmp_group.s_addr,
interpret_igmpv3qry(struct igmp *igmp, int ilen)
qry = (struct igmp3q *)igmp;
interpret_igmpv3rpt(struct igmp *igmp, int ilen)
rpt = (struct igmp3r *)igmp;
static void interpret_igmpv3qry(struct igmp *, int);
static void interpret_igmpv3rpt(struct igmp *, int);
struct igmp *igmp = (struct igmp *)data;
switch (igmp->igmp_type) {
if (igmp->igmp_code == 0)
extra = sizeof(struct igmp);
extra = sizeof(struct igmp);
struct igmp igmp;
struct igmp_ip_t igmp;
igmp.router_alert[0] = 0x94;
igmp.router_alert[1] = 0x04;
igmp.router_alert[2] = 0;
igmp.router_alert[3] = 0;
1, IP_IGMP, sizeof(igmp.router_alert), sizeof(igmp), &igmp);
igmp.igmp.type = IGMPv2_REPORT;
igmp.igmp.type = IGMPv1_REPORT;
igmp.igmp.response_time = 0;
igmp.igmp.chksum = 0;
igmp.igmp.group.s_addr = igmptable[i].group.s_addr;
igmp.igmp.chksum = ipchksum(&igmp.igmp, sizeof(igmp.igmp));
ip_transmit(sizeof(igmp), &igmp);
printf("Sent IGMP report to: %@\n", igmp.igmp.group.s_addr);
struct igmp *igmp;
(nic.packetlen < sizeof(struct iphdr) + sizeof(struct igmp))) {
igmp = (struct igmp *)&nic.packet[sizeof(struct iphdr)];
if (ipchksum(igmp, ntohs(ip->len) - iplen) != 0)
if ((igmp->type == IGMP_QUERY) &&
if (igmp->response_time == 0) {
interval = (igmp->response_time * TICKS_PER_SEC)/10;
printf("Received IGMP query for: %@\n", igmp->group.s_addr);
if ((group == 0) || (group == igmp->group.s_addr)) {
if (((igmp->type == IGMPv1_REPORT) || (igmp->type == IGMPv2_REPORT)) &&
(ip->dest.s_addr == igmp->group.s_addr)) {
printf("Received IGMP report for: %@\n", igmp->group.s_addr);
if ((igmptable[i].group.s_addr == igmp->group.s_addr) &&
struct igmp_ip_t igmp;
igmp.router_alert[0] = 0x94;
igmp.router_alert[1] = 0x04;
igmp.router_alert[2] = 0;
igmp.router_alert[3] = 0;
1, IP_IGMP, sizeof(igmp.router_alert), sizeof(igmp), &igmp);
igmp.igmp.type = IGMP_LEAVE;
igmp.igmp.response_time = 0;
igmp.igmp.chksum = 0;
igmp.igmp.group.s_addr = igmptable[slot].group.s_addr;
igmp.igmp.chksum = ipchksum(&igmp.igmp, sizeof(igmp));
ip_transmit(sizeof(igmp), &igmp);
printf("Sent IGMP leave for: %@\n", igmp.igmp.group.s_addr);