LCOV - code coverage report
Current view: top level - root/contrail/vrouter/include - vr_offloads_dp.h (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 168 288 58.3 %
Date: 2026-08-03 02:19:58 Functions: 24 36 66.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * vr_offloads_dp.h -- Wrappers for calling offload function with locking in
       3             :  * place.
       4             :  *
       5             :  * Copyright (c) 2018 Netronome Systems, Inc. All rights reserved.
       6             :  */
       7             : 
       8             : #ifndef __VR_OFFLOADS_DP_H__
       9             : #define __VR_OFFLOADS_DP_H__
      10             : #include <vr_offloads.h>
      11             : 
      12             : /* RCU wrappers. */
      13             : #ifdef __linux__
      14             : #ifdef __KERNEL__
      15             : #include <linux/rcupdate.h>
      16             : #else
      17             : #include <urcu-bp.h>
      18             : #endif /* __KERNEL__ */
      19             : 
      20             : #define vr_rcu_dereference(p) rcu_dereference(p)
      21             : #define vr_rcu_read_lock() rcu_read_lock()
      22             : #define vr_rcu_read_unlock() rcu_read_unlock()
      23             : #define vr_synchronize_rcu() synchronize_rcu()
      24             : #define vr_rcu_assign_pointer(x, y) rcu_assign_pointer(x, y)
      25             : #else
      26             : #define vr_rcu_dereference(p) NULL
      27             : #define vr_rcu_read_lock()
      28             : #define vr_rcu_read_unlock()
      29             : #define vr_synchronize_rcu()
      30             : #define vr_rcu_assign_pointer(x, y) (x = y)
      31             : #endif /* __linux__ */
      32             : 
      33             : 
      34           0 : static inline int vr_offload_soft_reset(void)
      35             : {
      36             :     struct vr_offload_ops *offload;
      37           0 :     int ret = 0;
      38             : 
      39           0 :     vr_rcu_read_lock();
      40           0 :     offload = vr_rcu_dereference(offload_ops);
      41           0 :     if (offload && offload->voo_soft_reset)
      42           0 :         ret = offload->voo_soft_reset();
      43           0 :     vr_rcu_read_unlock();
      44             : 
      45           0 :     return ret;
      46             : }
      47             : 
      48         146 : static inline int vr_offload_packet_parse(struct vr_packet *pkt)
      49             : {
      50             :     struct vr_offload_ops *offload;
      51         146 :     int ret = 0;
      52             : 
      53         146 :     vr_rcu_read_lock();
      54         146 :     offload = vr_rcu_dereference(offload_ops);
      55         146 :     if (offload && offload->voo_packet_parse)
      56           0 :         ret = offload->voo_packet_parse(pkt);
      57         146 :     vr_rcu_read_unlock();
      58             : 
      59         146 :     return ret;
      60             : }
      61             : 
      62             : /* Flow offload functions */
      63         222 : static inline int vr_offload_flow_set(struct vr_flow_entry * fe,
      64             :                                        unsigned int fe_index,
      65             :                                        struct vr_flow_entry * rfe)
      66             : {
      67             :     struct vr_offload_ops *offload;
      68         222 :     int ret = 0;
      69             : 
      70         222 :     vr_rcu_read_lock();
      71         222 :     offload = vr_rcu_dereference(offload_ops);
      72         222 :     if (offload && offload->voo_flow_set)
      73           0 :         ret = offload->voo_flow_set(fe, fe_index, rfe);
      74         222 :     vr_rcu_read_unlock();
      75             : 
      76         222 :     return ret;
      77             : }
      78             : 
      79         117 : static inline int vr_offload_flow_del(struct vr_flow_entry * fe)
      80             : {
      81             :     struct vr_offload_ops *offload;
      82         117 :     int ret = 0;
      83             : 
      84         117 :     vr_rcu_read_lock();
      85         117 :     offload = vr_rcu_dereference(offload_ops);
      86         117 :     if (offload && offload->voo_flow_del)
      87           0 :         ret = offload->voo_flow_del(fe);
      88         117 :     vr_rcu_read_unlock();
      89             : 
      90         117 :     return ret;
      91             : }
      92             : 
      93          15 : static inline int vr_offload_flow_stats_update(struct vr_flow_entry * fe)
      94             : {
      95             :     struct vr_offload_ops *offload;
      96          15 :     int ret = 0;
      97             : 
      98          15 :     vr_rcu_read_lock();
      99          15 :     offload = vr_rcu_dereference(offload_ops);
     100          15 :     if (offload && offload->voo_flow_stats_update)
     101           0 :         ret = offload->voo_flow_stats_update(fe);
     102          15 :     vr_rcu_read_unlock();
     103             : 
     104          15 :     return ret;
     105             : }
     106             : 
     107             : /*
     108             :  * Used both to set and reset meta data entry for a flow.
     109             :  */
     110           0 : static inline int vr_offload_flow_meta_data_set(unsigned int fe_index,
     111             :                                                  unsigned int meta_data_len,
     112             :                                                  void *meta_data,
     113             :                                                  unsigned short mir_vrf)
     114             : {
     115             :     struct vr_offload_ops *offload;
     116           0 :     int ret = 0;
     117             : 
     118           0 :     vr_rcu_read_lock();
     119           0 :     offload = vr_rcu_dereference(offload_ops);
     120           0 :     if (offload && offload->voo_flow_meta_data_set)
     121           0 :         ret = offload->voo_flow_meta_data_set(fe_index, meta_data_len,
     122             :                                                    meta_data, mir_vrf);
     123           0 :     vr_rcu_read_unlock();
     124             : 
     125           0 :     return ret;
     126             : }
     127             : 
     128             : /* Dropstats */
     129          11 : static inline int vr_offload_drop_stats_get(vr_drop_stats_req *resp)
     130             : {
     131             :     struct vr_offload_ops *offload;
     132          11 :     int ret = 0;
     133             : 
     134          11 :     vr_rcu_read_lock();
     135          11 :     offload = vr_rcu_dereference(offload_ops);
     136          11 :     if (offload && offload->voo_drop_stats_get)
     137           0 :         ret = offload->voo_drop_stats_get(resp);
     138          11 :     vr_rcu_read_unlock();
     139             : 
     140          11 :     return ret;
     141             : }
     142             : 
     143             : /* interface offload functions */
     144         349 : static inline int vr_offload_interface_add(struct vr_interface * intf)
     145             : {
     146             :     struct vr_offload_ops *offload;
     147         349 :     int ret = 0;
     148             : 
     149         349 :     vr_rcu_read_lock();
     150         349 :     offload = vr_rcu_dereference(offload_ops);
     151         349 :     if (offload && offload->voo_interface_add)
     152           0 :         ret = offload->voo_interface_add(intf);
     153         349 :     vr_rcu_read_unlock();
     154             : 
     155         349 :     return ret;
     156             : }
     157             : 
     158           0 : static inline int vr_offload_interface_get(vr_interface_req *resp)
     159             : {
     160             :     struct vr_offload_ops *offload;
     161           0 :     int ret = 0;
     162             : 
     163           0 :     vr_rcu_read_lock();
     164           0 :     offload = vr_rcu_dereference(offload_ops);
     165           0 :     if (offload && offload->voo_interface_get)
     166           0 :         ret = offload->voo_interface_get(resp);
     167           0 :     vr_rcu_read_unlock();
     168             : 
     169           0 :     return ret;
     170             : }
     171             : 
     172         329 : static inline int vr_offload_interface_del(struct vr_interface * intf)
     173             : {
     174             :     struct vr_offload_ops *offload;
     175         329 :     int ret = 0;
     176             : 
     177         329 :     vr_rcu_read_lock();
     178         329 :     offload = vr_rcu_dereference(offload_ops);
     179         329 :     if (offload && offload->voo_interface_del)
     180           0 :         ret = offload->voo_interface_del(intf);
     181         329 :     vr_rcu_read_unlock();
     182             : 
     183         329 :     return ret;
     184             : }
     185             : 
     186           0 : static inline int vr_offload_vif_vrf_set(vr_vrf_assign_req *req)
     187             : {
     188             :     struct vr_offload_ops *offload;
     189           0 :     int ret = 0;
     190             : 
     191           0 :     vr_rcu_read_lock();
     192           0 :     offload = vr_rcu_dereference(offload_ops);
     193           0 :     if (offload && offload->voo_vif_vrf_set)
     194           0 :        ret = offload->voo_vif_vrf_set(req);
     195           0 :     vr_rcu_read_unlock();
     196             : 
     197           0 :     return ret;
     198             : }
     199             : 
     200             : static inline int vr_offload_vif_vrf_get(vr_vrf_assign_req *resp)
     201             : {
     202             :     struct vr_offload_ops *offload;
     203             :     int ret = 0;
     204             : 
     205             :     vr_rcu_read_lock();
     206             :     offload = vr_rcu_dereference(offload_ops);
     207             :     if (offload && offload->voo_vif_vrf_get)
     208             :         ret = offload->voo_vif_vrf_get(resp);
     209             :     vr_rcu_read_unlock();
     210             : 
     211             :     return ret;
     212             : }
     213             : 
     214         276 : static inline int vr_offload_nexthop_add(struct vr_nexthop * nh)
     215             : {
     216             :     struct vr_offload_ops *offload;
     217         276 :     int ret = 0;
     218             : 
     219         276 :     vr_rcu_read_lock();
     220         276 :     offload = vr_rcu_dereference(offload_ops);
     221         276 :     if (offload && offload->voo_nexthop_add)
     222           0 :         ret = offload->voo_nexthop_add(nh);
     223         276 :     vr_rcu_read_unlock();
     224             : 
     225         276 :     return ret;
     226             : }
     227             : 
     228         263 : static inline int vr_offload_nexthop_del(struct vr_nexthop * nh)
     229             : {
     230             :     struct vr_offload_ops *offload;
     231         263 :     int ret = 0;
     232             : 
     233         263 :     vr_rcu_read_lock();
     234         263 :     offload = vr_rcu_dereference(offload_ops);
     235         263 :     if (offload && offload->voo_nexthop_del)
     236           0 :         ret = offload->voo_nexthop_del(nh);
     237         263 :     vr_rcu_read_unlock();
     238             : 
     239         263 :     return ret;
     240             : }
     241             : 
     242          25 : static inline int vr_offload_nexthop_get(struct vr_nexthop * nh,
     243             :                                           vr_nexthop_req * resp)
     244             : {
     245             :     struct vr_offload_ops *offload;
     246          25 :     int ret = 0;
     247             : 
     248          25 :     vr_rcu_read_lock();
     249          25 :     offload = vr_rcu_dereference(offload_ops);
     250          25 :     if (offload && offload->voo_nexthop_get)
     251           0 :         ret = offload->voo_nexthop_get(nh, resp);
     252          25 :     vr_rcu_read_unlock();
     253             : 
     254          25 :     return ret;
     255             : }
     256             : 
     257           9 : static inline int vr_offload_mpls_add(struct vr_nexthop * nh, int label)
     258             : {
     259             :     struct vr_offload_ops *offload;
     260           9 :     int ret = 0;
     261             : 
     262           9 :     vr_rcu_read_lock();
     263           9 :     offload = vr_rcu_dereference(offload_ops);
     264           9 :     if (offload && offload->voo_mpls_add)
     265           0 :         ret = offload->voo_mpls_add(nh, label);
     266           9 :     vr_rcu_read_unlock();
     267             : 
     268           9 :     return ret;
     269             : }
     270             : 
     271           1 : static inline int vr_offload_mpls_get(vr_mpls_req * resp)
     272             : {
     273             :     struct vr_offload_ops *offload;
     274           1 :     int ret = 0;
     275             : 
     276           1 :     vr_rcu_read_lock();
     277           1 :     offload = vr_rcu_dereference(offload_ops);
     278           1 :     if (offload && offload->voo_mpls_get)
     279           0 :         ret = offload->voo_mpls_get(resp);
     280           1 :     vr_rcu_read_unlock();
     281             : 
     282           1 :     return ret;
     283             : }
     284             : 
     285           9 : static inline int vr_offload_mpls_del(int label)
     286             : {
     287             :     struct vr_offload_ops *offload;
     288           9 :     int ret = 0;
     289             : 
     290           9 :     vr_rcu_read_lock();
     291           9 :     offload = vr_rcu_dereference(offload_ops);
     292           9 :     if (offload && offload->voo_mpls_del)
     293           0 :         ret = offload->voo_mpls_del(label);
     294           9 :     vr_rcu_read_unlock();
     295             : 
     296           9 :     return ret;
     297             : }
     298             : 
     299           2 : static inline int vr_offload_vxlan_add(struct vr_nexthop * nh, int vnid)
     300             : {
     301             :     struct vr_offload_ops *offload;
     302           2 :     int ret = 0;
     303             : 
     304           2 :     vr_rcu_read_lock();
     305           2 :     offload = vr_rcu_dereference(offload_ops);
     306           2 :     if (offload && offload->voo_vxlan_add)
     307           0 :         ret = offload->voo_vxlan_add(nh, vnid);
     308           2 :     vr_rcu_read_unlock();
     309             : 
     310           2 :     return ret;
     311             : }
     312             : 
     313           1 : static inline int vr_offload_vxlan_get(vr_vxlan_req * resp)
     314             : {
     315             :     struct vr_offload_ops *offload;
     316           1 :     int ret = 0;
     317             : 
     318           1 :     vr_rcu_read_lock();
     319           1 :     offload = vr_rcu_dereference(offload_ops);
     320           1 :     if (offload && offload->voo_vxlan_get)
     321           0 :         ret = offload->voo_vxlan_get(resp);
     322           1 :     vr_rcu_read_unlock();
     323             : 
     324           1 :     return ret;
     325             : }
     326             : 
     327           2 : static inline int vr_offload_vxlan_del(int vnid)
     328             : {
     329             :     struct vr_offload_ops *offload;
     330           2 :     int ret = 0;
     331             : 
     332           2 :     vr_rcu_read_lock();
     333           2 :     offload = vr_rcu_dereference(offload_ops);
     334           2 :     if (offload && offload->voo_vxlan_del)
     335           0 :         ret = offload->voo_vxlan_del(vnid);
     336           2 :     vr_rcu_read_unlock();
     337             : 
     338           2 :     return ret;
     339             : }
     340             : 
     341           3 : static inline int vr_offload_mirror_add(struct vr_mirror_entry * mirror,
     342             :                                         unsigned int index)
     343             : {
     344             :     struct vr_offload_ops *offload;
     345           3 :     int ret = 0;
     346             : 
     347           3 :     vr_rcu_read_lock();
     348           3 :     offload = vr_rcu_dereference(offload_ops);
     349           3 :     if (offload && offload->voo_mirror_add)
     350           0 :         ret = offload->voo_mirror_add(mirror, index);
     351           3 :     vr_rcu_read_unlock();
     352             : 
     353           3 :     return ret;
     354             : }
     355             : 
     356           3 : static inline int vr_offload_mirror_del(unsigned int index)
     357             : {
     358             :     struct vr_offload_ops *offload;
     359           3 :     int ret = 0;
     360             : 
     361           3 :     vr_rcu_read_lock();
     362           3 :     offload = vr_rcu_dereference(offload_ops);
     363           3 :     if (offload && offload->voo_mirror_del)
     364           0 :         ret = offload->voo_mirror_del(index);
     365           3 :     vr_rcu_read_unlock();
     366             : 
     367           3 :     return ret;
     368             : }
     369             : 
     370           1 : static inline int vr_offload_mirror_get(vr_mirror_req * resp)
     371             : {
     372             :     struct vr_offload_ops *offload;
     373           1 :     int ret = 0;
     374             : 
     375           1 :     vr_rcu_read_lock();
     376           1 :     offload = vr_rcu_dereference(offload_ops);
     377           1 :     if (offload && offload->voo_mirror_get)
     378           0 :         ret = offload->voo_mirror_get(resp);
     379           1 :     vr_rcu_read_unlock();
     380             : 
     381           1 :     return ret;
     382             : }
     383             : 
     384          14 : static inline int vr_offload_vrf_table_entry_add(struct vr_vrf_table_entry * vrf_entry,
     385             :                                         unsigned int index)
     386             : {
     387             :     struct vr_offload_ops *offload;
     388          14 :     int ret = 0;
     389             : 
     390          14 :     vr_rcu_read_lock();
     391          14 :     offload = vr_rcu_dereference(offload_ops);
     392          14 :     if (offload && offload->voo_vrf_table_entry_add)
     393           0 :         ret = offload->voo_vrf_table_entry_add(vrf_entry, index);
     394          14 :     vr_rcu_read_unlock();
     395             : 
     396          14 :     return ret;
     397             : }
     398             : 
     399          11 : static inline int vr_offload_vrf_table_entry_del(unsigned int index)
     400             : {
     401             :     struct vr_offload_ops *offload;
     402          11 :     int ret = 0;
     403             : 
     404          11 :     vr_rcu_read_lock();
     405          11 :     offload = vr_rcu_dereference(offload_ops);
     406          11 :     if (offload && offload->voo_vrf_table_entry_del)
     407           0 :         ret = offload->voo_vrf_table_entry_del(index);
     408          11 :     vr_rcu_read_unlock();
     409             : 
     410          11 :     return ret;
     411             : }
     412             : 
     413           0 : static inline int vr_offload_vrf_table_entry_get(vr_vrf_req * resp)
     414             : {
     415             :     struct vr_offload_ops *offload;
     416           0 :     int ret = 0;
     417             : 
     418           0 :     vr_rcu_read_lock();
     419           0 :     offload = vr_rcu_dereference(offload_ops);
     420           0 :     if (offload && offload->voo_vrf_table_entry_get)
     421           0 :         ret = offload->voo_vrf_table_entry_get(resp);
     422           0 :     vr_rcu_read_unlock();
     423             : 
     424           0 :     return ret;
     425             : }
     426             : 
     427         109 : static inline int vr_offload_route_del(vr_route_req * req)
     428             : {
     429             :     struct vr_offload_ops *offload;
     430         109 :     int ret = 0;
     431             : 
     432         109 :     vr_rcu_read_lock();
     433         109 :     offload = vr_rcu_dereference(offload_ops);
     434         109 :     if (offload && offload->voo_route_del)
     435           0 :         ret = offload->voo_route_del(req);
     436         109 :     vr_rcu_read_unlock();
     437             : 
     438         109 :     return ret;
     439             : }
     440             : 
     441         218 : static inline int vr_offload_route_add(vr_route_req * req)
     442             : {
     443             :     struct vr_offload_ops *offload;
     444         218 :     int ret = 0;
     445             : 
     446         218 :     vr_rcu_read_lock();
     447         218 :     offload = vr_rcu_dereference(offload_ops);
     448         218 :     if (offload && offload->voo_route_add)
     449           0 :         ret = offload->voo_route_add(req);
     450         218 :     vr_rcu_read_unlock();
     451             : 
     452         218 :     return ret;
     453             : }
     454             : 
     455         331 : static inline int vr_offload_route_get(vr_route_req * req)
     456             : {
     457             :     struct vr_offload_ops *offload;
     458         331 :     int ret = 0;
     459             : 
     460         331 :     vr_rcu_read_lock();
     461         331 :     offload = vr_rcu_dereference(offload_ops);
     462         331 :     if (offload && offload->voo_route_get)
     463           0 :         ret = offload->voo_route_get(req);
     464         331 :     vr_rcu_read_unlock();
     465             : 
     466         331 :     return ret;
     467             : }
     468             : 
     469           0 : static inline int vr_offload_route_dump(struct vr_route_req * req)
     470             : {
     471             :     struct vr_offload_ops *offload;
     472           0 :     int ret = 0;
     473             : 
     474           0 :     vr_rcu_read_lock();
     475           0 :     offload = vr_rcu_dereference(offload_ops);
     476           0 :     if (offload && offload->voo_route_dump)
     477           0 :         ret = offload->voo_route_dump(req);
     478           0 :     vr_rcu_read_unlock();
     479             : 
     480           0 :     return ret;
     481             : }
     482             : 
     483           0 : static inline int vr_offload_fc_map_add(vr_fc_map_req * req)
     484             : {
     485             :     struct vr_offload_ops *offload;
     486           0 :     int ret = 0;
     487             : 
     488           0 :     vr_rcu_read_lock();
     489           0 :     offload = vr_rcu_dereference(offload_ops);
     490           0 :     if (offload && offload->voo_fc_map_add)
     491           0 :         ret = offload->voo_fc_map_add(req);
     492           0 :     vr_rcu_read_unlock();
     493             : 
     494           0 :     return ret;
     495             : }
     496             : 
     497           0 : static inline int vr_offload_fc_map_del(vr_fc_map_req * req)
     498             : {
     499             :     struct vr_offload_ops *offload;
     500           0 :     int ret = 0;
     501             : 
     502           0 :     vr_rcu_read_lock();
     503           0 :     offload = vr_rcu_dereference(offload_ops);
     504           0 :     if (offload && offload->voo_fc_map_del)
     505           0 :         ret = offload->voo_fc_map_del(req);
     506           0 :     vr_rcu_read_unlock();
     507             : 
     508           0 :     return ret;
     509             : }
     510             : 
     511           0 : static inline int vr_offload_fc_map_get(vr_fc_map_req * req)
     512             : {
     513             :     struct vr_offload_ops *offload;
     514           0 :     int ret = 0;
     515             : 
     516           0 :     vr_rcu_read_lock();
     517           0 :     offload = vr_rcu_dereference(offload_ops);
     518           0 :     if (offload && offload->voo_fc_map_get)
     519           0 :         ret = offload->voo_fc_map_get(req);
     520           0 :     vr_rcu_read_unlock();
     521             : 
     522           0 :     return ret;
     523             : }
     524             : 
     525           0 : static inline int vr_offload_qos_map_add(vr_qos_map_req * req)
     526             : {
     527             :     struct vr_offload_ops *offload;
     528           0 :     int ret = 0;
     529             : 
     530           0 :     vr_rcu_read_lock();
     531           0 :     offload = vr_rcu_dereference(offload_ops);
     532           0 :     if (offload && offload->voo_qos_map_add)
     533           0 :         ret = offload->voo_qos_map_add(req);
     534           0 :     vr_rcu_read_unlock();
     535             : 
     536           0 :     return ret;
     537             : }
     538             : 
     539           0 : static inline int vr_offload_qos_map_del(vr_qos_map_req * req)
     540             : {
     541             :     struct vr_offload_ops *offload;
     542           0 :     int ret = 0;
     543             : 
     544           0 :     vr_rcu_read_lock();
     545           0 :     offload = vr_rcu_dereference(offload_ops);
     546           0 :     if (offload && offload->voo_qos_map_del)
     547           0 :         ret = offload->voo_qos_map_del(req);
     548           0 :     vr_rcu_read_unlock();
     549             : 
     550           0 :     return ret;
     551             : }
     552             : 
     553           0 : static inline int vr_offload_qos_map_get(vr_qos_map_req * req)
     554             : {
     555             :     struct vr_offload_ops *offload;
     556           0 :     int ret = 0;
     557             : 
     558           0 :     vr_rcu_read_lock();
     559           0 :     offload = vr_rcu_dereference(offload_ops);
     560           0 :     if (offload && offload->voo_qos_map_get)
     561           0 :         ret = offload->voo_qos_map_get(req);
     562           0 :     vr_rcu_read_unlock();
     563             : 
     564           0 :     return ret;
     565             : }
     566             : #endif /* __VR_OFFLOADS_DP_H__ */

Generated by: LCOV version 1.14