diff --git a/doc/bird.sgml b/doc/bird.sgml
index 5441e31e..64ff8f74 100644
--- a/doc/bird.sgml
+++ b/doc/bird.sgml
@@ -1014,6 +1014,7 @@ protocol ospf <name> {
interface <interface pattern>
{
cost <num>;
+ stub <switch>;
hello <num>;
poll <num>;
retransmit <num>;
@@ -1060,6 +1061,10 @@ protocol ospf <name> {
cost num
Specifies output cost (metric) of an interface. Default value is 10.
+ stub switch
+ If set to interface it does not listen to any packet and does not send
+ any hello. Default value is no.
+
hello num
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 <name> {
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).
+ type pointopoint
+ Point-to-point networks connect just 2 routers together. No election
+ is performed there which reduces the number of messages sent.
+
type nonbroadcast
On nonbroadcast networks, the packets are sent to each neighbor
separately because of lack of multicast capabilities.
- type pointopoint
- Point-to-point networks connect just 2 routers together. No election
- is performed there which reduces the number of messages sent.
+ strict nonbroadcast switch
+ If set, don't send hello to any undefined neighbor. This switch
+ is ignored on on any non-NBMA network. Default is No.
authentication none
No passwords are sent in OSPF packets. This is the default value.
@@ -1116,10 +1125,6 @@ protocol ospf <name> {
A set of neighbors to which Hello messages on nonbroadcast networks
are to be sent. Some of them could be marked as eligible.
- strict nonbroadcast switch
- If set, don't send hello to any undefined neighbor. This switch
- is ignored on on any non-NBMA network. Default is No.
-
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;
diff --git a/proto/ospf/config.Y b/proto/ospf/config.Y
index 50ba371a..459a236c 100644
--- a/proto/ospf/config.Y
+++ b/proto/ospf/config.Y
@@ -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;
}
diff --git a/proto/ospf/hello.c b/proto/ospf/hello.c
index 94326c5d..11f3c6fb 100644
--- a/proto/ospf/hello.c
+++ b/proto/ospf/hello.c
@@ -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);
diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c
index 4c0e2866..e82d8f3a 100644
--- a/proto/ospf/iface.c
+++ b/proto/ospf/iface.c
@@ -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? */
diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c
index d77158ca..e69afbc0 100644
--- a/proto/ospf/ospf.c
+++ b/proto/ospf/ospf.c
@@ -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);
}
diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h
index 6a7c753b..dd63c4cc 100644
--- a/proto/ospf/ospf.h
+++ b/proto/ospf/ospf.h
@@ -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
diff --git a/proto/ospf/packet.c b/proto/ospf/packet.c
index b48fc80a..382e542f 100644
--- a/proto/ospf/packet.c
+++ b/proto/ospf/packet.c
@@ -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);