static int _ssif_cmd_write (ipmi_ctx_t ctx, uint8_t cmd, uint8_t group_extension, fiid_obj_t obj_cmd_rq) { uint8_t *pkt = NULL; unsigned int pkt_len; int hdr_len, cmd_len, send_len; int rv = -1; assert (ctx && ctx->magic == IPMI_CTX_MAGIC && fiid_obj_valid (obj_cmd_rq)); if ((hdr_len = fiid_template_len_bytes (tmpl_hdr_kcs)) < 0) { API_ERRNO_TO_API_ERRNUM (ctx, errno); goto cleanup; } if ((cmd_len = fiid_obj_len_bytes (obj_cmd_rq)) < 0) { API_FIID_OBJECT_ERROR_TO_API_ERRNUM (ctx, obj_cmd_rq); goto cleanup; } pkt_len = hdr_len + cmd_len; if (!(pkt = malloc (pkt_len))) { API_ERRNO_TO_API_ERRNUM (ctx, errno); goto cleanup; } memset (pkt, '\0', pkt_len); if (fill_hdr_ipmi_kcs (ctx->target.lun, ctx->target.net_fn, ctx->io.inband.rq.obj_hdr) < 0) { API_ERRNO_TO_API_ERRNUM (ctx, errno); goto cleanup; } if ((send_len = assemble_ipmi_kcs_pkt (ctx->io.inband.rq.obj_hdr, obj_cmd_rq, pkt, pkt_len, IPMI_INTERFACE_FLAGS_DEFAULT)) < 0) { API_ERRNO_TO_API_ERRNUM (ctx, errno); goto cleanup; } if (ctx->flags & IPMI_FLAGS_DEBUG_DUMP && send_len) _api_ssif_dump_rq (ctx, pkt, send_len, cmd, ctx->target.net_fn, group_extension, obj_cmd_rq); if (ipmi_ssif_write (ctx->io.inband.ssif_ctx, pkt, send_len) < 0) { API_SSIF_ERRNUM_TO_API_ERRNUM (ctx, ipmi_ssif_ctx_errnum (ctx->io.inband.ssif_ctx)); goto cleanup; } rv = 0; cleanup: free (pkt); return (rv); }
int ipmi_ssif_cmd_api (ipmi_ctx_t ctx, fiid_obj_t obj_cmd_rq, fiid_obj_t obj_cmd_rs) { API_ERR_CTX_CHECK (ctx && ctx->magic == IPMI_CTX_MAGIC); API_ERR_PARAMETERS (fiid_obj_valid(obj_cmd_rq) && fiid_obj_valid(obj_cmd_rs)); API_FIID_OBJ_PACKET_VALID(obj_cmd_rq); API_ERR_INTERNAL_ERROR(ctx->type == IPMI_DEVICE_SSIF); { uint8_t *pkt; uint32_t pkt_len; int32_t hdr_len, cmd_len; API_FIID_TEMPLATE_LEN_BYTES(hdr_len, tmpl_hdr_kcs); API_FIID_OBJ_LEN_BYTES (cmd_len, obj_cmd_rq); pkt_len = hdr_len + cmd_len; pkt = alloca (pkt_len); memset (pkt, 0, pkt_len); API_ERR (pkt); API_ERR (fill_hdr_ipmi_kcs (ctx->lun, ctx->net_fn, ctx->io.inband.rq.obj_hdr) == 0); API_ERR (assemble_ipmi_kcs_pkt (ctx->io.inband.rq.obj_hdr, obj_cmd_rq, pkt, pkt_len) > 0); API_ERR_SSIF (ipmi_ssif_write (ctx->io.inband.ssif_ctx, pkt, pkt_len) != -1); } { uint8_t *pkt; uint32_t pkt_len; ssize_t read_len; int32_t hdr_len, cmd_len; fiid_field_t *tmpl = NULL; int8_t rv = -1; API_FIID_TEMPLATE_LEN_BYTES_CLEANUP(hdr_len, tmpl_hdr_kcs); API_FIID_OBJ_TEMPLATE_CLEANUP(tmpl, obj_cmd_rs); API_FIID_TEMPLATE_LEN_BYTES_CLEANUP(cmd_len, tmpl); pkt_len = hdr_len + cmd_len; API_ERR_CLEANUP ((pkt = alloca (pkt_len))); memset (pkt, 0, pkt_len); API_ERR_SSIF_CLEANUP (!((read_len = ipmi_ssif_read (ctx->io.inband.ssif_ctx, pkt, pkt_len)) < 0)); if (!read_len) API_ERR_SET_ERRNUM_CLEANUP(IPMI_ERR_SYSTEM_ERROR); API_ERR_CLEANUP (!(unassemble_ipmi_kcs_pkt (pkt, read_len, ctx->io.inband.rs.obj_hdr, obj_cmd_rs) < 0)); rv = 0; cleanup: API_FIID_TEMPLATE_FREE(tmpl); if (rv < 0) return (rv); } return (0); }
static int _ipmi_kcs_cmd_write (ipmi_kcs_ctx_t ctx, uint8_t lun, uint8_t net_fn, fiid_obj_t obj_cmd_rq) { uint8_t *pkt = NULL; unsigned int pkt_len; int hdr_len, cmd_len, rv = -1; fiid_obj_t obj_hdr = NULL; assert (ctx); assert (ctx->magic == IPMI_KCS_CTX_MAGIC); assert (IPMI_BMC_LUN_VALID (lun)); assert (IPMI_NET_FN_RQ_VALID (net_fn)); assert (fiid_obj_valid (obj_cmd_rq)); assert (fiid_obj_packet_valid (obj_cmd_rq) == 1); if ((hdr_len = fiid_template_len_bytes (tmpl_hdr_kcs)) < 0) { KCS_ERRNO_TO_KCS_ERRNUM (ctx, errno); goto cleanup; } if ((cmd_len = fiid_obj_len_bytes (obj_cmd_rq)) < 0) { KCS_FIID_OBJECT_ERROR_TO_KCS_ERRNUM (ctx, obj_cmd_rq); goto cleanup; } if (!(obj_hdr = fiid_obj_create (tmpl_hdr_kcs))) { KCS_ERRNO_TO_KCS_ERRNUM (ctx, errno); goto cleanup; } pkt_len = hdr_len + cmd_len; if (!(pkt = (uint8_t *)malloc (pkt_len))) { KCS_SET_ERRNUM (ctx, IPMI_KCS_ERR_OUT_OF_MEMORY); goto cleanup; } if (fill_hdr_ipmi_kcs (lun, net_fn, obj_hdr) < 0) { KCS_SET_ERRNUM (ctx, IPMI_KCS_ERR_INTERNAL_ERROR); goto cleanup; } if (assemble_ipmi_kcs_pkt (obj_hdr, obj_cmd_rq, pkt, pkt_len, IPMI_INTERFACE_FLAGS_DEFAULT) < 0) { KCS_SET_ERRNUM (ctx, IPMI_KCS_ERR_INTERNAL_ERROR); goto cleanup; } if (ipmi_kcs_write (ctx, pkt, pkt_len) < 0) goto cleanup; rv = 0; cleanup: fiid_obj_destroy (obj_hdr); free (pkt); return (rv); }
int32_t ipmi_ssif_cmd_raw_api (ipmi_ctx_t ctx, uint8_t *buf_rq, size_t buf_rq_len, uint8_t *buf_rs, size_t buf_rs_len) { uint8_t *pkt = NULL; uint32_t pkt_len; uint8_t *readbuf = NULL; int32_t bytes_read = 0; int32_t hdr_len; int32_t rv = -1; API_ERR_CTX_CHECK (ctx && ctx->magic == IPMI_CTX_MAGIC); API_ERR_PARAMETERS (buf_rq && buf_rq_len > 0 && buf_rs && buf_rs_len > 0); API_ERR_INTERNAL_ERROR(ctx->type == IPMI_DEVICE_SSIF); API_FIID_TEMPLATE_LEN_BYTES(hdr_len, tmpl_hdr_kcs); pkt_len = hdr_len + buf_rq_len; pkt = alloca(pkt_len); API_ERR (pkt); readbuf = alloca(buf_rs_len); API_ERR (readbuf); API_ERR (fill_hdr_ipmi_kcs (ctx->lun, ctx->net_fn, ctx->io.inband.rq.obj_hdr) == 0); API_FIID_OBJ_GET_ALL(ctx->io.inband.rq.obj_hdr, pkt, pkt_len); memcpy(pkt + hdr_len, buf_rq, buf_rq_len); /* Request Block */ API_ERR_SSIF (ipmi_ssif_write (ctx->io.inband.ssif_ctx, pkt, pkt_len) != -1); /* Response Block */ API_ERR_SSIF ((bytes_read = ipmi_ssif_read (ctx->io.inband.ssif_ctx, readbuf, buf_rs_len)) != -1); if (!bytes_read) { API_ERR_SET_ERRNUM(IPMI_ERR_SYSTEM_ERROR); return -1; } if ((bytes_read - hdr_len) > 0) { memcpy(buf_rs, readbuf + hdr_len, bytes_read - hdr_len); rv = bytes_read - hdr_len; } else rv = 0; return (rv); }