6 #include <net/ethernet.h>
7 #include <boost/asio.hpp>
8 #include <boost/bind/bind.hpp>
28 #include "vrouter/ksync/agent_ksync_types.h"
31 using namespace boost::placeholders;
36 vrf_id_(entry->vrf_id_), label_(entry->label_),
37 interface_(entry->interface_), sip_(entry->sip_), dip_(entry->dip_),
38 sport_(entry->sport_), dport_(entry->dport_), smac_(entry->smac_),
39 dmac_(entry->dmac_), rewrite_dmac_(entry->rewrite_dmac_),
40 valid_(entry->valid_), policy_(entry->policy_),
41 is_mcast_nh_(entry->is_mcast_nh_),
42 defer_(entry->defer_), component_nh_list_(entry->component_nh_list_),
43 nh_(entry->nh_), vlan_tag_(entry->vlan_tag_),
44 is_local_ecmp_nh_(entry->is_local_ecmp_nh_),
45 is_bridge_(entry->is_bridge_),
46 is_vxlan_routing_(entry->is_vxlan_routing_),
47 comp_type_(entry->comp_type_),
48 validate_mcast_src_(entry->validate_mcast_src_),
49 tunnel_type_(entry->tunnel_type_), prefix_len_(entry->prefix_len_),
50 nh_id_(entry->nh_id()),
51 component_nh_key_list_(entry->component_nh_key_list_),
52 bridge_nh_(entry->bridge_nh_),
53 flood_unknown_unicast_(entry->flood_unknown_unicast_),
54 ecmp_hash_fieds_(entry->ecmp_hash_fieds_.HashFieldsToUse()),
55 pbb_child_nh_(entry->pbb_child_nh_), isid_(entry->isid_),
56 pbb_label_(entry->pbb_label_), learning_enabled_(entry->learning_enabled_),
57 need_pbb_tunnel_(entry->need_pbb_tunnel_), etree_leaf_(entry->etree_leaf_),
58 layer2_control_word_(entry->layer2_control_word_),
59 crypt_(entry->crypt_), crypt_path_available_(entry->crypt_path_available_),
60 crypt_interface_(entry->crypt_interface_),
61 transport_tunnel_type_(entry->transport_tunnel_type_),
62 interface_list_(entry->interface_list_),
63 encap_valid_list_(entry->encap_valid_list_),
64 dmac_list_(entry->dmac_list_) {
69 vrf_id_(0), interface_(NULL), dmac_(), valid_(nh->IsValid()),
70 policy_(nh->PolicyEnabled()), is_mcast_nh_(false), nh_(nh),
71 vlan_tag_(
VmInterface::kInvalidVlanId), is_bridge_(false),
72 is_vxlan_routing_(false),
74 bridge_nh_(false), flood_unknown_unicast_(false),
75 learning_enabled_(nh->learning_enabled()), need_pbb_tunnel_(false),
76 etree_leaf_ (false), layer2_control_word_(false),
77 crypt_(false), crypt_path_available_(false), crypt_interface_(NULL),
78 interface_list_(), encap_valid_list_(), dmac_list_() {
222 const_cast<CompositeNH *
>(comp_nh)->CompEcmpHashFields().HashFieldsToUse();
224 ComponentNHList::const_iterator component_nh_it =
226 while (component_nh_it != comp_nh->
end()) {
227 const NextHop *component_nh = NULL;
229 if (*component_nh_it) {
230 component_nh = (*component_nh_it)->nh();
231 label = (*component_nh_it)->label();
234 if (component_nh != NULL) {
387 ComponentNHKeyList::const_iterator it =
389 ComponentNHKeyList::const_iterator entry_it =
399 (*entry_it) == NULL) {
400 return (*it) < (*entry_it);
404 if ((*it)->label() !=
405 (*entry_it)->label()) {
406 return (*it)->label() <
407 (*entry_it)->label();
416 const NextHopKey *right_nh = (*entry_it)->nh_key();
418 if (left_nh->
IsEqual(*right_nh) ==
false) {
422 return left_nh->
IsLess(*right_nh);
454 s <<
"NextHop Index: " <<
nh_id() <<
" Type: ";
481 s <<
"VRF assign to ";
498 s <<
dip_.to_string();
509 s <<
"VLAN interface ";
513 s <<
"Composite Child members: ";
520 if (component_nh.
nh()) {
679 if (active_nh == NULL) {
689 const ArpNH *arp_nh =
static_cast<const ArpNH *
>(active_nh);
693 interface = interface_object->GetReference(&if_ksync);
696 const NdpNH *ndp_nh =
static_cast<const NdpNH *
>(active_nh);
700 interface = interface_object->GetReference(&if_ksync);
709 interface = interface_object->GetReference(&if_ksync);
710 dmac = oper_intf->
mac();
717 ComponentNHList::const_iterator component_nh_it =
719 while (component_nh_it != cnh->
end()) {
720 const NextHop *component_nh = NULL;
721 if (*component_nh_it) {
722 component_nh = (*component_nh_it)->nh();
724 const ArpNH *arp_nh =
dynamic_cast<const ArpNH*
>(component_nh);
815 const ArpNH *arp_nh =
static_cast<const ArpNH *
>(active_nh);
820 interface = interface_object->GetReference(&if_ksync);
823 const NdpNH *ndp_nh =
static_cast<const NdpNH *
>(active_nh);
828 interface = interface_object->GetReference(&if_ksync);
836 interface = interface_object->GetReference(&if_ksync);
885 ComponentNHList::const_iterator component_nh_it =
887 while (component_nh_it != comp_nh->
end()) {
888 const NextHop *component_nh = NULL;
890 if (*component_nh_it) {
891 component_nh = (*component_nh_it)->nh();
892 label = (*component_nh_it)->label();
895 if (component_nh != NULL) {
965 vr_nexthop_req encoder;
969 std::vector<int8_t> encap;
972 std::vector<KSyncEntryPtr> if_ksync_list;
973 std::vector<int32_t> nhr_encap_valid_list;
974 std::vector<int32_t> intf_id_list;
977 encoder.set_h_op(op);
978 encoder.set_nhr_id(
nh_id());
979 if (op == sandesh_op::DEL) {
982 encode_len = encoder.WriteBinary((uint8_t *)buf, buf_len, &error);
984 assert(encode_len <= buf_len);
987 encoder.set_nhr_rid(0);
989 encoder.set_nhr_family(AF_INET);
992 flags |= NH_FLAG_VALID;
996 flags |= NH_FLAG_POLICY_ENABLED;
1000 flags |= NH_FLAG_ETREE_ROOT;
1004 flags |= NH_FLAG_MAC_LEARN;
1008 flags |= NH_FLAG_L2_CONTROL_DATA;
1012 flags |= NH_FLAG_CRYPT_TRAFFIC;
1025 encoder.set_nhr_type(NH_ENCAP);
1029 encoder.set_nhr_encap_oif_id(std::vector<int32_t>(1, intf_id));
1030 encoder.set_nhr_encap_family(ETHERTYPE_ARP);
1033 encoder.set_nhr_encap(encap);
1034 encoder.set_nhr_tun_sip(0);
1035 encoder.set_nhr_tun_dip(0);
1038 flags |= NH_FLAG_L3_VXLAN;
1041 encoder.set_nhr_family(AF_BRIDGE);
1044 flags |= NH_FLAG_MCAST;
1046 encoder.set_nhr_flags(flags);
1050 encoder.set_nhr_type(NH_TUNNEL);
1051 encoder.set_nhr_tun_sip(htonl(
sip_.to_v4().to_ulong()));
1052 encoder.set_nhr_tun_dip(htonl(
dip_.to_v4().to_ulong()));
1053 encoder.set_nhr_encap_family(ETHERTYPE_ARP);
1055 if (if_ksync_list.empty() ==
false) {
1056 flags |= NH_FLAG_TUNNEL_UNDERLAY_ECMP;
1057 uint32_t encap_len = 0;
1058 for (
size_t i = 0; i < if_ksync_list.size(); ++i) {
1061 intf_id_list.push_back(if_ksync_entry->
interface_id());
1062 encap_len = encap.size();
1063 SetEncap(if_ksync_entry, encap, i);
1064 encap_len = encap.size() - encap_len;
1066 encoder.set_nhr_encap_len(encap_len);
1069 intf_id_list.push_back(0);
1071 encoder.set_nhr_encap_oif_id(intf_id_list);
1072 encoder.set_nhr_encap_valid(nhr_encap_valid_list);
1073 encoder.set_nhr_crypt_traffic(
crypt_);
1078 encoder.set_nhr_encap_crypt_oif_id(crypt_intf_id);
1079 encoder.set_nhr_encap(encap);
1081 flags |= NH_FLAG_TUNNEL_UDP_MPLS;
1083 flags |= NH_FLAG_TUNNEL_GRE;
1089 encoder.set_nhr_type(NH_ENCAP);
1090 encoder.set_nhr_encap_oif_id(intf_id_list);
1091 encoder.set_nhr_encap_family(ETHERTYPE_ARP);
1092 encoder.set_nhr_tun_sip(0);
1093 encoder.set_nhr_tun_dip(0);
1095 flags |= NH_FLAG_TUNNEL_MPLS_O_MPLS;
1097 flags |= NH_FLAG_TUNNEL_UDP_MPLS;
1099 flags |= NH_FLAG_TUNNEL_GRE;
1102 encoder.set_nhr_transport_label(
label_);
1104 flags |= NH_FLAG_TUNNEL_VXLAN;
1106 std::vector<int8_t> rewrite_dmac;
1110 encoder.set_nhr_rw_dst_mac(rewrite_dmac);
1112 encoder.set_nhr_pbb_mac(rewrite_dmac);
1114 flags |= NH_FLAG_L3_VXLAN;
1119 encoder.set_nhr_type(NH_TUNNEL);
1120 if (
sip_.is_v4() &&
dip_.is_v4()) {
1121 encoder.set_nhr_tun_sip(htonl(
sip_.to_v4().to_ulong()));
1122 encoder.set_nhr_tun_dip(htonl(
dip_.to_v4().to_ulong()));
1123 }
else if (
sip_.is_v6() &&
dip_.is_v6()) {
1124 encoder.set_nhr_family(AF_INET6);
1125 Ip6Address::bytes_type bytes =
sip_.to_v6().to_bytes();
1126 std::vector<int8_t> sip_vector(bytes.begin(), bytes.end());
1127 bytes =
dip_.to_v6().to_bytes();
1128 std::vector<int8_t> dip_vector(bytes.begin(), bytes.end());
1129 encoder.set_nhr_tun_sip6(sip_vector);
1130 encoder.set_nhr_tun_dip6(dip_vector);
1132 encoder.set_nhr_tun_sport(htons(
sport_));
1133 encoder.set_nhr_tun_dport(htons(
dport_));
1134 encoder.set_nhr_encap_family(ETHERTYPE_ARP);
1139 encoder.set_nhr_encap_oif_id(std::vector<int32_t>(1, intf_id));
1141 encoder.set_nhr_encap(encap);
1142 flags |= NH_FLAG_TUNNEL_UDP;
1144 flags |= NH_FLAG_TUNNEL_SIP_COPY;
1149 encoder.set_nhr_type(NH_L2_RCV);
1153 encoder.set_nhr_type(NH_DISCARD);
1158 flags |= NH_FLAG_RELAXED_POLICY;
1161 encoder.set_nhr_encap_oif_id(std::vector<int32_t>(1, intf_id));
1162 encoder.set_nhr_type(NH_RCV);
1175 flags &= ~NH_FLAG_POLICY_ENABLED;
1177 encoder.set_nhr_type(NH_RESOLVE);
1181 encoder.set_nhr_type(NH_VXLAN_VRF);
1183 encoder.set_nhr_family(AF_BRIDGE);
1186 flags |= NH_FLAG_UNKNOWN_UC_FLOOD;
1191 encoder.set_nhr_family(AF_BRIDGE);
1192 encoder.set_nhr_type(NH_TUNNEL);
1193 flags |= (NH_FLAG_TUNNEL_PBB | NH_FLAG_INDIRECT);
1194 std::vector<int8_t> bmac;
1195 for (
size_t i = 0 ; i <
dmac_.
size(); i++) {
1196 bmac.push_back(
dmac_[i]);
1198 encoder.set_nhr_pbb_mac(bmac);
1200 std::vector<int> sub_nh_list;
1203 sub_nh_list.push_back(child_nh->
nh_id());
1204 encoder.set_nhr_nh_list(sub_nh_list);
1206 std::vector<int> sub_label_list;
1208 encoder.set_nhr_label_list(sub_label_list);
1217 encoder.set_nhr_encap_oif_id(std::vector<int32_t>(1, 0));
1222 std::vector<int> sub_nh_id;
1223 std::vector<int> sub_label_list;
1224 std::vector<int> sub_flag_list;
1225 encoder.set_nhr_type(NH_COMPOSITE);
1226 assert(
sip_.is_v4());
1227 assert(
dip_.is_v4());
1229 encoder.set_nhr_tun_sip(htonl(
sip_.to_v4().to_ulong()));
1230 encoder.set_nhr_tun_dip(htonl(
dip_.to_v4().to_ulong()));
1231 encoder.set_nhr_encap_family(ETHERTYPE_ARP);
1236 flags |= NH_FLAG_COMPOSITE_ENCAP;
1237 encoder.set_nhr_family(AF_BRIDGE);
1241 flags |= NH_FLAG_COMPOSITE_ENCAP;
1245 flags |= NH_FLAG_COMPOSITE_EVPN;
1249 flags |= NH_FLAG_COMPOSITE_TOR;
1253 encoder.set_nhr_family(AF_BRIDGE);
1254 flags |= NH_FLAG_COMPOSITE_FABRIC;
1258 flags |= NH_FLAG_COMPOSITE_FABRIC;
1262 encoder.set_nhr_family(AF_BRIDGE);
1263 flags |= NH_FLAG_MCAST;
1265 flags |= NH_FLAG_VALIDATE_MCAST_SRC;
1270 flags |= NH_FLAG_MCAST;
1272 flags |= NH_FLAG_VALIDATE_MCAST_SRC;
1277 encoder.set_nhr_family(AF_UNSPEC);
1282 flags |= NH_FLAG_COMPOSITE_ECMP;
1286 flags |= NH_FLAG_COMPOSITE_ECMP;
1287 flags |= NH_FLAG_COMPOSITE_LU_ECMP;
1295 flags |= NH_FLAG_TUNNEL_PBB;
1298 encoder.set_nhr_flags(flags);
1302 if (component_nh.
nh()) {
1303 sub_nh_id.push_back(component_nh.
nh()->
nh_id());
1304 sub_label_list.push_back(component_nh.
label());
1310 encoder.set_nhr_nh_list(sub_nh_id);
1311 encoder.set_nhr_label_list(sub_label_list);
1317 encoder.set_nhr_flags(flags);
1319 encode_len = encoder.WriteBinary((uint8_t *)buf, buf_len, &error);
1321 assert(encode_len <= buf_len);
1327 info.set_index(
nh_id());
1329 if (op == sandesh_op::ADD) {
1330 info.set_operation(
"ADD/CHANGE");
1332 info.set_operation(
"DELETE");
1337 info.set_type(
"L2-RECEIVE");
1341 info.set_type(
"DISCARD");
1346 info.set_type(
"RECEIVE");
1351 info.set_type(
"RESOLVE");
1356 info.set_type(
"ARP");
1362 info.set_type(
"NDP");
1368 info.set_type(
"VRF");
1374 info.set_type(
"INTERFACE");
1379 info.set_type(
"TUNNEL");
1380 info.set_sip(
sip_.to_string());
1381 info.set_dip(
dip_.to_string());
1382 info.set_crypt_path_available(
crypt_);
1388 info.set_crypt_intf_name(
"NULL");
1396 info.set_type(
"MIRROR");
1398 info.set_sip(
sip_.to_string());
1399 info.set_dip(
dip_.to_string());
1406 info.set_type(
"VLAN");
1411 info.set_type(
"Composite");
1413 info.set_dip(
dip_.to_string());
1415 std::vector<KSyncComponentNHLog> sub_nh_list;
1416 for (KSyncComponentNHList::const_iterator it =
1420 if (component_nh.
nh()) {
1421 KSyncComponentNHLog sub_nh;
1422 sub_nh.set_nh_idx(component_nh.
nh()->
nh_id());
1423 sub_nh.set_label(component_nh.
label());
1424 sub_nh_list.push_back(sub_nh);
1427 info.set_sub_nh_list(sub_nh_list);
1438 info.set_intf_name(
interface()->interface_name());
1439 info.set_out_if_index(
interface()->interface_id());
1441 info.set_intf_name(
"NULL");
1451 return Encode(sandesh_op::ADD, buf, buf_len);
1459 return Encode(sandesh_op::ADD, buf, buf_len);
1467 return Encode(sandesh_op::DEL, buf, buf_len);
1506 assert(if_ksync == NULL);
1511 assert(if_ksync == NULL);
1518 assert(crypt_if_ksync);
1520 entry = crypt_if_ksync;
1554 for (KSyncComponentNHList::const_iterator it =
1559 entry = component_nh.
nh();
1592 std::vector<int8_t> &encap,
1593 const int32_t index) {
1601 for (
size_t i = 0; i <
dmac_list_[index].size(); i++) {
1605 for (
size_t i = 0 ; i <
dmac_.
size(); i++) {
1606 encap.push_back(
dmac_[i]);
1614 smac = &if_ksync->
mac();
1620 for (
size_t i = 0 ; i < smac->
size(); i++) {
1621 encap.push_back((*smac)[i]);
1630 encap.push_back(0x81);
1631 encap.push_back(0x00);
1632 encap.push_back((
vlan_tag_ & 0xFF00) >> 8);
1636 encap.push_back(0x08);
1637 encap.push_back(0x00);
1641 uint8_t ecmp_hash_fields_in_use = VR_FLOW_KEY_NONE;
1644 ecmp_hash_fields_in_use |= VR_FLOW_KEY_SRC_IP;
1647 ecmp_hash_fields_in_use |= VR_FLOW_KEY_DST_IP;
1650 ecmp_hash_fields_in_use |= VR_FLOW_KEY_PROTO;
1653 ecmp_hash_fields_in_use |= VR_FLOW_KEY_SRC_PORT;
1656 ecmp_hash_fields_in_use |= VR_FLOW_KEY_DST_PORT;
1659 return ecmp_hash_fields_in_use;
1695 data->set_valid(
"Enable");
1697 data->set_valid(
"Disable");
1701 data->set_policy(
"Enable");
1703 data->set_policy(
"Disable");
1707 data->set_is_mcast_nh(
"True");
1709 data->set_is_mcast_nh(
"False");
1713 data->set_defer(
"Enable");
1715 data->set_defer(
"Disable");
1721 data->set_is_local_ecmp_nh(
"True");
1723 data->set_is_local_ecmp_nh(
"False");
1727 data->set_is_bridge(
"True");
1729 data->set_is_bridge(
"False");
1733 data->set_bridge_nh(
"Enable");
1735 data->set_bridge_nh(
"Disable");
1739 data->set_flood_unknown_unicast(
"Enable");
1741 data->set_flood_unknown_unicast(
"Disable");
1745 data->set_isid(
isid_);
1750 KSyncNhListResp *resp =
static_cast<KSyncNhListResp *
> (sresp);
1752 KSyncNhListSandeshData data;
1754 std::vector<KSyncNhListSandeshData> &list =
1755 const_cast<std::vector<KSyncNhListSandeshData>&
>(resp->get_KSyncNhList_list());
1756 list.push_back(data);
1761 void KSyncNhListReq::HandleRequest()
const {
1764 sand->DoKsyncSandesh(sand);
const NextHop * GetActiveNextHop() const
virtual void NHMsgHandler(vr_nexthop_req *req)=0
VrfTable * vrf_table() const
VrfEntry * fabric_vrf() const
NextHopTable * nexthop_table() const
const Interface * vhost_interface() const
const Ip4Address * GetIp() const
const Interface * GetInterface() const
const MacAddress & GetMac() const
const uint32_t vrf_id() const
const VrfEntry * vrf() const
static const uint32_t kInvalidComponentNHIdx
bool layer2_control_word() const
ComponentNHList::const_iterator end() const
uint8_t EcmpHashFieldInUse() const
COMPOSITETYPE composite_nh_type() const
bool validate_mcast_src() const
EcmpHashFields & CompEcmpHashFields()
const ComponentNHKeyList & component_nh_key_list() const
ComponentNHList::const_iterator begin() const
uint8_t HashFieldsToUse() const
const MacAddress & mac() const
uint32_t interface_id() const
PhysicalInterface::EncapType encap_type() const
const VrfEntry * GetVrf() const
const Interface * GetInterface() const
bool IsVxlanRouting() const
bool layer2_control_word() const
bool is_multicastNH() const
const MacAddress & GetDMac() const
const MacAddress & mac() const
void RegisterDb(DBTableBase *table)
boost::intrusive_ptr< KSyncEntry > KSyncEntryPtr
static const size_t kInvalidIndex
KSyncEntry * GetReference(const KSyncEntry *key)
NHKSyncObject * nh_ksync_obj() const
InterfaceKSyncObject * interface_ksync_obj() const
uint32_t const GetTransportLabel() const
TunnelType::Type const GetTransportTunnelType() const
std::string ToString() const
static const MacAddress & ZeroMac()
const uint32_t vrf_id() const
const uint16_t GetDPort() const
const uint16_t GetSPort() const
const IpAddress * GetSip() const
const AgentRoute * GetRt() const
const IpAddress * GetDip() const
static const uint32_t kInvalidLabel
NHKSyncEntry * nh() const
NextHop::Type type() const
void FillObjectLog(sandesh_op::type op, KSyncNhInfo &info) const
bool layer2_control_word_
NHKSyncEntry(NHKSyncObject *obj, const NHKSyncEntry *entry, uint32_t index)
std::vector< KSyncEntryPtr > interface_list_
bool flood_unknown_unicast_
TunnelType::Type transport_tunnel_type_
virtual std::string ToString() const
KSyncComponentNHList component_nh_list_
uint8_t SetEcmpFieldsToUse()
int Encode(sandesh_op::type op, char *buf, int buf_len)
KSyncEntryPtr pbb_child_nh_
static const int MAX_VR_PHY_INTF
virtual bool Sync(DBEntry *e)
bool KSyncEntrySandesh(Sandesh *resp)
EcmpHashFields ecmp_hash_fieds_
ComponentNHKeyList component_nh_key_list_
bool crypt_path_available_
virtual KSyncEntry * UnresolvedReference()
virtual int DeleteMsg(char *buf, int buf_len)
void SetKSyncNhListSandeshData(KSyncNhListSandeshData *data) const
virtual int AddMsg(char *buf, int buf_len)
std::vector< int32_t > encap_valid_list_
std::vector< int32_t > encap_valid_list() const
KSyncDBObject * GetObject() const
InterfaceKSyncEntry * interface() const
std::vector< KSyncEntryPtr > interface_list() const
NHKSyncObject * ksync_obj_
InterfaceKSyncEntry * crypt_interface() const
void SetEncap(InterfaceKSyncEntry *if_ksync, std::vector< int8_t > &encap, const int32_t index=-1)
KSyncEntryPtr crypt_interface_
virtual int ChangeMsg(char *buf, int buf_len)
virtual bool IsLess(const KSyncEntry &rhs) const
std::vector< MacAddress > dmac_list_
virtual KSyncEntry * DBToKSyncEntry(const DBEntry *e)
NHKSyncObject(KSync *ksync)
virtual KSyncEntry * Alloc(const KSyncEntry *entry, uint32_t index)
const Interface * GetInterface() const
const uint32_t vrf_id() const
const MacAddress & GetMac() const
const IpAddress * GetIp() const
bool IsLess(const NextHopKey &rhs) const
NextHop::Type GetType() const
bool IsEqual(const NextHopKey &rhs) const
bool learning_enabled() const
const uint32_t isid() const
const uint32_t vrf_id() const
const MacAddress dest_bmac() const
const NextHop * child_nh() const
const Interface * GetInterface() const
const Interface * get_interface() const
const TunnelType & GetTunnelType() const
const Ip4Address * GetDip() const
const uint32_t vrf_id() const
const Interface * GetCryptInterface() const
const AgentRoute * GetRt() const
const Ip4Address * GetSip() const
const MacAddress & rewrite_dmac() const
bool GetCryptTunnelAvailable() const
bool IsLess(const TunnelType &rhs) const
bool Compare(const TunnelType &rhs) const
const MacAddress & GetDMac() const
const Interface * GetInterface() const
uint16_t GetVlanTag() const
const VrfEntry * GetVrf() const
const MacAddress & GetSMac() const
static const uint32_t kInvalidVlanId
const string & GetName() const
static const uint32_t kInvalidIndex
const uint32_t vrf_id() const
VrfEntry * forwarding_vrf() const
bool flood_unknown_unicast() const
bool layer2_control_word() const
const VrfEntry * GetVrf() const
class boost::shared_ptr< AgentKsyncSandesh > AgentKsyncSandeshPtr
#define KSYNC_TRACE(obj, parent,...)
static bool NeedRewrite(NHKSyncEntry *entry, InterfaceKSyncEntry *if_ksync)