diff --git a/proto/ospf/lsreq.c b/proto/ospf/lsreq.c index 3b5ac4be..0c63ed89 100644 --- a/proto/ospf/lsreq.c +++ b/proto/ospf/lsreq.c @@ -1,7 +1,7 @@ /* * BIRD -- OSPF * - * (c) 2000 Ondrej Filip + * (c) 2000--2004 Ondrej Filip * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -9,7 +9,7 @@ #include "ospf.h" void -ospf_lsreq_tx(struct ospf_neighbor *n) +ospf_lsreq_send(struct ospf_neighbor *n) { snode *sn; struct top_hash_entry *en; @@ -17,97 +17,101 @@ ospf_lsreq_tx(struct ospf_neighbor *n) struct ospf_packet *op; struct ospf_lsreq_header *lsh; u16 length; - int i,j; - struct proto *p=&n->ifa->proto->proto; + int i, j; + struct proto *p = &n->ifa->proto->proto; - pk=(struct ospf_lsreq_packet *)n->ifa->ip_sk->tbuf; - op=(struct ospf_packet *)n->ifa->ip_sk->tbuf; + pk = (struct ospf_lsreq_packet *) n->ifa->ip_sk->tbuf; + op = (struct ospf_packet *) n->ifa->ip_sk->tbuf; fill_ospf_pkt_hdr(n->ifa, pk, LSREQ_P); - sn=SHEAD(n->lsrql); - if(EMPTY_SLIST(n->lsrql)) + sn = SHEAD(n->lsrql); + if (EMPTY_SLIST(n->lsrql)) { - if(n->state==NEIGHBOR_LOADING) ospf_neigh_sm(n, INM_LOADDONE); + if (n->state == NEIGHBOR_LOADING) + ospf_neigh_sm(n, INM_LOADDONE); return; } - - i=j=(n->ifa->iface->mtu-SIPH-sizeof(struct ospf_lsreq_packet))/ - sizeof(struct ospf_lsreq_header); - lsh=(struct ospf_lsreq_header *)(pk+1); - - for(;i>0;i--) - { - en=(struct top_hash_entry *)sn; - lsh->padd1=0; lsh->padd2=0; - lsh->type=en->lsa.type; - lsh->rt=htonl(en->lsa.rt); - lsh->id=htonl(en->lsa.id); - DBG("Requesting %uth LSA: Type: %u, Id: %I, RT: %I\n",i, en->lsa.type, - en->lsa.id, en->lsa.rt); - lsh++; - if(sn==STAIL(n->lsrql)) break; - sn=sn->next; - } - if(i!=0) i--; - length=sizeof(struct ospf_lsreq_packet)+(j-i)*sizeof(struct ospf_lsreq_header); - op->length=htons(length); + i = j = (n->ifa->iface->mtu - SIPH - sizeof(struct ospf_lsreq_packet)) / + sizeof(struct ospf_lsreq_header); + lsh = (struct ospf_lsreq_header *) (pk + 1); + + for (; i > 0; i--) + { + en = (struct top_hash_entry *) sn; + lsh->padd1 = 0; + lsh->padd2 = 0; + lsh->type = en->lsa.type; + lsh->rt = htonl(en->lsa.rt); + lsh->id = htonl(en->lsa.id); + DBG("Requesting %uth LSA: Type: %u, Id: %I, RT: %I\n", i, en->lsa.type, + en->lsa.id, en->lsa.rt); + lsh++; + if (sn == STAIL(n->lsrql)) + break; + sn = sn->next; + } + if (i != 0) + i--; + + length = + sizeof(struct ospf_lsreq_packet) + (j - + i) * sizeof(struct ospf_lsreq_header); + op->length = htons(length); ospf_pkt_finalize(n->ifa, op); - sk_send_to(n->ifa->ip_sk,length, n->ip, OSPF_PROTO); + sk_send_to(n->ifa->ip_sk, length, n->ip, OSPF_PROTO); OSPF_TRACE(D_PACKETS, "LS request sent to: %I", n->rid); } void -ospf_lsreq_rx(struct ospf_lsreq_packet *ps, struct proto *p, - struct ospf_iface *ifa, u16 size) +ospf_lsreq_receive(struct ospf_lsreq_packet *ps, + struct ospf_iface *ifa, u16 size) { - u32 nrid, myrid; + u32 nrid; struct ospf_neighbor *n; struct ospf_lsreq_header *lsh; struct l_lsr_head *llsh; list uplist; slab *upslab; - int length; - int i,lsano; + int length, i, lsano; + struct proto *p = (struct proto *) ifa->proto; - nrid=ntohl(ps->ospf_packet.routerid); + nrid = ntohl(ps->ospf_packet.routerid); - myrid=p->cf->global->router_id; - - if((n=find_neigh(ifa, nrid))==NULL) + if ((n = find_neigh(ifa, nrid)) == NULL) { - OSPF_TRACE(D_PACKETS, "Received lsreq from unknown neighbor! (%I)", - nrid); - return ; + OSPF_TRACE(D_PACKETS, "Received lsreq from unknown neighbor! (%I)", nrid); + return; } - if(n->statestate < NEIGHBOR_EXCHANGE) + return; OSPF_TRACE(D_EVENTS, "Received LS req from neighbor: %I", n->ip); ospf_neigh_sm(n, INM_HELLOREC); - length=ntohs(ps->ospf_packet.length); - lsh=(void *)(ps+1); + length = ntohs(ps->ospf_packet.length); + lsh = (void *) (ps + 1); init_list(&uplist); - upslab=sl_new(n->pool,sizeof(struct l_lsr_head)); + upslab = sl_new(n->pool, sizeof(struct l_lsr_head)); - lsano=(length-sizeof(struct ospf_lsreq_packet))/ + lsano = (length - sizeof(struct ospf_lsreq_packet)) / sizeof(struct ospf_lsreq_header); - for(i=0;iid), - lsh->type, ntohl(lsh->rt)); - llsh=sl_alloc(upslab); - llsh->lsh.id=ntohl(lsh->id); - llsh->lsh.rt=ntohl(lsh->rt); - llsh->lsh.type=lsh->type; + lsh->type, ntohl(lsh->rt)); + llsh = sl_alloc(upslab); + llsh->lsh.id = ntohl(lsh->id); + llsh->lsh.rt = ntohl(lsh->rt); + llsh->lsh.type = lsh->type; add_tail(&uplist, NODE llsh); - if(ospf_hash_find(n->ifa->oa->gr, llsh->lsh.id, llsh->lsh.rt, - llsh->lsh.type)==NULL) + if (ospf_hash_find(n->ifa->oa->gr, llsh->lsh.id, llsh->lsh.rt, + llsh->lsh.type) == NULL) { log("Received bad LS req from: %I looking: RT: %I, ID: %I, Type: %u", - n->ip, lsh->rt, lsh->id, lsh->type); - ospf_neigh_sm(n,INM_BADLSREQ); + n->ip, lsh->rt, lsh->id, lsh->type); + ospf_neigh_sm(n, INM_BADLSREQ); rfree(upslab); return; } @@ -115,4 +119,3 @@ ospf_lsreq_rx(struct ospf_lsreq_packet *ps, struct proto *p, ospf_lsupd_tx_list(n, &uplist); rfree(upslab); } - diff --git a/proto/ospf/lsreq.h b/proto/ospf/lsreq.h index ab51c5c0..90a4e82b 100644 --- a/proto/ospf/lsreq.h +++ b/proto/ospf/lsreq.h @@ -1,7 +1,7 @@ /* * BIRD -- OSPF * - * (c) 2000 Ondrej Filip + * (c) 2000--2004 Ondrej Filip * * Can be freely distributed and used under the terms of the GNU GPL. * @@ -10,8 +10,8 @@ #ifndef _BIRD_OSPF_LSREQ_H_ #define _BIRD_OSPF_LSREQ_H_ -void ospf_lsreq_tx(struct ospf_neighbor *n); -void ospf_lsreq_rx(struct ospf_lsreq_packet *ps, struct proto *p, - struct ospf_iface *ifa, u16 size); +void ospf_lsreq_send(struct ospf_neighbor *n); +void ospf_lsreq_receive(struct ospf_lsreq_packet *ps, + struct ospf_iface *ifa, u16 size); #endif /* _BIRD_OSPF_LSREQ_H_ */ diff --git a/proto/ospf/lsupd.c b/proto/ospf/lsupd.c index 0f50cb55..752ba36d 100644 --- a/proto/ospf/lsupd.c +++ b/proto/ospf/lsupd.c @@ -522,7 +522,7 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p, if(n->state==NEIGHBOR_LOADING) { - ospf_lsreq_tx(n); /* Send me another part of database */ + ospf_lsreq_send(n); /* Send me another part of database */ } } diff --git a/proto/ospf/neighbor.c b/proto/ospf/neighbor.c index eb777b7a..53144bab 100644 --- a/proto/ospf/neighbor.c +++ b/proto/ospf/neighbor.c @@ -579,7 +579,7 @@ rxmt_timer_hook(timer *timer) p->name, ifa->iface->name, n->ip); if (n->state < NEIGHBOR_LOADING) ospf_dbdes_tx(n); - if(n->state < NEIGHBOR_FULL) ospf_lsreq_tx(n); + if(n->state < NEIGHBOR_FULL) ospf_lsreq_send(n); else { if(!EMPTY_SLIST(n->lsrtl)) diff --git a/proto/ospf/packet.c b/proto/ospf/packet.c index 90ac7dee..ea10fc97 100644 --- a/proto/ospf/packet.c +++ b/proto/ospf/packet.c @@ -184,7 +184,7 @@ ospf_rx_hook (sock * sk, int size) break; case LSREQ_P: DBG ("%s: Link state request received.\n", p->name); - ospf_lsreq_rx ((struct ospf_lsreq_packet *) ps, p, ifa, size); + ospf_lsreq_receive((struct ospf_lsreq_packet *) ps, ifa, size); break; case LSUPD_P: DBG ("%s: Link state update received.\n", p->name);