LCOV - code coverage report
Current view: top level - include/linux - sock_diag.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 17 21 81.0 %
Date: 2022-04-01 14:17:54 Functions: 2 2 100.0 %
Branches: 13 21 61.9 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0 */
       2                 :            : #ifndef __SOCK_DIAG_H__
       3                 :            : #define __SOCK_DIAG_H__
       4                 :            : 
       5                 :            : #include <linux/netlink.h>
       6                 :            : #include <linux/user_namespace.h>
       7                 :            : #include <net/net_namespace.h>
       8                 :            : #include <net/sock.h>
       9                 :            : #include <uapi/linux/sock_diag.h>
      10                 :            : 
      11                 :            : struct sk_buff;
      12                 :            : struct nlmsghdr;
      13                 :            : struct sock;
      14                 :            : 
      15                 :            : struct sock_diag_handler {
      16                 :            :         __u8 family;
      17                 :            :         int (*dump)(struct sk_buff *skb, struct nlmsghdr *nlh);
      18                 :            :         int (*get_info)(struct sk_buff *skb, struct sock *sk);
      19                 :            :         int (*destroy)(struct sk_buff *skb, struct nlmsghdr *nlh);
      20                 :            : };
      21                 :            : 
      22                 :            : int sock_diag_register(const struct sock_diag_handler *h);
      23                 :            : void sock_diag_unregister(const struct sock_diag_handler *h);
      24                 :            : 
      25                 :            : void sock_diag_register_inet_compat(int (*fn)(struct sk_buff *skb, struct nlmsghdr *nlh));
      26                 :            : void sock_diag_unregister_inet_compat(int (*fn)(struct sk_buff *skb, struct nlmsghdr *nlh));
      27                 :            : 
      28                 :            : u64 sock_gen_cookie(struct sock *sk);
      29                 :            : int sock_diag_check_cookie(struct sock *sk, const __u32 *cookie);
      30                 :            : void sock_diag_save_cookie(struct sock *sk, __u32 *cookie);
      31                 :            : 
      32                 :            : int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attr);
      33                 :            : int sock_diag_put_filterinfo(bool may_report_filterinfo, struct sock *sk,
      34                 :            :                              struct sk_buff *skb, int attrtype);
      35                 :            : 
      36                 :            : static inline
      37                 :       3927 : enum sknetlink_groups sock_diag_destroy_group(const struct sock *sk)
      38                 :            : {
      39      [ +  +  + ]:       3927 :         switch (sk->sk_family) {
      40                 :        946 :         case AF_INET:
      41         [ +  - ]:        946 :                 if (sk->sk_type == SOCK_RAW)
      42                 :            :                         return SKNLGRP_NONE;
      43                 :            : 
      44      [ +  -  - ]:        946 :                 switch (sk->sk_protocol) {
      45                 :            :                 case IPPROTO_TCP:
      46                 :            :                         return SKNLGRP_INET_TCP_DESTROY;
      47                 :        946 :                 case IPPROTO_UDP:
      48                 :        946 :                         return SKNLGRP_INET_UDP_DESTROY;
      49                 :          0 :                 default:
      50                 :          0 :                         return SKNLGRP_NONE;
      51                 :            :                 }
      52                 :         22 :         case AF_INET6:
      53         [ +  - ]:         22 :                 if (sk->sk_type == SOCK_RAW)
      54                 :            :                         return SKNLGRP_NONE;
      55                 :            : 
      56      [ +  -  - ]:         22 :                 switch (sk->sk_protocol) {
      57                 :            :                 case IPPROTO_TCP:
      58                 :            :                         return SKNLGRP_INET6_TCP_DESTROY;
      59                 :         22 :                 case IPPROTO_UDP:
      60                 :         22 :                         return SKNLGRP_INET6_UDP_DESTROY;
      61                 :          0 :                 default:
      62                 :          0 :                         return SKNLGRP_NONE;
      63                 :            :                 }
      64                 :            :         default:
      65                 :            :                 return SKNLGRP_NONE;
      66                 :            :         }
      67                 :            : }
      68                 :            : 
      69                 :            : static inline
      70                 :       3927 : bool sock_diag_has_destroy_listeners(const struct sock *sk)
      71                 :            : {
      72         [ +  + ]:       3927 :         const struct net *n = sock_net(sk);
      73                 :       3927 :         const enum sknetlink_groups group = sock_diag_destroy_group(sk);
      74                 :            : 
      75   [ +  +  +  -  :       4895 :         return group != SKNLGRP_NONE && n->diag_nlsk &&
                   +  - ]
      76                 :        968 :                 netlink_has_listeners(n->diag_nlsk, group);
      77                 :            : }
      78                 :            : void sock_diag_broadcast_destroy(struct sock *sk);
      79                 :            : 
      80                 :            : int sock_diag_destroy(struct sock *sk, int err);
      81                 :            : #endif

Generated by: LCOV version 1.14