59c7c0f2953056ffc05d5458ad06d6685da37cbb
[lttv.git] / lttv / lttv / sync / event_processing_lttv_common.c
1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2009 Benjamin Poirier <benjamin.poirier@polymtl.ca>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
16 * MA 02111-1307, USA.
17 */
18
19 #ifdef HAVE_CONFIG_H
20 #include <config.h>
21 #endif
22
23 #include "event_processing_lttv_common.h"
24
25
26 /* This compound literal is #define'd in order to be able to "assign" it and
27 * 'sizeof()' it
28 */
29 #define EVENT_HOOK_INFO_LIST ((EventHookInfo[]) {\
30 {\
31 .channelName= LTT_CHANNEL_NET,\
32 .eventName= LTT_EVENT_DEV_XMIT,\
33 .fields= FIELD_ARRAY(LTT_FIELD_SKB, LTT_FIELD_NETWORK_PROTOCOL,\
34 LTT_FIELD_TRANSPORT_PROTOCOL, LTT_FIELD_SADDR,\
35 LTT_FIELD_DADDR, LTT_FIELD_TOT_LEN, LTT_FIELD_IHL,\
36 LTT_FIELD_SOURCE, LTT_FIELD_DEST, LTT_FIELD_SEQ,\
37 LTT_FIELD_ACK_SEQ, LTT_FIELD_DOFF, LTT_FIELD_ACK,\
38 LTT_FIELD_RST, LTT_FIELD_SYN, LTT_FIELD_FIN),\
39 }, {\
40 .channelName= LTT_CHANNEL_NET,\
41 .eventName= LTT_EVENT_DEV_RECEIVE,\
42 .fields= FIELD_ARRAY(LTT_FIELD_SKB, LTT_FIELD_PROTOCOL),\
43 }, {\
44 .channelName= LTT_CHANNEL_NET,\
45 .eventName= LTT_EVENT_PKFREE_SKB,\
46 .fields= FIELD_ARRAY(LTT_FIELD_SKB),\
47 }, {\
48 .channelName= LTT_CHANNEL_NET,\
49 .eventName= LTT_EVENT_TCPV4_RCV,\
50 .fields= FIELD_ARRAY(LTT_FIELD_SKB, LTT_FIELD_SADDR,\
51 LTT_FIELD_DADDR, LTT_FIELD_TOT_LEN, LTT_FIELD_IHL,\
52 LTT_FIELD_SOURCE, LTT_FIELD_DEST, LTT_FIELD_SEQ,\
53 LTT_FIELD_ACK_SEQ, LTT_FIELD_DOFF, LTT_FIELD_ACK,\
54 LTT_FIELD_RST, LTT_FIELD_SYN, LTT_FIELD_FIN),\
55 }, {\
56 .channelName= LTT_CHANNEL_NETIF_STATE,\
57 .eventName= LTT_EVENT_NETWORK_IPV4_INTERFACE,\
58 .fields= FIELD_ARRAY(LTT_FIELD_NAME, LTT_FIELD_ADDRESS,\
59 LTT_FIELD_UP),\
60 }\
61 })
62
63 #ifndef g_info
64 #define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
65 #endif
66
67
68 typedef struct
69 {
70 GQuark channelName;
71 GQuark eventName;
72 GQuark* fields;
73 } EventHookInfo;
74
75
76 /*
77 * Initialize the GQuarks needed to register the event hooks for
78 * synchronization
79 */
80 void createQuarks()
81 {
82 LTT_CHANNEL_NET= g_quark_from_static_string("net");
83 LTT_CHANNEL_NETIF_STATE= g_quark_from_static_string("netif_state");
84
85 LTT_EVENT_DEV_XMIT= g_quark_from_static_string("dev_xmit");
86 LTT_EVENT_DEV_RECEIVE= g_quark_from_static_string("dev_receive");
87 LTT_EVENT_PKFREE_SKB= g_quark_from_static_string("pkfree_skb");
88 LTT_EVENT_TCPV4_RCV= g_quark_from_static_string("tcpv4_rcv");
89 LTT_EVENT_NETWORK_IPV4_INTERFACE=
90 g_quark_from_static_string("network_ipv4_interface");
91
92 LTT_FIELD_SKB= g_quark_from_static_string("skb");
93 LTT_FIELD_PROTOCOL= g_quark_from_static_string("protocol");
94 LTT_FIELD_NETWORK_PROTOCOL=
95 g_quark_from_static_string("network_protocol");
96 LTT_FIELD_TRANSPORT_PROTOCOL=
97 g_quark_from_static_string("transport_protocol");
98 LTT_FIELD_SADDR= g_quark_from_static_string("saddr");
99 LTT_FIELD_DADDR= g_quark_from_static_string("daddr");
100 LTT_FIELD_TOT_LEN= g_quark_from_static_string("tot_len");
101 LTT_FIELD_IHL= g_quark_from_static_string("ihl");
102 LTT_FIELD_SOURCE= g_quark_from_static_string("source");
103 LTT_FIELD_DEST= g_quark_from_static_string("dest");
104 LTT_FIELD_SEQ= g_quark_from_static_string("seq");
105 LTT_FIELD_ACK_SEQ= g_quark_from_static_string("ack_seq");
106 LTT_FIELD_DOFF= g_quark_from_static_string("doff");
107 LTT_FIELD_ACK= g_quark_from_static_string("ack");
108 LTT_FIELD_RST= g_quark_from_static_string("rst");
109 LTT_FIELD_SYN= g_quark_from_static_string("syn");
110 LTT_FIELD_FIN= g_quark_from_static_string("fin");
111 LTT_FIELD_NAME= g_quark_from_static_string("name");
112 LTT_FIELD_ADDRESS= g_quark_from_static_string("address");
113 LTT_FIELD_UP= g_quark_from_static_string("up");
114 }
115
116
117 /* Fill hookListList and add event hooks
118 *
119 * Note: possibilité de remettre le code avec lttv_trace_find_marker_ids (voir
120 * r328)
121 *
122 * Args:
123 */
124 void registerHooks(GArray* hookListList, LttvTracesetContext* const
125 traceSetContext, unsigned int traceNb, LttvHook hookFunction, gpointer
126 hookData)
127 {
128 unsigned int i, j, k;
129 unsigned int hookNb;
130 EventHookInfo* eventHookInfoList;
131
132 eventHookInfoList= EVENT_HOOK_INFO_LIST;
133 hookNb= sizeof(EVENT_HOOK_INFO_LIST) / sizeof(EventHookInfo);
134
135 for(i= 0; i < traceNb; i++)
136 {
137 LttvTraceContext* tc;
138 GArray* hookList;
139 int retval;
140
141 tc= traceSetContext->traces[i];
142 hookList= g_array_new(FALSE, FALSE, sizeof(LttvTraceHook));
143 g_array_append_val(hookListList, hookList);
144
145 // Find the hooks
146 for (j= 0; j < hookNb; j++)
147 {
148 guint old_len;
149
150 old_len= hookList->len;
151 retval= lttv_trace_find_hook(tc->t,
152 eventHookInfoList[j].channelName,
153 eventHookInfoList[j].eventName, eventHookInfoList[j].fields,
154 hookFunction, hookData, &hookList);
155 if (retval != 0)
156 {
157 g_warning("Trace %d contains no %s.%s marker\n", i,
158 g_quark_to_string(eventHookInfoList[j].channelName),
159 g_quark_to_string(eventHookInfoList[j].eventName));
160 }
161 else
162 {
163 g_assert(hookList->len - old_len == 1);
164 }
165 }
166
167 // Add the hooks to each tracefile's event_by_id hook list
168 for(j= 0; j < tc->tracefiles->len; j++)
169 {
170 LttvTracefileContext* tfc;
171
172 tfc= g_array_index(tc->tracefiles, LttvTracefileContext*, j);
173
174 for(k= 0; k < hookList->len; k++)
175 {
176 LttvTraceHook* traceHook;
177
178 traceHook= &g_array_index(hookList, LttvTraceHook, k);
179 if (traceHook->hook_data != hookData)
180 {
181 g_assert_not_reached();
182 }
183 if (traceHook->mdata == tfc->tf->mdata)
184 {
185 lttv_hooks_add(lttv_hooks_by_id_find( tfc->event_by_id,
186 traceHook->id), traceHook->h, traceHook,
187 LTTV_PRIO_DEFAULT);
188 }
189 }
190 }
191 }
192 }
193
194
195 /* Remove event hooks and free hookListList
196 *
197 * Args:
198 * hookListList: LttvTraceHook hookListList[traceNum][hookNum]
199 * traceSetContext: LTTV traceset
200 * traceNb: number of traces in the traceset
201 */
202 void unregisterHooks(GArray* hookListList, LttvTracesetContext* const
203 traceSetContext, unsigned int traceNb)
204 {
205 unsigned int i, j, k;
206
207 for(i= 0; i < traceNb; i++)
208 {
209 LttvTraceContext* tc;
210 GArray* hookList;
211
212 tc= traceSetContext->traces[i];
213 hookList= g_array_index(hookListList, GArray*, i);
214
215 // Remove the hooks from each tracefile's event_by_id hook list
216 for(j= 0; j < tc->tracefiles->len; j++)
217 {
218 LttvTracefileContext* tfc;
219
220 tfc= g_array_index(tc->tracefiles, LttvTracefileContext*, j);
221
222 for(k= 0; k < hookList->len; k++)
223 {
224 LttvTraceHook* traceHook;
225
226 traceHook= &g_array_index(hookList, LttvTraceHook, k);
227 if (traceHook->mdata == tfc->tf->mdata)
228 {
229 lttv_hooks_remove_data(lttv_hooks_by_id_find(tfc->event_by_id,
230 traceHook->id), traceHook->h, traceHook);
231 }
232 }
233 }
234
235 g_array_free(hookList, TRUE);
236 }
237 g_array_free(hookListList, TRUE);
238 }
This page took 0.037301 seconds and 3 git commands to generate.