|
|
1.1 root 1: /* arp_in.c - arp_in */
2:
3: #include <conf.h>
4: #include <kernel.h>
5: #include <proc.h>
6: #include <network.h>
7:
8: /*------------------------------------------------------------------------
9: * arp_in - handle ARP packet coming in from Ethernet network
10: *------------------------------------------------------------------------
11: */
12: arp_in(packet, device)
13: struct epacket *packet;
14: int device;
15: {
16: PStype ps;
17: int arop;
18: int pid;
19: struct arppak *apacptr;
20: struct arpent *atabptr;
21: struct etblk *etptr;
22:
23: etptr = (struct etblk *) devtab[device].dvioblk;
24: apacptr = (struct arppak *) packet->ep_data;
25: atabptr = &Arp.arptab[arpfind(apacptr->ar_spa)];
26: if (atabptr->arp_state != AR_RSLVD) {
27: blkcopy(atabptr->arp_Ead, apacptr->ar_sha, EPADLEN);
28: atabptr->arp_dev = device;
29: atabptr->arp_state = AR_RSLVD;
30: }
31: arop = net2hs(apacptr->ar_op) & LOW16;
32: switch (arop) {
33:
34: case AR_REQ: /* request - answer if for me */
35: if (! blkequ(Net.myaddr, apacptr->ar_tpa, IPLEN)) {
36: freebuf(packet);
37: return(OK);
38: }
39: apacptr->ar_op = hs2net(AR_RPLY);
40: blkcopy(apacptr->ar_tpa, apacptr->ar_spa, IPLEN);
41: blkcopy(apacptr->ar_tha, packet->ep_hdr.e_src, EPADLEN);
42: blkcopy(packet->ep_hdr.e_dest, apacptr->ar_tha, EPADLEN);
43: blkcopy(apacptr->ar_sha, etptr->etpaddr, EPADLEN);
44: blkcopy(apacptr->ar_spa, Net.myaddr, IPLEN);
45: write(device, packet, EMINPAK);
46: return(OK);
47:
48: case AR_RPLY: /* reply - awaken requestor if any */
49: disable(ps);
50: pid = Arp.arppid;
51: if (!isbadpid(pid)
52: && blkequ(Arp.arpwant, apacptr->ar_spa, IPLEN)) {
53: Arp.arppid = BADPID;
54: send(pid, OK);
55: }
56: freebuf(packet);
57: restore(ps);
58: return(OK);
59:
60: default:
61: Net.ndrop++;
62: freebuf(packet);
63: return(SYSERR);
64: }
65: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.