root/net/dccp/diag.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. dccp_get_info
  2. dccp_diag_get_info
  3. dccp_diag_dump
  4. dccp_diag_dump_one
  5. dccp_diag_init
  6. dccp_diag_fini

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  *  net/dccp/diag.c
   4  *
   5  *  An implementation of the DCCP protocol
   6  *  Arnaldo Carvalho de Melo <acme@mandriva.com>
   7  */
   8 
   9 
  10 #include <linux/module.h>
  11 #include <linux/inet_diag.h>
  12 
  13 #include "ccid.h"
  14 #include "dccp.h"
  15 
  16 static void dccp_get_info(struct sock *sk, struct tcp_info *info)
  17 {
  18         struct dccp_sock *dp = dccp_sk(sk);
  19         const struct inet_connection_sock *icsk = inet_csk(sk);
  20 
  21         memset(info, 0, sizeof(*info));
  22 
  23         info->tcpi_state        = sk->sk_state;
  24         info->tcpi_retransmits  = icsk->icsk_retransmits;
  25         info->tcpi_probes       = icsk->icsk_probes_out;
  26         info->tcpi_backoff      = icsk->icsk_backoff;
  27         info->tcpi_pmtu         = icsk->icsk_pmtu_cookie;
  28 
  29         if (dp->dccps_hc_rx_ackvec != NULL)
  30                 info->tcpi_options |= TCPI_OPT_SACK;
  31 
  32         if (dp->dccps_hc_rx_ccid != NULL)
  33                 ccid_hc_rx_get_info(dp->dccps_hc_rx_ccid, sk, info);
  34 
  35         if (dp->dccps_hc_tx_ccid != NULL)
  36                 ccid_hc_tx_get_info(dp->dccps_hc_tx_ccid, sk, info);
  37 }
  38 
  39 static void dccp_diag_get_info(struct sock *sk, struct inet_diag_msg *r,
  40                                void *_info)
  41 {
  42         r->idiag_rqueue = r->idiag_wqueue = 0;
  43 
  44         if (_info != NULL)
  45                 dccp_get_info(sk, _info);
  46 }
  47 
  48 static void dccp_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
  49                            const struct inet_diag_req_v2 *r, struct nlattr *bc)
  50 {
  51         inet_diag_dump_icsk(&dccp_hashinfo, skb, cb, r, bc);
  52 }
  53 
  54 static int dccp_diag_dump_one(struct sk_buff *in_skb,
  55                               const struct nlmsghdr *nlh,
  56                               const struct inet_diag_req_v2 *req)
  57 {
  58         return inet_diag_dump_one_icsk(&dccp_hashinfo, in_skb, nlh, req);
  59 }
  60 
  61 static const struct inet_diag_handler dccp_diag_handler = {
  62         .dump            = dccp_diag_dump,
  63         .dump_one        = dccp_diag_dump_one,
  64         .idiag_get_info  = dccp_diag_get_info,
  65         .idiag_type      = IPPROTO_DCCP,
  66         .idiag_info_size = sizeof(struct tcp_info),
  67 };
  68 
  69 static int __init dccp_diag_init(void)
  70 {
  71         return inet_diag_register(&dccp_diag_handler);
  72 }
  73 
  74 static void __exit dccp_diag_fini(void)
  75 {
  76         inet_diag_unregister(&dccp_diag_handler);
  77 }
  78 
  79 module_init(dccp_diag_init);
  80 module_exit(dccp_diag_fini);
  81 
  82 MODULE_LICENSE("GPL");
  83 MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>");
  84 MODULE_DESCRIPTION("DCCP inet_diag handler");
  85 MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_SOCK_DIAG, 2-33 /* AF_INET - IPPROTO_DCCP */);

/* [<][>][^][v][top][bottom][index][help] */