From 6c3eec6ad009d7ed8a219291b98886a80b26b8e4 Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Wed, 5 Dec 2012 19:39:00 +0100 Subject: parser: fix parsing protocol names for protocols which are also keywords "ip protocol tcp" will currently produce a syntax error since tcp is also a keyword which is expected ot be followed by a tcp header field. Allow to use protocol names that are also keywords and allocate a constant expression for them. --- src/parser.y | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/parser.y b/src/parser.y index 8e3d3639..b0d56e52 100644 --- a/src/parser.y +++ b/src/parser.y @@ -1350,6 +1350,13 @@ icmp_hdr_expr : ICMP icmp_hdr_field { $$ = payload_expr_alloc(&@$, &payload_icmp, $2); } + | ICMP + { + uint8_t data = IPPROTO_ICMP; + $$ = constant_expr_alloc(&@$, &inet_protocol_type, + BYTEORDER_HOST_ENDIAN, + sizeof(data), &data); + } ; icmp_hdr_field : TYPE { $$ = ICMPHDR_TYPE; } @@ -1381,6 +1388,13 @@ auth_hdr_expr : AH auth_hdr_field { $$ = payload_expr_alloc(&@$, &payload_ah, $2); } + | AH + { + uint8_t data = IPPROTO_AH; + $$ = constant_expr_alloc(&@$, &inet_protocol_type, + BYTEORDER_HOST_ENDIAN, + sizeof(data), &data); + } ; auth_hdr_field : NEXTHDR { $$ = AHHDR_NEXTHDR; } @@ -1394,6 +1408,13 @@ esp_hdr_expr : ESP esp_hdr_field { $$ = payload_expr_alloc(&@$, &payload_esp, $2); } + | ESP + { + uint8_t data = IPPROTO_ESP; + $$ = constant_expr_alloc(&@$, &inet_protocol_type, + BYTEORDER_HOST_ENDIAN, + sizeof(data), &data); + } ; esp_hdr_field : SPI { $$ = ESPHDR_SPI; } @@ -1404,6 +1425,13 @@ comp_hdr_expr : COMP comp_hdr_field { $$ = payload_expr_alloc(&@$, &payload_comp, $2); } + | COMP + { + uint8_t data = IPPROTO_COMP; + $$ = constant_expr_alloc(&@$, &inet_protocol_type, + BYTEORDER_HOST_ENDIAN, + sizeof(data), &data); + } ; comp_hdr_field : NEXTHDR { $$ = COMPHDR_NEXTHDR; } @@ -1415,6 +1443,13 @@ udp_hdr_expr : UDP udp_hdr_field { $$ = payload_expr_alloc(&@$, &payload_udp, $2); } + | UDP + { + uint8_t data = IPPROTO_UDP; + $$ = constant_expr_alloc(&@$, &inet_protocol_type, + BYTEORDER_HOST_ENDIAN, + sizeof(data), &data); + } ; udp_hdr_field : SPORT { $$ = UDPHDR_SPORT; } @@ -1427,6 +1462,13 @@ udplite_hdr_expr : UDPLITE udplite_hdr_field { $$ = payload_expr_alloc(&@$, &payload_udplite, $2); } + | UDPLITE + { + uint8_t data = IPPROTO_UDPLITE; + $$ = constant_expr_alloc(&@$, &inet_protocol_type, + BYTEORDER_HOST_ENDIAN, + sizeof(data), &data); + } ; udplite_hdr_field : SPORT { $$ = UDPHDR_SPORT; } @@ -1439,6 +1481,13 @@ tcp_hdr_expr : TCP tcp_hdr_field { $$ = payload_expr_alloc(&@$, &payload_tcp, $2); } + | TCP + { + uint8_t data = IPPROTO_TCP; + $$ = constant_expr_alloc(&@$, &inet_protocol_type, + BYTEORDER_HOST_ENDIAN, + sizeof(data), &data); + } ; tcp_hdr_field : SPORT { $$ = TCPHDR_SPORT; } @@ -1457,6 +1506,13 @@ dccp_hdr_expr : DCCP dccp_hdr_field { $$ = payload_expr_alloc(&@$, &payload_dccp, $2); } + | DCCP + { + uint8_t data = IPPROTO_DCCP; + $$ = constant_expr_alloc(&@$, &inet_protocol_type, + BYTEORDER_HOST_ENDIAN, + sizeof(data), &data); + } ; dccp_hdr_field : SPORT { $$ = DCCPHDR_SPORT; } @@ -1468,6 +1524,13 @@ sctp_hdr_expr : SCTP sctp_hdr_field { $$ = payload_expr_alloc(&@$, &payload_sctp, $2); } + | SCTP + { + uint8_t data = IPPROTO_SCTP; + $$ = constant_expr_alloc(&@$, &inet_protocol_type, + BYTEORDER_HOST_ENDIAN, + sizeof(data), &data); + } ; sctp_hdr_field : SPORT { $$ = SCTPHDR_SPORT; } -- cgit v1.2.3