diff options
-rw-r--r-- | src/handshake.c | 25 | ||||
-rw-r--r-- | src/handshake.h | 17 |
2 files changed, 40 insertions, 2 deletions
diff --git a/src/handshake.c b/src/handshake.c index a17fd2b..2359af4 100644 --- a/src/handshake.c +++ b/src/handshake.c @@ -44,6 +44,7 @@ static const char const *RECORD_TYPES[RECORD_MAX] = { "(protocol specific 3)", "(protocol specific 4)", "(protocol specific 5)", + "MTU", }; static const char const *REPLY_TYPES[REPLY_MAX] = { @@ -53,13 +54,15 @@ static const char const *REPLY_TYPES[REPLY_MAX] = { }; #define AS_UINT8(ptr) (*(uint8_t*)(ptr).data) +#define AS_UINT16(ptr) ((*(uint8_t*)(ptr).data) + (*((uint8_t*)(ptr).data+1) << 8)) fastd_buffer fastd_handshake_new_init(fastd_context *ctx, fastd_peer *peer, size_t tail_space) { size_t protocol_len = strlen(ctx->conf->protocol->name); fastd_buffer buffer = fastd_buffer_alloc(sizeof(fastd_packet), 0, - 2*5 + /* handshake type, mode */ - 4+protocol_len+ /* protocol name */ + 2*5 + /* handshake type, mode */ + 6 + /* MTU */ + 4+protocol_len + /* protocol name */ tail_space ); fastd_packet *request = buffer.data; @@ -69,6 +72,7 @@ fastd_buffer fastd_handshake_new_init(fastd_context *ctx, fastd_peer *peer, size fastd_handshake_add_uint8(ctx, &buffer, RECORD_HANDSHAKE_TYPE, 1); fastd_handshake_add_uint8(ctx, &buffer, RECORD_MODE, ctx->conf->mode); + fastd_handshake_add_uint16(ctx, &buffer, RECORD_MTU, ctx->conf->mtu); fastd_handshake_add(ctx, &buffer, RECORD_PROTOCOL_NAME, protocol_len, ctx->conf->protocol->name); @@ -76,8 +80,15 @@ fastd_buffer fastd_handshake_new_init(fastd_context *ctx, fastd_peer *peer, size } fastd_buffer fastd_handshake_new_reply(fastd_context *ctx, fastd_peer *peer, const fastd_handshake *handshake, size_t tail_space) { + bool first = (AS_UINT8(handshake->records[RECORD_HANDSHAKE_TYPE]) == 1); + size_t mtu_size = 0; + + if (first) + mtu_size = 6; + fastd_buffer buffer = fastd_buffer_alloc(sizeof(fastd_packet), 0, 2*5 + /* handshake type, reply code */ + mtu_size + tail_space ); fastd_packet *request = buffer.data; @@ -88,6 +99,9 @@ fastd_buffer fastd_handshake_new_reply(fastd_context *ctx, fastd_peer *peer, con fastd_handshake_add_uint8(ctx, &buffer, RECORD_HANDSHAKE_TYPE, AS_UINT8(handshake->records[RECORD_HANDSHAKE_TYPE])+1); fastd_handshake_add_uint8(ctx, &buffer, RECORD_REPLY_CODE, 0); + if (first) + fastd_handshake_add_uint16(ctx, &buffer, RECORD_MTU, ctx->conf->mtu); + return buffer; } @@ -129,6 +143,13 @@ void fastd_handshake_handle(fastd_context *ctx, fastd_peer *peer, fastd_buffer b handshake.type = AS_UINT8(handshake.records[RECORD_HANDSHAKE_TYPE]); + if (handshake.records[RECORD_MTU].length == 2) { + if (AS_UINT16(handshake.records[RECORD_MTU]) != ctx->conf->mtu) { + pr_warn(ctx, "MTU configuration differs with peer %P: local MTU is %u, remote MTU is %u", + peer, ctx->conf->mtu, AS_UINT16(handshake.records[RECORD_MTU])); + } + } + if (handshake.type == 1) { uint8_t reply_code = REPLY_SUCCESS; uint8_t error_detail = 0; diff --git a/src/handshake.h b/src/handshake.h index d540de0..a5b861e 100644 --- a/src/handshake.h +++ b/src/handshake.h @@ -42,6 +42,7 @@ typedef enum _fastd_handshake_record_type { RECORD_PROTOCOL3, RECORD_PROTOCOL4, RECORD_PROTOCOL5, + RECORD_MTU, RECORD_MAX, } fastd_handshake_record_type; @@ -101,5 +102,21 @@ static inline void fastd_handshake_add_uint8(fastd_context *ctx, fastd_buffer *b buffer->len += 5; } +static inline void fastd_handshake_add_uint16(fastd_context *ctx, fastd_buffer *buffer, fastd_handshake_record_type type, uint16_t value) { + if ((uint8_t*)buffer->data + buffer->len + 6 > (uint8_t*)buffer->base + buffer->base_len) + exit_bug(ctx, "not enough buffer allocated for handshake"); + + uint8_t *dst = (uint8_t*)buffer->data + buffer->len; + + dst[0] = type; + dst[1] = type >> 8; + dst[2] = 2; + dst[3] = 0; + dst[4] = value; + dst[5] = value >> 8; + + buffer->len += 6; +} + #endif /* _FASTD_HANDSHAKE_H_ */ |