Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/netinet/ip_input.c,v retrieving revision 1.3.4.2 retrieving revision 1.4 diff -u -p -r1.3.4.2 -r1.4 --- src/sys/netinet/ip_input.c 1993/11/14 17:54:46 1.3.4.2 +++ src/sys/netinet/ip_input.c 1993/12/06 04:59:37 1.4 @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * from: @(#)ip_input.c 7.19 (Berkeley) 5/25/91 - * $Id: ip_input.c,v 1.3.4.2 1993/11/14 17:54:46 mycroft Exp $ + * $Id: ip_input.c,v 1.4 1993/12/06 04:59:37 hpeyerl Exp $ */ #include "param.h" @@ -45,8 +45,6 @@ #include "time.h" #include "kernel.h" -#include "machine/cpu.h" - #include "../net/if.h" #include "../net/route.h" @@ -144,7 +142,7 @@ ipintr() register struct ipq *fp; register struct in_ifaddr *ia; int hlen, s; -#ifdef DIAGNOSTIC +#ifdef PARANOID static int busy = 0; if (busy) @@ -160,7 +158,7 @@ next: IF_DEQUEUE(&ipintrq, m); splx(s); if (m == 0) { -#ifdef DIAGNOSTIC +#ifdef PARANOID --busy; #endif return; @@ -269,6 +267,53 @@ next: goto ours; } } +#ifdef MULTICAST + if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) { + struct in_multi *inm; +#ifdef MROUTING + extern struct socket *ip_mrouter; + + if (ip_mrouter) { + /* + * If we are acting as a multicast router, all + * incoming multicast packets are passed to the + * kernel-level multicast forwarding function. + * The packet is returned (relatively) intact; if + * ip_mforward() returns a non-zero value, the packet + * must be discarded, else it may be accepted below. + * + * (The IP ident field is put in the same byte order + * as expected when ip_mforward() is called from + * ip_output().) + */ + ip->ip_id = htons(ip->ip_id); + if (ip_mforward(ip, m->m_pkthdr.rcvif, m) != 0) { + m_freem(m); + goto next; + } + ip->ip_id = ntohs(ip->ip_id); + + /* + * The process-level routing demon needs to receive + * all multicast IGMP packets, whether or not this + * host belongs to their destination groups. + */ + if (ip->ip_p == IPPROTO_IGMP) + goto ours; + } +#endif + /* + * See if we belong to the destination multicast group on the + * arrival interface. + */ + IN_LOOKUP_MULTI(ip->ip_dst, m->m_pkthdr.rcvif, inm); + if (inm == NULL) { + m_freem(m); + goto next; + } + goto ours; + } +#endif if (ip->ip_dst.s_addr == (u_long)INADDR_BROADCAST) goto ours; if (ip->ip_dst.s_addr == INADDR_ANY)