|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* iSCSI Discovery Database Library
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Copyright (C) 2004 Dmitry Yusupov, Alex Aizman
|
|
Packit Service |
646995 |
* Copyright (C) 2006 Mike Christie
|
|
Packit Service |
646995 |
* Copyright (C) 2006 Red Hat, Inc. All rights reserved.
|
|
Packit Service |
646995 |
* maintained by open-iscsi@@googlegroups.com
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit Service |
646995 |
* it under the terms of the GNU General Public License as published
|
|
Packit Service |
646995 |
* by the Free Software Foundation; either version 2 of the License, or
|
|
Packit Service |
646995 |
* (at your option) any later version.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* This program is distributed in the hope that it will be useful, but
|
|
Packit Service |
646995 |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
646995 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
646995 |
* General Public License for more details.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* See the file COPYING included with this distribution for more details.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#include <stdio.h>
|
|
Packit Service |
646995 |
#include <ctype.h>
|
|
Packit Service |
646995 |
#include <unistd.h>
|
|
Packit Service |
646995 |
#include <stdlib.h>
|
|
Packit Service |
646995 |
#include <string.h>
|
|
Packit Service |
646995 |
#include <errno.h>
|
|
Packit Service |
646995 |
#include <dirent.h>
|
|
Packit Service |
646995 |
#include <limits.h>
|
|
Packit Service |
646995 |
#include <fcntl.h>
|
|
Packit Service |
d1f683 |
#include <glob.h>
|
|
Packit Service |
646995 |
#include <sys/stat.h>
|
|
Packit Service |
646995 |
#include <sys/file.h>
|
|
Packit Service |
646995 |
#include <inttypes.h>
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#include "idbm.h"
|
|
Packit Service |
646995 |
#include "idbm_fields.h"
|
|
Packit Service |
646995 |
#include "log.h"
|
|
Packit Service |
646995 |
#include "iscsi_util.h"
|
|
Packit Service |
646995 |
#include "iscsi_settings.h"
|
|
Packit Service |
646995 |
#include "transport.h"
|
|
Packit Service |
646995 |
#include "iscsi_sysfs.h"
|
|
Packit Service |
646995 |
#include "iface.h"
|
|
Packit Service |
646995 |
#include "sysdeps.h"
|
|
Packit Service |
646995 |
#include "fw_context.h"
|
|
Packit Service |
646995 |
#include "iscsi_err.h"
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define IDBM_HIDE 0 /* Hide parameter when print. */
|
|
Packit Service |
646995 |
#define IDBM_SHOW 1 /* Show parameter when print. */
|
|
Packit Service |
646995 |
#define IDBM_MASKED 2 /* Show "stars" instead of real value when print */
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static struct idbm *db;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define ARRAY_LEN(x) ( sizeof(x) / sizeof((x)[0]) )
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define __recinfo_str(_key, _info, _rec, _name, _show, _n, _mod) do { \
|
|
Packit Service |
646995 |
_info[_n].type = TYPE_STR; \
|
|
Packit Service |
646995 |
strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
|
|
Packit Service |
646995 |
if (strlen((char*)_rec->_name)) \
|
|
Packit Service |
646995 |
strlcpy((char*)_info[_n].value, (char*)_rec->_name, \
|
|
Packit Service |
646995 |
VALUE_MAXVAL); \
|
|
Packit Service |
646995 |
_info[_n].data = &_rec->_name; \
|
|
Packit Service |
646995 |
_info[_n].data_len = sizeof(_rec->_name); \
|
|
Packit Service |
646995 |
_info[_n].visible = _show; \
|
|
Packit Service |
646995 |
_info[_n].can_modify = _mod; \
|
|
Packit Service |
646995 |
_n++; \
|
|
Packit Service |
646995 |
} while(0)
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define __recinfo_int(_key, _info, _rec, _name, _show, _n, _mod) do { \
|
|
Packit Service |
646995 |
_info[_n].type = TYPE_INT; \
|
|
Packit Service |
646995 |
strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
|
|
Packit Service |
646995 |
snprintf(_info[_n].value, VALUE_MAXVAL, "%" PRIi32, _rec->_name); \
|
|
Packit Service |
646995 |
_info[_n].data = &_rec->_name; \
|
|
Packit Service |
646995 |
_info[_n].data_len = sizeof(_rec->_name); \
|
|
Packit Service |
646995 |
_info[_n].visible = _show; \
|
|
Packit Service |
646995 |
_info[_n].can_modify = _mod; \
|
|
Packit Service |
646995 |
_n++; \
|
|
Packit Service |
646995 |
} while(0)
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define __recinfo_uint8(_key, _info, _rec, _name, _show, _n, _mod) do { \
|
|
Packit Service |
646995 |
_info[_n].type = TYPE_UINT8; \
|
|
Packit Service |
646995 |
strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
|
|
Packit Service |
646995 |
snprintf(_info[_n].value, VALUE_MAXVAL, "%" PRIu8, _rec->_name); \
|
|
Packit Service |
646995 |
_info[_n].data = &_rec->_name; \
|
|
Packit Service |
646995 |
_info[_n].data_len = sizeof(_rec->_name); \
|
|
Packit Service |
646995 |
_info[_n].visible = _show; \
|
|
Packit Service |
646995 |
_info[_n].can_modify = _mod; \
|
|
Packit Service |
646995 |
_n++; \
|
|
Packit Service |
646995 |
} while (0)
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define __recinfo_uint16(_key, _info, _rec, _name, _show, _n, _mod) do { \
|
|
Packit Service |
646995 |
_info[_n].type = TYPE_UINT16; \
|
|
Packit Service |
646995 |
strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
|
|
Packit Service |
646995 |
snprintf(_info[_n].value, VALUE_MAXVAL, "%" PRIu16, _rec->_name); \
|
|
Packit Service |
646995 |
_info[_n].data = &_rec->_name; \
|
|
Packit Service |
646995 |
_info[_n].data_len = sizeof(_rec->_name); \
|
|
Packit Service |
646995 |
_info[_n].visible = _show; \
|
|
Packit Service |
646995 |
_info[_n].can_modify = _mod; \
|
|
Packit Service |
646995 |
_n++; \
|
|
Packit Service |
646995 |
} while (0)
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define __recinfo_uint32(_key, _info, _rec, _name, _show, _n, _mod) do { \
|
|
Packit Service |
646995 |
_info[_n].type = TYPE_UINT32; \
|
|
Packit Service |
646995 |
strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
|
|
Packit Service |
646995 |
snprintf(_info[_n].value, VALUE_MAXVAL, "%" PRIu32, _rec->_name); \
|
|
Packit Service |
646995 |
_info[_n].data = &_rec->_name; \
|
|
Packit Service |
646995 |
_info[_n].data_len = sizeof(_rec->_name); \
|
|
Packit Service |
646995 |
_info[_n].visible = _show; \
|
|
Packit Service |
646995 |
_info[_n].can_modify = _mod; \
|
|
Packit Service |
646995 |
_n++; \
|
|
Packit Service |
646995 |
} while (0)
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define __recinfo_int_o2(_key,_info,_rec,_name,_show,_op0,_op1,_n, _mod) do { \
|
|
Packit Service |
646995 |
_info[_n].type = TYPE_INT_O; \
|
|
Packit Service |
646995 |
strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
|
|
Packit Service |
646995 |
if (_rec->_name == 0) strlcpy(_info[_n].value, _op0, VALUE_MAXVAL); \
|
|
Packit Service |
646995 |
if (_rec->_name == 1) strlcpy(_info[_n].value, _op1, VALUE_MAXVAL); \
|
|
Packit Service |
646995 |
_info[_n].data = &_rec->_name; \
|
|
Packit Service |
646995 |
_info[_n].data_len = sizeof(_rec->_name); \
|
|
Packit Service |
646995 |
_info[_n].visible = _show; \
|
|
Packit Service |
646995 |
_info[_n].opts[0] = _op0; \
|
|
Packit Service |
646995 |
_info[_n].opts[1] = _op1; \
|
|
Packit Service |
646995 |
_info[_n].numopts = 2; \
|
|
Packit Service |
646995 |
_info[_n].can_modify = _mod; \
|
|
Packit Service |
646995 |
_n++; \
|
|
Packit Service |
646995 |
} while(0)
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define __recinfo_int_o3(_key,_info,_rec,_name,_show,_op0,_op1,_op2,_n, \
|
|
Packit Service |
646995 |
_mod) do { \
|
|
Packit Service |
646995 |
__recinfo_int_o2(_key,_info,_rec,_name,_show,_op0,_op1,_n, _mod); \
|
|
Packit Service |
646995 |
_n--; \
|
|
Packit Service |
646995 |
if (_rec->_name == 2) strlcpy(_info[_n].value, _op2, VALUE_MAXVAL);\
|
|
Packit Service |
646995 |
_info[_n].opts[2] = _op2; \
|
|
Packit Service |
646995 |
_info[_n].numopts = 3; \
|
|
Packit Service |
646995 |
_n++; \
|
|
Packit Service |
646995 |
} while(0)
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define __recinfo_int_o4(_key,_info,_rec,_name,_show,_op0,_op1,_op2,_op3,_n, \
|
|
Packit Service |
646995 |
_mod) do { \
|
|
Packit Service |
646995 |
__recinfo_int_o3(_key,_info,_rec,_name,_show,_op0,_op1,_op2,_n, _mod); \
|
|
Packit Service |
646995 |
_n--; \
|
|
Packit Service |
646995 |
if (_rec->_name == 3) strlcpy(_info[_n].value, _op3, VALUE_MAXVAL); \
|
|
Packit Service |
646995 |
_info[_n].opts[3] = _op3; \
|
|
Packit Service |
646995 |
_info[_n].numopts = 4; \
|
|
Packit Service |
646995 |
_n++; \
|
|
Packit Service |
646995 |
} while(0)
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define __recinfo_int_o5(_key,_info,_rec,_name,_show,_op0,_op1,_op2,_op3, \
|
|
Packit Service |
646995 |
_op4,_n, _mod) do { \
|
|
Packit Service |
646995 |
__recinfo_int_o4(_key,_info,_rec,_name,_show,_op0,_op1,_op2,_op3, \
|
|
Packit Service |
646995 |
_n,_mod); \
|
|
Packit Service |
646995 |
_n--; \
|
|
Packit Service |
646995 |
if (_rec->_name == 4) strlcpy(_info[_n].value, _op4, VALUE_MAXVAL); \
|
|
Packit Service |
646995 |
_info[_n].opts[4] = _op4; \
|
|
Packit Service |
646995 |
_info[_n].numopts = 5; \
|
|
Packit Service |
646995 |
_n++; \
|
|
Packit Service |
646995 |
} while(0)
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define __recinfo_int_o6(_key,_info,_rec,_name,_show,_op0,_op1,_op2, \
|
|
Packit Service |
646995 |
_op3,_op4,_op5,_n,_mod) do { \
|
|
Packit Service |
646995 |
__recinfo_int_o5(_key,_info,_rec,_name,_show,_op0,_op1,_op2,_op3, \
|
|
Packit Service |
646995 |
_op4,_n,_mod); \
|
|
Packit Service |
646995 |
_n--; \
|
|
Packit Service |
646995 |
if (_rec->_name == 5) strlcpy(_info[_n].value, _op5, VALUE_MAXVAL); \
|
|
Packit Service |
646995 |
_info[_n].opts[5] = _op5; \
|
|
Packit Service |
646995 |
_info[_n].numopts = 6; \
|
|
Packit Service |
646995 |
_n++; \
|
|
Packit Service |
646995 |
} while(0)
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define __recinfo_int_list(_key,_info,_rec,_name,_show,_tbl,_n,_mod) do { \
|
|
Packit Service |
646995 |
_info[_n].type = TYPE_INT_LIST; \
|
|
Packit Service |
646995 |
strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
|
|
Packit Service |
646995 |
_info[_n].value[0] = '\0'; \
|
|
Packit Service |
646995 |
for (unsigned long _i = 0; _i < ARRAY_LEN(_rec->_name); _i++) { \
|
|
Packit Service |
646995 |
if (_rec->_name[_i] != (unsigned)~0) { \
|
|
Packit Service |
646995 |
for (unsigned long _j = 0; _j < ARRAY_LEN(_tbl); _j++) { \
|
|
Packit Service |
646995 |
if (_tbl[_j].value == (int)_rec->_name[_i]) { \
|
|
Packit Service |
646995 |
strcat(_info[_n].value, _tbl[_j].name); \
|
|
Packit Service |
646995 |
strcat(_info[_n].value, ","); \
|
|
Packit Service |
646995 |
break; \
|
|
Packit Service |
646995 |
} \
|
|
Packit Service |
646995 |
} \
|
|
Packit Service |
646995 |
} \
|
|
Packit Service |
646995 |
} \
|
|
Packit Service |
646995 |
/* delete trailing ',' */ \
|
|
Packit Service |
646995 |
if (strrchr(_info[_n].value, ',')) \
|
|
Packit Service |
646995 |
*strrchr(_info[_n].value, ',') = '\0'; \
|
|
Packit Service |
646995 |
_info[_n].data = &_rec->_name; \
|
|
Packit Service |
646995 |
_info[_n].data_len = sizeof(_rec->_name); \
|
|
Packit Service |
646995 |
_info[_n].visible = _show; \
|
|
Packit Service |
646995 |
_info[_n].opts[0] = (void *)&_tbl; \
|
|
Packit Service |
646995 |
_info[_n].numopts = ARRAY_LEN(_tbl); \
|
|
Packit Service |
646995 |
_info[_n].can_modify = _mod; \
|
|
Packit Service |
646995 |
_n++; \
|
|
Packit Service |
646995 |
} while (0)
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static struct int_list_tbl {
|
|
Packit Service |
646995 |
const char *name;
|
|
Packit Service |
646995 |
int value;
|
|
Packit Service |
646995 |
} chap_algs [] = {
|
|
Packit Service |
646995 |
{ "MD5", AUTH_CHAP_ALG_MD5 },
|
|
Packit Service |
646995 |
{ "SHA1", AUTH_CHAP_ALG_SHA1 },
|
|
Packit Service |
646995 |
{ "SHA256", AUTH_CHAP_ALG_SHA256 },
|
|
Packit Service |
646995 |
{ "SHA3-256", AUTH_CHAP_ALG_SHA3_256 },
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
d1f683 |
static int idbm_remove_disc_to_node_link(node_rec_t *rec, char *portal);
|
|
Packit Service |
d1f683 |
|
|
Packit Service |
646995 |
static void
|
|
Packit Service |
646995 |
idbm_recinfo_discovery(discovery_rec_t *r, recinfo_t *ri)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int num = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
__recinfo_int_o2(DISC_STARTUP, ri, r, startup, IDBM_SHOW,
|
|
Packit Service |
646995 |
"manual", "automatic", num, 1);
|
|
Packit Service |
646995 |
__recinfo_int_o6(DISC_TYPE, ri, r, type, IDBM_SHOW,
|
|
Packit Service |
646995 |
"sendtargets", "isns", "offload_send_targets", "slp",
|
|
Packit Service |
646995 |
"static", "fw", num, 0);
|
|
Packit Service |
646995 |
switch (r->type) {
|
|
Packit Service |
646995 |
case DISCOVERY_TYPE_SENDTARGETS:
|
|
Packit Service |
646995 |
__recinfo_str(DISC_ST_ADDR, ri, r,
|
|
Packit Service |
646995 |
address, IDBM_SHOW, num, 0);
|
|
Packit Service |
646995 |
__recinfo_int(DISC_ST_PORT, ri, r,
|
|
Packit Service |
646995 |
port, IDBM_SHOW, num, 0);
|
|
Packit Service |
646995 |
__recinfo_int_o2(DISC_ST_AUTH_METHOD, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.auth.authmethod,
|
|
Packit Service |
646995 |
IDBM_SHOW, "None", "CHAP", num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(DISC_ST_USERNAME, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.auth.username, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(DISC_ST_PASSWORD, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.auth.password, IDBM_MASKED, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(DISC_ST_PASSWORD_LEN, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.auth.password_length, IDBM_HIDE, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(DISC_ST_USERNAME_IN, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.auth.username_in, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(DISC_ST_PASSWORD_IN, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.auth.password_in, IDBM_MASKED, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(DISC_ST_PASSWORD_IN_LEN, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.auth.password_in_length, IDBM_HIDE,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
/* reusing SESSION_CHAP_ALGS */
|
|
Packit Service |
646995 |
__recinfo_int_list(SESSION_CHAP_ALGS, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.auth.chap_algs,
|
|
Packit Service |
646995 |
IDBM_SHOW, chap_algs, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(DISC_ST_LOGIN_TMO, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.conn_timeo.login_timeout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int_o2(DISC_ST_USE_DISC_DAEMON, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.use_discoveryd,
|
|
Packit Service |
646995 |
IDBM_SHOW, "No", "Yes", num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(DISC_ST_DISC_DAEMON_POLL_INVAL, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.discoveryd_poll_inval,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(DISC_ST_REOPEN_MAX, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.reopen_max,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(DISC_ST_AUTH_TMO, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.conn_timeo.auth_timeout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(DISC_ST_ACTIVE_TMO, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.conn_timeo.active_timeout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(DISC_ST_MAX_RECV_DLEN, ri, r,
|
|
Packit Service |
646995 |
u.sendtargets.conn_conf.MaxRecvDataSegmentLength,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
case DISCOVERY_TYPE_ISNS:
|
|
Packit Service |
646995 |
__recinfo_str(DISC_ISNS_ADDR, ri, r,
|
|
Packit Service |
646995 |
address, IDBM_SHOW, num, 0);
|
|
Packit Service |
646995 |
__recinfo_int(DISC_ISNS_PORT, ri, r,
|
|
Packit Service |
646995 |
port, IDBM_SHOW, num, 0);
|
|
Packit Service |
646995 |
__recinfo_int_o2(DISC_ISNS_USE_DISC_DAEMON, ri, r,
|
|
Packit Service |
646995 |
u.isns.use_discoveryd,
|
|
Packit Service |
646995 |
IDBM_SHOW, "No", "Yes", num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(DISC_ISNS_DISC_DAEMON_POLL_INVAL, ri, r,
|
|
Packit Service |
646995 |
u.isns.discoveryd_poll_inval,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
default:
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void
|
|
Packit Service |
646995 |
idbm_recinfo_node(node_rec_t *r, recinfo_t *ri)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int num = 0, i;
|
|
Packit Service |
646995 |
int iface_type;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_type = iface_get_iptype(&r->iface);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
__recinfo_str(NODE_NAME, ri, r, name, IDBM_SHOW, num, 0);
|
|
Packit Service |
646995 |
__recinfo_int(NODE_TPGT, ri, r, tpgt, IDBM_SHOW, num, 0);
|
|
Packit Service |
646995 |
__recinfo_int_o3(NODE_STARTUP, ri, r, startup,
|
|
Packit Service |
646995 |
IDBM_SHOW, "manual", "automatic", "onboot", num, 1);
|
|
Packit Service |
646995 |
__recinfo_int_o2(NODE_LEADING_LOGIN, ri, r, leading_login, IDBM_SHOW,
|
|
Packit Service |
646995 |
"No", "Yes", num, 1);
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Note: because we do not add the iface.iscsi_ifacename to
|
|
Packit Service |
646995 |
* sysfs iscsiadm does some weird matching. We can change the iface
|
|
Packit Service |
646995 |
* values if a session is not running, but node record ifaces values
|
|
Packit Service |
646995 |
* have to be changed and so do the iface record ones.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Users should nornmally not want to change the iface ones
|
|
Packit Service |
646995 |
* in the node record directly and instead do it through
|
|
Packit Service |
646995 |
* the iface mode which will do the right thing (although that
|
|
Packit Service |
646995 |
* needs some locking).
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_HWADDR, ri, r, iface.hwaddress, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_IPADDR, ri, r, iface.ipaddress, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_ISCSINAME, ri, r, iface.name, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_NETNAME, ri, r, iface.netdev, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_GATEWAY, ri, r, iface.gateway, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_SUBNET_MASK, ri, r, iface.subnet_mask, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_PREFIX_LEN, ri, r, iface.prefix_len,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* svn 780 compat: older versions used node.transport_name and
|
|
Packit Service |
646995 |
* rec->transport_name
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_TRANSPORTNAME, ri, r, iface.transport_name,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_INAME, ri, r, iface.iname, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_STATE, ri, r, iface.state, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(IFACE_VLAN_ID, ri, r, iface.vlan_id, IDBM_SHOW, num,
|
|
Packit Service |
646995 |
1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_VLAN_PRIORITY, ri, r, iface.vlan_priority,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_VLAN_STATE, ri, r, iface.vlan_state, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(IFACE_NUM, ri, r, iface.iface_num, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(IFACE_MTU, ri, r, iface.mtu, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(IFACE_PORT, ri, r, iface.port, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface_type == ISCSI_IFACE_TYPE_IPV4) {
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_BOOT_PROTO, ri, r, iface.bootproto,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_ALT_CID, ri, r,
|
|
Packit Service |
646995 |
iface.dhcp_alt_client_id_state, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r,
|
|
Packit Service |
646995 |
iface.dhcp_alt_client_id, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_DNS, ri, r, iface.dhcp_dns, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r,
|
|
Packit Service |
646995 |
iface.dhcp_learn_iqn, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_REQ_VID, ri, r,
|
|
Packit Service |
646995 |
iface.dhcp_req_vendor_id_state, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_VID, ri, r, iface.dhcp_vendor_id_state,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_VID_STR, ri, r, iface.dhcp_vendor_id,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_SLP_DA, ri, r, iface.dhcp_slp_da,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_FRAGMENTATION, ri, r, iface.fragmentation,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_GRAT_ARP, ri, r, iface.gratuitous_arp,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_IN_FORWARD, ri, r,
|
|
Packit Service |
646995 |
iface.incoming_forwarding, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_TOS_STATE, ri, r, iface.tos_state,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_TOS, ri, r, iface.tos, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_TTL, ri, r, iface.ttl, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
} else if (iface_type == ISCSI_IFACE_TYPE_IPV6) {
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, iface.ipv6_autocfg,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r,
|
|
Packit Service |
646995 |
iface.linklocal_autocfg, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, iface.router_autocfg,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_LINKLOCAL, ri, r, iface.ipv6_linklocal,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_ROUTER, ri, r, iface.ipv6_router,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r,
|
|
Packit Service |
646995 |
iface.dup_addr_detect_cnt, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_FLOW_LABEL, ri, r, iface.flow_label,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r,
|
|
Packit Service |
646995 |
iface.gratuitous_neighbor_adv, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_HOP_LIMIT, ri, r, iface.hop_limit,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_MLD, ri, r, iface.mld, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r,
|
|
Packit Service |
646995 |
iface.nd_reachable_tmo, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r,
|
|
Packit Service |
646995 |
iface.nd_rexmit_time, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, iface.nd_stale_tmo,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r,
|
|
Packit Service |
646995 |
iface.router_adv_link_mtu, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, iface.traffic_class,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DELAYED_ACK, ri, r, iface.delayed_ack, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_TCP_NAGLE, ri, r, iface.nagle, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_TCP_WSF_STATE, ri, r, iface.tcp_wsf_state,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_TCP_WSF, ri, r, iface.tcp_wsf, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_TCP_TIMER_SCALE, ri, r, iface.tcp_timer_scale,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_TCP_TIMESTAMP, ri, r, iface.tcp_timestamp,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_REDIRECT, ri, r, iface.redirect, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(IFACE_DEF_TMF_TMO, ri, r, iface.def_task_mgmt_tmo,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_HDRDGST, ri, r, iface.header_digest, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DATADGST, ri, r, iface.data_digest, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_IMM_DATA, ri, r, iface.immediate_data, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_INITIAL_R2T, ri, r, iface.initial_r2t, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DSEQ_INORDER, ri, r, iface.data_seq_inorder,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DPDU_INORDER, ri, r, iface.data_pdu_inorder,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_ERL, ri, r, iface.erl, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_MAX_RECV_DLEN, ri, r, iface.max_recv_dlength,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_FIRST_BURST, ri, r, iface.first_burst_len,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(IFACE_MAX_R2T, ri, r, iface.max_out_r2t, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_MAX_BURST, ri, r, iface.max_burst_len, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_CHAP_AUTH, ri, r, iface.chap_auth, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_BIDI_CHAP, ri, r, iface.bidi_chap, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_STRICT_LOGIN_COMP, ri, r, iface.strict_login_comp,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DISCOVERY_AUTH, ri, r, iface.discovery_auth,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DISCOVERY_LOGOUT, ri, r, iface.discovery_logout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
__recinfo_str(NODE_DISC_ADDR, ri, r, disc_address, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 0);
|
|
Packit Service |
646995 |
__recinfo_int(NODE_DISC_PORT, ri, r, disc_port, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 0);
|
|
Packit Service |
646995 |
__recinfo_int_o6(NODE_DISC_TYPE, ri, r, disc_type, IDBM_SHOW,
|
|
Packit Service |
646995 |
"send_targets", "isns", "offload_send_targets", "slp",
|
|
Packit Service |
646995 |
"static", "fw", num, 0);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_INIT_CMDSN, ri, r,
|
|
Packit Service |
646995 |
session.initial_cmdsn, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_INIT_LOGIN_RETRY, ri, r,
|
|
Packit Service |
646995 |
session.initial_login_retry_max, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_XMIT_THREAD_PRIORITY, ri, r,
|
|
Packit Service |
646995 |
session.xmit_thread_priority, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_CMDS_MAX, ri, r,
|
|
Packit Service |
646995 |
session.cmds_max, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_QDEPTH, ri, r,
|
|
Packit Service |
646995 |
session.queue_depth, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_NR_SESSIONS, ri, r,
|
|
Packit Service |
646995 |
session.nr_sessions, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int_o2(SESSION_AUTH_METHOD, ri, r, session.auth.authmethod,
|
|
Packit Service |
646995 |
IDBM_SHOW, "None", "CHAP", num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(SESSION_USERNAME, ri, r,
|
|
Packit Service |
646995 |
session.auth.username, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(SESSION_PASSWORD, ri, r,
|
|
Packit Service |
646995 |
session.auth.password, IDBM_MASKED, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_PASSWORD_LEN, ri, r,
|
|
Packit Service |
646995 |
session.auth.password_length, IDBM_HIDE, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(SESSION_USERNAME_IN, ri, r,
|
|
Packit Service |
646995 |
session.auth.username_in, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(SESSION_PASSWORD_IN, ri, r,
|
|
Packit Service |
646995 |
session.auth.password_in, IDBM_MASKED, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_PASSWORD_IN_LEN, ri, r,
|
|
Packit Service |
646995 |
session.auth.password_in_length, IDBM_HIDE, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int_list(SESSION_CHAP_ALGS, ri, r,
|
|
Packit Service |
646995 |
session.auth.chap_algs, IDBM_SHOW, chap_algs, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_REPLACEMENT_TMO, ri, r,
|
|
Packit Service |
646995 |
session.timeo.replacement_timeout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_ABORT_TMO, ri, r,
|
|
Packit Service |
646995 |
session.err_timeo.abort_timeout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_LU_RESET_TMO, ri, r,
|
|
Packit Service |
646995 |
session.err_timeo.lu_reset_timeout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_TGT_RESET_TMO, ri, r,
|
|
Packit Service |
646995 |
session.err_timeo.tgt_reset_timeout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_HOST_RESET_TMO, ri, r,
|
|
Packit Service |
646995 |
session.err_timeo.host_reset_timeout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int_o2(SESSION_FAST_ABORT, ri, r,
|
|
Packit Service |
646995 |
session.iscsi.FastAbort, IDBM_SHOW, "No", "Yes",
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_int_o2(SESSION_INITIAL_R2T, ri, r,
|
|
Packit Service |
646995 |
session.iscsi.InitialR2T, IDBM_SHOW,
|
|
Packit Service |
646995 |
"No", "Yes", num, 1);
|
|
Packit Service |
646995 |
__recinfo_int_o2(SESSION_IMM_DATA, ri, r,
|
|
Packit Service |
646995 |
session.iscsi.ImmediateData,
|
|
Packit Service |
646995 |
IDBM_SHOW, "No", "Yes", num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_FIRST_BURST, ri, r,
|
|
Packit Service |
646995 |
session.iscsi.FirstBurstLength, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_MAX_BURST, ri, r,
|
|
Packit Service |
646995 |
session.iscsi.MaxBurstLength, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_DEF_TIME2RETAIN, ri, r,
|
|
Packit Service |
646995 |
session.iscsi.DefaultTime2Retain, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_DEF_TIME2WAIT, ri, r,
|
|
Packit Service |
646995 |
session.iscsi.DefaultTime2Wait, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_MAX_CONNS, ri, r,
|
|
Packit Service |
646995 |
session.iscsi.MaxConnections, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_MAX_R2T, ri, r,
|
|
Packit Service |
646995 |
session.iscsi.MaxOutstandingR2T, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_ERL, ri, r,
|
|
Packit Service |
646995 |
session.iscsi.ERL, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int_o2(SESSION_SCAN, ri, r,
|
|
Packit Service |
646995 |
session.scan, IDBM_SHOW, "manual", "auto",
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(SESSION_REOPEN_MAX, ri, r,
|
|
Packit Service |
646995 |
session.reopen_max, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
for (i = 0; i < ISCSI_CONN_MAX; i++) {
|
|
Packit Service |
646995 |
char key[NAME_MAXVAL];
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
sprintf(key, CONN_ADDR, i);
|
|
Packit Service |
646995 |
__recinfo_str(key, ri, r, conn[i].address, IDBM_SHOW, num, 0);
|
|
Packit Service |
646995 |
sprintf(key, CONN_PORT, i);
|
|
Packit Service |
646995 |
__recinfo_int(key, ri, r, conn[i].port, IDBM_SHOW, num, 0);
|
|
Packit Service |
646995 |
sprintf(key, CONN_STARTUP, i);
|
|
Packit Service |
646995 |
__recinfo_int_o3(key, ri, r, conn[i].startup, IDBM_SHOW,
|
|
Packit Service |
646995 |
"manual", "automatic", "onboot", num, 1);
|
|
Packit Service |
646995 |
sprintf(key, CONN_WINDOW_SIZE, i);
|
|
Packit Service |
646995 |
__recinfo_int(key, ri, r, conn[i].tcp.window_size,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, CONN_SERVICE_TYPE, i);
|
|
Packit Service |
646995 |
__recinfo_int(key, ri, r, conn[i].tcp.type_of_service,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, CONN_LOGOUT_TMO, i);
|
|
Packit Service |
646995 |
__recinfo_int(key, ri, r, conn[i].timeo.logout_timeout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, CONN_LOGIN_TMO, i);
|
|
Packit Service |
646995 |
__recinfo_int(key, ri, r, conn[i].timeo.login_timeout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, CONN_AUTH_TMO, i);
|
|
Packit Service |
646995 |
__recinfo_int(key, ri, r, conn[i].timeo.auth_timeout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
sprintf(key, CONN_NOP_INT, i);
|
|
Packit Service |
646995 |
__recinfo_int(key, ri, r, conn[i].timeo.noop_out_interval,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, CONN_NOP_TMO, i);
|
|
Packit Service |
646995 |
__recinfo_int(key, ri, r, conn[i].timeo.noop_out_timeout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
sprintf(key, CONN_MAX_XMIT_DLEN, i);
|
|
Packit Service |
646995 |
__recinfo_int(key, ri, r,
|
|
Packit Service |
646995 |
conn[i].iscsi.MaxXmitDataSegmentLength, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, CONN_MAX_RECV_DLEN, i);
|
|
Packit Service |
646995 |
__recinfo_int(key, ri, r,
|
|
Packit Service |
646995 |
conn[i].iscsi.MaxRecvDataSegmentLength, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, CONN_HDR_DIGEST, i);
|
|
Packit Service |
646995 |
__recinfo_int_o4(key, ri, r, conn[i].iscsi.HeaderDigest,
|
|
Packit Service |
646995 |
IDBM_SHOW, "None", "CRC32C", "CRC32C,None",
|
|
Packit Service |
646995 |
"None,CRC32C", num, 1);
|
|
Packit Service |
646995 |
sprintf(key, CONN_DATA_DIGEST, i);
|
|
Packit Service |
646995 |
__recinfo_int_o4(key, ri, r, conn[i].iscsi.DataDigest, IDBM_SHOW,
|
|
Packit Service |
646995 |
"None", "CRC32C", "CRC32C,None",
|
|
Packit Service |
646995 |
"None,CRC32C", num, 1);
|
|
Packit Service |
646995 |
sprintf(key, CONN_IFMARKER, i);
|
|
Packit Service |
646995 |
__recinfo_int_o2(key, ri, r, conn[i].iscsi.IFMarker, IDBM_SHOW,
|
|
Packit Service |
646995 |
"No", "Yes", num, 1);
|
|
Packit Service |
646995 |
sprintf(key, CONN_OFMARKER, i);
|
|
Packit Service |
646995 |
__recinfo_int_o2(key, ri, r, conn[i].iscsi.OFMarker, IDBM_SHOW,
|
|
Packit Service |
646995 |
"No", "Yes", num, 1);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int num = 0;
|
|
Packit Service |
646995 |
int iface_type;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_type = iface_get_iptype(r);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_ISCSINAME, ri, r, name, IDBM_SHOW, num, 0);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_NETNAME, ri, r, netdev, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_IPADDR, ri, r, ipaddress, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_PREFIX_LEN, ri, r, prefix_len, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_HWADDR, ri, r, hwaddress, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_TRANSPORTNAME, ri, r, transport_name,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_INAME, ri, r, iname, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_STATE, ri, r, state, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(IFACE_VLAN_ID, ri, r, vlan_id, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_VLAN_PRIORITY, ri, r, vlan_priority,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_VLAN_STATE, ri, r, vlan_state, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(IFACE_NUM, ri, r, iface_num, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(IFACE_MTU, ri, r, mtu, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(IFACE_PORT, ri, r, port, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface_type == ISCSI_IFACE_TYPE_IPV4) {
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_BOOT_PROTO, ri, r, bootproto, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_SUBNET_MASK, ri, r, subnet_mask, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_GATEWAY, ri, r, gateway, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_ALT_CID, ri, r,
|
|
Packit Service |
646995 |
dhcp_alt_client_id_state, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, dhcp_alt_client_id,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_DNS, ri, r, dhcp_dns, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, dhcp_learn_iqn,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_REQ_VID, ri, r,
|
|
Packit Service |
646995 |
dhcp_req_vendor_id_state, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_VID, ri, r, dhcp_vendor_id_state,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_VID_STR, ri, r, dhcp_vendor_id,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DHCP_SLP_DA, ri, r, dhcp_slp_da, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_FRAGMENTATION, ri, r, fragmentation,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_GRAT_ARP, ri, r, gratuitous_arp, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_IN_FORWARD, ri, r, incoming_forwarding,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_TOS_STATE, ri, r, tos_state, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_TOS, ri, r, tos, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_TTL, ri, r, ttl, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
} else if (iface_type == ISCSI_IFACE_TYPE_IPV6) {
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, ipv6_autocfg,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, linklocal_autocfg,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, router_autocfg,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_LINKLOCAL, ri, r, ipv6_linklocal, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_ROUTER, ri, r, ipv6_router, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r,
|
|
Packit Service |
646995 |
dup_addr_detect_cnt, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_FLOW_LABEL, ri, r, flow_label, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r,
|
|
Packit Service |
646995 |
gratuitous_neighbor_adv, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_HOP_LIMIT, ri, r, hop_limit, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_MLD, ri, r, mld, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r,
|
|
Packit Service |
646995 |
nd_reachable_tmo, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, nd_rexmit_time,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, nd_stale_tmo,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r,
|
|
Packit Service |
646995 |
router_adv_link_mtu, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, traffic_class,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DELAYED_ACK, ri, r, delayed_ack, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_TCP_NAGLE, ri, r, nagle, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_TCP_WSF_STATE, ri, r, tcp_wsf_state, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_TCP_WSF, ri, r, tcp_wsf, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_TCP_TIMER_SCALE, ri, r, tcp_timer_scale,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_TCP_TIMESTAMP, ri, r, tcp_timestamp, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_REDIRECT, ri, r, redirect, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(IFACE_DEF_TMF_TMO, ri, r, def_task_mgmt_tmo, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_HDRDGST, ri, r, header_digest, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DATADGST, ri, r, data_digest, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_IMM_DATA, ri, r, immediate_data, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_INITIAL_R2T, ri, r, initial_r2t, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DSEQ_INORDER, ri, r, data_seq_inorder, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DPDU_INORDER, ri, r, data_pdu_inorder, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(IFACE_ERL, ri, r, erl, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_MAX_RECV_DLEN, ri, r, max_recv_dlength,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_FIRST_BURST, ri, r, first_burst_len, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(IFACE_MAX_R2T, ri, r, max_out_r2t, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(IFACE_MAX_BURST, ri, r, max_burst_len, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_CHAP_AUTH, ri, r, chap_auth, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_BIDI_CHAP, ri, r, bidi_chap, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_STRICT_LOGIN_COMP, ri, r, strict_login_comp,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DISCOVERY_AUTH, ri, r, discovery_auth, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(IFACE_DISCOVERY_LOGOUT, ri, r, discovery_logout,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int num = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
__recinfo_uint16(HOST_AUTH_INDEX, ri, r, chap_tbl_idx, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (r->chap_type == CHAP_TYPE_OUT) {
|
|
Packit Service |
646995 |
__recinfo_str(HOST_AUTH_USERNAME, ri, r, username, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(HOST_AUTH_PASSWORD, ri, r, password, IDBM_MASKED,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(HOST_AUTH_PASSWORD_LEN, ri, r, password_length,
|
|
Packit Service |
646995 |
IDBM_HIDE, num, 1);
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
__recinfo_str(HOST_AUTH_USERNAME_IN, ri, r, username, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(HOST_AUTH_PASSWORD_IN, ri, r, password,
|
|
Packit Service |
646995 |
IDBM_MASKED, num, 1);
|
|
Packit Service |
646995 |
__recinfo_int(HOST_AUTH_PASSWORD_IN_LEN, ri, r, password_length,
|
|
Packit Service |
646995 |
IDBM_HIDE, num, 1);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void idbm_recinfo_flashnode(struct flashnode_rec *r, recinfo_t *ri)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int num = 0;
|
|
Packit Service |
646995 |
int i;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_AUTO_SND_TGT_DISABLE, ri, r,
|
|
Packit Service |
646995 |
sess.auto_snd_tgt_disable, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_DISCOVERY_SESS, ri, r,
|
|
Packit Service |
646995 |
sess.discovery_session, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(FLASHNODE_SESS_PORTAL_TYPE, ri, r, sess.portal_type,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_ENTRY_EN, ri, r,
|
|
Packit Service |
646995 |
sess.entry_enable, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_IMM_DATA_EN, ri, r, sess.immediate_data,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_INITIAL_R2T_EN, ri, r, sess.initial_r2t,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_DATASEQ_INORDER, ri, r,
|
|
Packit Service |
646995 |
sess.data_seq_in_order, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_PDU_INORDER, ri, r,
|
|
Packit Service |
646995 |
sess.data_pdu_in_order, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_CHAP_AUTH_EN, ri, r, sess.chap_auth_en,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_DISCOVERY_LOGOUT_EN, ri, r,
|
|
Packit Service |
646995 |
sess.discovery_logout_en, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_BIDI_CHAP_EN, ri, r, sess.bidi_chap_en,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_DISCOVERY_AUTH_OPTIONAL, ri, r,
|
|
Packit Service |
646995 |
sess.discovery_auth_optional, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_ERL, ri, r, sess.erl, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(FLASHNODE_SESS_FIRST_BURST, ri, r,
|
|
Packit Service |
646995 |
sess.first_burst_len, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(FLASHNODE_SESS_DEF_TIME2WAIT, ri, r,
|
|
Packit Service |
646995 |
sess.def_time2wait, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(FLASHNODE_SESS_DEF_TIME2RETAIN, ri, r,
|
|
Packit Service |
646995 |
sess.def_time2retain, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(FLASHNODE_SESS_MAX_R2T, ri, r,
|
|
Packit Service |
646995 |
sess.max_outstanding_r2t, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(FLASHNODE_SESS_ISID, ri, r, sess.isid, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(FLASHNODE_SESS_TSID, ri, r, sess.tsid, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint32(FLASHNODE_SESS_MAX_BURST, ri, r, sess.max_burst_len,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(FLASHNODE_SESS_DEF_TASKMGMT_TMO, ri, r,
|
|
Packit Service |
646995 |
sess.def_taskmgmt_tmo, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(FLASHNODE_SESS_ALIAS, ri, r, sess.targetalias, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(FLASHNODE_SESS_NAME, ri, r, sess.targetname, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(FLASHNODE_SESS_DISCOVERY_PARENT_IDX, ri, r,
|
|
Packit Service |
646995 |
sess.discovery_parent_idx, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(FLASHNODE_SESS_DISCOVERY_PARENT_TYPE, ri, r,
|
|
Packit Service |
646995 |
sess.discovery_parent_type, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(FLASHNODE_SESS_TPGT, ri, r, sess.tpgt, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(FLASHNODE_SESS_CHAP_OUT_IDX, ri, r, sess.chap_out_idx,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint16(FLASHNODE_SESS_CHAP_IN_IDX, ri, r, sess.chap_in_idx,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(FLASHNODE_SESS_USERNAME, ri, r, sess.username, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(FLASHNODE_SESS_USERNAME_IN, ri, r, sess.username_in,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(FLASHNODE_SESS_PASSWORD, ri, r, sess.password, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
__recinfo_str(FLASHNODE_SESS_PASSWORD_IN, ri, r, sess.password_in,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
__recinfo_uint8(FLASHNODE_SESS_IS_BOOT_TGT, ri, r, sess.is_boot_target,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
for (i = 0; i < ISCSI_CONN_MAX; i++) {
|
|
Packit Service |
646995 |
char key[NAME_MAXVAL];
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_IS_FW_ASSIGNED_IPV6, i);
|
|
Packit Service |
646995 |
__recinfo_uint8(key, ri, r, conn[i].is_fw_assigned_ipv6,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_HDR_DGST_EN, i);
|
|
Packit Service |
646995 |
__recinfo_uint8(key, ri, r, conn[i].header_digest_en, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_DATA_DGST_EN, i);
|
|
Packit Service |
646995 |
__recinfo_uint8(key, ri, r, conn[i].data_digest_en, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_SNACK_REQ_EN, i);
|
|
Packit Service |
646995 |
__recinfo_uint8(key, ri, r, conn[i].snack_req_en, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_TCP_TIMESTAMP_STAT, i);
|
|
Packit Service |
646995 |
__recinfo_uint8(key, ri, r, conn[i].tcp_timestamp_stat,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_TCP_NAGLE_DISABLE, i);
|
|
Packit Service |
646995 |
__recinfo_uint8(key, ri, r, conn[i].tcp_nagle_disable,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_TCP_WSF_DISABLE, i);
|
|
Packit Service |
646995 |
__recinfo_uint8(key, ri, r, conn[i].tcp_wsf_disable, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_TCP_TIMER_SCALE, i);
|
|
Packit Service |
646995 |
__recinfo_uint8(key, ri, r, conn[i].tcp_timer_scale, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_TCP_TIMESTAMP_EN, i);
|
|
Packit Service |
646995 |
__recinfo_uint8(key, ri, r, conn[i].tcp_timestamp_en,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_IP_FRAG_DISABLE, i);
|
|
Packit Service |
646995 |
__recinfo_uint8(key, ri, r, conn[i].fragment_disable, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_MAX_XMIT_DLENGTH, i);
|
|
Packit Service |
646995 |
__recinfo_uint32(key, ri, r, conn[i].max_xmit_dlength,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_MAX_RECV_DLENGTH, i);
|
|
Packit Service |
646995 |
__recinfo_uint32(key, ri, r, conn[i].max_recv_dlength,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_KEEPALIVE_TMO, i);
|
|
Packit Service |
646995 |
__recinfo_uint16(key, ri, r, conn[i].keepalive_tmo, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_PORT, i);
|
|
Packit Service |
646995 |
__recinfo_uint16(key, ri, r, conn[i].port, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_IPADDR, i);
|
|
Packit Service |
646995 |
__recinfo_str(key, ri, r, conn[i].ipaddress, IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_REDIRECT_IPADDR, i);
|
|
Packit Service |
646995 |
__recinfo_str(key, ri, r, conn[i].redirect_ipaddr, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_MAX_SEGMENT_SIZE, i);
|
|
Packit Service |
646995 |
__recinfo_uint32(key, ri, r, conn[i].max_segment_size,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_LOCAL_PORT, i);
|
|
Packit Service |
646995 |
__recinfo_uint16(key, ri, r, conn[i].local_port, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_IPV4_TOS, i);
|
|
Packit Service |
646995 |
__recinfo_uint8(key, ri, r, conn[i].ipv4_tos, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_IPV6_TC, i);
|
|
Packit Service |
646995 |
__recinfo_uint8(key, ri, r, conn[i].ipv6_traffic_class,
|
|
Packit Service |
646995 |
IDBM_SHOW, num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_IPV6_FLOW_LABEL, i);
|
|
Packit Service |
646995 |
__recinfo_uint16(key, ri, r, conn[i].ipv6_flow_lbl, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_LINK_LOCAL_IPV6, i);
|
|
Packit Service |
646995 |
__recinfo_str(key, ri, r, conn[i].link_local_ipv6, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_TCP_XMIT_WSF, i);
|
|
Packit Service |
646995 |
__recinfo_uint32(key, ri, r, conn[i].tcp_xmit_wsf, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_TCP_RECV_WSF, i);
|
|
Packit Service |
646995 |
__recinfo_uint32(key, ri, r, conn[i].tcp_recv_wsf, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_STATSN, i);
|
|
Packit Service |
646995 |
__recinfo_uint32(key, ri, r, conn[i].stat_sn, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
sprintf(key, FLASHNODE_CONN_EXP_STATSN, i);
|
|
Packit Service |
646995 |
__recinfo_uint32(key, ri, r, conn[i].exp_stat_sn, IDBM_SHOW,
|
|
Packit Service |
646995 |
num, 1);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
recinfo_t *idbm_recinfo_alloc(int max_keys)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
recinfo_t *info;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
info = malloc(sizeof(recinfo_t)*max_keys);
|
|
Packit Service |
646995 |
if (!info)
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
memset(info, 0, sizeof(recinfo_t)*max_keys);
|
|
Packit Service |
646995 |
return info;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void idbm_print(int type, void *rec, int show, FILE *f)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int i;
|
|
Packit Service |
646995 |
recinfo_t *info;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
info = idbm_recinfo_alloc(MAX_KEYS);
|
|
Packit Service |
646995 |
if (!info)
|
|
Packit Service |
646995 |
return;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
switch (type) {
|
|
Packit Service |
646995 |
case IDBM_PRINT_TYPE_DISCOVERY:
|
|
Packit Service |
646995 |
idbm_recinfo_discovery((discovery_rec_t*)rec, info);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
case IDBM_PRINT_TYPE_NODE:
|
|
Packit Service |
646995 |
idbm_recinfo_node((node_rec_t*)rec, info);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
case IDBM_PRINT_TYPE_IFACE:
|
|
Packit Service |
646995 |
idbm_recinfo_iface((struct iface_rec *)rec, info);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
case IDBM_PRINT_TYPE_HOST_CHAP:
|
|
Packit Service |
646995 |
idbm_recinfo_host_chap((struct iscsi_chap_rec *)rec, info);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
case IDBM_PRINT_TYPE_FLASHNODE:
|
|
Packit Service |
646995 |
idbm_recinfo_flashnode((struct flashnode_rec *)rec, info);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
fprintf(f, "%s\n", ISCSI_BEGIN_REC);
|
|
Packit Service |
646995 |
for (i = 0; i < MAX_KEYS; i++) {
|
|
Packit Service |
646995 |
if (!info[i].visible)
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
if (!show && info[i].visible == IDBM_MASKED) {
|
|
Packit Service |
646995 |
if (*(char*)info[i].data) {
|
|
Packit Service |
646995 |
fprintf(f, "%s = ********\n", info[i].name);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
/* fall through */
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strlen(info[i].value))
|
|
Packit Service |
646995 |
fprintf(f, "%s = %s\n", info[i].name, info[i].value);
|
|
Packit Service |
646995 |
else if (f == stdout)
|
|
Packit Service |
646995 |
fprintf(f, "%s = <empty>\n", info[i].name);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
fprintf(f, "%s\n", ISCSI_END_REC);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
free(info);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static void
|
|
Packit Service |
646995 |
idbm_setup_session_defaults(struct iscsi_session_operational_config *conf)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
conf->InitialR2T = 0;
|
|
Packit Service |
646995 |
conf->ImmediateData = 1;
|
|
Packit Service |
646995 |
conf->FirstBurstLength = DEF_INI_FIRST_BURST_LEN;
|
|
Packit Service |
646995 |
conf->MaxBurstLength = DEF_INI_MAX_BURST_LEN;
|
|
Packit Service |
646995 |
conf->DefaultTime2Wait = ISCSI_DEF_TIME2WAIT;
|
|
Packit Service |
646995 |
conf->DefaultTime2Retain = 0;
|
|
Packit Service |
646995 |
conf->MaxConnections = 1;
|
|
Packit Service |
646995 |
conf->MaxOutstandingR2T = 1;
|
|
Packit Service |
646995 |
conf->ERL = 0;
|
|
Packit Service |
646995 |
conf->FastAbort = 1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static void idbm_setup_conn_defaults(struct iscsi_conn_operational_config *conf)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
conf->MaxXmitDataSegmentLength = 0;
|
|
Packit Service |
646995 |
conf->MaxRecvDataSegmentLength = DEF_INI_MAX_RECV_SEG_LEN;
|
|
Packit Service |
646995 |
conf->HeaderDigest = CONFIG_DIGEST_NEVER;
|
|
Packit Service |
646995 |
conf->DataDigest = CONFIG_DIGEST_NEVER;
|
|
Packit Service |
646995 |
conf->IFMarker = 0;
|
|
Packit Service |
646995 |
conf->OFMarker = 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static void
|
|
Packit Service |
646995 |
idbm_discovery_setup_defaults(discovery_rec_t *rec, discovery_type_e type)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
memset(rec, 0, sizeof(discovery_rec_t));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rec->startup = ISCSI_STARTUP_MANUAL;
|
|
Packit Service |
646995 |
rec->type = type;
|
|
Packit Service |
646995 |
rec->iscsid_req_tmo = -1;
|
|
Packit Service |
646995 |
switch (type) {
|
|
Packit Service |
646995 |
case DISCOVERY_TYPE_SENDTARGETS:
|
|
Packit Service |
646995 |
rec->u.sendtargets.discoveryd_poll_inval = 30;
|
|
Packit Service |
646995 |
rec->u.sendtargets.use_discoveryd = 0;
|
|
Packit Service |
646995 |
rec->u.sendtargets.reopen_max = 5;
|
|
Packit Service |
646995 |
rec->u.sendtargets.auth.authmethod = 0;
|
|
Packit Service |
646995 |
rec->u.sendtargets.auth.password_length = 0;
|
|
Packit Service |
646995 |
rec->u.sendtargets.auth.password_in_length = 0;
|
|
Packit Service |
646995 |
/* TYPE_INT_LIST fields should be initialized to ~0 to indicate unset values */
|
|
Packit Service |
646995 |
memset(rec->u.sendtargets.auth.chap_algs, ~0, sizeof(rec->u.sendtargets.auth.chap_algs));
|
|
Packit Service |
646995 |
rec->u.sendtargets.auth.chap_algs[0] = AUTH_CHAP_ALG_MD5;
|
|
Packit Service |
646995 |
rec->u.sendtargets.conn_timeo.login_timeout=15;
|
|
Packit Service |
646995 |
rec->u.sendtargets.conn_timeo.auth_timeout = 45;
|
|
Packit Service |
646995 |
rec->u.sendtargets.conn_timeo.active_timeout=30;
|
|
Packit Service |
646995 |
idbm_setup_session_defaults(&rec->u.sendtargets.session_conf);
|
|
Packit Service |
646995 |
idbm_setup_conn_defaults(&rec->u.sendtargets.conn_conf);
|
|
Packit Service |
646995 |
/* override def setting */
|
|
Packit Service |
646995 |
rec->u.sendtargets.conn_conf.MaxRecvDataSegmentLength =
|
|
Packit Service |
646995 |
DEF_INI_DISC_MAX_RECV_SEG_LEN;
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
case DISCOVERY_TYPE_SLP:
|
|
Packit Service |
646995 |
rec->u.slp.interfaces = NULL;
|
|
Packit Service |
646995 |
rec->u.slp.scopes = NULL;
|
|
Packit Service |
646995 |
rec->u.slp.poll_interval = 5 * 60; /* 5 minutes */
|
|
Packit Service |
646995 |
rec->u.slp.auth.authmethod = 0;
|
|
Packit Service |
646995 |
rec->u.slp.auth.password_length = 0;
|
|
Packit Service |
646995 |
rec->u.slp.auth.password_in_length = 0;
|
|
Packit Service |
646995 |
rec->u.slp.auth.password_in_length = 0;
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
case DISCOVERY_TYPE_ISNS:
|
|
Packit Service |
646995 |
rec->u.isns.use_discoveryd = 0;
|
|
Packit Service |
646995 |
rec->u.isns.discoveryd_poll_inval = -1;
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
default:
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_rec_update_param(recinfo_t *info, char *name, char *value,
|
|
Packit Service |
646995 |
int line_number)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int i;
|
|
Packit Service |
646995 |
int passwd_done = 0;
|
|
Packit Service |
646995 |
char passwd_len[8];
|
|
Packit Service |
646995 |
char *tmp_value, *token;
|
|
Packit Service |
646995 |
bool *found;
|
|
Packit Service |
646995 |
int *tmp_data;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
setup_passwd_len:
|
|
Packit Service |
646995 |
for (i=0; i
|
|
Packit Service |
646995 |
if (!strcmp(name, info[i].name)) {
|
|
Packit Service |
646995 |
int j,k;
|
|
Packit Service |
646995 |
struct int_list_tbl *tbl;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(7, "updated '%s', '%s' => '%s'", name,
|
|
Packit Service |
646995 |
info[i].value, value);
|
|
Packit Service |
646995 |
/* parse recinfo by type */
|
|
Packit Service |
646995 |
switch (info[i].type) {
|
|
Packit Service |
646995 |
case TYPE_INT:
|
|
Packit Service |
646995 |
if (!info[i].data)
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
*(int*)info[i].data =
|
|
Packit Service |
646995 |
strtoul(value, NULL, 10);
|
|
Packit Service |
646995 |
goto updated;
|
|
Packit Service |
646995 |
case TYPE_UINT8:
|
|
Packit Service |
646995 |
if (!info[i].data)
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
*(uint8_t *)info[i].data =
|
|
Packit Service |
646995 |
strtoul(value, NULL, 10);
|
|
Packit Service |
646995 |
goto updated;
|
|
Packit Service |
646995 |
case TYPE_UINT16:
|
|
Packit Service |
646995 |
if (!info[i].data)
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
*(uint16_t *)info[i].data =
|
|
Packit Service |
646995 |
strtoul(value, NULL, 10);
|
|
Packit Service |
646995 |
goto updated;
|
|
Packit Service |
646995 |
case TYPE_UINT32:
|
|
Packit Service |
646995 |
if (!info[i].data)
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
*(uint32_t *)info[i].data =
|
|
Packit Service |
646995 |
strtoul(value, NULL, 10);
|
|
Packit Service |
646995 |
goto updated;
|
|
Packit Service |
646995 |
case TYPE_STR:
|
|
Packit Service |
646995 |
if (!info[i].data)
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
strlcpy((char*)info[i].data,
|
|
Packit Service |
646995 |
value, info[i].data_len);
|
|
Packit Service |
646995 |
goto updated;
|
|
Packit Service |
646995 |
case TYPE_INT_O:
|
|
Packit Service |
646995 |
for (j=0; j
|
|
Packit Service |
646995 |
if (!strcmp(value, info[i].opts[j])) {
|
|
Packit Service |
646995 |
if (!info[i].data)
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
*(int*)info[i].data = j;
|
|
Packit Service |
646995 |
goto updated;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
/* internal error if reached ?? */
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
case TYPE_INT_LIST:
|
|
Packit Service |
646995 |
if (!info[i].data)
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
tbl = (void *)info[i].opts[0];
|
|
Packit Service |
646995 |
/* strsep is destructive, make a copy to work with */
|
|
Packit Service |
646995 |
tmp_value = strdup(value);
|
|
Packit Service |
646995 |
k = 0;
|
|
Packit Service |
646995 |
tmp_data = malloc(info[i].data_len);
|
|
Packit Service |
646995 |
memset(tmp_data, ~0, info[i].data_len);
|
|
Packit Service |
646995 |
found = calloc(info[i].numopts, sizeof(bool));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
next_token: while ((token = strsep(&tmp_value, ", \n"))) {
|
|
Packit Service |
646995 |
if (!strlen(token))
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
if ((k * (int)sizeof(int)) >= (info[i].data_len)) {
|
|
Packit Service |
646995 |
log_warning("Too many values set for '%s'"
|
|
Packit Service |
646995 |
", continuing without processing them all",
|
|
Packit Service |
646995 |
info[i].name);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
for (j = 0; j < info[i].numopts; j++) {
|
|
Packit Service |
646995 |
if (!strcmp(token, tbl[j].name)) {
|
|
Packit Service |
646995 |
if ((found[j])) {
|
|
Packit Service |
646995 |
log_warning("Ignoring repeated "
|
|
Packit Service |
646995 |
"value '%s' "
|
|
Packit Service |
646995 |
"for '%s'", token,
|
|
Packit Service |
646995 |
info[i].name);
|
|
Packit Service |
646995 |
goto next_token;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
((int*)tmp_data)[k++] = tbl[j].value;
|
|
Packit Service |
646995 |
found[j] = true;
|
|
Packit Service |
646995 |
goto next_token;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
log_warning("Ignoring unknown value '%s'"
|
|
Packit Service |
646995 |
" for '%s'", token, info[i].name);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
memcpy(info[i].data, tmp_data, info[i].data_len);
|
|
Packit Service |
646995 |
free(tmp_value);
|
|
Packit Service |
646995 |
free(tmp_data);
|
|
Packit Service |
646995 |
tmp_value = NULL;
|
|
Packit Service |
646995 |
tmp_data = NULL;
|
|
Packit Service |
646995 |
token = NULL;
|
|
Packit Service |
646995 |
goto updated;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
if (line_number) {
|
|
Packit Service |
646995 |
log_warning("config file line %d contains "
|
|
Packit Service |
646995 |
"unknown value format '%s' for "
|
|
Packit Service |
646995 |
"parameter name '%s'",
|
|
Packit Service |
646995 |
line_number, value, name);
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
log_error("unknown value format '%s' for "
|
|
Packit Service |
646995 |
"parameter name '%s'", value, name);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
updated:
|
|
Packit Service |
646995 |
strlcpy((char*)info[i].value, value, VALUE_MAXVAL);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define check_password_param(_param) \
|
|
Packit Service |
646995 |
if (!passwd_done && !strcmp(#_param, name)) { \
|
|
Packit Service |
646995 |
passwd_done = 1; \
|
|
Packit Service |
646995 |
name = #_param "_length"; \
|
|
Packit Service |
646995 |
snprintf(passwd_len, 8, "%.7" PRIi32, (int)strlen(value) & 0xffff); \
|
|
Packit Service |
646995 |
value = passwd_len; \
|
|
Packit Service |
646995 |
goto setup_passwd_len; \
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
check_password_param(node.session.auth.password);
|
|
Packit Service |
646995 |
check_password_param(node.session.auth.password_in);
|
|
Packit Service |
646995 |
check_password_param(discovery.sendtargets.auth.password);
|
|
Packit Service |
646995 |
check_password_param(discovery.sendtargets.auth.password_in);
|
|
Packit Service |
646995 |
check_password_param(discovery.slp.auth.password);
|
|
Packit Service |
646995 |
check_password_param(discovery.slp.auth.password_in);
|
|
Packit Service |
646995 |
check_password_param(host.auth.password);
|
|
Packit Service |
646995 |
check_password_param(host.auth.password_in);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* TODO: we can also check for valid values here.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
int idbm_verify_param(recinfo_t *info, char *name)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int i;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
for (i = 0; i < MAX_KEYS; i++) {
|
|
Packit Service |
646995 |
if (strcmp(name, info[i].name))
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(7, "verify %s %d", name, info[i].can_modify);
|
|
Packit Service |
646995 |
if (info[i].can_modify)
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
else {
|
|
Packit Service |
646995 |
log_error("Cannot modify %s. It is used to look up "
|
|
Packit Service |
646995 |
"the record and cannot be changed.", name);
|
|
Packit Service |
646995 |
return ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_error("Cannot modify %s. Invalid param name.", name);
|
|
Packit Service |
646995 |
return ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void idbm_recinfo_config(recinfo_t *info, FILE *f)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
char name[NAME_MAXVAL];
|
|
Packit Service |
646995 |
char value[VALUE_MAXVAL];
|
|
Packit Service |
646995 |
char *line, *nl, buffer[2048];
|
|
Packit Service |
646995 |
int line_number = 0;
|
|
Packit Service |
646995 |
int c = 0, i;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
fseek(f, 0, SEEK_SET);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* process the config file */
|
|
Packit Service |
646995 |
do {
|
|
Packit Service |
646995 |
line = fgets(buffer, sizeof (buffer), f);
|
|
Packit Service |
646995 |
line_number++;
|
|
Packit Service |
646995 |
if (!line)
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
nl = line + strlen(line) - 1;
|
|
Packit Service |
646995 |
if (*nl != '\n') {
|
|
Packit Service |
646995 |
log_warning("Config file line %d too long.",
|
|
Packit Service |
646995 |
line_number);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
line = strstrip(line);
|
|
Packit Service |
646995 |
/* process any non-empty, non-comment lines */
|
|
Packit Service |
646995 |
if (!*line || *line == '\0' || *line == '\n' || *line == '#')
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* parse name */
|
|
Packit Service |
646995 |
i=0; nl = line; *name = 0;
|
|
Packit Service |
646995 |
while (*nl && !isspace(c = *nl) && *nl != '=') {
|
|
Packit Service |
646995 |
*(name+i) = *nl; i++; nl++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
if (!*nl) {
|
|
Packit Service |
646995 |
log_warning("config file line %d do not has value",
|
|
Packit Service |
646995 |
line_number);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
*(name+i)=0; nl++;
|
|
Packit Service |
646995 |
/* skip after-name traling spaces */
|
|
Packit Service |
646995 |
while (*nl && isspace(c = *nl)) nl++;
|
|
Packit Service |
646995 |
if (*nl && *nl != '=') {
|
|
Packit Service |
646995 |
log_warning("config file line %d has not '=' sepa",
|
|
Packit Service |
646995 |
line_number);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
/* skip '=' sepa */
|
|
Packit Service |
646995 |
nl++;
|
|
Packit Service |
646995 |
/* skip after-sepa traling spaces */
|
|
Packit Service |
646995 |
while (*nl && isspace(c = *nl)) nl++;
|
|
Packit Service |
646995 |
if (!*nl) {
|
|
Packit Service |
646995 |
log_warning("config file line %d do not has value",
|
|
Packit Service |
646995 |
line_number);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
/* parse value */
|
|
Packit Service |
646995 |
i=0; *value = 0;
|
|
Packit Service |
646995 |
while (*nl) {
|
|
Packit Service |
646995 |
*(value+i) = *nl; i++; nl++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
*(value+i) = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_rec_update_param(info, name, value, line_number);
|
|
Packit Service |
646995 |
} while (line);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* TODO: remove db's copy of nrec and infos
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static void idbm_sync_config(void)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
char *config_file;
|
|
Packit Service |
646995 |
FILE *f;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* in case of no configuration file found we just
|
|
Packit Service |
646995 |
* initialize default node and default discovery records
|
|
Packit Service |
646995 |
* from hard-coded default values */
|
|
Packit Service |
646995 |
idbm_node_setup_defaults(&db->nrec);
|
|
Packit Service |
646995 |
idbm_discovery_setup_defaults(&db->drec_st, DISCOVERY_TYPE_SENDTARGETS);
|
|
Packit Service |
646995 |
idbm_discovery_setup_defaults(&db->drec_slp, DISCOVERY_TYPE_SLP);
|
|
Packit Service |
646995 |
idbm_discovery_setup_defaults(&db->drec_isns, DISCOVERY_TYPE_ISNS);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_recinfo_discovery(&db->drec_st, db->dinfo_st);
|
|
Packit Service |
646995 |
idbm_recinfo_discovery(&db->drec_slp, db->dinfo_slp);
|
|
Packit Service |
646995 |
idbm_recinfo_discovery(&db->drec_isns, db->dinfo_isns);
|
|
Packit Service |
646995 |
idbm_recinfo_node(&db->nrec, db->ninfo);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!db->get_config_file) {
|
|
Packit Service |
646995 |
log_debug(1, "Could not get config file. No config file fn");
|
|
Packit Service |
646995 |
return;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
config_file = db->get_config_file();
|
|
Packit Service |
646995 |
if (!config_file) {
|
|
Packit Service |
646995 |
log_debug(1, "Could not get config file for sync config");
|
|
Packit Service |
646995 |
return;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
f = fopen(config_file, "r");
|
|
Packit Service |
646995 |
if (!f) {
|
|
Packit Service |
646995 |
log_debug(1, "cannot open configuration file %s. "
|
|
Packit Service |
646995 |
"Default location is %s.",
|
|
Packit Service |
646995 |
config_file, CONFIG_FILE);
|
|
Packit Service |
646995 |
return;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
log_debug(5, "updating defaults from '%s'", config_file);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_recinfo_config(db->dinfo_st, f);
|
|
Packit Service |
646995 |
idbm_recinfo_config(db->dinfo_slp, f);
|
|
Packit Service |
646995 |
idbm_recinfo_config(db->dinfo_isns, f);
|
|
Packit Service |
646995 |
idbm_recinfo_config(db->ninfo, f);
|
|
Packit Service |
646995 |
fclose(f);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* update password lengths */
|
|
Packit Service |
646995 |
if (*db->drec_st.u.sendtargets.auth.password)
|
|
Packit Service |
646995 |
db->drec_st.u.sendtargets.auth.password_length =
|
|
Packit Service |
646995 |
strlen((char*)db->drec_st.u.sendtargets.auth.password);
|
|
Packit Service |
646995 |
if (*db->drec_st.u.sendtargets.auth.password_in)
|
|
Packit Service |
646995 |
db->drec_st.u.sendtargets.auth.password_in_length =
|
|
Packit Service |
646995 |
strlen((char*)db->drec_st.u.sendtargets.auth.password_in);
|
|
Packit Service |
646995 |
if (*db->drec_slp.u.slp.auth.password)
|
|
Packit Service |
646995 |
db->drec_slp.u.slp.auth.password_length =
|
|
Packit Service |
646995 |
strlen((char*)db->drec_slp.u.slp.auth.password);
|
|
Packit Service |
646995 |
if (*db->drec_slp.u.slp.auth.password_in)
|
|
Packit Service |
646995 |
db->drec_slp.u.slp.auth.password_in_length =
|
|
Packit Service |
646995 |
strlen((char*)db->drec_slp.u.slp.auth.password_in);
|
|
Packit Service |
646995 |
if (*db->nrec.session.auth.password)
|
|
Packit Service |
646995 |
db->nrec.session.auth.password_length =
|
|
Packit Service |
646995 |
strlen((char*)db->nrec.session.auth.password);
|
|
Packit Service |
646995 |
if (*db->nrec.session.auth.password_in)
|
|
Packit Service |
646995 |
db->nrec.session.auth.password_in_length =
|
|
Packit Service |
646995 |
strlen((char*)db->nrec.session.auth.password_in);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void idbm_node_setup_from_conf(node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
memset(rec, 0, sizeof(*rec));
|
|
Packit Service |
646995 |
idbm_node_setup_defaults(rec);
|
|
Packit Service |
646995 |
idbm_sync_config();
|
|
Packit Service |
646995 |
memcpy(rec, &db->nrec, sizeof(*rec));
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_print_discovery_info(discovery_rec_t *rec, int show)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
idbm_print(IDBM_PRINT_TYPE_DISCOVERY, rec, show, stdout);
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_print_node_info(void *data, node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int show = *((int *)data);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_print(IDBM_PRINT_TYPE_NODE, rec, show, stdout);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_print_host_chap_info(struct iscsi_chap_rec *chap)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
/* User only calls this to print chap so always print */
|
|
Packit Service |
646995 |
idbm_print(IDBM_PRINT_TYPE_HOST_CHAP, chap, 1, stdout);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_print_flashnode_info(struct flashnode_rec *fnode)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
idbm_print(IDBM_PRINT_TYPE_FLASHNODE, fnode, 1, stdout);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_print_node_flat(__attribute__((unused))void *data, node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (strchr(rec->conn[0].address, '.'))
|
|
Packit Service |
646995 |
printf("%s:%d,%d %s\n", rec->conn[0].address, rec->conn[0].port,
|
|
Packit Service |
646995 |
rec->tpgt, rec->name);
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
printf("[%s]:%d,%d %s\n", rec->conn[0].address,
|
|
Packit Service |
646995 |
rec->conn[0].port, rec->tpgt, rec->name);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_print_node_tree(struct node_rec *last_rec, struct node_rec *rec,
|
|
Packit Service |
646995 |
char *prefix)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (!last_rec || strcmp(last_rec->name, rec->name)) {
|
|
Packit Service |
646995 |
printf("%sTarget: %s\n", prefix, rec->name);
|
|
Packit Service |
646995 |
if (last_rec)
|
|
Packit Service |
646995 |
memset(last_rec, 0, sizeof(node_rec_t));
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!last_rec ||
|
|
Packit Service |
646995 |
((strcmp(last_rec->conn[0].address, rec->conn[0].address) ||
|
|
Packit Service |
646995 |
last_rec->conn[0].port != rec->conn[0].port))) {
|
|
Packit Service |
646995 |
if (strchr(rec->conn[0].address, '.'))
|
|
Packit Service |
646995 |
printf("%s\tPortal: %s:%d,%d\n", prefix,
|
|
Packit Service |
646995 |
rec->conn[0].address,
|
|
Packit Service |
646995 |
rec->conn[0].port, rec->tpgt);
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
printf("%s\tPortal: [%s]:%d,%d\n", prefix,
|
|
Packit Service |
646995 |
rec->conn[0].address,
|
|
Packit Service |
646995 |
rec->conn[0].port, rec->tpgt);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (last_rec)
|
|
Packit Service |
646995 |
memcpy(last_rec, rec, sizeof(node_rec_t));
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_print_node_and_iface_tree(void *data, node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
idbm_print_node_tree(data, rec, "");
|
|
Packit Service |
646995 |
printf("\t\tIface Name: %s\n", rec->iface.name);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int
|
|
Packit Service |
646995 |
get_params_from_disc_link(char *link, char **target, char **tpgt,
|
|
Packit Service |
646995 |
char **address, char **port, char **ifaceid)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
(*target) = link;
|
|
Packit Service |
646995 |
*address = strchr(*target, ',');
|
|
Packit Service |
646995 |
if (!(*address))
|
|
Packit Service |
646995 |
return ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
*(*address)++ = '\0';
|
|
Packit Service |
646995 |
*port = strchr(*address, ',');
|
|
Packit Service |
646995 |
if (!(*port))
|
|
Packit Service |
646995 |
return ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
*(*port)++ = '\0';
|
|
Packit Service |
646995 |
*tpgt = strchr(*port, ',');
|
|
Packit Service |
646995 |
if (!(*tpgt))
|
|
Packit Service |
646995 |
return ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
*(*tpgt)++ = '\0';
|
|
Packit Service |
646995 |
*ifaceid = strchr(*tpgt, ',');
|
|
Packit Service |
646995 |
if (!(*ifaceid))
|
|
Packit Service |
646995 |
return ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
*(*ifaceid)++ = '\0';
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_lock(void)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int fd, i, ret;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (db->refs > 0) {
|
|
Packit Service |
646995 |
db->refs++;
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (access(LOCK_DIR, F_OK) != 0) {
|
|
Packit Service |
646995 |
if (mkdir(LOCK_DIR, 0660) != 0) {
|
|
Packit Service |
646995 |
log_error("Could not open %s: %s", LOCK_DIR,
|
|
Packit Service |
646995 |
strerror(errno));
|
|
Packit Service |
646995 |
return ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
fd = open(LOCK_FILE, O_RDWR | O_CREAT, 0666);
|
|
Packit Service |
646995 |
if (fd >= 0)
|
|
Packit Service |
646995 |
close(fd);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
for (i = 0; i < 3000; i++) {
|
|
Packit Service |
646995 |
ret = link(LOCK_FILE, LOCK_WRITE_FILE);
|
|
Packit Service |
646995 |
if (ret == 0)
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (errno != EEXIST) {
|
|
Packit Service |
646995 |
log_error("Maybe you are not root?");
|
|
Packit Service |
646995 |
log_error("Could not lock discovery DB: %s: %s",
|
|
Packit Service |
646995 |
LOCK_WRITE_FILE, strerror(errno));
|
|
Packit Service |
646995 |
return ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
} else if (i == 0)
|
|
Packit Service |
646995 |
log_debug(2, "Waiting for discovery DB lock");
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
usleep(10000);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
db->refs = 1;
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void idbm_unlock(void)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (db->refs > 1) {
|
|
Packit Service |
646995 |
db->refs--;
|
|
Packit Service |
646995 |
return;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
db->refs = 0;
|
|
Packit Service |
646995 |
unlink(LOCK_WRITE_FILE);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Backwards Compat:
|
|
Packit Service |
646995 |
* If the portal is a file then we are doing the old style default
|
|
Packit Service |
646995 |
* session behavior (svn pre 780).
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static FILE *idbm_open_rec_r(char *portal, char *config)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct stat statb;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(5, "Looking for config file %s config %s.", portal, config);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (stat(portal, &statb)) {
|
|
Packit Service |
646995 |
log_debug(5, "Could not stat %s err %d.", portal, errno);
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (S_ISDIR(statb.st_mode)) {
|
|
Packit Service |
646995 |
strlcat(portal, "/", PATH_MAX);
|
|
Packit Service |
646995 |
strlcat(portal, config, PATH_MAX);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return fopen(portal, "r");
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* When the disable_lock param is true, the idbm_lock/idbm_unlock needs
|
|
Packit Service |
646995 |
* to be holt by the caller, this will avoid overwriting each other in
|
|
Packit Service |
646995 |
* case of updating(read-modify-write) the recs in parallel.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static int __idbm_rec_read(node_rec_t *out_rec, char *conf, bool disable_lock)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
recinfo_t *info;
|
|
Packit Service |
646995 |
FILE *f;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
info = idbm_recinfo_alloc(MAX_KEYS);
|
|
Packit Service |
646995 |
if (!info)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!disable_lock) {
|
|
Packit Service |
646995 |
rc = idbm_lock();
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto free_info;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
f = fopen(conf, "r");
|
|
Packit Service |
646995 |
if (!f) {
|
|
Packit Service |
646995 |
log_debug(5, "Could not open %s err %s", conf,
|
|
Packit Service |
646995 |
strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
goto unlock;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(out_rec, 0, sizeof(*out_rec));
|
|
Packit Service |
646995 |
idbm_node_setup_defaults(out_rec);
|
|
Packit Service |
646995 |
idbm_recinfo_node(out_rec, info);
|
|
Packit Service |
646995 |
idbm_recinfo_config(info, f);
|
|
Packit Service |
646995 |
fclose(f);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
unlock:
|
|
Packit Service |
646995 |
if (!disable_lock)
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
free_info:
|
|
Packit Service |
646995 |
free(info);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* When the disable_lock param is true, the idbm_lock/idbm_unlock needs
|
|
Packit Service |
646995 |
* to be holt by the caller, this will avoid overwriting each other in
|
|
Packit Service |
646995 |
* case of updating(read-modify-write) the recs in parallel.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
int
|
|
Packit Service |
646995 |
idbm_rec_read(node_rec_t *out_rec, char *targetname, int tpgt,
|
|
Packit Service |
646995 |
char *ip, int port, struct iface_rec *iface, bool disable_lock)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct stat statb;
|
|
Packit Service |
646995 |
char *portal;
|
|
Packit Service |
646995 |
int rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
portal = calloc(1, PATH_MAX);
|
|
Packit Service |
646995 |
if (!portal)
|
|
Packit Service |
646995 |
return ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* try old style portal as config */
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
targetname, ip, port);
|
|
Packit Service |
646995 |
log_debug(5, "rec read looking for config file %s.", portal);
|
|
Packit Service |
646995 |
if (!stat(portal, &statb))
|
|
Packit Service |
646995 |
goto read;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
targetname, ip, port, tpgt, iface->name);
|
|
Packit Service |
646995 |
log_debug(5, "rec read looking for config file %s.", portal);
|
|
Packit Service |
646995 |
if (!strlen(iface->name)) {
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
goto free_portal;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (stat(portal, &statb)) {
|
|
Packit Service |
646995 |
log_debug(5, "Could not stat %s: %s.", portal, strerror(errno));
|
|
Packit Service |
646995 |
free(portal);
|
|
Packit Service |
646995 |
return ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
read:
|
|
Packit Service |
646995 |
rc = __idbm_rec_read(out_rec, portal, disable_lock);
|
|
Packit Service |
646995 |
free_portal:
|
|
Packit Service |
646995 |
free(portal);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int print_discovered_flat(void *data, node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct discovery_rec *drec = data;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (rec->disc_type != drec->type)
|
|
Packit Service |
646995 |
goto no_match;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (drec->type == DISCOVERY_TYPE_SENDTARGETS ||
|
|
Packit Service |
646995 |
drec->type == DISCOVERY_TYPE_ISNS) {
|
|
Packit Service |
646995 |
if (rec->disc_port != drec->port ||
|
|
Packit Service |
646995 |
strcmp(rec->disc_address, drec->address))
|
|
Packit Service |
646995 |
goto no_match;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_print_node_flat(NULL, rec);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
no_match:
|
|
Packit Service |
646995 |
return -1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
struct discovered_tree_info {
|
|
Packit Service |
646995 |
struct discovery_rec *drec;
|
|
Packit Service |
646995 |
struct node_rec *last_rec;
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int print_discovered_tree(void *data, node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct discovered_tree_info *tree_info = data;
|
|
Packit Service |
646995 |
struct discovery_rec *drec = tree_info->drec;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (rec->disc_type != drec->type)
|
|
Packit Service |
646995 |
goto no_match;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strlen(drec->address)) {
|
|
Packit Service |
646995 |
if (rec->disc_port != drec->port ||
|
|
Packit Service |
646995 |
strcmp(rec->disc_address, drec->address))
|
|
Packit Service |
646995 |
goto no_match;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_print_node_and_iface_tree(tree_info->last_rec, rec);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
no_match:
|
|
Packit Service |
646995 |
return -1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int idbm_print_discovered(discovery_rec_t *drec, int info_level)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int num_found = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (info_level < 1)
|
|
Packit Service |
646995 |
idbm_for_each_rec(&num_found, drec, print_discovered_flat, false);
|
|
Packit Service |
646995 |
else {
|
|
Packit Service |
646995 |
struct discovered_tree_info tree_info;
|
|
Packit Service |
646995 |
struct node_rec last_rec;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(&last_rec, 0, sizeof(struct node_rec));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
tree_info.drec = drec;
|
|
Packit Service |
646995 |
tree_info.last_rec = &last_rec;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_for_each_rec(&num_found, &tree_info, print_discovered_tree, false);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return num_found;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int idbm_for_each_drec(int type, char *config_root, void *data,
|
|
Packit Service |
646995 |
idbm_drec_op_fn *fn)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
DIR *entity_dirfd;
|
|
Packit Service |
646995 |
struct dirent *entity_dent;
|
|
Packit Service |
646995 |
int found = 0;
|
|
Packit Service |
646995 |
discovery_rec_t drec;
|
|
Packit Service |
646995 |
char *tmp_port;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
entity_dirfd = opendir(config_root);
|
|
Packit Service |
646995 |
if (!entity_dirfd)
|
|
Packit Service |
646995 |
return found;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
while ((entity_dent = readdir(entity_dirfd))) {
|
|
Packit Service |
646995 |
if (!strcmp(entity_dent->d_name, ".") ||
|
|
Packit Service |
646995 |
!strcmp(entity_dent->d_name, ".."))
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(5, "found %s", entity_dent->d_name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
tmp_port = strchr(entity_dent->d_name, ',');
|
|
Packit Service |
646995 |
if (!tmp_port)
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* pre 872 tools dumped the target portal symlinks in the isns
|
|
Packit Service |
646995 |
* dir instead of the server. If we find one of those links
|
|
Packit Service |
646995 |
* (by checking if there is a valid port) we skip it.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (strchr(tmp_port, ':') || strchr(tmp_port, '.'))
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
*tmp_port++ = '\0';
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(&drec, 0, sizeof(drec));
|
|
Packit Service |
646995 |
if (idbm_discovery_read(&drec, type, entity_dent->d_name,
|
|
Packit Service |
646995 |
atoi(tmp_port))) {
|
|
Packit Service |
646995 |
log_error("Could not read discovery record for "
|
|
Packit Service |
646995 |
"%s:%s.", entity_dent->d_name, tmp_port);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!fn(data, &drec))
|
|
Packit Service |
646995 |
found++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
closedir(entity_dirfd);
|
|
Packit Service |
646995 |
return found;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_for_each_st_drec(void *data, idbm_drec_op_fn *fn)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
return idbm_for_each_drec(DISCOVERY_TYPE_SENDTARGETS, ST_CONFIG_DIR,
|
|
Packit Service |
646995 |
data, fn);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_for_each_isns_drec(void *data, idbm_drec_op_fn *fn)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
return idbm_for_each_drec(DISCOVERY_TYPE_ISNS, ISNS_CONFIG_DIR,
|
|
Packit Service |
646995 |
data, fn);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int __idbm_print_all_by_drec(void *data, struct discovery_rec *drec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int info_level = *(int *)data;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (info_level >= 1) {
|
|
Packit Service |
646995 |
printf("DiscoveryAddress: %s,%d\n",
|
|
Packit Service |
646995 |
drec->address, drec->port);
|
|
Packit Service |
646995 |
idbm_print_discovered(drec, info_level);
|
|
Packit Service |
646995 |
} else
|
|
Packit Service |
646995 |
printf("%s:%d via %s\n", drec->address, drec->port,
|
|
Packit Service |
646995 |
drec->type == DISCOVERY_TYPE_ISNS ?
|
|
Packit Service |
646995 |
"isns" : "sendtargets");
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int idbm_print_all_st(int info_level)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_for_each_st_drec(&info_level, __idbm_print_all_by_drec);
|
|
Packit Service |
646995 |
if (rc < 0)
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int idbm_print_all_isns(int info_level)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_for_each_isns_drec(&info_level, __idbm_print_all_by_drec);
|
|
Packit Service |
646995 |
if (rc < 0)
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_print_all_discovery(int info_level)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
discovery_rec_t *drec;
|
|
Packit Service |
646995 |
int found = 0, tmp;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (info_level < 1) {
|
|
Packit Service |
646995 |
found = idbm_print_all_st(info_level);
|
|
Packit Service |
646995 |
found += idbm_print_all_isns(info_level);
|
|
Packit Service |
646995 |
return found;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
drec = calloc(1, sizeof(*drec));
|
|
Packit Service |
646995 |
if (!drec)
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
tmp = 0;
|
|
Packit Service |
646995 |
printf("SENDTARGETS:\n");
|
|
Packit Service |
646995 |
tmp = idbm_print_all_st(info_level);
|
|
Packit Service |
646995 |
if (!tmp)
|
|
Packit Service |
646995 |
printf("No targets found.\n");
|
|
Packit Service |
646995 |
found += tmp;
|
|
Packit Service |
646995 |
tmp = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
printf("iSNS:\n");
|
|
Packit Service |
646995 |
tmp = idbm_print_all_isns(info_level);
|
|
Packit Service |
646995 |
if (!tmp) {
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* pre 872 tools did not store the server ip,port so
|
|
Packit Service |
646995 |
* we drop down here, to just look for target portals.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
drec->type = DISCOVERY_TYPE_ISNS;
|
|
Packit Service |
646995 |
tmp = idbm_print_discovered(drec, info_level);
|
|
Packit Service |
646995 |
if (!tmp)
|
|
Packit Service |
646995 |
printf("No targets found.\n");
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
found += tmp;
|
|
Packit Service |
646995 |
tmp = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
printf("STATIC:\n");
|
|
Packit Service |
646995 |
drec->type = DISCOVERY_TYPE_STATIC;
|
|
Packit Service |
646995 |
tmp = idbm_print_discovered(drec, info_level);
|
|
Packit Service |
646995 |
if (!tmp)
|
|
Packit Service |
646995 |
printf("No targets found.\n");
|
|
Packit Service |
646995 |
found += tmp;
|
|
Packit Service |
646995 |
tmp = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
printf("FIRMWARE:\n");
|
|
Packit Service |
646995 |
drec->type = DISCOVERY_TYPE_FW;
|
|
Packit Service |
646995 |
tmp = idbm_print_discovered(drec, info_level);
|
|
Packit Service |
646995 |
if (!tmp)
|
|
Packit Service |
646995 |
printf("No targets found.\n");
|
|
Packit Service |
646995 |
found += tmp;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
free(drec);
|
|
Packit Service |
646995 |
return found;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* idbm_for_each_iface - iterate over bound iface recs
|
|
Packit Service |
646995 |
* @found: nr of recs found so far
|
|
Packit Service |
646995 |
* @data: data pointer passed to fn
|
|
Packit Service |
646995 |
* @fn: iterator function ran over each bound iface rec
|
|
Packit Service |
646995 |
* @targetname: rec's target name
|
|
Packit Service |
646995 |
* @tpgt: rec's portal group tag
|
|
Packit Service |
646995 |
* @ip: rec's ip address
|
|
Packit Service |
646995 |
* @port: rec's port
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* This will run fn over all recs with the {targetname,tpgt,ip,port}
|
|
Packit Service |
646995 |
* id. It does not iterate over the ifaces setup in /etc/iscsi/ifaces.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* fn should return -1 if it skipped the rec, an ISCSI_ERR error code if
|
|
Packit Service |
646995 |
* the operation failed or 0 if fn was run successfully.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static int idbm_for_each_iface(int *found, void *data, idbm_iface_op_fn *fn,
|
|
Packit Service |
646995 |
char *targetname, int tpgt, char *ip, int port,
|
|
Packit Service |
646995 |
bool ruw_lock)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
DIR *iface_dirfd;
|
|
Packit Service |
646995 |
struct dirent *iface_dent;
|
|
Packit Service |
646995 |
struct stat statb;
|
|
Packit Service |
646995 |
node_rec_t rec;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
char *portal;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
portal = calloc(1, PATH_MAX);
|
|
Packit Service |
646995 |
if (!portal)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (tpgt >= 0)
|
|
Packit Service |
646995 |
goto read_iface;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* old style portal as a config */
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR, targetname,
|
|
Packit Service |
646995 |
ip, port);
|
|
Packit Service |
646995 |
if (stat(portal, &statb)) {
|
|
Packit Service |
646995 |
log_error("iface iter could not stat %s.", portal);
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
goto free_portal;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = __idbm_rec_read(&rec, portal, ruw_lock);
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto free_portal;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = fn(data, &rec);
|
|
Packit Service |
646995 |
if (!rc)
|
|
Packit Service |
646995 |
(*found)++;
|
|
Packit Service |
646995 |
else if (rc == -1)
|
|
Packit Service |
646995 |
rc = 0;
|
|
Packit Service |
646995 |
goto free_portal;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
read_iface:
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
targetname, ip, port, tpgt);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_dirfd = opendir(portal);
|
|
Packit Service |
646995 |
if (!iface_dirfd) {
|
|
Packit Service |
646995 |
log_error("iface iter could not read dir %s.", portal);
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
goto free_portal;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
while ((iface_dent = readdir(iface_dirfd))) {
|
|
Packit Service |
646995 |
int curr_rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strcmp(iface_dent->d_name, ".") ||
|
|
Packit Service |
646995 |
!strcmp(iface_dent->d_name, ".."))
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(5, "iface iter found %s.", iface_dent->d_name);
|
|
Packit Service |
646995 |
memset(portal, 0, PATH_MAX);
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
targetname, ip, port, tpgt, iface_dent->d_name);
|
|
Packit Service |
646995 |
if (__idbm_rec_read(&rec, portal, ruw_lock))
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
curr_rc = fn(data, &rec);
|
|
Packit Service |
646995 |
/* less than zero means it was not a match */
|
|
Packit Service |
646995 |
if (curr_rc > 0 && !rc)
|
|
Packit Service |
646995 |
rc = curr_rc;
|
|
Packit Service |
646995 |
else if (curr_rc == 0)
|
|
Packit Service |
646995 |
(*found)++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
closedir(iface_dirfd);
|
|
Packit Service |
646995 |
free_portal:
|
|
Packit Service |
646995 |
free(portal);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* backwards compat
|
|
Packit Service |
646995 |
* The portal could be a file or dir with interfaces
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
int idbm_for_each_portal(int *found, void *data, idbm_portal_op_fn *fn,
|
|
Packit Service |
646995 |
char *targetname, bool ruw_lock)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
DIR *portal_dirfd;
|
|
Packit Service |
646995 |
struct dirent *portal_dent;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
char *portal;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
portal = calloc(1, PATH_MAX);
|
|
Packit Service |
646995 |
if (!portal)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, targetname);
|
|
Packit Service |
646995 |
portal_dirfd = opendir(portal);
|
|
Packit Service |
646995 |
if (!portal_dirfd) {
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
goto done;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
while ((portal_dent = readdir(portal_dirfd))) {
|
|
Packit Service |
646995 |
char *tmp_port, *tmp_tpgt;
|
|
Packit Service |
646995 |
int curr_rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strcmp(portal_dent->d_name, ".") ||
|
|
Packit Service |
646995 |
!strcmp(portal_dent->d_name, ".."))
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(5, "found %s", portal_dent->d_name);
|
|
Packit Service |
646995 |
tmp_port = strchr(portal_dent->d_name, ',');
|
|
Packit Service |
646995 |
if (!tmp_port)
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
*tmp_port++ = '\0';
|
|
Packit Service |
646995 |
tmp_tpgt = strchr(tmp_port, ',');
|
|
Packit Service |
646995 |
if (tmp_tpgt)
|
|
Packit Service |
646995 |
*tmp_tpgt++ = '\0';
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
curr_rc = fn(found, data, targetname,
|
|
Packit Service |
646995 |
tmp_tpgt ? atoi(tmp_tpgt) : -1,
|
|
Packit Service |
646995 |
portal_dent->d_name, atoi(tmp_port),
|
|
Packit Service |
646995 |
ruw_lock);
|
|
Packit Service |
646995 |
/* less than zero means it was not a match */
|
|
Packit Service |
646995 |
if (curr_rc > 0 && !rc)
|
|
Packit Service |
646995 |
rc = curr_rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
closedir(portal_dirfd);
|
|
Packit Service |
646995 |
done:
|
|
Packit Service |
646995 |
free(portal);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_for_each_node(int *found, void *data, idbm_node_op_fn *fn, bool ruw_lock)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
DIR *node_dirfd;
|
|
Packit Service |
646995 |
struct dirent *node_dent;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
*found = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
node_dirfd = opendir(NODE_CONFIG_DIR);
|
|
Packit Service |
646995 |
if (!node_dirfd)
|
|
Packit Service |
646995 |
/* on start up node dir may not be created */
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
while ((node_dent = readdir(node_dirfd))) {
|
|
Packit Service |
646995 |
int curr_rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strcmp(node_dent->d_name, ".") ||
|
|
Packit Service |
646995 |
!strcmp(node_dent->d_name, ".."))
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(5, "searching %s", node_dent->d_name);
|
|
Packit Service |
646995 |
curr_rc = fn(found, data, node_dent->d_name, ruw_lock);
|
|
Packit Service |
646995 |
/* less than zero means it was not a match */
|
|
Packit Service |
646995 |
if (curr_rc > 0 && !rc)
|
|
Packit Service |
646995 |
rc = curr_rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
closedir(node_dirfd);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int iface_fn(void *data, node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct rec_op_data *op_data = data;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return op_data->fn(op_data->data, rec);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int portal_fn(int *found, void *data, char *targetname,
|
|
Packit Service |
646995 |
int tpgt, char *ip, int port, bool ruw_lock)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (ruw_lock) {
|
|
Packit Service |
646995 |
rc = idbm_lock();
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_for_each_iface(found, data, iface_fn, targetname,
|
|
Packit Service |
646995 |
tpgt, ip, port, ruw_lock);
|
|
Packit Service |
646995 |
if (ruw_lock)
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int node_fn(int *found, void *data, char *targetname, bool ruw_lock)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
return idbm_for_each_portal(found, data, portal_fn, targetname, ruw_lock);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_for_each_rec(int *found, void *data, idbm_iface_op_fn *fn, bool ruw_lock)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct rec_op_data op_data;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(&op_data, 0, sizeof(struct rec_op_data));
|
|
Packit Service |
646995 |
op_data.data = data;
|
|
Packit Service |
646995 |
op_data.fn = fn;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return idbm_for_each_node(found, &op_data, node_fn, ruw_lock);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static struct {
|
|
Packit Service |
646995 |
char *config_root;
|
|
Packit Service |
646995 |
char *config_name;
|
|
Packit Service |
646995 |
} disc_type_to_config_vals[] = {
|
|
Packit Service |
646995 |
{ ST_CONFIG_DIR, ST_CONFIG_NAME },
|
|
Packit Service |
646995 |
{ ISNS_CONFIG_DIR, ISNS_CONFIG_NAME },
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int
|
|
Packit Service |
646995 |
idbm_discovery_read(discovery_rec_t *out_rec, int drec_type,
|
|
Packit Service |
646995 |
char *addr, int port)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
recinfo_t *info;
|
|
Packit Service |
646995 |
char *portal;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
FILE *f;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (drec_type > 1)
|
|
Packit Service |
646995 |
return ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(out_rec, 0, sizeof(discovery_rec_t));
|
|
Packit Service |
646995 |
out_rec->iscsid_req_tmo = -1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
info = idbm_recinfo_alloc(MAX_KEYS);
|
|
Packit Service |
646995 |
if (!info)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
portal = malloc(PATH_MAX);
|
|
Packit Service |
646995 |
if (!portal) {
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
goto free_info;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s,%d",
|
|
Packit Service |
646995 |
disc_type_to_config_vals[drec_type].config_root,
|
|
Packit Service |
646995 |
addr, port);
|
|
Packit Service |
646995 |
log_debug(5, "Looking for config file %s", portal);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_lock();
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto free_info;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
f = idbm_open_rec_r(portal,
|
|
Packit Service |
646995 |
disc_type_to_config_vals[drec_type].config_name);
|
|
Packit Service |
646995 |
if (!f) {
|
|
Packit Service |
646995 |
log_debug(1, "Could not open %s: %s", portal,
|
|
Packit Service |
646995 |
strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
goto unlock;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_discovery_setup_defaults(out_rec, drec_type);
|
|
Packit Service |
646995 |
idbm_recinfo_discovery(out_rec, info);
|
|
Packit Service |
646995 |
idbm_recinfo_config(info, f);
|
|
Packit Service |
646995 |
fclose(f);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
unlock:
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
free_info:
|
|
Packit Service |
646995 |
free(portal);
|
|
Packit Service |
646995 |
free(info);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Backwards Compat:
|
|
Packit Service |
646995 |
* If the portal is a file then we are doing the old style default
|
|
Packit Service |
646995 |
* session behavior (svn pre 780).
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static FILE *idbm_open_rec_w(char *portal, char *config)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct stat statb;
|
|
Packit Service |
646995 |
FILE *f;
|
|
Packit Service |
646995 |
int err;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(5, "Looking for config file %s", portal);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
err = stat(portal, &statb);
|
|
Packit Service |
646995 |
if (err)
|
|
Packit Service |
646995 |
goto mkdir_portal;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!S_ISDIR(statb.st_mode)) {
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Old style portal as a file. Let's update it.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (unlink(portal)) {
|
|
Packit Service |
646995 |
log_error("Could not convert %s to %s/%s. "
|
|
Packit Service |
646995 |
"err %d", portal, portal,
|
|
Packit Service |
646995 |
config, errno);
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
mkdir_portal:
|
|
Packit Service |
646995 |
if (mkdir(portal, 0660) != 0) {
|
|
Packit Service |
646995 |
log_error("Could not make dir %s err %d",
|
|
Packit Service |
646995 |
portal, errno);
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
strlcat(portal, "/", PATH_MAX);
|
|
Packit Service |
646995 |
strlcat(portal, config, PATH_MAX);
|
|
Packit Service |
646995 |
f = fopen(portal, "w");
|
|
Packit Service |
646995 |
if (!f)
|
|
Packit Service |
646995 |
log_error("Could not open %s err %d", portal, errno);
|
|
Packit Service |
646995 |
return f;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
d00439 |
static int idbm_rec_write_new(node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct stat statb;
|
|
Packit Service |
646995 |
FILE *f;
|
|
Packit Service |
646995 |
char *portal;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
portal = malloc(PATH_MAX);
|
|
Packit Service |
646995 |
if (!portal) {
|
|
Packit Service |
646995 |
log_error("Could not alloc portal");
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
rec->name, rec->conn[0].address, rec->conn[0].port);
|
|
Packit Service |
5c9eca |
|
|
Packit Service |
646995 |
rc = stat(portal, &statb);
|
|
Packit Service |
646995 |
if (rc) {
|
|
Packit Service |
646995 |
rc = 0;
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* older iscsiadm versions had you create the config then set
|
|
Packit Service |
646995 |
* set the tgpt. In new versions you must pass all the info in
|
|
Packit Service |
646995 |
* from the start
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
5c9eca |
goto mkdir_portal;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!S_ISDIR(statb.st_mode)) {
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Old style portal as a file, but with tpgt. Let's update it.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (unlink(portal)) {
|
|
Packit Service |
646995 |
log_error("Could not convert %s: %s", portal,
|
|
Packit Service |
646995 |
strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
d00439 |
goto free_portal;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_INVAL;
|
|
Packit Service |
d00439 |
goto free_portal;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
mkdir_portal:
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt);
|
|
Packit Service |
646995 |
if (stat(portal, &statb)) {
|
|
Packit Service |
646995 |
if (mkdir(portal, 0660) != 0) {
|
|
Packit Service |
646995 |
log_error("Could not make dir %s: %s",
|
|
Packit Service |
646995 |
portal, strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
d00439 |
goto free_portal;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt,
|
|
Packit Service |
646995 |
rec->iface.name);
|
|
Packit Service |
d00439 |
|
|
Packit Service |
646995 |
f = fopen(portal, "w");
|
|
Packit Service |
646995 |
if (!f) {
|
|
Packit Service |
646995 |
log_error("Could not open %s: %s", portal, strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
d00439 |
goto free_portal;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f);
|
|
Packit Service |
646995 |
fclose(f);
|
|
Packit Service |
d00439 |
free_portal:
|
|
Packit Service |
d00439 |
free(portal);
|
|
Packit Service |
d00439 |
return rc;
|
|
Packit Service |
d00439 |
}
|
|
Packit Service |
d00439 |
|
|
Packit Service |
d00439 |
static int idbm_rec_write_old(node_rec_t *rec)
|
|
Packit Service |
d00439 |
{
|
|
Packit Service |
d00439 |
FILE *f;
|
|
Packit Service |
d00439 |
char *portal;
|
|
Packit Service |
d00439 |
int rc = 0;
|
|
Packit Service |
d1f683 |
glob_t globbuf;
|
|
Packit Service |
d1f683 |
size_t i;
|
|
Packit Service |
d1f683 |
int tpgt = PORTAL_GROUP_TAG_UNKNOWN;
|
|
Packit Service |
d00439 |
|
|
Packit Service |
d00439 |
portal = malloc(PATH_MAX);
|
|
Packit Service |
d00439 |
if (!portal) {
|
|
Packit Service |
d00439 |
log_error("Could not alloc portal");
|
|
Packit Service |
d00439 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
d00439 |
}
|
|
Packit Service |
d1f683 |
|
|
Packit Service |
d1f683 |
/* check for newer portal dir with tpgt */
|
|
Packit Service |
d1f683 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d,*", NODE_CONFIG_DIR,
|
|
Packit Service |
d1f683 |
rec->name, rec->conn[0].address, rec->conn[0].port);
|
|
Packit Service |
d1f683 |
rc = glob(portal, GLOB_ONLYDIR, NULL, &globbuf);
|
|
Packit Service |
d1f683 |
if (!rc) {
|
|
Packit Service |
d1f683 |
if (globbuf.gl_pathc > 1)
|
|
Packit Service |
d1f683 |
log_warning("multiple tpg records for portal "
|
|
Packit Service |
d1f683 |
"%s/%s:%d found", rec->name,
|
|
Packit Service |
d1f683 |
rec->conn[0].address, rec->conn[0].port);
|
|
Packit Service |
d1f683 |
/* set pattern for sscanf matching of tpgt */
|
|
Packit Service |
d1f683 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%%u", NODE_CONFIG_DIR,
|
|
Packit Service |
d1f683 |
rec->name, rec->conn[0].address, rec->conn[0].port);
|
|
Packit Service |
d1f683 |
for (i = 0; i < globbuf.gl_pathc; i++) {
|
|
Packit Service |
d1f683 |
rc = sscanf(globbuf.gl_pathv[i], portal, &tpgt);
|
|
Packit Service |
d1f683 |
if (rc == 1)
|
|
Packit Service |
d1f683 |
break;
|
|
Packit Service |
d1f683 |
}
|
|
Packit Service |
d1f683 |
if (tpgt == PORTAL_GROUP_TAG_UNKNOWN)
|
|
Packit Service |
d1f683 |
log_warning("glob match on existing records, "
|
|
Packit Service |
d1f683 |
"but no valid tpgt found");
|
|
Packit Service |
d1f683 |
}
|
|
Packit Service |
d1f683 |
globfree(&globbuf);
|
|
Packit Service |
d1f683 |
rc = 0;
|
|
Packit Service |
d1f683 |
|
|
Packit Service |
d1f683 |
/* if a tpgt was selected from an old record, write entry in new format */
|
|
Packit Service |
d1f683 |
if (tpgt != PORTAL_GROUP_TAG_UNKNOWN) {
|
|
Packit Service |
d1f683 |
log_warning("using tpgt %u from existing record", tpgt);
|
|
Packit Service |
d1f683 |
rec->tpgt = tpgt;
|
|
Packit Service |
d1f683 |
rc = idbm_remove_disc_to_node_link(rec, portal);
|
|
Packit Service |
d1f683 |
free(portal);
|
|
Packit Service |
d1f683 |
return idbm_rec_write_new(rec);
|
|
Packit Service |
d1f683 |
}
|
|
Packit Service |
d1f683 |
|
|
Packit Service |
d00439 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR,
|
|
Packit Service |
d00439 |
rec->name, rec->conn[0].address, rec->conn[0].port);
|
|
Packit Service |
d00439 |
|
|
Packit Service |
d00439 |
f = fopen(portal, "w");
|
|
Packit Service |
d00439 |
if (!f) {
|
|
Packit Service |
d00439 |
log_error("Could not open %s: %sd", portal, strerror(errno));
|
|
Packit Service |
d00439 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
d00439 |
goto free_portal;
|
|
Packit Service |
d00439 |
}
|
|
Packit Service |
d00439 |
idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f);
|
|
Packit Service |
d00439 |
fclose(f);
|
|
Packit Service |
d00439 |
free_portal:
|
|
Packit Service |
d00439 |
free(portal);
|
|
Packit Service |
d00439 |
return rc;
|
|
Packit Service |
d00439 |
}
|
|
Packit Service |
d00439 |
|
|
Packit Service |
d00439 |
/*
|
|
Packit Service |
d00439 |
* When the disable_lock param is true, the idbm_lock/idbm_unlock needs
|
|
Packit Service |
d00439 |
* to be holt by the caller, this will avoid overwriting each other in
|
|
Packit Service |
d00439 |
* case of updating(read-modify-write) the recs in parallel.
|
|
Packit Service |
d00439 |
*/
|
|
Packit Service |
d00439 |
static int idbm_rec_write(node_rec_t *rec, bool disable_lock)
|
|
Packit Service |
d00439 |
{
|
|
Packit Service |
d00439 |
char *portal;
|
|
Packit Service |
d00439 |
int rc = 0;
|
|
Packit Service |
d00439 |
|
|
Packit Service |
d00439 |
portal = malloc(PATH_MAX);
|
|
Packit Service |
d00439 |
if (!portal) {
|
|
Packit Service |
d00439 |
log_error("Could not alloc portal");
|
|
Packit Service |
d00439 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
d00439 |
}
|
|
Packit Service |
d00439 |
|
|
Packit Service |
d00439 |
snprintf(portal, PATH_MAX, "%s", NODE_CONFIG_DIR);
|
|
Packit Service |
d00439 |
if (access(portal, F_OK) != 0) {
|
|
Packit Service |
d00439 |
if (mkdir(portal, 0660) != 0) {
|
|
Packit Service |
d00439 |
log_error("Could not make %s: %s", portal,
|
|
Packit Service |
d00439 |
strerror(errno));
|
|
Packit Service |
d00439 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
d00439 |
goto free_portal;
|
|
Packit Service |
d00439 |
}
|
|
Packit Service |
d00439 |
}
|
|
Packit Service |
d00439 |
|
|
Packit Service |
d00439 |
snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name);
|
|
Packit Service |
d00439 |
if (access(portal, F_OK) != 0) {
|
|
Packit Service |
d00439 |
if (mkdir(portal, 0660) != 0) {
|
|
Packit Service |
d00439 |
log_error("Could not make %s: %s", portal,
|
|
Packit Service |
d00439 |
strerror(errno));
|
|
Packit Service |
d00439 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
d00439 |
goto free_portal;
|
|
Packit Service |
d00439 |
}
|
|
Packit Service |
d00439 |
}
|
|
Packit Service |
d00439 |
|
|
Packit Service |
d00439 |
if (!disable_lock) {
|
|
Packit Service |
d00439 |
rc = idbm_lock();
|
|
Packit Service |
d00439 |
if (rc)
|
|
Packit Service |
d00439 |
goto free_portal;
|
|
Packit Service |
d00439 |
}
|
|
Packit Service |
d00439 |
|
|
Packit Service |
d00439 |
if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN)
|
|
Packit Service |
d00439 |
/* old style portal as config */
|
|
Packit Service |
d00439 |
rc = idbm_rec_write_old(rec);
|
|
Packit Service |
d00439 |
else
|
|
Packit Service |
d00439 |
rc = idbm_rec_write_new(rec);
|
|
Packit Service |
d00439 |
|
|
Packit Service |
646995 |
if (!disable_lock)
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
free_portal:
|
|
Packit Service |
646995 |
free(portal);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int
|
|
Packit Service |
646995 |
idbm_discovery_write(discovery_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
FILE *f;
|
|
Packit Service |
646995 |
char *portal;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (rec->type > 1)
|
|
Packit Service |
646995 |
return ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
portal = malloc(PATH_MAX);
|
|
Packit Service |
646995 |
if (!portal) {
|
|
Packit Service |
646995 |
log_error("Could not alloc portal");
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_lock();
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto free_portal;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s",
|
|
Packit Service |
646995 |
disc_type_to_config_vals[rec->type].config_root);
|
|
Packit Service |
646995 |
if (access(portal, F_OK) != 0) {
|
|
Packit Service |
646995 |
if (mkdir(portal, 0660) != 0) {
|
|
Packit Service |
646995 |
log_error("Could not make %s: %s", portal,
|
|
Packit Service |
646995 |
strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
goto unlock;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s,%d",
|
|
Packit Service |
646995 |
disc_type_to_config_vals[rec->type].config_root,
|
|
Packit Service |
646995 |
rec->address, rec->port);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
f = idbm_open_rec_w(portal,
|
|
Packit Service |
646995 |
disc_type_to_config_vals[rec->type].config_name);
|
|
Packit Service |
646995 |
if (!f) {
|
|
Packit Service |
646995 |
log_error("Could not open %s: %s", portal, strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
goto unlock;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_print(IDBM_PRINT_TYPE_DISCOVERY, rec, 1, f);
|
|
Packit Service |
646995 |
fclose(f);
|
|
Packit Service |
646995 |
unlock:
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
free_portal:
|
|
Packit Service |
646995 |
free(portal);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_add_discovery(discovery_rec_t *newrec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
discovery_rec_t rec;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!idbm_discovery_read(&rec, newrec->type, newrec->address,
|
|
Packit Service |
646995 |
newrec->port)) {
|
|
Packit Service |
646995 |
log_debug(7, "disc rec already exists");
|
|
Packit Service |
646995 |
/* fall through */
|
|
Packit Service |
646995 |
} else
|
|
Packit Service |
646995 |
log_debug(7, "adding new DB record");
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return idbm_discovery_write(newrec);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int setup_disc_to_node_link(char *disc_portal, node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct stat statb;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
switch (rec->disc_type) {
|
|
Packit Service |
646995 |
case DISCOVERY_TYPE_SENDTARGETS:
|
|
Packit Service |
646995 |
/* st dir setup when we create its discovery node */
|
|
Packit Service |
646995 |
snprintf(disc_portal, PATH_MAX, "%s/%s,%d/%s,%s,%d,%d,%s",
|
|
Packit Service |
646995 |
ST_CONFIG_DIR,
|
|
Packit Service |
646995 |
rec->disc_address, rec->disc_port, rec->name,
|
|
Packit Service |
646995 |
rec->conn[0].address, rec->conn[0].port, rec->tpgt,
|
|
Packit Service |
646995 |
rec->iface.name);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
case DISCOVERY_TYPE_FW:
|
|
Packit Service |
646995 |
if (access(FW_CONFIG_DIR, F_OK) != 0) {
|
|
Packit Service |
646995 |
if (mkdir(FW_CONFIG_DIR, 0660) != 0) {
|
|
Packit Service |
646995 |
log_error("Could not make %s: %s",
|
|
Packit Service |
646995 |
FW_CONFIG_DIR, strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(disc_portal, PATH_MAX, "%s/%s,%s,%d,%d,%s",
|
|
Packit Service |
646995 |
FW_CONFIG_DIR, rec->name,
|
|
Packit Service |
646995 |
rec->conn[0].address, rec->conn[0].port, rec->tpgt,
|
|
Packit Service |
646995 |
rec->iface.name);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
case DISCOVERY_TYPE_STATIC:
|
|
Packit Service |
646995 |
if (access(STATIC_CONFIG_DIR, F_OK) != 0) {
|
|
Packit Service |
646995 |
if (mkdir(STATIC_CONFIG_DIR, 0660) != 0) {
|
|
Packit Service |
646995 |
log_error("Could not make %s; %s",
|
|
Packit Service |
646995 |
STATIC_CONFIG_DIR, strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(disc_portal, PATH_MAX, "%s/%s,%s,%d,%d,%s",
|
|
Packit Service |
646995 |
STATIC_CONFIG_DIR, rec->name,
|
|
Packit Service |
646995 |
rec->conn[0].address, rec->conn[0].port, rec->tpgt,
|
|
Packit Service |
646995 |
rec->iface.name);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
case DISCOVERY_TYPE_ISNS:
|
|
Packit Service |
646995 |
if (access(ISNS_CONFIG_DIR, F_OK) != 0) {
|
|
Packit Service |
646995 |
if (mkdir(ISNS_CONFIG_DIR, 0660) != 0) {
|
|
Packit Service |
646995 |
log_error("Could not make %s: %s",
|
|
Packit Service |
646995 |
ISNS_CONFIG_DIR, strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Older tools lumped all portals together in the
|
|
Packit Service |
646995 |
* isns config dir. In 2.0-872, the isns dir added
|
|
Packit Service |
646995 |
* a isns server (ddress and port) dir like sendtargets.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* If we found a older style link we return that so it
|
|
Packit Service |
646995 |
* can be removed. If this function is called for
|
|
Packit Service |
646995 |
* addition of a rec then the older link should have been
|
|
Packit Service |
646995 |
* removed and we break down below.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
snprintf(disc_portal, PATH_MAX, "%s/%s,%s,%d,%d,%s",
|
|
Packit Service |
646995 |
ISNS_CONFIG_DIR,
|
|
Packit Service |
646995 |
rec->name, rec->conn[0].address,
|
|
Packit Service |
646995 |
rec->conn[0].port, rec->tpgt, rec->iface.name);
|
|
Packit Service |
646995 |
if (!stat(disc_portal, &statb)) {
|
|
Packit Service |
646995 |
log_debug(7, "using old style isns dir %s.",
|
|
Packit Service |
646995 |
disc_portal);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(disc_portal, PATH_MAX, "%s/%s,%d",
|
|
Packit Service |
646995 |
ISNS_CONFIG_DIR, rec->disc_address, rec->disc_port);
|
|
Packit Service |
646995 |
if (!stat(disc_portal, &statb) && S_ISDIR(statb.st_mode)) {
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* if there is a dir for this isns server then
|
|
Packit Service |
646995 |
* assume we are using the new style links
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
snprintf(disc_portal, PATH_MAX,
|
|
Packit Service |
646995 |
"%s/%s,%d/%s,%s,%d,%d,%s",
|
|
Packit Service |
646995 |
ISNS_CONFIG_DIR, rec->disc_address,
|
|
Packit Service |
646995 |
rec->disc_port, rec->name,
|
|
Packit Service |
646995 |
rec->conn[0].address, rec->conn[0].port,
|
|
Packit Service |
646995 |
rec->tpgt, rec->iface.name);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* adding a older link */
|
|
Packit Service |
646995 |
snprintf(disc_portal, PATH_MAX, "%s/%s,%s,%d,%d,%s",
|
|
Packit Service |
646995 |
ISNS_CONFIG_DIR, rec->name, rec->conn[0].address,
|
|
Packit Service |
646995 |
rec->conn[0].port, rec->tpgt, rec->iface.name);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
case DISCOVERY_TYPE_SLP:
|
|
Packit Service |
646995 |
default:
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_add_node(node_rec_t *newrec, discovery_rec_t *drec, int overwrite)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
node_rec_t rec;
|
|
Packit Service |
646995 |
char *node_portal = NULL, *disc_portal;
|
|
Packit Service |
646995 |
int rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_lock();
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!idbm_rec_read(&rec, newrec->name, newrec->tpgt,
|
|
Packit Service |
646995 |
newrec->conn[0].address, newrec->conn[0].port,
|
|
Packit Service |
646995 |
&newrec->iface, true)) {
|
|
Packit Service |
646995 |
if (!overwrite) {
|
|
Packit Service |
646995 |
rc = 0;
|
|
Packit Service |
646995 |
goto unlock;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_delete_node(&rec);
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto unlock;
|
|
Packit Service |
646995 |
log_debug(7, "overwriting existing record");
|
|
Packit Service |
646995 |
} else
|
|
Packit Service |
646995 |
log_debug(7, "adding new DB record");
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (drec) {
|
|
Packit Service |
646995 |
newrec->disc_type = drec->type;
|
|
Packit Service |
646995 |
newrec->disc_port = drec->port;
|
|
Packit Service |
646995 |
strcpy(newrec->disc_address, drec->address);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_rec_write(newrec, true);
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* if a old app passed in a bogus tpgt then we do not create links
|
|
Packit Service |
646995 |
* since it will set a different tpgt in another iscsiadm call
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (rc || !drec || newrec->tpgt == PORTAL_GROUP_TAG_UNKNOWN)
|
|
Packit Service |
646995 |
goto unlock;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
node_portal = calloc(2, PATH_MAX);
|
|
Packit Service |
646995 |
if (!node_portal) {
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
goto unlock;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
disc_portal = node_portal + PATH_MAX;
|
|
Packit Service |
646995 |
snprintf(node_portal, PATH_MAX, "%s/%s/%s,%d,%d", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
newrec->name, newrec->conn[0].address, newrec->conn[0].port,
|
|
Packit Service |
646995 |
newrec->tpgt);
|
|
Packit Service |
646995 |
rc = setup_disc_to_node_link(disc_portal, newrec);
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto unlock;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(7, "node addition making link from %s to %s", node_portal,
|
|
Packit Service |
646995 |
disc_portal);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (symlink(node_portal, disc_portal)) {
|
|
Packit Service |
646995 |
if (errno == EEXIST)
|
|
Packit Service |
646995 |
log_debug(7, "link from %s to %s exists", node_portal,
|
|
Packit Service |
646995 |
disc_portal);
|
|
Packit Service |
646995 |
else {
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
log_error("Could not make link from disc source %s to "
|
|
Packit Service |
646995 |
"node %s: %s", disc_portal, node_portal,
|
|
Packit Service |
646995 |
strerror(errno));
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
unlock:
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
free(node_portal);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int idbm_bind_iface_to_nodes(idbm_disc_nodes_fn *disc_node_fn,
|
|
Packit Service |
646995 |
void *data, struct iface_rec *iface,
|
|
Packit Service |
646995 |
struct list_head *bound_recs)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct node_rec *rec, *tmp;
|
|
Packit Service |
646995 |
struct list_head new_recs;
|
|
Packit Service |
646995 |
int rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
INIT_LIST_HEAD(&new_recs);
|
|
Packit Service |
646995 |
rc = disc_node_fn(data, iface, &new_recs);
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
list_for_each_entry_safe(rec, tmp, &new_recs, list) {
|
|
Packit Service |
646995 |
list_del_init(&rec->list);
|
|
Packit Service |
646995 |
list_add_tail(&rec->list, bound_recs);
|
|
Packit Service |
646995 |
iface_copy(&rec->iface, iface);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int
|
|
Packit Service |
646995 |
discovery_error_fatal(int err)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
switch (err) {
|
|
Packit Service |
646995 |
/* No error */
|
|
Packit Service |
646995 |
case ISCSI_SUCCESS:
|
|
Packit Service |
646995 |
/* Transport errors or timeouts are not fatal */
|
|
Packit Service |
646995 |
case ISCSI_ERR_TRANS:
|
|
Packit Service |
646995 |
case ISCSI_ERR_TRANS_TIMEOUT:
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_bind_ifaces_to_nodes(idbm_disc_nodes_fn *disc_node_fn,
|
|
Packit Service |
646995 |
void *data, struct list_head *ifaces,
|
|
Packit Service |
646995 |
struct list_head *bound_recs)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct list_head def_ifaces;
|
|
Packit Service |
646995 |
struct node_rec *rec, *tmp_rec;
|
|
Packit Service |
646995 |
struct iface_rec *iface, *tmp_iface;
|
|
Packit Service |
646995 |
struct iscsi_transport *t;
|
|
Packit Service |
646995 |
int rc = 0, found = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
INIT_LIST_HEAD(&def_ifaces);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!ifaces || list_empty(ifaces)) {
|
|
Packit Service |
646995 |
iface_link_ifaces(&def_ifaces);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
list_for_each_entry_safe(iface, tmp_iface, &def_ifaces, list) {
|
|
Packit Service |
646995 |
list_del(&iface->list);
|
|
Packit Service |
646995 |
t = iscsi_sysfs_get_transport_by_name(iface->transport_name);
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* only auto bind to software iscsi if it is
|
|
Packit Service |
646995 |
* not the default iface (that is handled below)
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (!t || strcmp(t->name, DEFAULT_TRANSPORT) ||
|
|
Packit Service |
646995 |
!strcmp(iface->name, DEFAULT_IFACENAME)) {
|
|
Packit Service |
646995 |
free(iface);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_bind_iface_to_nodes(disc_node_fn, data, iface,
|
|
Packit Service |
646995 |
bound_recs);
|
|
Packit Service |
646995 |
free(iface);
|
|
Packit Service |
646995 |
if (discovery_error_fatal(rc))
|
|
Packit Service |
646995 |
goto fail;
|
|
Packit Service |
646995 |
found = 1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* create default iface with old/default behavior */
|
|
Packit Service |
646995 |
if (!found) {
|
|
Packit Service |
646995 |
struct iface_rec def_iface;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(&def_iface, 0, sizeof(struct iface_rec));
|
|
Packit Service |
646995 |
iface_setup_defaults(&def_iface);
|
|
Packit Service |
646995 |
return idbm_bind_iface_to_nodes(disc_node_fn, data,
|
|
Packit Service |
646995 |
&def_iface, bound_recs);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
list_for_each_entry(iface, ifaces, list) {
|
|
Packit Service |
646995 |
if (strcmp(iface->name, DEFAULT_IFACENAME) &&
|
|
Packit Service |
646995 |
!iface_is_valid(iface)) {
|
|
Packit Service |
646995 |
log_error("iface %s is not valid. Will not "
|
|
Packit Service |
646995 |
"bind node to it. Iface settings "
|
|
Packit Service |
646995 |
iface_fmt, iface->name,
|
|
Packit Service |
646995 |
iface_str(iface));
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_bind_iface_to_nodes(disc_node_fn, data, iface,
|
|
Packit Service |
646995 |
bound_recs);
|
|
Packit Service |
646995 |
if (discovery_error_fatal(rc))
|
|
Packit Service |
646995 |
goto fail;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
fail:
|
|
Packit Service |
646995 |
list_for_each_entry_safe(iface, tmp_iface, &def_ifaces, list) {
|
|
Packit Service |
646995 |
list_del(&iface->list);
|
|
Packit Service |
646995 |
free(iface);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
list_for_each_entry_safe(rec, tmp_rec, bound_recs, list) {
|
|
Packit Service |
646995 |
list_del(&rec->list);
|
|
Packit Service |
646995 |
free(rec);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static void idbm_rm_disc_node_links(char *disc_dir)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
char *target = NULL, *tpgt = NULL, *port = NULL;
|
|
Packit Service |
646995 |
char *address = NULL, *iface_id = NULL;
|
|
Packit Service |
646995 |
DIR *disc_dirfd;
|
|
Packit Service |
646995 |
struct dirent *disc_dent;
|
|
Packit Service |
646995 |
node_rec_t *rec;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rec = calloc(1, sizeof(*rec));
|
|
Packit Service |
646995 |
if (!rec)
|
|
Packit Service |
646995 |
return;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
disc_dirfd = opendir(disc_dir);
|
|
Packit Service |
646995 |
if (!disc_dirfd)
|
|
Packit Service |
646995 |
goto free_rec;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* rm links to nodes */
|
|
Packit Service |
646995 |
while ((disc_dent = readdir(disc_dirfd))) {
|
|
Packit Service |
646995 |
if (!strcmp(disc_dent->d_name, ".") ||
|
|
Packit Service |
646995 |
!strcmp(disc_dent->d_name, ".."))
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (get_params_from_disc_link(disc_dent->d_name, &target, &tpgt,
|
|
Packit Service |
646995 |
&address, &port, &iface_id)) {
|
|
Packit Service |
646995 |
log_error("Improperly formed disc to node link");
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(5, "disc removal removing link %s %s %s %s",
|
|
Packit Service |
646995 |
target, address, port, iface_id);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(rec, 0, sizeof(*rec));
|
|
Packit Service |
646995 |
strlcpy(rec->name, target, TARGET_NAME_MAXLEN);
|
|
Packit Service |
646995 |
rec->tpgt = atoi(tpgt);
|
|
Packit Service |
646995 |
rec->conn[0].port = atoi(port);
|
|
Packit Service |
646995 |
strlcpy(rec->conn[0].address, address, NI_MAXHOST);
|
|
Packit Service |
646995 |
strlcpy(rec->iface.name, iface_id, ISCSI_MAX_IFACE_LEN);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (idbm_delete_node(rec))
|
|
Packit Service |
646995 |
log_error("Could not delete node %s/%s/%s,%s/%s",
|
|
Packit Service |
646995 |
NODE_CONFIG_DIR, target, address, port,
|
|
Packit Service |
646995 |
iface_id);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
closedir(disc_dirfd);
|
|
Packit Service |
646995 |
free_rec:
|
|
Packit Service |
646995 |
free(rec);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_delete_discovery(discovery_rec_t *drec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
char *portal;
|
|
Packit Service |
646995 |
struct stat statb;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
portal = calloc(1, PATH_MAX);
|
|
Packit Service |
646995 |
if (!portal)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s,%d",
|
|
Packit Service |
646995 |
disc_type_to_config_vals[drec->type].config_root,
|
|
Packit Service |
646995 |
drec->address, drec->port);
|
|
Packit Service |
646995 |
log_debug(5, "Removing config file %s", portal);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (stat(portal, &statb)) {
|
|
Packit Service |
646995 |
log_debug(5, "Could not stat %s to delete disc err %d",
|
|
Packit Service |
646995 |
portal, errno);
|
|
Packit Service |
646995 |
goto free_portal;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (S_ISDIR(statb.st_mode)) {
|
|
Packit Service |
646995 |
strlcat(portal, "/", PATH_MAX);
|
|
Packit Service |
646995 |
strlcat(portal,
|
|
Packit Service |
646995 |
disc_type_to_config_vals[drec->type].config_name,
|
|
Packit Service |
646995 |
PATH_MAX);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (unlink(portal))
|
|
Packit Service |
646995 |
log_debug(5, "Could not remove %s err %d", portal, errno);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(portal, 0, PATH_MAX);
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s,%d",
|
|
Packit Service |
646995 |
disc_type_to_config_vals[drec->type].config_root,
|
|
Packit Service |
646995 |
drec->address, drec->port);
|
|
Packit Service |
646995 |
idbm_rm_disc_node_links(portal);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* rm portal dir */
|
|
Packit Service |
646995 |
if (S_ISDIR(statb.st_mode)) {
|
|
Packit Service |
646995 |
memset(portal, 0, PATH_MAX);
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s,%d",
|
|
Packit Service |
646995 |
disc_type_to_config_vals[drec->type].config_root,
|
|
Packit Service |
646995 |
drec->address, drec->port);
|
|
Packit Service |
646995 |
rmdir(portal);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
free_portal:
|
|
Packit Service |
646995 |
free(portal);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Backwards Compat or SLP:
|
|
Packit Service |
646995 |
* if there is no link then this is pre svn 780 version where
|
|
Packit Service |
646995 |
* we did not link the disc source and node
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static int idbm_remove_disc_to_node_link(node_rec_t *rec,
|
|
Packit Service |
646995 |
char *portal)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
struct stat statb;
|
|
Packit Service |
646995 |
node_rec_t *tmprec;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
tmprec = malloc(sizeof(*tmprec));
|
|
Packit Service |
646995 |
if (!tmprec)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(portal, 0, PATH_MAX);
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt,
|
|
Packit Service |
646995 |
rec->iface.name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = __idbm_rec_read(tmprec, portal, false);
|
|
Packit Service |
646995 |
if (rc) {
|
|
Packit Service |
646995 |
/* old style recs will not have tpgt or a link so skip */
|
|
Packit Service |
646995 |
rc = 0;
|
|
Packit Service |
646995 |
goto done;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(7, "found drec %s %d",
|
|
Packit Service |
646995 |
tmprec->disc_address, tmprec->disc_port);
|
|
Packit Service |
646995 |
/* rm link from discovery source to node */
|
|
Packit Service |
646995 |
memset(portal, 0, PATH_MAX);
|
|
Packit Service |
646995 |
rc = setup_disc_to_node_link(portal, tmprec);
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto done;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_lock();
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto done;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!stat(portal, &statb)) {
|
|
Packit Service |
646995 |
if (unlink(portal)) {
|
|
Packit Service |
646995 |
log_error("Could not remove link %s: %s",
|
|
Packit Service |
646995 |
portal, strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
} else
|
|
Packit Service |
646995 |
log_debug(7, "rmd %s", portal);
|
|
Packit Service |
646995 |
} else
|
|
Packit Service |
646995 |
log_debug(7, "Could not stat %s", portal);
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
done:
|
|
Packit Service |
646995 |
free(tmprec);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int st_disc_filter(const struct dirent *dir)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
return strcmp(dir->d_name, ".") && strcmp(dir->d_name, "..") &&
|
|
Packit Service |
646995 |
strcmp(dir->d_name, ST_CONFIG_NAME);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_delete_node(node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct stat statb;
|
|
Packit Service |
646995 |
char *portal;
|
|
Packit Service |
646995 |
int rc = 0, dir_rm_rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
portal = calloc(1, PATH_MAX);
|
|
Packit Service |
646995 |
if (!portal)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_remove_disc_to_node_link(rec, portal);
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto free_portal;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(portal, 0, PATH_MAX);
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
rec->name, rec->conn[0].address, rec->conn[0].port);
|
|
Packit Service |
646995 |
log_debug(5, "Removing config file %s iface id %s",
|
|
Packit Service |
646995 |
portal, rec->iface.name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_lock();
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto free_portal;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!stat(portal, &statb))
|
|
Packit Service |
646995 |
goto rm_conf;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
rec->name, rec->conn[0].address, rec->conn[0].port,
|
|
Packit Service |
646995 |
rec->tpgt, rec->iface.name);
|
|
Packit Service |
646995 |
log_debug(5, "Removing config file %s", portal);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!stat(portal, &statb))
|
|
Packit Service |
646995 |
goto rm_conf;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_error("Could not stat %s to delete node: %s",
|
|
Packit Service |
646995 |
portal, strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
goto unlock;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rm_conf:
|
|
Packit Service |
646995 |
if (unlink(portal)) {
|
|
Packit Service |
646995 |
log_error("Could not remove %s: %s", portal, strerror(errno));
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
goto unlock;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(portal, 0, PATH_MAX);
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
rec->name, rec->conn[0].address, rec->conn[0].port,
|
|
Packit Service |
646995 |
rec->tpgt);
|
|
Packit Service |
646995 |
if (!stat(portal, &statb)) {
|
|
Packit Service |
646995 |
struct dirent **namelist;
|
|
Packit Service |
646995 |
int n, i;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(portal, 0, PATH_MAX);
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d", NODE_CONFIG_DIR,
|
|
Packit Service |
646995 |
rec->name, rec->conn[0].address, rec->conn[0].port,
|
|
Packit Service |
646995 |
rec->tpgt);
|
|
Packit Service |
646995 |
n = scandir(portal, &namelist, st_disc_filter, alphasort);
|
|
Packit Service |
646995 |
if (n < 0)
|
|
Packit Service |
646995 |
goto free_portal;
|
|
Packit Service |
646995 |
if (n == 0)
|
|
Packit Service |
646995 |
dir_rm_rc = rmdir(portal);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
for (i = 0; i < n; i++)
|
|
Packit Service |
646995 |
free(namelist[i]);
|
|
Packit Service |
646995 |
free(namelist);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
/* rm target dir */
|
|
Packit Service |
646995 |
if (!dir_rm_rc) {
|
|
Packit Service |
646995 |
memset(portal, 0, PATH_MAX);
|
|
Packit Service |
646995 |
snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name);
|
|
Packit Service |
646995 |
rmdir(portal);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
unlock:
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
free_portal:
|
|
Packit Service |
646995 |
free(portal);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void
|
|
Packit Service |
646995 |
idbm_sendtargets_defaults(struct iscsi_sendtargets_config *cfg)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
idbm_sync_config();
|
|
Packit Service |
646995 |
memcpy(cfg, &db->drec_st.u.sendtargets,
|
|
Packit Service |
646995 |
sizeof(struct iscsi_sendtargets_config));
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void
|
|
Packit Service |
646995 |
idbm_isns_defaults(struct iscsi_isns_config *cfg)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
idbm_sync_config();
|
|
Packit Service |
646995 |
memcpy(cfg, &db->drec_isns.u.isns,
|
|
Packit Service |
646995 |
sizeof(struct iscsi_isns_config));
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void
|
|
Packit Service |
646995 |
idbm_slp_defaults(struct iscsi_slp_config *cfg)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
memcpy(cfg, &db->drec_slp.u.slp,
|
|
Packit Service |
646995 |
sizeof(struct iscsi_slp_config));
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int
|
|
Packit Service |
646995 |
idbm_session_autoscan(struct iscsi_session *session)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (session)
|
|
Packit Service |
646995 |
return session->nrec.session.scan;
|
|
Packit Service |
646995 |
return db->nrec.session.scan;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
struct user_param *idbm_alloc_user_param(char *name, char *value)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct user_param *param;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
param = calloc(1, sizeof(*param));
|
|
Packit Service |
646995 |
if (!param)
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
INIT_LIST_HEAD(¶m->list);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
param->name = strdup(name);
|
|
Packit Service |
646995 |
if (!param->name)
|
|
Packit Service |
646995 |
goto free_param;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
param->value = strdup(value);
|
|
Packit Service |
646995 |
if (!param->value)
|
|
Packit Service |
646995 |
goto free_name;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return param;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
free_name:
|
|
Packit Service |
646995 |
free(param->name);
|
|
Packit Service |
646995 |
free_param:
|
|
Packit Service |
646995 |
free(param);
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_node_set_rec_from_param(struct list_head *params, node_rec_t *rec,
|
|
Packit Service |
646995 |
int verify)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct user_param *param;
|
|
Packit Service |
646995 |
recinfo_t *info;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (list_empty(params))
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
info = idbm_recinfo_alloc(MAX_KEYS);
|
|
Packit Service |
646995 |
if (!info)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_recinfo_node(rec, info);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (verify) {
|
|
Packit Service |
646995 |
list_for_each_entry(param, params, list) {
|
|
Packit Service |
646995 |
rc = idbm_verify_param(info, param->name);
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto free_info;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
list_for_each_entry(param, params, list) {
|
|
Packit Service |
646995 |
rc = idbm_rec_update_param(info, param->name, param->value, 0);
|
|
Packit Service |
646995 |
if (rc) {
|
|
Packit Service |
646995 |
if (rc == ISCSI_ERR_INVAL)
|
|
Packit Service |
646995 |
log_error("Unknown parameter %s.", param->name);
|
|
Packit Service |
646995 |
goto free_info;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
free_info:
|
|
Packit Service |
646995 |
free(info);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_node_set_param(void *data, node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_node_set_rec_from_param(data, rec, 1);
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return idbm_rec_write(rec, true);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_discovery_set_param(void *data, discovery_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct list_head *params = data;
|
|
Packit Service |
646995 |
struct user_param *param;
|
|
Packit Service |
646995 |
recinfo_t *info;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
info = idbm_recinfo_alloc(MAX_KEYS);
|
|
Packit Service |
646995 |
if (!info)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_recinfo_discovery((discovery_rec_t *)rec, info);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
list_for_each_entry(param, params, list) {
|
|
Packit Service |
646995 |
rc = idbm_verify_param(info, param->name);
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto free_info;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
list_for_each_entry(param, params, list) {
|
|
Packit Service |
646995 |
rc = idbm_rec_update_param(info, param->name, param->value, 0);
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto free_info;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_discovery_write((discovery_rec_t *)rec);
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto free_info;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
free_info:
|
|
Packit Service |
646995 |
free(info);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int idbm_init(idbm_get_config_file_fn *fn)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
/* make sure root db dir is there */
|
|
Packit Service |
646995 |
if (access(ISCSI_CONFIG_ROOT, F_OK) != 0) {
|
|
Packit Service |
646995 |
if (mkdir(ISCSI_CONFIG_ROOT, 0660) != 0) {
|
|
Packit Service |
646995 |
log_error("Could not make %s %d", ISCSI_CONFIG_ROOT,
|
|
Packit Service |
646995 |
errno);
|
|
Packit Service |
646995 |
return errno;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
db = malloc(sizeof(idbm_t));
|
|
Packit Service |
646995 |
if (!db) {
|
|
Packit Service |
646995 |
log_error("out of memory on idbm allocation");
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
memset(db, 0, sizeof(idbm_t));
|
|
Packit Service |
646995 |
db->get_config_file = fn;
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void idbm_terminate(void)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (db)
|
|
Packit Service |
646995 |
free(db);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* idbm_create_rec - allocate and setup a node record
|
|
Packit Service |
646995 |
* @targetname: target name
|
|
Packit Service |
646995 |
* @tgpt: target portal group
|
|
Packit Service |
646995 |
* @ip: ip address of portal
|
|
Packit Service |
646995 |
* @port: port of portal
|
|
Packit Service |
646995 |
* @iface: iscsi iface info
|
|
Packit Service |
646995 |
* @verbose: flag indicating whether to log ifaces setup errors
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* The iface only needs to have the name set. This function will
|
|
Packit Service |
646995 |
* read in the other values.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
struct node_rec *idbm_create_rec(char *targetname, int tpgt, char *ip,
|
|
Packit Service |
646995 |
int port, struct iface_rec *iface,
|
|
Packit Service |
646995 |
int verbose)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct node_rec *rec;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rec = calloc(1, sizeof(*rec));
|
|
Packit Service |
646995 |
if (!rec) {
|
|
Packit Service |
646995 |
log_error("Could not not allocate memory to create node "
|
|
Packit Service |
646995 |
"record.");
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_node_setup_defaults(rec);
|
|
Packit Service |
646995 |
if (targetname)
|
|
Packit Service |
646995 |
strlcpy(rec->name, targetname, TARGET_NAME_MAXLEN);
|
|
Packit Service |
646995 |
rec->tpgt = tpgt;
|
|
Packit Service |
646995 |
rec->conn[0].port = port;
|
|
Packit Service |
646995 |
if (ip)
|
|
Packit Service |
646995 |
strlcpy(rec->conn[0].address, ip, NI_MAXHOST);
|
|
Packit Service |
646995 |
memset(&rec->iface, 0, sizeof(struct iface_rec));
|
|
Packit Service |
646995 |
if (iface) {
|
|
Packit Service |
646995 |
iface_copy(&rec->iface, iface);
|
|
Packit Service |
646995 |
if (strlen(iface->name)) {
|
|
Packit Service |
646995 |
if (iface_conf_read(&rec->iface)) {
|
|
Packit Service |
646995 |
if (verbose)
|
|
Packit Service |
646995 |
log_error("Could not read iface info "
|
|
Packit Service |
646995 |
"for %s.", iface->name);
|
|
Packit Service |
646995 |
goto free_rec;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return rec;
|
|
Packit Service |
646995 |
free_rec:
|
|
Packit Service |
646995 |
free(rec);
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
struct node_rec *idbm_create_rec_from_boot_context(struct boot_context *context)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct node_rec *rec;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* tpgt hard coded to 1 ??? */
|
|
Packit Service |
646995 |
rec = idbm_create_rec(context->targetname, 1,
|
|
Packit Service |
646995 |
context->target_ipaddr, context->target_port,
|
|
Packit Service |
646995 |
NULL, 1);
|
|
Packit Service |
646995 |
if (!rec) {
|
|
Packit Service |
646995 |
log_error("Could not setup rec for fw discovery login.");
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_setup_defaults(&rec->iface);
|
|
Packit Service |
646995 |
strlcpy(rec->session.auth.username, context->chap_name,
|
|
Packit Service |
646995 |
sizeof(context->chap_name));
|
|
Packit Service |
646995 |
strlcpy((char *)rec->session.auth.password, context->chap_password,
|
|
Packit Service |
646995 |
sizeof(context->chap_password));
|
|
Packit Service |
646995 |
strlcpy(rec->session.auth.username_in, context->chap_name_in,
|
|
Packit Service |
646995 |
sizeof(context->chap_name_in));
|
|
Packit Service |
646995 |
strlcpy((char *)rec->session.auth.password_in,
|
|
Packit Service |
646995 |
context->chap_password_in,
|
|
Packit Service |
646995 |
sizeof(context->chap_password_in));
|
|
Packit Service |
646995 |
rec->session.auth.password_length =
|
|
Packit Service |
646995 |
strlen((char *)context->chap_password);
|
|
Packit Service |
646995 |
rec->session.auth.password_in_length =
|
|
Packit Service |
646995 |
strlen((char *)context->chap_password_in);
|
|
Packit Service |
646995 |
strlcpy(rec->session.boot_root, context->boot_root,
|
|
Packit Service |
646995 |
sizeof(context->boot_root));
|
|
Packit Service |
646995 |
strlcpy(rec->session.boot_nic, context->boot_nic,
|
|
Packit Service |
646995 |
sizeof(context->boot_nic));
|
|
Packit Service |
646995 |
strlcpy(rec->session.boot_target, context->boot_target,
|
|
Packit Service |
646995 |
sizeof(context->boot_target));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_setup_from_boot_context(&rec->iface, context);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return rec;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void idbm_node_setup_defaults(node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int i;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(rec, 0, sizeof(node_rec_t));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
INIT_LIST_HEAD(&rec->list);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rec->tpgt = PORTAL_GROUP_TAG_UNKNOWN;
|
|
Packit Service |
646995 |
rec->disc_type = DISCOVERY_TYPE_STATIC;
|
|
Packit Service |
646995 |
rec->leading_login = 0;
|
|
Packit Service |
646995 |
rec->session.cmds_max = CMDS_MAX;
|
|
Packit Service |
646995 |
rec->session.xmit_thread_priority = XMIT_THREAD_PRIORITY;
|
|
Packit Service |
646995 |
rec->session.initial_cmdsn = 0;
|
|
Packit Service |
646995 |
rec->session.queue_depth = QUEUE_DEPTH;
|
|
Packit Service |
646995 |
rec->session.nr_sessions = 1;
|
|
Packit Service |
646995 |
rec->session.initial_login_retry_max = DEF_INITIAL_LOGIN_RETRIES_MAX;
|
|
Packit Service |
646995 |
rec->session.reopen_max = DEF_SESSION_REOPEN_MAX;
|
|
Packit Service |
646995 |
rec->session.auth.authmethod = 0;
|
|
Packit Service |
646995 |
/* TYPE_INT_LIST fields should be initialized to ~0 to indicate unset values */
|
|
Packit Service |
646995 |
memset(rec->session.auth.chap_algs, ~0, sizeof(rec->session.auth.chap_algs));
|
|
Packit Service |
646995 |
rec->session.auth.chap_algs[0] = AUTH_CHAP_ALG_MD5;
|
|
Packit Service |
646995 |
rec->session.auth.password_length = 0;
|
|
Packit Service |
646995 |
rec->session.auth.password_in_length = 0;
|
|
Packit Service |
646995 |
rec->session.err_timeo.abort_timeout = DEF_ABORT_TIMEO;
|
|
Packit Service |
646995 |
rec->session.err_timeo.lu_reset_timeout = DEF_LU_RESET_TIMEO;
|
|
Packit Service |
646995 |
rec->session.err_timeo.tgt_reset_timeout = DEF_TGT_RESET_TIMEO;
|
|
Packit Service |
646995 |
rec->session.err_timeo.host_reset_timeout = DEF_HOST_RESET_TIMEO;
|
|
Packit Service |
646995 |
rec->session.timeo.replacement_timeout = DEF_REPLACEMENT_TIMEO;
|
|
Packit Service |
646995 |
rec->session.info = NULL;
|
|
Packit Service |
646995 |
rec->session.sid = 0;
|
|
Packit Service |
646995 |
rec->session.multiple = 0;
|
|
Packit Service |
646995 |
rec->session.scan = DEF_INITIAL_SCAN;
|
|
Packit Service |
646995 |
idbm_setup_session_defaults(&rec->session.iscsi);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
for (i=0; i
|
|
Packit Service |
646995 |
rec->conn[i].startup = ISCSI_STARTUP_MANUAL;
|
|
Packit Service |
646995 |
rec->conn[i].port = ISCSI_LISTEN_PORT;
|
|
Packit Service |
646995 |
rec->conn[i].tcp.window_size = TCP_WINDOW_SIZE;
|
|
Packit Service |
646995 |
rec->conn[i].tcp.type_of_service = 0;
|
|
Packit Service |
646995 |
rec->conn[i].timeo.login_timeout= DEF_LOGIN_TIMEO;
|
|
Packit Service |
646995 |
rec->conn[i].timeo.logout_timeout= DEF_LOGOUT_TIMEO;
|
|
Packit Service |
646995 |
rec->conn[i].timeo.auth_timeout = 45;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rec->conn[i].timeo.noop_out_interval = DEF_NOOP_OUT_INTERVAL;
|
|
Packit Service |
646995 |
rec->conn[i].timeo.noop_out_timeout = DEF_NOOP_OUT_TIMEO;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_setup_conn_defaults(&rec->conn[i].iscsi);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_setup_defaults(&rec->iface);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
struct node_rec *
|
|
Packit Service |
646995 |
idbm_find_rec_in_list(struct list_head *rec_list, char *targetname, char *addr,
|
|
Packit Service |
646995 |
int port, struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct node_rec *rec;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
list_for_each_entry(rec, rec_list, list) {
|
|
Packit Service |
646995 |
if (__iscsi_match_session(rec, targetname, addr, port, iface,
|
|
Packit Service |
646995 |
MATCH_ANY_SID))
|
|
Packit Service |
646995 |
return rec;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
}
|