]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Added stub interface. (Interface which is propagated to OSPF but
authorOndrej Filip <feela@network.cz>
Sat, 2 Sep 2000 08:54:40 +0000 (08:54 +0000)
committerOndrej Filip <feela@network.cz>
Sat, 2 Sep 2000 08:54:40 +0000 (08:54 +0000)
it does not sends nor listens packets.)

I added some new options, please look at it and look into doc if it's OK.

doc/bird.sgml
proto/ospf/config.Y
proto/ospf/hello.c
proto/ospf/iface.c
proto/ospf/ospf.c
proto/ospf/ospf.h
proto/ospf/packet.c

index 5441e31e13dbf90c9435992b110d2890aa31181a..64ff8f745036fe51b0389477a1307facabe15ad8 100644 (file)
@@ -1014,6 +1014,7 @@ protocol ospf &lt;name&gt; {
                interface &lt;interface pattern&gt;
                {
                        cost &lt;num&gt;;
+                       stub &lt;switch&gt;;
                        hello &lt;num&gt;;
                        poll &lt;num&gt;;
                        retransmit &lt;num&gt;;
@@ -1060,6 +1061,10 @@ protocol ospf &lt;name&gt; {
        <tag>cost <M>num</M></tag>
         Specifies output cost (metric) of an interface. Default value is 10.
 
+       <tag>stub <M>switch</M></tag>
+        If set to interface it does not listen to any packet and does not send
+        any hello. Default value is no.
+
        <tag>hello <M>num</M></tag>
         Specifies interval in seconds between sending of Hello messages. Beware, all
         routers on the same network need to have the same hello interval.
@@ -1093,13 +1098,17 @@ protocol ospf &lt;name&gt; {
         convenient to force use of a different type manually.
         On broadcast networks, flooding and Hello messages are sent using multicasts (a single packet for all the neighbors).
 
+       <tag>type pointopoint</tag>
+        Point-to-point networks connect just 2 routers together. No election
+        is performed there which reduces the number of messages sent.
+
        <tag>type nonbroadcast</tag>
         On nonbroadcast networks, the packets are sent to each neighbor
         separately because of lack of multicast capabilities.
 
-       <tag>type pointopoint</tag>
-        Point-to-point networks connect just 2 routers together. No election
-        is performed there which reduces the number of messages sent.
+       <tag>strict nonbroadcast <M>switch</M></tag>
+        If set, don't send hello to any undefined neighbor. This switch
+        is ignored on on any non-NBMA network. Default is No.
 
        <tag>authentication none</tag>
         No passwords are sent in OSPF packets. This is the default value.
@@ -1116,10 +1125,6 @@ protocol ospf &lt;name&gt; {
         A set of neighbors to which Hello messages on nonbroadcast networks
         are to be sent. Some of them could be marked as eligible.
 
-       <tag>strict nonbroadcast <M>switch</M></tag>
-        If set, don't send hello to any undefined neighbor. This switch
-        is ignored on on any non-NBMA network. Default is No.
-
 </descrip>
 
 <sect1>Attributes
@@ -1162,13 +1167,17 @@ protocol ospf MyOSPF {
                interface "ppp*" {
                        cost 100;
                };
+               interface "arc0" {
+                       cost 10;
+                       stub yes;
+               };
        };
        area 120 {
                stub yes;
                interface "-arc0" , "arc*" {
                        type nonbroadcast;
                        authentication none;
-                       strict nonbroadcast no;
+                       strict nonbroadcast yes;
                        wait 120;
                        poll 40;
                        dead count 8;
index 50ba371a179f705efd5a20597a713928a97f3783..459a236c67af1cc44f019eafaf64df5b40c9932c 100644 (file)
@@ -88,6 +88,7 @@ ospf_iface_item:
  | TYPE NONBROADCAST { OSPF_PATT->type = OSPF_IT_NBMA ; }
  | TYPE POINTOPOINT { OSPF_PATT->type = OSPF_IT_PTP ; }
  | STRICT NONBROADCAST bool { OSPF_PATT->strictnbma = $3 ; }
+ | STUB bool { OSPF_PATT->stub = $2 ; }
  | NEIGHBORS '{' ipa_list '}'
  | AUTHENTICATION NONE { OSPF_PATT->autype=AU_NONE ; }
  | AUTHENTICATION SIMPLE { OSPF_PATT->autype=AU_SIMPLE ; }
@@ -137,6 +138,7 @@ ospf_iface_start:
   OSPF_PATT->deadc = DEADC_D;
   OSPF_PATT->type = OSPF_IT_UNDEF;
   OSPF_PATT->strictnbma = 0;
+  OSPF_PATT->stub = 0;
   init_list(&OSPF_PATT->nbma_list);
   OSPF_PATT->autype=AU_NONE;
  }
index 94326c5da14967eed99adabe90c11cbe06722a84..11f3c6fb63144a9741cbc4bbad95a0e106344f41 100644 (file)
@@ -249,6 +249,8 @@ hello_send(timer *timer,int poll, struct ospf_neighbor *dirn)
   if(timer==NULL) ifa=dirn->ifa;
   else ifa=(struct ospf_iface *)timer->data;
 
+  if(ifa->stub) return;                /* Don't send any packet on stub iface */
+
   p=(struct proto *)(ifa->proto);
   DBG("%s: Hello/Poll timer fired on interface %s.\n",
     p->name, ifa->iface->name);
index 4c0e2866d5852a7ebd1d1aa46783a953d341c3fe..e82d8f3a64ec06d1134213638f985d6670dd2eaf 100644 (file)
@@ -370,7 +370,8 @@ ospf_iface_info(struct ospf_iface *ifa)
   cli_msg(-1015,"Interface \"%s\":", ifa->iface->name);
   cli_msg(-1015,"\tArea: %I (%u)", ifa->oa->areaid, ifa->oa->areaid);
   cli_msg(-1015,"\tType: %s %s", ospf_it[ifa->type], strict);
-  cli_msg(-1015,"\tState: %s", ospf_is[ifa->state]);
+  cli_msg(-1015,"\tState: %s %s", ospf_is[ifa->state],
+    ifa->stub ? "(stub)" : "");
   cli_msg(-1015,"\tPriority: %u", ifa->priority);
   cli_msg(-1015,"\tCost: %u", ifa->cost);
   cli_msg(-1015,"\tHello timer: %u", ifa->helloint);
@@ -429,6 +430,7 @@ ospf_ifa_add(struct object_lock *lock)
   ifa->strictnbma=ip->strictnbma;
   ifa->waitint=ip->waitint;
   ifa->deadc=ip->deadc;
+  ifa->stub=ip->stub;
   ifa->autype=ip->autype;
   memcpy(ifa->aukey,ip->password,8);
   ifa->options=2;      /* FIXME what options? */
index d77158caddc739e35e3f1fb233fa1c44b924c4df..e69afbc031bd368bccc89f139b8990af0b72b962 100644 (file)
@@ -558,14 +558,30 @@ ospf_reconfigure(struct proto *p, struct proto_config *c)
        {
          ifa->strictnbma=ip2->strictnbma;
          OSPF_TRACE(D_EVENTS,
-           "Interface %s is now strict NBMA",
+           "Interface %s is now strict NBMA.",
            ifa->iface->name);
        }
        if((ip1->strictnbma!=0)&&(ip2->strictnbma==0))
        {
          ifa->strictnbma=ip2->strictnbma;
          OSPF_TRACE(D_EVENTS,
-           "Interface %s is no longer strict NBMA",
+           "Interface %s is no longer strict NBMA.",
+           ifa->iface->name);
+       }
+
+       /* stub */
+       if((ip1->stub==0)&&(ip2->stub!=0))
+       {
+         ifa->stub=ip2->stub;
+         OSPF_TRACE(D_EVENTS,
+           "Interface %s is now stub.",
+           ifa->iface->name);
+       }
+       if((ip1->stub!=0)&&(ip2->stub==0))
+       {
+         ifa->stub=ip2->stub;
+         OSPF_TRACE(D_EVENTS,
+           "Interface %s is no longer stub.",
            ifa->iface->name);
        }
 
index 6a7c753b9dc5c08b5a5c9cf56123c03e25b815b7..dd63c4cc6de2cc5f7adc9fb4fe4e47e5e71ac29f 100644 (file)
@@ -103,6 +103,7 @@ struct ospf_iface {
   u32 bdrid;
   u8 type;             /* OSPF view of type */
   u8 strictnbma;       /* Can I talk with unknown neighbors? */
+  u8 stub;             /* Inactive interface */
 #define OSPF_IT_BCAST 0
 #define OSPF_IT_NBMA 1
 #define OSPF_IT_PTP 2
@@ -390,6 +391,7 @@ struct ospf_iface_patt {
   int type;
   int autype;
   int strictnbma;
+  int stub;
 #define AU_NONE 0
 #define AU_SIMPLE 1
 #define AU_CRYPT 2
index b48fc80ad5bf582f44e80d9e94f0ee878ec5953d..382e542fcb86bb2523c86bc6676a9665d87db102 100644 (file)
@@ -84,6 +84,8 @@ ospf_rx_hook(sock *sk, int size)
   int i;
   u8 *pu8;
 
+  if(ifa->stub) return(1);
+
   DBG("%s: RX_Hook called on interface %s.\n",p->name, sk->iface->name);
 
   ps = (struct ospf_packet *) ipv4_skip_header(sk->rbuf, &size);