Blame opensm/osm_qos_parser_y.y

Packit Service 54dbc3
%{
Packit Service 54dbc3
/*
Packit Service 54dbc3
 * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
Packit Service 54dbc3
 * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved.
Packit Service 54dbc3
 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
Packit Service 54dbc3
 * Copyright (c) 2008 HNR Consulting. All rights reserved.
Packit Service 54dbc3
 *
Packit Service 54dbc3
 * This software is available to you under a choice of one of two
Packit Service 54dbc3
 * licenses.  You may choose to be licensed under the terms of the GNU
Packit Service 54dbc3
 * General Public License (GPL) Version 2, available from the file
Packit Service 54dbc3
 * COPYING in the main directory of this source tree, or the
Packit Service 54dbc3
 * OpenIB.org BSD license below:
Packit Service 54dbc3
 *
Packit Service 54dbc3
 *     Redistribution and use in source and binary forms, with or
Packit Service 54dbc3
 *     without modification, are permitted provided that the following
Packit Service 54dbc3
 *     conditions are met:
Packit Service 54dbc3
 *
Packit Service 54dbc3
 *      - Redistributions of source code must retain the above
Packit Service 54dbc3
 *        copyright notice, this list of conditions and the following
Packit Service 54dbc3
 *        disclaimer.
Packit Service 54dbc3
 *
Packit Service 54dbc3
 *      - Redistributions in binary form must reproduce the above
Packit Service 54dbc3
 *        copyright notice, this list of conditions and the following
Packit Service 54dbc3
 *        disclaimer in the documentation and/or other materials
Packit Service 54dbc3
 *        provided with the distribution.
Packit Service 54dbc3
 *
Packit Service 54dbc3
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Packit Service 54dbc3
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit Service 54dbc3
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Packit Service 54dbc3
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
Packit Service 54dbc3
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
Packit Service 54dbc3
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit Service 54dbc3
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Packit Service 54dbc3
 * SOFTWARE.
Packit Service 54dbc3
 *
Packit Service 54dbc3
 */
Packit Service 54dbc3
Packit Service 54dbc3
/*
Packit Service 54dbc3
 * Abstract:
Packit Service 54dbc3
 *    Grammar of OSM QoS parser.
Packit Service 54dbc3
 *
Packit Service 54dbc3
 * Environment:
Packit Service 54dbc3
 *    Linux User Mode
Packit Service 54dbc3
 *
Packit Service 54dbc3
 * Author:
Packit Service 54dbc3
 *    Yevgeny Kliteynik, Mellanox
Packit Service 54dbc3
 */
Packit Service 54dbc3
Packit Service 54dbc3
#include <stdio.h>
Packit Service 54dbc3
#include <assert.h>
Packit Service 54dbc3
#include <stdarg.h>
Packit Service 54dbc3
#include <stdlib.h>
Packit Service 54dbc3
#include <string.h>
Packit Service 54dbc3
#include <ctype.h>
Packit Service 54dbc3
#include <errno.h>
Packit Service 54dbc3
#include <opensm/osm_file_ids.h>
Packit Service 54dbc3
#define FILE_ID OSM_FILE_QOS_PARSER_Y_Y
Packit Service 54dbc3
#include <opensm/osm_opensm.h>
Packit Service 54dbc3
#include <opensm/osm_qos_policy.h>
Packit Service 54dbc3
Packit Service 54dbc3
#define OSM_QOS_POLICY_MAX_LINE_LEN         1024*10
Packit Service 54dbc3
#define OSM_QOS_POLICY_SL2VL_TABLE_LEN      IB_MAX_NUM_VLS
Packit Service 54dbc3
#define OSM_QOS_POLICY_MAX_VL_NUM           IB_MAX_NUM_VLS
Packit Service 54dbc3
#define OSM_QOS_POLICY_MAX_RATE             IB_MAX_RATE
Packit Service 54dbc3
#define OSM_QOS_POLICY_MIN_RATE             IB_MIN_RATE
Packit Service 54dbc3
#define OSM_QOS_POLICY_MAX_MTU              IB_MAX_MTU
Packit Service 54dbc3
#define OSM_QOS_POLICY_MIN_MTU              IB_MIN_MTU
Packit Service 54dbc3
Packit Service 54dbc3
typedef struct tmp_parser_struct_t_ {
Packit Service 54dbc3
    char       str[OSM_QOS_POLICY_MAX_LINE_LEN];
Packit Service 54dbc3
    uint64_t   num_pair[2];
Packit Service 54dbc3
    cl_list_t  str_list;
Packit Service 54dbc3
    cl_list_t  num_list;
Packit Service 54dbc3
    cl_list_t  num_pair_list;
Packit Service 54dbc3
} tmp_parser_struct_t;
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_tmp_struct_init();
Packit Service 54dbc3
static void __parser_tmp_struct_reset();
Packit Service 54dbc3
static void __parser_tmp_struct_destroy();
Packit Service 54dbc3
Packit Service 54dbc3
static char * __parser_strip_white(char * str);
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_str2uint64(uint64_t * p_val, char * str);
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_port_group_start();
Packit Service 54dbc3
static int __parser_port_group_end();
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_sl2vl_scope_start();
Packit Service 54dbc3
static int __parser_sl2vl_scope_end();
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_vlarb_scope_start();
Packit Service 54dbc3
static int __parser_vlarb_scope_end();
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_qos_level_start();
Packit Service 54dbc3
static int __parser_qos_level_end();
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_match_rule_start();
Packit Service 54dbc3
static int __parser_match_rule_end();
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_ulp_match_rule_start();
Packit Service 54dbc3
static int __parser_ulp_match_rule_end();
Packit Service 54dbc3
Packit Service 54dbc3
static void __pkey_rangelist2rangearr(
Packit Service 54dbc3
    cl_list_t    * p_list,
Packit Service 54dbc3
    uint64_t  ** * p_arr,
Packit Service 54dbc3
    unsigned     * p_arr_len);
Packit Service 54dbc3
Packit Service 54dbc3
static void __rangelist2rangearr(
Packit Service 54dbc3
    cl_list_t    * p_list,
Packit Service 54dbc3
    uint64_t  ** * p_arr,
Packit Service 54dbc3
    unsigned     * p_arr_len);
Packit Service 54dbc3
Packit Service 54dbc3
static void __merge_rangearr(
Packit Service 54dbc3
    uint64_t  **   range_arr_1,
Packit Service 54dbc3
    unsigned       range_len_1,
Packit Service 54dbc3
    uint64_t  **   range_arr_2,
Packit Service 54dbc3
    unsigned       range_len_2,
Packit Service 54dbc3
    uint64_t  ** * p_arr,
Packit Service 54dbc3
    unsigned     * p_arr_len );
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_add_port_to_port_map(
Packit Service 54dbc3
    cl_qmap_t   * p_map,
Packit Service 54dbc3
    osm_physp_t * p_physp);
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_add_guid_range_to_port_map(
Packit Service 54dbc3
    cl_qmap_t  * p_map,
Packit Service 54dbc3
    uint64_t  ** range_arr,
Packit Service 54dbc3
    unsigned     range_len);
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_add_pkey_range_to_port_map(
Packit Service 54dbc3
    cl_qmap_t  * p_map,
Packit Service 54dbc3
    uint64_t  ** range_arr,
Packit Service 54dbc3
    unsigned     range_len);
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_add_partition_list_to_port_map(
Packit Service 54dbc3
    cl_qmap_t  * p_map,
Packit Service 54dbc3
    cl_list_t  * p_list);
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_add_map_to_port_map(
Packit Service 54dbc3
    cl_qmap_t * p_dmap,
Packit Service 54dbc3
    cl_map_t  * p_smap);
Packit Service 54dbc3
Packit Service 54dbc3
static int __validate_pkeys(
Packit Service 54dbc3
    uint64_t ** range_arr,
Packit Service 54dbc3
    unsigned    range_len,
Packit Service 54dbc3
    boolean_t   is_ipoib);
Packit Service 54dbc3
Packit Service 54dbc3
static void __setup_simple_qos_levels();
Packit Service 54dbc3
static void __clear_simple_qos_levels();
Packit Service 54dbc3
static void __setup_ulp_match_rules();
Packit Service 54dbc3
static void __process_ulp_match_rules();
Packit Service 54dbc3
static void yyerror(const char *format, ...);
Packit Service 54dbc3
Packit Service 54dbc3
extern char * yytext;
Packit Service 54dbc3
extern int yylex (void);
Packit Service 54dbc3
extern FILE * yyin;
Packit Service 54dbc3
extern int errno;
Packit Service 54dbc3
extern void yyrestart(FILE *input_file);
Packit Service 54dbc3
int yyparse();
Packit Service 54dbc3
Packit Service 54dbc3
#define RESET_BUFFER  __parser_tmp_struct_reset()
Packit Service 54dbc3
Packit Service 54dbc3
tmp_parser_struct_t tmp_parser_struct;
Packit Service 54dbc3
Packit Service 54dbc3
int column_num;
Packit Service 54dbc3
int line_num;
Packit Service 54dbc3
Packit Service 54dbc3
osm_qos_policy_t       * p_qos_policy = NULL;
Packit Service 54dbc3
osm_qos_port_group_t   * p_current_port_group = NULL;
Packit Service 54dbc3
osm_qos_sl2vl_scope_t  * p_current_sl2vl_scope = NULL;
Packit Service 54dbc3
osm_qos_vlarb_scope_t  * p_current_vlarb_scope = NULL;
Packit Service 54dbc3
osm_qos_level_t        * p_current_qos_level = NULL;
Packit Service 54dbc3
osm_qos_match_rule_t   * p_current_qos_match_rule = NULL;
Packit Service 54dbc3
osm_log_t              * p_qos_parser_osm_log;
Packit Service 54dbc3
Packit Service 54dbc3
/* 16 Simple QoS Levels - one for each SL */
Packit Service 54dbc3
static osm_qos_level_t osm_qos_policy_simple_qos_levels[16];
Packit Service 54dbc3
Packit Service 54dbc3
/* Default Simple QoS Level */
Packit Service 54dbc3
osm_qos_level_t __default_simple_qos_level;
Packit Service 54dbc3
Packit Service 54dbc3
/*
Packit Service 54dbc3
 * List of match rules that will be generated by the
Packit Service 54dbc3
 * qos-ulp section. These rules are concatenated to
Packit Service 54dbc3
 * the end of the usual matching rules list at the
Packit Service 54dbc3
 * end of parsing.
Packit Service 54dbc3
 */
Packit Service 54dbc3
static cl_list_t __ulp_match_rules;
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
%}
Packit Service 54dbc3
Packit Service 54dbc3
%token TK_NUMBER
Packit Service 54dbc3
%token TK_DASH
Packit Service 54dbc3
%token TK_DOTDOT
Packit Service 54dbc3
%token TK_COMMA
Packit Service 54dbc3
%token TK_ASTERISK
Packit Service 54dbc3
%token TK_TEXT
Packit Service 54dbc3
Packit Service 54dbc3
%token TK_QOS_ULPS_START
Packit Service 54dbc3
%token TK_QOS_ULPS_END
Packit Service 54dbc3
Packit Service 54dbc3
%token TK_PORT_GROUPS_START
Packit Service 54dbc3
%token TK_PORT_GROUPS_END
Packit Service 54dbc3
%token TK_PORT_GROUP_START
Packit Service 54dbc3
%token TK_PORT_GROUP_END
Packit Service 54dbc3
Packit Service 54dbc3
%token TK_QOS_SETUP_START
Packit Service 54dbc3
%token TK_QOS_SETUP_END
Packit Service 54dbc3
%token TK_VLARB_TABLES_START
Packit Service 54dbc3
%token TK_VLARB_TABLES_END
Packit Service 54dbc3
%token TK_VLARB_SCOPE_START
Packit Service 54dbc3
%token TK_VLARB_SCOPE_END
Packit Service 54dbc3
Packit Service 54dbc3
%token TK_SL2VL_TABLES_START
Packit Service 54dbc3
%token TK_SL2VL_TABLES_END
Packit Service 54dbc3
%token TK_SL2VL_SCOPE_START
Packit Service 54dbc3
%token TK_SL2VL_SCOPE_END
Packit Service 54dbc3
Packit Service 54dbc3
%token TK_QOS_LEVELS_START
Packit Service 54dbc3
%token TK_QOS_LEVELS_END
Packit Service 54dbc3
%token TK_QOS_LEVEL_START
Packit Service 54dbc3
%token TK_QOS_LEVEL_END
Packit Service 54dbc3
Packit Service 54dbc3
%token TK_QOS_MATCH_RULES_START
Packit Service 54dbc3
%token TK_QOS_MATCH_RULES_END
Packit Service 54dbc3
%token TK_QOS_MATCH_RULE_START
Packit Service 54dbc3
%token TK_QOS_MATCH_RULE_END
Packit Service 54dbc3
Packit Service 54dbc3
%token TK_NAME
Packit Service 54dbc3
%token TK_USE
Packit Service 54dbc3
%token TK_PORT_GUID
Packit Service 54dbc3
%token TK_PORT_NAME
Packit Service 54dbc3
%token TK_PARTITION
Packit Service 54dbc3
%token TK_NODE_TYPE
Packit Service 54dbc3
%token TK_GROUP
Packit Service 54dbc3
%token TK_ACROSS
Packit Service 54dbc3
%token TK_VLARB_HIGH
Packit Service 54dbc3
%token TK_VLARB_LOW
Packit Service 54dbc3
%token TK_VLARB_HIGH_LIMIT
Packit Service 54dbc3
%token TK_TO
Packit Service 54dbc3
%token TK_FROM
Packit Service 54dbc3
%token TK_ACROSS_TO
Packit Service 54dbc3
%token TK_ACROSS_FROM
Packit Service 54dbc3
%token TK_SL2VL_TABLE
Packit Service 54dbc3
%token TK_SL
Packit Service 54dbc3
%token TK_MTU_LIMIT
Packit Service 54dbc3
%token TK_RATE_LIMIT
Packit Service 54dbc3
%token TK_PACKET_LIFE
Packit Service 54dbc3
%token TK_PATH_BITS
Packit Service 54dbc3
%token TK_QOS_CLASS
Packit Service 54dbc3
%token TK_SOURCE
Packit Service 54dbc3
%token TK_DESTINATION
Packit Service 54dbc3
%token TK_SERVICE_ID
Packit Service 54dbc3
%token TK_QOS_LEVEL_NAME
Packit Service 54dbc3
%token TK_PKEY
Packit Service 54dbc3
Packit Service 54dbc3
%token TK_NODE_TYPE_ROUTER
Packit Service 54dbc3
%token TK_NODE_TYPE_CA
Packit Service 54dbc3
%token TK_NODE_TYPE_SWITCH
Packit Service 54dbc3
%token TK_NODE_TYPE_SELF
Packit Service 54dbc3
%token TK_NODE_TYPE_ALL
Packit Service 54dbc3
Packit Service 54dbc3
%token TK_ULP_DEFAULT
Packit Service 54dbc3
%token TK_ULP_ANY_SERVICE_ID
Packit Service 54dbc3
%token TK_ULP_ANY_PKEY
Packit Service 54dbc3
%token TK_ULP_ANY_TARGET_PORT_GUID
Packit Service 54dbc3
%token TK_ULP_ANY_SOURCE_PORT_GUID
Packit Service 54dbc3
%token TK_ULP_ANY_SOURCE_TARGET_PORT_GUID
Packit Service 54dbc3
%token TK_ULP_SDP_DEFAULT
Packit Service 54dbc3
%token TK_ULP_SDP_PORT
Packit Service 54dbc3
%token TK_ULP_RDS_DEFAULT
Packit Service 54dbc3
%token TK_ULP_RDS_PORT
Packit Service 54dbc3
%token TK_ULP_ISER_DEFAULT
Packit Service 54dbc3
%token TK_ULP_ISER_PORT
Packit Service 54dbc3
%token TK_ULP_SRP_GUID
Packit Service 54dbc3
%token TK_ULP_IPOIB_DEFAULT
Packit Service 54dbc3
%token TK_ULP_IPOIB_PKEY
Packit Service 54dbc3
Packit Service 54dbc3
%start head
Packit Service 54dbc3
Packit Service 54dbc3
%%
Packit Service 54dbc3
Packit Service 54dbc3
head:               qos_policy_entries
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_policy_entries: /* empty */
Packit Service 54dbc3
                    | qos_policy_entries qos_policy_entry
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_policy_entry:     qos_ulps_section
Packit Service 54dbc3
                    | port_groups_section
