From: Justin Pettit Date: Fri, 13 Nov 2009 21:21:13 +0000 (-0800) Subject: ofproto: Use 64-bit datapath id and management id (OpenFlow 0.9) X-Git-Tag: v1.0.0~259^2~106 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=b123cc3ce4972378a5e564a89b8945473f561578;p=sliver-openvswitch.git ofproto: Use 64-bit datapath id and management id (OpenFlow 0.9) 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. --- diff --git a/include/openflow/openflow.h b/include/openflow/openflow.h index 60ed8b899..50fee6eea 100644 --- a/include/openflow/openflow.h +++ b/include/openflow/openflow.h @@ -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. */ diff --git a/lib/learning-switch.c b/lib/learning-switch.c index 260f5d76a..092274cb5 100644 --- a/lib/learning-switch.c +++ b/lib/learning-switch.c @@ -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, diff --git a/lib/ofp-print.c b/lib/ofp-print.c index eb6f521ec..04bfe2f1d 100644 --- a/lib/ofp-print.c +++ b/lib/ofp-print.c @@ -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)); diff --git a/lib/packets.c b/lib/packets.c index 29c4e7e4a..5c51feb1f 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -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; diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index b6b13a15a..f22c2070c 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -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); } } diff --git a/ofproto/status.c b/ofproto/status.c index 1b13e65cb..01cda01a1 100644 --- a/ofproto/status.c +++ b/ofproto/status.c @@ -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); diff --git a/utilities/ovs-openflowd.8.in b/utilities/ovs-openflowd.8.in index 2441279ed..f817cf663 100644 --- a/utilities/ovs-openflowd.8.in +++ b/utilities/ovs-openflowd.8.in @@ -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] diff --git a/utilities/ovs-openflowd.c b/utilities/ovs-openflowd.c index 983481af0..1b8e7ebdf 100644 --- a/utilities/ovs-openflowd.c +++ b/utilities/ovs-openflowd.c @@ -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"