1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
// Copyright (C) 2015-2023 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef OPTION_OPAQUE_DATA_TUPLES_H
#define OPTION_OPAQUE_DATA_TUPLES_H
#include <dhcp/dhcp4.h>
#include <dhcp/dhcp6.h>
#include <dhcp/opaque_data_tuple.h>
#include <dhcp/option.h>
#include <util/buffer.h>
#include <boost/shared_ptr.hpp>
#include <dhcp/option_data_types.h>
#include <stdint.h>
namespace isc {
namespace dhcp {
/// @brief This class encapsulates a collection of data tuples and could be
/// used by multiple options. It is tailored for use with the DHCPv6
/// Bootfile-param option (option 60).
///
/// The format of the option is described in section 3.2 of RFC5970.
/// This option may carry an arbitrary number of tuples carrying opaque data.
/// Each tuple consists of a field holding the length of the opaque data
/// followed by a string containing the data itself. For option 60 each
/// length field is 2 bytes long and the data is a UTF-8 string that is not
/// null terminated.
///
/// @todo The class is similar to the class used by the DHCPv6 Vendor Class
/// (16) and DHCPv4 V-I Vendor Class (124) options, though they include an
/// enterprise (or vendor) ID in the option. In the future it may
/// make sense to rewrite the OptionVendorClass to derive from this class.
class OptionOpaqueDataTuples : public Option {
public:
/// @brief Collection of opaque data tuples carried by the option.
typedef std::vector<OpaqueDataTuple> TuplesCollection;
/// @brief Constructor.
///
/// This constructor creates an instance of an OptionOpaqueDataTuples
/// that can be used for an option such as DHCPv6 Bootfile Parameters (60).
///
/// @param u universe (v4 or v6).
/// @param type option type
/// @param length_field_type Indicates a length of the field which holds
/// the size of the tuple. If not provided explicitly, it is evaluated
/// basing on Option's v4/v6 universe.
OptionOpaqueDataTuples(Option::Universe u,
const uint16_t type,
OpaqueDataTuple::LengthFieldType length_field_type = OpaqueDataTuple::LENGTH_EMPTY);
/// @brief Constructor.
///
/// This constructor creates an instance of the option using a buffer with
/// on-wire data. It may throw an exception if the @c unpack method throws.
///
/// @param u universe (v4 or v6)
/// @param type option type
/// @param begin Iterator pointing to the beginning of the buffer holding an
/// option.
/// @param end Iterator pointing to the end of the buffer holding an option.
/// @param length_field_type Indicates a length of the field which holds
/// the size of the tuple. If not provided explicitly, it is evaluated
/// basing on Option's v4/v6 universe.
OptionOpaqueDataTuples(Option::Universe u,
const uint16_t type,
OptionBufferConstIter begin,
OptionBufferConstIter end,
OpaqueDataTuple::LengthFieldType length_field_type = OpaqueDataTuple::LENGTH_EMPTY);
/// @brief Copies this option and returns a pointer to the copy.
OptionPtr clone() const;
/// @brief Renders option into the buffer in the wire format.
///
/// @param [out] buf Buffer to which the option is rendered.
/// @param check if set to false, allows options larger than 255 for v4
virtual void pack(isc::util::OutputBuffer& buf, bool check = true) const;
/// @brief Parses buffer holding an option.
///
/// This function parses the buffer holding an option and initializes option
/// properties: the collection of tuples.
///
/// @param begin Iterator pointing to the beginning of the buffer holding an
/// option.
/// @param end Iterator pointing to the end of the buffer holding an option.
virtual void unpack(OptionBufferConstIter begin, OptionBufferConstIter end);
/// @brief Adds a new opaque data tuple to the option.
///
/// @param tuple Tuple to be added.
/// @throw isc::BadValue if the type of the tuple doesn't match the
/// universe this option belongs to.
void addTuple(const OpaqueDataTuple& tuple);
/// @brief Replaces tuple at the specified index with a new tuple.
///
/// This function replaces an opaque data tuple at the specified position
/// with the new tuple. If the specified index is out of range an exception
/// is thrown.
///
/// @param at Index at which the tuple should be replaced.
/// @param tuple Tuple to be set.
/// @throw isc::OutOfRange if the tuple position is out of range.
/// @throw isc::BadValue if the type of the tuple doesn't match the
/// universe this option belongs to.
void setTuple(const size_t at, const OpaqueDataTuple& tuple);
/// @brief Returns opaque data tuple at the specified position.
///
/// If the specified position is out of range an exception is thrown.
///
/// @param at Index for which tuple to get.
/// @throw isc::OutOfRange if the tuple position is out of range.
OpaqueDataTuple getTuple(const size_t at) const;
/// @brief Returns the number of opaque data tuples added to the option.
size_t getTuplesNum() const {
return (tuples_.size());
}
/// @brief Returns collection of opaque data tuples carried in the option.
const TuplesCollection& getTuples() const {
return (tuples_);
}
/// @brief Checks if the object holds the opaque data tuple with the
/// specified string.
///
/// @param tuple_str String representation of the tuple being searched.
/// @return true if the specified tuple exists for this option.
bool hasTuple(const std::string& tuple_str) const;
/// @brief Returns the full length of the option, including option header.
virtual uint16_t len() const;
/// @brief Returns text representation of the option.
///
/// @param indent Number of space characters before text.
/// @return Text representation of the option.
virtual std::string toText(int indent = 0) const;
private:
/// @brief length of the field which holds the size of the tuple.
OpaqueDataTuple::LengthFieldType length_field_type_;
/// @brief Collection of opaque data tuples carried by the option.
TuplesCollection tuples_;
};
/// @brief Defines a pointer to the @c OptionOpaqueDataTuples.
typedef boost::shared_ptr<OptionOpaqueDataTuples> OptionOpaqueDataTuplesPtr;
}
}
#endif // OPTION_OPAQUE_DATA_TUPLES_H
|