+void IPC_ReturnValue(tIPC_Type *IPCType, void *Ident, int MessageID, uint32_t Value)
+{
+ char data[sizeof(tAxWin_Message) + sizeof(tAxWin_RetMsg)];
+ tAxWin_Message *msg = (void *)data;
+ tAxWin_RetMsg *ret_msg = (void *)msg->Data;
+
+ msg->Source = 0; // 0 = Server
+ msg->ID = MSG_SRSP_RETURN;
+ msg->Size = sizeof(tAxWin_RetMsg);
+ ret_msg->ReqID = MessageID;
+ ret_msg->Rsvd = 0;
+ ret_msg->Value = Value;
+
+ IPCType->SendMessage(Ident, sizeof(data), data);
+}
+
+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, tmpbuf, sizeof(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 );
+}