diff options
author | Andrew J. Schorr <ajschorr@alumni.princeton.edu> | 2006-05-21 04:04:49 +0000 |
---|---|---|
committer | Andrew J. Schorr <ajschorr@alumni.princeton.edu> | 2006-05-21 04:04:49 +0000 |
commit | 9c37851eac4e75cda515761cae7c63309add30ea (patch) | |
tree | 3fcf98573c83f117f1e0219fcab8e160af70e56a | |
parent | 0f38dc4d4729b562551f8f53e7343f5a53b2dbf5 (diff) |
[interface configuration] Try to avoid losing address info after shutdown.
2006-05-21 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* if.h: (struct connected) Document the meaning of the
ZEBRA_IFC_REAL and ZEBRA_IFC_CONFIGURED flags.
* connected.c: (connected_withdraw) Do not delete the connected
address if the ZEBRA_IFC_CONFIGURED flag is set.
(connected_add_ipv4,connected_add_ipv6) Before calling
connected_withdraw, unset the ZEBRA_IFC_CONFIGURED flag
on the superseded connected structure.
-rw-r--r-- | lib/ChangeLog | 5 | ||||
-rw-r--r-- | lib/if.h | 6 | ||||
-rw-r--r-- | zebra/ChangeLog | 8 | ||||
-rw-r--r-- | zebra/connected.c | 17 |
4 files changed, 32 insertions, 4 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog index b54b7453..db3c546c 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,8 @@ +2006-05-21 Andrew J. Schorr <ajschorr@alumni.princeton.edu> + + * if.h: (struct connected) Document the meaning of the + ZEBRA_IFC_REAL and ZEBRA_IFC_CONFIGURED flags. + 2006-05-15 Paul Jakma <paul.jakma@sun.com> * log.c: (general) Generalise struct zebra_route_desc into @@ -145,6 +145,12 @@ struct connected u_char conf; #define ZEBRA_IFC_REAL (1 << 0) #define ZEBRA_IFC_CONFIGURED (1 << 1) + /* + The ZEBRA_IFC_REAL flag should be set if and only if this address + exists in the kernel. + The ZEBRA_IFC_CONFIGURED flag should be set if and only if this address + was configured by the user from inside quagga. + */ /* Flags for connected address. */ u_char flags; diff --git a/zebra/ChangeLog b/zebra/ChangeLog index 3ad0e83f..e70efaee 100644 --- a/zebra/ChangeLog +++ b/zebra/ChangeLog @@ -1,3 +1,11 @@ +2006-05-21 Andrew J. Schorr <ajschorr@alumni.princeton.edu> + + * connected.c: (connected_withdraw) Do not delete the connected + address if the ZEBRA_IFC_CONFIGURED flag is set. + (connected_add_ipv4,connected_add_ipv6) Before calling + connected_withdraw, unset the ZEBRA_IFC_CONFIGURED flag + on the superseded connected structure. + 2006-05-19 Andrew J. Schorr <ajschorr@alumni.princeton.edu> * connected.c: (connected_add_ipv4,connected_add_ipv6) If the diff --git a/zebra/connected.c b/zebra/connected.c index 39f47805..37aa456a 100644 --- a/zebra/connected.c +++ b/zebra/connected.c @@ -60,8 +60,11 @@ connected_withdraw (struct connected *ifc) UNSET_FLAG (ifc->conf, ZEBRA_IFC_REAL); } - listnode_delete (ifc->ifp->connected, ifc); - connected_free (ifc); + if (!CHECK_FLAG (ifc->conf, ZEBRA_IFC_CONFIGURED)) + { + listnode_delete (ifc->ifp->connected, ifc); + connected_free (ifc); + } } static void @@ -227,7 +230,10 @@ connected_add_ipv4 (struct interface *ifp, int flags, struct in_addr *addr, if ((current = connected_check (ifp, (struct prefix *) ifc->address))) { if (CHECK_FLAG(current->conf, ZEBRA_IFC_CONFIGURED)) - SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED); + { + SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED); + UNSET_FLAG(current->conf, ZEBRA_IFC_CONFIGURED); + } connected_withdraw (current); /* implicit withdraw - freebsd does this */ } @@ -370,7 +376,10 @@ connected_add_ipv6 (struct interface *ifp, struct in6_addr *addr, if ((current = connected_check (ifp, (struct prefix *) ifc->address))) { if (CHECK_FLAG(current->conf, ZEBRA_IFC_CONFIGURED)) - SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED); + { + SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED); + UNSET_FLAG(current->conf, ZEBRA_IFC_CONFIGURED); + } connected_withdraw (current); /* implicit update of existing address */ } |