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 void dccp_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
  52                           const struct inet_diag_req_v2 *r, struct nlattr *bc)
  53{
  54        inet_diag_dump_icsk(&dccp_hashinfo, skb, cb, r, bc);
  55}
  56
  57static int dccp_diag_dump_one(struct sk_buff *in_skb,
  58                              const struct nlmsghdr *nlh,
  59                              const struct inet_diag_req_v2 *req)
  60{
  61        return inet_diag_dump_one_icsk(&dccp_hashinfo, in_skb, nlh, req);
  62}
  63
  64static const struct inet_diag_handler dccp_diag_handler = {
  65        .dump            = dccp_diag_dump,
  66        .dump_one        = dccp_diag_dump_one,
  67        .idiag_get_info  = dccp_diag_get_info,
  68        .idiag_type      = IPPROTO_DCCP,
  69        .idiag_info_size = sizeof(struct tcp_info),
  70};
  71
  72static int __init dccp_diag_init(void)
  73{
  74        return inet_diag_register(&dccp_diag_handler);
  75}
  76
  77static void __exit dccp_diag_fini(void)
  78{
  79        inet_diag_unregister(&dccp_diag_handler);
  80}
  81
  82module_init(dccp_diag_init);
  83module_exit(dccp_diag_fini);
  84
  85MODULE_LICENSE("GPL");
  86MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>");
  87MODULE_DESCRIPTION("DCCP inet_diag handler");
  88MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_SOCK_DIAG, 2-33 /* AF_INET - IPPROTO_DCCP */);
  89