diff options
Diffstat (limited to 'proto/ospf/hello.c')
-rw-r--r-- | proto/ospf/hello.c | 103 |
1 files changed, 53 insertions, 50 deletions
diff --git a/proto/ospf/hello.c b/proto/ospf/hello.c index a318a67..c805973 100644 --- a/proto/ospf/hello.c +++ b/proto/ospf/hello.c @@ -166,16 +166,20 @@ ospf_hello_send(timer * timer, int poll, struct ospf_neighbor *dirn) struct ospf_hello_packet *pkt; struct ospf_packet *op; struct proto *p; - struct ospf_neighbor *neigh; + struct ospf_neighbor *neigh, *n1; u16 length; u32 *pp; - int i; + int i, send; + struct nbma_node *nb; if (timer == NULL) ifa = dirn->ifa; else ifa = (struct ospf_iface *) timer->data; + if (ifa->state == OSPF_IS_DOWN) + return; + if (ifa->stub) return; /* Don't send any packet on stub iface */ @@ -184,13 +188,13 @@ ospf_hello_send(timer * timer, int poll, struct ospf_neighbor *dirn) p->name, ifa->iface->name); /* Now we should send a hello packet */ /* First a common packet header */ - if (ifa->type != OSPF_IT_NBMA) + if ((ifa->type == OSPF_IT_NBMA) || (ifa->type == OSPF_IT_VLINK)) { - pkt = (struct ospf_hello_packet *) (ifa->hello_sk->tbuf); + pkt = (struct ospf_hello_packet *) (ifa->ip_sk->tbuf); } else { - pkt = (struct ospf_hello_packet *) (ifa->ip_sk->tbuf); + pkt = (struct ospf_hello_packet *) (ifa->hello_sk->tbuf); } /* Now fill ospf_hello header */ @@ -224,56 +228,55 @@ ospf_hello_send(timer * timer, int poll, struct ospf_neighbor *dirn) ospf_pkt_finalize(ifa, op); /* And finally send it :-) */ - if (ifa->type != OSPF_IT_NBMA) - { - sk_send(ifa->hello_sk, length); - } - else /* NBMA */ + switch(ifa->type) { - struct ospf_neighbor *n1; - struct nbma_node *nb; - int send; - - if (timer == NULL) /* Response to received hello */ - { - sk_send_to(ifa->ip_sk, length, dirn->ip, OSPF_PROTO); - } - else - { - int toall = 0; - int meeli = 0; - if (ifa->state > OSPF_IS_DROTHER) - toall = 1; - if (ifa->priority > 0) - meeli = 1; - - WALK_LIST(nb, ifa->nbma_list) + case OSPF_IT_NBMA: + if (timer == NULL) /* Response to received hello */ { - send = 1; - WALK_LIST(n1, ifa->neigh_list) - { - if (ipa_compare(nb->ip, n1->ip) == 0) - { - send = 0; - break; - } - } - if ((poll == 1) && (send)) - { - if (toall || (meeli && nb->eligible)) - sk_send_to(ifa->ip_sk, length, nb->ip, OSPF_PROTO); - } + ospf_send_to(ifa->ip_sk, length, dirn->ip); } - if (poll == 0) + else { - WALK_LIST(n1, ifa->neigh_list) - { - if (toall || (n1->rid == ifa->drid) || (n1->rid == ifa->bdrid) || - (meeli && (n1->priority > 0))) - sk_send_to(ifa->ip_sk, length, n1->ip, OSPF_PROTO); - } + int toall = 0; + int meeli = 0; + if (ifa->state > OSPF_IS_DROTHER) + toall = 1; + if (ifa->priority > 0) + meeli = 1; + + WALK_LIST(nb, ifa->nbma_list) + { + send = 1; + WALK_LIST(n1, ifa->neigh_list) + { + if (ipa_compare(nb->ip, n1->ip) == 0) + { + send = 0; + break; + } + } + if ((poll == 1) && (send)) + { + if (toall || (meeli && nb->eligible)) + ospf_send_to(ifa->ip_sk, length, nb->ip); + } + } + if (poll == 0) + { + WALK_LIST(n1, ifa->neigh_list) + { + if (toall || (n1->rid == ifa->drid) || (n1->rid == ifa->bdrid) || + (meeli && (n1->priority > 0))) + ospf_send_to(ifa->ip_sk, length, n1->ip); + } + } } - } + break; + case OSPF_IT_VLINK: + ospf_send_to(ifa->ip_sk, length, ifa->vip); + break; + default: + sk_send(ifa->hello_sk, length); } OSPF_TRACE(D_PACKETS, "Hello sent via %s", ifa->iface->name); } |