mirror of
				https://gitlab.labs.nic.cz/labs/bird.git
				synced 2024-05-11 16:54:54 +00:00 
			
		
		
		
	Merge commit '1c30b689ddd032ef8000fb7836348a48ba3184ff' into haugesund
This commit is contained in:
		| @@ -392,15 +392,18 @@ ospf_rte_better(struct rte *new, struct rte *old) | ||||
|   if (new_metric1 == LSINFINITY) | ||||
|     return 0; | ||||
|  | ||||
|   if(new->attrs->source < old->attrs->source) return 1; | ||||
|   if(new->attrs->source > old->attrs->source) return 0; | ||||
|   u32 ns = rt_get_source_attr(new); | ||||
|   u32 os = rt_get_source_attr(old); | ||||
|  | ||||
|   if(new->attrs->source == RTS_OSPF_EXT2) | ||||
|   if (ns < os) return 1; | ||||
|   if (ns > os) return 0; | ||||
|  | ||||
|   if (ns == RTS_OSPF_EXT2) | ||||
|   { | ||||
|     u32 old_metric2 = ea_get_int(old->attrs->eattrs, &ea_ospf_metric2, LSINFINITY); | ||||
|     u32 new_metric2 = ea_get_int(new->attrs->eattrs, &ea_ospf_metric2, LSINFINITY); | ||||
|     if(new_metric2 < old_metric2) return 1; | ||||
|     if(new_metric2 > old_metric2) return 0; | ||||
|     if (new_metric2 < old_metric2) return 1; | ||||
|     if (new_metric2 > old_metric2) return 0; | ||||
|   } | ||||
|  | ||||
|   u32 old_metric1 = ea_get_int(old->attrs->eattrs, &ea_ospf_metric1, LSINFINITY); | ||||
| @@ -413,7 +416,7 @@ ospf_rte_better(struct rte *new, struct rte *old) | ||||
| static u32 | ||||
| ospf_rte_igp_metric(const rte *rt) | ||||
| { | ||||
|   if (rt->attrs->source == RTS_OSPF_EXT2) | ||||
|   if (rt_get_source_attr(rt) == RTS_OSPF_EXT2) | ||||
|     return IGP_METRIC_UNKNOWN; | ||||
|  | ||||
|   return ea_get_int(rt->attrs->eattrs, &ea_ospf_metric1, LSINFINITY); | ||||
| @@ -571,7 +574,8 @@ ospf_get_route_info(rte * rte, byte * buf) | ||||
| { | ||||
|   char *type = "<bug>"; | ||||
|  | ||||
|   switch (rte->attrs->source) | ||||
|   uint source = rt_get_source_attr(rte); | ||||
|   switch (source) | ||||
|   { | ||||
|   case RTS_OSPF: | ||||
|     type = "I"; | ||||
| @@ -589,10 +593,10 @@ ospf_get_route_info(rte * rte, byte * buf) | ||||
|  | ||||
|   buf += bsprintf(buf, " %s", type); | ||||
|   buf += bsprintf(buf, " (%d/%d", rt_get_preference(rte), ea_get_int(rte->attrs->eattrs, &ea_ospf_metric1, LSINFINITY)); | ||||
|   if (rte->attrs->source == RTS_OSPF_EXT2) | ||||
|   if (source == RTS_OSPF_EXT2) | ||||
|     buf += bsprintf(buf, "/%d", ea_get_int(rte->attrs->eattrs, &ea_ospf_metric2, LSINFINITY)); | ||||
|   buf += bsprintf(buf, ")"); | ||||
|   if (rte->attrs->source == RTS_OSPF_EXT1 || rte->attrs->source == RTS_OSPF_EXT2) | ||||
|   if (source == RTS_OSPF_EXT1 || source == RTS_OSPF_EXT2) | ||||
|   { | ||||
|     eattr *ea = ea_find(rte->attrs->eattrs, &ea_ospf_tag); | ||||
|     if (ea && (ea->u.data > 0)) | ||||
|   | ||||
| @@ -2004,11 +2004,19 @@ static inline int | ||||
| ort_changed(ort *nf, rta *nr) | ||||
| { | ||||
|   rta *or = nf->old_rta; | ||||
|   return !or || | ||||
|  | ||||
|   if (!or || | ||||
|     (nf->n.metric1 != nf->old_metric1) || (nf->n.metric2 != nf->old_metric2) || | ||||
|     (nf->n.tag != nf->old_tag) || (nf->n.rid != nf->old_rid) || | ||||
|     (nr->source != or->source) || (nr->dest != or->dest) || | ||||
|     !nexthop_same(&(nr->nh), &(or->nh)); | ||||
|     (nr->dest != or->dest) || | ||||
|     !nexthop_same(&(nr->nh), &(or->nh))) | ||||
|     return 1; | ||||
|  | ||||
|   if (	ea_get_int(nr->eattrs, &ea_gen_source, 0) | ||||
|      != ea_get_int(or->eattrs, &ea_gen_source, 0)) | ||||
|     return 1; | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -2053,7 +2061,6 @@ again1: | ||||
|     if (nf->n.type) /* Add the route */ | ||||
|     { | ||||
|       rta a0 = { | ||||
| 	.source = nf->n.type, | ||||
| 	.dest = RTD_UNICAST, | ||||
| 	.nh = *(nf->n.nhs), | ||||
|       }; | ||||
| @@ -2067,7 +2074,7 @@ again1: | ||||
|  | ||||
| 	struct { | ||||
| 	  ea_list l; | ||||
| 	  eattr a[5]; | ||||
| 	  eattr a[6]; | ||||
| 	} eattrs; | ||||
|  | ||||
| 	eattrs.l = (ea_list) {}; | ||||
| @@ -2075,6 +2082,9 @@ again1: | ||||
| 	eattrs.a[eattrs.l.count++] = | ||||
| 	  EA_LITERAL_EMBEDDED(&ea_gen_preference, 0, p->p.main_channel->preference); | ||||
|  | ||||
| 	eattrs.a[eattrs.l.count++] =  | ||||
| 	  EA_LITERAL_EMBEDDED(&ea_gen_source, 0, nf->n.type); | ||||
|  | ||||
| 	eattrs.a[eattrs.l.count++] = | ||||
| 	  EA_LITERAL_EMBEDDED(&ea_ospf_metric1, 0, nf->n.metric1); | ||||
|  | ||||
| @@ -2089,6 +2099,7 @@ again1: | ||||
| 	eattrs.a[eattrs.l.count++] = | ||||
| 	  EA_LITERAL_EMBEDDED(&ea_ospf_router_id, 0, nf->n.rid); | ||||
|  | ||||
| 	ASSERT_DIE(ARRAY_SIZE(eattrs.a) >= eattrs.l.count); | ||||
| 	a0.eattrs = &eattrs.l; | ||||
|  | ||||
| 	rta_free(nf->old_rta); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user