|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2006-2008 Voltaire, Inc. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2012-2015 Mellanox Technologies LTD. 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 |
* Implementation of opensm partition management configuration
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#if HAVE_CONFIG_H
|
|
Packit Service |
54dbc3 |
# include <config.h>
|
|
Packit Service |
54dbc3 |
#endif /* HAVE_CONFIG_H */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#include <stdlib.h>
|
|
Packit Service |
54dbc3 |
#include <stdio.h>
|
|
Packit Service |
54dbc3 |
#include <string.h>
|
|
Packit Service |
54dbc3 |
#include <errno.h>
|
|
Packit Service |
54dbc3 |
#include <ctype.h>
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#include <iba/ib_types.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_file_ids.h>
|
|
Packit Service |
54dbc3 |
#define FILE_ID OSM_FILE_PRTN_CONFIG_C
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_base.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_partition.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_subnet.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_log.h>
|
|
Packit Service |
54dbc3 |
#include <arpa/inet.h>
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
typedef enum {
|
|
Packit Service |
54dbc3 |
LIMITED,
|
|
Packit Service |
54dbc3 |
FULL,
|
|
Packit Service |
54dbc3 |
BOTH
|
|
Packit Service |
54dbc3 |
} membership_t;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
const ib_gid_t osm_ipoib_broadcast_mgid = {
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
0xff, /* multicast field */
|
|
Packit Service |
54dbc3 |
0x12, /* non-permanent bit, link local scope */
|
|
Packit Service |
54dbc3 |
0x40, 0x1b, /* IPv4 signature */
|
|
Packit Service |
54dbc3 |
0xff, 0xff, /* 16 bits of P_Key (to be filled in) */
|
|
Packit Service |
54dbc3 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 bits of zeros */
|
|
Packit Service |
54dbc3 |
0xff, 0xff, 0xff, 0xff, /* 32 bit IPv4 broadcast address */
|
|
Packit Service |
54dbc3 |
},
|
|
Packit Service |
54dbc3 |
};
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
struct group_flags {
|
|
Packit Service |
54dbc3 |
unsigned mtu, rate, sl, scope_mask;
|
|
Packit Service |
54dbc3 |
uint32_t Q_Key;
|
|
Packit Service |
54dbc3 |
uint8_t TClass;
|
|
Packit Service |
54dbc3 |
uint32_t FlowLabel;
|
|
Packit Service |
54dbc3 |
};
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
struct precreate_mgroup {
|
|
Packit Service |
54dbc3 |
ib_gid_t mgid;
|
|
Packit Service |
54dbc3 |
struct group_flags flags;
|
|
Packit Service |
54dbc3 |
};
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
struct part_conf {
|
|
Packit Service |
54dbc3 |
osm_log_t *p_log;
|
|
Packit Service |
54dbc3 |
osm_subn_t *p_subn;
|
|
Packit Service |
54dbc3 |
osm_prtn_t *p_prtn;
|
|
Packit Service |
54dbc3 |
unsigned is_ipoib;
|
|
Packit Service |
54dbc3 |
struct group_flags flags;
|
|
Packit Service |
54dbc3 |
membership_t membership;
|
|
Packit Service |
54dbc3 |
boolean_t indx0;
|
|
Packit Service |
54dbc3 |
};
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
extern osm_prtn_t *osm_prtn_make_new(osm_log_t * p_log, osm_subn_t * p_subn,
|
|
Packit Service |
54dbc3 |
const char *name, uint16_t pkey);
|
|
Packit Service |
54dbc3 |
extern ib_api_status_t osm_prtn_add_all(osm_log_t * p_log, osm_subn_t * p_subn,
|
|
Packit Service |
54dbc3 |
osm_prtn_t * p, unsigned type,
|
|
Packit Service |
54dbc3 |
boolean_t full, boolean_t indx0);
|
|
Packit Service |
54dbc3 |
extern ib_api_status_t osm_prtn_add_port(osm_log_t * p_log,
|
|
Packit Service |
54dbc3 |
osm_subn_t * p_subn, osm_prtn_t * p,
|
|
Packit Service |
54dbc3 |
ib_net64_t guid, boolean_t full,
|
|
Packit Service |
54dbc3 |
boolean_t indx0);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
ib_api_status_t osm_prtn_add_mcgroup(osm_log_t * p_log, osm_subn_t * p_subn,
|
|
Packit Service |
54dbc3 |
osm_prtn_t * p, uint8_t rate, uint8_t mtu,
|
|
Packit Service |
54dbc3 |
uint8_t sl, uint8_t scope, uint32_t Q_Key,
|
|
Packit Service |
54dbc3 |
uint8_t TClass, uint32_t FlowLabel,
|
|
Packit Service |
54dbc3 |
const ib_gid_t *mgid);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static inline boolean_t mgid_is_broadcast(const ib_gid_t *mgid)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
return (memcmp(mgid, &osm_ipoib_broadcast_mgid,
|
|
Packit Service |
54dbc3 |
sizeof(osm_ipoib_broadcast_mgid)) == 0);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static inline boolean_t mgid_is_ip(const ib_gid_t *mgid)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
ib_net16_t ipsig = mgid->ip_multicast.signature;
|
|
Packit Service |
54dbc3 |
return (ipsig == cl_hton16(0x401b) || ipsig == cl_hton16(0x601b));
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static inline boolean_t ip_mgroup_pkey_ok(struct part_conf *conf,
|
|
Packit Service |
54dbc3 |
struct precreate_mgroup *group)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
ib_net16_t mpkey = group->mgid.ip_multicast.p_key;
|
|
Packit Service |
54dbc3 |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (mgid_is_broadcast(&group->mgid)
|
|
Packit Service |
54dbc3 |
/* user requested "wild card" of pkey */
|
|
Packit Service |
54dbc3 |
|| mpkey == 0x0000
|
|
Packit Service |
54dbc3 |
/* user was smart enough to match */
|
|
Packit Service |
54dbc3 |
|| mpkey == (conf->p_prtn->pkey | cl_hton16(0x8000)))
|
|
Packit Service |
54dbc3 |
return (TRUE);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG(conf->p_log, OSM_LOG_ERROR,
|
|
Packit Service |
54dbc3 |
"IP MC group (%s) specified with invalid pkey 0x%04x "
|
|
Packit Service |
54dbc3 |
"for partition pkey = 0x%04x (%s)\n",
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, group->mgid.raw, gid_str, sizeof gid_str),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(mpkey), cl_ntoh16(conf->p_prtn->pkey), conf->p_prtn->name);
|
|
Packit Service |
54dbc3 |
return (FALSE);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static inline boolean_t ip_mgroup_rate_ok(struct part_conf *conf,
|
|
Packit Service |
54dbc3 |
struct precreate_mgroup *group)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (group->flags.rate == conf->flags.rate)
|
|
Packit Service |
54dbc3 |
return (TRUE);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG(conf->p_log, OSM_LOG_ERROR,
|
|
Packit Service |
54dbc3 |
"IP MC group (%s) specified with invalid rate (%d): "
|
|
Packit Service |
54dbc3 |
"partition pkey = 0x%04x (%s) "
|
|
Packit Service |
54dbc3 |
"[Partition broadcast group rate = %d]\n",
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, group->mgid.raw, gid_str, sizeof gid_str),
|
|
Packit Service |
54dbc3 |
group->flags.rate, cl_ntoh16(conf->p_prtn->pkey),
|
|
Packit Service |
54dbc3 |
conf->p_prtn->name, conf->flags.rate);
|
|
Packit Service |
54dbc3 |
return (FALSE);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static inline boolean_t ip_mgroup_mtu_ok(struct part_conf *conf,
|
|
Packit Service |
54dbc3 |
struct precreate_mgroup *group)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (group->flags.mtu == conf->flags.mtu)
|
|
Packit Service |
54dbc3 |
return (TRUE);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG(conf->p_log, OSM_LOG_ERROR,
|
|
Packit Service |
54dbc3 |
"IP MC group (%s) specified with invalid mtu (%d): "
|
|
Packit Service |
54dbc3 |
"partition pkey = 0x%04x (%s) "
|
|
Packit Service |
54dbc3 |
"[Partition broadcast group mtu = %d]\n",
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, group->mgid.raw, gid_str, sizeof gid_str),
|
|
Packit Service |
54dbc3 |
group->flags.mtu, cl_ntoh16(conf->p_prtn->pkey),
|
|
Packit Service |
54dbc3 |
conf->p_prtn->name, conf->flags.mtu);
|
|
Packit Service |
54dbc3 |
return (FALSE);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void __create_mgrp(struct part_conf *conf, struct precreate_mgroup *group)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
unsigned int scope;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!group->flags.scope_mask) {
|
|
Packit Service |
54dbc3 |
osm_prtn_add_mcgroup(conf->p_log, conf->p_subn, conf->p_prtn,
|
|
Packit Service |
54dbc3 |
(uint8_t) group->flags.rate,
|
|
Packit Service |
54dbc3 |
(uint8_t) group->flags.mtu,
|
|
Packit Service |
54dbc3 |
group->flags.sl,
|
|
Packit Service |
54dbc3 |
0,
|
|
Packit Service |
54dbc3 |
group->flags.Q_Key,
|
|
Packit Service |
54dbc3 |
group->flags.TClass,
|
|
Packit Service |
54dbc3 |
group->flags.FlowLabel,
|
|
Packit Service |
54dbc3 |
&group->mgid);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
for (scope = 0; scope < 16; scope++) {
|
|
Packit Service |
54dbc3 |
if (((1<<scope) & group->flags.scope_mask) == 0)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_prtn_add_mcgroup(conf->p_log, conf->p_subn, conf->p_prtn,
|
|
Packit Service |
54dbc3 |
(uint8_t)group->flags.rate,
|
|
Packit Service |
54dbc3 |
(uint8_t)group->flags.mtu,
|
|
Packit Service |
54dbc3 |
(uint8_t)group->flags.sl,
|
|
Packit Service |
54dbc3 |
(uint8_t)scope,
|
|
Packit Service |
54dbc3 |
group->flags.Q_Key,
|
|
Packit Service |
54dbc3 |
group->flags.TClass,
|
|
Packit Service |
54dbc3 |
group->flags.FlowLabel,
|
|
Packit Service |
54dbc3 |
&group->mgid);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int partition_create(unsigned lineno, struct part_conf *conf,
|
|
Packit Service |
54dbc3 |
char *name, char *id, char *flag, char *flag_val)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
ib_net16_t pkey;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!id && name && isdigit(*name)) {
|
|
Packit Service |
54dbc3 |
id = name;
|
|
Packit Service |
54dbc3 |
name = NULL;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (id) {
|
|
Packit Service |
54dbc3 |
char *end;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
pkey = cl_hton16((uint16_t)strtoul(id, &end, 0));
|
|
Packit Service |
54dbc3 |
if (end == id || *end)
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
pkey = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
conf->p_prtn = osm_prtn_make_new(conf->p_log, conf->p_subn,
|
|
Packit Service |
54dbc3 |
name, pkey);
|
|
Packit Service |
54dbc3 |
if (!conf->p_prtn)
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!conf->p_subn->opt.qos && conf->flags.sl != OSM_DEFAULT_SL) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(conf->p_log, OSM_LOG_DEBUG, "Overriding SL %d"
|
|
Packit Service |
54dbc3 |
" to default SL %d on partition %s"
|
|
Packit Service |
54dbc3 |
" as QoS is not enabled.\n",
|
|
Packit Service |
54dbc3 |
conf->flags.sl, OSM_DEFAULT_SL, name);
|
|
Packit Service |
54dbc3 |
conf->flags.sl = OSM_DEFAULT_SL;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
conf->p_prtn->sl = (uint8_t) conf->flags.sl;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (conf->is_ipoib) {
|
|
Packit Service |
54dbc3 |
struct precreate_mgroup broadcast_mgroup;
|
|
Packit Service |
54dbc3 |
memset(&broadcast_mgroup, 0, sizeof(broadcast_mgroup));
|
|
Packit Service |
54dbc3 |
broadcast_mgroup.mgid = osm_ipoib_broadcast_mgid;
|
|
Packit Service |
54dbc3 |
pkey = CL_HTON16(0x8000) | conf->p_prtn->pkey;
|
|
Packit Service |
54dbc3 |
memcpy(&broadcast_mgroup.mgid.raw[4], &pkey , sizeof(pkey));
|
|
Packit Service |
54dbc3 |
broadcast_mgroup.flags.mtu = conf->flags.mtu;
|
|
Packit Service |
54dbc3 |
broadcast_mgroup.flags.rate = conf->flags.rate;
|
|
Packit Service |
54dbc3 |
broadcast_mgroup.flags.sl = conf->flags.sl;
|
|
Packit Service |
54dbc3 |
broadcast_mgroup.flags.Q_Key = conf->flags.Q_Key ?
|
|
Packit Service |
54dbc3 |
conf->flags.Q_Key :
|
|
Packit Service |
54dbc3 |
OSM_IPOIB_BROADCAST_MGRP_QKEY;
|
|
Packit Service |
54dbc3 |
broadcast_mgroup.flags.TClass = conf->flags.TClass;
|
|
Packit Service |
54dbc3 |
broadcast_mgroup.flags.FlowLabel = conf->flags.FlowLabel;
|
|
Packit Service |
54dbc3 |
__create_mgrp(conf, &broadcast_mgroup);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static unsigned long int verify_val(unsigned lineno, osm_log_t *p_log,
|
|
Packit Service |
54dbc3 |
char *flag, char *val)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *end;
|
|
Packit Service |
54dbc3 |
unsigned long int ret = strtoul(val, &end, 0);
|
|
Packit Service |
54dbc3 |
if (val && *end)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"PARSE WARN: line %d: "
|
|
Packit Service |
54dbc3 |
"suspicious val=(%s) detected. "
|
|
Packit Service |
54dbc3 |
"flag=(%s)\n", lineno, val, flag);
|
|
Packit Service |
54dbc3 |
return ret;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* returns 1 if processed 0 if _not_ */
|
|
Packit Service |
54dbc3 |
static int parse_group_flag(unsigned lineno, osm_log_t * p_log,
|
|
Packit Service |
54dbc3 |
struct group_flags *flags,
|
|
Packit Service |
54dbc3 |
char *flag, char *val)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int rc = 0;
|
|
Packit Service |
54dbc3 |
int len = strlen(flag);
|
|
Packit Service |
54dbc3 |
if (!strncmp(flag, "mtu", len)) {
|
|
Packit Service |
54dbc3 |
rc = 1;
|
|
Packit Service |
54dbc3 |
if (!val || (flags->mtu = verify_val(lineno, p_log, flag, val)) == 0)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"PARSE WARN: line %d: "
|
|
Packit Service |
54dbc3 |
"flag \'mtu\' requires valid value"
|
|
Packit Service |
54dbc3 |
" - skipped\n", lineno);
|
|
Packit Service |
54dbc3 |
} else if (!strncmp(flag, "rate", len)) {
|
|
Packit Service |
54dbc3 |
rc = 1;
|
|
Packit Service |
54dbc3 |
if (!val || (flags->rate = verify_val(lineno, p_log, flag, val)) == 0)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"PARSE WARN: line %d: "
|
|
Packit Service |
54dbc3 |
"flag \'rate\' requires valid value"
|
|
Packit Service |
54dbc3 |
" - skipped\n", lineno);
|
|
Packit Service |
54dbc3 |
} else if (!strncmp(flag, "scope", len)) {
|
|
Packit Service |
54dbc3 |
unsigned int scope;
|
|
Packit Service |
54dbc3 |
rc = 1;
|
|
Packit Service |
54dbc3 |
if (!val || (scope = verify_val(lineno, p_log, flag, val)) == 0 || scope > 0xF)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"PARSE WARN: line %d: "
|
|
Packit Service |
54dbc3 |
"flag \'scope\' requires valid value"
|
|
Packit Service |
54dbc3 |
" - skipped\n", lineno);
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
flags->scope_mask |= (1<
|
|
Packit Service |
54dbc3 |
} else if (!strncmp(flag, "Q_Key", strlen(flag))) {
|
|
Packit Service |
54dbc3 |
rc = 1;
|
|
Packit Service |
54dbc3 |
if (!val || (flags->Q_Key = verify_val(lineno, p_log, flag, val)) == 0)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"PARSE WARN: line %d: "
|
|
Packit Service |
54dbc3 |
"flag \'Q_Key\' requires valid value"
|
|
Packit Service |
54dbc3 |
" - using '0'\n", lineno);
|
|
Packit Service |
54dbc3 |
} else if (!strncmp(flag, "TClass", strlen(flag))) {
|
|
Packit Service |
54dbc3 |
rc = 1;
|
|
Packit Service |
54dbc3 |
if (!val || (flags->TClass = verify_val(lineno, p_log, flag, val)) == 0)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"PARSE WARN: line %d: "
|
|
Packit Service |
54dbc3 |
"flag \'TClass\' requires valid value"
|
|
Packit Service |
54dbc3 |
" - using '0'\n", lineno);
|
|
Packit Service |
54dbc3 |
} else if (!strncmp(flag, "sl", len)) {
|
|
Packit Service |
54dbc3 |
unsigned sl;
|
|
Packit Service |
54dbc3 |
char *end;
|
|
Packit Service |
54dbc3 |
rc = 1;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!val || !*val || (sl = strtoul(val, &end, 0)) > 15 ||
|
|
Packit Service |
54dbc3 |
(*end && !isspace(*end)))
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"PARSE WARN: line %d: "
|
|
Packit Service |
54dbc3 |
"flag \'sl\' requires valid value"
|
|
Packit Service |
54dbc3 |
" - skipped\n", lineno);
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
flags->sl = sl;
|
|
Packit Service |
54dbc3 |
} else if (!strncmp(flag, "FlowLabel", len)) {
|
|
Packit Service |
54dbc3 |
uint32_t FlowLabel;
|
|
Packit Service |
54dbc3 |
char *end;
|
|
Packit Service |
54dbc3 |
rc = 1;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!val || !*val ||
|
|
Packit Service |
54dbc3 |
(FlowLabel = strtoul(val, &end, 0)) > 0xFFFFF ||
|
|
Packit Service |
54dbc3 |
(*end && !isspace(*end)))
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"PARSE WARN: line %d: "
|
|
Packit Service |
54dbc3 |
"flag \'FlowLabel\' requires valid value"
|
|
Packit Service |
54dbc3 |
" - skipped\n", lineno);
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
flags->FlowLabel = FlowLabel;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return rc;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int partition_add_flag(unsigned lineno, struct part_conf *conf,
|
|
Packit Service |
54dbc3 |
char *flag, char *val)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int len = strlen(flag);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* ipoib gc group flags are processed here. */
|
|
Packit Service |
54dbc3 |
if (parse_group_flag(lineno, conf->p_log, &conf->flags, flag, val))
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* partition flags go here. */
|
|
Packit Service |
54dbc3 |
if (!strncmp(flag, "ipoib", len)) {
|
|
Packit Service |
54dbc3 |
conf->is_ipoib = 1;
|
|
Packit Service |
54dbc3 |
} else if (!strncmp(flag, "defmember", len)) {
|
|
Packit Service |
54dbc3 |
if (!val || (strncmp(val, "limited", strlen(val))
|
|
Packit Service |
54dbc3 |
&& strncmp(val, "both", strlen(val))
|
|
Packit Service |
54dbc3 |
&& strncmp(val, "full", strlen(val))))
|
|
Packit Service |
54dbc3 |
OSM_LOG(conf->p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"PARSE WARN: line %d: "
|
|
Packit Service |
54dbc3 |
"flag \'defmember\' requires valid value (limited or full or both)"
|
|
Packit Service |
54dbc3 |
" - skipped\n", lineno);
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
if (!strncmp(val, "full", strlen(val)))
|
|
Packit Service |
54dbc3 |
conf->membership = FULL;
|
|
Packit Service |
54dbc3 |
else if (!strncmp(val, "both", strlen(val)))
|
|
Packit Service |
54dbc3 |
conf->membership = BOTH;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
conf->membership = LIMITED;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else if (!strcmp(flag, "indx0"))
|
|
Packit Service |
54dbc3 |
conf->indx0 = TRUE;
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
OSM_LOG(conf->p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"PARSE WARN: line %d: "
|
|
Packit Service |
54dbc3 |
"unrecognized partition flag \'%s\'"
|
|
Packit Service |
54dbc3 |
" - ignored\n", lineno, flag);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
static void manage_membership_change(struct part_conf *conf, osm_prtn_t * p,
|
|
Packit Service |
54dbc3 |
unsigned type, membership_t membership,
|
|
Packit Service |
54dbc3 |
ib_net64_t guid)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_map_t *p_tbl;
|
|
Packit Service |
54dbc3 |
cl_map_iterator_t p_next, p_item;
|
|
Packit Service |
54dbc3 |
osm_physp_t *p_physp;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* In allow_both_pkeys mode */
|
|
Packit Service |
54dbc3 |
/* if membership of the PKEY is set to FULL */
|
|
Packit Service |
54dbc3 |
/* need to clean up the part_guid_tbl table entry for this guid */
|
|
Packit Service |
54dbc3 |
/* if membership of the PKEY is set to LIMITED */
|
|
Packit Service |
54dbc3 |
/* need to clean up the full_guid_tbl table entry for this guid */
|
|
Packit Service |
54dbc3 |
/* as it could be populated because of previous definitions */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!conf->p_subn->opt.allow_both_pkeys || membership == BOTH)
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
switch (type){
|
|
Packit Service |
54dbc3 |
/* ALL = 0 */
|
|
Packit Service |
54dbc3 |
case 0:
|
|
Packit Service |
54dbc3 |
cl_map_remove_all(membership == LIMITED ?
|
|
Packit Service |
54dbc3 |
&p->full_guid_tbl : &p->part_guid_tbl);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
/* specific GUID */
|
|
Packit Service |
54dbc3 |
case 0xFF:
|
|
Packit Service |
54dbc3 |
cl_map_remove(membership == LIMITED ?
|
|
Packit Service |
54dbc3 |
&p->full_guid_tbl : &p->part_guid_tbl,
|
|
Packit Service |
54dbc3 |
cl_hton64(guid));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case IB_NODE_TYPE_CA:
|
|
Packit Service |
54dbc3 |
case IB_NODE_TYPE_SWITCH:
|
|
Packit Service |
54dbc3 |
case IB_NODE_TYPE_ROUTER:
|
|
Packit Service |
54dbc3 |
p_tbl = (membership == LIMITED) ?
|
|
Packit Service |
54dbc3 |
&p->full_guid_tbl : &p->part_guid_tbl;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_next = cl_map_head(p_tbl);
|
|
Packit Service |
54dbc3 |
while (p_next != cl_map_end(p_tbl)) {
|
|
Packit Service |
54dbc3 |
p_item = p_next;
|
|
Packit Service |
54dbc3 |
p_next = cl_map_next(p_item);
|
|
Packit Service |
54dbc3 |
p_physp = (osm_physp_t *) cl_map_obj(p_item);
|
|
Packit Service |
54dbc3 |
if (osm_node_get_type(p_physp->p_node) == type)
|
|
Packit Service |
54dbc3 |
cl_map_remove_item(p_tbl, p_item);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
default:
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
static int partition_add_all(struct part_conf *conf, osm_prtn_t * p,
|
|
Packit Service |
54dbc3 |
unsigned type, membership_t membership)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
manage_membership_change(conf, p, type, membership, 0);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (membership != LIMITED &&
|
|
Packit Service |
54dbc3 |
osm_prtn_add_all(conf->p_log, conf->p_subn, p, type, TRUE, conf->indx0) != IB_SUCCESS)
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
if ((membership == LIMITED ||
|
|
Packit Service |
54dbc3 |
(membership == BOTH && conf->p_subn->opt.allow_both_pkeys)) &&
|
|
Packit Service |
54dbc3 |
osm_prtn_add_all(conf->p_log, conf->p_subn, p, type, FALSE, conf->indx0) != IB_SUCCESS)
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int partition_add_port(unsigned lineno, struct part_conf *conf,
|
|
Packit Service |
54dbc3 |
char *name, char *flag)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_prtn_t *p = conf->p_prtn;
|
|
Packit Service |
54dbc3 |
ib_net64_t guid;
|
|
Packit Service |
54dbc3 |
membership_t membership = conf->membership;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!name || !*name || !strncmp(name, "NONE", strlen(name)))
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (flag) {
|
|
Packit Service |
54dbc3 |
/* reset default membership to limited */
|
|
Packit Service |
54dbc3 |
membership = LIMITED;
|
|
Packit Service |
54dbc3 |
if (!strncmp(flag, "full", strlen(flag)))
|
|
Packit Service |
54dbc3 |
membership = FULL;
|
|
Packit Service |
54dbc3 |
else if (!strncmp(flag, "both", strlen(flag)))
|
|
Packit Service |
54dbc3 |
membership = BOTH;
|
|
Packit Service |
54dbc3 |
else if (strncmp(flag, "limited", strlen(flag))) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(conf->p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"PARSE WARN: line %d: "
|
|
Packit Service |
54dbc3 |
"unrecognized port flag \'%s\'."
|
|
Packit Service |
54dbc3 |
" Assume \'limited\'\n", lineno, flag);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!strncmp(name, "ALL", strlen(name)))
|
|
Packit Service |
54dbc3 |
return partition_add_all(conf, p, 0, membership);
|
|
Packit Service |
54dbc3 |
else if (!strncmp(name, "ALL_CAS", strlen(name)))
|
|
Packit Service |
54dbc3 |
return partition_add_all(conf, p, IB_NODE_TYPE_CA, membership);
|
|
Packit Service |
54dbc3 |
else if (!strncmp(name, "ALL_SWITCHES", strlen(name)))
|
|
Packit Service |
54dbc3 |
return partition_add_all(conf, p, IB_NODE_TYPE_SWITCH,
|
|
Packit Service |
54dbc3 |
membership);
|
|
Packit Service |
54dbc3 |
else if (!strncmp(name, "ALL_ROUTERS", strlen(name)))
|
|
Packit Service |
54dbc3 |
return partition_add_all(conf, p, IB_NODE_TYPE_ROUTER,
|
|
Packit Service |
54dbc3 |
membership);
|
|
Packit Service |
54dbc3 |
else if (!strncmp(name, "SELF", strlen(name))) {
|
|
Packit Service |
54dbc3 |
guid = cl_ntoh64(conf->p_subn->sm_port_guid);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
char *end;
|
|
Packit Service |
54dbc3 |
guid = strtoull(name, &end, 0);
|
|
Packit Service |
54dbc3 |
if (!guid || *end)
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
manage_membership_change(conf, p, 0xFF, membership, guid);
|
|
Packit Service |
54dbc3 |
if (membership != LIMITED &&
|
|
Packit Service |
54dbc3 |
osm_prtn_add_port(conf->p_log, conf->p_subn, p,
|
|
Packit Service |
54dbc3 |
cl_hton64(guid), TRUE, conf->indx0) != IB_SUCCESS)
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
if ((membership == LIMITED ||
|
|
Packit Service |
54dbc3 |
(membership == BOTH && conf->p_subn->opt.allow_both_pkeys)) &&
|
|
Packit Service |
54dbc3 |
osm_prtn_add_port(conf->p_log, conf->p_subn, p,
|
|
Packit Service |
54dbc3 |
cl_hton64(guid), FALSE, conf->indx0) != IB_SUCCESS)
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* conf file parser */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#define STRIP_HEAD_SPACES(p) while (*(p) == ' ' || *(p) == '\t' || \
|
|
Packit Service |
54dbc3 |
*(p) == '\n') { (p)++; }
|
|
Packit Service |
54dbc3 |
#define STRIP_TAIL_SPACES(p) { char *q = (p) + strlen(p); \
|
|
Packit Service |
54dbc3 |
while ( q != (p) && ( *q == '\0' || \
|
|
Packit Service |
54dbc3 |
*q == ' ' || *q == '\t' || \
|
|
Packit Service |
54dbc3 |
*q == '\n')) { *q-- = '\0'; }; }
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int parse_name_token(char *str, char **name, char **val)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int len = 0;
|
|
Packit Service |
54dbc3 |
char *p, *q;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
*name = *val = NULL;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p = str;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
while (*p == ' ' || *p == '\t' || *p == '\n')
|
|
Packit Service |
54dbc3 |
p++;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
q = strchr(p, '=');
|
|
Packit Service |
54dbc3 |
if (q)
|
|
Packit Service |
54dbc3 |
*q++ = '\0';
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
len = strlen(str) + 1;
|
|
Packit Service |
54dbc3 |
str = q;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
q = p + strlen(p);
|
|
Packit Service |
54dbc3 |
while (q != p && (*q == '\0' || *q == ' ' || *q == '\t' || *q == '\n'))
|
|
Packit Service |
54dbc3 |
*q-- = '\0';
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
*name = p;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p = str;
|
|
Packit Service |
54dbc3 |
if (!p)
|
|
Packit Service |
54dbc3 |
return len;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
while (*p == ' ' || *p == '\t' || *p == '\n')
|
|
Packit Service |
54dbc3 |
p++;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
q = p + strlen(p);
|
|
Packit Service |
54dbc3 |
len += (int)(q - str) + 1;
|
|
Packit Service |
54dbc3 |
while (q != p && (*q == '\0' || *q == ' ' || *q == '\t' || *q == '\n'))
|
|
Packit Service |
54dbc3 |
*q-- = '\0';
|
|
Packit Service |
54dbc3 |
*val = p;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return len;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int parse_mgroup_flags(osm_log_t * p_log,
|
|
Packit Service |
54dbc3 |
struct precreate_mgroup *mgroup,
|
|
Packit Service |
54dbc3 |
char *p, unsigned lineno)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int ret, len = 0;
|
|
Packit Service |
54dbc3 |
char *flag, *val, *q;
|
|
Packit Service |
54dbc3 |
do {
|
|
Packit Service |
54dbc3 |
flag = val = NULL;
|
|
Packit Service |
54dbc3 |
q = strchr(p, ',');
|
|
Packit Service |
54dbc3 |
if (q)
|
|
Packit Service |
54dbc3 |
*q++ = '\0';
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
ret = parse_name_token(p, &flag, &val;;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!parse_group_flag(lineno, p_log, &mgroup->flags,
|
|
Packit Service |
54dbc3 |
flag, val)) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"PARSE WARN: line %d: "
|
|
Packit Service |
54dbc3 |
"unrecognized mgroup flag \'%s\'"
|
|
Packit Service |
54dbc3 |
" - ignored\n", lineno, flag);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
p += ret;
|
|
Packit Service |
54dbc3 |
len += ret;
|
|
Packit Service |
54dbc3 |
} while (q);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return (len);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int mgroup_create(char *p, char *mgid, unsigned lineno, struct part_conf *conf)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int ret = 0;
|
|
Packit Service |
54dbc3 |
struct precreate_mgroup mgroup;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
memset(&mgroup, 0, sizeof(mgroup));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (inet_pton(AF_INET6, mgid, &mgroup.mgid) != 1
|
|
Packit Service |
54dbc3 |
|| mgroup.mgid.raw[0] != 0xff) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(conf->p_log, OSM_LOG_ERROR,
|
|
Packit Service |
54dbc3 |
"PARSE ERROR partition conf file line %d: "
|
|
Packit Service |
54dbc3 |
"mgid \"%s\": gid is not multicast\n", lineno, mgid);
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* inherit partition flags */
|
|
Packit Service |
54dbc3 |
mgroup.flags.mtu = conf->flags.mtu;
|
|
Packit Service |
54dbc3 |
mgroup.flags.rate = conf->flags.rate;
|
|
Packit Service |
54dbc3 |
mgroup.flags.sl = conf->flags.sl;
|
|
Packit Service |
54dbc3 |
mgroup.flags.Q_Key = conf->flags.Q_Key;
|
|
Packit Service |
54dbc3 |
mgroup.flags.FlowLabel = conf->flags.FlowLabel;
|
|
Packit Service |
54dbc3 |
mgroup.flags.scope_mask = conf->flags.scope_mask;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* override with user specified flags */
|
|
Packit Service |
54dbc3 |
ret = parse_mgroup_flags(conf->p_log, &mgroup, p, lineno);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* check/verify special IP group parameters */
|
|
Packit Service |
54dbc3 |
if (mgid_is_ip(&mgroup.mgid)) {
|
|
Packit Service |
54dbc3 |
ib_net16_t pkey = conf->p_prtn->pkey | cl_hton16(0x8000);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!ip_mgroup_pkey_ok(conf, &mgroup)
|
|
Packit Service |
54dbc3 |
|| !ip_mgroup_rate_ok(conf, &mgroup)
|
|
Packit Service |
54dbc3 |
|| !ip_mgroup_mtu_ok(conf, &mgroup))
|
|
Packit Service |
54dbc3 |
goto error;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* set special IP settings */
|
|
Packit Service |
54dbc3 |
memcpy(&mgroup.mgid.raw[4], &pkey, sizeof(pkey));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (mgroup.flags.Q_Key == 0)
|
|
Packit Service |
54dbc3 |
mgroup.flags.Q_Key = OSM_IPOIB_BROADCAST_MGRP_QKEY;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* don't create multiple copies of the group */
|
|
Packit Service |
54dbc3 |
if (osm_get_mgrp_by_mgid(conf->p_subn, &mgroup.mgid))
|
|
Packit Service |
54dbc3 |
goto error;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* create the group */
|
|
Packit Service |
54dbc3 |
__create_mgrp(conf, &mgroup);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
error:
|
|
Packit Service |
54dbc3 |
return ret;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static struct part_conf *new_part_conf(osm_log_t * p_log, osm_subn_t * p_subn)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
static struct part_conf part;
|
|
Packit Service |
54dbc3 |
struct part_conf *conf = ∂
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
memset(conf, 0, sizeof(*conf));
|
|
Packit Service |
54dbc3 |
conf->p_log = p_log;
|
|
Packit Service |
54dbc3 |
conf->p_subn = p_subn;
|
|
Packit Service |
54dbc3 |
conf->p_prtn = NULL;
|
|
Packit Service |
54dbc3 |
conf->is_ipoib = 0;
|
|
Packit Service |
54dbc3 |
conf->flags.sl = OSM_DEFAULT_SL;
|
|
Packit Service |
54dbc3 |
conf->flags.rate = OSM_DEFAULT_MGRP_RATE;
|
|
Packit Service |
54dbc3 |
conf->flags.mtu = OSM_DEFAULT_MGRP_MTU;
|
|
Packit Service |
54dbc3 |
conf->membership = LIMITED;
|
|
Packit Service |
54dbc3 |
conf->indx0 = FALSE;
|
|
Packit Service |
54dbc3 |
return conf;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int flush_part_conf(struct part_conf *conf)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
memset(conf, 0, sizeof(*conf));
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int parse_part_conf(struct part_conf *conf, char *str, int lineno)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int ret, len = 0;
|
|
Packit Service |
54dbc3 |
char *name, *id, *flag, *flval;
|
|
Packit Service |
54dbc3 |
char *q, *p;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p = str;
|
|
Packit Service |
54dbc3 |
if (*p == '\t' || *p == '\0' || *p == '\n')
|
|
Packit Service |
54dbc3 |
p++;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
len += (int)(p - str);
|
|
Packit Service |
54dbc3 |
str = p;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (conf->p_prtn)
|
|
Packit Service |
54dbc3 |
goto skip_header;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
q = strchr(p, ':');
|
|
Packit Service |
54dbc3 |
if (!q) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(conf->p_log, OSM_LOG_ERROR, "PARSE ERROR: line %d: "
|
|
Packit Service |
54dbc3 |
"no partition definition found\n", lineno);
|
|
Packit Service |
54dbc3 |
fprintf(stderr, "\nPARSE ERROR: line %d: "
|
|
Packit Service |
54dbc3 |
"no partition definition found\n", lineno);
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
*q++ = '\0';
|
|
Packit Service |
54dbc3 |
str = q;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
name = id = flag = flval = NULL;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
q = strchr(p, ',');
|
|
Packit Service |
54dbc3 |
if (q)
|
|
Packit Service |
54dbc3 |
*q = '\0';
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
ret = parse_name_token(p, &name, &id;;
|
|
Packit Service |
54dbc3 |
p += ret;
|
|
Packit Service |
54dbc3 |
len += ret;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
while (q) {
|
|
Packit Service |
54dbc3 |
flag = flval = NULL;
|
|
Packit Service |
54dbc3 |
q = strchr(p, ',');
|
|
Packit Service |
54dbc3 |
if (q)
|
|
Packit Service |
54dbc3 |
*q++ = '\0';
|
|
Packit Service |
54dbc3 |
ret = parse_name_token(p, &flag, &flval);
|
|
Packit Service |
54dbc3 |
if (!flag) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(conf->p_log, OSM_LOG_ERROR,
|
|
Packit Service |
54dbc3 |
"PARSE ERROR: line %d: "
|
|
Packit Service |
54dbc3 |
"bad partition flags\n", lineno);
|
|
Packit Service |
54dbc3 |
fprintf(stderr, "\nPARSE ERROR: line %d: "
|
|
Packit Service |
54dbc3 |
"bad partition flags\n", lineno);
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
p += ret;
|
|
Packit Service |
54dbc3 |
len += ret;
|
|
Packit Service |
54dbc3 |
partition_add_flag(lineno, conf, flag, flval);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (p != str || (partition_create(lineno, conf,
|
|
Packit Service |
54dbc3 |
name, id, flag, flval) < 0)) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(conf->p_log, OSM_LOG_ERROR, "PARSE ERROR: line %d: "
|
|
Packit Service |
54dbc3 |
"bad partition definition\n", lineno);
|
|
Packit Service |
54dbc3 |
fprintf(stderr, "\nPARSE ERROR: line %d: "
|
|
Packit Service |
54dbc3 |
"bad partition definition\n", lineno);
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
skip_header:
|
|
Packit Service |
54dbc3 |
do {
|
|
Packit Service |
54dbc3 |
name = flag = NULL;
|
|
Packit Service |
54dbc3 |
q = strchr(p, ',');
|
|
Packit Service |
54dbc3 |
if (q)
|
|
Packit Service |
54dbc3 |
*q++ = '\0';
|
|
Packit Service |
54dbc3 |
ret = parse_name_token(p, &name, &flag;;
|
|
Packit Service |
54dbc3 |
len += ret;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (strcmp(name, "mgid") == 0) {
|
|
Packit Service |
54dbc3 |
/* parse an mgid line if specified. */
|
|
Packit Service |
54dbc3 |
len += mgroup_create(p+ret, flag, lineno, conf);
|
|
Packit Service |
54dbc3 |
goto done; /* We're done: this consumes the line */
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (partition_add_port(lineno, conf, name, flag) < 0) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(conf->p_log, OSM_LOG_ERROR,
|
|
Packit Service |
54dbc3 |
"PARSE ERROR: line %d: "
|
|
Packit Service |
54dbc3 |
"bad PortGUID\n", lineno);
|
|
Packit Service |
54dbc3 |
fprintf(stderr, "PARSE ERROR: line %d: "
|
|
Packit Service |
54dbc3 |
"bad PortGUID\n", lineno);
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
p += ret;
|
|
Packit Service |
54dbc3 |
} while (q);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
done:
|
|
Packit Service |
54dbc3 |
return len;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**
|
|
Packit Service |
54dbc3 |
* @return 1 on error, 0 on success
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
int osm_prtn_config_parse_file(osm_log_t * p_log, osm_subn_t * p_subn,
|
|
Packit Service |
54dbc3 |
const char *file_name)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char line[4096];
|
|
Packit Service |
54dbc3 |
struct part_conf *conf = NULL;
|
|
Packit Service |
54dbc3 |
FILE *file;
|
|
Packit Service |
54dbc3 |
int lineno;
|
|
Packit Service |
54dbc3 |
int is_parse_success;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
line[0] = '\0';
|
|
Packit Service |
54dbc3 |
file = fopen(file_name, "r");
|
|
Packit Service |
54dbc3 |
if (!file) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"Cannot open config file \'%s\': %s\n",
|
|
Packit Service |
54dbc3 |
file_name, strerror(errno));
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
lineno = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
is_parse_success = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
while (fgets(line, sizeof(line) - 1, file) != NULL) {
|
|
Packit Service |
54dbc3 |
char *q, *p = line;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
lineno++;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p = line;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
q = strchr(p, '#');
|
|
Packit Service |
54dbc3 |
if (q)
|
|
Packit Service |
54dbc3 |
*q = '\0';
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
do {
|
|
Packit Service |
54dbc3 |
int len;
|
|
Packit Service |
54dbc3 |
while (*p == ' ' || *p == '\t' || *p == '\n')
|
|
Packit Service |
54dbc3 |
p++;
|
|
Packit Service |
54dbc3 |
if (*p == '\0')
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!conf && !(conf = new_part_conf(p_log, p_subn))) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_ERROR,
|
|
Packit Service |
54dbc3 |
"PARSE ERROR: line %d: "
|
|
Packit Service |
54dbc3 |
"internal: cannot create config\n",
|
|
Packit Service |
54dbc3 |
lineno);
|
|
Packit Service |
54dbc3 |
fprintf(stderr,
|
|
Packit Service |
54dbc3 |
"PARSE ERROR: line %d: "
|
|
Packit Service |
54dbc3 |
"internal: cannot create config\n",
|
|
Packit Service |
54dbc3 |
lineno);
|
|
Packit Service |
54dbc3 |
is_parse_success = -1;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
q = strchr(p, ';');
|
|
Packit Service |
54dbc3 |
if (q)
|
|
Packit Service |
54dbc3 |
*q = '\0';
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
len = parse_part_conf(conf, p, lineno);
|
|
Packit Service |
54dbc3 |
if (len < 0) {
|
|
Packit Service |
54dbc3 |
is_parse_success = -1;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
is_parse_success = 1;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p += len;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (q) {
|
|
Packit Service |
54dbc3 |
flush_part_conf(conf);
|
|
Packit Service |
54dbc3 |
conf = NULL;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} while (q);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (is_parse_success == -1)
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fclose(file);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return (is_parse_success == 1) ? 0 : 1;
|
|
Packit Service |
54dbc3 |
}
|