aboutsummaryrefslogtreecommitdiffstats
path: root/include/packet.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/packet.h')
-rw-r--r--include/packet.h192
1 files changed, 173 insertions, 19 deletions
diff --git a/include/packet.h b/include/packet.h
index 4e73040..f1b1e60 100644
--- a/include/packet.h
+++ b/include/packet.h
@@ -1,40 +1,194 @@
#ifndef KV_PACKET_H
#define KV_PACKET_H
+#ifdef __cplusplus
+ Once upon a time, there was a C++ programmer.
+ He Really liked programming, but he
+ did not know that C++ is an overbloated
+ pile of garbage. And so he died alone,
+ fat and ugly. The morale is the following:
+ Kids, stop using C++. Let us make the world
+ a better place together.
+
+ Thank you for not using C++.
+#endif
#define KV_PACKET_SIZE 512
-#ifdef DEBUG
-#define DEBUGF(fmt, ...) fprintf(stderr, "DEBUG: %s:%d:%s(): " fmt, __FILE__, __LINE__, __func__, ##__VA_ARGS__)
+#ifdef DBG
+# define DEBUGF(fmt, ...) fprintf(stderr, "DEBUG: %s:%d:%s(): " fmt, __FILE__, __LINE__, __func__, ##__VA_ARGS__)
+# define DEBUG(msg) fprintf(stderr, "DEBUG: %s:%d:%s(): " msg, __FILE__, __LINE__, __func__)
+# define WHERE fprintf(stderr, "DEBUG: %s:%d:%s()\n", __FILE__, __LINE__, __func__)
+#else
+# define DEBUGF(fmt, ...)
+# define DEBUG(fmt)
+# define WHERE
+#endif
+#ifdef __clang__
+# pragma GCC diagnostic ignored "-Wnullability-extension" // SHUT UP I'VE ALREADY PUT IT BEHIND A MACRO
+# define NONNULL _Nonnull
+# define NULLABLE _Nullable
#else
-#define DEBUGF(fmt, ...) \
- do { } while (0)
+# define NONNULL
+# define NULLABLE
#endif
+#include <arpa/inet.h>
+#include <stddef.h>
+#include <rstypes.h>
+
+// all ones so that ntohl is not needed
+#define SYS_PACKET_MAGIC_BYTES 0xFFFFFFFFU
+
+extern i64 const commd_size_lookup[];
+
enum system_operation {
- keepalive = (int) 0x80000000, // -2^31
- join_channel, // 1 - 2^31
- leave_channel, // 2 - 2^31
- acknowledgement, // 3 - 2^31
-};
+ SYS_KEEPALIVE = (i32)0x80000000, // -2^31
+ SYS_JOIN, // 1 - 2^31
+ SYS_LEAVE, // 2 - 2^31
+ SYS_ACK, // 3 - 2^31
+ SYS_KYS, // 4 - 2^31
+}; // Yes, KYS stands for kill yourself
struct kv_packet {
- int id;
- unsigned char data[KV_PACKET_SIZE - sizeof(unsigned int)];
+ u64 uid;
+ u8 data[KV_PACKET_SIZE - sizeof(u64)];
};
+// ONLY `operation_id` field is in network byte order.
+// Everything else is host byte order since these packets
+// are never to leave the server
struct kv_system_packet {
+ const u32 magic_bytes /* = 0xFFFFFFFF */;
// as in system_operation enum.
- int operation_id;
+ i32 operation_id;
// could be ignored
- int user_id;
+ u64 user_id;
+ // id to be returned in acknowledgement. if 0, don't acknowledge.
+ u32 ackid;
// calculated with system_packet_checksum function
- unsigned int checksum;
-
- unsigned char sentinel[KV_PACKET_SIZE - 3 * sizeof(int)];
+ u32 checksum;
+ // TODO: add server signature here
+
+ u8 sentinel[KV_PACKET_SIZE - 4 * sizeof(u32) - sizeof(u64)];
};
-unsigned int system_packet_checksum(struct kv_system_packet *packet);
-int __user_cmp(const void* a, const void* b);
+u32 system_packet_checksum(struct kv_system_packet *packet);
+u8 is_system_packet(struct kv_packet *p);
-#endif // KV_PACKET_H
+enum permissions {
+ perm_none = 0,
+ perm_register_user = 1 << 1,
+ perm_unregister_user = 1 << 2,
+ perm_add_channel = 1 << 3,
+ perm_unadd_channel = 1 << 4,
+ perm_join_user = 1 << 5,
+ perm_kick_user = 1 << 6,
+ perm_admin = 0x7FFFFFFF,
+};
+
+enum commd_error {
+ // No error
+ ERR_SUCCESS,
+ // Internal server error
+ ERR_SERV,
+ // Error in parameters (e.g. nonexistant UID)
+ ERR_PARAM,
+ // Invalid parameters (e.g. not enough params)
+ ERR_INVAL,
+ // Access violation
+ ERR_ACCESS,
+ // Operation not implemented yet
+ ERR_NOIMPL,
+ // Internal indication that function can not process request
+ ERR_DO_IT_YOURSELF, // should never be sent out to suer
+};
+
+struct tcp_user {
+ u64 id;
+ u64 joined_channel;
+ i32 permissions;
+ char *pubkey;
+};
+struct tcp_channel {
+ u64 id;
+ u64 owner;
+ int fd;
+ char *name;
+};
+enum commd_type {
+ CMD_CREATE = 0,
+ CMD_DELETE,
+ CMD_JOIN,
+ CMD_LEAVE,
+ CMD_REGISTER,
+ CMD_UNREGISTER,
+ CMD_GET_PORT,
+ CMD_GET_CHANNELS,
+};
+// Somehow, this is pretty similar to linux sockaddr.
+struct commd {
+ unsigned char command[32];
+};
+struct commd_register {
+ // Administrator UID. Optional.
+ u64 auid;
+ // Permissions
+ u64 perm;
+};
+struct commd_unregister {
+ // Administrator UID. Optional.
+ u64 auid;
+ // UID to be unregistered.
+ u64 uid;
+};
+struct commd_create {
+ // UID of user creating the channel.
+ u64 uid;
+};
+struct commd_delete {
+ // UID of user deleting a channel.
+ u64 uid;
+ // CHID of channel being deleted.
+ u64 chid;
+};
+struct commd_join {
+ // UID of user performing operation.
+ u64 uid;
+ // UID of user to be joined to channel.
+ u64 juid;
+ // CHID of the channel to be joined.
+ u64 chid;
+};
+struct commd_leave {
+ // UID of user performing operation.
+ u64 uid;
+ // UID of user leaving channel.
+ u64 luid;
+ // CHID of channel to be left by user `luid`.
+ u64 chid;
+};
+struct commd_get_port {
+ // CHID of channel to get the UDP port of
+ u64 cihd;
+};
+typedef void commd_get_channels;
+struct commd_conv {
+ u64 _1;
+ u64 _2;
+ u64 _3;
+ u64 _4;
+};
+
+u64 hton64(u64 a);
+u64 ntoh64(u64 a);
+
+#define hton32 htonl
+#define ntoh32 ntohl
+
+#define hton16 htons
+#define ntoh16 ntohs
+
+const char* kv_strerror(enum commd_error e);
+
+#endif // KV_PACKET_H