38
53
/* We have no info about this sender whatsoever */
39
54
GIBBER_R_MULTICAST_SENDER_STATE_NEW = 0,
40
/* We know the sequence numbering, but no data has been output just yet */
55
/* We know the sequence number we have to start from, but haven't send out
41
57
GIBBER_R_MULTICAST_SENDER_STATE_PREPARING,
58
/* Non-data Packets are flowing */
59
GIBBER_R_MULTICAST_SENDER_STATE_RUNNING,
42
60
/* Data is flowing */
43
GIBBER_R_MULTICAST_SENDER_STATE_RUNNING,
61
GIBBER_R_MULTICAST_SENDER_STATE_DATA_RUNNING,
62
/* Node has failed, still pop packets but stop depending on it */
63
GIBBER_R_MULTICAST_SENDER_STATE_FAILED,
64
GIBBER_R_MULTICAST_SENDER_STATE_UNKNOWN_FAILED,
65
GIBBER_R_MULTICAST_SENDER_STATE_STOPPED,
66
/* Will be removed as soon as all dependencies are resolved */
67
GIBBER_R_MULTICAST_SENDER_STATE_PENDING_REMOVAL,
44
68
} GibberRMulticastSenderState;
46
70
struct _GibberRMulticastSender {
53
77
/* Next packet we want to send out */
54
78
guint32 next_output_packet;
56
/* Last packet that we send in the output stream*/
57
guint32 last_output_packet;
79
/* Next data packet we want to send out. Can be different from
80
* next_output_packet iff holding back data or a fragmented data message is
81
* interleaved with control messages.. Guaranteed to be <=
82
* next_output_packet */
83
guint32 next_output_data_packet;
59
85
/* Next packet we expect from the sender */
60
86
guint32 next_input_packet;
63
GType gibber_r_multicast_sender_get_type(void);
89
GType gibber_r_multicast_sender_get_type (void);
66
92
#define GIBBER_TYPE_R_MULTICAST_SENDER \
67
(gibber_r_multicast_sender_get_type())
93
(gibber_r_multicast_sender_get_type ())
68
94
#define GIBBER_R_MULTICAST_SENDER(obj) \
69
(G_TYPE_CHECK_INSTANCE_CAST((obj), GIBBER_TYPE_R_MULTICAST_SENDER, GibberRMulticastSender))
95
(G_TYPE_CHECK_INSTANCE_CAST((obj), GIBBER_TYPE_R_MULTICAST_SENDER, \
96
GibberRMulticastSender))
70
97
#define GIBBER_R_MULTICAST_SENDER_CLASS(klass) \
71
(G_TYPE_CHECK_CLASS_CAST((klass), GIBBER_TYPE_R_MULTICAST_SENDER, GibberRMulticastSenderClass))
98
(G_TYPE_CHECK_CLASS_CAST((klass), GIBBER_TYPE_R_MULTICAST_SENDER, \
99
GibberRMulticastSenderClass))
72
100
#define GIBBER_IS_R_MULTICAST_SENDER(obj) \
73
101
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GIBBER_TYPE_R_MULTICAST_SENDER))
74
102
#define GIBBER_IS_R_MULTICAST_SENDER_CLASS(klass) \
75
103
(G_TYPE_CHECK_CLASS_TYPE((klass), GIBBER_TYPE_R_MULTICAST_SENDER))
76
104
#define GIBBER_R_MULTICAST_SENDER_GET_CLASS(obj) \
77
(G_TYPE_INSTANCE_GET_CLASS ((obj), GIBBER_TYPE_R_MULTICAST_SENDER, GibberRMulticastSenderClass))
105
(G_TYPE_INSTANCE_GET_CLASS ((obj), GIBBER_TYPE_R_MULTICAST_SENDER, \
106
GibberRMulticastSenderClass))
108
GibberRMulticastSenderGroup *gibber_r_multicast_sender_group_new (void);
110
void gibber_r_multicast_sender_group_free (GibberRMulticastSenderGroup *group);
111
void gibber_r_multicast_sender_group_stop (GibberRMulticastSenderGroup *group);
112
void gibber_r_multicast_sender_group_add (GibberRMulticastSenderGroup *group,
113
GibberRMulticastSender *sender);
115
GibberRMulticastSender * gibber_r_multicast_sender_group_lookup (
116
GibberRMulticastSenderGroup *group, guint32 sender_id);
118
GibberRMulticastSender * gibber_r_multicast_sender_group_lookup_by_name (
119
GibberRMulticastSenderGroup *group, const gchar *name);
121
void gibber_r_multicast_sender_group_remove (
122
GibberRMulticastSenderGroup *group, guint32 sender_id);
124
gboolean gibber_r_multicast_sender_group_push_packet (
125
GibberRMulticastSenderGroup *group, GibberRMulticastPacket *packet);
79
127
GibberRMulticastSender *gibber_r_multicast_sender_new (guint32 id,
80
const gchar *name, GHashTable *senders);
83
gibber_r_multicast_sender_push(GibberRMulticastSender *sender,
84
GibberRMulticastPacket *packet);
87
gibber_r_multicast_senders_updated(GibberRMulticastSender *sender);
128
const gchar *name, GibberRMulticastSenderGroup *group);
130
/* Sequence for this sender starts at packet_id */
131
void gibber_r_multicast_sender_update_start (GibberRMulticastSender *sender,
134
void gibber_r_multicast_sender_update_end (GibberRMulticastSender *sender,
137
void gibber_r_multicast_sender_set_failed (GibberRMulticastSender *sender);
139
void gibber_r_multicast_sender_set_data_start (GibberRMulticastSender *sender,
142
/* Tell the sender to not signal data starting from this packet */
143
void gibber_r_multicast_sender_hold_data (GibberRMulticastSender *sender,
147
/* Stop holding back data of the sender */
148
void gibber_r_multicast_sender_release_data (GibberRMulticastSender *sender);
150
void gibber_r_multicast_sender_push (GibberRMulticastSender *sender,
151
GibberRMulticastPacket *packet);
154
gibber_r_multicast_senders_updated (GibberRMulticastSender *sender);
89
156
/* Returns TRUE if we were up to dated */
91
gibber_r_multicast_sender_seen(GibberRMulticastSender *sender, guint32 id);
94
gibber_r_multicast_sender_repair_request(GibberRMulticastSender *sender,
97
void gibber_r_multicast_sender_whois_push(GibberRMulticastSender *sender,
157
gboolean gibber_r_multicast_sender_seen (GibberRMulticastSender *sender,
160
gboolean gibber_r_multicast_sender_repair_request (
161
GibberRMulticastSender *sender, guint32 id);
163
void gibber_r_multicast_sender_whois_push (GibberRMulticastSender *sender,
98
164
const GibberRMulticastPacket *packet);
166
void gibber_r_multicast_sender_set_packet_repeat (
167
GibberRMulticastSender *sender, guint32 packet_id, gboolean repeat);
169
/* Returns the amount of unpopped or unacked packets */
170
guint gibber_r_multicast_sender_packet_cache_size (
171
GibberRMulticastSender *sender);
174
void gibber_r_multicast_sender_ack (GibberRMulticastSender *sender,
177
/* Stop all pending requests, only reply to repair requests */
178
void gibber_r_multicast_sender_stop (GibberRMulticastSender *sender);
180
/* Trigger failure detection, for testing only */
181
void _gibber_r_multicast_TEST_sender_fail (GibberRMulticastSender *sender);
101
185
#endif /* #ifndef __GIBBER_R_MULTICAST_SENDER_H__*/