Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/route6d more correct advert for global address on p2p.



details:   https://anonhg.NetBSD.org/src/rev/678438b4e23a
branches:  trunk
changeset: 486311:678438b4e23a
user:      itojun <itojun%NetBSD.org@localhost>
date:      Thu May 18 13:23:43 2000 +0000

description:
more correct advert for global address on p2p.
avoid reusing upper bits of rtm_flags.  (sync with kame)

diffstat:

 usr.sbin/route6d/route6d.c |  91 +++++++++++++++++++++++++--------------------
 1 files changed, 51 insertions(+), 40 deletions(-)

diffs (283 lines):

diff -r d3733d0f4ca5 -r 678438b4e23a usr.sbin/route6d/route6d.c
--- a/usr.sbin/route6d/route6d.c        Thu May 18 13:21:49 2000 +0000
+++ b/usr.sbin/route6d/route6d.c        Thu May 18 13:23:43 2000 +0000
@@ -1,5 +1,5 @@
-/*     $NetBSD: route6d.c,v 1.12 2000/05/16 14:04:32 itojun Exp $      */
-/*     $KAME: route6d.c,v 1.19 2000/05/16 13:10:39 itojun Exp $        */
+/*     $NetBSD: route6d.c,v 1.13 2000/05/18 13:23:43 itojun Exp $      */
+/*     $KAME: route6d.c,v 1.25 2000/05/17 09:05:36 itojun Exp $        */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>
 #ifndef        lint
-__RCSID("$NetBSD: route6d.c,v 1.12 2000/05/16 14:04:32 itojun Exp $");
+__RCSID("$NetBSD: route6d.c,v 1.13 2000/05/18 13:23:43 itojun Exp $");
 #endif
 
 #include <stdio.h>
@@ -166,7 +166,8 @@
        struct  riprt *rrt_same;        /* same destination - future use */
        struct  netinfo6 rrt_info;      /* network info */
        struct  in6_addr rrt_gw;        /* gateway */
-       u_long  rrt_flags;
+       u_long  rrt_flags;              /* kernel routing table flags */
+       u_long  rrt_rflags;             /* route6d routing table flags */
        time_t  rrt_t;                  /* when the route validated */
        int     rrt_index;              /* ifindex from which this route got */
 };
@@ -203,12 +204,11 @@
 
 static u_long  seq = 0;
 
-#define        RTF_AGGREGATE           0x08000000
-#define        RTF_NOADVERTISE         0x10000000
-#define        RTF_NH_NOT_LLADDR       0x20000000
-#define RTF_SENDANYWAY         0x40000000
-#define        RTF_CHANGED             0x80000000
-#define        RTF_ROUTE_H             0xffff
+#define        RRTF_AGGREGATE          0x08000000
+#define        RRTF_NOADVERTISE        0x10000000
+#define        RRTF_NH_NOT_LLADDR      0x20000000
+#define RRTF_SENDANYWAY                0x40000000
+#define        RRTF_CHANGED            0x80000000
 
 int main __P((int, char **));
 void ripalarm __P((int));
