Esempio n. 1
0
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)));
}
Esempio n. 2
0
Slice::Slice(char *data) :
    pos(ntoh5(data)),
    len(ntoh3(data + 5))
{
    assert(pos > 0 && len > 0);
}