Annotation of researchv9/sys/inet/ip_arp.c, revision 1.1.1.1

1.1       root        1: #include "inet.h"
                      2: #include "uarp.h"
                      3: #if NUARP > 0 && NINET > 0
                      4: 
                      5: #include "../h/param.h"
                      6: #include "../h/systm.h"
                      7: #include "../h/conf.h"
                      8: #include "../h/ioctl.h"
                      9: #include "../h/ethernet.h"
                     10: #include "../h/stream.h"
                     11: #include "../h/ttyld.h"
                     12: #include "../h/inet/in.h"
                     13: #include "../h/inet/ip_var.h"
                     14: 
                     15: /*
                     16:  * Address resolution code. ip_ldout() calls arp_resolve if IFF_ARP
                     17:  * is set to map an internet address into a 48 bit ethernet address.
                     18:  * If arp_resolve finds the address in its tables, it prepends an
                     19:  * ethernet header to the packet and returns it. Otherwise, it sends
                     20:  * a message to the ipconfig waiting on the specified queue asking
                     21:  * it to do all the hard work. The user process at some point will use
                     22:  * the IPIORESOLVE ioctl to update the tabes.
                     23:  *
                     24:  * N.B. If we ever get a medium other than ethernet that needs arping,
                     25:  *      this code will need to be made a bit more general.
                     26:  */
                     27: 
                     28: /*
                     29:  * Hash table for arp entries.  Collision resolution is linear search until
                     30:  * encountering a hole.  Replacement is LRU.
                     31:  */
                     32: #define NARP 128                       /* number of arp entries */
                     33: struct ip_arp ip_arps[NARP];           /* arping table */
                     34: #define HASH(x) ((x)%NARP)
                     35: int Nip_arp = NARP;    /* number of address translations for netstat */
                     36: 
                     37: arp_install(in, en)
                     38:        register unsigned long in;
                     39:        unsigned char *en;
                     40: {
                     41:        register struct ip_arp *ap, *rp, *op;
                     42: 
                     43:        /* find matching entry, empty entry, or oldest entry */
                     44:        op = ap = rp = &ip_arps[HASH(in)];
                     45:        do {
                     46:                if (ap->inaddr==0 || ap->inaddr==in) {
                     47:                        op = ap;
                     48:                        break;
                     49:                }
                     50:                if (ap->time < op->time)
                     51:                        op = ap;
                     52:                if(++ap==&ip_arps[NARP])
                     53:                        ap = ip_arps;
                     54:        } while(ap!=rp);
                     55: 
                     56:        /* fill in new entry */
                     57:        op->time = time;
                     58:        op->inaddr = in;
                     59:        bcopy((caddr_t)en, (caddr_t)op->enaddr, sizeof(op->enaddr));
                     60:        return(0);
                     61: }
                     62: 
                     63: struct block *
                     64: arp_resolve(q, bp, dst)
                     65:        struct queue *q;
                     66:        register struct block *bp;
                     67:        unsigned long dst;
                     68: {
                     69:        register struct block *bp1;
                     70:        struct etherpup *hp;
                     71:        register struct ip_arp *ap, *rp;
                     72: 
                     73:        /* find matching entry */
                     74:        ap = rp = &ip_arps[HASH(dst)];
                     75:        do {
                     76:                if (ap->inaddr==0 || ap->inaddr==dst)
                     77:                        break;
                     78:                if(++ap==&ip_arps[NARP])
                     79:                        ap = ip_arps;
                     80:        } while(ap!=rp);
                     81:        if (ap->inaddr!=dst) {
                     82:                arp_request(q, dst);    /* request an address resolution */
                     83:                bp_free(bp);            /* free the packet */
                     84:                return(0);
                     85:        }
                     86: 
                     87:        /* make a block with the ether info */
                     88:        bp1 = allocb(sizeof(struct etherpup));
                     89:        if(bp1 == 0){
                     90:                printf("no bp for arp_resolve\n");
                     91:                bp_free(bp);
                     92:                return(0);
                     93:        }
                     94:        ap->time = time;
                     95:        bp1->type = M_DATA;
                     96:        bp1->wptr = bp1->rptr + sizeof(struct etherpup);
                     97:        bp1->next = bp;
                     98:        hp = (struct etherpup *)(bp1->rptr);
                     99:        hp->type = htons(ETHERPUP_IPTYPE);
                    100:        bcopy((caddr_t)(ap->enaddr), (caddr_t)(hp->dhost), 6);
                    101:        return(bp1);
                    102: }
                    103: 
                    104: arp_request(q, dst)
                    105: register struct queue *q;
                    106: unsigned long dst;
                    107: {
                    108:        struct block *bp;
                    109: 
                    110:        if(q->next->flag & QFULL){
                    111:                printf("arp q full\n");
                    112:                return;
                    113:        }
                    114:        bp = allocb(4);
                    115:        if(bp == 0)
                    116:                return;
                    117:        bp->type = M_DATA;
                    118:        bp->wptr = bp->rptr + 4;
                    119:        *((u_long *)(bp->rptr)) = dst;
                    120:        (*q->next->qinfo->putp)(q->next, bp);
                    121:        bp = allocb(1);
                    122:        if(bp == 0)
                    123:                return;
                    124:        bp->type = M_DELIM;
                    125:        (*q->next->qinfo->putp)(q->next, bp);
                    126: }
                    127: #endif NUARP

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.