diff options
author | Vadim Kochan <vadim4j@gmail.com> | 2016-01-29 00:06:27 +0200 |
---|---|---|
committer | Tobias Klauser <tklauser@distanz.ch> | 2016-01-29 09:01:14 +0100 |
commit | 4f51efe253208cb906a31e75da21a1f718132486 (patch) | |
tree | 1a69e5623b175f16bf13969759edf9a9d9836d0e | |
parent | d275f16591ca44d91ee4e56d65553529a429a62d (diff) |
trafgen: parser: Add syntax to build UDP header
Add function 'udp()' to generate UDP header.
Fields supported:
sp|sport UDP source port (default 0)
dp|dport UDP destination port (default 0)
len|length Length of UDP header + payload (calculated automatically)
csum Checksum field (calculated automatically)
Example (Echo request):
{ udp(dport=7) }
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
-rw-r--r-- | trafgen_lexer.l | 4 | ||||
-rw-r--r-- | trafgen_parser.y | 29 |
2 files changed, 33 insertions, 0 deletions
diff --git a/trafgen_lexer.l b/trafgen_lexer.l index eeb252f..56011a3 100644 --- a/trafgen_lexer.l +++ b/trafgen_lexer.l @@ -133,9 +133,13 @@ ip_addr ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) "df" { return K_DF; } "mf" { return K_MF; } +"sp"|"sport" { return K_SPORT; } +"dp"|"dport" { return K_DPORT; } + "eth" { return K_ETH; } "arp" { return K_ARP; } "ip4"|"ipv4" { return K_IP4; } +"udp" { return K_UDP; } [ ]*"-"[ ]* { return '-'; } [ ]*"+"[ ]* { return '+'; } diff --git a/trafgen_parser.y b/trafgen_parser.y index ebc4054..9ec09b1 100644 --- a/trafgen_parser.y +++ b/trafgen_parser.y @@ -26,6 +26,7 @@ #include "trafgen_proto.h" #include "trafgen_l2.h" #include "trafgen_l3.h" +#include "trafgen_l4.h" #include "built_in.h" #include "die.h" #include "str.h" @@ -352,10 +353,12 @@ static void proto_add(enum proto_id pid) %token K_DADDR K_SADDR K_PROT %token K_OPER K_SHA K_SPA K_THA K_TPA K_REQUEST K_REPLY K_PTYPE K_HTYPE %token K_TTL K_DSCP K_ECN K_TOS K_LEN K_ID K_FLAGS K_FRAG K_IHL K_VER K_CSUM K_DF K_MF +%token K_SPORT K_DPORT %token K_ETH %token K_ARP %token K_IP4 +%token K_UDP %token ',' '{' '}' '(' ')' '[' ']' ':' '-' '+' '*' '/' '%' '&' '|' '<' '>' '^' @@ -578,6 +581,7 @@ proto : eth_proto { } | arp_proto { } | ip4_proto { } + | udp_proto { } ; eth_proto @@ -688,6 +692,31 @@ ip4 : K_IP4 { proto_add(PROTO_IP4); } ; +udp_proto + : udp '(' udp_param_list ')' { } + ; + +udp_param_list + : { } + | udp_field { } + | udp_field delimiter udp_param_list { } + ; + +udp_field + : K_SPORT skip_white '=' skip_white number + { proto_field_set_be16(hdr, UDP_SPORT, $5); } + | K_DPORT skip_white '=' skip_white number + { proto_field_set_be16(hdr, UDP_DPORT, $5); } + | K_LEN skip_white '=' skip_white number + { proto_field_set_be16(hdr, UDP_LEN, $5); } + | K_CSUM skip_white '=' skip_white number + { proto_field_set_be16(hdr, UDP_CSUM, $5); } + ; + +udp + : K_UDP { proto_add(PROTO_UDP); } + ; + %% static void finalize_packet(void) |