mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-17 08:38:42 +00:00
Minor finalizations of link state checks.
This commit is contained in:
parent
79f561a173
commit
391931d456
@ -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 <name> {
|
|||||||
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
|
|||||||
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:
|
|||||||
<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)
|
|||||||
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:
|
|||||||
| 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:
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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
|
|||||||
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
|
|||||||
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 {
|
|||||||
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)
|
|||||||
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 {
|
|||||||
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 *);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user