1 #ifndef __DEBUG_H_
2 #define __DEBUG_H_
3 
4 #ifdef DBGMSG
5 #define _GNU_SOURCE
6 #include <sched.h>
7 #endif
8 #include <errno.h>
9 #include <stdio.h>
10 #include <assert.h>
11 #include "mtcp.h"
12 #include "tcp_in.h"
13 
14 #ifdef DBGTEMP
15 
16 #define TRACE_TEMP(f, m...) { \
17 	fprintf(stderr, "[CPU %d][%10s:%4d] " f, mtcp->ctx->cpu, 		\
18 			__FUNCTION__, __LINE__, ##m);	\
19 	}
20 
21 #else
22 
23 #define TRACE_TEMP(f, m...)	(void)0
24 
25 #endif /* DBGTEMP*/
26 
27 #ifdef DBGERR
28 
29 #define TRACE_ERROR(f, m...) { \
30 	fprintf(stderr, "[%10s:%4d] " f, __FUNCTION__, __LINE__, ##m);	\
31 	}
32 
33 #else
34 
35 #define TRACE_ERROR(f, m...)	(void)0
36 
37 #endif /* DBGERR */
38 
39 #ifdef DBGCERR
40 
41 #define CTRACE_ERROR(f, m...) { \
42 	fprintf(stderr, "[CPU %d][%10s:%4d] " f, mtcp->ctx->cpu, __FUNCTION__, __LINE__, ##m);	\
43 	}
44 
45 #else
46 
47 #define CTRACE_ERROR(f, m...)	(void)0
48 
49 #endif /* DBGERR */
50 
51 #ifdef DBGMSG
52 #define __PREPARE_DBGLOGGING()			\
53 	struct mtcp_context mctx = {		\
54 		.cpu = sched_getcpu(),		\
55 	};						\
56 							\
57 	mtcp_manager_t mtcp = GetMTCPManager(&mctx);
58 
59 #define TRACE_DBG(f, m...) {\
60 		(mtcp != NULL) ?			   \
61 			thread_printf(mtcp, mtcp->log_fp, "[%10s:%4d] "	\
62 				      f, __FUNCTION__, __LINE__, ##m) : \
63 			fprintf(stderr, "[CPU %d][%10s:%4d] " f, 0, __FUNCTION__, __LINE__, ##m); \
64 	}
65 
66 #else
67 
68 #define TRACE_DBG(f, m...)   (void)0
69 
70 #endif /* DBGMSG */
71 
72 #ifdef INFO
73 
74 #define TRACE_INFO(f, m...) {                                         \
75 	fprintf(stderr, "[%10s:%4d] " f,__FUNCTION__, __LINE__, ##m);    \
76     }
77 
78 #else
79 
80 #define TRACE_INFO(f, m...) (void)0
81 
82 #endif /* INFO */
83 
84 #define TRACE_CONFIG(f, m...) fprintf(stderr, f, ##m)
85 
86 #ifdef DBGLOG
87 #define TRACE_LOG(f, m...) TRACE_INFO(f, ##m)
88 #else
89 #define TRACE_LOG(f, m...) (void)0
90 #endif
91 
92 #ifdef MONITOR
93 #define TRACE_MONITOR(f, m...) TRACE_FUNC("MONITOR", f, ##m)
94 #else
95 #define TRACE_MONITOR(f, m...)   (void)0
96 #endif
97 
98 #ifdef STREAM
99 #define TRACE_STREAM(f, m...) TRACE_FUNC("STREAM", f, ##m)
100 #else
101 #define TRACE_STREAM(f, m...)   (void)0
102 #endif
103 
104 #ifdef STATE
105 #define TRACE_STATE(f, m...) TRACE_FUNC("STATE", f, ##m)
106 #else
107 #define TRACE_STATE(f, m...)   (void)0
108 #endif
109 
110 #ifdef SNDBUF
111 #define TRACE_SNDBUF(f, m...) TRACE_FUNC("SNDBUF", f, ##m)
112 #else
113 #define TRACE_SNDBUF(f, m...)   (void)0
114 #endif
115 
116 #ifdef RCVBUF
117 #define TRACE_RCVBUF(f, m...) TRACE_FUNC("RCVBUF", f, ##m)
118 #else
119 #define TRACE_RCVBUF(f, m...)   (void)0
120 #endif
121 
122 #ifdef CLWND
123 #define TRACE_CLWND(f, m...) TRACE_FUNC("CLWND", f, ##m)
124 #else
125 #define TRACE_CLWND(f, m...)   (void)0
126 #endif
127 
128 #ifdef LOSS
129 #define TRACE_LOSS(f, m...) TRACE_FUNC("LOSS", f, ##m)
130 #else
131 #define TRACE_LOSS(f, m...)   (void)0
132 #endif
133 
134 #ifdef SACK
135 #define TRACE_SACK(f, m...) TRACE_FUNC("SACK", f, ##m)
136 #else
137 #define TRACE_SACK(f, m...)   (void)0
138 #endif
139 
140 #ifdef TSTAMP
141 #define TRACE_TSTAMP(f, m...) TRACE_FUNC("TSTAMP", f, ##m)
142 #else
143 #define TRACE_TSTAMP(f, m...)   (void)0
144 #endif
145 
146 #ifdef RTT
147 #define TRACE_RTT(f, m...) TRACE_FUNC("RTT", f, ##m)
148 #else
149 #define TRACE_RTT(f, m...)   (void)0
150 #endif
151 
152 #ifdef RTO
153 #define TRACE_RTO(f, m...) TRACE_FUNC("RTO", f, ##m)
154 #else
155 #define TRACE_RTO(f, m...)   (void)0
156 #endif
157 
158 #ifdef CONG
159 #define TRACE_CONG(f, m...) TRACE_FUNC("CONG", f, ##m)
160 #else
161 #define TRACE_CONG(f, m...)   (void)0
162 #endif
163 
164 #ifdef EPOLL
165 #define TRACE_EPOLL(f, m...) TRACE_FUNC("EPOLL", f, ##m)
166 #else
167 #define TRACE_EPOLL(f, m...)   (void)0
168 #endif
169 
170 #ifdef FSTAT
171 #define TRACE_FSTAT(f, m...) TRACE_FUNC("FSTAT", f, ##m)
172 #else
173 #define TRACE_FSTAT(f, m...)   (void)0
174 #endif
175 
176 #ifdef APP
177 #define TRACE_APP(f, m...) TRACE_FUNC("APP", f, ##m)
178 #else
179 #define TRACE_APP(f, m...) (void)0
180 #endif
181 
182 #ifdef DBGFIN
183 #define TRACE_FIN(f, m...) TRACE_FUNC("FIN", f, ##m)
184 #else
185 #define TRACE_FIN(f, m...) (void)0
186 #endif
187 
188 #ifdef TSTAT
189 #define TRACE_TSTAT(f, m...) TRACE_FUNC("TSTAT", f, ##m)
190 #else
191 #define TRACE_TSTAT(f, m...) (void)0
192 #endif
193 
194 #ifdef LOOP
195 #define TRACE_LOOP(f, m...) TRACE_FUNC("LOOP", "ts: %u, "f, cur_ts, ##m)
196 #else
197 #define TRACE_LOOP(f, m...) (void)0
198 #endif
199 
200 #ifdef ROUND
201 #define TRACE_ROUND(f, m...) TRACE_FUNC("ROUND", f, ##m)
202 #else
203 #define TRACE_ROUND(f, m...) (void)0
204 #endif
205 
206 #ifdef SELECT
207 #define TRACE_SELECT(f, m...) TRACE_FUNC("SELECT", f, ##m)
208 #else
209 #define TRACE_SELECT(f, m...) (void)0
210 #endif
211 
212 #ifdef API
213 #define TRACE_API(f, m...) TRACE_FUNC("API", f, ##m)
214 #else
215 #define TRACE_API(f, m...) (void)0
216 #endif
217 
218 #ifdef DBGFUNC
219 
220 #define TRACE_FUNC(n, f, m...) {			     \
221 		(mtcp != NULL) ?			     \
222 			thread_printf(mtcp, mtcp->log_fp, "[%6s: %10s:%4d] " \
223 				      f, n, __FUNCTION__, __LINE__, ##m) : \
224 			fprintf(stderr, "[CPU %d][%10s:%4d] " f, 0, __FUNCTION__, __LINE__, ##m); \
225 	}
226 
227 #else
228 
229 #define TRACE_FUNC(f, m...) (void)0
230 
231 #endif /* DBGFUNC */
232 
233 void
234 DumpPacket(mtcp_manager_t mtcp, char *buf, int len, char *step, int ifindex);
235 
236 void
237 DumpIPPacket(mtcp_manager_t mtcp, const struct iphdr *iph, int len);
238 
239 void
240 DumpIPPacketToFile(FILE *fout, const struct iphdr *iph, int len);
241 
242 void
243 flush_log_data(mtcp_manager_t mtcp);
244 
245 void
246 thread_printf(mtcp_manager_t mtcp, FILE* f_idx, const char* _Format, ...);
247 
248 #endif /* __DEBUG_H_ */
249