Change synchronization code license to LGPLv2.1
[lttv.git] / lttv / lttv / sync / data_structures.h
... / ...
CommitLineData
1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2009, 2010 Benjamin Poirier <benjamin.poirier@polymtl.ca>
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation, either version 2.1 of the License, or (at
7 * your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
12 * License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef DATA_STRUCTURES_H
19#define DATA_STRUCTURES_H
20
21#include <glib.h>
22#include <stdbool.h>
23#include <stdint.h>
24
25
26enum Direction
27{
28 OUT,
29 IN,
30};
31
32enum EventType
33{
34 TCP,
35 UDP,
36 TYPE_COUNT // This must be the last field
37};
38
39// Stage 1 to 2: These structures are passed from processing to matching modules
40// TCP events
41typedef struct
42{
43 uint32_t saddr, daddr;
44 uint16_t source, dest;
45} ConnectionKey;
46
47typedef struct
48{
49 ConnectionKey connectionKey;
50 uint8_t ihl;
51 uint16_t tot_len;
52 uint32_t seq, ack_seq;
53 uint8_t doff;
54 uint8_t ack, rst, syn, fin;
55} SegmentKey;
56
57typedef struct
58{
59 enum Direction direction;
60 SegmentKey* segmentKey;
61} TCPEvent;
62
63// UDP events
64typedef struct
65{
66 uint32_t saddr, daddr;
67 uint16_t source, dest;
68 uint16_t ulen;
69 uint8_t dataKey[8];
70} DatagramKey;
71
72typedef struct
73{
74 enum Direction direction;
75 DatagramKey* datagramKey;
76 bool unicast;
77} UDPEvent;
78
79typedef struct
80{
81 uint32_t seconds;
82 uint32_t nanosec;
83} WallTime;
84
85typedef struct _Event
86{
87 unsigned long traceNum;
88 // wallTime is corrected according to factors in trace struct, cpuTime
89 // is not
90 uint64_t cpuTime;
91 WallTime wallTime;
92
93 // specific event structures and functions could be in separate files and
94 // type could be an int
95 enum EventType type;
96 // event could be a void*, this union is to avoid having to cast
97 union {
98 TCPEvent* tcpEvent;
99 UDPEvent* udpEvent;
100 } event;
101
102 void (*copy)(const struct _Event* const event, struct _Event** const newEvent);
103 void (*destroy)(struct _Event* const event);
104} Event;
105
106// Stage 2 to 3: These structures are passed from matching to analysis modules
107typedef struct _Message
108{
109 Event* inE, * outE;
110
111 void (*print)(const struct _Message* const message);
112} Message;
113
114typedef struct
115{
116 Message* message;
117 // Event* acks[]
118 GQueue* acks;
119} Exchange;
120
121typedef struct
122{
123 // Event* events[]
124 GQueue* events;
125} Broadcast;
126
127// One set of factors for each trace, this is the result of synchronization
128typedef struct
129{
130 double drift, offset;
131} Factors;
132
133
134// ConnectionKey-related functions
135guint ghfConnectionKeyHash(gconstpointer key);
136
137gboolean gefConnectionKeyEqual(gconstpointer a, gconstpointer b);
138bool connectionKeyEqual(const ConnectionKey* const a, const ConnectionKey*
139 const b);
140
141void gdnConnectionKeyDestroy(gpointer data);
142
143// SegmentKey-related functions
144guint ghfSegmentKeyHash(gconstpointer key);
145gboolean gefSegmentKeyEqual(gconstpointer a, gconstpointer b);
146
147// DatagramKey-related functions
148guint ghfDatagramKeyHash(gconstpointer key);
149gboolean gefDatagramKeyEqual(gconstpointer a, gconstpointer b);
150void gdnDestroyDatagramKey(gpointer data);
151
152// Event-related functions
153void gdnDestroyEvent(gpointer data);
154void copyEvent(const Event* const event, Event** const newEvent);
155void copyTCPEvent(const Event* const event, Event** const newEvent);
156void copyUDPEvent(const Event* const event, Event** const newEvent);
157void destroyEvent(Event* const event);
158void destroyTCPEvent(Event* const event);
159void destroyUDPEvent(Event* const event);
160void gfDestroyEvent(gpointer data, gpointer user_data);
161double wallTimeSub(const WallTime const* tA, const WallTime const* tB);
162void gfAddEventToArray(gpointer data, gpointer user_data);
163
164// Message-related functions
165void printTCPSegment(const Message* const segment);
166void convertIP(char* const str, const uint32_t addr);
167
168gint gcfTCPSegmentAckCompare(gconstpointer a, gconstpointer b);
169bool isAcking(const Message* const ackSegment, const Message* const ackedSegment);
170
171void gdnTCPSegmentListDestroy(gpointer data);
172void gfTCPSegmentDestroy(gpointer data, gpointer user_data);
173void destroyTCPSegment(Message* const segment);
174
175// Exchange-related functions
176void destroyTCPExchange(Exchange* const exchange);
177
178// Broadcast-related functions
179void gdnDestroyBroadcast(gpointer data);
180void destroyBroadcast(Broadcast* const broadcast);
181
182#endif
This page took 0.022683 seconds and 4 git commands to generate.