/* * Construct an IGMP message in the output packet buffer. The caller may * have already placed data in that buffer, of length 'datalen'. */ void buildIgmp(uint32_t src, uint32_t dst, int type, int code, uint32_t group, int datalen) { struct ip *ip; struct igmp *igmp; extern int curttl; ip = (struct ip *)send_buf; ip->ip_src.s_addr = src; ip->ip_dst.s_addr = dst; ip_set_len(ip, IP_HEADER_RAOPT_LEN + IGMP_MINLEN + datalen); if (IN_MULTICAST(ntohl(dst))) { ip->ip_ttl = curttl; } else { ip->ip_ttl = MAXTTL; } /* Add Router Alert option */ ((u_char*)send_buf+MIN_IP_HEADER_LEN)[0] = IPOPT_RA; ((u_char*)send_buf+MIN_IP_HEADER_LEN)[1] = 0x04; ((u_char*)send_buf+MIN_IP_HEADER_LEN)[2] = 0x00; ((u_char*)send_buf+MIN_IP_HEADER_LEN)[3] = 0x00; igmp = (struct igmp *)(send_buf + IP_HEADER_RAOPT_LEN); igmp->igmp_type = type; igmp->igmp_code = code; igmp->igmp_group.s_addr = group; igmp->igmp_cksum = 0; igmp->igmp_cksum = inetChksum((u_short *)igmp, IP_HEADER_RAOPT_LEN + datalen); }
/* * Construct an IGMP message in the output packet buffer. The caller may * have already placed data in that buffer, of length 'datalen'. */ void buildIgmp(uint32 src, uint32 dst, int type, int code, uint32 group, int datalen) { struct ip *ip; struct igmp *igmp; extern int curttl; ip = (struct ip *)send_buf; ip->ip_src.s_addr = src; ip->ip_dst.s_addr = dst; ip->ip_len = MIN_IP_HEADER_LEN + IGMP_MINLEN + datalen; ip->ip_len = htons(ip->ip_len); if (IN_MULTICAST(ntohl(dst))) { ip->ip_ttl = curttl; } else { ip->ip_ttl = MAXTTL; } igmp = (struct igmp *)(send_buf + MIN_IP_HEADER_LEN); igmp->igmp_type = type; igmp->igmp_code = code; igmp->igmp_group.s_addr = group; igmp->igmp_cksum = 0; igmp->igmp_cksum = inetChksum((u_short *)igmp, IGMP_MINLEN + datalen); }