Pkt4Ptr pkt(new Pkt4(DHCPREQUEST, 1234));
// Make a wire representation of the DHCPv4 message.
pkt->pack();
- OutputBuffer& output_buffer = pkt->getBuffer();
- const uint8_t* data = output_buffer.getData();
- OptionBuffer option_buffer(data, data + output_buffer.getLength());
+ const OptionBuffer& option_buffer = pkt->getBuffer().getVector();
// Create the DHCPv4 Message option holding the created message.
OptionPtr opt_msg(new Option(Option::V6, D6O_DHCPV4_MSG, option_buffer));
infreq->setCiaddr(IOAddress("192.0.1.2"));
// Make a wire representation of the DHCPv4 message.
infreq->pack();
- OutputBuffer& output_buffer = infreq->getBuffer();
- const uint8_t* data = output_buffer.getData();
- OptionBuffer option_buffer(data, data + output_buffer.getLength());
+ const OptionBuffer& option_buffer = infreq->getBuffer().getVector();
// Create the DHCPv4 Message option holding the created message.
OptionPtr opt_msg(new Option(Option::V6, D6O_DHCPV4_MSG, option_buffer));
// DHCID.
OutputBuffer name_buf(1);
opt_fqdn->packDomainName(name_buf);
- const uint8_t* name_data = name_buf.getData();
- // @todo currently D2Dhcid accepts a vector holding FQDN.
- // However, it will be faster if we used a pointer name_data.
- std::vector<uint8_t> buf_vec(name_data, name_data + name_buf.getLength());
+ const std::vector<uint8_t>& buf_vec = name_buf.getVector();
// Compute DHCID from Client Identifier and FQDN.
isc::dhcp_ddns::D2Dhcid dhcid(*duid, buf_vec);
Pkt4Ptr pkt(new Pkt4(DHCPREQUEST, 1234));
// Make a wire representation of the DHCPv4 message.
pkt->pack();
- OutputBuffer& output_buffer = pkt->getBuffer();
- const uint8_t* data = output_buffer.getData();
- OptionBuffer option_buffer(data, data + output_buffer.getLength());
+ const OptionBuffer& option_buffer = pkt->getBuffer().getVector();
// Create the DHCPv4 Message option holding the created message.
OptionPtr opt_msg(new Option(Option::V6, D6O_DHCPV4_MSG, option_buffer));
template_packets_v4_.find(packet_type);
if ((pkt_it != template_packets_v4_.end()) &&
pkt_it->second) {
- const util::OutputBuffer& out_buf(pkt_it->second->getBuffer());
- const uint8_t* out_buf_data = out_buf.getData();
- std::vector<uint8_t> buf(out_buf_data, out_buf_data + out_buf.getLength());
- hex_buf = vector2Hex(buf);
+ hex_buf = vector2Hex(pkt_it->second->getBuffer().getVector());
}
} else if (options_.getIpVersion() == 6) {
if (packet_type == DHCPV6_REQUEST) {
template_packets_v6_.find(packet_type);
if (pkt_it != template_packets_v6_.end() &&
pkt_it->second) {
- const util::OutputBuffer& out_buf(pkt_it->second->getBuffer());
- const uint8_t* out_buf_data = out_buf.getData();
- std::vector<uint8_t> buf(out_buf_data, out_buf_data + out_buf.getLength());
- hex_buf = vector2Hex(buf);
+ hex_buf = vector2Hex(pkt_it->second->getBuffer().getVector());
}
}
std::cout << "xid-offset=" << getTransactionIdOffset(arg_idx) << std::endl;
void Pkt4o6::pack() {
// Convert wire-format Pkt4 data in the form of OptionBuffer.
Pkt4::pack();
- OutputBuffer& buf = getBuffer();
- const uint8_t* ptr = buf.getData();
- OptionBuffer msg(ptr, ptr + buf.getLength());
+ const OptionBuffer& msg = getBuffer().getVector();
// Build the DHCPv4 Message option for the DHCPv6 message, and pack the
// entire stuff.
// Check that the generated wire format is correct.
const uint8_t* data = buf.getData();
- std::vector<uint8_t> vec(data, data + buf.getLength());
- ASSERT_TRUE(std::equal(vec.begin(), vec.end(), expected_vec.begin()));
+ const std::vector<uint8_t>& vec = buf.getVector();
+ ASSERT_TRUE(std::equal(vec.cbegin(), vec.cend(), expected_vec.cbegin()));
}
// This test verifies parsing option wire format with subnet id of
// NameChangeRequest instance. Note the factory may throw
// NcrMessageError.
ncr = NameChangeRequest::fromJSON(string_data);
- } catch (const isc::util::InvalidBufferPosition& ex) {
+ } catch (const isc::Exception& ex) {
// Read error accessing data in InputBuffer.
isc_throw(NcrMessageError, "fromFormat: buffer read error: "
<< ex.what());
1234));
// Make a wire representation of the DHCPv4 message.
pkt->pack();
- OutputBuffer& output_buffer = pkt->getBuffer();
- const uint8_t* data = output_buffer.getData();
- OptionBuffer option_buffer(data, data + output_buffer.getLength());
+ const OptionBuffer& option_buffer = pkt->getBuffer().getVector();
// Create the DHCPv4 Message option holding the created message.
OptionPtr opt_msg(new Option(Option::V6, D6O_DHCPV4_MSG, option_buffer));
// Copy wire data of the name
isc::util::OutputBuffer ob(0);
n_maxlabel.toWire(ob);
- expected_data7.insert(expected_data7.end(), ob.getData(),
- ob.getData() + ob.getLength());
+ expected_data7.insert(expected_data7.end(),
+ ob.getVector().cbegin(),
+ ob.getVector().cend());
expected.push_back(DataPair(expected_data7.size(), &expected_data7[0]));
// For each data set, serialize the labels and compare the data to the
}
/// \brief Return the buffer.
+ ///
+ /// \note The main use is to avoid a copy.
const std::vector<uint8_t>& getVector() const {
return (buffer_);
}
return (SocketSession(passed_sock.release(), family, type, protocol,
impl_->sa_local_, impl_->sa_remote_,
&impl_->data_buf_[0], data_len));
- } catch (const InvalidBufferPosition& ex) {
+ } catch (const OutOfRange& ex) {
// We catch the case where the given header is too short and convert
// the exception to SocketSessionError.
isc_throw(SocketSessionError, "bogus socket session header: " <<
}
TEST_F(BufferTest, inputBufferException) {
- EXPECT_THROW(ibuffer.setPosition(6), isc::util::InvalidBufferPosition);
+ EXPECT_THROW(ibuffer.setPosition(6), isc::OutOfRange);
ibuffer.setPosition(sizeof(testdata));
- EXPECT_THROW(ibuffer.peekUint8(), isc::util::InvalidBufferPosition);
- EXPECT_THROW(ibuffer.readUint8(), isc::util::InvalidBufferPosition);
+ EXPECT_THROW(ibuffer.peekUint8(), isc::OutOfRange);
+ EXPECT_THROW(ibuffer.readUint8(), isc::OutOfRange);
ibuffer.setPosition(sizeof(testdata) - 1);
- EXPECT_THROW(ibuffer.peekUint16(), isc::util::InvalidBufferPosition);
- EXPECT_THROW(ibuffer.readUint16(), isc::util::InvalidBufferPosition);
+ EXPECT_THROW(ibuffer.peekUint16(), isc::OutOfRange);
+ EXPECT_THROW(ibuffer.readUint16(), isc::OutOfRange);
ibuffer.setPosition(sizeof(testdata) - 3);
- EXPECT_THROW(ibuffer.peekUint32(), isc::util::InvalidBufferPosition);
- EXPECT_THROW(ibuffer.readUint32(), isc::util::InvalidBufferPosition);
+ EXPECT_THROW(ibuffer.peekUint32(), isc::OutOfRange);
+ EXPECT_THROW(ibuffer.readUint32(), isc::OutOfRange);
ibuffer.setPosition(sizeof(testdata) - 4);
- EXPECT_THROW(ibuffer.peekData(vdata, sizeof(vdata)),
- isc::util::InvalidBufferPosition);
- EXPECT_THROW(ibuffer.readData(vdata, sizeof(vdata)),
- isc::util::InvalidBufferPosition);
- EXPECT_THROW(ibuffer.peekVector(datav, sizeof(vdata)),
- isc::util::InvalidBufferPosition);
- EXPECT_THROW(ibuffer.readVector(datav, sizeof(vdata)),
- isc::util::InvalidBufferPosition);
+ EXPECT_THROW(ibuffer.peekData(vdata, sizeof(vdata)), isc::OutOfRange);
+ EXPECT_THROW(ibuffer.readData(vdata, sizeof(vdata)), isc::OutOfRange);
+ EXPECT_THROW(ibuffer.peekVector(datav, sizeof(vdata)), isc::OutOfRange);
+ EXPECT_THROW(ibuffer.readVector(datav, sizeof(vdata)), isc::OutOfRange);
}
TEST_F(BufferTest, outputBufferExtend) {
EXPECT_EQ(expected_size, obuffer.getLength());
cp = obuffer.getData();
EXPECT_EQ(0, memcmp(cp + 7, testdata, sizeof(testdata)));
+
+ datav = obuffer.getVector();
+ ASSERT_EQ(expected_size, datav.size());
+ std::vector<uint8_t> expected = { 1, 2, 3, 4, 5, 6, 7 };
+ expected.insert(expected.end(), testdata, testdata + sizeof(testdata));
+ ASSERT_EQ(expected_size, expected.size());
+ EXPECT_EQ(0, memcmp(&expected[0], &datav[0], expected_size));
}
TEST_F(BufferTest, outputBufferWriteAt) {
EXPECT_EQ(2, *(cp + 2));
EXPECT_EQ(3, *(cp + 3));
- EXPECT_THROW(obuffer.writeUint8At(data16, 5),
- isc::util::InvalidBufferPosition);
- EXPECT_THROW(obuffer.writeUint8At(data16, 4),
- isc::util::InvalidBufferPosition);
- EXPECT_THROW(obuffer.writeUint16At(data16, 3),
- isc::util::InvalidBufferPosition);
- EXPECT_THROW(obuffer.writeUint16At(data16, 4),
- isc::util::InvalidBufferPosition);
- EXPECT_THROW(obuffer.writeUint16At(data16, 5),
- isc::util::InvalidBufferPosition);
+ EXPECT_THROW(obuffer.writeUint8At(data16, 5), isc::OutOfRange);
+ EXPECT_THROW(obuffer.writeUint8At(data16, 4), isc::OutOfRange);
+ EXPECT_THROW(obuffer.writeUint16At(data16, 3), isc::OutOfRange);
+ EXPECT_THROW(obuffer.writeUint16At(data16, 4), isc::OutOfRange);
+ EXPECT_THROW(obuffer.writeUint16At(data16, 5), isc::OutOfRange);
}
TEST_F(BufferTest, outputBufferSkip) {
for (size_t i = 0; i < sizeof(testdata); ++i) {
EXPECT_EQ(testdata[i], obuffer[i]);
}
- EXPECT_THROW(obuffer[sizeof(testdata)], isc::util::InvalidBufferPosition);
+ EXPECT_THROW(obuffer[sizeof(testdata)], isc::OutOfRange);
}
TEST_F(BufferTest, outputBufferClear) {