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

Generated by: LCOV version 1.14