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 <[email protected]>
Signed-off-by: Justin Pettit <[email protected]>
---
 vswitchd/bridge.c          |   13 +++++++++++++
 vswitchd/vswitch.ovsschema |    8 ++++++--
 vswitchd/vswitch.xml       |    4 ++++
 3 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index f7932c7..1e0b62e 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -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)) {
@@ -1735,6 +1737,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 = xasprintf(ETH_ADDR_FMT, ETH_ADDR_ARGS(mac));
+
+        ovsrec_interface_set_mac_in_use(iface->cfg, mac_string);
+        free(mac_string);
+    } else {
+        ovsrec_interface_set_mac_in_use(iface->cfg, NULL);
+    }
 }
 
 /* Writes 'iface''s CFM statistics to the database. 'iface' must not be
@@ -3332,6 +3344,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);
diff --git a/vswitchd/vswitch.ovsschema b/vswitchd/vswitch.ovsschema
index a7901a8..594ffb4 100644
--- a/vswitchd/vswitch.ovsschema
+++ b/vswitchd/vswitch.ovsschema
@@ -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": {
@@ -174,6 +174,10 @@
        "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}},
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index e1d9372..bdc6183 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -1131,6 +1131,10 @@
         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>
-- 
1.7.5.4

_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to