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 60ed8b8..50fee6e 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 260f5d7..092274c 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 eb6f521..04bfe2f 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 29c4e7e..5c51feb 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 b6b13a1..f22c207 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 1b13e65..01cda01 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 2441279..f817cf6 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 983481a..1b8e7eb 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"