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"
26 /* This compound literal is #define'd in order to be able to "assign" it and
29 #define EVENT_HOOK_INFO_LIST ((EventHookInfo[]) {\
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),\
40 .channelName= LTT_CHANNEL_NET,\
41 .eventName= LTT_EVENT_DEV_RECEIVE,\
42 .fields= FIELD_ARRAY(LTT_FIELD_SKB, LTT_FIELD_PROTOCOL),\
44 .channelName= LTT_CHANNEL_NET,\
45 .eventName= LTT_EVENT_PKFREE_SKB,\
46 .fields= FIELD_ARRAY(LTT_FIELD_SKB),\
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),\
56 .channelName= LTT_CHANNEL_NETIF_STATE,\
57 .eventName= LTT_EVENT_NETWORK_IPV4_INTERFACE,\
58 .fields= FIELD_ARRAY(LTT_FIELD_NAME, LTT_FIELD_ADDRESS,\
64 #define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
77 * Initialize the GQuarks needed to register the event hooks for
82 LTT_CHANNEL_NET
= g_quark_from_static_string("net");
83 LTT_CHANNEL_NETIF_STATE
= g_quark_from_static_string("netif_state");
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");
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");
117 /* Fill hookListList and add event hooks
119 * Note: possibilité de remettre le code avec lttv_trace_find_marker_ids (voir
124 void registerHooks(GArray
* hookListList
, LttvTracesetContext
* const
125 traceSetContext
, unsigned int traceNb
, LttvHook hookFunction
, gpointer
128 unsigned int i
, j
, k
;
130 EventHookInfo
* eventHookInfoList
;
132 eventHookInfoList
= EVENT_HOOK_INFO_LIST
;
133 hookNb
= sizeof(EVENT_HOOK_INFO_LIST
) / sizeof(EventHookInfo
);
135 for(i
= 0; i
< traceNb
; i
++)
137 LttvTraceContext
* tc
;
141 tc
= traceSetContext
->traces
[i
];
142 hookList
= g_array_new(FALSE
, FALSE
, sizeof(LttvTraceHook
));
143 g_array_append_val(hookListList
, hookList
);
146 for (j
= 0; j
< hookNb
; j
++)
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
);
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
));
163 g_assert(hookList
->len
- old_len
== 1);
167 // Add the hooks to each tracefile's event_by_id hook list
168 for(j
= 0; j
< tc
->tracefiles
->len
; j
++)
170 LttvTracefileContext
* tfc
;
172 tfc
= g_array_index(tc
->tracefiles
, LttvTracefileContext
*, j
);
174 for(k
= 0; k
< hookList
->len
; k
++)
176 LttvTraceHook
* traceHook
;
178 traceHook
= &g_array_index(hookList
, LttvTraceHook
, k
);
179 if (traceHook
->hook_data
!= hookData
)
181 g_assert_not_reached();
183 if (traceHook
->mdata
== tfc
->tf
->mdata
)
185 lttv_hooks_add(lttv_hooks_by_id_find( tfc
->event_by_id
,
186 traceHook
->id
), traceHook
->h
, traceHook
,
195 /* Remove event hooks and free hookListList
198 * hookListList: LttvTraceHook hookListList[traceNum][hookNum]
199 * traceSetContext: LTTV traceset
200 * traceNb: number of traces in the traceset
202 void unregisterHooks(GArray
* hookListList
, LttvTracesetContext
* const
203 traceSetContext
, unsigned int traceNb
)
205 unsigned int i
, j
, k
;
207 for(i
= 0; i
< traceNb
; i
++)
209 LttvTraceContext
* tc
;
212 tc
= traceSetContext
->traces
[i
];
213 hookList
= g_array_index(hookListList
, GArray
*, i
);
215 // Remove the hooks from each tracefile's event_by_id hook list
216 for(j
= 0; j
< tc
->tracefiles
->len
; j
++)
218 LttvTracefileContext
* tfc
;
220 tfc
= g_array_index(tc
->tracefiles
, LttvTracefileContext
*, j
);
222 for(k
= 0; k
< hookList
->len
; k
++)
224 LttvTraceHook
* traceHook
;
226 traceHook
= &g_array_index(hookList
, LttvTraceHook
, k
);
227 if (traceHook
->mdata
== tfc
->tf
->mdata
)
229 lttv_hooks_remove_data(lttv_hooks_by_id_find(tfc
->event_by_id
,
230 traceHook
->id
), traceHook
->h
, traceHook
);
235 g_array_free(hookList
, TRUE
);
237 g_array_free(hookListList
, TRUE
);