Annotation of 42BSD/sys/netimp/if_imphost.c, revision 1.1.1.1

1.1       root        1: /*     if_imphost.c    6.1     83/07/29        */
                      2: 
                      3: #include "imp.h"
                      4: #if NIMP > 0
                      5: /*
                      6:  * Host table manipulation routines.
                      7:  * Only needed when shipping stuff through an IMP.
                      8:  *
                      9:  * Everything in here is called at splimp from
                     10:  * from the IMP protocol code (if_imp.c), or
                     11:  * interlocks with the code at splimp.
                     12:  */
                     13: #include "../h/param.h"
                     14: #include "../h/mbuf.h"
                     15: 
                     16: #include "../netinet/in.h"
                     17: #include "../netinet/in_systm.h"
                     18: 
                     19: #include "../netimp/if_imp.h"
                     20: #include "../netimp/if_imphost.h"
                     21: 
                     22: /*
                     23:  * Head of host table hash chains.
                     24:  */
                     25: struct mbuf *hosts;
                     26: 
                     27: /*
                     28:  * Given an internet address
                     29:  * return a host structure (if it exists).
                     30:  */
                     31: struct host *
                     32: hostlookup(addr)
                     33:        struct in_addr addr;
                     34: {
                     35:        register struct host *hp;
                     36:        register struct mbuf *m;
                     37:        register int hash = HOSTHASH(addr);
                     38: 
                     39:        for (m = hosts; m; m = m->m_next) {
                     40:                hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
                     41:                if (hp->h_addr.s_addr == addr.s_addr) {
                     42:                        hp->h_flags |= HF_INUSE;
                     43:                        return (hp);
                     44:                }
                     45:        }
                     46:        return ((struct host *)0);
                     47: }
                     48: 
                     49: /*
                     50:  * Enter a reference to this host's internet
                     51:  * address.  If no host structure exists, create
                     52:  * one and hook it into the host database.
                     53:  */
                     54: struct host *
                     55: hostenter(addr)                 
                     56:        struct in_addr addr;
                     57: {
                     58:        register struct mbuf *m, **mprev;
                     59:        register struct host *hp, *hp0 = 0;
                     60:        register int hash = HOSTHASH(addr);
                     61: 
                     62:        mprev = &hosts;
                     63:        while (m = *mprev) {
                     64:                mprev = &m->m_next;
                     65:                hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
                     66:                if ((hp->h_flags & HF_INUSE) == 0) {
                     67:                        if (hp->h_addr.s_addr == addr.s_addr)
                     68:                                goto foundhost;
                     69:                        if (hp0 == 0)
                     70:                                hp0 = hp;
                     71:                        continue;
                     72:                }
                     73:                if (hp->h_addr.s_addr == addr.s_addr)    
                     74:                        goto foundhost;
                     75:        }
                     76: 
                     77:        /*
                     78:         * No current host structure, make one.
                     79:         * If our search ran off the end of the
                     80:         * chain of mbuf's, allocate another.
                     81:         */
                     82:        if (hp0 == 0) {
                     83:                m = m_getclr(M_DONTWAIT, MT_HTABLE);
                     84:                if (m == NULL)
                     85:                        return ((struct host *)0);
                     86:                *mprev = m;
                     87:                hp0 = &mtod(m, struct hmbuf *)->hm_hosts[hash];
                     88:        }
                     89:        mtod(dtom(hp0), struct hmbuf *)->hm_count++;
                     90:        hp = hp0;
                     91:        hp->h_addr = addr;
                     92:        hp->h_timer = 0;
                     93:        hp->h_flags = 0;
                     94: 
                     95: foundhost:
                     96:        hp->h_flags |= HF_INUSE;
                     97:        return (hp);
                     98: }
                     99: 
                    100: /*
                    101:  * Mark a host structure free and set it's
                    102:  * timer going.
                    103:  */
                    104: hostfree(hp)                               
                    105:        register struct host *hp;
                    106: {
                    107: 
                    108:        hp->h_flags &= ~HF_INUSE;
                    109:        hp->h_timer = HOSTTIMER;
                    110:        hp->h_rfnm = 0;
                    111: }
                    112: 
                    113: /*
                    114:  * Reset a given network's host entries.
                    115:  */
                    116: hostreset(net)     
                    117:        int net;
                    118: {
                    119:        register struct mbuf *m;
                    120:        register struct host *hp, *lp;
                    121:        struct hmbuf *hm;
                    122: 
                    123:        for (m = hosts; m; m = m->m_next) {
                    124:                hm = mtod(m, struct hmbuf *);
                    125:                hp = hm->hm_hosts; 
                    126:                lp = hp + HPMBUF;
                    127:                while (hm->hm_count > 0 && hp < lp) {
                    128:                        if (hp->h_addr.s_net == net) {
                    129:                                hp->h_flags &= ~HF_INUSE;
                    130:                                hostrelease(hp);
                    131:                        }
                    132:                        hp++;
                    133:                }
                    134:        }
                    135: }
                    136: 
                    137: /*
                    138:  * Remove a host structure and release
                    139:  * any resources it's accumulated.
                    140:  */
                    141: hostrelease(hp)
                    142:        register struct host *hp;
                    143: {
                    144:        register struct mbuf *m, **mprev, *mh = dtom(hp);
                    145: 
                    146:        /*
                    147:         * Discard any packets left on the waiting q
                    148:         */
                    149:        if (m = hp->h_q) {
                    150:                register struct mbuf *n;
                    151: 
                    152:                do {
                    153:                        n = m->m_act;
                    154:                        m_freem(m);
                    155:                        m = n;
                    156:                } while (m != hp->h_q);
                    157:                hp->h_q = 0;
                    158:        }
                    159:        hp->h_flags = 0;
                    160:        if (--mtod(mh, struct hmbuf *)->hm_count)
                    161:                return;
                    162:        mprev = &hosts;
                    163:        while ((m = *mprev) != mh)
                    164:                mprev = &m->m_next;
                    165:        *mprev = m_free(mh);
                    166: }
                    167: 
                    168: /*
                    169:  * Remove a packet from the holding q.
                    170:  * The RFNM counter is also bumped.
                    171:  */
                    172: struct mbuf *
                    173: hostdeque(hp)
                    174:        register struct host *hp;
                    175: {
                    176:        register struct mbuf *m;
                    177: 
                    178:        hp->h_rfnm--;
                    179:        HOST_DEQUE(hp, m);
                    180:        if (m)
                    181:                return (m);
                    182:        if (hp->h_rfnm == 0)
                    183:                hostfree(hp);
                    184:        return (0);
                    185: }
                    186: 
                    187: /*
                    188:  * Host data base timer routine.
                    189:  * Decrement timers on structures which are
                    190:  * waiting to be deallocated.  On expiration
                    191:  * release resources, possibly deallocating
                    192:  * mbuf associated with structure.
                    193:  */
                    194: hostslowtimo()
                    195: {
                    196:        register struct mbuf *m;
                    197:        register struct host *hp, *lp;
                    198:        struct hmbuf *hm;
                    199:        int s = splimp();
                    200: 
                    201:        for (m = hosts; m; m = m->m_next) {
                    202:                hm = mtod(m, struct hmbuf *);
                    203:                hp = hm->hm_hosts; 
                    204:                lp = hp + HPMBUF;
                    205:                for (; hm->hm_count > 0 && hp < lp; hp++) {
                    206:                        if (hp->h_flags & HF_INUSE)
                    207:                                continue;
                    208:                        if (hp->h_timer && --hp->h_timer == 0)
                    209:                                hostrelease(hp);
                    210:                }
                    211:        }
                    212:        splx(s);
                    213: }
                    214: #endif

unix.superglobalmegacorp.com

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