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

unix.superglobalmegacorp.com

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