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);