18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * net/dccp/diag.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * An implementation of the DCCP protocol 68c2ecf20Sopenharmony_ci * Arnaldo Carvalho de Melo <acme@mandriva.com> 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/module.h> 118c2ecf20Sopenharmony_ci#include <linux/inet_diag.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include "ccid.h" 148c2ecf20Sopenharmony_ci#include "dccp.h" 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistatic void dccp_get_info(struct sock *sk, struct tcp_info *info) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci struct dccp_sock *dp = dccp_sk(sk); 198c2ecf20Sopenharmony_ci const struct inet_connection_sock *icsk = inet_csk(sk); 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci memset(info, 0, sizeof(*info)); 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci info->tcpi_state = sk->sk_state; 248c2ecf20Sopenharmony_ci info->tcpi_retransmits = icsk->icsk_retransmits; 258c2ecf20Sopenharmony_ci info->tcpi_probes = icsk->icsk_probes_out; 268c2ecf20Sopenharmony_ci info->tcpi_backoff = icsk->icsk_backoff; 278c2ecf20Sopenharmony_ci info->tcpi_pmtu = icsk->icsk_pmtu_cookie; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci if (dp->dccps_hc_rx_ackvec != NULL) 308c2ecf20Sopenharmony_ci info->tcpi_options |= TCPI_OPT_SACK; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci if (dp->dccps_hc_rx_ccid != NULL) 338c2ecf20Sopenharmony_ci ccid_hc_rx_get_info(dp->dccps_hc_rx_ccid, sk, info); 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci if (dp->dccps_hc_tx_ccid != NULL) 368c2ecf20Sopenharmony_ci ccid_hc_tx_get_info(dp->dccps_hc_tx_ccid, sk, info); 378c2ecf20Sopenharmony_ci} 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cistatic void dccp_diag_get_info(struct sock *sk, struct inet_diag_msg *r, 408c2ecf20Sopenharmony_ci void *_info) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci r->idiag_rqueue = r->idiag_wqueue = 0; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci if (_info != NULL) 458c2ecf20Sopenharmony_ci dccp_get_info(sk, _info); 468c2ecf20Sopenharmony_ci} 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_cistatic void dccp_diag_dump(struct sk_buff *skb, struct netlink_callback *cb, 498c2ecf20Sopenharmony_ci const struct inet_diag_req_v2 *r) 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci inet_diag_dump_icsk(&dccp_hashinfo, skb, cb, r); 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic int dccp_diag_dump_one(struct netlink_callback *cb, 558c2ecf20Sopenharmony_ci const struct inet_diag_req_v2 *req) 568c2ecf20Sopenharmony_ci{ 578c2ecf20Sopenharmony_ci return inet_diag_dump_one_icsk(&dccp_hashinfo, cb, req); 588c2ecf20Sopenharmony_ci} 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_cistatic const struct inet_diag_handler dccp_diag_handler = { 618c2ecf20Sopenharmony_ci .dump = dccp_diag_dump, 628c2ecf20Sopenharmony_ci .dump_one = dccp_diag_dump_one, 638c2ecf20Sopenharmony_ci .idiag_get_info = dccp_diag_get_info, 648c2ecf20Sopenharmony_ci .idiag_type = IPPROTO_DCCP, 658c2ecf20Sopenharmony_ci .idiag_info_size = sizeof(struct tcp_info), 668c2ecf20Sopenharmony_ci}; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_cistatic int __init dccp_diag_init(void) 698c2ecf20Sopenharmony_ci{ 708c2ecf20Sopenharmony_ci return inet_diag_register(&dccp_diag_handler); 718c2ecf20Sopenharmony_ci} 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_cistatic void __exit dccp_diag_fini(void) 748c2ecf20Sopenharmony_ci{ 758c2ecf20Sopenharmony_ci inet_diag_unregister(&dccp_diag_handler); 768c2ecf20Sopenharmony_ci} 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_cimodule_init(dccp_diag_init); 798c2ecf20Sopenharmony_cimodule_exit(dccp_diag_fini); 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 828c2ecf20Sopenharmony_ciMODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>"); 838c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("DCCP inet_diag handler"); 848c2ecf20Sopenharmony_ciMODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_SOCK_DIAG, 2-33 /* AF_INET - IPPROTO_DCCP */); 85