[gPXE] [PATCH 3/4] [proto] Remove unsupported IGMP protocol

Stefan Hajnoczi stefanha at gmail.com
Sat Jan 30 05:15:19 EST 2010


The IGMP code came from legacy Etherboot and was never updated to work
as a gPXE protocol.  There has been no demand for this protocol, so this
patch removes it.

Signed-off-by: Stefan Hajnoczi <stefanha at gmail.com>
---
 src/core/main.c       |    1 -
 src/include/gpxe/in.h |    1 -
 src/include/igmp.h    |   42 ------------
 src/proto/igmp.c      |  167 -------------------------------------------------
 4 files changed, 0 insertions(+), 211 deletions(-)
 delete mode 100644 src/include/igmp.h
 delete mode 100644 src/proto/igmp.c

diff --git a/src/core/main.c b/src/core/main.c
index ec052b0..d07d24c 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -9,7 +9,6 @@ Literature dealing with the network protocols:
 	DHCP - RFC2131, RFC2132 (options)
 	TFTP - RFC1350, RFC2347 (options), RFC2348 (blocksize), RFC2349 (tsize)
 	RPC - RFC1831, RFC1832 (XDR), RFC1833 (rpcbind/portmapper)
-	IGMP - RFC1112
 
 **************************************************************************/
 
diff --git a/src/include/gpxe/in.h b/src/include/gpxe/in.h
index 7027114..c313717 100644
--- a/src/include/gpxe/in.h
+++ b/src/include/gpxe/in.h
@@ -9,7 +9,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
 /* Protocol numbers */
 
 #define IP_ICMP		1
-#define IP_IGMP		2
 #define IP_TCP		6
 #define IP_UDP		17
 #define IP_ICMP6	58
