These diffs modify the behaviour of multicast clients to conform with the
IGMPv2 spec. This fixes the following bugs: o ntohs() on a char provides silly results o timer needs to be scaled to units of PR_FASTHZ; this was being done inconsistenly so now it gets done when it is initialized. Reviewed by: Garrett Wollman Submitted by: Bill Fenner <fenner@parc.xerox.com>
This commit is contained in:
parent
88f0d26553
commit
765b90447e
@ -35,7 +35,7 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* @(#)igmp.c 8.1 (Berkeley) 7/19/93
|
* @(#)igmp.c 8.1 (Berkeley) 7/19/93
|
||||||
* $Id: igmp.c,v 1.8 1995/03/16 18:14:49 bde Exp $
|
* $Id: igmp.c,v 1.9 1995/04/26 18:10:53 pst Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -167,7 +167,7 @@ igmp_input(m, iphlen)
|
|||||||
struct in_multistep step;
|
struct in_multistep step;
|
||||||
struct router_info *rti;
|
struct router_info *rti;
|
||||||
|
|
||||||
static int timer; /** timer value in the igmp query header **/
|
int timer; /** timer value in the igmp query header **/
|
||||||
|
|
||||||
++igmpstat.igps_rcv_total;
|
++igmpstat.igps_rcv_total;
|
||||||
|
|
||||||
@ -204,7 +204,7 @@ igmp_input(m, iphlen)
|
|||||||
m->m_len += iphlen;
|
m->m_len += iphlen;
|
||||||
|
|
||||||
ip = mtod(m, struct ip *);
|
ip = mtod(m, struct ip *);
|
||||||
timer = ntohs(igmp->igmp_code);
|
timer = igmp->igmp_code * PR_FASTHZ / IGMP_TIMER_SCALE;
|
||||||
rti = find_rti(ifp);
|
rti = find_rti(ifp);
|
||||||
|
|
||||||
switch (igmp->igmp_type) {
|
switch (igmp->igmp_type) {
|
||||||
@ -289,9 +289,7 @@ igmp_input(m, iphlen)
|
|||||||
break;
|
break;
|
||||||
case IGMP_DELAYING_MEMBER:
|
case IGMP_DELAYING_MEMBER:
|
||||||
if (inm->inm_ifp == ifp &&
|
if (inm->inm_ifp == ifp &&
|
||||||
(inm->inm_timer >
|
(inm->inm_timer > timer) &&
|
||||||
timer * PR_FASTHZ / IGMP_TIMER_SCALE)
|
|
||||||
&&
|
|
||||||
inm->inm_addr.s_addr !=
|
inm->inm_addr.s_addr !=
|
||||||
igmp_all_hosts_group) {
|
igmp_all_hosts_group) {
|
||||||
inm->inm_timer = IGMP_RANDOM_DELAY(timer);
|
inm->inm_timer = IGMP_RANDOM_DELAY(timer);
|
||||||
@ -327,8 +325,7 @@ igmp_input(m, iphlen)
|
|||||||
case IGMP_DELAYING_MEMBER:
|
case IGMP_DELAYING_MEMBER:
|
||||||
inm->inm_state = IGMP_DELAYING_MEMBER;
|
inm->inm_state = IGMP_DELAYING_MEMBER;
|
||||||
if (inm->inm_ifp == ifp &&
|
if (inm->inm_ifp == ifp &&
|
||||||
(inm->inm_timer >
|
(inm->inm_timer > timer) ) {
|
||||||
timer * PR_FASTHZ / IGMP_TIMER_SCALE) ) {
|
|
||||||
inm->inm_timer = IGMP_RANDOM_DELAY(timer);
|
inm->inm_timer = IGMP_RANDOM_DELAY(timer);
|
||||||
igmp_timers_are_running = 1;
|
igmp_timers_are_running = 1;
|
||||||
inm->inm_state = IGMP_DELAYING_MEMBER;
|
inm->inm_state = IGMP_DELAYING_MEMBER;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user