david/ipxe
Archived
1
0

[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 <stefanha@gmail.com>
Signed-off-by: Marty Connor <mdc@etherboot.org>
This commit is contained in:
Stefan Hajnoczi 2010-01-30 09:55:37 +00:00 committed by Marty Connor
parent 1548189ffa
commit 00a780e38f
4 changed files with 0 additions and 211 deletions

View File

@ -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
**************************************************************************/

View File

@ -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

View File

@ -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 */

View File

@ -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