Hello,

Thanks to the help of Kontron guys, here is patch that allows you to fill the SDR repository of a BMC with the built-in sensor SDRs of the BMC and of the sensors of the satellite FRUs.

I don't know if it can be used for other board BMCs (so beware before commiting something ;-), but at least it provides some general purpose commands like:

- adding new (partial) SDRs
- clearing the SDR repository (ok, it can be dangerous)
- adding SDRs from a dumped file.

IMHO another aspect that can be of interest is the ability to read SDRs from repository or from sensors, and overriding the global use_built_in variable.

It can be used like this:

ipmitool sdr fill sensors
ipmitool sdr fill file <filename>

Regards,

--
BenoƮt Guillon                [EMAIL PROTECTED]
TCT/3S                        tel. : 33 (0)4 98 16 33 90

THALES COMPUTERS

diff -Naur ipmitool-1.8.9/include/ipmitool/ipmi_sdradd.h ipmitool-1.8.9.SDRRFill/include/ipmitool/ipmi_sdradd.h
--- ipmitool-1.8.9/include/ipmitool/ipmi_sdradd.h	1970-01-01 01:00:00.000000000 +0100
+++ ipmitool-1.8.9.SDRRFill/include/ipmitool/ipmi_sdradd.h	2007-06-01 19:28:01.000000000 +0200
@@ -0,0 +1,13 @@
+#ifndef IPMI_SDR_H
+#define IPMI_SDR_H
+
+/*
+ * Methods to add SDRs to repository from built-in sensors or files
+ */
+int
+ipmi_sdr_add_from_sensors(struct ipmi_intf *intf, int maxslot);
+
+int
+ipmi_sdr_add_from_file(struct ipmi_intf *intf, const char *ifile);
+
+#endif
diff -Naur ipmitool-1.8.9/include/ipmitool/ipmi_sdr.h ipmitool-1.8.9.SDRRFill/include/ipmitool/ipmi_sdr.h
--- ipmitool-1.8.9/include/ipmitool/ipmi_sdr.h	2007-02-22 09:38:55.000000000 +0100
+++ ipmitool-1.8.9.SDRRFill/include/ipmitool/ipmi_sdr.h	2007-06-01 19:28:28.000000000 +0200
@@ -726,6 +726,7 @@
 	uint16_t reservation;
 	int total;
 	int next;
+	int use_built_in;
 };
 
 struct sdr_record_list {
@@ -791,7 +792,8 @@
 	    "Management Subsystem Health", "Battery","Session Audit",
        "Version Change","FRU State" };
 
-struct ipmi_sdr_iterator *ipmi_sdr_start(struct ipmi_intf *intf);
+struct ipmi_sdr_iterator *ipmi_sdr_start(struct ipmi_intf *intf,
+                                         int use_builtin);
 struct sdr_get_rs *ipmi_sdr_get_next_header(struct ipmi_intf *intf,
 					    struct ipmi_sdr_iterator *i);
 uint8_t *ipmi_sdr_get_record(struct ipmi_intf *intf, struct sdr_get_rs *header,
@@ -824,7 +826,8 @@
 struct ipmi_rs *ipmi_sdr_get_sensor_hysteresis(struct ipmi_intf *intf,
 					       uint8_t sensor);
 const char *ipmi_sdr_get_sensor_type_desc(const uint8_t type);
-int ipmi_sdr_get_reservation(struct ipmi_intf *intf, uint16_t * reserve_id);
+int ipmi_sdr_get_reservation(struct ipmi_intf *intf, int use_builtin,
+                             uint16_t * reserve_id);
 
 int ipmi_sdr_print_sensor_full(struct ipmi_intf *intf,
 			       struct sdr_record_full_sensor *sensor);
diff -Naur ipmitool-1.8.9/lib/ipmi_fru.c ipmitool-1.8.9.SDRRFill/lib/ipmi_fru.c
--- ipmitool-1.8.9/lib/ipmi_fru.c	2007-03-06 23:15:36.000000000 +0100
+++ ipmitool-1.8.9.SDRRFill/lib/ipmi_fru.c	2007-06-01 19:29:18.000000000 +0200
@@ -1435,7 +1435,7 @@
 	rc = ipmi_fru_print(intf, NULL);
 	printf("\n");
 
-	if ((itr = ipmi_sdr_start(intf)) == NULL)
+	if ((itr = ipmi_sdr_start(intf, 0)) == NULL)
 		return -1;
 
 	while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL)
