1 /*
2  * gibber-r-multicast-sender.h - Header for GibberRMulticastSender
3  * Copyright (C) 2006 Collabora Ltd.
4  * @author Sjoerd Simons <sjoerd@luon.net>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20 
21 #ifndef __GIBBER_R_MULTICAST_SENDER_H__
22 #define __GIBBER_R_MULTICAST_SENDER_H__
23 
24 #include <glib-object.h>
25 
26 #include "gibber-r-multicast-packet.h"
27 
28 G_BEGIN_DECLS
29 
30 typedef struct _GibberRMulticastSenderGroup GibberRMulticastSenderGroup;
31 
32 struct _GibberRMulticastSenderGroup {
33   /* <public>
34    * GUINT_TO_POINTER (sender_id) => owned GibberRMulticastSender */
35   GHashTable *senders;
36   /* <private> */
37   gboolean popping;
38   gboolean stopped;
39   /* queue of GibberRMulticast GibberRMulticastSender */
40   GQueue *pop_queue;
41   /* GArray of pending removal GibberRMulticastSenders */
42   GPtrArray *pending_removal;
43 };
44 
45 typedef struct _GibberRMulticastSender GibberRMulticastSender;
46 typedef struct _GibberRMulticastSenderClass GibberRMulticastSenderClass;
47 
48 struct _GibberRMulticastSenderClass {
49     GObjectClass parent_class;
50 };
51 
52 typedef enum {
53   /* We have no info about this sender whatsoever */
54   GIBBER_R_MULTICAST_SENDER_STATE_NEW = 0,
55   /* We know the sequence number we have to start from, but haven't send out
56    * any data yet */
57   GIBBER_R_MULTICAST_SENDER_STATE_PREPARING,
58   /* Non-data Packets are flowing */
59   GIBBER_R_MULTICAST_SENDER_STATE_RUNNING,
60   /* Data is flowing */
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,
68 } GibberRMulticastSenderState;
69 
70 struct _GibberRMulticastSender {
71     GObject parent;
72     gchar *name;
73     guint32 id;
74 
75     GibberRMulticastSenderState state;
76 
77     /* Next packet we want to send out */
78     guint32 next_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;
84 
85     /* Next packet we expect from the sender */
86     guint32 next_input_packet;
87 };
88 
89 GType gibber_r_multicast_sender_get_type (void);
90 
91 /* TYPE MACROS */
92 #define GIBBER_TYPE_R_MULTICAST_SENDER \
93   (gibber_r_multicast_sender_get_type ())
94 #define GIBBER_R_MULTICAST_SENDER(obj) \
95   (G_TYPE_CHECK_INSTANCE_CAST((obj), GIBBER_TYPE_R_MULTICAST_SENDER, \
96    GibberRMulticastSender))
97 #define GIBBER_R_MULTICAST_SENDER_CLASS(klass) \
98   (G_TYPE_CHECK_CLASS_CAST((klass), GIBBER_TYPE_R_MULTICAST_SENDER, \
99    GibberRMulticastSenderClass))
100 #define GIBBER_IS_R_MULTICAST_SENDER(obj) \
101   (G_TYPE_CHECK_INSTANCE_TYPE((obj), GIBBER_TYPE_R_MULTICAST_SENDER))
102 #define GIBBER_IS_R_MULTICAST_SENDER_CLASS(klass) \
103   (G_TYPE_CHECK_CLASS_TYPE((klass), GIBBER_TYPE_R_MULTICAST_SENDER))
104 #define GIBBER_R_MULTICAST_SENDER_GET_CLASS(obj) \
105   (G_TYPE_INSTANCE_GET_CLASS ((obj), GIBBER_TYPE_R_MULTICAST_SENDER, \
106    GibberRMulticastSenderClass))
107 
108 GibberRMulticastSenderGroup *gibber_r_multicast_sender_group_new (void);
109 
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);
114 
115 GibberRMulticastSender * gibber_r_multicast_sender_group_lookup (
116     GibberRMulticastSenderGroup *group, guint32 sender_id);
117 
118 GibberRMulticastSender * gibber_r_multicast_sender_group_lookup_by_name (
119     GibberRMulticastSenderGroup *group, const gchar *name);
120 
121 void gibber_r_multicast_sender_group_remove (
122     GibberRMulticastSenderGroup *group, guint32 sender_id);
123 
124 gboolean gibber_r_multicast_sender_group_push_packet (
125   GibberRMulticastSenderGroup *group, GibberRMulticastPacket *packet);
126 
127 GibberRMulticastSender *gibber_r_multicast_sender_new (guint32 id,
128     const gchar *name, GibberRMulticastSenderGroup *group);
129 
130 /* Sequence for this sender starts at packet_id */
131 void gibber_r_multicast_sender_update_start (GibberRMulticastSender *sender,
132     guint32 packet_id);
133 
134 void gibber_r_multicast_sender_update_end (GibberRMulticastSender *sender,
135     guint32 packet_id);
136 
137 void gibber_r_multicast_sender_set_failed (GibberRMulticastSender *sender);
138 
139 void gibber_r_multicast_sender_set_data_start (GibberRMulticastSender *sender,
140     guint32 packet_id);
141 
142 /* Tell the sender to not signal data starting from this packet */
143 void gibber_r_multicast_sender_hold_data (GibberRMulticastSender *sender,
144   guint32 packet_id);
145 
146 
147 /* Stop holding back data of the sender */
148 void gibber_r_multicast_sender_release_data (GibberRMulticastSender *sender);
149 
150 void gibber_r_multicast_sender_push (GibberRMulticastSender *sender,
151      GibberRMulticastPacket *packet);
152 
153 void
154 gibber_r_multicast_senders_updated (GibberRMulticastSender *sender);
155 
156 /* Returns TRUE if we were up to dated */
157 gboolean gibber_r_multicast_sender_seen (GibberRMulticastSender *sender,
158     guint32 id);
159 
160 gboolean gibber_r_multicast_sender_repair_request (
161     GibberRMulticastSender *sender, guint32 id);
162 
163 void gibber_r_multicast_sender_whois_push (GibberRMulticastSender *sender,
164     const GibberRMulticastPacket *packet);
165 
166 void gibber_r_multicast_sender_set_packet_repeat (
167     GibberRMulticastSender *sender, guint32 packet_id, gboolean repeat);
168 
169 /* Returns the amount of unpopped or unacked packets */
170 guint gibber_r_multicast_sender_packet_cache_size (
171     GibberRMulticastSender *sender);
172 
173 /* Ack management */
174 void gibber_r_multicast_sender_ack (GibberRMulticastSender *sender,
175     guint32 ack);
176 
177 /* Stop all pending requests, only reply to repair requests */
178 void gibber_r_multicast_sender_stop (GibberRMulticastSender *sender);
179 
180 /* Trigger failure detection, for testing only */
181 void _gibber_r_multicast_TEST_sender_fail (GibberRMulticastSender *sender);
182 
183 G_END_DECLS
184 
185 #endif /* #ifndef __GIBBER_R_MULTICAST_SENDER_H__*/
186