Xinu7/src/serve11/sys/icmp_in.c

/* icmp_in.c - icmp_in */

#include <conf.h>
#include <kernel.h>
#include <network.h>

/*------------------------------------------------------------------------
 *  icmp_in  -  handle ICMP packet coming in from the network
 *------------------------------------------------------------------------
 */
icmp_in(packet, icmpp, lim)
struct	epacket	*packet;
int	icmpp;
int	lim;
{
	struct	ip	*ipptr;
	struct	icmp	*icmpptr;
	int	len;

	ipptr = (struct ip *)packet->ep_data;
	icmpptr = (struct icmp *) ipptr->i_data;
	if (!Net.mavalid || icmpptr->ic_typ != ICRQECH) {
		freebuf(packet);
	} else {
		icmpptr->ic_typ = (char) ICRPECH;
		blkcopy(ipptr->i_dest, ipptr->i_src, IPLEN);
		len = net2hs(ipptr->i_paclen) - IPHLEN;
		if (isodd(len)) {
			ipptr->i_data[len++] = NULLCH;
		}
		icmpptr->ic_cksum = 0;
		icmpptr->ic_cksum = cksum(icmpptr, len>>1);
		if (pcount(icmpp) < lim)
			psend(icmpp, packet);
		else
			freebuf(packet);
	}
	return(OK);
}