| /* 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> |