[openib-general] [PATCH 10/12] SRP: Changing ibsrpdm
Ishai Rabinovitz
ishai at mellanox.co.il
Mon May 1 04:30:45 PDT 2006
Add a function send_and_get that handles the communication and retries.
Reduce redundancy.
Increment TID on retry.
Bound the number of retries.
Signed-off-by: Ishai Rabinovitz <ishai at mellanox.co.il>
Index: last_stable/src/userspace/srptools/src/srp-dm.c
===================================================================
--- last_stable.orig/src/userspace/srptools/src/srp-dm.c 2006-04-21 01:35:10.000000000 +0300
+++ last_stable/src/userspace/srptools/src/srp-dm.c 2006-04-21 01:41:28.000000000 +0300
@@ -85,6 +85,36 @@ static void usage(const char *argv0)
fprintf(stderr, "Usage: %s [-vc] [-d <umad device>]\n", argv0);
}
+#define NUM_OF_RETRIES 3
+int send_and_get(int fd, struct ib_user_mad *out_mad,
+ struct ib_user_mad *in_mad, long in_mad_size)
+{
+ int i, len, in_mad_real_size;
+ struct srp_dm_mad *out_dm_mad;
+
+ in_mad_real_size = (in_mad_size ? in_mad_size : sizeof(struct ib_user_mad));
+ for (i = 0; i < NUM_OF_RETRIES; ++i)
+ {
+ len = write(fd, out_mad, sizeof(struct ib_user_mad));
+ if (len != sizeof(struct ib_user_mad)) {
+ fprintf(stderr, "write: %s\n", strerror(errno));
+ return -1;
+ }
+
+ len = read(fd, in_mad, in_mad_real_size);
+ if ((in_mad_size == 0 && len == in_mad_real_size) ||
+ (in_mad_size != 0 && len > 0))
+ return len;
+ else if (in_mad->hdr.status != ETIMEDOUT) {
+ fprintf(stderr, "%s/%d: read: %s\n", __func__, __LINE__, strerror(errno));
+ return -1;
+ }
+ out_dm_mad = (void *) out_mad->data;
+ ((uint32_t *) &out_dm_mad->tid)[1] = tid++;
+ }
+ return -1;
+}
+
static int read_file(const char *dir, const char *file, char *buf, size_t size)
{
char *path;
@@ -234,19 +264,8 @@ static int set_class_port_info(int fd, u
((uint16_t *) cpi->trap_gid)[i] = htons(strtol(val + i * 5, NULL, 16));
}
-again:
- if (write(fd, &out_mad, sizeof out_mad) != sizeof out_mad) {
- perror("write");
+ if (send_and_get(fd, &out_mad, &in_mad, 0) < 0)
return -1;
- }
-
- if (read(fd, &in_mad, sizeof in_mad) != sizeof in_mad) {
- if (in_mad.hdr.status == ETIMEDOUT)
- goto again;
- fprintf(stderr, "%s/%d: ", __func__, __LINE__);
- perror("read");
- return -1;
- }
in_dm_mad = (void *) in_mad.data;
if (in_dm_mad->status) {
@@ -266,19 +285,8 @@ static int get_iou_info(int fd, uint32_t
init_srp_dm_mad(&out_mad, agent[1], dlid, SRP_DM_ATTR_IO_UNIT_INFO, 0);
-again:
- if (write(fd, &out_mad, sizeof out_mad) != sizeof out_mad) {
- perror("write");
- return -1;
- }
-
- if (read(fd, &in_mad, sizeof in_mad) != sizeof in_mad) {
- if (in_mad.hdr.status == ETIMEDOUT)
- goto again;
- fprintf(stderr, "%s/%d: ", __func__, __LINE__);
- perror("read");
+ if (send_and_get(fd, &out_mad, &in_mad, 0) < 0)
return -1;
- }
in_dm_mad = (void *) in_mad.data;
if (in_dm_mad->status) {
@@ -300,19 +308,8 @@ static int get_ioc_prof(int fd, uint32_t
init_srp_dm_mad(&out_mad, agent[1], dlid, SRP_DM_ATTR_IO_CONTROLLER_PROFILE, ioc);
-again:
- if (write(fd, &out_mad, sizeof out_mad) != sizeof out_mad) {
- perror("write");
+ if (send_and_get(fd, &out_mad, &in_mad, 0) < 0)
return -1;
- }
-
- if (read(fd, &in_mad, sizeof in_mad) != sizeof in_mad) {
- if (in_mad.hdr.status == ETIMEDOUT)
- goto again;
- fprintf(stderr, "%s/%d: ", __func__, __LINE__);
- perror("read");
- return -1;
- }
if (in_mad.hdr.status != 0) {
fprintf(stderr, "IO Controller Profile query timed out\n");
@@ -340,19 +337,8 @@ static int get_svc_entries(int fd, uint3
init_srp_dm_mad(&out_mad, agent[1], dlid, SRP_DM_ATTR_SERVICE_ENTRIES,
(ioc << 16) | (end << 8) | start);
-again:
- if (write(fd, &out_mad, sizeof out_mad) != sizeof out_mad) {
- perror("write");
+ if (send_and_get(fd, &out_mad, &in_mad, 0) < 0)
return -1;
- }
-
- if (read(fd, &in_mad, sizeof in_mad) != sizeof in_mad) {
- if (in_mad.hdr.status == ETIMEDOUT)
- goto again;
- fprintf(stderr, "%s/%d: ", __func__, __LINE__);
- perror("read");
- return -1;
- }
if (in_mad.hdr.status != 0) {
fprintf(stderr, "Service Entries query timed out\n");
@@ -486,20 +472,8 @@ static int get_port_info(int fd, uint32_
port_info = (void *) out_sa_mad->data;
port_info->endport_lid = htons(dlid);
-again:
- if (write(fd, &out_mad, sizeof out_mad) != sizeof out_mad) {
- perror("write");
- return -1;
- }
-
- if (read(fd, &in_mad, sizeof in_mad) != sizeof in_mad) {
- if (in_mad.hdr.status == ETIMEDOUT)
- goto again;
-
- fprintf(stderr, "%s/%d: ", __func__, __LINE__);
- perror("read");
+ if (send_and_get(fd, &out_mad, &in_mad, 0) < 0)
return -1;
- }
port_info = (void *) in_sa_mad->data;
*subnet_prefix = ntohll(port_info->subnet_prefix);
@@ -542,21 +516,8 @@ static int get_port_list(int fd, uint32_
node = (void *) out_sa_mad->data;
node->type = 1; /* CA */
-again:
- if (write(fd, &out_mad, sizeof out_mad) != sizeof out_mad) {
- perror("write");
+ if ((len = send_and_get(fd, &out_mad, in_mad, SIZE_OF_QUERY_RESPONSE)) < 0)
return -1;
- }
-
- len = read(fd, in_mad, SIZE_OF_QUERY_RESPONSE);
- if (len < 0) {
- fprintf(stderr, "%s/%d: ", __func__, __LINE__);
- perror("read");
- return -1;
- }
-
- if (in_mad->hdr.status == ETIMEDOUT)
- goto again;
size = ntohs(in_sa_mad->attr_offset) * 8;
--
Ishai Rabinovitz
More information about the general
mailing list