first "working" imp driver
[unix-history] / usr / src / sys / deprecated / netimp / if_imphost.c
index 3a7af5d..374aeca 100644 (file)
@@ -1,4 +1,4 @@
-/*     if_imphost.c    4.1     82/02/06        */
+/*     if_imphost.c    4.3     82/02/16        */
 
 #include "imp.h"
 #if NIMP > 0
 
 #include "imp.h"
 #if NIMP > 0
 #include "../h/mbuf.h"
 #include "../net/in.h"
 #include "../net/in_systm.h"
 #include "../h/mbuf.h"
 #include "../net/in.h"
 #include "../net/in_systm.h"
-#include "../net/host.h"
 #include "../net/if_imp.h"
 #include "../net/if_imp.h"
+#include "../net/if_imphost.h"
 
 /*
  * Head of host table hash chains.
  */
 
 /*
  * Head of host table hash chains.
  */
-struct mbuf hosttable = { 0, MMINOFF };
+struct mbuf *hosts;
 
 /*
  * Given an internet address
  * return a host structure (if it exists).
  */
 struct host *
 
 /*
  * Given an internet address
  * return a host structure (if it exists).
  */
 struct host *
-h_lookup(addr)
+hostlookup(addr)
        struct in_addr addr;
 {
        register struct host *hp;
        register struct mbuf *m;
        register int hash = HOSTHASH(addr);
 
        struct in_addr addr;
 {
        register struct host *hp;
        register struct mbuf *m;
        register int hash = HOSTHASH(addr);
 
-COUNT(H_LOOKUP);
-printf("h_lookup(%x)\n", addr);
-       for (m = &hosttable; m; m = m->m_next) {
+COUNT(HOSTLOOKUP);
+       for (m = hosts; m; m = m->m_next) {
                hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
                if (hp->h_refcnt == 0)
                hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
                if (hp->h_refcnt == 0)
-                       break;
-printf("h_lookup: addr=%x\n", hp->h_addr.s_addr);
+                       continue;
                if (hp->h_addr.s_addr == addr.s_addr)    
                        return (hp);
        }
                if (hp->h_addr.s_addr == addr.s_addr)    
                        return (hp);
        }
@@ -50,22 +48,25 @@ printf("h_lookup: addr=%x\n", hp->h_addr.s_addr);
  * one and hook it into the host database.
  */
 struct host *
  * one and hook it into the host database.
  */
 struct host *
-h_enter(addr)                 
+hostenter(addr)                 
        struct in_addr addr;
 {
        struct in_addr addr;
 {
-       register struct mbuf *m, *mprev;
-       register struct host *hp;
+       register struct mbuf *m, **mprev;
+       register struct host *hp, *hp0 = 0;
        register int hash = HOSTHASH(addr);
 
        register int hash = HOSTHASH(addr);
 
-COUNT(H_ENTER);
-printf("h_enter(%x)\n", addr);
-       for (m = &hosttable; m; mprev = m, m = m->m_next) {
+COUNT(HOSTENTER);
+       mprev = &hosts;
+       while (m = *mprev) {
                hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
                hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
-               if (hp->h_refcnt == 0)
-                       break;
-printf("h_enter: addr=%x\n", addr);
+               if (hp->h_refcnt == 0) {
+                       if (hp0 == 0)
+                               hp0 = hp;
+                       continue;
+               }
                if (hp->h_addr.s_addr == addr.s_addr)    
                        goto foundhost;
                if (hp->h_addr.s_addr == addr.s_addr)    
                        goto foundhost;
+               mprev = &m->m_next;
        }
 
        /*
        }
 
        /*
@@ -73,16 +74,16 @@ printf("h_enter: addr=%x\n", addr);
         * If our search ran off the end of the
         * chain of mbuf's, allocate another.
         */
         * If our search ran off the end of the
         * chain of mbuf's, allocate another.
         */
-printf("h_enter: new host\n");
-       if (m == 0) {
+       if (hp0 == 0) {
                m = m_getclr(M_DONTWAIT);
                if (m == 0)
                        return (0);
                m = m_getclr(M_DONTWAIT);
                if (m == 0)
                        return (0);
-               mprev->m_next = m;
-               m->m_act = mprev;
-               hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
+               *mprev = m;
+               m->m_off = MMINOFF;
+               hp0 = &mtod(m, struct hmbuf *)->hm_hosts[hash];
        }
        }
-       mtod(m, struct hmbuf *)->hm_count++;
+       mtod(dtom(hp0), struct hmbuf *)->hm_count++;
+       hp = hp0;
        hp->h_addr = addr;
        hp->h_status = HOSTS_UP;
 
        hp->h_addr = addr;
        hp->h_status = HOSTS_UP;
 
@@ -95,26 +96,15 @@ foundhost:
  * Free a reference to a host.  If this causes the
  * host structure to be released do so.
  */
  * Free a reference to a host.  If this causes the
  * host structure to be released do so.
  */
-h_free(addr)                               
-       struct in_addr addr;
+hostfree(hp)                               
+       register struct host *hp;
 {
        register struct mbuf *m;
 {
        register struct mbuf *m;
-       register struct host *hp;
-       register int hash = HOSTHASH(addr);
 
 
-COUNT(H_FREE);
-printf("h_free(%x)\n", addr);
-       for (m = &hosttable; m; m = m->m_next) {
-               hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
-               if (hp->h_refcnt == 0)
-                       return;
-               if (hp->h_addr.s_addr == addr.s_addr) {
-                       if (--hp->h_refcnt == 0)
-                               h_release(mtod(m, struct hmbuf *), hp);
-                       return;
-               }
-       }
-       panic("h_free");
+COUNT(HOSTFREE);
+       if (--hp->h_refcnt)
+               return;
+       hostrelease(hp);
 }
 
 /*
 }
 
 /*
@@ -122,53 +112,53 @@ printf("h_free(%x)\n", addr);
  * This involves clearing all packet queue's
  * and releasing host structures.
  */
  * This involves clearing all packet queue's
  * and releasing host structures.
  */
-h_reset(net)       
+hostreset(net)     
        int net;
 {
        register struct mbuf *m;
        register struct host *hp, *lp;
        int net;
 {
        register struct mbuf *m;
        register struct host *hp, *lp;
+       struct hmbuf *hm;
+       int x;
 
 
-COUNT(H_RESET);
-printf("h_reset(%x)\n", net);
-       for (m = &hosttable; m; m = m->m_next) {
-               hp = mtod(m, struct hmbuf *)->hm_hosts; 
+COUNT(HOSTRESET);
+       x = splimp();
+       for (m = hosts; m; m = m->m_next) {
+               hm = mtod(m, struct hmbuf *);
+               hp = hm->hm_hosts; 
                lp = hp + HPMBUF;
                lp = hp + HPMBUF;
-               while (hp < lp) {
+               while (hm->hm_count != 0 && hp < lp) {
                        if (hp->h_addr.s_net == net)
                        if (hp->h_addr.s_net == net)
-                               h_release(mtod(m, struct hmbuf *), hp);
+                               hostrelease(mtod(m, struct hmbuf *), hp);
                        hp++;
                }
        }
                        hp++;
                }
        }
+       splx(x);
 }
 
 /*
  * Remove a host structure and release
  * any resources it's accumulated.
  */
 }
 
 /*
  * Remove a host structure and release
  * any resources it's accumulated.
  */
-h_release(hm, hp)
-       struct hmbuf *hm;
+hostrelease(hp)
        register struct host *hp;
 {
        register struct host *hp;
 {
-       register struct mbuf *m;
+       register struct mbuf *m, **mprev, *mh = dtom(hp);
 
 
-COUNT(H_RELEASE);
-printf("h_release(%x,%x)\n", hm, hp);
+COUNT(HOSTRELEASE);
        /*
         * Discard any packets left on the waiting q
         */
        /*
         * Discard any packets left on the waiting q
         */
-       while (m = hp->h_q) {
-               hp->h_q = m->m_act;
+       if (m = hp->h_q) {
+               m = m->m_next;
+               hp->h_q->m_next = 0;
+               hp->h_q = 0;
                m_freem(m);
        }
                m_freem(m);
        }
-       /*
-        * We could compact the database here, but is
-        * it worth it?  For now we assume not and just
-        * handle the simple case.
-        */
-printf("h_releasse: count=%d\n", hm->h_count);
-       if (--hm->hm_count || (m = dtom(hm)) == &hosttable)
+       if (--mtod(mh, struct hmbuf *)->hm_count)
                return;
                return;
-       m->m_act->m_next = m->m_next;
-       m->m_next->m_act = m->m_act;
-       m_freem(m);
+       mprev = &hosts;
+       while ((m = *mprev) != mh)
+               mprev = &m->m_next;
+       *mprev = mh->m_next;
+       (void) m_free(mh);
 }
 }