diff --git a/proto/ospf/lsack.c b/proto/ospf/lsack.c index f79aa2ae..b7c13673 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 e28b6a7e..8059c369 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 fc60a420..88234da1 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 23999a23..4e132fa6 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_ */