return ((byte *) po->lsab) + po->lsab_used;
}
+static s32
+get_seqnum(struct top_hash_entry *en)
+{
+ if (!en)
+ return LSA_INITSEQNO;
+
+ if (en->lsa.sn == LSA_MAXSEQNO)
+ {
+ log(L_WARN, "OSPF: Premature origination of LSA (Type: %04x, Id: %R, Rt: %R)",
+ en->lsa.type, en->lsa.id, en->lsa.rt);
+ return LSA_INITSEQNO;
+ }
+
+ return en->lsa.sn++;
+}
+
static int
configured_stubnet(struct ospf_area *oa, struct ifa *a)
#endif
lsa.rt = po->router_id;
- lsa.sn = oa->rt ? (oa->rt->lsa.sn + 1) : LSA_INITSEQNO;
+ lsa.sn = get_seqnum(oa->rt);
u32 dom = oa->areaid;
body = originate_rt_lsa_body(oa, &lsa.length);
#endif
lsa.rt = po->router_id;
- lsa.sn = ifa->net_lsa ? (ifa->net_lsa->lsa.sn + 1) : LSA_INITSEQNO;
+ lsa.sn = get_seqnum(ifa->net_lsa);
body = originate_net_lsa_body(ifa, &lsa.length, po);
lsasum_calculate(&lsa, body);
lsa.type = LSA_T_SUM_NET;
lsa.id = fibnode_to_lsaid(po, fn);
lsa.rt = po->router_id;
- lsa.sn = LSA_INITSEQNO;
if ((en = ospf_hash_find_header(po->gr, dom, &lsa)) != NULL)
{
if (check_sum_net_lsa_same(en, metric))
return;
-
- lsa.sn = en->lsa.sn + 1;
}
+ lsa.sn = get_seqnum(en);
body = originate_sum_net_lsa_body(po, &lsa.length, fn, metric);
lsasum_calculate(&lsa, body);
/* In OSPFv3, LSA ID is meaningless, but we still use Router ID of ASBR */
lsa.id = rid;
lsa.rt = po->router_id;
- lsa.sn = LSA_INITSEQNO;
options &= OPTIONS_MASK;
-
if ((en = ospf_hash_find_header(po->gr, dom, &lsa)) != NULL)
{
if (check_sum_rt_lsa_same(en, lsa.id, metric, options))
return;
-
- lsa.sn = en->lsa.sn + 1;
}
+ lsa.sn = get_seqnum(en);
body = originate_sum_rt_lsa_body(po, &lsa.length, lsa.id, metric, options);
lsasum_calculate(&lsa, body);
lsa.type = LSA_T_EXT;
lsa.id = fibnode_to_lsaid(po, fn);
lsa.rt = po->router_id;
- lsa.sn = LSA_INITSEQNO;
/* Compute LSA content */
u32 m1 = ea_get_int(attrs, EA_OSPF_METRIC1, LSINFINITY);
if (rv > 0)
return;
-
- lsa.sn = en->lsa.sn + 1;
}
+ lsa.sn = get_seqnum(en);
body = originate_ext_lsa_body(po, &lsa.length, n, metric, gw, tag);
lsasum_calculate(&lsa, body);
lsa.type = LSA_T_LINK;
lsa.id = ifa->iface->index;
lsa.rt = po->router_id;
- lsa.sn = ifa->link_lsa ? (ifa->link_lsa->lsa.sn + 1) : LSA_INITSEQNO;
+ lsa.sn = get_seqnum(ifa->link_lsa);
u32 dom = ifa->iface->index;
body = originate_link_lsa_body(ifa, &lsa.length);
lsa.type = LSA_T_PREFIX;
lsa.id = 0;
lsa.rt = po->router_id;
- lsa.sn = oa->pxr_lsa ? (oa->pxr_lsa->lsa.sn + 1) : LSA_INITSEQNO;
+ lsa.sn = get_seqnum(oa->pxr_lsa);
u32 dom = oa->areaid;
body = originate_prefix_rt_lsa_body(oa, &lsa.length);
lsa.type = LSA_T_PREFIX;
lsa.id = ifa->iface->index;
lsa.rt = po->router_id;
- lsa.sn = ifa->pxn_lsa ? (ifa->pxn_lsa->lsa.sn + 1) : LSA_INITSEQNO;
+ lsa.sn = get_seqnum(ifa->pxn_lsa);
u32 dom = ifa->oa->areaid;
body = originate_prefix_net_lsa_body(ifa, &lsa.length);