version 1.1.1.1, 1993/03/21 09:45:37 |
version 1.4, 1993/12/06 04:59:37 |
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* SUCH DAMAGE. |
* |
* |
* @(#)ip_input.c 7.19 (Berkeley) 5/25/91 |
* from: @(#)ip_input.c 7.19 (Berkeley) 5/25/91 |
|
* $Id$ |
*/ |
*/ |
|
|
#include "param.h" |
#include "param.h" |
|
|
register struct ipq *fp; |
register struct ipq *fp; |
register struct in_ifaddr *ia; |
register struct in_ifaddr *ia; |
int hlen, s; |
int hlen, s; |
|
#ifdef PARANOID |
|
static int busy = 0; |
|
|
|
if (busy) |
|
panic("ipintr: called recursively\n"); |
|
++busy; |
|
#endif |
next: |
next: |
/* |
/* |
* Get next datagram off input queue and get IP header |
* Get next datagram off input queue and get IP header |
|
|
s = splimp(); |
s = splimp(); |
IF_DEQUEUE(&ipintrq, m); |
IF_DEQUEUE(&ipintrq, m); |
splx(s); |
splx(s); |
if (m == 0) |
if (m == 0) { |
|
#ifdef PARANOID |
|
--busy; |
|
#endif |
return; |
return; |
|
} |
#ifdef DIAGNOSTIC |
#ifdef DIAGNOSTIC |
if ((m->m_flags & M_PKTHDR) == 0) |
if ((m->m_flags & M_PKTHDR) == 0) |
panic("ipintr no HDR"); |
panic("ipintr no HDR"); |
|
|
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) |