mirror of
https://github.com/xcat2/xNBA.git
synced 2025-01-23 07:53:30 +00:00
[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:
parent
1548189ffa
commit
00a780e38f
@ -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
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 */
|
167
src/proto/igmp.c
167
src/proto/igmp.c
@ -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
|
Loading…
x
Reference in New Issue
Block a user