diff options
author | Vadim Kochan <vadim4j@gmail.com> | 2016-01-26 22:25:07 +0200 |
---|---|---|
committer | Tobias Klauser <tklauser@distanz.ch> | 2016-01-28 16:30:50 +0100 |
commit | 6b845387e5bf5f2b7c584900c87ac41daa1acf36 (patch) | |
tree | 1fcdc23e9addc14207f70d146a5f14b52c9a2dd9 /trafgen_lexer.l | |
parent | fac5a67eb5d4928f7efbf1f0d731a7e93f0f8193 (diff) |
trafgen: parser: Add syntax to generate ARP header fields
Add function 'arp()' to support generating ARP header fields from
the trafgen configuration language.
Supported fields:
htype hardware type, default: 1 (Ethernet)
ptype protocol type, default: 0x0800 (IP)
op|oper operation (req|request, reply, <num>), default: 1 (request)
sha|smac sender MAC address, default: device MAC
spa|sip sender IP address, default: device IP
tha|tmac target MAC address, default: 00:00:00:00:00:00
tpa|tip target IP address, default: 0.0.0.0
Note: setting hlen and tlen is not supported, these will by set to
hlen=6 and plen=4 in any case.
Example usage:
{ arp(op=request, sip=1.1.1.1, smac=11:22:33:44:55:66, tip=42.42.42.42) }
{ arp() }
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
[tk: document keywords in commit message]
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Diffstat (limited to 'trafgen_lexer.l')
-rw-r--r-- | trafgen_lexer.l | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/trafgen_lexer.l b/trafgen_lexer.l index d209116..5467c70 100644 --- a/trafgen_lexer.l +++ b/trafgen_lexer.l @@ -15,6 +15,7 @@ #include <string.h> #include <ctype.h> #include <stdbool.h> +#include <arpa/inet.h> #include "trafgen_parser.tab.h" #include "xmalloc.h" @@ -78,6 +79,7 @@ number_ascii ([a-zA-Z]) mac_hex ([a-fA-F0-9]+) mac ({mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}) +ip_addr ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) %% @@ -107,7 +109,18 @@ mac ({mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}) "saddr"|"sa" { return K_SADDR; } "prot"[o]? { return K_PROT; } +"sha"|"smac" { return K_SHA; } +"spa"|"sip" { return K_SPA; } +"tha"|"tmac" { return K_THA; } +"tpa"|"tip" { return K_TPA; } +"req"|"request" { return K_REQUEST; } +"reply" { return K_REPLY; } +"op"|"oper" { return K_OPER; } +"htype" { return K_HTYPE; } +"ptype" { return K_PTYPE; } + "eth" { return K_ETH; } +"arp" { return K_ARP; } [ ]*"-"[ ]* { return '-'; } [ ]*"+"[ ]* { return '+'; } @@ -161,6 +174,10 @@ mac ({mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}) panic("Failed to parse MAC address %s\n", yytext); return mac; } +{ip_addr} { if (inet_pton(AF_INET, yytext, &yylval.ip_addr) != 1) + panic("Failed to parse IPv4 address %s\n", yytext); + return ip_addr; }; + "'\\x"[a-fA-F0-9]{2}"'" { yylval.number = strtol(yytext + 3, NULL, 16); return number; } |