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)); }
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; }