]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
parser: fix parsing protocol names for protocols which are also keywords
authorPatrick McHardy <kaber@trash.net>
Wed, 5 Dec 2012 18:39:00 +0000 (19:39 +0100)
committerPatrick McHardy <kaber@trash.net>
Wed, 5 Dec 2012 18:39:00 +0000 (19:39 +0100)
"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

index 8e3d3639a6e832e1e8bc87682eaf9b4e5b4b3007..b0d56e5207a9eb1d2cecc8162c0f1291ddc0bc12 100644 (file)
@@ -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; }