+int IPC_Type_Datagram_GetSize(void *Ident)
+{
+ return 4 + Net_GetAddressSize( ((uint16_t*)Ident)[1] );
+}
+
+int IPC_Type_Datagram_Compare(void *Ident1, void *Ident2)
+{
+ // Pass the buck :)
+ // - No need to worry about mis-matching sizes, as the size is computed
+ // from the 3rd/4th bytes, hence it will differ before the size is hit.
+ return memcmp(Ident1, Ident2, IPC_Type_Datagram_GetSize(Ident1));
+}
+
+void IPC_Type_Datagram_Send(void *Ident, size_t Length, void *Data)
+{
+ int identlen = IPC_Type_Datagram_GetSize(Ident);
+ char tmpbuf[ identlen + Length ];
+ memcpy(tmpbuf, Ident, identlen); // Header
+ memcpy(tmpbuf + identlen, Data, Length); // Data
+ // TODO: Handle fragmented packets
+ write(giNetworkFileHandle, sizeof(tmpbuf), tmpbuf);
+}
+
+int IPC_Type_Sys_GetSize(void *Ident)
+{
+ return sizeof(pid_t);
+}
+
+int IPC_Type_Sys_Compare(void *Ident1, void *Ident2)
+{
+ return *(int*)Ident1 - *(int*)Ident2;
+}
+
+void IPC_Type_Sys_Send(void *Ident, size_t Length, void *Data)
+{
+ SysSendMessage( *(tid_t*)Ident, Length, Data );
+}