LCOV - code coverage report
Current view: top level - vnsw/agent/vrouter/ksync - sandesh_ksync.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 45 120 37.5 %
Date: 2026-08-03 02:19:58 Functions: 5 17 29.4 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
       3             :  */
       4             : 
       5             : #include <boost/asio.hpp>
       6             : #include <db/db_entry.h>
       7             : #include <db/db_table.h>
       8             : #include <db/db_table_partition.h>
       9             : #include <base/address_util.h>
      10             : #include <vrouter/ksync/sandesh_ksync.h>
      11             : #include <vrouter/ksync/flowtable_ksync.h>
      12             : #include <vrouter/ksync/interface_ksync.h>
      13             : #include <pkt/flow_mgmt.h>
      14             : #include <pkt/flow_table.h>
      15             : #include <oper/mirror_table.h>
      16             : #include <vrouter/ksync/ksync_init.h>
      17             : #include <pkt/flow_proto.h>
      18             : #include <pkt/flow_token.h>
      19             : 
      20          69 : void vr_interface_req::Process(SandeshContext *context) {
      21          69 :      AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context);
      22          69 :      ioc->IfMsgHandler(this);
      23          69 : }
      24             : 
      25           0 : void vr_pkt_drop_log_req::Process(SandeshContext *context)
      26           0 : {}
      27             : 
      28           0 : void vr_info_req::Process(SandeshContext *context)
      29           0 : {}
      30             : 
      31           0 : void vr_drop_stats_req::Process(SandeshContext *context) {
      32           0 :     AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context);
      33           0 :     ioc->DropStatsMsgHandler(this);
      34           0 : }
      35             : 
      36           0 : void vr_vrf_stats_req::Process(SandeshContext *context) {
      37           0 :     AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context);
      38           0 :     ioc->VrfStatsMsgHandler(this);
      39           0 : }
      40             : 
      41           0 : void vr_hugepage_config::Process(SandeshContext *context) {
      42           0 :     AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context);
      43           0 :     ioc->VrouterHugePageHandler(this);
      44           0 : }
      45             : 
      46           6 : void vrouter_ops::Process(SandeshContext *context) {
      47           6 :     AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context);
      48           6 :     ioc->VrouterOpsMsgHandler(this);
      49           6 : }
      50             : 
      51           0 : void vr_mem_stats_req::Process(SandeshContext *context) {
      52           0 : }
      53             : 
      54        1093 : int KSyncSandeshContext::VrResponseMsgHandler(vr_response *r) {
      55        1093 :     response_code_ = r->get_resp_code();
      56             : 
      57        1093 :     if (response_code_ < 0) {
      58           0 :         return -response_code_;
      59             :     }
      60             : 
      61        1093 :     return 0;
      62             : }
      63             : 
      64           0 : void KSyncSandeshContext::BridgeTableInfoHandler(vr_bridge_table_data *r) {
      65           0 :     assert(r->get_btable_op() == sandesh_op::GET);
      66           0 :     ksync_->ksync_bridge_memory()->set_major_devid(r->get_btable_dev());
      67           0 :     ksync_->ksync_bridge_memory()->set_table_size(r->get_btable_size());
      68           0 :     if (r->get_btable_file_path() != Agent::NullString()) {
      69           0 :         ksync_->ksync_bridge_memory()->
      70           0 :             set_table_path(r->get_btable_file_path());
      71             :     }
      72           0 :     LOG(DEBUG, "Flow table size : " << r->get_btable_size());
      73           0 :     return;
      74             : }
      75             : 
      76           0 : void KSyncSandeshContext::FlowTableInfoHandler(vr_flow_table_data *r) {
      77           0 :     assert(r->get_ftable_op() == flow_op::FLOW_TABLE_GET);
      78           0 :     ksync_->ksync_flow_memory()->set_major_devid(r->get_ftable_dev());
      79           0 :     ksync_->ksync_flow_memory()->set_table_size(r->get_ftable_size());
      80           0 :     if (r->get_ftable_file_path() != Agent::NullString()) {
      81           0 :         ksync_->ksync_flow_memory()->set_table_path(r->get_ftable_file_path());
      82             :     }
      83           0 :     LOG(DEBUG, "Flow table size : " << r->get_ftable_size());
      84           0 : }
      85             : 
      86           0 : static void LogFlowError(vr_flow_response *r, int err) {
      87           0 :     string op;
      88           0 :     if (r->get_fresp_flags() != 0) {
      89           0 :         op = "Add/Update";
      90             :     } else {
      91           0 :         op = "Delete";
      92             :     }
      93             : 
      94           0 :     LOG(ERROR, "Error Flow entry op = " << op
      95             :         << " flow_handle = " << (int) r->get_fresp_index()
      96             :         << " gen-id = " << (int) r->get_fresp_gen_id());
      97           0 : }
      98             : 
      99             : // Handle vr_flow response from VRouter
     100             : // We combine responses from both vr_flow and vr_response messages and
     101             : // generate single event. Copy the results in vr_flow in KSync entry.
     102             : // On receiving vr_response message, event will be generated for both messages
     103         144 : void KSyncSandeshContext::FlowResponseHandler(vr_flow_response *r) {
     104         144 :     assert(r->get_fresp_op() == flow_op::FLOW_SET);
     105             : 
     106         144 :     const KSyncIoContext *ioc = ksync_io_ctx();
     107             :     FlowTableKSyncEntry *ksync_entry =
     108         144 :         dynamic_cast<FlowTableKSyncEntry *>(ioc->GetKSyncEntry());
     109         144 :     assert(ksync_entry != NULL);
     110         144 :     ksync_entry->ReleaseToken();
     111             :     // Handling a new KSync response. Reset the response-info fields, they will
     112             :     // be filled below as necessary
     113         144 :     ksync_entry->ResetKSyncResponseInfo();
     114             : 
     115         144 :     assert(r->get_fresp_op() == flow_op::FLOW_SET);
     116         144 :     int err = GetErrno();
     117         144 :     if (err == EBADF) {
     118           0 :         LogFlowError(r, err);
     119             :     }
     120             : 
     121             :     // Skip delete operation.
     122         144 :     if (ioc->event() == KSyncEntry::DEL_ACK) {
     123          44 :         return;
     124             :     }
     125             : 
     126         100 :     ksync_entry->SetKSyncResponseInfo(err, r->get_fresp_index(),
     127         100 :                                       r->get_fresp_gen_id(),
     128         100 :                                       r->get_fresp_bytes(),
     129         100 :                                       r->get_fresp_packets(),
     130         100 :                                       r->get_fresp_stats_oflow());
     131         100 :     return;
     132             : }
     133             : 
     134           0 : void KSyncSandeshContext::FlowMsgHandler(vr_flow_req *r) {
     135           0 :     assert(0);
     136             : }
     137             : 
     138           0 : void KSyncSandeshContext::IfMsgHandler(vr_interface_req *r) {
     139           0 :     context_marker_ = r->get_vifr_idx();
     140           0 : }
     141             : 
     142           0 : void KSyncSandeshContext::VrouterHugePageHandler(vr_hugepage_config *r) {
     143           0 :     std::string message;
     144             : 
     145           0 :     switch(r->get_vhp_resp()) {
     146           0 :         case VR_HPAGE_CFG_RESP_HPAGE_SUCCESS:
     147           0 :             message = "Huge pages set successfully";
     148           0 :             break;
     149           0 :         case VR_HPAGE_CFG_RESP_MEM_FAILURE:
     150           0 :             message = "ERROR !! Failed to set huge pages and vrouter couldnt allocate memory !!";
     151           0 :             break;
     152           0 :         case VR_HPAGE_CFG_RESP_INVALID_ARG_MEM_INITED:
     153           0 :             message = "Invalid huge pages argument, vrouter using allocated memory (not huge pages)";
     154           0 :             break;
     155           0 :         case VR_HPAGE_CFG_RESP_HPAGE_FAILURE_MEM_INITED:
     156           0 :             message = "Failed to set huge pages, vrouter using allocated memory (not huge pages)";
     157           0 :             break;
     158           0 :         case VR_HPAGE_CFG_RESP_MEM_ALREADY_INITED:
     159           0 :             message = "Vrouter using already allocated memory";
     160           0 :             break;
     161           0 :         case VR_HPAGE_CFG_RESP_HPAGE_PARTIAL_SUCCESS:
     162           0 :             message = "Not all huge pages are successfully set, vrouter using allocated memory (not huge pages)";
     163           0 :             break;
     164           0 :         default:
     165           0 :             message = "Failed to set huge pages, invalid vrouter response";
     166           0 :             break;
     167             :     }
     168             : 
     169           0 :     LOG(INFO, message);
     170           0 : }
     171             : 
     172           3 : void KSyncSandeshContext::VrouterOpsMsgHandler(vrouter_ops *r) {
     173           3 :     Agent *agent = ksync_->agent();
     174           3 :     agent->set_vrouter_max_labels(r->get_vo_mpls_labels());
     175           3 :     agent->set_vrouter_max_nexthops(r->get_vo_nexthops());
     176           3 :     agent->set_vrouter_max_bridge_entries(r->get_vo_bridge_entries());
     177           3 :     agent->set_vrouter_max_oflow_bridge_entries(
     178           3 :             r->get_vo_oflow_bridge_entries());
     179           3 :     agent->set_vrouter_max_interfaces(r->get_vo_interfaces());
     180           3 :     agent->set_vrouter_max_mirror_entries(r->get_vo_mirror_entries());
     181           3 :     agent->set_vrouter_max_vrfs(r->get_vo_vrfs());
     182           3 :     agent->set_vrouter_max_flow_entries(r->get_vo_flow_entries());
     183           3 :     agent->set_vrouter_max_oflow_entries(r->get_vo_oflow_entries());
     184           3 :     agent->set_vrouter_build_info(r->get_vo_build_info());
     185           3 :     agent->set_vrouter_priority_tagging(r->get_vo_priority_tagging());
     186           3 :     return;
     187             : }

Generated by: LCOV version 1.14