X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fnetdev-vport.c;h=28a1bfb49eaf38ed350f97655f938ecb7726844d;hb=9d9a0a0452a957472b0f3a9c132aea19cfb4e568;hp=3067323671a1a7e87cd286214a385da56143c8f3;hpb=b2fda3effc787f265b5ad5dfa967ac00627bd075;p=openvswitch diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c index 30673236..28a1bfb4 100644 --- a/lib/netdev-vport.c +++ b/lib/netdev-vport.c @@ -48,17 +48,12 @@ VLOG_DEFINE_THIS_MODULE(netdev_vport); -struct netdev_vport_notifier { - struct netdev_notifier notifier; - struct list list_node; - struct shash_node *shash_node; -}; - struct netdev_dev_vport { struct netdev_dev netdev_dev; struct ofpbuf *options; int dp_ifindex; /* -1 if unknown. */ uint32_t port_no; /* UINT32_MAX if unknown. */ + unsigned int change_seq; }; struct netdev_vport { @@ -75,9 +70,6 @@ struct vport_class { struct shash *args); }; -static struct shash netdev_vport_notifiers = - SHASH_INITIALIZER(&netdev_vport_notifiers); - static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); static int netdev_vport_create(const struct netdev_class *, const char *, @@ -242,6 +234,7 @@ netdev_vport_create(const struct netdev_class *netdev_class, const char *name, dev->options = options; dev->dp_ifindex = dp_ifindex; dev->port_no = port_no; + dev->change_seq = 1; *netdev_devp = &dev->netdev_dev; route_table_register(); @@ -485,57 +478,10 @@ netdev_vport_update_flags(struct netdev *netdev OVS_UNUSED, return 0; } -static char * -make_poll_name(const struct netdev *netdev) -{ - return xasprintf("%s:%s", netdev_get_type(netdev), netdev_get_name(netdev)); -} - -static int -netdev_vport_poll_add(struct netdev *netdev, - void (*cb)(struct netdev_notifier *), void *aux, - struct netdev_notifier **notifierp) -{ - char *poll_name = make_poll_name(netdev); - struct netdev_vport_notifier *notifier; - struct list *list; - struct shash_node *shash_node; - - shash_node = shash_find(&netdev_vport_notifiers, poll_name); - if (!shash_node) { - list = xmalloc(sizeof *list); - list_init(list); - shash_node = shash_add(&netdev_vport_notifiers, poll_name, list); - } else { - list = shash_node->data; - } - - notifier = xmalloc(sizeof *notifier); - netdev_notifier_init(¬ifier->notifier, netdev, cb, aux); - list_push_back(list, ¬ifier->list_node); - notifier->shash_node = shash_node; - - *notifierp = ¬ifier->notifier; - free(poll_name); - - return 0; -} - -static void -netdev_vport_poll_remove(struct netdev_notifier *notifier_) +static unsigned int +netdev_vport_change_seq(const struct netdev *netdev) { - struct netdev_vport_notifier *notifier = - CONTAINER_OF(notifier_, struct netdev_vport_notifier, notifier); - - struct list *list; - - list = list_remove(¬ifier->list_node); - if (list_is_empty(list)) { - shash_delete(&netdev_vport_notifiers, notifier->shash_node); - free(list); - } - - free(notifier); + return netdev_dev_vport_cast(netdev_get_dev(netdev))->change_seq; } static void @@ -578,20 +524,14 @@ netdev_vport_get_tnl_iface(const struct netdev *netdev) static void netdev_vport_poll_notify(const struct netdev *netdev) { - char *poll_name = make_poll_name(netdev); - struct list *list = shash_find_data(&netdev_vport_notifiers, - poll_name); + struct netdev_dev_vport *ndv; - if (list) { - struct netdev_vport_notifier *notifier; + ndv = netdev_dev_vport_cast(netdev_get_dev(netdev)); - LIST_FOR_EACH (notifier, list_node, list) { - struct netdev_notifier *n = ¬ifier->notifier; - n->cb(n); - } + ndv->change_seq++; + if (!ndv->change_seq) { + ndv->change_seq++; } - - free(poll_name); } /* Code specific to individual vport types. */ @@ -985,8 +925,7 @@ unparse_patch_config(const char *name OVS_UNUSED, const char *type OVS_UNUSED, \ netdev_vport_update_flags, \ \ - netdev_vport_poll_add, \ - netdev_vport_poll_remove, + netdev_vport_change_seq void netdev_vport_register(void)