3 * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved.
4 * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
5 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
7 * This software is available to you under a choice of one of two
8 * licenses. You may choose to be licensed under the terms of the GNU
9 * General Public License (GPL) Version 2, available from the file
10 * COPYING in the main directory of this source tree, or the
11 * OpenIB.org BSD license below:
13 * Redistribution and use in source and binary forms, with or
14 * without modification, are permitted provided that the following
17 * - Redistributions of source code must retain the above
18 * copyright notice, this list of conditions and the following
21 * - Redistributions in binary form must reproduce the above
22 * copyright notice, this list of conditions and the following
23 * disclaimer in the documentation and/or other materials
24 * provided with the distribution.
26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
30 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
31 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
32 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39 * Lexer of OSM QoS parser.
45 * Yevgeny Kliteynik, Mellanox
48 #include <opensm/osm_qos_policy.h>
49 #include "osm_qos_parser_y.h"
51 #define HANDLE_IF_IN_DESCRIPTION if (in_description) { yylval = strdup(yytext); return TK_TEXT; }
53 #define SAVE_POS save_pos()
54 static void save_pos();
56 extern int column_num;
59 extern YYSTYPE yylval;
61 boolean_t in_description = FALSE;
62 boolean_t in_list_of_hex_num_ranges = FALSE;
63 boolean_t in_node_type = FALSE;
64 boolean_t in_list_of_numbers = FALSE;
65 boolean_t in_list_of_strings = FALSE;
66 boolean_t in_list_of_num_pairs = FALSE;
67 boolean_t in_asterisk_or_list_of_numbers = FALSE;
68 boolean_t in_list_of_num_ranges = FALSE;
69 boolean_t in_single_string = FALSE;
70 boolean_t in_single_number = FALSE;
72 static void reset_new_line_flags();
73 #define RESET_NEW_LINE_FLAGS reset_new_line_flags()
75 #define START_USE {in_description = TRUE;} /* list of strings including whitespace (description) */
76 #define START_PORT_GUID {in_list_of_hex_num_ranges = TRUE;} /* comma-separated list of hex num ranges */
77 #define START_PORT_NAME {in_list_of_strings = TRUE;} /* comma-separated list of following strings: ../../.. */
78 #define START_PARTITION {in_single_string = TRUE;} /* single string w/o whitespaces (partition name) */
79 #define START_NAME {in_single_string = TRUE;} /* single string w/o whitespaces (port group name) */
80 #define START_QOS_LEVEL_NAME {in_single_string = TRUE;} /* single string w/o whitespaces (qos level name in match rule) */
82 #define START_NODE_TYPE {in_node_type = TRUE;} /* comma-separated list of node types (ROUTER,CA,...) */
83 #define START_SL2VL_TABLE {in_list_of_numbers = TRUE;} /* comma-separated list of hex or dec numbers */
85 #define START_GROUP {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
86 #define START_ACROSS {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
87 #define START_ACROSS_TO {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
88 #define START_ACROSS_FROM {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
89 #define START_SOURCE {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
90 #define START_DESTINATION {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
92 #define START_VLARB_HIGH {in_list_of_num_pairs = TRUE;} /* comma-separated list of hex or dec num pairs: "num1:num2" */
93 #define START_VLARB_LOW {in_list_of_num_pairs = TRUE;} /* comma-separated list of hex or dec num pairs: "num1:num2" */
95 #define START_TO {in_asterisk_or_list_of_numbers = TRUE;} /* (asterisk) or (comma-separated list of hex or dec numbers) */
96 #define START_FROM {in_asterisk_or_list_of_numbers = TRUE;} /* (asterisk) or (comma-separated list of hex or dec numbers) */
98 #define START_PATH_BITS {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
99 #define START_QOS_CLASS {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
100 #define START_SERVICE_ID {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
101 #define START_PKEY {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
103 #define START_SL {in_single_number = TRUE;} /* single number */
104 #define START_VLARB_HIGH_LIMIT {in_single_number = TRUE;} /* single number */
105 #define START_MTU_LIMIT {in_single_number = TRUE;} /* single number */
106 #define START_RATE_LIMIT {in_single_number = TRUE;} /* single number */
107 #define START_PACKET_LIFE {in_single_number = TRUE;} /* single number */
109 #define START_ULP_DEFAULT {in_single_number = TRUE;} /* single number */
110 #define START_ULP_ANY {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
111 #define START_ULP_SDP_DEFAULT {in_single_number = TRUE;} /* single number */
112 #define START_ULP_SDP_PORT {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
113 #define START_ULP_RDS_DEFAULT {in_single_number = TRUE;} /* single number */
114 #define START_ULP_RDS_PORT {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
115 #define START_ULP_ISER_DEFAULT {in_single_number = TRUE;} /* single number */
116 #define START_ULP_ISER_PORT {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
117 #define START_ULP_SRP_GUID {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
118 #define START_ULP_IPOIB_DEFAULT {in_single_number = TRUE;} /* single number */
119 #define START_ULP_IPOIB_PKEY {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
124 %option nounput noinput
126 QOS_ULPS_START qos\-ulps
127 QOS_ULPS_END end\-qos\-ulps
128 PORT_GROUPS_START port\-groups
129 PORT_GROUPS_END end\-port\-groups
130 PORT_GROUP_START port\-group
131 PORT_GROUP_END end\-port\-group
136 TARGET_PORT_GUID target\-port\-guid
140 QOS_SETUP_START qos\-setup
141 QOS_SETUP_END end\-qos\-setup
142 VLARB_TABLES_START vlarb\-tables
143 VLARB_TABLES_END end\-vlarb\-tables
144 VLARB_SCOPE_START vlarb\-scope
145 VLARB_SCOPE_END end\-vlarb\-scope
148 VLARB_HIGH vlarb\-high
150 VLARB_HIGH_LIMIT vl\-high\-limit
151 SL2VL_TABLES_START sl2vl\-tables
152 SL2VL_TABLES_END end\-sl2vl\-tables
153 SL2VL_SCOPE_START sl2vl\-scope
154 SL2VL_SCOPE_END end\-sl2vl\-scope
158 ACROSS_FROM across\-from
159 SL2VL_TABLE sl2vl\-table
160 QOS_LEVELS_START qos\-levels
161 QOS_LEVELS_END end\-qos\-levels
162 QOS_LEVEL_START qos\-level
163 QOS_LEVEL_END end\-qos\-level
166 RATE_LIMIT rate\-limit
167 PACKET_LIFE packet\-life
169 QOS_MATCH_RULES_START qos\-match\-rules
170 QOS_MATCH_RULES_END end\-qos\-match\-rules
171 QOS_MATCH_RULE_START qos\-match\-rule
172 QOS_MATCH_RULE_END end\-qos\-match\-rule
175 DESTINATION destination
176 SERVICE_ID service\-id
178 QOS_LEVEL_NAME qos\-level\-name
180 ROUTER [Rr][Oo][Uu][Tt][Ee][Rr]
182 SWITCH [Ss][Ww][Ii][Tt][Cc][Hh]
183 SELF [Ss][Ee][Ll][Ff]
189 ULP_IPOIB [Ii][Pp][Oo][Ii][Bb]
190 ULP_ISER [Ii][Ss][Ee][Rr]
192 ULP_DEFAULT [Dd][Ee][Ff][Aa][Uu][Ll][Tt]
197 WHITE_DOTDOT_WHITE [ \t]*:[ \t]*
198 WHITE_COMMA_WHITE [ \t]*,[ \t]*
199 QUOTED_TEXT \"[^\"]*\"
204 {COMMENT} { SAVE_POS; RESET_NEW_LINE_FLAGS; } /* swallow comment */
205 {WHITE}{NEW_LINE} { SAVE_POS; RESET_NEW_LINE_FLAGS; } /* trailing blanks with new line */
206 {WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; }
207 {NEW_LINE} { SAVE_POS; RESET_NEW_LINE_FLAGS; }
209 {QOS_ULPS_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_ULPS_START; }
210 {QOS_ULPS_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_ULPS_END; }
212 {PORT_GROUPS_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUPS_START; }
213 {PORT_GROUPS_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUPS_END; }
214 {PORT_GROUP_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUP_START; }
215 {PORT_GROUP_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUP_END; }
217 {QOS_SETUP_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_SETUP_START; }
218 {QOS_SETUP_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_SETUP_END; }
219 {VLARB_TABLES_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_TABLES_START; }
220 {VLARB_TABLES_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_TABLES_END; }
221 {VLARB_SCOPE_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_SCOPE_START; }
222 {VLARB_SCOPE_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_SCOPE_END; }
224 {SL2VL_TABLES_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_TABLES_START; }
225 {SL2VL_TABLES_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_TABLES_END; }
226 {SL2VL_SCOPE_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_SCOPE_START; }
227 {SL2VL_SCOPE_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_SCOPE_END; }
229 {QOS_LEVELS_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVELS_START; }
230 {QOS_LEVELS_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVELS_END; }
231 {QOS_LEVEL_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVEL_START; }
232 {QOS_LEVEL_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVEL_END; }
234 {QOS_MATCH_RULES_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULES_START; }
235 {QOS_MATCH_RULES_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULES_END; }
236 {QOS_MATCH_RULE_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULE_START; }
237 {QOS_MATCH_RULE_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULE_END; }
239 {PORT_GUID}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PORT_GUID; return TK_PORT_GUID; }
240 {PORT_NAME}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PORT_NAME; return TK_PORT_NAME; }
241 {PARTITION}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PARTITION; return TK_PARTITION; }
242 {NODE_TYPE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_NODE_TYPE; return TK_NODE_TYPE; }
243 {NAME}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_NAME; return TK_NAME; }
244 {USE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_USE; return TK_USE; }
245 {GROUP}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_GROUP; return TK_GROUP; }
246 {VLARB_HIGH}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_HIGH; return TK_VLARB_HIGH; }
247 {VLARB_LOW}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_LOW; return TK_VLARB_LOW; }
248 {VLARB_HIGH_LIMIT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_HIGH_LIMIT; return TK_VLARB_HIGH_LIMIT;}
249 {TO}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_TO; return TK_TO; }
250 {FROM}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_FROM; return TK_FROM; }
251 {ACROSS_TO}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS_TO; return TK_ACROSS_TO; }
252 {ACROSS_FROM}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS_FROM; return TK_ACROSS_FROM;}
253 {ACROSS}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS; return TK_ACROSS; }
254 {SL2VL_TABLE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SL2VL_TABLE; return TK_SL2VL_TABLE;}
255 {SL}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SL; return TK_SL; }
256 {MTU_LIMIT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_MTU_LIMIT; return TK_MTU_LIMIT; }
257 {RATE_LIMIT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_RATE_LIMIT; return TK_RATE_LIMIT; }
258 {PACKET_LIFE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PACKET_LIFE; return TK_PACKET_LIFE;}
259 {PATH_BITS}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PATH_BITS; return TK_PATH_BITS; }
260 {QOS_CLASS}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_QOS_CLASS; return TK_QOS_CLASS; }
261 {SOURCE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SOURCE; return TK_SOURCE; }
262 {DESTINATION}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_DESTINATION; return TK_DESTINATION;}
263 {SERVICE_ID}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SERVICE_ID; return TK_SERVICE_ID; }
264 {PKEY}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PKEY; return TK_PKEY; }
265 {QOS_LEVEL_NAME}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_QOS_LEVEL_NAME; return TK_QOS_LEVEL_NAME;}
267 {ROUTER} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_ROUTER; yylval = strdup(yytext); return TK_TEXT; }
268 {CA} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_CA; yylval = strdup(yytext); return TK_TEXT; }
269 {SWITCH} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_SWITCH; yylval = strdup(yytext); return TK_TEXT; }
270 {SELF} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_SELF; yylval = strdup(yytext); return TK_TEXT; }
271 {ALL} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_ALL; yylval = strdup(yytext); return TK_TEXT; }
273 {ULP_DEFAULT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_DEFAULT; return TK_ULP_DEFAULT; }
274 {ULP_ANY}{WHITE_COMMA_WHITE}{SERVICE_ID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_SERVICE_ID; }
275 {ULP_ANY}{WHITE_COMMA_WHITE}{PKEY} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_PKEY; }
276 {ULP_ANY}{WHITE_COMMA_WHITE}{TARGET_PORT_GUID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_TARGET_PORT_GUID; }
278 {ULP_SDP}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_DEFAULT; return TK_ULP_SDP_DEFAULT; }
279 {ULP_SDP}{WHITE_COMMA_WHITE}{PORT_NUM} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_PORT; return TK_ULP_SDP_PORT; }
281 {ULP_RDS}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_RDS_DEFAULT; return TK_ULP_RDS_DEFAULT; }
282 {ULP_RDS}{WHITE_COMMA_WHITE}{PORT_NUM} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_RDS_PORT; return TK_ULP_RDS_PORT; }
284 {ULP_ISER}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_DEFAULT; return TK_ULP_ISER_DEFAULT; }
285 {ULP_ISER}{WHITE_COMMA_WHITE}{PORT_NUM} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_PORT; return TK_ULP_ISER_PORT; }
287 {ULP_SRP}{WHITE_COMMA_WHITE}{TARGET_PORT_GUID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SRP_GUID; return TK_ULP_SRP_GUID; }
289 {ULP_IPOIB}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_IPOIB_DEFAULT; return TK_ULP_IPOIB_DEFAULT; }
290 {ULP_IPOIB}{WHITE_COMMA_WHITE}{PKEY} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_IPOIB_PKEY; return TK_ULP_IPOIB_PKEY; }
294 yylval = strdup(yytext);
295 if (in_description || in_list_of_strings || in_single_string)
302 yylval = strdup(yytext);
303 if (in_description || in_list_of_strings || in_single_string)
311 if (in_description || in_list_of_strings || in_single_string)
313 yylval = strdup(yytext);
321 if (in_description || in_list_of_strings || in_single_string)
323 yylval = strdup(yytext);
333 yylval = strdup(yytext);
341 if (in_description || in_list_of_strings || in_single_string)
343 yylval = strdup(yytext);
351 yylval = strdup(&yytext[1]);
352 yylval[strlen(yylval)-1] = '\0';
356 . { SAVE_POS; yylval = strdup(yytext); return TK_TEXT;}
361 /*********************************************
362 *********************************************/
364 static void save_pos()
367 for (i = 0; i < yyleng; i++)
369 if (yytext[i] == '\n')
379 /*********************************************
380 *********************************************/
382 static void reset_new_line_flags()
384 in_description = FALSE;
385 in_list_of_hex_num_ranges = FALSE;
386 in_node_type = FALSE;
387 in_list_of_numbers = FALSE;
388 in_list_of_strings = FALSE;
389 in_list_of_num_pairs = FALSE;
390 in_asterisk_or_list_of_numbers = FALSE;
391 in_list_of_num_ranges = FALSE;
392 in_single_string = FALSE;
393 in_single_number = FALSE;