LCOV - code coverage report
Current view: top level - root/contrail/vrouter/dp-core - vr_sandesh.c (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 30 33 90.9 %
Date: 2026-11-09 02:10:49 Functions: 6 6 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * vr_sandesh.c -- sandesh messaging protocol for datapath
       3             :  *
       4             :  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
       5             :  * Copyright Contributors to the OpenSDN project
       6             :  */
       7             : #include "vr_os.h"
       8             : #include "vr_types.h"
       9             : #include "vr_message.h"
      10             : #include "vr_sandesh.h"
      11             : #include "vr_packet.h"
      12             : #include "vrouter.h"
      13             : 
      14             : struct sandesh_object_md sandesh_md[] = {
      15             :     [VR_NULL_OBJECT_ID]         =   {
      16             :         .obj_len                =       sizeof(vr_response),
      17             :         .obj_type_string        =       "vr_null_object",
      18             :     },
      19             :     [VR_INTERFACE_OBJECT_ID]    =   {
      20             :         .obj_len                =       4 * sizeof(vr_interface_req),
      21             :         .obj_get_size          =        vr_interface_req_get_size,
      22             :         .obj_type_string        =       "vr_interface_req",
      23             :     },
      24             :     [VR_NEXTHOP_OBJECT_ID]      =   {
      25             :         .obj_len                =       4 * sizeof(vr_nexthop_req),
      26             :         .obj_get_size           =       vr_nexthop_req_get_size,
      27             :         .obj_type_string        =       "vr_nexthop_req",
      28             :     },
      29             :     [VR_ROUTE_OBJECT_ID]        =   {
      30             :         .obj_len                =       4 * sizeof(vr_route_req),
      31             :         .obj_type_string        =       "vr_route_req",
      32             :     },
      33             :     [VR_MPLS_OBJECT_ID]         =   {
      34             :         .obj_len                =       4 * sizeof(vr_mpls_req),
      35             :         .obj_type_string        =       "vr_mpls_req"
      36             :     },
      37             :     [VR_MIRROR_OBJECT_ID]       =   {
      38             :         .obj_len                =       4 * sizeof(vr_mirror_req),
      39             :         .obj_type_string        =       "vr_mirror_req",
      40             :     },
      41             :     [VR_FLOW_OBJECT_ID]         =   {
      42             :         .obj_len                =       4 * sizeof(vr_flow_req),
      43             :         .obj_type_string        =       "vr_flow_req",
      44             :     },
      45             :     [VR_VRF_ASSIGN_OBJECT_ID]   =   {
      46             :         .obj_len                =       4 * sizeof(vr_vrf_assign_req),
      47             :         .obj_type_string        =       "vr_vrf_assign_req",
      48             :     },
      49             :     [VR_VRF_STATS_OBJECT_ID]    =   {
      50             :         .obj_len                =       4 * sizeof(vr_vrf_stats_req),
      51             :         .obj_type_string        =       "vr_vrf_stats_req",
      52             :     },
      53             :     [VR_PKT_DROP_LOG_OBJECT_ID]   =   {
      54             :         .obj_len                =       4 * sizeof(vr_pkt_drop_log_req),
      55             :         .obj_get_size           =       vr_pkt_drop_log_req_get_size,
      56             :         .obj_type_string        =       "vr_pkt_drop_log_req",
      57             :     },
      58             :     [VR_DROP_STATS_OBJECT_ID]   =   {
      59             :         .obj_len                =       4 * sizeof(vr_drop_stats_req),
      60             :         .obj_type_string        =       "vr_drop_stats_req",
      61             :     },
      62             :     [VR_INFO_OBJECT_ID]   =   {
      63             :         .obj_len                =       (4 * sizeof(vr_info_req)),
      64             :         .obj_type_string        =       "vr_info_req",
      65             :     },
      66             :     [VR_RESPONSE_OBJECT_ID]     =   {
      67             :         .obj_len                =       4 * sizeof(vr_response),
      68             :         .obj_type_string        =       "vr_response",
      69             :     },
      70             :     [VR_VXLAN_OBJECT_ID]        =   {
      71             :         .obj_len                =       4 * sizeof(vr_vxlan_req),
      72             :         .obj_type_string        =       "vr_vxlan_req",
      73             :     },
      74             :     [VR_VROUTER_OPS_OBJECT_ID]  =   {
      75             :         .obj_len                =       4 * sizeof(vrouter_ops),
      76             :         .obj_type_string        =       "vrouter_ops",
      77             :     },
      78             :     [VR_FLOW_TABLE_DATA_OBJECT_ID]         =   {
      79             :         .obj_len                =       ((4 * sizeof(vr_flow_table_data)) +
      80             :                     (VR_FLOW_MAX_CPUS * sizeof(unsigned int))),
      81             :         .obj_type_string        =       "vr_flow_table_data",
      82             :     },
      83             :     [VR_MEM_STATS_OBJECT_ID]    =   {
      84             :         .obj_len                =       4 * sizeof(vr_mem_stats_req),
      85             :         .obj_type_string        =       "vr_mem_stats_req",
      86             :     },
      87             :     [VR_QOS_MAP_OBJECT_ID]      =   {
      88             :         .obj_len                =       4 * sizeof(vr_qos_map_req),
      89             :         .obj_get_size           =       vr_qos_map_req_get_size,
      90             :         .obj_type_string        =       "vr_qos_map_req",
      91             :     },
      92             :     [VR_FC_MAP_OBJECT_ID]       =   {
      93             :         .obj_len                =       4 * sizeof(vr_fc_map_req),
      94             :         .obj_type_string        =       "vr_fc_map_req",
      95             :     },
      96             :     [VR_FLOW_RESPONSE_OBJECT_ID] = {
      97             :         .obj_len                =       4 * sizeof(vr_flow_response),
      98             :         .obj_type_string        =       "vr_flow_response",
      99             :     },
     100             :     [VR_BRIDGE_TABLE_DATA_OBJECT_ID] = {
     101             :         .obj_len                =       4 * sizeof(vr_bridge_table_data),
     102             :         .obj_type_string        =       "vr_bridge_table_data",
     103             :     },
     104             :     [VR_HPAGE_CFG_OBJECT_ID] = {
     105             :         .obj_len                =       4 * sizeof(vr_hugepage_config),
     106             :         .obj_type_string        =       "vr_hugepage_config",
     107             :     },
     108             :     [VR_VRF_TABLE_OBJECT_ID]       =   {
     109             :         .obj_len                =       4 * sizeof(vr_vrf_req),
     110             :         .obj_type_string        =       "vr_vrf_req",
     111             :     },
     112             : };
     113             : 
     114             : static unsigned int
     115        5724 : sandesh_proto_buf_len(unsigned int object_type, void *object)
     116             : {
     117        5724 :     if (!object && object_type != VR_RESPONSE_OBJECT_ID)
     118        1994 :         return 0;
     119             : 
     120        3730 :     if (sandesh_md[object_type].obj_get_size)
     121         188 :         return sandesh_md[object_type].obj_get_size(object);
     122             : 
     123        3542 :     return sandesh_md[object_type].obj_len;
     124             : }
     125             : 
     126             : static int
     127        3021 : sandesh_proto_encode(char *buf, unsigned int len,
     128             :         unsigned int object_type, void *object,
     129             :         unsigned int message_type)
     130             : {
     131        3021 :     int off = 0, error = 0;
     132             : 
     133        3021 :     if (object)
     134        1027 :         off = sandesh_encode(object,
     135        1027 :                 sandesh_md[object_type].obj_type_string,
     136             :                 vr_find_sandesh_info, (unsigned char *)buf, len, &error);
     137             : 
     138        3021 :     if (error)
     139           0 :         return -1;
     140             : 
     141        3021 :     return off;
     142             : }
     143             : 
     144             : static int
     145        2704 : sandesh_proto_encode_response(char *buf, unsigned int len,
     146             :         unsigned int object_type, void *object, int ret)
     147             : {
     148             :     int off, error;
     149             :     vr_response resp;
     150             : 
     151        2704 :     resp.h_op = SANDESH_OP_RESPONSE;
     152        2704 :     resp.resp_code = ret;
     153             : 
     154        2704 :     off = sandesh_encode(&resp, "vr_response", vr_find_sandesh_info,
     155             :             (unsigned char *)buf, len, &error);
     156        2704 :     if (off < 0)
     157           0 :         return off;
     158             : 
     159        2704 :     error = sandesh_proto_encode(buf + off, len - off,
     160             :             object_type, object, VR_MESSAGE_TYPE_RESPONSE);
     161        2704 :     if (error < 0)
     162           0 :         return error;
     163             : 
     164        2704 :     return off + error;
     165             : }
     166             : 
     167             : static int
     168        2862 : sandesh_proto_decode(char *buf, unsigned int len,
     169             :         int (*cb)(void *, unsigned int, void *), void *cb_arg)
     170             : {
     171        2862 :     int ret = 0;
     172             : 
     173        2862 :     return sandesh_decode((unsigned char *)buf, len,
     174             :             vr_find_sandesh_info, &ret);
     175             : }
     176             : 
     177             : static struct vr_mproto sandesh_mproto = {
     178             :     .mproto_type            =       VR_MPROTO_SANDESH,
     179             :     .mproto_buf_len         =       sandesh_proto_buf_len,
     180             :     .mproto_encode          =       sandesh_proto_encode,
     181             :     .mproto_encode_response =       sandesh_proto_encode_response,
     182             :     .mproto_decode          =       sandesh_proto_decode,
     183             : };
     184             : 
     185             : void
     186          53 : vr_sandesh_exit(void)
     187             : {
     188          53 :     vr_message_proto_unregister(&sandesh_mproto);
     189          53 :     return;
     190             : }
     191             : 
     192             : int
     193          53 : vr_sandesh_init(void)
     194             : {
     195          53 :     vr_message_proto_register(&sandesh_mproto);
     196          53 :     return 0;
     197             : }

Generated by: LCOV version 1.14