From: Patrick McHardy Date: Wed, 5 Dec 2012 18:39:00 +0000 (+0100) Subject: parser: fix parsing protocol names for protocols which are also keywords X-Git-Tag: v0.099~156 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6c3eec6ad009d7ed8a219291b98886a80b26b8e4;p=thirdparty%2Fnftables.git 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. --- 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; }