1/* SPDX-License-Identifier: GPL-2.0 */
2#undef TRACE_SYSTEM
3#define TRACE_SYSTEM handshake
4
5#if !defined(_TRACE_HANDSHAKE_H) || defined(TRACE_HEADER_MULTI_READ)
6#define _TRACE_HANDSHAKE_H
7
8#include <linux/net.h>
9#include <net/tls_prot.h>
10#include <linux/tracepoint.h>
11#include <trace/events/net_probe_common.h>
12
13#define TLS_RECORD_TYPE_LIST \
14	record_type(CHANGE_CIPHER_SPEC) \
15	record_type(ALERT) \
16	record_type(HANDSHAKE) \
17	record_type(DATA) \
18	record_type(HEARTBEAT) \
19	record_type(TLS12_CID) \
20	record_type_end(ACK)
21
22#undef record_type
23#undef record_type_end
24#define record_type(x)		TRACE_DEFINE_ENUM(TLS_RECORD_TYPE_##x);
25#define record_type_end(x)	TRACE_DEFINE_ENUM(TLS_RECORD_TYPE_##x);
26
27TLS_RECORD_TYPE_LIST
28
29#undef record_type
30#undef record_type_end
31#define record_type(x)		{ TLS_RECORD_TYPE_##x, #x },
32#define record_type_end(x)	{ TLS_RECORD_TYPE_##x, #x }
33
34#define show_tls_content_type(type) \
35	__print_symbolic(type, TLS_RECORD_TYPE_LIST)
36
37TRACE_DEFINE_ENUM(TLS_ALERT_LEVEL_WARNING);
38TRACE_DEFINE_ENUM(TLS_ALERT_LEVEL_FATAL);
39
40#define show_tls_alert_level(level) \
41	__print_symbolic(level, \
42		{ TLS_ALERT_LEVEL_WARNING,	"Warning" }, \
43		{ TLS_ALERT_LEVEL_FATAL,	"Fatal" })
44
45#define TLS_ALERT_DESCRIPTION_LIST \
46	alert_description(CLOSE_NOTIFY) \
47	alert_description(UNEXPECTED_MESSAGE) \
48	alert_description(BAD_RECORD_MAC) \
49	alert_description(RECORD_OVERFLOW) \
50	alert_description(HANDSHAKE_FAILURE) \
51	alert_description(BAD_CERTIFICATE) \
52	alert_description(UNSUPPORTED_CERTIFICATE) \
53	alert_description(CERTIFICATE_REVOKED) \
54	alert_description(CERTIFICATE_EXPIRED) \
55	alert_description(CERTIFICATE_UNKNOWN) \
56	alert_description(ILLEGAL_PARAMETER) \
57	alert_description(UNKNOWN_CA) \
58	alert_description(ACCESS_DENIED) \
59	alert_description(DECODE_ERROR) \
60	alert_description(DECRYPT_ERROR) \
61	alert_description(TOO_MANY_CIDS_REQUESTED) \
62	alert_description(PROTOCOL_VERSION) \
63	alert_description(INSUFFICIENT_SECURITY) \
64	alert_description(INTERNAL_ERROR) \
65	alert_description(INAPPROPRIATE_FALLBACK) \
66	alert_description(USER_CANCELED) \
67	alert_description(MISSING_EXTENSION) \
68	alert_description(UNSUPPORTED_EXTENSION) \
69	alert_description(UNRECOGNIZED_NAME) \
70	alert_description(BAD_CERTIFICATE_STATUS_RESPONSE) \
71	alert_description(UNKNOWN_PSK_IDENTITY) \
72	alert_description(CERTIFICATE_REQUIRED) \
73	alert_description_end(NO_APPLICATION_PROTOCOL)
74
75#undef alert_description
76#undef alert_description_end
77#define alert_description(x)		TRACE_DEFINE_ENUM(TLS_ALERT_DESC_##x);
78#define alert_description_end(x)	TRACE_DEFINE_ENUM(TLS_ALERT_DESC_##x);
79
80TLS_ALERT_DESCRIPTION_LIST
81
82#undef alert_description
83#undef alert_description_end
84#define alert_description(x)		{ TLS_ALERT_DESC_##x, #x },
85#define alert_description_end(x)	{ TLS_ALERT_DESC_##x, #x }
86
87#define show_tls_alert_description(desc) \
88	__print_symbolic(desc, TLS_ALERT_DESCRIPTION_LIST)
89
90DECLARE_EVENT_CLASS(handshake_event_class,
91	TP_PROTO(
92		const struct net *net,
93		const struct handshake_req *req,
94		const struct sock *sk
95	),
96	TP_ARGS(net, req, sk),
97	TP_STRUCT__entry(
98		__field(const void *, req)
99		__field(const void *, sk)
100		__field(unsigned int, netns_ino)
101	),
102	TP_fast_assign(
103		__entry->req = req;
104		__entry->sk = sk;
105		__entry->netns_ino = net->ns.inum;
106	),
107	TP_printk("req=%p sk=%p",
108		__entry->req, __entry->sk
109	)
110);
111#define DEFINE_HANDSHAKE_EVENT(name)				\
112	DEFINE_EVENT(handshake_event_class, name,		\
113		TP_PROTO(					\
114			const struct net *net,			\
115			const struct handshake_req *req,	\
116			const struct sock *sk			\
117		),						\
118		TP_ARGS(net, req, sk))
119
120DECLARE_EVENT_CLASS(handshake_fd_class,
121	TP_PROTO(
122		const struct net *net,
123		const struct handshake_req *req,
124		const struct sock *sk,
125		int fd
126	),
127	TP_ARGS(net, req, sk, fd),
128	TP_STRUCT__entry(
129		__field(const void *, req)
130		__field(const void *, sk)
131		__field(int, fd)
132		__field(unsigned int, netns_ino)
133	),
134	TP_fast_assign(
135		__entry->req = req;
136		__entry->sk = req->hr_sk;
137		__entry->fd = fd;
138		__entry->netns_ino = net->ns.inum;
139	),
140	TP_printk("req=%p sk=%p fd=%d",
141		__entry->req, __entry->sk, __entry->fd
142	)
143);
144#define DEFINE_HANDSHAKE_FD_EVENT(name)				\
145	DEFINE_EVENT(handshake_fd_class, name,			\
146		TP_PROTO(					\
147			const struct net *net,			\
148			const struct handshake_req *req,	\
149			const struct sock *sk,			\
150			int fd					\
151		),						\
152		TP_ARGS(net, req, sk, fd))
153
154DECLARE_EVENT_CLASS(handshake_error_class,
155	TP_PROTO(
156		const struct net *net,
157		const struct handshake_req *req,
158		const struct sock *sk,
159		int err
160	),
161	TP_ARGS(net, req, sk, err),
162	TP_STRUCT__entry(
163		__field(const void *, req)
164		__field(const void *, sk)
165		__field(int, err)
166		__field(unsigned int, netns_ino)
167	),
168	TP_fast_assign(
169		__entry->req = req;
170		__entry->sk = sk;
171		__entry->err = err;
172		__entry->netns_ino = net->ns.inum;
173	),
174	TP_printk("req=%p sk=%p err=%d",
175		__entry->req, __entry->sk, __entry->err
176	)
177);
178#define DEFINE_HANDSHAKE_ERROR(name)				\
179	DEFINE_EVENT(handshake_error_class, name,		\
180		TP_PROTO(					\
181			const struct net *net,			\
182			const struct handshake_req *req,	\
183			const struct sock *sk,			\
184			int err					\
185		),						\
186		TP_ARGS(net, req, sk, err))
187
188DECLARE_EVENT_CLASS(handshake_alert_class,
189	TP_PROTO(
190		const struct sock *sk,
191		unsigned char level,
192		unsigned char description
193	),
194	TP_ARGS(sk, level, description),
195	TP_STRUCT__entry(
196		/* sockaddr_in6 is always bigger than sockaddr_in */
197		__array(__u8, saddr, sizeof(struct sockaddr_in6))
198		__array(__u8, daddr, sizeof(struct sockaddr_in6))
199		__field(unsigned int, netns_ino)
200		__field(unsigned long, level)
201		__field(unsigned long, description)
202	),
203	TP_fast_assign(
204		const struct inet_sock *inet = inet_sk(sk);
205
206		memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
207		memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
208		TP_STORE_ADDR_PORTS(__entry, inet, sk);
209
210		__entry->netns_ino = sock_net(sk)->ns.inum;
211		__entry->level = level;
212		__entry->description = description;
213	),
214	TP_printk("src=%pISpc dest=%pISpc %s: %s",
215		__entry->saddr, __entry->daddr,
216		show_tls_alert_level(__entry->level),
217		show_tls_alert_description(__entry->description)
218	)
219);
220#define DEFINE_HANDSHAKE_ALERT(name)				\
221	DEFINE_EVENT(handshake_alert_class, name,		\
222		TP_PROTO(					\
223			const struct sock *sk,			\
224			unsigned char level,			\
225			unsigned char description		\
226		),						\
227		TP_ARGS(sk, level, description))
228
229
230/*
231 * Request lifetime events
232 */
233
234DEFINE_HANDSHAKE_EVENT(handshake_submit);
235DEFINE_HANDSHAKE_ERROR(handshake_submit_err);
236DEFINE_HANDSHAKE_EVENT(handshake_cancel);
237DEFINE_HANDSHAKE_EVENT(handshake_cancel_none);
238DEFINE_HANDSHAKE_EVENT(handshake_cancel_busy);
239DEFINE_HANDSHAKE_EVENT(handshake_destruct);
240
241
242TRACE_EVENT(handshake_complete,
243	TP_PROTO(
244		const struct net *net,
245		const struct handshake_req *req,
246		const struct sock *sk,
247		int status
248	),
249	TP_ARGS(net, req, sk, status),
250	TP_STRUCT__entry(
251		__field(const void *, req)
252		__field(const void *, sk)
253		__field(int, status)
254		__field(unsigned int, netns_ino)
255	),
256	TP_fast_assign(
257		__entry->req = req;
258		__entry->sk = sk;
259		__entry->status = status;
260		__entry->netns_ino = net->ns.inum;
261	),
262	TP_printk("req=%p sk=%p status=%d",
263		__entry->req, __entry->sk, __entry->status
264	)
265);
266
267/*
268 * Netlink events
269 */
270
271DEFINE_HANDSHAKE_ERROR(handshake_notify_err);
272DEFINE_HANDSHAKE_FD_EVENT(handshake_cmd_accept);
273DEFINE_HANDSHAKE_ERROR(handshake_cmd_accept_err);
274DEFINE_HANDSHAKE_FD_EVENT(handshake_cmd_done);
275DEFINE_HANDSHAKE_ERROR(handshake_cmd_done_err);
276
277/*
278 * TLS Record events
279 */
280
281TRACE_EVENT(tls_contenttype,
282	TP_PROTO(
283		const struct sock *sk,
284		unsigned char type
285	),
286	TP_ARGS(sk, type),
287	TP_STRUCT__entry(
288		/* sockaddr_in6 is always bigger than sockaddr_in */
289		__array(__u8, saddr, sizeof(struct sockaddr_in6))
290		__array(__u8, daddr, sizeof(struct sockaddr_in6))
291		__field(unsigned int, netns_ino)
292		__field(unsigned long, type)
293	),
294	TP_fast_assign(
295		const struct inet_sock *inet = inet_sk(sk);
296
297		memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
298		memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
299		TP_STORE_ADDR_PORTS(__entry, inet, sk);
300
301		__entry->netns_ino = sock_net(sk)->ns.inum;
302		__entry->type = type;
303	),
304	TP_printk("src=%pISpc dest=%pISpc %s",
305		__entry->saddr, __entry->daddr,
306		show_tls_content_type(__entry->type)
307	)
308);
309
310/*
311 * TLS Alert events
312 */
313
314DEFINE_HANDSHAKE_ALERT(tls_alert_send);
315DEFINE_HANDSHAKE_ALERT(tls_alert_recv);
316
317#endif /* _TRACE_HANDSHAKE_H */
318
319#include <trace/define_trace.h>
320