--- /dev/null
+Bottom: 4752ef8a02ea3138fab37b0b02c0d1af3e3bf7a2
+Top: 2dabfe33c4a42a8c11d65c804d0641d900fe1b2e
+Author: Sean Hefty <sean.hefty@intel.com>
+Date: 2011-06-30 12:44:48 -0700
+
+Refresh of counters
+
+---
+
+diff --git a/include/infiniband/acm.h b/include/infiniband/acm.h
+index 7a06161..c2d4088 100644
+--- a/include/infiniband/acm.h
++++ b/include/infiniband/acm.h
+@@ -93,6 +93,12 @@ struct acm_ep_addr_data {
+ union acm_ep_info info;
+ };
+
++/*
++ * Resolve messages with the opcode set to ACM_OP_RESOLVE are only
++ * used to communicate with the local ib_acm service. Message fields
++ * in this case are not byte swapped, but note that the address
++ * data is in big-endian format.
++ */
+ struct acm_resolve_msg {
+ struct acm_hdr hdr;
+ struct acm_ep_addr_data data[0];
+@@ -109,6 +115,9 @@ enum {
+ ACM_MAX_COUNTER
+ };
+
++/*
++ * Performance messages are sent/receive in network byte order.
++ */
+ struct acm_perf_msg {
+ struct acm_hdr hdr;
+ uint64_t data[0];
+diff --git a/src/acm.c b/src/acm.c
+index 5d0e423..fed0440 100644
+--- a/src/acm.c
++++ b/src/acm.c
+@@ -2247,6 +2247,7 @@ static int acm_svr_resolve(struct acm_client *client, struct acm_msg *msg)
+ static int acm_svr_perf_query(struct acm_client *client, struct acm_msg *msg)
+ {
+ int ret, i;
++ uint16_t len;
+
+ acm_log(2, "client %d\n", client->index);
+ msg->hdr.opcode |= ACM_OP_ACK;
+@@ -2254,12 +2255,13 @@ static int acm_svr_perf_query(struct acm_client *client, struct acm_msg *msg)
+ msg->hdr.data[0] = ACM_MAX_COUNTER;
+ msg->hdr.data[1] = 0;
+ msg->hdr.data[2] = 0;
+- msg->hdr.length = ACM_MSG_HDR_LENGTH + (ACM_MAX_COUNTER * sizeof(uint64_t));
++ len = htons(ACM_MSG_HDR_LENGTH + (ACM_MAX_COUNTER * sizeof(uint64_t)));
++ msg->hdr.length = htons(len);
+
+ for (i = 0; i < ACM_MAX_COUNTER; i++)
+- msg->perf_data[i] = (uint64_t) atomic_get(&counter[i]);
++ msg->perf_data[i] = htonll((uint64_t) atomic_get(&counter[i]));
+
+- ret = send(client->sock, (char *) msg, msg->hdr.length, 0);
++ ret = send(client->sock, (char *) msg, len, 0);
+ if (ret != msg->hdr.length)
+ acm_log(0, "ERROR - failed to send response\n");
+ else
+@@ -2268,6 +2270,12 @@ static int acm_svr_perf_query(struct acm_client *client, struct acm_msg *msg)
+ return ret;
+ }
+
++static int acm_msg_length(struct acm_msg *msg)
++{
++ return (msg->hdr.opcode == ACM_OP_RESOLVE) ?
++ msg->hdr.length : ntohs(msg->hdr.length);
++}
++
+ static void acm_svr_receive(struct acm_client *client)
+ {
+ struct acm_msg msg;
+@@ -2275,7 +2283,7 @@ static void acm_svr_receive(struct acm_client *client)
+
+ acm_log(2, "client %d\n", client->index);
+ ret = recv(client->sock, (char *) &msg, sizeof msg, 0);
+- if (ret <= 0 || ret != msg.hdr.length) {
++ if (ret <= 0 || ret != acm_msg_length(&msg)) {
+ acm_log(2, "client disconnected\n");
+ ret = ACM_STATUS_ENOTCONN;
+ goto out;
+diff --git a/src/libacm.c b/src/libacm.c
+index 427fa50..f96760c 100644
+--- a/src/libacm.c
++++ b/src/libacm.c
+@@ -319,21 +319,20 @@ out:
+ int ib_acm_query_perf(uint64_t **counters, int *count)
+ {
+ struct acm_msg msg;
+- struct acm_perf_msg *perf_msg = (struct acm_perf_msg *) &msg;
+- int ret;
++ int ret, i;
+
+ lock_acquire(&lock);
+ memset(&msg, 0, sizeof msg);
+ msg.hdr.version = ACM_VERSION;
+ msg.hdr.opcode = ACM_OP_PERF_QUERY;
+- msg.hdr.length = ACM_MSG_HDR_LENGTH;
++ msg.hdr.length = htons(ACM_MSG_HDR_LENGTH);
+
+ ret = send(sock, (char *) &msg, msg.hdr.length, 0);
+ if (ret != msg.hdr.length)
+ goto out;
+
+ ret = recv(sock, (char *) &msg, sizeof msg, 0);
+- if (ret < ACM_MSG_HDR_LENGTH || ret != msg.hdr.length)
++ if (ret < ACM_MSG_HDR_LENGTH || ret != ntohs(msg.hdr.length))
+ goto out;
+
+ if (msg.hdr.status) {
+@@ -347,8 +346,9 @@ int ib_acm_query_perf(uint64_t **counters, int *count)
+ goto out;
+ }
+
+- memcpy(*counters, perf_msg->data, sizeof(uint64_t) * msg.hdr.data[0]);
+ *count = msg.hdr.data[0];
++ for (i = 0; i < *count; i++)
++ (*counters)[i] = ntohll(msg.perf_data[i]);
+ ret = 0;
+ out:
+ lock_release(&lock);