summaryrefslogtreecommitdiffstats
path: root/src/handshake.c
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2015-03-22 17:36:00 +0100
committerMatthias Schiffer <mschiffer@universe-factory.net>2015-03-22 17:38:05 +0100
commit1fab069bfd15976eaef26a3cecae283105d4e9db (patch)
treecf147e52dcac60fc1d5dd7f9275ec6ba6cbc8902 /src/handshake.c
parent50a9a48b2532d735d17bf3a74f0e1431d6d51417 (diff)
downloadfastd-1fab069bfd15976eaef26a3cecae283105d4e9db.tar
fastd-1fab069bfd15976eaef26a3cecae283105d4e9db.zip
handshake: allow the internal mode IDs to differ from the mode ID in the handshakes
Diffstat (limited to 'src/handshake.c')
-rw-r--r--src/handshake.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/handshake.c b/src/handshake.c
index 14de253..4aa198d 100644
--- a/src/handshake.c
+++ b/src/handshake.c
@@ -104,6 +104,20 @@ static inline uint32_t as_uint(const fastd_handshake_record_t *record) {
}
+/** Returns the mode ID to use in the handshake TLVs */
+static inline uint8_t get_mode_id(void) {
+ switch (conf.mode) {
+ case MODE_TAP:
+ return 0;
+
+ case MODE_TUN:
+ return 1;
+
+ default:
+ exit_bug("get_mode_id: invalid mode");
+ }
+}
+
/** Generates a zero-separated list of supported methods */
static uint8_t * create_method_list(const fastd_string_stack_t *methods, size_t *len) {
size_t n = 0, i;
@@ -188,7 +202,7 @@ static fastd_handshake_buffer_t new_handshake(uint8_t type, bool little_endian,
packet->tlv_len = 0;
fastd_handshake_add_uint8(&buffer, RECORD_HANDSHAKE_TYPE, type);
- fastd_handshake_add_uint8(&buffer, RECORD_MODE, conf.mode);
+ fastd_handshake_add_uint8(&buffer, RECORD_MODE, get_mode_id());
fastd_handshake_add_uint16_endian(&buffer, RECORD_MTU, conf.mtu);
fastd_handshake_add(&buffer, RECORD_VERSION_NAME, version_len, FASTD_VERSION);
@@ -360,7 +374,7 @@ static inline bool check_records(fastd_socket_t *sock, const fastd_peer_address_
}
if (handshake->records[RECORD_MODE].data) {
- if (handshake->records[RECORD_MODE].length != 1 || as_uint8(&handshake->records[RECORD_MODE]) != conf.mode) {
+ if (handshake->records[RECORD_MODE].length != 1 || as_uint8(&handshake->records[RECORD_MODE]) != get_mode_id()) {
fastd_handshake_send_error(sock, local_addr, remote_addr, peer, handshake, REPLY_UNACCEPTABLE_VALUE, RECORD_MODE);
return false;
}