X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fnetdev-vport.c;h=28a1bfb49eaf38ed350f97655f938ecb7726844d;hb=afabef2b7de84e628b1f2f1ba2e92ec734463eda;hp=be269415922d215f283d6d6decbb0e7a9b860910;hpb=7feba1acdd806b54ec152d2e93169ab2a295128d;p=openvswitch diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c index be269415..28a1bfb4 100644 --- a/lib/netdev-vport.c +++ b/lib/netdev-vport.c @@ -32,6 +32,7 @@ #include "hash.h" #include "hmap.h" #include "list.h" +#include "netdev-linux.h" #include "netdev-provider.h" #include "netlink.h" #include "netlink-socket.h" @@ -47,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 { @@ -74,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 *, @@ -241,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(); @@ -416,27 +410,7 @@ netdev_vport_get_stats(const struct netdev *netdev, struct netdev_stats *stats) return EOPNOTSUPP; } - stats->rx_packets = reply.stats->rx_packets; - stats->tx_packets = reply.stats->tx_packets; - stats->rx_bytes = reply.stats->rx_bytes; - stats->tx_bytes = reply.stats->tx_bytes; - stats->rx_errors = reply.stats->rx_errors; - stats->tx_errors = reply.stats->tx_errors; - stats->rx_dropped = reply.stats->rx_dropped; - stats->tx_dropped = reply.stats->tx_dropped; - stats->multicast = reply.stats->multicast; - stats->collisions = reply.stats->collisions; - stats->rx_length_errors = reply.stats->rx_length_errors; - stats->rx_over_errors = reply.stats->rx_over_errors; - stats->rx_crc_errors = reply.stats->rx_crc_errors; - stats->rx_frame_errors = reply.stats->rx_frame_errors; - stats->rx_fifo_errors = reply.stats->rx_fifo_errors; - stats->rx_missed_errors = reply.stats->rx_missed_errors; - stats->tx_aborted_errors = reply.stats->tx_aborted_errors; - stats->tx_carrier_errors = reply.stats->tx_carrier_errors; - stats->tx_fifo_errors = reply.stats->tx_fifo_errors; - stats->tx_heartbeat_errors = reply.stats->tx_heartbeat_errors; - stats->tx_window_errors = reply.stats->tx_window_errors; + netdev_stats_from_rtnl_link_stats64(stats, reply.stats); ofpbuf_delete(buf); @@ -450,27 +424,7 @@ netdev_vport_set_stats(struct netdev *netdev, const struct netdev_stats *stats) struct dpif_linux_vport vport; int err; - rtnl_stats.rx_packets = stats->rx_packets; - rtnl_stats.tx_packets = stats->tx_packets; - rtnl_stats.rx_bytes = stats->rx_bytes; - rtnl_stats.tx_bytes = stats->tx_bytes; - rtnl_stats.rx_errors = stats->rx_errors; - rtnl_stats.tx_errors = stats->tx_errors; - rtnl_stats.rx_dropped = stats->rx_dropped; - rtnl_stats.tx_dropped = stats->tx_dropped; - rtnl_stats.multicast = stats->multicast; - rtnl_stats.collisions = stats->collisions; - rtnl_stats.rx_length_errors = stats->rx_length_errors; - rtnl_stats.rx_over_errors = stats->rx_over_errors; - rtnl_stats.rx_crc_errors = stats->rx_crc_errors; - rtnl_stats.rx_frame_errors = stats->rx_frame_errors; - rtnl_stats.rx_fifo_errors = stats->rx_fifo_errors; - rtnl_stats.rx_missed_errors = stats->rx_missed_errors; - rtnl_stats.tx_aborted_errors = stats->tx_aborted_errors; - rtnl_stats.tx_carrier_errors = stats->tx_carrier_errors; - rtnl_stats.tx_fifo_errors = stats->tx_fifo_errors; - rtnl_stats.tx_heartbeat_errors = stats->tx_heartbeat_errors; - rtnl_stats.tx_window_errors = stats->tx_window_errors; + netdev_stats_to_rtnl_link_stats64(&rtnl_stats, stats); dpif_linux_vport_init(&vport); vport.cmd = ODP_VPORT_CMD_SET; @@ -524,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) +static unsigned int +netdev_vport_change_seq(const struct netdev *netdev) { - 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_) -{ - 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 @@ -594,7 +501,7 @@ static const char * netdev_vport_get_tnl_iface(const struct netdev *netdev) { struct nlattr *a[ODP_TUNNEL_ATTR_MAX + 1]; - uint32_t route; + ovs_be32 route; struct netdev_dev_vport *ndv; static char name[IFNAMSIZ]; @@ -617,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. */ @@ -667,7 +568,7 @@ parse_tunnel_config(const char *name, const char *type, ovs_be32 daddr = htonl(0); uint32_t flags; - flags = TNL_F_PMTUD | TNL_F_HDR_CACHE; + flags = TNL_F_DF_DEFAULT | TNL_F_PMTUD | TNL_F_HDR_CACHE; if (!strcmp(type, "gre")) { is_gre = true; } else if (!strcmp(type, "ipsec_gre")) { @@ -709,6 +610,14 @@ parse_tunnel_config(const char *name, const char *type, if (!strcmp(node->data, "true")) { flags |= TNL_F_CSUM; } + } else if (!strcmp(node->name, "df_inherit")) { + if (!strcmp(node->data, "true")) { + flags |= TNL_F_DF_INHERIT; + } + } else if (!strcmp(node->name, "df_default")) { + if (!strcmp(node->data, "false")) { + flags &= ~TNL_F_DF_DEFAULT; + } } else if (!strcmp(node->name, "pmtud")) { if (!strcmp(node->data, "false")) { flags &= ~TNL_F_PMTUD; @@ -891,6 +800,12 @@ unparse_tunnel_config(const char *name OVS_UNUSED, const char *type OVS_UNUSED, if (flags & TNL_F_CSUM) { smap_add(args, "csum", "true"); } + if (flags & TNL_F_DF_INHERIT) { + smap_add(args, "df_inherit", "true"); + } + if (!(flags & TNL_F_DF_DEFAULT)) { + smap_add(args, "df_default", "false"); + } if (!(flags & TNL_F_PMTUD)) { smap_add(args, "pmtud", "false"); } @@ -1010,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)