]> git.puffer.fish Git - mirror/frr.git/commitdiff
* isis_lsp.c (lsp_update): Remove LSP from database before updating
authorhasso <hasso>
Fri, 16 Sep 2005 14:44:23 +0000 (14:44 +0000)
committerhasso <hasso>
Fri, 16 Sep 2005 14:44:23 +0000 (14:44 +0000)
  its data and put it back after. Database entry MUST contain at least
  correct pointers to the sysid to get correct compare results.
* isis_lsp.[ch], isis_pdu.c: Pass level to the lsp_update() function.

isisd/ChangeLog
isisd/isis_lsp.c
isisd/isis_lsp.h
isisd/isis_pdu.c

index 822d856b16a17fdaccca21ff0435755e46a2deb4..6a2be9401012f084af7117517f63be975c525f6a 100644 (file)
@@ -1,3 +1,10 @@
+2005-09-16 Hasso Tepper <hasso at quagga.net>
+
+       * isis_lsp.c (lsp_update): Remove LSP from database before updating
+         its data and put it back after. Database entry MUST contain at least
+         correct pointers to the sysid to get correct compare results.
+       * isis_lsp.[ch], isis_pdu.c: Pass level to the lsp_update() function.
+
 2005-09-05 Hasso Tepper <hasso at quagga.net>
 
        * *.c: Try to be less verbose by default (without any debug options
index 2a9d1465775a72b91a5001b32ef139002035ef4c..d147c650bad26e1e5ccf8383fb5856eea1e06b98 100644 (file)
@@ -416,8 +416,14 @@ lsp_update_data (struct isis_lsp *lsp, struct stream *stream,
 
 void
 lsp_update (struct isis_lsp *lsp, struct isis_link_state_hdr *lsp_hdr,
-           struct stream *stream, struct isis_area *area)
+           struct stream *stream, struct isis_area *area, int level)
 {
+  dnode_t *dnode;
+
+  /* Remove old LSP from LSP database. */
+  dnode = dict_lookup (area->lspdb[level], lsp->lsp_header->lsp_id);
+  dnode_destroy (dict_delete (area->lspdb[level], dnode));
+
   /* free the old lsp data */
   XFREE (MTYPE_STREAM_DATA, lsp->pdu);
   lsp_clear_data (lsp);
@@ -427,6 +433,9 @@ lsp_update (struct isis_lsp *lsp, struct isis_link_state_hdr *lsp_hdr,
 
   /* set the new values for lsp header */
   memcpy (lsp->lsp_header, lsp_hdr, ISIS_LSP_HDR_LEN);
+
+  /* Put LSP back into LSP database, now with updated data. */
+  lsp_insert (lsp, area->lspdb[level]);
 }
 
 /* creation of LSP directly from what we received */
index 8e45066850b2147545a5d384b6716036764707ba..fb6f1d8265d571657e8e39ed7d020ca79c7fe6da 100644 (file)
@@ -114,7 +114,7 @@ int lsp_id_cmp (u_char * id1, u_char * id2);
 int lsp_compare (char *areatag, struct isis_lsp *lsp, u_int32_t seq_num,
                 u_int16_t checksum, u_int16_t rem_lifetime);
 void lsp_update (struct isis_lsp *lsp, struct isis_link_state_hdr *lsp_hdr,
-                struct stream *stream, struct isis_area *area);
+                struct stream *stream, struct isis_area *area, int level);
 void lsp_inc_seqnum (struct isis_lsp *lsp, u_int32_t seq_num);
 int lsp_print_all (struct vty *vty, dict_t * lspdb, char detail,
                   char dynhost);
index b15d4551cd9900529543df57f95dfe044933956b..87f37901d44915e3427002c5c0e175a6eccd7346 100644 (file)
@@ -1085,7 +1085,8 @@ dontcheckadj:
              /* 7.3.16.4 b) 1)  */
              if (comp == LSP_NEWER)
                {
-                 lsp_update (lsp, hdr, circuit->rcv_stream, circuit->area);
+                 lsp_update (lsp, hdr, circuit->rcv_stream, circuit->area,
+                             level);
                  /* ii */
                  ISIS_FLAGS_SET_ALL (lsp->SRMflags);
                  /* iii */
@@ -1239,7 +1240,7 @@ dontcheckadj:
       else if (comp == LSP_EQUAL)
        {
          ISIS_CLEAR_FLAG (lsp->SRMflags, circuit);
-         lsp_update (lsp, hdr, circuit->rcv_stream, circuit->area);
+         lsp_update (lsp, hdr, circuit->rcv_stream, circuit->area, level);
          if (circuit->circ_type != CIRCUIT_T_BROADCAST)
            {
              ISIS_SET_FLAG (lsp->SSNflags, circuit);