Change synchronization code license to LGPLv2.1
[lttv.git] / lttv / lttv / sync / data_structures.h
CommitLineData
10341d26 1/* This file is part of the Linux Trace Toolkit viewer
277e5b53 2 * Copyright (C) 2009, 2010 Benjamin Poirier <benjamin.poirier@polymtl.ca>
10341d26 3 *
277e5b53
BP
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.
10341d26 8 *
277e5b53
BP
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.
10341d26 13 *
277e5b53
BP
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/>.
10341d26
BP
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
f10c27a8
BP
25
26enum Direction
27{
28 OUT,
29 IN,
30};
31
32enum EventType
33{
34 TCP,
35 UDP,
2bd4b3e4 36 TYPE_COUNT // This must be the last field
f10c27a8
BP
37};
38
10341d26
BP
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
10341d26
BP
57typedef struct
58{
59 enum Direction direction;
60 SegmentKey* segmentKey;
61} TCPEvent;
62
63// UDP events
64typedef struct
65{
66 uint32_t saddr, daddr;
f6691532
BP
67 uint16_t source, dest;
68 uint16_t ulen;
10341d26
BP
69 uint8_t dataKey[8];
70} DatagramKey;
71
72typedef struct
73{
74 enum Direction direction;
75 DatagramKey* datagramKey;
76 bool unicast;
77} UDPEvent;
78
76be6fc2
BP
79typedef struct
80{
81 uint32_t seconds;
82 uint32_t nanosec;
83} WallTime;
84
10341d26
BP
85typedef struct _Event
86{
87 unsigned long traceNum;
467066ee
BP
88 // wallTime is corrected according to factors in trace struct, cpuTime
89 // is not
76be6fc2
BP
90 uint64_t cpuTime;
91 WallTime wallTime;
10341d26
BP
92
93 // specific event structures and functions could be in separate files and
94 // type could be an int
f6691532 95 enum EventType type;
10341d26
BP
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
d4721e1a 102 void (*copy)(const struct _Event* const event, struct _Event** const newEvent);
10341d26
BP
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;
ffa21cfd 117 // Event* acks[]
10341d26
BP
118 GQueue* acks;
119} Exchange;
120
121typedef struct
122{
ffa21cfd 123 // Event* events[]
10341d26
BP
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
f10c27a8
BP
147// DatagramKey-related functions
148guint ghfDatagramKeyHash(gconstpointer key);
149gboolean gefDatagramKeyEqual(gconstpointer a, gconstpointer b);
150void gdnDestroyDatagramKey(gpointer data);
151
10341d26
BP
152// Event-related functions
153void gdnDestroyEvent(gpointer data);
d4721e1a
BP
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);
10341d26
BP
157void destroyEvent(Event* const event);
158void destroyTCPEvent(Event* const event);
159void destroyUDPEvent(Event* const event);
f6691532 160void gfDestroyEvent(gpointer data, gpointer user_data);
76be6fc2 161double wallTimeSub(const WallTime const* tA, const WallTime const* tB);
66eaf2eb 162void gfAddEventToArray(gpointer data, gpointer user_data);
10341d26
BP
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);
f6691532
BP
177
178// Broadcast-related functions
179void gdnDestroyBroadcast(gpointer data);
180void destroyBroadcast(Broadcast* const broadcast);
181
10341d26 182#endif
This page took 0.031713 seconds and 4 git commands to generate.