On 2016-01-26 at 00:11:53 +0100, Vadim Kochan <vadi...@gmail.com> 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 <vadi...@gmail.com>
> ---
>  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 netsniff-ng+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to