On 2016-01-26 at 00:11:53 +0100, Vadim Kochan <[email protected]> wrote:
> Add syntax to generate ARP header fields:
>
> { arp(op=req, sip=1.1.1.1, smac=11:22:33:44:55:66) }
> { arp() }
>
> Signed-off-by: Vadim Kochan <[email protected]>
> ---
> trafgen_lexer.l | 15 +++++++++++++++
> trafgen_parser.y | 38 +++++++++++++++++++++++++++++++++++++-
> 2 files changed, 52 insertions(+), 1 deletion(-)
>
> diff --git a/trafgen_lexer.l b/trafgen_lexer.l
> index ac4fec1..e89d8c8 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,16 @@ mac
> ({mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}:{mac_hex})
> "saddr"|"sa" { return K_SADDR; }
> "prot"[o]? { return K_PROT; }
>
Shouldn't we allow to specify htype, ptype, hlen and plen as well (as a
user might want to set non-conforming values)?
> +"sha"|"smac" { return K_SHA; }
> +"spa"|"sip" { return K_SPA; }
> +"tha"|"tmac" { return K_THA; }
> +"tpa"|"tip" { return K_TPA; }
> +"req" { return K_REQ; }
Please add "request" as well.
> +"resp"|"reply" { return K_RESP; }
I'd stick to the term "reply" as this is the one used in RFC 826 and
drop "resp" alltogether.
> +"op" { return K_OPER; }
Please add "oper" as well.
> +
> "eth" { return K_ETH; }
> +"arp" { return K_ARP; }
>
> [ ]*"-"[ ]* { return '-'; }
> [ ]*"+"[ ]* { return '+'; }
> @@ -161,6 +172,10 @@ mac
> ({mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}:{mac_hex}:{mac_hex})
> panic("Failed to parse MAC addres %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; }
>
> diff --git a/trafgen_parser.y b/trafgen_parser.y
> index df1b1a6..5c9dcd9 100644
> --- a/trafgen_parser.y
> +++ b/trafgen_parser.y
> @@ -17,6 +17,8 @@
> #include <errno.h>
> #include <stdbool.h>
> #include <libgen.h>
> +#include <net/if_arp.h>
> +#include <netinet/in.h>
>
> #include "xmalloc.h"
> #include "trafgen_parser.tab.h"
> @@ -337,6 +339,7 @@ static void proto_add(enum proto_id pid)
> %}
>
> %union {
> + struct in_addr ip_addr;
> long long int number;
> uint8_t bytes[256];
> char *str;
> @@ -346,15 +349,19 @@ static void proto_add(enum proto_id pid)
> %token K_CPU K_CSUMIP K_CSUMUDP K_CSUMTCP K_CSUMUDP6 K_CSUMTCP6 K_CONST8
> K_CONST16 K_CONST32 K_CONST64
>
> %token K_DADDR K_SADDR K_PROT
> +%token K_OPER K_SHA K_SPA K_THA K_TPA K_REQ K_RESP
> +
> %token K_ETH
> +%token K_ARP
>
> %token ',' '{' '}' '(' ')' '[' ']' ':' '-' '+' '*' '/' '%' '&' '|' '<' '>'
> '^'
>
> -%token number string mac
> +%token number string mac ip_addr
>
> %type <number> number expression
> %type <str> string
> %type <bytes> mac
> +%type <ip_addr> ip_addr
>
> %left '-' '+' '*' '/' '%' '&' '|' '<' '>' '^'
>
> @@ -566,6 +573,7 @@ ddec
>
> proto
> : eth_proto { }
> + | arp_proto { }
> ;
>
> eth_proto
> @@ -591,6 +599,34 @@ eth_field
> { proto_field_set_be16(hdr, ETH_PROTO_ID, $5); }
> ;
>
> +arp_proto
> + : arp '(' arp_param_list ')' { }
> + ;
> +
> +arp_param_list
> + : { }
> + | arp_field { }
> + | arp_field delimiter arp_param_list { }
> + ;
> +
> +arp_field
> + : K_OPER skip_white '=' skip_white K_REQ
> + { proto_field_set_be16(hdr, ARP_OPER, ARPOP_REQUEST); }
> + | K_OPER skip_white '=' skip_white K_RESP
> + { proto_field_set_be16(hdr, ARP_OPER, ARPOP_REPLY); }
Would be nice to allow numeric values here as well (again, to be able to
specify values not conforming to the standard).
> + | K_SHA skip_white '=' skip_white mac
> + { proto_field_set_bytes(hdr, ARP_SHA, $5); }
> + | K_THA skip_white '=' skip_white mac
> + { proto_field_set_bytes(hdr, ARP_THA, $5); }
> + | K_SPA skip_white '=' skip_white ip_addr
> + { proto_field_set_u32(hdr, ARP_SPA, $5.s_addr); }
> + | K_TPA skip_white '=' skip_white ip_addr
> + { proto_field_set_u32(hdr, ARP_TPA, $5.s_addr); }
> + ;
> +arp
> + : K_ARP { proto_add(PROTO_ARP); }
> + ;
> +
> %%
>
> static void finalize_packet(void)
> --
> 2.6.3
>
--
You received this message because you are subscribed to the Google Groups
"netsniff-ng" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.