diff --git a/src/include/igmp.h b/src/include/igmp.h
deleted file mode 100644
index 8b3292f..0000000
--- a/src/include/igmp.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef	IGMP_H
-#define	IGMP_H
-
-#include "stdint.h"
-#include <gpxe/in.h>
-
-#define IGMP_QUERY	0x11
-#define IGMPv1_REPORT	0x12
-#define IGMPv2_REPORT	0x16
-#define IGMP_LEAVE	0x17
-#define GROUP_ALL_HOSTS 0xe0000001 /* 224.0.0.1 Host byte order */
-
-#define MULTICAST_MASK    0xf0000000
-#define MULTICAST_NETWORK 0xe0000000
-
-enum {
-	IGMP_SERVER,
-	MAX_IGMP
-};
-
-struct igmp {
-	uint8_t		type;
-	uint8_t		response_time;
-	uint16_t	chksum;
-	struct in_addr	group;
-} PACKED;
-
-struct igmp_ip_t { /* Format of an igmp ip packet */
-	struct iphdr ip;
-	uint8_t router_alert[4]; /* Router alert option */
-	struct igmp igmp;
-} PACKED;
-
-struct igmptable_t {
-	struct in_addr group;
-	unsigned long time;
-} PACKED;
-
-extern void join_group ( int slot, unsigned long group );
-extern void leave_group ( int slot );
-
-#endif	/* IGMP_H */
diff --git a/src/proto/igmp.c b/src/proto/igmp.c
deleted file mode 100644
index d711421..0000000
--- a/src/proto/igmp.c
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Eric Biederman wrote this code originally.
- *
- */
-
-#if 0
-
-#include <ip.h>
-#include <igmp.h>
-
-static unsigned long last_igmpv1 = 0;
-static struct igmptable_t igmptable[MAX_IGMP];
-
-static long rfc1112_sleep_interval ( long base, int exp ) {
-	unsigned long divisor, tmo;
-
-	if ( exp > BACKOFF_LIMIT )
-		exp = BACKOFF_LIMIT;
-	divisor = RAND_MAX / ( base << exp );
-	tmo = random() / divisor;
-	return tmo;
-}
-
-static void send_igmp_reports ( unsigned long now ) {
-	struct igmp_ip_t igmp;
-	int i;
-
-	for ( i = 0 ; i < MAX_IGMP ; i++ ) {
-		if ( ! igmptable[i].time )
-			continue;
-		if ( now < igmptable[i].time )
-			continue;
-
-		igmp.router_alert[0] = 0x94;
-		igmp.router_alert[1] = 0x04;
-		igmp.router_alert[2] = 0;
-		igmp.router_alert[3] = 0;
-		build_ip_hdr ( igmptable[i].group.s_addr, 1, IP_IGMP,
-			       sizeof ( igmp.router_alert ),
-			       sizeof ( igmp ), &igmp );
-		igmp.igmp.type = IGMPv2_REPORT;
-		if ( last_igmpv1 && 
-		     ( now < last_igmpv1 + IGMPv1_ROUTER_PRESENT_TIMEOUT ) ) {
-			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 );
-		DBG ( "IGMP sent report to %s\n", inet_ntoa ( igmp.igmp.group ) );
-		/* Don't send another igmp report until asked */
-		igmptable[i].time = 0;
-	}
-}
-
-static void process_igmp ( unsigned long now, unsigned short ptype __unused,
-			   struct iphdr *ip ) {
-	struct igmp *igmp;
-	int i;
-	unsigned iplen;
-
-	if ( ( ! ip ) || ( ip->protocol != IP_IGMP ) ||
-	     ( nic.packetlen < ( sizeof ( struct iphdr ) +
-				 sizeof ( struct igmp ) ) ) ) {
-		return;
-	}
-
-	iplen = ( ip->verhdrlen & 0xf ) * 4;
-	igmp = ( struct igmp * ) &nic.packet[ sizeof( struct iphdr ) ];
-	if ( ipchksum ( igmp, ntohs ( ip->len ) - iplen ) != 0 )
-		return;
-
-	if ( ( igmp->type == IGMP_QUERY ) && 
-	     ( ip->dest.s_addr == htonl ( GROUP_ALL_HOSTS ) ) ) {
-		unsigned long interval = IGMP_INTERVAL;
-
-		if ( igmp->response_time == 0 ) {
-			last_igmpv1 = now;
-		} else {
-			interval = ( igmp->response_time * TICKS_PER_SEC ) /10;
-		}
-		
-		DBG ( "IGMP received query for %s\n", inet_ntoa ( igmp->group ) );
-		for ( i = 0 ; i < MAX_IGMP ; i++ ) {
-			uint32_t group = igmptable[i].group.s_addr;
-			if ( ( group == 0 ) ||
-			     ( group == igmp->group.s_addr ) ) {
-				unsigned long time;
-				time = currticks() +
-					rfc1112_sleep_interval ( interval, 0 );
-				if ( time < igmptable[i].time ) {
-					igmptable[i].time = time;
-				}
-			}
-		}
-	}
-	if ( ( ( igmp->type == IGMPv1_REPORT ) ||
-	       ( igmp->type == IGMPv2_REPORT ) ) &&
-	     ( ip->dest.s_addr == igmp->group.s_addr ) ) {
-	        DBG ( "IGMP received report for %s\n", 
-		      inet_ntoa ( igmp->group ) );
-		for ( i = 0 ; i < MAX_IGMP ; i++ ) {
-			if ( ( igmptable[i].group.s_addr ==
-			       igmp->group.s_addr ) &&
-			     ( igmptable[i].time != 0 ) ) {
-				igmptable[i].time = 0;
-			}
-		}
-	}
-}
-
-struct background igmp_background __background = {
-	.send = send_igmp_reports,
-	.process = process_igmp,
-};
-
-void leave_group ( int slot ) {
-	/* Be very stupid and always send a leave group message if 
-	 * I have subscribed.  Imperfect but it is standards
-	 * compliant, easy and reliable to implement.
-	 *
-	 * The optimal group leave method is to only send leave when,
-	 * we were the last host to respond to a query on this group,
-	 * and igmpv1 compatibility is not enabled.
-	 */
-	if ( igmptable[slot].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;
-		build_ip_hdr ( htonl ( GROUP_ALL_HOSTS ), 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 );
-		DBG ( "IGMP left group %s\n", inet_ntoa ( igmp.igmp.group ) );
-	}
-	memset ( &igmptable[slot], 0, sizeof ( igmptable[0] ) );
-}
-
-void join_group ( int slot, unsigned long group ) {
-	/* I have already joined */
-	if ( igmptable[slot].group.s_addr == group )
-		return;
-	if ( igmptable[slot].group.s_addr ) {
-		leave_group ( slot );
-	}
-	/* Only join a group if we are given a multicast ip, this way
-	 * code can be given a non-multicast (broadcast or unicast ip)
-	 * and still work... 
-	 */
-	if ( ( group & htonl ( MULTICAST_MASK ) ) ==
-	     htonl ( MULTICAST_NETWORK ) ) {
-		igmptable[slot].group.s_addr = group;
-		igmptable[slot].time = currticks();
-	}
-}
-
-#endif
-- 
1.6.5



More information about the gPXE mailing list