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 (dccp_msk(sk)->dccpms_send_ack_vector)
  33                info->tcpi_options |= TCPI_OPT_SACK;
  34
  35        ccid_hc_rx_get_info(dp->dccps_hc_rx_ccid, sk, info);
  36        ccid_hc_tx_get_info(dp->dccps_hc_tx_ccid, sk, info);
  37}
  38
  39static 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
  48static struct inet_diag_handler dccp_diag_handler = {
  49        .idiag_hashinfo  = &dccp_hashinfo,
  50        .idiag_get_info  = dccp_diag_get_info,
  51        .idiag_type      = DCCPDIAG_GETSOCK,
  52        .idiag_info_size = sizeof(struct tcp_info),
  53};
  54
  55static int __init dccp_diag_init(void)
  56{
  57        return inet_diag_register(&dccp_diag_handler);
  58}
  59
  60static void __exit dccp_diag_fini(void)
  61{
  62        inet_diag_unregister(&dccp_diag_handler);
  63}
  64
  65module_init(dccp_diag_init);
  66module_exit(dccp_diag_fini);
  67
  68MODULE_LICENSE("GPL");
  69MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>");
  70MODULE_DESCRIPTION("DCCP inet_diag handler");
  71MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_INET_DIAG, DCCPDIAG_GETSOCK);
  72