linux/net/dccp/diag.c
<<
>>
Prefs
   1/*
   2 *  net/dccp/diag.c
   3 *
   4 *  An implementation of the DCCP protocol
   5 *  Arnaldo Carvalho de Melo <acme@mandriva.com>
   6 *
   7 *      This program is free software; you can redistribute it and/or modify it
   8 *      under the terms of the GNU General Public License version 2 as
   9 *      published by the Free Software Foundation.
  10 */
  11
  12
  13#include <linux/module.h>
  14#include <linux/inet_diag.h>
  15
  16#include "ccid.h"
  17#include "dccp.h"
  18
  19static void dccp_get_info(struct sock *sk, struct tcp_info *info)
  20{
  21        struct dccp_sock *dp = dccp_sk(sk);
  22        const struct inet_connection_sock *icsk = inet_csk(sk);
  23
  24        memset(info, 0, sizeof(*info));
  25
  26        info->tcpi_state        = sk->sk_state;
  27        info->tcpi_retransmits  = icsk->icsk_retransmits;
  28        info->tcpi_probes       = icsk->icsk_probes_out;
  29        info->tcpi_backoff      = icsk->icsk_backoff;
  30        info->tcpi_pmtu         = icsk->icsk_pmtu_cookie;
  31
  32        if (dp->dccps_hc_rx_ackvec != NULL)
  33                info->tcpi_options |= TCPI_OPT_SACK;
  34
  35        if (dp->dccps_hc_rx_ccid != NULL)
  36                ccid_hc_rx_get_info(dp->dccps_hc_rx_ccid, sk, info);
  37
  38        if (dp->dccps_hc_tx_ccid != NULL)
  39                ccid_hc_tx_get_info(dp->dccps_hc_tx_ccid, sk, info);
  40}
  41
  42static void dccp_diag_get_info(struct sock *sk, struct inet_diag_msg *r,
  43                               void *_info)
  44{
  45        r->idiag_rqueue = r->idiag_wqueue = 0;
  46
  47        if (_info != NULL)
  48                dccp_get_info(sk, _info);
  49}
  50
  51static const struct inet_diag_handler dccp_diag_handler = {
  52        .idiag_hashinfo  = &dccp_hashinfo,
  53        .idiag_get_info  = dccp_diag_get_info,
  54        .idiag_type      = DCCPDIAG_GETSOCK,
  55        .idiag_info_size = sizeof(struct tcp_info),
  56};
  57
  58static int __init dccp_diag_init(void)
  59{
  60        return inet_diag_register(&dccp_diag_handler);
  61}
  62
  63static void __exit dccp_diag_fini(void)
  64{
  65        inet_diag_unregister(&dccp_diag_handler);
  66}
  67
  68module_init(dccp_diag_init);
  69module_exit(dccp_diag_fini);
  70
  71MODULE_LICENSE("GPL");
  72MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>");
  73MODULE_DESCRIPTION("DCCP inet_diag handler");
  74MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_INET_DIAG, DCCPDIAG_GETSOCK);
  75