1 /* SPDX-License-Identifier: GPL-2.0 */
3 #define _INET_DIAG_H_ 1
5 #include <net/netlink.h>
6 #include <uapi/linux/inet_diag.h>
10 struct inet_diag_handler
{
12 void (*dump
)(struct sk_buff
*skb
,
13 struct netlink_callback
*cb
,
14 const struct inet_diag_req_v2
*r
);
16 int (*dump_one
)(struct netlink_callback
*cb
,
17 const struct inet_diag_req_v2
*req
);
19 void (*idiag_get_info
)(struct sock
*sk
,
20 struct inet_diag_msg
*r
,
23 int (*idiag_get_aux
)(struct sock
*sk
,
27 size_t (*idiag_get_aux_size
)(struct sock
*sk
,
30 int (*destroy
)(struct sk_buff
*in_skb
,
31 const struct inet_diag_req_v2
*req
);
34 __u16 idiag_info_size
;
37 struct bpf_sk_storage_diag
;
38 struct inet_diag_dump_data
{
39 struct nlattr
*req_nlas
[__INET_DIAG_REQ_MAX
];
40 #define inet_diag_nla_bc req_nlas[INET_DIAG_REQ_BYTECODE]
41 #define inet_diag_nla_bpf_stgs req_nlas[INET_DIAG_REQ_SK_BPF_STORAGES]
43 struct bpf_sk_storage_diag
*bpf_stg_diag
;
46 struct inet_connection_sock
;
47 int inet_sk_diag_fill(struct sock
*sk
, struct inet_connection_sock
*icsk
,
48 struct sk_buff
*skb
, struct netlink_callback
*cb
,
49 const struct inet_diag_req_v2
*req
,
50 u16 nlmsg_flags
, bool net_admin
);
51 void inet_diag_dump_icsk(struct inet_hashinfo
*h
, struct sk_buff
*skb
,
52 struct netlink_callback
*cb
,
53 const struct inet_diag_req_v2
*r
);
54 int inet_diag_dump_one_icsk(struct inet_hashinfo
*hashinfo
,
55 struct netlink_callback
*cb
,
56 const struct inet_diag_req_v2
*req
);
58 struct sock
*inet_diag_find_one_icsk(struct net
*net
,
59 struct inet_hashinfo
*hashinfo
,
60 const struct inet_diag_req_v2
*req
);
62 int inet_diag_bc_sk(const struct nlattr
*_bc
, struct sock
*sk
);
64 void inet_diag_msg_common_fill(struct inet_diag_msg
*r
, struct sock
*sk
);
66 static inline size_t inet_diag_msg_attrs_size(void)
68 return nla_total_size(1) /* INET_DIAG_SHUTDOWN */
69 + nla_total_size(1) /* INET_DIAG_TOS */
70 #if IS_ENABLED(CONFIG_IPV6)
71 + nla_total_size(1) /* INET_DIAG_TCLASS */
72 + nla_total_size(1) /* INET_DIAG_SKV6ONLY */
74 + nla_total_size(4) /* INET_DIAG_MARK */
75 + nla_total_size(4) /* INET_DIAG_CLASS_ID */
76 #ifdef CONFIG_SOCK_CGROUP_DATA
77 + nla_total_size_64bit(sizeof(u64
)) /* INET_DIAG_CGROUP_ID */
79 + nla_total_size(sizeof(struct inet_diag_sockopt
))
80 /* INET_DIAG_SOCKOPT */
83 int inet_diag_msg_attrs_fill(struct sock
*sk
, struct sk_buff
*skb
,
84 struct inet_diag_msg
*r
, int ext
,
85 struct user_namespace
*user_ns
, bool net_admin
);
87 extern int inet_diag_register(const struct inet_diag_handler
*handler
);
88 extern void inet_diag_unregister(const struct inet_diag_handler
*handler
);
89 #endif /* _INET_DIAG_H_ */