summaryrefslogtreecommitdiffstats
path: root/src/parser.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.y')
-rw-r--r--src/parser.y110
1 files changed, 87 insertions, 23 deletions
diff --git a/src/parser.y b/src/parser.y
index d4a79291..05fe8bcb 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -167,6 +167,8 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%token MAP "map"
%token HANDLE "handle"
+%token INET "inet"
+
%token ADD "add"
%token INSERT "insert"
%token DELETE "delete"
@@ -181,7 +183,6 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%token JUMP "jump"
%token GOTO "goto"
%token RETURN "return"
-%token QUEUE "queue"
%token <val> NUM "number"
%token <string> STRING "string"
@@ -281,6 +282,8 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%token MH "mh"
%token META "meta"
+%token NFPROTO "nfproto"
+%token L4PROTO "l4proto"
%token MARK "mark"
%token IIF "iif"
%token IIFNAME "iifname"
@@ -330,6 +333,13 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%token SNAT "snat"
%token DNAT "dnat"
+%token QUEUE "queue"
+%token QUEUENUM "num"
+%token QUEUETOTAL "total"
+%token QUEUEBYPASS "bypass"
+%token QUEUECPUFANOUT "fanout"
+%token OPTIONS "options"
+
%token POSITION "position"
%type <string> identifier string
@@ -377,6 +387,9 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%destructor { stmt_free($$); } reject_stmt
%type <stmt> nat_stmt nat_stmt_alloc
%destructor { stmt_free($$); } nat_stmt nat_stmt_alloc
+%type <stmt> queue_stmt queue_stmt_alloc
+%destructor { stmt_free($$); } queue_stmt queue_stmt_alloc
+%type <val> queue_flags queue_flag
%type <expr> symbol_expr verdict_expr integer_expr
%destructor { expr_free($$); } symbol_expr verdict_expr integer_expr
@@ -818,6 +831,7 @@ string : STRING
family_spec : /* empty */ { $$ = NFPROTO_IPV4; }
| IP { $$ = NFPROTO_IPV4; }
| IP6 { $$ = NFPROTO_IPV6; }
+ | INET { $$ = NFPROTO_INET; }
| ARP { $$ = NFPROTO_ARP; }
| BRIDGE { $$ = NFPROTO_BRIDGE; }
;
@@ -927,6 +941,7 @@ stmt : verdict_stmt
| limit_stmt
| reject_stmt
| nat_stmt
+ | queue_stmt
;
verdict_stmt : verdict_expr
@@ -1051,6 +1066,57 @@ nat_stmt_args : expr
}
;
+queue_stmt : queue_stmt_alloc
+ | queue_stmt_alloc queue_args
+ ;
+
+queue_stmt_alloc : QUEUE
+ {
+ $$ = queue_stmt_alloc(&@$);
+ }
+ ;
+
+queue_args : queue_arg
+ {
+ $<stmt>$ = $<stmt>0;
+ }
+ | queue_args queue_arg
+ ;
+
+queue_arg : QUEUENUM NUM
+ {
+ $<stmt>0->queue.queuenum = $2;
+ }
+ | QUEUETOTAL NUM
+ {
+ $<stmt>0->queue.queues_total = $2;
+ }
+ | OPTIONS queue_flags
+ {
+ $<stmt>0->queue.flags = $2;
+ }
+ ;
+
+queue_flags : queue_flag
+ {
+ $$ = $1;
+ }
+ | queue_flags COMMA queue_flag
+ {
+ $$ |= $1 | $3;
+ }
+ ;
+
+queue_flag : QUEUEBYPASS
+ {
+ $$ = NFT_QUEUE_FLAG_BYPASS;
+ }
+ | QUEUECPUFANOUT
+ {
+ $$ = NFT_QUEUE_FLAG_CPU_FANOUT;
+ }
+ ;
+
match_stmt : relational_expr
{
$$ = expr_stmt_alloc(&@$, $1);
@@ -1287,10 +1353,6 @@ verdict_expr : ACCEPT
{
$$ = verdict_expr_alloc(&@$, NF_DROP, NULL);
}
- | QUEUE
- {
- $$ = verdict_expr_alloc(&@$, NF_QUEUE, NULL);
- }
| CONTINUE
{
$$ = verdict_expr_alloc(&@$, NFT_CONTINUE, NULL);
@@ -1324,6 +1386,8 @@ meta_key : meta_key_qualified
;
meta_key_qualified : LENGTH { $$ = NFT_META_LEN; }
+ | NFPROTO { $$ = NFT_META_NFPROTO; }
+ | L4PROTO { $$ = NFT_META_L4PROTO; }
| PROTOCOL { $$ = NFT_META_PROTOCOL; }
| PRIORITY { $$ = NFT_META_PRIORITY; }
;
@@ -1399,14 +1463,14 @@ payload_raw_expr : AT payload_base_spec COMMA NUM COMMA NUM
}
;
-payload_base_spec : LL_HDR { $$ = PAYLOAD_BASE_LL_HDR; }
- | NETWORK_HDR { $$ = PAYLOAD_BASE_NETWORK_HDR; }
- | TRANSPORT_HDR { $$ = PAYLOAD_BASE_TRANSPORT_HDR; }
+payload_base_spec : LL_HDR { $$ = PROTO_BASE_LL_HDR; }
+ | NETWORK_HDR { $$ = PROTO_BASE_NETWORK_HDR; }
+ | TRANSPORT_HDR { $$ = PROTO_BASE_TRANSPORT_HDR; }
;
eth_hdr_expr : ETHER eth_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_eth, $2);
+ $$ = payload_expr_alloc(&@$, &proto_eth, $2);
}
;
@@ -1417,7 +1481,7 @@ eth_hdr_field : SADDR { $$ = ETHHDR_SADDR; }
vlan_hdr_expr : VLAN vlan_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_vlan, $2);
+ $$ = payload_expr_alloc(&@$, &proto_vlan, $2);
}
| VLAN
{
@@ -1436,7 +1500,7 @@ vlan_hdr_field : ID { $$ = VLANHDR_VID; }
arp_hdr_expr : ARP arp_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_arp, $2);
+ $$ = payload_expr_alloc(&@$, &proto_arp, $2);
}
| ARP
{
@@ -1456,7 +1520,7 @@ arp_hdr_field : HTYPE { $$ = ARPHDR_HRD; }
ip_hdr_expr : IP ip_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_ip, $2);
+ $$ = payload_expr_alloc(&@$, &proto_ip, $2);
}
| IP
{
@@ -1482,7 +1546,7 @@ ip_hdr_field : VERSION { $$ = IPHDR_VERSION; }
icmp_hdr_expr : ICMP icmp_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_icmp, $2);
+ $$ = payload_expr_alloc(&@$, &proto_icmp, $2);
}
| ICMP
{
@@ -1504,7 +1568,7 @@ icmp_hdr_field : TYPE { $$ = ICMPHDR_TYPE; }
ip6_hdr_expr : IP6 ip6_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_ip6, $2);
+ $$ = payload_expr_alloc(&@$, &proto_ip6, $2);
}
| IP6
{
@@ -1526,7 +1590,7 @@ ip6_hdr_field : VERSION { $$ = IP6HDR_VERSION; }
;
icmp6_hdr_expr : ICMP6 icmp6_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_icmp6, $2);
+ $$ = payload_expr_alloc(&@$, &proto_icmp6, $2);
}
| ICMP6
{
@@ -1549,7 +1613,7 @@ icmp6_hdr_field : TYPE { $$ = ICMP6HDR_TYPE; }
auth_hdr_expr : AH auth_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_ah, $2);
+ $$ = payload_expr_alloc(&@$, &proto_ah, $2);
}
| AH
{
@@ -1569,7 +1633,7 @@ auth_hdr_field : NEXTHDR { $$ = AHHDR_NEXTHDR; }
esp_hdr_expr : ESP esp_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_esp, $2);
+ $$ = payload_expr_alloc(&@$, &proto_esp, $2);
}
| ESP
{
@@ -1586,7 +1650,7 @@ esp_hdr_field : SPI { $$ = ESPHDR_SPI; }
comp_hdr_expr : COMP comp_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_comp, $2);
+ $$ = payload_expr_alloc(&@$, &proto_comp, $2);
}
| COMP
{
@@ -1604,7 +1668,7 @@ comp_hdr_field : NEXTHDR { $$ = COMPHDR_NEXTHDR; }
udp_hdr_expr : UDP udp_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_udp, $2);
+ $$ = payload_expr_alloc(&@$, &proto_udp, $2);
}
| UDP
{
@@ -1623,7 +1687,7 @@ udp_hdr_field : SPORT { $$ = UDPHDR_SPORT; }
udplite_hdr_expr : UDPLITE udplite_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_udplite, $2);
+ $$ = payload_expr_alloc(&@$, &proto_udplite, $2);
}
| UDPLITE
{
@@ -1642,7 +1706,7 @@ udplite_hdr_field : SPORT { $$ = UDPHDR_SPORT; }
tcp_hdr_expr : TCP tcp_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_tcp, $2);
+ $$ = payload_expr_alloc(&@$, &proto_tcp, $2);
}
| TCP
{
@@ -1667,7 +1731,7 @@ tcp_hdr_field : SPORT { $$ = TCPHDR_SPORT; }
dccp_hdr_expr : DCCP dccp_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_dccp, $2);
+ $$ = payload_expr_alloc(&@$, &proto_dccp, $2);
}
| DCCP
{
@@ -1685,7 +1749,7 @@ dccp_hdr_field : SPORT { $$ = DCCPHDR_SPORT; }
sctp_hdr_expr : SCTP sctp_hdr_field
{
- $$ = payload_expr_alloc(&@$, &payload_sctp, $2);
+ $$ = payload_expr_alloc(&@$, &proto_sctp, $2);
}
| SCTP
{