ofproto: Use 64-bit datapath id and management id (OpenFlow 0.9)
authorJustin Pettit <jpettit@nicira.com>
Fri, 13 Nov 2009 21:21:13 +0000 (13:21 -0800)
committerJustin Pettit <jpettit@nicira.com>
Sat, 20 Feb 2010 10:22:27 +0000 (02:22 -0800)
The length of a datapath was changed from 48 bits to 64 bits in OpenFlow
0.9.  For parity, we increased the management id size to match.

NOTE: This is the final commit in the OpenFlow 0.9 set.  Starting with
this commit, OVS is OpenFlow 0.9-compliant.

include/openflow/openflow.h
lib/learning-switch.c
lib/ofp-print.c
lib/packets.c
ofproto/ofproto.c
ofproto/status.c
utilities/ovs-openflowd.8.in
utilities/ovs-openflowd.c

index 60ed8b899c6efd7c30e02cbb83d66ecc952f8727..50fee6eeae8398f7c8fe10ad92b518cd56929370 100644 (file)
@@ -229,8 +229,9 @@ OFP_ASSERT(sizeof(struct ofp_phy_port) == 48);
 /* Switch features. */
 struct ofp_switch_features {
     struct ofp_header header;
-    uint64_t datapath_id;   /* Datapath unique ID.  Only the lower 48-bits
-                               are meaningful. */
+    uint64_t datapath_id;   /* Datapath unique ID.  The lower 48-bits are for 
+                               a MAC address, while the upper 16-bits are
+                               implementer-defined. */
 
     uint32_t n_buffers;     /* Max packets buffered at once. */
 
index 260f5d76abd81055c2a56573a0980b5effd6e8d1..092274cb57dcc365eed6b47e517858576d21abc7 100644 (file)
@@ -156,7 +156,7 @@ lswitch_run(struct lswitch *sw, struct rconn *rconn)
     /* If we're waiting for more replies, keeping waiting for up to 10 s. */
     if (sw->last_reply != LLONG_MIN) {
         if (now - sw->last_reply > 10000) {
-            VLOG_ERR_RL(&rl, "%012llx: No more flow stat replies last 10 s",
+            VLOG_ERR_RL(&rl, "%016llx: No more flow stat replies last 10 s",
                         sw->datapath_id);
             sw->last_reply = LLONG_MIN;
             sw->last_query = LLONG_MIN;
@@ -169,7 +169,7 @@ lswitch_run(struct lswitch *sw, struct rconn *rconn)
     /* If we're waiting for any reply at all, keep waiting for up to 10 s. */
     if (sw->last_query != LLONG_MIN) {
         if (now - sw->last_query > 10000) {
-            VLOG_ERR_RL(&rl, "%012llx: No flow stat replies in last 10 s",
+            VLOG_ERR_RL(&rl, "%016llx: No flow stat replies in last 10 s",
                         sw->datapath_id);
             sw->last_query = LLONG_MIN;
             schedule_query(sw, 0);
@@ -189,7 +189,7 @@ lswitch_run(struct lswitch *sw, struct rconn *rconn)
             struct ofpbuf *b;
             int error;
 
-            VLOG_DBG("%012llx: Sending flow stats request to implement STP",
+            VLOG_DBG("%016llx: Sending flow stats request to implement STP",
                      sw->datapath_id);
 
             sw->last_query = now;
@@ -208,7 +208,7 @@ lswitch_run(struct lswitch *sw, struct rconn *rconn)
 
             error = rconn_send(rconn, b, NULL);
             if (error) {
-                VLOG_WARN_RL(&rl, "%012llx: sending flow stats request "
+                VLOG_WARN_RL(&rl, "%016llx: sending flow stats request "
                              "failed: %s", sw->datapath_id, strerror(error));
                 ofpbuf_delete(b);
                 schedule_query(sw, 1000);
@@ -303,7 +303,7 @@ lswitch_process_packet(struct lswitch *sw, struct rconn *rconn,
     for (p = processors; p < &processors[n_processors]; p++) {
         if (oh->type == p->type) {
             if (msg->size < p->min_size) {
-                VLOG_WARN_RL(&rl, "%012llx: %s: too short (%zu bytes) for "
+                VLOG_WARN_RL(&rl, "%016llx: %s: too short (%zu bytes) for "
                              "type %"PRIu8" (min %zu)", sw->datapath_id,
                              rconn_get_name(rconn), msg->size, oh->type,
                              p->min_size);
@@ -317,7 +317,7 @@ lswitch_process_packet(struct lswitch *sw, struct rconn *rconn,
     }
     if (VLOG_IS_DBG_ENABLED()) {
         char *p = ofp_to_string(msg->data, msg->size, 2);
-        VLOG_DBG_RL(&rl, "%012llx: OpenFlow packet ignored: %s",
+        VLOG_DBG_RL(&rl, "%016llx: OpenFlow packet ignored: %s",
                     sw->datapath_id, p);
         free(p);
     }
@@ -350,10 +350,10 @@ queue_tx(struct lswitch *sw, struct rconn *rconn, struct ofpbuf *b)
     int retval = rconn_send_with_limit(rconn, b, sw->queued, 10);
     if (retval && retval != ENOTCONN) {
         if (retval == EAGAIN) {
-            VLOG_INFO_RL(&rl, "%012llx: %s: tx queue overflow",
+            VLOG_INFO_RL(&rl, "%016llx: %s: tx queue overflow",
                          sw->datapath_id, rconn_get_name(rconn));
         } else {
-            VLOG_WARN_RL(&rl, "%012llx: %s: send: %s",
+            VLOG_WARN_RL(&rl, "%016llx: %s: send: %s",
                          sw->datapath_id, rconn_get_name(rconn),
                          strerror(retval));
         }
@@ -408,7 +408,7 @@ process_packet_in(struct lswitch *sw, struct rconn *rconn, void *opi_)
 
     if (may_learn(sw, in_port) && sw->ml) {
         if (mac_learning_learn(sw->ml, flow.dl_src, 0, in_port)) {
-            VLOG_DBG_RL(&rl, "%012llx: learned that "ETH_ADDR_FMT" is on "
+            VLOG_DBG_RL(&rl, "%016llx: learned that "ETH_ADDR_FMT" is on "
                         "port %"PRIu16, sw->datapath_id,
                         ETH_ADDR_ARGS(flow.dl_src), in_port);
         }
@@ -614,12 +614,12 @@ process_flow_stats(struct lswitch *sw, struct rconn *rconn,
         for (a = ofs->actions; (char *) a < end; a += len / 8) {
             len = ntohs(a->len);
             if (len > end - (char *) a) {
-                VLOG_DBG_RL(&rl, "%012llx: action exceeds available space "
+                VLOG_DBG_RL(&rl, "%016llx: action exceeds available space "
                             "(%zu > %td)",
                             sw->datapath_id, len, end - (char *) a);
                 break;
             } else if (len % 8) {
-                VLOG_DBG_RL(&rl, "%012llx: action length (%zu) not multiple "
+                VLOG_DBG_RL(&rl, "%016llx: action length (%zu) not multiple "
                             "of 8 bytes", sw->datapath_id, len);
                 break;
             }
@@ -665,7 +665,7 @@ process_stats_reply(struct lswitch *sw, struct rconn *rconn, void *osr_)
         process_flow_stats(sw, rconn, fs);
     }
     if (!(osr->flags & htons(OFPSF_REPLY_MORE))) {
-        VLOG_DBG("%012llx: Deleted %d of %d received flows to "
+        VLOG_DBG("%016llx: Deleted %d of %d received flows to "
                  "implement STP, %d because of no-recv, %d because of "
                  "no-send", sw->datapath_id,
                  sw->n_no_recv + sw->n_no_send, sw->n_flows,
index eb6f521ec254a8ee2bb03fcf1301f593648c15a6..04bfe2f1d0fb10cea40e18c46780ffa83f23cd6e 100644 (file)
@@ -552,7 +552,7 @@ ofp_print_switch_features(struct ds *string, const void *oh, size_t len,
     int n_ports;
     int i;
 
-    ds_put_format(string, " ver:0x%x, dpid:%"PRIx64"\n", 
+    ds_put_format(string, " ver:0x%x, dpid:%016"PRIx64"\n", 
             osf->header.version, ntohll(osf->datapath_id));
     ds_put_format(string, "n_tables:%d, n_buffers:%d\n", osf->n_tables,
             ntohl(osf->n_buffers));
index 29c4e7e4a9e3a9bd9820d69fb9afb84f5d6ee8bb..5c51feb1f3d289490de750063c8e9d79214df822 100644 (file)
@@ -23,7 +23,7 @@
 bool
 dpid_from_string(const char *s, uint64_t *dpidp)
 {
-    *dpidp = (strlen(s) == 12 && strspn(s, "0123456789abcdefABCDEF") == 12
+    *dpidp = (strlen(s) == 16 && strspn(s, "0123456789abcdefABCDEF") == 16
               ? strtoll(s, NULL, 16)
               : 0);
     return *dpidp != 0;
index b6b13a15a36af3d04a06e383895c09dfb65163b8..f22c2070c4acb2dc02ac29a50e8c9ec40d5e6e55 100644 (file)
@@ -350,7 +350,7 @@ ofproto_create(const char *datapath, const char *datapath_type,
 
     /* Pick final datapath ID. */
     p->datapath_id = pick_datapath_id(p);
-    VLOG_INFO("using datapath ID %012"PRIx64, p->datapath_id);
+    VLOG_INFO("using datapath ID %016"PRIx64, p->datapath_id);
 
     *ofprotop = p;
     return 0;
@@ -362,7 +362,7 @@ ofproto_set_datapath_id(struct ofproto *p, uint64_t datapath_id)
     uint64_t old_dpid = p->datapath_id;
     p->datapath_id = datapath_id ? datapath_id : pick_datapath_id(p);
     if (p->datapath_id != old_dpid) {
-        VLOG_INFO("datapath ID changed to %012"PRIx64, p->datapath_id);
+        VLOG_INFO("datapath ID changed to %016"PRIx64, p->datapath_id);
         rconn_reconnect(p->controller->rconn);
     }
 }
index 1b13e65cb5d8ba7f9941165dc00f65b1a1e85c70..01cda01a1f498f0cf3beb682ed151a54236bfbb0 100644 (file)
@@ -137,7 +137,7 @@ config_status_cb(struct status_reply *sr, void *ofproto_)
 
     datapath_id = ofproto_get_datapath_id(ofproto);
     if (datapath_id) {
-        status_reply_put(sr, "datapath-id=%"PRIx64, datapath_id);
+        status_reply_put(sr, "datapath-id=%016"PRIx64, datapath_id);
     }
 
     svec_init(&listeners);
index 2441279ed9a821c0ddf453d30ff2d75849ff57c2..f817cf663dba445eb396b8ae3b7056df68d7d557 100644 (file)
@@ -196,13 +196,13 @@ When controller discovery is not performed, this option has no effect.
 .SS "Networking Options"
 .TP
 \fB--datapath-id=\fIdpid\fR
-Sets \fIdpid\fR, which must consist of exactly 12 hexadecimal digits,
+Sets \fIdpid\fR, which must consist of exactly 16 hexadecimal digits,
 as the datapath ID that the switch will use to identify itself to the
 OpenFlow controller.
 
 If this option is omitted, the default datapath ID is taken from the
 Ethernet address of the datapath's local port (which is typically
-randomly generated).
+randomly generated) in the lower 48 bits and zeros in the upper 16.
 
 .TP
 \fB--fail=\fR[\fBopen\fR|\fBclosed\fR]
index 983481af0042af8b56e913eb16ae8c2e34a2fe90..1b8e7ebdffcfb37fffcb412b36fc2e3ec9d12f67 100644 (file)
@@ -333,7 +333,7 @@ parse_options(int argc, char *argv[], struct ofsettings *s)
         case OPT_DATAPATH_ID:
             if (!dpid_from_string(optarg, &s->datapath_id)) {
                 ovs_fatal(0, "argument to --datapath-id must be "
-                          "exactly 12 hex digits and may not be all-zero");
+                          "exactly 16 hex digits and may not be all-zero");
             }
             break;
 
@@ -521,7 +521,7 @@ usage(void)
     vconn_usage(true, true, true);
     printf("\nOpenFlow options:\n"
            "  -d, --datapath-id=ID    Use ID as the OpenFlow switch ID\n"
-           "                          (ID must consist of 12 hex digits)\n"
+           "                          (ID must consist of 16 hex digits)\n"
            "  --manufacturer=MFR      Identify manufacturer as MFR\n"
            "  --hardware=HW           Identify hardware as HW\n"
            "  --software=SW           Identify software as SW\n"