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

unix.superglobalmegacorp.com

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