| /* SPDX-License-Identifier: GPL-2.0 */ | 
 | #undef TRACE_SYSTEM | 
 | #define TRACE_SYSTEM handshake | 
 |  | 
 | #if !defined(_TRACE_HANDSHAKE_H) || defined(TRACE_HEADER_MULTI_READ) | 
 | #define _TRACE_HANDSHAKE_H | 
 |  | 
 | #include <linux/net.h> | 
 | #include <net/tls_prot.h> | 
 | #include <linux/tracepoint.h> | 
 | #include <trace/events/net_probe_common.h> | 
 |  | 
 | #define TLS_RECORD_TYPE_LIST \ | 
 | 	record_type(CHANGE_CIPHER_SPEC) \ | 
 | 	record_type(ALERT) \ | 
 | 	record_type(HANDSHAKE) \ | 
 | 	record_type(DATA) \ | 
 | 	record_type(HEARTBEAT) \ | 
 | 	record_type(TLS12_CID) \ | 
 | 	record_type_end(ACK) | 
 |  | 
 | #undef record_type | 
 | #undef record_type_end | 
 | #define record_type(x)		TRACE_DEFINE_ENUM(TLS_RECORD_TYPE_##x); | 
 | #define record_type_end(x)	TRACE_DEFINE_ENUM(TLS_RECORD_TYPE_##x); | 
 |  | 
 | TLS_RECORD_TYPE_LIST | 
 |  | 
 | #undef record_type | 
 | #undef record_type_end | 
 | #define record_type(x)		{ TLS_RECORD_TYPE_##x, #x }, | 
 | #define record_type_end(x)	{ TLS_RECORD_TYPE_##x, #x } | 
 |  | 
 | #define show_tls_content_type(type) \ | 
 | 	__print_symbolic(type, TLS_RECORD_TYPE_LIST) | 
 |  | 
 | TRACE_DEFINE_ENUM(TLS_ALERT_LEVEL_WARNING); | 
 | TRACE_DEFINE_ENUM(TLS_ALERT_LEVEL_FATAL); | 
 |  | 
 | #define show_tls_alert_level(level) \ | 
 | 	__print_symbolic(level, \ | 
 | 		{ TLS_ALERT_LEVEL_WARNING,	"Warning" }, \ | 
 | 		{ TLS_ALERT_LEVEL_FATAL,	"Fatal" }) | 
 |  | 
 | #define TLS_ALERT_DESCRIPTION_LIST \ | 
 | 	alert_description(CLOSE_NOTIFY) \ | 
 | 	alert_description(UNEXPECTED_MESSAGE) \ | 
 | 	alert_description(BAD_RECORD_MAC) \ | 
 | 	alert_description(RECORD_OVERFLOW) \ | 
 | 	alert_description(HANDSHAKE_FAILURE) \ | 
 | 	alert_description(BAD_CERTIFICATE) \ | 
 | 	alert_description(UNSUPPORTED_CERTIFICATE) \ | 
 | 	alert_description(CERTIFICATE_REVOKED) \ | 
 | 	alert_description(CERTIFICATE_EXPIRED) \ | 
 | 	alert_description(CERTIFICATE_UNKNOWN) \ | 
 | 	alert_description(ILLEGAL_PARAMETER) \ | 
 | 	alert_description(UNKNOWN_CA) \ | 
 | 	alert_description(ACCESS_DENIED) \ | 
 | 	alert_description(DECODE_ERROR) \ | 
 | 	alert_description(DECRYPT_ERROR) \ | 
 | 	alert_description(TOO_MANY_CIDS_REQUESTED) \ | 
 | 	alert_description(PROTOCOL_VERSION) \ | 
 | 	alert_description(INSUFFICIENT_SECURITY) \ | 
 | 	alert_description(INTERNAL_ERROR) \ | 
 | 	alert_description(INAPPROPRIATE_FALLBACK) \ | 
 | 	alert_description(USER_CANCELED) \ | 
 | 	alert_description(MISSING_EXTENSION) \ | 
 | 	alert_description(UNSUPPORTED_EXTENSION) \ | 
 | 	alert_description(UNRECOGNIZED_NAME) \ | 
 | 	alert_description(BAD_CERTIFICATE_STATUS_RESPONSE) \ | 
 | 	alert_description(UNKNOWN_PSK_IDENTITY) \ | 
 | 	alert_description(CERTIFICATE_REQUIRED) \ | 
 | 	alert_description_end(NO_APPLICATION_PROTOCOL) | 
 |  | 
 | #undef alert_description | 
 | #undef alert_description_end | 
 | #define alert_description(x)		TRACE_DEFINE_ENUM(TLS_ALERT_DESC_##x); | 
 | #define alert_description_end(x)	TRACE_DEFINE_ENUM(TLS_ALERT_DESC_##x); | 
 |  | 
 | TLS_ALERT_DESCRIPTION_LIST | 
 |  | 
 | #undef alert_description | 
 | #undef alert_description_end | 
 | #define alert_description(x)		{ TLS_ALERT_DESC_##x, #x }, | 
 | #define alert_description_end(x)	{ TLS_ALERT_DESC_##x, #x } | 
 |  | 
 | #define show_tls_alert_description(desc) \ | 
 | 	__print_symbolic(desc, TLS_ALERT_DESCRIPTION_LIST) | 
 |  | 
 | DECLARE_EVENT_CLASS(handshake_event_class, | 
 | 	TP_PROTO( | 
 | 		const struct net *net, | 
 | 		const struct handshake_req *req, | 
 | 		const struct sock *sk | 
 | 	), | 
 | 	TP_ARGS(net, req, sk), | 
 | 	TP_STRUCT__entry( | 
 | 		__field(const void *, req) | 
 | 		__field(const void *, sk) | 
 | 		__field(unsigned int, netns_ino) | 
 | 	), | 
 | 	TP_fast_assign( | 
 | 		__entry->req = req; | 
 | 		__entry->sk = sk; | 
 | 		__entry->netns_ino = net->ns.inum; | 
 | 	), | 
 | 	TP_printk("req=%p sk=%p", | 
 | 		__entry->req, __entry->sk | 
 | 	) | 
 | ); | 
 | #define DEFINE_HANDSHAKE_EVENT(name)				\ | 
 | 	DEFINE_EVENT(handshake_event_class, name,		\ | 
 | 		TP_PROTO(					\ | 
 | 			const struct net *net,			\ | 
 | 			const struct handshake_req *req,	\ | 
 | 			const struct sock *sk			\ | 
 | 		),						\ | 
 | 		TP_ARGS(net, req, sk)) | 
 |  | 
 | DECLARE_EVENT_CLASS(handshake_fd_class, | 
 | 	TP_PROTO( | 
 | 		const struct net *net, | 
 | 		const struct handshake_req *req, | 
 | 		const struct sock *sk, | 
 | 		int fd | 
 | 	), | 
 | 	TP_ARGS(net, req, sk, fd), | 
 | 	TP_STRUCT__entry( | 
 | 		__field(const void *, req) | 
 | 		__field(const void *, sk) | 
 | 		__field(int, fd) | 
 | 		__field(unsigned int, netns_ino) | 
 | 	), | 
 | 	TP_fast_assign( | 
 | 		__entry->req = req; | 
 | 		__entry->sk = req->hr_sk; | 
 | 		__entry->fd = fd; | 
 | 		__entry->netns_ino = net->ns.inum; | 
 | 	), | 
 | 	TP_printk("req=%p sk=%p fd=%d", | 
 | 		__entry->req, __entry->sk, __entry->fd | 
 | 	) | 
 | ); | 
 | #define DEFINE_HANDSHAKE_FD_EVENT(name)				\ | 
 | 	DEFINE_EVENT(handshake_fd_class, name,			\ | 
 | 		TP_PROTO(					\ | 
 | 			const struct net *net,			\ | 
 | 			const struct handshake_req *req,	\ | 
 | 			const struct sock *sk,			\ | 
 | 			int fd					\ | 
 | 		),						\ | 
 | 		TP_ARGS(net, req, sk, fd)) | 
 |  | 
 | DECLARE_EVENT_CLASS(handshake_error_class, | 
 | 	TP_PROTO( | 
 | 		const struct net *net, | 
 | 		const struct handshake_req *req, | 
 | 		const struct sock *sk, | 
 | 		int err | 
 | 	), | 
 | 	TP_ARGS(net, req, sk, err), | 
 | 	TP_STRUCT__entry( | 
 | 		__field(const void *, req) | 
 | 		__field(const void *, sk) | 
 | 		__field(int, err) | 
 | 		__field(unsigned int, netns_ino) | 
 | 	), | 
 | 	TP_fast_assign( | 
 | 		__entry->req = req; | 
 | 		__entry->sk = sk; | 
 | 		__entry->err = err; | 
 | 		__entry->netns_ino = net->ns.inum; | 
 | 	), | 
 | 	TP_printk("req=%p sk=%p err=%d", | 
 | 		__entry->req, __entry->sk, __entry->err | 
 | 	) | 
 | ); | 
 | #define DEFINE_HANDSHAKE_ERROR(name)				\ | 
 | 	DEFINE_EVENT(handshake_error_class, name,		\ | 
 | 		TP_PROTO(					\ | 
 | 			const struct net *net,			\ | 
 | 			const struct handshake_req *req,	\ | 
 | 			const struct sock *sk,			\ | 
 | 			int err					\ | 
 | 		),						\ | 
 | 		TP_ARGS(net, req, sk, err)) | 
 |  | 
 | DECLARE_EVENT_CLASS(handshake_alert_class, | 
 | 	TP_PROTO( | 
 | 		const struct sock *sk, | 
 | 		unsigned char level, | 
 | 		unsigned char description | 
 | 	), | 
 | 	TP_ARGS(sk, level, description), | 
 | 	TP_STRUCT__entry( | 
 | 		/* sockaddr_in6 is always bigger than sockaddr_in */ | 
 | 		__array(__u8, saddr, sizeof(struct sockaddr_in6)) | 
 | 		__array(__u8, daddr, sizeof(struct sockaddr_in6)) | 
 | 		__field(unsigned int, netns_ino) | 
 | 		__field(unsigned long, level) | 
 | 		__field(unsigned long, description) | 
 | 	), | 
 | 	TP_fast_assign( | 
 | 		const struct inet_sock *inet = inet_sk(sk); | 
 |  | 
 | 		memset(__entry->saddr, 0, sizeof(struct sockaddr_in6)); | 
 | 		memset(__entry->daddr, 0, sizeof(struct sockaddr_in6)); | 
 | 		TP_STORE_ADDR_PORTS(__entry, inet, sk); | 
 |  | 
 | 		__entry->netns_ino = sock_net(sk)->ns.inum; | 
 | 		__entry->level = level; | 
 | 		__entry->description = description; | 
 | 	), | 
 | 	TP_printk("src=%pISpc dest=%pISpc %s: %s", | 
 | 		__entry->saddr, __entry->daddr, | 
 | 		show_tls_alert_level(__entry->level), | 
 | 		show_tls_alert_description(__entry->description) | 
 | 	) | 
 | ); | 
 | #define DEFINE_HANDSHAKE_ALERT(name)				\ | 
 | 	DEFINE_EVENT(handshake_alert_class, name,		\ | 
 | 		TP_PROTO(					\ | 
 | 			const struct sock *sk,			\ | 
 | 			unsigned char level,			\ | 
 | 			unsigned char description		\ | 
 | 		),						\ | 
 | 		TP_ARGS(sk, level, description)) | 
 |  | 
 |  | 
 | /* | 
 |  * Request lifetime events | 
 |  */ | 
 |  | 
 | DEFINE_HANDSHAKE_EVENT(handshake_submit); | 
 | DEFINE_HANDSHAKE_ERROR(handshake_submit_err); | 
 | DEFINE_HANDSHAKE_EVENT(handshake_cancel); | 
 | DEFINE_HANDSHAKE_EVENT(handshake_cancel_none); | 
 | DEFINE_HANDSHAKE_EVENT(handshake_cancel_busy); | 
 | DEFINE_HANDSHAKE_EVENT(handshake_destruct); | 
 |  | 
 |  | 
 | TRACE_EVENT(handshake_complete, | 
 | 	TP_PROTO( | 
 | 		const struct net *net, | 
 | 		const struct handshake_req *req, | 
 | 		const struct sock *sk, | 
 | 		int status | 
 | 	), | 
 | 	TP_ARGS(net, req, sk, status), | 
 | 	TP_STRUCT__entry( | 
 | 		__field(const void *, req) | 
 | 		__field(const void *, sk) | 
 | 		__field(int, status) | 
 | 		__field(unsigned int, netns_ino) | 
 | 	), | 
 | 	TP_fast_assign( | 
 | 		__entry->req = req; | 
 | 		__entry->sk = sk; | 
 | 		__entry->status = status; | 
 | 		__entry->netns_ino = net->ns.inum; | 
 | 	), | 
 | 	TP_printk("req=%p sk=%p status=%d", | 
 | 		__entry->req, __entry->sk, __entry->status | 
 | 	) | 
 | ); | 
 |  | 
 | /* | 
 |  * Netlink events | 
 |  */ | 
 |  | 
 | DEFINE_HANDSHAKE_ERROR(handshake_notify_err); | 
 | DEFINE_HANDSHAKE_FD_EVENT(handshake_cmd_accept); | 
 | DEFINE_HANDSHAKE_ERROR(handshake_cmd_accept_err); | 
 | DEFINE_HANDSHAKE_FD_EVENT(handshake_cmd_done); | 
 | DEFINE_HANDSHAKE_ERROR(handshake_cmd_done_err); | 
 |  | 
 | /* | 
 |  * TLS Record events | 
 |  */ | 
 |  | 
 | TRACE_EVENT(tls_contenttype, | 
 | 	TP_PROTO( | 
 | 		const struct sock *sk, | 
 | 		unsigned char type | 
 | 	), | 
 | 	TP_ARGS(sk, type), | 
 | 	TP_STRUCT__entry( | 
 | 		/* sockaddr_in6 is always bigger than sockaddr_in */ | 
 | 		__array(__u8, saddr, sizeof(struct sockaddr_in6)) | 
 | 		__array(__u8, daddr, sizeof(struct sockaddr_in6)) | 
 | 		__field(unsigned int, netns_ino) | 
 | 		__field(unsigned long, type) | 
 | 	), | 
 | 	TP_fast_assign( | 
 | 		const struct inet_sock *inet = inet_sk(sk); | 
 |  | 
 | 		memset(__entry->saddr, 0, sizeof(struct sockaddr_in6)); | 
 | 		memset(__entry->daddr, 0, sizeof(struct sockaddr_in6)); | 
 | 		TP_STORE_ADDR_PORTS(__entry, inet, sk); | 
 |  | 
 | 		__entry->netns_ino = sock_net(sk)->ns.inum; | 
 | 		__entry->type = type; | 
 | 	), | 
 | 	TP_printk("src=%pISpc dest=%pISpc %s", | 
 | 		__entry->saddr, __entry->daddr, | 
 | 		show_tls_content_type(__entry->type) | 
 | 	) | 
 | ); | 
 |  | 
 | /* | 
 |  * TLS Alert events | 
 |  */ | 
 |  | 
 | DEFINE_HANDSHAKE_ALERT(tls_alert_send); | 
 | DEFINE_HANDSHAKE_ALERT(tls_alert_recv); | 
 |  | 
 | #endif /* _TRACE_HANDSHAKE_H */ | 
 |  | 
 | #include <trace/define_trace.h> |