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_TCPV4_RCV,\
46 .fields= FIELD_ARRAY(LTT_FIELD_SKB, LTT_FIELD_SADDR,\
47 LTT_FIELD_DADDR, LTT_FIELD_TOT_LEN, LTT_FIELD_IHL,\
48 LTT_FIELD_SOURCE, LTT_FIELD_DEST, LTT_FIELD_SEQ,\
49 LTT_FIELD_ACK_SEQ, LTT_FIELD_DOFF, LTT_FIELD_ACK,\
50 LTT_FIELD_RST, LTT_FIELD_SYN, LTT_FIELD_FIN),\
52 .channelName= LTT_CHANNEL_NETIF_STATE,\
53 .eventName= LTT_EVENT_NETWORK_IPV4_INTERFACE,\
54 .fields= FIELD_ARRAY(LTT_FIELD_NAME, LTT_FIELD_ADDRESS,\
60 #define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
73 * Initialize the GQuarks needed to register the event hooks for
78 LTT_CHANNEL_NET
= g_quark_from_static_string("net");
79 LTT_CHANNEL_NETIF_STATE
= g_quark_from_static_string("netif_state");
81 LTT_EVENT_DEV_XMIT
= g_quark_from_static_string("dev_xmit");
82 LTT_EVENT_DEV_RECEIVE
= g_quark_from_static_string("dev_receive");
83 LTT_EVENT_TCPV4_RCV
= g_quark_from_static_string("tcpv4_rcv");
84 LTT_EVENT_NETWORK_IPV4_INTERFACE
=
85 g_quark_from_static_string("network_ipv4_interface");
87 LTT_FIELD_SKB
= g_quark_from_static_string("skb");
88 LTT_FIELD_PROTOCOL
= g_quark_from_static_string("protocol");
89 LTT_FIELD_NETWORK_PROTOCOL
=
90 g_quark_from_static_string("network_protocol");
91 LTT_FIELD_TRANSPORT_PROTOCOL
=
92 g_quark_from_static_string("transport_protocol");
93 LTT_FIELD_SADDR
= g_quark_from_static_string("saddr");
94 LTT_FIELD_DADDR
= g_quark_from_static_string("daddr");
95 LTT_FIELD_TOT_LEN
= g_quark_from_static_string("tot_len");
96 LTT_FIELD_IHL
= g_quark_from_static_string("ihl");
97 LTT_FIELD_SOURCE
= g_quark_from_static_string("source");
98 LTT_FIELD_DEST
= g_quark_from_static_string("dest");
99 LTT_FIELD_SEQ
= g_quark_from_static_string("seq");
100 LTT_FIELD_ACK_SEQ
= g_quark_from_static_string("ack_seq");
101 LTT_FIELD_DOFF
= g_quark_from_static_string("doff");
102 LTT_FIELD_ACK
= g_quark_from_static_string("ack");
103 LTT_FIELD_RST
= g_quark_from_static_string("rst");
104 LTT_FIELD_SYN
= g_quark_from_static_string("syn");
105 LTT_FIELD_FIN
= g_quark_from_static_string("fin");
106 LTT_FIELD_NAME
= g_quark_from_static_string("name");
107 LTT_FIELD_ADDRESS
= g_quark_from_static_string("address");
108 LTT_FIELD_UP
= g_quark_from_static_string("up");
112 /* Fill hookListList and add event hooks
114 * Note: possibilité de remettre le code avec lttv_trace_find_marker_ids (voir
119 void registerHooks(GArray
* hookListList
, LttvTracesetContext
* const
120 traceSetContext
, unsigned int traceNb
, LttvHook hookFunction
, gpointer
123 unsigned int i
, j
, k
;
125 EventHookInfo
* eventHookInfoList
;
127 eventHookInfoList
= EVENT_HOOK_INFO_LIST
;
128 hookNb
= sizeof(EVENT_HOOK_INFO_LIST
) / sizeof(EventHookInfo
);
130 for(i
= 0; i
< traceNb
; i
++)
132 LttvTraceContext
* tc
;
136 tc
= traceSetContext
->traces
[i
];
137 hookList
= g_array_new(FALSE
, FALSE
, sizeof(LttvTraceHook
));
138 g_array_append_val(hookListList
, hookList
);
141 for (j
= 0; j
< hookNb
; j
++)
145 old_len
= hookList
->len
;
146 retval
= lttv_trace_find_hook(tc
->t
,
147 eventHookInfoList
[j
].channelName
,
148 eventHookInfoList
[j
].eventName
, eventHookInfoList
[j
].fields
,
149 hookFunction
, hookData
, &hookList
);
152 g_warning("Trace %d contains no %s.%s marker\n", i
,
153 g_quark_to_string(eventHookInfoList
[j
].channelName
),
154 g_quark_to_string(eventHookInfoList
[j
].eventName
));
158 g_assert(hookList
->len
- old_len
== 1);
162 // Add the hooks to each tracefile's event_by_id hook list
163 for(j
= 0; j
< tc
->tracefiles
->len
; j
++)
165 LttvTracefileContext
* tfc
;
167 tfc
= g_array_index(tc
->tracefiles
, LttvTracefileContext
*, j
);
169 for(k
= 0; k
< hookList
->len
; k
++)
171 LttvTraceHook
* traceHook
;
173 traceHook
= &g_array_index(hookList
, LttvTraceHook
, k
);
174 if (traceHook
->hook_data
!= hookData
)
176 g_assert_not_reached();
178 if (traceHook
->mdata
== tfc
->tf
->mdata
)
180 lttv_hooks_add(lttv_hooks_by_id_find( tfc
->event_by_id
,
181 traceHook
->id
), traceHook
->h
, traceHook
,
190 /* Remove event hooks and free hookListList
193 * hookListList: LttvTraceHook hookListList[traceNum][hookNum]
194 * traceSetContext: LTTV traceset
195 * traceNb: number of traces in the traceset
197 void unregisterHooks(GArray
* hookListList
, LttvTracesetContext
* const
198 traceSetContext
, unsigned int traceNb
)
200 unsigned int i
, j
, k
;
202 for(i
= 0; i
< traceNb
; i
++)
204 LttvTraceContext
* tc
;
207 tc
= traceSetContext
->traces
[i
];
208 hookList
= g_array_index(hookListList
, GArray
*, i
);
210 // Remove the hooks from each tracefile's event_by_id hook list
211 for(j
= 0; j
< tc
->tracefiles
->len
; j
++)
213 LttvTracefileContext
* tfc
;
215 tfc
= g_array_index(tc
->tracefiles
, LttvTracefileContext
*, j
);
217 for(k
= 0; k
< hookList
->len
; k
++)
219 LttvTraceHook
* traceHook
;
221 traceHook
= &g_array_index(hookList
, LttvTraceHook
, k
);
222 if (traceHook
->mdata
== tfc
->tf
->mdata
)
224 lttv_hooks_remove_data(lttv_hooks_by_id_find(tfc
->event_by_id
,
225 traceHook
->id
), traceHook
->h
, traceHook
);
230 g_array_free(hookList
, TRUE
);
232 g_array_free(hookListList
, TRUE
);