LCOV - code coverage report
Current view: top level - vnsw/agent/kstate - kstate.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 0 453 0.0 %
Date: 2026-11-09 02:10:49 Functions: 0 18 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
       3             :  * Copyright Contributors to the OpenSDN project
       4             :  */
       5             : 
       6             : #include <base/address_util.h>
       7             : #include "kstate.h"
       8             : #include "oper/interface_common.h"
       9             : #include "interface_kstate.h"
      10             : #include "route_kstate.h"
      11             : #include "nh_kstate.h"
      12             : #include "mpls_kstate.h"
      13             : #include "flow_kstate.h"
      14             : #include "mirror_kstate.h"
      15             : #include "vrf_assign_kstate.h"
      16             : #include "vrf_stats_kstate.h"
      17             : #include "drop_stats_kstate.h"
      18             : #include "vxlan_kstate.h"
      19             : #include "kstate_io_context.h"
      20             : #include "forwarding_class_kstate.h"
      21             : #include "qos_config_kstate.h"
      22             : #include "vrf_kstate.h"
      23             : #include "vr_nexthop.h"
      24             : #include "vr_message.h"
      25             : #include <net/if.h>
      26             : #include <string>
      27             : 
      28             : using namespace std;
      29             : 
      30           0 : bool KState::MoreData() const {
      31           0 :     if ((vr_response_code_ & VR_MESSAGE_DUMP_INCOMPLETE))
      32           0 :         return true;
      33           0 :     return false;
      34             : }
      35             : 
      36           0 : int KState::VrResponseMsgHandler(vr_response *r) {
      37           0 :     int code = r->get_resp_code();
      38             : 
      39           0 :     KState *st = static_cast<KState *>(this);
      40           0 :     st->set_vr_response_code(code);
      41           0 :     if (code == -ENOENT) {
      42           0 :         ErrResp *resp = new ErrResp();
      43           0 :         resp->set_context(st->response_context());
      44           0 :         resp->Response();
      45             : 
      46           0 :         st->Release();
      47           0 :         return 0;
      48             :     }
      49             : 
      50           0 :     if (code < 0) {
      51           0 :         InternalErrResp *resp = new InternalErrResp();
      52           0 :         resp->set_context(st->response_context());
      53           0 :         resp->Response();
      54             : 
      55           0 :         st->Release();
      56           0 :         LOG(ERROR, "Error reading kstate: " << strerror(-code) <<
      57             :                    " :code: " << -code);
      58           0 :         return -code;
      59             :     }
      60             : 
      61           0 :     return 0;
      62             : }
      63             : 
      64           0 : void KState::EncodeAndSend(Sandesh &encoder) {
      65             : 
      66             :     int encode_len, error;
      67           0 :     KSyncSock   *sock = KSyncSock::Get(0);
      68             : 
      69             :     //Due to mock mode, we have to handle case when sock is NULL.
      70           0 :     if (sock == NULL) {
      71           0 :         Agent *agent = Agent::GetInstance();
      72           0 :         assert(agent && agent->isMockMode());
      73           0 :         return;
      74             :     }
      75             : 
      76           0 :     uint8_t *buf = (uint8_t *)malloc(KSYNC_DEFAULT_MSG_SIZE);
      77             : 
      78           0 :     encode_len = encoder.WriteBinary(buf, KSYNC_DEFAULT_MSG_SIZE, &error);
      79             : 
      80           0 :     AgentSandeshContext *sctx = static_cast<AgentSandeshContext *>(this);
      81             :     KStateIoContext *ioc =
      82             :         new KStateIoContext(encode_len, (char *)buf,
      83           0 :                             sock->AllocSeqNo(IoContext::IOC_KSYNC, 0), sctx);
      84           0 :     sock->GenericSend(ioc);
      85             : }
      86             : 
      87           0 : void KState::UpdateContext(const boost::any &ctx) {
      88           0 :     more_context_ = ctx;
      89           0 : }
      90             : 
      91           0 : const string KState::MacToString(const vector<signed char> &mac)
      92             :     const {
      93             :     /* We need the below check because if mac size is less than 6, we will
      94             :      * hit out_of_range exception because of mac.at code below
      95             :      */
      96           0 :     if (mac.size() != 6) {
      97           0 :         return "00:00:00:00:00:00";
      98             :     }
      99           0 :     ostringstream strm;
     100           0 :     strm << hex << setfill('0') << setw(2) << (int)((uint8_t) mac.at(0)) << ":"
     101           0 :          << setw(2) << (int)((uint8_t) mac.at(1)) << ":" << setw(2)
     102           0 :          << (int)((uint8_t) mac.at(2)) << ":" << setw(2)
     103           0 :          << (int)((uint8_t) mac.at(3)) << ":" << setw(2)
     104           0 :          << (int)((uint8_t) mac.at(4)) << ":" << setw(2)
     105           0 :          << (int)((uint8_t) mac.at(5));
     106           0 :     return strm.str();
     107           0 : }
     108             : 
     109           0 : void KState::IfMsgHandler(vr_interface_req *r) {
     110             : 
     111           0 :     KInterfaceInfo data;
     112             :     const Interface *intf;
     113             : 
     114           0 :     InterfaceKState *ist = static_cast<InterfaceKState *>(this);
     115           0 :     KInterfaceResp *resp = static_cast<KInterfaceResp *>(ist->response_object());
     116             : 
     117             :     vector<KInterfaceInfo> &list =
     118           0 :                         const_cast<std::vector<KInterfaceInfo>&>(resp->get_if_list());
     119           0 :     data.set_type(ist->TypeToString(r->get_vifr_type()));
     120           0 :     data.set_flags(ist->FlagsToString(r->get_vifr_flags()));
     121           0 :     data.set_mirror_id(r->get_vifr_mir_id());
     122           0 :     data.set_vrf(r->get_vifr_vrf());
     123           0 :     data.set_idx(r->get_vifr_idx());
     124           0 :     data.set_rid(r->get_vifr_rid());
     125           0 :     data.set_os_idx(r->get_vifr_os_idx());
     126           0 :     data.set_mtu(r->get_vifr_mtu());
     127             : 
     128           0 :     intf = InterfaceTable::GetInstance()->FindInterface(r->get_vifr_idx());
     129           0 :     if (!intf) {
     130           0 :         data.set_name(string("NULL"));
     131             :     } else {
     132           0 :         data.set_name(string(intf->name()));
     133             :     }
     134             : 
     135           0 :     Ip4Address ipaddr(r->get_vifr_ip());
     136           0 :     data.set_ip(ipaddr.to_string());
     137             : 
     138           0 :     data.set_ibytes(r->get_vifr_ibytes());
     139           0 :     data.set_ipackets(r->get_vifr_ipackets());
     140           0 :     data.set_ierrors(r->get_vifr_ierrors());
     141           0 :     data.set_obytes(r->get_vifr_obytes());
     142           0 :     data.set_opackets(r->get_vifr_opackets());
     143           0 :     data.set_oerrors(r->get_vifr_oerrors());
     144             : 
     145           0 :     data.set_ref_cnt(r->get_vifr_ref_cnt());
     146           0 :     data.set_speed(r->get_vifr_speed());
     147           0 :     data.set_duplexity(r->get_vifr_duplex());
     148             : 
     149           0 :     data.set_mac(MacToString(r->get_vifr_mac()));
     150           0 :     data.set_qos_map_index(r->get_vifr_qos_map_index());
     151           0 :     data.set_core(r->get_vifr_core());
     152           0 :     data.set_queue_ipackets(r->get_vifr_queue_ipackets());
     153           0 :     data.set_queue_ierrors(r->get_vifr_queue_ierrors());
     154           0 :     data.set_queue_opackets(r->get_vifr_queue_opackets());
     155           0 :     data.set_queue_oerrors(r->get_vifr_queue_oerrors());
     156           0 :     data.set_queue_ierrors_to_lcore(ist->SetItfSandesh(r->get_vifr_queue_ierrors_to_lcore()));
     157           0 :     data.set_port_ipackets(r->get_vifr_port_ipackets());
     158           0 :     data.set_port_ierrors(r->get_vifr_port_ierrors());
     159           0 :     data.set_port_isyscalls(r->get_vifr_port_isyscalls());
     160           0 :     data.set_port_inombufs(r->get_vifr_port_inombufs());
     161           0 :     data.set_port_opackets(r->get_vifr_port_opackets());
     162           0 :     data.set_port_oerrors(r->get_vifr_port_oerrors());
     163           0 :     data.set_port_osyscalls(r->get_vifr_port_osyscalls());
     164           0 :     data.set_dev_ibytes(r->get_vifr_dev_ibytes());
     165           0 :     data.set_dev_ipackets(r->get_vifr_dev_ipackets());
     166           0 :     data.set_dev_ierrors(r->get_vifr_dev_ierrors());
     167           0 :     data.set_dev_inombufs(r->get_vifr_dev_inombufs());
     168           0 :     data.set_dev_obytes(r->get_vifr_dev_obytes());
     169           0 :     data.set_dev_opackets(r->get_vifr_dev_opackets());
     170           0 :     data.set_dev_oerrors(r->get_vifr_dev_oerrors());
     171           0 :     data.set_parent_vif_id(r->get_vifr_parent_vif_idx());
     172           0 :     data.set_vlan_id(r->get_vifr_vlan_id());
     173           0 :     data.set_nh_id(r->get_vifr_nh_id());
     174           0 :     data.set_cross_connect_id(r->get_vifr_cross_connect_idx());
     175           0 :     data.set_bridge_idx(ist->SetItfSandesh(r->get_vifr_bridge_idx()));
     176           0 :     data.set_ovlan_id(r->get_vifr_ovlan_id());
     177           0 :     data.set_transport(r->get_vifr_transport());
     178           0 :     data.set_src_mac(MacToString(r->get_vifr_src_mac()));
     179           0 :     data.set_fat_flow_protocol_port(ist->SetItfSandesh(r->get_vifr_fat_flow_protocol_port()));
     180           0 :     if (r->get_vifr_isid()) {
     181           0 :         data.set_isid(r->get_vifr_isid());
     182             :     }
     183           0 :     if (r->get_vifr_pbb_mac().size()) {
     184           0 :         data.set_pbb_bmac(MacToString(r->get_vifr_pbb_mac()));
     185             :     }
     186           0 :     if(ist->TypeToString(r->get_vifr_type()) == "PHYSICAL")
     187             :     {
     188           0 :         std::vector<BondMemberIntfInfo> bond_interface_list;
     189           0 :         const char *bond_link[] = {"DOWN", "UP"};
     190             : 
     191           0 :         data.set_status(bond_link[(r->get_vifr_intf_status() & 0x01)]);
     192             : 
     193           0 :         char *slave_intf_name = NULL;
     194           0 :         char *slave_intf_drv_name = NULL;
     195           0 :         if(!r->get_vifr_bond_slave_name().empty())
     196             :             slave_intf_name =
     197             :                 (char *)(reinterpret_cast<const signed char*> (
     198           0 :                             &(r->get_vifr_bond_slave_name())[0]));
     199             : 
     200           0 :         if (!r->get_vifr_bond_slave_drv_name().empty())
     201             :             slave_intf_drv_name =
     202             :                 (char *)(reinterpret_cast<const signed char*> (
     203           0 :                             &(r->get_vifr_bond_slave_drv_name())[0]));
     204             : 
     205           0 :         for (int i = 0; i < r->get_vifr_num_bond_slave(); i++) {
     206           0 :             BondMemberIntfInfo entry;
     207             : 
     208           0 :             entry.set_child_bond_interface_status(
     209           0 :                     bond_link[(r->get_vifr_intf_status() >> (i + 1)) & 0x01]);
     210           0 :             if(slave_intf_name)
     211             :             {
     212           0 :                 std::string str(slave_intf_name);
     213           0 :                 entry.set_child_bond_interface_name(str);
     214             : 
     215           0 :                 slave_intf_name = strchr(slave_intf_name, '\0');
     216           0 :                 slave_intf_name++;
     217           0 :             }
     218           0 :             if(slave_intf_drv_name)
     219             :             {
     220           0 :                 std::string str1(slave_intf_drv_name);
     221           0 :                 entry.set_child_bond_interface_drv_name(str1);
     222             : 
     223           0 :                 slave_intf_drv_name = strchr(slave_intf_drv_name, '\0');
     224           0 :                 slave_intf_drv_name++;
     225           0 :             }
     226           0 :             bond_interface_list.push_back(entry);
     227           0 :         }
     228             : 
     229           0 :         data.set_bond_child_intf_list(bond_interface_list);
     230           0 :     }
     231           0 :     list.push_back(data);
     232             : 
     233           0 :     UpdateContext(r->get_vifr_idx());
     234           0 : }
     235             : 
     236           0 : void KState::NHMsgHandler(vr_nexthop_req *r) {
     237             : 
     238           0 :     KNHInfo data;
     239             :     NHKState *nhst;
     240             : 
     241           0 :     nhst = static_cast<NHKState *>(this);
     242           0 :     KNHResp *resp = static_cast<KNHResp *>(nhst->response_object());
     243             : 
     244             :     vector<KNHInfo> &list =
     245           0 :                         const_cast<std::vector<KNHInfo>&>(resp->get_nh_list());
     246           0 :     data.set_type(nhst->TypeToString(r->get_nhr_type()));
     247           0 :     data.set_family(nhst->FamilyToString(r->get_nhr_family()));
     248           0 :     data.set_id(r->get_nhr_id());
     249           0 :     data.set_rid(r->get_nhr_rid());
     250           0 :     if (r->get_nhr_type() != NH_COMPOSITE) {
     251           0 :         data.set_encap_oif_id(r->get_nhr_encap_oif_id());
     252           0 :         data.set_encap_family(nhst->EncapFamilyToString(
     253             :                               r->get_nhr_encap_family()));
     254             :     }
     255           0 :     data.set_vrf(r->get_nhr_vrf());
     256           0 :     if (r->get_nhr_type() == NH_TUNNEL) {
     257           0 :         if(nhst->FamilyToString(r->get_nhr_family()) == "AF_INET") {
     258           0 :             Ip4Address sip(ntohl((uint32_t)r->get_nhr_tun_sip()));
     259           0 :             Ip4Address dip(ntohl((uint32_t)r->get_nhr_tun_dip()));
     260           0 :             data.set_tun_sip(sip.to_string());
     261           0 :             data.set_tun_dip(dip.to_string());
     262           0 :         } else if(nhst->FamilyToString(r->get_nhr_family()) == "AF_INET6") {
     263           0 :             data.set_tun_sip(VectorIpv6ToString(r->get_nhr_tun_sip6()));
     264           0 :             data.set_tun_dip(VectorIpv6ToString(r->get_nhr_tun_dip6()));
     265             :         }
     266           0 :         if (r->get_nhr_flags() & NH_FLAG_TUNNEL_UDP) {
     267           0 :             data.set_tun_sport(ntohs(r->get_nhr_tun_sport()));
     268           0 :             data.set_tun_dport(ntohs(r->get_nhr_tun_dport()));
     269             :         }
     270             :     }
     271             : 
     272           0 :     data.set_ref_cnt(r->get_nhr_ref_cnt());
     273           0 :     data.set_flags(nhst->FlagsToString(r->get_nhr_flags()));
     274           0 :     const vector<signed char> &encap = r->get_nhr_encap();
     275             :     /* Kernel does not return encap len via r->get_nhr_encap_len()
     276             :      * We need to fill it via the encap vector's size. */
     277           0 :     if (encap.size()) {
     278           0 :         data.set_encap_len(encap.size());
     279           0 :         data.set_encap(nhst->EncapToString(encap));
     280             :     }
     281             : 
     282           0 :     nhst->SetComponentNH(r, data);
     283           0 :     list.push_back(data);
     284           0 :     UpdateContext(r->get_nhr_id());
     285           0 : }
     286             : 
     287           0 : const std::string KState::PrefixToString(const std::vector<int8_t> &prefix) {
     288             : 
     289           0 :     int size = prefix.size();
     290           0 :     string str = "unknown";
     291           0 :     if (size <= 4) {
     292           0 :         Ip4Address::bytes_type bytes = { {0, 0, 0, 0} };
     293           0 :         for (int i = 0; i < size; i++) {
     294           0 :             bytes[i] = prefix.at(i);
     295             :         }
     296           0 :         Ip4Address addr4(bytes);
     297           0 :         str = addr4.to_string();
     298             :     } else {
     299           0 :         Ip6Address::bytes_type bytes =
     300             :         { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} };
     301           0 :         for (int i = 0; i < size; i++) {
     302           0 :             bytes[i] = prefix.at(i);
     303             :         }
     304           0 :         Ip6Address addr6(bytes);
     305           0 :         str = addr6.to_string();
     306             :     }
     307           0 :     return str;
     308           0 : }
     309             : 
     310           0 : void KState::RouteMsgHandler(vr_route_req *r) {
     311             : 
     312           0 :     KRouteInfo data;
     313             :     RouteKState *rst;
     314             : 
     315           0 :     rst = static_cast<RouteKState *>(this);
     316           0 :     KRouteResp *resp = static_cast<KRouteResp *>(rst->response_object());
     317             : 
     318             :     vector<KRouteInfo> &list =
     319           0 :                         const_cast<std::vector<KRouteInfo>&>(resp->get_rt_list());
     320             : 
     321           0 :     data.set_vrf_id(r->get_rtr_vrf_id());
     322           0 :     data.set_family(rst->FamilyToString(r->get_rtr_family()));
     323           0 :     if(r->get_h_op() == sandesh_op::GET) {
     324           0 :         boost::system::error_code ec;
     325           0 :         IpAddress addr(IpAddress::from_string(PrefixToString(r->get_rtr_prefix()), ec));
     326           0 :         if (addr.is_v4()) {
     327           0 :             data.set_prefix((Address::GetIp4SubnetAddress(addr.to_v4(), r->get_rtr_prefix_len())).to_string());
     328           0 :         } else if(addr.is_v6()) {
     329           0 :             data.set_prefix((Address::GetIp6SubnetAddress(addr.to_v6(), r->get_rtr_prefix_len())).to_string());
     330             :         }
     331             :     } else {
     332           0 :         data.set_prefix(PrefixToString(r->get_rtr_prefix()));
     333             :     }
     334           0 :     data.set_prefix_len(r->get_rtr_prefix_len());
     335           0 :     data.set_rid(r->get_rtr_rid());
     336           0 :     data.set_label_flags(rst->LabelFlagsToString(
     337           0 :                                   r->get_rtr_label_flags()));
     338           0 :     if(r->get_rtr_label_flags() & VR_RT_LABEL_VALID_FLAG) {
     339           0 :         data.set_label(r->get_rtr_label());
     340             :     } else {
     341           0 :         data.set_label(0);
     342             :     }
     343           0 :     data.set_nh_id(r->get_rtr_nh_id());
     344           0 :     if(r->get_rtr_family() == AF_BRIDGE) {
     345           0 :         data.set_rtr_mac(MacToString(r->get_rtr_mac()));
     346           0 :         data.set_index(r->get_rtr_index());
     347             :     }
     348             : 
     349           0 :     list.push_back(data);
     350             : 
     351           0 :     RouteContext *rctx = rst->more_context().empty() ?
     352           0 :         NULL : boost::any_cast<RouteContext *>(rst->more_context());
     353           0 :     if (!rctx) {
     354           0 :         rctx = new RouteContext;
     355             :     }
     356           0 :     rctx->vrf_id = r->get_rtr_vrf_id();
     357           0 :     if (r->get_rtr_family() == AF_BRIDGE) {
     358           0 :         rctx->marker = r->get_rtr_mac();
     359             :     } else {
     360           0 :         rctx->marker = r->get_rtr_prefix();
     361           0 :         rctx->marker_plen = r->get_rtr_prefix_len();
     362             :     }
     363           0 :     UpdateContext(rctx);
     364           0 : }
     365             : 
     366           0 : void KState::MplsMsgHandler(vr_mpls_req *r) {
     367             : 
     368           0 :     KMplsInfo data;
     369             :     MplsKState *mst;
     370             : 
     371           0 :     mst = static_cast<MplsKState *>(this);
     372           0 :     KMplsResp *resp = static_cast<KMplsResp *>(mst->response_object());
     373             : 
     374             :     vector<KMplsInfo> &list =
     375           0 :                         const_cast<std::vector<KMplsInfo>&>(resp->get_mpls_list());
     376           0 :     data.set_label(r->get_mr_label());
     377           0 :     data.set_rid(r->get_mr_rid());
     378           0 :     data.set_nhid(r->get_mr_nhid());
     379             : 
     380           0 :     list.push_back(data);
     381             : 
     382           0 :     int32_t label = r->get_mr_label();
     383           0 :     UpdateContext(label);
     384           0 : }
     385             : 
     386           0 : void KState::MirrorMsgHandler(vr_mirror_req *r) {
     387           0 :     KMirrorInfo data;
     388             :     MirrorKState *mst;
     389             : 
     390           0 :     mst = static_cast<MirrorKState *>(this);
     391           0 :     KMirrorResp *resp = static_cast<KMirrorResp *>(mst->response_object());
     392             : 
     393             :     vector<KMirrorInfo> &list =
     394           0 :         const_cast<std::vector<KMirrorInfo>&>(resp->get_mirror_list());
     395             : 
     396           0 :     data.set_mirr_index(r->get_mirr_index());
     397           0 :     data.set_mirr_rid(r->get_mirr_rid());
     398           0 :     data.set_mirr_nhid(r->get_mirr_nhid());
     399           0 :     data.set_mirr_flags(mst->FlagsToString(r->get_mirr_flags()));
     400           0 :     data.set_mirr_users(r->get_mirr_users());
     401           0 :     data.set_mirr_vni(r->get_mirr_vni());
     402             : 
     403           0 :     list.push_back(data);
     404             : 
     405           0 :     int32_t mirror_id = r->get_mirr_index();
     406           0 :     UpdateContext(mirror_id);
     407           0 : }
     408             : 
     409           0 : void KState::VrfAssignMsgHandler(vr_vrf_assign_req *r) {
     410           0 :     KVrfAssignInfo data;
     411             :     VrfAssignKState *state;
     412             : 
     413           0 :     state = static_cast<VrfAssignKState *>(this);
     414             :     KVrfAssignResp *resp =
     415           0 :         static_cast<KVrfAssignResp *>(state->response_object());
     416             : 
     417             :     vector<KVrfAssignInfo> &list =
     418           0 :         const_cast<std::vector<KVrfAssignInfo>&>(resp->get_vrf_assign_list());
     419           0 :     data.set_vif_index(r->get_var_vif_index());
     420           0 :     data.set_vlan_id(r->get_var_vlan_id());
     421           0 :     data.set_vif_vrf(r->get_var_vif_vrf());
     422           0 :     data.set_rid(r->get_var_rid());
     423           0 :     data.set_nh_id(r->get_var_nh_id());
     424           0 :     list.push_back(data);
     425             : 
     426             :     // Update the last interface and tag seen.
     427             :     // Will be used to send next request to kernel
     428           0 :     VrfAssignContext *ctx = state->more_context().empty() ?
     429           0 :         NULL : boost::any_cast<VrfAssignContext *>(state->more_context());
     430           0 :     if (!ctx) {
     431           0 :         ctx = new VrfAssignContext;
     432             :     }
     433           0 :     ctx->vif_index_ = r->get_var_vif_index();
     434           0 :     ctx->marker_ = r->get_var_vlan_id();
     435           0 :     UpdateContext(ctx);
     436           0 : }
     437             : 
     438           0 : void KState::VrfMsgHandler(vr_vrf_req *r) {
     439           0 :     KVrfInfo data;
     440             :     VrfKState *state;
     441             : 
     442           0 :     state = static_cast<VrfKState *>(this);
     443             :     KVrfResp *resp =
     444           0 :         static_cast<KVrfResp *>(state->response_object());
     445             : 
     446             :     vector<KVrfInfo> &list =
     447           0 :         const_cast<std::vector<KVrfInfo>&>(resp->get_vrf_list());
     448           0 :     data.set_vrf_idx(r->get_vrf_idx());
     449           0 :     data.set_hbf_rintf(r->get_vrf_hbfr_vif_idx());
     450           0 :     data.set_hbf_lintf(r->get_vrf_hbfl_vif_idx());
     451           0 :     list.push_back(data);
     452             : 
     453             :     // Update the last interface and tag seen.
     454             :     // Will be used to send next request to kernel
     455           0 :     VrfContext *ctx = state->more_context().empty() ?
     456           0 :         NULL : boost::any_cast<VrfContext *>(state->more_context());
     457           0 :     if (!ctx) {
     458           0 :         ctx = new VrfContext;
     459             :     }
     460           0 :     ctx->vrf_idx_ = r->get_vrf_idx();
     461           0 :     ctx->marker_ = r->get_vrf_idx();
     462           0 :     UpdateContext(ctx);
     463           0 : }
     464             : 
     465           0 : void KState::VrfStatsMsgHandler(vr_vrf_stats_req *r) {
     466           0 :     KVrfStatsInfo data;
     467             :     VrfStatsKState *state;
     468             : 
     469           0 :     state = static_cast<VrfStatsKState *>(this);
     470             :     KVrfStatsResp *resp =
     471           0 :         static_cast<KVrfStatsResp *>(state->response_object());
     472             : 
     473             :     vector<KVrfStatsInfo> &list =
     474           0 :         const_cast<std::vector<KVrfStatsInfo>&>(resp->get_vrf_stats_list());
     475           0 :     data.set_vrf_id(r->get_vsr_vrf());
     476           0 :     data.set_vrf_family(state->FamilyToString(r->get_vsr_family()));
     477           0 :     data.set_vrf_rid(r->get_vsr_rid());
     478           0 :     data.set_vrf_discards(r->get_vsr_discards());
     479           0 :     data.set_vrf_resolves(r->get_vsr_resolves());
     480           0 :     data.set_vrf_receives(r->get_vsr_receives());
     481           0 :     data.set_vrf_udp_tunnels(r->get_vsr_udp_tunnels());
     482           0 :     data.set_vrf_udp_mpls_tunnels(r->get_vsr_udp_mpls_tunnels());
     483           0 :     data.set_vrf_gre_mpls_tunnels(r->get_vsr_gre_mpls_tunnels());
     484           0 :     data.set_vrf_l2_mcast_composites(r->get_vsr_l2_mcast_composites());
     485           0 :     data.set_vrf_fabric_composites(r->get_vsr_fabric_composites());
     486           0 :     data.set_vrf_ecmp_composites(r->get_vsr_ecmp_composites());
     487           0 :     data.set_vrf_encaps(r->get_vsr_encaps());
     488           0 :     data.set_vrf_l2_encaps(r->get_vsr_l2_encaps());
     489           0 :     data.set_vrf_vxlan_tunnels(r->get_vsr_vxlan_tunnels());
     490           0 :     data.set_vrf_gros(r->get_vsr_gros());
     491           0 :     data.set_vrf_diags(r->get_vsr_diags());
     492           0 :     data.set_vrf_encap_composites(r->get_vsr_encap_composites());
     493           0 :     data.set_vrf_evpn_composites(r->get_vsr_evpn_composites());
     494           0 :     data.set_vrf_translates(r->get_vsr_vrf_translates());
     495           0 :     data.set_vrf_arp_virtual_proxy(r->get_vsr_arp_virtual_proxy());
     496           0 :     data.set_vrf_arp_virtual_stitch(r->get_vsr_arp_virtual_stitch());
     497           0 :     data.set_vrf_arp_virtual_flood(r->get_vsr_arp_virtual_flood());
     498           0 :     data.set_vrf_arp_physical_stitch(r->get_vsr_arp_physical_stitch());
     499           0 :     data.set_vrf_arp_tor_proxy(r->get_vsr_arp_tor_proxy());
     500           0 :     data.set_vrf_arp_physical_flood(r->get_vsr_arp_physical_flood());
     501           0 :     data.set_vrf_l2_receives(r->get_vsr_l2_receives());
     502           0 :     data.set_vrf_uuc_floods(r->get_vsr_uuc_floods());
     503           0 :     list.push_back(data);
     504             : 
     505           0 :     UpdateContext(r->get_vsr_vrf());
     506           0 : }
     507             : 
     508           0 : void KState::VxLanMsgHandler(vr_vxlan_req *r) {
     509             : 
     510           0 :     KVxLanInfo data;
     511             :     VxLanKState *mst;
     512             : 
     513           0 :     mst = static_cast<VxLanKState *>(this);
     514           0 :     KVxLanResp *resp = static_cast<KVxLanResp *>(mst->response_object());
     515             : 
     516             :     vector<KVxLanInfo> &list =
     517           0 :                         const_cast<std::vector<KVxLanInfo>&>(resp->get_vxlan_list());
     518           0 :     data.set_vxlanid(r->get_vxlanr_vnid());
     519           0 :     data.set_rid(r->get_vxlanr_rid());
     520           0 :     data.set_nhid(r->get_vxlanr_nhid());
     521             : 
     522           0 :     list.push_back(data);
     523             : 
     524           0 :     int32_t label = r->get_vxlanr_vnid();
     525           0 :     UpdateContext(label);
     526           0 : }
     527             : 
     528           0 : void KState::DropStatsMsgHandler(vr_drop_stats_req *req) {
     529             :     DropStatsKState *state;
     530             : 
     531           0 :     state = static_cast<DropStatsKState *>(this);
     532             :     KDropStatsResp *resp =
     533           0 :         static_cast<KDropStatsResp *>(state->response_object());
     534           0 :     resp->set_ds_rid(req->get_vds_rid());
     535           0 :     resp->set_ds_discard(req->get_vds_discard());
     536           0 :     resp->set_ds_pull(req->get_vds_pull());
     537           0 :     resp->set_ds_invalid_if(req->get_vds_invalid_if());
     538           0 :     resp->set_ds_invalid_arp(req->get_vds_invalid_arp());
     539           0 :     resp->set_ds_trap_no_if(req->get_vds_trap_no_if());
     540           0 :     resp->set_ds_nowhere_to_go(req->get_vds_nowhere_to_go());
     541           0 :     resp->set_ds_flow_queue_limit_exceeded(req->get_vds_flow_queue_limit_exceeded());
     542           0 :     resp->set_ds_flow_no_memory(req->get_vds_flow_no_memory());
     543           0 :     resp->set_ds_flow_invalid_protocol(req->get_vds_flow_invalid_protocol());
     544           0 :     resp->set_ds_flow_nat_no_rflow(req->get_vds_flow_nat_no_rflow());
     545           0 :     resp->set_ds_flow_action_drop(req->get_vds_flow_action_drop());
     546           0 :     resp->set_ds_flow_action_invalid(req->get_vds_flow_action_invalid());
     547           0 :     resp->set_ds_flow_unusable(req->get_vds_flow_unusable());
     548           0 :     resp->set_ds_flow_table_full(req->get_vds_flow_table_full());
     549           0 :     resp->set_ds_interface_tx_discard(req->get_vds_interface_tx_discard());
     550           0 :     resp->set_ds_interface_drop(req->get_vds_interface_drop());
     551           0 :     resp->set_ds_duplicated(req->get_vds_duplicated());
     552           0 :     resp->set_ds_push(req->get_vds_push());
     553           0 :     resp->set_ds_ttl_exceeded(req->get_vds_ttl_exceeded());
     554           0 :     resp->set_ds_invalid_nh(req->get_vds_invalid_nh());
     555           0 :     resp->set_ds_invalid_label(req->get_vds_invalid_label());
     556           0 :     resp->set_ds_invalid_protocol(req->get_vds_invalid_protocol());
     557           0 :     resp->set_ds_interface_rx_discard(req->get_vds_interface_rx_discard());
     558           0 :     resp->set_ds_invalid_mcast_source(req->get_vds_invalid_mcast_source());
     559           0 :     resp->set_ds_head_alloc_fail(req->get_vds_head_alloc_fail());
     560           0 :     resp->set_ds_pcow_fail(req->get_vds_pcow_fail());
     561           0 :     resp->set_ds_mcast_clone_fail(req->get_vds_mcast_clone_fail());
     562           0 :     resp->set_ds_rewrite_fail(req->get_vds_rewrite_fail());
     563           0 :     resp->set_ds_misc(req->get_vds_misc());
     564           0 :     resp->set_ds_invalid_packet(req->get_vds_invalid_packet());
     565           0 :     resp->set_ds_cksum_err(req->get_vds_cksum_err());
     566           0 :     resp->set_ds_no_fmd(req->get_vds_no_fmd());
     567           0 :     resp->set_ds_cloned_original(req->get_vds_cloned_original());
     568           0 :     resp->set_ds_invalid_vnid(req->get_vds_invalid_vnid());
     569           0 :     resp->set_ds_frag_err(req->get_vds_frag_err());
     570           0 :     resp->set_ds_invalid_source(req->get_vds_invalid_source());
     571           0 :     resp->set_ds_mcast_df_bit(req->get_vds_mcast_df_bit());
     572           0 :     resp->set_ds_l2_no_route(req->get_vds_l2_no_route());
     573           0 :     resp->set_ds_vlan_fwd_tx(req->get_vds_vlan_fwd_tx());
     574           0 :     resp->set_ds_vlan_fwd_enq(req->get_vds_vlan_fwd_enq());
     575           0 :     resp->set_ds_no_memory(req->get_vds_no_memory());
     576           0 :     resp->set_ds_drop_new_flow(req->get_vds_drop_new_flow());
     577           0 :     resp->set_ds_flow_evict(req->get_vds_flow_evict());
     578           0 : }
     579             : 
     580           0 : void KState::ForwardingClassMsgHandler(vr_fc_map_req *r) {
     581           0 :     KForwardingClass data;
     582             :     ForwardingClassKState *mst;
     583             : 
     584           0 :     mst = static_cast<ForwardingClassKState *>(this);
     585             :     KForwardingClassResp *resp =
     586           0 :         static_cast<KForwardingClassResp *>(mst->response_object());
     587             : 
     588             :     vector<KForwardingClass> &list =
     589             :          const_cast<std::vector<KForwardingClass>&>(
     590           0 :                  resp->get_forwarding_class_list());
     591             : 
     592           0 :     data.set_id(r->get_fmr_id()[0]);
     593           0 :     data.set_rid(r->get_fmr_rid());
     594           0 :     data.set_dscp(r->get_fmr_dscp()[0]);
     595           0 :     data.set_mpls_exp(r->get_fmr_mpls_qos()[0]);
     596           0 :     data.set_vlan_priority(r->get_fmr_dotonep()[0]);
     597           0 :     data.set_qos_queue(r->get_fmr_queue_id()[0]);
     598           0 :     list.push_back(data);
     599             : 
     600           0 :     int16_t index = r->get_fmr_id()[0];
     601           0 :     UpdateContext(index);
     602           0 : }
     603             : 
     604           0 : void KState::QosConfigMsgHandler(vr_qos_map_req *r) {
     605           0 :     KQosConfig data;
     606             :     QosConfigKState *mst;
     607             : 
     608           0 :     mst = static_cast<QosConfigKState *>(this);
     609           0 :     KQosConfigResp *resp = static_cast<KQosConfigResp *>(mst->response_object());
     610             : 
     611             :     vector<KQosConfig> &list =
     612           0 :        const_cast<std::vector<KQosConfig>&>(resp->get_qos_config_list());
     613           0 :     data.set_id(r->get_qmr_id());
     614           0 :     data.set_rid(r->get_qmr_rid());
     615             : 
     616             :     std::vector<int8_t>::const_iterator qos_it =
     617           0 :         r->get_qmr_dscp().begin();
     618             :     std::vector<int8_t>::const_iterator fc_it =
     619           0 :         r->get_qmr_dscp_fc_id().begin();
     620           0 :     std::vector<kQosIdFowardingClassPair> dscp_list;
     621           0 :     for(;qos_it != r->get_qmr_dscp().end() &&
     622           0 :          fc_it != r->get_qmr_dscp_fc_id().end();
     623           0 :          qos_it++, fc_it++) {
     624           0 :         kQosIdFowardingClassPair pair;
     625           0 :         pair.set_qos(*qos_it);
     626           0 :         pair.set_fc_id(*fc_it);
     627           0 :         dscp_list.push_back(pair);
     628           0 :     }
     629           0 :     data.set_dscp_map(dscp_list);
     630             : 
     631           0 :     qos_it = r->get_qmr_mpls_qos().begin();
     632           0 :     fc_it = r->get_qmr_mpls_qos_fc_id().begin();
     633           0 :     std::vector<kQosIdFowardingClassPair> mpls_list;
     634           0 :     for(;qos_it != r->get_qmr_mpls_qos().end() &&
     635           0 :          fc_it != r->get_qmr_mpls_qos_fc_id().end(); qos_it++, fc_it++) {
     636           0 :         kQosIdFowardingClassPair pair;
     637           0 :         pair.set_qos(*qos_it);
     638           0 :         pair.set_fc_id(*fc_it);
     639           0 :         mpls_list.push_back(pair);
     640           0 :     }
     641           0 :     data.set_mpls_exp_map(mpls_list);
     642             : 
     643           0 :     qos_it = r->get_qmr_dotonep().begin();
     644           0 :     fc_it = r->get_qmr_dotonep_fc_id().begin();
     645           0 :     std::vector<kQosIdFowardingClassPair> vlan_priority_list;
     646           0 :     for(;qos_it != r->get_qmr_dotonep().end() &&
     647           0 :          fc_it != r->get_qmr_dotonep_fc_id().end();
     648           0 :          qos_it++, fc_it++) {
     649           0 :         kQosIdFowardingClassPair pair;
     650           0 :         pair.set_qos(*qos_it);
     651           0 :         pair.set_fc_id(*fc_it);
     652           0 :         vlan_priority_list.push_back(pair);
     653           0 :     }
     654           0 :     data.set_vlan_priority_map(vlan_priority_list);
     655           0 :     list.push_back(data);
     656             : 
     657           0 :     uint16_t id = r->get_qmr_id();
     658           0 :     UpdateContext(id);
     659           0 : }

Generated by: LCOV version 1.14