Index: uspace/lib/c/include/net/packet.h
===================================================================
--- uspace/lib/c/include/net/packet.h	(revision 5a868d742fd071c027eaad6c64e760a31e5573ca)
+++ uspace/lib/c/include/net/packet.h	(revision 5a868d742fd071c027eaad6c64e760a31e5573ca)
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2009 Lukas Mejdrech
+ * 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 libc 
+ *  @{
+ */
+
+/** @file
+ *  Packet map and queue.
+ */
+
+#ifndef LIBC_PACKET_H_
+#define LIBC_PACKET_H_
+
+/** Packet identifier type.
+ * Value zero is used as an invalid identifier.
+ */
+typedef int packet_id_t;
+
+/** Type definition of the packet.
+ * @see packet
+ */
+typedef struct packet * packet_t;
+
+/** Type definition of the packet pointer.
+ * @see packet
+ */
+typedef packet_t * packet_ref;
+
+/** Type definition of the packet dimension.
+ * @see packet_dimension
+ */
+typedef struct packet_dimension	packet_dimension_t;
+
+/** Type definition of the packet dimension pointer.
+ * @see packet_dimension
+ */
+typedef packet_dimension_t * packet_dimension_ref;
+
+/** Packet dimension. */
+struct packet_dimension {
+	/** Reserved packet prefix length. */
+	size_t prefix;
+	/** Maximal packet content length. */
+	size_t content;
+	/** Reserved packet suffix length. */
+	size_t suffix;
+	/** Maximal packet address length. */
+	size_t addr_len;
+};
+
+/** @name Packet management system interface
+ */
+/*@{*/
+
+extern packet_t pm_find(packet_id_t);
+extern int pm_add(packet_t);
+extern int pm_init(void);
+extern void pm_destroy(void);
+
+extern int pq_add(packet_t *, packet_t, size_t, size_t);
+extern packet_t pq_find(packet_t, size_t);
+extern int pq_insert_after(packet_t, packet_t);
+extern packet_t pq_detach(packet_t);
+extern int pq_set_order(packet_t, size_t, size_t);
+extern int pq_get_order(packet_t, size_t *, size_t *);
+extern void pq_destroy(packet_t, void (*)(packet_t));
+extern packet_t pq_next(packet_t);
+extern packet_t pq_previous(packet_t);
+
+/*@}*/
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/c/include/net/packet_header.h
===================================================================
--- uspace/lib/c/include/net/packet_header.h	(revision 5a868d742fd071c027eaad6c64e760a31e5573ca)
+++ uspace/lib/c/include/net/packet_header.h	(revision 5a868d742fd071c027eaad6c64e760a31e5573ca)
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2009 Lukas Mejdrech
+ * 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 libc 
+ *  @{
+ */
+
+/** @file
+ * Packet header.
+ */
+
+#ifndef LIBC_PACKET_HEADER_H_
+#define LIBC_PACKET_HEADER_H_
+
+#include <net/packet.h>
+
+/** Returns the actual packet data length.
+ * @param[in] header	The packet header.
+ */
+#define PACKET_DATA_LENGTH(header) \
+	((header)->data_end - (header)->data_start)
+
+/** Returns the maximum packet address length.
+ * @param[in] header	The packet header.
+ */
+#define PACKET_MAX_ADDRESS_LENGTH(header) \
+	((header)->dest_addr - (header)->src_addr)
+
+/** Returns the minimum packet suffix.
+ *  @param[in] header	The packet header.
+ */
+#define PACKET_MIN_SUFFIX(header) \
+	((header)->length - (header)->data_start - (header)->max_content)
+
+/** Packet integrity check magic value. */
+#define PACKET_MAGIC_VALUE	0x11227788
+
+/** Packet header. */
+struct packet {
+	/** Packet identifier. */
+	packet_id_t packet_id;
+
+	/**
+	 * Packet queue sorting value.
+	 * The packet queue is sorted the ascending order.
+	 */
+	size_t order;
+
+	/** Packet metric. */
+	size_t metric;
+	/** Previous packet in the queue. */
+	packet_id_t previous;
+	/** Next packet in the queue. */
+	packet_id_t next;
+
+	/**
+	 * Total length of the packet.
+	 * Contains the header, the addresses and the data of the packet.
+	 * Corresponds to the mapped sharable memory block.
+	 */
+	size_t length;
+
+	/** Stored source and destination addresses length. */
+	size_t addr_len;
+
+	/**
+	 * Souce address offset in bytes from the beginning of the packet
+	 * header.
+	 */
+	size_t src_addr;
+
+	/**
+	 * Destination address offset in bytes from the beginning of the packet
+	 * header.
+	 */
+	size_t dest_addr;
+
+	/** Reserved data prefix length in bytes. */
+	size_t max_prefix;
+	/** Reserved content length in bytes. */
+	size_t max_content;
+
+	/**
+	 * Actual data start offset in bytes from the beginning of the packet
+	 * header.
+	 */
+	size_t data_start;
+
+	/**
+	 * Actual data end offset in bytes from the beginning of the packet
+	 * header.
+	 */
+	size_t data_end;
+
+	/** Integrity check magic value. */
+	int magic_value;
+};
+
+/** Returns whether the packet is valid.
+ * @param[in] packet	The packet to be checked.
+ * @returns		True if the packet is not NULL and the magic value is
+ *			correct.
+ * @returns		False otherwise.
+ */
+static inline int packet_is_valid(const packet_t packet)
+{
+	return packet && (packet->magic_value == PACKET_MAGIC_VALUE);
+}
+
+#endif
+
+/** @}
+ */
