From 9a2efcce2eefe8ada0ae7a71d7b0bf6261d073b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Sun, 4 Aug 2019 11:16:19 +0300 Subject: [PATCH] Start working on file sending --- ethermess-backend.c | 73 +++++++++++++++++++++++++++++---------------- ethermess.py | 9 +++++- 2 files changed, 56 insertions(+), 26 deletions(-) diff --git a/ethermess-backend.c b/ethermess-backend.c index baba23b..1e40d5a 100644 --- a/ethermess-backend.c +++ b/ethermess-backend.c @@ -22,7 +22,7 @@ #include #include -#define EM_PROTOCOL_VERSION 0 +#define EM_PROTOCOL_VERSION 1 #define EM_MESSAGE_MAX_LENGTH (1500 - 2 - 2 - 2) #define EM_STATUS_BROADCAST_TIME (60 * 1000 + 1000 * random_byte() / 64) #define EM_RETRANSMIT_TIME (1000 + random_byte() * 2) @@ -37,6 +37,9 @@ #define EMT_MESSAGE 5 #define EMT_ACK 6 +// Version 1 +#define EMT_FILE_OFFER 7 + #define EMS_AVAILABLE 0 #define EMS_UNAVAILABLE 1 #define EMS_OFFLINE 2 @@ -395,6 +398,14 @@ void send_ack(const unsigned char destination[6], uint16_t msgid) { send_frame(frame, sizeof(frame)); } +void send_file_offer(const unsigned char destination[6]) { + unsigned char frame[14 + 2]; + + write_headers(frame, destination, 1, EMT_FILE_OFFER); + + send_frame(frame, sizeof(frame)); +} + void readallx(int fd, unsigned char *buf, size_t length) { size_t completed = 0; while (completed < length) { @@ -496,6 +507,10 @@ void read_command(void) { send_status(broadcast_mac); } else if (cmd == 'm') { read_message(); + } else if (cmd == 'f') { + unsigned char mac[6]; + readallx(0, mac, sizeof(mac)); + send_file_offer(mac); } else { errx(1, "Frontend sent an unknown command %c", cmd); } @@ -867,35 +882,43 @@ void process_frame(void) { // Extract Ethermess packet type unsigned char packet_type = frame[15]; - // Process the packet based on the packet type - switch (packet_type) { - case EMT_STATUS_REQUEST: - if (check_padding(&frame[16], 0, packet_length - 16)) { - send_status(source_mac); - } - break; + // Process the packet based on the version and packet type + if (version == 0) { + switch (packet_type) { + case EMT_STATUS_REQUEST: + if (check_padding(&frame[16], 0, packet_length - 16)) { + send_status(source_mac); + } + break; - case EMT_STATUS: - handle_status(source_mac, &frame[16], packet_length - 16); - break; + case EMT_STATUS: + handle_status(source_mac, &frame[16], packet_length - 16); + break; - case EMT_MSGID_REQUEST: - if (check_padding(&frame[16], 0, packet_length - 16)) { - send_msgid(source_mac); - } - break; + case EMT_MSGID_REQUEST: + if (check_padding(&frame[16], 0, packet_length - 16)) { + send_msgid(source_mac); + } + break; - case EMT_MSGID: - handle_msgid(source_mac, &frame[16], packet_length - 16); - break; + case EMT_MSGID: + handle_msgid(source_mac, &frame[16], packet_length - 16); + break; - case EMT_MESSAGE: - handle_message(source_mac, &frame[16], packet_length - 16); - break; + case EMT_MESSAGE: + handle_message(source_mac, &frame[16], packet_length - 16); + break; - case EMT_ACK: - handle_ack(source_mac, &frame[16], packet_length - 16); - break; + case EMT_ACK: + handle_ack(source_mac, &frame[16], packet_length - 16); + break; + } + } else if (version == 1) { + switch (packet_type) { + case EMT_FILE_OFFER: + fprintf(stderr, "File offered\n"); //debg + break; + } } } diff --git a/ethermess.py b/ethermess.py index 230b411..1be7832 100644 --- a/ethermess.py +++ b/ethermess.py @@ -208,6 +208,9 @@ def set_status_nick(backend, status, nick): encoded = nick.encode('utf-8') writeall(backend, b's' + bytes([status.value, len(encoded)]) + encoded) +def send_file_offer(backend, mac): + writeall(backend, b'f' + mac) + def handle_user_command(backend, line): global own_nick, own_status global default_target_mac @@ -290,13 +293,17 @@ def handle_user_command(backend, line): # Set default target of messages default_target_mac = mac_from_name(rest) + elif command == '/sendfile': + # Send an offer to transmit the file + send_file_offer(backend, mac_from_name(rest)) + elif command == '/quit': # Quit return 'quit' else: # Display usage - print('--- / ; /msg ; /status []; /peers; /available; /unavailable; /nick []; /target ; /quit') + print('--- / ; /msg ; /status []; /peers; /available; /unavailable; /nick []; /target ; /sendfile ; /quit') else: # Send message