|
|
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.