BSD 4_3_Net_2 release
[unix-history] / usr / src / sys / net / radix.c
index d4d3ff0..5f3df88 100644 (file)
@@ -2,22 +2,35 @@
  * Copyright (c) 1988, 1989  Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1988, 1989  Regents of the University of California.
  * All rights reserved.
  *
- * Redistribution is only permitted until one year after the first shipment
- * of 4.4BSD by the Regents.  Otherwise, redistribution and use in source and
- * binary forms are permitted provided that: (1) source distributions retain
- * this entire copyright notice and comment, and (2) distributions including
- * binaries display the following acknowledgement:  This product includes
- * software developed by the University of California, Berkeley and its
- * contributors'' in the documentation or other materials provided with the
- * distribution and in all advertising materials mentioning features or use
- * of this software.  Neither the name of the University nor the names of
- * its contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
  *
  *
- *     @(#)radix.c     7.7 (Berkeley) 6/28/90
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)radix.c     7.9 (Berkeley) 2/4/91
  */
 
 /*
  */
 
 /*
@@ -395,7 +408,7 @@ struct radix_node *head;
        if (t->rn_r == saved_tt) x = t->rn_l; else x = t->rn_r;
        /* Promote general routes from below */
        if (x->rn_b < 0) { 
        if (t->rn_r == saved_tt) x = t->rn_l; else x = t->rn_r;
        /* Promote general routes from below */
        if (x->rn_b < 0) { 
-               if (x->rn_mask && (x->rn_b >= b_leaf)) {
+               if (x->rn_mask && (x->rn_b >= b_leaf) && x->rn_mklist == 0) {
                        MKGet(m);
                        if (m) {
                                Bzero(m, sizeof *m);
                        MKGet(m);
                        if (m) {
                                Bzero(m, sizeof *m);
@@ -478,8 +491,8 @@ rn_delete(v, netmask, head)
        if (dupedkey = tt->rn_dupedkey) {
                if (netmask) 
                        netmask = rn_search(netmask, rn_maskhead)->rn_key;
        if (dupedkey = tt->rn_dupedkey) {
                if (netmask) 
                        netmask = rn_search(netmask, rn_maskhead)->rn_key;
-               for (; tt->rn_mask != netmask; tt = tt->rn_dupedkey)
-                       if (tt == 0)
+               while (tt->rn_mask != netmask)
+                       if ((tt = tt->rn_dupedkey) == 0)
                                return (0);
        }
        if (tt->rn_mask == 0 || (saved_m = m = tt->rn_mklist) == 0)
                                return (0);
        }
        if (tt->rn_mask == 0 || (saved_m = m = tt->rn_mklist) == 0)
@@ -547,20 +560,18 @@ on1:
         */
        if (t->rn_mklist) {
                if (x->rn_b >= 0) {
         */
        if (t->rn_mklist) {
                if (x->rn_b >= 0) {
-                       if (m = x->rn_mklist) {
-                               while (m->rm_mklist)
-                                       m = m->rm_mklist;
-                               m->rm_mklist = t->rn_mklist;
-                       } else
-                               x->rn_mklist = m;
+                       for (mp = &x->rn_mklist; m = *mp;)
+                               mp = &m->rm_mklist;
+                       *mp = t->rn_mklist;
                } else {
                        for (m = t->rn_mklist; m;) {
                                struct radix_mask *mm = m->rm_mklist;
                                if (m == x->rn_mklist && (--(m->rm_refs) < 0)) {
                                        x->rn_mklist = 0;
                                        MKFree(m);
                } else {
                        for (m = t->rn_mklist; m;) {
                                struct radix_mask *mm = m->rm_mklist;
                                if (m == x->rn_mklist && (--(m->rm_refs) < 0)) {
                                        x->rn_mklist = 0;
                                        MKFree(m);
-                               } else
-                                       printf("rn_delete: Orphaned mask\n");
+                               } else 
+                                       printf("%s %x at %x\n",
+                                           "rn_delete: Orphaned Mask", m, x);
                                m = mm;
                        }
                }
                                m = mm;
                        }
                }