vswitchd: New column "link_resets".
authorEthan Jackson <ethan@nicira.com>
Fri, 14 Oct 2011 19:49:57 +0000 (12:49 -0700)
committerEthan Jackson <ethan@nicira.com>
Mon, 17 Oct 2011 22:03:03 +0000 (15:03 -0700)
An interface's 'link_resets' column represents the number of times
Open vSwitch has observed its link_state change.

lib/netdev-dummy.c
lib/netdev-linux.c
lib/netdev-provider.h
lib/netdev-vport.c
lib/netdev.c
lib/netdev.h
vswitchd/bridge.c
vswitchd/vswitch.ovsschema
vswitchd/vswitch.xml

index 7c301809828464cc455830d8a073feac45f8a415..f62ea53edf529eb3af77d00de1edb1f006b1441b 100644 (file)
@@ -270,6 +270,7 @@ static const struct netdev_class dummy_class = {
     netdev_dummy_set_mtu,
     NULL,                       /* get_ifindex */
     NULL,                       /* get_carrier */
+    NULL,                       /* get_carrier_resets */
     NULL,                       /* get_miimon */
     netdev_dummy_get_stats,
     netdev_dummy_set_stats,
index fb46561b7b923b93590b819f0c0a7f17600400f8..8329f22640d628512fe8dd409cca6a87fe0713c5 100644 (file)
@@ -366,6 +366,7 @@ struct netdev_dev_linux {
     struct in6_addr in6;
     int mtu;
     bool carrier;
+    long long int carrier_resets;
     uint32_t kbits_rate;        /* Policing data. */
     uint32_t kbits_burst;
     bool have_vport_stats;
@@ -505,6 +506,7 @@ netdev_linux_cache_cb(const struct rtnetlink_link_change *change,
 
                 if (dev->carrier != change->running) {
                     dev->carrier = change->running;
+                    dev->carrier_resets++;
                 }
 
                 netdev_dev_linux_changed(dev);
@@ -524,6 +526,7 @@ netdev_linux_cache_cb(const struct rtnetlink_link_change *change,
             get_carrier_via_sysfs(node->name, &carrier);
             if (dev->carrier != carrier) {
                 dev->carrier = carrier;
+                dev->carrier_resets++;
             }
 
             netdev_dev_linux_changed(dev);
@@ -1041,6 +1044,12 @@ netdev_linux_get_carrier(const struct netdev *netdev_, bool *carrier)
     return 0;
 }
 
+static long long int
+netdev_linux_get_carrier_resets(const struct netdev *netdev)
+{
+    return netdev_dev_linux_cast(netdev_get_dev(netdev))->carrier_resets;
+}
+
 static int
 netdev_linux_do_miimon(const char *name, int cmd, const char *cmd_name,
                        struct mii_ioctl_data *data)
@@ -2315,6 +2324,7 @@ netdev_linux_change_seq(const struct netdev *netdev)
     netdev_linux_set_mtu,                                       \
     netdev_linux_get_ifindex,                                   \
     netdev_linux_get_carrier,                                   \
+    netdev_linux_get_carrier_resets,                            \
     netdev_linux_set_miimon_interval,                           \
     GET_STATS,                                                  \
     SET_STATS,                                                  \
index 06312293fe95f461a9d540284d7428743e71fa67..921c3974e67e324cba0f13a23df14c7424fb7bed 100644 (file)
@@ -270,6 +270,12 @@ struct netdev_class {
      */
     int (*get_carrier)(const struct netdev *netdev, bool *carrier);
 
+    /* Returns the number of times 'netdev''s carrier has changed since being
+     * initialized.
+     *
+     * If null, callers will assume the number of carrier resets is zero. */
+    long long int (*get_carrier_resets)(const struct netdev *netdev);
+
     /* Forces ->get_carrier() to poll 'netdev''s MII registers for link status
      * instead of checking 'netdev''s carrier.  'netdev''s MII registers will
      * be polled once ever 'interval' milliseconds.  If 'netdev' does not
index 301bb43dac5b1fc93c8979a17476b51d3183c9f7..0577bd3b49c7ef2240b02a296b1befcd6ece405a 100644 (file)
@@ -906,6 +906,7 @@ unparse_patch_config(const char *name OVS_UNUSED, const char *type OVS_UNUSED,
     NULL,                       /* set_mtu */               \
     NULL,                       /* get_ifindex */           \
     NULL,                       /* get_carrier */           \
+    NULL,                       /* get_carrier_resets */    \
     NULL,                       /* get_miimon */            \
     netdev_vport_get_stats,                                 \
     netdev_vport_set_stats,                                 \
index 70f9678b20e176e65f988987a8d016111b3439c7..9f15b72a6de04e9b5b38b63e75f25919b92178a7 100644 (file)
@@ -892,6 +892,15 @@ netdev_get_carrier(const struct netdev *netdev)
     return carrier;
 }
 
+/* Returns the number of times 'netdev''s carrier has changed. */
+long long int
+netdev_get_carrier_resets(const struct netdev *netdev)
+{
+    return (netdev_get_dev(netdev)->netdev_class->get_carrier_resets
+            ? netdev_get_dev(netdev)->netdev_class->get_carrier_resets(netdev)
+            : 0);
+}
+
 /* Attempts to force netdev_get_carrier() to poll 'netdev''s MII registers for
  * link status instead of checking 'netdev''s carrier.  'netdev''s MII
  * registers will be polled once ever 'interval' milliseconds.  If 'netdev'
index f9add0bee99fec8a4789d51f79bc7976640444af..85be394c265dfc9e97bb705dbd29922a15d38e91 100644 (file)
@@ -118,6 +118,7 @@ int netdev_get_etheraddr(const struct netdev *, uint8_t mac[6]);
 
 /* PHY interface. */
 bool netdev_get_carrier(const struct netdev *);
+long long int netdev_get_carrier_resets(const struct netdev *);
 int netdev_set_miimon_interval(struct netdev *, long long int interval);
 int netdev_get_features(const struct netdev *,
                         uint32_t *current, uint32_t *advertised,
index b3c62187c069615b398588cd256f5f32f45f4a15..d4335c103a4963fdb6b239dbe0577f58bbca7ded 100644 (file)
@@ -238,6 +238,7 @@ bridge_init(const char *remote)
     ovsdb_idl_omit_alert(idl, &ovsrec_interface_col_duplex);
     ovsdb_idl_omit_alert(idl, &ovsrec_interface_col_link_speed);
     ovsdb_idl_omit_alert(idl, &ovsrec_interface_col_link_state);
+    ovsdb_idl_omit_alert(idl, &ovsrec_interface_col_link_resets);
     ovsdb_idl_omit_alert(idl, &ovsrec_interface_col_mtu);
     ovsdb_idl_omit_alert(idl, &ovsrec_interface_col_ofport);
     ovsdb_idl_omit_alert(idl, &ovsrec_interface_col_statistics);
@@ -1574,6 +1575,7 @@ bridge_run(void)
 
             HMAP_FOR_EACH (iface, name_node, &br->iface_by_name) {
                 const char *link_state;
+                int64_t link_resets;
                 int current;
 
                 if (iface_is_synthetic(iface)) {
@@ -1591,6 +1593,9 @@ bridge_run(void)
 
                 link_state = netdev_get_carrier(iface->netdev) ? "up" : "down";
                 ovsrec_interface_set_link_state(iface->cfg, link_state);
+
+                link_resets = netdev_get_carrier_resets(iface->netdev);
+                ovsrec_interface_set_link_resets(iface->cfg, &link_resets, 1);
             }
         }
 
index b32e26b23a13c3fa9b9bbcf109427e270fe94a2c..5fce9890560a456d29001ea467c608754dcd986a 100644 (file)
@@ -1,6 +1,6 @@
 {"name": "Open_vSwitch",
- "version": "6.1.1",
- "cksum": "282564184 14747",
+ "version": "6.2.0",
+ "cksum": "212779557 14885",
  "tables": {
    "Open_vSwitch": {
      "columns": {
                           "enum": ["set", ["up", "down"]]},
                   "min": 0, "max": 1},
          "ephemeral": true},
+       "link_resets": {
+         "type": {"key": {"type": "integer"},
+                  "min": 0, "max": 1},
+         "ephemeral": true},
        "link_speed": {
          "type": {"key": "integer", "min": 0, "max": 1},
          "ephemeral": true},
index d579b8722ee255a43f5cafd32621f8306c4a24a8..683b27ea6a476e74239a5a410a39c76f5ff306d5 100644 (file)
         </p>
       </column>
 
+      <column name="link_resets">
+        <p>
+          The number of times Open vSwitch has observed the
+          <ref column="link_state"/> of this <ref table="Interface"/> change.
+        </p>
+      </column>
+
       <column name="link_speed">
         <p>
           The negotiated speed of the physical network link.