42        return (
"Raw Socket");
 
   48        return (
"IPv6 Link Local");
 
   51        return (
"Client Address Relay Option");
 
   57        return (
"Subscriber ID");
 
   60        return (
"DOCSIS CMTS");
 
   63        return (
"DOCSIS MODEM");
 
 
   73    std::stringstream stream;
 
   75    stream << lease->addr_;
 
   77        stream << 
"/" << 
static_cast<int>(lease->prefixlen_);
 
   80    return (stream.str());
 
 
   98            isc_throw(EvalTypeError, 
"Can not create token using non IPv6 address type");
 
 
  110        Pkt6* pkt6 = 
dynamic_cast<Pkt6*
>(&pkt);
 
  115            auto const& ia = boost::dynamic_pointer_cast<Option6IA>(it.second);
 
  116            if (ia && ia->getIAID() == lease_->iaid_) {
 
  118                for (
auto const& opt_it : opts) {
 
  123                            boost::dynamic_pointer_cast<Option6IAAddr>(opt_it.second);
 
  127                    if (iaaddr->getAddress() == lease_->addr_) {
 
  129                        ia_na->addOption(iaaddr);
 
  130                        for (
auto const& other_opt_it : opts) {
 
  131                            if (other_opt_it.second->getType() == 
D6O_IAADDR ||
 
  135                            ia_na->addOption(other_opt_it.second);
 
 
 
  246            isc_throw(EvalTypeError, 
"Can not create token using non IPv6 prefix type");
 
 
  258        Pkt6* pkt6 = 
dynamic_cast<Pkt6*
>(&pkt);
 
  263            auto const& ia = boost::dynamic_pointer_cast<Option6IA>(it.second);
 
  264            if (ia && ia->getIAID() == lease_->iaid_) {
 
  266                for (
auto const& opt_it : opts) {
 
  271                            boost::dynamic_pointer_cast<Option6IAPrefix>(opt_it.second);
 
  275                    if ((iaprefix->getAddress() == lease_->addr_) &&
 
  276                        (iaprefix->getLength() == lease_->prefixlen_)) {
 
  278                        ia_pd->addOption(iaprefix);
 
  279                        for (
auto const& other_opt_it : opts) {
 
  280                            if (other_opt_it.second->getType() == 
D6O_IAADDR ||
 
  284                            ia_pd->addOption(other_opt_it.second);
 
 
 
  395    for (
size_t i = 0; i < expression.size(); ++i) {
 
  396        boost::shared_ptr<TokenSubOption> suboption = boost::dynamic_pointer_cast<TokenSubOption>(expression[i]);
 
  407        boost::shared_ptr<TokenOption> option = boost::dynamic_pointer_cast<TokenOption>(expression[i]);
 
 
  430    for (
size_t i = 0; i < expression.size(); ++i) {
 
  431        boost::shared_ptr<TokenSubOption> suboption = boost::dynamic_pointer_cast<TokenSubOption>(expression[i]);
 
  442        boost::shared_ptr<TokenOption> option = boost::dynamic_pointer_cast<TokenOption>(expression[i]);
 
 
  484                    const Lease6Ptr& lease, std::string& value) {
 
  485    bool using_custom_format = 
false;
 
  488    if (expression && query) {
 
  492        using_custom_format = 
true;
 
  496    if (expression && response) {
 
  500        using_custom_format = 
true;
 
  503    return (using_custom_format);
 
 
  553    std::stringstream stream;
 
  557        stream << 
"Address: " << lease->addr_;
 
  559        stream << 
"Prefix: " << lease->addr_ << 
"/" << 
static_cast<int>(lease->prefixlen_);
 
  572    stream << 
" a device with DUID: " << lease->duid_->toText();
 
  574    if (lease->hwaddr_) {
 
  575        stream << 
" and hardware address: " << lease->hwaddr_->toText()
 
  580    if (query->relay_info_.size()) {
 
  582        stream << 
" connected via relay at address: " << server_relay.
peeraddr_.
toText()
 
  584               << 
", hop count: " << 
static_cast<int>(server_relay.
hop_count_);
 
  586        std::ostringstream idstream;
 
  607                if (!idstream.str().empty()) {
 
  619        if (!idstream.str().empty()) {
 
  620            stream << 
", identified by " << idstream.str();
 
  624        std::ostringstream location;
 
  630                if (!idstream.str().empty()) {
 
  642        if (!location.str().empty()) {
 
  643            stream << 
", connected at location " << location.str();
 
  650        stream << 
", context: " << ctx->str();
 
 
  653    return (stream.str());
 
  703    } 
catch (
const std::exception& ex) {
 
 
  751    handle.
getArgument(
"deleted_leases6", deleted_leases);
 
  752    handle.
setContext(
"deleted_leases6", deleted_leases);
 
 
  775    int result = current;
 
  778        for (
auto const& lease : *leases) {
 
  790        for (
auto const& lease : *leases) {
 
 
  824    deleted_leases->push_back(lease);
 
  825    handle.
setContext(
"deleted_leases6", deleted_leases);
 
 
  852    deleted_leases->push_back(lease);
 
  853    handle.
setContext(
"deleted_leases6", deleted_leases);
 
 
CalloutNextStep
Specifies allowed next steps.
@ NEXT_STEP_DROP
drop the packet
@ NEXT_STEP_SKIP
skip the next processing step
std::string toText() const
Convert the address to a string.
static CfgMgr & instance()
returns a single instance of Configuration Manager
SrvConfigPtr getCurrentCfg()
Returns a pointer to the current configuration.
static LegalLogMgrPtr & instance(ManagerID id=0)
Returns the forensic backend manager with specified ID.
static std::string vectorHexDump(const std::vector< uint8_t > &bytes, const std::string &delimiter=":")
Creates a string of hex digit pairs from a vector of bytes.
static std::string genDurationString(const uint32_t secs)
Translates seconds into a text string of days, hours, minutes and seconds.
static std::string vectorDump(const std::vector< uint8_t > &bytes)
Creates a string from a vector of printable bytes.
Represents a DHCPv6 packet.
@ RELAY_SEARCH_FROM_CLIENT
Base class for classes representing DHCP messages.
isc::dhcp::OptionCollection getOptions(const uint16_t type)
Returns all instances of specified type.
Filter all IA_NA so that no sub-option is matched by the expression.
unsigned evaluate(Pkt &pkt, ValueStack &values)
Evaluate the expression using the TokenSubOption implementation.
TokenFilterIA_NASuboption(const RepresentationType &rep_type)
Constructor.
virtual OptionPtr getOption(Pkt &pkt)
Get no option regardless of what the packet contains.
Filter all IA_NA so that no option is matched by the expression.
virtual OptionPtr getOption(Pkt &)
Get no option regardless of what the packet contains.
TokenFilterIA_NA(const RepresentationType &rep_type)
Constructor.
Filter all IA_PD so that no sub-option is matched by the expression.
TokenFilterIA_PDSuboption(const RepresentationType &rep_type)
Constructor.
virtual OptionPtr getOption(Pkt &pkt)
Get no option regardless of what the packet contains.
unsigned evaluate(Pkt &pkt, ValueStack &values)
Evaluate the expression using the TokenSubOption implementation.
Filter all IA_PD so that no option is matched by the expression.
virtual OptionPtr getOption(Pkt &)
Get no option regardless of what the packet contains.
TokenFilterIA_PD(const RepresentationType &rep_type)
Constructor.
Filter the IA_NA (3) option containing the OPTION_IAADDR (5) option matching the respective lease.
unsigned evaluate(Pkt &pkt, ValueStack &values)
Evaluate the expression using the TokenSubOption implementation.
TokenLeaseIA_NASuboption(const Lease6Ptr &lease, const RepresentationType &rep_type)
Constructor.
virtual OptionPtr getOption(Pkt &pkt)
Get the IA_NA (3) option containing the OPTION_IAADDR (5) option matching the respective lease.
Filter the IA_NA (3) option containing the OPTION_IAADDR (5) option matching the respective lease.
virtual OptionPtr getOption(Pkt &pkt)
Get the IA_NA (3) option containing the OPTION_IAADDR (5) option matching the respective lease.
TokenLeaseIA_NA(const Lease6Ptr &lease, const RepresentationType &rep_type)
Constructor.
Filter the IA_PD (25) option containing the OPTION_IAPREFIX (25) option matching the respective lease...
TokenLeaseIA_PDSuboption(const Lease6Ptr &lease, const RepresentationType &rep_type)
Constructor.
unsigned evaluate(Pkt &pkt, ValueStack &values)
Evaluate the expression using the TokenSubOption implementation.
virtual OptionPtr getOption(Pkt &pkt)
Get the IA_PD (25) option containing the OPTION_IAPREFIX (25) option matching the respective lease.
Filter the IA_PD (25) option containing the OPTION_IAPREFIX (25) option matching the respective lease...
virtual OptionPtr getOption(Pkt &pkt)
Get the IA_PD (25) option containing the OPTION_IAPREFIX (25) option matching the respective lease.
TokenLeaseIA_PD(const Lease6Ptr &lease, const RepresentationType &rep_type)
Constructor.
Token that represents a value of an option.
RepresentationType
Token representation type.
TokenOption(const uint16_t option_code, const RepresentationType &rep_type)
Constructor that takes an option code as a parameter.
virtual unsigned evaluate(Pkt &pkt, ValueStack &values)
This is a method for evaluating a packet.
TokenSubOption(const uint16_t option_code, const uint16_t sub_option_code, const RepresentationType &rep_type)
Constructor that takes an option and sub-option codes as parameter.
Per-packet callout handle.
void getContext(const std::string &name, T &value) const
Get context.
void setContext(const std::string &name, T value)
Set context.
CalloutNextStep getStatus() const
Returns the next processing step.
void getArgument(const std::string &name, T &value) const
Get argument.
int getCurrentLibrary() const
Get current library index.
static const uint32_t HWADDR_SOURCE_RAW
Obtained first hand from raw socket (100% reliable).
static const uint32_t HWADDR_SOURCE_REMOTE_ID
A relay can insert remote-id.
static const uint32_t HWADDR_SOURCE_CLIENT_ADDR_RELAY_OPTION
Get it from RFC6939 option.
static const uint32_t HWADDR_SOURCE_IPV6_LINK_LOCAL
Extracted from IPv6 link-local address.
static const uint32_t HWADDR_SOURCE_DOCSIS_MODEM
A cable modem (acting as DHCP client) that supports DOCSIS standard can insert DOCSIS options that co...
static const uint32_t HWADDR_SOURCE_DUID
Extracted from DUID-LL or DUID-LLT (not 100% reliable as the client can send fake DUID).
static const uint32_t HWADDR_SOURCE_DOCSIS_CMTS
A CMTS (acting as DHCP relay agent) that supports DOCSIS standard can insert DOCSIS options that cont...
static const uint32_t HWADDR_SOURCE_SUBSCRIBER_ID
A relay can insert a subscriber-id option.
void replaceTokensForLease(isc::dhcp::ExpressionPtr &expression, const Lease6Ptr &lease)
Replace TokenOption and TokenSubOption expression tokens for all IA_NA and IA_PD options and sub-opti...
int leases6_committed(CalloutHandle &handle)
This callout is called at the "leases6_committed" hook.
void filterLeaseIA_NA(isc::dhcp::Expression &expression, const Lease6Ptr &lease)
Replace TokenOption and TokenSubOption expression tokens with the IA_NA (3) option containing the OPT...
std::string genLease6Entry(CalloutHandle &handle, const Pkt6Ptr &query, const Pkt6Ptr &response, const Lease6Ptr &lease, const Action &action)
Creates legal store entry for a DHCPv6 Lease.
int lease6_release(CalloutHandle &handle)
This callout is called at the "lease6_release" hook.
void filterLeaseIA_PD(isc::dhcp::Expression &expression, const Lease6Ptr &lease)
Replace TokenOption and TokenSubOption expression tokens with the IA_PD (25) option containing the OP...
std::string genLease6Addr(const Lease6Ptr &lease)
Creates legal store address column for a DHCPv6 Lease.
int pkt6_send(CalloutHandle &handle)
This callout is called at the "pkt6_send" hook.
std::string hwaddrSourceToString(uint32_t source)
Function which converts hardware address source to a string.
int pkt6_receive(CalloutHandle &handle)
This callout is called at the "pkt6_receive" hook.
bool getCustomEntry(CalloutHandle &handle, const Pkt6Ptr &query, const Pkt6Ptr &response, const Lease6Ptr &lease, std::string &value)
Create custom log entry for the current lease.
int legalLog6Handler(CalloutHandle &handle, const Action &action)
Produces an DHCPv6 legal log entry from a callout handle.
int lease6_decline(CalloutHandle &handle)
This callout is called at the "lease6_decline" hook.
const isc::log::MessageID LEGAL_LOG_LEASE6_NO_LEGAL_STORE
const isc::log::MessageID LEGAL_LOG_LEASE6_WRITE_ERROR
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Token > TokenPtr
Pointer to a single Token.
boost::shared_ptr< const Subnet6 > ConstSubnet6Ptr
A const pointer to a Subnet6 object.
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
std::vector< Lease6Ptr > Lease6Collection
A collection of IPv6 leases.
std::multimap< unsigned int, OptionPtr > OptionCollection
A collection of DHCP (v4 or v6) options.
std::string evaluateString(const Expression &expr, Pkt &pkt)
Evaluate a RPN expression for a v4 or v6 packet and return a string value.
boost::shared_ptr< Option6IAPrefix > Option6IAPrefixPtr
Pointer to the Option6IAPrefix object.
const string actionToVerb(Action action)
Translates an Action into its corresponding verb.
boost::shared_ptr< Expression > ExpressionPtr
boost::shared_ptr< Option6IAAddr > Option6IAAddrPtr
A pointer to the isc::dhcp::Option6IAAddr object.
boost::shared_ptr< const CfgSubnets6 > ConstCfgSubnets6Ptr
Const pointer.
boost::shared_ptr< Lease6Collection > Lease6CollectionPtr
A shared pointer to the collection of IPv6 leases.
boost::shared_ptr< Pkt6 > Pkt6Ptr
A pointer to Pkt6 packet.
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
std::vector< TokenPtr > Expression
This is a structure that holds an expression converted to RPN.
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
boost::shared_ptr< Option > OptionPtr
Action
Describe what kind of event is being logged.
std::stack< std::string > ValueStack
Evaluated values are stored as a stack of strings.
isc::log::Logger legal_log_logger("legal-log-hooks")
Legal Log Logger.
bool isLoggingDisabled(const SubnetPtrType &subnet)
Checks if legal logging is disabled for a subnet.
bool isPrintable(const string &content)
Check if a string is printable.
Defines the logger used by the top-level component of kea-lfc.
@ TYPE_PD
the lease contains IPv6 prefix (for prefix delegation)
@ TYPE_NA
the lease contains non-temporary IPv6 address
structure that describes a single relay information
isc::asiolink::IOAddress linkaddr_
fixed field in relay-forw/relay-reply
uint8_t hop_count_
number of traversed relays (up to 32)
isc::asiolink::IOAddress peeraddr_
fixed field in relay-forw/relay-reply