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
 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
 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.
  *
  * 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"
 
 #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
 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;
 }
               : 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
 .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
 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
           <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>
           <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>