Added stub interface. (Interface which is propagated to OSPF but

it does not sends nor listens packets.)

I added some new options, please look at it and look into doc if it's OK.
This commit is contained in:
Ondrej Filip 2000-09-02 08:54:40 +00:00
parent 5ddec4e6cf
commit e3bc10fdc4
7 changed files with 46 additions and 11 deletions

View file

@ -1014,6 +1014,7 @@ protocol ospf <name> {
interface <interface pattern> interface <interface pattern>
{ {
cost <num>; cost <num>;
stub <switch>;
hello <num>; hello <num>;
poll <num>; poll <num>;
retransmit <num>; retransmit <num>;
@ -1060,6 +1061,10 @@ protocol ospf <name> {
<tag>cost <M>num</M></tag> <tag>cost <M>num</M></tag>
Specifies output cost (metric) of an interface. Default value is 10. Specifies output cost (metric) of an interface. Default value is 10.
<tag>stub <M>switch</M></tag>
If set to interface it does not listen to any packet and does not send
any hello. Default value is no.
<tag>hello <M>num</M></tag> <tag>hello <M>num</M></tag>
Specifies interval in seconds between sending of Hello messages. Beware, all Specifies interval in seconds between sending of Hello messages. Beware, all
routers on the same network need to have the same hello interval. routers on the same network need to have the same hello interval.
@ -1093,13 +1098,17 @@ protocol ospf &lt;name&gt; {
convenient to force use of a different type manually. 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). On broadcast networks, flooding and Hello messages are sent using multicasts (a single packet for all the neighbors).
<tag>type pointopoint</tag>
Point-to-point networks connect just 2 routers together. No election
is performed there which reduces the number of messages sent.
<tag>type nonbroadcast</tag> <tag>type nonbroadcast</tag>
On nonbroadcast networks, the packets are sent to each neighbor On nonbroadcast networks, the packets are sent to each neighbor
separately because of lack of multicast capabilities. separately because of lack of multicast capabilities.
<tag>type pointopoint</tag> <tag>strict nonbroadcast <M>switch</M></tag>
Point-to-point networks connect just 2 routers together. No election If set, don't send hello to any undefined neighbor. This switch
is performed there which reduces the number of messages sent. is ignored on on any non-NBMA network. Default is No.
<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.
@ -1116,10 +1125,6 @@ protocol ospf &lt;name&gt; {
A set of neighbors to which Hello messages on nonbroadcast networks A set of neighbors to which Hello messages on nonbroadcast networks
are to be sent. Some of them could be marked as eligible. are to be sent. Some of them could be marked as eligible.
<tag>strict nonbroadcast <M>switch</M></tag>
If set, don't send hello to any undefined neighbor. This switch
is ignored on on any non-NBMA network. Default is No.
</descrip> </descrip>
<sect1>Attributes <sect1>Attributes
@ -1162,13 +1167,17 @@ protocol ospf MyOSPF {
interface "ppp*" { interface "ppp*" {
cost 100; cost 100;
}; };
interface "arc0" {
cost 10;
stub yes;
};
}; };
area 120 { area 120 {
stub yes; stub yes;
interface "-arc0" , "arc*" { interface "-arc0" , "arc*" {
type nonbroadcast; type nonbroadcast;
authentication none; authentication none;
strict nonbroadcast no; strict nonbroadcast yes;
wait 120; wait 120;
poll 40; poll 40;
dead count 8; dead count 8;

View file

@ -88,6 +88,7 @@ ospf_iface_item:
| TYPE NONBROADCAST { OSPF_PATT->type = OSPF_IT_NBMA ; } | TYPE NONBROADCAST { OSPF_PATT->type = OSPF_IT_NBMA ; }
| 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 ; }
| NEIGHBORS '{' ipa_list '}' | NEIGHBORS '{' ipa_list '}'
| AUTHENTICATION NONE { OSPF_PATT->autype=AU_NONE ; } | AUTHENTICATION NONE { OSPF_PATT->autype=AU_NONE ; }
| AUTHENTICATION SIMPLE { OSPF_PATT->autype=AU_SIMPLE ; } | AUTHENTICATION SIMPLE { OSPF_PATT->autype=AU_SIMPLE ; }
@ -137,6 +138,7 @@ ospf_iface_start:
OSPF_PATT->deadc = DEADC_D; OSPF_PATT->deadc = DEADC_D;
OSPF_PATT->type = OSPF_IT_UNDEF; OSPF_PATT->type = OSPF_IT_UNDEF;
OSPF_PATT->strictnbma = 0; OSPF_PATT->strictnbma = 0;
OSPF_PATT->stub = 0;
init_list(&OSPF_PATT->nbma_list); init_list(&OSPF_PATT->nbma_list);
OSPF_PATT->autype=AU_NONE; OSPF_PATT->autype=AU_NONE;
} }

View file

@ -249,6 +249,8 @@ hello_send(timer *timer,int poll, struct ospf_neighbor *dirn)
if(timer==NULL) ifa=dirn->ifa; if(timer==NULL) ifa=dirn->ifa;
else ifa=(struct ospf_iface *)timer->data; else ifa=(struct ospf_iface *)timer->data;
if(ifa->stub) return; /* Don't send any packet on stub iface */
p=(struct proto *)(ifa->proto); p=(struct proto *)(ifa->proto);
DBG("%s: Hello/Poll timer fired on interface %s.\n", DBG("%s: Hello/Poll timer fired on interface %s.\n",
p->name, ifa->iface->name); p->name, ifa->iface->name);

View file

@ -370,7 +370,8 @@ ospf_iface_info(struct ospf_iface *ifa)
cli_msg(-1015,"Interface \"%s\":", ifa->iface->name); cli_msg(-1015,"Interface \"%s\":", ifa->iface->name);
cli_msg(-1015,"\tArea: %I (%u)", ifa->oa->areaid, ifa->oa->areaid); 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,"\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,"\tPriority: %u", ifa->priority);
cli_msg(-1015,"\tCost: %u", ifa->cost); cli_msg(-1015,"\tCost: %u", ifa->cost);
cli_msg(-1015,"\tHello timer: %u", ifa->helloint); cli_msg(-1015,"\tHello timer: %u", ifa->helloint);
@ -429,6 +430,7 @@ ospf_ifa_add(struct object_lock *lock)
ifa->strictnbma=ip->strictnbma; ifa->strictnbma=ip->strictnbma;
ifa->waitint=ip->waitint; ifa->waitint=ip->waitint;
ifa->deadc=ip->deadc; ifa->deadc=ip->deadc;
ifa->stub=ip->stub;
ifa->autype=ip->autype; ifa->autype=ip->autype;
memcpy(ifa->aukey,ip->password,8); memcpy(ifa->aukey,ip->password,8);
ifa->options=2; /* FIXME what options? */ ifa->options=2; /* FIXME what options? */

View file

@ -558,14 +558,30 @@ ospf_reconfigure(struct proto *p, struct proto_config *c)
{ {
ifa->strictnbma=ip2->strictnbma; ifa->strictnbma=ip2->strictnbma;
OSPF_TRACE(D_EVENTS, OSPF_TRACE(D_EVENTS,
"Interface %s is now strict NBMA", "Interface %s is now strict NBMA.",
ifa->iface->name); ifa->iface->name);
} }
if((ip1->strictnbma!=0)&&(ip2->strictnbma==0)) if((ip1->strictnbma!=0)&&(ip2->strictnbma==0))
{ {
ifa->strictnbma=ip2->strictnbma; ifa->strictnbma=ip2->strictnbma;
OSPF_TRACE(D_EVENTS, 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); ifa->iface->name);
} }

View file

@ -103,6 +103,7 @@ struct ospf_iface {
u32 bdrid; u32 bdrid;
u8 type; /* OSPF view of type */ u8 type; /* OSPF view of type */
u8 strictnbma; /* Can I talk with unknown neighbors? */ u8 strictnbma; /* Can I talk with unknown neighbors? */
u8 stub; /* Inactive interface */
#define OSPF_IT_BCAST 0 #define OSPF_IT_BCAST 0
#define OSPF_IT_NBMA 1 #define OSPF_IT_NBMA 1
#define OSPF_IT_PTP 2 #define OSPF_IT_PTP 2
@ -390,6 +391,7 @@ struct ospf_iface_patt {
int type; int type;
int autype; int autype;
int strictnbma; int strictnbma;
int stub;
#define AU_NONE 0 #define AU_NONE 0
#define AU_SIMPLE 1 #define AU_SIMPLE 1
#define AU_CRYPT 2 #define AU_CRYPT 2

View file

@ -84,6 +84,8 @@ ospf_rx_hook(sock *sk, int size)
int i; int i;
u8 *pu8; u8 *pu8;
if(ifa->stub) return(1);
DBG("%s: RX_Hook called on interface %s.\n",p->name, sk->iface->name); DBG("%s: RX_Hook called on interface %s.\n",p->name, sk->iface->name);
ps = (struct ospf_packet *) ipv4_skip_header(sk->rbuf, &size); ps = (struct ospf_packet *) ipv4_skip_header(sk->rbuf, &size);