Move setting Nicira datapath ID out of kernel.
authorJustin Pettit <jpettit@nicira.com>
Sat, 24 Jan 2009 01:30:16 +0000 (17:30 -0800)
committerJustin Pettit <jpettit@nicira.com>
Sat, 24 Jan 2009 01:30:16 +0000 (17:30 -0800)
When generating the datapath id/mac address for an OpenFlow device, the
kernel checks the DMI for a suitable one in a Nicira UUID.  If one is
not found, then a random address is generated.  This patch makes it so
that a random address is always generated.  The DMI Nicira UUID check is
now done in the init script, which overrides the random address
generated when the datapath was created.  Ripping code out of the kernel
is good.

datapath/dp_dev.c
debian/openflow-switch.init
debian/openflow-switch.template

index 2c99d60246e4e47fefcc5c63baa054ec53a6dc61..58a246981feb41282151e3f1ef0996c109c3ce0e 100644 (file)
@@ -5,7 +5,6 @@
 #include <linux/rcupdate.h>
 #include <linux/skbuff.h>
 #include <linux/workqueue.h>
-#include <linux/dmi.h>
 
 #include "datapath.h"
 #include "dp_dev.h"
@@ -123,45 +122,6 @@ static int dp_dev_stop(struct net_device *netdev)
        return 0;
 }
 
-/* Check if the DMI UUID contains a Nicira mac address that should be 
- * used for this interface.  The UUID is assumed to be RFC 4122
- * compliant. */
-static void
-set_uuid_mac(struct net_device *netdev)
-{
-       const char *uuid = dmi_get_system_info(DMI_PRODUCT_UUID);
-       const char *uptr;
-       uint8_t mac[ETH_ALEN];
-       int i;
-
-       if (!uuid || *uuid == '\0' || strlen(uuid) != 36)
-               return;
-
-       /* We are only interested version 1 UUIDs, since the last six bytes
-        * are an IEEE 802 MAC address. */
-       if (uuid[14] != '1') 
-               return;
-
-       /* Pull out the embedded MAC address.  The kernel's sscanf doesn't
-        * support field widths on hex digits, so we use this hack. */
-       uptr = uuid + 24;
-       for (i=0; i<ETH_ALEN; i++) {
-               unsigned char d[3];
-               
-               d[0] = *uptr++;
-               d[1] = *uptr++;
-               d[2] = '\0';
-               
-               mac[i] = simple_strtoul(d, NULL, 16);
-       }
-
-       /* If this is a Nicira one, then use it. */
-       if (mac[0] != 0x00 || mac[1] != 0x23 || mac[2] != 0x20) 
-               return;
-
-       memcpy(netdev->dev_addr, mac, ETH_ALEN);
-}
-
 static void dp_getinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 {
        strcpy(info->driver, "openflow");
@@ -233,12 +193,6 @@ int dp_dev_setup(struct datapath *dp, const char *dp_name)
                return err;
        }
 
-       /* For the first datapath, we check the DMI UUID to see if a Nicira 
-        * mac address is available to use instead of the random one just 
-        * generated. */
-       if (dp->dp_idx == 0) 
-               set_uuid_mac(netdev);
-
        dp_dev = dp_dev_priv(netdev);
        dp_dev->dp = dp;
        skb_queue_head_init(&dp_dev->xmit_queue);
index 8ee19cd6d2db6edb86881d4fc2333476a383392e..cd518a71275a0c4c9e314969fcd9f53c5704a60a 100755 (executable)
@@ -25,6 +25,8 @@ DESC=secchan
 
 test -x $DAEMON || exit 0
 
+NICIRA_OUI="002320"
+
 LOGDIR=/var/log/openflow
 PIDFILE=/var/run/$NAME.pid
 DHCLIENT_PIDFILE=/var/run/dhclient.of0.pid
@@ -271,6 +273,20 @@ case "$1" in
         xx='[0-9abcdefABCDEF][0-9abcdefABCDEF]'
         case $DATAPATH_ID in
             '')
+                # Check if the DMI System UUID contains a Nicira mac address
+                # that should be used for this datapath.  The UUID is assumed 
+                # to be RFC 4122 compliant.
+                DMIDECODE=`which dmidecode`
+                if [ -n $DMIDECODE ]; then
+                    UUID_MAC=`$DMIDECODE -s system-uuid | cut -d'-' -f 5`
+                    case $UUID_MAC in
+                        $NICIRA_OUI*)
+                            ifconfig of0 down
+                            must_succeed "Setting of0 MAC address to $UUID_MAC" ifconfig of0 hw ether $UUID_MAC
+                            ifconfig of0 up
+                            ;;
+                    esac
+                fi  
                 ;;
             $xx:$xx:$xx:$xx:$xx:$xx)
                 ifconfig of0 down
index 2b78b6ba040b4a7e448f2c7f8281a7fbfab8e4c8..f3f641e845cfd1153ccf1daed9117d3e3e01764e 100644 (file)
@@ -159,9 +159,10 @@ DAEMON_OPTS=""
 
 # DATAPATH_ID: Identifier for this switch.
 #
-# By default, the switch generates a new, random datapath ID every time
-# it starts up.  By setting this value, the datapath ID will be consistent
-# from one run to the next.
+# By default, the switch checks if the DMI System UUID contains a Nicira 
+# mac address to use as a datapath ID.  If not, then the switch generates 
+# a new, random datapath ID every time it starts up.  By setting this
+# value, the supplied datapath ID will always be used.
 #
 # Set DATAPATH_ID to a MAC address in the form XX:XX:XX:XX:XX:XX where each
 # X is a hexadecimal digit (0-9 or a-f).