From b5aeb4410ae3722a5f331850acbc84c39e3fcd9f Mon Sep 17 00:00:00 2001 From: Paul Jakma Date: Wed, 30 Aug 2006 18:47:37 +0000 Subject: [ospfd] Fix assertion in DB-exchange fix, hit by ogier-db-ex-opt commit 2006-08-28 Andy Gay * ospf_packet.c: (ospf_make_db_desc) Assert added with More-bit fixes does not hold up with addition of Ogier DB-Exchange optimisation, which can empty the db-summary list in between sent DD packets. Remove assert, update More-bit always when in Exchange. --- ospfd/ChangeLog | 8 ++++++++ ospfd/ospf_packet.c | 34 +++++++++++++--------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog index 0015ee6d..4da013a8 100644 --- a/ospfd/ChangeLog +++ b/ospfd/ChangeLog @@ -1,3 +1,11 @@ +2006-08-28 Andy Gay + + * ospf_packet.c: (ospf_make_db_desc) Assert added with More-bit + fixes does not hold up with addition of Ogier DB-Exchange + optimisation, which can empty the db-summary list in between + sent DD packets. Remove assert, update More-bit always when + in Exchange. + 2006-08-27 J.J. Krabbendam * ospfd.c: (ospf_finish_final) default redistribute should be diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c index d7a35645..91527395 100644 --- a/ospfd/ospf_packet.c +++ b/ospfd/ospf_packet.c @@ -2712,25 +2712,9 @@ ospf_make_db_desc (struct ospf_interface *oi, struct ospf_neighbor *nbr, /* Set DD Sequence Number. */ stream_putl (s, nbr->dd_seqnum); + /* shortcut unneeded walk of (empty) summary LSDBs */ if (ospf_db_summary_isempty (nbr)) - { - /* Sanity check: - * - * Must be here either: - * - Initial DBD (ospf_nsm.c) - * - M must be set - * or - * - finishing Exchange, and DB-Summary list empty - * - from ospf_db_desc_proc() - * - M must not be set - */ - if (nbr->state >= NSM_Exchange) - assert (!IS_SET_DD_M(nbr->dd_flags)); - else - assert (IS_SET_DD_M(nbr->dd_flags)); - - return length; - } + goto empty; /* Describe LSA Header from Database Summary List. */ lsdb = &nbr->db_sum; @@ -2785,9 +2769,17 @@ ospf_make_db_desc (struct ospf_interface *oi, struct ospf_neighbor *nbr, /* Update 'More' bit */ if (ospf_db_summary_isempty (nbr)) { - UNSET_FLAG (nbr->dd_flags, OSPF_DD_FLAG_M); - /* Rewrite DD flags */ - stream_putc_at (s, pp, nbr->dd_flags); +empty: + if (nbr->state >= NSM_Exchange) + { + UNSET_FLAG (nbr->dd_flags, OSPF_DD_FLAG_M); + /* Rewrite DD flags */ + stream_putc_at (s, pp, nbr->dd_flags); + } + else + { + assert (IS_SET_DD_M(nbr->dd_flags)); + } } return length; } -- cgit v1.2.1