@@ -446,7 +446,7 @@
 
        alarm(0);
        for (rrt = riprt; rrt; rrt = rrt->rrt_next) {
-               if (rrt->rrt_flags & RTF_AGGREGATE) {
+               if (rrt->rrt_rflags & RRTF_AGGREGATE) {
                        delroute(&rrt->rrt_info, &rrt->rrt_gw);
                }
        }
@@ -665,7 +665,7 @@
                                sizeof(struct netinfo6);
                nrt = 0; np = ripbuf->rip6_nets; nh = NULL;
                for (rrt = riprt; rrt; rrt = rrt->rrt_next) {
-                       if (rrt->rrt_flags & RTF_NOADVERTISE)
+                       if (rrt->rrt_rflags & RRTF_NOADVERTISE)
                                continue;
                        /* Put the route to the buffer */
                        *np = rrt->rrt_info;
@@ -680,7 +680,7 @@
                return;
        }
 
-       if ((flag & RTF_SENDANYWAY) == 0 &&
+       if ((flag & RRTF_SENDANYWAY) == 0 &&
            (qflag || (ifcp->ifc_flags & IFF_LOOPBACK)))
                return;
        if (iff_find(ifcp, 'N') != NULL)
@@ -704,7 +704,7 @@
                        sizeof(struct netinfo6);
        nrt = 0; np = ripbuf->rip6_nets; nh = NULL;
        for (rrt = riprt; rrt; rrt = rrt->rrt_next) {
-               if (rrt->rrt_flags & RTF_NOADVERTISE)
+               if (rrt->rrt_rflags & RRTF_NOADVERTISE)
                        continue;
                /* Need to check filer here */
                ok = 1;
@@ -741,12 +741,13 @@
                if (tobeadv(rrt, ifcp) == 0)
                        continue;
                /* Only considers the routes with flag if specified */
-               if ((flag & RTF_CHANGED) && (rrt->rrt_flags & RTF_CHANGED) == 0)
+               if ((flag & RRTF_CHANGED) &&
+                   (rrt->rrt_rflags & RRTF_CHANGED) == 0)
                        continue;
                /* Check nexthop */
                if (rrt->rrt_index == ifcp->ifc_index &&
                    !IN6_IS_ADDR_UNSPECIFIED(&rrt->rrt_gw) &&
-                   (rrt->rrt_flags & RTF_NH_NOT_LLADDR) == 0) {
+                   (rrt->rrt_rflags & RRTF_NH_NOT_LLADDR) == 0) {
                        if (nh == NULL || !IN6_ARE_ADDR_EQUAL(nh, &rrt->rrt_gw)) {
                                if (nrt == maxrte - 2)
                                        ripflush(ifcp, sin);
@@ -761,7 +762,7 @@
                        }
                } else if (nh && (rrt->rrt_index != ifcp->ifc_index ||
                                  !IN6_ARE_ADDR_EQUAL(nh, &rrt->rrt_gw) ||
-                                 rrt->rrt_flags & RTF_NH_NOT_LLADDR)) {
+                                 rrt->rrt_rflags & RRTF_NH_NOT_LLADDR)) {
                        /* Reset nexthop */
                        if (nrt == maxrte - 2)
                                ripflush(ifcp, sin);
@@ -1086,7 +1087,7 @@
                                        *nq = *np;
                                        addroute(rrt, &nh, ifcp);
                                }
-                               rrt->rrt_flags |= RTF_CHANGED;
+                               rrt->rrt_rflags |= RRTF_CHANGED;
                                rrt->rrt_t = t;
                                need_trigger = 1;
                        } else if (nq->rip6_metric < np->rip6_metric &&
@@ -1095,7 +1096,7 @@
                                /* Got worse route from same gw */
                                nq->rip6_metric = np->rip6_metric;
                                rrt->rrt_t = t;
-                               rrt->rrt_flags |= RTF_CHANGED;
+                               rrt->rrt_rflags |= RRTF_CHANGED;
                                need_trigger = 1;
                        } else if (nq->rip6_metric == np->rip6_metric &&
                                   rrt->rrt_index == ifcp->ifc_index &&
@@ -1129,7 +1130,7 @@
                        riprt = rrt;
                        /* Update routing table */
                        addroute(rrt, &nh, ifcp);
-                       rrt->rrt_flags |= RTF_CHANGED;
+                       rrt->rrt_rflags |= RRTF_CHANGED;
                        need_trigger = 1;
                        rrt->rrt_t = t;
                }
@@ -1142,12 +1143,12 @@
                                        continue;
                                if (ic->ifc_flags & IFF_UP)
                                        ripsend(ic, &ic->ifc_ripsin,
-                                               RTF_CHANGED);
+                                               RRTF_CHANGED);
                        }
                }
                /* Reset the flag */
                for (rrt = riprt; rrt; rrt = rrt->rrt_next)
-                       rrt->rrt_flags &= ~RTF_CHANGED;
+                       rrt->rrt_rflags &= ~RRTF_CHANGED;
        }
 }
 
@@ -1209,7 +1210,7 @@
        }
        /* Whole routing table dump */
        trace(1, "\tRIP Request -- whole routing table\n");
-       ripsend(ifcp, sin, RTF_SENDANYWAY);
+       ripsend(ifcp, sin, RRTF_SENDANYWAY);
 }
 
 /*
@@ -1926,7 +1927,8 @@
 
 /*
  * there are couple of p2p interface routing models.  "behavior" lets
- * you pick one.
+ * you pick one.  it looks that gated behavior fits best with BSDs,
+ * since BSD kernels does not look at prefix length on p2p interfaces.
  */
 void
 ifrt_p2p(ifcp, again)
@@ -1937,7 +1939,7 @@
        struct riprt *rrt;
        struct netinfo6 *np;
        struct in6_addr addr, dest;
-       int advert, i;
+       int advert, ignore, i;
 #define P2PADVERT_NETWORK      1
 #define P2PADVERT_ADDR         2
 #define P2PADVERT_DEST         4
