From 00a780e38fd5878d3e1f6f19830b2a0abf3cdf95 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Sat, 30 Jan 2010 09:55:37 +0000 Subject: [proto] Remove unsupported IGMP protocol 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 Signed-off-by: Marty Connor --- src/core/main.c | 1 - src/include/gpxe/in.h | 1 - src/include/igmp.h | 42 ------------- src/proto/igmp.c | 167 -------------------------------------------------- 4 files changed, 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 ec052b06..d07d24c0 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 70271143..c313717c 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 8b3292f2..00000000 --- a/src/include/igmp.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef IGMP_H -#define IGMP_H - -#include "stdint.h" -#include - -#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 d711421a..00000000 --- a/src/proto/igmp.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Eric Biederman wrote this code originally. - * - */ - -#if 0 - -#include -#include - -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 -- cgit v1.2.3-55-g7522