diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2010-11-19 13:46:21 +0100 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2010-11-19 13:46:21 +0100 |
commit | 391931d45686a807d322878d4b3d5c9634e2dbca (patch) | |
tree | 73916db85f6b68eabb5000fdcfe19ade4e7954f3 | |
parent | 79f561a173c9ceb824d64aa32d82e43ba62acebc (diff) | |
download | bird-391931d45686a807d322878d4b3d5c9634e2dbca.tar bird-391931d45686a807d322878d4b3d5c9634e2dbca.zip |
Minor finalizations of link state checks.
-rw-r--r-- | doc/bird.sgml | 22 | ||||
-rw-r--r-- | proto/ospf/config.Y | 7 | ||||
-rw-r--r-- | proto/ospf/hello.c | 2 | ||||
-rw-r--r-- | proto/ospf/iface.c | 6 | ||||
-rw-r--r-- | proto/ospf/neighbor.c | 1 | ||||
-rw-r--r-- | proto/ospf/ospf.c | 6 | ||||
-rw-r--r-- | proto/ospf/ospf.h | 4 | ||||
-rw-r--r-- | proto/static/config.Y | 2 | ||||
-rw-r--r-- | proto/static/static.c | 2 | ||||
-rw-r--r-- | proto/static/static.h | 4 |
10 files changed, 34 insertions, 22 deletions
diff --git a/doc/bird.sgml b/doc/bird.sgml index 53d9fcd..1eaf382 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -1675,7 +1675,7 @@ protocol ospf <name> { <tag>rx buffer <M>num</M></tag> This sets the size of buffer used for receiving packets. The buffer should be bigger than maximal size of any packets. Value NORMAL (default) - means 2*MTU, value LARGE means maximal allowed packet - 65536. + means 2*MTU, value LARGE means maximal allowed packet - 65535. <tag>type broadcast</tag> BIRD detects a type of a connected network automatically, but sometimes it's @@ -1695,6 +1695,14 @@ protocol ospf <name> { If set, don't send hello to any undefined neighbor. This switch is ignored on any non-NBMA network. Default is No. + <tag>check link <M>switch</M></tag> + if set, a hardware link state (reported by OS) is taken into + consideration. When a link disappears (e.g. an ethernet cable is + unplugged), neighbors are immediately considered unreachable + and only the address of the iface (instead of whole network + prefix) is propagated. It is possible that some hardware + drivers or platforms do not implement this feature. Default: off. + <tag>authentication none</tag> No passwords are sent in OSPF packets. This is the default value. @@ -2045,8 +2053,8 @@ the next hop of the route is not a neighbor at the moment), Static just uninstalls the route from the table it is connected to and adds it again as soon as the destination becomes adjacent again. -<p>The Static protocol has no configuration options. Instead, the -definition of the protocol contains a list of static routes: +<p>The Static protocol does not have many configuration options. The +definition of the protocol contains mainly a list of static routes: <descrip> <tag>route <m/prefix/ via <m/ip/</tag> Static route through @@ -2056,6 +2064,14 @@ definition of the protocol contains a list of static routes: <tag>route <m/prefix/ drop|reject|prohibit</tag> Special routes specifying to drop the packet, return it as unreachable or return it as administratively prohibited. + + <tag>check link <M>switch</M></tag> + The only option of the static protocol. If set, hardware link + states of network interfaces are taken into consideration. + When link disappears (e.g. ethernet cable is unplugged), + static routes directing to that interface are removed. It is + possible that some hardware drivers or platforms do not + implement this feature. Default: off. </descrip> <p>Static routes have no specific attributes. diff --git a/proto/ospf/config.Y b/proto/ospf/config.Y index 49d6594..3af879d 100644 --- a/proto/ospf/config.Y +++ b/proto/ospf/config.Y @@ -49,7 +49,7 @@ CF_KEYWORDS(OSPF, AREA, OSPF_METRIC1, OSPF_METRIC2, OSPF_TAG, OSPF_ROUTER_ID) CF_KEYWORDS(BROADCAST, NEIGHBORS, RFC1583COMPAT, STUB, TICK, COST, RETRANSMIT) CF_KEYWORDS(HELLO, TRANSMIT, PRIORITY, DEAD, NONBROADCAST, POINTOPOINT, TYPE) CF_KEYWORDS(NONE, SIMPLE, AUTHENTICATION, STRICT, CRYPTOGRAPHIC) -CF_KEYWORDS(ELIGIBLE, POLL, NETWORKS, HIDDEN, VIRTUAL, LINK) +CF_KEYWORDS(ELIGIBLE, POLL, NETWORKS, HIDDEN, VIRTUAL, CHECK, LINK) CF_KEYWORDS(RX, BUFFER, LARGE, NORMAL, STUBNET, HIDDEN, SUMMARY) CF_KEYWORDS(WAIT, DELAY, LSADB) @@ -192,7 +192,7 @@ ospf_iface_item: | TYPE POINTOPOINT { OSPF_PATT->type = OSPF_IT_PTP ; } | STRICT NONBROADCAST bool { OSPF_PATT->strictnbma = $3 ; } | STUB bool { OSPF_PATT->stub = $2 ; } - | LINK bool { OSPF_PATT->use_link = $2 ; } + | CHECK LINK bool { OSPF_PATT->check_link = $3; } | NEIGHBORS '{' ipa_list '}' | AUTHENTICATION NONE { OSPF_PATT->autype = OSPF_AUTH_NONE ; } | AUTHENTICATION SIMPLE { OSPF_PATT->autype = OSPF_AUTH_SIMPLE ; } @@ -274,9 +274,6 @@ ospf_iface_start: OSPF_PATT->deadc = DEADC_D; OSPF_PATT->dead = 0; OSPF_PATT->type = OSPF_IT_UNDEF; - OSPF_PATT->strictnbma = 0; - OSPF_PATT->stub = 0; - OSPF_PATT->use_link = 1; init_list(&OSPF_PATT->nbma_list); OSPF_PATT->autype = OSPF_AUTH_NONE; reset_passwords(); diff --git a/proto/ospf/hello.c b/proto/ospf/hello.c index 3d7d8de..216dc72 100644 --- a/proto/ospf/hello.c +++ b/proto/ospf/hello.c @@ -247,7 +247,7 @@ ospf_hello_send(timer *timer, int poll, struct ospf_neighbor *dirn) else ifa = (struct ospf_iface *) timer->data; - if (ifa->state == OSPF_IS_DOWN) + if (ifa->state <= OSPF_IS_LOOP) return; if (ifa->stub) diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c index 072e1c7..83ea1c2 100644 --- a/proto/ospf/iface.c +++ b/proto/ospf/iface.c @@ -334,7 +334,7 @@ ospf_iface_sm(struct ospf_iface *ifa, int event) break; case ISM_LOOP: - if (ifa->sk && ifa->use_link) + if (ifa->sk && ifa->check_link) ospf_iface_chstate(ifa, OSPF_IS_LOOP); break; @@ -401,7 +401,7 @@ ospf_iface_add(struct object_lock *lock) } /* Do iface UP, unless there is no link and we use link detection */ - ospf_iface_sm(ifa, (ifa->use_link && !(ifa->iface->flags & IF_LINK_UP)) ? ISM_LOOP : ISM_UP); + ospf_iface_sm(ifa, (ifa->check_link && !(ifa->iface->flags & IF_LINK_UP)) ? ISM_LOOP : ISM_UP); } void @@ -435,7 +435,7 @@ ospf_iface_new(struct proto_ospf *po, struct iface *iface, struct ifa *addr, ifa->stub = ospf_iface_stubby(ip, addr); ifa->ioprob = OSPF_I_OK; ifa->rxbuf = ip->rxbuf; - ifa->use_link = ip->use_link; + ifa->check_link = ip->check_link; #ifdef OSPFv2 ifa->autype = ip->autype; diff --git a/proto/ospf/neighbor.c b/proto/ospf/neighbor.c index 2563abd..05f024a 100644 --- a/proto/ospf/neighbor.c +++ b/proto/ospf/neighbor.c @@ -284,6 +284,7 @@ can_do_adj(struct ospf_neighbor *n) switch (ifa->state) { case OSPF_IS_DOWN: + case OSPF_IS_LOOP: bug("%s: Iface %s in down state?", p->name, ifa->iface->name); break; case OSPF_IS_WAITING: diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c index d9d8b7c..026d975 100644 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@ -759,12 +759,12 @@ ospf_reconfigure(struct proto *p, struct proto_config *c) } /* LINK */ - if (oldip->use_link != newip->use_link) + if (oldip->check_link != newip->check_link) { - ifa->use_link = newip->use_link; + ifa->check_link = newip->check_link; if (!(ifa->iface->flags & IF_LINK_UP)) - ospf_iface_sm(ifa, ifa->use_link ? ISM_LOOP : ISM_UNLOOP); + ospf_iface_sm(ifa, ifa->check_link ? ISM_LOOP : ISM_UNLOOP); } /* strict nbma */ diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h index 341d9a7..3345d4f 100644 --- a/proto/ospf/ospf.h +++ b/proto/ospf/ospf.h @@ -246,7 +246,7 @@ struct ospf_iface u8 sk_spf; /* Socket is a member of SPFRouters group */ u8 sk_dr; /* Socket is a member of DRouters group */ u16 rxbuf; /* Buffer size */ - u8 use_link; /* Whether iface link change is used */ + u8 check_link; /* Whether iface link change is used */ }; struct ospf_md5 @@ -755,7 +755,7 @@ struct ospf_iface_patt u32 stub; u32 vid; u16 rxbuf; - u8 use_link; + u8 check_link; #define OSPF_RXBUF_NORMAL 0 #define OSPF_RXBUF_LARGE 1 #define OSPF_RXBUF_MINSIZE 256 /* Minimal allowed size */ diff --git a/proto/static/config.Y b/proto/static/config.Y index 9f4d7da..2849015 100644 --- a/proto/static/config.Y +++ b/proto/static/config.Y @@ -32,7 +32,7 @@ static_proto_start: proto_start STATIC { static_proto: static_proto_start proto_name '{' | static_proto proto_item ';' - | static_proto CHECK LINK ';' { STATIC_CFG->check = STATIC_CHECK_LINK; } + | static_proto CHECK LINK bool ';' { STATIC_CFG->check_link = $4; } | static_proto stat_route ';' ; diff --git a/proto/static/static.c b/proto/static/static.c index 4f879bd..4ee2cbd 100644 --- a/proto/static/static.c +++ b/proto/static/static.c @@ -72,7 +72,7 @@ static_decide(struct static_config *cf, struct static_route *r) if (!ifa) return 0; - if ((cf->check == STATIC_CHECK_LINK) && !(ifa->flags & IF_LINK_UP)) + if (cf->check_link && !(ifa->flags & IF_LINK_UP)) return 0; return 1; diff --git a/proto/static/static.h b/proto/static/static.h index 40da74c..5c31e00 100644 --- a/proto/static/static.h +++ b/proto/static/static.h @@ -13,11 +13,9 @@ struct static_config { struct proto_config c; list iface_routes; /* Routes to search on interface events */ list other_routes; /* Routes hooked to neighbor cache and reject routes */ - int check; /* Condition for route install */ + int check_link; /* Whether iface link state is used */ }; -#define STATIC_CHECK_NONE 0 -#define STATIC_CHECK_LINK 1 void static_init_config(struct static_config *); |