1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2009 Benjamin Poirier <benjamin.poirier@polymtl.ca>
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;
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.
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,
23 #include "event_processing_lttv_common.h"
27 #define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
32 * Initialize the GQuarks needed to register the event hooks for
37 LTT_CHANNEL_NET
= g_quark_from_static_string("net");
38 LTT_CHANNEL_NETIF_STATE
= g_quark_from_static_string("netif_state");
40 LTT_EVENT_DEV_XMIT
= g_quark_from_static_string("dev_xmit");
41 LTT_EVENT_DEV_RECEIVE
= g_quark_from_static_string("dev_receive");
42 LTT_EVENT_TCPV4_RCV
= g_quark_from_static_string("tcpv4_rcv");
43 LTT_EVENT_NETWORK_IPV4_INTERFACE
=
44 g_quark_from_static_string("network_ipv4_interface");
46 LTT_FIELD_SKB
= g_quark_from_static_string("skb");
47 LTT_FIELD_PROTOCOL
= g_quark_from_static_string("protocol");
48 LTT_FIELD_NETWORK_PROTOCOL
=
49 g_quark_from_static_string("network_protocol");
50 LTT_FIELD_TRANSPORT_PROTOCOL
=
51 g_quark_from_static_string("transport_protocol");
52 LTT_FIELD_SADDR
= g_quark_from_static_string("saddr");
53 LTT_FIELD_DADDR
= g_quark_from_static_string("daddr");
54 LTT_FIELD_TOT_LEN
= g_quark_from_static_string("tot_len");
55 LTT_FIELD_IHL
= g_quark_from_static_string("ihl");
56 LTT_FIELD_SOURCE
= g_quark_from_static_string("source");
57 LTT_FIELD_DEST
= g_quark_from_static_string("dest");
58 LTT_FIELD_SEQ
= g_quark_from_static_string("seq");
59 LTT_FIELD_ACK_SEQ
= g_quark_from_static_string("ack_seq");
60 LTT_FIELD_DOFF
= g_quark_from_static_string("doff");
61 LTT_FIELD_ACK
= g_quark_from_static_string("ack");
62 LTT_FIELD_RST
= g_quark_from_static_string("rst");
63 LTT_FIELD_SYN
= g_quark_from_static_string("syn");
64 LTT_FIELD_FIN
= g_quark_from_static_string("fin");
65 LTT_FIELD_NAME
= g_quark_from_static_string("name");
66 LTT_FIELD_ADDRESS
= g_quark_from_static_string("address");
67 LTT_FIELD_UP
= g_quark_from_static_string("up");
71 /* Fill hookListList and add event hooks
73 * Note: possibilité de remettre le code avec lttv_trace_find_marker_ids (voir
77 * hookListList: LttvTraceHook hookListList[traceNum][hookNum]
78 * traceSetContext: LTTV traceset
79 * hookFunction: call back function when event is encountered
80 * hookData: data that will be made accessible to hookFunction in
83 void registerHooks(GArray
* hookListList
, LttvTracesetContext
* const
84 traceSetContext
, LttvHook hookFunction
, gpointer hookData
)
87 unsigned int traceNb
= lttv_traceset_number(traceSetContext
->ts
);
92 } eventHookInfoList
[] = {
94 .channelName
= LTT_CHANNEL_NET
,
95 .eventName
= LTT_EVENT_DEV_XMIT
,
96 .fields
= FIELD_ARRAY(LTT_FIELD_SKB
, LTT_FIELD_NETWORK_PROTOCOL
,
97 LTT_FIELD_TRANSPORT_PROTOCOL
, LTT_FIELD_SADDR
,
98 LTT_FIELD_DADDR
, LTT_FIELD_TOT_LEN
, LTT_FIELD_IHL
,
99 LTT_FIELD_SOURCE
, LTT_FIELD_DEST
, LTT_FIELD_SEQ
,
100 LTT_FIELD_ACK_SEQ
, LTT_FIELD_DOFF
, LTT_FIELD_ACK
,
101 LTT_FIELD_RST
, LTT_FIELD_SYN
, LTT_FIELD_FIN
),
103 .channelName
= LTT_CHANNEL_NET
,
104 .eventName
= LTT_EVENT_DEV_RECEIVE
,
105 .fields
= FIELD_ARRAY(LTT_FIELD_SKB
, LTT_FIELD_PROTOCOL
),
107 .channelName
= LTT_CHANNEL_NET
,
108 .eventName
= LTT_EVENT_TCPV4_RCV
,
109 .fields
= FIELD_ARRAY(LTT_FIELD_SKB
, LTT_FIELD_SADDR
,
110 LTT_FIELD_DADDR
, LTT_FIELD_TOT_LEN
, LTT_FIELD_IHL
,
111 LTT_FIELD_SOURCE
, LTT_FIELD_DEST
, LTT_FIELD_SEQ
,
112 LTT_FIELD_ACK_SEQ
, LTT_FIELD_DOFF
, LTT_FIELD_ACK
,
113 LTT_FIELD_RST
, LTT_FIELD_SYN
, LTT_FIELD_FIN
),
115 .channelName
= LTT_CHANNEL_NETIF_STATE
,
116 .eventName
= LTT_EVENT_NETWORK_IPV4_INTERFACE
,
117 .fields
= FIELD_ARRAY(LTT_FIELD_NAME
, LTT_FIELD_ADDRESS
,
120 }; // This is called a compound literal
121 unsigned int hookNb
= sizeof(eventHookInfoList
) / sizeof(*eventHookInfoList
);
123 for(i
= 0; i
< traceNb
; i
++)
125 LttvTraceContext
* tc
;
129 tc
= traceSetContext
->traces
[i
];
130 hookList
= g_array_new(FALSE
, FALSE
, sizeof(LttvTraceHook
));
131 g_array_append_val(hookListList
, hookList
);
134 for (j
= 0; j
< hookNb
; j
++)
138 old_len
= hookList
->len
;
139 retval
= lttv_trace_find_hook(tc
->t
,
140 eventHookInfoList
[j
].channelName
,
141 eventHookInfoList
[j
].eventName
, eventHookInfoList
[j
].fields
,
142 hookFunction
, hookData
, &hookList
);
145 g_warning("Trace %d contains no %s.%s marker\n", i
,
146 g_quark_to_string(eventHookInfoList
[j
].channelName
),
147 g_quark_to_string(eventHookInfoList
[j
].eventName
));
151 g_assert(hookList
->len
- old_len
== 1);
155 // Add the hooks to each tracefile's event_by_id hook list
156 for(j
= 0; j
< tc
->tracefiles
->len
; j
++)
158 LttvTracefileContext
* tfc
;
160 tfc
= g_array_index(tc
->tracefiles
, LttvTracefileContext
*, j
);
162 for(k
= 0; k
< hookList
->len
; k
++)
164 LttvTraceHook
* traceHook
;
166 traceHook
= &g_array_index(hookList
, LttvTraceHook
, k
);
167 if (traceHook
->hook_data
!= hookData
)
169 g_assert_not_reached();
171 if (traceHook
->mdata
== tfc
->tf
->mdata
)
173 lttv_hooks_add(lttv_hooks_by_id_find(tfc
->event_by_id
,
174 traceHook
->id
), traceHook
->h
, traceHook
,
183 /* Remove event hooks and free hookListList
186 * hookListList: LttvTraceHook hookListList[traceNum][hookNum]
187 * traceSetContext: LTTV traceset
189 void unregisterHooks(GArray
* hookListList
, LttvTracesetContext
* const
192 unsigned int i
, j
, k
;
193 unsigned int traceNb
= lttv_traceset_number(traceSetContext
->ts
);
195 for(i
= 0; i
< traceNb
; i
++)
197 LttvTraceContext
* tc
;
200 tc
= traceSetContext
->traces
[i
];
201 hookList
= g_array_index(hookListList
, GArray
*, i
);
203 // Remove the hooks from each tracefile's event_by_id hook list
204 for(j
= 0; j
< tc
->tracefiles
->len
; j
++)
206 LttvTracefileContext
* tfc
;
208 tfc
= g_array_index(tc
->tracefiles
, LttvTracefileContext
*, j
);
210 for(k
= 0; k
< hookList
->len
; k
++)
212 LttvTraceHook
* traceHook
;
214 traceHook
= &g_array_index(hookList
, LttvTraceHook
, k
);
215 if (traceHook
->mdata
== tfc
->tf
->mdata
)
217 lttv_hooks_remove_data(lttv_hooks_by_id_find(tfc
->event_by_id
,
218 traceHook
->id
), traceHook
->h
, traceHook
);
223 g_array_free(hookList
, TRUE
);
225 g_array_free(hookListList
, TRUE
);