blob: 530f10d703a28ec1f02f033dc2da98c2ea723bd1 [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/**
* Copyright (C) 2013 Regents of the University of California.
* See COPYING for copyright and distribution information.
*/
#ifndef NDN_MANAGEMENT_NDND_FACE_INSTANCE_HPP
#define NDN_MANAGEMENT_NDND_FACE_INSTANCE_HPP
#include "../encoding/tlv-ndnd.hpp"
#include "../encoding/block.hpp"
#include "../name.hpp"
namespace ndn {
namespace ndnd {
/**
* An FaceInstance holds an action and Name prefix and other fields for an forwarding entry.
*/
class FaceInstance {
public:
FaceInstance(const std::string& action,
int64_t faceId,
uint32_t ipProto,
const std::string& host,
const std::string& port,
const std::string& multicastInterface,
uint32_t multicastTtl,
const time::milliseconds& freshnessPeriod)
: action_(action)
, faceId_(faceId)
, ipProto_(ipProto)
, host_(host)
, port_(port)
, multicastInterface_(multicastInterface)
, multicastTtl_(multicastTtl)
, freshnessPeriod_(freshnessPeriod)
{
}
FaceInstance()
: faceId_(-1)
, ipProto_(-1)
, multicastTtl_(-1)
, freshnessPeriod_(time::milliseconds::min())
{
}
/**
* @brief Create from wire encoding
*/
explicit
FaceInstance(const Block& wire)
{
wireDecode(wire);
}
// Action
const std::string&
getAction() const { return action_; }
void
setAction(const std::string& action) { action_ = action; wire_.reset(); }
// FaceID
int64_t
getFaceId() const { return faceId_; }
void
setFaceId(int64_t faceId) { faceId_ = faceId; wire_.reset(); }
// IPProto
int32_t
getIpProto() const { return ipProto_; }
void
setIpProto(int32_t ipProto) { ipProto_ = ipProto; wire_.reset(); }
// Host
const std::string&
getHost() const { return host_; }
void
setHost(const std::string& host) { host_ = host; wire_.reset(); }
// Port
const std::string&
getPort() const { return port_; }
void
setPort(const std::string& port) { port_ = port; wire_.reset(); }
// MulticastInterface
const std::string&
getMulticastInterface() const { return multicastInterface_; }
void
setMulticastInterface(const std::string& multicastInterface)
{
multicastInterface_ = multicastInterface; wire_.reset();
}
// MulticastTTL
int32_t
getMulticastTtl() const { return multicastTtl_; }
void
setMulticastTtl(int32_t multicastTtl) { multicastTtl_ = multicastTtl; wire_.reset(); }
// Freshness
const time::milliseconds&
getFreshnessPeriod() const { return freshnessPeriod_; }
void
setFreshnessPeriod(const time::milliseconds& freshnessPeriod)
{
freshnessPeriod_ = freshnessPeriod; wire_.reset();
}
// Wire
inline const Block&
wireEncode() const;
inline void
wireDecode(const Block& wire);
private:
std::string action_;
int64_t faceId_;
int32_t ipProto_;
std::string host_;
std::string port_;
std::string multicastInterface_;
int32_t multicastTtl_;
time::milliseconds freshnessPeriod_;
mutable Block wire_;
};
inline const Block&
FaceInstance::wireEncode() const
{
if (wire_.hasWire())
return wire_;
// FaceInstance ::= FACE-INSTANCE-TYPE TLV-LENGTH
// Action?
// FaceID?
// IPProto?
// Host?
// Port?
// MulticastInterface?
// MulticastTTL?
// FreshnessPeriod?
wire_ = Block(tlv::ndnd::FaceInstance);
// Action
if (!action_.empty())
{
wire_.push_back
(dataBlock(tlv::ndnd::Action, action_.c_str(), action_.size()));
}
// FaceID
if (faceId_ >= 0)
{
wire_.push_back
(nonNegativeIntegerBlock(tlv::ndnd::FaceID, faceId_));
}
// IPProto
if (ipProto_ >= 0)
{
wire_.push_back
(nonNegativeIntegerBlock(tlv::ndnd::IPProto, ipProto_));
}
// Host
if (!host_.empty())
{
wire_.push_back
(dataBlock(tlv::ndnd::Host, host_.c_str(), host_.size()));
}
// Port
if (!port_.empty())
{
wire_.push_back
(dataBlock(tlv::ndnd::Port, port_.c_str(), port_.size()));
}
// MulticastInterface
if (!multicastInterface_.empty())
{
wire_.push_back
(dataBlock(tlv::ndnd::MulticastInterface, multicastInterface_.c_str(), multicastInterface_.size()));
}
// MulticastTTL
if (multicastTtl_ >= 0)
{
wire_.push_back
(nonNegativeIntegerBlock(tlv::ndnd::MulticastTTL, multicastTtl_));
}
// FreshnessPeriod
if (freshnessPeriod_ >= time::milliseconds::zero())
{
wire_.push_back
(nonNegativeIntegerBlock(Tlv::FreshnessPeriod, freshnessPeriod_.count()));
}
wire_.encode();
return wire_;
}
inline void
FaceInstance::wireDecode(const Block& wire)
{
action_.clear();
faceId_ = -1;
ipProto_ = -1;
host_.clear();
port_.clear();
multicastInterface_.clear();
multicastTtl_ = -1;
freshnessPeriod_ = time::milliseconds::min();
wire_ = wire;
wire_.parse();
// FaceInstance ::= FACE-INSTANCE-TYPE TLV-LENGTH
// Action?
// FaceID?
// IPProto?
// Host?
// Port?
// MulticastInterface?
// MulticastTTL?
// FreshnessPeriod?
// Action
Block::element_const_iterator val = wire_.find(tlv::ndnd::Action);
if (val != wire_.elements_end())
{
action_ = std::string(reinterpret_cast<const char*>(val->value()), val->value_size());
}
// FaceID
val = wire_.find(tlv::ndnd::FaceID);
if (val != wire_.elements_end())
{
faceId_ = readNonNegativeInteger(*val);
}
// IPProto
val = wire_.find(tlv::ndnd::IPProto);
if (val != wire_.elements_end())
{
ipProto_ = readNonNegativeInteger(*val);
}
// Host
val = wire_.find(tlv::ndnd::Host);
if (val != wire_.elements_end())
{
host_ = std::string(reinterpret_cast<const char*>(val->value()), val->value_size());
}
// Port
val = wire_.find(tlv::ndnd::Port);
if (val != wire_.elements_end())
{
port_ = std::string(reinterpret_cast<const char*>(val->value()), val->value_size());
}
// MulticastInterface
val = wire_.find(tlv::ndnd::MulticastInterface);
if (val != wire_.elements_end())
{
multicastInterface_ = std::string(reinterpret_cast<const char*>(val->value()), val->value_size());
}
// MulticastTTL
val = wire_.find(tlv::ndnd::MulticastTTL);
if (val != wire_.elements_end())
{
multicastTtl_ = readNonNegativeInteger(*val);
}
// FreshnessPeriod
val = wire_.find(Tlv::FreshnessPeriod);
if (val != wire_.elements_end())
{
freshnessPeriod_ = time::milliseconds(readNonNegativeInteger(*val));
}
}
inline std::ostream&
operator << (std::ostream& os, const FaceInstance& entry)
{
os << "FaceInstance(";
// Action
if (!entry.getAction().empty())
{
os << "Action:" << entry.getAction() << ", ";
}
// FaceID
if (entry.getFaceId() >= 0)
{
os << "FaceID:" << entry.getFaceId() << ", ";
}
// IPProto
if (entry.getIpProto() >= 0)
{
os << "IPProto:" << entry.getIpProto() << ", ";
}
// Host
if (!entry.getHost().empty())
{
os << "Host:" << entry.getHost() << ", ";
}
// Port
if (!entry.getPort().empty())
{
os << "Port:" << entry.getPort() << ", ";
}
// MulticastInterface
if (!entry.getMulticastInterface().empty())
{
os << "MulticastInterface:" << entry.getMulticastInterface() << ", ";
}
// MulticastTTL
if (entry.getMulticastTtl() >= 0)
{
os << "MulticastTTL:" << entry.getMulticastTtl() << ", ";
}
// FreshnessPeriod
if (entry.getFreshnessPeriod() >= time::milliseconds::zero())
{
os << "FreshnessPeriod:" << entry.getFreshnessPeriod() << ", ";
}
os << ")";
return os;
}
} // namespace ndnd
} // namespace ndn
#endif // NDN_MANAGEMENT_NDND_FACE_INSTANCE_HPP