Index: uspace/srv/net/udp/cassoc.c
===================================================================
--- uspace/srv/net/udp/cassoc.c	(revision d548fc0e28b66bd85d62aea9c93bea619d7f4520)
+++ uspace/srv/net/udp/cassoc.c	(revision d548fc0e28b66bd85d62aea9c93bea619d7f4520)
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2015 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup udp
+ * @{
+ */
+
+/**
+ * @file UDP client associations
+ *
+ * Ties UDP associations into the namespace of a client
+ */
+
+#include <errno.h>
+#include <inet/endpoint.h>
+#include <io/log.h>
+#include <stdlib.h>
+
+#include "cassoc.h"
+#include "udp_type.h"
+
+/** Add message to client receive queue.
+ *
+ * @param cassoc Client association
+ * @param epp    Endpoint pair on which message was received
+ * @param msg    Message
+ *
+ * @return EOK on success, ENOMEM if out of memory
+ */
+errno_t udp_cassoc_queue_msg(udp_cassoc_t *cassoc, inet_ep2_t *epp,
+    udp_msg_t *msg)
+{
+	udp_crcv_queue_entry_t *rqe;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_cassoc_queue_msg(%p, %p, %p)",
+	    cassoc, epp, msg);
+
+	rqe = calloc(1, sizeof(udp_crcv_queue_entry_t));
+	if (rqe == NULL)
+		return ENOMEM;
+
+	link_initialize(&rqe->link);
+	rqe->epp = *epp;
+	rqe->msg = msg;
+	rqe->cassoc = cassoc;
+
+	list_append(&rqe->link, &cassoc->client->crcv_queue);
+	return EOK;
+}
+
+/** Create client association.
+ *
+ * This effectively adds an association into a client's namespace.
+ *
+ * @param client  Client
+ * @param assoc   Association
+ * @param rcassoc Place to store pointer to new client association
+ *
+ * @return EOK on soccess, ENOMEM if out of memory
+ */
+errno_t udp_cassoc_create(udp_client_t *client, udp_assoc_t *assoc,
+    udp_cassoc_t **rcassoc)
+{
+	udp_cassoc_t *cassoc;
+	sysarg_t id;
+
+	cassoc = calloc(1, sizeof(udp_cassoc_t));
+	if (cassoc == NULL)
+		return ENOMEM;
+
+	/* Allocate new ID */
+	id = 0;
+	list_foreach (client->cassoc, lclient, udp_cassoc_t, cassoc) {
+		if (cassoc->id >= id)
+			id = cassoc->id + 1;
+	}
+
+	cassoc->id = id;
+	cassoc->client = client;
+	cassoc->assoc = assoc;
+
+	list_append(&cassoc->lclient, &client->cassoc);
+	*rcassoc = cassoc;
+	return EOK;
+}
+
+/** Destroy client association.
+ *
+ * @param cassoc Client association
+ */
+void udp_cassoc_destroy(udp_cassoc_t *cassoc)
+{
+	list_remove(&cassoc->lclient);
+	free(cassoc);
+}
+
+/** Get client association by ID.
+ *
+ * @param client  Client
+ * @param id      Client association ID
+ * @param rcassoc Place to store pointer to client association
+ *
+ * @return EOK on success, ENOENT if no client association with the given ID
+ *         is found.
+ */
+errno_t udp_cassoc_get(udp_client_t *client, sysarg_t id,
+    udp_cassoc_t **rcassoc)
+{
+	list_foreach (client->cassoc, lclient, udp_cassoc_t, cassoc) {
+		if (cassoc->id == id) {
+			*rcassoc = cassoc;
+			return EOK;
+		}
+	}
+
+	return ENOENT;
+}
+
+/**
+ * @}
+ */
Index: uspace/srv/net/udp/cassoc.h
===================================================================
--- uspace/srv/net/udp/cassoc.h	(revision d548fc0e28b66bd85d62aea9c93bea619d7f4520)
+++ uspace/srv/net/udp/cassoc.h	(revision d548fc0e28b66bd85d62aea9c93bea619d7f4520)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2015 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup udp
+ * @{
+ */
+/** @file UDP client associations
+ */
+
+#ifndef CASSOC_H
+#define CASSOC_H
+
+#include <errno.h>
+#include "udp_type.h"
+
+errno_t udp_cassoc_create(udp_client_t *, udp_assoc_t *, udp_cassoc_t **);
+void udp_cassoc_destroy(udp_cassoc_t *);
+errno_t udp_cassoc_get(udp_client_t *, sysarg_t, udp_cassoc_t **);
+errno_t udp_cassoc_queue_msg(udp_cassoc_t *, inet_ep2_t *, udp_msg_t *);
+
+#endif
+
+/** @}
+ */
Index: uspace/srv/net/udp/meson.build
===================================================================
--- uspace/srv/net/udp/meson.build	(revision 453c5ce6cbac832d0e1f1e288bd9988d59fd8187)
+++ uspace/srv/net/udp/meson.build	(revision d548fc0e28b66bd85d62aea9c93bea619d7f4520)
@@ -31,4 +31,5 @@
 _common_src = files(
 	'assoc.c',
+	'cassoc.c',
 	'msg.c',
 	'pdu.c',
Index: uspace/srv/net/udp/service.c
===================================================================
--- uspace/srv/net/udp/service.c	(revision 453c5ce6cbac832d0e1f1e288bd9988d59fd8187)
+++ uspace/srv/net/udp/service.c	(revision d548fc0e28b66bd85d62aea9c93bea619d7f4520)
@@ -46,4 +46,5 @@
 
 #include "assoc.h"
+#include "cassoc.h"
 #include "msg.h"
 #include "service.h"
@@ -55,39 +56,10 @@
 #define MAX_MSG_SIZE DATA_XFER_LIMIT
 
-static void udp_cassoc_recv_msg(void *, inet_ep2_t *, udp_msg_t *);
+static void udp_recv_msg_cassoc(void *, inet_ep2_t *, udp_msg_t *);
 
 /** Callbacks to tie us to association layer */
 static udp_assoc_cb_t udp_cassoc_cb = {
-	.recv_msg = udp_cassoc_recv_msg
+	.recv_msg = udp_recv_msg_cassoc
 };
-
-/** Add message to client receive queue.
- *
- * @param cassoc Client association
- * @param epp    Endpoint pair on which message was received
- * @param msg    Message
- *
- * @return EOK on success, ENOMEM if out of memory
- */
-static errno_t udp_cassoc_queue_msg(udp_cassoc_t *cassoc, inet_ep2_t *epp,
-    udp_msg_t *msg)
-{
-	udp_crcv_queue_entry_t *rqe;
-
-	log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_cassoc_queue_msg(%p, %p, %p)",
-	    cassoc, epp, msg);
-
-	rqe = calloc(1, sizeof(udp_crcv_queue_entry_t));
-	if (rqe == NULL)
-		return ENOMEM;
-
-	link_initialize(&rqe->link);
-	rqe->epp = *epp;
-	rqe->msg = msg;
-	rqe->cassoc = cassoc;
-
-	list_append(&rqe->link, &cassoc->client->crcv_queue);
-	return EOK;
-}
 
 /** Send 'data' event to client.
@@ -108,72 +80,4 @@
 }
 
-/** Create client association.
- *
- * This effectively adds an association into a client's namespace.
- *
- * @param client  Client
- * @param assoc   Association
- * @param rcassoc Place to store pointer to new client association
- *
- * @return EOK on soccess, ENOMEM if out of memory
- */
-static errno_t udp_cassoc_create(udp_client_t *client, udp_assoc_t *assoc,
-    udp_cassoc_t **rcassoc)
-{
-	udp_cassoc_t *cassoc;
-	sysarg_t id;
-
-	cassoc = calloc(1, sizeof(udp_cassoc_t));
-	if (cassoc == NULL)
-		return ENOMEM;
-
-	/* Allocate new ID */
-	id = 0;
-	list_foreach (client->cassoc, lclient, udp_cassoc_t, cassoc) {
-		if (cassoc->id >= id)
-			id = cassoc->id + 1;
-	}
-
-	cassoc->id = id;
-	cassoc->client = client;
-	cassoc->assoc = assoc;
-
-	list_append(&cassoc->lclient, &client->cassoc);
-	*rcassoc = cassoc;
-	return EOK;
-}
-
-/** Destroy client association.
- *
- * @param cassoc Client association
- */
-static void udp_cassoc_destroy(udp_cassoc_t *cassoc)
-{
-	list_remove(&cassoc->lclient);
-	free(cassoc);
-}
-
-/** Get client association by ID.
- *
- * @param client  Client
- * @param id      Client association ID
- * @param rcassoc Place to store pointer to client association
- *
- * @return EOK on success, ENOENT if no client association with the given ID
- *         is found.
- */
-static errno_t udp_cassoc_get(udp_client_t *client, sysarg_t id,
-    udp_cassoc_t **rcassoc)
-{
-	list_foreach (client->cassoc, lclient, udp_cassoc_t, cassoc) {
-		if (cassoc->id == id) {
-			*rcassoc = cassoc;
-			return EOK;
-		}
-	}
-
-	return ENOENT;
-}
-
 /** Message received on client association.
  *
@@ -184,5 +88,5 @@
  * @param msg Message
  */
-static void udp_cassoc_recv_msg(void *arg, inet_ep2_t *epp, udp_msg_t *msg)
+static void udp_recv_msg_cassoc(void *arg, inet_ep2_t *epp, udp_msg_t *msg)
 {
 	udp_cassoc_t *cassoc = (udp_cassoc_t *) arg;
