162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * net/dccp/diag.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * An implementation of the DCCP protocol 662306a36Sopenharmony_ci * Arnaldo Carvalho de Melo <acme@mandriva.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/module.h> 1162306a36Sopenharmony_ci#include <linux/inet_diag.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "ccid.h" 1462306a36Sopenharmony_ci#include "dccp.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistatic void dccp_get_info(struct sock *sk, struct tcp_info *info) 1762306a36Sopenharmony_ci{ 1862306a36Sopenharmony_ci struct dccp_sock *dp = dccp_sk(sk); 1962306a36Sopenharmony_ci const struct inet_connection_sock *icsk = inet_csk(sk); 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci memset(info, 0, sizeof(*info)); 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci info->tcpi_state = sk->sk_state; 2462306a36Sopenharmony_ci info->tcpi_retransmits = icsk->icsk_retransmits; 2562306a36Sopenharmony_ci info->tcpi_probes = icsk->icsk_probes_out; 2662306a36Sopenharmony_ci info->tcpi_backoff = icsk->icsk_backoff; 2762306a36Sopenharmony_ci info->tcpi_pmtu = icsk->icsk_pmtu_cookie; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci if (dp->dccps_hc_rx_ackvec != NULL) 3062306a36Sopenharmony_ci info->tcpi_options |= TCPI_OPT_SACK; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci if (dp->dccps_hc_rx_ccid != NULL) 3362306a36Sopenharmony_ci ccid_hc_rx_get_info(dp->dccps_hc_rx_ccid, sk, info); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci if (dp->dccps_hc_tx_ccid != NULL) 3662306a36Sopenharmony_ci ccid_hc_tx_get_info(dp->dccps_hc_tx_ccid, sk, info); 3762306a36Sopenharmony_ci} 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistatic void dccp_diag_get_info(struct sock *sk, struct inet_diag_msg *r, 4062306a36Sopenharmony_ci void *_info) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci r->idiag_rqueue = r->idiag_wqueue = 0; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci if (_info != NULL) 4562306a36Sopenharmony_ci dccp_get_info(sk, _info); 4662306a36Sopenharmony_ci} 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistatic void dccp_diag_dump(struct sk_buff *skb, struct netlink_callback *cb, 4962306a36Sopenharmony_ci const struct inet_diag_req_v2 *r) 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci inet_diag_dump_icsk(&dccp_hashinfo, skb, cb, r); 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistatic int dccp_diag_dump_one(struct netlink_callback *cb, 5562306a36Sopenharmony_ci const struct inet_diag_req_v2 *req) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci return inet_diag_dump_one_icsk(&dccp_hashinfo, cb, req); 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic const struct inet_diag_handler dccp_diag_handler = { 6162306a36Sopenharmony_ci .dump = dccp_diag_dump, 6262306a36Sopenharmony_ci .dump_one = dccp_diag_dump_one, 6362306a36Sopenharmony_ci .idiag_get_info = dccp_diag_get_info, 6462306a36Sopenharmony_ci .idiag_type = IPPROTO_DCCP, 6562306a36Sopenharmony_ci .idiag_info_size = sizeof(struct tcp_info), 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistatic int __init dccp_diag_init(void) 6962306a36Sopenharmony_ci{ 7062306a36Sopenharmony_ci return inet_diag_register(&dccp_diag_handler); 7162306a36Sopenharmony_ci} 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistatic void __exit dccp_diag_fini(void) 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci inet_diag_unregister(&dccp_diag_handler); 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cimodule_init(dccp_diag_init); 7962306a36Sopenharmony_cimodule_exit(dccp_diag_fini); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 8262306a36Sopenharmony_ciMODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>"); 8362306a36Sopenharmony_ciMODULE_DESCRIPTION("DCCP inet_diag handler"); 8462306a36Sopenharmony_ciMODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_SOCK_DIAG, 2-33 /* AF_INET - IPPROTO_DCCP */); 85