isis_spf_schedule(lsp->area, lsp->level);
}
-static void lsp_purge(struct isis_lsp *lsp, int level)
+static void lsp_purge_add_poi(struct isis_lsp *lsp,
+ const uint8_t *sender)
+{
+ if (!lsp->area->purge_originator)
+ return;
+
+ /* add purge originator identification */
+ if (!lsp->tlvs)
+ lsp->tlvs = isis_alloc_tlvs();
+ isis_tlvs_set_purge_originator(lsp->tlvs, isis->sysid, sender);
+ isis_tlvs_set_dynamic_hostname(lsp->tlvs, cmd_hostname_get());
+}
+
+static void lsp_purge(struct isis_lsp *lsp, int level,
+ const uint8_t *sender)
{
/* reset stream */
lsp_clear_data(lsp);
lsp->level = level;
lsp->age_out = lsp->area->max_lsp_lifetime[level - 1];
+ lsp_purge_add_poi(lsp, sender);
+
lsp_pack_pdu(lsp);
lsp_flood(lsp, NULL);
}
if (lsp->tlvs)
lsp_inc_seqno(lsp, 0);
else
- lsp_purge(lsp, lsp0->level);
+ lsp_purge(lsp, lsp0->level, NULL);
}
return;
lsp->tlvs = tlvs;
- if (area->dynhostname && lsp->tlvs->hostname) {
+ if (area->dynhostname && lsp->tlvs->hostname
+ && lsp->hdr.rem_lifetime) {
isis_dynhn_insert(lsp->hdr.lsp_id, lsp->tlvs->hostname,
(lsp->hdr.lsp_bits & LSPBIT_IST)
== IS_LEVEL_1_AND_2
lsp->own_lsp = 0;
}
- lsp_update_data(lsp, hdr, tlvs, stream, area, level);
if (confusion) {
- lsp->hdr.rem_lifetime = hdr->rem_lifetime = 0;
- put_lsp_hdr(lsp, NULL, true);
+ lsp_purge(lsp, level, NULL);
+ } else {
+ lsp_update_data(lsp, hdr, tlvs, stream, area, level);
}
if (LSP_FRAGMENT(lsp->hdr.lsp_id) && !lsp->lspu.zero_lsp) {
*/
if (rem_lifetime == 1 && lsp->hdr.seqno != 0) {
/* 7.3.16.4 a) set SRM flags on all */
- lsp_flood(lsp, NULL);
- /* 7.3.16.4 b) retain only the header
- * FIXME */
+ /* 7.3.16.4 b) retain only the header */
+ if (lsp->area->purge_originator)
+ lsp_purge(lsp, lsp->level, NULL);
+ else
+ lsp_flood(lsp, NULL);
/* 7.3.16.4 c) record the time to purge
* FIXME */
- /* run/schedule spf */
- /* isis_spf_schedule is called inside
- * lsp_destroy() below;
- * so it is not needed here. */
- /* isis_spf_schedule (lsp->area,
- * lsp->level); */
+ isis_spf_schedule(lsp->area, lsp->level);
}
if (lsp->age_out == 0) {
if (!lsp)
return;
- lsp_purge(lsp, level);
+ lsp_purge(lsp, level, NULL);
}
/*
memcpy(&lsp->hdr, hdr, sizeof(lsp->hdr));
lsp->hdr.rem_lifetime = 0;
+ lsp_purge_add_poi(lsp, NULL);
+
lsp_pack_pdu(lsp);
lsp_insert(lsp, area->lspdb[lsp->level - 1]);