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

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

unix.superglobalmegacorp.com

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