예제 #1
0
int IP_send(mic_tcp_pdu pk, mic_tcp_sock_addr addr)
{
    if(initialized == -1) return -1;
    if(stm == SERVER) usleep(RTT);
    if(loss_rate == 0)
    {
        mic_tcp_payload tmp = get_full_stream(pk);        
        int sent_size =  full_send(tmp);
        
        free (tmp.data);
        
        return sent_size;             
    }
    else return partial_send(get_full_stream(pk));
}
예제 #2
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) {
    lprintf(LOG_ERR, "ipmitool: bad record , skipped");
    return 0;
  }

  if (ipmi_sdr_get_reservation(intf, 0, &reserve_id)) {
    lprintf(LOG_ERR, "ipmitool: reservation failed");
    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)) {
     lprintf(LOG_ERR, "ipmitool: partial send error");
    free(sdr_rq);
    sdr_rq = NULL;
    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) {
       lprintf(LOG_ERR, "ipmitool: partial add failed");
      break;
    }

    i += data_len;
  }

  free(sdr_rq);
  sdr_rq = NULL;
  return rc;
}