mirror of
				https://gitlab.labs.nic.cz/labs/bird.git
				synced 2024-05-11 16:54:54 +00:00 
			
		
		
		
	Many bugfixes. (I added one entry twice to slist.)
Debug cleanup. Retransmiting of unacknolegded LSAs
This commit is contained in:
		| @@ -149,7 +149,7 @@ rxmt_timer_hook(timer *timer) | |||||||
|   n=(struct ospf_neighbor *)timer->data; |   n=(struct ospf_neighbor *)timer->data; | ||||||
|   ifa=n->ifa; |   ifa=n->ifa; | ||||||
|   p=(struct proto *)(ifa->proto); |   p=(struct proto *)(ifa->proto); | ||||||
|   debug("%s: RXMT timer fired on interface %s for neigh: %I.\n", |   DBG("%s: RXMT timer fired on interface %s for neigh: %I.\n", | ||||||
|     p->name, ifa->iface->name, n->rid); |     p->name, ifa->iface->name, n->rid); | ||||||
|   if(n->state<NEIGHBOR_LOADING) ospf_dbdes_tx(n); |   if(n->state<NEIGHBOR_LOADING) ospf_dbdes_tx(n); | ||||||
|   else |   else | ||||||
|   | |||||||
| @@ -183,7 +183,7 @@ hello_timer_hook(timer *timer) | |||||||
|  |  | ||||||
|   ifa=(struct ospf_iface *)timer->data; |   ifa=(struct ospf_iface *)timer->data; | ||||||
|   p=(struct proto *)(ifa->proto); |   p=(struct proto *)(ifa->proto); | ||||||
|   debug("%s: Hello timer fired on interface %s.\n", |   DBG("%s: Hello timer fired on interface %s.\n", | ||||||
|     p->name, ifa->iface->name); |     p->name, ifa->iface->name); | ||||||
|   /* Now we should send a hello packet */ |   /* Now we should send a hello packet */ | ||||||
|   /* First a common packet header */ |   /* First a common packet header */ | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ ospf_lsack_direct_tx(struct ospf_neighbor *n,struct ospf_lsa_header *h) | |||||||
|   struct ospf_packet *op; |   struct ospf_packet *op; | ||||||
|   struct ospf_lsack_packet *pk; |   struct ospf_lsack_packet *pk; | ||||||
|   sock *sk=n->ifa->ip_sk; |   sock *sk=n->ifa->ip_sk; | ||||||
|  |   struct proto *p=&n->ifa->proto->proto; | ||||||
|   u16 len; |   u16 len; | ||||||
|  |  | ||||||
|   DBG("Sending direct ACK to %I for Type: %u, ID: %I, RT: %I\n",n->rid, |   DBG("Sending direct ACK to %I for Type: %u, ID: %I, RT: %I\n",n->rid, | ||||||
| @@ -30,6 +31,7 @@ ospf_lsack_direct_tx(struct ospf_neighbor *n,struct ospf_lsa_header *h) | |||||||
|   op->length=htons(len); |   op->length=htons(len); | ||||||
|   ospf_pkt_finalize(n->ifa, op); |   ospf_pkt_finalize(n->ifa, op); | ||||||
|   sk_send_to(sk,len, n->ip, OSPF_PROTO); |   sk_send_to(sk,len, n->ip, OSPF_PROTO); | ||||||
|  |   debug("%s: LS ack sent to %I\n", p->name, n->ip); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| @@ -160,13 +162,16 @@ ospf_lsack_rx(struct ospf_lsack_packet *ps, struct proto *p, | |||||||
|  |  | ||||||
|   if((n=find_neigh(ifa, nrid))==NULL) |   if((n=find_neigh(ifa, nrid))==NULL) | ||||||
|   { |   { | ||||||
|     debug("%s: Received lsack from unknown neigbor! (%I)\n", p->name, |     debug("%s: Received LS ack from unknown neigbor! (%I)\n", p->name, | ||||||
|       nrid); |       nrid); | ||||||
|     return ; |     return ; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if(n->state<NEIGHBOR_EXCHANGE) return; |   if(n->state<NEIGHBOR_EXCHANGE) return; | ||||||
|  |  | ||||||
|  |   debug("%s: Received LS ack from %I\n", p->name, | ||||||
|  |       n->ip); | ||||||
|  |  | ||||||
|   nolsa=(ntohs(ps->ospf_packet.length)-sizeof(struct ospf_lsack_packet))/ |   nolsa=(ntohs(ps->ospf_packet.length)-sizeof(struct ospf_lsack_packet))/ | ||||||
|     sizeof(struct ospf_lsa_header); |     sizeof(struct ospf_lsa_header); | ||||||
|   DBG("Received %d lsa ack(s)\n",nolsa); |   DBG("Received %d lsa ack(s)\n",nolsa); | ||||||
| @@ -180,6 +185,9 @@ ospf_lsack_rx(struct ospf_lsack_packet *ps, struct proto *p, | |||||||
|     if(lsa_comp(&lsa,&en->lsa)!=CMP_SAME) |     if(lsa_comp(&lsa,&en->lsa)!=CMP_SAME) | ||||||
|     { |     { | ||||||
|       log("Strange LS acknoledgement from %I",n->rid); |       log("Strange LS acknoledgement from %I",n->rid); | ||||||
|  |       log("Id: %I, Rt: %I, Type: %u",lsa.id, lsa.rt, lsa.type); | ||||||
|  |       log("I have: Age: %u, Seqno: %u", en->lsa.age, en->lsa.sn); | ||||||
|  |       log("He has: Age: %u, Seqno: %u", lsa.age, lsa.sn); | ||||||
|       continue; |       continue; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,6 +18,7 @@ ospf_lsreq_tx(struct ospf_neighbor *n) | |||||||
|   struct ospf_lsreq_header *lsh; |   struct ospf_lsreq_header *lsh; | ||||||
|   u16 length; |   u16 length; | ||||||
|   int i,j; |   int i,j; | ||||||
|  |   struct proto *p=&n->ifa->proto->proto; | ||||||
|  |  | ||||||
|   pk=(struct ospf_lsreq_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; |   op=(struct ospf_packet *)n->ifa->ip_sk->tbuf; | ||||||
| @@ -54,7 +55,7 @@ ospf_lsreq_tx(struct ospf_neighbor *n) | |||||||
|   op->length=htons(length); |   op->length=htons(length); | ||||||
|   ospf_pkt_finalize(n->ifa, op); |   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); | ||||||
|   DBG("Lsreq send to: %I\n", n->rid); |   debug("%s: LS request sent to: %I\n", p->name, n->rid); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| @@ -63,16 +64,39 @@ lsrr_timer_hook(timer *timer) | |||||||
|   struct ospf_iface *ifa; |   struct ospf_iface *ifa; | ||||||
|   struct proto *p; |   struct proto *p; | ||||||
|   struct ospf_neighbor *n; |   struct ospf_neighbor *n; | ||||||
|  |   struct top_hash_entry *en; | ||||||
|  |  | ||||||
|   n=(struct ospf_neighbor *)timer->data; |   n=(struct ospf_neighbor *)timer->data; | ||||||
|   ifa=n->ifa; |   ifa=n->ifa; | ||||||
|   p=(struct proto *)(ifa->proto); |   p=(struct proto *)(ifa->proto); | ||||||
|   debug("%s: LSRR timer fired on interface %s for neigh: %I.\n", |  | ||||||
|  |   DBG("%s: LSRR timer fired on interface %s for neigh: %I.\n", | ||||||
|     p->name, ifa->iface->name, n->rid); |     p->name, ifa->iface->name, n->rid); | ||||||
|   if(n->state<NEIGHBOR_FULL) ospf_lsreq_tx(n); |   if(n->state<NEIGHBOR_FULL) ospf_lsreq_tx(n); | ||||||
|   else |   else | ||||||
|   { |   { | ||||||
|     int i;	/* FIXME Retransmit lsupd again */ |     if(!EMPTY_SLIST(n->lsrtl)) | ||||||
|  |     { | ||||||
|  |       list uplist; | ||||||
|  |       slab *upslab; | ||||||
|  |       struct l_lsr_head *llsh; | ||||||
|  |  | ||||||
|  |       init_list(&uplist); | ||||||
|  |       upslab=sl_new(p->pool,sizeof(struct l_lsr_head)); | ||||||
|  |  | ||||||
|  |       WALK_SLIST(SNODE en,n->lsrtl) | ||||||
|  |       { | ||||||
|  | 	if((SNODE en)->next==(SNODE en)) die("BUGGGGGG"); | ||||||
|  |         llsh=sl_alloc(upslab); | ||||||
|  |         llsh->lsh.id=en->lsa.id; | ||||||
|  |         llsh->lsh.rt=en->lsa.rt; | ||||||
|  |         llsh->lsh.type=en->lsa.type; | ||||||
|  | 	DBG("Working on ID: %I, RT: %I, Type: %u\n",en->lsa.id,en->lsa.rt,en->lsa.type); | ||||||
|  |         add_tail(&uplist, NODE llsh); | ||||||
|  |       } | ||||||
|  |       ospf_lsupd_tx_list(n, &uplist); | ||||||
|  |       rfree(upslab); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -95,11 +119,13 @@ ospf_lsreq_rx(struct ospf_lsreq_packet *ps, struct proto *p, | |||||||
|  |  | ||||||
|   if((n=find_neigh(ifa, nrid))==NULL) |   if((n=find_neigh(ifa, nrid))==NULL) | ||||||
|   { |   { | ||||||
|     debug("%s: Received lsreq from unknown neigbor! (%I)\n", p->name, |     debug("%s: Received lsreq from unknown neighbor! (%I)\n", p->name, | ||||||
|       nrid); |       nrid); | ||||||
|     return ; |     return ; | ||||||
|   } |   } | ||||||
|   if(n->state<NEIGHBOR_EXCHANGE) debug("%s: Ignoring it.\n", p->name); |   if(n->state<NEIGHBOR_EXCHANGE) return; | ||||||
|  |  | ||||||
|  |   debug("%s: Received LS req from neighbor: %I\n",p->name, n->ip); | ||||||
|  |  | ||||||
|   length=htons(ps->ospf_packet.length); |   length=htons(ps->ospf_packet.length); | ||||||
|   lsh=(void *)(ps+1); |   lsh=(void *)(ps+1); | ||||||
|   | |||||||
| @@ -69,9 +69,18 @@ flood_lsa(struct ospf_neighbor *n, struct ospf_lsa_header *hn, | |||||||
| 	} | 	} | ||||||
|       } |       } | ||||||
|       if(nn==n) continue; |       if(nn==n) continue; | ||||||
|       en=ospf_hash_get_header(nn->lsrth, hh); |       if((en=ospf_hash_find_header(nn->lsrth, hh))==NULL) | ||||||
|  |       { | ||||||
|  |         en=ospf_hash_get_header(nn->lsrth, hh); | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |         s_rem_node(SNODE en); | ||||||
|  |       } | ||||||
|       s_add_tail(&nn->lsrtl, SNODE en); |       s_add_tail(&nn->lsrtl, SNODE en); | ||||||
|       ret=1; |       ret=1; | ||||||
|  |       DBG("Adding LSA lsrt RT: %I, Id: %I, Type: %u for n: %I\n", | ||||||
|  |         en->lsa.rt,en->lsa.id, en->lsa.type, nn->ip); | ||||||
|     } |     } | ||||||
|     if(ret==0) continue; |     if(ret==0) continue; | ||||||
|     if(ifa==iff) |     if(ifa==iff) | ||||||
| @@ -147,6 +156,7 @@ ospf_lsupd_tx_list(struct ospf_neighbor *n, list *l) | |||||||
|   struct top_hash_entry *en; |   struct top_hash_entry *en; | ||||||
|   struct ospf_lsupd_packet *pk; |   struct ospf_lsupd_packet *pk; | ||||||
|   struct ospf_packet *op; |   struct ospf_packet *op; | ||||||
|  |   struct proto *p=&n->ifa->oa->po->proto; | ||||||
|   void *pktpos; |   void *pktpos; | ||||||
|   u8 ii; |   u8 ii; | ||||||
|   u8 *jj=n->ifa->ip_sk->tbuf; |   u8 *jj=n->ifa->ip_sk->tbuf; | ||||||
| @@ -174,10 +184,8 @@ ospf_lsupd_tx_list(struct ospf_neighbor *n, list *l) | |||||||
|       op->length=htons(len); |       op->length=htons(len); | ||||||
|       ospf_pkt_finalize(n->ifa, op); |       ospf_pkt_finalize(n->ifa, op); | ||||||
| 		        | 		        | ||||||
|       for(ii=0;ii<(len-SIPH);ii+=4) |  | ||||||
|         DBG("Out dump: %d,%d,%d,%d\n", *(jj+ii), *(jj+ii+1), *(jj+ii+2), *(jj+ii+3)); |  | ||||||
|  |  | ||||||
|       sk_send_to(n->ifa->ip_sk,len, n->ip, OSPF_PROTO); |       sk_send_to(n->ifa->ip_sk,len, n->ip, OSPF_PROTO); | ||||||
|  |       debug("%s: LS upd sent to %I\n", p->name, n->ip); | ||||||
|  |  | ||||||
|       DBG("LSupd: next packet\n"); |       DBG("LSupd: next packet\n"); | ||||||
|       fill_ospf_pkt_hdr(n->ifa, pk, LSUPD); |       fill_ospf_pkt_hdr(n->ifa, pk, LSUPD); | ||||||
| @@ -201,7 +209,7 @@ ospf_lsupd_tx_list(struct ospf_neighbor *n, list *l) | |||||||
|     DBG("Out dump: %d,%d,%d,%d\n", *(jj+ii), *(jj+ii+1), *(jj+ii+2), *(jj+ii+3)); |     DBG("Out dump: %d,%d,%d,%d\n", *(jj+ii), *(jj+ii+1), *(jj+ii+2), *(jj+ii+3)); | ||||||
|  |  | ||||||
|   sk_send_to(n->ifa->ip_sk,len, n->ip, OSPF_PROTO); |   sk_send_to(n->ifa->ip_sk,len, n->ip, OSPF_PROTO); | ||||||
|   DBG("LSupd: sent\n"); |   debug("%s: LS upd sent to %I\n", p->name, n->ip); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| @@ -233,6 +241,8 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p, | |||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   debug("%s: Received LS upd from (%I)\n", p->name, n->ip);  | ||||||
|  |  | ||||||
|   lsa=(struct ospf_lsa_header *)(ps+1); |   lsa=(struct ospf_lsa_header *)(ps+1); | ||||||
|   area=htonl(ps->ospf_packet.areaid); |   area=htonl(ps->ospf_packet.areaid); | ||||||
|   oa=ospf_find_area((struct proto_ospf *)p,area); |   oa=ospf_find_area((struct proto_ospf *)p,area); | ||||||
|   | |||||||
| @@ -27,8 +27,6 @@ | |||||||
| #include "conf/conf.h" | #include "conf/conf.h" | ||||||
| #include "lib/string.h" | #include "lib/string.h" | ||||||
|  |  | ||||||
| #define LOCAL_DEBUG |  | ||||||
|  |  | ||||||
| #define OSPF_PROTO 89 | #define OSPF_PROTO 89 | ||||||
| #ifndef IPV6 | #ifndef IPV6 | ||||||
| #define OSPF_VERSION 2 | #define OSPF_VERSION 2 | ||||||
|   | |||||||
| @@ -7,8 +7,6 @@ | |||||||
|  *	Can be freely distributed and used under the terms of the GNU GPL. |  *	Can be freely distributed and used under the terms of the GNU GPL. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #define LOCAL_DEBUG |  | ||||||
|  |  | ||||||
| #include "nest/bird.h" | #include "nest/bird.h" | ||||||
| #include "lib/string.h" | #include "lib/string.h" | ||||||
|  |  | ||||||
| @@ -34,9 +32,10 @@ originate_rt_lsa_body(struct ospf_area *oa, u16 *length, struct proto_ospf *p) | |||||||
|   struct top_hash_entry *old; |   struct top_hash_entry *old; | ||||||
|   struct proto_ospf *po=(struct proto_ospf *)p; |   struct proto_ospf *po=(struct proto_ospf *)p; | ||||||
|  |  | ||||||
|   DBG("%s: Originating RT_lsa body for area \"%I\".\n", po->proto.name, oa->areaid); |   DBG("%s: Originating RT_lsa body for area \"%I\".\n", po->proto.name, | ||||||
|  |     oa->areaid); | ||||||
|  |  | ||||||
|   WALK_LIST (ifa, p->iface_list) i++; |   WALK_LIST (ifa, p->iface_list) | ||||||
|   { |   { | ||||||
|     if((ifa->an==oa->areaid) && (ifa->state!=OSPF_IS_DOWN)) |     if((ifa->an==oa->areaid) && (ifa->state!=OSPF_IS_DOWN)) | ||||||
|     { |     { | ||||||
| @@ -226,7 +225,7 @@ originate_rt_lsa(struct ospf_area *oa, struct proto_ospf *po) | |||||||
|   struct top_hash_entry *en; |   struct top_hash_entry *en; | ||||||
|   void *body; |   void *body; | ||||||
|  |  | ||||||
|   DBG("%s: Originating RT_lsa for area \"%I\".\n", po->proto.name, oa->areaid); |   debug("%s: Originating RT_lsa for area \"%I\".\n",po->proto.name,oa->areaid); | ||||||
|  |  | ||||||
|   lsa.age=0; |   lsa.age=0; | ||||||
|   lsa.id=rtid; |   lsa.id=rtid; | ||||||
| @@ -287,7 +286,8 @@ originate_net_lsa(struct ospf_iface *ifa, struct proto_ospf *po) | |||||||
|  |  | ||||||
|   if(ifa->state!=OSPF_IS_DR) return; |   if(ifa->state!=OSPF_IS_DR) return; | ||||||
|  |  | ||||||
|   DBG("%s: Originating Net lsa for iface \"%s\".\n", po->proto.name, ifa->iface->name); |   debug("%s: Originating Net lsa for iface \"%s\".\n", po->proto.name, | ||||||
|  |     ifa->iface->name); | ||||||
|  |  | ||||||
|   if(ifa->fadj==0) |   if(ifa->fadj==0) | ||||||
|   { |   { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user