bridge: Store the 'mac_in_use' for interfaces in OVSDB.
authorJustin Pettit <jpettit@nicira.com>
Tue, 12 Mar 2013 21:47:22 +0000 (14:47 -0700)
committerJustin Pettit <jpettit@nicira.com>
Tue, 12 Mar 2013 22:14:46 +0000 (15:14 -0700)
It can be useful to remotely determine the MAC addresses of attached
interfaces without going through OpenFlow.  This adds the MAC address to
a new 'mac_in_use' column on the Interface table.

Feature #15551

Requested-by: Paul Ingram <paul@nicira.com>
Signed-off-by: Justin Pettit <jpettit@nicira.com>
vswitchd/bridge.c
vswitchd/vswitch.ovsschema
vswitchd/vswitch.xml

index fed22d3..1fd431c 100644 (file)
@@ -345,6 +345,7 @@ bridge_init(const char *remote)
     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_mac_in_use);
     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);
@@ -1698,6 +1699,7 @@ iface_refresh_status(struct iface *iface)
     int64_t bps;
     int mtu;
     int64_t mtu_64;
+    uint8_t mac[ETH_ADDR_LEN];
     int error;
 
     if (iface_is_synthetic(iface)) {
@@ -1733,6 +1735,16 @@ iface_refresh_status(struct iface *iface)
     } else {
         ovsrec_interface_set_mtu(iface->cfg, NULL, 0);
     }
+
+    error = netdev_get_etheraddr(iface->netdev, mac);
+    if (!error) {
+        char mac_string[32];
+
+        sprintf(mac_string, ETH_ADDR_FMT, ETH_ADDR_ARGS(mac));
+        ovsrec_interface_set_mac_in_use(iface->cfg, mac_string);
+    } else {
+        ovsrec_interface_set_mac_in_use(iface->cfg, NULL);
+    }
 }
 
 /* Writes 'iface''s CFM statistics to the database. 'iface' must not be
@@ -3330,6 +3342,7 @@ iface_clear_db_record(const struct ovsrec_interface *if_cfg)
         ovsrec_interface_set_duplex(if_cfg, NULL);
         ovsrec_interface_set_link_speed(if_cfg, NULL, 0);
         ovsrec_interface_set_link_state(if_cfg, NULL);
+        ovsrec_interface_set_mac_in_use(if_cfg, NULL);
         ovsrec_interface_set_mtu(if_cfg, NULL, 0);
         ovsrec_interface_set_cfm_fault(if_cfg, NULL, 0);
         ovsrec_interface_set_cfm_fault_status(if_cfg, NULL, 0);
index a7901a8..594ffb4 100644 (file)
@@ -1,6 +1,6 @@
 {"name": "Open_vSwitch",
- "version": "7.0.0",
- "cksum": "3537583872 17299",
+ "version": "7.1.0",
+ "cksum": "2234055133 17444",
  "tables": {
    "Open_vSwitch": {
      "columns": {
        "ingress_policing_burst": {
          "type": {"key": {"type": "integer",
                           "minInteger": 0}}},
+       "mac_in_use": {
+         "type": {"key": {"type": "string"},
+                  "min": 0, "max": 1},
+                  "ephemeral": true},
        "mac": {
          "type": {"key": {"type": "string"},
                   "min": 0, "max": 1}},
index 30588a7..85d4edb 100644 (file)
         on a host.
       </column>
 
+      <column name="mac_in_use">
+        The MAC address in use by this interface.
+      </column>
+
       <column name="mac">
         <p>Ethernet address to set for this interface.  If unset then the
         default MAC address is used:</p>