QUERY4_LOCAL_HWADDR_TYPE
QUERY4_REMOTE_HWADDR
QUERY4_REMOTE_HWADDR_TYPE
+ QUERY4_RAI
+ QUERY4_RAI_CIRCUIT_ID
+ QUERY4_RAI_REMOTE_ID
SUBNET4_ID
SUBNET4_NAME
SUBNET4_PREFIX
QUERY4_LOCAL_HWADDR_TYPE
QUERY4_REMOTE_HWADDR
QUERY4_REMOTE_HWADDR_TYPE
+ QUERY4_RAI
+ QUERY4_RAI_CIRCUIT_ID
+ QUERY4_RAI_REMOTE_ID
LEASES4_SIZE
DELETED_LEASES4_SIZE
QUERY4_LOCAL_HWADDR_TYPE
QUERY4_REMOTE_HWADDR
QUERY4_REMOTE_HWADDR_TYPE
+ QUERY4_RAI
+ QUERY4_RAI_CIRCUIT_ID
+ QUERY4_RAI_REMOTE_ID
LEASE4_ADDRESS
LEASE4_CLTT
LEASE4_HOSTNAME
QUERY4_LOCAL_HWADDR_TYPE
QUERY4_REMOTE_HWADDR
QUERY4_REMOTE_HWADDR_TYPE
+ QUERY4_RAI
+ QUERY4_RAI_CIRCUIT_ID
+ QUERY4_RAI_REMOTE_ID
LEASE4_ADDRESS
LEASE4_CLTT
LEASE4_HOSTNAME
const DuidPtr duid,
const string& prefix,
const string& suffix) {
- string data = "";
if (duid) {
RunScriptImpl::extractString(vars, duid->toText(),
prefix, suffix);
}
}
+void
+RunScriptImpl::extractOption(ProcessEnvVars& vars,
+ const OptionPtr option,
+ const string& prefix,
+ const string& suffix) {
+ if (option) {
+ RunScriptImpl::extractString(vars, option->toHexString(), prefix, suffix);
+ } else {
+ RunScriptImpl::extractString(vars, "", prefix, suffix);
+ }
+}
+
+void
+RunScriptImpl::extractSubOption(ProcessEnvVars& vars,
+ const OptionPtr option,
+ uint16_t code,
+ const string& prefix,
+ const string& suffix) {
+ if (option) {
+ RunScriptImpl::extractOption(vars, option->getOption(code), prefix, suffix);
+ } else {
+ RunScriptImpl::extractString(vars, "", prefix, suffix);
+ }
+}
+
void
RunScriptImpl::extractOptionIA(ProcessEnvVars& vars,
const Option6IAPtr option6IA,
prefix + "_LOCAL_HWADDR", suffix);
RunScriptImpl::extractHWAddr(vars, pkt4->getRemoteHWAddr(),
prefix + "_REMOTE_HWADDR", suffix);
+ RunScriptImpl::extractOption(vars, pkt4->getOption(82),
+ prefix + "_RAI", suffix);
+ RunScriptImpl::extractSubOption(vars, pkt4->getOption(82), 1,
+ prefix + "_RAI_CIRCUIT_ID", suffix);
+ RunScriptImpl::extractSubOption(vars, pkt4->getOption(82), 2,
+ prefix + "_RAI_REMOTE_ID", suffix);
} else {
RunScriptImpl::extractString(vars, "", prefix + "_TYPE", suffix);
RunScriptImpl::extractString(vars, "", prefix + "_TXID", suffix);
prefix + "_LOCAL_HWADDR", suffix);
RunScriptImpl::extractHWAddr(vars, HWAddrPtr(),
prefix + "_REMOTE_HWADDR", suffix);
+ RunScriptImpl::extractString(vars, "", prefix + "_RAI", suffix);
+ RunScriptImpl::extractString(vars, "",
+ prefix + "_RAI_CIRCUIT_ID", suffix);
+ RunScriptImpl::extractString(vars, "",
+ prefix + "_RAI_REMOTE_ID", suffix);
}
}
QUERY4_LOCAL_HWADDR_TYPE
QUERY4_REMOTE_HWADDR
QUERY4_REMOTE_HWADDR_TYPE
+QUERY4_RAI
+QUERY4_RAI_CIRCUIT_ID
+QUERY4_RAI_REMOTE_ID
SUBNET4_ID
SUBNET4_NAME
SUBNET4_PREFIX
QUERY4_LOCAL_HWADDR_TYPE
QUERY4_REMOTE_HWADDR
QUERY4_REMOTE_HWADDR_TYPE
+QUERY4_RAI
+QUERY4_RAI_CIRCUIT_ID
+QUERY4_RAI_REMOTE_ID
LEASES4_SIZE
DELETED_LEASES4_SIZE
QUERY4_LOCAL_HWADDR_TYPE
QUERY4_REMOTE_HWADDR
QUERY4_REMOTE_HWADDR_TYPE
+QUERY4_RAI
+QUERY4_RAI_CIRCUIT_ID
+QUERY4_RAI_REMOTE_ID
LEASE4_ADDRESS
LEASE4_CLTT
LEASE4_HOSTNAME
QUERY4_LOCAL_HWADDR_TYPE
QUERY4_REMOTE_HWADDR
QUERY4_REMOTE_HWADDR_TYPE
+QUERY4_RAI
+QUERY4_RAI_CIRCUIT_ID
+QUERY4_RAI_REMOTE_ID
LEASE4_ADDRESS
LEASE4_CLTT
LEASE4_HOSTNAME
/// @brief Extract HWAddr data and append to environment.
///
- /// @param value The hwaddr to be exported to target script environment.
+ /// @param hwaddr The hwaddr to be exported to target script environment.
/// @param prefix The prefix for the name of the environment variable.
/// @param suffix The suffix for the name of the environment variable.
static void extractHWAddr(isc::asiolink::ProcessEnvVars& vars,
/// @brief Extract DUID data and append to environment.
///
- /// @param value The duid to be exported to target script environment.
+ /// @param duid The duid to be exported to target script environment.
/// @param prefix The prefix for the name of the environment variable.
/// @param suffix The suffix for the name of the environment variable.
static void extractDUID(isc::asiolink::ProcessEnvVars& vars,
const std::string& prefix = "",
const std::string& suffix = "");
+ /// @brief Extract Option data and append to environment.
+ ///
+ /// @param option The option to be exported to target script environment.
+ /// @param prefix The prefix for the name of the environment variable.
+ /// @param suffix The suffix for the name of the environment variable.
+ static void extractOption(isc::asiolink::ProcessEnvVars& vars,
+ const isc::dhcp::OptionPtr option,
+ const std::string& prefix = "",
+ const std::string& suffix = "");
+
+ /// @brief Extract Option SubOption data and append to environment.
+ ///
+ /// @param option The parent option of the suboption to be exported to
+ /// target script environment.
+ /// @param code The code of the suboption.
+ /// @param prefix The prefix for the name of the environment variable.
+ /// @param suffix The suffix for the name of the environment variable.
+ static void extractSubOption(isc::asiolink::ProcessEnvVars& vars,
+ const isc::dhcp::OptionPtr option,
+ uint16_t code,
+ const std::string& prefix = "",
+ const std::string& suffix = "");
+
/// @brief Extract Option6IA data and append to environment.
///
- /// @param value The option6IA to be exported to target script environment.
+ /// @param option6IA The option6IA to be exported to target script environment.
/// @param prefix The prefix for the name of the environment variable.
/// @param suffix The suffix for the name of the environment variable.
static void extractOptionIA(isc::asiolink::ProcessEnvVars& vars,
/// @brief Extract Subnet4 data and append to environment.
///
- /// @param value The subnet4 to be exported to target script environment.
+ /// @param subnet4 The subnet4 to be exported to target script environment.
/// @param prefix The prefix for the name of the environment variable.
/// @param suffix The suffix for the name of the environment variable.
static void extractSubnet4(isc::asiolink::ProcessEnvVars& vars,
/// @brief Extract Subnet6 data and append to environment.
///
- /// @param value The subnet6 to be exported to target script environment.
+ /// @param subnet6 The subnet6 to be exported to target script environment.
/// @param prefix The prefix for the name of the environment variable.
/// @param suffix The suffix for the name of the environment variable.
static void extractSubnet6(isc::asiolink::ProcessEnvVars& vars,
/// @brief Extract Lease4 data and append to environment.
///
- /// @param value The lease4 to be exported to target script environment.
+ /// @param lease4 The lease4 to be exported to target script environment.
/// @param prefix The prefix for the name of the environment variable.
/// @param suffix The suffix for the name of the environment variable.
static void extractLease4(isc::asiolink::ProcessEnvVars& vars,
/// @brief Extract Lease6 data and append to environment.
///
- /// @param value The lease6 to be exported to target script environment.
+ /// @param lease6 The lease6 to be exported to target script environment.
/// @param prefix The prefix for the name of the environment variable.
/// @param suffix The suffix for the name of the environment variable.
static void extractLease6(isc::asiolink::ProcessEnvVars& vars,
/// @brief Extract Lease4Collection data and append to environment.
///
- /// @param value The leases4 to be exported to target script environment.
+ /// @param leases4 The leases4 to be exported to target script environment.
/// @param prefix The prefix for the name of the environment variable.
/// @param suffix The suffix for the name of the environment variable.
static void extractLeases4(isc::asiolink::ProcessEnvVars& vars,
/// @brief Extract Lease6Collection data and append to environment.
///
- /// @param value The leases6 to be exported to target script environment.
+ /// @param leases6 The leases6 to be exported to target script environment.
/// @param prefix The prefix for the name of the environment variable.
/// @param suffix The suffix for the name of the environment variable.
static void extractLeases6(isc::asiolink::ProcessEnvVars& vars,
/// @brief Extract Pkt4 data and append to environment.
///
- /// @param value The pkt4 to be exported to target script environment.
+ /// @param pkt4 The pkt4 to be exported to target script environment.
/// @param prefix The prefix for the name of the environment variable.
/// @param suffix The suffix for the name of the environment variable.
static void extractPkt4(isc::asiolink::ProcessEnvVars& vars,
/// @brief Extract Pkt6 data and append to environment.
///
- /// @param value The pkt6 to be exported to target script environment.
+ /// @param pkt6 The pkt6 to be exported to target script environment.
/// @param prefix The prefix for the name of the environment variable.
/// @param suffix The suffix for the name of the environment variable.
static void extractPkt6(isc::asiolink::ProcessEnvVars& vars,
TEST_EQ "QUERY4_LOCAL_HWADDR_TYPE" "1"
TEST_EQ "QUERY4_REMOTE_HWADDR" "00:01:02:03"
TEST_EQ "QUERY4_REMOTE_HWADDR_TYPE" "1"
+ TEST_EQ "QUERY4_RAI" "0x0105686F776479020587F67977EF06061A2B3C4D5E6F"
+ TEST_EQ "QUERY4_RAI_CIRCUIT_ID" "0x686F776479"
+ TEST_EQ "QUERY4_RAI_REMOTE_ID" "0x87F67977EF"
TEST_EQ "SUBNET4_ID" "6"
TEST_EQ "SUBNET4_NAME" "182.168.0.1/2"
TEST_EQ "SUBNET4_PREFIX" "182.168.0.1"
TEST_EQ "QUERY4_LOCAL_HWADDR_TYPE" "1"
TEST_EQ "QUERY4_REMOTE_HWADDR" "00:01:02:03"
TEST_EQ "QUERY4_REMOTE_HWADDR_TYPE" "1"
+ TEST_EQ "QUERY4_RAI" "0x0105686F776479020587F67977EF06061A2B3C4D5E6F"
+ TEST_EQ "QUERY4_RAI_CIRCUIT_ID" "0x686F776479"
+ TEST_EQ "QUERY4_RAI_REMOTE_ID" "0x87F67977EF"
TEST_EQ "LEASES4_SIZE" "2"
TEST_EQ "LEASES4_AT0_ADDRESS" ""
TEST_EQ "LEASES4_AT0_CLTT" ""
TEST_EQ "QUERY4_LOCAL_HWADDR_TYPE" "1"
TEST_EQ "QUERY4_REMOTE_HWADDR" "00:01:02:03"
TEST_EQ "QUERY4_REMOTE_HWADDR_TYPE" "1"
+ TEST_EQ "QUERY4_RAI" "0x0105686F776479020587F67977EF06061A2B3C4D5E6F"
+ TEST_EQ "QUERY4_RAI_CIRCUIT_ID" "0x686F776479"
+ TEST_EQ "QUERY4_RAI_REMOTE_ID" "0x87F67977EF"
TEST_EQ "LEASE4_ADDRESS" "192.168.0.1"
TEST_EQ "LEASE4_CLTT" "3"
TEST_EQ "LEASE4_HOSTNAME" "test.hostname"
TEST_EQ "QUERY4_LOCAL_HWADDR_TYPE" "1"
TEST_EQ "QUERY4_REMOTE_HWADDR" "00:01:02:03"
TEST_EQ "QUERY4_REMOTE_HWADDR_TYPE" "1"
+ TEST_EQ "QUERY4_RAI" "0x0105686F776479020587F67977EF06061A2B3C4D5E6F"
+ TEST_EQ "QUERY4_RAI_CIRCUIT_ID" "0x686F776479"
+ TEST_EQ "QUERY4_RAI_REMOTE_ID" "0x87F67977EF"
TEST_EQ "LEASE4_ADDRESS" "192.168.0.1"
TEST_EQ "LEASE4_CLTT" "3"
TEST_EQ "LEASE4_HOSTNAME" "test.hostname"
#include <asiolink/io_service.h>
#include <cc/data.h>
#include <dhcp/dhcp6.h>
+#include <dhcp/option.h>
+#include <dhcp/option_custom.h>
+#include <dhcp/option_int.h>
#include <hooks/callout_manager.h>
#include <hooks/hooks.h>
#include <hooks/hooks_manager.h>
return (ClientIdPtr(new ClientId({0, 1, 2, 3, 4, 5, 6})));
}
+/// @brief Generate a valid Option.
+///
+/// @param universe The option universe (V4 or V6).
+/// @param code The Option code to use.
+/// @return The generated Option.
+OptionPtr
+generateOption(Option::Universe universe, uint16_t code, OptionBuffer& data) {
+ OptionDefinitionPtr def = LibDHCP::getOptionDef(universe == Option::V4 ?
+ DHCP4_OPTION_SPACE : DHCP6_OPTION_SPACE,
+ code);
+ if (def) {
+ return (OptionCustomPtr(new OptionCustom(*def, universe, data)));
+ }
+
+ return (OptionPtr());
+}
+
/// @brief Generate a valid Option6IA.
///
/// @return The generated Option6IA.
pkt4->setLocalHWAddr(generateHWAddr());
pkt4->setRemoteHWAddr(generateHWAddr());
+ OptionDefinitionPtr rai_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE,
+ DHO_DHCP_AGENT_OPTIONS);
+
+ OptionCustomPtr rai(new OptionCustom(*rai_def, Option::V4));
+
+ uint8_t circuit_id[] = { 0x68, 0x6F, 0x77, 0x64, 0x79 };
+ OptionPtr circuit_id_opt(new Option(Option::V4, RAI_OPTION_AGENT_CIRCUIT_ID,
+ OptionBuffer(circuit_id,
+ circuit_id + sizeof(circuit_id))));
+ rai->addOption(circuit_id_opt);
+
+ uint8_t subscriber_id[] = { 0x1a, 0x2b, 0x3c, 0x4d, 0x5e, 0x6f };
+ OptionPtr subscriber_id_opt(new Option(Option::V4, RAI_OPTION_SUBSCRIBER_ID,
+ OptionBuffer(subscriber_id,
+ subscriber_id + sizeof(subscriber_id))));
+ rai->addOption(subscriber_id_opt);
+
+ uint8_t remote_id[] = { 0x87, 0xF6, 0x79, 0x77, 0xEF };
+ OptionPtr remote_id_opt(new Option(Option::V4, RAI_OPTION_REMOTE_ID,
+ OptionBuffer(remote_id,
+ remote_id + sizeof(remote_id))));
+ rai->addOption(remote_id_opt);
+
+ pkt4->addOption(rai);
+
return (pkt4);
}
EXPECT_EQ(expected, join(vars));
}
+/// @brief Tests the extractOption method works as expected.
+TEST(RunScript, extractOption) {
+ ProcessEnvVars vars;
+ OptionPtr option;
+ RunScriptImpl::extractOption(vars, option, "OPTION_PREFIX", "_OPTION_SUFFIX");
+ ASSERT_EQ(1, vars.size());
+ string expected = "OPTION_PREFIX_OPTION_SUFFIX=\n";
+ EXPECT_EQ(expected, join(vars));
+ vars.clear();
+ OptionBuffer buffer = { 0xca, 0xfe, 0xba, 0xbe };
+ option = generateOption(Option::V4, DHO_USER_CLASS, buffer);
+ RunScriptImpl::extractOption(vars, option, "OPTION_PREFIX", "_OPTION_SUFFIX");
+ ASSERT_EQ(1, vars.size());
+ expected = "OPTION_PREFIX_OPTION_SUFFIX=0xCAFEBABE\n";
+ EXPECT_EQ(expected, join(vars));
+}
+
+/// @brief Tests the extractSubOption method works as expected.
+TEST(RunScript, extractSubOption) {
+ ProcessEnvVars vars;
+ OptionPtr option;
+ RunScriptImpl::extractOption(vars, option, "OPTION_SUBOPTION_PREFIX", "_OPTION_SUBOPTION_SUFFIX");
+ ASSERT_EQ(1, vars.size());
+ string expected = "OPTION_SUBOPTION_PREFIX_OPTION_SUBOPTION_SUFFIX=\n";
+ EXPECT_EQ(expected, join(vars));
+ vars.clear();
+ OptionBuffer data;
+ option = generateOption(Option::V4, DHO_DHCP_AGENT_OPTIONS, data);
+ uint8_t subscriber_id[] = { 0x1a, 0x2b, 0x3c, 0x4d, 0x5e, 0x6f };
+ OptionPtr subscriber_id_opt(new Option(Option::V4, RAI_OPTION_SUBSCRIBER_ID,
+ OptionBuffer(subscriber_id,
+ subscriber_id + sizeof(subscriber_id))));
+ option->addOption(subscriber_id_opt);
+ RunScriptImpl::extractSubOption(vars, option, RAI_OPTION_SUBSCRIBER_ID, "OPTION_SUBOPTION_PREFIX", "_OPTION_SUBOPTION_SUFFIX");
+ ASSERT_EQ(1, vars.size());
+ expected = "OPTION_SUBOPTION_PREFIX_OPTION_SUBOPTION_SUFFIX=0x1A2B3C4D5E6F\n";
+ EXPECT_EQ(expected, join(vars));
+}
+
/// @brief Tests the extractOptionIA method works as expected.
TEST(RunScript, extractOptionIA) {
ProcessEnvVars vars;
ProcessEnvVars vars;
Pkt4Ptr pkt4;
RunScriptImpl::extractPkt4(vars, pkt4, "PKT4_PREFIX", "_PKT4_SUFFIX");
- ASSERT_EQ(22, vars.size());
+ ASSERT_EQ(25, vars.size());
string expected = "PKT4_PREFIX_TYPE_PKT4_SUFFIX=\n"
"PKT4_PREFIX_TXID_PKT4_SUFFIX=\n"
"PKT4_PREFIX_LOCAL_ADDR_PKT4_SUFFIX=\n"
"PKT4_PREFIX_LOCAL_HWADDR_PKT4_SUFFIX=\n"
"PKT4_PREFIX_LOCAL_HWADDR_TYPE_PKT4_SUFFIX=\n"
"PKT4_PREFIX_REMOTE_HWADDR_PKT4_SUFFIX=\n"
- "PKT4_PREFIX_REMOTE_HWADDR_TYPE_PKT4_SUFFIX=\n";
+ "PKT4_PREFIX_REMOTE_HWADDR_TYPE_PKT4_SUFFIX=\n"
+ "PKT4_PREFIX_RAI_PKT4_SUFFIX=\n"
+ "PKT4_PREFIX_RAI_CIRCUIT_ID_PKT4_SUFFIX=\n"
+ "PKT4_PREFIX_RAI_REMOTE_ID_PKT4_SUFFIX=\n";
EXPECT_EQ(expected, join(vars));
vars.clear();
pkt4 = generatePkt4();
RunScriptImpl::extractPkt4(vars, pkt4, "PKT4_PREFIX", "_PKT4_SUFFIX");
- ASSERT_EQ(22, vars.size());
+ ASSERT_EQ(25, vars.size());
expected = "PKT4_PREFIX_TYPE_PKT4_SUFFIX=UNKNOWN\n"
"PKT4_PREFIX_TXID_PKT4_SUFFIX=0\n"
"PKT4_PREFIX_LOCAL_ADDR_PKT4_SUFFIX=0.0.0.0\n"
"PKT4_PREFIX_LOCAL_HWADDR_PKT4_SUFFIX=00:01:02:03\n"
"PKT4_PREFIX_LOCAL_HWADDR_TYPE_PKT4_SUFFIX=1\n"
"PKT4_PREFIX_REMOTE_HWADDR_PKT4_SUFFIX=00:01:02:03\n"
- "PKT4_PREFIX_REMOTE_HWADDR_TYPE_PKT4_SUFFIX=1\n";
+ "PKT4_PREFIX_REMOTE_HWADDR_TYPE_PKT4_SUFFIX=1\n"
+ "PKT4_PREFIX_RAI_PKT4_SUFFIX=0x0105686F776479020587F67977EF06061A2B3C4D5E6F\n"
+ "PKT4_PREFIX_RAI_CIRCUIT_ID_PKT4_SUFFIX=0x686F776479\n"
+ "PKT4_PREFIX_RAI_REMOTE_ID_PKT4_SUFFIX=0x87F67977EF\n";
EXPECT_EQ(expected, join(vars));
}