diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2012-01-23 01:26:40 +0100 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2012-01-23 01:26:40 +0100 |
commit | 732a0a257d180a95a02587203555b8552b6128ac (patch) | |
tree | 298d92b6fd7c7c59f4c58f60692ecdf592cd9ba3 /nest | |
parent | 5c78e0e386d4c770b646cab4a8adc3c87987f50f (diff) |
Fixes problems with creating/removing/renaming ifaces on BSD.
Diffstat (limited to 'nest')
-rw-r--r-- | nest/iface.c | 20 | ||||
-rw-r--r-- | nest/iface.h | 1 |
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); |