diff options
Diffstat (limited to 'package/quagga/quagga-fix-opaque.patch')
-rw-r--r-- | package/quagga/quagga-fix-opaque.patch | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/package/quagga/quagga-fix-opaque.patch b/package/quagga/quagga-fix-opaque.patch new file mode 100644 index 000000000..17a970e16 --- /dev/null +++ b/package/quagga/quagga-fix-opaque.patch @@ -0,0 +1,127 @@ +From d71ea65270408a45e4bec036671ec73b24b994b4 Mon Sep 17 00:00:00 2001 +From: Paul Jakma <paul@quagga.net> +Date: Tue, 22 Mar 2011 15:23:55 +0000 +Subject: [PATCH 1/1] ospfd: Compile fix for opaque support + +* ospfd: Refresher logic cleanup broke OSPF opaque, which does its own thing + with regard to refresher logic and which also, in the protocol, requires + implementations to keep state of which OI an LSA is received on (rather + than providing information in the LSA to allow it to be looked up - as + other LSAs requiring such assocation were careful to do). +* ospf_lsa.h: (struct ospf_interface) Add back the pointer to oi, but only + for type-9 now. +* ospf_nsm.c: (ospf_db_summary_add) check the oi actually exists first - + doesn't obviate the need for opaque to ensure oi pointers get cleaned up + when ospf_interfaces disappear. +* ospf_opaque.{c,h}: (ospf_opaque_functab,ospf_opaque_lsa_refresh) Refresher + LSA functions now need to return the LSA to the general refresh logic, + to indicate whether the LSA was refreshed. +--- + ospfd/ospf_lsa.h | 3 +++ + ospfd/ospf_nsm.c | 2 +- + ospfd/ospf_opaque.c | 13 +++++++------ + ospfd/ospf_opaque.h | 4 ++-- + 4 files changed, 13 insertions(+), 9 deletions(-) + +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, +-- +1.7.4 + |