summaryrefslogtreecommitdiffstats
path: root/include/protocol.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/protocol.h')
-rw-r--r--include/protocol.h137
1 files changed, 137 insertions, 0 deletions
diff --git a/include/protocol.h b/include/protocol.h
new file mode 100644
index 0000000..34ad4a3
--- /dev/null
+++ b/include/protocol.h
@@ -0,0 +1,137 @@
+/*
+ * Usurpataion --- client-server protocol interface.
+ *
+ * Copyright (C) 2019 Ramūnas Mažeikis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; version 2.1
+ * of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef USURPATION_PROTOCOL_H_INCLUDED
+#define USURPATION_PROTOCOL_H_INCLUDED
+
+#include <errno.h>
+
+#define E_TLV_OVERFLOW (1 << 0)
+#define E_UNKNOWN_TYPE (1 << 1)
+#define E_IVALID_DESCRIPTOR (1 << 2)
+#define END_OF_PACKET (1 << 3)
+
+/**
+ * Regular packets contain tlv's defined by tlv_type.
+ *
+ * Hearbeat packet tell daemon that device is still alive and listening.
+ *
+ * Discovery packets are used for what they say.
+ */
+enum packet_type {
+ REGURAL,
+ HEARTBEAT,
+ DISCOVERY
+};
+
+/**
+ * Message sequence number since beggining of sesssion.
+ *
+ * Mainly used for identifying lost messages.
+ */
+typedef unsigned int msg_idx_t;
+
+enum tlv_type {
+ /**
+ * NULL-terminated string. To be put in a queue to display on the
+ * screen.
+ */
+ TEXT,
+
+ /** Fixed point. 1 decimal digit of precision. */
+ FPI1,
+
+ /** Literally time_t */
+ TIMESTAMP,
+
+ /** Represents a request for lost message. Data is unsigned integer
+ * that uniquely identifies the message.
+ */
+ REQUEST,
+
+ /**
+ * Response to request. Begins with unsigned integer that represents
+ * which message is being repeated and the actual null-terminated
+ * message after that.
+ */
+ REPLY,
+
+ /**
+ * UUID that represents a particular device.
+ */
+ UUID
+};
+
+/**
+ * Packet data itself is a special type of tlv. A packet is either regular,
+ * hearbeat or discovery.
+ *
+ * May be used to send data.
+ */
+struct tlv_packet {
+ enum packet_type type;
+ size_t size;
+ size_t offset;
+ char *data; /* Bytes representing tlv's */
+};
+
+/**
+ * Literally type-length-value
+ * */
+struct tlv {
+ enum tlv_type type;
+ size_t length;
+ void *data;
+};
+
+struct tlv_parser {
+ char *data;
+ size_t offset;
+ size_t size;
+};
+
+int get_tlv(struct tlv_parser *parser, struct tlv *ret);
+
+/**
+ * Appends data to the next packet to be sent. Type of data is determined by
+ * enum tlv_type.
+ *
+ * In case of overflow return E_TLV_OVERFLOW.
+ *
+ * On next call after retreiving last packet returns END_OF_PACKET.
+ *
+ * Overflow can be detected after forming tlv header. This means that the
+ * packet may have changes.
+ * */
+int push_data(struct tlv_packet *packet, enum tlv_type type, char *data);
+
+
+/**
+ * Resets offset to 0 and set entire buffer to 0.
+ */
+void clear_data(struct tlv_packet *packet);
+
+
+/**
+ * Tells what size of buffer is needed for next tlv.
+ */
+size_t tlv_data_size(struct tlv_parser *parser);
+
+#endif /* USURPATION_PROTOCOL_H_INCLUDED */