[quagga-dev 12848] Re: [PATCH] isisd: Attached-bit in LSP header

Nambiar, Amritha amritha.nambiar at intel.com
Fri Jul 3 02:59:05 BST 2015


Almost. I had tested the set/no set-overload-bit commands too using telnet and they seemed to fail to set the bit in LSP header. Set/reset overload-bit in isisd currently has a bug because a valid isis area is not returned. I have a patch that fixes this. 

Thanks,
Amritha

From: Donald Sharp [mailto:sharpd at cumulusnetworks.com] 
Sent: Thursday, July 2, 2015 6:14 PM
To: Nambiar, Amritha
Cc: quagga-dev at lists.quagga.net
Subject: Re: [quagga-dev 12845] [PATCH] isisd: Attached-bit in LSP header

Looks like you implemented this exactly the same as the overload bit.

Acked-by: Donald Sharp <sharpd at cumulusnetworks.com

On Thu, Jul 2, 2015 at 9:06 PM, Amritha Nambiar <amritha.nambiar at intel.com> 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 <amritha.nambiar at intel.com>
---
 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
Quagga-dev at lists.quagga.net
https://lists.quagga.net/mailman/listinfo/quagga-dev



More information about the Quagga-dev mailing list