320 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#undef TRACE_SYSTEM3#define TRACE_SYSTEM handshake4 5#if !defined(_TRACE_HANDSHAKE_H) || defined(TRACE_HEADER_MULTI_READ)6#define _TRACE_HANDSHAKE_H7 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_type23#undef record_type_end24#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_LIST28 29#undef record_type30#undef record_type_end31#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_description76#undef alert_description_end77#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_LIST81 82#undef alert_description83#undef alert_description_end84#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 *sk95 ),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->sk109 )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 fd126 ),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->fd142 )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 err160 ),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->err176 )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 description193 ),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 events232 */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 status248 ),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->status264 )265);266 267/*268 * Netlink events269 */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 events279 */280 281TRACE_EVENT(tls_contenttype,282 TP_PROTO(283 const struct sock *sk,284 unsigned char type285 ),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 events312 */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