summaryrefslogtreecommitdiffstats
path: root/src/common/protocol_private.h
blob: eecbc152180a637134c9b32da2432fb4a7141989 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
 * Usurpataion --- server-client protocol private 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 PROTOCOL_H_PRIVATE
#define PROTOCOL_H_PRIVATE

#include "utils.h"

#define E_PACKET_OVERFLOW	(1 << 0)

/** Read as "A maximum of 16 tlv's per packet". */
#define TLV_BUF_SIZE	(16)

/* Pease don't rape the buffer with long messages, daemon-kun. */
#define MSG_BUF_SIZE	(257)

/* Maximum size of packet that can fit into the packet buffer. UDP can carry
 * bigger packets but memory is hard to come by and more won't be needed
 * anyway.
 * */
#define PACKET_MAX_SIZE	(512)

/**
 * Returns the amount of tlv's int a packet.
 *
 * If a tlv reports length that goes beyond the end of a packet, errno is set
 * to TLV_OVERFLOW. To check this, set errno to 0 first.
 *
 * @param packet data parsed from a packet. Function cannot use raw packets.
 *
 * @return Amount of tlv's in a packet.
 * */
size_t tlv_count(const struct packet_data * const packet_data);

/**
 * Parses tlv's from packet data and writes them to a buffer of given size.
 *
 * Returns how many tlv's were actually parsed.
 *
 * To check for errors, set errno to 0 and check after calling.
 *
 * Not yet implemented.
 *
 * @param data Data from network packet
 * @param buf Buffer to store parsed tlv's
 * @param buf_size Size of buffer used to store tlv's
 *
 * @return Number of tlv's actually parsed. Greter than or equal to buffer
 * size, if an error occurs.
 * */
size_t get_tlvs(	const struct packet_data * const data,
			const struct tlv *buf,
			size_t buf_size);

/** Takes a null-terminated string and appends it to the next outgoing packet.
 *
 * @return Returns 0 on success. Otherwise: E_PACKET_OVERFLOW.
 *
 * */
int push_string(cd_t connection, char *str);

/** Reinterprets char * as fpi1_t * and appends it to the outgoing packet as a
 * tlv.
 */
int push_fpi1(cd_t connection, char *num);

/** Reinterprets char * as time_t * and appends it to the outgoing packet as a
 * tlv.
 */
int push_timestamp(cd_t connection, char *data);

/**
 * Pushes a request for daemon to repeat a message identified by a msg_index_t.
 *
 * @param data Pointer to a msg_index_t.
 *
 * @return 0 on success or E_PACKET_OVERFLOW, if not enough space is available
 * to push all the data.
 */
int push_request(cd_t connection, char *data);

/**
 * Pushes a message to the outgoing packet buffer as a reply. A reply is just
 * a null terminated string.
 *
 * @param data msg_idx_t representing sequence number since beggining of
 * connection and a null-terminated string.
 *
 * @return On success --- 0 or E_PACKET_OVERFLOW, if not enough buffer is
 * available.
 */
int push_reply(cd_t connection, char *data);

/** Reinterprets char * as uuid_t * and appends it to the outgoing packet as a
 * tlv.
 */
int push_uuid(cd_t connection, char *data);

/* Appends tlv_type and size of data to a packet effectively creating a tlv
 * header.
 */
int push_tlv_header(cd_t connection, enum tlv_type type, size_t size);

#endif /* PROTOCOL_H_PRIVATE */