Annotation of researchv8dc/sys/inet/ip_arp.c, revision 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/stream.h"
        !             8: #include "../h/conf.h"
        !             9: #include "../h/ioctl.h"
        !            10: #include "../h/ethernet.h"
        !            11: #include "../h/inet/in.h"
        !            12: #include "../h/inet/ip_var.h"
        !            13: 
        !            14: /*
        !            15:  * Address resolution code. ip_ldout() calls arp_resolve if IFF_ARP
        !            16:  * is set to map an internet address into a 48 bit ethernet address.
        !            17:  * If arp_resolve finds the address in its tables, it prepends an
        !            18:  * ethernet header to the packet and returns it. Otherwise, it sends
        !            19:  * a message to the ipconfig waiting on the specified queue asking
        !            20:  * it to do all the hard work. The user process at some point will use
        !            21:  * the IPIORESOLVE ioctl to update the tabes.
        !            22:  */
        !            23: 
        !            24: /* temporary. soon to be hashed. */
        !            25: #define NARP 50
        !            26: struct ip_arp ip_arps[NARP];   /* this table should never have holes in it */
        !            27: 
        !            28: int Nip_arp = NARP;    /* number of address translations for netstat */
        !            29: 
        !            30: arp_install(in, en)
        !            31: unsigned long in;
        !            32: unsigned char *en;
        !            33: {
        !            34:        register struct ip_arp *ap;
        !            35: 
        !            36:        for(ap = &ip_arps[0]; ap < &ip_arps[NARP]; ap++){
        !            37:                if(ap->inaddr == in)
        !            38:                        break;
        !            39:                if(ap->inaddr == 0)
        !            40:                        break;
        !            41:        }
        !            42:        if(ap >= &ip_arps[NARP])
        !            43:                return(1);
        !            44:        ap->inaddr = in;
        !            45:        bcopy((caddr_t)en, (caddr_t)(ap->enaddr), 6);
        !            46:        return(0);
        !            47: }
        !            48: 
        !            49: struct block *
        !            50: arp_resolve(q, bp, dst)
        !            51: struct queue *q;
        !            52: register struct block *bp;
        !            53: unsigned long dst;
        !            54: {
        !            55:        register struct ip_arp *ap;
        !            56:        register struct block *bp1;
        !            57:        struct ether_in *hp;
        !            58: 
        !            59:        for(ap = &ip_arps[0]; ap < &ip_arps[NARP]; ap++)
        !            60:                if(ap->inaddr == dst || ap->inaddr == 0)
        !            61:                        break;
        !            62:        if(ap->inaddr == 0 || ap >= &ip_arps[NARP]){
        !            63:                arp_request(q, dst);
        !            64:                bp_free(bp);
        !            65:                return(0);
        !            66:        }
        !            67:        bp1 = allocb(sizeof(struct ether_in));
        !            68:        if(bp1 == 0){
        !            69:                printf("no bp for arp_resolve\n");
        !            70:                bp_free(bp);
        !            71:                return(0);
        !            72:        }
        !            73:        bp1->type = M_DATA;
        !            74:        bp1->wptr = bp1->rptr + sizeof(struct ether_in);
        !            75:        bp1->next = bp;
        !            76:        hp = (struct ether_in *)(bp1->rptr);
        !            77:        hp->type = htons(ETHERPUP_IPTYPE);
        !            78:        bcopy((caddr_t)(ap->enaddr), (caddr_t)(hp->dhost), 6);
        !            79:        return(bp1);
        !            80: }
        !            81: 
        !            82: arp_request(q, dst)
        !            83: register struct queue *q;
        !            84: unsigned long dst;
        !            85: {
        !            86:        struct block *bp;
        !            87: 
        !            88:        if(q->next->flag & QFULL){
        !            89:                printf("arp q full\n");
        !            90:                return;
        !            91:        }
        !            92:        bp = allocb(4);
        !            93:        if(bp == 0)
        !            94:                return;
        !            95:        bp->type = M_DATA;
        !            96:        bp->wptr = bp->rptr + 4;
        !            97:        *((u_long *)(bp->rptr)) = dst;
        !            98:        (*q->next->qinfo->putp)(q->next, bp);
        !            99:        bp = allocb(1);
        !           100:        if(bp == 0)
        !           101:                return;
        !           102:        bp->type = M_DELIM;
        !           103:        (*q->next->qinfo->putp)(q->next, bp);
        !           104: }
        !           105: #endif NUARP

unix.superglobalmegacorp.com

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