Packit Service 54dbc3
                    | qos_setup_section
Packit Service 54dbc3
                    | qos_levels_section
Packit Service 54dbc3
                    | qos_match_rules_section
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     * Parsing qos-ulps:
Packit Service 54dbc3
     * -------------------
Packit Service 54dbc3
     *  qos-ulps
Packit Service 54dbc3
     *      default                       : 0 #default SL
Packit Service 54dbc3
     *      sdp, port-num 30000           : 1 #SL for SDP when destination port is 30000
Packit Service 54dbc3
     *      sdp, port-num 10000-20000     : 2
Packit Service 54dbc3
     *      sdp                           : 0 #default SL for SDP
Packit Service 54dbc3
     *      srp, target-port-guid 0x1234  : 2
Packit Service 54dbc3
     *      rds, port-num 25000           : 2 #SL for RDS when destination port is 25000
Packit Service 54dbc3
     *      rds,                          : 0 #default SL for RDS
Packit Service 54dbc3
     *      iser, port-num 900            : 5 #SL for iSER where target port is 900
Packit Service 54dbc3
     *      iser                          : 4 #default SL for iSER
Packit Service 54dbc3
     *      ipoib, pkey 0x0001            : 5 #SL for IPoIB on partition with pkey 0x0001
Packit Service 54dbc3
     *      ipoib                         : 6 #default IPoIB partition - pkey=0x7FFF
Packit Service 54dbc3
     *      any, service-id 0x6234        : 2
Packit Service 54dbc3
     *      any, pkey 0x0ABC              : 3
Packit Service 54dbc3
     *      any, target-port-guid 0x0ABC-0xFFFFF : 6
Packit Service 54dbc3
     *      any, source-port-guid 0x1234  : 7
Packit Service 54dbc3
     *      any, source-target-port-guid 0x5678 : 8
Packit Service 54dbc3
     *  end-qos-ulps
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulps_section: TK_QOS_ULPS_START qos_ulps TK_QOS_ULPS_END
Packit Service 54dbc3
                     ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulps:             qos_ulp
Packit Service 54dbc3
                    | qos_ulps qos_ulp
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     * Parsing port groups:
Packit Service 54dbc3
     * -------------------
Packit Service 54dbc3
     *  port-groups
Packit Service 54dbc3
     *       port-group
Packit Service 54dbc3
     *          name: Storage
Packit Service 54dbc3
     *          use: our SRP storage targets
Packit Service 54dbc3
     *          port-guid: 0x1000000000000001,0x1000000000000002
Packit Service 54dbc3
     *          ...
Packit Service 54dbc3
     *          port-name: vs1 HCA-1/P1
Packit Service 54dbc3
     *          port-name: node_description/P2
Packit Service 54dbc3
     *          ...
Packit Service 54dbc3
     *          pkey: 0x00FF-0x0FFF
Packit Service 54dbc3
     *          ...
Packit Service 54dbc3
     *          partition: Part1
Packit Service 54dbc3
     *          ...
Packit Service 54dbc3
     *          node-type: ROUTER,CA,SWITCH,SELF,ALL
Packit Service 54dbc3
     *          ...
Packit Service 54dbc3
     *      end-port-group
Packit Service 54dbc3
     *      port-group
Packit Service 54dbc3
     *          ...
Packit Service 54dbc3
     *      end-port-group
Packit Service 54dbc3
     *  end-port-groups
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
port_groups_section: TK_PORT_GROUPS_START port_groups TK_PORT_GROUPS_END
Packit Service 54dbc3
                     ;
