summaryrefslogtreecommitdiffstats
path: root/src/device/protocol_device.ino
diff options
context:
space:
mode:
authorGravatar Ramūnas Mažeikis <ramunasnezinomas@gmail.com> 2019-05-22 10:49:08 +0300
committerGravatar Ramūnas Mažeikis <ramunasnezinomas@gmail.com> 2019-05-22 10:49:08 +0300
commit13015f9a8d2b6b982d7d84e62943fbba15aee05a (patch)
treeb8e5802859019f9cda8459ecb45b4d04e9a79927 /src/device/protocol_device.ino
parent4bf68f9e9d553c924924296375269703c70c500a (diff)
downloadusurpation-13015f9a8d2b6b982d7d84e62943fbba15aee05a.tar.gz
usurpation-13015f9a8d2b6b982d7d84e62943fbba15aee05a.tar.bz2
usurpation-13015f9a8d2b6b982d7d84e62943fbba15aee05a.zip
Protocol: switched files to C++ and did minor fixes.
The code has a chance to compile now. No changes to actual build files yet.
Diffstat (limited to 'src/device/protocol_device.ino')
-rwxr-xr-xsrc/device/protocol_device.ino102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/device/protocol_device.ino b/src/device/protocol_device.ino
new file mode 100755
index 0000000..218ca85
--- /dev/null
+++ b/src/device/protocol_device.ino
@@ -0,0 +1,102 @@
+#include "net.h"
+#include "protocol.h"
+#include "protocol_private.h"
+#include "protocol_device_private.h"
+#include "settings.h"
+#include "udp.h"
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define READ_AS(type, from) (*((type*)(from)))
+
+static struct connection_t connection;
+
+cd_t protocol_init(void)
+{
+ connection.is_live = 1;
+ connection.nd = net_init(setting_port());
+ return 0;
+}
+
+int clear_data(cd_t cd)
+{
+ int ret = 0;
+ if (cd >= MAX_CONNECTIONS) {
+ ret = E_IVALID_DESCRIPTOR;
+ } else {
+ connection.inp_crs = 0;
+ }
+ return ret;
+}
+
+static int push_bytes(cd_t cd, char *data, size_t size)
+{
+ int ret = 0;
+
+ if (cd >= MAX_CONNECTIONS) {
+ ret = E_IVALID_DESCRIPTOR;
+ } else if (connection.outp_crs + size >= sizeof(connection.outp_buf)) {
+ ret = E_PACKET_OVERFLOW;
+ } else {
+ memcpy(connection.outp_buf, data, size);
+ connection.outp_crs += size;
+ }
+ return ret;
+}
+
+static int push_tlv_header(cd_t cd, enum tlv_type type, size_t size)
+{
+ int ret = 0;
+
+ if (cd >= MAX_CONNECTIONS) {
+ errno = E_IVALID_DESCRIPTOR;
+ ret = NULL;
+ } else if (connection.outp_crs >= MAX_PACKET_SIZE_IN) {
+ errno = E_TLV_OVERFLOW;
+ ret = NULL;
+ } else {
+ READ_AS(enum tlv_type, connection.outp_buf + connection.outp_crs)
+ = type;
+ connection.outp_crs += sizeof(enum tlv_type);
+ READ_AS(size_t, connection.outp_buf + connection.outp_crs) = size;
+ connection.outp_crs += sizeof(size_t);
+ }
+ return ret;
+}
+
+struct tlv * get_tlv(cd_t cd)
+{
+ struct tlv *ret = &connection.next_tlv;
+ size_t offset = connection.inp_crs;
+ char *data = connection.inp_buf;
+
+ if (cd >= MAX_CONNECTIONS) {
+ errno = E_IVALID_DESCRIPTOR;
+ ret = NULL;
+ } else if (offset >= MAX_PACKET_SIZE_IN) {
+ errno = E_TLV_OVERFLOW;
+ ret = NULL;
+ } else {
+ ret->type = READ_AS(enum tlv_type, data + offset);
+ offset += sizeof(enum tlv_type);
+ ret->length = READ_AS(size_t, data + offset);
+ offset += sizeof(size_t);
+ ret->data = data + offset;
+ connection.inp_crs = offset;
+ }
+ return ret;
+}
+
+int flush_data(cd_t cd)
+{
+ return 0;
+}
+
+int get_last_data(cd_t cd)
+{
+ if (cd >= MAX_CONNECTIONS) {
+ return E_IVALID_DESCRIPTOR;
+ }
+ net_getlastdata(connection.nd, connection.inp_buf);
+}