6 #include <sys/socket.h>
8 #include <linux/netlink.h>
9 #include <linux/rtnetlink.h>
10 #include <linux/genetlink.h>
11 #include <linux/sockios.h>
14 #include <boost/bind/bind.hpp>
30 #include "vr_genetlink.h"
31 #include "vr_message.h"
34 #include "vr_interface.h"
37 using namespace boost::placeholders;
42 using namespace boost::asio;
48 encoder.set_h_op(sandesh_op::RESPONSE);
49 encoder.set_resp_code(code);
50 return encoder.WriteBinary(buf, buf_len, &error);
54 tx_buff_list_.push_back(*cl);
66 assert(tx_buff_list_.size() == 0);
70 int decode_buf_len = buf_len;
71 decode_buf = (uint8_t *)(parse_buf);
72 while(decode_buf_len > 0) {
76 LOG(DEBUG,
"Incorrect decode len " << decode_len);
79 decode_buf += decode_len;
80 decode_buf_len -= decode_len;
93 struct nlmsghdr *last_nlh = NULL;
94 std::vector<struct nl_client>::iterator it = tx_buff_list_.begin();
96 while (it != tx_buff_list_.end()) {
97 struct nl_client *cl = &(*it);
98 struct nlmsghdr *nlh = (
struct nlmsghdr *)(cl->cl_buf);
100 nlh->nlmsg_flags |= NLM_F_MULTI;
102 iovec.push_back(buffer(cl->cl_buf, cl->cl_msg_len));
111 InitNetlinkDoneMsg(&nlh, last_nlh->nlmsg_seq);
112 iovec.push_back(buffer((uint8_t *)&nlh, NLMSG_HDRLEN));
116 last_nlh->nlmsg_flags &= (~NLM_F_MULTI);
120 KSyncBufferList::iterator iovec_it = iovec.begin();
121 while (iovec_it != iovec.end()) {
122 sock_.send_to(*iovec_it, local_ep_);
127 it = tx_buff_list_.begin();
128 while (it != tx_buff_list_.end()) {
129 struct nl_client *cl = &(*it);
133 tx_buff_list_.clear();
142 uint32_t buf_len = 0, encode_len = 0;
143 struct nlmsghdr *nlh;
146 if ((ret = nl_build_header(&cl, &buf, &buf_len)) < 0) {
147 LOG(DEBUG,
"Error creating interface DUMP message : " << ret);
152 nlh = (
struct nlmsghdr *)cl.cl_buf;
153 nlh->nlmsg_seq = seq_num;
155 uint32_t fwd_flow_idx = req->get_fr_index();
156 bool add_error =
false;
157 if (fwd_flow_idx == 0xFFFFFFFF) {
160 if (flow_error != -ENOSPC && flow_error != 0) {
175 buf_len -= encode_len;
177 vr_flow_response resp;
178 resp.set_fresp_op(flow_op::FLOW_SET);
179 resp.set_fresp_flags(req->get_fr_flags());
180 resp.set_fresp_index(req->get_fr_index());
181 resp.set_fresp_gen_id(req->get_fr_gen_id());
182 resp.set_fresp_bytes(0);
183 resp.set_fresp_packets(0);
184 resp.set_fresp_stats_oflow(0);
186 encode_len += resp.WriteBinary(buf, buf_len, &error);
188 SimulateResponse(seq_num, -ENOENT, 0);
193 nl_update_header(&cl, encode_len);
199 nlh->nlmsg_seq = seq_num;
200 nlh->nlmsg_type = NLMSG_DONE;
201 nlh->nlmsg_len = NLMSG_HDRLEN;
202 nlh->nlmsg_flags = 0;
212 if ((ret = nl_build_header(&cl, &buf, &buf_len)) < 0) {
213 LOG(DEBUG,
"Error creating mpls message. Error : " << ret);
218 struct nlmsghdr *nlh = (
struct nlmsghdr *)cl.cl_buf;
219 nlh->nlmsg_seq = seq_num;
220 nlh->nlmsg_flags |= flags;
222 nl_update_header(&cl, encode_len);
223 LOG(DEBUG,
"SimulateResponse " <<
" seq " << seq_num <<
" code " << std::hex << code);
231 ksync_rx_queue[i]->set_disable(disable);
247 KSyncSockTypeMap::ksync_map_if::const_iterator it;
248 static int os_index = 10;
250 sprintf(name,
"intf%d",
id);
251 vr_interface_req req;
252 req.set_vifr_idx(
id);
253 req.set_vifr_type(VIF_TYPE_VIRTUAL);
255 req.set_vifr_os_idx(os_index);
256 req.set_vifr_name(name);
257 const std::vector<signed char> list(mac_size);
258 req.set_vifr_mac(list);
259 req.set_vifr_flags(flags);
261 it = sock->
if_map.find(
id);
262 if (it == sock->
if_map.end()) {
270 KSyncSockTypeMap::ksync_map_if::iterator it;
271 it = sock->
if_map.find(
id);
272 if (it != sock->
if_map.end()) {
279 KSyncSockTypeMap::ksync_map_nh::const_iterator it;
282 req.set_nhr_flags(flags);
283 it = sock->
nh_map.find(
id);
284 if (it == sock->
nh_map.end()) {
291 KSyncSockTypeMap::ksync_map_nh::iterator it;
292 it = sock->
nh_map.find(
id);
293 if (it != sock->
nh_map.end()) {
300 KSyncSockTypeMap::ksync_map_mpls::const_iterator it;
302 req.set_mr_label(
id);
311 KSyncSockTypeMap::ksync_map_mpls::iterator it;
320 KSyncSockTypeMap::ksync_map_mirror::const_iterator it;
322 req.set_mirr_index(
id);
331 KSyncSockTypeMap::ksync_map_mirror::iterator it;
341 std::pair<std::set<vr_route_req>::iterator,
bool> ret;
342 ret = sock->
rt_tree.insert(req);
345 if (ret.second ==
false) {
346 int del_count = sock->
rt_tree.erase(req);
348 ret = sock->
rt_tree.insert(req);
349 assert(ret.second ==
true);
351 if (req.get_rtr_family() == AF_BRIDGE) {
358 KSyncSockTypeMap::ksync_rt_tree::iterator it;
360 if (it != sock->
rt_tree.end()) {
367 KSyncSockTypeMap::ksync_vrf_assign_tree::const_iterator it;
376 KSyncSockTypeMap::ksync_vrf_assign_tree::iterator it;
385 KSyncSockTypeMap::ksync_map_vrf_stats::const_iterator it;
386 vr_vrf_stats_req vrf_stats;
387 vrf_stats.set_vsr_vrf(vrf_id);
388 vrf_stats.set_vsr_family(AF_INET);
389 vrf_stats.set_vsr_rid(0);
390 vrf_stats.set_vsr_discards(0);
391 vrf_stats.set_vsr_resolves(0);
392 vrf_stats.set_vsr_receives(0);
393 vrf_stats.set_vsr_udp_tunnels(0);
394 vrf_stats.set_vsr_udp_mpls_tunnels(0);
395 vrf_stats.set_vsr_gre_mpls_tunnels(0);
396 vrf_stats.set_vsr_ecmp_composites(0);
397 vrf_stats.set_vsr_fabric_composites(0);
398 vrf_stats.set_vsr_l2_mcast_composites(0);
399 vrf_stats.set_vsr_encaps(0);
400 vrf_stats.set_vsr_l2_encaps(0);
410 KSyncSockTypeMap::ksync_map_vrf_stats::iterator it;
420 r.set_vsr_discards(req.get_vsr_discards());
421 r.set_vsr_resolves(req.get_vsr_resolves());
422 r.set_vsr_receives(req.get_vsr_receives());
423 r.set_vsr_udp_tunnels(req.get_vsr_udp_tunnels());
424 r.set_vsr_udp_mpls_tunnels(req.get_vsr_udp_mpls_tunnels());
425 r.set_vsr_gre_mpls_tunnels(req.get_vsr_gre_mpls_tunnels());
426 r.set_vsr_ecmp_composites(req.get_vsr_ecmp_composites());
427 r.set_vsr_l2_mcast_composites(req.get_vsr_l2_mcast_composites());
428 r.set_vsr_fabric_composites(req.get_vsr_fabric_composites());
429 r.set_vsr_encaps(req.get_vsr_encaps());
430 r.set_vsr_l2_encaps(req.get_vsr_l2_encaps());
431 r.set_vsr_gros(req.get_vsr_gros());
432 r.set_vsr_diags(req.get_vsr_diags());
433 r.set_vsr_encap_composites(req.get_vsr_encap_composites());
434 r.set_vsr_evpn_composites(req.get_vsr_evpn_composites());
435 r.set_vsr_vrf_translates(req.get_vsr_vrf_translates());
436 r.set_vsr_vxlan_tunnels(req.get_vsr_vxlan_tunnels());
437 r.set_vsr_arp_virtual_proxy(req.get_vsr_arp_virtual_proxy());
438 r.set_vsr_arp_virtual_stitch(req.get_vsr_arp_virtual_stitch());
439 r.set_vsr_arp_virtual_flood(req.get_vsr_arp_virtual_flood());
440 r.set_vsr_arp_physical_stitch(req.get_vsr_arp_physical_stitch());
441 r.set_vsr_arp_tor_proxy(req.get_vsr_arp_tor_proxy());
442 r.set_vsr_arp_physical_flood(req.get_vsr_arp_physical_flood());
443 r.set_vsr_l2_receives(req.get_vsr_l2_receives());
444 r.set_vsr_uuc_floods(req.get_vsr_uuc_floods());
449 KSyncSockTypeMap::ksync_map_vxlan::const_iterator it;
454 vxlan.set_vxlanr_vnid(
id);
455 vxlan.set_vxlanr_rid(0);
462 KSyncSockTypeMap::ksync_map_vxlan::iterator it;
471 int obytes,
int opkts,
int oerrors) {
473 vr_interface_req req = sock->
if_map[idx];
474 req.set_vifr_ibytes(ibytes+req.get_vifr_ibytes());
475 req.set_vifr_ipackets(ipkts+req.get_vifr_ipackets());
476 req.set_vifr_ierrors(ierrors+req.get_vifr_ierrors());
477 req.set_vifr_obytes(obytes+req.get_vifr_obytes());
478 req.set_vifr_opackets(opkts+req.get_vifr_opackets());
479 req.set_vifr_oerrors(oerrors+req.get_vifr_oerrors());
484 int obytes,
int opkts,
int oerrors) {
486 vr_interface_req req = sock->
if_map[idx];
487 req.set_vifr_ibytes(ibytes);
488 req.set_vifr_ipackets(ipkts);
489 req.set_vifr_ierrors(ierrors);
490 req.set_vifr_obytes(obytes);
491 req.set_vifr_opackets(opkts);
492 req.set_vifr_oerrors(oerrors);
498 return sock->
if_map.size();
503 return sock->
nh_map.size();
522 struct nlmsghdr *nlh = (
struct nlmsghdr *)data;
523 return nlh->nlmsg_seq;
527 struct nlmsghdr *nlh = (
struct nlmsghdr *)data;
529 return (nlh->nlmsg_flags & NLM_F_MULTI);
544 struct nlmsghdr *nlh = (
struct nlmsghdr *)data;
545 if (nlh->nlmsg_type == NLMSG_ERROR) {
546 LOG(ERROR,
"Ignoring Netlink error for seqno " << nlh->nlmsg_seq
547 <<
" len " << nlh->nlmsg_len);
552 if (nlh->nlmsg_len > kBufLen) {
553 LOG(ERROR,
"Length of " << nlh->nlmsg_len <<
" is more than expected "
554 "length of " << kBufLen);
562 KSyncBufferList::iterator it = iovec->begin();
563 while (it != iovec->end()) {
564 unsigned char *buf = boost::asio::buffer_cast<unsigned char *>(*it);
565 int buffer_size = boost::asio::buffer_size(*it);
566 data.append(
reinterpret_cast<const char*
>(buf), buffer_size);
574 std::string data =
"";
579 ProcessSandesh((
const uint8_t *)(data.c_str()), data.size(), &ctx);
584 std::string data =
"";
589 ProcessSandesh((
const uint8_t *)(data.c_str()), data.size(), &ctx);
595 sock_.async_receive_from(buf, local_ep_, cb);
604 flow_table_ = (vr_flow_entry *)malloc(size);
616 return &flow_table_[idx];
620 uint32_t idx = req->get_fr_index();
622 vr_flow_entry *f = &flow_table_[idx];
624 f->fe_flags &= ~VR_FLOW_FLAG_ACTIVE;
625 f->fe_stats.flow_bytes = 0;
626 f->fe_stats.flow_packets = 0;
631 int family = (req->get_fr_family() == AF_INET)?
Address::INET :
635 U64ToIp(req->get_fr_flow_sip_u(), req->get_fr_flow_sip_l(),
636 req->get_fr_flow_dip_u(), req->get_fr_flow_dip_l(),
638 f->fe_flags = VR_FLOW_FLAG_ACTIVE;
639 f->fe_stats.flow_bytes = 30;
640 f->fe_stats.flow_packets = 1;
641 f->fe_gen_id = req->get_fr_gen_id();
643 f->fe_key.flow4_sip = htonl(sip.to_v4().to_ulong());
644 f->fe_key.flow4_dip = htonl(dip.to_v4().to_ulong());
647 f->fe_key.flow4_nh_id = req->get_fr_flow_nh_id();
649 f->fe_key.flow6_nh_id = req->get_fr_flow_nh_id();
651 f->fe_key.flow_family = req->get_fr_family();
652 f->fe_key.flow_sport = req->get_fr_flow_sport();
653 f->fe_key.flow_dport = req->get_fr_flow_dport();
654 f->fe_key.flow_nh_id = req->get_fr_flow_nh_id();
655 f->fe_key.flow_proto = req->get_fr_flow_proto();
659 vr_flow_entry *f = &flow_table_[idx];
660 if (f->fe_flags & VR_FLOW_FLAG_ACTIVE) {
661 f->fe_flags |= VR_FLOW_FLAG_EVICTED;
666 vr_flow_entry *f = &flow_table_[idx];
667 if (f->fe_flags & VR_FLOW_FLAG_ACTIVE) {
668 f->fe_flags &= ~VR_FLOW_FLAG_EVICTED;
674 vr_flow_entry *f = &flow_table_[idx];
675 if (f->fe_flags & VR_FLOW_FLAG_ACTIVE) {
676 f->fe_stats.flow_bytes += bytes;
677 f->fe_stats.flow_packets += pkts;
682 vr_flow_entry *f = &flow_table_[idx];
683 if (f->fe_flags & VR_FLOW_FLAG_ACTIVE) {
684 f->fe_tcp_flags = flags;
689 vr_flow_entry *f = &flow_table_[idx];
690 if (f->fe_flags & VR_FLOW_FLAG_ACTIVE) {
691 f->fe_tcp_flags = flags;
696 vr_flow_entry *f = &flow_table_[idx];
697 if (f->fe_flags & VR_FLOW_FLAG_ACTIVE) {
698 f->fe_udp_src_port = port;
703 vr_flow_entry *f = &flow_table_[idx];
704 if (f->fe_flags & VR_FLOW_FLAG_ACTIVE) {
705 f->fe_stats.flow_bytes_oflow = bytes;
706 f->fe_stats.flow_packets_oflow = pkts;
711 bridge_table_ = (vr_bridge_entry *)malloc(size);
712 memset(bridge_table_, 0, size);
713 return bridge_table_;
719 bridge_table_ = NULL;
724 return &bridge_table_[idx];
729 vr_bridge_entry *be = &bridge_table_[idx];
735 if (be->be_packets == 0) {
738 vr_bridge_entry_key *key = &be->be_key;
741 key->be_vrf_id = req->get_rtr_vrf_id();
744 const std::vector<signed char> &prefix = req->get_rtr_mac();
745 for(std::vector<signed char>::const_iterator it = prefix.begin();
746 it != prefix.end(); ++it) {
747 key->be_mac[i] = ((uint8_t) *it);
753 vr_bridge_entry *be = &bridge_table_[idx];
755 be->be_flags |= VR_BE_MAC_NEW_FLAG;
757 be->be_flags &= ~VR_BE_MAC_NEW_FLAG;
763 assert(singleton_ == NULL);
769 singleton_->local_ep_.address
770 (boost::asio::ip::address::from_string(
"127.0.0.1"));
771 singleton_->local_ep_.port(0);
772 singleton_->sock_.open(boost::asio::ip::udp::v4());
773 singleton_->sock_.bind(singleton_->local_ep_);
774 singleton_->local_ep_ = singleton_->sock_.local_endpoint();
783 while (!ctx_queue_.empty()) {
784 ctx_queue_.front()->Process();
785 delete ctx_queue_.front();
792 std::scoped_lock lock(ctx_queue_lock_);
793 if (block_msg_processing_ != enable) {
794 block_msg_processing_ = enable;
795 if (!block_msg_processing_) {
805 if (req_->get_h_op() == sandesh_op::DEL) {
806 sock->
if_map.erase(req_->get_vifr_idx());
807 }
else if (req_->get_h_op() == sandesh_op::DUMP) {
811 }
else if (req_->get_h_op() == sandesh_op::GET) {
817 vr_interface_req if_info(*req_);
818 sock->
if_map[req_->get_vifr_idx()] = if_info;
841 flags = req_->get_fr_flags();
844 sock->
flow_map.erase(req_->get_fr_index());
848 uint32_t fwd_flow_idx = req_->get_fr_index();
849 if (fwd_flow_idx == 0xFFFFFFFF) {
850 if (flow_error == 0) {
854 fwd_flow_idx = req_->get_fr_rindex() + 1;
856 fwd_flow_idx = rand() % 20000;
860 fwd_flow_idx += 20000;
869 req_->set_fr_index(fwd_flow_idx);
870 req_->set_fr_gen_id((fwd_flow_idx % 255));
876 fwd_flow_idx = rand() % 20000;
880 fwd_flow_idx += 20000;
883 req_->set_fr_index(fwd_flow_idx);
884 req_->set_fr_gen_id((fwd_flow_idx % 255));
888 if (fwd_flow_idx != 0xFFFFFFFF) {
890 vr_flow_req flow_info(*req_);
892 sock->
flow_map[req_->get_fr_index()] = flow_info;
923 if (req_->get_h_op() == sandesh_op::DEL) {
924 sock->
nh_map.erase(req_->get_nhr_id());
925 }
else if (req_->get_h_op() == sandesh_op::DUMP) {
929 }
else if (req_->get_h_op() == sandesh_op::GET) {
935 vr_nexthop_req nh_info(*req_);
936 sock->
nh_map[req_->get_nhr_id()] = nh_info;
958 if (req_->get_h_op() == sandesh_op::DEL) {
959 sock->
mpls_map.erase(req_->get_mr_label());
960 }
else if (req_->get_h_op() == sandesh_op::DUMP) {
964 }
else if (req_->get_h_op() == sandesh_op::GET) {
970 vr_mpls_req mpls_info(*req_);
971 sock->
mpls_map[req_->get_mr_label()] = mpls_info;
993 if (req_->get_h_op() == sandesh_op::DEL) {
994 if (req_->get_rtr_family() == AF_BRIDGE) {
998 }
else if (req_->get_h_op() == sandesh_op::DUMP) {
1034 if (req->get_h_op() == sandesh_op::DEL) {
1035 sock->
mirror_map.erase(req->get_mirr_index());
1040 if (req->get_h_op() == sandesh_op::DUMP) {
1046 if (req->get_h_op() == sandesh_op::GET) {
1053 vr_mirror_req mirror_info(*req);
1054 sock->
mirror_map[req->get_mirr_index()] = mirror_info;
1062 if (req_->get_h_op() == sandesh_op::DEL) {
1063 sock->
vxlan_map.erase(req_->get_vxlanr_vnid());
1064 }
else if (req_->get_h_op() == sandesh_op::DUMP) {
1068 }
else if (req_->get_h_op() == sandesh_op::GET) {
1074 vr_vxlan_req vxlan_info(*req_);
1075 sock->
vxlan_map[req_->get_vxlanr_vnid()] = vxlan_info;
1097 if (req_->get_h_op() == sandesh_op::GET) {
1122 if (req_->get_h_op() == sandesh_op::DEL) {
1124 }
else if (req_->get_h_op() == sandesh_op::DUMP) {
1130 std::pair<std::set<vr_vrf_assign_req>::iterator,
bool> ret;
1134 if (ret.second ==
false) {
1138 assert(ret.second ==
true);
1162 if (req_->get_h_op() == sandesh_op::DEL) {
1163 sock->
vrf_map.erase(req_->get_vrf_idx());
1164 }
else if (req_->get_h_op() == sandesh_op::DUMP) {
1168 }
else if (req_->get_h_op() == sandesh_op::GET) {
1174 vr_vrf_req vrf_info(*req_);
1175 sock->
vrf_map[req_->get_vrf_idx()] = vrf_info;
1194 if (req_->get_h_op() == sandesh_op::DUMP) {
1197 }
else if (req_->get_h_op() == sandesh_op::GET) {
1218 if (req_->get_h_op() == sandesh_op::GET) {
1240 struct nl_client cl;
1242 uint8_t *buf = NULL;
1243 uint32_t buf_len = 0, encode_len = 0, tot_encode_len = 0;
1244 struct nlmsghdr *nlh = NULL;
1247 unsigned int resp_code = 0;
1251 ret_code &= ~VR_MESSAGE_DUMP_INCOMPLETE;
1255 Sandesh *req = GetFirst(from_req);
1258 if ((ret = nl_build_header(&cl, &buf, &buf_len)) < 0) {
1259 LOG(DEBUG,
"Error creating interface DUMP message : " << ret);
1264 nlh = (
struct nlmsghdr *)cl.cl_buf;
1265 nlh->nlmsg_seq = seq_num;
1268 while(req != NULL) {
1269 encode_len = req->
WriteBinary(buf, buf_len, &error);
1274 buf_len -= encode_len;
1275 tot_encode_len += encode_len;
1281 if (req != NULL && buf_len < encode_len) {
1297 resp_code = resp_code | VR_MESSAGE_DUMP_INCOMPLETE;
1303 nlh->nlmsg_flags |= NLM_F_MULTI;
1304 nl_update_header(&cl, tot_encode_len);
1313 struct nl_client cl;
1315 uint8_t *buf = NULL;
1316 uint32_t buf_len = 0, encode_len = 0;
1317 struct nlmsghdr *nlh;
1324 ret_code &= ~VR_MESSAGE_DUMP_INCOMPLETE;
1334 if ((ret = nl_build_header(&cl, &buf, &buf_len)) < 0) {
1335 LOG(DEBUG,
"Error creating interface DUMP message : " << ret);
1340 nlh = (
struct nlmsghdr *)cl.cl_buf;
1341 nlh->nlmsg_seq = seq_num;
1345 buf_len -= resp_len;
1347 encode_len = req->
WriteBinary(buf, buf_len, &error);
1354 buf_len -= encode_len;
1356 nl_update_header(&cl, encode_len + resp_len);
1362 KSyncSockTypeMap::ksync_map_if::const_iterator it;
1363 static vr_interface_req req;
1365 it = sock->
if_map.find(idx);
1366 if (it != sock->
if_map.end()) {
1375 KSyncSockTypeMap::ksync_map_if::const_iterator it;
1376 static vr_interface_req req;
1378 vr_interface_req *orig_req;
1379 orig_req =
static_cast<vr_interface_req *
>(from_req);
1381 idx = orig_req->get_vifr_marker();
1382 it = sock->
if_map.upper_bound(idx);
1384 if (it != sock->
if_map.end()) {
1386 req.set_vifr_flags(orig_req->get_vifr_flags());
1393 static int last_intf_id = 0;
1394 static int32_t last_if_flags = 0;
1396 KSyncSockTypeMap::ksync_map_if::const_iterator it;
1397 static vr_interface_req req, *r;
1399 r =
dynamic_cast<vr_interface_req *
>(input);
1405 last_intf_id = r->get_vifr_idx();
1406 last_if_flags = r->get_vifr_flags();
1407 if (r->get_vifr_flags() & VIF_FLAG_GET_DROP_STATS) {
1408 return &drop_stats_req;
1411 it = sock->
if_map.upper_bound(last_intf_id);
1413 if (it != sock->
if_map.end()) {
1415 req.set_vifr_flags(last_if_flags);
1423 KSyncSockTypeMap::ksync_map_nh::const_iterator it;
1424 static vr_nexthop_req req;
1426 it = sock->
nh_map.find(idx);
1427 if (it != sock->
nh_map.end()) {
1436 KSyncSockTypeMap::ksync_map_nh::const_iterator it;
1437 static vr_nexthop_req req;
1438 vr_nexthop_req *orig_req;
1439 orig_req =
static_cast<vr_nexthop_req *
>(from_req);
1442 idx = orig_req->get_nhr_marker();
1443 it = sock->
nh_map.upper_bound(idx);
1444 if (it != sock->
nh_map.end()) {
1453 KSyncSockTypeMap::ksync_map_nh::const_iterator it;
1454 static vr_nexthop_req req, *r;
1456 r =
static_cast<vr_nexthop_req *
>(input);
1457 it = sock->
nh_map.upper_bound(r->get_nhr_id());
1459 if (it != sock->
nh_map.end()) {
1468 KSyncSockTypeMap::ksync_map_mpls::const_iterator it;
1469 static vr_mpls_req req;
1481 KSyncSockTypeMap::ksync_map_mpls::const_iterator it;
1482 static vr_mpls_req req;
1483 vr_mpls_req *orig_req;
1484 orig_req =
static_cast<vr_mpls_req *
>(from_req);
1487 idx = orig_req->get_mr_marker();
1488 it = sock->
mpls_map.upper_bound(idx);
1499 KSyncSockTypeMap::ksync_map_mpls::const_iterator it;
1500 static vr_mpls_req req, *r;
1502 r =
static_cast<vr_mpls_req *
>(input);
1503 it = sock->
mpls_map.upper_bound(r->get_mr_label());
1514 KSyncSockTypeMap::ksync_map_vrf::const_iterator it;
1515 static vr_vrf_req req;
1518 if (it != sock->
vrf_map.end()) {
1527 KSyncSockTypeMap::ksync_map_vrf::const_iterator it;
1528 static vr_vrf_req req;
1529 vr_vrf_req *orig_req;
1530 orig_req =
static_cast<vr_vrf_req *
>(from_req);
1533 idx = orig_req->get_vrf_marker();
1534 it = sock->
vrf_map.upper_bound(idx);
1536 if (it != sock->
vrf_map.end()) {
1545 KSyncSockTypeMap::ksync_map_vrf::const_iterator it;
1546 static vr_vrf_req req, *r;
1548 r =
static_cast<vr_vrf_req *
>(input);
1549 it = sock->
vrf_map.upper_bound(r->get_vrf_idx());
1551 if (it != sock->
vrf_map.end()) {
1560 KSyncSockTypeMap::ksync_map_mirror::const_iterator it;
1561 static vr_mirror_req req;
1573 KSyncSockTypeMap::ksync_map_mirror::const_iterator it;
1574 static vr_mirror_req req;
1575 vr_mirror_req *orig_req;
1576 orig_req =
static_cast<vr_mirror_req *
>(from_req);
1579 idx = orig_req->get_mirr_marker();
1591 KSyncSockTypeMap::ksync_map_mirror::const_iterator it;
1592 static vr_mirror_req req, *r;
1594 r =
static_cast<vr_mirror_req *
>(input);
1595 it = sock->
mirror_map.upper_bound(r->get_mirr_index());
1606 KSyncSockTypeMap::ksync_rt_tree::const_iterator it;
1607 static vr_route_req req;
1608 vr_route_req *orig_req, key;
1609 orig_req =
static_cast<vr_route_req *
>(from_req);
1611 key.set_rtr_family(orig_req->get_rtr_family());
1612 key.set_rtr_vrf_id(orig_req->get_rtr_vrf_id());
1613 if (orig_req->get_rtr_marker().size() || orig_req->get_rtr_mac().size()) {
1614 if (orig_req->get_rtr_family() == AF_BRIDGE) {
1615 key.set_rtr_mac(orig_req->get_rtr_mac());
1617 key.set_rtr_prefix(orig_req->get_rtr_marker());
1618 key.set_rtr_prefix_len(orig_req->get_rtr_marker_plen());
1620 it = sock->
rt_tree.upper_bound(key);
1622 std::vector<int8_t> rtr_prefix;
1623 if (orig_req->get_rtr_family() == AF_BRIDGE) {
1624 key.set_rtr_mac(rtr_prefix);
1626 key.set_rtr_prefix(rtr_prefix);
1627 key.set_rtr_prefix_len(0);
1629 it = sock->
rt_tree.lower_bound(key);
1633 if (it != sock->
rt_tree.end()) {
1634 if ((it->get_rtr_vrf_id() != orig_req->get_rtr_vrf_id()) ||
1635 (it->get_rtr_family() != orig_req->get_rtr_family())) {
1646 KSyncSockTypeMap::ksync_rt_tree::const_iterator it;
1647 static vr_route_req req, *r, key;
1649 r =
static_cast<vr_route_req *
>(input);
1651 key.set_rtr_vrf_id(r->get_rtr_vrf_id());
1652 key.set_rtr_family(r->get_rtr_family());
1653 if (r->get_rtr_family() == AF_BRIDGE) {
1654 key.set_rtr_mac(r->get_rtr_mac());
1656 key.set_rtr_prefix(r->get_rtr_prefix());
1657 key.set_rtr_prefix_len(r->get_rtr_prefix_len());
1659 it = sock->
rt_tree.upper_bound(key);
1661 if (it != sock->
rt_tree.end()) {
1662 if ((it->get_rtr_vrf_id() != r->get_rtr_vrf_id()) ||
1663 (it->get_rtr_family() != r->get_rtr_family())) {
1674 KSyncSockTypeMap::ksync_vrf_assign_tree::const_iterator it;
1675 static vr_vrf_assign_req req;
1676 vr_vrf_assign_req *orig_req, key;
1677 orig_req =
static_cast<vr_vrf_assign_req *
>(from_req);
1679 key.set_var_vif_index(orig_req->get_var_vif_index());
1680 key.set_var_vlan_id(orig_req->get_var_marker());
1692 KSyncSockTypeMap::ksync_vrf_assign_tree::const_iterator it;
1693 static vr_vrf_assign_req req, *r, key;
1695 r =
static_cast<vr_vrf_assign_req *
>(input);
1697 key.set_var_vif_index(r->get_var_vif_index());
1698 key.set_var_vlan_id(r->get_var_vlan_id());
1710 KSyncSockTypeMap::ksync_map_vrf_stats::const_iterator it;
1711 static vr_vrf_stats_req req;
1723 KSyncSockTypeMap::ksync_map_vrf_stats::const_iterator it;
1724 static vr_vrf_stats_req req;
1726 vr_vrf_stats_req *orig_req;
1727 orig_req =
static_cast<vr_vrf_stats_req *
>(from_req);
1729 idx = orig_req->get_vsr_marker();
1741 KSyncSockTypeMap::ksync_map_vrf_stats::const_iterator it;
1742 static vr_vrf_stats_req req, *r;
1744 r =
static_cast<vr_vrf_stats_req *
>(input);
1756 KSyncSockTypeMap::ksync_map_vxlan::const_iterator it;
1757 static vr_vxlan_req req;
1769 KSyncSockTypeMap::ksync_map_vxlan::const_iterator it;
1770 static vr_vxlan_req req;
1771 vr_vxlan_req *orig_req;
1772 orig_req =
static_cast<vr_vxlan_req *
>(from_req);
1775 idx = orig_req->get_vxlanr_vnid();
1787 KSyncSockTypeMap::ksync_map_vxlan::const_iterator it;
1788 static vr_vxlan_req req, *r;
1790 r =
static_cast<vr_vxlan_req *
>(input);
1791 it = sock->
vxlan_map.upper_bound(r->get_vxlanr_vnid());
boost::asio::ip::address IpAddress
void U64ToIp(uint64_t sip_u, uint64_t sip_l, uint64_t dip_u, uint64_t dip_l, int family, IpAddress *sip, IpAddress *dip)
virtual Sandesh * GetFirst(Sandesh *)
virtual Sandesh * Get(int idx)
virtual Sandesh * GetNext(Sandesh *)
static void NetlinkDecoder(char *data, SandeshContext *ctxt)
static void NetlinkBulkDecoder(char *data, SandeshContext *ctxt, bool more)
void UpdateBridgeEntryInactiveFlag(int idx, bool set)
ksync_map_vrf_stats vrf_stats_map
static void MplsAdd(int id)
static void SetUnderlaySourcePort(int idx, int port)
static void Init(boost::asio::io_context &ios)
static void SimulateResponse(uint32_t, int, int)
int GetKSyncError(KSyncSockEntryType type)
static vr_flow_entry * GetFlowEntry(int idx)
static void SetFlowEntry(vr_flow_req *req, bool set)
static void IfStatsSet(int, int, int, int, int, int, int)
virtual bool BulkDecoder(char *data, KSyncBulkSandeshContext *ctxt)
static void SetEvictedFlag(int idx)
bool is_incremental_index()
static void VrfStatsUpdate(int vrf_id, const vr_vrf_stats_req &req)
virtual bool Validate(char *data)
static void FlowNatResponse(uint32_t seq_num, vr_flow_req *req, int code=0)
virtual bool IsMoreData(char *data)
static void FlowMmapFree()
static void VrfStatsDelete(int vrf_id)
static void MirrorDelete(int id)
static void InterfaceDelete(int id)
static void IncrFlowStats(int idx, int pkts, int bytes)
void SetBridgeEntry(uint32_t idx, vr_route_req *req, bool set)
virtual uint32_t GetSeqno(char *data)
vr_bridge_entry * GetBridgeEntry(int idx)
static void VxlanDelete(int id)
virtual void AsyncSendTo(KSyncBufferList *iovec, uint32_t seq_no, HandlerCb cb)
static KSyncSockTypeMap * GetKSyncSockTypeMap()
static void SetTcpFlag(int idx, uint32_t flags)
virtual void Receive(boost::asio::mutable_buffers_1)
static void MirrorAdd(int id)
void AddNetlinkTxBuff(struct nl_client *cl)
virtual std::size_t SendTo(KSyncBufferList *iovec, uint32_t seq_no)
virtual void AsyncReceive(boost::asio::mutable_buffers_1, HandlerCb)
void SetBlockMsgProcessing(bool enable)
void DisableReceiveQueue(bool disable)
static void VxlanAdd(int id)
static void ResetEvictedFlag(int idx)
static void VrfStatsAdd(int vrf_id)
static void SetDropStats(const vr_drop_stats_req &req)
static void IfStatsUpdate(int, int, int, int, int, int, int)
ksync_map_mirror mirror_map
static void VrfAssignAdd(vr_vrf_assign_req &req)
ksync_vrf_assign_tree vrf_assign_tree
bool IsBlockMsgProcessing()
vrouter_ops ksync_vrouter_ops
ksync_map_ctx_queue ctx_queue_
ksync_map_vxlan vxlan_map
static vr_flow_entry * FlowMmapAlloc(int size)
std::mutex ctx_queue_lock_
static void SetFlowTcpFlags(int idx, uint16_t flags)
void ProcessSandesh(const uint8_t *, std::size_t, KSyncUserSockContext *)
static void SetOFlowStats(int idx, uint8_t pkts, uint16_t bytes)
static void NHAdd(int id, int flags=0)
static void SetVRouterOps(const vrouter_ops &req)
static void RouteAdd(vr_route_req &req)
static void InterfaceAdd(int id, int flags=0, int mac_size=6)
static void RouteDelete(vr_route_req &req)
static void MplsDelete(int id)
virtual bool Decoder(char *data, AgentSandeshContext *ctxt)
void InitNetlinkDoneMsg(struct nlmsghdr *nlh, uint32_t seq_num)
static void NHDelete(int id)
static vr_flow_entry * flow_table_
static KSyncSockTypeMap * singleton_
static void VrfAssignDelete(vr_vrf_assign_req &req)
vr_drop_stats_req drop_stats
vr_bridge_entry * BridgeMmapAlloc(int size)
static void Init(bool use_work_queue, const std::string &cpu_pin_policy)
static void SetSockTableEntry(KSyncSock *sock)
boost::function< void(const boost::system::error_code &, size_t)> HandlerCb
static int GetNetlinkFamilyId()
virtual void VxLanMsgHandler(vr_vxlan_req *req)
virtual void MplsMsgHandler(vr_mpls_req *req)
virtual void RouteMsgHandler(vr_route_req *req)
virtual void FlowMsgHandler(vr_flow_req *req)
virtual void VrfAssignMsgHandler(vr_vrf_assign_req *req)
virtual void DropStatsMsgHandler(vr_drop_stats_req *req)
virtual void NHMsgHandler(vr_nexthop_req *req)
virtual void QosConfigMsgHandler(vr_qos_map_req *req)
virtual void MirrorMsgHandler(vr_mirror_req *req)
virtual void VrfStatsMsgHandler(vr_vrf_stats_req *req)
virtual void IfMsgHandler(vr_interface_req *req)
virtual void VrfMsgHandler(vr_vrf_req *req)
virtual void VrouterOpsMsgHandler(vrouter_ops *req)
virtual void ForwardingClassMsgHandler(vr_fc_map_req *req)
virtual Sandesh * GetFirst(Sandesh *)
virtual Sandesh * GetNext(Sandesh *)
virtual Sandesh * Get(int idx)
void SendDumpResponse(uint32_t seq_num, Sandesh *)
void SendGetResponse(uint32_t seq_num, int idx)
virtual Sandesh * GetFirst(Sandesh *)
virtual Sandesh * GetNext(Sandesh *)
virtual Sandesh * Get(int idx)
virtual Sandesh * Get(int idx)
virtual Sandesh * GetFirst(Sandesh *)
virtual Sandesh * GetNext(Sandesh *)
virtual Sandesh * GetFirst(Sandesh *)
virtual Sandesh * GetNext(Sandesh *)
virtual int32_t WriteBinary(u_int8_t *buf, u_int32_t buf_len, int *error)
static int32_t ReceiveBinaryMsgOne(u_int8_t *buf, u_int32_t buf_len, int *error, SandeshContext *client_context)
virtual Sandesh * GetNext(Sandesh *)
virtual Sandesh * GetFirst(Sandesh *)
virtual Sandesh * Get(int idx)
virtual Sandesh * GetFirst(Sandesh *)
virtual Sandesh * GetNext(Sandesh *)
virtual Sandesh * GetNext(Sandesh *)
virtual Sandesh * GetFirst(Sandesh *)
virtual Sandesh * Get(int idx)
virtual Sandesh * GetFirst(Sandesh *)
virtual Sandesh * Get(int idx)
virtual Sandesh * GetNext(Sandesh *)
std::vector< boost::asio::mutable_buffers_1 > KSyncBufferList
static void IoVectorToData(std::string &data, KSyncBufferList *iovec)
int EncodeVrResponse(uint8_t *buf, int buf_len, uint32_t seq_num, int code)
#define LOG(_Level, _Msg)