summaryrefslogtreecommitdiff
path: root/nest
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2012-01-23 01:26:40 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2012-01-23 01:26:40 +0100
commit732a0a257d180a95a02587203555b8552b6128ac (patch)
tree298d92b6fd7c7c59f4c58f60692ecdf592cd9ba3 /nest
parent5c78e0e386d4c770b646cab4a8adc3c87987f50f (diff)
Fixes problems with creating/removing/renaming ifaces on BSD.
Diffstat (limited to 'nest')
-rw-r--r--nest/iface.c20
-rw-r--r--nest/iface.h1
2 files changed, 20 insertions, 1 deletions
diff --git a/nest/iface.c b/nest/iface.c
index 2b14d3f0..d871ff33 100644
--- a/nest/iface.c
+++ b/nest/iface.c
@@ -253,6 +253,24 @@ if_change_flags(struct iface *i, unsigned flags)
}
/**
+ * if_delete - remove interface
+ * @old: interface
+ *
+ * This function is called by the low-level platform dependent code
+ * whenever it notices an interface disappears. It is just a shorthand
+ * for if_update().
+ */
+
+void
+if_delete(struct iface *old)
+{
+ struct iface f = {};
+ strncpy(f.name, old->name, sizeof(f.name)-1);
+ f.flags = IF_SHUTDOWN;
+ if_update(&f);
+}
+
+/**
* if_update - update interface status
* @new: new interface status
*
@@ -400,7 +418,7 @@ if_find_by_index(unsigned idx)
struct iface *i;
WALK_LIST(i, iface_list)
- if (i->index == idx)
+ if (i->index == idx && !(i->flags & IF_SHUTDOWN))
return i;
return NULL;
}
diff --git a/nest/iface.h b/nest/iface.h
index d6d58ff9..2416f82f 100644
--- a/nest/iface.h
+++ b/nest/iface.h
@@ -88,6 +88,7 @@ void ifa_dump(struct ifa *);
void if_show(void);
void if_show_summary(void);
struct iface *if_update(struct iface *);
+void if_delete(struct iface *old);
struct ifa *ifa_update(struct ifa *);
void ifa_delete(struct ifa *);
void if_start_update(void);