summaryrefslogtreecommitdiffstats
path: root/proto/ospf/lsalib.c
diff options
context:
space:
mode:
Diffstat (limited to 'proto/ospf/lsalib.c')
-rw-r--r--proto/ospf/lsalib.c414
1 files changed, 215 insertions, 199 deletions
diff --git a/proto/ospf/lsalib.c b/proto/ospf/lsalib.c
index 394301d..d78e30a 100644
--- a/proto/ospf/lsalib.c
+++ b/proto/ospf/lsalib.c
@@ -11,13 +11,15 @@
void
flush_lsa(struct top_hash_entry *en, struct ospf_area *oa)
{
- struct proto *p=&oa->po->proto;
- OSPF_TRACE(D_EVENTS, "Going to remove node Type: %u, Id: %I, Rt: %I, Age: %u",
- en->lsa.type, en->lsa.id, en->lsa.rt, en->lsa.age);
+ struct proto *p = &oa->po->proto;
+ OSPF_TRACE(D_EVENTS,
+ "Going to remove node Type: %u, Id: %I, Rt: %I, Age: %u",
+ en->lsa.type, en->lsa.id, en->lsa.rt, en->lsa.age);
s_rem_node(SNODE en);
- if(en->lsa_body!=NULL) mb_free(en->lsa_body);
- en->lsa_body=NULL;
- ospf_hash_delete(oa->gr,en);
+ if (en->lsa_body != NULL)
+ mb_free(en->lsa_body);
+ en->lsa_body = NULL;
+ ospf_hash_delete(oa->gr, en);
}
/**
@@ -38,49 +40,52 @@ flush_lsa(struct top_hash_entry *en, struct ospf_area *oa)
void
ospf_age(struct ospf_area *oa)
{
- struct proto *p=&oa->po->proto;
- struct proto_ospf *po=(struct proto_ospf *)p;
- struct top_hash_entry *en,*nxt;
- int flush=can_flush_lsa(oa);
+ struct proto *p = &oa->po->proto;
+ struct proto_ospf *po = (struct proto_ospf *) p;
+ struct top_hash_entry *en, *nxt;
+ int flush = can_flush_lsa(oa);
OSPF_TRACE(D_EVENTS, "Running ospf_age");
- WALK_SLIST_DELSAFE(en,nxt,oa->lsal)
+ WALK_SLIST_DELSAFE(en, nxt, oa->lsal)
{
- if(oa->calcrt)
+ if (oa->calcrt)
{
- en->color=OUTSPF;
- en->dist=LSINFINITY;
- en->nhi=NULL;
- en->nh=ipa_from_u32(0);
+ en->color = OUTSPF;
+ en->dist = LSINFINITY;
+ en->nhi = NULL;
+ en->nh = ipa_from_u32(0);
DBG("Infinitying Type: %u, Id: %I, Rt: %I\n", en->lsa.type, en->lsa.id,
- en->lsa.rt);
+ en->lsa.rt);
}
- if(en->lsa.age==LSA_MAXAGE)
+ if (en->lsa.age == LSA_MAXAGE)
{
- if(flush) flush_lsa(en,oa);
+ if (flush)
+ flush_lsa(en, oa);
continue;
}
- if((en->lsa.rt==p->cf->global->router_id)&&(en->lsa.age>=LSREFRESHTIME))
+ if ((en->lsa.rt == p->cf->global->router_id) &&(en->lsa.age >=
+ LSREFRESHTIME))
{
- OSPF_TRACE(D_EVENTS, "Refreshing my LSA: Type: %u, Id: %I, Rt: %I",
- en->lsa.type, en->lsa.id, en->lsa.rt);
- en->lsa.sn++;
- en->lsa.age=0;
- en->inst_t=now;
- en->ini_age=0;
- lsasum_calculate(&en->lsa,en->lsa_body,po);
- ospf_lsupd_flood(NULL,NULL,&en->lsa,NULL,oa,1);
- continue;
+ OSPF_TRACE(D_EVENTS, "Refreshing my LSA: Type: %u, Id: %I, Rt: %I",
+ en->lsa.type, en->lsa.id, en->lsa.rt);
+ en->lsa.sn++;
+ en->lsa.age = 0;
+ en->inst_t = now;
+ en->ini_age = 0;
+ lsasum_calculate(&en->lsa, en->lsa_body, po);
+ ospf_lsupd_flood(NULL, NULL, &en->lsa, NULL, oa, 1);
+ continue;
}
- if((en->lsa.age=(en->ini_age+(now-en->inst_t)))>=LSA_MAXAGE)
+ if ((en->lsa.age = (en->ini_age + (now - en->inst_t))) >= LSA_MAXAGE)
{
- if(flush)
+ if (flush)
{
- flush_lsa(en,oa);
- schedule_rtcalc(oa);
+ flush_lsa(en, oa);
+ schedule_rtcalc(oa);
}
- else en->lsa.age=LSA_MAXAGE;
+ else
+ en->lsa.age = LSA_MAXAGE;
}
}
}
@@ -88,124 +93,125 @@ ospf_age(struct ospf_area *oa)
void
htonlsah(struct ospf_lsa_header *h, struct ospf_lsa_header *n)
{
- n->age=htons(h->age);
- n->options=h->options;
- n->type=h->type;
- n->id=htonl(h->id);
- n->rt=htonl(h->rt);
- n->sn=htonl(h->sn);
- n->checksum=htons(h->checksum);
- n->length=htons(h->length);
+ n->age = htons(h->age);
+ n->options = h->options;
+ n->type = h->type;
+ n->id = htonl(h->id);
+ n->rt = htonl(h->rt);
+ n->sn = htonl(h->sn);
+ n->checksum = htons(h->checksum);
+ n->length = htons(h->length);
};
void
ntohlsah(struct ospf_lsa_header *n, struct ospf_lsa_header *h)
{
- h->age=ntohs(n->age);
- h->options=n->options;
- h->type=n->type;
- h->id=ntohl(n->id);
- h->rt=ntohl(n->rt);
- h->sn=ntohl(n->sn);
- h->checksum=ntohs(n->checksum);
- h->length=ntohs(n->length);
+ h->age = ntohs(n->age);
+ h->options = n->options;
+ h->type = n->type;
+ h->id = ntohl(n->id);
+ h->rt = ntohl(n->rt);
+ h->sn = ntohl(n->sn);
+ h->checksum = ntohs(n->checksum);
+ h->length = ntohs(n->length);
};
void
htonlsab(void *h, void *n, u8 type, u16 len)
{
unsigned int i;
- switch(type)
+ switch (type)
{
- case LSA_T_RT:
+ case LSA_T_RT:
{
struct ospf_lsa_rt *hrt, *nrt;
- struct ospf_lsa_rt_link *hrtl,*nrtl;
+ struct ospf_lsa_rt_link *hrtl, *nrtl;
u16 links;
- nrt=n;
- hrt=h;
- links=hrt->links;
+ nrt = n;
+ hrt = h;
+ links = hrt->links;
- nrt->veb.byte=hrt->veb.byte;
- nrt->padding=0;
- nrt->links=htons(hrt->links);
- nrtl=(struct ospf_lsa_rt_link *)(nrt+1);
- hrtl=(struct ospf_lsa_rt_link *)(hrt+1);
- for(i=0;i<links;i++)
+ nrt->veb.byte = hrt->veb.byte;
+ nrt->padding = 0;
+ nrt->links = htons(hrt->links);
+ nrtl = (struct ospf_lsa_rt_link *) (nrt + 1);
+ hrtl = (struct ospf_lsa_rt_link *) (hrt + 1);
+ for (i = 0; i < links; i++)
{
- (nrtl+i)->id=htonl((hrtl+i)->id);
- (nrtl+i)->data=htonl((hrtl+i)->data);
- (nrtl+i)->type=(hrtl+i)->type;
- (nrtl+i)->notos=(hrtl+i)->notos;
- (nrtl+i)->metric=htons((hrtl+i)->metric);
+ (nrtl + i)->id = htonl((hrtl + i)->id);
+ (nrtl + i)->data = htonl((hrtl + i)->data);
+ (nrtl + i)->type = (hrtl + i)->type;
+ (nrtl + i)->notos = (hrtl + i)->notos;
+ (nrtl + i)->metric = htons((hrtl + i)->metric);
}
break;
}
- case LSA_T_NET:
+ case LSA_T_NET:
{
- u32 *hid,*nid;
+ u32 *hid, *nid;
- nid=n;
- hid=h;
+ nid = n;
+ hid = h;
- for(i=0;i<(len/sizeof(u32));i++)
+ for (i = 0; i < (len / sizeof(u32)); i++)
{
- *(nid+i)=htonl(*(hid+i));
+ *(nid + i) = htonl(*(hid + i));
}
break;
}
- case LSA_T_SUM_NET:
- case LSA_T_SUM_RT:
+ case LSA_T_SUM_NET:
+ case LSA_T_SUM_RT:
{
struct ospf_lsa_summ *hs, *ns;
struct ospf_lsa_summ_net *hn, *nn;
- hs=h;
- ns=n;
+ hs = h;
+ ns = n;
- ns->netmask=hs->netmask;
+ ns->netmask = hs->netmask;
ipa_hton(ns->netmask);
- hn=(struct ospf_lsa_summ_net *)(hs+1);
- nn=(struct ospf_lsa_summ_net *)(ns+1);
+ hn = (struct ospf_lsa_summ_net *) (hs + 1);
+ nn = (struct ospf_lsa_summ_net *) (ns + 1);
- for(i=0;i<((len-sizeof(struct ospf_lsa_summ))/
- sizeof(struct ospf_lsa_summ_net));i++)
+ for (i = 0; i < ((len - sizeof(struct ospf_lsa_summ)) /
+ sizeof(struct ospf_lsa_summ_net)); i++)
{
- (nn+i)->tos=(hn+i)->tos;
- (nn+i)->metric=htons((hn+i)->metric);
- (nn+i)->padding=0;
+ (nn + i)->tos = (hn + i)->tos;
+ (nn + i)->metric = htons((hn + i)->metric);
+ (nn + i)->padding = 0;
}
break;
}
- case LSA_T_EXT:
+ case LSA_T_EXT:
{
struct ospf_lsa_ext *he, *ne;
struct ospf_lsa_ext_tos *ht, *nt;
- he=h;
- ne=n;
+ he = h;
+ ne = n;
- ne->netmask=he->netmask;
+ ne->netmask = he->netmask;
ipa_hton(ne->netmask);
- ht=(struct ospf_lsa_ext_tos *)(he+1);
- nt=(struct ospf_lsa_ext_tos *)(ne+1);
+ ht = (struct ospf_lsa_ext_tos *) (he + 1);
+ nt = (struct ospf_lsa_ext_tos *) (ne + 1);
- for(i=0;i<((len-sizeof(struct ospf_lsa_ext))/
- sizeof(struct ospf_lsa_ext_tos));i++)
+ for (i = 0; i < ((len - sizeof(struct ospf_lsa_ext)) /
+ sizeof(struct ospf_lsa_ext_tos)); i++)
{
- (nt+i)->etos=(ht+i)->etos;
- (nt+i)->padding=0;
- (nt+i)->metric=htons((ht+i)->metric);
- (nt+i)->fwaddr=(ht+i)->fwaddr;
- ipa_hton((nt+i)->fwaddr);
- (nt+i)->tag=htonl((ht+i)->tag);
+ (nt + i)->etos = (ht + i)->etos;
+ (nt + i)->padding = 0;
+ (nt + i)->metric = htons((ht + i)->metric);
+ (nt + i)->fwaddr = (ht + i)->fwaddr;
+ ipa_hton((nt + i)->fwaddr);
+ (nt + i)->tag = htonl((ht + i)->tag);
}
break;
}
- default: bug("(hton): Unknown LSA");
+ default:
+ bug("(hton): Unknown LSA");
}
};
@@ -213,96 +219,97 @@ void
ntohlsab(void *n, void *h, u8 type, u16 len)
{
unsigned int i;
- switch(type)
+ switch (type)
{
- case LSA_T_RT:
+ case LSA_T_RT:
{
struct ospf_lsa_rt *hrt, *nrt;
- struct ospf_lsa_rt_link *hrtl,*nrtl;
+ struct ospf_lsa_rt_link *hrtl, *nrtl;
u16 links;
- nrt=n;
- hrt=h;
+ nrt = n;
+ hrt = h;
- hrt->veb.byte=nrt->veb.byte;
- hrt->padding=0;
- links=hrt->links=ntohs(nrt->links);
- nrtl=(struct ospf_lsa_rt_link *)(nrt+1);
- hrtl=(struct ospf_lsa_rt_link *)(hrt+1);
- for(i=0;i<links;i++)
+ hrt->veb.byte = nrt->veb.byte;
+ hrt->padding = 0;
+ links = hrt->links = ntohs(nrt->links);
+ nrtl = (struct ospf_lsa_rt_link *) (nrt + 1);
+ hrtl = (struct ospf_lsa_rt_link *) (hrt + 1);
+ for (i = 0; i < links; i++)
{
- (hrtl+i)->id=ntohl((nrtl+i)->id);
- (hrtl+i)->data=ntohl((nrtl+i)->data);
- (hrtl+i)->type=(nrtl+i)->type;
- (hrtl+i)->notos=(nrtl+i)->notos;
- (hrtl+i)->metric=ntohs((nrtl+i)->metric);
+ (hrtl + i)->id = ntohl((nrtl + i)->id);
+ (hrtl + i)->data = ntohl((nrtl + i)->data);
+ (hrtl + i)->type = (nrtl + i)->type;
+ (hrtl + i)->notos = (nrtl + i)->notos;
+ (hrtl + i)->metric = ntohs((nrtl + i)->metric);
}
break;
}
- case LSA_T_NET:
+ case LSA_T_NET:
{
- u32 *hid,*nid;
+ u32 *hid, *nid;
- hid=h;
- nid=n;
+ hid = h;
+ nid = n;
- for(i=0;i<(len/sizeof(u32));i++)
+ for (i = 0; i < (len / sizeof(u32)); i++)
{
- *(hid+i)=ntohl(*(nid+i));
+ *(hid + i) = ntohl(*(nid + i));
}
break;
}
- case LSA_T_SUM_NET:
- case LSA_T_SUM_RT:
+ case LSA_T_SUM_NET:
+ case LSA_T_SUM_RT:
{
struct ospf_lsa_summ *hs, *ns;
struct ospf_lsa_summ_net *hn, *nn;
- hs=h;
- ns=n;
+ hs = h;
+ ns = n;
- hs->netmask=ns->netmask;
+ hs->netmask = ns->netmask;
ipa_ntoh(hs->netmask);
- hn=(struct ospf_lsa_summ_net *)(hs+1);
- nn=(struct ospf_lsa_summ_net *)(ns+1);
+ hn = (struct ospf_lsa_summ_net *) (hs + 1);
+ nn = (struct ospf_lsa_summ_net *) (ns + 1);
- for(i=0;i<((len-sizeof(struct ospf_lsa_summ))/
- sizeof(struct ospf_lsa_summ_net));i++)
+ for (i = 0; i < ((len - sizeof(struct ospf_lsa_summ)) /
+ sizeof(struct ospf_lsa_summ_net)); i++)
{
- (hn+i)->tos=(nn+i)->tos;
- (hn+i)->metric=ntohs((nn+i)->metric);
- (hn+i)->padding=0;
+ (hn + i)->tos = (nn + i)->tos;
+ (hn + i)->metric = ntohs((nn + i)->metric);
+ (hn + i)->padding = 0;
}
break;
}
- case LSA_T_EXT:
+ case LSA_T_EXT:
{
struct ospf_lsa_ext *he, *ne;
struct ospf_lsa_ext_tos *ht, *nt;
- he=h;
- ne=n;
+ he = h;
+ ne = n;
- he->netmask=ne->netmask;
+ he->netmask = ne->netmask;
ipa_ntoh(he->netmask);
- ht=(struct ospf_lsa_ext_tos *)(he+1);
- nt=(struct ospf_lsa_ext_tos *)(ne+1);
+ ht = (struct ospf_lsa_ext_tos *) (he + 1);
+ nt = (struct ospf_lsa_ext_tos *) (ne + 1);
- for(i=0;i<((len-sizeof(struct ospf_lsa_ext))/
- sizeof(struct ospf_lsa_ext_tos));i++)
+ for (i = 0; i < ((len - sizeof(struct ospf_lsa_ext)) /
+ sizeof(struct ospf_lsa_ext_tos)); i++)
{
- (ht+i)->etos=(nt+i)->etos;
- (ht+i)->padding=0;
- (ht+i)->metric=ntohs((nt+i)->metric);
- (ht+i)->fwaddr=(nt+i)->fwaddr;
- ipa_ntoh((ht+i)->fwaddr);
- (ht+i)->tag=ntohl((nt+i)->tag);
+ (ht + i)->etos = (nt + i)->etos;
+ (ht + i)->padding = 0;
+ (ht + i)->metric = ntohs((nt + i)->metric);
+ (ht + i)->fwaddr = (nt + i)->fwaddr;
+ ipa_ntoh((ht + i)->fwaddr);
+ (ht + i)->tag = ntohl((nt + i)->tag);
}
break;
}
- default: bug("(ntoh): Unknown LSA");
+ default:
+ bug("(ntoh): Unknown LSA");
}
};
@@ -314,19 +321,19 @@ ntohlsab(void *n, void *h, u8 type, u16 len)
/* FIXME This is VERY uneficient, I have huge endianity problems */
void
-lsasum_calculate(struct ospf_lsa_header *h,void *body,struct proto_ospf *po)
+lsasum_calculate(struct ospf_lsa_header *h, void *body, struct proto_ospf *po)
{
u16 length;
-
- length=h->length;
- htonlsah(h,h);
- htonlsab(body,body,h->type,length-sizeof(struct ospf_lsa_header));
+ length = h->length;
+
+ htonlsah(h, h);
+ htonlsab(body, body, h->type, length - sizeof(struct ospf_lsa_header));
- (void)lsasum_check(h,body,po);
-
- ntohlsah(h,h);
- ntohlsab(body,body,h->type,length-sizeof(struct ospf_lsa_header));
+ (void) lsasum_check(h, body, po);
+
+ ntohlsah(h, h);
+ ntohlsab(body, body, h->type, length - sizeof(struct ospf_lsa_header));
}
/*
@@ -334,7 +341,7 @@ lsasum_calculate(struct ospf_lsa_header *h,void *body,struct proto_ospf *po)
* It also returns value in big endian
*/
u16
-lsasum_check(struct ospf_lsa_header *h,void *body,struct proto_ospf *po)
+lsasum_check(struct ospf_lsa_header *h, void *body, struct proto_ospf *po)
{
u8 *sp, *ep, *p, *q, *b;
int c0 = 0, c1 = 0;
@@ -343,13 +350,14 @@ lsasum_check(struct ospf_lsa_header *h,void *body,struct proto_ospf *po)
b = body;
sp = (char *) &h->options;
- length = ntohs(h->length)-2;
+ length = ntohs(h->length) - 2;
h->checksum = 0;
for (ep = sp + length; sp < ep; sp = q)
- { /* Actually MODX is very large, do we need the for-cyclus? */
+ { /* Actually MODX is very large, do we need the for-cyclus? */
q = sp + MODX;
- if (q > ep) q = ep;
+ if (q > ep)
+ q = ep;
for (p = sp; p < q; p++)
{
/*
@@ -358,13 +366,13 @@ lsasum_check(struct ospf_lsa_header *h,void *body,struct proto_ospf *po)
* (probably checksum in update receiving) and I go on
* after header
*/
- if((b==NULL) || (p<(u8 *)(h+1)))
+ if ((b == NULL) || (p < (u8 *) (h + 1)))
{
- c0 += *p;
+ c0 += *p;
}
else
{
- c0 += *(b+(p-sp)-sizeof(struct ospf_lsa_header)+2);
+ c0 += *(b + (p - sp) - sizeof(struct ospf_lsa_header) + 2);
}
c1 += c0;
@@ -374,12 +382,14 @@ lsasum_check(struct ospf_lsa_header *h,void *body,struct proto_ospf *po)
}
x = ((length - LSA_CHECKSUM_OFFSET) * c0 - c1) % 255;
- if (x <= 0) x += 255;
+ if (x <= 0)
+ x += 255;
y = 510 - c0 - x;
- if (y > 255) y -= 255;
+ if (y > 255)
+ y -= 255;
- ((u8*)&h->checksum)[0] = x;
- ((u8*)&h->checksum)[1] = y;
+ ((u8 *) & h->checksum)[0] = x;
+ ((u8 *) & h->checksum)[1] = y;
return h->checksum;
}
@@ -387,22 +397,26 @@ int
lsa_comp(struct ospf_lsa_header *l1, struct ospf_lsa_header *l2)
/* Return codes from point of view of l1 */
{
- u32 sn1,sn2;
+ u32 sn1, sn2;
- sn1=l1->sn-LSA_INITSEQNO+1;
- sn2=l2->sn-LSA_INITSEQNO+1;
+ sn1 = l1->sn - LSA_INITSEQNO + 1;
+ sn2 = l2->sn - LSA_INITSEQNO + 1;
- if(sn1>sn2) return CMP_NEWER;
- if(sn1<sn2) return CMP_OLDER;
+ if (sn1 > sn2)
+ return CMP_NEWER;
+ if (sn1 < sn2)
+ return CMP_OLDER;
- if(l1->checksum!=l2->checksum)
- return l1->checksum<l2->checksum ? CMP_OLDER : CMP_NEWER;
+ if (l1->checksum != l2->checksum)
+ return l1->checksum < l2->checksum ? CMP_OLDER : CMP_NEWER;
- if((l1->age==LSA_MAXAGE)&&(l2->age!=LSA_MAXAGE)) return CMP_NEWER;
- if((l2->age==LSA_MAXAGE)&&(l1->age!=LSA_MAXAGE)) return CMP_OLDER;
+ if ((l1->age == LSA_MAXAGE) && (l2->age != LSA_MAXAGE))
+ return CMP_NEWER;
+ if ((l2->age == LSA_MAXAGE) && (l1->age != LSA_MAXAGE))
+ return CMP_OLDER;
- if(ABS(l1->age-l2->age)>LSA_MAXAGEDIFF)
- return l1->age<l2->age ? CMP_NEWER : CMP_OLDER;
+ if (ABS(l1->age - l2->age) > LSA_MAXAGEDIFF)
+ return l1->age < l2->age ? CMP_NEWER : CMP_OLDER;
return CMP_SAME;
}
@@ -421,27 +435,28 @@ struct top_hash_entry *
lsa_install_new(struct ospf_lsa_header *lsa, void *body, struct ospf_area *oa)
{
/* LSA can be temporarrily, but body must be mb_allocated. */
- int change=0;
+ int change = 0;
unsigned i;
struct top_hash_entry *en;
- if((en=ospf_hash_find_header(oa->gr,lsa))==NULL)
+ if ((en = ospf_hash_find_header(oa->gr, lsa)) == NULL)
{
- en=ospf_hash_get_header(oa->gr,lsa);
- change=1;
+ en = ospf_hash_get_header(oa->gr, lsa);
+ change = 1;
}
else
{
- if((en->lsa.length!=lsa->length)||(en->lsa.options!=lsa->options)||
- ((en->lsa.age==LSA_MAXAGE)||(lsa->age==LSA_MAXAGE))) change=1;
+ if ((en->lsa.length != lsa->length) || (en->lsa.options != lsa->options)
+ || ((en->lsa.age == LSA_MAXAGE) || (lsa->age == LSA_MAXAGE)))
+ change = 1;
else
{
- u8 *k=en->lsa_body,*l=body;
- for(i=0;i<(lsa->length-sizeof(struct ospf_lsa_header));i++)
+ u8 *k = en->lsa_body, *l = body;
+ for (i = 0; i < (lsa->length - sizeof(struct ospf_lsa_header)); i++)
{
- if(*(k+i)!=*(l+i))
+ if (*(k + i) != *(l + i))
{
- change=1;
+ change = 1;
break;
}
}
@@ -450,19 +465,20 @@ lsa_install_new(struct ospf_lsa_header *lsa, void *body, struct ospf_area *oa)
}
DBG("Inst lsa: Id: %I, Rt: %I, Type: %u, Age: %u, Sum: %u, Sn: 0x%x\n",
- lsa->id, lsa->rt, lsa->type, lsa->age, lsa->checksum, lsa->sn);
+ lsa->id, lsa->rt, lsa->type, lsa->age, lsa->checksum, lsa->sn);
s_add_tail(&oa->lsal, SNODE en);
- en->inst_t=now;
- if(en->lsa_body!=NULL) mb_free(en->lsa_body);
- en->lsa_body=body;
- memcpy(&en->lsa,lsa,sizeof(struct ospf_lsa_header));
- en->ini_age=en->lsa.age;
-
- if(change)
+ en->inst_t = now;
+ if (en->lsa_body != NULL)
+ mb_free(en->lsa_body);
+ en->lsa_body = body;
+ memcpy(&en->lsa, lsa, sizeof(struct ospf_lsa_header));
+ en->ini_age = en->lsa.age;
+
+ if (change)
{
schedule_rtcalc(oa);
}
-
+
return en;
}