Xinu7/src/serve11/sys/netin.c
/* netin.c */
#include <conf.h>
#include <kernel.h>
#include <proc.h>
#include <network.h>
/*------------------------------------------------------------------------
* netin - initialize net, start output side, and become input daemon
*------------------------------------------------------------------------
*/
PROCESS netin(userpid)
int userpid; /* user process to resume */
{
register struct epacket *packet;
struct epacket *getbuf();
int icmpp;
serinit();
arpinit();
netinit();
icmpp = pcreate(NETFQ);
resume(create(NETOUT, NETOSTK, NETIPRI-1, NETONAM,
2, userpid,icmpp));
for (packet = getbuf(Net.netpool) ; TRUE ;) {
Net.npacket++;
if ( read(ETHER,packet,sizeof(*packet)) == SYSERR ) {
Net.ndrop++;
continue;
}
switch (net2hs(packet->ep_hdr.e_ptype)) {
case EP_ARP:
arp_in(packet, ETHER);
packet = getbuf(Net.netpool);
break;
case EP_RARP:
rarp_in(packet, ETHER);
packet = getbuf(Net.netpool);
break;
case EP_IP:
ip_in(packet, icmpp, NETFQ);
packet = getbuf(Net.netpool);
break;
default: /* just drop packet */
Net.ndrop++;
}
}
}