Skip to content

Commit

Permalink
isisd: added l1 to l2 distibution
Browse files Browse the repository at this point in the history
added adding prefixes with the best metric from the level-1 db
to the level-2 db on l1_l2 end system

Signed-off-by: Sososhas <[email protected]>

checkout check

Signed-off-by: Sososhas <[email protected]>
  • Loading branch information
Sashhkaa committed Oct 23, 2023
1 parent 9e32b73 commit 79b41ad
Showing 1 changed file with 63 additions and 2 deletions.
65 changes: 63 additions & 2 deletions isisd/isis_lsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,9 @@ static void lsp_update_data(struct isis_lsp *lsp, struct isis_lsp_hdr *hdr,
: IS_LEVEL_1);
}

_lsp_regenerate_schedule(area, lsp->level, 0, false, __func__, __FILE__,
__LINE__);

return;
}

Expand Down Expand Up @@ -1314,6 +1317,65 @@ static void lsp_build(struct isis_lsp *lsp, struct isis_area *area)
metric);
}

struct isis_adjacency* adj;
bool flag = false;
for (ALL_LIST_ELEMENTS_RO(area->adjacency_list, node, adj)) {
if (adj->level == IS_LEVEL_2)
flag = true;
}

if(flag && (lsp->level == IS_LEVEL_2) && (area->is_type == 3) && (lsp->hdr.lsp_bits != LSPBIT_ATT)) {
struct isis_lsp* lsp_tmp_ip;
struct isis_lsp* lsp_tmp_ipv6;
struct lspdb_head *head_tmp_ip = &area->lspdb[0];
struct lspdb_head *head_tmp_ipv6 = &area->lspdb[0];
if(head_tmp_ip) {
frr_each (lspdb, head_tmp_ip, lsp_tmp_ip) {
if (strcmp(lsp->tlvs->hostname, lsp_tmp_ip->tlvs->hostname) != 0) {
for (struct isis_item *i = lsp_tmp_ip->tlvs->extended_ip_reach.head; i; i = i->next){
struct isis_extended_ip_reach *r = (struct isis_extended_ip_reach *)i;
int count = 0;
for (struct isis_item *l = lsp->tlvs->extended_ip_reach.head; l; l = l->next) {
struct isis_extended_ip_reach *rt = (struct isis_extended_ip_reach *)l;
if(r->prefix.prefix.s_addr == rt->prefix.prefix.s_addr) {
if(r->metric > rt->metric)
count++;
break;
}
}
if (count == 0)
lsp_build_internal_reach_ipv4(lsp, area, &r->prefix , r->metric);
}
}
}
}

if(head_tmp_ipv6) {
frr_each (lspdb, head_tmp_ipv6, lsp_tmp_ipv6) {
if (strcmp(lsp->tlvs->hostname, lsp_tmp_ipv6->tlvs->hostname) != 0) {
for (struct isis_item *i = lsp_tmp_ipv6->tlvs->ipv6_reach.head; i; i = i->next) {
struct isis_ipv6_reach *r = (struct isis_ipv6_reach *)i;
int count = 0;
for (struct isis_item *l = lsp->tlvs->ipv6_reach.head; l; l = l->next) {
struct isis_ipv6_reach *rt = (struct isis_ipv6_reach *)l;
char prefixbuf_1[PREFIX2STR_BUFFER];
char prefixbuf_2[PREFIX2STR_BUFFER];
if (strcmp(prefix2str(&r->prefix, prefixbuf_1, sizeof(prefixbuf_1)),
prefix2str(&rt->prefix, prefixbuf_2, sizeof(prefixbuf_2))) == 0) {
if (r->metric > rt->metric)
count++;
break;
}
}
if (count == 0)
lsp_build_internal_reach_ipv6(lsp, area, &r->prefix, r->metric);
}
}
}
}
}


switch (circuit->circ_type) {
case CIRCUIT_T_BROADCAST:
if (level & circuit->is_type) {
Expand Down Expand Up @@ -1354,7 +1416,7 @@ static void lsp_build(struct isis_lsp *lsp, struct isis_area *area)
lsp_debug(
"ISIS (%s): Adding old-style is reach for %pSY",
area->area_tag, ne_id);
isis_tlvs_add_oldstyle_reach(
isis_tlvs_add_oldstyle_reach(
lsp->tlvs, ne_id, metric);
}
if (area->newmetric) {
Expand All @@ -1364,7 +1426,6 @@ static void lsp_build(struct isis_lsp *lsp, struct isis_area *area)
} else {
neighbor_metric = metric;
}

tlvs_add_mt_p2p(lsp->tlvs, circuit,
ne_id, neighbor_metric);
}
Expand Down

0 comments on commit 79b41ad

Please sign in to comment.