diff --git a/ospfd/ospf_lsa.h b/ospfd/ospf_lsa.h index fee3470..72e2f8a 100644 --- a/ospfd/ospf_lsa.h +++ b/ospfd/ospf_lsa.h @@ -114,6 +114,9 @@ struct ospf_lsa /* Refreshement List or Queue */ int refresh_list; + + /* For Type-9 Opaque-LSAs */ + struct ospf_interface *oi; }; /* OSPF LSA Link Type. */ diff --git a/ospfd/ospf_nsm.c b/ospfd/ospf_nsm.c index 279d2a0..cbc3171 100644 --- a/ospfd/ospf_nsm.c +++ b/ospfd/ospf_nsm.c @@ -216,7 +216,7 @@ ospf_db_summary_add (struct ospf_neighbor *nbr, struct ospf_lsa *lsa) { case OSPF_OPAQUE_LINK_LSA: /* Exclude type-9 LSAs that does not have the same "oi" with "nbr". */ - if (lsa->oi != nbr->oi) + if (nbr->oi && ospf_if_exists (lsa->oi) != nbr->oi) return 0; break; case OSPF_OPAQUE_AREA_LSA: diff --git a/ospfd/ospf_opaque.c b/ospfd/ospf_opaque.c index 6e90011..aa126e1 100644 --- a/ospfd/ospf_opaque.c +++ b/ospfd/ospf_opaque.c @@ -251,7 +251,7 @@ struct ospf_opaque_functab void (* config_write_debug )(struct vty *vty); void (* show_opaque_info )(struct vty *vty, struct ospf_lsa *lsa); int (* lsa_originator)(void *arg); - void (* lsa_refresher )(struct ospf_lsa *lsa); + struct ospf_lsa *(* lsa_refresher )(struct ospf_lsa *lsa); int (* new_lsa_hook)(struct ospf_lsa *lsa); int (* del_lsa_hook)(struct ospf_lsa *lsa); }; @@ -354,7 +354,7 @@ ospf_register_opaque_functab ( void (* config_write_debug )(struct vty *vty), void (* show_opaque_info )(struct vty *vty, struct ospf_lsa *lsa), int (* lsa_originator)(void *arg), - void (* lsa_refresher )(struct ospf_lsa *lsa), + struct ospf_lsa *(* lsa_refresher )(struct ospf_lsa *lsa), int (* new_lsa_hook)(struct ospf_lsa *lsa), int (* del_lsa_hook)(struct ospf_lsa *lsa)) { @@ -1608,12 +1608,13 @@ out: return new; } -void +struct ospf_lsa * ospf_opaque_lsa_refresh (struct ospf_lsa *lsa) { struct ospf *ospf; struct ospf_opaque_functab *functab; - + struct ospf_lsa *new = NULL; + ospf = ospf_lookup (); if ((functab = ospf_opaque_functab_lookup (lsa)) == NULL @@ -1633,9 +1634,9 @@ ospf_opaque_lsa_refresh (struct ospf_lsa *lsa) ospf_lsa_flush (ospf, lsa); } else - (* functab->lsa_refresher)(lsa); + new = (* functab->lsa_refresher)(lsa); - return; + return new; } /*------------------------------------------------------------------------* diff --git a/ospfd/ospf_opaque.h b/ospfd/ospf_opaque.h index f49fe46..2273064 100644 --- a/ospfd/ospf_opaque.h +++ b/ospfd/ospf_opaque.h @@ -120,7 +120,7 @@ ospf_register_opaque_functab ( void (* config_write_debug )(struct vty *vty), void (* show_opaque_info )(struct vty *vty, struct ospf_lsa *lsa), int (* lsa_originator)(void *arg), - void (* lsa_refresher )(struct ospf_lsa *lsa), + struct ospf_lsa *(* lsa_refresher )(struct ospf_lsa *lsa), int (* new_lsa_hook)(struct ospf_lsa *lsa), int (* del_lsa_hook)(struct ospf_lsa *lsa) ); @@ -143,7 +143,7 @@ extern void ospf_opaque_lsa_originate_schedule (struct ospf_interface *oi, int *init_delay); extern struct ospf_lsa *ospf_opaque_lsa_install (struct ospf_lsa *, int rt_recalc); -extern void ospf_opaque_lsa_refresh (struct ospf_lsa *lsa); +extern struct ospf_lsa *ospf_opaque_lsa_refresh (struct ospf_lsa *lsa); extern void ospf_opaque_lsa_reoriginate_schedule (void *lsa_type_dependent, u_char lsa_type,