STATIC void mod_pdu(pdu_t *pdu, iscsi_pdu_mod_t *mp) { int add = mp->flags & ISCSITEST_MOD_FLAG_ADD_VAL; int64_t val = *((int64_t *) mp->value); uint8_t *ptr; int len; switch (mp->offset) { case ISCSITEST_OFFSET_DATADIGEST: ptr = (uint8_t *) &pdu->data_digest; len = sizeof(pdu->data_digest); break; case ISCSITEST_OFFSET_HEADERDIGEST: ptr = (uint8_t *) &pdu->pdu.HeaderDigest; len = sizeof(pdu->pdu.HeaderDigest); break; case ISCSITEST_OFFSET_DATA: if ((len = pdu->io_vec[1].iov_len) == 0) return; ptr = pdu->io_vec[1].iov_base; break; case ISCSITEST_OFFSET_DRV_CMDSN: ptr = (uint8_t *) &pdu->connection->session->CmdSN; len = sizeof(pdu->connection->session->CmdSN); break; default: if (find_pdu_offset(pdu, mp->offset, &ptr, &len)) return; break; } len = min(len, mp->size); DEB(1, ("mod_pdu: mpoff=%d, size=%d, len=%d, val=%qx, *ptr=%qx\n", mp->offset, mp->size, len, val, *((uint64_t *) ptr))); if (!add) { if (mp->flags & ISCSITEST_MOD_FLAG_REORDER) val = htonq(val); memcpy(ptr, &val, len); } else if (len == mp->size) { switch (len) { case 1: *ptr += *mp->value; break; case 2: val += (int64_t) (ntohs(*((uint16_t *) ptr))); *((uint16_t *) ptr) = htons((uint16_t) val); break; case 3: val += (int64_t) (ntoh3(ptr)); hton3((uint32_t) val, ptr); break; case 4: val += (int64_t) (ntohl(*((uint32_t *) ptr))); *((uint32_t *) ptr) = htonl((uint32_t) val); break; case 8: val += ntohq(*((uint64_t *) ptr)); *((uint64_t *) ptr) = htonq(val); break; default: break; } } DEB(1, ("mod_pdu: *ptr=%qx\n", *((uint64_t *) ptr))); }
Slice::Slice(char *data) : pos(ntoh5(data)), len(ntoh3(data + 5)) { assert(pos > 0 && len > 0); }