|
|
1.1 ! root 1: /* icmp_in.c - icmp_in */ ! 2: ! 3: #include <conf.h> ! 4: #include <kernel.h> ! 5: #include <network.h> ! 6: ! 7: /*------------------------------------------------------------------------ ! 8: * icmp_in - handle ICMP packet coming in from the network ! 9: *------------------------------------------------------------------------ ! 10: */ ! 11: icmp_in(packet, icmpp, lim) ! 12: struct epacket *packet; ! 13: int icmpp; ! 14: int lim; ! 15: { ! 16: struct ip *ipptr; ! 17: struct icmp *icmpptr; ! 18: int len; ! 19: ! 20: ipptr = (struct ip *)packet->ep_data; ! 21: icmpptr = (struct icmp *) ipptr->i_data; ! 22: if (!Net.mavalid || icmpptr->ic_typ != ICRQECH) { ! 23: freebuf(packet); ! 24: } else { ! 25: icmpptr->ic_typ = (char) ICRPECH; ! 26: blkcopy(ipptr->i_dest, ipptr->i_src, IPLEN); ! 27: len = net2hs(ipptr->i_paclen) - IPHLEN; ! 28: if (isodd(len)) { ! 29: ipptr->i_data[len++] = NULLCH; ! 30: } ! 31: icmpptr->ic_cksum = 0; ! 32: icmpptr->ic_cksum = cksum(icmpptr, len>>1); ! 33: if (pcount(icmpp) < lim) ! 34: psend(icmpp, packet); ! 35: else ! 36: freebuf(packet); ! 37: } ! 38: return(OK); ! 39: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.