diff -Naur ipmitool-1.8.9/lib/ipmi_sdradd.c ipmitool-1.8.9.SDRRFill/lib/ipmi_sdradd.c
--- ipmitool-1.8.9/lib/ipmi_sdradd.c	1970-01-01 01:00:00.000000000 +0100
+++ ipmitool-1.8.9.SDRRFill/lib/ipmi_sdradd.c	2007-06-01 19:29:33.000000000 +0200
@@ -0,0 +1,380 @@
+/*
+ * Functions to program the SDR repository, from built-in sensors or
+ * from sensors dumped in a binary file.
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <time.h>
+#include <fcntl.h>
+
+#include <ipmitool/helper.h>
+#include <ipmitool/log.h>
+#include <ipmitool/bswap.h>
+#include <ipmitool/ipmi.h>
+#include <ipmitool/ipmi_intf.h>
+#include <ipmitool/ipmi_mc.h>
+#include <ipmitool/ipmi_strings.h>
+
+#include <ipmitool/ipmi_sdr.h>
+
+
+#define ADD_PARTIAL_SDR 0x25
+
+struct sdr_add_rq {
+  uint16_t reserve_id;  /* reservation ID */
+  uint16_t id;          /* record ID */
+  uint8_t offset;       /* offset into SDR */
+  uint8_t in_progress;  /* 0=partial, 1=last */
+#define PARTIAL_ADD (0)
+#define LAST_RECORD (1)
+  uint8_t data[1];      /* SDR record data */
+} __attribute__ ((packed));
+
+static int sdr_max_write_len = 24;
+
+static int
+partial_send(struct ipmi_intf *intf, struct ipmi_rq *req, uint16_t *id)
+{
+  struct ipmi_rs *rsp;
+  rsp = intf->sendrecv(intf, req);
+  if (rsp == NULL) {
+    return -1;
+  }
+
+  if (rsp->ccode || rsp->data_len < 2) {
+    return -1;
+  }
+
+  *id = rsp->data[0] + (rsp->data[1] << 8);
+  return 0;
+}
+
+int
+ipmi_sdr_add_record(struct ipmi_intf *intf, struct sdr_record_list *sdrr)
+{
+  struct ipmi_rq req;
+  struct sdr_add_rq *sdr_rq;
+  uint16_t reserve_id;
+  uint16_t id;
+  int i;
+  int len = sdrr->length;
+  int rc = 0;
+
+  /* actually no SDR to program */
+  if (len < 1 || !sdrr->raw)
+    return 0;
+
+  if (ipmi_sdr_get_reservation(intf, 0, &reserve_id))
+    return -1;
+
+  sdr_rq = (struct sdr_add_rq *)malloc(sizeof(*sdr_rq) + sdr_max_write_len);
+  if (sdr_rq == NULL) {
+    lprintf(LOG_ERR, "ipmitool: malloc failure");
+    return -1;
+  }
+  sdr_rq->reserve_id = reserve_id;
+  sdr_rq->in_progress = PARTIAL_ADD;
+
+  memset(&req, 0, sizeof(req));
+  req.msg.netfn = IPMI_NETFN_STORAGE;
+  req.msg.cmd = ADD_PARTIAL_SDR;
+  req.msg.data = (uint8_t *) sdr_rq;
+
+  /* header first */
+  sdr_rq->id = 0;
+  sdr_rq->offset = 0;
+  sdr_rq->data[0] = sdrr->id & 0xFF;
+  sdr_rq->data[1] = (sdrr->id >> 8) & 0xFF;
+  sdr_rq->data[2] = sdrr->version;
+  sdr_rq->data[3] = sdrr->type;
+  sdr_rq->data[4] = sdrr->length;
+  req.msg.data_len = 5 + sizeof(*sdr_rq) - 1;
+
+  if (partial_send(intf, &req, &id)) {
+    free(sdr_rq);
+    return -1;
+  }
+
+  i = 0;
+
+  /* sdr entry */
+  while (i < len) {
+    int data_len = 0;
+
+    if (len - i < sdr_max_write_len) {
+      /* last crunch */
+      data_len = len - i;
+      sdr_rq->in_progress = LAST_RECORD;
+    } else {
+      data_len = sdr_max_write_len;
+    }
+
+    sdr_rq->id = id;
+    sdr_rq->offset = i + 5;
+    memcpy(sdr_rq->data, sdrr->raw + i, data_len);
+    req.msg.data_len = data_len + sizeof(*sdr_rq) - 1;
+
+    if ((rc = partial_send(intf, &req, &id)) != 0) {
+      break;
+    }
+
+    i += data_len;
+  }
+  free(sdr_rq);
+  return rc;
+}
+
+static int
+ipmi_sdr_repo_clear(struct ipmi_intf *intf)
+{
+  struct ipmi_rs * rsp;
+  struct ipmi_rq req;
+  uint8_t msg_data[8];
+  uint16_t reserve_id;
+  int try;
+
+  if (ipmi_sdr_get_reservation(intf, 0, &reserve_id))
+    return -1;
+
+  memset(&req, 0, sizeof(req));
+  req.msg.netfn = IPMI_NETFN_STORAGE;
+  req.msg.cmd = 0x27; // FIXME
+  req.msg.data = msg_data;
+  req.msg.data_len = 6;
+
+  msg_data[0] = reserve_id & 0xFF;
+  msg_data[1] = reserve_id >> 8;
+  msg_data[2] = 'C';
+  msg_data[3] = 'L';
+  msg_data[4] = 'R';
+  msg_data[5] = 0xAA;
+
+  for (try = 0; try < 5; try++) {
+    rsp = intf->sendrecv(intf, &req);
+    if (rsp == NULL) {
+      lprintf(LOG_ERR, "Unable to clear SDRR");
+      return -1;
+    }
+    if (rsp->ccode > 0) {
+      lprintf(LOG_ERR, "Unable to clear SDRR: %s",
+        val2str(rsp->ccode, completion_code_vals));
+      return -1;
+    }
+    if ((rsp->data[0] & 1) == 1) {
+      printf("SDRR successfully erased\n");
+      return 0;
+    }
+    printf("Wait for SDRR erasure completed...\n");
+    msg_data[5] = 0;
+    sleep(1);
+  }
+    
+  /* if we are here we fed up trying erase */
+  return -1;
+}
+
+
+struct sdrr_queue {
+  struct sdr_record_list *head;
+  struct sdr_record_list *tail;
+}; 
+
+
+/*
+ * Fill the SDR repository from built-in sensors
+ *
+ */
+
+/*
+ * Get all the SDR records stored in <queue>
+ */
+static int
+sdrr_get_records(struct ipmi_intf *intf, struct ipmi_sdr_iterator *itr,
+                 struct sdrr_queue *queue)
+{
+  struct sdr_get_rs *header;
+
+  queue->head = NULL;
+  queue->tail = NULL;
+
+  while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL) {
+    struct sdr_record_list *sdrr;
+
+    sdrr = malloc(sizeof (struct sdr_record_list));
+    if (sdrr == NULL) {
+      lprintf(LOG_ERR, "ipmitool: malloc failure");
+      return -1;
+    }
+    memset(sdrr, 0, sizeof (struct sdr_record_list));
+    sdrr->id = header->id;
+    sdrr->version = header->version;
+    sdrr->type = header->type;
+    sdrr->length = header->length;
+    sdrr->raw = ipmi_sdr_get_record(intf, header, itr);
+
+    /* put in the record queue */
+    if (queue->head == NULL)
+      queue->head = sdrr;
+    else
+      queue->tail->next = sdrr;
+    queue->tail = sdrr;
+  }
+  return 0;
+}
+
+static int
+sdr_copy_to_sdrr(struct ipmi_intf *intf, int use_builtin,
+                 int from_addr, int to_addr)
+{
+  int rc;
+  struct sdrr_queue sdrr_queue;
+  struct ipmi_sdr_iterator *itr;
+  struct sdr_record_list *sdrr;
+  struct sdr_record_list *sdrr_next;
+
+  /* generate list of records for this target */
+  intf->target_addr = from_addr;
+  itr = ipmi_sdr_start(intf, use_builtin);
+  if (itr == 0)
+    return 0;
+
+  printf("Load SDRs from 0x%x\n", from_addr);
+  rc = sdrr_get_records(intf, itr, &sdrr_queue);
+  ipmi_sdr_end(intf, itr);
+
+  /* write the SDRs to the destination SDR Repository */
+  intf->target_addr = to_addr;
+  for (sdrr = sdrr_queue.head; sdrr != NULL; sdrr = sdrr_next) {
+    sdrr_next = sdrr->next;
+    rc = ipmi_sdr_add_record(intf, sdrr);
+    if(rc < 0){
+      lprintf(LOG_ERR, "Cannot add SDR ID 0x%04x to repository...", sdrr->id);
+    }
+    free(sdrr);
+  }
+  return rc;
+}
+
+int
+ipmi_sdr_add_from_sensors(struct ipmi_intf *intf, int maxslot)
+{
+  int i;
+  int rc = 0;
+  int slave_addr;
+  int myaddr = intf->target_addr;
+
+  if (ipmi_sdr_repo_clear(intf)) {
+    lprintf(LOG_ERR, "Cannot erase SDRR. Give up.");
+    return -1;
+  }
+
+  /* First fill the SDRR from local built-in sensors */
+  rc = sdr_copy_to_sdrr(intf, 1, myaddr, myaddr);
+
+  /* Now fill the SDRR with remote sensors */
+  for (i = 0, slave_addr = 0xB0; i < maxslot; i++, slave_addr += 2) {
+    /* Hole in the PICMG 2.9 mapping */
+    if (slave_addr == 0xC2) slave_addr += 2;
+    if(sdr_copy_to_sdrr(intf, 0, slave_addr, myaddr) < 0)
+    {
+      rc = -1;
+    }
+  }
+  return rc;
+}
+
+
+/*
+ * Fill the SDR repository from records stored in a binary file
+ *
+ */
+
+static int
+ipmi_sdr_read_records(const char *filename, struct sdrr_queue *queue)
+{
+  struct sdr_get_rs header;
+  int rc = 0;
+  int fd;
+  queue->head = NULL;
+  queue->tail = NULL;
+  uint8_t binHdr[5];
+
+  if ((fd = open(filename, O_RDONLY)) < 0) {
+    return -1;
+  }
+
+  while (read(fd, binHdr, 5) == 5) {
+    
+    lprintf(LOG_DEBUG, "binHdr[0] (id[MSB]) = 0x%02x", binHdr[0]);
+    lprintf(LOG_DEBUG, "binHdr[1] (id[LSB]) = 0x%02x", binHdr[1]);
+    lprintf(LOG_DEBUG, "binHdr[2] (version) = 0x%02x", binHdr[2]);
+    lprintf(LOG_DEBUG, "binHdr[3] (type) = 0x%02x", binHdr[3]);
+    lprintf(LOG_DEBUG, "binHdr[4] (length) = 0x%02x", binHdr[4]);
+
+    struct sdr_record_list *sdrr;
+    sdrr = malloc(sizeof(*sdrr));
+    if (sdrr == NULL) {
+      lprintf(LOG_ERR, "ipmitool: malloc failure");
+      rc = -1;
+      break;
+    }
+    sdrr->id = (binHdr[0] << 8) | binHdr[1];
+    sdrr->version = binHdr[2];
+    sdrr->type = binHdr[3];
+    sdrr->length = binHdr[4];
+
+    if ((sdrr->raw = malloc(sdrr->length)) == NULL) {
+      lprintf(LOG_ERR, "ipmitool: malloc failure");
+      free(sdrr);
+      rc = -1;
+      break;
+    }
+
+    if (read(fd, sdrr->raw, sdrr->length) != sdrr->length) {
+      lprintf(LOG_ERR, "SDR from '%s' truncated", filename);
+      free(sdrr->raw);
+      free(sdrr);
+      rc = -1;
+      break;
+    }
+
+    /* put in the record queue */
+    if (queue->head == NULL)
+      queue->head = sdrr;
+    else
+      queue->tail->next = sdrr;
+    queue->tail = sdrr;
+  }
+  return rc;
+}
+
+int
+ipmi_sdr_add_from_file(struct ipmi_intf *intf, const char *ifile)
+{
+  int rc;
+  struct sdrr_queue sdrr_queue;
+  struct sdr_record_list *sdrr;
+  struct sdr_record_list *sdrr_next;
+
+  /* read the SDR records from file */
+  rc = ipmi_sdr_read_records(ifile, &sdrr_queue);
+
+  if (ipmi_sdr_repo_clear(intf)) {
+    printf("Cannot erase SDRR. Give up.\n");
+    /* FIXME: free sdr list */
+    return -1;
+  }
+
+  /* write the SDRs to the SDR Repository */
+  for (sdrr = sdrr_queue.head; sdrr != NULL; sdrr = sdrr_next) {
+    sdrr_next = sdrr->next;
+    rc = ipmi_sdr_add_record(intf, sdrr);
+    if(rc < 0){
+      lprintf(LOG_ERR, "Cannot add SDR ID 0x%04x to repository...", sdrr->id);
+    }
+    free(sdrr);
+  }
+  return rc;
+}
+
diff -Naur ipmitool-1.8.9/lib/ipmi_sdr.c ipmitool-1.8.9.SDRRFill/lib/ipmi_sdr.c
--- ipmitool-1.8.9/lib/ipmi_sdr.c	2007-03-06 23:15:37.000000000 +0100
+++ ipmitool-1.8.9.SDRRFill/lib/ipmi_sdr.c	2007-06-01 20:04:41.000000000 +0200
@@ -610,7 +610,7 @@
 	sdr_rq.length = 5;	/* only get the header */
 
 	memset(&req, 0, sizeof (req));
