| version 1.3, 1993/05/20 03:50:25 |
version 1.4, 1993/12/06 04:59:37 |
|
|
| goto ours; |
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) |
if (ip->ip_dst.s_addr == (u_long)INADDR_BROADCAST) |
| goto ours; |
goto ours; |
| if (ip->ip_dst.s_addr == INADDR_ANY) |
if (ip->ip_dst.s_addr == INADDR_ANY) |