Fix bug in parsing large datapath IDs.
authorBen Pfaff <blp@nicira.com>
Thu, 21 Oct 2010 17:40:05 +0000 (10:40 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 21 Oct 2010 17:40:20 +0000 (10:40 -0700)
Datapath IDs are unsigned, but dpid_from_string() was parsing them as
signed integers, which caused high values to be capped at INT64_MAX.

Also, document that datapath IDs may not be all-zero.

Reported-by: Pankaj Thakkar <thakkar@nicira.com>
Reported-by: Teemu Koponen <koponen@nicira.com>
AUTHORS
lib/packets.c
utilities/ovs-openflowd.8.in
vswitchd/vswitch.xml

diff --git a/AUTHORS b/AUTHORS
index 9adaa6d..6a81668 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -49,6 +49,7 @@ Joan Cirer              joan@ev0.net
 John Galgay             john@galgay.net
 Luiz Henrique Ozaki     luiz.ozaki@gmail.com
 Michael Mao             mmao@nicira.com
+Pankaj Thakkar          thakkar@nicira.com
 Paulo Cravero           pcravero@as2594.net
 Peter Balland           peter@nicira.com
 Ram Jothikumar          rjothikumar@nicira.com
index 5c51feb..2dc82fe 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009 Nicira Networks.
+ * Copyright (c) 2009, 2010 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include <stdlib.h>
 #include "ofpbuf.h"
 
+/* Parses 's' as a 16-digit hexadecimal number representing a datapath ID.  On
+ * success stores the dpid into '*dpidp' and returns true, on failure stores 0
+ * into '*dpidp' and returns false.
+ *
+ * Rejects an all-zeros dpid as invalid. */
 bool
 dpid_from_string(const char *s, uint64_t *dpidp)
 {
     *dpidp = (strlen(s) == 16 && strspn(s, "0123456789abcdefABCDEF") == 16
-              ? strtoll(s, NULL, 16)
+              ? strtoull(s, NULL, 16)
               : 0);
     return *dpidp != 0;
 }
index 30b3705..176459c 100644 (file)
@@ -173,7 +173,8 @@ the local port network device, and start the DHCP client afterward.
 .SS "OpenFlow Options"
 .TP
 \fB\-\-datapath\-id=\fIdpid\fR
-Sets \fIdpid\fR, which must consist of exactly 16 hexadecimal digits,
+Sets \fIdpid\fR, which must consist of exactly 16 hexadecimal digits
+and may not be all-zero,
 as the datapath ID that the switch will use to identify itself to
 OpenFlow controllers.
 .IP
index 74ac277..c9a6e57 100644 (file)
           <dt><code>datapath-id</code></dt>
           <dd>Exactly 16 hex
             digits to set the OpenFlow datapath ID to a specific
-            value.</dd>
+            value.  May not be all-zero.</dd>
           <dt><code>disable-in-band</code></dt>
           <dd>If set to <code>true</code>, disable in-band control on 
             the bridge regardless of controller and manager settings.</dd>