handshake.h 8.2 KB

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