summaryrefslogtreecommitdiff
path: root/include/zaprus.h
blob: 6856a5e909cde919c946a01e015be6c5f3b0ee5f (plain) (blame)
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
// client

#include<stdint.h>
#include<stdlib.h>

int zaprus_init(void);

int zaprus_deinit(void);

int zaprus_send_relay(const char* payload, size_t len, char dest[4]);

int zaprus_send_initial_connection(const char* payload, size_t len, uint16_t initial_port);

struct SaprusMessage* zaprus_connect(const char* payload, size_t len);

// message
#define SAPRUS_RELAY_MESSAGE_TYPE 0x003C
#define SAPRUS_FILE_TRANSFER_MESSAGE_TYPE 0x8888
#define SAPRUS_CONNECTION_MESSAGE_TYPE 0x00E9

struct SaprusMessage {
  uint16_t packet_type;
  union {
    struct {
      struct {
	char dest[4];
      };
      size_t payload_len;
      char *payload;
    } relay;
    struct {
      struct {
	uint16_t src_port;
	uint16_t dest_port;
	uint32_t seq_num;
	uint32_t msg_id;
	char _reserved;
	char options;
      };
      size_t payload_len;
      char *payload;
    } connection;
  };
};

// ptr should be freed by the caller.
int zaprus_message_to_bytes(struct SaprusMessage msg, char** ptr, size_t* len);

// Return value should be destroyed with zaprus_message_deinit.
struct SaprusMessage* zaprus_message_from_bytes(const char* bytes, size_t len);

void zaprus_message_deinit(struct SaprusMessage* msg);