22 #include "vr_nexthop.h"
23 #include "vr_message.h"
30 if ((vr_response_code_ & VR_MESSAGE_DUMP_INCOMPLETE))
36 int code = r->get_resp_code();
40 if (code == -ENOENT) {
41 ErrResp *resp =
new ErrResp();
50 InternalErrResp *resp =
new InternalErrResp();
55 LOG(ERROR,
"Error reading kstate: " << strerror(-code) <<
65 int encode_len, error;
95 if (mac.size() != 6) {
96 return "00:00:00:00:00:00";
99 strm << hex << setfill(
'0') << setw(2) << (int)((uint8_t) mac.at(0)) <<
":"
100 << setw(2) << (int)((uint8_t) mac.at(1)) <<
":" << setw(2)
101 << (int)((uint8_t) mac.at(2)) <<
":" << setw(2)
102 << (int)((uint8_t) mac.at(3)) <<
":" << setw(2)
103 << (int)((uint8_t) mac.at(4)) <<
":" << setw(2)
104 << (int)((uint8_t) mac.at(5));
114 KInterfaceResp *resp =
static_cast<KInterfaceResp *
>(ist->
response_object());
116 vector<KInterfaceInfo> &list =
117 const_cast<std::vector<KInterfaceInfo>&
>(resp->get_if_list());
120 data.set_mirror_id(r->get_vifr_mir_id());
121 data.set_vrf(r->get_vifr_vrf());
122 data.set_idx(r->get_vifr_idx());
123 data.set_rid(r->get_vifr_rid());
124 data.set_os_idx(r->get_vifr_os_idx());
125 data.set_mtu(r->get_vifr_mtu());
129 data.set_name(
string(
"NULL"));
131 data.set_name(
string(intf->
name()));
135 data.set_ip(ipaddr.to_string());
137 data.set_ibytes(r->get_vifr_ibytes());
138 data.set_ipackets(r->get_vifr_ipackets());
139 data.set_ierrors(r->get_vifr_ierrors());
140 data.set_obytes(r->get_vifr_obytes());
141 data.set_opackets(r->get_vifr_opackets());
142 data.set_oerrors(r->get_vifr_oerrors());
144 data.set_ref_cnt(r->get_vifr_ref_cnt());
145 data.set_speed(r->get_vifr_speed());
146 data.set_duplexity(r->get_vifr_duplex());
148 data.set_mac(MacToString(r->get_vifr_mac()));
149 data.set_qos_map_index(r->get_vifr_qos_map_index());
150 data.set_core(r->get_vifr_core());
151 data.set_queue_ipackets(r->get_vifr_queue_ipackets());
152 data.set_queue_ierrors(r->get_vifr_queue_ierrors());
153 data.set_queue_opackets(r->get_vifr_queue_opackets());
154 data.set_queue_oerrors(r->get_vifr_queue_oerrors());
155 data.set_queue_ierrors_to_lcore(ist->
SetItfSandesh(r->get_vifr_queue_ierrors_to_lcore()));
156 data.set_port_ipackets(r->get_vifr_port_ipackets());
157 data.set_port_ierrors(r->get_vifr_port_ierrors());
158 data.set_port_isyscalls(r->get_vifr_port_isyscalls());
159 data.set_port_inombufs(r->get_vifr_port_inombufs());
160 data.set_port_opackets(r->get_vifr_port_opackets());
161 data.set_port_oerrors(r->get_vifr_port_oerrors());
162 data.set_port_osyscalls(r->get_vifr_port_osyscalls());
163 data.set_dev_ibytes(r->get_vifr_dev_ibytes());
164 data.set_dev_ipackets(r->get_vifr_dev_ipackets());
165 data.set_dev_ierrors(r->get_vifr_dev_ierrors());
166 data.set_dev_inombufs(r->get_vifr_dev_inombufs());
167 data.set_dev_obytes(r->get_vifr_dev_obytes());
168 data.set_dev_opackets(r->get_vifr_dev_opackets());
169 data.set_dev_oerrors(r->get_vifr_dev_oerrors());
170 data.set_parent_vif_id(r->get_vifr_parent_vif_idx());
171 data.set_vlan_id(r->get_vifr_vlan_id());
172 data.set_nh_id(r->get_vifr_nh_id());
173 data.set_cross_connect_id(r->get_vifr_cross_connect_idx());
174 data.set_bridge_idx(ist->
SetItfSandesh(r->get_vifr_bridge_idx()));
175 data.set_ovlan_id(r->get_vifr_ovlan_id());
176 data.set_transport(r->get_vifr_transport());
177 data.set_src_mac(MacToString(r->get_vifr_src_mac()));
178 data.set_fat_flow_protocol_port(ist->
SetItfSandesh(r->get_vifr_fat_flow_protocol_port()));
179 if (r->get_vifr_isid()) {
180 data.set_isid(r->get_vifr_isid());
182 if (r->get_vifr_pbb_mac().size()) {
183 data.set_pbb_bmac(MacToString(r->get_vifr_pbb_mac()));
187 std::vector<BondMemberIntfInfo> bond_interface_list;
188 const char *bond_link[] = {
"DOWN",
"UP"};
190 data.set_status(bond_link[(r->get_vifr_intf_status() & 0x01)]);
192 char *slave_intf_name = NULL;
193 char *slave_intf_drv_name = NULL;
194 if(!r->get_vifr_bond_slave_name().empty())
196 (
char *)(
reinterpret_cast<const signed char*
> (
197 &(r->get_vifr_bond_slave_name())[0]));
199 if (!r->get_vifr_bond_slave_drv_name().empty())
200 slave_intf_drv_name =
201 (
char *)(
reinterpret_cast<const signed char*
> (
202 &(r->get_vifr_bond_slave_drv_name())[0]));
204 for (
int i = 0; i < r->get_vifr_num_bond_slave(); i++) {
205 BondMemberIntfInfo entry;
207 entry.set_child_bond_interface_status(
208 bond_link[(r->get_vifr_intf_status() >> (i + 1)) & 0x01]);
211 std::string str(slave_intf_name);
212 entry.set_child_bond_interface_name(str);
214 slave_intf_name = strchr(slave_intf_name,
'\0');
217 if(slave_intf_drv_name)
219 std::string str1(slave_intf_drv_name);
220 entry.set_child_bond_interface_drv_name(str1);
222 slave_intf_drv_name = strchr(slave_intf_drv_name,
'\0');
223 slave_intf_drv_name++;
225 bond_interface_list.push_back(entry);
228 data.set_bond_child_intf_list(bond_interface_list);
230 list.push_back(data);
232 UpdateContext(r->get_vifr_idx());
240 nhst =
static_cast<NHKState *
>(
this);
243 vector<KNHInfo> &list =
244 const_cast<std::vector<KNHInfo>&
>(resp->get_nh_list());
247 data.set_id(r->get_nhr_id());
248 data.set_rid(r->get_nhr_rid());
249 if (r->get_nhr_type() != NH_COMPOSITE) {
250 data.set_encap_oif_id(r->get_nhr_encap_oif_id());
252 r->get_nhr_encap_family()));
254 data.set_vrf(r->get_nhr_vrf());
255 if (r->get_nhr_type() == NH_TUNNEL) {
257 Ip4Address sip(ntohl((uint32_t)r->get_nhr_tun_sip()));
258 Ip4Address dip(ntohl((uint32_t)r->get_nhr_tun_dip()));
259 data.set_tun_sip(sip.to_string());
260 data.set_tun_dip(dip.to_string());
261 }
else if(nhst->
FamilyToString(r->get_nhr_family()) ==
"AF_INET6") {
265 if (r->get_nhr_flags() & NH_FLAG_TUNNEL_UDP) {
266 data.set_tun_sport(ntohs(r->get_nhr_tun_sport()));
267 data.set_tun_dport(ntohs(r->get_nhr_tun_dport()));
271 data.set_ref_cnt(r->get_nhr_ref_cnt());
273 const vector<signed char> &encap = r->get_nhr_encap();
277 data.set_encap_len(encap.size());
282 list.push_back(data);
283 UpdateContext(r->get_nhr_id());
288 int size = prefix.size();
289 string str =
"unknown";
291 Ip4Address::bytes_type bytes = { {0, 0, 0, 0} };
292 for (
int i = 0; i < size; i++) {
293 bytes[i] = prefix.at(i);
296 str = addr4.to_string();
298 Ip6Address::bytes_type bytes =
299 { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} };
300 for (
int i = 0; i < size; i++) {
301 bytes[i] = prefix.at(i);
304 str = addr6.to_string();
317 vector<KRouteInfo> &list =
318 const_cast<std::vector<KRouteInfo>&
>(resp->get_rt_list());
320 data.set_vrf_id(r->get_rtr_vrf_id());
322 if(r->get_h_op() == sandesh_op::GET) {
323 boost::system::error_code ec;
324 IpAddress addr(IpAddress::from_string(PrefixToString(r->get_rtr_prefix()), ec));
327 }
else if(addr.is_v6()) {
331 data.set_prefix(PrefixToString(r->get_rtr_prefix()));
333 data.set_prefix_len(r->get_rtr_prefix_len());
334 data.set_rid(r->get_rtr_rid());
336 r->get_rtr_label_flags()));
337 if(r->get_rtr_label_flags() & VR_RT_LABEL_VALID_FLAG) {
338 data.set_label(r->get_rtr_label());
342 data.set_nh_id(r->get_rtr_nh_id());
343 if(r->get_rtr_family() == AF_BRIDGE) {
344 data.set_rtr_mac(MacToString(r->get_rtr_mac()));
345 data.set_index(r->get_rtr_index());
348 list.push_back(data);
355 rctx->
vrf_id = r->get_rtr_vrf_id();
356 if (r->get_rtr_family() == AF_BRIDGE) {
357 rctx->
marker = r->get_rtr_mac();
359 rctx->
marker = r->get_rtr_prefix();
373 vector<KMplsInfo> &list =
374 const_cast<std::vector<KMplsInfo>&
>(resp->get_mpls_list());
375 data.set_label(r->get_mr_label());
376 data.set_rid(r->get_mr_rid());
377 data.set_nhid(r->get_mr_nhid());
379 list.push_back(data);
381 int32_t label = r->get_mr_label();
382 UpdateContext(label);
390 KMirrorResp *resp =
static_cast<KMirrorResp *
>(mst->
response_object());
392 vector<KMirrorInfo> &list =
393 const_cast<std::vector<KMirrorInfo>&
>(resp->get_mirror_list());
395 data.set_mirr_index(r->get_mirr_index());
396 data.set_mirr_rid(r->get_mirr_rid());
397 data.set_mirr_nhid(r->get_mirr_nhid());
398 data.set_mirr_flags(mst->
FlagsToString(r->get_mirr_flags()));
399 data.set_mirr_users(r->get_mirr_users());
400 data.set_mirr_vni(r->get_mirr_vni());
402 list.push_back(data);
404 int32_t mirror_id = r->get_mirr_index();
405 UpdateContext(mirror_id);
413 KVrfAssignResp *resp =
416 vector<KVrfAssignInfo> &list =
417 const_cast<std::vector<KVrfAssignInfo>&
>(resp->get_vrf_assign_list());
418 data.set_vif_index(r->get_var_vif_index());
419 data.set_vlan_id(r->get_var_vlan_id());
420 data.set_vif_vrf(r->get_var_vif_vrf());
421 data.set_rid(r->get_var_rid());
422 data.set_nh_id(r->get_var_nh_id());
423 list.push_back(data);
433 ctx->
marker_ = r->get_var_vlan_id();
445 vector<KVrfInfo> &list =
446 const_cast<std::vector<KVrfInfo>&
>(resp->get_vrf_list());
447 data.set_vrf_idx(r->get_vrf_idx());
448 data.set_hbf_rintf(r->get_vrf_hbfr_vif_idx());
449 data.set_hbf_lintf(r->get_vrf_hbfl_vif_idx());
450 list.push_back(data);
460 ctx->
marker_ = r->get_vrf_idx();
469 KVrfStatsResp *resp =
472 vector<KVrfStatsInfo> &list =
473 const_cast<std::vector<KVrfStatsInfo>&
>(resp->get_vrf_stats_list());
474 data.set_vrf_id(r->get_vsr_vrf());
476 data.set_vrf_rid(r->get_vsr_rid());
477 data.set_vrf_discards(r->get_vsr_discards());
478 data.set_vrf_resolves(r->get_vsr_resolves());
479 data.set_vrf_receives(r->get_vsr_receives());
480 data.set_vrf_udp_tunnels(r->get_vsr_udp_tunnels());
481 data.set_vrf_udp_mpls_tunnels(r->get_vsr_udp_mpls_tunnels());
482 data.set_vrf_gre_mpls_tunnels(r->get_vsr_gre_mpls_tunnels());
483 data.set_vrf_l2_mcast_composites(r->get_vsr_l2_mcast_composites());
484 data.set_vrf_fabric_composites(r->get_vsr_fabric_composites());
485 data.set_vrf_ecmp_composites(r->get_vsr_ecmp_composites());
486 data.set_vrf_encaps(r->get_vsr_encaps());
487 data.set_vrf_l2_encaps(r->get_vsr_l2_encaps());
488 data.set_vrf_vxlan_tunnels(r->get_vsr_vxlan_tunnels());
489 data.set_vrf_gros(r->get_vsr_gros());
490 data.set_vrf_diags(r->get_vsr_diags());
491 data.set_vrf_encap_composites(r->get_vsr_encap_composites());
492 data.set_vrf_evpn_composites(r->get_vsr_evpn_composites());
493 data.set_vrf_translates(r->get_vsr_vrf_translates());
494 data.set_vrf_arp_virtual_proxy(r->get_vsr_arp_virtual_proxy());
495 data.set_vrf_arp_virtual_stitch(r->get_vsr_arp_virtual_stitch());
496 data.set_vrf_arp_virtual_flood(r->get_vsr_arp_virtual_flood());
497 data.set_vrf_arp_physical_stitch(r->get_vsr_arp_physical_stitch());
498 data.set_vrf_arp_tor_proxy(r->get_vsr_arp_tor_proxy());
499 data.set_vrf_arp_physical_flood(r->get_vsr_arp_physical_flood());
500 data.set_vrf_l2_receives(r->get_vsr_l2_receives());
501 data.set_vrf_uuc_floods(r->get_vsr_uuc_floods());
502 list.push_back(data);
504 UpdateContext(r->get_vsr_vrf());
515 vector<KVxLanInfo> &list =
516 const_cast<std::vector<KVxLanInfo>&
>(resp->get_vxlan_list());
517 data.set_vxlanid(r->get_vxlanr_vnid());
518 data.set_rid(r->get_vxlanr_rid());
519 data.set_nhid(r->get_vxlanr_nhid());
521 list.push_back(data);
523 int32_t label = r->get_vxlanr_vnid();
524 UpdateContext(label);
531 KDropStatsResp *resp =
533 resp->set_ds_rid(req->get_vds_rid());
534 resp->set_ds_discard(req->get_vds_discard());
535 resp->set_ds_pull(req->get_vds_pull());
536 resp->set_ds_invalid_if(req->get_vds_invalid_if());
537 resp->set_ds_invalid_arp(req->get_vds_invalid_arp());
538 resp->set_ds_trap_no_if(req->get_vds_trap_no_if());
539 resp->set_ds_nowhere_to_go(req->get_vds_nowhere_to_go());
540 resp->set_ds_flow_queue_limit_exceeded(req->get_vds_flow_queue_limit_exceeded());
541 resp->set_ds_flow_no_memory(req->get_vds_flow_no_memory());
542 resp->set_ds_flow_invalid_protocol(req->get_vds_flow_invalid_protocol());
543 resp->set_ds_flow_nat_no_rflow(req->get_vds_flow_nat_no_rflow());
544 resp->set_ds_flow_action_drop(req->get_vds_flow_action_drop());
545 resp->set_ds_flow_action_invalid(req->get_vds_flow_action_invalid());
546 resp->set_ds_flow_unusable(req->get_vds_flow_unusable());
547 resp->set_ds_flow_table_full(req->get_vds_flow_table_full());
548 resp->set_ds_interface_tx_discard(req->get_vds_interface_tx_discard());
549 resp->set_ds_interface_drop(req->get_vds_interface_drop());
550 resp->set_ds_duplicated(req->get_vds_duplicated());
551 resp->set_ds_push(req->get_vds_push());
552 resp->set_ds_ttl_exceeded(req->get_vds_ttl_exceeded());
553 resp->set_ds_invalid_nh(req->get_vds_invalid_nh());
554 resp->set_ds_invalid_label(req->get_vds_invalid_label());
555 resp->set_ds_invalid_protocol(req->get_vds_invalid_protocol());
556 resp->set_ds_interface_rx_discard(req->get_vds_interface_rx_discard());
557 resp->set_ds_invalid_mcast_source(req->get_vds_invalid_mcast_source());
558 resp->set_ds_head_alloc_fail(req->get_vds_head_alloc_fail());
559 resp->set_ds_pcow_fail(req->get_vds_pcow_fail());
560 resp->set_ds_mcast_clone_fail(req->get_vds_mcast_clone_fail());
561 resp->set_ds_rewrite_fail(req->get_vds_rewrite_fail());
562 resp->set_ds_misc(req->get_vds_misc());
563 resp->set_ds_invalid_packet(req->get_vds_invalid_packet());
564 resp->set_ds_cksum_err(req->get_vds_cksum_err());
565 resp->set_ds_no_fmd(req->get_vds_no_fmd());
566 resp->set_ds_cloned_original(req->get_vds_cloned_original());
567 resp->set_ds_invalid_vnid(req->get_vds_invalid_vnid());
568 resp->set_ds_frag_err(req->get_vds_frag_err());
569 resp->set_ds_invalid_source(req->get_vds_invalid_source());
570 resp->set_ds_mcast_df_bit(req->get_vds_mcast_df_bit());
571 resp->set_ds_l2_no_route(req->get_vds_l2_no_route());
572 resp->set_ds_vlan_fwd_tx(req->get_vds_vlan_fwd_tx());
573 resp->set_ds_vlan_fwd_enq(req->get_vds_vlan_fwd_enq());
574 resp->set_ds_no_memory(req->get_vds_no_memory());
575 resp->set_ds_drop_new_flow(req->get_vds_drop_new_flow());
576 resp->set_ds_flow_evict(req->get_vds_flow_evict());
580 KForwardingClass data;
584 KForwardingClassResp *resp =
587 vector<KForwardingClass> &list =
588 const_cast<std::vector<KForwardingClass>&
>(
589 resp->get_forwarding_class_list());
591 data.set_id(r->get_fmr_id()[0]);
592 data.set_rid(r->get_fmr_rid());
593 data.set_dscp(r->get_fmr_dscp()[0]);
594 data.set_mpls_exp(r->get_fmr_mpls_qos()[0]);
595 data.set_vlan_priority(r->get_fmr_dotonep()[0]);
596 data.set_qos_queue(r->get_fmr_queue_id()[0]);
597 list.push_back(data);
599 int16_t index = r->get_fmr_id()[0];
600 UpdateContext(index);
608 KQosConfigResp *resp =
static_cast<KQosConfigResp *
>(mst->
response_object());
610 vector<KQosConfig> &list =
611 const_cast<std::vector<KQosConfig>&
>(resp->get_qos_config_list());
612 data.set_id(r->get_qmr_id());
613 data.set_rid(r->get_qmr_rid());
615 std::vector<int8_t>::const_iterator qos_it =
616 r->get_qmr_dscp().begin();
617 std::vector<int8_t>::const_iterator fc_it =
618 r->get_qmr_dscp_fc_id().begin();
619 std::vector<kQosIdFowardingClassPair> dscp_list;
620 for(;qos_it != r->get_qmr_dscp().end() &&
621 fc_it != r->get_qmr_dscp_fc_id().end();
623 kQosIdFowardingClassPair pair;
624 pair.set_qos(*qos_it);
625 pair.set_fc_id(*fc_it);
626 dscp_list.push_back(pair);
628 data.set_dscp_map(dscp_list);
630 qos_it = r->get_qmr_mpls_qos().begin();
631 fc_it = r->get_qmr_mpls_qos_fc_id().begin();
632 std::vector<kQosIdFowardingClassPair> mpls_list;
633 for(;qos_it != r->get_qmr_mpls_qos().end() &&
634 fc_it != r->get_qmr_mpls_qos_fc_id().end(); qos_it++, fc_it++) {
635 kQosIdFowardingClassPair pair;
636 pair.set_qos(*qos_it);
637 pair.set_fc_id(*fc_it);
638 mpls_list.push_back(pair);
640 data.set_mpls_exp_map(mpls_list);
642 qos_it = r->get_qmr_dotonep().begin();
643 fc_it = r->get_qmr_dotonep_fc_id().begin();
644 std::vector<kQosIdFowardingClassPair> vlan_priority_list;
645 for(;qos_it != r->get_qmr_dotonep().end() &&
646 fc_it != r->get_qmr_dotonep_fc_id().end();
648 kQosIdFowardingClassPair pair;
649 pair.set_qos(*qos_it);
650 pair.set_fc_id(*fc_it);
651 vlan_priority_list.push_back(pair);
653 data.set_vlan_priority_map(vlan_priority_list);
654 list.push_back(data);
656 uint16_t
id = r->get_qmr_id();
const std::string MacToString(const std::vector< signed char > &mac) const
const std::string response_context() const
static Agent * GetInstance()
const std::string EncapToString(const std::vector< signed char > &encap) const
virtual void VrfAssignMsgHandler(vr_vrf_assign_req *req)
const std::string PrefixToString(const std::vector< int8_t > &prefix)
virtual int32_t WriteBinary(u_int8_t *buf, u_int32_t buf_len, int *error)
const string SetItfSandesh(vector< ElementType > const &itf_sandesh)
virtual void RouteMsgHandler(vr_route_req *req)
virtual void MirrorMsgHandler(vr_mirror_req *req)
boost::asio::ip::address IpAddress
const std::string FamilyToString(int family) const
const std::string FamilyToString(int family) const
const std::string EncapFamilyToString(int family) const
void GenericSend(IoContext *ctx)
virtual void NHMsgHandler(vr_nexthop_req *req)
static Ip4Address GetIp4SubnetAddress(const Ip4Address &prefix, uint16_t plen)
const std::string LabelFlagsToString(int flags) const
virtual void VrfStatsMsgHandler(vr_vrf_stats_req *req)
const boost::any & more_context() const
static Ip6Address GetIp6SubnetAddress(const Ip6Address &prefix, uint16_t plen)
virtual void DropStatsMsgHandler(vr_drop_stats_req *req)
void set_vr_response_code(int value)
virtual void VxLanMsgHandler(vr_vxlan_req *req)
const std::string TypeToString(int type) const
#define KSYNC_DEFAULT_MSG_SIZE
static KSyncSock * Get(DBTablePartBase *partition)
std::vector< int8_t > marker
boost::asio::ip::address_v6 Ip6Address
virtual void IfMsgHandler(vr_interface_req *req)
uint32_t AllocSeqNo(IoContext::Type type)
const std::string TypeToString(int type) const
const std::string FlagsToString(int flags) const
std::string VectorIpv6ToString(const std::vector< signed char > &ipv6)
virtual int VrResponseMsgHandler(vr_response *r)
virtual void ForwardingClassMsgHandler(vr_fc_map_req *req)
const std::string FamilyToString(int family) const
virtual void QosConfigMsgHandler(vr_qos_map_req *req)
boost::asio::ip::address_v4 Ip4Address
static InterfaceTable * GetInstance()
const std::string FlagsToString(int flags) const
void UpdateContext(const boost::any &)
const std::string FlagsToString(uint32_t flags) const
void EncodeAndSend(Sandesh &encoder)
const Interface * FindInterface(size_t index) const
#define LOG(_Level, _Msg)
const std::string & name() const
virtual void VrfMsgHandler(vr_vrf_req *req)
Sandesh * response_object() const
virtual void MplsMsgHandler(vr_mpls_req *req)
void SetComponentNH(vr_nexthop_req *req, KNHInfo &info)