|
|
1.1 ! root 1: /* ip_in.c - ip_in */ ! 2: ! 3: #include <conf.h> ! 4: #include <kernel.h> ! 5: #include <proc.h> ! 6: #include <network.h> ! 7: ! 8: /*------------------------------------------------------------------------ ! 9: * ip_in - handle IP packet coming in from the network ! 10: *------------------------------------------------------------------------ ! 11: */ ! 12: ip_in(packet, icmpp, lim) ! 13: struct epacket *packet; ! 14: int icmpp; ! 15: int lim; ! 16: { ! 17: struct udp *udpptr; ! 18: struct ip *ipptr; ! 19: struct netq *nqptr; ! 20: int dport; ! 21: int i; ! 22: int to; ! 23: PStype ps; ! 24: ! 25: ipptr = (struct ip *)packet->ep_data; ! 26: switch (ipptr->i_proto) { ! 27: ! 28: case IPRO_ICMP: /* ICMP: pass to icmp input routine */ ! 29: return(icmp_in(packet, icmpp, lim)); ! 30: ! 31: case IPRO_UDP: /* UDP: demultiplex based on UDP "port" */ ! 32: udpptr = (struct udp *) ipptr->i_data; ! 33: dport = net2hs(udpptr->u_dport)&LOW16; ! 34: for (i=0 ; i<NETQS ; i++) { ! 35: nqptr = &Net.netqs[i]; ! 36: if (nqptr->uport == dport) { ! 37: /* drop instead of blocking on psend */ ! 38: if (pcount(nqptr->xport) >= NETQLEN) { ! 39: Net.ndrop++; ! 40: Net.nover++; ! 41: freebuf(packet); ! 42: return(SYSERR); ! 43: } ! 44: psend(nqptr->xport, packet); ! 45: disable(ps); ! 46: to = nqptr->pid; ! 47: if ( !isbadpid(to) ) { ! 48: nqptr->pid = BADPID; ! 49: send(to, OK); ! 50: } ! 51: restore(ps); ! 52: return(OK); ! 53: } ! 54: } ! 55: break; ! 56: ! 57: default: ! 58: break; ! 59: } ! 60: Net.ndrop++; ! 61: freebuf(packet); ! 62: return(OK); ! 63: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.