summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew J. Schorr <ajschorr@alumni.princeton.edu>2006-05-21 04:04:49 +0000
committerAndrew J. Schorr <ajschorr@alumni.princeton.edu>2006-05-21 04:04:49 +0000
commit9c37851eac4e75cda515761cae7c63309add30ea (patch)
tree3fcf98573c83f117f1e0219fcab8e160af70e56a
parent0f38dc4d4729b562551f8f53e7343f5a53b2dbf5 (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/ChangeLog5
-rw-r--r--lib/if.h6
-rw-r--r--zebra/ChangeLog8
-rw-r--r--zebra/connected.c17
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
diff --git a/lib/if.h b/lib/if.h
index 20df7ef1..0a4ff14d 100644
--- a/lib/if.h
+++ b/lib/if.h
@@ -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 */
}