summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Ramūnas Mažeikis <ramunasnezinomas@gmail.com> 2019-05-22 21:46:23 +0300
committerGravatar Ramūnas Mažeikis <ramunasnezinomas@gmail.com> 2019-05-22 21:46:23 +0300
commit3397ca1e68f69259cca56751af73f3f0706b6831 (patch)
treef05b1228d6435f426cf1bbdbda282e28177efc86
parent5e22764d79e42345d512216f07880fdd8db2edf2 (diff)
downloadusurpation-3397ca1e68f69259cca56751af73f3f0706b6831.tar.gz
usurpation-3397ca1e68f69259cca56751af73f3f0706b6831.tar.bz2
usurpation-3397ca1e68f69259cca56751af73f3f0706b6831.zip
Protocol: updated get_tlv and more docs.
Signed-off-by: Ramūnas Mažeikis <ramunasnezinomas@gmail.com>
-rw-r--r--include/protocol.h11
-rw-r--r--src/common/protocol.c2
2 files changed, 13 insertions, 0 deletions
diff --git a/include/protocol.h b/include/protocol.h
index cd28e2d..598b8e3 100644
--- a/include/protocol.h
+++ b/include/protocol.h
@@ -26,6 +26,7 @@
#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.
@@ -114,13 +115,23 @@ int get_tlv(struct tlv_parser *parser, struct tlv *ret);
*
* 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 /* PROTOCOL_H_INCLUDED */
diff --git a/src/common/protocol.c b/src/common/protocol.c
index 8680be7..bae38d8 100644
--- a/src/common/protocol.c
+++ b/src/common/protocol.c
@@ -106,6 +106,8 @@ int get_tlv(struct tlv_parser *parser, struct tlv *ret)
if (parser->offset + sizeof(ret->type) + sizeof(ret->length) >= parser->size) {
ret = E_TLV_OVERFLOW;
+ } else if (parser -> offset == parser->size) {
+ ret = END_OF_PACKET;
} else {
ret->type = memcpy(&ret->type, parser->data + parser->offset, sizeof(ret->type));
parser->size += sizeof(ret->type);