[ofa-general] [PATCH] opensm: redo lex and yacc files generation

Sasha Khapyorsky sashak at voltaire.com
Wed Aug 6 23:55:40 PDT 2008


Use standard automake mechanisms for dealing with yacc and lex files -
only *.l and *.y files are listed as SOURCES.

In addition to this basic change I was need to rename lex and yacc files
to have uniqye *.c file names, remove __qos_parser_ prefix
(config/ylwrap doesn't deal with it very well) and move header file
generation to local directory.

Signed-off-by: Sasha Khapyorsky <sashak at voltaire.com>
---
 opensm/opensm/Makefile.am        |   22 +-
 opensm/opensm/osm_qos_parser.l   |  394 -----
 opensm/opensm/osm_qos_parser.y   | 3064 --------------------------------------
 opensm/opensm/osm_qos_parser_l.l |  394 +++++
 opensm/opensm/osm_qos_parser_y.y | 3063 +++++++++++++++++++++++++++++++++++++
 5 files changed, 3460 insertions(+), 3477 deletions(-)
 delete mode 100644 opensm/opensm/osm_qos_parser.l
 delete mode 100644 opensm/opensm/osm_qos_parser.y
 create mode 100644 opensm/opensm/osm_qos_parser_l.l
 create mode 100644 opensm/opensm/osm_qos_parser_y.y

diff --git a/opensm/opensm/Makefile.am b/opensm/opensm/Makefile.am
index d14b913..06c27cc 100644
--- a/opensm/opensm/Makefile.am
+++ b/opensm/opensm/Makefile.am
@@ -59,17 +59,9 @@ opensm_SOURCES = main.c osm_console_io.c osm_console.c osm_db_files.c \
 		 osm_vl15intf.c osm_vl_arb_rcv.c \
 		 st.c osm_perfmgr.c osm_perfmgr_db.c \
 		 osm_event_plugin.c osm_dump.c \
-		 $(srcdir)/osm_qos_parser_y.c $(srcdir)/osm_qos_parser_l.c \
-		 osm_qos_policy.c
+		 osm_qos_parser_y.y osm_qos_parser_l.l osm_qos_policy.c
 
-$(srcdir)/osm_qos_parser_y.c: $(srcdir)/osm_qos_parser.y $(srcdir)/../include/opensm/osm_qos_policy.h
-	$(YACC) -d -o $(srcdir)/osm_qos_parser_y.c -p__qos_parser_ $(srcdir)/osm_qos_parser.y
-	mv -f $(srcdir)/osm_qos_parser_y.h $(srcdir)/../include/opensm/osm_qos_parser_y.h
-
-$(srcdir)/osm_qos_parser_l.c: $(srcdir)/osm_qos_parser.l $(srcdir)/../include/opensm/osm_qos_policy.h osm_qos_parser_y.c
-	$(LEX) -P__qos_parser_ -o$(srcdir)/osm_qos_parser_l.c $(srcdir)/osm_qos_parser.l
-
-$(srcdir)/../include/opensm/osm_qos_parser_y.h: $(srcdir)/osm_qos_parser_y.c
+AM_YFLAGS:= -d
 
 if OSMV_OPENIB
 opensm_CFLAGS = -Wall $(OSMV_CFLAGS) -fno-strict-aliasing -DVENDOR_RMPP_SUPPORT -DDUAL_SIDED_RMPP $(DBGFLAGS) -D_XOPEN_SOURCE=600 -D_BSD_SOURCE=1
@@ -127,7 +119,6 @@ opensminclude_HEADERS = \
 	$(srcdir)/../include/opensm/osm_port.h \
 	$(srcdir)/../include/opensm/osm_port_profile.h \
 	$(srcdir)/../include/opensm/osm_prefix_route.h \
-	$(srcdir)/../include/opensm/osm_qos_parser_y.h \
 	$(srcdir)/../include/opensm/osm_qos_policy.h \
 	$(srcdir)/../include/opensm/osm_rand_fwd_tbl.h \
 	$(srcdir)/../include/opensm/osm_remote_sm.h \
@@ -159,11 +150,4 @@ osm_version:
 
 # headers are distributed as part of the include dir
 EXTRA_DIST = $(srcdir)/libopensm.map $(srcdir)/libopensm.ver \
-	     $(srcdir)/ChangeLog \
-	     $(srcdir)/osm_qos_parser.y $(srcdir)/osm_qos_parser.l
-
-# generate c and h files from the lex and yacc files
-dist-hook: $(srcdir)/osm_qos_parser_y.c $(srcdir)/osm_qos_parser_l.c
-
-maintainer-clean-generic:
-	rm -f $(srcdir)/osm_qos_parser_y.c $(srcdir)/osm_qos_parser_l.c
+	     $(srcdir)/ChangeLog
diff --git a/opensm/opensm/osm_qos_parser.l b/opensm/opensm/osm_qos_parser.l
deleted file mode 100644
index 40e061d..0000000
--- a/opensm/opensm/osm_qos_parser.l
+++ /dev/null
@@ -1,394 +0,0 @@
-%{
-/*
- * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved.
- * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
- * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenIB.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-/*
- * Abstract:
- *    Lexer of OSM QoS parser.
- *
- * Environment:
- *    Linux User Mode
- *
- * Author:
- *    Yevgeny Kliteynik, Mellanox
- */
-
-#include <opensm/osm_qos_policy.h>
-#include <opensm/osm_qos_parser_y.h>
-
-#define HANDLE_IF_IN_DESCRIPTION   if (in_description) { __qos_parser_lval = strdup(__qos_parser_text); return TK_TEXT; }
-
-#define SAVE_POS save_pos()
-static void save_pos();
-
-extern int column_num;
-extern int line_num;
-extern FILE * __qos_parser_in;
-extern YYSTYPE __qos_parser_lval;
-
-boolean_t in_description = FALSE;
-boolean_t in_list_of_hex_num_ranges = FALSE;
-boolean_t in_node_type = FALSE;
-boolean_t in_list_of_numbers = FALSE;
-boolean_t in_list_of_strings = FALSE;
-boolean_t in_list_of_num_pairs = FALSE;
-boolean_t in_asterisk_or_list_of_numbers = FALSE;
-boolean_t in_list_of_num_ranges = FALSE;
-boolean_t in_single_string = FALSE;
-boolean_t in_single_number = FALSE;
-
-static void reset_new_line_flags();
-#define RESET_NEW_LINE_FLAGS reset_new_line_flags()
-
-#define START_USE            {in_description = TRUE;}     /* list of strings including whitespace (description) */
-#define START_PORT_GUID      {in_list_of_hex_num_ranges = TRUE;} /* comma-separated list of hex num ranges */
-#define START_PORT_NAME      {in_list_of_strings = TRUE;} /* comma-separated list of following strings: ../../.. */
-#define START_PARTITION      {in_single_string = TRUE;}   /* single string w/o whitespaces (partition name) */
-#define START_NAME           {in_single_string = TRUE;}   /* single string w/o whitespaces (port group name) */
-#define START_QOS_LEVEL_NAME {in_single_string = TRUE;}   /* single string w/o whitespaces (qos level name in match rule) */
-
-#define START_NODE_TYPE     {in_node_type = TRUE;}       /* comma-separated list of node types (ROUTER,CA,...) */
-#define START_SL2VL_TABLE   {in_list_of_numbers = TRUE;} /* comma-separated list of hex or dec numbers */
-
-#define START_GROUP         {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
-#define START_ACROSS        {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
-#define START_ACROSS_TO     {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
-#define START_ACROSS_FROM   {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
-#define START_SOURCE        {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
-#define START_DESTINATION   {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
-
-#define START_VLARB_HIGH    {in_list_of_num_pairs = TRUE;} /* comma-separated list of hex or dec num pairs: "num1:num2" */
-#define START_VLARB_LOW     {in_list_of_num_pairs = TRUE;} /* comma-separated list of hex or dec num pairs: "num1:num2" */
-
-#define START_TO            {in_asterisk_or_list_of_numbers = TRUE;} /* (asterisk) or (comma-separated list of hex or dec numbers) */
-#define START_FROM          {in_asterisk_or_list_of_numbers = TRUE;} /* (asterisk) or (comma-separated list of hex or dec numbers) */
-
-#define START_PATH_BITS     {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
-#define START_QOS_CLASS     {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
-#define START_SERVICE_ID    {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
-#define START_PKEY          {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
-
-#define START_SL               {in_single_number = TRUE;}   /* single number */
-#define START_VLARB_HIGH_LIMIT {in_single_number = TRUE;}   /* single number */
-#define START_MTU_LIMIT        {in_single_number = TRUE;}   /* single number */
-#define START_RATE_LIMIT       {in_single_number = TRUE;}   /* single number */
-#define START_PACKET_LIFE      {in_single_number = TRUE;}   /* single number */
-
-#define START_ULP_DEFAULT       {in_single_number = TRUE;}      /* single number */
-#define START_ULP_ANY           {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
-#define START_ULP_SDP_DEFAULT   {in_single_number = TRUE;}      /* single number */
-#define START_ULP_SDP_PORT      {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
-#define START_ULP_RDS_DEFAULT   {in_single_number = TRUE;}      /* single number */
-#define START_ULP_RDS_PORT      {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
-#define START_ULP_ISER_DEFAULT  {in_single_number = TRUE;}      /* single number */
-#define START_ULP_ISER_PORT     {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
-#define START_ULP_SRP_GUID      {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
-#define START_ULP_IPOIB_DEFAULT {in_single_number = TRUE;}      /* single number */
-#define START_ULP_IPOIB_PKEY    {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
-
-
-%}
-
-%option nounput noinput
-
-QOS_ULPS_START          qos\-ulps
-QOS_ULPS_END            end\-qos\-ulps
-PORT_GROUPS_START       port\-groups
-PORT_GROUPS_END         end\-port\-groups
-PORT_GROUP_START        port\-group
-PORT_GROUP_END          end\-port\-group
-PORT_NUM                port\-num
-NAME                    name
-USE                     use
-PORT_GUID               port\-guid
-TARGET_PORT_GUID        target\-port\-guid
-PORT_NAME               port\-name
-PARTITION               partition
-NODE_TYPE               node\-type
-QOS_SETUP_START         qos\-setup
-QOS_SETUP_END           end\-qos\-setup
-VLARB_TABLES_START      vlarb\-tables
-VLARB_TABLES_END        end\-vlarb\-tables
-VLARB_SCOPE_START       vlarb\-scope
-VLARB_SCOPE_END         end\-vlarb\-scope
-GROUP                   group
-ACROSS                  across
-VLARB_HIGH              vlarb\-high
-VLARB_LOW               vlarb\-low
-VLARB_HIGH_LIMIT        vl\-high\-limit
-SL2VL_TABLES_START      sl2vl\-tables
-SL2VL_TABLES_END        end\-sl2vl\-tables
-SL2VL_SCOPE_START       sl2vl\-scope
-SL2VL_SCOPE_END         end\-sl2vl\-scope
-TO                      to
-FROM                    from
-ACROSS_TO               across\-to
-ACROSS_FROM             across\-from
-SL2VL_TABLE             sl2vl\-table
-QOS_LEVELS_START        qos\-levels
-QOS_LEVELS_END          end\-qos\-levels
-QOS_LEVEL_START         qos\-level
-QOS_LEVEL_END           end\-qos\-level
-SL                      sl
-MTU_LIMIT               mtu\-limit
-RATE_LIMIT              rate\-limit
-PACKET_LIFE             packet\-life
-PATH_BITS               path\-bits
-QOS_MATCH_RULES_START   qos\-match\-rules
-QOS_MATCH_RULES_END     end\-qos\-match\-rules
-QOS_MATCH_RULE_START    qos\-match\-rule
-QOS_MATCH_RULE_END      end\-qos\-match\-rule
-QOS_CLASS               qos\-class
-SOURCE                  source
-DESTINATION             destination
-SERVICE_ID              service\-id
-PKEY                    pkey
-QOS_LEVEL_NAME          qos\-level\-name
-
-ROUTER                  [Rr][Oo][Uu][Tt][Ee][Rr]
-CA                      [Cc][Aa]
-SWITCH                  [Ss][Ww][Ii][Tt][Cc][Hh]
-SELF                    [Ss][Ee][Ll][Ff]
-ALL                     [Aa][Ll][Ll]
-
-ULP_SDP                 [Ss][Dd][Pp]
-ULP_SRP                 [Ss][Rr][Pp]
-ULP_RDS                 [Rr][Dd][Ss]
-ULP_IPOIB               [Ii][Pp][Oo][Ii][Bb]
-ULP_ISER                [Ii][Ss][Ee][Rr]
-ULP_ANY                 [Aa][Nn][Yy]
-ULP_DEFAULT             [Dd][Ee][Ff][Aa][Uu][Ll][Tt]
-
-WHITE                   [ \t]+
-NEW_LINE                \n
-COMMENT		            \#.*\n
-WHITE_DOTDOT_WHITE      [ \t]*:[ \t]*
-WHITE_COMMA_WHITE       [ \t]*,[ \t]*
-QUOTED_TEXT             \"[^\"]*\"
-
-%%
-
-
-{COMMENT}               { SAVE_POS; RESET_NEW_LINE_FLAGS; } /* swallow comment */
-{WHITE}{NEW_LINE}       { SAVE_POS; RESET_NEW_LINE_FLAGS; } /* trailing blanks with new line */
-{WHITE}                 { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; }
-{NEW_LINE}              { SAVE_POS; RESET_NEW_LINE_FLAGS; }
-
-{QOS_ULPS_START}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_ULPS_START; }
-{QOS_ULPS_END}          { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_ULPS_END; }
-
-{PORT_GROUPS_START}     { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUPS_START; }
-{PORT_GROUPS_END}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUPS_END; }
-{PORT_GROUP_START}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUP_START; }
-{PORT_GROUP_END}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUP_END; }
-
-{QOS_SETUP_START}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_SETUP_START; }
-{QOS_SETUP_END}         { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_SETUP_END; }
-{VLARB_TABLES_START}    { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_TABLES_START; }
-{VLARB_TABLES_END}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_TABLES_END; }
-{VLARB_SCOPE_START}     { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_SCOPE_START; }
-{VLARB_SCOPE_END}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_SCOPE_END; }
-
-{SL2VL_TABLES_START}    { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_TABLES_START; }
-{SL2VL_TABLES_END}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_TABLES_END; }
-{SL2VL_SCOPE_START}     { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_SCOPE_START; }
-{SL2VL_SCOPE_END}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_SCOPE_END; }
-
-{QOS_LEVELS_START}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVELS_START; }
-{QOS_LEVELS_END}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVELS_END; }
-{QOS_LEVEL_START}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVEL_START; }
-{QOS_LEVEL_END}         { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVEL_END; }
-
-{QOS_MATCH_RULES_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULES_START; }
-{QOS_MATCH_RULES_END}   { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULES_END; }
-{QOS_MATCH_RULE_START}  { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULE_START; }
-{QOS_MATCH_RULE_END}    { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULE_END; }
-
-{PORT_GUID}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PORT_GUID;    return TK_PORT_GUID;  }
-{PORT_NAME}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PORT_NAME;    return TK_PORT_NAME;  }
-{PARTITION}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PARTITION;    return TK_PARTITION;  }
-{NODE_TYPE}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_NODE_TYPE;    return TK_NODE_TYPE;  }
-{NAME}{WHITE_DOTDOT_WHITE}             { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_NAME;         return TK_NAME;       }
-{USE}{WHITE_DOTDOT_WHITE}              { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_USE;          return TK_USE;        }
-{GROUP}{WHITE_DOTDOT_WHITE}            { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_GROUP;        return TK_GROUP;      }
-{VLARB_HIGH}{WHITE_DOTDOT_WHITE}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_HIGH;   return TK_VLARB_HIGH; }
-{VLARB_LOW}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_LOW;    return TK_VLARB_LOW;  }
-{VLARB_HIGH_LIMIT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_HIGH_LIMIT; return TK_VLARB_HIGH_LIMIT;}
-{TO}{WHITE_DOTDOT_WHITE}               { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_TO;           return TK_TO;         }
-{FROM}{WHITE_DOTDOT_WHITE}             { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_FROM;         return TK_FROM;       }
-{ACROSS_TO}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS_TO;    return TK_ACROSS_TO;  }
-{ACROSS_FROM}{WHITE_DOTDOT_WHITE}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS_FROM;  return TK_ACROSS_FROM;}
-{ACROSS}{WHITE_DOTDOT_WHITE}           { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS;       return TK_ACROSS;     }
-{SL2VL_TABLE}{WHITE_DOTDOT_WHITE}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SL2VL_TABLE;  return TK_SL2VL_TABLE;}
-{SL}{WHITE_DOTDOT_WHITE}               { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SL;           return TK_SL;         }
-{MTU_LIMIT}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_MTU_LIMIT;    return TK_MTU_LIMIT;  }
-{RATE_LIMIT}{WHITE_DOTDOT_WHITE}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_RATE_LIMIT;   return TK_RATE_LIMIT; }
-{PACKET_LIFE}{WHITE_DOTDOT_WHITE}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PACKET_LIFE;  return TK_PACKET_LIFE;}
-{PATH_BITS}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PATH_BITS;    return TK_PATH_BITS;  }
-{QOS_CLASS}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_QOS_CLASS;    return TK_QOS_CLASS;  }
-{SOURCE}{WHITE_DOTDOT_WHITE}           { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SOURCE;       return TK_SOURCE;     }
-{DESTINATION}{WHITE_DOTDOT_WHITE}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_DESTINATION;  return TK_DESTINATION;}
-{SERVICE_ID}{WHITE_DOTDOT_WHITE}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SERVICE_ID;   return TK_SERVICE_ID; }
-{PKEY}{WHITE_DOTDOT_WHITE}             { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PKEY;         return TK_PKEY;       }
-{QOS_LEVEL_NAME}{WHITE_DOTDOT_WHITE}   { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_QOS_LEVEL_NAME; return TK_QOS_LEVEL_NAME;}
-
-{ROUTER}                  { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_ROUTER; __qos_parser_lval = strdup(__qos_parser_text); return TK_TEXT; }
-{CA}                      { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_CA;     __qos_parser_lval = strdup(__qos_parser_text); return TK_TEXT; }
-{SWITCH}                  { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_SWITCH; __qos_parser_lval = strdup(__qos_parser_text); return TK_TEXT; }
-{SELF}                    { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_SELF;   __qos_parser_lval = strdup(__qos_parser_text); return TK_TEXT; }
-{ALL}                     { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_ALL;    __qos_parser_lval = strdup(__qos_parser_text); return TK_TEXT; }
-
-{ULP_DEFAULT}{WHITE_DOTDOT_WHITE}              { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_DEFAULT; return TK_ULP_DEFAULT; }
-{ULP_ANY}{WHITE_COMMA_WHITE}{SERVICE_ID}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_SERVICE_ID; }
-{ULP_ANY}{WHITE_COMMA_WHITE}{PKEY}             { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_PKEY; }
-{ULP_ANY}{WHITE_COMMA_WHITE}{TARGET_PORT_GUID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_TARGET_PORT_GUID; }
-
-{ULP_SDP}{WHITE_DOTDOT_WHITE}                  { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_DEFAULT; return TK_ULP_SDP_DEFAULT; }
-{ULP_SDP}{WHITE_COMMA_WHITE}{PORT_NUM}         { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_PORT; return TK_ULP_SDP_PORT; }
-
-{ULP_RDS}{WHITE_DOTDOT_WHITE}                  { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_RDS_DEFAULT; return TK_ULP_RDS_DEFAULT; }
-{ULP_RDS}{WHITE_COMMA_WHITE}{PORT_NUM}         { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_RDS_PORT; return TK_ULP_RDS_PORT; }
-
-{ULP_ISER}{WHITE_DOTDOT_WHITE}                 { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_DEFAULT; return TK_ULP_ISER_DEFAULT; }
-{ULP_ISER}{WHITE_COMMA_WHITE}{PORT_NUM}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_PORT; return TK_ULP_ISER_PORT; }
-
-{ULP_SRP}{WHITE_COMMA_WHITE}{TARGET_PORT_GUID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SRP_GUID; return TK_ULP_SRP_GUID; }
-
-{ULP_IPOIB}{WHITE_DOTDOT_WHITE}                { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_IPOIB_DEFAULT; return TK_ULP_IPOIB_DEFAULT; }
-{ULP_IPOIB}{WHITE_COMMA_WHITE}{PKEY}           { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_IPOIB_PKEY; return TK_ULP_IPOIB_PKEY; }
-
-0[xX][0-9a-fA-F]+  {
-                        SAVE_POS;
-                        __qos_parser_lval = strdup(__qos_parser_text);
-                        if (in_description || in_list_of_strings || in_single_string)
-                            return TK_TEXT;
-                        return TK_NUMBER;
-                    }
-
-[0-9]+              {
-                        SAVE_POS;
-                        __qos_parser_lval = strdup(__qos_parser_text);
-                        if (in_description || in_list_of_strings || in_single_string)
-                            return TK_TEXT;
-                        return TK_NUMBER;
-                    }
-
-
--                   {
-                        SAVE_POS;
-                        if (in_description || in_list_of_strings || in_single_string)
-                        {
-                            __qos_parser_lval = strdup(__qos_parser_text);
-                            return TK_TEXT;
-                        }
-                        return TK_DASH;
-                    }
-
-:                   {
-                        SAVE_POS;
-                        if (in_description || in_list_of_strings || in_single_string)
-                        {
-                            __qos_parser_lval = strdup(__qos_parser_text);
-                            return TK_TEXT;
-                        }
-                        return TK_DOTDOT;
-                    }
-
-,                   {
-                        SAVE_POS;
-                        if (in_description)
-                        {
-                            __qos_parser_lval = strdup(__qos_parser_text);
-                            return TK_TEXT;
-                        }
-                        return TK_COMMA;
-                    }
-
-\*                  {
-                        SAVE_POS;
-                        if (in_description || in_list_of_strings || in_single_string)
-                        {
-                            __qos_parser_lval = strdup(__qos_parser_text);
-                            return TK_TEXT;
-                        }
-                        return TK_ASTERISK;
-                    }
-
-{QUOTED_TEXT}       {
-                        SAVE_POS;
-                        __qos_parser_lval = strdup(&__qos_parser_text[1]);
-                        __qos_parser_lval[strlen(__qos_parser_lval)-1] = '\0';
-                        return TK_TEXT;
-                    }
-
-.                   { SAVE_POS; __qos_parser_lval = strdup(__qos_parser_text); return TK_TEXT;}
-
-%%
-
-
-/*********************************************
- *********************************************/
-
-static void save_pos()
-{
-    int i;
-    for (i = 0; i < __qos_parser_leng; i++)
-    {
-        if (__qos_parser_text[i] == '\n')
-        {
-            line_num ++;
-            column_num = 1;
-        }
-        else
-            column_num ++;
-    }
-}
-
-/*********************************************
- *********************************************/
-
-static void reset_new_line_flags()
-{
-    in_description = FALSE;
-    in_list_of_hex_num_ranges = FALSE;
-    in_node_type = FALSE;
-    in_list_of_numbers = FALSE;
-    in_list_of_strings = FALSE;
-    in_list_of_num_pairs = FALSE;
-    in_asterisk_or_list_of_numbers = FALSE;
-    in_list_of_num_ranges = FALSE;
-    in_single_string = FALSE;
-    in_single_number = FALSE;
-}
diff --git a/opensm/opensm/osm_qos_parser.y b/opensm/opensm/osm_qos_parser.y
deleted file mode 100644
index 6fa024c..0000000
--- a/opensm/opensm/osm_qos_parser.y
+++ /dev/null
@@ -1,3064 +0,0 @@
-%{
-/*
- * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved.
- * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
- * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
- * Copyright (c) 2008 HNR Consulting. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenIB.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-/*
- * Abstract:
- *    Grammar of OSM QoS parser.
- *
- * Environment:
- *    Linux User Mode
- *
- * Author:
- *    Yevgeny Kliteynik, Mellanox
- */
-
-#include <stdio.h>
-#include <assert.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <opensm/osm_opensm.h>
-#include <opensm/osm_qos_policy.h>
-#include <opensm/osm_qos_parser_y.h>
-
-#define OSM_QOS_POLICY_MAX_LINE_LEN         1024*10
-#define OSM_QOS_POLICY_SL2VL_TABLE_LEN      IB_MAX_NUM_VLS
-#define OSM_QOS_POLICY_MAX_VL_NUM           IB_MAX_NUM_VLS
-
-typedef struct tmp_parser_struct_t_ {
-    char       str[OSM_QOS_POLICY_MAX_LINE_LEN];
-    uint64_t   num_pair[2];
-    cl_list_t  str_list;
-    cl_list_t  num_list;
-    cl_list_t  num_pair_list;
-} tmp_parser_struct_t;
-
-static void __parser_tmp_struct_init();
-static void __parser_tmp_struct_reset();
-static void __parser_tmp_struct_destroy();
-
-static char * __parser_strip_white(char * str);
-
-static void __parser_str2uint64(uint64_t * p_val, char * str);
-
-static void __parser_port_group_start();
-static int __parser_port_group_end();
-
-static void __parser_sl2vl_scope_start();
-static int __parser_sl2vl_scope_end();
-
-static void __parser_vlarb_scope_start();
-static int __parser_vlarb_scope_end();
-
-static void __parser_qos_level_start();
-static int __parser_qos_level_end();
-
-static void __parser_match_rule_start();
-static int __parser_match_rule_end();
-
-static void __parser_ulp_match_rule_start();
-static int __parser_ulp_match_rule_end();
-
-static void __pkey_rangelist2rangearr(
-    cl_list_t    * p_list,
-    uint64_t  ** * p_arr,
-    unsigned     * p_arr_len);
-
-static void __rangelist2rangearr(
-    cl_list_t    * p_list,
-    uint64_t  ** * p_arr,
-    unsigned     * p_arr_len);
-
-static void __merge_rangearr(
-    uint64_t  **   range_arr_1,
-    unsigned       range_len_1,
-    uint64_t  **   range_arr_2,
-    unsigned       range_len_2,
-    uint64_t  ** * p_arr,
-    unsigned     * p_arr_len );
-
-static void __parser_add_port_to_port_map(
-    cl_qmap_t   * p_map,
-    osm_physp_t * p_physp);
-
-static void __parser_add_guid_range_to_port_map(
-    cl_qmap_t  * p_map,
-    uint64_t  ** range_arr,
-    unsigned     range_len);
-
-static void __parser_add_pkey_range_to_port_map(
-    cl_qmap_t  * p_map,
-    uint64_t  ** range_arr,
-    unsigned     range_len);
-
-static void __parser_add_partition_list_to_port_map(
-    cl_qmap_t  * p_map,
-    cl_list_t  * p_list);
-
-static void __parser_add_map_to_port_map(
-    cl_qmap_t * p_dmap,
-    cl_map_t  * p_smap);
-
-static int __validate_pkeys(
-    uint64_t ** range_arr,
-    unsigned    range_len,
-    boolean_t   is_ipoib);
-
-static void __setup_simple_qos_levels();
-static void __clear_simple_qos_levels();
-static void __setup_ulp_match_rules();
-static void __process_ulp_match_rules();
-static void __qos_parser_error(const char *format, ...);
-
-extern char * __qos_parser_text;
-extern int __qos_parser_lex (void);
-extern FILE * __qos_parser_in;
-extern int errno;
-int __qos_parser_parse();
-
-#define RESET_BUFFER  __parser_tmp_struct_reset()
-
-tmp_parser_struct_t tmp_parser_struct;
-
-int column_num;
-int line_num;
-
-osm_qos_policy_t       * p_qos_policy = NULL;
-osm_qos_port_group_t   * p_current_port_group = NULL;
-osm_qos_sl2vl_scope_t  * p_current_sl2vl_scope = NULL;
-osm_qos_vlarb_scope_t  * p_current_vlarb_scope = NULL;
-osm_qos_level_t        * p_current_qos_level = NULL;
-osm_qos_match_rule_t   * p_current_qos_match_rule = NULL;
-osm_log_t              * p_qos_parser_osm_log;
-
-/* 16 Simple QoS Levels - one for each SL */
-static osm_qos_level_t osm_qos_policy_simple_qos_levels[16];
-
-/* Default Simple QoS Level */
-osm_qos_level_t __default_simple_qos_level;
-
-/*
- * List of match rules that will be generated by the
- * qos-ulp section. These rules are concatenated to
- * the end of the usual matching rules list at the
- * end of parsing.
- */
-static cl_list_t __ulp_match_rules;
-
-/***************************************************/
-
-%}
-
-%token TK_NUMBER
-%token TK_DASH
-%token TK_DOTDOT
-%token TK_COMMA
-%token TK_ASTERISK
-%token TK_TEXT
-
-%token TK_QOS_ULPS_START
-%token TK_QOS_ULPS_END
-
-%token TK_PORT_GROUPS_START
-%token TK_PORT_GROUPS_END
-%token TK_PORT_GROUP_START
-%token TK_PORT_GROUP_END
-
-%token TK_QOS_SETUP_START
-%token TK_QOS_SETUP_END
-%token TK_VLARB_TABLES_START
-%token TK_VLARB_TABLES_END
-%token TK_VLARB_SCOPE_START
-%token TK_VLARB_SCOPE_END
-
-%token TK_SL2VL_TABLES_START
-%token TK_SL2VL_TABLES_END
-%token TK_SL2VL_SCOPE_START
-%token TK_SL2VL_SCOPE_END
-
-%token TK_QOS_LEVELS_START
-%token TK_QOS_LEVELS_END
-%token TK_QOS_LEVEL_START
-%token TK_QOS_LEVEL_END
-
-%token TK_QOS_MATCH_RULES_START
-%token TK_QOS_MATCH_RULES_END
-%token TK_QOS_MATCH_RULE_START
-%token TK_QOS_MATCH_RULE_END
-
-%token TK_NAME
-%token TK_USE
-%token TK_PORT_GUID
-%token TK_PORT_NAME
-%token TK_PARTITION
-%token TK_NODE_TYPE
-%token TK_GROUP
-%token TK_ACROSS
-%token TK_VLARB_HIGH
-%token TK_VLARB_LOW
-%token TK_VLARB_HIGH_LIMIT
-%token TK_TO
-%token TK_FROM
-%token TK_ACROSS_TO
-%token TK_ACROSS_FROM
-%token TK_SL2VL_TABLE
-%token TK_SL
-%token TK_MTU_LIMIT
-%token TK_RATE_LIMIT
-%token TK_PACKET_LIFE
-%token TK_PATH_BITS
-%token TK_QOS_CLASS
-%token TK_SOURCE
-%token TK_DESTINATION
-%token TK_SERVICE_ID
-%token TK_QOS_LEVEL_NAME
-%token TK_PKEY
-
-%token TK_NODE_TYPE_ROUTER
-%token TK_NODE_TYPE_CA
-%token TK_NODE_TYPE_SWITCH
-%token TK_NODE_TYPE_SELF
-%token TK_NODE_TYPE_ALL
-
-%token TK_ULP_DEFAULT
-%token TK_ULP_ANY_SERVICE_ID
-%token TK_ULP_ANY_PKEY
-%token TK_ULP_ANY_TARGET_PORT_GUID
-%token TK_ULP_SDP_DEFAULT
-%token TK_ULP_SDP_PORT
-%token TK_ULP_RDS_DEFAULT
-%token TK_ULP_RDS_PORT
-%token TK_ULP_ISER_DEFAULT
-%token TK_ULP_ISER_PORT
-%token TK_ULP_SRP_GUID
-%token TK_ULP_IPOIB_DEFAULT
-%token TK_ULP_IPOIB_PKEY
-
-%start head
-
-%%
-
-head:               qos_policy_entries
-                    ;
-
-qos_policy_entries: /* empty */
-                    | qos_policy_entries qos_policy_entry
-                    ;
-
-qos_policy_entry:     qos_ulps_section
-                    | port_groups_section
-                    | qos_setup_section
-                    | qos_levels_section
-                    | qos_match_rules_section
-                    ;
-
-    /*
-     * Parsing qos-ulps:
-     * -------------------
-     *  qos-ulps
-     *      default                       : 0 #default SL
-     *      sdp, port-num 30000           : 1 #SL for SDP when destination port is 30000
-     *      sdp, port-num 10000-20000     : 2
-     *      sdp                           : 0 #default SL for SDP
-     *      srp, target-port-guid 0x1234  : 2
-     *      rds, port-num 25000           : 2 #SL for RDS when destination port is 25000
-     *      rds,                          : 0 #default SL for RDS
-     *      iser, port-num 900            : 5 #SL for iSER where target port is 900
-     *      iser                          : 4 #default SL for iSER
-     *      ipoib, pkey 0x0001            : 5 #SL for IPoIB on partition with pkey 0x0001
-     *      ipoib                         : 6 #default IPoIB partition - pkey=0x7FFF
-     *      any, service-id 0x6234        : 2
-     *      any, pkey 0x0ABC              : 3
-     *      any, target-port-guid 0x0ABC-0xFFFFF : 6
-     *  end-qos-ulps
-     */
-
-qos_ulps_section: TK_QOS_ULPS_START qos_ulps TK_QOS_ULPS_END
-                     ;
-
-qos_ulps:             qos_ulp
-                    | qos_ulps qos_ulp
-                    ;
-
-    /*
-     * Parsing port groups:
-     * -------------------
-     *  port-groups
-     *       port-group
-     *          name: Storage
-     *          use: our SRP storage targets
-     *          port-guid: 0x1000000000000001,0x1000000000000002
-     *          ...
-     *          port-name: vs1 HCA-1/P1
-     *          port-name: node_description/P2
-     *          ...
-     *          pkey: 0x00FF-0x0FFF
-     *          ...
-     *          partition: Part1
-     *          ...
-     *          node-type: ROUTER,CA,SWITCH,SELF,ALL
-     *          ...
-     *      end-port-group
-     *      port-group
-     *          ...
-     *      end-port-group
-     *  end-port-groups
-     */
-
-
-port_groups_section: TK_PORT_GROUPS_START port_groups TK_PORT_GROUPS_END
-                     ;
-
-port_groups:        port_group
-                    | port_groups port_group
-                    ;
-
-port_group:         port_group_start port_group_entries port_group_end
-                    ;
-
-port_group_start:   TK_PORT_GROUP_START {
-                        __parser_port_group_start();
-                    }
-                    ;
-
-port_group_end:     TK_PORT_GROUP_END {
-                        if ( __parser_port_group_end() )
-                            return 1;
-                    }
-                    ;
-
-port_group_entries: /* empty */
-                    | port_group_entries port_group_entry
-                    ;
-
-port_group_entry:     port_group_name
-                    | port_group_use
-                    | port_group_port_guid
-                    | port_group_port_name
-                    | port_group_pkey
-                    | port_group_partition
-                    | port_group_node_type
-                    ;
-
-
-    /*
-     * Parsing qos setup:
-     * -----------------
-     *  qos-setup
-     *      vlarb-tables
-     *          vlarb-scope
-     *              ...
-     *          end-vlarb-scope
-     *          vlarb-scope
-     *              ...
-     *          end-vlarb-scope
-     *     end-vlarb-tables
-     *     sl2vl-tables
-     *          sl2vl-scope
-     *              ...
-     *         end-sl2vl-scope
-     *         sl2vl-scope
-     *              ...
-     *          end-sl2vl-scope
-     *     end-sl2vl-tables
-     *  end-qos-setup
-     */
-
-qos_setup_section:  TK_QOS_SETUP_START qos_setup_items TK_QOS_SETUP_END
-                    ;
-
-qos_setup_items:    /* empty */
-                    | qos_setup_items vlarb_tables
-                    | qos_setup_items sl2vl_tables
-                    ;
-
-    /* Parsing vlarb-tables */
-
-vlarb_tables:       TK_VLARB_TABLES_START vlarb_scope_items TK_VLARB_TABLES_END
-                    ;
-
-vlarb_scope_items:  /* empty */
-                    | vlarb_scope_items vlarb_scope
-                    ;
-
-vlarb_scope:        vlarb_scope_start vlarb_scope_entries vlarb_scope_end
-                    ;
-
-vlarb_scope_start:  TK_VLARB_SCOPE_START {
-                        __parser_vlarb_scope_start();
-                    }
-                    ;
-
-vlarb_scope_end:    TK_VLARB_SCOPE_END {
-                        if ( __parser_vlarb_scope_end() )
-                            return 1;
-                    }
-                    ;
-
-vlarb_scope_entries:/* empty */
-                    | vlarb_scope_entries vlarb_scope_entry
-                    ;
-
-    /*
-     *          vlarb-scope
-     *              group: Storage
-     *              ...
-     *              across: Storage
-     *              ...
-     *              vlarb-high: 0:255,1:127,2:63,3:31,4:15,5:7,6:3,7:1
-     *              vlarb-low: 8:255,9:127,10:63,11:31,12:15,13:7,14:3
-     *              vl-high-limit: 10
-     *          end-vlarb-scope
-     */
-
-vlarb_scope_entry:    vlarb_scope_group
-                    | vlarb_scope_across
-                    | vlarb_scope_vlarb_high
-                    | vlarb_scope_vlarb_low
-                    | vlarb_scope_vlarb_high_limit
-                    ;
-
-    /* Parsing sl2vl-tables */
-
-sl2vl_tables:       TK_SL2VL_TABLES_START sl2vl_scope_items TK_SL2VL_TABLES_END
-                    ;
-
-sl2vl_scope_items:  /* empty */
-                    | sl2vl_scope_items sl2vl_scope
-                    ;
-
-sl2vl_scope:        sl2vl_scope_start sl2vl_scope_entries sl2vl_scope_end
-                    ;
-
-sl2vl_scope_start:  TK_SL2VL_SCOPE_START {
-                        __parser_sl2vl_scope_start();
-                    }
-                    ;
-
-sl2vl_scope_end:    TK_SL2VL_SCOPE_END {
-                        if ( __parser_sl2vl_scope_end() )
-                            return 1;
-                    }
-                    ;
-
-sl2vl_scope_entries:/* empty */
-                    | sl2vl_scope_entries sl2vl_scope_entry
-                    ;
-
-    /*
-     *          sl2vl-scope
-     *              group: Part1
-     *              ...
-     *              from: *
-     *              ...
-     *              to: *
-     *              ...
-     *              across-to: Storage2
-     *              ...
-     *              across-from: Storage1
-     *              ...
-     *              sl2vl-table: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7
-     *          end-sl2vl-scope
-     */
-
-sl2vl_scope_entry:    sl2vl_scope_group
-                    | sl2vl_scope_across
-                    | sl2vl_scope_across_from
-                    | sl2vl_scope_across_to
-                    | sl2vl_scope_from
-                    | sl2vl_scope_to
-                    | sl2vl_scope_sl2vl_table
-                    ;
-
-    /*
-     * Parsing qos-levels:
-     * ------------------
-     *  qos-levels
-     *      qos-level
-     *          name: qos_level_1
-     *          use: for the lowest priority communication
-     *          sl: 15
-     *          mtu-limit: 1
-     *          rate-limit: 1
-     *          packet-life: 12
-     *          path-bits: 2,4,8-32
-     *          pkey: 0x00FF-0x0FFF
-     *      end-qos-level
-     *          ...
-     *      qos-level
-     *    end-qos-level
-     *  end-qos-levels
-     */
-
-
-qos_levels_section: TK_QOS_LEVELS_START qos_levels TK_QOS_LEVELS_END
-                    ;
-
-qos_levels:         /* empty */
-                    | qos_levels qos_level
-                    ;
-
-qos_level:          qos_level_start qos_level_entries qos_level_end
-                    ;
-
-qos_level_start:    TK_QOS_LEVEL_START {
-                        __parser_qos_level_start();
-                    }
-                    ;
-
-qos_level_end:      TK_QOS_LEVEL_END {
-                        if ( __parser_qos_level_end() )
-                            return 1;
-                    }
-                    ;
-
-qos_level_entries:  /* empty */
-                    | qos_level_entries qos_level_entry
-                    ;
-
-qos_level_entry:      qos_level_name
-                    | qos_level_use
-                    | qos_level_sl
-                    | qos_level_mtu_limit
-                    | qos_level_rate_limit
-                    | qos_level_packet_life
-                    | qos_level_path_bits
-                    | qos_level_pkey
-                    ;
-
-    /*
-     * Parsing qos-match-rules:
-     * -----------------------
-     *  qos-match-rules
-     *      qos-match-rule
-     *          use: low latency by class 7-9 or 11 and bla bla
-     *          qos-class: 7-9,11
-     *          qos-level-name: default
-     *          source: Storage
-     *          destination: Storage
-     *          service-id: 22,4719-5000
-     *          pkey: 0x00FF-0x0FFF
-     *      end-qos-match-rule
-     *      qos-match-rule
-     *          ...
-     *      end-qos-match-rule
-     *  end-qos-match-rules
-     */
-
-qos_match_rules_section: TK_QOS_MATCH_RULES_START qos_match_rules TK_QOS_MATCH_RULES_END
-                    ;
-
-qos_match_rules:    /* empty */
-                    | qos_match_rules qos_match_rule
-                    ;
-
-qos_match_rule:     qos_match_rule_start qos_match_rule_entries qos_match_rule_end
-                    ;
-
-qos_match_rule_start: TK_QOS_MATCH_RULE_START {
-                        __parser_match_rule_start();
-                    }
-                    ;
-
-qos_match_rule_end: TK_QOS_MATCH_RULE_END {
-                        if ( __parser_match_rule_end() )
-                            return 1;
-                    }
-                    ;
-
-qos_match_rule_entries: /* empty */
-                    | qos_match_rule_entries qos_match_rule_entry
-                    ;
-
-qos_match_rule_entry: qos_match_rule_use
-                    | qos_match_rule_qos_class
-                    | qos_match_rule_qos_level_name
-                    | qos_match_rule_source
-                    | qos_match_rule_destination
-                    | qos_match_rule_service_id
-                    | qos_match_rule_pkey
-                    ;
-
-
-    /*
-     * Parsing qos-ulps:
-     * -----------------
-     *   default
-     *   sdp
-     *   sdp with port-num
-     *   rds
-     *   rds with port-num
-     *   srp with port-guid
-     *   iser
-     *   iser with port-num
-     *   ipoib
-     *   ipoib with pkey
-     *   any with service-id
-     *   any with pkey
-     *   any with target-port-guid
-     */
-
-qos_ulp:            TK_ULP_DEFAULT single_number {
-                        /* parsing default ulp rule: "default: num" */
-                        cl_list_iterator_t    list_iterator;
-                        uint64_t            * p_tmp_num;
-
-                        list_iterator = cl_list_head(&tmp_parser_struct.num_list);
-                        p_tmp_num = (uint64_t*)cl_list_obj(list_iterator);
-                        if (*p_tmp_num > 15)
-                        {
-                            __qos_parser_error("illegal SL value");
-                            return 1;
-                        }
-                        __default_simple_qos_level.sl = (uint8_t)(*p_tmp_num);
-                        __default_simple_qos_level.sl_set = TRUE;
-                        free(p_tmp_num);
-                        cl_list_remove_all(&tmp_parser_struct.num_list);
-                    }
-
-                    | qos_ulp_type_any_service list_of_ranges TK_DOTDOT {
-                        /* "any, service-id ... : sl" - one instance of list of ranges */
-                        uint64_t ** range_arr;
-                        unsigned    range_len;
-
-                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
-                        {
-                            __qos_parser_error("ULP rule doesn't have service ids");
-                            return 1;
-                        }
-
-                        /* get all the service id ranges */
-                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                              &range_arr,
-                                              &range_len );
-
-                        p_current_qos_match_rule->service_id_range_arr = range_arr;
-                        p_current_qos_match_rule->service_id_range_len = range_len;
-
-                    } qos_ulp_sl
-
-                    | qos_ulp_type_any_pkey list_of_ranges TK_DOTDOT {
-                        /* "any, pkey ... : sl" - one instance of list of ranges */
-                        uint64_t ** range_arr;
-                        unsigned    range_len;
-
-                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
-                        {
-                            __qos_parser_error("ULP rule doesn't have pkeys");
-                            return 1;
-                        }
-
-                        /* get all the pkey ranges */
-                        __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                              &range_arr,
-                                              &range_len );
-
-                        p_current_qos_match_rule->pkey_range_arr = range_arr;
-                        p_current_qos_match_rule->pkey_range_len = range_len;
-
-                    } qos_ulp_sl
-
-                    | qos_ulp_type_any_target_port_guid list_of_ranges TK_DOTDOT {
-                        /* any, target-port-guid ... : sl */
-                        uint64_t ** range_arr;
-                        unsigned    range_len;
-
-                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
-                        {
-                            __qos_parser_error("ULP rule doesn't have port guids");
-                            return 1;
-                        }
-
-                        /* create a new port group with these ports */
-                        __parser_port_group_start();
-
-                        p_current_port_group->name = strdup("_ULP_Targets_");
-                        p_current_port_group->use = strdup("Generated from ULP rules");
-
-                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                              &range_arr,
-                                              &range_len );
-
-                        __parser_add_guid_range_to_port_map(
-                                              &p_current_port_group->port_map,
-                                              range_arr,
-                                              range_len);
-
-                        /* add this port group to the destination
-                           groups of the current match rule */
-                        cl_list_insert_tail(&p_current_qos_match_rule->destination_group_list,
-                                            p_current_port_group);
-
-                        __parser_port_group_end();
-
-                    } qos_ulp_sl
-
-                    | qos_ulp_type_sdp_default {
-                        /* "sdp : sl" - default SL for SDP */
-                        uint64_t ** range_arr =
-                               (uint64_t **)malloc(sizeof(uint64_t *));
-                        range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t));
-                        range_arr[0][0] = OSM_QOS_POLICY_ULP_SDP_SERVICE_ID;
-                        range_arr[0][1] = OSM_QOS_POLICY_ULP_SDP_SERVICE_ID + 0xFFFF;
-
-                        p_current_qos_match_rule->service_id_range_arr = range_arr;
-                        p_current_qos_match_rule->service_id_range_len = 1;
-
-                    } qos_ulp_sl
-
-                    | qos_ulp_type_sdp_port list_of_ranges TK_DOTDOT {
-                        /* sdp with port numbers */
-                        uint64_t ** range_arr;
-                        unsigned    range_len;
-                        unsigned    i;
-
-                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
-                        {
-                            __qos_parser_error("SDP ULP rule doesn't have port numbers");
-                            return 1;
-                        }
-
-                        /* get all the port ranges */
-                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                              &range_arr,
-                                              &range_len );
-                        /* now translate these port numbers into service ids */
-                        for (i = 0; i < range_len; i++)
-                        {
-                            if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF)
-                            {
-                                __qos_parser_error("SDP port number out of range");
-                                return 1;
-                            }
-                            range_arr[i][0] += OSM_QOS_POLICY_ULP_SDP_SERVICE_ID;
-                            range_arr[i][1] += OSM_QOS_POLICY_ULP_SDP_SERVICE_ID;
-                        }
-
-                        p_current_qos_match_rule->service_id_range_arr = range_arr;
-                        p_current_qos_match_rule->service_id_range_len = range_len;
-
-                    } qos_ulp_sl
-
-                    | qos_ulp_type_rds_default {
-                        /* "rds : sl" - default SL for RDS */
-                        uint64_t ** range_arr =
-                               (uint64_t **)malloc(sizeof(uint64_t *));
-                        range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t));
-                        range_arr[0][0] = range_arr[0][1] =
-                           OSM_QOS_POLICY_ULP_RDS_SERVICE_ID + OSM_QOS_POLICY_ULP_RDS_PORT;
-
-                        p_current_qos_match_rule->service_id_range_arr = range_arr;
-                        p_current_qos_match_rule->service_id_range_len = 1;
-
-                    } qos_ulp_sl
-
-                    | qos_ulp_type_rds_port list_of_ranges TK_DOTDOT {
-                        /* rds with port numbers */
-                        uint64_t ** range_arr;
-                        unsigned    range_len;
-                        unsigned    i;
-
-                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
-                        {
-                            __qos_parser_error("RDS ULP rule doesn't have port numbers");
-                            return 1;
-                        }
-
-                        /* get all the port ranges */
-                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                              &range_arr,
-                                              &range_len );
-                        /* now translate these port numbers into service ids */
-                        for (i = 0; i < range_len; i++)
-                        {
-                            if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF)
-                            {
-                                __qos_parser_error("SDP port number out of range");
-                                return 1;
-                            }
-                            range_arr[i][0] += OSM_QOS_POLICY_ULP_RDS_SERVICE_ID;
-                            range_arr[i][1] += OSM_QOS_POLICY_ULP_RDS_SERVICE_ID;
-                        }
-
-                        p_current_qos_match_rule->service_id_range_arr = range_arr;
-                        p_current_qos_match_rule->service_id_range_len = range_len;
-
-                    } qos_ulp_sl
-
-                    | qos_ulp_type_iser_default {
-                        /* "iSER : sl" - default SL for iSER */
-                        uint64_t ** range_arr =
-                               (uint64_t **)malloc(sizeof(uint64_t *));
-                        range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t));
-                        range_arr[0][0] = range_arr[0][1] =
-                           OSM_QOS_POLICY_ULP_ISER_SERVICE_ID + OSM_QOS_POLICY_ULP_ISER_PORT;
-
-                        p_current_qos_match_rule->service_id_range_arr = range_arr;
-                        p_current_qos_match_rule->service_id_range_len = 1;
-
-                    } qos_ulp_sl
-
-                    | qos_ulp_type_iser_port list_of_ranges TK_DOTDOT {
-                        /* iser with port numbers */
-                        uint64_t ** range_arr;
-                        unsigned    range_len;
-                        unsigned    i;
-
-                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
-                        {
-                            __qos_parser_error("iSER ULP rule doesn't have port numbers");
-                            return 1;
-                        }
-
-                        /* get all the port ranges */
-                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                              &range_arr,
-                                              &range_len );
-                        /* now translate these port numbers into service ids */
-                        for (i = 0; i < range_len; i++)
-                        {
-                            if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF)
-                            {
-                                __qos_parser_error("SDP port number out of range");
-                                return 1;
-                            }
-                            range_arr[i][0] += OSM_QOS_POLICY_ULP_ISER_SERVICE_ID;
-                            range_arr[i][1] += OSM_QOS_POLICY_ULP_ISER_SERVICE_ID;
-                        }
-
-                        p_current_qos_match_rule->service_id_range_arr = range_arr;
-                        p_current_qos_match_rule->service_id_range_len = range_len;
-
-                    } qos_ulp_sl
-
-                    | qos_ulp_type_srp_guid list_of_ranges TK_DOTDOT {
-                        /* srp with target guids - this rule is similar
-                           to writing 'any' ulp with target port guids */
-                        uint64_t ** range_arr;
-                        unsigned    range_len;
-
-                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
-                        {
-                            __qos_parser_error("SRP ULP rule doesn't have port guids");
-                            return 1;
-                        }
-
-                        /* create a new port group with these ports */
-                        __parser_port_group_start();
-
-                        p_current_port_group->name = strdup("_SRP_Targets_");
-                        p_current_port_group->use = strdup("Generated from ULP rules");
-
-                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                              &range_arr,
-                                              &range_len );
-
-                        __parser_add_guid_range_to_port_map(
-                                              &p_current_port_group->port_map,
-                                              range_arr,
-                                              range_len);
-
-                        /* add this port group to the destination
-                           groups of the current match rule */
-                        cl_list_insert_tail(&p_current_qos_match_rule->destination_group_list,
-                                            p_current_port_group);
-
-                        __parser_port_group_end();
-
-                    } qos_ulp_sl
-
-                    | qos_ulp_type_ipoib_default {
-                        /* ipoib w/o any pkeys (default pkey) */
-                        uint64_t ** range_arr =
-                               (uint64_t **)malloc(sizeof(uint64_t *));
-                        range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t));
-                        range_arr[0][0] = range_arr[0][1] = 0x7fff;
-
-                        /*
-                         * Although we know that the default partition exists,
-                         * we still need to validate it by checking that it has
-                         * at least two full members. Otherwise IPoIB won't work.
-                         */
-                        if (__validate_pkeys(range_arr, 1, TRUE))
-                            return 1;
-
-                        p_current_qos_match_rule->pkey_range_arr = range_arr;
-                        p_current_qos_match_rule->pkey_range_len = 1;
-
-                    } qos_ulp_sl
-
-                    | qos_ulp_type_ipoib_pkey list_of_ranges TK_DOTDOT {
-                        /* ipoib with pkeys */
-                        uint64_t ** range_arr;
-                        unsigned    range_len;
-
-                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
-                        {
-                            __qos_parser_error("IPoIB ULP rule doesn't have pkeys");
-                            return 1;
-                        }
-
-                        /* get all the pkey ranges */
-                        __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                              &range_arr,
-                                              &range_len );
-
-                        /*
-                         * Validate pkeys.
-                         * For IPoIB pkeys the validation is strict.
-                         * If some problem would be found, parsing will
-                         * be aborted with a proper error messages.
-                         */
-                        if (__validate_pkeys(range_arr, range_len, TRUE))
-                            return 1;
-
-                        p_current_qos_match_rule->pkey_range_arr = range_arr;
-                        p_current_qos_match_rule->pkey_range_len = range_len;
-
-                    } qos_ulp_sl
-                    ;
-
-qos_ulp_type_any_service: TK_ULP_ANY_SERVICE_ID
-                    { __parser_ulp_match_rule_start(); };
-
-qos_ulp_type_any_pkey: TK_ULP_ANY_PKEY
-                    { __parser_ulp_match_rule_start(); };
-
-qos_ulp_type_any_target_port_guid: TK_ULP_ANY_TARGET_PORT_GUID
-                    { __parser_ulp_match_rule_start(); };
-
-qos_ulp_type_sdp_default: TK_ULP_SDP_DEFAULT
-                    { __parser_ulp_match_rule_start(); };
-
-qos_ulp_type_sdp_port: TK_ULP_SDP_PORT
-                    { __parser_ulp_match_rule_start(); };
-
-qos_ulp_type_rds_default: TK_ULP_RDS_DEFAULT
-                    { __parser_ulp_match_rule_start(); };
-
-qos_ulp_type_rds_port: TK_ULP_RDS_PORT
-                    { __parser_ulp_match_rule_start(); };
-
-qos_ulp_type_iser_default: TK_ULP_ISER_DEFAULT
-                    { __parser_ulp_match_rule_start(); };
-
-qos_ulp_type_iser_port: TK_ULP_ISER_PORT
-                    { __parser_ulp_match_rule_start(); };
-
-qos_ulp_type_srp_guid: TK_ULP_SRP_GUID
-                    { __parser_ulp_match_rule_start(); };
-
-qos_ulp_type_ipoib_default: TK_ULP_IPOIB_DEFAULT
-                    { __parser_ulp_match_rule_start(); };
-
-qos_ulp_type_ipoib_pkey: TK_ULP_IPOIB_PKEY
-                    { __parser_ulp_match_rule_start(); };
-
-
-qos_ulp_sl:   single_number {
-                        /* get the SL for ULP rules */
-                        cl_list_iterator_t  list_iterator;
-                        uint64_t          * p_tmp_num;
-                        uint8_t             sl;
-
-                        list_iterator = cl_list_head(&tmp_parser_struct.num_list);
-                        p_tmp_num = (uint64_t*)cl_list_obj(list_iterator);
-                        if (*p_tmp_num > 15)
-                        {
-                            __qos_parser_error("illegal SL value");
-                            return 1;
-                        }
-
-                        sl = (uint8_t)(*p_tmp_num);
-                        free(p_tmp_num);
-                        cl_list_remove_all(&tmp_parser_struct.num_list);
-
-                        p_current_qos_match_rule->p_qos_level =
-                                 &osm_qos_policy_simple_qos_levels[sl];
-                        p_current_qos_match_rule->qos_level_name =
-                                 strdup(osm_qos_policy_simple_qos_levels[sl].name);
-
-                        if (__parser_ulp_match_rule_end())
-                            return 1;
-                    }
-                    ;
-
-    /*
-     *  port_group_entry values:
-     *      port_group_name
-     *      port_group_use
-     *      port_group_port_guid
-     *      port_group_port_name
-     *      port_group_pkey
-     *      port_group_partition
-     *      port_group_node_type
-     */
-
-port_group_name:        port_group_name_start single_string {
-                            /* 'name' of 'port-group' - one instance */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            if (p_current_port_group->name)
-                            {
-                                __qos_parser_error("port-group has multiple 'name' tags");
-                                cl_list_remove_all(&tmp_parser_struct.str_list);
-                                return 1;
-                            }
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                    p_current_port_group->name = tmp_str;
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-port_group_name_start:  TK_NAME {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-port_group_use:         port_group_use_start single_string {
-                            /* 'use' of 'port-group' - one instance */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            if (p_current_port_group->use)
-                            {
-                                __qos_parser_error("port-group has multiple 'use' tags");
-                                cl_list_remove_all(&tmp_parser_struct.str_list);
-                                return 1;
-                            }
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                    p_current_port_group->use = tmp_str;
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-port_group_use_start:   TK_USE {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-port_group_port_name:   port_group_port_name_start string_list {
-                            /* 'port-name' in 'port-group' - any num of instances */
-                            cl_list_iterator_t list_iterator;
-                            osm_node_t * p_node;
-                            osm_physp_t * p_physp;
-                            unsigned port_num;
-                            char * tmp_str;
-                            char * port_str;
-
-                            /* parsing port name strings */
-                            for (list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                                 list_iterator != cl_list_end(&tmp_parser_struct.str_list);
-                                 list_iterator = cl_list_next(list_iterator))
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                {
-                                    /* last slash in port name string is a separator
-                                       between node name and port number */
-                                    port_str = strrchr(tmp_str, '/');
-                                    if (!port_str || (strlen(port_str) < 3) ||
-                                        (port_str[1] != 'p' && port_str[1] != 'P')) {
-                                        __qos_parser_error("'%s' - illegal port name",
-                                                           tmp_str);
-                                        free(tmp_str);
-                                        cl_list_remove_all(&tmp_parser_struct.str_list);
-                                        return 1;
-                                    }
-
-                                    if (!(port_num = strtoul(&port_str[2],NULL,0))) {
-                                        __qos_parser_error(
-                                               "'%s' - illegal port number in port name",
-                                               tmp_str);
-                                        free(tmp_str);
-                                        cl_list_remove_all(&tmp_parser_struct.str_list);
-                                        return 1;
-                                    }
-
-                                    /* separate node name from port number */
-                                    port_str[0] = '\0';
-
-                                    if (st_lookup(p_qos_policy->p_node_hash,
-                                                  (st_data_t)tmp_str,
-                                                  (st_data_t*)&p_node))
-                                    {
-                                        /* we found the node, now get the right port */
-                                        p_physp = osm_node_get_physp_ptr(p_node, port_num);
-                                        if (!p_physp) {
-                                            __qos_parser_error(
-                                                   "'%s' - port number out of range in port name",
-                                                   tmp_str);
-                                            free(tmp_str);
-                                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                                            return 1;
-                                        }
-                                        /* we found the port, now add it to guid table */
-                                        __parser_add_port_to_port_map(&p_current_port_group->port_map,
-                                                                      p_physp);
-                                    }
-                                    free(tmp_str);
-                                }
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-port_group_port_name_start: TK_PORT_NAME {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-port_group_port_guid:   port_group_port_guid_start list_of_ranges {
-                            /* 'port-guid' in 'port-group' - any num of instances */
-                            /* list of guid ranges */
-                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
-                            {
-                                uint64_t ** range_arr;
-                                unsigned range_len;
-
-                                __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                                      &range_arr,
-                                                      &range_len );
-
-                                __parser_add_guid_range_to_port_map(
-                                                      &p_current_port_group->port_map,
-                                                      range_arr,
-                                                      range_len);
-                            }
-                        }
-                        ;
-
-port_group_port_guid_start: TK_PORT_GUID {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-port_group_pkey:        port_group_pkey_start list_of_ranges {
-                            /* 'pkey' in 'port-group' - any num of instances */
-                            /* list of pkey ranges */
-                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
-                            {
-                                uint64_t ** range_arr;
-                                unsigned range_len;
-
-                                __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                                      &range_arr,
-                                                      &range_len );
-
-                                __parser_add_pkey_range_to_port_map(
-                                                      &p_current_port_group->port_map,
-                                                      range_arr,
-                                                      range_len);
-                            }
-                        }
-                        ;
-
-port_group_pkey_start:  TK_PKEY {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-port_group_partition:  port_group_partition_start string_list {
-                            /* 'partition' in 'port-group' - any num of instances */
-                            __parser_add_partition_list_to_port_map(
-                                               &p_current_port_group->port_map,
-                                               &tmp_parser_struct.str_list);
-                        }
-                        ;
-
-port_group_partition_start: TK_PARTITION {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-port_group_node_type:   port_group_node_type_start port_group_node_type_list {
-                            /* 'node-type' in 'port-group' - any num of instances */
-                        }
-                        ;
-
-port_group_node_type_start: TK_NODE_TYPE {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-port_group_node_type_list:  node_type_item
-                        |   port_group_node_type_list TK_COMMA node_type_item
-                        ;
-
-node_type_item:           node_type_ca
-                        | node_type_switch
-                        | node_type_router
-                        | node_type_all
-                        | node_type_self
-                        ;
-
-node_type_ca:           TK_NODE_TYPE_CA {
-                            p_current_port_group->node_types |=
-                               OSM_QOS_POLICY_NODE_TYPE_CA;
-                        }
-                        ;
-
-node_type_switch:       TK_NODE_TYPE_SWITCH {
-                            p_current_port_group->node_types |=
-                               OSM_QOS_POLICY_NODE_TYPE_SWITCH;
-                        }
-                        ;
-
-node_type_router:       TK_NODE_TYPE_ROUTER {
-                            p_current_port_group->node_types |=
-                               OSM_QOS_POLICY_NODE_TYPE_ROUTER;
-                        }
-                        ;
-
-node_type_all:          TK_NODE_TYPE_ALL {
-                            p_current_port_group->node_types |=
-                               (OSM_QOS_POLICY_NODE_TYPE_CA |
-                                OSM_QOS_POLICY_NODE_TYPE_SWITCH |
-                                OSM_QOS_POLICY_NODE_TYPE_ROUTER);
-                        }
-                        ;
-
-node_type_self:         TK_NODE_TYPE_SELF {
-                            osm_port_t * p_osm_port =
-                                osm_get_port_by_guid(p_qos_policy->p_subn,
-                                     p_qos_policy->p_subn->sm_port_guid);
-                            if (p_osm_port)
-                                __parser_add_port_to_port_map(
-                                   &p_current_port_group->port_map,
-                                   p_osm_port->p_physp);
-                        }
-                        ;
-
-    /*
-     *  vlarb_scope_entry values:
-     *      vlarb_scope_group
-     *      vlarb_scope_across
-     *      vlarb_scope_vlarb_high
-     *      vlarb_scope_vlarb_low
-     *      vlarb_scope_vlarb_high_limit
-     */
-
-
-
-vlarb_scope_group:      vlarb_scope_group_start string_list {
-                            /* 'group' in 'vlarb-scope' - any num of instances */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                    cl_list_insert_tail(&p_current_vlarb_scope->group_list,tmp_str);
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-vlarb_scope_group_start: TK_GROUP {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-vlarb_scope_across: vlarb_scope_across_start string_list {
-                            /* 'across' in 'vlarb-scope' - any num of instances */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                    cl_list_insert_tail(&p_current_vlarb_scope->across_list,tmp_str);
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-vlarb_scope_across_start: TK_ACROSS {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-vlarb_scope_vlarb_high_limit:  vlarb_scope_vlarb_high_limit_start single_number {
-                            /* 'vl-high-limit' in 'vlarb-scope' - one instance of one number */
-                            cl_list_iterator_t    list_iterator;
-                            uint64_t            * p_tmp_num;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
-                            p_tmp_num = (uint64_t*)cl_list_obj(list_iterator);
-                            if (p_tmp_num)
-                            {
-                                p_current_vlarb_scope->vl_high_limit = (uint32_t)(*p_tmp_num);
-                                p_current_vlarb_scope->vl_high_limit_set = TRUE;
-                                free(p_tmp_num);
-                            }
-
-                            cl_list_remove_all(&tmp_parser_struct.num_list);
-                        }
-                        ;
-
-vlarb_scope_vlarb_high_limit_start: TK_VLARB_HIGH_LIMIT {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-vlarb_scope_vlarb_high: vlarb_scope_vlarb_high_start num_list_with_dotdot {
-                            /* 'vlarb-high' in 'vlarb-scope' - list of pairs of numbers with ':' and ',' */
-                            cl_list_iterator_t    list_iterator;
-                            uint64_t            * num_pair;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) )
-                            {
-                                num_pair = (uint64_t*)cl_list_obj(list_iterator);
-                                if (num_pair)
-                                    cl_list_insert_tail(&p_current_vlarb_scope->vlarb_high_list,num_pair);
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.num_pair_list);
-                        }
-                        ;
-
-vlarb_scope_vlarb_high_start: TK_VLARB_HIGH {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-vlarb_scope_vlarb_low:  vlarb_scope_vlarb_low_start num_list_with_dotdot {
-                            /* 'vlarb-low' in 'vlarb-scope' - list of pairs of numbers with ':' and ',' */
-                            cl_list_iterator_t    list_iterator;
-                            uint64_t            * num_pair;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) )
-                            {
-                                num_pair = (uint64_t*)cl_list_obj(list_iterator);
-                                if (num_pair)
-                                    cl_list_insert_tail(&p_current_vlarb_scope->vlarb_low_list,num_pair);
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.num_pair_list);
-                        }
-                        ;
-
-vlarb_scope_vlarb_low_start: TK_VLARB_LOW {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-    /*
-     *  sl2vl_scope_entry values:
-     *      sl2vl_scope_group
-     *      sl2vl_scope_across
-     *      sl2vl_scope_across_from
-     *      sl2vl_scope_across_to
-     *      sl2vl_scope_from
-     *      sl2vl_scope_to
-     *      sl2vl_scope_sl2vl_table
-     */
-
-sl2vl_scope_group:      sl2vl_scope_group_start string_list {
-                            /* 'group' in 'sl2vl-scope' - any num of instances */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                    cl_list_insert_tail(&p_current_sl2vl_scope->group_list,tmp_str);
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-sl2vl_scope_group_start: TK_GROUP {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-sl2vl_scope_across:     sl2vl_scope_across_start string_list {
-                            /* 'across' in 'sl2vl-scope' - any num of instances */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str) {
-                                    cl_list_insert_tail(&p_current_sl2vl_scope->across_from_list,tmp_str);
-                                    cl_list_insert_tail(&p_current_sl2vl_scope->across_to_list,strdup(tmp_str));
-                                }
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-sl2vl_scope_across_start: TK_ACROSS {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-sl2vl_scope_across_from:  sl2vl_scope_across_from_start string_list {
-                            /* 'across-from' in 'sl2vl-scope' - any num of instances */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                    cl_list_insert_tail(&p_current_sl2vl_scope->across_from_list,tmp_str);
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-sl2vl_scope_across_from_start: TK_ACROSS_FROM {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-sl2vl_scope_across_to:  sl2vl_scope_across_to_start string_list {
-                            /* 'across-to' in 'sl2vl-scope' - any num of instances */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str) {
-                                    cl_list_insert_tail(&p_current_sl2vl_scope->across_to_list,tmp_str);
-                                }
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-sl2vl_scope_across_to_start: TK_ACROSS_TO {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-sl2vl_scope_from:       sl2vl_scope_from_start sl2vl_scope_from_list_or_asterisk {
-                            /* 'from' in 'sl2vl-scope' - any num of instances */
-                        }
-                        ;
-
-sl2vl_scope_from_start: TK_FROM {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-sl2vl_scope_to:         sl2vl_scope_to_start sl2vl_scope_to_list_or_asterisk {
-                            /* 'to' in 'sl2vl-scope' - any num of instances */
-                        }
-                        ;
-
-sl2vl_scope_to_start:   TK_TO {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-sl2vl_scope_from_list_or_asterisk:  sl2vl_scope_from_asterisk
-                                  | sl2vl_scope_from_list_of_ranges
-                                  ;
-
-sl2vl_scope_from_asterisk: TK_ASTERISK {
-                            int i;
-                            for (i = 0; i < OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH; i++)
-                                p_current_sl2vl_scope->from[i] = TRUE;
-                        }
-                        ;
-
-sl2vl_scope_to_list_or_asterisk:  sl2vl_scope_to_asterisk
-                                | sl2vl_scope_to_list_of_ranges
-                                  ;
-
-sl2vl_scope_to_asterisk: TK_ASTERISK {
-                            int i;
-                            for (i = 0; i < OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH; i++)
-                                p_current_sl2vl_scope->to[i] = TRUE;
-                        }
-                        ;
-
-sl2vl_scope_from_list_of_ranges: list_of_ranges {
-                            int i;
-                            cl_list_iterator_t    list_iterator;
-                            uint64_t            * num_pair;
-                            uint8_t               num1, num2;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) )
-                            {
-                                num_pair = (uint64_t*)cl_list_obj(list_iterator);
-                                if (num_pair)
-                                {
-                                    if ( num_pair[0] < 0 ||
-                                         num_pair[1] >= OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH )
-                                    {
-                                        __qos_parser_error("port number out of range 'from' list");
-                                        free(num_pair);
-                                        cl_list_remove_all(&tmp_parser_struct.num_pair_list);
-                                        return 1;
-                                    }
-                                    num1 = (uint8_t)num_pair[0];
-                                    num2 = (uint8_t)num_pair[1];
-                                    free(num_pair);
-                                    for (i = num1; i <= num2; i++)
-                                        p_current_sl2vl_scope->from[i] = TRUE;
-                                }
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.num_pair_list);
-                        }
-                        ;
-
-sl2vl_scope_to_list_of_ranges: list_of_ranges {
-                            int i;
-                            cl_list_iterator_t    list_iterator;
-                            uint64_t            * num_pair;
-                            uint8_t               num1, num2;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) )
-                            {
-                                num_pair = (uint64_t*)cl_list_obj(list_iterator);
-                                if (num_pair)
-                                {
-                                    if ( num_pair[0] < 0 ||
-                                         num_pair[1] >= OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH )
-                                    {
-                                        __qos_parser_error("port number out of range 'to' list");
-                                        free(num_pair);
-                                        cl_list_remove_all(&tmp_parser_struct.num_pair_list);
-                                        return 1;
-                                    }
-                                    num1 = (uint8_t)num_pair[0];
-                                    num2 = (uint8_t)num_pair[1];
-                                    free(num_pair);
-                                    for (i = num1; i <= num2; i++)
-                                        p_current_sl2vl_scope->to[i] = TRUE;
-                                }
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.num_pair_list);
-                        }
-                        ;
-
-
-sl2vl_scope_sl2vl_table:  sl2vl_scope_sl2vl_table_start num_list {
-                            /* 'sl2vl-table' - one instance of exactly
-                               OSM_QOS_POLICY_SL2VL_TABLE_LEN numbers */
-                            cl_list_iterator_t    list_iterator;
-                            uint64_t              num;
-                            uint64_t            * p_num;
-                            int                   i = 0;
-
-                            if (p_current_sl2vl_scope->sl2vl_table_set)
-                            {
-                                __qos_parser_error("sl2vl-scope has more than one sl2vl-table");
-                                cl_list_remove_all(&tmp_parser_struct.num_list);
-                                return 1;
-                            }
-
-                            if (cl_list_count(&tmp_parser_struct.num_list) != OSM_QOS_POLICY_SL2VL_TABLE_LEN)
-                            {
-                                __qos_parser_error("wrong number of values in 'sl2vl-table' (should be 16)");
-                                cl_list_remove_all(&tmp_parser_struct.num_list);
-                                return 1;
-                            }
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_list) )
-                            {
-                                p_num = (uint64_t*)cl_list_obj(list_iterator);
-                                num = *p_num;
-                                free(p_num);
-                                if (num >= OSM_QOS_POLICY_MAX_VL_NUM)
-                                {
-                                    __qos_parser_error("wrong VL value in 'sl2vl-table' (should be 0 to 15)");
-                                    cl_list_remove_all(&tmp_parser_struct.num_list);
-                                    return 1;
-                                }
-
-                                p_current_sl2vl_scope->sl2vl_table[i++] = (uint8_t)num;
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            p_current_sl2vl_scope->sl2vl_table_set = TRUE;
-                            cl_list_remove_all(&tmp_parser_struct.num_list);
-                        }
-                        ;
-
-sl2vl_scope_sl2vl_table_start: TK_SL2VL_TABLE {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-    /*
-     *  qos_level_entry values:
-     *      qos_level_name
-     *      qos_level_use
-     *      qos_level_sl
-     *      qos_level_mtu_limit
-     *      qos_level_rate_limit
-     *      qos_level_packet_life
-     *      qos_level_path_bits
-     *      qos_level_pkey
-     */
-
-qos_level_name:         qos_level_name_start single_string {
-                            /* 'name' of 'qos-level' - one instance */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            if (p_current_qos_level->name)
-                            {
-                                __qos_parser_error("qos-level has multiple 'name' tags");
-                                cl_list_remove_all(&tmp_parser_struct.str_list);
-                                return 1;
-                            }
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                    p_current_qos_level->name = tmp_str;
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-qos_level_name_start:   TK_NAME {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_level_use:          qos_level_use_start single_string {
-                            /* 'use' of 'qos-level' - one instance */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            if (p_current_qos_level->use)
-                            {
-                                __qos_parser_error("qos-level has multiple 'use' tags");
-                                cl_list_remove_all(&tmp_parser_struct.str_list);
-                                return 1;
-                            }
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                    p_current_qos_level->use = tmp_str;
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-qos_level_use_start:    TK_USE {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_level_sl:           qos_level_sl_start single_number {
-                            /* 'sl' in 'qos-level' - one instance */
-                            cl_list_iterator_t   list_iterator;
-                            uint64_t           * p_num;
-
-                            if (p_current_qos_level->sl_set)
-                            {
-                                __qos_parser_error("'qos-level' has multiple 'sl' tags");
-                                cl_list_remove_all(&tmp_parser_struct.num_list);
-                                return 1;
-                            }
-                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
-                            p_num = (uint64_t*)cl_list_obj(list_iterator);
-                            p_current_qos_level->sl = (uint8_t)(*p_num);
-                            free(p_num);
-                            p_current_qos_level->sl_set = TRUE;
-                            cl_list_remove_all(&tmp_parser_struct.num_list);
-                        }
-                        ;
-
-qos_level_sl_start:     TK_SL {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_level_mtu_limit:    qos_level_mtu_limit_start single_number {
-                            /* 'mtu-limit' in 'qos-level' - one instance */
-                            cl_list_iterator_t   list_iterator;
-                            uint64_t           * p_num;
-
-                            if (p_current_qos_level->mtu_limit_set)
-                            {
-                                __qos_parser_error("'qos-level' has multiple 'mtu-limit' tags");
-                                cl_list_remove_all(&tmp_parser_struct.num_list);
-                                return 1;
-                            }
-                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
-                            p_num = (uint64_t*)cl_list_obj(list_iterator);
-                            p_current_qos_level->mtu_limit = (uint8_t)(*p_num);
-                            free(p_num);
-                            p_current_qos_level->mtu_limit_set = TRUE;
-                            cl_list_remove_all(&tmp_parser_struct.num_list);
-                        }
-                        ;
-
-qos_level_mtu_limit_start: TK_MTU_LIMIT {
-                            /* 'mtu-limit' in 'qos-level' - one instance */
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_level_rate_limit:    qos_level_rate_limit_start single_number {
-                            /* 'rate-limit' in 'qos-level' - one instance */
-                            cl_list_iterator_t   list_iterator;
-                            uint64_t           * p_num;
-
-                            if (p_current_qos_level->rate_limit_set)
-                            {
-                                __qos_parser_error("'qos-level' has multiple 'rate-limit' tags");
-                                cl_list_remove_all(&tmp_parser_struct.num_list);
-                                return 1;
-                            }
-                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
-                            p_num = (uint64_t*)cl_list_obj(list_iterator);
-                            p_current_qos_level->rate_limit = (uint8_t)(*p_num);
-                            free(p_num);
-                            p_current_qos_level->rate_limit_set = TRUE;
-                            cl_list_remove_all(&tmp_parser_struct.num_list);
-                        }
-                        ;
-
-qos_level_rate_limit_start: TK_RATE_LIMIT {
-                            /* 'rate-limit' in 'qos-level' - one instance */
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_level_packet_life:  qos_level_packet_life_start single_number {
-                            /* 'packet-life' in 'qos-level' - one instance */
-                            cl_list_iterator_t   list_iterator;
-                            uint64_t           * p_num;
-
-                            if (p_current_qos_level->pkt_life_set)
-                            {
-                                __qos_parser_error("'qos-level' has multiple 'packet-life' tags");
-                                cl_list_remove_all(&tmp_parser_struct.num_list);
-                                return 1;
-                            }
-                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
-                            p_num = (uint64_t*)cl_list_obj(list_iterator);
-                            p_current_qos_level->pkt_life = (uint8_t)(*p_num);
-                            free(p_num);
-                            p_current_qos_level->pkt_life_set= TRUE;
-                            cl_list_remove_all(&tmp_parser_struct.num_list);
-                        }
-                        ;
-
-qos_level_packet_life_start: TK_PACKET_LIFE {
-                            /* 'packet-life' in 'qos-level' - one instance */
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_level_path_bits:    qos_level_path_bits_start list_of_ranges {
-                            /* 'path-bits' in 'qos-level' - any num of instances */
-                            /* list of path bit ranges */
-
-                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
-                            {
-                                uint64_t ** range_arr;
-                                unsigned range_len;
-
-                                __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                                      &range_arr,
-                                                      &range_len );
-
-                                if ( !p_current_qos_level->path_bits_range_len )
-                                {
-                                    p_current_qos_level->path_bits_range_arr = range_arr;
-                                    p_current_qos_level->path_bits_range_len = range_len;
-                                }
-                                else
-                                {
-                                    uint64_t ** new_range_arr;
-                                    unsigned new_range_len;
-                                    __merge_rangearr( p_current_qos_level->path_bits_range_arr,
-                                                      p_current_qos_level->path_bits_range_len,
-                                                      range_arr,
-                                                      range_len,
-                                                      &new_range_arr,
-                                                      &new_range_len );
-                                    p_current_qos_level->path_bits_range_arr = new_range_arr;
-                                    p_current_qos_level->path_bits_range_len = new_range_len;
-                                }
-                            }
-                        }
-                        ;
-
-qos_level_path_bits_start: TK_PATH_BITS {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_level_pkey:         qos_level_pkey_start list_of_ranges {
-                            /* 'pkey' in 'qos-level' - num of instances of list of ranges */
-                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
-                            {
-                                uint64_t ** range_arr;
-                                unsigned range_len;
-
-                                __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                                      &range_arr,
-                                                      &range_len );
-
-                                if ( !p_current_qos_level->pkey_range_len )
-                                {
-                                    p_current_qos_level->pkey_range_arr = range_arr;
-                                    p_current_qos_level->pkey_range_len = range_len;
-                                }
-                                else
-                                {
-                                    uint64_t ** new_range_arr;
-                                    unsigned new_range_len;
-                                    __merge_rangearr( p_current_qos_level->pkey_range_arr,
-                                                      p_current_qos_level->pkey_range_len,
-                                                      range_arr,
-                                                      range_len,
-                                                      &new_range_arr,
-                                                      &new_range_len );
-                                    p_current_qos_level->pkey_range_arr = new_range_arr;
-                                    p_current_qos_level->pkey_range_len = new_range_len;
-                                }
-                            }
-                        }
-                        ;
-
-qos_level_pkey_start:   TK_PKEY {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-    /*
-     *  qos_match_rule_entry values:
-     *      qos_match_rule_use
-     *      qos_match_rule_qos_class
-     *      qos_match_rule_qos_level_name
-     *      qos_match_rule_source
-     *      qos_match_rule_destination
-     *      qos_match_rule_service_id
-     *      qos_match_rule_pkey
-     */
-
-
-qos_match_rule_use:     qos_match_rule_use_start single_string {
-                            /* 'use' of 'qos-match-rule' - one instance */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            if (p_current_qos_match_rule->use)
-                            {
-                                __qos_parser_error("'qos-match-rule' has multiple 'use' tags");
-                                cl_list_remove_all(&tmp_parser_struct.str_list);
-                                return 1;
-                            }
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                    p_current_qos_match_rule->use = tmp_str;
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-qos_match_rule_use_start: TK_USE {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_match_rule_qos_class: qos_match_rule_qos_class_start list_of_ranges {
-                            /* 'qos-class' in 'qos-match-rule' - num of instances of list of ranges */
-                            /* list of class ranges (QoS Class is 12-bit value) */
-                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
-                            {
-                                uint64_t ** range_arr;
-                                unsigned range_len;
-
-                                __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                                      &range_arr,
-                                                      &range_len );
-
-                                if ( !p_current_qos_match_rule->qos_class_range_len )
-                                {
-                                    p_current_qos_match_rule->qos_class_range_arr = range_arr;
-                                    p_current_qos_match_rule->qos_class_range_len = range_len;
-                                }
-                                else
-                                {
-                                    uint64_t ** new_range_arr;
-                                    unsigned new_range_len;
-                                    __merge_rangearr( p_current_qos_match_rule->qos_class_range_arr,
-                                                      p_current_qos_match_rule->qos_class_range_len,
-                                                      range_arr,
-                                                      range_len,
-                                                      &new_range_arr,
-                                                      &new_range_len );
-                                    p_current_qos_match_rule->qos_class_range_arr = new_range_arr;
-                                    p_current_qos_match_rule->qos_class_range_len = new_range_len;
-                                }
-                            }
-                        }
-                        ;
-
-qos_match_rule_qos_class_start: TK_QOS_CLASS {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_match_rule_source:  qos_match_rule_source_start string_list {
-                            /* 'source' in 'qos-match-rule' - text */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                    cl_list_insert_tail(&p_current_qos_match_rule->source_list,tmp_str);
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-qos_match_rule_source_start: TK_SOURCE {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_match_rule_destination: qos_match_rule_destination_start string_list {
-                            /* 'destination' in 'qos-match-rule' - text */
-                            cl_list_iterator_t    list_iterator;
-                            char                * tmp_str;
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                    cl_list_insert_tail(&p_current_qos_match_rule->destination_list,tmp_str);
-                                list_iterator = cl_list_next(list_iterator);
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-qos_match_rule_destination_start: TK_DESTINATION {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_match_rule_qos_level_name:  qos_match_rule_qos_level_name_start single_string {
-                            /* 'qos-level-name' in 'qos-match-rule' - single string */
-                            cl_list_iterator_t   list_iterator;
-                            char               * tmp_str;
-
-                            if (p_current_qos_match_rule->qos_level_name)
-                            {
-                                __qos_parser_error("qos-match-rule has multiple 'qos-level-name' tags");
-                                cl_list_remove_all(&tmp_parser_struct.num_list);
-                                return 1;
-                            }
-
-                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
-                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
-                            {
-                                tmp_str = (char*)cl_list_obj(list_iterator);
-                                if (tmp_str)
-                                    p_current_qos_match_rule->qos_level_name = tmp_str;
-                            }
-                            cl_list_remove_all(&tmp_parser_struct.str_list);
-                        }
-                        ;
-
-qos_match_rule_qos_level_name_start: TK_QOS_LEVEL_NAME {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_match_rule_service_id: qos_match_rule_service_id_start list_of_ranges {
-                            /* 'service-id' in 'qos-match-rule' - num of instances of list of ranges */
-                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
-                            {
-                                uint64_t ** range_arr;
-                                unsigned range_len;
-
-                                __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                                      &range_arr,
-                                                      &range_len );
-
-                                if ( !p_current_qos_match_rule->service_id_range_len )
-                                {
-                                    p_current_qos_match_rule->service_id_range_arr = range_arr;
-                                    p_current_qos_match_rule->service_id_range_len = range_len;
-                                }
-                                else
-                                {
-                                    uint64_t ** new_range_arr;
-                                    unsigned new_range_len;
-                                    __merge_rangearr( p_current_qos_match_rule->service_id_range_arr,
-                                                      p_current_qos_match_rule->service_id_range_len,
-                                                      range_arr,
-                                                      range_len,
-                                                      &new_range_arr,
-                                                      &new_range_len );
-                                    p_current_qos_match_rule->service_id_range_arr = new_range_arr;
-                                    p_current_qos_match_rule->service_id_range_len = new_range_len;
-                                }
-                            }
-                        }
-                        ;
-
-qos_match_rule_service_id_start: TK_SERVICE_ID {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-qos_match_rule_pkey:    qos_match_rule_pkey_start list_of_ranges {
-                            /* 'pkey' in 'qos-match-rule' - num of instances of list of ranges */
-                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
-                            {
-                                uint64_t ** range_arr;
-                                unsigned range_len;
-
-                                __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
-                                                      &range_arr,
-                                                      &range_len );
-
-                                if ( !p_current_qos_match_rule->pkey_range_len )
-                                {
-                                    p_current_qos_match_rule->pkey_range_arr = range_arr;
-                                    p_current_qos_match_rule->pkey_range_len = range_len;
-                                }
-                                else
-                                {
-                                    uint64_t ** new_range_arr;
-                                    unsigned new_range_len;
-                                    __merge_rangearr( p_current_qos_match_rule->pkey_range_arr,
-                                                      p_current_qos_match_rule->pkey_range_len,
-                                                      range_arr,
-                                                      range_len,
-                                                      &new_range_arr,
-                                                      &new_range_len );
-                                    p_current_qos_match_rule->pkey_range_arr = new_range_arr;
-                                    p_current_qos_match_rule->pkey_range_len = new_range_len;
-                                }
-                            }
-                        }
-                        ;
-
-qos_match_rule_pkey_start: TK_PKEY {
-                            RESET_BUFFER;
-                        }
-                        ;
-
-
-    /*
-     * Common part
-     */
-
-
-single_string:      single_string_elems {
-                        cl_list_insert_tail(&tmp_parser_struct.str_list,
-                                            strdup(__parser_strip_white(tmp_parser_struct.str)));
-                        tmp_parser_struct.str[0] = '\0';
-                    }
-                    ;
-
-single_string_elems:  single_string_element
-                    | single_string_elems single_string_element
-                    ;
-
-single_string_element: TK_TEXT {
-                        strcat(tmp_parser_struct.str,$1);
-                        free($1);
-                    }
-                    ;
-
-
-string_list:        single_string
-                    | string_list TK_COMMA single_string
-                    ;
-
-
-
-single_number:      number
-                    ;
-
-num_list:             number
-                    | num_list TK_COMMA number
-                    ;
-
-number:             TK_NUMBER {
-                        uint64_t * p_num = (uint64_t*)malloc(sizeof(uint64_t));
-                        __parser_str2uint64(p_num,$1);
-                        free($1);
-                        cl_list_insert_tail(&tmp_parser_struct.num_list, p_num);
-                    }
-                    ;
-
-num_list_with_dotdot: number_from_pair_1 TK_DOTDOT number_from_pair_2 {
-                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
-                        num_pair[0] = tmp_parser_struct.num_pair[0];
-                        num_pair[1] = tmp_parser_struct.num_pair[1];
-                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
-                    }
-                    | num_list_with_dotdot TK_COMMA number_from_pair_1 TK_DOTDOT number_from_pair_2 {
-                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
-                        num_pair[0] = tmp_parser_struct.num_pair[0];
-                        num_pair[1] = tmp_parser_struct.num_pair[1];
-                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
-                    }
-                    ;
-
-number_from_pair_1:   TK_NUMBER {
-                        __parser_str2uint64(&tmp_parser_struct.num_pair[0],$1);
-                        free($1);
-                    }
-                    ;
-
-number_from_pair_2:   TK_NUMBER {
-                        __parser_str2uint64(&tmp_parser_struct.num_pair[1],$1);
-                        free($1);
-                    }
-                    ;
-
-list_of_ranges:     num_list_with_dash
-                    ;
-
-num_list_with_dash:   single_number_from_range {
-                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
-                        num_pair[0] = tmp_parser_struct.num_pair[0];
-                        num_pair[1] = tmp_parser_struct.num_pair[1];
-                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
-                    }
-                    | number_from_range_1 TK_DASH number_from_range_2 {
-                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
-                        if (tmp_parser_struct.num_pair[0] <= tmp_parser_struct.num_pair[1]) {
-                            num_pair[0] = tmp_parser_struct.num_pair[0];
-                            num_pair[1] = tmp_parser_struct.num_pair[1];
-                        }
-                        else {
-                            num_pair[1] = tmp_parser_struct.num_pair[0];
-                            num_pair[0] = tmp_parser_struct.num_pair[1];
-                        }
-                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
-                    }
-                    | num_list_with_dash TK_COMMA number_from_range_1 TK_DASH number_from_range_2 {
-                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
-                        if (tmp_parser_struct.num_pair[0] <= tmp_parser_struct.num_pair[1]) {
-                            num_pair[0] = tmp_parser_struct.num_pair[0];
-                            num_pair[1] = tmp_parser_struct.num_pair[1];
-                        }
-                        else {
-                            num_pair[1] = tmp_parser_struct.num_pair[0];
-                            num_pair[0] = tmp_parser_struct.num_pair[1];
-                        }
-                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
-                    }
-                    | num_list_with_dash TK_COMMA single_number_from_range {
-                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
-                        num_pair[0] = tmp_parser_struct.num_pair[0];
-                        num_pair[1] = tmp_parser_struct.num_pair[1];
-                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
-                    }
-                    ;
-
-single_number_from_range:  TK_NUMBER {
-                        __parser_str2uint64(&tmp_parser_struct.num_pair[0],$1);
-                        __parser_str2uint64(&tmp_parser_struct.num_pair[1],$1);
-                        free($1);
-                    }
-                    ;
-
-number_from_range_1:  TK_NUMBER {
-                        __parser_str2uint64(&tmp_parser_struct.num_pair[0],$1);
-                        free($1);
-                    }
-                    ;
-
-number_from_range_2:  TK_NUMBER {
-                        __parser_str2uint64(&tmp_parser_struct.num_pair[1],$1);
-                        free($1);
-                    }
-                    ;
-
-%%
-
-/***************************************************
- ***************************************************/
-
-int osm_qos_parse_policy_file(IN osm_subn_t * const p_subn)
-{
-    int res = 0;
-    static boolean_t first_time = TRUE;
-    p_qos_parser_osm_log = &p_subn->p_osm->log;
-
-    OSM_LOG_ENTER(p_qos_parser_osm_log);
-
-    osm_qos_policy_destroy(p_subn->p_qos_policy);
-    p_subn->p_qos_policy = NULL;
-
-    __qos_parser_in = fopen (p_subn->opt.qos_policy_file, "r");
-    if (!__qos_parser_in)
-    {
-        if (strcmp(p_subn->opt.qos_policy_file,OSM_DEFAULT_QOS_POLICY_FILE)) {
-            OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC01: "
-                    "Failed opening QoS policy file %s - %s\n",
-                    p_subn->opt.qos_policy_file, strerror(errno));
-            res = 1;
-        }
-        else
-            OSM_LOG(p_qos_parser_osm_log, OSM_LOG_VERBOSE,
-                    "QoS policy file not found (%s)\n",
-                    p_subn->opt.qos_policy_file);
-
-        goto Exit;
-    }
-
-    if (first_time)
-    {
-        first_time = FALSE;
-        __setup_simple_qos_levels();
-        __setup_ulp_match_rules();
-        OSM_LOG(p_qos_parser_osm_log, OSM_LOG_INFO,
-		"Loading QoS policy file (%s)\n",
-                p_subn->opt.qos_policy_file);
-    }
-    else
-        /*
-         * ULP match rules list was emptied at the end of
-         * previous parsing iteration.
-         * What's left is to clear simple QoS levels.
-         */
-        __clear_simple_qos_levels();
-
-    column_num = 1;
-    line_num = 1;
-
-    p_subn->p_qos_policy = osm_qos_policy_create(p_subn);
-
-    __parser_tmp_struct_init();
-    p_qos_policy = p_subn->p_qos_policy;
-
-    res = __qos_parser_parse();
-
-    __parser_tmp_struct_destroy();
-
-    if (res != 0)
-    {
-        OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC03: "
-                "Failed parsing QoS policy file (%s)\n",
-                p_subn->opt.qos_policy_file);
-        osm_qos_policy_destroy(p_subn->p_qos_policy);
-        p_subn->p_qos_policy = NULL;
-        res = 1;
-        goto Exit;
-    }
-
-    /* add generated ULP match rules to the usual match rules */
-    __process_ulp_match_rules();
-
-    if (osm_qos_policy_validate(p_subn->p_qos_policy,p_qos_parser_osm_log))
-    {
-        OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC04: "
-                "Error(s) in QoS policy file (%s)\n",
-                p_subn->opt.qos_policy_file);
-        fprintf(stderr, "Error(s) in QoS policy file (%s)\n",
-                p_subn->opt.qos_policy_file);
-        osm_qos_policy_destroy(p_subn->p_qos_policy);
-        p_subn->p_qos_policy = NULL;
-        res = 1;
-        goto Exit;
-    }
-
-  Exit:
-    if (__qos_parser_in)
-        fclose(__qos_parser_in);
-    OSM_LOG_EXIT(p_qos_parser_osm_log);
-    return res;
-}
-
-/***************************************************
- ***************************************************/
-
-int __qos_parser_wrap()
-{
-    return(1);
-}
-
-/***************************************************
- ***************************************************/
-
-static void __qos_parser_error(const char *format, ...)
-{
-    char s[256];
-    va_list pvar;
-
-    OSM_LOG_ENTER(p_qos_parser_osm_log);
-
-    va_start(pvar, format);
-    vsnprintf(s, sizeof(s), format, pvar);
-    va_end(pvar);
-
-    OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC05: "
-            "Syntax error (line %d:%d): %s\n",
-            line_num, column_num, s);
-    fprintf(stderr, "Error in QoS Policy File (line %d:%d): %s.\n",
-            line_num, column_num, s);
-    OSM_LOG_EXIT(p_qos_parser_osm_log);
-}
-
-/***************************************************
- ***************************************************/
-
-static char * __parser_strip_white(char * str)
-{
-   int i;
-   for (i = (strlen(str)-1); i >= 0; i--)
-   {
-      if (isspace(str[i]))
-          str[i] = '\0';
-      else
-         break;
-   }
-   for (i = 0; i < strlen(str); i++)
-   {
-      if (!isspace(str[i]))
-         break;
-   }
-   return &(str[i]);
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_str2uint64(uint64_t * p_val, char * str)
-{
-   *p_val = strtoull(str, NULL, 0);
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_port_group_start()
-{
-    p_current_port_group = osm_qos_policy_port_group_create();
-}
-
-/***************************************************
- ***************************************************/
-
-static int __parser_port_group_end()
-{
-    if(!p_current_port_group->name)
-    {
-        __qos_parser_error("port-group validation failed - no port group name specified");
-        return -1;
-    }
-
-    cl_list_insert_tail(&p_qos_policy->port_groups,
-                        p_current_port_group);
-    p_current_port_group = NULL;
-    return 0;
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_vlarb_scope_start()
-{
-    p_current_vlarb_scope = osm_qos_policy_vlarb_scope_create();
-}
-
-/***************************************************
- ***************************************************/
-
-static int __parser_vlarb_scope_end()
-{
-    if ( !cl_list_count(&p_current_vlarb_scope->group_list) &&
-         !cl_list_count(&p_current_vlarb_scope->across_list) )
-    {
-        __qos_parser_error("vlarb-scope validation failed - no port groups specified by 'group' or by 'across'");
-        return -1;
-    }
-
-    cl_list_insert_tail(&p_qos_policy->vlarb_tables,
-                        p_current_vlarb_scope);
-    p_current_vlarb_scope = NULL;
-    return 0;
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_sl2vl_scope_start()
-{
-    p_current_sl2vl_scope = osm_qos_policy_sl2vl_scope_create();
-}
-
-/***************************************************
- ***************************************************/
-
-static int __parser_sl2vl_scope_end()
-{
-    if (!p_current_sl2vl_scope->sl2vl_table_set)
-    {
-        __qos_parser_error("sl2vl-scope validation failed - no sl2vl table specified");
-        return -1;
-    }
-    if ( !cl_list_count(&p_current_sl2vl_scope->group_list) &&
-         !cl_list_count(&p_current_sl2vl_scope->across_to_list) &&
-         !cl_list_count(&p_current_sl2vl_scope->across_from_list) )
-    {
-        __qos_parser_error("sl2vl-scope validation failed - no port groups specified by 'group', 'across-to' or 'across-from'");
-        return -1;
-    }
-
-    cl_list_insert_tail(&p_qos_policy->sl2vl_tables,
-                        p_current_sl2vl_scope);
-    p_current_sl2vl_scope = NULL;
-    return 0;
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_qos_level_start()
-{
-    p_current_qos_level = osm_qos_policy_qos_level_create();
-}
-
-/***************************************************
- ***************************************************/
-
-static int __parser_qos_level_end()
-{
-    if (!p_current_qos_level->sl_set)
-    {
-        __qos_parser_error("qos-level validation failed - no 'sl' specified");
-        return -1;
-    }
-    if (!p_current_qos_level->name)
-    {
-        __qos_parser_error("qos-level validation failed - no 'name' specified");
-        return -1;
-    }
-
-    cl_list_insert_tail(&p_qos_policy->qos_levels,
-                        p_current_qos_level);
-    p_current_qos_level = NULL;
-    return 0;
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_match_rule_start()
-{
-    p_current_qos_match_rule = osm_qos_policy_match_rule_create();
-}
-
-/***************************************************
- ***************************************************/
-
-static int __parser_match_rule_end()
-{
-    if (!p_current_qos_match_rule->qos_level_name)
-    {
-        __qos_parser_error("match-rule validation failed - no 'qos-level-name' specified");
-        return -1;
-    }
-
-    cl_list_insert_tail(&p_qos_policy->qos_match_rules,
-                        p_current_qos_match_rule);
-    p_current_qos_match_rule = NULL;
-    return 0;
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_ulp_match_rule_start()
-{
-    p_current_qos_match_rule = osm_qos_policy_match_rule_create();
-}
-
-/***************************************************
- ***************************************************/
-
-static int __parser_ulp_match_rule_end()
-{
-    CL_ASSERT(p_current_qos_match_rule->p_qos_level);
-    cl_list_insert_tail(&__ulp_match_rules,
-                        p_current_qos_match_rule);
-    p_current_qos_match_rule = NULL;
-    return 0;
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_tmp_struct_init()
-{
-    tmp_parser_struct.str[0] = '\0';
-    cl_list_construct(&tmp_parser_struct.str_list);
-    cl_list_init(&tmp_parser_struct.str_list, 10);
-    cl_list_construct(&tmp_parser_struct.num_list);
-    cl_list_init(&tmp_parser_struct.num_list, 10);
-    cl_list_construct(&tmp_parser_struct.num_pair_list);
-    cl_list_init(&tmp_parser_struct.num_pair_list, 10);
-}
-
-/***************************************************
- ***************************************************/
-
-/*
- * Do NOT free objects from the temp struct.
- * Either they are inserted into the parse tree data
- * structure, or they are already freed when copying
- * their values to the parse tree data structure.
- */
-static void __parser_tmp_struct_reset()
-{
-    tmp_parser_struct.str[0] = '\0';
-    cl_list_remove_all(&tmp_parser_struct.str_list);
-    cl_list_remove_all(&tmp_parser_struct.num_list);
-    cl_list_remove_all(&tmp_parser_struct.num_pair_list);
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_tmp_struct_destroy()
-{
-    __parser_tmp_struct_reset();
-    cl_list_destroy(&tmp_parser_struct.str_list);
-    cl_list_destroy(&tmp_parser_struct.num_list);
-    cl_list_destroy(&tmp_parser_struct.num_pair_list);
-}
-
-/***************************************************
- ***************************************************/
-
-#define __SIMPLE_QOS_LEVEL_NAME "SimpleQoSLevel_SL"
-#define __SIMPLE_QOS_LEVEL_DEFAULT_NAME "SimpleQoSLevel_DEFAULT"
-
-static void __setup_simple_qos_levels()
-{
-    uint8_t i;
-    char tmp_buf[30];
-    memset(osm_qos_policy_simple_qos_levels, 0,
-           sizeof(osm_qos_policy_simple_qos_levels));
-    for (i = 0; i < 16; i++)
-    {
-        osm_qos_policy_simple_qos_levels[i].sl = i;
-        osm_qos_policy_simple_qos_levels[i].sl_set = TRUE;
-        sprintf(tmp_buf, "%s%u", __SIMPLE_QOS_LEVEL_NAME, i);
-        osm_qos_policy_simple_qos_levels[i].name = strdup(tmp_buf);
-    }
-
-    memset(&__default_simple_qos_level, 0,
-           sizeof(__default_simple_qos_level));
-    __default_simple_qos_level.name =
-           strdup(__SIMPLE_QOS_LEVEL_DEFAULT_NAME);
-}
-
-/***************************************************
- ***************************************************/
-
-static void __clear_simple_qos_levels()
-{
-    /*
-     * Simple QoS levels are static.
-     * What's left is to invalidate default simple QoS level.
-     */
-    __default_simple_qos_level.sl_set = FALSE;
-}
-
-/***************************************************
- ***************************************************/
-
-static void __setup_ulp_match_rules()
-{
-    cl_list_construct(&__ulp_match_rules);
-    cl_list_init(&__ulp_match_rules, 10);
-}
-
-/***************************************************
- ***************************************************/
-
-static void __process_ulp_match_rules()
-{
-    cl_list_iterator_t list_iterator;
-    osm_qos_match_rule_t *p_qos_match_rule = NULL;
-
-    list_iterator = cl_list_head(&__ulp_match_rules);
-    while (list_iterator != cl_list_end(&__ulp_match_rules))
-    {
-        p_qos_match_rule = (osm_qos_match_rule_t *) cl_list_obj(list_iterator);
-        if (p_qos_match_rule)
-            cl_list_insert_tail(&p_qos_policy->qos_match_rules,
-                                p_qos_match_rule);
-        list_iterator = cl_list_next(list_iterator);
-    }
-    cl_list_remove_all(&__ulp_match_rules);
-}
-
-/***************************************************
- ***************************************************/
-
-static int OSM_CDECL
-__cmp_num_range(
-    const void * p1,
-    const void * p2)
-{
-    uint64_t * pair1 = *((uint64_t **)p1);
-    uint64_t * pair2 = *((uint64_t **)p2);
-
-    if (pair1[0] < pair2[0])
-        return -1;
-    if (pair1[0] > pair2[0])
-        return 1;
-
-    if (pair1[1] < pair2[1])
-        return -1;
-    if (pair1[1] > pair2[1])
-        return 1;
-
-    return 0;
-}
-
-/***************************************************
- ***************************************************/
-
-static void __sort_reduce_rangearr(
-    uint64_t  **   arr,
-    unsigned       arr_len,
-    uint64_t  ** * p_res_arr,
-    unsigned     * p_res_arr_len )
-{
-    unsigned i = 0;
-    unsigned j = 0;
-    unsigned last_valid_ind = 0;
-    unsigned valid_cnt = 0;
-    uint64_t ** res_arr;
-    boolean_t * is_valid_arr;
-
-    *p_res_arr = NULL;
-    *p_res_arr_len = 0;
-
-    qsort(arr, arr_len, sizeof(uint64_t*), __cmp_num_range);
-
-    is_valid_arr = (boolean_t *)malloc(arr_len * sizeof(boolean_t));
-    is_valid_arr[last_valid_ind] = TRUE;
-    valid_cnt++;
-    for (i = 1; i < arr_len; i++)
-    {
-        if (arr[i][0] <= arr[last_valid_ind][1])
-        {
-            if (arr[i][1] > arr[last_valid_ind][1])
-                arr[last_valid_ind][1] = arr[i][1];
-            free(arr[i]);
-            arr[i] = NULL;
-            is_valid_arr[i] = FALSE;
-        }
-        else if ((arr[i][0] - 1) == arr[last_valid_ind][1])
-        {
-            arr[last_valid_ind][1] = arr[i][1];
-            free(arr[i]);
-            arr[i] = NULL;
-            is_valid_arr[i] = FALSE;
-        }
-        else
-        {
-            is_valid_arr[i] = TRUE;
-            last_valid_ind = i;
-            valid_cnt++;
-        }
-    }
-
-    res_arr = (uint64_t **)malloc(valid_cnt * sizeof(uint64_t *));
-    for (i = 0; i < arr_len; i++)
-    {
-        if (is_valid_arr[i])
-            res_arr[j++] = arr[i];
-    }
-    free(is_valid_arr);
-    free(arr);
-
-    *p_res_arr = res_arr;
-    *p_res_arr_len = valid_cnt;
-}
-
-/***************************************************
- ***************************************************/
-
-static void __pkey_rangelist2rangearr(
-    cl_list_t    * p_list,
-    uint64_t  ** * p_arr,
-    unsigned     * p_arr_len)
-{
-    uint64_t   tmp_pkey;
-    uint64_t * p_pkeys;
-    cl_list_iterator_t list_iterator;
-
-    list_iterator= cl_list_head(p_list);
-    while( list_iterator != cl_list_end(p_list) )
-    {
-       p_pkeys = (uint64_t *)cl_list_obj(list_iterator);
-       p_pkeys[0] &= 0x7fff;
-       p_pkeys[1] &= 0x7fff;
-       if (p_pkeys[0] > p_pkeys[1])
-       {
-           tmp_pkey = p_pkeys[1];
-           p_pkeys[1] = p_pkeys[0];
-           p_pkeys[0] = tmp_pkey;
-       }
-       list_iterator = cl_list_next(list_iterator);
-    }
-
-    __rangelist2rangearr(p_list, p_arr, p_arr_len);
-}
-
-/***************************************************
- ***************************************************/
-
-static void __rangelist2rangearr(
-    cl_list_t    * p_list,
-    uint64_t  ** * p_arr,
-    unsigned     * p_arr_len)
-{
-    cl_list_iterator_t list_iterator;
-    unsigned len = cl_list_count(p_list);
-    unsigned i = 0;
-    uint64_t ** tmp_arr;
-    uint64_t ** res_arr = NULL;
-    unsigned res_arr_len = 0;
-
-    tmp_arr = (uint64_t **)malloc(len * sizeof(uint64_t *));
-
-    list_iterator = cl_list_head(p_list);
-    while( list_iterator != cl_list_end(p_list) )
-    {
-       tmp_arr[i++] = (uint64_t *)cl_list_obj(list_iterator);
-       list_iterator = cl_list_next(list_iterator);
-    }
-    cl_list_remove_all(p_list);
-
-    __sort_reduce_rangearr( tmp_arr,
-                            len,
-                            &res_arr,
-                            &res_arr_len );
-    *p_arr = res_arr;
-    *p_arr_len = res_arr_len;
-}
-
-/***************************************************
- ***************************************************/
-
-static void __merge_rangearr(
-    uint64_t  **   range_arr_1,
-    unsigned       range_len_1,
-    uint64_t  **   range_arr_2,
-    unsigned       range_len_2,
-    uint64_t  ** * p_arr,
-    unsigned     * p_arr_len )
-{
-    unsigned i = 0;
-    unsigned j = 0;
-    unsigned len = range_len_1 + range_len_2;
-    uint64_t ** tmp_arr;
-    uint64_t ** res_arr = NULL;
-    unsigned res_arr_len = 0;
-
-    *p_arr = NULL;
-    *p_arr_len = 0;
-
-    tmp_arr = (uint64_t **)malloc(len * sizeof(uint64_t *));
-
-    for (i = 0; i < range_len_1; i++)
-       tmp_arr[j++] = range_arr_1[i];
-    for (i = 0; i < range_len_2; i++)
-       tmp_arr[j++] = range_arr_2[i];
-    free(range_arr_1);
-    free(range_arr_2);
-
-    __sort_reduce_rangearr( tmp_arr,
-                            len,
-                            &res_arr,
-                            &res_arr_len );
-    *p_arr = res_arr;
-    *p_arr_len = res_arr_len;
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_add_port_to_port_map(
-    cl_qmap_t   * p_map,
-    osm_physp_t * p_physp)
-{
-    if (cl_qmap_get(p_map, cl_ntoh64(osm_physp_get_port_guid(p_physp))) ==
-        cl_qmap_end(p_map))
-    {
-        osm_qos_port_t * p_port = osm_qos_policy_port_create(p_physp);
-        if (p_port)
-            cl_qmap_insert(p_map,
-                           cl_ntoh64(osm_physp_get_port_guid(p_physp)),
-                           &p_port->map_item);
-    }
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_add_guid_range_to_port_map(
-    cl_qmap_t  * p_map,
-    uint64_t  ** range_arr,
-    unsigned     range_len)
-{
-    unsigned i;
-    uint64_t guid_ho;
-    osm_port_t * p_osm_port;
-
-    if (!range_arr || !range_len)
-        return;
-
-    for (i = 0; i < range_len; i++) {
-         for (guid_ho = range_arr[i][0]; guid_ho <= range_arr[i][1]; guid_ho++) {
-             p_osm_port =
-                osm_get_port_by_guid(p_qos_policy->p_subn, cl_hton64(guid_ho));
-             if (p_osm_port)
-                 __parser_add_port_to_port_map(p_map, p_osm_port->p_physp);
-         }
-         free(range_arr[i]);
-    }
-    free(range_arr);
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_add_pkey_range_to_port_map(
-    cl_qmap_t  * p_map,
-    uint64_t  ** range_arr,
-    unsigned     range_len)
-{
-    unsigned i;
-    uint64_t pkey_64;
-    ib_net16_t pkey;
-    osm_prtn_t * p_prtn;
-
-    if (!range_arr || !range_len)
-        return;
-
-    for (i = 0; i < range_len; i++) {
-         for (pkey_64 = range_arr[i][0]; pkey_64 <= range_arr[i][1]; pkey_64++) {
-             pkey = cl_hton16((uint16_t)(pkey_64 & 0x7fff));
-             p_prtn = (osm_prtn_t *)
-                 cl_qmap_get(&p_qos_policy->p_subn->prtn_pkey_tbl, pkey);
-             if (p_prtn != (osm_prtn_t *)cl_qmap_end(
-                   &p_qos_policy->p_subn->prtn_pkey_tbl)) {
-                 __parser_add_map_to_port_map(p_map, &p_prtn->part_guid_tbl);
-                 __parser_add_map_to_port_map(p_map, &p_prtn->full_guid_tbl);
-             }
-         }
-         free(range_arr[i]);
-    }
-    free(range_arr);
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_add_partition_list_to_port_map(
-    cl_qmap_t  * p_map,
-    cl_list_t  * p_list)
-{
-    cl_list_iterator_t    list_iterator;
-    char                * tmp_str;
-    osm_prtn_t          * p_prtn;
-
-    /* extract all the ports from the partition
-       to the port map of this port group */
-    list_iterator = cl_list_head(p_list);
-    while(list_iterator != cl_list_end(p_list)) {
-        tmp_str = (char*)cl_list_obj(list_iterator);
-        if (tmp_str) {
-            p_prtn = osm_prtn_find_by_name(p_qos_policy->p_subn, tmp_str);
-            if (p_prtn) {
-                __parser_add_map_to_port_map(p_map, &p_prtn->part_guid_tbl);
-                __parser_add_map_to_port_map(p_map, &p_prtn->full_guid_tbl);
-            }
-            free(tmp_str);
-        }
-        list_iterator = cl_list_next(list_iterator);
-    }
-    cl_list_remove_all(p_list);
-}
-
-/***************************************************
- ***************************************************/
-
-static void __parser_add_map_to_port_map(
-    cl_qmap_t * p_dmap,
-    cl_map_t  * p_smap)
-{
-    cl_map_iterator_t map_iterator;
-    osm_physp_t * p_physp;
-
-    if (!p_dmap || !p_smap)
-        return;
-
-    map_iterator = cl_map_head(p_smap);
-    while (map_iterator != cl_map_end(p_smap)) {
-        p_physp = (osm_physp_t*)cl_map_obj(map_iterator);
-        __parser_add_port_to_port_map(p_dmap, p_physp);
-        map_iterator = cl_map_next(map_iterator);
-    }
-}
-
-/***************************************************
- ***************************************************/
-
-static int __validate_pkeys( uint64_t ** range_arr,
-                             unsigned    range_len,
-                             boolean_t   is_ipoib)
-{
-    unsigned i;
-    uint64_t pkey_64;
-    ib_net16_t pkey;
-    osm_prtn_t * p_prtn;
-
-    if (!range_arr || !range_len)
-        return 0;
-
-    for (i = 0; i < range_len; i++) {
-        for (pkey_64 = range_arr[i][0]; pkey_64 <= range_arr[i][1]; pkey_64++) {
-            pkey = cl_hton16((uint16_t)(pkey_64 & 0x7fff));
-            p_prtn = (osm_prtn_t *)
-                cl_qmap_get(&p_qos_policy->p_subn->prtn_pkey_tbl, pkey);
-
-            if (p_prtn == (osm_prtn_t *)cl_qmap_end(
-                  &p_qos_policy->p_subn->prtn_pkey_tbl))
-                p_prtn = NULL;
-
-            if (is_ipoib) {
-                /*
-                 * Be very strict for IPoIB partition:
-                 *  - the partition for the pkey have to exist
-                 *  - it has to have at least 2 full members
-                 */
-                if (!p_prtn) {
-                    __qos_parser_error("IPoIB partition, pkey 0x%04X - "
-                                       "partition doesn't exist",
-                                       cl_ntoh16(pkey));
-                    return 1;
-                }
-                else if (cl_map_count(&p_prtn->full_guid_tbl) < 2) {
-                    __qos_parser_error("IPoIB partition, pkey 0x%04X - "
-                                       "partition has less than two full members",
-                                       cl_ntoh16(pkey));
-                    return 1;
-                }
-            }
-            else if (!p_prtn) {
-                /*
-                 * For non-IPoIB pkey we just want to check that
-                 * the relevant partition exists.
-                 * And even if it doesn't, don't exit - just print
-                 * error message and continue.
-                 */
-                 OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC02: "
-			 "pkey 0x%04X - partition doesn't exist",
-                         cl_ntoh16(pkey));
-            }
-        }
-    }
-    return 0;
-}
-
-/***************************************************
- ***************************************************/
diff --git a/opensm/opensm/osm_qos_parser_l.l b/opensm/opensm/osm_qos_parser_l.l
new file mode 100644
index 0000000..ecdee8a
--- /dev/null
+++ b/opensm/opensm/osm_qos_parser_l.l
@@ -0,0 +1,394 @@
+%{
+/*
+ * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
+ * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+/*
+ * Abstract:
+ *    Lexer of OSM QoS parser.
+ *
+ * Environment:
+ *    Linux User Mode
+ *
+ * Author:
+ *    Yevgeny Kliteynik, Mellanox
+ */
+
+#include <opensm/osm_qos_policy.h>
+#include "osm_qos_parser_y.h"
+
+#define HANDLE_IF_IN_DESCRIPTION   if (in_description) { yylval = strdup(yytext); return TK_TEXT; }
+
+#define SAVE_POS save_pos()
+static void save_pos();
+
+extern int column_num;
+extern int line_num;
+extern FILE * yyin;
+extern YYSTYPE yylval;
+
+boolean_t in_description = FALSE;
+boolean_t in_list_of_hex_num_ranges = FALSE;
+boolean_t in_node_type = FALSE;
+boolean_t in_list_of_numbers = FALSE;
+boolean_t in_list_of_strings = FALSE;
+boolean_t in_list_of_num_pairs = FALSE;
+boolean_t in_asterisk_or_list_of_numbers = FALSE;
+boolean_t in_list_of_num_ranges = FALSE;
+boolean_t in_single_string = FALSE;
+boolean_t in_single_number = FALSE;
+
+static void reset_new_line_flags();
+#define RESET_NEW_LINE_FLAGS reset_new_line_flags()
+
+#define START_USE            {in_description = TRUE;}     /* list of strings including whitespace (description) */
+#define START_PORT_GUID      {in_list_of_hex_num_ranges = TRUE;} /* comma-separated list of hex num ranges */
+#define START_PORT_NAME      {in_list_of_strings = TRUE;} /* comma-separated list of following strings: ../../.. */
+#define START_PARTITION      {in_single_string = TRUE;}   /* single string w/o whitespaces (partition name) */
+#define START_NAME           {in_single_string = TRUE;}   /* single string w/o whitespaces (port group name) */
+#define START_QOS_LEVEL_NAME {in_single_string = TRUE;}   /* single string w/o whitespaces (qos level name in match rule) */
+
+#define START_NODE_TYPE     {in_node_type = TRUE;}       /* comma-separated list of node types (ROUTER,CA,...) */
+#define START_SL2VL_TABLE   {in_list_of_numbers = TRUE;} /* comma-separated list of hex or dec numbers */
+
+#define START_GROUP         {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
+#define START_ACROSS        {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
+#define START_ACROSS_TO     {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
+#define START_ACROSS_FROM   {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
+#define START_SOURCE        {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
+#define START_DESTINATION   {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */
+
+#define START_VLARB_HIGH    {in_list_of_num_pairs = TRUE;} /* comma-separated list of hex or dec num pairs: "num1:num2" */
+#define START_VLARB_LOW     {in_list_of_num_pairs = TRUE;} /* comma-separated list of hex or dec num pairs: "num1:num2" */
+
+#define START_TO            {in_asterisk_or_list_of_numbers = TRUE;} /* (asterisk) or (comma-separated list of hex or dec numbers) */
+#define START_FROM          {in_asterisk_or_list_of_numbers = TRUE;} /* (asterisk) or (comma-separated list of hex or dec numbers) */
+
+#define START_PATH_BITS     {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
+#define START_QOS_CLASS     {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
+#define START_SERVICE_ID    {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
+#define START_PKEY          {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
+
+#define START_SL               {in_single_number = TRUE;}   /* single number */
+#define START_VLARB_HIGH_LIMIT {in_single_number = TRUE;}   /* single number */
+#define START_MTU_LIMIT        {in_single_number = TRUE;}   /* single number */
+#define START_RATE_LIMIT       {in_single_number = TRUE;}   /* single number */
+#define START_PACKET_LIFE      {in_single_number = TRUE;}   /* single number */
+
+#define START_ULP_DEFAULT       {in_single_number = TRUE;}      /* single number */
+#define START_ULP_ANY           {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
+#define START_ULP_SDP_DEFAULT   {in_single_number = TRUE;}      /* single number */
+#define START_ULP_SDP_PORT      {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
+#define START_ULP_RDS_DEFAULT   {in_single_number = TRUE;}      /* single number */
+#define START_ULP_RDS_PORT      {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
+#define START_ULP_ISER_DEFAULT  {in_single_number = TRUE;}      /* single number */
+#define START_ULP_ISER_PORT     {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
+#define START_ULP_SRP_GUID      {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
+#define START_ULP_IPOIB_DEFAULT {in_single_number = TRUE;}      /* single number */
+#define START_ULP_IPOIB_PKEY    {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */
+
+
+%}
+
+%option nounput noinput
+
+QOS_ULPS_START          qos\-ulps
+QOS_ULPS_END            end\-qos\-ulps
+PORT_GROUPS_START       port\-groups
+PORT_GROUPS_END         end\-port\-groups
+PORT_GROUP_START        port\-group
+PORT_GROUP_END          end\-port\-group
+PORT_NUM                port\-num
+NAME                    name
+USE                     use
+PORT_GUID               port\-guid
+TARGET_PORT_GUID        target\-port\-guid
+PORT_NAME               port\-name
+PARTITION               partition
+NODE_TYPE               node\-type
+QOS_SETUP_START         qos\-setup
+QOS_SETUP_END           end\-qos\-setup
+VLARB_TABLES_START      vlarb\-tables
+VLARB_TABLES_END        end\-vlarb\-tables
+VLARB_SCOPE_START       vlarb\-scope
+VLARB_SCOPE_END         end\-vlarb\-scope
+GROUP                   group
+ACROSS                  across
+VLARB_HIGH              vlarb\-high
+VLARB_LOW               vlarb\-low
+VLARB_HIGH_LIMIT        vl\-high\-limit
+SL2VL_TABLES_START      sl2vl\-tables
+SL2VL_TABLES_END        end\-sl2vl\-tables
+SL2VL_SCOPE_START       sl2vl\-scope
+SL2VL_SCOPE_END         end\-sl2vl\-scope
+TO                      to
+FROM                    from
+ACROSS_TO               across\-to
+ACROSS_FROM             across\-from
+SL2VL_TABLE             sl2vl\-table
+QOS_LEVELS_START        qos\-levels
+QOS_LEVELS_END          end\-qos\-levels
+QOS_LEVEL_START         qos\-level
+QOS_LEVEL_END           end\-qos\-level
+SL                      sl
+MTU_LIMIT               mtu\-limit
+RATE_LIMIT              rate\-limit
+PACKET_LIFE             packet\-life
+PATH_BITS               path\-bits
+QOS_MATCH_RULES_START   qos\-match\-rules
+QOS_MATCH_RULES_END     end\-qos\-match\-rules
+QOS_MATCH_RULE_START    qos\-match\-rule
+QOS_MATCH_RULE_END      end\-qos\-match\-rule
+QOS_CLASS               qos\-class
+SOURCE                  source
+DESTINATION             destination
+SERVICE_ID              service\-id
+PKEY                    pkey
+QOS_LEVEL_NAME          qos\-level\-name
+
+ROUTER                  [Rr][Oo][Uu][Tt][Ee][Rr]
+CA                      [Cc][Aa]
+SWITCH                  [Ss][Ww][Ii][Tt][Cc][Hh]
+SELF                    [Ss][Ee][Ll][Ff]
+ALL                     [Aa][Ll][Ll]
+
+ULP_SDP                 [Ss][Dd][Pp]
+ULP_SRP                 [Ss][Rr][Pp]
+ULP_RDS                 [Rr][Dd][Ss]
+ULP_IPOIB               [Ii][Pp][Oo][Ii][Bb]
+ULP_ISER                [Ii][Ss][Ee][Rr]
+ULP_ANY                 [Aa][Nn][Yy]
+ULP_DEFAULT             [Dd][Ee][Ff][Aa][Uu][Ll][Tt]
+
+WHITE                   [ \t]+
+NEW_LINE                \n
+COMMENT		            \#.*\n
+WHITE_DOTDOT_WHITE      [ \t]*:[ \t]*
+WHITE_COMMA_WHITE       [ \t]*,[ \t]*
+QUOTED_TEXT             \"[^\"]*\"
+
+%%
+
+
+{COMMENT}               { SAVE_POS; RESET_NEW_LINE_FLAGS; } /* swallow comment */
+{WHITE}{NEW_LINE}       { SAVE_POS; RESET_NEW_LINE_FLAGS; } /* trailing blanks with new line */
+{WHITE}                 { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; }
+{NEW_LINE}              { SAVE_POS; RESET_NEW_LINE_FLAGS; }
+
+{QOS_ULPS_START}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_ULPS_START; }
+{QOS_ULPS_END}          { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_ULPS_END; }
+
+{PORT_GROUPS_START}     { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUPS_START; }
+{PORT_GROUPS_END}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUPS_END; }
+{PORT_GROUP_START}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUP_START; }
+{PORT_GROUP_END}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUP_END; }
+
+{QOS_SETUP_START}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_SETUP_START; }
+{QOS_SETUP_END}         { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_SETUP_END; }
+{VLARB_TABLES_START}    { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_TABLES_START; }
+{VLARB_TABLES_END}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_TABLES_END; }
+{VLARB_SCOPE_START}     { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_SCOPE_START; }
+{VLARB_SCOPE_END}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_SCOPE_END; }
+
+{SL2VL_TABLES_START}    { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_TABLES_START; }
+{SL2VL_TABLES_END}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_TABLES_END; }
+{SL2VL_SCOPE_START}     { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_SCOPE_START; }
+{SL2VL_SCOPE_END}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_SCOPE_END; }
+
+{QOS_LEVELS_START}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVELS_START; }
+{QOS_LEVELS_END}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVELS_END; }
+{QOS_LEVEL_START}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVEL_START; }
+{QOS_LEVEL_END}         { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVEL_END; }
+
+{QOS_MATCH_RULES_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULES_START; }
+{QOS_MATCH_RULES_END}   { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULES_END; }
+{QOS_MATCH_RULE_START}  { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULE_START; }
+{QOS_MATCH_RULE_END}    { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULE_END; }
+
+{PORT_GUID}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PORT_GUID;    return TK_PORT_GUID;  }
+{PORT_NAME}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PORT_NAME;    return TK_PORT_NAME;  }
+{PARTITION}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PARTITION;    return TK_PARTITION;  }
+{NODE_TYPE}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_NODE_TYPE;    return TK_NODE_TYPE;  }
+{NAME}{WHITE_DOTDOT_WHITE}             { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_NAME;         return TK_NAME;       }
+{USE}{WHITE_DOTDOT_WHITE}              { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_USE;          return TK_USE;        }
+{GROUP}{WHITE_DOTDOT_WHITE}            { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_GROUP;        return TK_GROUP;      }
+{VLARB_HIGH}{WHITE_DOTDOT_WHITE}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_HIGH;   return TK_VLARB_HIGH; }
+{VLARB_LOW}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_LOW;    return TK_VLARB_LOW;  }
+{VLARB_HIGH_LIMIT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_HIGH_LIMIT; return TK_VLARB_HIGH_LIMIT;}
+{TO}{WHITE_DOTDOT_WHITE}               { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_TO;           return TK_TO;         }
+{FROM}{WHITE_DOTDOT_WHITE}             { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_FROM;         return TK_FROM;       }
+{ACROSS_TO}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS_TO;    return TK_ACROSS_TO;  }
+{ACROSS_FROM}{WHITE_DOTDOT_WHITE}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS_FROM;  return TK_ACROSS_FROM;}
+{ACROSS}{WHITE_DOTDOT_WHITE}           { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS;       return TK_ACROSS;     }
+{SL2VL_TABLE}{WHITE_DOTDOT_WHITE}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SL2VL_TABLE;  return TK_SL2VL_TABLE;}
+{SL}{WHITE_DOTDOT_WHITE}               { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SL;           return TK_SL;         }
+{MTU_LIMIT}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_MTU_LIMIT;    return TK_MTU_LIMIT;  }
+{RATE_LIMIT}{WHITE_DOTDOT_WHITE}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_RATE_LIMIT;   return TK_RATE_LIMIT; }
+{PACKET_LIFE}{WHITE_DOTDOT_WHITE}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PACKET_LIFE;  return TK_PACKET_LIFE;}
+{PATH_BITS}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PATH_BITS;    return TK_PATH_BITS;  }
+{QOS_CLASS}{WHITE_DOTDOT_WHITE}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_QOS_CLASS;    return TK_QOS_CLASS;  }
+{SOURCE}{WHITE_DOTDOT_WHITE}           { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SOURCE;       return TK_SOURCE;     }
+{DESTINATION}{WHITE_DOTDOT_WHITE}      { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_DESTINATION;  return TK_DESTINATION;}
+{SERVICE_ID}{WHITE_DOTDOT_WHITE}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SERVICE_ID;   return TK_SERVICE_ID; }
+{PKEY}{WHITE_DOTDOT_WHITE}             { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PKEY;         return TK_PKEY;       }
+{QOS_LEVEL_NAME}{WHITE_DOTDOT_WHITE}   { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_QOS_LEVEL_NAME; return TK_QOS_LEVEL_NAME;}
+
+{ROUTER}                  { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_ROUTER; yylval = strdup(yytext); return TK_TEXT; }
+{CA}                      { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_CA;     yylval = strdup(yytext); return TK_TEXT; }
+{SWITCH}                  { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_SWITCH; yylval = strdup(yytext); return TK_TEXT; }
+{SELF}                    { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_SELF;   yylval = strdup(yytext); return TK_TEXT; }
+{ALL}                     { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_ALL;    yylval = strdup(yytext); return TK_TEXT; }
+
+{ULP_DEFAULT}{WHITE_DOTDOT_WHITE}              { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_DEFAULT; return TK_ULP_DEFAULT; }
+{ULP_ANY}{WHITE_COMMA_WHITE}{SERVICE_ID}       { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_SERVICE_ID; }
+{ULP_ANY}{WHITE_COMMA_WHITE}{PKEY}             { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_PKEY; }
+{ULP_ANY}{WHITE_COMMA_WHITE}{TARGET_PORT_GUID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_TARGET_PORT_GUID; }
+
+{ULP_SDP}{WHITE_DOTDOT_WHITE}                  { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_DEFAULT; return TK_ULP_SDP_DEFAULT; }
+{ULP_SDP}{WHITE_COMMA_WHITE}{PORT_NUM}         { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_PORT; return TK_ULP_SDP_PORT; }
+
+{ULP_RDS}{WHITE_DOTDOT_WHITE}                  { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_RDS_DEFAULT; return TK_ULP_RDS_DEFAULT; }
+{ULP_RDS}{WHITE_COMMA_WHITE}{PORT_NUM}         { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_RDS_PORT; return TK_ULP_RDS_PORT; }
+
+{ULP_ISER}{WHITE_DOTDOT_WHITE}                 { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_DEFAULT; return TK_ULP_ISER_DEFAULT; }
+{ULP_ISER}{WHITE_COMMA_WHITE}{PORT_NUM}        { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_PORT; return TK_ULP_ISER_PORT; }
+
+{ULP_SRP}{WHITE_COMMA_WHITE}{TARGET_PORT_GUID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SRP_GUID; return TK_ULP_SRP_GUID; }
+
+{ULP_IPOIB}{WHITE_DOTDOT_WHITE}                { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_IPOIB_DEFAULT; return TK_ULP_IPOIB_DEFAULT; }
+{ULP_IPOIB}{WHITE_COMMA_WHITE}{PKEY}           { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_IPOIB_PKEY; return TK_ULP_IPOIB_PKEY; }
+
+0[xX][0-9a-fA-F]+  {
+                        SAVE_POS;
+                        yylval = strdup(yytext);
+                        if (in_description || in_list_of_strings || in_single_string)
+                            return TK_TEXT;
+                        return TK_NUMBER;
+                    }
+
+[0-9]+              {
+                        SAVE_POS;
+                        yylval = strdup(yytext);
+                        if (in_description || in_list_of_strings || in_single_string)
+                            return TK_TEXT;
+                        return TK_NUMBER;
+                    }
+
+
+-                   {
+                        SAVE_POS;
+                        if (in_description || in_list_of_strings || in_single_string)
+                        {
+                            yylval = strdup(yytext);
+                            return TK_TEXT;
+                        }
+                        return TK_DASH;
+                    }
+
+:                   {
+                        SAVE_POS;
+                        if (in_description || in_list_of_strings || in_single_string)
+                        {
+                            yylval = strdup(yytext);
+                            return TK_TEXT;
+                        }
+                        return TK_DOTDOT;
+                    }
+
+,                   {
+                        SAVE_POS;
+                        if (in_description)
+                        {
+                            yylval = strdup(yytext);
+                            return TK_TEXT;
+                        }
+                        return TK_COMMA;
+                    }
+
+\*                  {
+                        SAVE_POS;
+                        if (in_description || in_list_of_strings || in_single_string)
+                        {
+                            yylval = strdup(yytext);
+                            return TK_TEXT;
+                        }
+                        return TK_ASTERISK;
+                    }
+
+{QUOTED_TEXT}       {
+                        SAVE_POS;
+                        yylval = strdup(&yytext[1]);
+                        yylval[strlen(yylval)-1] = '\0';
+                        return TK_TEXT;
+                    }
+
+.                   { SAVE_POS; yylval = strdup(yytext); return TK_TEXT;}
+
+%%
+
+
+/*********************************************
+ *********************************************/
+
+static void save_pos()
+{
+    int i;
+    for (i = 0; i < yyleng; i++)
+    {
+        if (yytext[i] == '\n')
+        {
+            line_num ++;
+            column_num = 1;
+        }
+        else
+            column_num ++;
+    }
+}
+
+/*********************************************
+ *********************************************/
+
+static void reset_new_line_flags()
+{
+    in_description = FALSE;
+    in_list_of_hex_num_ranges = FALSE;
+    in_node_type = FALSE;
+    in_list_of_numbers = FALSE;
+    in_list_of_strings = FALSE;
+    in_list_of_num_pairs = FALSE;
+    in_asterisk_or_list_of_numbers = FALSE;
+    in_list_of_num_ranges = FALSE;
+    in_single_string = FALSE;
+    in_single_number = FALSE;
+}
diff --git a/opensm/opensm/osm_qos_parser_y.y b/opensm/opensm/osm_qos_parser_y.y
new file mode 100644
index 0000000..de60193
--- /dev/null
+++ b/opensm/opensm/osm_qos_parser_y.y
@@ -0,0 +1,3063 @@
+%{
+/*
+ * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
+ * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
+ * Copyright (c) 2008 HNR Consulting. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+/*
+ * Abstract:
+ *    Grammar of OSM QoS parser.
+ *
+ * Environment:
+ *    Linux User Mode
+ *
+ * Author:
+ *    Yevgeny Kliteynik, Mellanox
+ */
+
+#include <stdio.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <opensm/osm_opensm.h>
+#include <opensm/osm_qos_policy.h>
+
+#define OSM_QOS_POLICY_MAX_LINE_LEN         1024*10
+#define OSM_QOS_POLICY_SL2VL_TABLE_LEN      IB_MAX_NUM_VLS
+#define OSM_QOS_POLICY_MAX_VL_NUM           IB_MAX_NUM_VLS
+
+typedef struct tmp_parser_struct_t_ {
+    char       str[OSM_QOS_POLICY_MAX_LINE_LEN];
+    uint64_t   num_pair[2];
+    cl_list_t  str_list;
+    cl_list_t  num_list;
+    cl_list_t  num_pair_list;
+} tmp_parser_struct_t;
+
+static void __parser_tmp_struct_init();
+static void __parser_tmp_struct_reset();
+static void __parser_tmp_struct_destroy();
+
+static char * __parser_strip_white(char * str);
+
+static void __parser_str2uint64(uint64_t * p_val, char * str);
+
+static void __parser_port_group_start();
+static int __parser_port_group_end();
+
+static void __parser_sl2vl_scope_start();
+static int __parser_sl2vl_scope_end();
+
+static void __parser_vlarb_scope_start();
+static int __parser_vlarb_scope_end();
+
+static void __parser_qos_level_start();
+static int __parser_qos_level_end();
+
+static void __parser_match_rule_start();
+static int __parser_match_rule_end();
+
+static void __parser_ulp_match_rule_start();
+static int __parser_ulp_match_rule_end();
+
+static void __pkey_rangelist2rangearr(
+    cl_list_t    * p_list,
+    uint64_t  ** * p_arr,
+    unsigned     * p_arr_len);
+
+static void __rangelist2rangearr(
+    cl_list_t    * p_list,
+    uint64_t  ** * p_arr,
+    unsigned     * p_arr_len);
+
+static void __merge_rangearr(
+    uint64_t  **   range_arr_1,
+    unsigned       range_len_1,
+    uint64_t  **   range_arr_2,
+    unsigned       range_len_2,
+    uint64_t  ** * p_arr,
+    unsigned     * p_arr_len );
+
+static void __parser_add_port_to_port_map(
+    cl_qmap_t   * p_map,
+    osm_physp_t * p_physp);
+
+static void __parser_add_guid_range_to_port_map(
+    cl_qmap_t  * p_map,
+    uint64_t  ** range_arr,
+    unsigned     range_len);
+
+static void __parser_add_pkey_range_to_port_map(
+    cl_qmap_t  * p_map,
+    uint64_t  ** range_arr,
+    unsigned     range_len);
+
+static void __parser_add_partition_list_to_port_map(
+    cl_qmap_t  * p_map,
+    cl_list_t  * p_list);
+
+static void __parser_add_map_to_port_map(
+    cl_qmap_t * p_dmap,
+    cl_map_t  * p_smap);
+
+static int __validate_pkeys(
+    uint64_t ** range_arr,
+    unsigned    range_len,
+    boolean_t   is_ipoib);
+
+static void __setup_simple_qos_levels();
+static void __clear_simple_qos_levels();
+static void __setup_ulp_match_rules();
+static void __process_ulp_match_rules();
+static void yyerror(const char *format, ...);
+
+extern char * yytext;
+extern int yylex (void);
+extern FILE * yyin;
+extern int errno;
+int yyparse();
+
+#define RESET_BUFFER  __parser_tmp_struct_reset()
+
+tmp_parser_struct_t tmp_parser_struct;
+
+int column_num;
+int line_num;
+
+osm_qos_policy_t       * p_qos_policy = NULL;
+osm_qos_port_group_t   * p_current_port_group = NULL;
+osm_qos_sl2vl_scope_t  * p_current_sl2vl_scope = NULL;
+osm_qos_vlarb_scope_t  * p_current_vlarb_scope = NULL;
+osm_qos_level_t        * p_current_qos_level = NULL;
+osm_qos_match_rule_t   * p_current_qos_match_rule = NULL;
+osm_log_t              * p_qos_parser_osm_log;
+
+/* 16 Simple QoS Levels - one for each SL */
+static osm_qos_level_t osm_qos_policy_simple_qos_levels[16];
+
+/* Default Simple QoS Level */
+osm_qos_level_t __default_simple_qos_level;
+
+/*
+ * List of match rules that will be generated by the
+ * qos-ulp section. These rules are concatenated to
+ * the end of the usual matching rules list at the
+ * end of parsing.
+ */
+static cl_list_t __ulp_match_rules;
+
+/***************************************************/
+
+%}
+
+%token TK_NUMBER
+%token TK_DASH
+%token TK_DOTDOT
+%token TK_COMMA
+%token TK_ASTERISK
+%token TK_TEXT
+
+%token TK_QOS_ULPS_START
+%token TK_QOS_ULPS_END
+
+%token TK_PORT_GROUPS_START
+%token TK_PORT_GROUPS_END
+%token TK_PORT_GROUP_START
+%token TK_PORT_GROUP_END
+
+%token TK_QOS_SETUP_START
+%token TK_QOS_SETUP_END
+%token TK_VLARB_TABLES_START
+%token TK_VLARB_TABLES_END
+%token TK_VLARB_SCOPE_START
+%token TK_VLARB_SCOPE_END
+
+%token TK_SL2VL_TABLES_START
+%token TK_SL2VL_TABLES_END
+%token TK_SL2VL_SCOPE_START
+%token TK_SL2VL_SCOPE_END
+
+%token TK_QOS_LEVELS_START
+%token TK_QOS_LEVELS_END
+%token TK_QOS_LEVEL_START
+%token TK_QOS_LEVEL_END
+
+%token TK_QOS_MATCH_RULES_START
+%token TK_QOS_MATCH_RULES_END
+%token TK_QOS_MATCH_RULE_START
+%token TK_QOS_MATCH_RULE_END
+
+%token TK_NAME
+%token TK_USE
+%token TK_PORT_GUID
+%token TK_PORT_NAME
+%token TK_PARTITION
+%token TK_NODE_TYPE
+%token TK_GROUP
+%token TK_ACROSS
+%token TK_VLARB_HIGH
+%token TK_VLARB_LOW
+%token TK_VLARB_HIGH_LIMIT
+%token TK_TO
+%token TK_FROM
+%token TK_ACROSS_TO
+%token TK_ACROSS_FROM
+%token TK_SL2VL_TABLE
+%token TK_SL
+%token TK_MTU_LIMIT
+%token TK_RATE_LIMIT
+%token TK_PACKET_LIFE
+%token TK_PATH_BITS
+%token TK_QOS_CLASS
+%token TK_SOURCE
+%token TK_DESTINATION
+%token TK_SERVICE_ID
+%token TK_QOS_LEVEL_NAME
+%token TK_PKEY
+
+%token TK_NODE_TYPE_ROUTER
+%token TK_NODE_TYPE_CA
+%token TK_NODE_TYPE_SWITCH
+%token TK_NODE_TYPE_SELF
+%token TK_NODE_TYPE_ALL
+
+%token TK_ULP_DEFAULT
+%token TK_ULP_ANY_SERVICE_ID
+%token TK_ULP_ANY_PKEY
+%token TK_ULP_ANY_TARGET_PORT_GUID
+%token TK_ULP_SDP_DEFAULT
+%token TK_ULP_SDP_PORT
+%token TK_ULP_RDS_DEFAULT
+%token TK_ULP_RDS_PORT
+%token TK_ULP_ISER_DEFAULT
+%token TK_ULP_ISER_PORT
+%token TK_ULP_SRP_GUID
+%token TK_ULP_IPOIB_DEFAULT
+%token TK_ULP_IPOIB_PKEY
+
+%start head
+
+%%
+
+head:               qos_policy_entries
+                    ;
+
+qos_policy_entries: /* empty */
+                    | qos_policy_entries qos_policy_entry
+                    ;
+
+qos_policy_entry:     qos_ulps_section
+                    | port_groups_section
+                    | qos_setup_section
+                    | qos_levels_section
+                    | qos_match_rules_section
+                    ;
+
+    /*
+     * Parsing qos-ulps:
+     * -------------------
+     *  qos-ulps
+     *      default                       : 0 #default SL
+     *      sdp, port-num 30000           : 1 #SL for SDP when destination port is 30000
+     *      sdp, port-num 10000-20000     : 2
+     *      sdp                           : 0 #default SL for SDP
+     *      srp, target-port-guid 0x1234  : 2
+     *      rds, port-num 25000           : 2 #SL for RDS when destination port is 25000
+     *      rds,                          : 0 #default SL for RDS
+     *      iser, port-num 900            : 5 #SL for iSER where target port is 900
+     *      iser                          : 4 #default SL for iSER
+     *      ipoib, pkey 0x0001            : 5 #SL for IPoIB on partition with pkey 0x0001
+     *      ipoib                         : 6 #default IPoIB partition - pkey=0x7FFF
+     *      any, service-id 0x6234        : 2
+     *      any, pkey 0x0ABC              : 3
+     *      any, target-port-guid 0x0ABC-0xFFFFF : 6
+     *  end-qos-ulps
+     */
+
+qos_ulps_section: TK_QOS_ULPS_START qos_ulps TK_QOS_ULPS_END
+                     ;
+
+qos_ulps:             qos_ulp
+                    | qos_ulps qos_ulp
+                    ;
+
+    /*
+     * Parsing port groups:
+     * -------------------
+     *  port-groups
+     *       port-group
+     *          name: Storage
+     *          use: our SRP storage targets
+     *          port-guid: 0x1000000000000001,0x1000000000000002
+     *          ...
+     *          port-name: vs1 HCA-1/P1
+     *          port-name: node_description/P2
+     *          ...
+     *          pkey: 0x00FF-0x0FFF
+     *          ...
+     *          partition: Part1
+     *          ...
+     *          node-type: ROUTER,CA,SWITCH,SELF,ALL
+     *          ...
+     *      end-port-group
+     *      port-group
+     *          ...
+     *      end-port-group
+     *  end-port-groups
+     */
+
+
+port_groups_section: TK_PORT_GROUPS_START port_groups TK_PORT_GROUPS_END
+                     ;
+
+port_groups:        port_group
+                    | port_groups port_group
+                    ;
+
+port_group:         port_group_start port_group_entries port_group_end
+                    ;
+
+port_group_start:   TK_PORT_GROUP_START {
+                        __parser_port_group_start();
+                    }
+                    ;
+
+port_group_end:     TK_PORT_GROUP_END {
+                        if ( __parser_port_group_end() )
+                            return 1;
+                    }
+                    ;
+
+port_group_entries: /* empty */
+                    | port_group_entries port_group_entry
+                    ;
+
+port_group_entry:     port_group_name
+                    | port_group_use
+                    | port_group_port_guid
+                    | port_group_port_name
+                    | port_group_pkey
+                    | port_group_partition
+                    | port_group_node_type
+                    ;
+
+
+    /*
+     * Parsing qos setup:
+     * -----------------
+     *  qos-setup
+     *      vlarb-tables
+     *          vlarb-scope
+     *              ...
+     *          end-vlarb-scope
+     *          vlarb-scope
+     *              ...
+     *          end-vlarb-scope
+     *     end-vlarb-tables
+     *     sl2vl-tables
+     *          sl2vl-scope
+     *              ...
+     *         end-sl2vl-scope
+     *         sl2vl-scope
+     *              ...
+     *          end-sl2vl-scope
+     *     end-sl2vl-tables
+     *  end-qos-setup
+     */
+
+qos_setup_section:  TK_QOS_SETUP_START qos_setup_items TK_QOS_SETUP_END
+                    ;
+
+qos_setup_items:    /* empty */
+                    | qos_setup_items vlarb_tables
+                    | qos_setup_items sl2vl_tables
+                    ;
+
+    /* Parsing vlarb-tables */
+
+vlarb_tables:       TK_VLARB_TABLES_START vlarb_scope_items TK_VLARB_TABLES_END
+                    ;
+
+vlarb_scope_items:  /* empty */
+                    | vlarb_scope_items vlarb_scope
+                    ;
+
+vlarb_scope:        vlarb_scope_start vlarb_scope_entries vlarb_scope_end
+                    ;
+
+vlarb_scope_start:  TK_VLARB_SCOPE_START {
+                        __parser_vlarb_scope_start();
+                    }
+                    ;
+
+vlarb_scope_end:    TK_VLARB_SCOPE_END {
+                        if ( __parser_vlarb_scope_end() )
+                            return 1;
+                    }
+                    ;
+
+vlarb_scope_entries:/* empty */
+                    | vlarb_scope_entries vlarb_scope_entry
+                    ;
+
+    /*
+     *          vlarb-scope
+     *              group: Storage
+     *              ...
+     *              across: Storage
+     *              ...
+     *              vlarb-high: 0:255,1:127,2:63,3:31,4:15,5:7,6:3,7:1
+     *              vlarb-low: 8:255,9:127,10:63,11:31,12:15,13:7,14:3
+     *              vl-high-limit: 10
+     *          end-vlarb-scope
+     */
+
+vlarb_scope_entry:    vlarb_scope_group
+                    | vlarb_scope_across
+                    | vlarb_scope_vlarb_high
+                    | vlarb_scope_vlarb_low
+                    | vlarb_scope_vlarb_high_limit
+                    ;
+
+    /* Parsing sl2vl-tables */
+
+sl2vl_tables:       TK_SL2VL_TABLES_START sl2vl_scope_items TK_SL2VL_TABLES_END
+                    ;
+
+sl2vl_scope_items:  /* empty */
+                    | sl2vl_scope_items sl2vl_scope
+                    ;
+
+sl2vl_scope:        sl2vl_scope_start sl2vl_scope_entries sl2vl_scope_end
+                    ;
+
+sl2vl_scope_start:  TK_SL2VL_SCOPE_START {
+                        __parser_sl2vl_scope_start();
+                    }
+                    ;
+
+sl2vl_scope_end:    TK_SL2VL_SCOPE_END {
+                        if ( __parser_sl2vl_scope_end() )
+                            return 1;
+                    }
+                    ;
+
+sl2vl_scope_entries:/* empty */
+                    | sl2vl_scope_entries sl2vl_scope_entry
+                    ;
+
+    /*
+     *          sl2vl-scope
+     *              group: Part1
+     *              ...
+     *              from: *
+     *              ...
+     *              to: *
+     *              ...
+     *              across-to: Storage2
+     *              ...
+     *              across-from: Storage1
+     *              ...
+     *              sl2vl-table: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7
+     *          end-sl2vl-scope
+     */
+
+sl2vl_scope_entry:    sl2vl_scope_group
+                    | sl2vl_scope_across
+                    | sl2vl_scope_across_from
+                    | sl2vl_scope_across_to
+                    | sl2vl_scope_from
+                    | sl2vl_scope_to
+                    | sl2vl_scope_sl2vl_table
+                    ;
+
+    /*
+     * Parsing qos-levels:
+     * ------------------
+     *  qos-levels
+     *      qos-level
+     *          name: qos_level_1
+     *          use: for the lowest priority communication
+     *          sl: 15
+     *          mtu-limit: 1
+     *          rate-limit: 1
+     *          packet-life: 12
+     *          path-bits: 2,4,8-32
+     *          pkey: 0x00FF-0x0FFF
+     *      end-qos-level
+     *          ...
+     *      qos-level
+     *    end-qos-level
+     *  end-qos-levels
+     */
+
+
+qos_levels_section: TK_QOS_LEVELS_START qos_levels TK_QOS_LEVELS_END
+                    ;
+
+qos_levels:         /* empty */
+                    | qos_levels qos_level
+                    ;
+
+qos_level:          qos_level_start qos_level_entries qos_level_end
+                    ;
+
+qos_level_start:    TK_QOS_LEVEL_START {
+                        __parser_qos_level_start();
+                    }
+                    ;
+
+qos_level_end:      TK_QOS_LEVEL_END {
+                        if ( __parser_qos_level_end() )
+                            return 1;
+                    }
+                    ;
+
+qos_level_entries:  /* empty */
+                    | qos_level_entries qos_level_entry
+                    ;
+
+qos_level_entry:      qos_level_name
+                    | qos_level_use
+                    | qos_level_sl
+                    | qos_level_mtu_limit
+                    | qos_level_rate_limit
+                    | qos_level_packet_life
+                    | qos_level_path_bits
+                    | qos_level_pkey
+                    ;
+
+    /*
+     * Parsing qos-match-rules:
+     * -----------------------
+     *  qos-match-rules
+     *      qos-match-rule
+     *          use: low latency by class 7-9 or 11 and bla bla
+     *          qos-class: 7-9,11
+     *          qos-level-name: default
+     *          source: Storage
+     *          destination: Storage
+     *          service-id: 22,4719-5000
+     *          pkey: 0x00FF-0x0FFF
+     *      end-qos-match-rule
+     *      qos-match-rule
+     *          ...
+     *      end-qos-match-rule
+     *  end-qos-match-rules
+     */
+
+qos_match_rules_section: TK_QOS_MATCH_RULES_START qos_match_rules TK_QOS_MATCH_RULES_END
+                    ;
+
+qos_match_rules:    /* empty */
+                    | qos_match_rules qos_match_rule
+                    ;
+
+qos_match_rule:     qos_match_rule_start qos_match_rule_entries qos_match_rule_end
+                    ;
+
+qos_match_rule_start: TK_QOS_MATCH_RULE_START {
+                        __parser_match_rule_start();
+                    }
+                    ;
+
+qos_match_rule_end: TK_QOS_MATCH_RULE_END {
+                        if ( __parser_match_rule_end() )
+                            return 1;
+                    }
+                    ;
+
+qos_match_rule_entries: /* empty */
+                    | qos_match_rule_entries qos_match_rule_entry
+                    ;
+
+qos_match_rule_entry: qos_match_rule_use
+                    | qos_match_rule_qos_class
+                    | qos_match_rule_qos_level_name
+                    | qos_match_rule_source
+                    | qos_match_rule_destination
+                    | qos_match_rule_service_id
+                    | qos_match_rule_pkey
+                    ;
+
+
+    /*
+     * Parsing qos-ulps:
+     * -----------------
+     *   default
+     *   sdp
+     *   sdp with port-num
+     *   rds
+     *   rds with port-num
+     *   srp with port-guid
+     *   iser
+     *   iser with port-num
+     *   ipoib
+     *   ipoib with pkey
+     *   any with service-id
+     *   any with pkey
+     *   any with target-port-guid
+     */
+
+qos_ulp:            TK_ULP_DEFAULT single_number {
+                        /* parsing default ulp rule: "default: num" */
+                        cl_list_iterator_t    list_iterator;
+                        uint64_t            * p_tmp_num;
+
+                        list_iterator = cl_list_head(&tmp_parser_struct.num_list);
+                        p_tmp_num = (uint64_t*)cl_list_obj(list_iterator);
+                        if (*p_tmp_num > 15)
+                        {
+                            yyerror("illegal SL value");
+                            return 1;
+                        }
+                        __default_simple_qos_level.sl = (uint8_t)(*p_tmp_num);
+                        __default_simple_qos_level.sl_set = TRUE;
+                        free(p_tmp_num);
+                        cl_list_remove_all(&tmp_parser_struct.num_list);
+                    }
+
+                    | qos_ulp_type_any_service list_of_ranges TK_DOTDOT {
+                        /* "any, service-id ... : sl" - one instance of list of ranges */
+                        uint64_t ** range_arr;
+                        unsigned    range_len;
+
+                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
+                        {
+                            yyerror("ULP rule doesn't have service ids");
+                            return 1;
+                        }
+
+                        /* get all the service id ranges */
+                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                              &range_arr,
+                                              &range_len );
+
+                        p_current_qos_match_rule->service_id_range_arr = range_arr;
+                        p_current_qos_match_rule->service_id_range_len = range_len;
+
+                    } qos_ulp_sl
+
+                    | qos_ulp_type_any_pkey list_of_ranges TK_DOTDOT {
+                        /* "any, pkey ... : sl" - one instance of list of ranges */
+                        uint64_t ** range_arr;
+                        unsigned    range_len;
+
+                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
+                        {
+                            yyerror("ULP rule doesn't have pkeys");
+                            return 1;
+                        }
+
+                        /* get all the pkey ranges */
+                        __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                              &range_arr,
+                                              &range_len );
+
+                        p_current_qos_match_rule->pkey_range_arr = range_arr;
+                        p_current_qos_match_rule->pkey_range_len = range_len;
+
+                    } qos_ulp_sl
+
+                    | qos_ulp_type_any_target_port_guid list_of_ranges TK_DOTDOT {
+                        /* any, target-port-guid ... : sl */
+                        uint64_t ** range_arr;
+                        unsigned    range_len;
+
+                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
+                        {
+                            yyerror("ULP rule doesn't have port guids");
+                            return 1;
+                        }
+
+                        /* create a new port group with these ports */
+                        __parser_port_group_start();
+
+                        p_current_port_group->name = strdup("_ULP_Targets_");
+                        p_current_port_group->use = strdup("Generated from ULP rules");
+
+                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                              &range_arr,
+                                              &range_len );
+
+                        __parser_add_guid_range_to_port_map(
+                                              &p_current_port_group->port_map,
+                                              range_arr,
+                                              range_len);
+
+                        /* add this port group to the destination
+                           groups of the current match rule */
+                        cl_list_insert_tail(&p_current_qos_match_rule->destination_group_list,
+                                            p_current_port_group);
+
+                        __parser_port_group_end();
+
+                    } qos_ulp_sl
+
+                    | qos_ulp_type_sdp_default {
+                        /* "sdp : sl" - default SL for SDP */
+                        uint64_t ** range_arr =
+                               (uint64_t **)malloc(sizeof(uint64_t *));
+                        range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t));
+                        range_arr[0][0] = OSM_QOS_POLICY_ULP_SDP_SERVICE_ID;
+                        range_arr[0][1] = OSM_QOS_POLICY_ULP_SDP_SERVICE_ID + 0xFFFF;
+
+                        p_current_qos_match_rule->service_id_range_arr = range_arr;
+                        p_current_qos_match_rule->service_id_range_len = 1;
+
+                    } qos_ulp_sl
+
+                    | qos_ulp_type_sdp_port list_of_ranges TK_DOTDOT {
+                        /* sdp with port numbers */
+                        uint64_t ** range_arr;
+                        unsigned    range_len;
+                        unsigned    i;
+
+                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
+                        {
+                            yyerror("SDP ULP rule doesn't have port numbers");
+                            return 1;
+                        }
+
+                        /* get all the port ranges */
+                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                              &range_arr,
+                                              &range_len );
+                        /* now translate these port numbers into service ids */
+                        for (i = 0; i < range_len; i++)
+                        {
+                            if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF)
+                            {
+                                yyerror("SDP port number out of range");
+                                return 1;
+                            }
+                            range_arr[i][0] += OSM_QOS_POLICY_ULP_SDP_SERVICE_ID;
+                            range_arr[i][1] += OSM_QOS_POLICY_ULP_SDP_SERVICE_ID;
+                        }
+
+                        p_current_qos_match_rule->service_id_range_arr = range_arr;
+                        p_current_qos_match_rule->service_id_range_len = range_len;
+
+                    } qos_ulp_sl
+
+                    | qos_ulp_type_rds_default {
+                        /* "rds : sl" - default SL for RDS */
+                        uint64_t ** range_arr =
+                               (uint64_t **)malloc(sizeof(uint64_t *));
+                        range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t));
+                        range_arr[0][0] = range_arr[0][1] =
+                           OSM_QOS_POLICY_ULP_RDS_SERVICE_ID + OSM_QOS_POLICY_ULP_RDS_PORT;
+
+                        p_current_qos_match_rule->service_id_range_arr = range_arr;
+                        p_current_qos_match_rule->service_id_range_len = 1;
+
+                    } qos_ulp_sl
+
+                    | qos_ulp_type_rds_port list_of_ranges TK_DOTDOT {
+                        /* rds with port numbers */
+                        uint64_t ** range_arr;
+                        unsigned    range_len;
+                        unsigned    i;
+
+                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
+                        {
+                            yyerror("RDS ULP rule doesn't have port numbers");
+                            return 1;
+                        }
+
+                        /* get all the port ranges */
+                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                              &range_arr,
+                                              &range_len );
+                        /* now translate these port numbers into service ids */
+                        for (i = 0; i < range_len; i++)
+                        {
+                            if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF)
+                            {
+                                yyerror("SDP port number out of range");
+                                return 1;
+                            }
+                            range_arr[i][0] += OSM_QOS_POLICY_ULP_RDS_SERVICE_ID;
+                            range_arr[i][1] += OSM_QOS_POLICY_ULP_RDS_SERVICE_ID;
+                        }
+
+                        p_current_qos_match_rule->service_id_range_arr = range_arr;
+                        p_current_qos_match_rule->service_id_range_len = range_len;
+
+                    } qos_ulp_sl
+
+                    | qos_ulp_type_iser_default {
+                        /* "iSER : sl" - default SL for iSER */
+                        uint64_t ** range_arr =
+                               (uint64_t **)malloc(sizeof(uint64_t *));
+                        range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t));
+                        range_arr[0][0] = range_arr[0][1] =
+                           OSM_QOS_POLICY_ULP_ISER_SERVICE_ID + OSM_QOS_POLICY_ULP_ISER_PORT;
+
+                        p_current_qos_match_rule->service_id_range_arr = range_arr;
+                        p_current_qos_match_rule->service_id_range_len = 1;
+
+                    } qos_ulp_sl
+
+                    | qos_ulp_type_iser_port list_of_ranges TK_DOTDOT {
+                        /* iser with port numbers */
+                        uint64_t ** range_arr;
+                        unsigned    range_len;
+                        unsigned    i;
+
+                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
+                        {
+                            yyerror("iSER ULP rule doesn't have port numbers");
+                            return 1;
+                        }
+
+                        /* get all the port ranges */
+                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                              &range_arr,
+                                              &range_len );
+                        /* now translate these port numbers into service ids */
+                        for (i = 0; i < range_len; i++)
+                        {
+                            if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF)
+                            {
+                                yyerror("SDP port number out of range");
+                                return 1;
+                            }
+                            range_arr[i][0] += OSM_QOS_POLICY_ULP_ISER_SERVICE_ID;
+                            range_arr[i][1] += OSM_QOS_POLICY_ULP_ISER_SERVICE_ID;
+                        }
+
+                        p_current_qos_match_rule->service_id_range_arr = range_arr;
+                        p_current_qos_match_rule->service_id_range_len = range_len;
+
+                    } qos_ulp_sl
+
+                    | qos_ulp_type_srp_guid list_of_ranges TK_DOTDOT {
+                        /* srp with target guids - this rule is similar
+                           to writing 'any' ulp with target port guids */
+                        uint64_t ** range_arr;
+                        unsigned    range_len;
+
+                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
+                        {
+                            yyerror("SRP ULP rule doesn't have port guids");
+                            return 1;
+                        }
+
+                        /* create a new port group with these ports */
+                        __parser_port_group_start();
+
+                        p_current_port_group->name = strdup("_SRP_Targets_");
+                        p_current_port_group->use = strdup("Generated from ULP rules");
+
+                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                              &range_arr,
+                                              &range_len );
+
+                        __parser_add_guid_range_to_port_map(
+                                              &p_current_port_group->port_map,
+                                              range_arr,
+                                              range_len);
+
+                        /* add this port group to the destination
+                           groups of the current match rule */
+                        cl_list_insert_tail(&p_current_qos_match_rule->destination_group_list,
+                                            p_current_port_group);
+
+                        __parser_port_group_end();
+
+                    } qos_ulp_sl
+
+                    | qos_ulp_type_ipoib_default {
+                        /* ipoib w/o any pkeys (default pkey) */
+                        uint64_t ** range_arr =
+                               (uint64_t **)malloc(sizeof(uint64_t *));
+                        range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t));
+                        range_arr[0][0] = range_arr[0][1] = 0x7fff;
+
+                        /*
+                         * Although we know that the default partition exists,
+                         * we still need to validate it by checking that it has
+                         * at least two full members. Otherwise IPoIB won't work.
+                         */
+                        if (__validate_pkeys(range_arr, 1, TRUE))
+                            return 1;
+
+                        p_current_qos_match_rule->pkey_range_arr = range_arr;
+                        p_current_qos_match_rule->pkey_range_len = 1;
+
+                    } qos_ulp_sl
+
+                    | qos_ulp_type_ipoib_pkey list_of_ranges TK_DOTDOT {
+                        /* ipoib with pkeys */
+                        uint64_t ** range_arr;
+                        unsigned    range_len;
+
+                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
+                        {
+                            yyerror("IPoIB ULP rule doesn't have pkeys");
+                            return 1;
+                        }
+
+                        /* get all the pkey ranges */
+                        __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                              &range_arr,
+                                              &range_len );
+
+                        /*
+                         * Validate pkeys.
+                         * For IPoIB pkeys the validation is strict.
+                         * If some problem would be found, parsing will
+                         * be aborted with a proper error messages.
+                         */
+                        if (__validate_pkeys(range_arr, range_len, TRUE))
+                            return 1;
+
+                        p_current_qos_match_rule->pkey_range_arr = range_arr;
+                        p_current_qos_match_rule->pkey_range_len = range_len;
+
+                    } qos_ulp_sl
+                    ;
+
+qos_ulp_type_any_service: TK_ULP_ANY_SERVICE_ID
+                    { __parser_ulp_match_rule_start(); };
+
+qos_ulp_type_any_pkey: TK_ULP_ANY_PKEY
+                    { __parser_ulp_match_rule_start(); };
+
+qos_ulp_type_any_target_port_guid: TK_ULP_ANY_TARGET_PORT_GUID
+                    { __parser_ulp_match_rule_start(); };
+
+qos_ulp_type_sdp_default: TK_ULP_SDP_DEFAULT
+                    { __parser_ulp_match_rule_start(); };
+
+qos_ulp_type_sdp_port: TK_ULP_SDP_PORT
+                    { __parser_ulp_match_rule_start(); };
+
+qos_ulp_type_rds_default: TK_ULP_RDS_DEFAULT
+                    { __parser_ulp_match_rule_start(); };
+
+qos_ulp_type_rds_port: TK_ULP_RDS_PORT
+                    { __parser_ulp_match_rule_start(); };
+
+qos_ulp_type_iser_default: TK_ULP_ISER_DEFAULT
+                    { __parser_ulp_match_rule_start(); };
+
+qos_ulp_type_iser_port: TK_ULP_ISER_PORT
+                    { __parser_ulp_match_rule_start(); };
+
+qos_ulp_type_srp_guid: TK_ULP_SRP_GUID
+                    { __parser_ulp_match_rule_start(); };
+
+qos_ulp_type_ipoib_default: TK_ULP_IPOIB_DEFAULT
+                    { __parser_ulp_match_rule_start(); };
+
+qos_ulp_type_ipoib_pkey: TK_ULP_IPOIB_PKEY
+                    { __parser_ulp_match_rule_start(); };
+
+
+qos_ulp_sl:   single_number {
+                        /* get the SL for ULP rules */
+                        cl_list_iterator_t  list_iterator;
+                        uint64_t          * p_tmp_num;
+                        uint8_t             sl;
+
+                        list_iterator = cl_list_head(&tmp_parser_struct.num_list);
+                        p_tmp_num = (uint64_t*)cl_list_obj(list_iterator);
+                        if (*p_tmp_num > 15)
+                        {
+                            yyerror("illegal SL value");
+                            return 1;
+                        }
+
+                        sl = (uint8_t)(*p_tmp_num);
+                        free(p_tmp_num);
+                        cl_list_remove_all(&tmp_parser_struct.num_list);
+
+                        p_current_qos_match_rule->p_qos_level =
+                                 &osm_qos_policy_simple_qos_levels[sl];
+                        p_current_qos_match_rule->qos_level_name =
+                                 strdup(osm_qos_policy_simple_qos_levels[sl].name);
+
+                        if (__parser_ulp_match_rule_end())
+                            return 1;
+                    }
+                    ;
+
+    /*
+     *  port_group_entry values:
+     *      port_group_name
+     *      port_group_use
+     *      port_group_port_guid
+     *      port_group_port_name
+     *      port_group_pkey
+     *      port_group_partition
+     *      port_group_node_type
+     */
+
+port_group_name:        port_group_name_start single_string {
+                            /* 'name' of 'port-group' - one instance */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            if (p_current_port_group->name)
+                            {
+                                yyerror("port-group has multiple 'name' tags");
+                                cl_list_remove_all(&tmp_parser_struct.str_list);
+                                return 1;
+                            }
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                    p_current_port_group->name = tmp_str;
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+port_group_name_start:  TK_NAME {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+port_group_use:         port_group_use_start single_string {
+                            /* 'use' of 'port-group' - one instance */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            if (p_current_port_group->use)
+                            {
+                                yyerror("port-group has multiple 'use' tags");
+                                cl_list_remove_all(&tmp_parser_struct.str_list);
+                                return 1;
+                            }
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                    p_current_port_group->use = tmp_str;
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+port_group_use_start:   TK_USE {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+port_group_port_name:   port_group_port_name_start string_list {
+                            /* 'port-name' in 'port-group' - any num of instances */
+                            cl_list_iterator_t list_iterator;
+                            osm_node_t * p_node;
+                            osm_physp_t * p_physp;
+                            unsigned port_num;
+                            char * tmp_str;
+                            char * port_str;
+
+                            /* parsing port name strings */
+                            for (list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                                 list_iterator != cl_list_end(&tmp_parser_struct.str_list);
+                                 list_iterator = cl_list_next(list_iterator))
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                {
+                                    /* last slash in port name string is a separator
+                                       between node name and port number */
+                                    port_str = strrchr(tmp_str, '/');
+                                    if (!port_str || (strlen(port_str) < 3) ||
+                                        (port_str[1] != 'p' && port_str[1] != 'P')) {
+                                        yyerror("'%s' - illegal port name",
+                                                           tmp_str);
+                                        free(tmp_str);
+                                        cl_list_remove_all(&tmp_parser_struct.str_list);
+                                        return 1;
+                                    }
+
+                                    if (!(port_num = strtoul(&port_str[2],NULL,0))) {
+                                        yyerror(
+                                               "'%s' - illegal port number in port name",
+                                               tmp_str);
+                                        free(tmp_str);
+                                        cl_list_remove_all(&tmp_parser_struct.str_list);
+                                        return 1;
+                                    }
+
+                                    /* separate node name from port number */
+                                    port_str[0] = '\0';
+
+                                    if (st_lookup(p_qos_policy->p_node_hash,
+                                                  (st_data_t)tmp_str,
+                                                  (st_data_t*)&p_node))
+                                    {
+                                        /* we found the node, now get the right port */
+                                        p_physp = osm_node_get_physp_ptr(p_node, port_num);
+                                        if (!p_physp) {
+                                            yyerror(
+                                                   "'%s' - port number out of range in port name",
+                                                   tmp_str);
+                                            free(tmp_str);
+                                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                                            return 1;
+                                        }
+                                        /* we found the port, now add it to guid table */
+                                        __parser_add_port_to_port_map(&p_current_port_group->port_map,
+                                                                      p_physp);
+                                    }
+                                    free(tmp_str);
+                                }
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+port_group_port_name_start: TK_PORT_NAME {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+port_group_port_guid:   port_group_port_guid_start list_of_ranges {
+                            /* 'port-guid' in 'port-group' - any num of instances */
+                            /* list of guid ranges */
+                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
+                            {
+                                uint64_t ** range_arr;
+                                unsigned range_len;
+
+                                __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                                      &range_arr,
+                                                      &range_len );
+
+                                __parser_add_guid_range_to_port_map(
+                                                      &p_current_port_group->port_map,
+                                                      range_arr,
+                                                      range_len);
+                            }
+                        }
+                        ;
+
+port_group_port_guid_start: TK_PORT_GUID {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+port_group_pkey:        port_group_pkey_start list_of_ranges {
+                            /* 'pkey' in 'port-group' - any num of instances */
+                            /* list of pkey ranges */
+                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
+                            {
+                                uint64_t ** range_arr;
+                                unsigned range_len;
+
+                                __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                                      &range_arr,
+                                                      &range_len );
+
+                                __parser_add_pkey_range_to_port_map(
+                                                      &p_current_port_group->port_map,
+                                                      range_arr,
+                                                      range_len);
+                            }
+                        }
+                        ;
+
+port_group_pkey_start:  TK_PKEY {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+port_group_partition:  port_group_partition_start string_list {
+                            /* 'partition' in 'port-group' - any num of instances */
+                            __parser_add_partition_list_to_port_map(
+                                               &p_current_port_group->port_map,
+                                               &tmp_parser_struct.str_list);
+                        }
+                        ;
+
+port_group_partition_start: TK_PARTITION {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+port_group_node_type:   port_group_node_type_start port_group_node_type_list {
+                            /* 'node-type' in 'port-group' - any num of instances */
+                        }
+                        ;
+
+port_group_node_type_start: TK_NODE_TYPE {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+port_group_node_type_list:  node_type_item
+                        |   port_group_node_type_list TK_COMMA node_type_item
+                        ;
+
+node_type_item:           node_type_ca
+                        | node_type_switch
+                        | node_type_router
+                        | node_type_all
+                        | node_type_self
+                        ;
+
+node_type_ca:           TK_NODE_TYPE_CA {
+                            p_current_port_group->node_types |=
+                               OSM_QOS_POLICY_NODE_TYPE_CA;
+                        }
+                        ;
+
+node_type_switch:       TK_NODE_TYPE_SWITCH {
+                            p_current_port_group->node_types |=
+                               OSM_QOS_POLICY_NODE_TYPE_SWITCH;
+                        }
+                        ;
+
+node_type_router:       TK_NODE_TYPE_ROUTER {
+                            p_current_port_group->node_types |=
+                               OSM_QOS_POLICY_NODE_TYPE_ROUTER;
+                        }
+                        ;
+
+node_type_all:          TK_NODE_TYPE_ALL {
+                            p_current_port_group->node_types |=
+                               (OSM_QOS_POLICY_NODE_TYPE_CA |
+                                OSM_QOS_POLICY_NODE_TYPE_SWITCH |
+                                OSM_QOS_POLICY_NODE_TYPE_ROUTER);
+                        }
+                        ;
+
+node_type_self:         TK_NODE_TYPE_SELF {
+                            osm_port_t * p_osm_port =
+                                osm_get_port_by_guid(p_qos_policy->p_subn,
+                                     p_qos_policy->p_subn->sm_port_guid);
+                            if (p_osm_port)
+                                __parser_add_port_to_port_map(
+                                   &p_current_port_group->port_map,
+                                   p_osm_port->p_physp);
+                        }
+                        ;
+
+    /*
+     *  vlarb_scope_entry values:
+     *      vlarb_scope_group
+     *      vlarb_scope_across
+     *      vlarb_scope_vlarb_high
+     *      vlarb_scope_vlarb_low
+     *      vlarb_scope_vlarb_high_limit
+     */
+
+
+
+vlarb_scope_group:      vlarb_scope_group_start string_list {
+                            /* 'group' in 'vlarb-scope' - any num of instances */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                    cl_list_insert_tail(&p_current_vlarb_scope->group_list,tmp_str);
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+vlarb_scope_group_start: TK_GROUP {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+vlarb_scope_across: vlarb_scope_across_start string_list {
+                            /* 'across' in 'vlarb-scope' - any num of instances */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                    cl_list_insert_tail(&p_current_vlarb_scope->across_list,tmp_str);
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+vlarb_scope_across_start: TK_ACROSS {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+vlarb_scope_vlarb_high_limit:  vlarb_scope_vlarb_high_limit_start single_number {
+                            /* 'vl-high-limit' in 'vlarb-scope' - one instance of one number */
+                            cl_list_iterator_t    list_iterator;
+                            uint64_t            * p_tmp_num;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
+                            p_tmp_num = (uint64_t*)cl_list_obj(list_iterator);
+                            if (p_tmp_num)
+                            {
+                                p_current_vlarb_scope->vl_high_limit = (uint32_t)(*p_tmp_num);
+                                p_current_vlarb_scope->vl_high_limit_set = TRUE;
+                                free(p_tmp_num);
+                            }
+
+                            cl_list_remove_all(&tmp_parser_struct.num_list);
+                        }
+                        ;
+
+vlarb_scope_vlarb_high_limit_start: TK_VLARB_HIGH_LIMIT {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+vlarb_scope_vlarb_high: vlarb_scope_vlarb_high_start num_list_with_dotdot {
+                            /* 'vlarb-high' in 'vlarb-scope' - list of pairs of numbers with ':' and ',' */
+                            cl_list_iterator_t    list_iterator;
+                            uint64_t            * num_pair;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) )
+                            {
+                                num_pair = (uint64_t*)cl_list_obj(list_iterator);
+                                if (num_pair)
+                                    cl_list_insert_tail(&p_current_vlarb_scope->vlarb_high_list,num_pair);
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.num_pair_list);
+                        }
+                        ;
+
+vlarb_scope_vlarb_high_start: TK_VLARB_HIGH {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+vlarb_scope_vlarb_low:  vlarb_scope_vlarb_low_start num_list_with_dotdot {
+                            /* 'vlarb-low' in 'vlarb-scope' - list of pairs of numbers with ':' and ',' */
+                            cl_list_iterator_t    list_iterator;
+                            uint64_t            * num_pair;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) )
+                            {
+                                num_pair = (uint64_t*)cl_list_obj(list_iterator);
+                                if (num_pair)
+                                    cl_list_insert_tail(&p_current_vlarb_scope->vlarb_low_list,num_pair);
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.num_pair_list);
+                        }
+                        ;
+
+vlarb_scope_vlarb_low_start: TK_VLARB_LOW {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+    /*
+     *  sl2vl_scope_entry values:
+     *      sl2vl_scope_group
+     *      sl2vl_scope_across
+     *      sl2vl_scope_across_from
+     *      sl2vl_scope_across_to
+     *      sl2vl_scope_from
+     *      sl2vl_scope_to
+     *      sl2vl_scope_sl2vl_table
+     */
+
+sl2vl_scope_group:      sl2vl_scope_group_start string_list {
+                            /* 'group' in 'sl2vl-scope' - any num of instances */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                    cl_list_insert_tail(&p_current_sl2vl_scope->group_list,tmp_str);
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+sl2vl_scope_group_start: TK_GROUP {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+sl2vl_scope_across:     sl2vl_scope_across_start string_list {
+                            /* 'across' in 'sl2vl-scope' - any num of instances */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str) {
+                                    cl_list_insert_tail(&p_current_sl2vl_scope->across_from_list,tmp_str);
+                                    cl_list_insert_tail(&p_current_sl2vl_scope->across_to_list,strdup(tmp_str));
+                                }
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+sl2vl_scope_across_start: TK_ACROSS {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+sl2vl_scope_across_from:  sl2vl_scope_across_from_start string_list {
+                            /* 'across-from' in 'sl2vl-scope' - any num of instances */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                    cl_list_insert_tail(&p_current_sl2vl_scope->across_from_list,tmp_str);
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+sl2vl_scope_across_from_start: TK_ACROSS_FROM {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+sl2vl_scope_across_to:  sl2vl_scope_across_to_start string_list {
+                            /* 'across-to' in 'sl2vl-scope' - any num of instances */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str) {
+                                    cl_list_insert_tail(&p_current_sl2vl_scope->across_to_list,tmp_str);
+                                }
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+sl2vl_scope_across_to_start: TK_ACROSS_TO {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+sl2vl_scope_from:       sl2vl_scope_from_start sl2vl_scope_from_list_or_asterisk {
+                            /* 'from' in 'sl2vl-scope' - any num of instances */
+                        }
+                        ;
+
+sl2vl_scope_from_start: TK_FROM {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+sl2vl_scope_to:         sl2vl_scope_to_start sl2vl_scope_to_list_or_asterisk {
+                            /* 'to' in 'sl2vl-scope' - any num of instances */
+                        }
+                        ;
+
+sl2vl_scope_to_start:   TK_TO {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+sl2vl_scope_from_list_or_asterisk:  sl2vl_scope_from_asterisk
+                                  | sl2vl_scope_from_list_of_ranges
+                                  ;
+
+sl2vl_scope_from_asterisk: TK_ASTERISK {
+                            int i;
+                            for (i = 0; i < OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH; i++)
+                                p_current_sl2vl_scope->from[i] = TRUE;
+                        }
+                        ;
+
+sl2vl_scope_to_list_or_asterisk:  sl2vl_scope_to_asterisk
+                                | sl2vl_scope_to_list_of_ranges
+                                  ;
+
+sl2vl_scope_to_asterisk: TK_ASTERISK {
+                            int i;
+                            for (i = 0; i < OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH; i++)
+                                p_current_sl2vl_scope->to[i] = TRUE;
+                        }
+                        ;
+
+sl2vl_scope_from_list_of_ranges: list_of_ranges {
+                            int i;
+                            cl_list_iterator_t    list_iterator;
+                            uint64_t            * num_pair;
+                            uint8_t               num1, num2;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) )
+                            {
+                                num_pair = (uint64_t*)cl_list_obj(list_iterator);
+                                if (num_pair)
+                                {
+                                    if ( num_pair[0] < 0 ||
+                                         num_pair[1] >= OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH )
+                                    {
+                                        yyerror("port number out of range 'from' list");
+                                        free(num_pair);
+                                        cl_list_remove_all(&tmp_parser_struct.num_pair_list);
+                                        return 1;
+                                    }
+                                    num1 = (uint8_t)num_pair[0];
+                                    num2 = (uint8_t)num_pair[1];
+                                    free(num_pair);
+                                    for (i = num1; i <= num2; i++)
+                                        p_current_sl2vl_scope->from[i] = TRUE;
+                                }
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.num_pair_list);
+                        }
+                        ;
+
+sl2vl_scope_to_list_of_ranges: list_of_ranges {
+                            int i;
+                            cl_list_iterator_t    list_iterator;
+                            uint64_t            * num_pair;
+                            uint8_t               num1, num2;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) )
+                            {
+                                num_pair = (uint64_t*)cl_list_obj(list_iterator);
+                                if (num_pair)
+                                {
+                                    if ( num_pair[0] < 0 ||
+                                         num_pair[1] >= OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH )
+                                    {
+                                        yyerror("port number out of range 'to' list");
+                                        free(num_pair);
+                                        cl_list_remove_all(&tmp_parser_struct.num_pair_list);
+                                        return 1;
+                                    }
+                                    num1 = (uint8_t)num_pair[0];
+                                    num2 = (uint8_t)num_pair[1];
+                                    free(num_pair);
+                                    for (i = num1; i <= num2; i++)
+                                        p_current_sl2vl_scope->to[i] = TRUE;
+                                }
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.num_pair_list);
+                        }
+                        ;
+
+
+sl2vl_scope_sl2vl_table:  sl2vl_scope_sl2vl_table_start num_list {
+                            /* 'sl2vl-table' - one instance of exactly
+                               OSM_QOS_POLICY_SL2VL_TABLE_LEN numbers */
+                            cl_list_iterator_t    list_iterator;
+                            uint64_t              num;
+                            uint64_t            * p_num;
+                            int                   i = 0;
+
+                            if (p_current_sl2vl_scope->sl2vl_table_set)
+                            {
+                                yyerror("sl2vl-scope has more than one sl2vl-table");
+                                cl_list_remove_all(&tmp_parser_struct.num_list);
+                                return 1;
+                            }
+
+                            if (cl_list_count(&tmp_parser_struct.num_list) != OSM_QOS_POLICY_SL2VL_TABLE_LEN)
+                            {
+                                yyerror("wrong number of values in 'sl2vl-table' (should be 16)");
+                                cl_list_remove_all(&tmp_parser_struct.num_list);
+                                return 1;
+                            }
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_list) )
+                            {
+                                p_num = (uint64_t*)cl_list_obj(list_iterator);
+                                num = *p_num;
+                                free(p_num);
+                                if (num >= OSM_QOS_POLICY_MAX_VL_NUM)
+                                {
+                                    yyerror("wrong VL value in 'sl2vl-table' (should be 0 to 15)");
+                                    cl_list_remove_all(&tmp_parser_struct.num_list);
+                                    return 1;
+                                }
+
+                                p_current_sl2vl_scope->sl2vl_table[i++] = (uint8_t)num;
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            p_current_sl2vl_scope->sl2vl_table_set = TRUE;
+                            cl_list_remove_all(&tmp_parser_struct.num_list);
+                        }
+                        ;
+
+sl2vl_scope_sl2vl_table_start: TK_SL2VL_TABLE {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+    /*
+     *  qos_level_entry values:
+     *      qos_level_name
+     *      qos_level_use
+     *      qos_level_sl
+     *      qos_level_mtu_limit
+     *      qos_level_rate_limit
+     *      qos_level_packet_life
+     *      qos_level_path_bits
+     *      qos_level_pkey
+     */
+
+qos_level_name:         qos_level_name_start single_string {
+                            /* 'name' of 'qos-level' - one instance */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            if (p_current_qos_level->name)
+                            {
+                                yyerror("qos-level has multiple 'name' tags");
+                                cl_list_remove_all(&tmp_parser_struct.str_list);
+                                return 1;
+                            }
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                    p_current_qos_level->name = tmp_str;
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+qos_level_name_start:   TK_NAME {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_level_use:          qos_level_use_start single_string {
+                            /* 'use' of 'qos-level' - one instance */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            if (p_current_qos_level->use)
+                            {
+                                yyerror("qos-level has multiple 'use' tags");
+                                cl_list_remove_all(&tmp_parser_struct.str_list);
+                                return 1;
+                            }
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                    p_current_qos_level->use = tmp_str;
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+qos_level_use_start:    TK_USE {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_level_sl:           qos_level_sl_start single_number {
+                            /* 'sl' in 'qos-level' - one instance */
+                            cl_list_iterator_t   list_iterator;
+                            uint64_t           * p_num;
+
+                            if (p_current_qos_level->sl_set)
+                            {
+                                yyerror("'qos-level' has multiple 'sl' tags");
+                                cl_list_remove_all(&tmp_parser_struct.num_list);
+                                return 1;
+                            }
+                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
+                            p_num = (uint64_t*)cl_list_obj(list_iterator);
+                            p_current_qos_level->sl = (uint8_t)(*p_num);
+                            free(p_num);
+                            p_current_qos_level->sl_set = TRUE;
+                            cl_list_remove_all(&tmp_parser_struct.num_list);
+                        }
+                        ;
+
+qos_level_sl_start:     TK_SL {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_level_mtu_limit:    qos_level_mtu_limit_start single_number {
+                            /* 'mtu-limit' in 'qos-level' - one instance */
+                            cl_list_iterator_t   list_iterator;
+                            uint64_t           * p_num;
+
+                            if (p_current_qos_level->mtu_limit_set)
+                            {
+                                yyerror("'qos-level' has multiple 'mtu-limit' tags");
+                                cl_list_remove_all(&tmp_parser_struct.num_list);
+                                return 1;
+                            }
+                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
+                            p_num = (uint64_t*)cl_list_obj(list_iterator);
+                            p_current_qos_level->mtu_limit = (uint8_t)(*p_num);
+                            free(p_num);
+                            p_current_qos_level->mtu_limit_set = TRUE;
+                            cl_list_remove_all(&tmp_parser_struct.num_list);
+                        }
+                        ;
+
+qos_level_mtu_limit_start: TK_MTU_LIMIT {
+                            /* 'mtu-limit' in 'qos-level' - one instance */
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_level_rate_limit:    qos_level_rate_limit_start single_number {
+                            /* 'rate-limit' in 'qos-level' - one instance */
+                            cl_list_iterator_t   list_iterator;
+                            uint64_t           * p_num;
+
+                            if (p_current_qos_level->rate_limit_set)
+                            {
+                                yyerror("'qos-level' has multiple 'rate-limit' tags");
+                                cl_list_remove_all(&tmp_parser_struct.num_list);
+                                return 1;
+                            }
+                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
+                            p_num = (uint64_t*)cl_list_obj(list_iterator);
+                            p_current_qos_level->rate_limit = (uint8_t)(*p_num);
+                            free(p_num);
+                            p_current_qos_level->rate_limit_set = TRUE;
+                            cl_list_remove_all(&tmp_parser_struct.num_list);
+                        }
+                        ;
+
+qos_level_rate_limit_start: TK_RATE_LIMIT {
+                            /* 'rate-limit' in 'qos-level' - one instance */
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_level_packet_life:  qos_level_packet_life_start single_number {
+                            /* 'packet-life' in 'qos-level' - one instance */
+                            cl_list_iterator_t   list_iterator;
+                            uint64_t           * p_num;
+
+                            if (p_current_qos_level->pkt_life_set)
+                            {
+                                yyerror("'qos-level' has multiple 'packet-life' tags");
+                                cl_list_remove_all(&tmp_parser_struct.num_list);
+                                return 1;
+                            }
+                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
+                            p_num = (uint64_t*)cl_list_obj(list_iterator);
+                            p_current_qos_level->pkt_life = (uint8_t)(*p_num);
+                            free(p_num);
+                            p_current_qos_level->pkt_life_set= TRUE;
+                            cl_list_remove_all(&tmp_parser_struct.num_list);
+                        }
+                        ;
+
+qos_level_packet_life_start: TK_PACKET_LIFE {
+                            /* 'packet-life' in 'qos-level' - one instance */
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_level_path_bits:    qos_level_path_bits_start list_of_ranges {
+                            /* 'path-bits' in 'qos-level' - any num of instances */
+                            /* list of path bit ranges */
+
+                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
+                            {
+                                uint64_t ** range_arr;
+                                unsigned range_len;
+
+                                __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                                      &range_arr,
+                                                      &range_len );
+
+                                if ( !p_current_qos_level->path_bits_range_len )
+                                {
+                                    p_current_qos_level->path_bits_range_arr = range_arr;
+                                    p_current_qos_level->path_bits_range_len = range_len;
+                                }
+                                else
+                                {
+                                    uint64_t ** new_range_arr;
+                                    unsigned new_range_len;
+                                    __merge_rangearr( p_current_qos_level->path_bits_range_arr,
+                                                      p_current_qos_level->path_bits_range_len,
+                                                      range_arr,
+                                                      range_len,
+                                                      &new_range_arr,
+                                                      &new_range_len );
+                                    p_current_qos_level->path_bits_range_arr = new_range_arr;
+                                    p_current_qos_level->path_bits_range_len = new_range_len;
+                                }
+                            }
+                        }
+                        ;
+
+qos_level_path_bits_start: TK_PATH_BITS {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_level_pkey:         qos_level_pkey_start list_of_ranges {
+                            /* 'pkey' in 'qos-level' - num of instances of list of ranges */
+                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
+                            {
+                                uint64_t ** range_arr;
+                                unsigned range_len;
+
+                                __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                                      &range_arr,
+                                                      &range_len );
+
+                                if ( !p_current_qos_level->pkey_range_len )
+                                {
+                                    p_current_qos_level->pkey_range_arr = range_arr;
+                                    p_current_qos_level->pkey_range_len = range_len;
+                                }
+                                else
+                                {
+                                    uint64_t ** new_range_arr;
+                                    unsigned new_range_len;
+                                    __merge_rangearr( p_current_qos_level->pkey_range_arr,
+                                                      p_current_qos_level->pkey_range_len,
+                                                      range_arr,
+                                                      range_len,
+                                                      &new_range_arr,
+                                                      &new_range_len );
+                                    p_current_qos_level->pkey_range_arr = new_range_arr;
+                                    p_current_qos_level->pkey_range_len = new_range_len;
+                                }
+                            }
+                        }
+                        ;
+
+qos_level_pkey_start:   TK_PKEY {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+    /*
+     *  qos_match_rule_entry values:
+     *      qos_match_rule_use
+     *      qos_match_rule_qos_class
+     *      qos_match_rule_qos_level_name
+     *      qos_match_rule_source
+     *      qos_match_rule_destination
+     *      qos_match_rule_service_id
+     *      qos_match_rule_pkey
+     */
+
+
+qos_match_rule_use:     qos_match_rule_use_start single_string {
+                            /* 'use' of 'qos-match-rule' - one instance */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            if (p_current_qos_match_rule->use)
+                            {
+                                yyerror("'qos-match-rule' has multiple 'use' tags");
+                                cl_list_remove_all(&tmp_parser_struct.str_list);
+                                return 1;
+                            }
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                    p_current_qos_match_rule->use = tmp_str;
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+qos_match_rule_use_start: TK_USE {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_match_rule_qos_class: qos_match_rule_qos_class_start list_of_ranges {
+                            /* 'qos-class' in 'qos-match-rule' - num of instances of list of ranges */
+                            /* list of class ranges (QoS Class is 12-bit value) */
+                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
+                            {
+                                uint64_t ** range_arr;
+                                unsigned range_len;
+
+                                __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                                      &range_arr,
+                                                      &range_len );
+
+                                if ( !p_current_qos_match_rule->qos_class_range_len )
+                                {
+                                    p_current_qos_match_rule->qos_class_range_arr = range_arr;
+                                    p_current_qos_match_rule->qos_class_range_len = range_len;
+                                }
+                                else
+                                {
+                                    uint64_t ** new_range_arr;
+                                    unsigned new_range_len;
+                                    __merge_rangearr( p_current_qos_match_rule->qos_class_range_arr,
+                                                      p_current_qos_match_rule->qos_class_range_len,
+                                                      range_arr,
+                                                      range_len,
+                                                      &new_range_arr,
+                                                      &new_range_len );
+                                    p_current_qos_match_rule->qos_class_range_arr = new_range_arr;
+                                    p_current_qos_match_rule->qos_class_range_len = new_range_len;
+                                }
+                            }
+                        }
+                        ;
+
+qos_match_rule_qos_class_start: TK_QOS_CLASS {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_match_rule_source:  qos_match_rule_source_start string_list {
+                            /* 'source' in 'qos-match-rule' - text */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                    cl_list_insert_tail(&p_current_qos_match_rule->source_list,tmp_str);
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+qos_match_rule_source_start: TK_SOURCE {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_match_rule_destination: qos_match_rule_destination_start string_list {
+                            /* 'destination' in 'qos-match-rule' - text */
+                            cl_list_iterator_t    list_iterator;
+                            char                * tmp_str;
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                    cl_list_insert_tail(&p_current_qos_match_rule->destination_list,tmp_str);
+                                list_iterator = cl_list_next(list_iterator);
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+qos_match_rule_destination_start: TK_DESTINATION {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_match_rule_qos_level_name:  qos_match_rule_qos_level_name_start single_string {
+                            /* 'qos-level-name' in 'qos-match-rule' - single string */
+                            cl_list_iterator_t   list_iterator;
+                            char               * tmp_str;
+
+                            if (p_current_qos_match_rule->qos_level_name)
+                            {
+                                yyerror("qos-match-rule has multiple 'qos-level-name' tags");
+                                cl_list_remove_all(&tmp_parser_struct.num_list);
+                                return 1;
+                            }
+
+                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
+                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
+                            {
+                                tmp_str = (char*)cl_list_obj(list_iterator);
+                                if (tmp_str)
+                                    p_current_qos_match_rule->qos_level_name = tmp_str;
+                            }
+                            cl_list_remove_all(&tmp_parser_struct.str_list);
+                        }
+                        ;
+
+qos_match_rule_qos_level_name_start: TK_QOS_LEVEL_NAME {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_match_rule_service_id: qos_match_rule_service_id_start list_of_ranges {
+                            /* 'service-id' in 'qos-match-rule' - num of instances of list of ranges */
+                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
+                            {
+                                uint64_t ** range_arr;
+                                unsigned range_len;
+
+                                __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                                      &range_arr,
+                                                      &range_len );
+
+                                if ( !p_current_qos_match_rule->service_id_range_len )
+                                {
+                                    p_current_qos_match_rule->service_id_range_arr = range_arr;
+                                    p_current_qos_match_rule->service_id_range_len = range_len;
+                                }
+                                else
+                                {
+                                    uint64_t ** new_range_arr;
+                                    unsigned new_range_len;
+                                    __merge_rangearr( p_current_qos_match_rule->service_id_range_arr,
+                                                      p_current_qos_match_rule->service_id_range_len,
+                                                      range_arr,
+                                                      range_len,
+                                                      &new_range_arr,
+                                                      &new_range_len );
+                                    p_current_qos_match_rule->service_id_range_arr = new_range_arr;
+                                    p_current_qos_match_rule->service_id_range_len = new_range_len;
+                                }
+                            }
+                        }
+                        ;
+
+qos_match_rule_service_id_start: TK_SERVICE_ID {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+qos_match_rule_pkey:    qos_match_rule_pkey_start list_of_ranges {
+                            /* 'pkey' in 'qos-match-rule' - num of instances of list of ranges */
+                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
+                            {
+                                uint64_t ** range_arr;
+                                unsigned range_len;
+
+                                __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
+                                                      &range_arr,
+                                                      &range_len );
+
+                                if ( !p_current_qos_match_rule->pkey_range_len )
+                                {
+                                    p_current_qos_match_rule->pkey_range_arr = range_arr;
+                                    p_current_qos_match_rule->pkey_range_len = range_len;
+                                }
+                                else
+                                {
+                                    uint64_t ** new_range_arr;
+                                    unsigned new_range_len;
+                                    __merge_rangearr( p_current_qos_match_rule->pkey_range_arr,
+                                                      p_current_qos_match_rule->pkey_range_len,
+                                                      range_arr,
+                                                      range_len,
+                                                      &new_range_arr,
+                                                      &new_range_len );
+                                    p_current_qos_match_rule->pkey_range_arr = new_range_arr;
+                                    p_current_qos_match_rule->pkey_range_len = new_range_len;
+                                }
+                            }
+                        }
+                        ;
+
+qos_match_rule_pkey_start: TK_PKEY {
+                            RESET_BUFFER;
+                        }
+                        ;
+
+
+    /*
+     * Common part
+     */
+
+
+single_string:      single_string_elems {
+                        cl_list_insert_tail(&tmp_parser_struct.str_list,
+                                            strdup(__parser_strip_white(tmp_parser_struct.str)));
+                        tmp_parser_struct.str[0] = '\0';
+                    }
+                    ;
+
+single_string_elems:  single_string_element
+                    | single_string_elems single_string_element
+                    ;
+
+single_string_element: TK_TEXT {
+                        strcat(tmp_parser_struct.str,$1);
+                        free($1);
+                    }
+                    ;
+
+
+string_list:        single_string
+                    | string_list TK_COMMA single_string
+                    ;
+
+
+
+single_number:      number
+                    ;
+
+num_list:             number
+                    | num_list TK_COMMA number
+                    ;
+
+number:             TK_NUMBER {
+                        uint64_t * p_num = (uint64_t*)malloc(sizeof(uint64_t));
+                        __parser_str2uint64(p_num,$1);
+                        free($1);
+                        cl_list_insert_tail(&tmp_parser_struct.num_list, p_num);
+                    }
+                    ;
+
+num_list_with_dotdot: number_from_pair_1 TK_DOTDOT number_from_pair_2 {
+                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
+                        num_pair[0] = tmp_parser_struct.num_pair[0];
+                        num_pair[1] = tmp_parser_struct.num_pair[1];
+                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
+                    }
+                    | num_list_with_dotdot TK_COMMA number_from_pair_1 TK_DOTDOT number_from_pair_2 {
+                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
+                        num_pair[0] = tmp_parser_struct.num_pair[0];
+                        num_pair[1] = tmp_parser_struct.num_pair[1];
+                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
+                    }
+                    ;
+
+number_from_pair_1:   TK_NUMBER {
+                        __parser_str2uint64(&tmp_parser_struct.num_pair[0],$1);
+                        free($1);
+                    }
+                    ;
+
+number_from_pair_2:   TK_NUMBER {
+                        __parser_str2uint64(&tmp_parser_struct.num_pair[1],$1);
+                        free($1);
+                    }
+                    ;
+
+list_of_ranges:     num_list_with_dash
+                    ;
+
+num_list_with_dash:   single_number_from_range {
+                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
+                        num_pair[0] = tmp_parser_struct.num_pair[0];
+                        num_pair[1] = tmp_parser_struct.num_pair[1];
+                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
+                    }
+                    | number_from_range_1 TK_DASH number_from_range_2 {
+                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
+                        if (tmp_parser_struct.num_pair[0] <= tmp_parser_struct.num_pair[1]) {
+                            num_pair[0] = tmp_parser_struct.num_pair[0];
+                            num_pair[1] = tmp_parser_struct.num_pair[1];
+                        }
+                        else {
+                            num_pair[1] = tmp_parser_struct.num_pair[0];
+                            num_pair[0] = tmp_parser_struct.num_pair[1];
+                        }
+                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
+                    }
+                    | num_list_with_dash TK_COMMA number_from_range_1 TK_DASH number_from_range_2 {
+                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
+                        if (tmp_parser_struct.num_pair[0] <= tmp_parser_struct.num_pair[1]) {
+                            num_pair[0] = tmp_parser_struct.num_pair[0];
+                            num_pair[1] = tmp_parser_struct.num_pair[1];
+                        }
+                        else {
+                            num_pair[1] = tmp_parser_struct.num_pair[0];
+                            num_pair[0] = tmp_parser_struct.num_pair[1];
+                        }
+                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
+                    }
+                    | num_list_with_dash TK_COMMA single_number_from_range {
+                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
+                        num_pair[0] = tmp_parser_struct.num_pair[0];
+                        num_pair[1] = tmp_parser_struct.num_pair[1];
+                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
+                    }
+                    ;
+
+single_number_from_range:  TK_NUMBER {
+                        __parser_str2uint64(&tmp_parser_struct.num_pair[0],$1);
+                        __parser_str2uint64(&tmp_parser_struct.num_pair[1],$1);
+                        free($1);
+                    }
+                    ;
+
+number_from_range_1:  TK_NUMBER {
+                        __parser_str2uint64(&tmp_parser_struct.num_pair[0],$1);
+                        free($1);
+                    }
+                    ;
+
+number_from_range_2:  TK_NUMBER {
+                        __parser_str2uint64(&tmp_parser_struct.num_pair[1],$1);
+                        free($1);
+                    }
+                    ;
+
+%%
+
+/***************************************************
+ ***************************************************/
+
+int osm_qos_parse_policy_file(IN osm_subn_t * const p_subn)
+{
+    int res = 0;
+    static boolean_t first_time = TRUE;
+    p_qos_parser_osm_log = &p_subn->p_osm->log;
+
+    OSM_LOG_ENTER(p_qos_parser_osm_log);
+
+    osm_qos_policy_destroy(p_subn->p_qos_policy);
+    p_subn->p_qos_policy = NULL;
+
+    yyin = fopen (p_subn->opt.qos_policy_file, "r");
+    if (!yyin)
+    {
+        if (strcmp(p_subn->opt.qos_policy_file,OSM_DEFAULT_QOS_POLICY_FILE)) {
+            OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC01: "
+                    "Failed opening QoS policy file %s - %s\n",
+                    p_subn->opt.qos_policy_file, strerror(errno));
+            res = 1;
+        }
+        else
+            OSM_LOG(p_qos_parser_osm_log, OSM_LOG_VERBOSE,
+                    "QoS policy file not found (%s)\n",
+                    p_subn->opt.qos_policy_file);
+
+        goto Exit;
+    }
+
+    if (first_time)
+    {
+        first_time = FALSE;
+        __setup_simple_qos_levels();
+        __setup_ulp_match_rules();
+        OSM_LOG(p_qos_parser_osm_log, OSM_LOG_INFO,
+		"Loading QoS policy file (%s)\n",
+                p_subn->opt.qos_policy_file);
+    }
+    else
+        /*
+         * ULP match rules list was emptied at the end of
+         * previous parsing iteration.
+         * What's left is to clear simple QoS levels.
+         */
+        __clear_simple_qos_levels();
+
+    column_num = 1;
+    line_num = 1;
+
+    p_subn->p_qos_policy = osm_qos_policy_create(p_subn);
+
+    __parser_tmp_struct_init();
+    p_qos_policy = p_subn->p_qos_policy;
+
+    res = yyparse();
+
+    __parser_tmp_struct_destroy();
+
+    if (res != 0)
+    {
+        OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC03: "
+                "Failed parsing QoS policy file (%s)\n",
+                p_subn->opt.qos_policy_file);
+        osm_qos_policy_destroy(p_subn->p_qos_policy);
+        p_subn->p_qos_policy = NULL;
+        res = 1;
+        goto Exit;
+    }
+
+    /* add generated ULP match rules to the usual match rules */
+    __process_ulp_match_rules();
+
+    if (osm_qos_policy_validate(p_subn->p_qos_policy,p_qos_parser_osm_log))
+    {
+        OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC04: "
+                "Error(s) in QoS policy file (%s)\n",
+                p_subn->opt.qos_policy_file);
+        fprintf(stderr, "Error(s) in QoS policy file (%s)\n",
+                p_subn->opt.qos_policy_file);
+        osm_qos_policy_destroy(p_subn->p_qos_policy);
+        p_subn->p_qos_policy = NULL;
+        res = 1;
+        goto Exit;
+    }
+
+  Exit:
+    if (yyin)
+        fclose(yyin);
+    OSM_LOG_EXIT(p_qos_parser_osm_log);
+    return res;
+}
+
+/***************************************************
+ ***************************************************/
+
+int yywrap()
+{
+    return(1);
+}
+
+/***************************************************
+ ***************************************************/
+
+static void yyerror(const char *format, ...)
+{
+    char s[256];
+    va_list pvar;
+
+    OSM_LOG_ENTER(p_qos_parser_osm_log);
+
+    va_start(pvar, format);
+    vsnprintf(s, sizeof(s), format, pvar);
+    va_end(pvar);
+
+    OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC05: "
+            "Syntax error (line %d:%d): %s\n",
+            line_num, column_num, s);
+    fprintf(stderr, "Error in QoS Policy File (line %d:%d): %s.\n",
+            line_num, column_num, s);
+    OSM_LOG_EXIT(p_qos_parser_osm_log);
+}
+
+/***************************************************
+ ***************************************************/
+
+static char * __parser_strip_white(char * str)
+{
+   int i;
+   for (i = (strlen(str)-1); i >= 0; i--)
+   {
+      if (isspace(str[i]))
+          str[i] = '\0';
+      else
+         break;
+   }
+   for (i = 0; i < strlen(str); i++)
+   {
+      if (!isspace(str[i]))
+         break;
+   }
+   return &(str[i]);
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_str2uint64(uint64_t * p_val, char * str)
+{
+   *p_val = strtoull(str, NULL, 0);
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_port_group_start()
+{
+    p_current_port_group = osm_qos_policy_port_group_create();
+}
+
+/***************************************************
+ ***************************************************/
+
+static int __parser_port_group_end()
+{
+    if(!p_current_port_group->name)
+    {
+        yyerror("port-group validation failed - no port group name specified");
+        return -1;
+    }
+
+    cl_list_insert_tail(&p_qos_policy->port_groups,
+                        p_current_port_group);
+    p_current_port_group = NULL;
+    return 0;
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_vlarb_scope_start()
+{
+    p_current_vlarb_scope = osm_qos_policy_vlarb_scope_create();
+}
+
+/***************************************************
+ ***************************************************/
+
+static int __parser_vlarb_scope_end()
+{
+    if ( !cl_list_count(&p_current_vlarb_scope->group_list) &&
+         !cl_list_count(&p_current_vlarb_scope->across_list) )
+    {
+        yyerror("vlarb-scope validation failed - no port groups specified by 'group' or by 'across'");
+        return -1;
+    }
+
+    cl_list_insert_tail(&p_qos_policy->vlarb_tables,
+                        p_current_vlarb_scope);
+    p_current_vlarb_scope = NULL;
+    return 0;
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_sl2vl_scope_start()
+{
+    p_current_sl2vl_scope = osm_qos_policy_sl2vl_scope_create();
+}
+
+/***************************************************
+ ***************************************************/
+
+static int __parser_sl2vl_scope_end()
+{
+    if (!p_current_sl2vl_scope->sl2vl_table_set)
+    {
+        yyerror("sl2vl-scope validation failed - no sl2vl table specified");
+        return -1;
+    }
+    if ( !cl_list_count(&p_current_sl2vl_scope->group_list) &&
+         !cl_list_count(&p_current_sl2vl_scope->across_to_list) &&
+         !cl_list_count(&p_current_sl2vl_scope->across_from_list) )
+    {
+        yyerror("sl2vl-scope validation failed - no port groups specified by 'group', 'across-to' or 'across-from'");
+        return -1;
+    }
+
+    cl_list_insert_tail(&p_qos_policy->sl2vl_tables,
+                        p_current_sl2vl_scope);
+    p_current_sl2vl_scope = NULL;
+    return 0;
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_qos_level_start()
+{
+    p_current_qos_level = osm_qos_policy_qos_level_create();
+}
+
+/***************************************************
+ ***************************************************/
+
+static int __parser_qos_level_end()
+{
+    if (!p_current_qos_level->sl_set)
+    {
+        yyerror("qos-level validation failed - no 'sl' specified");
+        return -1;
+    }
+    if (!p_current_qos_level->name)
+    {
+        yyerror("qos-level validation failed - no 'name' specified");
+        return -1;
+    }
+
+    cl_list_insert_tail(&p_qos_policy->qos_levels,
+                        p_current_qos_level);
+    p_current_qos_level = NULL;
+    return 0;
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_match_rule_start()
+{
+    p_current_qos_match_rule = osm_qos_policy_match_rule_create();
+}
+
+/***************************************************
+ ***************************************************/
+
+static int __parser_match_rule_end()
+{
+    if (!p_current_qos_match_rule->qos_level_name)
+    {
+        yyerror("match-rule validation failed - no 'qos-level-name' specified");
+        return -1;
+    }
+
+    cl_list_insert_tail(&p_qos_policy->qos_match_rules,
+                        p_current_qos_match_rule);
+    p_current_qos_match_rule = NULL;
+    return 0;
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_ulp_match_rule_start()
+{
+    p_current_qos_match_rule = osm_qos_policy_match_rule_create();
+}
+
+/***************************************************
+ ***************************************************/
+
+static int __parser_ulp_match_rule_end()
+{
+    CL_ASSERT(p_current_qos_match_rule->p_qos_level);
+    cl_list_insert_tail(&__ulp_match_rules,
+                        p_current_qos_match_rule);
+    p_current_qos_match_rule = NULL;
+    return 0;
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_tmp_struct_init()
+{
+    tmp_parser_struct.str[0] = '\0';
+    cl_list_construct(&tmp_parser_struct.str_list);
+    cl_list_init(&tmp_parser_struct.str_list, 10);
+    cl_list_construct(&tmp_parser_struct.num_list);
+    cl_list_init(&tmp_parser_struct.num_list, 10);
+    cl_list_construct(&tmp_parser_struct.num_pair_list);
+    cl_list_init(&tmp_parser_struct.num_pair_list, 10);
+}
+
+/***************************************************
+ ***************************************************/
+
+/*
+ * Do NOT free objects from the temp struct.
+ * Either they are inserted into the parse tree data
+ * structure, or they are already freed when copying
+ * their values to the parse tree data structure.
+ */
+static void __parser_tmp_struct_reset()
+{
+    tmp_parser_struct.str[0] = '\0';
+    cl_list_remove_all(&tmp_parser_struct.str_list);
+    cl_list_remove_all(&tmp_parser_struct.num_list);
+    cl_list_remove_all(&tmp_parser_struct.num_pair_list);
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_tmp_struct_destroy()
+{
+    __parser_tmp_struct_reset();
+    cl_list_destroy(&tmp_parser_struct.str_list);
+    cl_list_destroy(&tmp_parser_struct.num_list);
+    cl_list_destroy(&tmp_parser_struct.num_pair_list);
+}
+
+/***************************************************
+ ***************************************************/
+
+#define __SIMPLE_QOS_LEVEL_NAME "SimpleQoSLevel_SL"
+#define __SIMPLE_QOS_LEVEL_DEFAULT_NAME "SimpleQoSLevel_DEFAULT"
+
+static void __setup_simple_qos_levels()
+{
+    uint8_t i;
+    char tmp_buf[30];
+    memset(osm_qos_policy_simple_qos_levels, 0,
+           sizeof(osm_qos_policy_simple_qos_levels));
+    for (i = 0; i < 16; i++)
+    {
+        osm_qos_policy_simple_qos_levels[i].sl = i;
+        osm_qos_policy_simple_qos_levels[i].sl_set = TRUE;
+        sprintf(tmp_buf, "%s%u", __SIMPLE_QOS_LEVEL_NAME, i);
+        osm_qos_policy_simple_qos_levels[i].name = strdup(tmp_buf);
+    }
+
+    memset(&__default_simple_qos_level, 0,
+           sizeof(__default_simple_qos_level));
+    __default_simple_qos_level.name =
+           strdup(__SIMPLE_QOS_LEVEL_DEFAULT_NAME);
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __clear_simple_qos_levels()
+{
+    /*
+     * Simple QoS levels are static.
+     * What's left is to invalidate default simple QoS level.
+     */
+    __default_simple_qos_level.sl_set = FALSE;
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __setup_ulp_match_rules()
+{
+    cl_list_construct(&__ulp_match_rules);
+    cl_list_init(&__ulp_match_rules, 10);
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __process_ulp_match_rules()
+{
+    cl_list_iterator_t list_iterator;
+    osm_qos_match_rule_t *p_qos_match_rule = NULL;
+
+    list_iterator = cl_list_head(&__ulp_match_rules);
+    while (list_iterator != cl_list_end(&__ulp_match_rules))
+    {
+        p_qos_match_rule = (osm_qos_match_rule_t *) cl_list_obj(list_iterator);
+        if (p_qos_match_rule)
+            cl_list_insert_tail(&p_qos_policy->qos_match_rules,
+                                p_qos_match_rule);
+        list_iterator = cl_list_next(list_iterator);
+    }
+    cl_list_remove_all(&__ulp_match_rules);
+}
+
+/***************************************************
+ ***************************************************/
+
+static int OSM_CDECL
+__cmp_num_range(
+    const void * p1,
+    const void * p2)
+{
+    uint64_t * pair1 = *((uint64_t **)p1);
+    uint64_t * pair2 = *((uint64_t **)p2);
+
+    if (pair1[0] < pair2[0])
+        return -1;
+    if (pair1[0] > pair2[0])
+        return 1;
+
+    if (pair1[1] < pair2[1])
+        return -1;
+    if (pair1[1] > pair2[1])
+        return 1;
+
+    return 0;
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __sort_reduce_rangearr(
+    uint64_t  **   arr,
+    unsigned       arr_len,
+    uint64_t  ** * p_res_arr,
+    unsigned     * p_res_arr_len )
+{
+    unsigned i = 0;
+    unsigned j = 0;
+    unsigned last_valid_ind = 0;
+    unsigned valid_cnt = 0;
+    uint64_t ** res_arr;
+    boolean_t * is_valid_arr;
+
+    *p_res_arr = NULL;
+    *p_res_arr_len = 0;
+
+    qsort(arr, arr_len, sizeof(uint64_t*), __cmp_num_range);
+
+    is_valid_arr = (boolean_t *)malloc(arr_len * sizeof(boolean_t));
+    is_valid_arr[last_valid_ind] = TRUE;
+    valid_cnt++;
+    for (i = 1; i < arr_len; i++)
+    {
+        if (arr[i][0] <= arr[last_valid_ind][1])
+        {
+            if (arr[i][1] > arr[last_valid_ind][1])
+                arr[last_valid_ind][1] = arr[i][1];
+            free(arr[i]);
+            arr[i] = NULL;
+            is_valid_arr[i] = FALSE;
+        }
+        else if ((arr[i][0] - 1) == arr[last_valid_ind][1])
+        {
+            arr[last_valid_ind][1] = arr[i][1];
+            free(arr[i]);
+            arr[i] = NULL;
+            is_valid_arr[i] = FALSE;
+        }
+        else
+        {
+            is_valid_arr[i] = TRUE;
+            last_valid_ind = i;
+            valid_cnt++;
+        }
+    }
+
+    res_arr = (uint64_t **)malloc(valid_cnt * sizeof(uint64_t *));
+    for (i = 0; i < arr_len; i++)
+    {
+        if (is_valid_arr[i])
+            res_arr[j++] = arr[i];
+    }
+    free(is_valid_arr);
+    free(arr);
+
+    *p_res_arr = res_arr;
+    *p_res_arr_len = valid_cnt;
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __pkey_rangelist2rangearr(
+    cl_list_t    * p_list,
+    uint64_t  ** * p_arr,
+    unsigned     * p_arr_len)
+{
+    uint64_t   tmp_pkey;
+    uint64_t * p_pkeys;
+    cl_list_iterator_t list_iterator;
+
+    list_iterator= cl_list_head(p_list);
+    while( list_iterator != cl_list_end(p_list) )
+    {
+       p_pkeys = (uint64_t *)cl_list_obj(list_iterator);
+       p_pkeys[0] &= 0x7fff;
+       p_pkeys[1] &= 0x7fff;
+       if (p_pkeys[0] > p_pkeys[1])
+       {
+           tmp_pkey = p_pkeys[1];
+           p_pkeys[1] = p_pkeys[0];
+           p_pkeys[0] = tmp_pkey;
+       }
+       list_iterator = cl_list_next(list_iterator);
+    }
+
+    __rangelist2rangearr(p_list, p_arr, p_arr_len);
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __rangelist2rangearr(
+    cl_list_t    * p_list,
+    uint64_t  ** * p_arr,
+    unsigned     * p_arr_len)
+{
+    cl_list_iterator_t list_iterator;
+    unsigned len = cl_list_count(p_list);
+    unsigned i = 0;
+    uint64_t ** tmp_arr;
+    uint64_t ** res_arr = NULL;
+    unsigned res_arr_len = 0;
+
+    tmp_arr = (uint64_t **)malloc(len * sizeof(uint64_t *));
+
+    list_iterator = cl_list_head(p_list);
+    while( list_iterator != cl_list_end(p_list) )
+    {
+       tmp_arr[i++] = (uint64_t *)cl_list_obj(list_iterator);
+       list_iterator = cl_list_next(list_iterator);
+    }
+    cl_list_remove_all(p_list);
+
+    __sort_reduce_rangearr( tmp_arr,
+                            len,
+                            &res_arr,
+                            &res_arr_len );
+    *p_arr = res_arr;
+    *p_arr_len = res_arr_len;
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __merge_rangearr(
+    uint64_t  **   range_arr_1,
+    unsigned       range_len_1,
+    uint64_t  **   range_arr_2,
+    unsigned       range_len_2,
+    uint64_t  ** * p_arr,
+    unsigned     * p_arr_len )
+{
+    unsigned i = 0;
+    unsigned j = 0;
+    unsigned len = range_len_1 + range_len_2;
+    uint64_t ** tmp_arr;
+    uint64_t ** res_arr = NULL;
+    unsigned res_arr_len = 0;
+
+    *p_arr = NULL;
+    *p_arr_len = 0;
+
+    tmp_arr = (uint64_t **)malloc(len * sizeof(uint64_t *));
+
+    for (i = 0; i < range_len_1; i++)
+       tmp_arr[j++] = range_arr_1[i];
+    for (i = 0; i < range_len_2; i++)
+       tmp_arr[j++] = range_arr_2[i];
+    free(range_arr_1);
+    free(range_arr_2);
+
+    __sort_reduce_rangearr( tmp_arr,
+                            len,
+                            &res_arr,
+                            &res_arr_len );
+    *p_arr = res_arr;
+    *p_arr_len = res_arr_len;
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_add_port_to_port_map(
+    cl_qmap_t   * p_map,
+    osm_physp_t * p_physp)
+{
+    if (cl_qmap_get(p_map, cl_ntoh64(osm_physp_get_port_guid(p_physp))) ==
+        cl_qmap_end(p_map))
+    {
+        osm_qos_port_t * p_port = osm_qos_policy_port_create(p_physp);
+        if (p_port)
+            cl_qmap_insert(p_map,
+                           cl_ntoh64(osm_physp_get_port_guid(p_physp)),
+                           &p_port->map_item);
+    }
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_add_guid_range_to_port_map(
+    cl_qmap_t  * p_map,
+    uint64_t  ** range_arr,
+    unsigned     range_len)
+{
+    unsigned i;
+    uint64_t guid_ho;
+    osm_port_t * p_osm_port;
+
+    if (!range_arr || !range_len)
+        return;
+
+    for (i = 0; i < range_len; i++) {
+         for (guid_ho = range_arr[i][0]; guid_ho <= range_arr[i][1]; guid_ho++) {
+             p_osm_port =
+                osm_get_port_by_guid(p_qos_policy->p_subn, cl_hton64(guid_ho));
+             if (p_osm_port)
+                 __parser_add_port_to_port_map(p_map, p_osm_port->p_physp);
+         }
+         free(range_arr[i]);
+    }
+    free(range_arr);
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_add_pkey_range_to_port_map(
+    cl_qmap_t  * p_map,
+    uint64_t  ** range_arr,
+    unsigned     range_len)
+{
+    unsigned i;
+    uint64_t pkey_64;
+    ib_net16_t pkey;
+    osm_prtn_t * p_prtn;
+
+    if (!range_arr || !range_len)
+        return;
+
+    for (i = 0; i < range_len; i++) {
+         for (pkey_64 = range_arr[i][0]; pkey_64 <= range_arr[i][1]; pkey_64++) {
+             pkey = cl_hton16((uint16_t)(pkey_64 & 0x7fff));
+             p_prtn = (osm_prtn_t *)
+                 cl_qmap_get(&p_qos_policy->p_subn->prtn_pkey_tbl, pkey);
+             if (p_prtn != (osm_prtn_t *)cl_qmap_end(
+                   &p_qos_policy->p_subn->prtn_pkey_tbl)) {
+                 __parser_add_map_to_port_map(p_map, &p_prtn->part_guid_tbl);
+                 __parser_add_map_to_port_map(p_map, &p_prtn->full_guid_tbl);
+             }
+         }
+         free(range_arr[i]);
+    }
+    free(range_arr);
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_add_partition_list_to_port_map(
+    cl_qmap_t  * p_map,
+    cl_list_t  * p_list)
+{
+    cl_list_iterator_t    list_iterator;
+    char                * tmp_str;
+    osm_prtn_t          * p_prtn;
+
+    /* extract all the ports from the partition
+       to the port map of this port group */
+    list_iterator = cl_list_head(p_list);
+    while(list_iterator != cl_list_end(p_list)) {
+        tmp_str = (char*)cl_list_obj(list_iterator);
+        if (tmp_str) {
+            p_prtn = osm_prtn_find_by_name(p_qos_policy->p_subn, tmp_str);
+            if (p_prtn) {
+                __parser_add_map_to_port_map(p_map, &p_prtn->part_guid_tbl);
+                __parser_add_map_to_port_map(p_map, &p_prtn->full_guid_tbl);
+            }
+            free(tmp_str);
+        }
+        list_iterator = cl_list_next(list_iterator);
+    }
+    cl_list_remove_all(p_list);
+}
+
+/***************************************************
+ ***************************************************/
+
+static void __parser_add_map_to_port_map(
+    cl_qmap_t * p_dmap,
+    cl_map_t  * p_smap)
+{
+    cl_map_iterator_t map_iterator;
+    osm_physp_t * p_physp;
+
+    if (!p_dmap || !p_smap)
+        return;
+
+    map_iterator = cl_map_head(p_smap);
+    while (map_iterator != cl_map_end(p_smap)) {
+        p_physp = (osm_physp_t*)cl_map_obj(map_iterator);
+        __parser_add_port_to_port_map(p_dmap, p_physp);
+        map_iterator = cl_map_next(map_iterator);
+    }
+}
+
+/***************************************************
+ ***************************************************/
+
+static int __validate_pkeys( uint64_t ** range_arr,
+                             unsigned    range_len,
+                             boolean_t   is_ipoib)
+{
+    unsigned i;
+    uint64_t pkey_64;
+    ib_net16_t pkey;
+    osm_prtn_t * p_prtn;
+
+    if (!range_arr || !range_len)
+        return 0;
+
+    for (i = 0; i < range_len; i++) {
+        for (pkey_64 = range_arr[i][0]; pkey_64 <= range_arr[i][1]; pkey_64++) {
+            pkey = cl_hton16((uint16_t)(pkey_64 & 0x7fff));
+            p_prtn = (osm_prtn_t *)
+                cl_qmap_get(&p_qos_policy->p_subn->prtn_pkey_tbl, pkey);
+
+            if (p_prtn == (osm_prtn_t *)cl_qmap_end(
+                  &p_qos_policy->p_subn->prtn_pkey_tbl))
+                p_prtn = NULL;
+
+            if (is_ipoib) {
+                /*
+                 * Be very strict for IPoIB partition:
+                 *  - the partition for the pkey have to exist
+                 *  - it has to have at least 2 full members
+                 */
+                if (!p_prtn) {
+                    yyerror("IPoIB partition, pkey 0x%04X - "
+                                       "partition doesn't exist",
+                                       cl_ntoh16(pkey));
+                    return 1;
+                }
+                else if (cl_map_count(&p_prtn->full_guid_tbl) < 2) {
+                    yyerror("IPoIB partition, pkey 0x%04X - "
+                                       "partition has less than two full members",
+                                       cl_ntoh16(pkey));
+                    return 1;
+                }
+            }
+            else if (!p_prtn) {
+                /*
+                 * For non-IPoIB pkey we just want to check that
+                 * the relevant partition exists.
+                 * And even if it doesn't, don't exit - just print
+                 * error message and continue.
+                 */
+                 OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC02: "
+			 "pkey 0x%04X - partition doesn't exist",
+                         cl_ntoh16(pkey));
+            }
+        }
+    }
+    return 0;
+}
+
+/***************************************************
+ ***************************************************/
-- 
1.5.5.1.178.g1f811




More information about the general mailing list