LCOV - code coverage report
Current view: top level - mptcp/diag.c (source / functions) Coverage Total Hit
Test: export Lines: 65.8 % 76 50
Test Date: 2024-11-27 06:46:12 Functions: 66.7 % 3 2
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 54.5 % 66 36

             Branch data     Line data    Source code
       1                 :             : // SPDX-License-Identifier: GPL-2.0
       2                 :             : /* MPTCP socket monitoring support
       3                 :             :  *
       4                 :             :  * Copyright (c) 2019 Red Hat
       5                 :             :  *
       6                 :             :  * Author: Davide Caratti <dcaratti@redhat.com>
       7                 :             :  */
       8                 :             : 
       9                 :             : #include <linux/kernel.h>
      10                 :             : #include <linux/net.h>
      11                 :             : #include <linux/inet_diag.h>
      12                 :             : #include <net/netlink.h>
      13                 :             : #include "protocol.h"
      14                 :             : 
      15                 :         240 : static int subflow_get_info(struct sock *sk, struct sk_buff *skb)
      16                 :             : {
      17                 :         240 :         struct mptcp_subflow_context *sf;
      18                 :         240 :         struct nlattr *start;
      19                 :         240 :         u32 flags = 0;
      20                 :         240 :         bool slow;
      21                 :         240 :         int err;
      22                 :             : 
      23         [ -  + ]:         240 :         if (inet_sk_state_load(sk) == TCP_LISTEN)
      24                 :             :                 return 0;
      25                 :             : 
      26                 :         240 :         start = nla_nest_start_noflag(skb, INET_ULP_INFO_MPTCP);
      27         [ +  - ]:         240 :         if (!start)
      28                 :             :                 return -EMSGSIZE;
      29                 :             : 
      30                 :         240 :         slow = lock_sock_fast(sk);
      31                 :         240 :         rcu_read_lock();
      32   [ +  -  -  +  :         240 :         sf = rcu_dereference(inet_csk(sk)->icsk_ulp_data);
          -  -  -  -  -  
                      - ]
      33         [ -  + ]:         240 :         if (!sf) {
      34                 :           0 :                 err = 0;
      35                 :           0 :                 goto nla_failure;
      36                 :             :         }
      37                 :             : 
      38         [ +  + ]:         240 :         if (sf->mp_capable)
      39                 :          72 :                 flags |= MPTCP_SUBFLOW_FLAG_MCAP_REM;
      40         [ +  + ]:         240 :         if (sf->request_mptcp)
      41                 :          18 :                 flags |= MPTCP_SUBFLOW_FLAG_MCAP_LOC;
      42         [ +  + ]:         240 :         if (sf->mp_join)
      43                 :         168 :                 flags |= MPTCP_SUBFLOW_FLAG_JOIN_REM;
      44         [ +  + ]:         240 :         if (sf->request_join)
      45                 :          66 :                 flags |= MPTCP_SUBFLOW_FLAG_JOIN_LOC;
      46         [ -  + ]:         240 :         if (sf->backup)
      47                 :           0 :                 flags |= MPTCP_SUBFLOW_FLAG_BKUP_REM;
      48         [ -  + ]:         240 :         if (sf->request_bkup)
      49                 :           0 :                 flags |= MPTCP_SUBFLOW_FLAG_BKUP_LOC;
      50   [ +  +  +  - ]:         240 :         if (READ_ONCE(sf->fully_established))
      51                 :         240 :                 flags |= MPTCP_SUBFLOW_FLAG_FULLY_ESTABLISHED;
      52         [ +  - ]:         240 :         if (sf->conn_finished)
      53                 :         240 :                 flags |= MPTCP_SUBFLOW_FLAG_CONNECTED;
      54         [ -  + ]:         240 :         if (sf->map_valid)
      55                 :           0 :                 flags |= MPTCP_SUBFLOW_FLAG_MAPVALID;
      56                 :             : 
      57   [ +  -  +  - ]:         408 :         if (nla_put_u32(skb, MPTCP_SUBFLOW_ATTR_TOKEN_REM, sf->remote_token) ||
      58         [ +  - ]:         408 :             nla_put_u32(skb, MPTCP_SUBFLOW_ATTR_TOKEN_LOC, sf->token) ||
      59         [ +  - ]:         240 :             nla_put_u32(skb, MPTCP_SUBFLOW_ATTR_RELWRITE_SEQ,
      60         [ +  - ]:         240 :                         sf->rel_write_seq) ||
      61         [ +  - ]:         240 :             nla_put_u64_64bit(skb, MPTCP_SUBFLOW_ATTR_MAP_SEQ, sf->map_seq,
      62         [ +  - ]:         240 :                               MPTCP_SUBFLOW_ATTR_PAD) ||
      63         [ +  - ]:         240 :             nla_put_u32(skb, MPTCP_SUBFLOW_ATTR_MAP_SFSEQ,
      64         [ +  - ]:         240 :                         sf->map_subflow_seq) ||
      65         [ +  - ]:         408 :             nla_put_u32(skb, MPTCP_SUBFLOW_ATTR_SSN_OFFSET, sf->ssn_offset) ||
      66         [ +  - ]:         240 :             nla_put_u16(skb, MPTCP_SUBFLOW_ATTR_MAP_DATALEN,
      67         [ +  - ]:         408 :                         sf->map_data_len) ||
      68         [ +  - ]:         240 :             nla_put_u32(skb, MPTCP_SUBFLOW_ATTR_FLAGS, flags) ||
      69         [ +  + ]:         408 :             nla_put_u8(skb, MPTCP_SUBFLOW_ATTR_ID_REM, sf->remote_id) ||
      70         [ -  + ]:          72 :             nla_put_u8(skb, MPTCP_SUBFLOW_ATTR_ID_LOC, subflow_get_local_id(sf))) {
      71                 :           0 :                 err = -EMSGSIZE;
      72                 :           0 :                 goto nla_failure;
      73                 :             :         }
      74                 :             : 
      75                 :         240 :         rcu_read_unlock();
      76                 :         240 :         unlock_sock_fast(sk, slow);
      77                 :         240 :         nla_nest_end(skb, start);
      78                 :         240 :         return 0;
      79                 :             : 
      80                 :           0 : nla_failure:
      81                 :           0 :         rcu_read_unlock();
      82                 :           0 :         unlock_sock_fast(sk, slow);
      83                 :           0 :         nla_nest_cancel(skb, start);
      84                 :           0 :         return err;
      85                 :             : }
      86                 :             : 
      87                 :           0 : static size_t subflow_get_info_size(const struct sock *sk)
      88                 :             : {
      89                 :           0 :         size_t size = 0;
      90                 :             : 
      91                 :           0 :         size += nla_total_size(0) +     /* INET_ULP_INFO_MPTCP */
      92                 :           0 :                 nla_total_size(4) +     /* MPTCP_SUBFLOW_ATTR_TOKEN_REM */
      93                 :           0 :                 nla_total_size(4) +     /* MPTCP_SUBFLOW_ATTR_TOKEN_LOC */
      94                 :           0 :                 nla_total_size(4) +     /* MPTCP_SUBFLOW_ATTR_RELWRITE_SEQ */
      95                 :           0 :                 nla_total_size_64bit(8) +       /* MPTCP_SUBFLOW_ATTR_MAP_SEQ */
      96                 :           0 :                 nla_total_size(4) +     /* MPTCP_SUBFLOW_ATTR_MAP_SFSEQ */
      97                 :           0 :                 nla_total_size(4) +     /* MPTCP_SUBFLOW_ATTR_SSN_OFFSET */
      98                 :           0 :                 nla_total_size(2) +     /* MPTCP_SUBFLOW_ATTR_MAP_DATALEN */
      99                 :           0 :                 nla_total_size(4) +     /* MPTCP_SUBFLOW_ATTR_FLAGS */
     100                 :           0 :                 nla_total_size(1) +     /* MPTCP_SUBFLOW_ATTR_ID_REM */
     101                 :           0 :                 nla_total_size(1) +     /* MPTCP_SUBFLOW_ATTR_ID_LOC */
     102                 :             :                 0;
     103                 :           0 :         return size;
     104                 :             : }
     105                 :             : 
     106                 :           4 : void mptcp_diag_subflow_init(struct tcp_ulp_ops *ops)
     107                 :             : {
     108                 :           4 :         ops->get_info = subflow_get_info;
     109                 :           4 :         ops->get_info_size = subflow_get_info_size;
     110                 :           4 : }
        

Generated by: LCOV version 2.0-1