-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.peg
220 lines (206 loc) · 17.1 KB
/
parser.peg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
Root <- Skip Comment? Rule (EOL Comment? Packet?)* EOF
Rule <- Skip Packet (SEPT Packet)* COLON Skip Action (SEPT Action)*
bin <- [01]
bin_ <- '_'? bin
oct <- [0-7]
oct_ <- '_'? oct
hex <- [0-9a-fA-F]
hex_ <- '_'? hex
dec <- [0-9]
dec_ <- '_'? dec
char <- [0-9a-zA-Z]
bin_int <- bin bin_*
oct_int <- oct oct_*
dec_int <- dec dec_*
hex_int <- hex hex_*
INTEGER <- "0b" bin_int Skip / "0o" oct_int Skip
/ "0x" hex_int Skip / dec_int Skip
bits8 <- '25'[0-5] / '2'[0-4] dec / '1' dec dec / [1-9]dec
/ '0b' bin (bin (bin (bin (bin (bin (bin (bin)?)?)?)?)?)?)?
/ '0x' hex (hex)? / '0X' hex (hex)?
/ '0o' [1-3]oct oct / '0o' oct (oct)?
/ dec
bits16 <- '6553'[0-5] / '655'[0-2]dec / '65'[0-4] dec dec / '6'[0-4] dec dec dec / [1-5] dec dec dec dec
/ '0b' bin(bin(bin(bin(bin(bin(bin(bin(bin(bin(bin(bin(bin(bin(bin(bin)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?
/ '0x' hex(hex(hex(hex)?)?)? / '0X' (hex(hex(hex)?)?)?hex
/ '0o1' oct oct oct oct oct / '0o' oct (oct (oct (oct (oct)?)?)?)?
/ dec (dec (dec (dec)?)?)?
EQUAL <- '=' Skip
COLON <- ':'
COMMA <- ',' Skip
SLASH <- '/' Skip
DOT <- '.'
OR <- '|' Skip
Open <- '(' Skip
Close <- ')' Skip
Skip <- ( Space / Comment )*
Comment <- '#' ( !EOL . )* EOL
Space <- ' ' / '\t' / EOL
EOL <- '\r\n' / '\n' / '\r' / '\0'
EOF <- !.
Action <- 'RSS' (Open ( 'queue' EQUAL <bits8 (SLASH bits8)?>)* Close)? { YY_RSS(yy, yytext); }
/ 'DROP' { YY_DROP(yy); }
/ 'QUEUE' (Open ('id' EQUAL <bits8 (SLASH bits8)?>)* Close)? { YY_QUEUE(yy, yytext); }
/ 'PORT' { YY_PORT(yy); }
/ 'COUNT' (Open ('id' EQUAL <INTEGER (SLASH INTEGER)?>)* Close)? { YY_COUNT(yy, yytext); }
/ 'METER'
/ 'MARK' (Open ('id' EQUAL <INTEGER (SLASH INTEGER)?>)* Close)? { YY_MARK(yy, yytext); }
/ 'SAMPLE' { YY_SAMPLE(yy); }
SEPT <- SLASH Skip / OR
Packet <- ETHER_P / IP6_P / IP_P / UDP_P / TCP_P / VXLAN_P / GRE_P / VLAN_P / MPLS_P
/ ANY_P / SCTP_P / ICMP6_P / ICMP_P / ARP_P / OSPF_P / GENEVE_P / RAW_P
tcp_flags <- 'syn' / 'fin' / 'rst' / 'ack' / 'push' / 'ece' / 'cwr' / 'urg'
ETHER_P <- 'ETHER' { YY_ETHER_START(yy); }
(Open (
('dst' EQUAL <macaddr (SLASH macaddr)?> COMMA?) { YY_ETHER_MAC(yy, yytext, false); }
/ ('src' EQUAL <macaddr (SLASH macaddr)?> COMMA?) { YY_ETHER_MAC(yy, yytext, true); }
/ ('type' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_ETHER_TYPE(yy, yytext);}
)* Close)? { YY_ETHER_END(yy); }
IP_P <- 'IP' { YY_IP_START(yy); }
( Open (
('src' EQUAL <ipaddr (SLASH (ipaddr / ipprefix))?> COMMA?) { YY_IP_ADDR(yy, yytext, true); }
/ ('dst' EQUAL <ipaddr (SLASH (ipaddr / ipprefix))?> COMMA?) { YY_IP_ADDR(yy, yytext, false); }
/ ('tos' EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_IP_FIELD1(yy, yytext, 1); }
/ ('len' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_IP_FIELD2(yy, yytext, 2); }
/ ('id' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_IP_FIELD2(yy, yytext, 4); }
/ ('frag' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_IP_FIELD2(yy, yytext, 6); }
/ ('ttl' EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_IP_FIELD1(yy, yytext, 8); }
/ ('proto' EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_IP_FIELD1(yy, yytext, 9); }
/ ('csum' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_IP_FIELD2(yy, yytext, 10); }
)* Close)? { YY_IP_END(yy); }
VXLAN_P <- 'VXLAN' { YY_VXLAN_START(yy);}
(Open (
('flags' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_VXLAN_FLAG(yy, yytext); }
/ ('vni' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_VXLAN_VNI(yy, yytext); }
)* Close)? { YY_VXLAN_END(yy); }
GENEVE_P <- 'GENEVE' (Open ( { YY_GENEVE_START(yy); }
('ver' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_GENEVE_VER(yy, yytext); }
/ ('optlen' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_GENEVE_OPTLEN(yy, yytext); }
/ ('proto' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_GENEVE_PROTO(yy, yytext); }
/ ('vni' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_GENEVE_VNI(yy, yytext); }
)* Close)? { YY_GENEVE_END(yy); }
UDP_P <- 'UDP' { YY_UDP_START(yy); }
(Open (
('src' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_UDP_FIELD(yy, yytext, 0); }
/ ('dst' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_UDP_FIELD(yy, yytext, 2); }
/ ('len' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_UDP_FIELD(yy, yytext, 4); }
/ ('csum' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_UDP_FIELD(yy, yytext, 6); }
)* Close)? { YY_UDP_END(yy); }
TCP_P <- 'TCP' { YY_TCP_START(yy); }
(Open (
('src' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_TCP_FIELD2(yy, yytext, 0); }
/ ('dst' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_TCP_FIELD2(yy, yytext, 2); }
/ ('seq' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_TCP_FIELD4(yy, yytext, 4); }
/ ('ackseq' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_TCP_FIELD4(yy, yytext, 8); }
/ ('doff' EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_TCP_FIELD1(yy, yytext, 12); }
/ ('win' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_TCP_FIELD2(yy, yytext, 14); }
/ ('csum' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_TCP_FIELD2(yy, yytext, 16); }
/ ('urgptr' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_TCP_FIELD2(yy, yytext, 18); }
/ ('flags' EQUAL <tcp_flags (SEPT tcp_flags)*>) { YY_TCP_FLAGS(yy, yytext); }
)* Close)? { YY_TCP_END(yy); }
VLAN_P <- 'VLAN' { YY_VLAN_START(yy); }
(Open (
'proto' EQUAL <bits16 (SLASH bits16)?> COMMA? { YY_VLAN_PROTO(yy, yytext); }
/ 'tag' EQUAL <INTEGER (SLASH INTEGER)?> COMMA? { YY_VLAN_TAG(yy, yytext); }
)* Close)? { YY_VLAN_END(yy); }
MPLS_P <- 'MPLS' { YY_MPLS_START(yy); }
(Open (
('label' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_MPLS_LABEL(yy, yytext); }
/ ('exp' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_MPLS_EXP(yy, yytext); }
/ ('s' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_MPLS_S(yy, yytext); }
/ ('ttl' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_MPLS_TTL(yy, yytext); }
)* Close)? { YY_MPLS_END(yy); }
GRE_P <- 'GRE' { YY_GRE_START(yy); }
(Open (
('C' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_GRE_C(yy, yytext); }
/ ('ver' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_GRE_VER(yy, yytext);}
/ ('proto' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_GRE_PROTO(yy, yytext);}
/ ('csum' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_GRE_CSUM(yy, yytext); }
)* Close)? { YY_GRE_END(yy); }
IP6_P <- "IP6" { YY_IP6_START(yy); }
(Open (
('src' EQUAL <ip6addr (SLASH ip6prefix)?> COMMA?) { YY_IP6_ADDR(yy, yytext, true);}
/ ('dst' EQUAL <ip6addr (SLASH ip6prefix)?> COMMA?) { YY_IP6_ADDR(yy, yytext, false);}
/ ('version' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_IP6_FIELD(yy, yytext, "version"); }
/ ('traffic_class' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_IP6_FIELD(yy, yytext, "traffic_class"); }
/ ('flowlabel' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_IP6_FIELD(yy, yytext, "flowlabel"); }
/ ('plen' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_IP6_FIELD(yy, yytext, "plen"); }
/ ('nexthdr' EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_IP6_FIELD(yy, yytext, "nexthdr"); }
/ ('hoplimit' EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_IP6_FIELD(yy, yytext, "hoplimit"); }
)* Close)? { YY_IP6_END(yy); }
SCTP_P <- "SCTP" { YY_SCTP_START(yy); }
(Open (
('src' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_SCTP_FIELD2(yy, yytext, 0);}
/ ('dst' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_SCTP_FIELD2(yy, yytext, 2);}
/ ('tag' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_SCTP_FIELD4(yy, yytext, 4);}
/ ('csum' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_SCTP_FIELD4(yy, yytext, 8);}
/ ('type' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?)
/ ('flag' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?)
/ ('len' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?)
)* Close)? { YY_SCTP_END(yy); }
ICMP_P <- "ICMP" { YY_ICMP_START(yy); }
(Open (
('type' EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_ICMP_FIELD1(yy, yytext, 0); }
/ ('code' EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_ICMP_FIELD1(yy, yytext, 1); }
/ ('csum' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_ICMP_FIELD2(yy, yytext, 2); }
/ ('id' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_ICMP_FIELD2(yy, yytext, 4); }
/ ('seq' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_ICMP_FIELD2(yy, yytext, 6); }
)* Close)? { YY_ICMP_END(yy); }
ARP_P <- "ARP" { YY_ARP_START(yy); }
(Open (
('sha' EQUAL <macaddr (SLASH (macaddr))?> COMMA?) { YY_ARP_MAC(yy, yytext, 8); }
/ ('spa' EQUAL <ipaddr (SLASH (ipaddr / ipprefix))?> COMMA?) { YY_ARP_ADDR(yy, yytext, 14); }
/ ('tha' EQUAL <macaddr (SLASH (macaddr))?> COMMA?) { YY_ARP_MAC(yy, yytext, 18); }
/ ('tpa' EQUAL <ipaddr (SLASH (ipaddr / ipprefix))?> COMMA?) { YY_ARP_ADDR(yy, yytext, 24); }
/ ("hrd" EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_ARP_FIELD2(yy, yytext, 0); }
/ ("pro" EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_ARP_FIELD2(yy, yytext, 2); }
/ ("hlen" EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_ARP_FIELD1(yy, yytext, 4); }
/ ("plen" EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_ARP_FIELD1(yy, yytext, 5); }
/ ("opcode" EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_ARP_FIELD2(yy, yytext, 6); }
)* Close)? { YY_ARP_END(yy); }
ICMP6_P <- "ICMP6" { YY_ICMP6_START(yy); }
(Open (
('type' EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_ICMP6_FIELD1(yy, yytext, 0);}
/ ('code' EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_ICMP6_FIELD1(yy, yytext, 1);}
/ ('csum' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_ICMP6_FIELD2(yy, yytext, 2);}
/ ('id' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_ICMP6_FIELD2(yy, yytext, 4);}
/ ('seq' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_ICMP6_FIELD2(yy, yytext, 6);}
)* Close)? { YY_ICMP6_END(yy); }
OSPF_P <- "OSPF" { YY_OSPF_START(yy); }
(Open (
('version' EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_OSPF_FIELD1(yy, yytext, 0); }
/ ('type' EQUAL <bits8 (SLASH bits8)?> COMMA?) { YY_OSPF_FIELD1(yy, yytext, 1); }
/ ('plen' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_OSPF_FIELD2(yy, yytext, 2); }
/ ('rid' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_OSPF_FIELD4(yy, yytext, 4); }
/ ('area' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_OSPF_FIELD4(yy, yytext, 8); }
/ ('csum' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_OSPF_FIELD2(yy, yytext, 12); }
/ ('autype' EQUAL <bits16 (SLASH bits16)?> COMMA?) { YY_OSPF_FIELD2(yy, yytext, 14); }
/ ('auth' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?) { YY_OSPF_AUTH(yy, yytext); }
)* Close)? { YY_OSPF_END(yy); }
ANY_P <- "ANY"
(Open (
('off' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?)
/ ('size' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?)
/ ('value' EQUAL <INTEGER (SLASH INTEGER)?> COMMA?)
)* Close)?
RAW_P <- "RAW" { YY_RAW_START(yy); }
(Open (
('pattern' EQUAL <char*> COMMA?) { YY_RAW_PATTERN(yy, yytext); }
/ ('off' EQUAL <INTEGER> COMMA?) { YY_RAW_OFF(yy, yytext); }
/ ('len' EQUAL <INTEGER> COMMA?) { YY_RAW_LEN(yy, yytext); }
)* Close)? { YY_RAW_END(yy); }
macaddr <- hex hex COLON hex hex COLON hex hex COLON hex hex COLON hex hex COLON hex hex Skip
ipaddr <- ip4seg DOT ip4seg DOT ip4seg DOT ip4seg Skip
ip4seg <- '25'[0-5] / '2'[0-4][0-9] / '1'[0-9][0-9] / [1-9][0-9] / [0-9]
ipprefix <- ('3'[0-2] / [1-2][0-9] / [0-9]) Skip
group <- hex (hex (hex hex?)?)?
ip6addr <- (group COLON group COLON group COLON group COLON group COLON group COLON group COLON group Skip)
/ (COLON COLON group (COLON group (COLON group (COLON group (COLON group (COLON group (COLON group)?)?)?)?)?)? Skip)
/ (group COLON COLON group (COLON group (COLON group (COLON group (COLON group (COLON group)?)?)?)?)? Skip)
/ (group (COLON group)? COLON COLON group (COLON group (COLON group (COLON group (COLON group)?)?)?)? Skip)
/ (group (COLON group (COLON group)?)? COLON COLON group (COLON group (COLON group (COLON group)?)?)? Skip)
/ (group (COLON group (COLON group (COLON group)?)?)? COLON COLON group (COLON group (COLON group)?)? Skip)
/ (group (COLON group (COLON group (COLON group (COLON group)?)?)?)? COLON COLON group (COLON group)? Skip)
/ (group (COLON group (COLON group (COLON group (COLON group (COLON group)?)?)?)?)? COLON COLON group Skip)
/ (group (COLON group (COLON group (COLON group (COLON group (COLON group (COLON group)?)?)?)?)?)? COLON COLON Skip)
ip6prefix <- ('12'[0-8] / '1'[0-1][0-9] / [1-9][0-9] / [0-9]) Skip