LCOV - code coverage report
Current view: top level - include/net/netns - generic.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 4 4 100.0 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 24 100 24.0 %

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

Generated by: LCOV version 1.9