summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2012-12-05 19:39:00 +0100
committerPatrick McHardy <kaber@trash.net>2012-12-05 19:39:00 +0100
commit6c3eec6ad009d7ed8a219291b98886a80b26b8e4 (patch)
treed010ca049c5e21651737928a418c31322559fe7f
parent9a32c83f7529ca7b3f6d4b3253b537a9da5681af (diff)
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.
-rw-r--r--src/parser.y63
1 files changed, 63 insertions, 0 deletions
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; }