@@ -1951,25 +1953,30 @@
                dest = ifa->ifa_raddr;
                applyplen(&addr, ifa->ifa_plen);
                applyplen(&dest, ifa->ifa_plen);
+               advert = ignore = 0;
                switch (behavior) {
                case CISCO:
                        /*
-                        * advertise addr/plen, treating p2p interface
-                        * just like shared medium interface.
-                        * this may cause trouble if you reuse addr/plen
-                        * in other places.
+                        * honor addr/plen, just like normal shared medium
+                        * interface.  this may cause trouble if you reuse
+                        * addr/plen on other interfaces.
+                        *
+                        * advertise addr/plen.
                         */
                        advert |= P2PADVERT_NETWORK;
                        break;
                case GATED:
                        /*
-                        * advertise dest/128.  since addr/128 is not
-                        * advertised, addr/128 is not reachable from other
-                        * interfaces (if p2p interface is A, addr/128 is not
-                        * reachable from other interfaces).  not sure why it
-                        * is not advertised.
+                        * prefixlen on p2p interface is meaningless.
+                        * advertise addr/128 and dest/128.
+                        *
+                        * do not install network route to route6d routing
+                        * table (if we do, it would prevent route installation
+                        * for other p2p interface that shares addr/plen).
                         */
+                       advert |= P2PADVERT_ADDR;
                        advert |= P2PADVERT_DEST;
+                       ignore |= P2PADVERT_NETWORK;
                        break;
                case ROUTE6D:
                        /*
@@ -1980,11 +1987,14 @@
                        else {
                                advert |= P2PADVERT_ADDR;
                                advert |= P2PADVERT_DEST;
+                               ignore |= P2PADVERT_NETWORK;
                        }
                        break;
                }
 
                for (i = 1; i <= P2PADVERT_MAX; i *= 2) {
+                       if ((ignore & i) != 0)
+                               continue;
                        if ((rrt = MALLOC(struct riprt)) == NULL)
                                fatal("malloc: struct riprt");
                        memset(rrt, 0, sizeof(*rrt));
@@ -2020,7 +2030,7 @@
                                continue;
                        }
                        if ((advert & i) == 0) {
-                               rrt->rrt_flags |= RTF_NOADVERTISE;
+                               rrt->rrt_rflags |= RRTF_NOADVERTISE;
                                noadv = ", NO-ADV";
                        } else
                                noadv = "";
@@ -2349,7 +2359,7 @@
                        inet6_n2p(&rrt->rrt_gw));
                trace(0, "*****     dest(%s) if(%s) -- Not optimized.\n",
                        inet6_n2p(&rrt->rrt_info.rip6_dest), ifname);
-               rrt->rrt_flags |= RTF_NH_NOT_LLADDR;
+               rrt->rrt_rflags |= RRTF_NH_NOT_LLADDR;
        }
 
        /* Put it to the route list */
@@ -2388,7 +2398,7 @@
        rtm->rtm_version = RTM_VERSION;
        rtm->rtm_seq = ++seq;
        rtm->rtm_pid = pid;
-       rtm->rtm_flags = rrt->rrt_flags & RTF_ROUTE_H;
+       rtm->rtm_flags = rrt->rrt_flags;
        rtm->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
        rtm->rtm_rmx.rmx_hopcount = np->rip6_metric - 1;
        rtm->rtm_inits = RTV_HOPCOUNT;
@@ -2690,9 +2700,9 @@
                        fprintf(dump, " tag(0x%04x)",
                                ntohs(rrt->rrt_info.rip6_tag) & 0xffff);
                }
-               if (rrt->rrt_flags & RTF_NH_NOT_LLADDR)
+               if (rrt->rrt_rflags & RRTF_NH_NOT_LLADDR)
                        fprintf(dump, " NOT-LL");
-               if (rrt->rrt_flags & RTF_NOADVERTISE)
+               if (rrt->rrt_rflags & RRTF_NOADVERTISE)
                        fprintf(dump, " NO-ADV");
                fprintf(dump, "\n");
        }
@@ -2770,7 +2780,8 @@
                rrt->rrt_info.rip6_metric = 1;
                rrt->rrt_info.rip6_tag = htons(routetag & 0xffff);
                rrt->rrt_gw = in6addr_loopback;
-               rrt->rrt_flags = RTF_UP | RTF_REJECT | RTF_AGGREGATE;
+               rrt->rrt_flags = RTF_UP | RTF_REJECT;
+               rrt->rrt_rflags = RRTF_AGGREGATE;
                rrt->rrt_t = 0;
                rrt->rrt_index = loopifindex;
                /* Put the route to the list */



Home | Main Index | Thread Index | Old Index