I guess we need an if-notifier-windows.c also.
On Mon, Jul 27, 2015 at 03:55:52PM -0700, Gurucharan Shetty wrote: > I wonder what happens for Windows here. > > On Mon, Jul 27, 2015 at 3:51 PM, Ben Pfaff <b...@nicira.com> wrote: > > On Mon, Jul 27, 2015 at 02:24:20PM -0300, Thadeu Lima de Souza Cascardo > > wrote: > >> Whenever system interfaces are removed, added or change state, reconfigure > >> bridge. This allows late interfaces to be added to the datapath when they > >> are > >> added to the system after ovs-vswitchd is started. > >> > >> Signed-off-by: Thadeu Lima de Souza Cascardo <casca...@redhat.com> > > > > I'd always envisioned this kind of feature as needing to keep track of > > the interfaces that OVS tried to configure but were missing and only > > reconfiguring if one of those showed up. The approach in this commit is > > simpler. I like that as a first step. Then, we can optimize it later, > > only if optimization turns out to be necessary, > > > > Here are some style fixes to fold in for v2. > > > > diff --git a/lib/if-notifier-bsd.c b/lib/if-notifier-bsd.c > > index 06874b0..aa750aa 100644 > > --- a/lib/if-notifier-bsd.c > > +++ b/lib/if-notifier-bsd.c > > @@ -25,7 +25,8 @@ struct if_notifier { > > void *aux; > > }; > > > > -static void if_notifier_cb(const struct rtbsd_change *change, void *aux) > > +static void > > +if_notifier_cb(const struct rtbsd_change *change, void *aux) > > { > > struct if_notifier *notifier; > > notifier = aux; > > @@ -49,7 +50,8 @@ if_notifier_create(if_notify_func *cb, void *aux) > > return notifier; > > } > > > > -void if_notifier_destroy(struct if_notifier *notifier) > > +void > > +if_notifier_destroy(struct if_notifier *notifier) > > { > > if (notifier) { > > rtbsd_notifier_unregister(¬ifier->notifier); > > @@ -57,12 +59,14 @@ void if_notifier_destroy(struct if_notifier *notifier) > > } > > } > > > > -void if_notifier_run(void) > > +void > > +if_notifier_run(void) > > { > > rtbsd_notifier_run(); > > } > > > > -void if_notifier_wait(void) > > +void > > +if_notifier_wait(void) > > { > > rtbsd_notifier_wait(); > > } > > diff --git a/lib/if-notifier.h b/lib/if-notifier.h > > index 9610d2d..fc1330b 100644 > > --- a/lib/if-notifier.h > > +++ b/lib/if-notifier.h > > @@ -19,11 +19,9 @@ > > > > struct if_notifier; > > > > -typedef > > -void if_notify_func(void *aux); > > +typedef void if_notify_func(void *aux); > > > > -struct if_notifier * > > -if_notifier_create(if_notify_func *, void *aux); > > +struct if_notifier *if_notifier_create(if_notify_func *, void *aux); > > void if_notifier_destroy(struct if_notifier *); > > > > void if_notifier_run(void); > > > > > >> --- > >> lib/automake.mk | 3 +++ > >> lib/if-notifier-bsd.c | 68 > >> +++++++++++++++++++++++++++++++++++++++++++++++++++ > >> lib/if-notifier.c | 64 > >> ++++++++++++++++++++++++++++++++++++++++++++++++ > >> lib/if-notifier.h | 32 ++++++++++++++++++++++++ > >> vswitchd/bridge.c | 24 +++++++++++++++++- > >> 5 files changed, 190 insertions(+), 1 deletion(-) > >> create mode 100644 lib/if-notifier-bsd.c > >> create mode 100644 lib/if-notifier.c > >> create mode 100644 lib/if-notifier.h > >> > >> diff --git a/lib/automake.mk b/lib/automake.mk > >> index 018e62c..4946d90 100644 > >> --- a/lib/automake.mk > >> +++ b/lib/automake.mk > >> @@ -338,6 +338,8 @@ if LINUX > >> lib_libopenvswitch_la_SOURCES += \ > >> lib/dpif-netlink.c \ > >> lib/dpif-netlink.h \ > >> + lib/if-notifier.c \ > >> + lib/if-notifier.h \ > >> lib/netdev-linux.c \ > >> lib/netdev-linux.h \ > >> lib/netlink-notifier.c \ > >> @@ -384,6 +386,7 @@ endif > >> > >> if HAVE_IF_DL > >> lib_libopenvswitch_la_SOURCES += \ > >> + lib/if-notifier-bsd.c \ > >> lib/netdev-bsd.c \ > >> lib/rtbsd.c \ > >> lib/rtbsd.h \ > >> diff --git a/lib/if-notifier-bsd.c b/lib/if-notifier-bsd.c > >> new file mode 100644 > >> index 0000000..06874b0 > >> --- /dev/null > >> +++ b/lib/if-notifier-bsd.c > >> @@ -0,0 +1,68 @@ > >> +/* > >> + * Copyright (c) 2014 Red Hat, Inc. > >> + * > >> + * Licensed under the Apache License, Version 2.0 (the "License"); > >> + * you may not use this file except in compliance with the License. > >> + * You may obtain a copy of the License at: > >> + * > >> + * http://www.apache.org/licenses/LICENSE-2.0 > >> + * > >> + * Unless required by applicable law or agreed to in writing, software > >> + * distributed under the License is distributed on an "AS IS" BASIS, > >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > >> implied. > >> + * See the License for the specific language governing permissions and > >> + * limitations under the License. > >> + */ > >> + > >> +#include <config.h> > >> +#include "if-notifier.h" > >> +#include "rtbsd.h" > >> +#include "util.h" > >> + > >> +struct if_notifier { > >> + struct rtbsd_notifier notifier; > >> + if_notify_func *cb; > >> + void *aux; > >> +}; > >> + > >> +static void if_notifier_cb(const struct rtbsd_change *change, void *aux) > >> +{ > >> + struct if_notifier *notifier; > >> + notifier = aux; > >> + notifier->cb(notifier->aux); > >> +} > >> + > >> +struct if_notifier * > >> +if_notifier_create(if_notify_func *cb, void *aux) > >> +{ > >> + struct if_notifier *notifier; > >> + int ret; > >> + notifier = xzalloc(sizeof *notifier); > >> + notifier->cb = cb; > >> + notifier->aux = aux; > >> + ret = rtbsd_notifier_register(¬ifier->notifier, if_notifier_cb, > >> + notifier); > >> + if (ret) { > >> + free(notifier); > >> + return NULL; > >> + } > >> + return notifier; > >> +} > >> + > >> +void if_notifier_destroy(struct if_notifier *notifier) > >> +{ > >> + if (notifier) { > >> + rtbsd_notifier_unregister(¬ifier->notifier); > >> + free(notifier); > >> + } > >> +} > >> + > >> +void if_notifier_run(void) > >> +{ > >> + rtbsd_notifier_run(); > >> +} > >> + > >> +void if_notifier_wait(void) > >> +{ > >> + rtbsd_notifier_wait(); > >> +} > >> diff --git a/lib/if-notifier.c b/lib/if-notifier.c > >> new file mode 100644 > >> index 0000000..1bf77c5 > >> --- /dev/null > >> +++ b/lib/if-notifier.c > >> @@ -0,0 +1,64 @@ > >> +/* > >> + * Copyright (c) 2014 Red Hat, Inc. > >> + * > >> + * Licensed under the Apache License, Version 2.0 (the "License"); > >> + * you may not use this file except in compliance with the License. > >> + * You may obtain a copy of the License at: > >> + * > >> + * http://www.apache.org/licenses/LICENSE-2.0 > >> + * > >> + * Unless required by applicable law or agreed to in writing, software > >> + * distributed under the License is distributed on an "AS IS" BASIS, > >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > >> implied. > >> + * See the License for the specific language governing permissions and > >> + * limitations under the License. > >> + */ > >> + > >> +#include <config.h> > >> +#include "if-notifier.h" > >> +#include "rtnetlink-link.h" > >> +#include "util.h" > >> + > >> +struct if_notifier { > >> + struct nln_notifier *notifier; > >> + if_notify_func *cb; > >> + void *aux; > >> +}; > >> + > >> +static > >> +void if_notifier_cb(const struct rtnetlink_link_change *change OVS_UNUSED, > >> + void *aux) > >> +{ > >> + struct if_notifier *notifier; > >> + notifier = aux; > >> + notifier->cb(notifier->aux); > >> +} > >> + > >> +struct if_notifier * > >> +if_notifier_create(if_notify_func *cb, void *aux) > >> +{ > >> + struct if_notifier *notifier; > >> + notifier = xmalloc(sizeof *notifier); > >> + notifier->cb = cb; > >> + notifier->aux = aux; > >> + notifier->notifier = rtnetlink_link_notifier_create(if_notifier_cb, > >> notifier); > >> + return notifier; > >> +} > >> + > >> +void if_notifier_destroy(struct if_notifier *notifier) > >> +{ > >> + if (notifier) { > >> + rtnetlink_link_notifier_destroy(notifier->notifier); > >> + free(notifier); > >> + } > >> +} > >> + > >> +void if_notifier_run(void) > >> +{ > >> + rtnetlink_link_run(); > >> +} > >> + > >> +void if_notifier_wait(void) > >> +{ > >> + rtnetlink_link_wait(); > >> +} > >> diff --git a/lib/if-notifier.h b/lib/if-notifier.h > >> new file mode 100644 > >> index 0000000..9610d2d > >> --- /dev/null > >> +++ b/lib/if-notifier.h > >> @@ -0,0 +1,32 @@ > >> +/* > >> + * Copyright (c) 2014 Red Hat, Inc. > >> + * > >> + * Licensed under the Apache License, Version 2.0 (the "License"); > >> + * you may not use this file except in compliance with the License. > >> + * You may obtain a copy of the License at: > >> + * > >> + * http://www.apache.org/licenses/LICENSE-2.0 > >> + * > >> + * Unless required by applicable law or agreed to in writing, software > >> + * distributed under the License is distributed on an "AS IS" BASIS, > >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > >> implied. > >> + * See the License for the specific language governing permissions and > >> + * limitations under the License. > >> + */ > >> + > >> +#ifndef IF_NOTIFIER_H > >> +#define IF_NOTIFIER_H 1 > >> + > >> +struct if_notifier; > >> + > >> +typedef > >> +void if_notify_func(void *aux); > >> + > >> +struct if_notifier * > >> +if_notifier_create(if_notify_func *, void *aux); > >> +void if_notifier_destroy(struct if_notifier *); > >> + > >> +void if_notifier_run(void); > >> +void if_notifier_wait(void); > >> + > >> +#endif > >> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c > >> index 39d4cb3..625105b 100644 > >> --- a/vswitchd/bridge.c > >> +++ b/vswitchd/bridge.c > >> @@ -48,6 +48,7 @@ > >> #include "ofproto/ofproto.h" > >> #include "ovs-numa.h" > >> #include "poll-loop.h" > >> +#include "if-notifier.h" > >> #include "seq.h" > >> #include "sha1.h" > >> #include "shash.h" > >> @@ -217,6 +218,12 @@ static long long int stats_timer = LLONG_MIN; > >> #define AA_REFRESH_INTERVAL (1000) /* In milliseconds. */ > >> static long long int aa_refresh_timer = LLONG_MIN; > >> > >> +/* Whenever system interfaces are added, removed or change state, the > >> bridge > >> + * will be reconfigured. > >> + */ > >> +static struct if_notifier *ifnotifier; > >> +static bool ifaces_changed = false; > >> + > >> static void add_del_bridges(const struct ovsrec_open_vswitch *); > >> static void bridge_run__(void); > >> static void bridge_create(const struct ovsrec_bridge *); > >> @@ -375,6 +382,12 @@ bridge_init_ofproto(const struct ovsrec_open_vswitch > >> *cfg) > >> shash_destroy_free_data(&iface_hints); > >> initialized = true; > >> } > >> + > >> +static void > >> +if_change_cb(void *aux OVS_UNUSED) > >> +{ > >> + ifaces_changed = true; > >> +} > >> > >> /* Public functions. */ > >> > >> @@ -478,6 +491,7 @@ bridge_init(const char *remote) > >> stp_init(); > >> lldp_init(); > >> rstp_init(); > >> + ifnotifier = if_notifier_create(if_change_cb, NULL); > >> } > >> > >> void > >> @@ -485,6 +499,7 @@ bridge_exit(void) > >> { > >> struct bridge *br, *next_br; > >> > >> + if_notifier_destroy(ifnotifier); > >> HMAP_FOR_EACH_SAFE (br, next_br, node, &all_bridges) { > >> bridge_destroy(br); > >> } > >> @@ -2877,6 +2892,8 @@ bridge_run(void) > >> > >> ovsdb_idl_run(idl); > >> > >> + if_notifier_run(); > >> + > >> if (ovsdb_idl_is_lock_contended(idl)) { > >> static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); > >> struct bridge *br, *next_br; > >> @@ -2943,9 +2960,12 @@ bridge_run(void) > >> } > >> } > >> > >> - if (ovsdb_idl_get_seqno(idl) != idl_seqno || vlan_splinters_changed) { > >> + if (ovsdb_idl_get_seqno(idl) != idl_seqno || vlan_splinters_changed > >> + || ifaces_changed) { > >> struct ovsdb_idl_txn *txn; > >> > >> + ifaces_changed = false; > >> + > >> idl_seqno = ovsdb_idl_get_seqno(idl); > >> txn = ovsdb_idl_txn_create(idl); > >> bridge_reconfigure(cfg ? cfg : &null_cfg); > >> @@ -3002,6 +3022,8 @@ bridge_wait(void) > >> ovsdb_idl_txn_wait(daemonize_txn); > >> } > >> > >> + if_notifier_wait(); > >> + > >> sset_init(&types); > >> ofproto_enumerate_types(&types); > >> SSET_FOR_EACH (type, &types) { > >> -- > >> 2.4.2 > >> > >> _______________________________________________ > >> dev mailing list > >> dev@openvswitch.org > >> http://openvswitch.org/mailman/listinfo/dev > > _______________________________________________ > > dev mailing list > > dev@openvswitch.org > > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev