6 #include <net/ethernet.h>
7 #include <boost/asio.hpp>
8 #include <boost/bind.hpp>
28 #include "vrouter/ksync/agent_ksync_types.h"
34 vrf_id_(entry->vrf_id_), label_(entry->label_),
35 interface_(entry->interface_), sip_(entry->sip_), dip_(entry->dip_),
36 sport_(entry->sport_), dport_(entry->dport_), smac_(entry->smac_),
37 dmac_(entry->dmac_), rewrite_dmac_(entry->rewrite_dmac_),
38 valid_(entry->valid_), policy_(entry->policy_),
39 is_mcast_nh_(entry->is_mcast_nh_),
40 defer_(entry->defer_), component_nh_list_(entry->component_nh_list_),
41 nh_(entry->nh_), vlan_tag_(entry->vlan_tag_),
42 is_local_ecmp_nh_(entry->is_local_ecmp_nh_),
43 is_bridge_(entry->is_bridge_),
44 is_vxlan_routing_(entry->is_vxlan_routing_),
45 comp_type_(entry->comp_type_),
46 validate_mcast_src_(entry->validate_mcast_src_),
47 tunnel_type_(entry->tunnel_type_), prefix_len_(entry->prefix_len_),
48 nh_id_(entry->nh_id()),
49 component_nh_key_list_(entry->component_nh_key_list_),
50 bridge_nh_(entry->bridge_nh_),
51 flood_unknown_unicast_(entry->flood_unknown_unicast_),
52 ecmp_hash_fieds_(entry->ecmp_hash_fieds_.HashFieldsToUse()),
53 pbb_child_nh_(entry->pbb_child_nh_), isid_(entry->isid_),
54 pbb_label_(entry->pbb_label_), learning_enabled_(entry->learning_enabled_),
55 need_pbb_tunnel_(entry->need_pbb_tunnel_), etree_leaf_(entry->etree_leaf_),
56 layer2_control_word_(entry->layer2_control_word_),
57 crypt_(entry->crypt_), crypt_path_available_(entry->crypt_path_available_),
58 crypt_interface_(entry->crypt_interface_),
59 transport_tunnel_type_(entry->transport_tunnel_type_),
60 interface_list_(entry->interface_list_),
61 encap_valid_list_(entry->encap_valid_list_),
62 dmac_list_(entry->dmac_list_) {
67 vrf_id_(0), interface_(NULL), dmac_(), valid_(nh->IsValid()),
68 policy_(nh->PolicyEnabled()), is_mcast_nh_(false), nh_(nh),
69 vlan_tag_(
VmInterface::kInvalidVlanId), is_bridge_(false),
70 is_vxlan_routing_(false),
72 bridge_nh_(false), flood_unknown_unicast_(false),
73 learning_enabled_(nh->learning_enabled()), need_pbb_tunnel_(false),
74 etree_leaf_ (false), layer2_control_word_(false),
75 crypt_(false), crypt_path_available_(false), crypt_interface_(NULL),
76 interface_list_(), encap_valid_list_(), dmac_list_() {
220 const_cast<CompositeNH *
>(comp_nh)->CompEcmpHashFields().HashFieldsToUse();
222 ComponentNHList::const_iterator component_nh_it =
224 while (component_nh_it != comp_nh->
end()) {
225 const NextHop *component_nh = NULL;
227 if (*component_nh_it) {
228 component_nh = (*component_nh_it)->nh();
229 label = (*component_nh_it)->label();
232 if (component_nh != NULL) {
385 ComponentNHKeyList::const_iterator it =
387 ComponentNHKeyList::const_iterator entry_it =
397 (*entry_it) == NULL) {
398 return (*it) < (*entry_it);
402 if ((*it)->label() !=
403 (*entry_it)->label()) {
404 return (*it)->label() <
405 (*entry_it)->label();
414 const NextHopKey *right_nh = (*entry_it)->nh_key();
416 if (left_nh->
IsEqual(*right_nh) ==
false) {
420 return left_nh->
IsLess(*right_nh);
452 s <<
"NextHop Index: " <<
nh_id() <<
" Type: ";
479 s <<
"VRF assign to ";
496 s <<
dip_.to_string();
507 s <<
"VLAN interface ";
511 s <<
"Composite Child members: ";
518 if (component_nh.
nh()) {
677 if (active_nh == NULL) {
687 const ArpNH *arp_nh =
static_cast<const ArpNH *
>(active_nh);
691 interface = interface_object->GetReference(&if_ksync);
694 const NdpNH *ndp_nh =
static_cast<const NdpNH *
>(active_nh);
698 interface = interface_object->GetReference(&if_ksync);
707 interface = interface_object->GetReference(&if_ksync);
708 dmac = oper_intf->
mac();
715 ComponentNHList::const_iterator component_nh_it =
717 while (component_nh_it != cnh->
end()) {
718 const NextHop *component_nh = NULL;
719 if (*component_nh_it) {
720 component_nh = (*component_nh_it)->nh();
722 const ArpNH *arp_nh =
dynamic_cast<const ArpNH*
>(component_nh);
813 const ArpNH *arp_nh =
static_cast<const ArpNH *
>(active_nh);
818 interface = interface_object->GetReference(&if_ksync);
821 const NdpNH *ndp_nh =
static_cast<const NdpNH *
>(active_nh);
826 interface = interface_object->GetReference(&if_ksync);
834 interface = interface_object->GetReference(&if_ksync);
883 ComponentNHList::const_iterator component_nh_it =
885 while (component_nh_it != comp_nh->
end()) {
886 const NextHop *component_nh = NULL;
888 if (*component_nh_it) {
889 component_nh = (*component_nh_it)->nh();
890 label = (*component_nh_it)->label();
893 if (component_nh != NULL) {
963 vr_nexthop_req encoder;
967 std::vector<int8_t> encap;
970 std::vector<KSyncEntryPtr> if_ksync_list;
971 std::vector<int32_t> nhr_encap_valid_list;
972 std::vector<int32_t> intf_id_list;
975 encoder.set_h_op(op);
976 encoder.set_nhr_id(
nh_id());
977 if (op == sandesh_op::DEL) {
980 encode_len = encoder.WriteBinary((uint8_t *)buf, buf_len, &error);
982 assert(encode_len <= buf_len);
985 encoder.set_nhr_rid(0);
987 encoder.set_nhr_family(AF_INET);
990 flags |= NH_FLAG_VALID;
994 flags |= NH_FLAG_POLICY_ENABLED;
998 flags |= NH_FLAG_ETREE_ROOT;
1002 flags |= NH_FLAG_MAC_LEARN;
1006 flags |= NH_FLAG_L2_CONTROL_DATA;
1010 flags |= NH_FLAG_CRYPT_TRAFFIC;
1023 encoder.set_nhr_type(NH_ENCAP);
1027 encoder.set_nhr_encap_oif_id(std::vector<int32_t>(1, intf_id));
1028 encoder.set_nhr_encap_family(ETHERTYPE_ARP);
1031 encoder.set_nhr_encap(encap);
1032 encoder.set_nhr_tun_sip(0);
1033 encoder.set_nhr_tun_dip(0);
1036 flags |= NH_FLAG_L3_VXLAN;
1039 encoder.set_nhr_family(AF_BRIDGE);
1042 flags |= NH_FLAG_MCAST;
1044 encoder.set_nhr_flags(flags);
1048 encoder.set_nhr_type(NH_TUNNEL);
1049 encoder.set_nhr_tun_sip(htonl(
sip_.to_v4().to_ulong()));
1050 encoder.set_nhr_tun_dip(htonl(
dip_.to_v4().to_ulong()));
1051 encoder.set_nhr_encap_family(ETHERTYPE_ARP);
1053 if (if_ksync_list.empty() ==
false) {
1054 flags |= NH_FLAG_TUNNEL_UNDERLAY_ECMP;
1055 uint32_t encap_len = 0;
1056 for (
size_t i = 0; i < if_ksync_list.size(); ++i) {
1059 intf_id_list.push_back(if_ksync_entry->
interface_id());
1060 encap_len = encap.size();
1061 SetEncap(if_ksync_entry, encap, i);
1062 encap_len = encap.size() - encap_len;
1064 encoder.set_nhr_encap_len(encap_len);
1067 intf_id_list.push_back(0);
1069 encoder.set_nhr_encap_oif_id(intf_id_list);
1070 encoder.set_nhr_encap_valid(nhr_encap_valid_list);
1071 encoder.set_nhr_crypt_traffic(
crypt_);
1076 encoder.set_nhr_encap_crypt_oif_id(crypt_intf_id);
1077 encoder.set_nhr_encap(encap);
1079 flags |= NH_FLAG_TUNNEL_UDP_MPLS;
1081 flags |= NH_FLAG_TUNNEL_GRE;
1087 encoder.set_nhr_type(NH_ENCAP);
1088 encoder.set_nhr_encap_oif_id(intf_id_list);
1089 encoder.set_nhr_encap_family(ETHERTYPE_ARP);
1090 encoder.set_nhr_tun_sip(0);
1091 encoder.set_nhr_tun_dip(0);
1093 flags |= NH_FLAG_TUNNEL_MPLS_O_MPLS;
1095 flags |= NH_FLAG_TUNNEL_UDP_MPLS;
1097 flags |= NH_FLAG_TUNNEL_GRE;
1100 encoder.set_nhr_transport_label(
label_);
1102 flags |= NH_FLAG_TUNNEL_VXLAN;
1104 std::vector<int8_t> rewrite_dmac;
1108 encoder.set_nhr_rw_dst_mac(rewrite_dmac);
1110 encoder.set_nhr_pbb_mac(rewrite_dmac);
1112 flags |= NH_FLAG_L3_VXLAN;
1117 encoder.set_nhr_type(NH_TUNNEL);
1118 if (
sip_.is_v4() &&
dip_.is_v4()) {
1119 encoder.set_nhr_tun_sip(htonl(
sip_.to_v4().to_ulong()));
1120 encoder.set_nhr_tun_dip(htonl(
dip_.to_v4().to_ulong()));
1121 }
else if (
sip_.is_v6() &&
dip_.is_v6()) {
1122 encoder.set_nhr_family(AF_INET6);
1123 Ip6Address::bytes_type bytes =
sip_.to_v6().to_bytes();
1124 std::vector<int8_t> sip_vector(bytes.begin(), bytes.end());
1125 bytes =
dip_.to_v6().to_bytes();
1126 std::vector<int8_t> dip_vector(bytes.begin(), bytes.end());
1127 encoder.set_nhr_tun_sip6(sip_vector);
1128 encoder.set_nhr_tun_dip6(dip_vector);
1130 encoder.set_nhr_tun_sport(htons(
sport_));
1131 encoder.set_nhr_tun_dport(htons(
dport_));
1132 encoder.set_nhr_encap_family(ETHERTYPE_ARP);
1137 encoder.set_nhr_encap_oif_id(std::vector<int32_t>(1, intf_id));
1139 encoder.set_nhr_encap(encap);
1140 flags |= NH_FLAG_TUNNEL_UDP;
1142 flags |= NH_FLAG_TUNNEL_SIP_COPY;
1147 encoder.set_nhr_type(NH_L2_RCV);
1151 encoder.set_nhr_type(NH_DISCARD);
1156 flags |= NH_FLAG_RELAXED_POLICY;
1159 encoder.set_nhr_encap_oif_id(std::vector<int32_t>(1, intf_id));
1160 encoder.set_nhr_type(NH_RCV);
1173 flags &= ~NH_FLAG_POLICY_ENABLED;
1175 encoder.set_nhr_type(NH_RESOLVE);
1179 encoder.set_nhr_type(NH_VXLAN_VRF);
1181 encoder.set_nhr_family(AF_BRIDGE);
1184 flags |= NH_FLAG_UNKNOWN_UC_FLOOD;
1189 encoder.set_nhr_family(AF_BRIDGE);
1190 encoder.set_nhr_type(NH_TUNNEL);
1191 flags |= (NH_FLAG_TUNNEL_PBB | NH_FLAG_INDIRECT);
1192 std::vector<int8_t> bmac;
1193 for (
size_t i = 0 ; i <
dmac_.
size(); i++) {
1194 bmac.push_back(
dmac_[i]);
1196 encoder.set_nhr_pbb_mac(bmac);
1198 std::vector<int> sub_nh_list;
1201 sub_nh_list.push_back(child_nh->
nh_id());
1202 encoder.set_nhr_nh_list(sub_nh_list);
1204 std::vector<int> sub_label_list;
1206 encoder.set_nhr_label_list(sub_label_list);
1215 encoder.set_nhr_encap_oif_id(std::vector<int32_t>(1, 0));
1220 std::vector<int> sub_nh_id;
1221 std::vector<int> sub_label_list;
1222 std::vector<int> sub_flag_list;
1223 encoder.set_nhr_type(NH_COMPOSITE);
1224 assert(
sip_.is_v4());
1225 assert(
dip_.is_v4());
1227 encoder.set_nhr_tun_sip(htonl(
sip_.to_v4().to_ulong()));
1228 encoder.set_nhr_tun_dip(htonl(
dip_.to_v4().to_ulong()));
1229 encoder.set_nhr_encap_family(ETHERTYPE_ARP);
1234 flags |= NH_FLAG_COMPOSITE_ENCAP;
1235 encoder.set_nhr_family(AF_BRIDGE);
1239 flags |= NH_FLAG_COMPOSITE_ENCAP;
1243 flags |= NH_FLAG_COMPOSITE_EVPN;
1247 flags |= NH_FLAG_COMPOSITE_TOR;
1251 encoder.set_nhr_family(AF_BRIDGE);
1252 flags |= NH_FLAG_COMPOSITE_FABRIC;
1256 flags |= NH_FLAG_COMPOSITE_FABRIC;
1260 encoder.set_nhr_family(AF_BRIDGE);
1261 flags |= NH_FLAG_MCAST;
1263 flags |= NH_FLAG_VALIDATE_MCAST_SRC;
1268 flags |= NH_FLAG_MCAST;
1270 flags |= NH_FLAG_VALIDATE_MCAST_SRC;
1275 encoder.set_nhr_family(AF_UNSPEC);
1280 flags |= NH_FLAG_COMPOSITE_ECMP;
1284 flags |= NH_FLAG_COMPOSITE_ECMP;
1285 flags |= NH_FLAG_COMPOSITE_LU_ECMP;
1293 flags |= NH_FLAG_TUNNEL_PBB;
1296 encoder.set_nhr_flags(flags);
1300 if (component_nh.
nh()) {
1301 sub_nh_id.push_back(component_nh.
nh()->
nh_id());
1302 sub_label_list.push_back(component_nh.
label());
1308 encoder.set_nhr_nh_list(sub_nh_id);
1309 encoder.set_nhr_label_list(sub_label_list);
1315 encoder.set_nhr_flags(flags);
1317 encode_len = encoder.WriteBinary((uint8_t *)buf, buf_len, &error);
1319 assert(encode_len <= buf_len);
1325 info.set_index(
nh_id());
1327 if (op == sandesh_op::ADD) {
1328 info.set_operation(
"ADD/CHANGE");
1330 info.set_operation(
"DELETE");
1335 info.set_type(
"L2-RECEIVE");
1339 info.set_type(
"DISCARD");
1344 info.set_type(
"RECEIVE");
1349 info.set_type(
"RESOLVE");
1354 info.set_type(
"ARP");
1360 info.set_type(
"NDP");
1366 info.set_type(
"VRF");
1372 info.set_type(
"INTERFACE");
1377 info.set_type(
"TUNNEL");
1378 info.set_sip(
sip_.to_string());
1379 info.set_dip(
dip_.to_string());
1380 info.set_crypt_path_available(
crypt_);
1386 info.set_crypt_intf_name(
"NULL");
1394 info.set_type(
"MIRROR");
1396 info.set_sip(
sip_.to_string());
1397 info.set_dip(
dip_.to_string());
1404 info.set_type(
"VLAN");
1409 info.set_type(
"Composite");
1411 info.set_dip(
dip_.to_string());
1413 std::vector<KSyncComponentNHLog> sub_nh_list;
1414 for (KSyncComponentNHList::const_iterator it =
1418 if (component_nh.
nh()) {
1419 KSyncComponentNHLog sub_nh;
1420 sub_nh.set_nh_idx(component_nh.
nh()->
nh_id());
1421 sub_nh.set_label(component_nh.
label());
1422 sub_nh_list.push_back(sub_nh);
1425 info.set_sub_nh_list(sub_nh_list);
1436 info.set_intf_name(
interface()->interface_name());
1437 info.set_out_if_index(
interface()->interface_id());
1439 info.set_intf_name(
"NULL");
1449 return Encode(sandesh_op::ADD, buf, buf_len);
1457 return Encode(sandesh_op::ADD, buf, buf_len);
1465 return Encode(sandesh_op::DEL, buf, buf_len);
1504 assert(if_ksync == NULL);
1509 assert(if_ksync == NULL);
1516 assert(crypt_if_ksync);
1518 entry = crypt_if_ksync;
1552 for (KSyncComponentNHList::const_iterator it =
1557 entry = component_nh.
nh();
1590 std::vector<int8_t> &encap,
1591 const int32_t index) {
1599 for (
size_t i = 0; i <
dmac_list_[index].size(); i++) {
1603 for (
size_t i = 0 ; i <
dmac_.
size(); i++) {
1604 encap.push_back(
dmac_[i]);
1612 smac = &if_ksync->
mac();
1618 for (
size_t i = 0 ; i < smac->
size(); i++) {
1619 encap.push_back((*smac)[i]);
1628 encap.push_back(0x81);
1629 encap.push_back(0x00);
1630 encap.push_back((
vlan_tag_ & 0xFF00) >> 8);
1634 encap.push_back(0x08);
1635 encap.push_back(0x00);
1639 uint8_t ecmp_hash_fields_in_use = VR_FLOW_KEY_NONE;
1642 ecmp_hash_fields_in_use |= VR_FLOW_KEY_SRC_IP;
1645 ecmp_hash_fields_in_use |= VR_FLOW_KEY_DST_IP;
1648 ecmp_hash_fields_in_use |= VR_FLOW_KEY_PROTO;
1651 ecmp_hash_fields_in_use |= VR_FLOW_KEY_SRC_PORT;
1654 ecmp_hash_fields_in_use |= VR_FLOW_KEY_DST_PORT;
1657 return ecmp_hash_fields_in_use;
1693 data->set_valid(
"Enable");
1695 data->set_valid(
"Disable");
1699 data->set_policy(
"Enable");
1701 data->set_policy(
"Disable");
1705 data->set_is_mcast_nh(
"True");
1707 data->set_is_mcast_nh(
"False");
1711 data->set_defer(
"Enable");
1713 data->set_defer(
"Disable");
1719 data->set_is_local_ecmp_nh(
"True");
1721 data->set_is_local_ecmp_nh(
"False");
1725 data->set_is_bridge(
"True");
1727 data->set_is_bridge(
"False");
1731 data->set_bridge_nh(
"Enable");
1733 data->set_bridge_nh(
"Disable");
1737 data->set_flood_unknown_unicast(
"Enable");
1739 data->set_flood_unknown_unicast(
"Disable");
1743 data->set_isid(
isid_);
1748 KSyncNhListResp *resp =
static_cast<KSyncNhListResp *
> (sresp);
1750 KSyncNhListSandeshData data;
1752 std::vector<KSyncNhListSandeshData> &list =
1753 const_cast<std::vector<KSyncNhListSandeshData>&
>(resp->get_KSyncNhList_list());
1754 list.push_back(data);
1759 void KSyncNhListReq::HandleRequest()
const {
1762 sand->DoKsyncSandesh(sand);
InterfaceKSyncEntry * interface() const
static const MacAddress & ZeroMac()
virtual int ChangeMsg(char *buf, int buf_len)
uint32_t const GetTransportLabel() const
#define KSYNC_TRACE(obj, parent,...)
const Interface * GetInterface() const
bool IsEqual(const NextHopKey &rhs) const
const VrfEntry * GetVrf() const
std::vector< KSyncEntryPtr > interface_list_
void RegisterDb(DBTableBase *table)
const MacAddress & GetSMac() const
bool learning_enabled() const
const uint32_t vrf_id() const
static const uint32_t kInvalidComponentNHIdx
const VrfEntry * GetVrf() const
VrfEntry * fabric_vrf() const
const VrfEntry * GetVrf() const
NextHopTable * nexthop_table() const
const MacAddress & GetMac() const
uint8_t HashFieldsToUse() const
const MacAddress & GetDMac() const
const Interface * vhost_interface() const
NHKSyncObject(KSync *ksync)
const Interface * GetInterface() const
const IpAddress * GetIp() const
NHKSyncObject * ksync_obj_
KSyncEntryPtr crypt_interface_
bool layer2_control_word() const
std::vector< int32_t > encap_valid_list_
int Encode(sandesh_op::type op, char *buf, int buf_len)
const MacAddress & GetMac() const
bool IsVxlanRouting() const
const AgentRoute * GetRt() const
bool flood_unknown_unicast_
const Ip4Address * GetDip() const
bool layer2_control_word() const
void FillObjectLog(sandesh_op::type op, KSyncNhInfo &info) const
uint8_t SetEcmpFieldsToUse()
const string & GetName() const
const MacAddress & mac() const
uint16_t GetVlanTag() const
bool GetCryptTunnelAvailable() const
KSyncComponentNHList component_nh_list_
uint8_t EcmpHashFieldInUse() const
const MacAddress & mac() const
const VrfEntry * vrf() const
static const int MAX_VR_PHY_INTF
NextHop::Type type() const
KSyncEntryPtr pbb_child_nh_
const uint32_t vrf_id() const
virtual bool Sync(DBEntry *e)
std::string ToString() const
const Ip4Address * GetIp() const
const Interface * GetInterface() const
TunnelType::Type const GetTransportTunnelType() const
virtual std::string ToString() const
NextHop::Type GetType() const
bool KSyncEntrySandesh(Sandesh *resp)
bool crypt_path_available_
bool validate_mcast_src() const
const uint16_t GetSPort() const
static const uint32_t kInvalidVlanId
const uint32_t vrf_id() const
NHKSyncObject * nh_ksync_obj() const
virtual KSyncEntry * DBToKSyncEntry(const DBEntry *e)
const TunnelType & GetTunnelType() const
const NextHop * child_nh() const
TunnelType::Type transport_tunnel_type_
const NextHop * GetActiveNextHop() const
static bool NeedRewrite(NHKSyncEntry *entry, InterfaceKSyncEntry *if_ksync)
boost::intrusive_ptr< KSyncEntry > KSyncEntryPtr
class boost::shared_ptr< AgentKsyncSandesh > AgentKsyncSandeshPtr
NHKSyncEntry * nh() const
bool IsLess(const NextHopKey &rhs) const
const uint32_t isid() const
EcmpHashFields & CompEcmpHashFields()
const Interface * GetInterface() const
static const size_t kInvalidIndex
virtual KSyncEntry * UnresolvedReference()
bool layer2_control_word_
void SetKSyncNhListSandeshData(KSyncNhListSandeshData *data) const
const Ip4Address * GetSip() const
COMPOSITETYPE composite_nh_type() const
const uint32_t vrf_id() const
bool Compare(const TunnelType &rhs) const
KSyncEntry * GetReference(const KSyncEntry *key)
const MacAddress & rewrite_dmac() const
const AgentRoute * GetRt() const
const IpAddress * GetSip() const
static const uint32_t kInvalidLabel
VrfTable * vrf_table() const
ComponentNHList::const_iterator begin() const
PhysicalInterface::EncapType encap_type() const
const MacAddress & GetDMac() const
const uint16_t GetDPort() const
bool IsLess(const TunnelType &rhs) const
virtual KSyncEntry * Alloc(const KSyncEntry *entry, uint32_t index)
virtual void NHMsgHandler(vr_nexthop_req *req)=0
std::vector< KSyncEntryPtr > interface_list() const
std::vector< int32_t > encap_valid_list() const
InterfaceKSyncEntry * crypt_interface() const
VrfEntry * forwarding_vrf() const
static const uint32_t kInvalidIndex
EcmpHashFields ecmp_hash_fieds_
ComponentNHKeyList component_nh_key_list_
bool layer2_control_word() const
const Interface * get_interface() const
const uint32_t vrf_id() const
virtual int DeleteMsg(char *buf, int buf_len)
virtual int AddMsg(char *buf, int buf_len)
ComponentNHList::const_iterator end() const
std::vector< MacAddress > dmac_list_
virtual bool IsLess(const KSyncEntry &rhs) const
KSyncDBObject * GetObject() const
const IpAddress * GetDip() const
const Interface * GetInterface() const
bool is_multicastNH() const
InterfaceKSyncObject * interface_ksync_obj() const
uint32_t interface_id() const
const Interface * GetCryptInterface() const
const MacAddress dest_bmac() const
void SetEncap(InterfaceKSyncEntry *if_ksync, std::vector< int8_t > &encap, const int32_t index=-1)
const uint32_t vrf_id() const
bool flood_unknown_unicast() const
NHKSyncEntry(NHKSyncObject *obj, const NHKSyncEntry *entry, uint32_t index)
const ComponentNHKeyList & component_nh_key_list() const