| plan 9 kernel history: overview | file list | diff list |
1992/0213/port/devarp.c (diff list | history)
| 1992/0114/sys/src/9/port/devarp.c:53,58 – 1992/0213/sys/src/9/port/devarp.c:53,59 (short | long | prev | next) | ||
| 1991/0424 | enum{ arpdirqid, | |
| 1992/0213 | arpdir2qid, | |
| 1991/0424 | arpstatqid, arpctlqid, arpdataqid, | |
| 1992/0114/sys/src/9/port/devarp.c:59,70 – 1992/0213/sys/src/9/port/devarp.c:60,94 | ||
| 1991/0424 | }; Dirtab arptab[]={ | |
| 1991/1112 |
| |
| 1992/0213 | "stats", {arpstatqid}, 0, 0444, "ctl", {arpctlqid}, 0, 0664, "data", {arpdataqid}, 0, 0664, | |
| 1991/0424 | }; #define Narptab (sizeof(arptab)/sizeof(Dirtab)) | |
| 1992/0213 | /* * create a 2-level directory */ int arpgen(Chan *c, void *vp, int ntab, int i, Dir *dp) { Qid q; q.vers = 0; /* top level directory contains the directory arp */ if(c->qid.path == CHDIR){ if(i) return -1; q.path = CHDIR | arpdir2qid; devdir(c, q, "arp", 0, eve, 0555, dp); return 1; } /* next level uses table */ return devgen(c, arptab, Narptab, i, dp); } | |
| 1991/0424 | void arpreset(void) { | |
| 1992/0114/sys/src/9/port/devarp.c:109,121 – 1992/0213/sys/src/9/port/devarp.c:133,145 | ||
| 1991/0424 | int arpwalk(Chan *c, char *name) { | |
| 1992/0213 | return devwalk(c, name, 0, 0, arpgen); | |
| 1991/0424 | } void arpstat(Chan *c, char *db) { | |
| 1992/0213 | devstat(c, db, 0, 0, arpgen); | |
| 1991/0424 | } Chan * | |
| 1992/0114/sys/src/9/port/devarp.c:182,188 – 1992/0213/sys/src/9/port/devarp.c:206,212 | ||
| 1991/0424 | switch((int)(c->qid.path&~CHDIR)){ case arpdirqid: | |
| 1992/0213 | return devdirread(c, a, n, 0, 0, arpgen); | |
| 1991/0424 | case arpdataqid: bytes = c->offset; while(bytes < conf.arp*ARP_ENTRYLEN && n) { | |
| 1992/0114/sys/src/9/port/devarp.c:283,288 – 1992/0213/sys/src/9/port/devarp.c:307,314 | ||
| 1991/1027 | { | |
| 1991/1029 | uchar ip[4]; Etherhdr *eh; | |
| 1992/0213 | Ipaddr addr; static int dropped; | |
| 1991/1029 | if(bp->type != M_DATA) { if(Servq == 0 && streamparse("arpd", bp)) { | |
| 1992/0114/sys/src/9/port/devarp.c:295,301 – 1992/0213/sys/src/9/port/devarp.c:321,328 | ||
| 1991/1029 | } if(!Servq) { | |
| 1992/0213 | if((dropped++ % 1000) == 0) print("arp: No server, packet dropped\n"); | |
| 1991/1029 | freeb(bp); return; } | |
| 1992/0114/sys/src/9/port/devarp.c:308,319 – 1992/0213/sys/src/9/port/devarp.c:335,354 | ||
| 1991/1030 | ||
| 1991/1029 | iproute(eh->dst, ip); | |
| 1992/0213 | /* if a known ip addr, send downstream to the ethernet */ | |
| 1991/1029 | if(arplookup(ip, eh->d)) { PUTNEXT(q, bp); return; } | |
| 1992/0213 | /* if ip broadcast, use ether bcast address */ addr = nhgetl(eh->dst); if(addr == Myip[Mybcast] || addr == Myip[Mynet] || addr == Myip[Mysubnet]){ memset(eh->d, 0xff, sizeof(eh->d)); PUTNEXT(q, bp); return; } | |
| 1991/1030 | /* Push the packet up to the arp server for address resolution */ | |
| 1991/1029 | memmove(eh->d, ip, sizeof(ip)); PUTNEXT(Servq, bp); | |
| 1992/0114/sys/src/9/port/devarp.c:443,448 – 1992/0213/sys/src/9/port/devarp.c:478,484 | ||
| 1991/1027 | ap->frwd = arplruhead; ap->prev = 0; | |
| 1992/0213 | ||
| 1991/1027 | arplruhead = ap; } } | |