mirror of
https://github.com/neocturne/fastd.git
synced 2025-05-14 12:25:07 +02:00
Change parse to push API, fix some parser bugs
This commit is contained in:
parent
6ce20e2bb6
commit
59a5b83321
8 changed files with 73 additions and 56 deletions
20
src/config.c
20
src/config.c
|
@ -90,6 +90,10 @@ static bool config_match(const char *opt, ...) {
|
||||||
|
|
||||||
static void fastd_read_config(fastd_context *ctx, fastd_config *conf, const char *filename) {
|
static void fastd_read_config(fastd_context *ctx, fastd_config *conf, const char *filename) {
|
||||||
yyscan_t scanner;
|
yyscan_t scanner;
|
||||||
|
fastd_config_pstate *ps;
|
||||||
|
int token;
|
||||||
|
YYSTYPE token_val;
|
||||||
|
|
||||||
FILE *file;
|
FILE *file;
|
||||||
bool use_stdin = !strcmp(filename, "-");
|
bool use_stdin = !strcmp(filename, "-");
|
||||||
|
|
||||||
|
@ -98,12 +102,20 @@ static void fastd_read_config(fastd_context *ctx, fastd_config *conf, const char
|
||||||
else
|
else
|
||||||
file = fopen(filename, "r");
|
file = fopen(filename, "r");
|
||||||
|
|
||||||
fastd_config_lex_init(&scanner);
|
fastd_config_yylex_init(&scanner);
|
||||||
fastd_config_set_in(file, scanner);
|
fastd_config_yyset_in(file, scanner);
|
||||||
|
|
||||||
fastd_config_parse(ctx, conf, scanner);
|
ps = fastd_config_pstate_new();
|
||||||
|
|
||||||
fastd_config_lex_destroy(scanner);
|
do {
|
||||||
|
token = fastd_config_yylex(&token_val, scanner);
|
||||||
|
|
||||||
|
if (token < 0)
|
||||||
|
exit_error(ctx, "config error: %s", token_val.str);
|
||||||
|
} while(fastd_config_push_parse(ps, token, &token_val, ctx, conf) == YYPUSH_MORE);
|
||||||
|
|
||||||
|
fastd_config_pstate_delete(ps);
|
||||||
|
fastd_config_yylex_destroy(scanner);
|
||||||
|
|
||||||
if (!use_stdin)
|
if (!use_stdin)
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
|
27
src/config.l
27
src/config.l
|
@ -1,4 +1,4 @@
|
||||||
%option prefix="fastd_config_"
|
%option prefix="fastd_config_yy"
|
||||||
%option noyywrap
|
%option noyywrap
|
||||||
%option bison-bridge
|
%option bison-bridge
|
||||||
%option reentrant
|
%option reentrant
|
||||||
|
@ -7,10 +7,11 @@
|
||||||
#include <config.yy.h>
|
#include <config.yy.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
%x STRING
|
%s STRING
|
||||||
%x ADDR6
|
%s ADDR6
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
<INITIAL>{
|
||||||
[0-9]+ { yylval->num = atoi(yytext); return TOK_INTEGER; }
|
[0-9]+ { yylval->num = atoi(yytext); return TOK_INTEGER; }
|
||||||
|
|
||||||
interface { yylval->str = yytext; return TOK_INTERFACE; }
|
interface { yylval->str = yytext; return TOK_INTERFACE; }
|
||||||
|
@ -26,7 +27,7 @@ key { yylval->str = yytext; return TOK_KEY; }
|
||||||
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} {
|
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} {
|
||||||
if (!inet_pton(AF_INET, yytext, &yylval->addr)) {
|
if (!inet_pton(AF_INET, yytext, &yylval->addr)) {
|
||||||
yylval->str = "invalid address";
|
yylval->str = "invalid address";
|
||||||
return TOK_ERROR;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TOK_ADDR;
|
return TOK_ADDR;
|
||||||
|
@ -38,27 +39,33 @@ tun { yylval->str = yytext; return TOK_TUN; }
|
||||||
|
|
||||||
[A-Za-z_][A-Za-z0-9_]* { yylval->str = yytext; return TOK_IDENTIFIER; }
|
[A-Za-z_][A-Za-z0-9_]* { yylval->str = yytext; return TOK_IDENTIFIER; }
|
||||||
|
|
||||||
[;:\{\}] { return *yytext; }
|
[;:\{\}] { return yytext[0]; }
|
||||||
|
|
||||||
[ \t\n] ;
|
[ \t\n] ;
|
||||||
|
}
|
||||||
|
|
||||||
\" BEGIN(STRING);
|
<INITIAL>\"\" { yylval->str = ""; return TOK_STRING; }
|
||||||
|
<INITIAL>\" BEGIN(STRING);
|
||||||
<STRING>[^"]* { yylval->str = yytext; return TOK_STRING; }
|
<STRING>[^"]* { yylval->str = yytext; return TOK_STRING; }
|
||||||
<STRING>\" BEGIN(INITIAL);
|
<STRING>\" BEGIN(INITIAL);
|
||||||
|
|
||||||
\[ BEGIN(ADDR6);
|
<INITIAL>\[ BEGIN(ADDR6);
|
||||||
<ADDR6>[^\]]+ {
|
<ADDR6>[^\]]+ {
|
||||||
if (!inet_pton(AF_INET6, yytext, &yylval->addr6)) {
|
if (!inet_pton(AF_INET6, yytext, &yylval->addr6)) {
|
||||||
yylval->str = "invalid address";
|
yylval->str = "invalid address";
|
||||||
return TOK_ERROR;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TOK_ADDR6;
|
return TOK_ADDR6;
|
||||||
}
|
}
|
||||||
<ADDR6>\] BEGIN(INITIAL);
|
<ADDR6>\] BEGIN(INITIAL);
|
||||||
|
|
||||||
<INITIAL,STRING,ADDR6>. {
|
. {
|
||||||
yylval->str = "invalid character";
|
yylval->str = "invalid character";
|
||||||
return TOK_ERROR;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<INITIAL><<EOF>> { return 0; }
|
||||||
|
<STRING><<EOF>> { yylval->str = "unterminated string"; return -1; }
|
||||||
|
<ADDR6><<EOF>> { yylval->str = "unterminated address"; return -1; }
|
||||||
%%
|
%%
|
||||||
|
|
17
src/config.y
17
src/config.y
|
@ -1,11 +1,11 @@
|
||||||
%define api.pure
|
%define api.pure
|
||||||
|
%define api.push-pull push
|
||||||
%name-prefix "fastd_config_"
|
%name-prefix "fastd_config_"
|
||||||
%lex-param {yyscan_t scanner}
|
|
||||||
%parse-param {fastd_context *ctx}
|
%parse-param {fastd_context *ctx}
|
||||||
%parse-param {fastd_config *conf}
|
%parse-param {fastd_config *conf}
|
||||||
%parse-param {yyscan_t scanner}
|
|
||||||
|
|
||||||
%code requires {
|
%code requires {
|
||||||
|
#include <fastd.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,8 +16,6 @@
|
||||||
struct in6_addr addr6;
|
struct in6_addr addr6;
|
||||||
}
|
}
|
||||||
|
|
||||||
%token <str> TOK_ERROR;
|
|
||||||
|
|
||||||
%token <num> TOK_INTEGER
|
%token <num> TOK_INTEGER
|
||||||
%token <str> TOK_STRING
|
%token <str> TOK_STRING
|
||||||
%token <str> TOK_IDENTIFIER
|
%token <str> TOK_IDENTIFIER
|
||||||
|
@ -41,11 +39,10 @@
|
||||||
|
|
||||||
%code {
|
%code {
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <config.ll.h>
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <peer.h>
|
#include <peer.h>
|
||||||
|
|
||||||
void fastd_config_error(fastd_context *ctx, fastd_config *conf, yyscan_t scanner, char *s);
|
void fastd_config_error(fastd_context *ctx, fastd_config *conf, char *s);
|
||||||
|
|
||||||
extern fastd_protocol fastd_protocol_null;
|
extern fastd_protocol fastd_protocol_null;
|
||||||
|
|
||||||
|
@ -54,10 +51,6 @@
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
%code provides {
|
|
||||||
#include <fastd.h>
|
|
||||||
int fastd_config_parse (fastd_context *ctx, fastd_config *conf, void *scanner);
|
|
||||||
}
|
|
||||||
|
|
||||||
%type <str> maybe_string
|
%type <str> maybe_string
|
||||||
|
|
||||||
|
@ -158,7 +151,7 @@ peer_key: TOK_STRING { free(conf->peers->key); conf->peers->key = strdup($1); }
|
||||||
|
|
||||||
|
|
||||||
maybe_string: TOK_STRING
|
maybe_string: TOK_STRING
|
||||||
| { $$[0] = '\0'; }
|
| { $$ = ""; }
|
||||||
;
|
;
|
||||||
|
|
||||||
maybe_port: ':' port { $$ = $2; }
|
maybe_port: ':' port { $$ = $2; }
|
||||||
|
@ -176,6 +169,6 @@ port: TOK_INTEGER {
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
%%
|
%%
|
||||||
void fastd_config_error(fastd_context *ctx, fastd_config *conf, yyscan_t scanner, char *s) {
|
void fastd_config_error(fastd_context *ctx, fastd_config *conf, char *s) {
|
||||||
exit_error(ctx, "config error: %s", s);
|
exit_error(ctx, "config error: %s", s);
|
||||||
}
|
}
|
||||||
|
|
|
@ -393,6 +393,8 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
update_time(&ctx);
|
update_time(&ctx);
|
||||||
|
|
||||||
|
conf.protocol->init(&ctx);
|
||||||
|
|
||||||
init_peers(&ctx);
|
init_peers(&ctx);
|
||||||
|
|
||||||
init_tuntap(&ctx);
|
init_tuntap(&ctx);
|
||||||
|
|
|
@ -62,11 +62,13 @@ struct _fastd_protocol {
|
||||||
bool (*handle_config)(fastd_context *ctx, const fastd_config *conf, const char *option);
|
bool (*handle_config)(fastd_context *ctx, const fastd_config *conf, const char *option);
|
||||||
bool (*check_config)(fastd_context *ctx, const fastd_config *conf);
|
bool (*check_config)(fastd_context *ctx, const fastd_config *conf);
|
||||||
|
|
||||||
|
void (*init)(fastd_context *ctx);
|
||||||
|
|
||||||
size_t (*max_packet_size)(fastd_context *ctx);
|
size_t (*max_packet_size)(fastd_context *ctx);
|
||||||
|
|
||||||
char* (*peer_str)(const fastd_context *ctx, const fastd_peer *peer);
|
char* (*peer_str)(const fastd_context *ctx, const fastd_peer *peer);
|
||||||
|
|
||||||
void (*init)(fastd_context *ctx, fastd_peer *peer);
|
void (*init_peer)(fastd_context *ctx, fastd_peer *peer);
|
||||||
|
|
||||||
void (*handle_recv)(fastd_context *ctx, fastd_peer *peer, fastd_buffer buffer);
|
void (*handle_recv)(fastd_context *ctx, fastd_peer *peer, fastd_buffer buffer);
|
||||||
void (*send)(fastd_context *ctx, fastd_peer *peer, fastd_buffer buffer);
|
void (*send)(fastd_context *ctx, fastd_peer *peer, fastd_buffer buffer);
|
||||||
|
@ -114,6 +116,8 @@ struct _fastd_context {
|
||||||
size_t eth_addr_size;
|
size_t eth_addr_size;
|
||||||
size_t n_eth_addr;
|
size_t n_eth_addr;
|
||||||
fastd_peer_eth_addr *eth_addr;
|
fastd_peer_eth_addr *eth_addr;
|
||||||
|
|
||||||
|
void *protocol_context;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -184,7 +184,7 @@ void fastd_handshake_handle(fastd_context *ctx, fastd_peer *peer, fastd_buffer b
|
||||||
case REPLY_SUCCESS:
|
case REPLY_SUCCESS:
|
||||||
pr_info(ctx, "Handshake with %P successful.", peer);
|
pr_info(ctx, "Handshake with %P successful.", peer);
|
||||||
fastd_peer_set_established(ctx, peer);
|
fastd_peer_set_established(ctx, peer);
|
||||||
ctx->conf->protocol->init(ctx, peer);
|
ctx->conf->protocol->init_peer(ctx, peer);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -36,9 +36,9 @@
|
||||||
#include <crypto_secretbox_xsalsa20poly1305.h>
|
#include <crypto_secretbox_xsalsa20poly1305.h>
|
||||||
|
|
||||||
|
|
||||||
typedef struct _protocol_config {
|
typedef struct _protocol_context {
|
||||||
ecc_secret_key_256 secret_key;
|
ecc_secret_key_256 secret_key;
|
||||||
} protocol_config;
|
} protocol_context;
|
||||||
|
|
||||||
typedef struct _protocol_peer_config {
|
typedef struct _protocol_peer_config {
|
||||||
ecc_public_key_256 public_key;
|
ecc_public_key_256 public_key;
|
||||||
|
@ -48,15 +48,13 @@ typedef struct _protocol_peer_state {
|
||||||
} protocol_peer_state;
|
} protocol_peer_state;
|
||||||
|
|
||||||
|
|
||||||
static bool protocol_handle_config(fastd_context *ctx, const fastd_config *conf, const char *option) {
|
|
||||||
printf("Unknown option: %s\n", option);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool protocol_check_config(fastd_context *ctx, const fastd_config *conf) {
|
static bool protocol_check_config(fastd_context *ctx, const fastd_config *conf) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void protocol_init(fastd_context *ctx) {
|
||||||
|
}
|
||||||
|
|
||||||
static size_t protocol_max_packet_size(fastd_context *ctx) {
|
static size_t protocol_max_packet_size(fastd_context *ctx) {
|
||||||
return (fastd_max_packet_size(ctx) - crypto_secretbox_xsalsa20poly1305_NONCEBYTES);
|
return (fastd_max_packet_size(ctx) - crypto_secretbox_xsalsa20poly1305_NONCEBYTES);
|
||||||
}
|
}
|
||||||
|
@ -94,7 +92,7 @@ static char* protocol_peer_str(const fastd_context *ctx, const fastd_peer *peer)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void protocol_init(fastd_context *ctx, fastd_peer *peer) {
|
static void protocol_init_peer(fastd_context *ctx, fastd_peer *peer) {
|
||||||
pr_info(ctx, "Initializing session with %P...", peer);
|
pr_info(ctx, "Initializing session with %P...", peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,14 +111,15 @@ static void protocol_free_peer_private(fastd_context *ctx, fastd_peer *peer) {
|
||||||
const fastd_protocol fastd_protocol_ec25519_fhmqvc_xsalsa20_poly1305 = {
|
const fastd_protocol fastd_protocol_ec25519_fhmqvc_xsalsa20_poly1305 = {
|
||||||
.name = "ec25519-fhmqvc-xsalsa20-poly1305",
|
.name = "ec25519-fhmqvc-xsalsa20-poly1305",
|
||||||
|
|
||||||
.handle_config = protocol_handle_config,
|
|
||||||
.check_config = protocol_check_config,
|
.check_config = protocol_check_config,
|
||||||
|
|
||||||
|
.init = protocol_init,
|
||||||
|
|
||||||
.max_packet_size = protocol_max_packet_size,
|
.max_packet_size = protocol_max_packet_size,
|
||||||
|
|
||||||
.peer_str = protocol_peer_str,
|
.peer_str = protocol_peer_str,
|
||||||
|
|
||||||
.init = protocol_init,
|
.init_peer = protocol_init_peer,
|
||||||
.handle_recv = protocol_handle_recv,
|
.handle_recv = protocol_handle_recv,
|
||||||
.send = protocol_send,
|
.send = protocol_send,
|
||||||
|
|
||||||
|
|
|
@ -34,10 +34,6 @@
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
|
||||||
static bool protocol_handle_config(fastd_context *ctx, const fastd_config *conf, const char *option) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool protocol_check_config(fastd_context *ctx, const fastd_config *conf) {
|
static bool protocol_check_config(fastd_context *ctx, const fastd_config *conf) {
|
||||||
if (conf->n_floating > 1) {
|
if (conf->n_floating > 1) {
|
||||||
pr_error(ctx, "with protocol `null' use can't define more than one floating peer");
|
pr_error(ctx, "with protocol `null' use can't define more than one floating peer");
|
||||||
|
@ -47,6 +43,9 @@ static bool protocol_check_config(fastd_context *ctx, const fastd_config *conf)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void protocol_init(fastd_context *ctx) {
|
||||||
|
}
|
||||||
|
|
||||||
static size_t protocol_max_packet_size(fastd_context *ctx) {
|
static size_t protocol_max_packet_size(fastd_context *ctx) {
|
||||||
return fastd_max_packet_size(ctx);
|
return fastd_max_packet_size(ctx);
|
||||||
}
|
}
|
||||||
|
@ -84,7 +83,7 @@ static char* protocol_peer_str(const fastd_context *ctx, const fastd_peer *peer)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void protocol_init(fastd_context *ctx, fastd_peer *peer) {
|
static void protocol_init_peer(fastd_context *ctx, fastd_peer *peer) {
|
||||||
pr_info(ctx, "Connection with %P established.", peer);
|
pr_info(ctx, "Connection with %P established.", peer);
|
||||||
|
|
||||||
fastd_task_put_send(ctx, peer, fastd_buffer_alloc(0, 0, 0));
|
fastd_task_put_send(ctx, peer, fastd_buffer_alloc(0, 0, 0));
|
||||||
|
@ -129,14 +128,15 @@ static void protocol_free_peer_private(fastd_context *ctx, fastd_peer *peer) {
|
||||||
const fastd_protocol fastd_protocol_null = {
|
const fastd_protocol fastd_protocol_null = {
|
||||||
.name = "null",
|
.name = "null",
|
||||||
|
|
||||||
.handle_config = protocol_handle_config,
|
|
||||||
.check_config = protocol_check_config,
|
.check_config = protocol_check_config,
|
||||||
|
|
||||||
|
.init = protocol_init,
|
||||||
|
|
||||||
.max_packet_size = protocol_max_packet_size,
|
.max_packet_size = protocol_max_packet_size,
|
||||||
|
|
||||||
.peer_str = protocol_peer_str,
|
.peer_str = protocol_peer_str,
|
||||||
|
|
||||||
.init = protocol_init,
|
.init_peer = protocol_init_peer,
|
||||||
.handle_recv = protocol_handle_recv,
|
.handle_recv = protocol_handle_recv,
|
||||||
.send = protocol_send,
|
.send = protocol_send,
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue