]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
parser: fix parsing of ethernet protocol types
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 15 Jan 2014 20:12:38 +0000 (21:12 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 16 Jan 2014 09:05:21 +0000 (10:05 +0100)
This allows us to use the protocol type keyword, eg.

nft add rule ip filter output meta protocol ip6 counter
                                            ^^^

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/parser.y

index 038282ece1265d702d29340a8f0797df37892cc8..23662f789de1a282a22a5fdd21ec695316347b39 100644 (file)
@@ -23,6 +23,7 @@
 #include <expression.h>
 #include <utils.h>
 #include <parser.h>
+#include <if_ether.h>
 #include <erec.h>
 
 #include "parser.h"
@@ -1418,6 +1419,13 @@ vlan_hdr_expr            :       VLAN    vlan_hdr_field
                        {
                                $$ = payload_expr_alloc(&@$, &payload_vlan, $2);
                        }
+                       |       VLAN
+                       {
+                               uint16_t data = ETH_P_8021Q;
+                               $$ = constant_expr_alloc(&@$, &ethertype_type,
+                                                        BYTEORDER_HOST_ENDIAN,
+                                                        sizeof(data) * BITS_PER_BYTE, &data);
+                       }
                        ;
 
 vlan_hdr_field         :       ID              { $$ = VLANHDR_VID; }
@@ -1430,6 +1438,13 @@ arp_hdr_expr             :       ARP     arp_hdr_field
                        {
                                $$ = payload_expr_alloc(&@$, &payload_arp, $2);
                        }
+                       |       ARP
+                       {
+                               uint16_t data = ETH_P_ARP;
+                               $$ = constant_expr_alloc(&@$, &ethertype_type,
+                                                        BYTEORDER_HOST_ENDIAN,
+                                                        sizeof(data) * BITS_PER_BYTE, &data);
+                       }
                        ;
 
 arp_hdr_field          :       HTYPE           { $$ = ARPHDR_HRD; }
@@ -1443,6 +1458,13 @@ ip_hdr_expr              :       IP      ip_hdr_field
                        {
                                $$ = payload_expr_alloc(&@$, &payload_ip, $2);
                        }
+                       |       IP
+                       {
+                               uint16_t data = ETH_P_IP;
+                               $$ = constant_expr_alloc(&@$, &ethertype_type,
+                                                        BYTEORDER_HOST_ENDIAN,
+                                                        sizeof(data) * BITS_PER_BYTE, &data);
+                       }
                        ;
 
 ip_hdr_field           :       VERSION         { $$ = IPHDR_VERSION; }
@@ -1484,6 +1506,13 @@ ip6_hdr_expr             :       IP6     ip6_hdr_field
                        {
                                $$ = payload_expr_alloc(&@$, &payload_ip6, $2);
                        }
+                       |       IP6
+                       {
+                               uint16_t data = ETH_P_IPV6;
+                               $$ = constant_expr_alloc(&@$, &ethertype_type,
+                                                        BYTEORDER_HOST_ENDIAN,
+                                                        sizeof(data) * BITS_PER_BYTE, &data);
+                       }
                        ;
 
 ip6_hdr_field          :       VERSION         { $$ = IP6HDR_VERSION; }