summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/config.y7
-rw-r--r--src/fastd.h1
-rw-r--r--src/lex.c1
-rw-r--r--src/options.c4
-rw-r--r--src/options.def.h1
-rw-r--r--src/protocols/ec25519_fhmqvc/handshake.c3
6 files changed, 17 insertions, 0 deletions
diff --git a/src/config.y b/src/config.y
index 2bdd5d3..b4bd68b 100644
--- a/src/config.y
+++ b/src/config.y
@@ -74,6 +74,7 @@
%token TOK_BIND
%token TOK_CAPABILITIES
%token TOK_CIPHER
+%token TOK_CONNECT
%token TOK_DEBUG
%token TOK_DEBUG2
%token TOK_DEFAULT
@@ -198,6 +199,7 @@ statement: peer_group_statement
| TOK_ON TOK_UP on_up ';'
| TOK_ON TOK_DOWN on_down ';'
| TOK_ON TOK_POST_DOWN on_post_down ';'
+ | TOK_ON TOK_CONNECT on_connect ';'
| TOK_ON TOK_ESTABLISH on_establish ';'
| TOK_ON TOK_DISESTABLISH on_disestablish ';'
| TOK_ON TOK_VERIFY on_verify ';'
@@ -398,6 +400,11 @@ on_post_down: sync_def_sync TOK_STRING {
}
;
+on_connect: sync_def_async TOK_STRING {
+ fastd_shell_command_set(&conf->on_connect, $2->str, $1);
+ }
+ ;
+
on_establish: sync_def_async TOK_STRING {
fastd_shell_command_set(&conf->on_establish, $2->str, $1);
}
diff --git a/src/fastd.h b/src/fastd.h
index c117cdc..1ce1055 100644
--- a/src/fastd.h
+++ b/src/fastd.h
@@ -209,6 +209,7 @@ struct fastd_config {
fastd_shell_command_t on_up;
fastd_shell_command_t on_down;
fastd_shell_command_t on_post_down;
+ fastd_shell_command_t on_connect;
fastd_shell_command_t on_establish;
fastd_shell_command_t on_disestablish;
fastd_shell_command_t on_verify;
diff --git a/src/lex.c b/src/lex.c
index d5f4c4f..92a3866 100644
--- a/src/lex.c
+++ b/src/lex.c
@@ -56,6 +56,7 @@ static const keyword_t keywords[] = {
{ "bind", TOK_BIND },
{ "capabilities", TOK_CAPABILITIES },
{ "cipher", TOK_CIPHER },
+ { "connect", TOK_CONNECT },
{ "debug", TOK_DEBUG },
{ "debug2", TOK_DEBUG2 },
{ "default", TOK_DEFAULT },
diff --git a/src/options.c b/src/options.c
index a4c334f..0fb3baa 100644
--- a/src/options.c
+++ b/src/options.c
@@ -285,6 +285,10 @@ static void option_on_post_down(fastd_context_t *ctx UNUSED, fastd_config_t *con
fastd_shell_command_set(&conf->on_post_down, arg, true);
}
+static void option_on_connect(fastd_context_t *ctx UNUSED, fastd_config_t *conf, const char *arg) {
+ fastd_shell_command_set(&conf->on_connect, arg, false);
+}
+
static void option_on_establish(fastd_context_t *ctx UNUSED, fastd_config_t *conf, const char *arg) {
fastd_shell_command_set(&conf->on_establish, arg, false);
}
diff --git a/src/options.def.h b/src/options.def.h
index 8a85751..cb4480f 100644
--- a/src/options.def.h
+++ b/src/options.def.h
@@ -40,6 +40,7 @@ OPTION_ARG(option_on_pre_up, "--on-pre-up", "<command>", "Sets a shell command t
OPTION_ARG(option_on_up, "--on-up", "<command>", "Sets a shell command to execute after interface creation");
OPTION_ARG(option_on_down, "--on-down", "<command>", "Sets a shell command to execute before interface destruction");
OPTION_ARG(option_on_post_down, "--on-post-down", "<command>", "Sets a shell command to execute after interface destruction");
+OPTION_ARG(option_on_connect, "--on-connect", "<command>", "Sets a shell command to execute when a handshake is sent to establish a new connection");
OPTION_ARG(option_on_establish, "--on-establish", "<command>", "Sets a shell command to execute when a new connection is established");
OPTION_ARG(option_on_disestablish, "--on-disestablish", "<command>", "Sets a shell command to execute when a connection is lost");
OPTION_ARG(option_on_verify, "--on-verify", "<command>", "Sets a shell command to execute to check a connection attempt by an unknown peer");
diff --git a/src/protocols/ec25519_fhmqvc/handshake.c b/src/protocols/ec25519_fhmqvc/handshake.c
index 6de47ef..27cb843 100644
--- a/src/protocols/ec25519_fhmqvc/handshake.c
+++ b/src/protocols/ec25519_fhmqvc/handshake.c
@@ -533,6 +533,9 @@ void fastd_protocol_ec25519_fhmqvc_handshake_init(fastd_context_t *ctx, const fa
fastd_handshake_add(ctx, &buffer, RECORD_SENDER_HANDSHAKE_KEY, PUBLICKEYBYTES, &ctx->protocol_state->handshake_key.key.public);
+ if (!peer || !fastd_peer_is_established(peer))
+ fastd_shell_command_exec(ctx, &ctx->conf->on_connect, peer, (local_addr && local_addr->sa.sa_family) ? local_addr : sock->bound_addr, remote_addr, NULL);
+
fastd_send_handshake(ctx, sock, local_addr, remote_addr, peer, buffer);
}