Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Kea
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
445
Issues
445
List
Boards
Labels
Service Desk
Milestones
Merge Requests
71
Merge Requests
71
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
ISC Open Source Projects
Kea
Commits
80f05781
Commit
80f05781
authored
Sep 30, 2014
by
Tomek Mrugalski
🛰
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[3546] More stuff moved from Pkt{4,6} to Pkt
parent
e8f8dc46
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
243 additions
and
248 deletions
+243
-248
src/lib/dhcp/pkt.cc
src/lib/dhcp/pkt.cc
+23
-0
src/lib/dhcp/pkt.h
src/lib/dhcp/pkt.h
+215
-11
src/lib/dhcp/pkt4.cc
src/lib/dhcp/pkt4.cc
+0
-15
src/lib/dhcp/pkt4.h
src/lib/dhcp/pkt4.h
+5
-136
src/lib/dhcp/pkt6.h
src/lib/dhcp/pkt6.h
+0
-86
No files found.
src/lib/dhcp/pkt.cc
View file @
80f05781
...
...
@@ -63,5 +63,28 @@ void Pkt::repack() {
buffer_out_
.
writeData
(
&
data_
[
0
],
data_
.
size
());
}
void
Pkt
::
setRemoteHWAddr
(
const
uint8_t
htype
,
const
uint8_t
hlen
,
const
std
::
vector
<
uint8_t
>&
mac_addr
)
{
setHWAddrMember
(
htype
,
hlen
,
mac_addr
,
remote_hwaddr_
);
}
void
Pkt
::
setRemoteHWAddr
(
const
HWAddrPtr
&
addr
)
{
if
(
!
addr
)
{
isc_throw
(
BadValue
,
"Setting remote HW address to NULL is"
<<
" forbidden."
);
}
remote_hwaddr_
=
addr
;
}
void
Pkt
::
setHWAddrMember
(
const
uint8_t
htype
,
const
uint8_t
,
const
std
::
vector
<
uint8_t
>&
mac_addr
,
HWAddrPtr
&
hw_addr
)
{
hw_addr
.
reset
(
new
HWAddr
(
mac_addr
,
htype
));
}
};
};
src/lib/dhcp/pkt.h
View file @
80f05781
...
...
@@ -18,6 +18,7 @@
#include <asiolink/io_address.h>
#include <util/buffer.h>
#include <dhcp/option.h>
#include <dhcp/hwaddr.h>
#include <dhcp/classify.h>
#include <boost/date_time/posix_time/posix_time.hpp>
...
...
@@ -66,8 +67,38 @@ Pkt(uint32_t transid, const isc::asiolink::IOAddress& local_addr,
public:
/// @brief Prepares on-wire format of DHCP (either v4 or v6) packet.
///
/// Prepares on-wire format of message and all its options.
/// Options must be stored in options_ field.
/// Output buffer will be stored in buffer_out_.
/// The buffer_out_ is cleared before writting to the buffer.
///
/// @note This is a pure virtual method. Actual implementations are in
/// Pkt4 and Pkt6 class.
///
/// @throw InvalidOperation if packing fails
virtual
void
pack
()
=
0
;
//virtual bool unpack() = 0;
/// @brief Parses on-wire form of DHCP (either v4 or v6) packet.
///
/// Parses received packet, stored in on-wire format in bufferIn_.
///
/// Will create a collection of option objects that will
/// be stored in options_ container.
///
/// @note This is a pure virtual method. Actual implementations are in
/// Pkt4 and Pkt6 class.
///
/// Method with throw exception if packet parsing fails.
///
/// @todo Pkt4 throws exceptions when unpacking fails, while Pkt6
/// catches exceptions and returns false. We need to unify that
/// behavior one day (most likely using exceptions and turning
/// return type to void).
///
/// @return true if unpack was successful
virtual
bool
unpack
()
=
0
;
/// @brief Returns reference to output buffer.
///
...
...
@@ -97,6 +128,14 @@ public:
/// @return true if option was deleted, false if no such option existed
bool
delOption
(
uint16_t
type
);
/// @brief Returns text representation of the packet.
///
/// This function is useful mainly for debugging.
///
/// @note This is pure virtual method. Actual implementations are in
/// Pkt4 and Pkt6 classes.
///
/// @return string with text representation
virtual
std
::
string
toText
()
=
0
;
/// Returns packet type
...
...
@@ -108,11 +147,17 @@ public:
/// Returns message type (e.g. 1 = SOLICIT)
///
/// This is a pure virtual method. DHCPv4 stores type in option 53 and
/// DHCPv6 stores it in the header.
///
/// @return message type
virtual
uint8_t
getType
()
const
=
0
;
/// Sets message type (e.g. 1 = SOLICIT)
///
/// This is a pure virtual method. DHCPv4 stores type in option 53 and
/// DHCPv6 stores it in the header.
///
/// @param type message type to be set
virtual
void
setType
(
uint8_t
type
)
=
0
;
...
...
@@ -186,6 +231,16 @@ public:
/// @throw isc::Unexpected if timestamp update failed
void
updateTimestamp
();
/// @brief Returns packet timestamp.
///
/// Returns packet timestamp value updated when
/// packet is received or send.
///
/// @return packet timestamp.
const
boost
::
posix_time
::
ptime
&
getTimestamp
()
const
{
return
timestamp_
;
}
/// @brief Copies content of input buffer to output buffer.
///
/// This is mostly a diagnostic function. It is being used for sending
...
...
@@ -194,6 +249,145 @@ public:
/// that we just received, a copy between those two buffers is necessary.
void
repack
();
/// collection of options present in this message
///
/// @warning This public member is accessed by derived
/// classes directly. One of such derived classes is
/// @ref perfdhcp::PerfPkt6. The impact on derived clasess'
/// behavior must be taken into consideration before making
/// changes to this member such as access scope restriction or
/// data format change etc.
isc
::
dhcp
::
OptionCollection
options_
;
/// @brief Set callback function to be used to parse options.
///
/// @param callback An instance of the callback function or NULL to
/// uninstall callback.
void
setCallback
(
UnpackOptionsCallback
callback
)
{
callback_
=
callback
;
}
/// @brief Sets remote IP address.
///
/// @param remote specifies remote address
void
setRemoteAddr
(
const
isc
::
asiolink
::
IOAddress
&
remote
)
{
remote_addr_
=
remote
;
}
/// @brief Returns remote IP address
///
/// @return remote address
const
isc
::
asiolink
::
IOAddress
&
getRemoteAddr
()
const
{
return
(
remote_addr_
);
}
/// @brief Sets local IP address.
///
/// @param local specifies local address
void
setLocalAddr
(
const
isc
::
asiolink
::
IOAddress
&
local
)
{
local_addr_
=
local
;
}
/// @brief Returns local IP address.
///
/// @return local address
const
isc
::
asiolink
::
IOAddress
&
getLocalAddr
()
const
{
return
(
local_addr_
);
}
/// @brief Sets local port.
///
/// @param local specifies local port
void
setLocalPort
(
uint16_t
local
)
{
local_port_
=
local
;
}
/// @brief Returns local port.
///
/// @return local port
uint16_t
getLocalPort
()
const
{
return
(
local_port_
);
}
/// @brief Sets remote port.
///
/// @param remote specifies remote port
void
setRemotePort
(
uint16_t
remote
)
{
remote_port_
=
remote
;
}
/// @brief Returns remote port.
///
/// @return remote port
uint16_t
getRemotePort
()
const
{
return
(
remote_port_
);
}
/// @brief Sets interface index.
///
/// @param ifindex specifies interface index.
void
setIndex
(
uint32_t
ifindex
)
{
ifindex_
=
ifindex
;
};
/// @brief Returns interface index.
///
/// @return interface index
uint32_t
getIndex
()
const
{
return
(
ifindex_
);
};
/// @brief Returns interface name.
///
/// Returns interface name over which packet was received or is
/// going to be transmitted.
///
/// @return interface name
std
::
string
getIface
()
const
{
return
iface_
;
};
/// @brief Sets interface name.
///
/// Sets interface name over which packet was received or is
/// going to be transmitted.
///
/// @return interface name
void
setIface
(
const
std
::
string
&
iface
)
{
iface_
=
iface
;
};
/// @brief Sets remote HW address.
///
/// Sets hardware address from an existing HWAddr structure.
/// The remote address is a destination address for outgoing
/// packet and source address for incoming packet. When this
/// is an outgoing packet, this address will be used to
/// construct the link layer header.
///
/// @param addr structure representing HW address.
///
/// @throw BadValue if addr is null
void
setRemoteHWAddr
(
const
HWAddrPtr
&
addr
);
/// @brief Sets remote HW address.
///
/// Sets the destination HW address for the outgoing packet
/// or source HW address for the incoming packet. When this
/// is an outgoing packet this address will be used to construct
/// the link layer header.
///
/// @note mac_addr must be a buffer of at least hlen bytes.
///
/// @param htype hardware type (will be sent in htype field)
/// @param hlen hardware length (will be sent in hlen field)
/// @param mac_addr pointer to hardware address
void
setRemoteHWAddr
(
const
uint8_t
htype
,
const
uint8_t
hlen
,
const
std
::
vector
<
uint8_t
>&
mac_addr
);
/// @brief Returns the remote HW address.
///
/// @return remote HW address.
HWAddrPtr
getRemoteHWAddr
()
const
{
return
(
remote_hwaddr_
);
}
/// @brief virtual desctructor
///
/// There is nothing to clean up here, but since there are virtual methods,
...
...
@@ -229,16 +423,6 @@ protected:
/// remote TCP or UDP port
uint16_t
remote_port_
;
/// collection of options present in this message
///
/// @warning This public member is accessed by derived
/// classes directly. One of such derived classes is
/// @ref perfdhcp::PerfPkt6. The impact on derived clasess'
/// behavior must be taken into consideration before making
/// changes to this member such as access scope restriction or
/// data format change etc.
isc
::
dhcp
::
OptionCollection
options_
;
/// Output buffer (used during message transmission)
///
/// @warning This protected member is accessed by derived
...
...
@@ -263,8 +447,28 @@ protected:
/// packet timestamp
boost
::
posix_time
::
ptime
timestamp_
;
// remote HW address (src if receiving packet, dst if sending packet)
HWAddrPtr
remote_hwaddr_
;
/// A callback to be called to unpack options from the packet.
UnpackOptionsCallback
callback_
;
private:
/// @brief Generic method that validates and sets HW address.
///
/// This is a generic method used by all modifiers of this class
/// which set class members representing HW address.
///
/// @param htype hardware type.
/// @param hlen hardware length.
/// @param mac_addr pointer to actual hardware address.
/// @param [out] hw_addr pointer to a class member to be modified.
///
/// @trow isc::OutOfRange if invalid HW address specified.
virtual
void
setHWAddrMember
(
const
uint8_t
htype
,
const
uint8_t
hlen
,
const
std
::
vector
<
uint8_t
>&
mac_addr
,
HWAddrPtr
&
hw_addr
);
};
};
// namespace isc::dhcp
...
...
src/lib/dhcp/pkt4.cc
View file @
80f05781
...
...
@@ -329,21 +329,6 @@ Pkt4::setLocalHWAddr(const HWAddrPtr& addr) {
local_hwaddr_
=
addr
;
}
void
Pkt4
::
setRemoteHWAddr
(
const
uint8_t
htype
,
const
uint8_t
hlen
,
const
std
::
vector
<
uint8_t
>&
mac_addr
)
{
setHWAddrMember
(
htype
,
hlen
,
mac_addr
,
remote_hwaddr_
);
}
void
Pkt4
::
setRemoteHWAddr
(
const
HWAddrPtr
&
addr
)
{
if
(
!
addr
)
{
isc_throw
(
BadValue
,
"Setting remote HW address to NULL is"
<<
" forbidden."
);
}
remote_hwaddr_
=
addr
;
}
void
Pkt4
::
setSname
(
const
uint8_t
*
sname
,
size_t
snameLen
/*= MAX_SNAME_LEN*/
)
{
if
(
snameLen
>
MAX_SNAME_LEN
)
{
...
...
src/lib/dhcp/pkt4.h
View file @
80f05781
...
...
@@ -19,7 +19,6 @@
#include <dhcp/option.h>
#include <util/buffer.h>
#include <dhcp/option.h>
#include <dhcp/hwaddr.h>
#include <dhcp/classify.h>
#include <dhcp/pkt.h>
...
...
@@ -77,8 +76,7 @@ public:
/// The buffer_out_ is cleared before writting to the buffer.
///
/// @throw InvalidOperation if packing fails
void
pack
();
virtual
void
pack
();
/// @brief Parses on-wire form of DHCPv4 packet.
///
...
...
@@ -89,7 +87,7 @@ public:
///
/// Method with throw exception if packet parsing fails.
/// @return true if unpack was successful
bool
unpack
();
virtual
bool
unpack
();
/// @brief performs sanity check on a packet.
///
...
...
@@ -295,75 +293,6 @@ public:
virtual
void
addOption
(
const
OptionPtr
&
opt
);
/// @brief Returns interface name.
///
/// Returns interface name over which packet was received or is
/// going to be transmitted.
///
/// @return interface name
std
::
string
getIface
()
const
{
return
iface_
;
};
/// @brief Returns packet timestamp.
///
/// Returns packet timestamp value updated when
/// packet is received or send.
///
/// @return packet timestamp.
const
boost
::
posix_time
::
ptime
&
getTimestamp
()
const
{
return
timestamp_
;
}
/// @brief Sets interface name.
///
/// Sets interface name over which packet was received or is
/// going to be transmitted.
///
/// @return interface name
void
setIface
(
const
std
::
string
&
iface
)
{
iface_
=
iface
;
};
/// @brief Sets interface index.
///
/// @param ifindex specifies interface index.
void
setIndex
(
uint32_t
ifindex
)
{
ifindex_
=
ifindex
;
};
/// @brief Returns interface index.
///
/// @return interface index
uint32_t
getIndex
()
const
{
return
(
ifindex_
);
};
/// @brief Sets remote HW address.
///
/// Sets the destination HW address for the outgoing packet
/// or source HW address for the incoming packet. When this
/// is an outgoing packet this address will be used to construct
/// the link layer header.
///
/// @note mac_addr must be a buffer of at least hlen bytes.
///
/// @param htype hardware type (will be sent in htype field)
/// @param hlen hardware length (will be sent in hlen field)
/// @param mac_addr pointer to hardware address
void
setRemoteHWAddr
(
const
uint8_t
htype
,
const
uint8_t
hlen
,
const
std
::
vector
<
uint8_t
>&
mac_addr
);
/// @brief Sets remote HW address.
///
/// Sets hardware address from an existing HWAddr structure.
/// The remote address is a destination address for outgoing
/// packet and source address for incoming packet. When this
/// is an outgoing packet, this address will be used to
/// construct the link layer header.
///
/// @param addr structure representing HW address.
///
/// @throw BadValue if addr is null
void
setRemoteHWAddr
(
const
HWAddrPtr
&
addr
);
/// @brief Returns the remote HW address.
///
/// @return remote HW address.
HWAddrPtr
getRemoteHWAddr
()
const
{
return
(
remote_hwaddr_
);
}
/// @brief Sets local HW address.
///
/// Sets the source HW address for the outgoing packet or
...
...
@@ -395,54 +324,6 @@ public:
return
(
local_hwaddr_
);
}
/// @brief Sets remote address.
///
/// @param remote specifies remote address
void
setRemoteAddr
(
const
isc
::
asiolink
::
IOAddress
&
remote
)
{
remote_addr_
=
remote
;
}
/// @brief Returns remote address
///
/// @return remote address
const
isc
::
asiolink
::
IOAddress
&
getRemoteAddr
()
const
{
return
(
remote_addr_
);
}
/// @brief Sets local address.
///
/// @param local specifies local address
void
setLocalAddr
(
const
isc
::
asiolink
::
IOAddress
&
local
)
{
local_addr_
=
local
;
}
/// @brief Returns local address.
///
/// @return local address
const
isc
::
asiolink
::
IOAddress
&
getLocalAddr
()
const
{
return
(
local_addr_
);
}
/// @brief Sets local port.
///
/// @param local specifies local port
void
setLocalPort
(
uint16_t
local
)
{
local_port_
=
local
;
}
/// @brief Returns local port.
///
/// @return local port
uint16_t
getLocalPort
()
const
{
return
(
local_port_
);
}
/// @brief Sets remote port.
///
/// @param remote specifies remote port
void
setRemotePort
(
uint16_t
remote
)
{
remote_port_
=
remote
;
}
/// @brief Returns remote port.
///
/// @return remote port
uint16_t
getRemotePort
()
const
{
return
(
remote_port_
);
}
/// @brief Checks if a DHCPv4 message has been relayed.
///
/// This function returns a boolean value which indicates whether a DHCPv4
...
...
@@ -461,14 +342,6 @@ public:
/// found.
bool
isRelayed
()
const
;
/// @brief Set callback function to be used to parse options.
///
/// @param callback An instance of the callback function or NULL to
/// uninstall callback.
void
setCallback
(
UnpackOptionsCallback
callback
)
{
callback_
=
callback
;
}
/// @brief That's the data of input buffer used in RX packet.
///
/// @note Note that InputBuffer does not store the data itself, but just
...
...
@@ -487,7 +360,6 @@ public:
/// performance).
std
::
vector
<
uint8_t
>
data_
;
private:
/// @brief Generic method that validates and sets HW address.
...
...
@@ -501,9 +373,9 @@ private:
/// @param [out] hw_addr pointer to a class member to be modified.
///
/// @trow isc::OutOfRange if invalid HW address specified.
void
setHWAddrMember
(
const
uint8_t
htype
,
const
uint8_t
hlen
,
const
std
::
vector
<
uint8_t
>&
mac_addr
,
HWAddrPtr
&
hw_addr
);
v
irtual
v
oid
setHWAddrMember
(
const
uint8_t
htype
,
const
uint8_t
hlen
,
const
std
::
vector
<
uint8_t
>&
mac_addr
,
HWAddrPtr
&
hw_addr
);
protected:
...
...
@@ -518,9 +390,6 @@ protected:
/// local HW address (dst if receiving packet, src if sending packet)
HWAddrPtr
local_hwaddr_
;
// remote HW address (src if receiving packet, dst if sending packet)
HWAddrPtr
remote_hwaddr_
;
/// @brief message operation code
///
/// Note: This is legacy BOOTP field. There's no need to manipulate it
...
...
src/lib/dhcp/pkt6.h
View file @
80f05781
...
...
@@ -209,84 +209,6 @@ public:
/// @return instance of option collection with requested options
isc
::
dhcp
::
OptionCollection
getOptions
(
uint16_t
type
);
/// @brief Sets remote address.
///
/// @param remote specifies remote address
void
setRemoteAddr
(
const
isc
::
asiolink
::
IOAddress
&
remote
)
{
remote_addr_
=
remote
;
}
/// @brief Returns remote address
///
/// @return remote address
const
isc
::
asiolink
::
IOAddress
&
getRemoteAddr
()
const
{
return
(
remote_addr_
);
}
/// @brief Sets local address.
///
/// @param local specifies local address
void
setLocalAddr
(
const
isc
::
asiolink
::
IOAddress
&
local
)
{
local_addr_
=
local
;
}
/// @brief Returns local address.
///
/// @return local address
const
isc
::
asiolink
::
IOAddress
&
getLocalAddr
()
const
{
return
(
local_addr_
);
}
/// @brief Sets local port.
///
/// @param local specifies local port
void
setLocalPort
(
uint16_t
local
)
{
local_port_
=
local
;
}
/// @brief Returns local port.
///
/// @return local port
uint16_t
getLocalPort
()
const
{
return
(
local_port_
);
}
/// @brief Sets remote port.
///
/// @param remote specifies remote port
void
setRemotePort
(
uint16_t
remote
)
{
remote_port_
=
remote
;
}
/// @brief Returns remote port.
///
/// @return remote port
uint16_t
getRemotePort
()
const
{
return
(
remote_port_
);
}
/// @brief Sets interface index.
///
/// @param ifindex specifies interface index.
void
setIndex
(
uint32_t
ifindex
)
{
ifindex_
=
ifindex
;
};
/// @brief Returns interface index.
///
/// @return interface index
uint32_t
getIndex
()
const
{
return
(
ifindex_
);
};
/// @brief Returns interface name.
///
/// Returns interface name over which packet was received or is
/// going to be transmitted.
///
/// @return interface name
std
::
string
getIface
()
const
{
return
iface_
;
};
/// @brief Returns packet timestamp.
///
/// Returns packet timestamp value updated when
/// packet is received or sent.
///
/// @return packet timestamp.
const
boost
::
posix_time
::
ptime
&
getTimestamp
()
const
{
return
timestamp_
;
}
/// @brief Sets interface name.
///
/// Sets interface name over which packet was received or is
/// going to be transmitted.
///
/// @return interface name
void
setIface
(
const
std
::
string
&
iface
)
{
iface_
=
iface
;
};
/// @brief add information about one traversed relay
///
/// This adds information about one traversed relay, i.e.
...
...
@@ -323,14 +245,6 @@ public:
/// be freed by the caller.
const
char
*
getName
()
const
;
/// @brief Set callback function to be used to parse options.
///
/// @param callback An instance of the callback function or NULL to
/// uninstall callback.
void
setCallback
(
UnpackOptionsCallback
callback
)
{
callback_
=
callback
;
}
/// @brief copies relay information from client's packet to server's response
///
/// This information is not simply copied over. Some parameter are
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment