LCOV - code coverage report
Current view: top level - include/net/netns - generic.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 8 8 100.0 %
Date: 2022-03-28 15:32:58 Functions: 0 0 -
Branches: 2 20 10.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0 */
       2                 :            : /*
       3                 :            :  * generic net pointers
       4                 :            :  */
       5                 :            : 
       6                 :            : #ifndef __NET_GENERIC_H__
       7                 :            : #define __NET_GENERIC_H__
       8                 :            : 
       9                 :            : #include <linux/bug.h>
      10                 :            : #include <linux/rcupdate.h>
      11                 :            : 
      12                 :            : /*
      13                 :            :  * Generic net pointers are to be used by modules to put some private
      14                 :            :  * stuff on the struct net without explicit struct net modification
      15                 :            :  *
      16                 :            :  * The rules are simple:
      17                 :            :  * 1. set pernet_operations->id.  After register_pernet_device you
      18                 :            :  *    will have the id of your private pointer.
      19                 :            :  * 2. set pernet_operations->size to have the code allocate and free
      20                 :            :  *    a private structure pointed to from struct net.
      21                 :            :  * 3. do not change this pointer while the net is alive;
      22                 :            :  * 4. do not try to have any private reference on the net_generic object.
      23                 :            :  *
      24                 :            :  * After accomplishing all of the above, the private pointer can be
      25                 :            :  * accessed with the net_generic() call.
      26                 :            :  */
      27                 :            : 
      28                 :            : struct net_generic {
      29                 :            :         union {
      30                 :            :                 struct {
      31                 :            :                         unsigned int len;
      32                 :            :                         struct rcu_head rcu;
      33                 :            :                 } s;
      34                 :            : 
      35                 :            :                 void *ptr[0];
      36                 :            :         };
      37                 :            : };
      38                 :            : 
      39                 :      49642 : static inline void *net_generic(const struct net *net, unsigned int id)
      40                 :            : {
      41                 :      49642 :         struct net_generic *ng;
      42                 :      49642 :         void *ptr;
      43                 :            : 
      44                 :      49642 :         rcu_read_lock();
      45                 :      49642 :         ng = rcu_dereference(net->gen);
      46                 :      49642 :         ptr = ng->ptr[id];
      47                 :      49642 :         rcu_read_unlock();
      48                 :            : 
      49   [ -  +  +  -  :      49558 :         return ptr;
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
                      - ]
      50                 :            : }
      51                 :            : #endif

Generated by: LCOV version 1.14