Looks like you implemented this exactly the same as the overload bit. Acked-by: Donald Sharp <[email protected]
On Thu, Jul 2, 2015 at 9:06 PM, Amritha Nambiar <[email protected]> wrote: > Set/reset attached-bit in LSP header: > This patch provides support for set/reset attached_bit in the LSP > header. > In IS-IS networks, routing inter-area traffic from L1 areas is > accomplished by sending the traffic to the nearest L1/L2 router. > A L1/L2 router identifies itself by setting an attach-bit (ATT-bit) in > its (LSP). > > The ATT-bit in LSP can be changed using the set-attached-bit or > no-set-attached-bit commands (similar to ‘set-overload-bit’ and > 'no set-overload-bit’) using telnet terminal in router configuration > mode. > > Steps: > enable > configure terminal > router isis isis > set-overload-bit > > Signed-off-by: Amritha Nambiar <[email protected]> > --- > isisd/isis_lsp.c | 33 ++++++++++++++++++++++----------- > isisd/isisd.c | 38 ++++++++++++++++++++++++++++++++++++++ > isisd/isisd.h | 2 ++ > 3 files changed, 62 insertions(+), 11 deletions(-) > > diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c > index 88593de..0b1dac1 100644 > --- a/isisd/isis_lsp.c > +++ b/isisd/isis_lsp.c > @@ -442,7 +442,7 @@ lsp_seqnum_update (struct isis_lsp *lsp0) > } > > static u_int8_t > -lsp_bits_generate (int level, int overload_bit) > +lsp_bits_generate (int level, int overload_bit, int attached_bit) > { > u_int8_t lsp_bits = 0; > if (level == IS_LEVEL_1) > @@ -451,6 +451,8 @@ lsp_bits_generate (int level, int overload_bit) > lsp_bits = IS_LEVEL_1_AND_2; > if (overload_bit) > lsp_bits |= overload_bit; > + if (attached_bit) > + lsp_bits |= attached_bit; > return lsp_bits; > } > > @@ -1135,7 +1137,8 @@ lsp_next_frag (u_char frag_num, struct isis_lsp > *lsp0, struct isis_area *area, > return lsp; > } > lsp = lsp_new (frag_id, ntohs(lsp0->lsp_header->rem_lifetime), 0, > - lsp_bits_generate (level, area->overload_bit), 0, level); > + lsp_bits_generate (level, area->overload_bit, > + area->attached_bit), 0, level); > lsp->area = area; > lsp->own_lsp = 1; > lsp_insert (lsp, area->lspdb[level - 1]); > @@ -1589,7 +1592,8 @@ lsp_generate (struct isis_area *area, int level) > } > rem_lifetime = lsp_rem_lifetime (area, level); > newlsp = lsp_new (lspid, rem_lifetime, seq_num, > - area->is_type | area->overload_bit, 0, level); > + area->is_type | area->overload_bit | > area->attached_bit, > + 0, level); > newlsp->area = area; > newlsp->own_lsp = 1; > > @@ -1656,7 +1660,8 @@ lsp_regenerate (struct isis_area *area, int level) > > lsp_clear_data (lsp); > lsp_build (lsp, area); > - lsp->lsp_header->lsp_bits = lsp_bits_generate (level, > area->overload_bit); > + lsp->lsp_header->lsp_bits = lsp_bits_generate (level, > area->overload_bit, > + area->attached_bit); > rem_lifetime = lsp_rem_lifetime (area, level); > lsp->lsp_header->rem_lifetime = htons (rem_lifetime); > lsp_seqnum_update (lsp); > @@ -1666,7 +1671,8 @@ lsp_regenerate (struct isis_area *area, int level) > for (ALL_LIST_ELEMENTS_RO (lsp->lspu.frags, node, frag)) > { > frag->lsp_header->lsp_bits = lsp_bits_generate (level, > - area->overload_bit); > + area->overload_bit, > + area->attached_bit); > /* Set the lifetime values of all the fragments to the same value, > * so that no fragment expires before the lsp is refreshed. > */ > @@ -1816,7 +1822,8 @@ lsp_build_pseudo (struct isis_lsp *lsp, struct > isis_circuit *circuit, > > lsp->level = level; > /* RFC3787 section 4 SHOULD not set overload bit in pseudo LSPs */ > - lsp->lsp_header->lsp_bits = lsp_bits_generate (level, 0); > + lsp->lsp_header->lsp_bits = lsp_bits_generate (level, 0, > + > circuit->area->attached_bit); > > /* > * add self to IS neighbours > @@ -1946,7 +1953,9 @@ lsp_generate_pseudo (struct isis_circuit *circuit, > int level) > > rem_lifetime = lsp_rem_lifetime (circuit->area, level); > /* RFC3787 section 4 SHOULD not set overload bit in pseudo LSPs */ > - lsp = lsp_new (lsp_id, rem_lifetime, 1, circuit->area->is_type, 0, > level); > + lsp = lsp_new (lsp_id, rem_lifetime, 1, > + circuit->area->is_type | circuit->area->attached_bit, > + 0, level); > lsp->area = circuit->area; > > lsp_build_pseudo (lsp, circuit, level); > @@ -2012,7 +2021,8 @@ lsp_regenerate_pseudo (struct isis_circuit *circuit, > int level) > lsp_build_pseudo (lsp, circuit, level); > > /* RFC3787 section 4 SHOULD not set overload bit in pseudo LSPs */ > - lsp->lsp_header->lsp_bits = lsp_bits_generate (level, 0); > + lsp->lsp_header->lsp_bits = lsp_bits_generate (level, 0, > + > circuit->area->attached_bit); > rem_lifetime = lsp_rem_lifetime (circuit->area, level); > lsp->lsp_header->rem_lifetime = htons (rem_lifetime); > lsp_inc_seqnum (lsp, 0); > @@ -2416,7 +2426,8 @@ top_lsp_refresh (struct thread *thread) > IS_LEVEL_1); > > lsp->lsp_header->lsp_bits = lsp_bits_generate (lsp->level, > - lsp->area->overload_bit); > + lsp->area->overload_bit, > + lsp->area->attached_bit); > rem_lifetime = lsp_rem_lifetime (lsp->area, IS_LEVEL_1); > lsp->lsp_header->rem_lifetime = htons (rem_lifetime); > > @@ -2455,8 +2466,8 @@ generate_topology_lsps (struct isis_area *area) > lspid[ISIS_SYS_ID_LEN - 2] = ((i >> 8) & 0xFF); > > rem_lifetime = lsp_rem_lifetime (area, IS_LEVEL_1); > - lsp = lsp_new (lspid, rem_lifetime, 1, IS_LEVEL_1 | > area->overload_bit, > - 0, 1); > + lsp = lsp_new (lspid, rem_lifetime, 1, IS_LEVEL_1 | > area->overload_bit > + | area->attached_bit, 0, 1); > if (!lsp) > return; > lsp->area = area; > diff --git a/isisd/isisd.c b/isisd/isisd.c > index 898dfd2..9c9b918 100644 > --- a/isisd/isisd.c > +++ b/isisd/isisd.c > @@ -2170,6 +2170,41 @@ DEFUN (no_set_overload_bit, > return CMD_SUCCESS; > } > > +DEFUN (set_attached_bit, > + set_attached_bit_cmd, > + "set-attached-bit", > + "Set attached bit to identify as L1/L2 router for inter-area > traffic\n" > + "Set attached bit\n") > +{ > + struct isis_area *area; > + struct listnode *anode; > + > + for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area)) > + { > + area->attached_bit = LSPBIT_ATT; > + lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1); > + } > + > + return CMD_SUCCESS; > +} > + > +DEFUN (no_set_attached_bit, > + no_set_attached_bit_cmd, > + "no set-attached-bit", > + "Reset attached bit\n") > +{ > + struct isis_area *area; > + struct listnode *anode; > + > + for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area)) > + { > + area->attached_bit = 0; > + lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1); > + } > + > + return CMD_SUCCESS; > +} > + > DEFUN (dynamic_hostname, > dynamic_hostname_cmd, > "hostname dynamic", > @@ -3245,6 +3280,9 @@ isis_init () > install_element (ISIS_NODE, &set_overload_bit_cmd); > install_element (ISIS_NODE, &no_set_overload_bit_cmd); > > + install_element (ISIS_NODE, &set_attached_bit_cmd); > + install_element (ISIS_NODE, &no_set_attached_bit_cmd); > + > install_element (ISIS_NODE, &dynamic_hostname_cmd); > install_element (ISIS_NODE, &no_dynamic_hostname_cmd); > > diff --git a/isisd/isisd.h b/isisd/isisd.h > index 5db485f..838a08b 100644 > --- a/isisd/isisd.h > +++ b/isisd/isisd.h > @@ -116,6 +116,8 @@ struct isis_area > char is_type; /* level-1 level-1-2 or > level-2-only */ > /* are we overloaded? */ > char overload_bit; > + /* L1/L2 router identifier for inter-area traffic */ > + char attached_bit; > u_int16_t lsp_refresh[ISIS_LEVELS]; > /* minimum time allowed before lsp retransmission */ > u_int16_t lsp_gen_interval[ISIS_LEVELS]; > > > _______________________________________________ > Quagga-dev mailing list > [email protected] > https://lists.quagga.net/mailman/listinfo/quagga-dev >
_______________________________________________ Quagga-dev mailing list [email protected] https://lists.quagga.net/mailman/listinfo/quagga-dev