-	if (use_built_in == 0) {
+	if (itr->use_built_in == 0) {
 		req.msg.netfn = IPMI_NETFN_STORAGE;
 		req.msg.cmd = GET_SDR;
 	} else {
@@ -635,8 +635,8 @@
 
 			sleep(rand() & 3);
 
-			if (ipmi_sdr_get_reservation(intf, &(itr->reservation))
-			    < 0) {
+			if (ipmi_sdr_get_reservation(intf, itr->use_built_in, 
+                                      &(itr->reservation)) < 0) {
 				lprintf(LOG_ERR,
 					"Unable to renew SDR reservation");
 				return NULL;
@@ -2348,7 +2348,7 @@
 	lprintf(LOG_DEBUG, "Querying SDR for sensor list");
 
 	if (sdr_list_itr == NULL) {
-		sdr_list_itr = ipmi_sdr_start(intf);
+		sdr_list_itr = ipmi_sdr_start(intf, 0);
 		if (sdr_list_itr == NULL) {
 			lprintf(LOG_ERR, "Unable to open SDR for reading");
 			return -1;
@@ -2449,7 +2449,8 @@
  * returns -1 on error
  */
 int
-ipmi_sdr_get_reservation(struct ipmi_intf *intf, uint16_t * reserve_id)
+ipmi_sdr_get_reservation(struct ipmi_intf *intf, int use_builtin,
+                         uint16_t * reserve_id)
 {
 	struct ipmi_rs *rsp;
 	struct ipmi_rq req;
@@ -2457,7 +2458,7 @@
 	/* obtain reservation ID */
 	memset(&req, 0, sizeof (req));
 
-	if (use_built_in == 0) {
+	if (use_builtin == 0) {
 		req.msg.netfn = IPMI_NETFN_STORAGE;
 	} else {
 		req.msg.netfn = IPMI_NETFN_SE;
@@ -2486,7 +2487,7 @@
  * returns NULL on error
  */
 struct ipmi_sdr_iterator *
-ipmi_sdr_start(struct ipmi_intf *intf)
+ipmi_sdr_start(struct ipmi_intf *intf, int use_builtin)
 {
 	struct ipmi_sdr_iterator *itr;
 	struct ipmi_rs *rsp;
@@ -2513,11 +2514,15 @@
 		free(itr);
 		return NULL;
 	}
+	if (rsp->ccode > 0) {
+		free(itr);
+		return NULL;
+	}
 	devid = (struct ipm_devid_rsp *) rsp->data;
 
    sdriana =  (long)IPM_DEV_MANUFACTURER_ID(devid->manufacturer_id);
 
-	if (devid->device_revision & IPM_DEV_DEVICE_ID_SDR_MASK) {
+	if (!use_builtin && (devid->device_revision & IPM_DEV_DEVICE_ID_SDR_MASK)) {
 		if ((devid->adtl_device_support & 0x02) == 0) {
 			if ((devid->adtl_device_support & 0x01)) {
 				lprintf(LOG_DEBUG, "Using Device SDRs\n");
@@ -2531,8 +2536,9 @@
 			lprintf(LOG_DEBUG, "Using SDR from Repository \n");
 		}
 	}
+	itr->use_built_in = use_builtin ? 1 : use_built_in;
    /***********************/
-	if (use_built_in == 0) {
+	if (itr->use_built_in == 0) {
 		struct sdr_repo_info_rs sdr_info;
 		/* get sdr repository info */
 		memset(&req, 0, sizeof (req));
@@ -2589,7 +2595,8 @@
 		lprintf(LOG_DEBUG, "SDR records   : %d", sdr_info.count);
 	}
 
-	if (ipmi_sdr_get_reservation(intf, &(itr->reservation)) < 0) {
+	if (ipmi_sdr_get_reservation(intf, itr->use_built_in, 
+                                &(itr->reservation)) < 0) {
 		lprintf(LOG_ERR, "Unable to obtain SDR reservation");
 		free(itr);
 		return NULL;
@@ -2633,7 +2640,7 @@
 	sdr_rq.offset = 0;
 
 	memset(&req, 0, sizeof (req));
-	if (use_built_in == 0) {
+	if (itr->use_built_in == 0) {
 		req.msg.netfn = IPMI_NETFN_STORAGE;
 		req.msg.cmd = GET_SDR;
 	} else {
@@ -2673,8 +2680,8 @@
 
 			sleep(rand() & 3);
 
-			if (ipmi_sdr_get_reservation(intf, &(itr->reservation))
-			    < 0) {
+			if (ipmi_sdr_get_reservation(intf, itr->use_built_in,
+                                      &(itr->reservation)) < 0) {
 				free(data);
 				return NULL;
 			}
@@ -2829,7 +2836,7 @@
 	int found = 0;
 
 	if (sdr_list_itr == NULL) {
-		sdr_list_itr = ipmi_sdr_start(intf);
+		sdr_list_itr = ipmi_sdr_start(intf, 0);
 		if (sdr_list_itr == NULL) {
 			lprintf(LOG_ERR, "Unable to open SDR for reading");
 			return NULL;
@@ -2956,7 +2963,7 @@
 	memset(head, 0, sizeof (struct sdr_record_list));
 
 	if (sdr_list_itr == NULL) {
-		sdr_list_itr = ipmi_sdr_start(intf);
+		sdr_list_itr = ipmi_sdr_start(intf, 0);
 		if (sdr_list_itr == NULL) {
 			lprintf(LOG_ERR, "Unable to open SDR for reading");
 			return NULL;
@@ -3074,7 +3081,7 @@
 	memset(head, 0, sizeof (struct sdr_record_list));
 
 	if (sdr_list_itr == NULL) {
-		sdr_list_itr = ipmi_sdr_start(intf);
+		sdr_list_itr = ipmi_sdr_start(intf, 0);
 		if (sdr_list_itr == NULL) {
 			lprintf(LOG_ERR, "Unable to open SDR for reading");
 			return NULL;
@@ -3258,7 +3265,7 @@
 	memset(head, 0, sizeof (struct sdr_record_list));
 
 	if (sdr_list_itr == NULL) {
-		sdr_list_itr = ipmi_sdr_start(intf);
+		sdr_list_itr = ipmi_sdr_start(intf, 0);
 		if (sdr_list_itr == NULL) {
 			lprintf(LOG_ERR, "Unable to open SDR for reading");
 			return NULL;
@@ -3359,7 +3366,7 @@
 	idlen = strlen(id);
 
 	if (sdr_list_itr == NULL) {
-		sdr_list_itr = ipmi_sdr_start(intf);
+		sdr_list_itr = ipmi_sdr_start(intf, 0);
 		if (sdr_list_itr == NULL) {
 			lprintf(LOG_ERR, "Unable to open SDR for reading");
 			return NULL;
@@ -3668,7 +3675,7 @@
 	struct sdr_get_rs *header;
 
 	if (sdr_list_itr == NULL) {
-		sdr_list_itr = ipmi_sdr_start(intf);
+		sdr_list_itr = ipmi_sdr_start(intf, 0);
 		if (sdr_list_itr == NULL) {
 			lprintf(LOG_ERR, "Unable to open SDR for reading");
 			return -1;
@@ -3918,7 +3925,7 @@
 	int rc = 0;
 
 	/* open connection to SDR */
-	itr = ipmi_sdr_start(intf);
+	itr = ipmi_sdr_start(intf, 0);
 	if (itr == NULL) {
 		lprintf(LOG_ERR, "Unable to open SDR for reading");
 		return -1;
@@ -4181,24 +4188,24 @@
 		lprintf(LOG_ERR,
 			"SDR Commands:  list | elist [all|full|compact|event|mcloc|fru|generic]");
 		lprintf(LOG_ERR,
-			"                     all        All SDR Records");
+			"                     all           All SDR Records");
 		lprintf(LOG_ERR,
-			"                     full       Full Sensor Record");
+			"                     full          Full Sensor Record");
 		lprintf(LOG_ERR,
-			"                     compact    Compact Sensor Record");
+			"                     compact       Compact Sensor Record");
 		lprintf(LOG_ERR,
-			"                     event      Event-Only Sensor Record");
+			"                     event         Event-Only Sensor Record");
 		lprintf(LOG_ERR,
-			"                     mcloc      Management Controller Locator Record");
+			"                     mcloc         Management Controller Locator Record");
 		lprintf(LOG_ERR,
-			"                     fru        FRU Locator Record");
+			"                     fru           FRU Locator Record");
 		lprintf(LOG_ERR,
-			"                     generic    Generic Device Locator Record");
+			"                     generic       Generic Device Locator Record");
 		lprintf(LOG_ERR, "               type [sensor type]");
 		lprintf(LOG_ERR,
-			"                     list       Get a list of available sensor types");
+			"                     list          Get a list of available sensor types");
 		lprintf(LOG_ERR,
-			"                     get        Retrieve the state of a specified sensor");
+			"                     get           Retrieve the state of a specified sensor");
 
 		lprintf(LOG_ERR, "               info");
 		lprintf(LOG_ERR,
@@ -4209,6 +4216,11 @@
 		lprintf(LOG_ERR, "               dump <file>");
 		lprintf(LOG_ERR,
 			"                     Dump raw SDR data to a file");
+		lprintf(LOG_ERR, "               fill");
+		lprintf(LOG_ERR,
+			"                     sensors       Creates the SDR repository for the current configuration");
+		lprintf(LOG_ERR,
+			"                     file <file>   Load SDR repository from a file");
 	} else if (strncmp(argv[0], "list", 4) == 0
 		   || strncmp(argv[0], "elist", 5) == 0) {
 
@@ -4257,6 +4269,21 @@
 			lprintf(LOG_ERR, "usage: sdr dump <filename>");
 		else
 			rc = ipmi_sdr_dump_bin(intf, argv[1]);
+	} else if (strncmp(argv[0], "fill", 3) == 0) {
+		if (argc <= 1) {
+			lprintf(LOG_ERR, "usage: sdr fill sensors");
+			lprintf(LOG_ERR, "usage: sdr fill file <filename>");
+			rc = -1;
+		} else if (strncmp(argv[1], "sensors", 7) == 0) {
+			rc = ipmi_sdr_add_from_sensors(intf, 21);
+		} else if (strncmp(argv[1], "file", 4) == 0) {
+         if (argc < 3) {
+			  lprintf(LOG_ERR, "sdr fill: Missing filename");
+           rc = -1;
+         } else {
+			  rc = ipmi_sdr_add_from_file(intf, argv[2]);
+         }
+      }
 	} else {
 		lprintf(LOG_ERR, "Invalid SDR command: %s", argv[0]);
 		rc = -1;
diff -Naur ipmitool-1.8.9/lib/ipmi_sensor.c ipmitool-1.8.9.SDRRFill/lib/ipmi_sensor.c
--- ipmitool-1.8.9/lib/ipmi_sensor.c	2007-02-22 09:38:57.000000000 +0100
+++ ipmitool-1.8.9.SDRRFill/lib/ipmi_sensor.c	2007-06-01 19:30:10.000000000 +0200
@@ -496,7 +496,7 @@
 
 	lprintf(LOG_DEBUG, "Querying SDR for sensor list");
 
-	itr = ipmi_sdr_start(intf);
+	itr = ipmi_sdr_start(intf, 0);
 	if (itr == NULL) {
 		lprintf(LOG_ERR, "Unable to open SDR for reading");
 		return -1;
diff -Naur ipmitool-1.8.9/lib/Makefile.am ipmitool-1.8.9.SDRRFill/lib/Makefile.am
--- ipmitool-1.8.9/lib/Makefile.am	2007-02-22 09:38:56.000000000 +0100
+++ ipmitool-1.8.9.SDRRFill/lib/Makefile.am	2007-06-01 19:47:18.000000000 +0200
@@ -38,7 +38,7 @@
 				  ipmi_session.c ipmi_strings.c ipmi_user.c ipmi_raw.c             \
 				  ipmi_oem.c ipmi_isol.c ipmi_sunoem.c ipmi_fwum.c ipmi_picmg.c    \
 				  ipmi_main.c ipmi_tsol.c ipmi_firewall.c ipmi_kontronoem.c        \
-          ipmi_hpmfwupg.c
+          ipmi_hpmfwupg.c ipmi_sdradd.c
 
 libipmitool_la_LDFLAGS		= -export-dynamic
 libipmitool_la_LIBADD		= -lm
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Ipmitool-devel mailing list
Ipmitool-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel

Reply via email to