static int flashnode_fill_isid(struct flashnode_rec *fnode, struct iovec *iov) { struct iscsi_flashnode_param_info *fnode_param; struct nlattr *attr; int len; uint8_t isid[6]; len = sizeof(struct iscsi_flashnode_param_info) + 6; iov->iov_base = iscsi_nla_alloc(ISCSI_FLASHNODE_ISID, len); if (!iov->iov_base) return 1; attr = iov->iov_base; iov->iov_len = NLA_ALIGN(attr->nla_len); fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); fnode_param->param = ISCSI_FLASHNODE_ISID; fnode_param->len = 6; sscanf(fnode->sess.isid, "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx", &isid[0], &isid[1], &isid[2], &isid[3], &isid[4], &isid[5]); memcpy(fnode_param->value, isid, fnode_param->len); return 0; }
static int chap_fill_param_uint(struct iovec *iov, int param, uint32_t param_val, int param_len) { struct iscsi_param_info *param_info; struct nlattr *attr; int len; uint8_t val8 = 0; uint16_t val16 = 0; uint32_t val32 = 0; char *val = NULL; len = sizeof(struct iscsi_param_info) + param_len; iov->iov_base = iscsi_nla_alloc(param, len); if (!iov->iov_base) return 1; attr = iov->iov_base; iov->iov_len = NLA_ALIGN(attr->nla_len); param_info = (struct iscsi_param_info *)ISCSI_NLA_DATA(attr); param_info->param = param; param_info->len = param_len; switch (param_len) { case 1: val8 = (uint8_t)param_val; val = (char *)&val8; break; case 2: val16 = (uint16_t)param_val; val = (char *)&val16; break; case 4: val32 = (uint32_t)param_val; val = (char *)&val32; break; default: goto free; } memcpy(param_info->value, val, param_len); return 0; free: free(iov->iov_base); iov->iov_base = NULL; iov->iov_len = 0; return 1; }
static int flashnode_fill_ipv6_addr(struct flashnode_rec *fnode, struct iovec *iov, int param_type) { struct iscsi_flashnode_param_info *fnode_param; struct nlattr *attr; int len; int rc; len = sizeof(struct iscsi_flashnode_param_info) + 16; iov->iov_base = iscsi_nla_alloc(param_type, len); if (!iov->iov_base) return 1; attr = iov->iov_base; iov->iov_len = NLA_ALIGN(attr->nla_len); fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); fnode_param->param = param_type; fnode_param->len = 16; switch (param_type) { case ISCSI_FLASHNODE_IPADDR: rc = inet_pton(AF_INET6, (char *)fnode->conn[0].ipaddress, fnode_param->value); break; case ISCSI_FLASHNODE_REDIRECT_IPADDR: rc = inet_pton(AF_INET6, (char *)fnode->conn[0].redirect_ipaddr, fnode_param->value); break; case ISCSI_FLASHNODE_LINK_LOCAL_IPV6: rc = inet_pton(AF_INET6, (char *)fnode->conn[0].link_local_ipv6, fnode_param->value); break; default: goto free; } if (rc <= 0) goto free; return 0; free: free(iov->iov_base); iov->iov_base = NULL; iov->iov_len = 0; return 1; }
static int flashnode_fill_str(struct flashnode_rec *fnode, struct iovec *iov, int param_type, char *buf, int buflen) { struct iscsi_flashnode_param_info *fnode_param; struct nlattr *attr; int len; len = sizeof(struct iscsi_flashnode_param_info) + buflen; iov->iov_base = iscsi_nla_alloc(param_type, len); if (!iov->iov_base) return 1; attr = iov->iov_base; iov->iov_len = NLA_ALIGN(attr->nla_len); fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); fnode_param->param = param_type; fnode_param->len = buflen; memcpy(fnode_param->value, buf, fnode_param->len); return 0; }
static int flashnode_fill_uint8(struct flashnode_rec *fnode, struct iovec *iov, int param_type, uint8_t val) { struct iscsi_flashnode_param_info *fnode_param; struct nlattr *attr; int len; len = sizeof(struct iscsi_flashnode_param_info) + 1; iov->iov_base = iscsi_nla_alloc(param_type, len); if (!iov->iov_base) return 1; attr = iov->iov_base; iov->iov_len = NLA_ALIGN(attr->nla_len); fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); fnode_param->param = param_type; fnode_param->len = 1; fnode_param->value[0] = val; return 0; }
static int chap_fill_param_str(struct iovec *iov, int param, char *param_val, int param_len) { struct iscsi_param_info *param_info; struct nlattr *attr; int len; len = sizeof(struct iscsi_param_info) + param_len; iov->iov_base = iscsi_nla_alloc(param, len); if (!iov->iov_base) return 1; attr = iov->iov_base; iov->iov_len = NLA_ALIGN(attr->nla_len); param_info = (struct iscsi_param_info *)ISCSI_NLA_DATA(attr); param_info->param = param; param_info->len = param_len; memcpy(param_info->value, param_val, param_len); return 0; }