From: Ondrej Filip Date: Tue, 6 Jun 2000 00:08:27 +0000 (+0000) Subject: NBMA networks seems to work, but this should be better. :-) X-Git-Tag: v1.2.0~622 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eb436e16fd85340d3403a033ee86f973428a2f08;p=thirdparty%2Fbird.git NBMA networks seems to work, but this should be better. :-) --- diff --git a/proto/ospf/lsack.c b/proto/ospf/lsack.c index f79aa2ae4..b7c136731 100644 --- a/proto/ospf/lsack.c +++ b/proto/ospf/lsack.c @@ -113,7 +113,14 @@ ospf_lsack_delay_tx(struct ospf_neighbor *n) } else { - sk_send_to_agt(sk, len, ifa, NEIGHBOR_EXCHANGE); + if((ifa->state==OSPF_IS_DR)||(ifa->state==OSPF_IS_BACKUP)) + { + sk_send_to_agt(sk, len, ifa, NEIGHBOR_EXCHANGE); + } + else + { + sk_send_to_bdr(sk, len, ifa); + } } fill_ospf_pkt_hdr(n->ifa, pk, LSACK_P); diff --git a/proto/ospf/lsupd.c b/proto/ospf/lsupd.c index e28b6a7ed..8059c3696 100644 --- a/proto/ospf/lsupd.c +++ b/proto/ospf/lsupd.c @@ -149,7 +149,9 @@ flood_lsa(struct ospf_neighbor *n, struct ospf_lsa_header *hn, if(ifa->type==OSPF_IT_NBMA) { - sk_send_to_agt(sk ,len, ifa, NEIGHBOR_EXCHANGE); + if((ifa->state==OSPF_IS_BACKUP)||(ifa->state==OSPF_IS_DR)) + sk_send_to_agt(sk ,len, ifa, NEIGHBOR_EXCHANGE); + else sk_send_to_bdr(sk ,len, ifa); } else { diff --git a/proto/ospf/packet.c b/proto/ospf/packet.c index fc60a4200..88234da12 100644 --- a/proto/ospf/packet.c +++ b/proto/ospf/packet.c @@ -192,3 +192,15 @@ sk_send_to_agt(sock *sk, u16 len, struct ospf_iface *ifa, u8 state) if(n->state>=state) sk_send_to(sk, len, n->ip, OSPF_PROTO); } + +void +sk_send_to_bdr(sock *sk, u16 len, struct ospf_iface *ifa) +{ + struct ospf_neighbor *n; + + if(ipa_compare(ifa->drip,ipa_from_u32(0))!=0) + sk_send_to(sk, len, ifa->drip, OSPF_PROTO); + if(ipa_compare(ifa->bdrip,ipa_from_u32(0))!=0) + sk_send_to(sk, len, ifa->bdrip, OSPF_PROTO); +} + diff --git a/proto/ospf/packet.h b/proto/ospf/packet.h index 23999a237..4e132fa6f 100644 --- a/proto/ospf/packet.h +++ b/proto/ospf/packet.h @@ -17,5 +17,6 @@ int ospf_rx_hook(sock *sk, int size); void ospf_tx_hook(sock *sk); void ospf_err_hook(sock *sk, int err); void sk_send_to_agt(sock *sk, u16 len, struct ospf_iface *ifa, u8 state); +void sk_send_to_bdr(sock *sk, u16 len, struct ospf_iface *ifa); #endif /* _BIRD_OSPF_PACKET_H_ */