Commit 391931d4 authored by Ondřej Zajíček's avatar Ondřej Zajíček

Minor finalizations of link state checks.

parent 79f561a1
...@@ -1675,7 +1675,7 @@ protocol ospf <name> { ...@@ -1675,7 +1675,7 @@ protocol ospf <name> {
<tag>rx buffer <M>num</M></tag> <tag>rx buffer <M>num</M></tag>
This sets the size of buffer used for receiving packets. The buffer should This sets the size of buffer used for receiving packets. The buffer should
be bigger than maximal size of any packets. Value NORMAL (default) 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> <tag>type broadcast</tag>
BIRD detects a type of a connected network automatically, but sometimes it's BIRD detects a type of a connected network automatically, but sometimes it's
...@@ -1695,6 +1695,14 @@ protocol ospf &lt;name&gt; { ...@@ -1695,6 +1695,14 @@ protocol ospf &lt;name&gt; {
If set, don't send hello to any undefined neighbor. This switch If set, don't send hello to any undefined neighbor. This switch
is ignored on any non-NBMA network. Default is No. 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> <tag>authentication none</tag>
No passwords are sent in OSPF packets. This is the default value. 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 ...@@ -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 uninstalls the route from the table it is connected to and adds it again as soon
as the destination becomes adjacent again. as the destination becomes adjacent again.
<p>The Static protocol has no configuration options. Instead, the <p>The Static protocol does not have many configuration options. The
definition of the protocol contains a list of static routes: definition of the protocol contains mainly a list of static routes:
<descrip> <descrip>
<tag>route <m/prefix/ via <m/ip/</tag> Static route through <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: ...@@ -2056,6 +2064,14 @@ definition of the protocol contains a list of static routes:
<tag>route <m/prefix/ drop|reject|prohibit</tag> Special routes <tag>route <m/prefix/ drop|reject|prohibit</tag> Special routes
specifying to drop the packet, return it as unreachable or return specifying to drop the packet, return it as unreachable or return
it as administratively prohibited. 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> </descrip>
<p>Static routes have no specific attributes. <p>Static routes have no specific attributes.
......
...@@ -49,7 +49,7 @@ CF_KEYWORDS(OSPF, AREA, OSPF_METRIC1, OSPF_METRIC2, OSPF_TAG, OSPF_ROUTER_ID) ...@@ -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(BROADCAST, NEIGHBORS, RFC1583COMPAT, STUB, TICK, COST, RETRANSMIT)
CF_KEYWORDS(HELLO, TRANSMIT, PRIORITY, DEAD, NONBROADCAST, POINTOPOINT, TYPE) CF_KEYWORDS(HELLO, TRANSMIT, PRIORITY, DEAD, NONBROADCAST, POINTOPOINT, TYPE)
CF_KEYWORDS(NONE, SIMPLE, AUTHENTICATION, STRICT, CRYPTOGRAPHIC) 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(RX, BUFFER, LARGE, NORMAL, STUBNET, HIDDEN, SUMMARY)
CF_KEYWORDS(WAIT, DELAY, LSADB) CF_KEYWORDS(WAIT, DELAY, LSADB)
...@@ -192,7 +192,7 @@ ospf_iface_item: ...@@ -192,7 +192,7 @@ ospf_iface_item:
| TYPE POINTOPOINT { OSPF_PATT->type = OSPF_IT_PTP ; } | TYPE POINTOPOINT { OSPF_PATT->type = OSPF_IT_PTP ; }
| STRICT NONBROADCAST bool { OSPF_PATT->strictnbma = $3 ; } | STRICT NONBROADCAST bool { OSPF_PATT->strictnbma = $3 ; }
| STUB bool { OSPF_PATT->stub = $2 ; } | STUB bool { OSPF_PATT->stub = $2 ; }
| LINK bool { OSPF_PATT->use_link = $2 ; } | CHECK LINK bool { OSPF_PATT->check_link = $3; }
| NEIGHBORS '{' ipa_list '}' | NEIGHBORS '{' ipa_list '}'
| AUTHENTICATION NONE { OSPF_PATT->autype = OSPF_AUTH_NONE ; } | AUTHENTICATION NONE { OSPF_PATT->autype = OSPF_AUTH_NONE ; }
| AUTHENTICATION SIMPLE { OSPF_PATT->autype = OSPF_AUTH_SIMPLE ; } | AUTHENTICATION SIMPLE { OSPF_PATT->autype = OSPF_AUTH_SIMPLE ; }
...@@ -274,9 +274,6 @@ ospf_iface_start: ...@@ -274,9 +274,6 @@ ospf_iface_start:
OSPF_PATT->deadc = DEADC_D; OSPF_PATT->deadc = DEADC_D;
OSPF_PATT->dead = 0; OSPF_PATT->dead = 0;
OSPF_PATT->type = OSPF_IT_UNDEF; 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); init_list(&OSPF_PATT->nbma_list);
OSPF_PATT->autype = OSPF_AUTH_NONE; OSPF_PATT->autype = OSPF_AUTH_NONE;
reset_passwords(); reset_passwords();
......
...@@ -247,7 +247,7 @@ ospf_hello_send(timer *timer, int poll, struct ospf_neighbor *dirn) ...@@ -247,7 +247,7 @@ ospf_hello_send(timer *timer, int poll, struct ospf_neighbor *dirn)
else else
ifa = (struct ospf_iface *) timer->data; ifa = (struct ospf_iface *) timer->data;
if (ifa->state == OSPF_IS_DOWN) if (ifa->state <= OSPF_IS_LOOP)
return; return;
if (ifa->stub) if (ifa->stub)
......
...@@ -334,7 +334,7 @@ ospf_iface_sm(struct ospf_iface *ifa, int event) ...@@ -334,7 +334,7 @@ ospf_iface_sm(struct ospf_iface *ifa, int event)
break; break;
case ISM_LOOP: case ISM_LOOP:
if (ifa->sk && ifa->use_link) if (ifa->sk && ifa->check_link)
ospf_iface_chstate(ifa, OSPF_IS_LOOP); ospf_iface_chstate(ifa, OSPF_IS_LOOP);
break; break;
...@@ -401,7 +401,7 @@ ospf_iface_add(struct object_lock *lock) ...@@ -401,7 +401,7 @@ ospf_iface_add(struct object_lock *lock)
} }
/* Do iface UP, unless there is no link and we use link detection */ /* 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 void
...@@ -435,7 +435,7 @@ ospf_iface_new(struct proto_ospf *po, struct iface *iface, struct ifa *addr, ...@@ -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->stub = ospf_iface_stubby(ip, addr);
ifa->ioprob = OSPF_I_OK; ifa->ioprob = OSPF_I_OK;
ifa->rxbuf = ip->rxbuf; ifa->rxbuf = ip->rxbuf;
ifa->use_link = ip->use_link; ifa->check_link = ip->check_link;
#ifdef OSPFv2 #ifdef OSPFv2
ifa->autype = ip->autype; ifa->autype = ip->autype;
......
...@@ -284,6 +284,7 @@ can_do_adj(struct ospf_neighbor *n) ...@@ -284,6 +284,7 @@ can_do_adj(struct ospf_neighbor *n)
switch (ifa->state) switch (ifa->state)
{ {
case OSPF_IS_DOWN: case OSPF_IS_DOWN:
case OSPF_IS_LOOP:
bug("%s: Iface %s in down state?", p->name, ifa->iface->name); bug("%s: Iface %s in down state?", p->name, ifa->iface->name);
break; break;
case OSPF_IS_WAITING: case OSPF_IS_WAITING:
......
...@@ -759,12 +759,12 @@ ospf_reconfigure(struct proto *p, struct proto_config *c) ...@@ -759,12 +759,12 @@ ospf_reconfigure(struct proto *p, struct proto_config *c)
} }
/* LINK */ /* 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)) 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 */ /* strict nbma */
......
...@@ -246,7 +246,7 @@ struct ospf_iface ...@@ -246,7 +246,7 @@ struct ospf_iface
u8 sk_spf; /* Socket is a member of SPFRouters group */ u8 sk_spf; /* Socket is a member of SPFRouters group */
u8 sk_dr; /* Socket is a member of DRouters group */ u8 sk_dr; /* Socket is a member of DRouters group */
u16 rxbuf; /* Buffer size */ 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 struct ospf_md5
...@@ -755,7 +755,7 @@ struct ospf_iface_patt ...@@ -755,7 +755,7 @@ struct ospf_iface_patt
u32 stub; u32 stub;
u32 vid; u32 vid;
u16 rxbuf; u16 rxbuf;
u8 use_link; u8 check_link;
#define OSPF_RXBUF_NORMAL 0 #define OSPF_RXBUF_NORMAL 0
#define OSPF_RXBUF_LARGE 1 #define OSPF_RXBUF_LARGE 1
#define OSPF_RXBUF_MINSIZE 256 /* Minimal allowed size */ #define OSPF_RXBUF_MINSIZE 256 /* Minimal allowed size */
......
...@@ -32,7 +32,7 @@ static_proto_start: proto_start STATIC { ...@@ -32,7 +32,7 @@ static_proto_start: proto_start STATIC {
static_proto: static_proto:
static_proto_start proto_name '{' static_proto_start proto_name '{'
| static_proto proto_item ';' | 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 ';' | static_proto stat_route ';'
; ;
......
...@@ -72,7 +72,7 @@ static_decide(struct static_config *cf, struct static_route *r) ...@@ -72,7 +72,7 @@ static_decide(struct static_config *cf, struct static_route *r)
if (!ifa) if (!ifa)
return 0; 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 0;
return 1; return 1;
......
...@@ -13,11 +13,9 @@ struct static_config { ...@@ -13,11 +13,9 @@ struct static_config {
struct proto_config c; struct proto_config c;
list iface_routes; /* Routes to search on interface events */ list iface_routes; /* Routes to search on interface events */
list other_routes; /* Routes hooked to neighbor cache and reject routes */ 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 *); void static_init_config(struct static_config *);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment