summaryrefslogtreecommitdiff
path: root/agent/pseudotcp.c
diff options
context:
space:
mode:
authorPhilip Withnall <philip.withnall@collabora.co.uk>2014-08-08 09:57:40 +0100
committerOlivier CrĂȘte <olivier.crete@collabora.com>2014-08-21 14:33:11 -0400
commite4e8aaf9706e446e0a5889128b6adc75e6271988 (patch)
tree4a683172c88a63b65c9ca010f88604055a60f0b2 /agent/pseudotcp.c
parentb0f0e3eab87ca594557c64f3c29775f5bc3c2524 (diff)
downloadlibnice-e4e8aaf9706e446e0a5889128b6adc75e6271988.tar.gz
pseudotcp: Factor out state change functions for ESTABLISHED and CLOSED
Both state changes need some follow-up code executed immediately after, which was duplicated in a number of places. Factor that out. This introduces no behavioural changes.
Diffstat (limited to 'agent/pseudotcp.c')
-rw-r--r--agent/pseudotcp.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/agent/pseudotcp.c b/agent/pseudotcp.c
index e8fc36a..fd7f606 100644
--- a/agent/pseudotcp.c
+++ b/agent/pseudotcp.c
@@ -517,6 +517,8 @@ static void parse_options (PseudoTcpSocket *self, const guint8 *data,
static void resize_send_buffer (PseudoTcpSocket *self, guint32 new_size);
static void resize_receive_buffer (PseudoTcpSocket *self, guint32 new_size);
static void set_state (PseudoTcpSocket *self, PseudoTcpState new_state);
+static void set_state_established (PseudoTcpSocket *self);
+static void set_state_closed (PseudoTcpSocket *self, guint32 err);
static const gchar *pseudo_tcp_state_get_name (PseudoTcpState state);
@@ -1270,11 +1272,7 @@ process(PseudoTcpSocket *self, Segment *seg)
set_state (self, TCP_SYN_RECEIVED);
queue_connect_message (self);
} else if (priv->state == TCP_SYN_SENT) {
- set_state (self, TCP_ESTABLISHED);
- adjustMTU(self);
- if (priv->callbacks.PseudoTcpOpened)
- priv->callbacks.PseudoTcpOpened(self, priv->callbacks.user_data);
-
+ set_state_established (self);
}
} else {
DEBUG (PSEUDO_TCP_DEBUG_NORMAL, "Unknown control code: %d", seg->data[0]);
@@ -1407,10 +1405,7 @@ process(PseudoTcpSocket *self, Segment *seg)
// !?! A bit hacky
if ((priv->state == TCP_SYN_RECEIVED) && !bConnect) {
- set_state (self, TCP_ESTABLISHED);
- adjustMTU(self);
- if (priv->callbacks.PseudoTcpOpened)
- priv->callbacks.PseudoTcpOpened(self, priv->callbacks.user_data);
+ set_state_established (self);
}
// If we make room in the send queue, notify the user
@@ -1733,11 +1728,7 @@ attempt_send(PseudoTcpSocket *self, SendFlags sflags)
static void
closedown(PseudoTcpSocket *self, guint32 err)
{
- PseudoTcpSocketPrivate *priv = self->priv;
-
- set_state (self, TCP_CLOSED);
- if (priv->callbacks.PseudoTcpClosed)
- priv->callbacks.PseudoTcpClosed(self, err, priv->callbacks.user_data);
+ set_state_closed (self, err);
}
static void
@@ -1994,6 +1985,31 @@ set_state (PseudoTcpSocket *self, PseudoTcpState new_state)
priv->state = new_state;
}
+static void
+set_state_established (PseudoTcpSocket *self)
+{
+ PseudoTcpSocketPrivate *priv = self->priv;
+
+ set_state (self, TCP_ESTABLISHED);
+
+ adjustMTU (self);
+ if (priv->callbacks.PseudoTcpOpened)
+ priv->callbacks.PseudoTcpOpened (self, priv->callbacks.user_data);
+}
+
+/* (err == 0) means no error. */
+static void
+set_state_closed (PseudoTcpSocket *self, guint32 err)
+{
+ PseudoTcpSocketPrivate *priv = self->priv;
+
+ set_state (self, TCP_CLOSED);
+
+ /* Only call the callback if there was an error. */
+ if (priv->callbacks.PseudoTcpClosed && err != 0)
+ priv->callbacks.PseudoTcpClosed (self, err, priv->callbacks.user_data);
+}
+
gboolean
pseudo_tcp_socket_is_closed (PseudoTcpSocket *self)
{