From eb436e16fd85340d3403a033ee86f973428a2f08 Mon Sep 17 00:00:00 2001 From: Ondrej Filip Date: Tue, 6 Jun 2000 00:08:27 +0000 Subject: NBMA networks seems to work, but this should be better. :-) --- proto/ospf/lsack.c | 9 ++++++++- proto/ospf/lsupd.c | 4 +++- proto/ospf/packet.c | 12 ++++++++++++ proto/ospf/packet.h | 1 + 4 files changed, 24 insertions(+), 2 deletions(-) (limited to 'proto') diff --git a/proto/ospf/lsack.c b/proto/ospf/lsack.c index f79aa2a..b7c1367 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 e28b6a7..8059c36 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 fc60a42..88234da 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 23999a2..4e132fa 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_ */ -- cgit v1.2.3