1*33de042dSApple OSS Distributions /*
2*33de042dSApple OSS Distributions * Copyright (c) 2018-2023 Apple Inc. All rights reserved.
3*33de042dSApple OSS Distributions *
4*33de042dSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*33de042dSApple OSS Distributions *
6*33de042dSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code
7*33de042dSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License
8*33de042dSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in
9*33de042dSApple OSS Distributions * compliance with the License. The rights granted to you under the License
10*33de042dSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of,
11*33de042dSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to
12*33de042dSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any
13*33de042dSApple OSS Distributions * terms of an Apple operating system software license agreement.
14*33de042dSApple OSS Distributions *
15*33de042dSApple OSS Distributions * Please obtain a copy of the License at
16*33de042dSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*33de042dSApple OSS Distributions *
18*33de042dSApple OSS Distributions * The Original Code and all software distributed under the License are
19*33de042dSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*33de042dSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*33de042dSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*33de042dSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*33de042dSApple OSS Distributions * Please see the License for the specific language governing rights and
24*33de042dSApple OSS Distributions * limitations under the License.
25*33de042dSApple OSS Distributions *
26*33de042dSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*33de042dSApple OSS Distributions */
28*33de042dSApple OSS Distributions
29*33de042dSApple OSS Distributions
30*33de042dSApple OSS Distributions #ifndef _NETINET_TCP_LOG_H_
31*33de042dSApple OSS Distributions #define _NETINET_TCP_LOG_H_
32*33de042dSApple OSS Distributions
33*33de042dSApple OSS Distributions #ifdef PRIVATE
34*33de042dSApple OSS Distributions
35*33de042dSApple OSS Distributions #define TCP_ENABLE_FLAG_LIST \
36*33de042dSApple OSS Distributions X(TLEF_CONNECTION, 0x00000001, connection) \
37*33de042dSApple OSS Distributions X(TLEF_RTT, 0x00000002, rtt) \
38*33de042dSApple OSS Distributions X(TLEF_KEEP_ALIVE, 0x00000004, ka) \
39*33de042dSApple OSS Distributions X(TLEF_LOG, 0x00000008, log) \
40*33de042dSApple OSS Distributions X(TLEF_DST_LOOPBACK, 0x00000010, loop) \
41*33de042dSApple OSS Distributions X(TLEF_DST_LOCAL, 0x00000020, local) \
42*33de042dSApple OSS Distributions X(TLEF_DST_GW, 0x00000040, gw) \
43*33de042dSApple OSS Distributions X(TLEF_THF_SYN, 0x00000100, syn) \
44*33de042dSApple OSS Distributions X(TLEF_THF_FIN, 0x00000200, fin) \
45*33de042dSApple OSS Distributions X(TLEF_THF_RST, 0x00000400, rst) \
46*33de042dSApple OSS Distributions X(TLEF_DROP_NECP, 0x00001000, dropnecp) \
47*33de042dSApple OSS Distributions X(TLEF_DROP_PCB, 0x00002000, droppcb) \
48*33de042dSApple OSS Distributions X(TLEF_DROP_PKT, 0x00004000, droppkt) \
49*33de042dSApple OSS Distributions X(TLEF_FSW_FLOW, 0x00008000, fswflow) \
50*33de042dSApple OSS Distributions X(TLEF_STATE, 0x00010000, state) \
51*33de042dSApple OSS Distributions X(TLEF_SYN_RXMT, 0x00020000, synrxmt) \
52*33de042dSApple OSS Distributions X(TLEF_OUTPUT, 0x00040000, output) \
53*33de042dSApple OSS Distributions X(TLEF_BIND, 0x00080000, bind)
54*33de042dSApple OSS Distributions
55*33de042dSApple OSS Distributions /*
56*33de042dSApple OSS Distributions * Flag values for tcp_log_enabled
57*33de042dSApple OSS Distributions */
58*33de042dSApple OSS Distributions enum {
59*33de042dSApple OSS Distributions #define X(name, value, ...) name = value,
60*33de042dSApple OSS Distributions TCP_ENABLE_FLAG_LIST
61*33de042dSApple OSS Distributions #undef X
62*33de042dSApple OSS Distributions };
63*33de042dSApple OSS Distributions
64*33de042dSApple OSS Distributions #endif /* PRIVATE */
65*33de042dSApple OSS Distributions
66*33de042dSApple OSS Distributions #ifdef BSD_KERNEL_PRIVATE
67*33de042dSApple OSS Distributions
68*33de042dSApple OSS Distributions #include <sys/param.h>
69*33de042dSApple OSS Distributions #include <sys/systm.h>
70*33de042dSApple OSS Distributions
71*33de042dSApple OSS Distributions #include <netinet/in.h>
72*33de042dSApple OSS Distributions #include <netinet/in_systm.h>
73*33de042dSApple OSS Distributions #include <netinet/in_pcb.h>
74*33de042dSApple OSS Distributions #include <netinet6/in6_pcb.h>
75*33de042dSApple OSS Distributions
76*33de042dSApple OSS Distributions #include <netinet/tcp.h>
77*33de042dSApple OSS Distributions #include <netinet/tcp_var.h>
78*33de042dSApple OSS Distributions #include <netinet6/tcp6_var.h>
79*33de042dSApple OSS Distributions
80*33de042dSApple OSS Distributions #include <netinet/inp_log.h>
81*33de042dSApple OSS Distributions
82*33de042dSApple OSS Distributions #include <net/net_log_common.h>
83*33de042dSApple OSS Distributions
84*33de042dSApple OSS Distributions #include <os/log.h>
85*33de042dSApple OSS Distributions
86*33de042dSApple OSS Distributions #include <stdbool.h>
87*33de042dSApple OSS Distributions
88*33de042dSApple OSS Distributions extern os_log_t tcp_mpkl_log_object;
89*33de042dSApple OSS Distributions extern uint32_t tcp_log_enable_flags;
90*33de042dSApple OSS Distributions extern uint16_t tcp_log_port;
91*33de042dSApple OSS Distributions
92*33de042dSApple OSS Distributions #define TLEF_MASK_DST (TLEF_DST_LOOPBACK | TLEF_DST_LOCAL | TLEF_DST_GW)
93*33de042dSApple OSS Distributions
94*33de042dSApple OSS Distributions extern void tcp_log_connection_summary(struct tcpcb *tp);
95*33de042dSApple OSS Distributions extern void tcp_log_th_flags(void *hdr, struct tcphdr *th, struct tcpcb *tp, bool outgoing, struct ifnet *ifp);
96*33de042dSApple OSS Distributions extern void tcp_log_connection(struct tcpcb *tp, const char *event, int error);
97*33de042dSApple OSS Distributions extern void tcp_log_listen(struct tcpcb *tp, int error);
98*33de042dSApple OSS Distributions extern void tcp_log_drop_pcb(void *hdr, struct tcphdr *th, struct tcpcb *tp, bool outgoing, const char *reason);
99*33de042dSApple OSS Distributions extern void tcp_log_drop_pkt(void *hdr, struct tcphdr *th, struct ifnet *ifp, const char *reason);
100*33de042dSApple OSS Distributions extern void tcp_log_rtt_info(const char *func_name, int line_no, struct tcpcb *tp);
101*33de042dSApple OSS Distributions extern void tcp_log_rt_rtt(const char *func_name, int line_no, struct tcpcb *tp, struct rtentry *rt);
102*33de042dSApple OSS Distributions extern void tcp_log_rtt_change(const char *func_name, int line_no, struct tcpcb *tp, int old_srtt, int old_rttvar);
103*33de042dSApple OSS Distributions extern void tcp_log_keepalive(const char *func_name, int line_no, struct tcpcb *tp, int32_t idle_time);
104*33de042dSApple OSS Distributions extern void tcp_log_message(const char *func_name, int line_no, struct tcpcb *tp, const char *format, ...) __printflike(4, 5);
105*33de042dSApple OSS Distributions extern void tcp_log_fsw_flow(const char *func_name, int line_no, struct tcpcb *tp, const char *format, ...) __printflike(4, 5);
106*33de042dSApple OSS Distributions extern void tcp_log_state_change(struct tcpcb *tp, int new_state);
107*33de042dSApple OSS Distributions extern void tcp_log_output(const char *func_name, int line_no, struct tcpcb *tp, const char *format, ...) __printflike(4, 5);
108*33de042dSApple OSS Distributions extern void tcp_log_bind(struct inpcb *inp, const char *event, int error);
109*33de042dSApple OSS Distributions
110*33de042dSApple OSS Distributions static inline bool
tcp_is_log_enabled(struct tcpcb * tp,uint32_t req_flags)111*33de042dSApple OSS Distributions tcp_is_log_enabled(struct tcpcb *tp, uint32_t req_flags)
112*33de042dSApple OSS Distributions {
113*33de042dSApple OSS Distributions struct inpcb *inp;
114*33de042dSApple OSS Distributions
115*33de042dSApple OSS Distributions if (tp == NULL || tp->t_inpcb == NULL) {
116*33de042dSApple OSS Distributions return false;
117*33de042dSApple OSS Distributions }
118*33de042dSApple OSS Distributions inp = tp->t_inpcb;
119*33de042dSApple OSS Distributions if (tcp_log_port > 0 &&
120*33de042dSApple OSS Distributions ntohs(inp->inp_lport) != tcp_log_port &&
121*33de042dSApple OSS Distributions ntohs(tp->t_inpcb->inp_fport) != tcp_log_port) {
122*33de042dSApple OSS Distributions return false;
123*33de042dSApple OSS Distributions }
124*33de042dSApple OSS Distributions
125*33de042dSApple OSS Distributions /*
126*33de042dSApple OSS Distributions * First find out the kind of destination
127*33de042dSApple OSS Distributions */
128*33de042dSApple OSS Distributions if (inp->inp_log_flags == 0) {
129*33de042dSApple OSS Distributions if (tp->t_inpcb->inp_vflag & INP_IPV6) {
130*33de042dSApple OSS Distributions if (IN6_IS_ADDR_LOOPBACK(&tp->t_inpcb->in6p_laddr) ||
131*33de042dSApple OSS Distributions IN6_IS_ADDR_LOOPBACK(&tp->t_inpcb->in6p_faddr)) {
132*33de042dSApple OSS Distributions inp->inp_log_flags |= TLEF_DST_LOOPBACK;
133*33de042dSApple OSS Distributions }
134*33de042dSApple OSS Distributions } else {
135*33de042dSApple OSS Distributions if (ntohl(tp->t_inpcb->inp_laddr.s_addr) == INADDR_LOOPBACK ||
136*33de042dSApple OSS Distributions ntohl(tp->t_inpcb->inp_faddr.s_addr) == INADDR_LOOPBACK) {
137*33de042dSApple OSS Distributions inp->inp_log_flags |= TLEF_DST_LOOPBACK;
138*33de042dSApple OSS Distributions }
139*33de042dSApple OSS Distributions }
140*33de042dSApple OSS Distributions if (inp->inp_log_flags == 0) {
141*33de042dSApple OSS Distributions if (tp->t_flags & TF_LOCAL) {
142*33de042dSApple OSS Distributions inp->inp_log_flags |= TLEF_DST_LOCAL;
143*33de042dSApple OSS Distributions } else {
144*33de042dSApple OSS Distributions inp->inp_log_flags |= TLEF_DST_GW;
145*33de042dSApple OSS Distributions }
146*33de042dSApple OSS Distributions }
147*33de042dSApple OSS Distributions }
148*33de042dSApple OSS Distributions /*
149*33de042dSApple OSS Distributions * Check separately the destination flags that are per TCP connection
150*33de042dSApple OSS Distributions * and the other functional flags that are global
151*33de042dSApple OSS Distributions */
152*33de042dSApple OSS Distributions return (inp->inp_log_flags & tcp_log_enable_flags & TLEF_MASK_DST) &&
153*33de042dSApple OSS Distributions (tcp_log_enable_flags & (req_flags & ~TLEF_MASK_DST));
154*33de042dSApple OSS Distributions }
155*33de042dSApple OSS Distributions
156*33de042dSApple OSS Distributions #define TCP_LOG_RTT_INFO(tp) if (tcp_is_log_enabled(tp, TLEF_RTT)) \
157*33de042dSApple OSS Distributions tcp_log_rtt_info(__func__, __LINE__, (tp))
158*33de042dSApple OSS Distributions
159*33de042dSApple OSS Distributions #define TCP_LOG_RTM_RTT(tp, rt) if (tcp_is_log_enabled(tp, TLEF_RTT)) \
160*33de042dSApple OSS Distributions tcp_log_rt_rtt(__func__, __LINE__, (tp), (rt))
161*33de042dSApple OSS Distributions
162*33de042dSApple OSS Distributions #define TCP_LOG_RTT_CHANGE(tp, old_srtt, old_rttvar) if (tcp_is_log_enabled(tp, TLEF_RTT)) \
163*33de042dSApple OSS Distributions tcp_log_rtt_change(__func__, __LINE__, (tp), (old_srtt), (old_rttvar))
164*33de042dSApple OSS Distributions
165*33de042dSApple OSS Distributions #define TCP_LOG_KEEP_ALIVE(tp, idle_time) if (tcp_is_log_enabled(tp, TLEF_KEEP_ALIVE)) \
166*33de042dSApple OSS Distributions tcp_log_keepalive(__func__, __LINE__, (tp), (idle_time))
167*33de042dSApple OSS Distributions
168*33de042dSApple OSS Distributions #define TCP_LOG_CONNECT(tp, outgoing, error) if (tcp_is_log_enabled(tp, TLEF_CONNECTION)) \
169*33de042dSApple OSS Distributions tcp_log_connection((tp), __unsafe_forge_null_terminated(const char *, ((outgoing) ? "connect outgoing" : "connect incoming")), (error))
170*33de042dSApple OSS Distributions
171*33de042dSApple OSS Distributions #define TCP_LOG_CONNECTED(tp, error) if (tcp_is_log_enabled(tp, TLEF_CONNECTION)) \
172*33de042dSApple OSS Distributions tcp_log_connection((tp), "connected", (error))
173*33de042dSApple OSS Distributions
174*33de042dSApple OSS Distributions #define TCP_LOG_LISTEN(tp, error) if (tcp_is_log_enabled(tp, TLEF_CONNECTION)) \
175*33de042dSApple OSS Distributions tcp_log_listen((tp), (error))
176*33de042dSApple OSS Distributions
177*33de042dSApple OSS Distributions #define TCP_LOG_ACCEPT(tp, error) if (tcp_is_log_enabled(tp, TLEF_CONNECTION)) \
178*33de042dSApple OSS Distributions tcp_log_connection((tp), "accept", (error))
179*33de042dSApple OSS Distributions
180*33de042dSApple OSS Distributions #define TCP_LOG_CONNECTION_SUMMARY(tp) if (tcp_is_log_enabled(tp, TLEF_CONNECTION)) \
181*33de042dSApple OSS Distributions tcp_log_connection_summary((tp))
182*33de042dSApple OSS Distributions
183*33de042dSApple OSS Distributions #define TCP_LOG_DROP_NECP(hdr, th, tp, outgoing) if (tcp_is_log_enabled(tp, TLEF_DROP_NECP)) \
184*33de042dSApple OSS Distributions tcp_log_drop_pcb((hdr), (th), (tp), (outgoing), "NECP")
185*33de042dSApple OSS Distributions
186*33de042dSApple OSS Distributions #define TCP_LOG_DROP_PCB(hdr, th, tp, outgoing, reason) if (tcp_is_log_enabled(tp, TLEF_DROP_PCB)) \
187*33de042dSApple OSS Distributions tcp_log_drop_pcb((hdr), (th), (tp), (outgoing), reason)
188*33de042dSApple OSS Distributions
189*33de042dSApple OSS Distributions #define TCP_LOG_TH_FLAGS(hdr, th, tp, outgoing, ifp) \
190*33de042dSApple OSS Distributions if ((th) != NULL && ((th)->th_flags & (TH_SYN|TH_FIN|TH_RST))) \
191*33de042dSApple OSS Distributions tcp_log_th_flags((hdr), (th), (tp), (outgoing), (ifp))
192*33de042dSApple OSS Distributions
193*33de042dSApple OSS Distributions #define TCP_LOG_DROP_PKT(hdr, th, ifp, reason) \
194*33de042dSApple OSS Distributions if ((th) != NULL && ((th->th_flags) & (TH_SYN|TH_FIN|TH_RST)) && \
195*33de042dSApple OSS Distributions (tcp_log_enable_flags & TLEF_DROP_PKT)) \
196*33de042dSApple OSS Distributions tcp_log_drop_pkt((hdr), (th), (ifp), (reason))
197*33de042dSApple OSS Distributions
198*33de042dSApple OSS Distributions #define TCP_LOG_FSW_FLOW(tp, format, ...) if (tcp_is_log_enabled(tp, TLEF_FSW_FLOW)) \
199*33de042dSApple OSS Distributions tcp_log_fsw_flow(__func__, __LINE__, (tp), format, ##__VA_ARGS__)
200*33de042dSApple OSS Distributions
201*33de042dSApple OSS Distributions #define TCP_LOG(tp, format, ...) if (tcp_is_log_enabled(tp, TLEF_LOG)) \
202*33de042dSApple OSS Distributions tcp_log_message(__func__, __LINE__, tp, format, ## __VA_ARGS__)
203*33de042dSApple OSS Distributions
204*33de042dSApple OSS Distributions #define TCP_LOG_STATE(tp, new_state) if (tcp_is_log_enabled(tp, TLEF_STATE)) \
205*33de042dSApple OSS Distributions tcp_log_state_change((tp), (new_state))
206*33de042dSApple OSS Distributions
207*33de042dSApple OSS Distributions #define TCP_LOG_OUTPUT(tp, format, ...) if (tcp_is_log_enabled(tp, TLEF_OUTPUT)) \
208*33de042dSApple OSS Distributions tcp_log_output(__func__, __LINE__, tp, format, ## __VA_ARGS__)
209*33de042dSApple OSS Distributions
210*33de042dSApple OSS Distributions #define TCP_LOG_BIND(tp, error) if (tcp_is_log_enabled(tp, TLEF_BIND)) \
211*33de042dSApple OSS Distributions tcp_log_connection((tp), "bind", (error))
212*33de042dSApple OSS Distributions
213*33de042dSApple OSS Distributions #endif /* BSD_KERNEL_PRIVATE */
214*33de042dSApple OSS Distributions
215*33de042dSApple OSS Distributions #endif /* _NETINET_TCP_LOG_H_ */
216