Annotation of Net2/netimp/if_imphost.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms, with or without
        !             6:  * modification, are permitted provided that the following conditions
        !             7:  * are met:
        !             8:  * 1. Redistributions of source code must retain the above copyright
        !             9:  *    notice, this list of conditions and the following disclaimer.
        !            10:  * 2. Redistributions in binary form must reproduce the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer in the
        !            12:  *    documentation and/or other materials provided with the distribution.
        !            13:  * 3. All advertising materials mentioning features or use of this software
        !            14:  *    must display the following acknowledgement:
        !            15:  *     This product includes software developed by the University of
        !            16:  *     California, Berkeley and its contributors.
        !            17:  * 4. Neither the name of the University nor the names of its contributors
        !            18:  *    may be used to endorse or promote products derived from this software
        !            19:  *    without specific prior written permission.
        !            20:  *
        !            21:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            23:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            24:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            25:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            31:  * SUCH DAMAGE.
        !            32:  *
        !            33:  *     @(#)if_imphost.c        7.10 (Berkeley) 6/28/90
        !            34:  */
        !            35: 
        !            36: #include "imp.h"
        !            37: #if NIMP > 0
        !            38: /*
        !            39:  * Host table manipulation routines.
        !            40:  * Only needed when shipping stuff through an IMP.
        !            41:  *
        !            42:  * Everything in here is called at splimp from
        !            43:  * from the IMP protocol code (if_imp.c), or
        !            44:  * interlocks with the code at splimp.
        !            45:  */
        !            46: #include "param.h"
        !            47: #include "mbuf.h"
        !            48: #include "socket.h"
        !            49: #include "syslog.h"
        !            50: 
        !            51: #include "../net/if.h"
        !            52: 
        !            53: #include "../netinet/in.h"
        !            54: #include "../netinet/in_systm.h"
        !            55: 
        !            56: #include "if_imp.h"
        !            57: #include "if_imphost.h"
        !            58: 
        !            59: extern struct imp_softc imp_softc[];
        !            60: 
        !            61: /*
        !            62:  * Given an internet address
        !            63:  * return a host structure (if it exists).
        !            64:  */
        !            65: struct host *
        !            66: hostlookup(imp, host, unit)
        !            67:        int imp, host, unit;
        !            68: {
        !            69:        register struct host *hp;
        !            70:        register struct mbuf *m;
        !            71:        register int hash = HOSTHASH(imp, host);
        !            72: 
        !            73:        for (m = imp_softc[unit].imp_hosts; m; m = m->m_next) {
        !            74:                hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
        !            75:                if (hp->h_imp == imp && hp->h_host == host) {
        !            76:                        if ((hp->h_flags & HF_INUSE) == 0)
        !            77:                                mtod(dtom(hp), struct hmbuf *)->hm_count++;
        !            78:                        hp->h_flags |= HF_INUSE;
        !            79:                        return (hp);
        !            80:                }
        !            81:        }
        !            82:        return ((struct host *)0);
        !            83: }
        !            84: 
        !            85: /*
        !            86:  * Enter a reference to this host's internet
        !            87:  * address.  If no host structure exists, create
        !            88:  * one and hook it into the host database.
        !            89:  */
        !            90: struct host *
        !            91: hostenter(imp, host, unit)
        !            92:        int imp, host, unit;
        !            93: {
        !            94:        register struct mbuf *m, **mprev;
        !            95:        register struct host *hp, *hp0 = 0;
        !            96:        register int hash = HOSTHASH(imp, host);
        !            97: 
        !            98:        mprev = &imp_softc[unit].imp_hosts;
        !            99:        while (m = *mprev) {
        !           100:                mprev = &m->m_next;
        !           101:                hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
        !           102:                if (hp->h_imp == imp && hp->h_host == host) {
        !           103:                        if ((hp->h_flags & HF_INUSE) == 0)
        !           104:                                mtod(dtom(hp), struct hmbuf *)->hm_count++;
        !           105:                        goto foundhost;
        !           106:                }
        !           107:                if ((hp->h_flags & HF_INUSE) == 0) {
        !           108:                        if (hp0 == 0)
        !           109:                                hp0 = hp;
        !           110:                        continue;
        !           111:                }
        !           112:        }
        !           113: 
        !           114:        /*
        !           115:         * No current host structure, make one.
        !           116:         * If our search ran off the end of the
        !           117:         * chain of mbuf's, allocate another.
        !           118:         */
        !           119:        if (hp0 == 0) {
        !           120:                m = m_getclr(M_DONTWAIT, MT_HTABLE);
        !           121:                if (m == NULL)
        !           122:                        return ((struct host *)0);
        !           123:                *mprev = m;
        !           124:                hp0 = &mtod(m, struct hmbuf *)->hm_hosts[hash];
        !           125:        }
        !           126:        hp = hp0;
        !           127:        mtod(dtom(hp), struct hmbuf *)->hm_count++;
        !           128:        hp->h_imp = imp;
        !           129:        hp->h_host = host;
        !           130:        hp->h_timer = 0;
        !           131:        hp->h_flags = 0;
        !           132: 
        !           133: foundhost:
        !           134:        hp->h_flags |= HF_INUSE;
        !           135:        return (hp);
        !           136: }
        !           137: 
        !           138: /*
        !           139:  * Reset a given imp unit's host entries.
        !           140:  * Must be called at splimp.
        !           141:  */
        !           142: hostreset(unit)
        !           143:        int unit;
        !           144: {
        !           145:        register struct mbuf *m;
        !           146:        register struct host *hp, *lp;
        !           147:        struct hmbuf *hm;
        !           148: 
        !           149:        for (m = imp_softc[unit].imp_hosts; m; m = m->m_next) {
        !           150:                hm = mtod(m, struct hmbuf *);
        !           151:                hp = hm->hm_hosts; 
        !           152:                lp = hp + HPMBUF;
        !           153:                while (hm->hm_count > 0 && hp < lp) {
        !           154:                        hostrelease(hp);
        !           155:                        hp++;
        !           156:                }
        !           157:        }
        !           158:        hostcompress(unit);
        !           159: }
        !           160: 
        !           161: /*
        !           162:  * Remove a host structure and release
        !           163:  * any resources it's accumulated.
        !           164:  */
        !           165: hostrelease(hp)
        !           166:        register struct host *hp;
        !           167: {
        !           168: 
        !           169:        if (hp->h_q)
        !           170:                hostflush(hp);
        !           171:        hp->h_rfnm = 0;
        !           172:        if (hp->h_flags & HF_INUSE)
        !           173:                --mtod(dtom(hp), struct hmbuf *)->hm_count;
        !           174:        hp->h_flags = 0;
        !           175: }
        !           176: 
        !           177: /*
        !           178:  * Flush the message queue for a host.
        !           179:  */
        !           180: hostflush(hp)
        !           181:        register struct host *hp;
        !           182: {
        !           183:        register struct mbuf *m;
        !           184: 
        !           185:        /*
        !           186:         * Discard any packets left on the waiting q
        !           187:         */
        !           188:        if (m = hp->h_q) {
        !           189:                register struct mbuf *n;
        !           190: 
        !           191:                do {
        !           192:                        n = m->m_act;
        !           193:                        m_freem(m);
        !           194:                        m = n;
        !           195:                } while (m != hp->h_q);
        !           196:                hp->h_q = 0;
        !           197:                hp->h_qcnt = 0;
        !           198:        }
        !           199: }
        !           200: 
        !           201: /*
        !           202:  * Release mbufs in host table that contain no entries
        !           203:  * currently in use.  Must be called at splimp.
        !           204:  */
        !           205: hostcompress(unit)
        !           206:        int unit;
        !           207: {
        !           208:        register struct mbuf *m, **mprev;
        !           209:        struct imp_softc *sc = &imp_softc[unit];
        !           210: 
        !           211:        mprev = &sc->imp_hosts;
        !           212:        sc->imp_hostq = 0;
        !           213:        while (m = *mprev) {
        !           214:                if (mtod(m, struct hmbuf *)->hm_count == 0)
        !           215:                        *mprev = m_free(m);
        !           216:                else
        !           217:                        mprev = &m->m_next;
        !           218:        }
        !           219: }
        !           220: 
        !           221: /*
        !           222:  * Host data base timer routine.
        !           223:  * Decrement timers on structures which are
        !           224:  * waiting to be deallocated.  On expiration
        !           225:  * release resources, possibly deallocating
        !           226:  * mbuf associated with structure.
        !           227:  */
        !           228: hostslowtimo()
        !           229: {
        !           230:        register struct mbuf *m;
        !           231:        register struct host *hp, *lp;
        !           232:        struct imp_softc *sc;
        !           233:        struct hmbuf *hm;
        !           234:        int s = splimp(), unit, any;
        !           235: 
        !           236:        for (unit = 0; unit < NIMP; unit++) {
        !           237:            any = 0;
        !           238:            sc = &imp_softc[unit];
        !           239:            for (m = sc->imp_hosts; m; m = m->m_next) {
        !           240:                hm = mtod(m, struct hmbuf *);
        !           241:                hp = hm->hm_hosts; 
        !           242:                lp = hp + HPMBUF;
        !           243:                for (; hm->hm_count > 0 && hp < lp; hp++) {
        !           244:                    if (hp->h_timer && --hp->h_timer == 0) {
        !           245:                        if (hp->h_rfnm) {
        !           246:                                log(LOG_INFO,                   /* XXX */
        !           247:                                    "imp%d: host %d/imp %d, lost rfnm\n",
        !           248:                                    unit, hp->h_host, ntohs(hp->h_imp));
        !           249:                                sc->imp_lostrfnm++;
        !           250:                                imprestarthost(sc, hp);
        !           251:                        } else {
        !           252:                                any = 1;
        !           253:                                hostrelease(hp);
        !           254:                                if (sc->imp_hostq == m)
        !           255:                                        sc->imp_hostq = 0;
        !           256:                        }
        !           257:                    }
        !           258:                }
        !           259:            }
        !           260:            if (any)
        !           261:                hostcompress(unit);
        !           262:        }
        !           263:        splx(s);
        !           264: }
        !           265: #endif

unix.superglobalmegacorp.com

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