Packit Service 54dbc3
Packit Service 54dbc3
port_groups:        port_group
Packit Service 54dbc3
                    | port_groups port_group
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group:         port_group_start port_group_entries port_group_end
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_start:   TK_PORT_GROUP_START {
Packit Service 54dbc3
                        __parser_port_group_start();
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_end:     TK_PORT_GROUP_END {
Packit Service 54dbc3
                        if ( __parser_port_group_end() )
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_entries: /* empty */
Packit Service 54dbc3
                    | port_group_entries port_group_entry
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_entry:     port_group_name
Packit Service 54dbc3
                    | port_group_use
Packit Service 54dbc3
                    | port_group_port_guid
Packit Service 54dbc3
                    | port_group_port_name
Packit Service 54dbc3
                    | port_group_pkey
Packit Service 54dbc3
                    | port_group_partition
Packit Service 54dbc3
                    | port_group_node_type
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     * Parsing qos setup:
Packit Service 54dbc3
     * -----------------
Packit Service 54dbc3
     *  qos-setup
Packit Service 54dbc3
     *      vlarb-tables
Packit Service 54dbc3
     *          vlarb-scope
Packit Service 54dbc3
     *              ...
Packit Service 54dbc3
     *          end-vlarb-scope
Packit Service 54dbc3
     *          vlarb-scope
Packit Service 54dbc3
     *              ...
Packit Service 54dbc3
     *          end-vlarb-scope
Packit Service 54dbc3
     *     end-vlarb-tables
Packit Service 54dbc3
     *     sl2vl-tables
Packit Service 54dbc3
     *          sl2vl-scope
Packit Service 54dbc3
     *              ...
Packit Service 54dbc3
     *         end-sl2vl-scope
Packit Service 54dbc3
     *         sl2vl-scope
Packit Service 54dbc3
     *              ...
Packit Service 54dbc3
     *          end-sl2vl-scope
Packit Service 54dbc3
     *     end-sl2vl-tables
Packit Service 54dbc3
     *  end-qos-setup
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
qos_setup_section:  TK_QOS_SETUP_START qos_setup_items TK_QOS_SETUP_END
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_setup_items:    /* empty */
Packit Service 54dbc3
                    | qos_setup_items vlarb_tables
Packit Service 54dbc3
                    | qos_setup_items sl2vl_tables
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
    /* Parsing vlarb-tables */
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_tables:       TK_VLARB_TABLES_START vlarb_scope_items TK_VLARB_TABLES_END
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_items:  /* empty */
Packit Service 54dbc3
                    | vlarb_scope_items vlarb_scope
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope:        vlarb_scope_start vlarb_scope_entries vlarb_scope_end
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_start:  TK_VLARB_SCOPE_START {
Packit Service 54dbc3
                        __parser_vlarb_scope_start();
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_end:    TK_VLARB_SCOPE_END {
Packit Service 54dbc3
                        if ( __parser_vlarb_scope_end() )
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_entries:/* empty */
Packit Service 54dbc3
                    | vlarb_scope_entries vlarb_scope_entry
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     *          vlarb-scope
Packit Service 54dbc3
     *              group: Storage
Packit Service 54dbc3
     *              ...
Packit Service 54dbc3
     *              across: Storage
Packit Service 54dbc3
     *              ...
Packit Service 54dbc3
     *              vlarb-high: 0:255,1:127,2:63,3:31,4:15,5:7,6:3,7:1
Packit Service 54dbc3
     *              vlarb-low: 8:255,9:127,10:63,11:31,12:15,13:7,14:3
Packit Service 54dbc3
     *              vl-high-limit: 10
Packit Service 54dbc3
     *          end-vlarb-scope
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_entry:    vlarb_scope_group
Packit Service 54dbc3
                    | vlarb_scope_across
Packit Service 54dbc3
                    | vlarb_scope_vlarb_high
Packit Service 54dbc3
                    | vlarb_scope_vlarb_low
Packit Service 54dbc3
                    | vlarb_scope_vlarb_high_limit
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
    /* Parsing sl2vl-tables */
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_tables:       TK_SL2VL_TABLES_START sl2vl_scope_items TK_SL2VL_TABLES_END
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_items:  /* empty */
Packit Service 54dbc3
                    | sl2vl_scope_items sl2vl_scope
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope:        sl2vl_scope_start sl2vl_scope_entries sl2vl_scope_end
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_start:  TK_SL2VL_SCOPE_START {
Packit Service 54dbc3
                        __parser_sl2vl_scope_start();
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_end:    TK_SL2VL_SCOPE_END {
Packit Service 54dbc3
                        if ( __parser_sl2vl_scope_end() )
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_entries:/* empty */
Packit Service 54dbc3
                    | sl2vl_scope_entries sl2vl_scope_entry
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     *          sl2vl-scope
Packit Service 54dbc3
     *              group: Part1
Packit Service 54dbc3
     *              ...
Packit Service 54dbc3
     *              from: *
Packit Service 54dbc3
     *              ...
Packit Service 54dbc3
     *              to: *
Packit Service 54dbc3
     *              ...
Packit Service 54dbc3
     *              across-to: Storage2
Packit Service 54dbc3
     *              ...
Packit Service 54dbc3
     *              across-from: Storage1
Packit Service 54dbc3
     *              ...
Packit Service 54dbc3
     *              sl2vl-table: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,7
Packit Service 54dbc3
     *          end-sl2vl-scope
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_entry:    sl2vl_scope_group
Packit Service 54dbc3
                    | sl2vl_scope_across
Packit Service 54dbc3
                    | sl2vl_scope_across_from
Packit Service 54dbc3
                    | sl2vl_scope_across_to
Packit Service 54dbc3
                    | sl2vl_scope_from
Packit Service 54dbc3
                    | sl2vl_scope_to
Packit Service 54dbc3
                    | sl2vl_scope_sl2vl_table
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     * Parsing qos-levels:
Packit Service 54dbc3
     * ------------------
Packit Service 54dbc3
     *  qos-levels
Packit Service 54dbc3
     *      qos-level
Packit Service 54dbc3
     *          name: qos_level_1
Packit Service 54dbc3
     *          use: for the lowest priority communication
Packit Service 54dbc3
     *          sl: 15
Packit Service 54dbc3
     *          mtu-limit: 1
Packit Service 54dbc3
     *          rate-limit: 1
Packit Service 54dbc3
     *          packet-life: 12
Packit Service 54dbc3
     *          path-bits: 2,4,8-32
Packit Service 54dbc3
     *          pkey: 0x00FF-0x0FFF
Packit Service 54dbc3
     *      end-qos-level
Packit Service 54dbc3
     *          ...
Packit Service 54dbc3
     *      qos-level
Packit Service 54dbc3
     *    end-qos-level
Packit Service 54dbc3
     *  end-qos-levels
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
qos_levels_section: TK_QOS_LEVELS_START qos_levels TK_QOS_LEVELS_END
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_levels:         /* empty */
Packit Service 54dbc3
                    | qos_levels qos_level
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level:          qos_level_start qos_level_entries qos_level_end
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_start:    TK_QOS_LEVEL_START {
Packit Service 54dbc3
                        __parser_qos_level_start();
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_end:      TK_QOS_LEVEL_END {
Packit Service 54dbc3
                        if ( __parser_qos_level_end() )
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_entries:  /* empty */
Packit Service 54dbc3
                    | qos_level_entries qos_level_entry
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_entry:      qos_level_name
Packit Service 54dbc3
                    | qos_level_use
Packit Service 54dbc3
                    | qos_level_sl
Packit Service 54dbc3
                    | qos_level_mtu_limit
Packit Service 54dbc3
                    | qos_level_rate_limit
Packit Service 54dbc3
                    | qos_level_packet_life
Packit Service 54dbc3
                    | qos_level_path_bits
Packit Service 54dbc3
                    | qos_level_pkey
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     * Parsing qos-match-rules:
Packit Service 54dbc3
     * -----------------------
Packit Service 54dbc3
     *  qos-match-rules
Packit Service 54dbc3
     *      qos-match-rule
Packit Service 54dbc3
     *          use: low latency by class 7-9 or 11 and bla bla
Packit Service 54dbc3
     *          qos-class: 7-9,11
Packit Service 54dbc3
     *          qos-level-name: default
Packit Service 54dbc3
     *          source: Storage
Packit Service 54dbc3
     *          destination: Storage
Packit Service 54dbc3
     *          service-id: 22,4719-5000
Packit Service 54dbc3
     *          pkey: 0x00FF-0x0FFF
Packit Service 54dbc3
     *      end-qos-match-rule
Packit Service 54dbc3
     *      qos-match-rule
Packit Service 54dbc3
     *          ...
Packit Service 54dbc3
     *      end-qos-match-rule
Packit Service 54dbc3
     *  end-qos-match-rules
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rules_section: TK_QOS_MATCH_RULES_START qos_match_rules TK_QOS_MATCH_RULES_END
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rules:    /* empty */
Packit Service 54dbc3
                    | qos_match_rules qos_match_rule
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule:     qos_match_rule_start qos_match_rule_entries qos_match_rule_end
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_start: TK_QOS_MATCH_RULE_START {
Packit Service 54dbc3
                        __parser_match_rule_start();
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_end: TK_QOS_MATCH_RULE_END {
Packit Service 54dbc3
                        if ( __parser_match_rule_end() )
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_entries: /* empty */
Packit Service 54dbc3
                    | qos_match_rule_entries qos_match_rule_entry
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_entry: qos_match_rule_use
Packit Service 54dbc3
                    | qos_match_rule_qos_class
Packit Service 54dbc3
                    | qos_match_rule_qos_level_name
Packit Service 54dbc3
                    | qos_match_rule_source
Packit Service 54dbc3
                    | qos_match_rule_destination
Packit Service 54dbc3
                    | qos_match_rule_service_id
Packit Service 54dbc3
                    | qos_match_rule_pkey
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     * Parsing qos-ulps:
Packit Service 54dbc3
     * -----------------
Packit Service 54dbc3
     *   default
Packit Service 54dbc3
     *   sdp
Packit Service 54dbc3
     *   sdp with port-num
Packit Service 54dbc3
     *   rds
Packit Service 54dbc3
     *   rds with port-num
Packit Service 54dbc3
     *   srp with target-port-guid
Packit Service 54dbc3
     *   iser
Packit Service 54dbc3
     *   iser with port-num
Packit Service 54dbc3
     *   ipoib
Packit Service 54dbc3
     *   ipoib with pkey
Packit Service 54dbc3
     *   any with service-id
Packit Service 54dbc3
     *   any with pkey
Packit Service 54dbc3
     *   any with target-port-guid
Packit Service 54dbc3
     *   any with source-port-guid
Packit Service 54dbc3
     *   any with source-target-port-guid
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp:            TK_ULP_DEFAULT single_number {
Packit Service 54dbc3
                        /* parsing default ulp rule: "default: num" */
Packit Service 54dbc3
                        cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                        uint64_t            * p_tmp_num;
Packit Service 54dbc3
Packit Service 54dbc3
                        list_iterator = cl_list_head(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                        p_tmp_num = (uint64_t*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                        if (*p_tmp_num > 15)
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            yyerror("illegal SL value");
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        __default_simple_qos_level.sl = (uint8_t)(*p_tmp_num);
Packit Service 54dbc3
                        __default_simple_qos_level.sl_set = TRUE;
Packit Service 54dbc3
                        free(p_tmp_num);
Packit Service 54dbc3
                        cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
Packit Service 54dbc3
                    | qos_ulp_type_any_service list_of_ranges TK_DOTDOT {
Packit Service 54dbc3
                        /* "any, service-id ... : sl" - one instance of list of ranges */
Packit Service 54dbc3
                        uint64_t ** range_arr;
Packit Service 54dbc3
                        unsigned    range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            yyerror("ULP rule doesn't have service ids");
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
Packit Service 54dbc3
                        /* get all the service id ranges */
Packit Service 54dbc3
                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                              &range_arr,
Packit Service 54dbc3
                                              &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_arr = range_arr;
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_len = range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
                    | qos_ulp_type_any_pkey list_of_ranges TK_DOTDOT {
Packit Service 54dbc3
                        /* "any, pkey ... : sl" - one instance of list of ranges */
Packit Service 54dbc3
                        uint64_t ** range_arr;
Packit Service 54dbc3
                        unsigned    range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            yyerror("ULP rule doesn't have pkeys");
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
Packit Service 54dbc3
                        /* get all the pkey ranges */
Packit Service 54dbc3
                        __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                              &range_arr,
Packit Service 54dbc3
                                              &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_qos_match_rule->pkey_range_arr = range_arr;
Packit Service 54dbc3
                        p_current_qos_match_rule->pkey_range_len = range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
                    | qos_ulp_type_any_target_port_guid list_of_ranges TK_DOTDOT {
Packit Service 54dbc3
                        /* any, target-port-guid ... : sl */
Packit Service 54dbc3
                        uint64_t ** range_arr;
Packit Service 54dbc3
                        unsigned    range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            yyerror("ULP rule doesn't have port guids");
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
Packit Service 54dbc3
                        /* create a new port group with these ports */
Packit Service 54dbc3
                        __parser_port_group_start();
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_port_group->name = strdup("_ULP_Targets_");
Packit Service 54dbc3
                        p_current_port_group->use = strdup("Generated from ULP rules");
Packit Service 54dbc3
Packit Service 54dbc3
                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                              &range_arr,
Packit Service 54dbc3
                                              &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                        __parser_add_guid_range_to_port_map(
Packit Service 54dbc3
                                              &p_current_port_group->port_map,
Packit Service 54dbc3
                                              range_arr,
Packit Service 54dbc3
                                              range_len);
Packit Service 54dbc3
Packit Service 54dbc3
                        /* add this port group to the destination
Packit Service 54dbc3
                           groups of the current match rule */
Packit Service 54dbc3
                        cl_list_insert_tail(&p_current_qos_match_rule->destination_group_list,
Packit Service 54dbc3
                                            p_current_port_group);
Packit Service 54dbc3
Packit Service 54dbc3
                        __parser_port_group_end();
Packit Service 54dbc3
Packit Service 54dbc3
                    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
		    | qos_ulp_type_any_source_port_guid list_of_ranges TK_DOTDOT {
Packit Service 54dbc3
			/* any, source-port-guid ... : sl */
Packit Service 54dbc3
			uint64_t ** range_arr;
Packit Service 54dbc3
			unsigned    range_len;
Packit Service 54dbc3
Packit Service 54dbc3
			if (!cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
			{
Packit Service 54dbc3
				yyerror("ULP rule doesn't have port guids");
Packit Service 54dbc3
				return 1;
Packit Service 54dbc3
			}
Packit Service 54dbc3
Packit Service 54dbc3
                        /* create a new port group with these ports */
Packit Service 54dbc3
                        __parser_port_group_start();
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_port_group->name = strdup("_ULP_Sources_");
Packit Service 54dbc3
                        p_current_port_group->use = strdup("Generated from ULP rules");
Packit Service 54dbc3
Packit Service 54dbc3
                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                              &range_arr,
Packit Service 54dbc3
                                              &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                        __parser_add_guid_range_to_port_map(
Packit Service 54dbc3
                                              &p_current_port_group->port_map,
Packit Service 54dbc3
                                              range_arr,
Packit Service 54dbc3
                                              range_len);
Packit Service 54dbc3
Packit Service 54dbc3
                        /* add this port group to the source
Packit Service 54dbc3
                           groups of the current match rule */
Packit Service 54dbc3
                        cl_list_insert_tail(&p_current_qos_match_rule->source_group_list,
Packit Service 54dbc3
                                            p_current_port_group);
Packit Service 54dbc3
Packit Service 54dbc3
                        __parser_port_group_end();
Packit Service 54dbc3
Packit Service 54dbc3
		    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
		    | qos_ulp_type_any_source_target_port_guid list_of_ranges TK_DOTDOT {
Packit Service 54dbc3
			/* any, source-target-port-guid ... : sl */
Packit Service 54dbc3
			uint64_t ** range_arr;
Packit Service 54dbc3
			unsigned    range_len;
Packit Service 54dbc3
Packit Service 54dbc3
			if (!cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
			{
Packit Service 54dbc3
				yyerror("ULP rule doesn't have port guids");
Packit Service 54dbc3
				return 1;
Packit Service 54dbc3
			}
Packit Service 54dbc3
Packit Service 54dbc3
                        /* create a new port group with these ports */
Packit Service 54dbc3
                        __parser_port_group_start();
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_port_group->name = strdup("_ULP_Sources_Targets_");
Packit Service 54dbc3
                        p_current_port_group->use = strdup("Generated from ULP rules");
Packit Service 54dbc3
Packit Service 54dbc3
                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                              &range_arr,
Packit Service 54dbc3
                                              &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                        __parser_add_guid_range_to_port_map(
Packit Service 54dbc3
                                              &p_current_port_group->port_map,
Packit Service 54dbc3
                                              range_arr,
Packit Service 54dbc3
                                              range_len);
Packit Service 54dbc3
Packit Service 54dbc3
                        /* add this port group to the source and destination
Packit Service 54dbc3
                           groups of the current match rule */
Packit Service 54dbc3
                        cl_list_insert_tail(&p_current_qos_match_rule->source_group_list,
Packit Service 54dbc3
                                            p_current_port_group);
Packit Service 54dbc3
Packit Service 54dbc3
                        cl_list_insert_tail(&p_current_qos_match_rule->destination_group_list,
Packit Service 54dbc3
                                            p_current_port_group);
Packit Service 54dbc3
Packit Service 54dbc3
                        __parser_port_group_end();
Packit Service 54dbc3
Packit Service 54dbc3
		    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
                    | qos_ulp_type_sdp_default {
Packit Service 54dbc3
                        /* "sdp : sl" - default SL for SDP */
Packit Service 54dbc3
                        uint64_t ** range_arr =
Packit Service 54dbc3
                               (uint64_t **)malloc(sizeof(uint64_t *));
Packit Service 54dbc3
                        range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t));
Packit Service 54dbc3
                        range_arr[0][0] = OSM_QOS_POLICY_ULP_SDP_SERVICE_ID;
Packit Service 54dbc3
                        range_arr[0][1] = OSM_QOS_POLICY_ULP_SDP_SERVICE_ID + 0xFFFF;
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_arr = range_arr;
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_len = 1;
Packit Service 54dbc3
Packit Service 54dbc3
                    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
                    | qos_ulp_type_sdp_port list_of_ranges TK_DOTDOT {
Packit Service 54dbc3
                        /* sdp with port numbers */
Packit Service 54dbc3
                        uint64_t ** range_arr;
Packit Service 54dbc3
                        unsigned    range_len;
Packit Service 54dbc3
                        unsigned    i;
Packit Service 54dbc3
Packit Service 54dbc3
                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            yyerror("SDP ULP rule doesn't have port numbers");
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
Packit Service 54dbc3
                        /* get all the port ranges */
Packit Service 54dbc3
                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                              &range_arr,
Packit Service 54dbc3
                                              &range_len );
Packit Service 54dbc3
                        /* now translate these port numbers into service ids */
Packit Service 54dbc3
                        for (i = 0; i < range_len; i++)
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("SDP port number out of range");
Packit Service 54dbc3
				free(range_arr);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            range_arr[i][0] += OSM_QOS_POLICY_ULP_SDP_SERVICE_ID;
Packit Service 54dbc3
                            range_arr[i][1] += OSM_QOS_POLICY_ULP_SDP_SERVICE_ID;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_arr = range_arr;
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_len = range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
                    | qos_ulp_type_rds_default {
Packit Service 54dbc3
                        /* "rds : sl" - default SL for RDS */
Packit Service 54dbc3
                        uint64_t ** range_arr =
Packit Service 54dbc3
                               (uint64_t **)malloc(sizeof(uint64_t *));
Packit Service 54dbc3
                        range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t));
Packit Service 54dbc3
                        range_arr[0][0] = range_arr[0][1] =
Packit Service 54dbc3
                           OSM_QOS_POLICY_ULP_RDS_SERVICE_ID + OSM_QOS_POLICY_ULP_RDS_PORT;
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_arr = range_arr;
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_len = 1;
Packit Service 54dbc3
Packit Service 54dbc3
                    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
                    | qos_ulp_type_rds_port list_of_ranges TK_DOTDOT {
Packit Service 54dbc3
                        /* rds with port numbers */
Packit Service 54dbc3
                        uint64_t ** range_arr;
Packit Service 54dbc3
                        unsigned    range_len;
Packit Service 54dbc3
                        unsigned    i;
Packit Service 54dbc3
Packit Service 54dbc3
                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            yyerror("RDS ULP rule doesn't have port numbers");
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
Packit Service 54dbc3
                        /* get all the port ranges */
Packit Service 54dbc3
                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                              &range_arr,
Packit Service 54dbc3
                                              &range_len );
Packit Service 54dbc3
                        /* now translate these port numbers into service ids */
Packit Service 54dbc3
                        for (i = 0; i < range_len; i++)
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("SDP port number out of range");
Packit Service 54dbc3
				free(range_arr);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            range_arr[i][0] += OSM_QOS_POLICY_ULP_RDS_SERVICE_ID;
Packit Service 54dbc3
                            range_arr[i][1] += OSM_QOS_POLICY_ULP_RDS_SERVICE_ID;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_arr = range_arr;
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_len = range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
                    | qos_ulp_type_iser_default {
Packit Service 54dbc3
                        /* "iSER : sl" - default SL for iSER */
Packit Service 54dbc3
                        uint64_t ** range_arr =
Packit Service 54dbc3
                               (uint64_t **)malloc(sizeof(uint64_t *));
Packit Service 54dbc3
                        range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t));
Packit Service 54dbc3
                        range_arr[0][0] = range_arr[0][1] =
Packit Service 54dbc3
                           OSM_QOS_POLICY_ULP_ISER_SERVICE_ID + OSM_QOS_POLICY_ULP_ISER_PORT;
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_arr = range_arr;
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_len = 1;
Packit Service 54dbc3
Packit Service 54dbc3
                    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
                    | qos_ulp_type_iser_port list_of_ranges TK_DOTDOT {
Packit Service 54dbc3
                        /* iser with port numbers */
Packit Service 54dbc3
                        uint64_t ** range_arr;
Packit Service 54dbc3
                        unsigned    range_len;
Packit Service 54dbc3
                        unsigned    i;
Packit Service 54dbc3
Packit Service 54dbc3
                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            yyerror("iSER ULP rule doesn't have port numbers");
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
Packit Service 54dbc3
                        /* get all the port ranges */
Packit Service 54dbc3
                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                              &range_arr,
Packit Service 54dbc3
                                              &range_len );
Packit Service 54dbc3
                        /* now translate these port numbers into service ids */
Packit Service 54dbc3
                        for (i = 0; i < range_len; i++)
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            if (range_arr[i][0] > 0xFFFF || range_arr[i][1] > 0xFFFF)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("SDP port number out of range");
Packit Service 54dbc3
				free(range_arr);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            range_arr[i][0] += OSM_QOS_POLICY_ULP_ISER_SERVICE_ID;
Packit Service 54dbc3
                            range_arr[i][1] += OSM_QOS_POLICY_ULP_ISER_SERVICE_ID;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_arr = range_arr;
Packit Service 54dbc3
                        p_current_qos_match_rule->service_id_range_len = range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
                    | qos_ulp_type_srp_guid list_of_ranges TK_DOTDOT {
Packit Service 54dbc3
                        /* srp with target guids - this rule is similar
Packit Service 54dbc3
                           to writing 'any' ulp with target port guids */
Packit Service 54dbc3
                        uint64_t ** range_arr;
Packit Service 54dbc3
                        unsigned    range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            yyerror("SRP ULP rule doesn't have port guids");
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
Packit Service 54dbc3
                        /* create a new port group with these ports */
Packit Service 54dbc3
                        __parser_port_group_start();
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_port_group->name = strdup("_SRP_Targets_");
Packit Service 54dbc3
                        p_current_port_group->use = strdup("Generated from ULP rules");
Packit Service 54dbc3
Packit Service 54dbc3
                        __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                              &range_arr,
Packit Service 54dbc3
                                              &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                        __parser_add_guid_range_to_port_map(
Packit Service 54dbc3
                                              &p_current_port_group->port_map,
Packit Service 54dbc3
                                              range_arr,
Packit Service 54dbc3
                                              range_len);
Packit Service 54dbc3
Packit Service 54dbc3
                        /* add this port group to the destination
Packit Service 54dbc3
                           groups of the current match rule */
Packit Service 54dbc3
                        cl_list_insert_tail(&p_current_qos_match_rule->destination_group_list,
Packit Service 54dbc3
                                            p_current_port_group);
Packit Service 54dbc3
Packit Service 54dbc3
                        __parser_port_group_end();
Packit Service 54dbc3
Packit Service 54dbc3
                    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
                    | qos_ulp_type_ipoib_default {
Packit Service 54dbc3
                        /* ipoib w/o any pkeys (default pkey) */
Packit Service 54dbc3
                        uint64_t ** range_arr =
Packit Service 54dbc3
                               (uint64_t **)malloc(sizeof(uint64_t *));
Packit Service 54dbc3
                        range_arr[0] = (uint64_t *)malloc(2*sizeof(uint64_t));
Packit Service 54dbc3
                        range_arr[0][0] = range_arr[0][1] = 0x7fff;
Packit Service 54dbc3
Packit Service 54dbc3
                        /*
Packit Service 54dbc3
                         * Although we know that the default partition exists,
Packit Service 54dbc3
                         * we still need to validate it by checking that it has
Packit Service 54dbc3
                         * at least two full members. Otherwise IPoIB won't work.
Packit Service 54dbc3
                         */
Packit Service 54dbc3
                        if (__validate_pkeys(range_arr, 1, TRUE)) {
Packit Service 54dbc3
                            free(range_arr[0]);
Packit Service 54dbc3
                            free(range_arr);
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
			}
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_qos_match_rule->pkey_range_arr = range_arr;
Packit Service 54dbc3
                        p_current_qos_match_rule->pkey_range_len = 1;
Packit Service 54dbc3
Packit Service 54dbc3
                    } qos_ulp_sl
Packit Service 54dbc3
Packit Service 54dbc3
                    | qos_ulp_type_ipoib_pkey list_of_ranges TK_DOTDOT {
Packit Service 54dbc3
                        /* ipoib with pkeys */
Packit Service 54dbc3
                        uint64_t ** range_arr;
Packit Service 54dbc3
                        unsigned    range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                        if (!cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            yyerror("IPoIB ULP rule doesn't have pkeys");
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
Packit Service 54dbc3
                        /* get all the pkey ranges */
Packit Service 54dbc3
                        __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                              &range_arr,
Packit Service 54dbc3
                                              &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                        /*
Packit Service 54dbc3
                         * Validate pkeys.
Packit Service 54dbc3
                         * For IPoIB pkeys the validation is strict.
Packit Service 54dbc3
                         * If some problem would be found, parsing will
Packit Service 54dbc3
                         * be aborted with a proper error messages.
Packit Service 54dbc3
                         */
Packit Service 54dbc3
			if (__validate_pkeys(range_arr, range_len, TRUE)) {
Packit Service 54dbc3
			    free(range_arr);
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
			}
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_qos_match_rule->pkey_range_arr = range_arr;
Packit Service 54dbc3
                        p_current_qos_match_rule->pkey_range_len = range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                    } qos_ulp_sl
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_any_service: TK_ULP_ANY_SERVICE_ID
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_any_pkey: TK_ULP_ANY_PKEY
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_any_target_port_guid: TK_ULP_ANY_TARGET_PORT_GUID
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_any_source_port_guid: TK_ULP_ANY_SOURCE_PORT_GUID
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_any_source_target_port_guid: TK_ULP_ANY_SOURCE_TARGET_PORT_GUID
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_sdp_default: TK_ULP_SDP_DEFAULT
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_sdp_port: TK_ULP_SDP_PORT
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_rds_default: TK_ULP_RDS_DEFAULT
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_rds_port: TK_ULP_RDS_PORT
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_iser_default: TK_ULP_ISER_DEFAULT
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_iser_port: TK_ULP_ISER_PORT
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_srp_guid: TK_ULP_SRP_GUID
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_ipoib_default: TK_ULP_IPOIB_DEFAULT
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_type_ipoib_pkey: TK_ULP_IPOIB_PKEY
Packit Service 54dbc3
                    { __parser_ulp_match_rule_start(); };
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
qos_ulp_sl:   single_number {
Packit Service 54dbc3
                        /* get the SL for ULP rules */
Packit Service 54dbc3
                        cl_list_iterator_t  list_iterator;
Packit Service 54dbc3
                        uint64_t          * p_tmp_num;
Packit Service 54dbc3
                        uint8_t             sl;
Packit Service 54dbc3
Packit Service 54dbc3
                        list_iterator = cl_list_head(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                        p_tmp_num = (uint64_t*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                        if (*p_tmp_num > 15)
Packit Service 54dbc3
                        {
Packit Service 54dbc3
                            yyerror("illegal SL value");
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
Packit Service 54dbc3
                        sl = (uint8_t)(*p_tmp_num);
Packit Service 54dbc3
                        free(p_tmp_num);
Packit Service 54dbc3
                        cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
Packit Service 54dbc3
                        p_current_qos_match_rule->p_qos_level =
Packit Service 54dbc3
                                 &osm_qos_policy_simple_qos_levels[sl];
Packit Service 54dbc3
                        p_current_qos_match_rule->qos_level_name =
Packit Service 54dbc3
                                 strdup(osm_qos_policy_simple_qos_levels[sl].name);
Packit Service 54dbc3
Packit Service 54dbc3
                        if (__parser_ulp_match_rule_end())
Packit Service 54dbc3
                            return 1;
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     *  port_group_entry values:
Packit Service 54dbc3
     *      port_group_name
Packit Service 54dbc3
     *      port_group_use
Packit Service 54dbc3
     *      port_group_port_guid
Packit Service 54dbc3
     *      port_group_port_name
Packit Service 54dbc3
     *      port_group_pkey
Packit Service 54dbc3
     *      port_group_partition
Packit Service 54dbc3
     *      port_group_node_type
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
port_group_name:        port_group_name_start single_string {
Packit Service 54dbc3
                            /* 'name' of 'port-group' - one instance */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            if (p_current_port_group->name)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("port-group has multiple 'name' tags");
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                    p_current_port_group->name = tmp_str;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_name_start:  TK_NAME {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_use:         port_group_use_start single_string {
Packit Service 54dbc3
                            /* 'use' of 'port-group' - one instance */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            if (p_current_port_group->use)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("port-group has multiple 'use' tags");
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                    p_current_port_group->use = tmp_str;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_use_start:   TK_USE {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_port_name:   port_group_port_name_start string_list {
Packit Service 54dbc3
                            /* 'port-name' in 'port-group' - any num of instances */
Packit Service 54dbc3
                            cl_list_iterator_t list_iterator;
Packit Service 54dbc3
                            osm_node_t * p_node;
Packit Service 54dbc3
                            osm_physp_t * p_physp;
Packit Service 54dbc3
                            unsigned port_num;
Packit Service 54dbc3
                            char * tmp_str;
Packit Service 54dbc3
                            char * port_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            /* parsing port name strings */
Packit Service 54dbc3
                            for (list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                                 list_iterator != cl_list_end(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                                 list_iterator = cl_list_next(list_iterator))
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    /* last slash in port name string is a separator
Packit Service 54dbc3
                                       between node name and port number */
Packit Service 54dbc3
                                    port_str = strrchr(tmp_str, '/');
Packit Service 54dbc3
                                    if (!port_str || (strlen(port_str) < 3) ||
Packit Service 54dbc3
                                        (port_str[1] != 'p' && port_str[1] != 'P')) {
Packit Service 54dbc3
                                        yyerror("'%s' - illegal port name",
Packit Service 54dbc3
                                                           tmp_str);
Packit Service 54dbc3
                                        free(tmp_str);
Packit Service 54dbc3
                                        cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                                        return 1;
Packit Service 54dbc3
                                    }
Packit Service 54dbc3
Packit Service 54dbc3
                                    if (!(port_num = strtoul(&port_str[2],NULL,0))) {
Packit Service 54dbc3
                                        yyerror(
Packit Service 54dbc3
                                               "'%s' - illegal port number in port name",
Packit Service 54dbc3
                                               tmp_str);
Packit Service 54dbc3
                                        free(tmp_str);
Packit Service 54dbc3
                                        cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                                        return 1;
Packit Service 54dbc3
                                    }
Packit Service 54dbc3
Packit Service 54dbc3
                                    /* separate node name from port number */
Packit Service 54dbc3
                                    port_str[0] = '\0';
Packit Service 54dbc3
Packit Service 54dbc3
                                    if (st_lookup(p_qos_policy->p_node_hash,
Packit Service 54dbc3
                                                  (st_data_t)tmp_str,
Packit Service 54dbc3
                                                  (void *)&p_node))
Packit Service 54dbc3
                                    {
Packit Service 54dbc3
                                        /* we found the node, now get the right port */
Packit Service 54dbc3
                                        p_physp = osm_node_get_physp_ptr(p_node, port_num);
Packit Service 54dbc3
                                        if (!p_physp) {
Packit Service 54dbc3
                                            yyerror(
Packit Service 54dbc3
                                                   "'%s' - port number out of range in port name",
Packit Service 54dbc3
                                                   tmp_str);
Packit Service 54dbc3
                                            free(tmp_str);
Packit Service 54dbc3
                                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                                            return 1;
Packit Service 54dbc3
                                        }
Packit Service 54dbc3
                                        /* we found the port, now add it to guid table */
Packit Service 54dbc3
                                        __parser_add_port_to_port_map(&p_current_port_group->port_map,
Packit Service 54dbc3
                                                                      p_physp);
Packit Service 54dbc3
                                    }
Packit Service 54dbc3
                                    free(tmp_str);
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_port_name_start: TK_PORT_NAME {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_port_guid:   port_group_port_guid_start list_of_ranges {
Packit Service 54dbc3
                            /* 'port-guid' in 'port-group' - any num of instances */
Packit Service 54dbc3
                            /* list of guid ranges */
Packit Service 54dbc3
                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                uint64_t ** range_arr;
Packit Service 54dbc3
                                unsigned range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                                __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                                      &range_arr,
Packit Service 54dbc3
                                                      &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                                __parser_add_guid_range_to_port_map(
Packit Service 54dbc3
                                                      &p_current_port_group->port_map,
Packit Service 54dbc3
                                                      range_arr,
Packit Service 54dbc3
                                                      range_len);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_port_guid_start: TK_PORT_GUID {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_pkey:        port_group_pkey_start list_of_ranges {
Packit Service 54dbc3
                            /* 'pkey' in 'port-group' - any num of instances */
Packit Service 54dbc3
                            /* list of pkey ranges */
Packit Service 54dbc3
                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                uint64_t ** range_arr;
Packit Service 54dbc3
                                unsigned range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                                __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                                      &range_arr,
Packit Service 54dbc3
                                                      &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                                __parser_add_pkey_range_to_port_map(
Packit Service 54dbc3
                                                      &p_current_port_group->port_map,
Packit Service 54dbc3
                                                      range_arr,
Packit Service 54dbc3
                                                      range_len);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_pkey_start:  TK_PKEY {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_partition:  port_group_partition_start string_list {
Packit Service 54dbc3
                            /* 'partition' in 'port-group' - any num of instances */
Packit Service 54dbc3
                            __parser_add_partition_list_to_port_map(
Packit Service 54dbc3
                                               &p_current_port_group->port_map,
Packit Service 54dbc3
                                               &tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_partition_start: TK_PARTITION {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_node_type:   port_group_node_type_start port_group_node_type_list {
Packit Service 54dbc3
                            /* 'node-type' in 'port-group' - any num of instances */
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_node_type_start: TK_NODE_TYPE {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
port_group_node_type_list:  node_type_item
Packit Service 54dbc3
                        |   port_group_node_type_list TK_COMMA node_type_item
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
node_type_item:           node_type_ca
Packit Service 54dbc3
                        | node_type_switch
Packit Service 54dbc3
                        | node_type_router
Packit Service 54dbc3
                        | node_type_all
Packit Service 54dbc3
                        | node_type_self
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
node_type_ca:           TK_NODE_TYPE_CA {
Packit Service 54dbc3
                            p_current_port_group->node_types |=
Packit Service 54dbc3
                               OSM_QOS_POLICY_NODE_TYPE_CA;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
node_type_switch:       TK_NODE_TYPE_SWITCH {
Packit Service 54dbc3
                            p_current_port_group->node_types |=
Packit Service 54dbc3
                               OSM_QOS_POLICY_NODE_TYPE_SWITCH;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
node_type_router:       TK_NODE_TYPE_ROUTER {
Packit Service 54dbc3
                            p_current_port_group->node_types |=
Packit Service 54dbc3
                               OSM_QOS_POLICY_NODE_TYPE_ROUTER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
node_type_all:          TK_NODE_TYPE_ALL {
Packit Service 54dbc3
                            p_current_port_group->node_types |=
Packit Service 54dbc3
                               (OSM_QOS_POLICY_NODE_TYPE_CA |
Packit Service 54dbc3
                                OSM_QOS_POLICY_NODE_TYPE_SWITCH |
Packit Service 54dbc3
                                OSM_QOS_POLICY_NODE_TYPE_ROUTER);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
node_type_self:         TK_NODE_TYPE_SELF {
Packit Service 54dbc3
                            osm_port_t * p_osm_port =
Packit Service 54dbc3
                                osm_get_port_by_guid(p_qos_policy->p_subn,
Packit Service 54dbc3
                                     p_qos_policy->p_subn->sm_port_guid);
Packit Service 54dbc3
                            if (p_osm_port)
Packit Service 54dbc3
                                __parser_add_port_to_port_map(
Packit Service 54dbc3
                                   &p_current_port_group->port_map,
Packit Service 54dbc3
                                   p_osm_port->p_physp);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     *  vlarb_scope_entry values:
Packit Service 54dbc3
     *      vlarb_scope_group
Packit Service 54dbc3
     *      vlarb_scope_across
Packit Service 54dbc3
     *      vlarb_scope_vlarb_high
Packit Service 54dbc3
     *      vlarb_scope_vlarb_low
Packit Service 54dbc3
     *      vlarb_scope_vlarb_high_limit
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_group:      vlarb_scope_group_start string_list {
Packit Service 54dbc3
                            /* 'group' in 'vlarb-scope' - any num of instances */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                    cl_list_insert_tail(&p_current_vlarb_scope->group_list,tmp_str);
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_group_start: TK_GROUP {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_across: vlarb_scope_across_start string_list {
Packit Service 54dbc3
                            /* 'across' in 'vlarb-scope' - any num of instances */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                    cl_list_insert_tail(&p_current_vlarb_scope->across_list,tmp_str);
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_across_start: TK_ACROSS {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_vlarb_high_limit:  vlarb_scope_vlarb_high_limit_start single_number {
Packit Service 54dbc3
                            /* 'vl-high-limit' in 'vlarb-scope' - one instance of one number */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            uint64_t            * p_tmp_num;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                            p_tmp_num = (uint64_t*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                            if (p_tmp_num)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                p_current_vlarb_scope->vl_high_limit = (uint32_t)(*p_tmp_num);
Packit Service 54dbc3
                                p_current_vlarb_scope->vl_high_limit_set = TRUE;
Packit Service 54dbc3
                                free(p_tmp_num);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_vlarb_high_limit_start: TK_VLARB_HIGH_LIMIT {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_vlarb_high: vlarb_scope_vlarb_high_start num_list_with_dotdot {
Packit Service 54dbc3
                            /* 'vlarb-high' in 'vlarb-scope' - list of pairs of numbers with ':' and ',' */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            uint64_t            * num_pair;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                num_pair = (uint64_t*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (num_pair)
Packit Service 54dbc3
                                    cl_list_insert_tail(&p_current_vlarb_scope->vlarb_high_list,num_pair);
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_vlarb_high_start: TK_VLARB_HIGH {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_vlarb_low:  vlarb_scope_vlarb_low_start num_list_with_dotdot {
Packit Service 54dbc3
                            /* 'vlarb-low' in 'vlarb-scope' - list of pairs of numbers with ':' and ',' */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            uint64_t            * num_pair;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                num_pair = (uint64_t*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (num_pair)
Packit Service 54dbc3
                                    cl_list_insert_tail(&p_current_vlarb_scope->vlarb_low_list,num_pair);
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
vlarb_scope_vlarb_low_start: TK_VLARB_LOW {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     *  sl2vl_scope_entry values:
Packit Service 54dbc3
     *      sl2vl_scope_group
Packit Service 54dbc3
     *      sl2vl_scope_across
Packit Service 54dbc3
     *      sl2vl_scope_across_from
Packit Service 54dbc3
     *      sl2vl_scope_across_to
Packit Service 54dbc3
     *      sl2vl_scope_from
Packit Service 54dbc3
     *      sl2vl_scope_to
Packit Service 54dbc3
     *      sl2vl_scope_sl2vl_table
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_group:      sl2vl_scope_group_start string_list {
Packit Service 54dbc3
                            /* 'group' in 'sl2vl-scope' - any num of instances */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                    cl_list_insert_tail(&p_current_sl2vl_scope->group_list,tmp_str);
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_group_start: TK_GROUP {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_across:     sl2vl_scope_across_start string_list {
Packit Service 54dbc3
                            /* 'across' in 'sl2vl-scope' - any num of instances */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str) {
Packit Service 54dbc3
                                    cl_list_insert_tail(&p_current_sl2vl_scope->across_from_list,tmp_str);
Packit Service 54dbc3
                                    cl_list_insert_tail(&p_current_sl2vl_scope->across_to_list,strdup(tmp_str));
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_across_start: TK_ACROSS {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_across_from:  sl2vl_scope_across_from_start string_list {
Packit Service 54dbc3
                            /* 'across-from' in 'sl2vl-scope' - any num of instances */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                    cl_list_insert_tail(&p_current_sl2vl_scope->across_from_list,tmp_str);
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_across_from_start: TK_ACROSS_FROM {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_across_to:  sl2vl_scope_across_to_start string_list {
Packit Service 54dbc3
                            /* 'across-to' in 'sl2vl-scope' - any num of instances */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str) {
Packit Service 54dbc3
                                    cl_list_insert_tail(&p_current_sl2vl_scope->across_to_list,tmp_str);
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_across_to_start: TK_ACROSS_TO {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_from:       sl2vl_scope_from_start sl2vl_scope_from_list_or_asterisk {
Packit Service 54dbc3
                            /* 'from' in 'sl2vl-scope' - any num of instances */
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_from_start: TK_FROM {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_to:         sl2vl_scope_to_start sl2vl_scope_to_list_or_asterisk {
Packit Service 54dbc3
                            /* 'to' in 'sl2vl-scope' - any num of instances */
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_to_start:   TK_TO {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_from_list_or_asterisk:  sl2vl_scope_from_asterisk
Packit Service 54dbc3
                                  | sl2vl_scope_from_list_of_ranges
Packit Service 54dbc3
                                  ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_from_asterisk: TK_ASTERISK {
Packit Service 54dbc3
                            int i;
Packit Service 54dbc3
                            for (i = 0; i < OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH; i++)
Packit Service 54dbc3
                                p_current_sl2vl_scope->from[i] = TRUE;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_to_list_or_asterisk:  sl2vl_scope_to_asterisk
Packit Service 54dbc3
                                | sl2vl_scope_to_list_of_ranges
Packit Service 54dbc3
                                  ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_to_asterisk: TK_ASTERISK {
Packit Service 54dbc3
                            int i;
Packit Service 54dbc3
                            for (i = 0; i < OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH; i++)
Packit Service 54dbc3
                                p_current_sl2vl_scope->to[i] = TRUE;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_from_list_of_ranges: list_of_ranges {
Packit Service 54dbc3
                            int i;
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            uint64_t            * num_pair;
Packit Service 54dbc3
                            uint8_t               num1, num2;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                num_pair = (uint64_t*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (num_pair)
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    if ( num_pair[1] >= OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH )
Packit Service 54dbc3
                                    {
Packit Service 54dbc3
                                        yyerror("port number out of range 'from' list");
Packit Service 54dbc3
                                        free(num_pair);
Packit Service 54dbc3
                                        cl_list_remove_all(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
                                        return 1;
Packit Service 54dbc3
                                    }
Packit Service 54dbc3
                                    num1 = (uint8_t)num_pair[0];
Packit Service 54dbc3
                                    num2 = (uint8_t)num_pair[1];
Packit Service 54dbc3
                                    free(num_pair);
Packit Service 54dbc3
                                    for (i = num1; i <= num2; i++)
Packit Service 54dbc3
                                        p_current_sl2vl_scope->from[i] = TRUE;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_to_list_of_ranges: list_of_ranges {
Packit Service 54dbc3
                            int i;
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            uint64_t            * num_pair;
Packit Service 54dbc3
                            uint8_t               num1, num2;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_pair_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                num_pair = (uint64_t*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (num_pair)
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    if ( num_pair[1] >= OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH )
Packit Service 54dbc3
                                    {
Packit Service 54dbc3
                                        yyerror("port number out of range 'to' list");
Packit Service 54dbc3
                                        free(num_pair);
Packit Service 54dbc3
                                        cl_list_remove_all(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
                                        return 1;
Packit Service 54dbc3
                                    }
Packit Service 54dbc3
                                    num1 = (uint8_t)num_pair[0];
Packit Service 54dbc3
                                    num2 = (uint8_t)num_pair[1];
Packit Service 54dbc3
                                    free(num_pair);
Packit Service 54dbc3
                                    for (i = num1; i <= num2; i++)
Packit Service 54dbc3
                                        p_current_sl2vl_scope->to[i] = TRUE;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_sl2vl_table:  sl2vl_scope_sl2vl_table_start num_list {
Packit Service 54dbc3
                            /* 'sl2vl-table' - one instance of exactly
Packit Service 54dbc3
                               OSM_QOS_POLICY_SL2VL_TABLE_LEN numbers */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            uint64_t              num;
Packit Service 54dbc3
                            uint64_t            * p_num;
Packit Service 54dbc3
                            int                   i = 0;
Packit Service 54dbc3
Packit Service 54dbc3
                            if (p_current_sl2vl_scope->sl2vl_table_set)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("sl2vl-scope has more than one sl2vl-table");
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
Packit Service 54dbc3
                            if (cl_list_count(&tmp_parser_struct.num_list) != OSM_QOS_POLICY_SL2VL_TABLE_LEN)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("wrong number of values in 'sl2vl-table' (should be 16)");
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.num_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                p_num = (uint64_t*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                num = *p_num;
Packit Service 54dbc3
                                free(p_num);
Packit Service 54dbc3
                                if (num >= OSM_QOS_POLICY_MAX_VL_NUM)
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    yyerror("wrong VL value in 'sl2vl-table' (should be 0 to 15)");
Packit Service 54dbc3
                                    cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                                    return 1;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
Packit Service 54dbc3
                                p_current_sl2vl_scope->sl2vl_table[i++] = (uint8_t)num;
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            p_current_sl2vl_scope->sl2vl_table_set = TRUE;
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
sl2vl_scope_sl2vl_table_start: TK_SL2VL_TABLE {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     *  qos_level_entry values:
Packit Service 54dbc3
     *      qos_level_name
Packit Service 54dbc3
     *      qos_level_use
Packit Service 54dbc3
     *      qos_level_sl
Packit Service 54dbc3
     *      qos_level_mtu_limit
Packit Service 54dbc3
     *      qos_level_rate_limit
Packit Service 54dbc3
     *      qos_level_packet_life
Packit Service 54dbc3
     *      qos_level_path_bits
Packit Service 54dbc3
     *      qos_level_pkey
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_name:         qos_level_name_start single_string {
Packit Service 54dbc3
                            /* 'name' of 'qos-level' - one instance */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            if (p_current_qos_level->name)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("qos-level has multiple 'name' tags");
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                    p_current_qos_level->name = tmp_str;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_name_start:   TK_NAME {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_use:          qos_level_use_start single_string {
Packit Service 54dbc3
                            /* 'use' of 'qos-level' - one instance */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            if (p_current_qos_level->use)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("qos-level has multiple 'use' tags");
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                    p_current_qos_level->use = tmp_str;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_use_start:    TK_USE {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_sl:           qos_level_sl_start single_number {
Packit Service 54dbc3
                            /* 'sl' in 'qos-level' - one instance */
Packit Service 54dbc3
                            cl_list_iterator_t   list_iterator;
Packit Service 54dbc3
                            uint64_t           * p_num;
Packit Service 54dbc3
Packit Service 54dbc3
                            if (p_current_qos_level->sl_set)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("'qos-level' has multiple 'sl' tags");
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                            p_num = (uint64_t*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                            p_current_qos_level->sl = (uint8_t)(*p_num);
Packit Service 54dbc3
                            free(p_num);
Packit Service 54dbc3
                            p_current_qos_level->sl_set = TRUE;
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_sl_start:     TK_SL {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_mtu_limit:    qos_level_mtu_limit_start single_number {
Packit Service 54dbc3
                            /* 'mtu-limit' in 'qos-level' - one instance */
Packit Service 54dbc3
                            cl_list_iterator_t   list_iterator;
Packit Service 54dbc3
                            uint64_t           * p_num;
Packit Service 54dbc3
Packit Service 54dbc3
                            if (p_current_qos_level->mtu_limit_set)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("'qos-level' has multiple 'mtu-limit' tags");
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                            p_num = (uint64_t*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                            if (*p_num > OSM_QOS_POLICY_MAX_MTU || *p_num < OSM_QOS_POLICY_MIN_MTU)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("mtu limit is out of range, value: %d", *p_num);
Packit Service 54dbc3
                                free(p_num);
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            p_current_qos_level->mtu_limit = (uint8_t)(*p_num);
Packit Service 54dbc3
                            free(p_num);
Packit Service 54dbc3
                            p_current_qos_level->mtu_limit_set = TRUE;
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_mtu_limit_start: TK_MTU_LIMIT {
Packit Service 54dbc3
                            /* 'mtu-limit' in 'qos-level' - one instance */
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_rate_limit:    qos_level_rate_limit_start single_number {
Packit Service 54dbc3
                            /* 'rate-limit' in 'qos-level' - one instance */
Packit Service 54dbc3
                            cl_list_iterator_t   list_iterator;
Packit Service 54dbc3
                            uint64_t           * p_num;
Packit Service 54dbc3
Packit Service 54dbc3
                            if (p_current_qos_level->rate_limit_set)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("'qos-level' has multiple 'rate-limit' tags");
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                            p_num = (uint64_t*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                            if (*p_num > OSM_QOS_POLICY_MAX_RATE || *p_num < OSM_QOS_POLICY_MIN_RATE)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("rate limit is out of range, value: %d", *p_num);
Packit Service 54dbc3
                                free(p_num);
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            p_current_qos_level->rate_limit = (uint8_t)(*p_num);
Packit Service 54dbc3
                            free(p_num);
Packit Service 54dbc3
                            p_current_qos_level->rate_limit_set = TRUE;
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_rate_limit_start: TK_RATE_LIMIT {
Packit Service 54dbc3
                            /* 'rate-limit' in 'qos-level' - one instance */
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_packet_life:  qos_level_packet_life_start single_number {
Packit Service 54dbc3
                            /* 'packet-life' in 'qos-level' - one instance */
Packit Service 54dbc3
                            cl_list_iterator_t   list_iterator;
Packit Service 54dbc3
                            uint64_t           * p_num;
Packit Service 54dbc3
Packit Service 54dbc3
                            if (p_current_qos_level->pkt_life_set)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("'qos-level' has multiple 'packet-life' tags");
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                            p_num = (uint64_t*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                            p_current_qos_level->pkt_life = (uint8_t)(*p_num);
Packit Service 54dbc3
                            free(p_num);
Packit Service 54dbc3
                            p_current_qos_level->pkt_life_set= TRUE;
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_packet_life_start: TK_PACKET_LIFE {
Packit Service 54dbc3
                            /* 'packet-life' in 'qos-level' - one instance */
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_path_bits:    qos_level_path_bits_start list_of_ranges {
Packit Service 54dbc3
                            /* 'path-bits' in 'qos-level' - any num of instances */
Packit Service 54dbc3
                            /* list of path bit ranges */
Packit Service 54dbc3
Packit Service 54dbc3
                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                uint64_t ** range_arr;
Packit Service 54dbc3
                                unsigned range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                                __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                                      &range_arr,
Packit Service 54dbc3
                                                      &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                                if ( !p_current_qos_level->path_bits_range_len )
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    p_current_qos_level->path_bits_range_arr = range_arr;
Packit Service 54dbc3
                                    p_current_qos_level->path_bits_range_len = range_len;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                                else
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    uint64_t ** new_range_arr;
Packit Service 54dbc3
                                    unsigned new_range_len;
Packit Service 54dbc3
                                    __merge_rangearr( p_current_qos_level->path_bits_range_arr,
Packit Service 54dbc3
                                                      p_current_qos_level->path_bits_range_len,
Packit Service 54dbc3
                                                      range_arr,
Packit Service 54dbc3
                                                      range_len,
Packit Service 54dbc3
                                                      &new_range_arr,
Packit Service 54dbc3
                                                      &new_range_len );
Packit Service 54dbc3
                                    p_current_qos_level->path_bits_range_arr = new_range_arr;
Packit Service 54dbc3
                                    p_current_qos_level->path_bits_range_len = new_range_len;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_path_bits_start: TK_PATH_BITS {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_pkey:         qos_level_pkey_start list_of_ranges {
Packit Service 54dbc3
                            /* 'pkey' in 'qos-level' - num of instances of list of ranges */
Packit Service 54dbc3
                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                uint64_t ** range_arr;
Packit Service 54dbc3
                                unsigned range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                                __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                                      &range_arr,
Packit Service 54dbc3
                                                      &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                                if ( !p_current_qos_level->pkey_range_len )
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    p_current_qos_level->pkey_range_arr = range_arr;
Packit Service 54dbc3
                                    p_current_qos_level->pkey_range_len = range_len;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                                else
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    uint64_t ** new_range_arr;
Packit Service 54dbc3
                                    unsigned new_range_len;
Packit Service 54dbc3
                                    __merge_rangearr( p_current_qos_level->pkey_range_arr,
Packit Service 54dbc3
                                                      p_current_qos_level->pkey_range_len,
Packit Service 54dbc3
                                                      range_arr,
Packit Service 54dbc3
                                                      range_len,
Packit Service 54dbc3
                                                      &new_range_arr,
Packit Service 54dbc3
                                                      &new_range_len );
Packit Service 54dbc3
                                    p_current_qos_level->pkey_range_arr = new_range_arr;
Packit Service 54dbc3
                                    p_current_qos_level->pkey_range_len = new_range_len;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_level_pkey_start:   TK_PKEY {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     *  qos_match_rule_entry values:
Packit Service 54dbc3
     *      qos_match_rule_use
Packit Service 54dbc3
     *      qos_match_rule_qos_class
Packit Service 54dbc3
     *      qos_match_rule_qos_level_name
Packit Service 54dbc3
     *      qos_match_rule_source
Packit Service 54dbc3
     *      qos_match_rule_destination
Packit Service 54dbc3
     *      qos_match_rule_service_id
Packit Service 54dbc3
     *      qos_match_rule_pkey
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_use:     qos_match_rule_use_start single_string {
Packit Service 54dbc3
                            /* 'use' of 'qos-match-rule' - one instance */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            if (p_current_qos_match_rule->use)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("'qos-match-rule' has multiple 'use' tags");
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                    p_current_qos_match_rule->use = tmp_str;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_use_start: TK_USE {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_qos_class: qos_match_rule_qos_class_start list_of_ranges {
Packit Service 54dbc3
                            /* 'qos-class' in 'qos-match-rule' - num of instances of list of ranges */
Packit Service 54dbc3
                            /* list of class ranges (QoS Class is 12-bit value) */
Packit Service 54dbc3
                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                uint64_t ** range_arr;
Packit Service 54dbc3
                                unsigned range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                                __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                                      &range_arr,
Packit Service 54dbc3
                                                      &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                                if ( !p_current_qos_match_rule->qos_class_range_len )
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    p_current_qos_match_rule->qos_class_range_arr = range_arr;
Packit Service 54dbc3
                                    p_current_qos_match_rule->qos_class_range_len = range_len;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                                else
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    uint64_t ** new_range_arr;
Packit Service 54dbc3
                                    unsigned new_range_len;
Packit Service 54dbc3
                                    __merge_rangearr( p_current_qos_match_rule->qos_class_range_arr,
Packit Service 54dbc3
                                                      p_current_qos_match_rule->qos_class_range_len,
Packit Service 54dbc3
                                                      range_arr,
Packit Service 54dbc3
                                                      range_len,
Packit Service 54dbc3
                                                      &new_range_arr,
Packit Service 54dbc3
                                                      &new_range_len );
Packit Service 54dbc3
                                    p_current_qos_match_rule->qos_class_range_arr = new_range_arr;
Packit Service 54dbc3
                                    p_current_qos_match_rule->qos_class_range_len = new_range_len;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_qos_class_start: TK_QOS_CLASS {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_source:  qos_match_rule_source_start string_list {
Packit Service 54dbc3
                            /* 'source' in 'qos-match-rule' - text */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                    cl_list_insert_tail(&p_current_qos_match_rule->source_list,tmp_str);
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_source_start: TK_SOURCE {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_destination: qos_match_rule_destination_start string_list {
Packit Service 54dbc3
                            /* 'destination' in 'qos-match-rule' - text */
Packit Service 54dbc3
                            cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
                            char                * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            while( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                    cl_list_insert_tail(&p_current_qos_match_rule->destination_list,tmp_str);
Packit Service 54dbc3
                                list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_destination_start: TK_DESTINATION {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_qos_level_name:  qos_match_rule_qos_level_name_start single_string {
Packit Service 54dbc3
                            /* 'qos-level-name' in 'qos-match-rule' - single string */
Packit Service 54dbc3
                            cl_list_iterator_t   list_iterator;
Packit Service 54dbc3
                            char               * tmp_str;
Packit Service 54dbc3
Packit Service 54dbc3
                            if (p_current_qos_match_rule->qos_level_name)
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                yyerror("qos-match-rule has multiple 'qos-level-name' tags");
Packit Service 54dbc3
                                cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
                                return 1;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
Packit Service 54dbc3
                            list_iterator = cl_list_head(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                            if ( list_iterator != cl_list_end(&tmp_parser_struct.str_list) )
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
                                if (tmp_str)
Packit Service 54dbc3
                                    p_current_qos_match_rule->qos_level_name = tmp_str;
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                            cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_qos_level_name_start: TK_QOS_LEVEL_NAME {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_service_id: qos_match_rule_service_id_start list_of_ranges {
Packit Service 54dbc3
                            /* 'service-id' in 'qos-match-rule' - num of instances of list of ranges */
Packit Service 54dbc3
                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                uint64_t ** range_arr;
Packit Service 54dbc3
                                unsigned range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                                __rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                                      &range_arr,
Packit Service 54dbc3
                                                      &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                                if ( !p_current_qos_match_rule->service_id_range_len )
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    p_current_qos_match_rule->service_id_range_arr = range_arr;
Packit Service 54dbc3
                                    p_current_qos_match_rule->service_id_range_len = range_len;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                                else
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    uint64_t ** new_range_arr;
Packit Service 54dbc3
                                    unsigned new_range_len;
Packit Service 54dbc3
                                    __merge_rangearr( p_current_qos_match_rule->service_id_range_arr,
Packit Service 54dbc3
                                                      p_current_qos_match_rule->service_id_range_len,
Packit Service 54dbc3
                                                      range_arr,
Packit Service 54dbc3
                                                      range_len,
Packit Service 54dbc3
                                                      &new_range_arr,
Packit Service 54dbc3
                                                      &new_range_len );
Packit Service 54dbc3
                                    p_current_qos_match_rule->service_id_range_arr = new_range_arr;
Packit Service 54dbc3
                                    p_current_qos_match_rule->service_id_range_len = new_range_len;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_service_id_start: TK_SERVICE_ID {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_pkey:    qos_match_rule_pkey_start list_of_ranges {
Packit Service 54dbc3
                            /* 'pkey' in 'qos-match-rule' - num of instances of list of ranges */
Packit Service 54dbc3
                            if (cl_list_count(&tmp_parser_struct.num_pair_list))
Packit Service 54dbc3
                            {
Packit Service 54dbc3
                                uint64_t ** range_arr;
Packit Service 54dbc3
                                unsigned range_len;
Packit Service 54dbc3
Packit Service 54dbc3
                                __pkey_rangelist2rangearr( &tmp_parser_struct.num_pair_list,
Packit Service 54dbc3
                                                      &range_arr,
Packit Service 54dbc3
                                                      &range_len );
Packit Service 54dbc3
Packit Service 54dbc3
                                if ( !p_current_qos_match_rule->pkey_range_len )
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    p_current_qos_match_rule->pkey_range_arr = range_arr;
Packit Service 54dbc3
                                    p_current_qos_match_rule->pkey_range_len = range_len;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                                else
Packit Service 54dbc3
                                {
Packit Service 54dbc3
                                    uint64_t ** new_range_arr;
Packit Service 54dbc3
                                    unsigned new_range_len;
Packit Service 54dbc3
                                    __merge_rangearr( p_current_qos_match_rule->pkey_range_arr,
Packit Service 54dbc3
                                                      p_current_qos_match_rule->pkey_range_len,
Packit Service 54dbc3
                                                      range_arr,
Packit Service 54dbc3
                                                      range_len,
Packit Service 54dbc3
                                                      &new_range_arr,
Packit Service 54dbc3
                                                      &new_range_len );
Packit Service 54dbc3
                                    p_current_qos_match_rule->pkey_range_arr = new_range_arr;
Packit Service 54dbc3
                                    p_current_qos_match_rule->pkey_range_len = new_range_len;
Packit Service 54dbc3
                                }
Packit Service 54dbc3
                            }
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
qos_match_rule_pkey_start: TK_PKEY {
Packit Service 54dbc3
                            RESET_BUFFER;
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        ;
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     * Common part
Packit Service 54dbc3
     */
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
single_string:      single_string_elems {
Packit Service 54dbc3
                        cl_list_insert_tail(&tmp_parser_struct.str_list,
Packit Service 54dbc3
                                            strdup(__parser_strip_white(tmp_parser_struct.str)));
Packit Service 54dbc3
                        tmp_parser_struct.str[0] = '\0';
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
single_string_elems:  single_string_element
Packit Service 54dbc3
                    | single_string_elems single_string_element
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
single_string_element: TK_TEXT {
Packit Service 54dbc3
                        strcat(tmp_parser_struct.str,$1);
Packit Service 54dbc3
                        free($1);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
string_list:        single_string
Packit Service 54dbc3
                    | string_list TK_COMMA single_string
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
Packit Service 54dbc3
single_number:      number
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
num_list:             number
Packit Service 54dbc3
                    | num_list TK_COMMA number
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
number:             TK_NUMBER {
Packit Service 54dbc3
                        uint64_t * p_num = (uint64_t*)malloc(sizeof(uint64_t));
Packit Service 54dbc3
                        __parser_str2uint64(p_num,$1);
Packit Service 54dbc3
                        free($1);
Packit Service 54dbc3
                        cl_list_insert_tail(&tmp_parser_struct.num_list, p_num);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
num_list_with_dotdot: number_from_pair_1 TK_DOTDOT number_from_pair_2 {
Packit Service 54dbc3
                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
Packit Service 54dbc3
                        num_pair[0] = tmp_parser_struct.num_pair[0];
Packit Service 54dbc3
                        num_pair[1] = tmp_parser_struct.num_pair[1];
Packit Service 54dbc3
                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    | num_list_with_dotdot TK_COMMA number_from_pair_1 TK_DOTDOT number_from_pair_2 {
Packit Service 54dbc3
                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
Packit Service 54dbc3
                        num_pair[0] = tmp_parser_struct.num_pair[0];
Packit Service 54dbc3
                        num_pair[1] = tmp_parser_struct.num_pair[1];
Packit Service 54dbc3
                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
number_from_pair_1:   TK_NUMBER {
Packit Service 54dbc3
                        __parser_str2uint64(&tmp_parser_struct.num_pair[0],$1);
Packit Service 54dbc3
                        free($1);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
number_from_pair_2:   TK_NUMBER {
Packit Service 54dbc3
                        __parser_str2uint64(&tmp_parser_struct.num_pair[1],$1);
Packit Service 54dbc3
                        free($1);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
list_of_ranges:     num_list_with_dash
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
num_list_with_dash:   single_number_from_range {
Packit Service 54dbc3
                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
Packit Service 54dbc3
                        num_pair[0] = tmp_parser_struct.num_pair[0];
Packit Service 54dbc3
                        num_pair[1] = tmp_parser_struct.num_pair[1];
Packit Service 54dbc3
                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    | number_from_range_1 TK_DASH number_from_range_2 {
Packit Service 54dbc3
                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
Packit Service 54dbc3
                        if (tmp_parser_struct.num_pair[0] <= tmp_parser_struct.num_pair[1]) {
Packit Service 54dbc3
                            num_pair[0] = tmp_parser_struct.num_pair[0];
Packit Service 54dbc3
                            num_pair[1] = tmp_parser_struct.num_pair[1];
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        else {
Packit Service 54dbc3
                            num_pair[1] = tmp_parser_struct.num_pair[0];
Packit Service 54dbc3
                            num_pair[0] = tmp_parser_struct.num_pair[1];
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    | num_list_with_dash TK_COMMA number_from_range_1 TK_DASH number_from_range_2 {
Packit Service 54dbc3
                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
Packit Service 54dbc3
                        if (tmp_parser_struct.num_pair[0] <= tmp_parser_struct.num_pair[1]) {
Packit Service 54dbc3
                            num_pair[0] = tmp_parser_struct.num_pair[0];
Packit Service 54dbc3
                            num_pair[1] = tmp_parser_struct.num_pair[1];
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        else {
Packit Service 54dbc3
                            num_pair[1] = tmp_parser_struct.num_pair[0];
Packit Service 54dbc3
                            num_pair[0] = tmp_parser_struct.num_pair[1];
Packit Service 54dbc3
                        }
Packit Service 54dbc3
                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    | num_list_with_dash TK_COMMA single_number_from_range {
Packit Service 54dbc3
                        uint64_t * num_pair = (uint64_t*)malloc(sizeof(uint64_t)*2);
Packit Service 54dbc3
                        num_pair[0] = tmp_parser_struct.num_pair[0];
Packit Service 54dbc3
                        num_pair[1] = tmp_parser_struct.num_pair[1];
Packit Service 54dbc3
                        cl_list_insert_tail(&tmp_parser_struct.num_pair_list, num_pair);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
single_number_from_range:  TK_NUMBER {
Packit Service 54dbc3
                        __parser_str2uint64(&tmp_parser_struct.num_pair[0],$1);
Packit Service 54dbc3
                        __parser_str2uint64(&tmp_parser_struct.num_pair[1],$1);
Packit Service 54dbc3
                        free($1);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
number_from_range_1:  TK_NUMBER {
Packit Service 54dbc3
                        __parser_str2uint64(&tmp_parser_struct.num_pair[0],$1);
Packit Service 54dbc3
                        free($1);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
number_from_range_2:  TK_NUMBER {
Packit Service 54dbc3
                        __parser_str2uint64(&tmp_parser_struct.num_pair[1],$1);
Packit Service 54dbc3
                        free($1);
Packit Service 54dbc3
                    }
Packit Service 54dbc3
                    ;
Packit Service 54dbc3
Packit Service 54dbc3
%%
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
int osm_qos_parse_policy_file(IN osm_subn_t * p_subn)
Packit Service 54dbc3
{
Packit Service 54dbc3
    int res = 0;
Packit Service 54dbc3
    static boolean_t first_time = TRUE;
Packit Service 54dbc3
    p_qos_parser_osm_log = &p_subn->p_osm->log;
Packit Service 54dbc3
Packit Service 54dbc3
    OSM_LOG_ENTER(p_qos_parser_osm_log);
Packit Service 54dbc3
Packit Service 54dbc3
    osm_qos_policy_destroy(p_subn->p_qos_policy);
Packit Service 54dbc3
    p_subn->p_qos_policy = NULL;
Packit Service 54dbc3
Packit Service 54dbc3
    if (!p_subn->opt.qos_policy_file) {
Packit Service 54dbc3
        OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC06: "
Packit Service 54dbc3
                "QoS policy file name is empty\n");
Packit Service 54dbc3
        res = 1;
Packit Service 54dbc3
        goto Exit;
Packit Service 54dbc3
    }
Packit Service 54dbc3
Packit Service 54dbc3
    yyin = fopen (p_subn->opt.qos_policy_file, "r");
Packit Service 54dbc3
    if (!yyin)
Packit Service 54dbc3
    {
Packit Service 54dbc3
        if (strcmp(p_subn->opt.qos_policy_file,OSM_DEFAULT_QOS_POLICY_FILE)) {
Packit Service 54dbc3
            OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC01: "
Packit Service 54dbc3
                    "Failed opening QoS policy file %s - %s\n",
Packit Service 54dbc3
                    p_subn->opt.qos_policy_file, strerror(errno));
Packit Service 54dbc3
            res = 1;
Packit Service 54dbc3
        }
Packit Service 54dbc3
        else
Packit Service 54dbc3
            OSM_LOG(p_qos_parser_osm_log, OSM_LOG_VERBOSE,
Packit Service 54dbc3
                    "QoS policy file not found (%s)\n",
Packit Service 54dbc3
                    p_subn->opt.qos_policy_file);
Packit Service 54dbc3
Packit Service 54dbc3
        goto Exit;
Packit Service 54dbc3
    }
Packit Service 54dbc3
Packit Service 54dbc3
    if (first_time)
Packit Service 54dbc3
    {
Packit Service 54dbc3
        first_time = FALSE;
Packit Service 54dbc3
        __setup_simple_qos_levels();
Packit Service 54dbc3
        __setup_ulp_match_rules();
Packit Service 54dbc3
        OSM_LOG(p_qos_parser_osm_log, OSM_LOG_INFO,
Packit Service 54dbc3
		"Loading QoS policy file (%s)\n",
Packit Service 54dbc3
                p_subn->opt.qos_policy_file);
Packit Service 54dbc3
    }
Packit Service 54dbc3
    else
Packit Service 54dbc3
        /*
Packit Service 54dbc3
         * ULP match rules list was emptied at the end of
Packit Service 54dbc3
         * previous parsing iteration.
Packit Service 54dbc3
         * What's left is to clear simple QoS levels.
Packit Service 54dbc3
         */
Packit Service 54dbc3
        __clear_simple_qos_levels();
Packit Service 54dbc3
Packit Service 54dbc3
    column_num = 1;
Packit Service 54dbc3
    line_num = 1;
Packit Service 54dbc3
Packit Service 54dbc3
    p_subn->p_qos_policy = osm_qos_policy_create(p_subn);
Packit Service 54dbc3
Packit Service 54dbc3
    __parser_tmp_struct_init();
Packit Service 54dbc3
    p_qos_policy = p_subn->p_qos_policy;
Packit Service 54dbc3
Packit Service 54dbc3
    res = yyparse();
Packit Service 54dbc3
Packit Service 54dbc3
    __parser_tmp_struct_destroy();
Packit Service 54dbc3
Packit Service 54dbc3
    if (res != 0)
Packit Service 54dbc3
    {
Packit Service 54dbc3
        OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC03: "
Packit Service 54dbc3
                "Failed parsing QoS policy file (%s)\n",
Packit Service 54dbc3
                p_subn->opt.qos_policy_file);
Packit Service 54dbc3
        osm_qos_policy_destroy(p_subn->p_qos_policy);
Packit Service 54dbc3
        p_subn->p_qos_policy = NULL;
Packit Service 54dbc3
        res = 1;
Packit Service 54dbc3
        goto Exit;
Packit Service 54dbc3
    }
Packit Service 54dbc3
Packit Service 54dbc3
    /* add generated ULP match rules to the usual match rules */
Packit Service 54dbc3
    __process_ulp_match_rules();
Packit Service 54dbc3
Packit Service 54dbc3
    if (osm_qos_policy_validate(p_subn->p_qos_policy,p_qos_parser_osm_log))
Packit Service 54dbc3
    {
Packit Service 54dbc3
        OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC04: "
Packit Service 54dbc3
                "Error(s) in QoS policy file (%s)\n",
Packit Service 54dbc3
                p_subn->opt.qos_policy_file);
Packit Service 54dbc3
        fprintf(stderr, "Error(s) in QoS policy file (%s)\n",
Packit Service 54dbc3
                p_subn->opt.qos_policy_file);
Packit Service 54dbc3
        osm_qos_policy_destroy(p_subn->p_qos_policy);
Packit Service 54dbc3
        p_subn->p_qos_policy = NULL;
Packit Service 54dbc3
        res = 1;
Packit Service 54dbc3
        goto Exit;
Packit Service 54dbc3
    }
Packit Service 54dbc3
Packit Service 54dbc3
  Exit:
Packit Service 54dbc3
    if (yyin)
Packit Service 54dbc3
    {
Packit Service 54dbc3
        yyrestart(yyin);
Packit Service 54dbc3
        fclose(yyin);
Packit Service 54dbc3
    }
Packit Service 54dbc3
    OSM_LOG_EXIT(p_qos_parser_osm_log);
Packit Service 54dbc3
    return res;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
int yywrap()
Packit Service 54dbc3
{
Packit Service 54dbc3
    return(1);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void yyerror(const char *format, ...)
Packit Service 54dbc3
{
Packit Service 54dbc3
    char s[256];
Packit Service 54dbc3
    va_list pvar;
Packit Service 54dbc3
Packit Service 54dbc3
    OSM_LOG_ENTER(p_qos_parser_osm_log);
Packit Service 54dbc3
Packit Service 54dbc3
    va_start(pvar, format);
Packit Service 54dbc3
    vsnprintf(s, sizeof(s), format, pvar);
Packit Service 54dbc3
    va_end(pvar);
Packit Service 54dbc3
Packit Service 54dbc3
    OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC05: "
Packit Service 54dbc3
            "Syntax error (line %d:%d): %s\n",
Packit Service 54dbc3
            line_num, column_num, s);
Packit Service 54dbc3
    fprintf(stderr, "Error in QoS Policy File (line %d:%d): %s.\n",
Packit Service 54dbc3
            line_num, column_num, s);
Packit Service 54dbc3
    OSM_LOG_EXIT(p_qos_parser_osm_log);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static char * __parser_strip_white(char * str)
Packit Service 54dbc3
{
Packit Service 54dbc3
	char *p;
Packit Service 54dbc3
Packit Service 54dbc3
	while (isspace(*str))
Packit Service 54dbc3
		str++;
Packit Service 54dbc3
	if (!*str)
Packit Service 54dbc3
		return str;
Packit Service 54dbc3
	p = str + strlen(str) - 1;
Packit Service 54dbc3
	while (isspace(*p))
Packit Service 54dbc3
		*p-- = '\0';
Packit Service 54dbc3
Packit Service 54dbc3
	return str;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_str2uint64(uint64_t * p_val, char * str)
Packit Service 54dbc3
{
Packit Service 54dbc3
   *p_val = strtoull(str, NULL, 0);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_port_group_start()
Packit Service 54dbc3
{
Packit Service 54dbc3
    p_current_port_group = osm_qos_policy_port_group_create();
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static int __parser_port_group_end()
Packit Service 54dbc3
{
Packit Service 54dbc3
    if(!p_current_port_group->name)
Packit Service 54dbc3
    {
Packit Service 54dbc3
        yyerror("port-group validation failed - no port group name specified");
Packit Service 54dbc3
        return -1;
Packit Service 54dbc3
    }
Packit Service 54dbc3
Packit Service 54dbc3
    cl_list_insert_tail(&p_qos_policy->port_groups,
Packit Service 54dbc3
                        p_current_port_group);
Packit Service 54dbc3
    p_current_port_group = NULL;
Packit Service 54dbc3
    return 0;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_vlarb_scope_start()
Packit Service 54dbc3
{
Packit Service 54dbc3
    p_current_vlarb_scope = osm_qos_policy_vlarb_scope_create();
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static int __parser_vlarb_scope_end()
Packit Service 54dbc3
{
Packit Service 54dbc3
    if ( !cl_list_count(&p_current_vlarb_scope->group_list) &&
Packit Service 54dbc3
         !cl_list_count(&p_current_vlarb_scope->across_list) )
Packit Service 54dbc3
    {
Packit Service 54dbc3
        yyerror("vlarb-scope validation failed - no port groups specified by 'group' or by 'across'");
Packit Service 54dbc3
        return -1;
Packit Service 54dbc3
    }
Packit Service 54dbc3
Packit Service 54dbc3
    cl_list_insert_tail(&p_qos_policy->vlarb_tables,
Packit Service 54dbc3
                        p_current_vlarb_scope);
Packit Service 54dbc3
    p_current_vlarb_scope = NULL;
Packit Service 54dbc3
    return 0;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_sl2vl_scope_start()
Packit Service 54dbc3
{
Packit Service 54dbc3
    p_current_sl2vl_scope = osm_qos_policy_sl2vl_scope_create();
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static int __parser_sl2vl_scope_end()
Packit Service 54dbc3
{
Packit Service 54dbc3
    if (!p_current_sl2vl_scope->sl2vl_table_set)
Packit Service 54dbc3
    {
Packit Service 54dbc3
        yyerror("sl2vl-scope validation failed - no sl2vl table specified");
Packit Service 54dbc3
        return -1;
Packit Service 54dbc3
    }
Packit Service 54dbc3
    if ( !cl_list_count(&p_current_sl2vl_scope->group_list) &&
Packit Service 54dbc3
         !cl_list_count(&p_current_sl2vl_scope->across_to_list) &&
Packit Service 54dbc3
         !cl_list_count(&p_current_sl2vl_scope->across_from_list) )
Packit Service 54dbc3
    {
Packit Service 54dbc3
        yyerror("sl2vl-scope validation failed - no port groups specified by 'group', 'across-to' or 'across-from'");
Packit Service 54dbc3
        return -1;
Packit Service 54dbc3
    }
Packit Service 54dbc3
Packit Service 54dbc3
    cl_list_insert_tail(&p_qos_policy->sl2vl_tables,
Packit Service 54dbc3
                        p_current_sl2vl_scope);
Packit Service 54dbc3
    p_current_sl2vl_scope = NULL;
Packit Service 54dbc3
    return 0;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_qos_level_start()
Packit Service 54dbc3
{
Packit Service 54dbc3
    p_current_qos_level = osm_qos_policy_qos_level_create();
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static int __parser_qos_level_end()
Packit Service 54dbc3
{
Packit Service 54dbc3
    if (!p_current_qos_level->sl_set)
Packit Service 54dbc3
    {
Packit Service 54dbc3
        yyerror("qos-level validation failed - no 'sl' specified");
Packit Service 54dbc3
        return -1;
Packit Service 54dbc3
    }
Packit Service 54dbc3
    if (!p_current_qos_level->name)
Packit Service 54dbc3
    {
Packit Service 54dbc3
        yyerror("qos-level validation failed - no 'name' specified");
Packit Service 54dbc3
        return -1;
Packit Service 54dbc3
    }
Packit Service 54dbc3
Packit Service 54dbc3
    cl_list_insert_tail(&p_qos_policy->qos_levels,
Packit Service 54dbc3
                        p_current_qos_level);
Packit Service 54dbc3
    p_current_qos_level = NULL;
Packit Service 54dbc3
    return 0;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_match_rule_start()
Packit Service 54dbc3
{
Packit Service 54dbc3
    p_current_qos_match_rule = osm_qos_policy_match_rule_create();
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static int __parser_match_rule_end()
Packit Service 54dbc3
{
Packit Service 54dbc3
    if (!p_current_qos_match_rule->qos_level_name)
Packit Service 54dbc3
    {
Packit Service 54dbc3
        yyerror("match-rule validation failed - no 'qos-level-name' specified");
Packit Service 54dbc3
        return -1;
Packit Service 54dbc3
    }
Packit Service 54dbc3
Packit Service 54dbc3
    cl_list_insert_tail(&p_qos_policy->qos_match_rules,
Packit Service 54dbc3
                        p_current_qos_match_rule);
Packit Service 54dbc3
    p_current_qos_match_rule = NULL;
Packit Service 54dbc3
    return 0;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_ulp_match_rule_start()
Packit Service 54dbc3
{
Packit Service 54dbc3
    p_current_qos_match_rule = osm_qos_policy_match_rule_create();
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static int __parser_ulp_match_rule_end()
Packit Service 54dbc3
{
Packit Service 54dbc3
    CL_ASSERT(p_current_qos_match_rule->p_qos_level);
Packit Service 54dbc3
    cl_list_insert_tail(&__ulp_match_rules,
Packit Service 54dbc3
                        p_current_qos_match_rule);
Packit Service 54dbc3
    p_current_qos_match_rule = NULL;
Packit Service 54dbc3
    return 0;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_tmp_struct_init()
Packit Service 54dbc3
{
Packit Service 54dbc3
    tmp_parser_struct.str[0] = '\0';
Packit Service 54dbc3
    cl_list_construct(&tmp_parser_struct.str_list);
Packit Service 54dbc3
    cl_list_init(&tmp_parser_struct.str_list, 10);
Packit Service 54dbc3
    cl_list_construct(&tmp_parser_struct.num_list);
Packit Service 54dbc3
    cl_list_init(&tmp_parser_struct.num_list, 10);
Packit Service 54dbc3
    cl_list_construct(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
    cl_list_init(&tmp_parser_struct.num_pair_list, 10);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
/*
Packit Service 54dbc3
 * Do NOT free objects from the temp struct.
Packit Service 54dbc3
 * Either they are inserted into the parse tree data
Packit Service 54dbc3
 * structure, or they are already freed when copying
Packit Service 54dbc3
 * their values to the parse tree data structure.
Packit Service 54dbc3
 */
Packit Service 54dbc3
static void __parser_tmp_struct_reset()
Packit Service 54dbc3
{
Packit Service 54dbc3
    tmp_parser_struct.str[0] = '\0';
Packit Service 54dbc3
    cl_list_remove_all(&tmp_parser_struct.str_list);
Packit Service 54dbc3
    cl_list_remove_all(&tmp_parser_struct.num_list);
Packit Service 54dbc3
    cl_list_remove_all(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_tmp_struct_destroy()
Packit Service 54dbc3
{
Packit Service 54dbc3
    __parser_tmp_struct_reset();
Packit Service 54dbc3
    cl_list_destroy(&tmp_parser_struct.str_list);
Packit Service 54dbc3
    cl_list_destroy(&tmp_parser_struct.num_list);
Packit Service 54dbc3
    cl_list_destroy(&tmp_parser_struct.num_pair_list);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
#define __SIMPLE_QOS_LEVEL_NAME "SimpleQoSLevel_SL"
Packit Service 54dbc3
#define __SIMPLE_QOS_LEVEL_DEFAULT_NAME "SimpleQoSLevel_DEFAULT"
Packit Service 54dbc3
Packit Service 54dbc3
static void __setup_simple_qos_levels()
Packit Service 54dbc3
{
Packit Service 54dbc3
    uint8_t i;
Packit Service 54dbc3
    char tmp_buf[30];
Packit Service 54dbc3
    memset(osm_qos_policy_simple_qos_levels, 0,
Packit Service 54dbc3
           sizeof(osm_qos_policy_simple_qos_levels));
Packit Service 54dbc3
    for (i = 0; i < 16; i++)
Packit Service 54dbc3
    {
Packit Service 54dbc3
        osm_qos_policy_simple_qos_levels[i].sl = i;
Packit Service 54dbc3
        osm_qos_policy_simple_qos_levels[i].sl_set = TRUE;
Packit Service 54dbc3
        sprintf(tmp_buf, "%s%u", __SIMPLE_QOS_LEVEL_NAME, i);
Packit Service 54dbc3
        osm_qos_policy_simple_qos_levels[i].name = strdup(tmp_buf);
Packit Service 54dbc3
    }
Packit Service 54dbc3
Packit Service 54dbc3
    memset(&__default_simple_qos_level, 0,
Packit Service 54dbc3
           sizeof(__default_simple_qos_level));
Packit Service 54dbc3
    __default_simple_qos_level.name =
Packit Service 54dbc3
           strdup(__SIMPLE_QOS_LEVEL_DEFAULT_NAME);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __clear_simple_qos_levels()
Packit Service 54dbc3
{
Packit Service 54dbc3
    /*
Packit Service 54dbc3
     * Simple QoS levels are static.
Packit Service 54dbc3
     * What's left is to invalidate default simple QoS level.
Packit Service 54dbc3
     */
Packit Service 54dbc3
    __default_simple_qos_level.sl_set = FALSE;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __setup_ulp_match_rules()
Packit Service 54dbc3
{
Packit Service 54dbc3
    cl_list_construct(&__ulp_match_rules);
Packit Service 54dbc3
    cl_list_init(&__ulp_match_rules, 10);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __process_ulp_match_rules()
Packit Service 54dbc3
{
Packit Service 54dbc3
    cl_list_iterator_t list_iterator;
Packit Service 54dbc3
    osm_qos_match_rule_t *p_qos_match_rule = NULL;
Packit Service 54dbc3
Packit Service 54dbc3
    list_iterator = cl_list_head(&__ulp_match_rules);
Packit Service 54dbc3
    while (list_iterator != cl_list_end(&__ulp_match_rules))
Packit Service 54dbc3
    {
Packit Service 54dbc3
        p_qos_match_rule = (osm_qos_match_rule_t *) cl_list_obj(list_iterator);
Packit Service 54dbc3
        if (p_qos_match_rule)
Packit Service 54dbc3
            cl_list_insert_tail(&p_qos_policy->qos_match_rules,
Packit Service 54dbc3
                                p_qos_match_rule);
Packit Service 54dbc3
        list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
    }
Packit Service 54dbc3
    cl_list_remove_all(&__ulp_match_rules);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static int __cmp_num_range(const void * p1, const void * p2)
Packit Service 54dbc3
{
Packit Service 54dbc3
    uint64_t * pair1 = *((uint64_t **)p1);
Packit Service 54dbc3
    uint64_t * pair2 = *((uint64_t **)p2);
Packit Service 54dbc3
Packit Service 54dbc3
    if (pair1[0] < pair2[0])
Packit Service 54dbc3
        return -1;
Packit Service 54dbc3
    if (pair1[0] > pair2[0])
Packit Service 54dbc3
        return 1;
Packit Service 54dbc3
Packit Service 54dbc3
    if (pair1[1] < pair2[1])
Packit Service 54dbc3
        return -1;
Packit Service 54dbc3
    if (pair1[1] > pair2[1])
Packit Service 54dbc3
        return 1;
Packit Service 54dbc3
Packit Service 54dbc3
    return 0;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __sort_reduce_rangearr(
Packit Service 54dbc3
    uint64_t  **   arr,
Packit Service 54dbc3
    unsigned       arr_len,
Packit Service 54dbc3
    uint64_t  ** * p_res_arr,
Packit Service 54dbc3
    unsigned     * p_res_arr_len )
Packit Service 54dbc3
{
Packit Service 54dbc3
    unsigned i = 0;
Packit Service 54dbc3
    unsigned j = 0;
Packit Service 54dbc3
    unsigned last_valid_ind = 0;
Packit Service 54dbc3
    unsigned valid_cnt = 0;
Packit Service 54dbc3
    uint64_t ** res_arr;
Packit Service 54dbc3
    boolean_t * is_valid_arr;
Packit Service 54dbc3
Packit Service 54dbc3
    *p_res_arr = NULL;
Packit Service 54dbc3
    *p_res_arr_len = 0;
Packit Service 54dbc3
Packit Service 54dbc3
    qsort(arr, arr_len, sizeof(uint64_t*), __cmp_num_range);
Packit Service 54dbc3
Packit Service 54dbc3
    is_valid_arr = (boolean_t *)malloc(arr_len * sizeof(boolean_t));
Packit Service 54dbc3
    is_valid_arr[last_valid_ind] = TRUE;
Packit Service 54dbc3
    valid_cnt++;
Packit Service 54dbc3
    for (i = 1; i < arr_len; i++)
Packit Service 54dbc3
    {
Packit Service 54dbc3
        if (arr[i][0] <= arr[last_valid_ind][1])
Packit Service 54dbc3
        {
Packit Service 54dbc3
            if (arr[i][1] > arr[last_valid_ind][1])
Packit Service 54dbc3
                arr[last_valid_ind][1] = arr[i][1];
Packit Service 54dbc3
            free(arr[i]);
Packit Service 54dbc3
            arr[i] = NULL;
Packit Service 54dbc3
            is_valid_arr[i] = FALSE;
Packit Service 54dbc3
        }
Packit Service 54dbc3
        else if ((arr[i][0] - 1) == arr[last_valid_ind][1])
Packit Service 54dbc3
        {
Packit Service 54dbc3
            arr[last_valid_ind][1] = arr[i][1];
Packit Service 54dbc3
            free(arr[i]);
Packit Service 54dbc3
            arr[i] = NULL;
Packit Service 54dbc3
            is_valid_arr[i] = FALSE;
Packit Service 54dbc3
        }
Packit Service 54dbc3
        else
Packit Service 54dbc3
        {
Packit Service 54dbc3
            is_valid_arr[i] = TRUE;
Packit Service 54dbc3
            last_valid_ind = i;
Packit Service 54dbc3
            valid_cnt++;
Packit Service 54dbc3
        }
Packit Service 54dbc3
    }
Packit Service 54dbc3
Packit Service 54dbc3
    res_arr = (uint64_t **)malloc(valid_cnt * sizeof(uint64_t *));
Packit Service 54dbc3
    for (i = 0; i < arr_len; i++)
Packit Service 54dbc3
    {
Packit Service 54dbc3
        if (is_valid_arr[i])
Packit Service 54dbc3
            res_arr[j++] = arr[i];
Packit Service 54dbc3
    }
Packit Service 54dbc3
    free(is_valid_arr);
Packit Service 54dbc3
    free(arr);
Packit Service 54dbc3
Packit Service 54dbc3
    *p_res_arr = res_arr;
Packit Service 54dbc3
    *p_res_arr_len = valid_cnt;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __pkey_rangelist2rangearr(
Packit Service 54dbc3
    cl_list_t    * p_list,
Packit Service 54dbc3
    uint64_t  ** * p_arr,
Packit Service 54dbc3
    unsigned     * p_arr_len)
Packit Service 54dbc3
{
Packit Service 54dbc3
    uint64_t   tmp_pkey;
Packit Service 54dbc3
    uint64_t * p_pkeys;
Packit Service 54dbc3
    cl_list_iterator_t list_iterator;
Packit Service 54dbc3
Packit Service 54dbc3
    list_iterator= cl_list_head(p_list);
Packit Service 54dbc3
    while( list_iterator != cl_list_end(p_list) )
Packit Service 54dbc3
    {
Packit Service 54dbc3
       p_pkeys = (uint64_t *)cl_list_obj(list_iterator);
Packit Service 54dbc3
       p_pkeys[0] &= 0x7fff;
Packit Service 54dbc3
       p_pkeys[1] &= 0x7fff;
Packit Service 54dbc3
       if (p_pkeys[0] > p_pkeys[1])
Packit Service 54dbc3
       {
Packit Service 54dbc3
           tmp_pkey = p_pkeys[1];
Packit Service 54dbc3
           p_pkeys[1] = p_pkeys[0];
Packit Service 54dbc3
           p_pkeys[0] = tmp_pkey;
Packit Service 54dbc3
       }
Packit Service 54dbc3
       list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
    }
Packit Service 54dbc3
Packit Service 54dbc3
    __rangelist2rangearr(p_list, p_arr, p_arr_len);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __rangelist2rangearr(
Packit Service 54dbc3
    cl_list_t    * p_list,
Packit Service 54dbc3
    uint64_t  ** * p_arr,
Packit Service 54dbc3
    unsigned     * p_arr_len)
Packit Service 54dbc3
{
Packit Service 54dbc3
    cl_list_iterator_t list_iterator;
Packit Service 54dbc3
    unsigned len = cl_list_count(p_list);
Packit Service 54dbc3
    unsigned i = 0;
Packit Service 54dbc3
    uint64_t ** tmp_arr;
Packit Service 54dbc3
    uint64_t ** res_arr = NULL;
Packit Service 54dbc3
    unsigned res_arr_len = 0;
Packit Service 54dbc3
Packit Service 54dbc3
    tmp_arr = (uint64_t **)malloc(len * sizeof(uint64_t *));
Packit Service 54dbc3
Packit Service 54dbc3
    list_iterator = cl_list_head(p_list);
Packit Service 54dbc3
    while( list_iterator != cl_list_end(p_list) )
Packit Service 54dbc3
    {
Packit Service 54dbc3
       tmp_arr[i++] = (uint64_t *)cl_list_obj(list_iterator);
Packit Service 54dbc3
       list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
    }
Packit Service 54dbc3
    cl_list_remove_all(p_list);
Packit Service 54dbc3
Packit Service 54dbc3
    __sort_reduce_rangearr( tmp_arr,
Packit Service 54dbc3
                            len,
Packit Service 54dbc3
                            &res_arr,
Packit Service 54dbc3
                            &res_arr_len );
Packit Service 54dbc3
    *p_arr = res_arr;
Packit Service 54dbc3
    *p_arr_len = res_arr_len;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __merge_rangearr(
Packit Service 54dbc3
    uint64_t  **   range_arr_1,
Packit Service 54dbc3
    unsigned       range_len_1,
Packit Service 54dbc3
    uint64_t  **   range_arr_2,
Packit Service 54dbc3
    unsigned       range_len_2,
Packit Service 54dbc3
    uint64_t  ** * p_arr,
Packit Service 54dbc3
    unsigned     * p_arr_len )
Packit Service 54dbc3
{
Packit Service 54dbc3
    unsigned i = 0;
Packit Service 54dbc3
    unsigned j = 0;
Packit Service 54dbc3
    unsigned len = range_len_1 + range_len_2;
Packit Service 54dbc3
    uint64_t ** tmp_arr;
Packit Service 54dbc3
    uint64_t ** res_arr = NULL;
Packit Service 54dbc3
    unsigned res_arr_len = 0;
Packit Service 54dbc3
Packit Service 54dbc3
    *p_arr = NULL;
Packit Service 54dbc3
    *p_arr_len = 0;
Packit Service 54dbc3
Packit Service 54dbc3
    tmp_arr = (uint64_t **)malloc(len * sizeof(uint64_t *));
Packit Service 54dbc3
Packit Service 54dbc3
    for (i = 0; i < range_len_1; i++)
Packit Service 54dbc3
       tmp_arr[j++] = range_arr_1[i];
Packit Service 54dbc3
    for (i = 0; i < range_len_2; i++)
Packit Service 54dbc3
       tmp_arr[j++] = range_arr_2[i];
Packit Service 54dbc3
    free(range_arr_1);
Packit Service 54dbc3
    free(range_arr_2);
Packit Service 54dbc3
Packit Service 54dbc3
    __sort_reduce_rangearr( tmp_arr,
Packit Service 54dbc3
                            len,
Packit Service 54dbc3
                            &res_arr,
Packit Service 54dbc3
                            &res_arr_len );
Packit Service 54dbc3
    *p_arr = res_arr;
Packit Service 54dbc3
    *p_arr_len = res_arr_len;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_add_port_to_port_map(
Packit Service 54dbc3
    cl_qmap_t   * p_map,
Packit Service 54dbc3
    osm_physp_t * p_physp)
Packit Service 54dbc3
{
Packit Service 54dbc3
    if (cl_qmap_get(p_map, cl_ntoh64(osm_physp_get_port_guid(p_physp))) ==
Packit Service 54dbc3
        cl_qmap_end(p_map))
Packit Service 54dbc3
    {
Packit Service 54dbc3
        osm_qos_port_t * p_port = osm_qos_policy_port_create(p_physp);
Packit Service 54dbc3
        if (p_port)
Packit Service 54dbc3
            cl_qmap_insert(p_map,
Packit Service 54dbc3
                           cl_ntoh64(osm_physp_get_port_guid(p_physp)),
Packit Service 54dbc3
                           &p_port->map_item);
Packit Service 54dbc3
    }
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_add_guid_range_to_port_map(
Packit Service 54dbc3
    cl_qmap_t  * p_map,
Packit Service 54dbc3
    uint64_t  ** range_arr,
Packit Service 54dbc3
    unsigned     range_len)
Packit Service 54dbc3
{
Packit Service 54dbc3
    unsigned i;
Packit Service 54dbc3
    uint64_t guid_ho;
Packit Service 54dbc3
    osm_port_t * p_osm_port;
Packit Service 54dbc3
Packit Service 54dbc3
    if (!range_arr || !range_len)
Packit Service 54dbc3
        return;
Packit Service 54dbc3
Packit Service 54dbc3
    for (i = 0; i < range_len; i++) {
Packit Service 54dbc3
         for (guid_ho = range_arr[i][0]; guid_ho <= range_arr[i][1]; guid_ho++) {
Packit Service 54dbc3
             p_osm_port =
Packit Service 54dbc3
                osm_get_port_by_guid(p_qos_policy->p_subn, cl_hton64(guid_ho));
Packit Service 54dbc3
             if (p_osm_port)
Packit Service 54dbc3
                 __parser_add_port_to_port_map(p_map, p_osm_port->p_physp);
Packit Service 54dbc3
         }
Packit Service 54dbc3
         free(range_arr[i]);
Packit Service 54dbc3
    }
Packit Service 54dbc3
    free(range_arr);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_add_pkey_range_to_port_map(
Packit Service 54dbc3
    cl_qmap_t  * p_map,
Packit Service 54dbc3
    uint64_t  ** range_arr,
Packit Service 54dbc3
    unsigned     range_len)
Packit Service 54dbc3
{
Packit Service 54dbc3
    unsigned i;
Packit Service 54dbc3
    uint64_t pkey_64;
Packit Service 54dbc3
    ib_net16_t pkey;
Packit Service 54dbc3
    osm_prtn_t * p_prtn;
Packit Service 54dbc3
Packit Service 54dbc3
    if (!range_arr || !range_len)
Packit Service 54dbc3
        return;
Packit Service 54dbc3
Packit Service 54dbc3
    for (i = 0; i < range_len; i++) {
Packit Service 54dbc3
         for (pkey_64 = range_arr[i][0]; pkey_64 <= range_arr[i][1]; pkey_64++) {
Packit Service 54dbc3
             pkey = cl_hton16((uint16_t)(pkey_64 & 0x7fff));
Packit Service 54dbc3
             p_prtn = (osm_prtn_t *)
Packit Service 54dbc3
                 cl_qmap_get(&p_qos_policy->p_subn->prtn_pkey_tbl, pkey);
Packit Service 54dbc3
             if (p_prtn != (osm_prtn_t *)cl_qmap_end(
Packit Service 54dbc3
                   &p_qos_policy->p_subn->prtn_pkey_tbl)) {
Packit Service 54dbc3
                 __parser_add_map_to_port_map(p_map, &p_prtn->part_guid_tbl);
Packit Service 54dbc3
                 __parser_add_map_to_port_map(p_map, &p_prtn->full_guid_tbl);
Packit Service 54dbc3
             }
Packit Service 54dbc3
         }
Packit Service 54dbc3
         free(range_arr[i]);
Packit Service 54dbc3
    }
Packit Service 54dbc3
    free(range_arr);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_add_partition_list_to_port_map(
Packit Service 54dbc3
    cl_qmap_t  * p_map,
Packit Service 54dbc3
    cl_list_t  * p_list)
Packit Service 54dbc3
{
Packit Service 54dbc3
    cl_list_iterator_t    list_iterator;
Packit Service 54dbc3
    char                * tmp_str;
Packit Service 54dbc3
    osm_prtn_t          * p_prtn;
Packit Service 54dbc3
Packit Service 54dbc3
    /* extract all the ports from the partition
Packit Service 54dbc3
       to the port map of this port group */
Packit Service 54dbc3
    list_iterator = cl_list_head(p_list);
Packit Service 54dbc3
    while(list_iterator != cl_list_end(p_list)) {
Packit Service 54dbc3
        tmp_str = (char*)cl_list_obj(list_iterator);
Packit Service 54dbc3
        if (tmp_str) {
Packit Service 54dbc3
            p_prtn = osm_prtn_find_by_name(p_qos_policy->p_subn, tmp_str);
Packit Service 54dbc3
            if (p_prtn) {
Packit Service 54dbc3
                __parser_add_map_to_port_map(p_map, &p_prtn->part_guid_tbl);
Packit Service 54dbc3
                __parser_add_map_to_port_map(p_map, &p_prtn->full_guid_tbl);
Packit Service 54dbc3
            }
Packit Service 54dbc3
            free(tmp_str);
Packit Service 54dbc3
        }
Packit Service 54dbc3
        list_iterator = cl_list_next(list_iterator);
Packit Service 54dbc3
    }
Packit Service 54dbc3
    cl_list_remove_all(p_list);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static void __parser_add_map_to_port_map(
Packit Service 54dbc3
    cl_qmap_t * p_dmap,
Packit Service 54dbc3
    cl_map_t  * p_smap)
Packit Service 54dbc3
{
Packit Service 54dbc3
    cl_map_iterator_t map_iterator;
Packit Service 54dbc3
    osm_physp_t * p_physp;
Packit Service 54dbc3
Packit Service 54dbc3
    if (!p_dmap || !p_smap)
Packit Service 54dbc3
        return;
Packit Service 54dbc3
Packit Service 54dbc3
    map_iterator = cl_map_head(p_smap);
Packit Service 54dbc3
    while (map_iterator != cl_map_end(p_smap)) {
Packit Service 54dbc3
        p_physp = (osm_physp_t*)cl_map_obj(map_iterator);
Packit Service 54dbc3
        __parser_add_port_to_port_map(p_dmap, p_physp);
Packit Service 54dbc3
        map_iterator = cl_map_next(map_iterator);
Packit Service 54dbc3
    }
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
static int __validate_pkeys( uint64_t ** range_arr,
Packit Service 54dbc3
                             unsigned    range_len,
Packit Service 54dbc3
                             boolean_t   is_ipoib)
Packit Service 54dbc3
{
Packit Service 54dbc3
    unsigned i;
Packit Service 54dbc3
    uint64_t pkey_64;
Packit Service 54dbc3
    ib_net16_t pkey;
Packit Service 54dbc3
    osm_prtn_t * p_prtn;
Packit Service 54dbc3
Packit Service 54dbc3
    if (!range_arr || !range_len)
Packit Service 54dbc3
        return 0;
Packit Service 54dbc3
Packit Service 54dbc3
    for (i = 0; i < range_len; i++) {
Packit Service 54dbc3
        for (pkey_64 = range_arr[i][0]; pkey_64 <= range_arr[i][1]; pkey_64++) {
Packit Service 54dbc3
            pkey = cl_hton16((uint16_t)(pkey_64 & 0x7fff));
Packit Service 54dbc3
            p_prtn = (osm_prtn_t *)
Packit Service 54dbc3
                cl_qmap_get(&p_qos_policy->p_subn->prtn_pkey_tbl, pkey);
Packit Service 54dbc3
Packit Service 54dbc3
            if (p_prtn == (osm_prtn_t *)cl_qmap_end(
Packit Service 54dbc3
                  &p_qos_policy->p_subn->prtn_pkey_tbl))
Packit Service 54dbc3
                p_prtn = NULL;
Packit Service 54dbc3
Packit Service 54dbc3
            if (is_ipoib) {
Packit Service 54dbc3
                /*
Packit Service 54dbc3
                 * Be very strict for IPoIB partition:
Packit Service 54dbc3
                 *  - the partition for the pkey have to exist
Packit Service 54dbc3
                 *  - it has to have at least 2 full members
Packit Service 54dbc3
                 */
Packit Service 54dbc3
                if (!p_prtn) {
Packit Service 54dbc3
                    yyerror("IPoIB partition, pkey 0x%04X - "
Packit Service 54dbc3
                                       "partition doesn't exist",
Packit Service 54dbc3
                                       cl_ntoh16(pkey));
Packit Service 54dbc3
                    return 1;
Packit Service 54dbc3
                }
Packit Service 54dbc3
                else if (cl_map_count(&p_prtn->full_guid_tbl) < 2) {
Packit Service 54dbc3
                    yyerror("IPoIB partition, pkey 0x%04X - "
Packit Service 54dbc3
                                       "partition has less than two full members",
Packit Service 54dbc3
                                       cl_ntoh16(pkey));
Packit Service 54dbc3
                    return 1;
Packit Service 54dbc3
                }
Packit Service 54dbc3
            }
Packit Service 54dbc3
            else if (!p_prtn) {
Packit Service 54dbc3
                /*
Packit Service 54dbc3
                 * For non-IPoIB pkey we just want to check that
Packit Service 54dbc3
                 * the relevant partition exists.
Packit Service 54dbc3
                 * And even if it doesn't, don't exit - just print
Packit Service 54dbc3
                 * error message and continue.
Packit Service 54dbc3
                 */
Packit Service 54dbc3
                 OSM_LOG(p_qos_parser_osm_log, OSM_LOG_ERROR, "ERR AC02: "
Packit Service 54dbc3
			 "pkey 0x%04X - partition doesn't exist",
Packit Service 54dbc3
                         cl_ntoh16(pkey));
Packit Service 54dbc3
            }
Packit Service 54dbc3
        }
Packit Service 54dbc3
    }
Packit Service 54dbc3
    return 0;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/***************************************************
Packit Service 54dbc3
 ***************************************************/