|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* iSCSI iface helpers
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Copyright (C) 2008 Mike Christie
|
|
Packit Service |
646995 |
* Copyright (C) 2008 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 |
#include <stdio.h>
|
|
Packit Service |
646995 |
#include <stdlib.h>
|
|
Packit Service |
646995 |
#include <limits.h>
|
|
Packit Service |
646995 |
#include <dirent.h>
|
|
Packit Service |
646995 |
#include <errno.h>
|
|
Packit Service |
646995 |
#include <string.h>
|
|
Packit Service |
646995 |
#include <unistd.h>
|
|
Packit Service |
646995 |
#include <sys/types.h>
|
|
Packit Service |
646995 |
#include <sys/stat.h>
|
|
Packit Service |
646995 |
#include <arpa/inet.h>
|
|
Packit Service |
646995 |
#include <libopeniscsiusr/libopeniscsiusr.h>
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#include "log.h"
|
|
Packit Service |
646995 |
#include "list.h"
|
|
Packit Service |
646995 |
#include "iscsi_sysfs.h"
|
|
Packit Service |
646995 |
#include "iscsi_settings.h"
|
|
Packit Service |
646995 |
#include "config.h"
|
|
Packit Service |
646995 |
#include "transport.h"
|
|
Packit Service |
646995 |
#include "idbm.h"
|
|
Packit Service |
646995 |
#include "iface.h"
|
|
Packit Service |
646995 |
#include "session_info.h"
|
|
Packit Service |
646995 |
#include "host.h"
|
|
Packit Service |
646995 |
#include "fw_context.h"
|
|
Packit Service |
646995 |
#include "sysdeps.h"
|
|
Packit Service |
646995 |
#include "iscsi_err.h"
|
|
Packit Service |
646995 |
#include "iscsi_netlink.h"
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define _unwrap(x) (x && strlen(x)) ? x : UNKNOWN_VALUE
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Default ifaces for use with transports that do not bind to hardware
|
|
Packit Service |
646995 |
* by defaults (transports that let the interconnect layer to the routing
|
|
Packit Service |
646995 |
* by defaults).
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* iSCSI over TCP/IP
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static struct iface_rec iface_default = {
|
|
Packit Service |
646995 |
.name = "default",
|
|
Packit Service |
646995 |
.transport_name = "tcp",
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* iSER
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static struct iface_rec iface_iser = {
|
|
Packit Service |
646995 |
.name = "iser",
|
|
Packit Service |
646995 |
.transport_name = "iser",
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static struct iface_rec *default_ifaces[] = {
|
|
Packit Service |
646995 |
&iface_default,
|
|
Packit Service |
646995 |
&iface_iser,
|
|
Packit Service |
646995 |
NULL,
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static struct iface_rec *iface_match_default(struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct iface_rec *def_iface;
|
|
Packit Service |
646995 |
int i = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
while ((def_iface = default_ifaces[i++])) {
|
|
Packit Service |
646995 |
if (!strcmp(iface->name, def_iface->name))
|
|
Packit Service |
646995 |
return def_iface;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static void iface_init(struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (!strlen(iface->name))
|
|
Packit Service |
646995 |
sprintf(iface->name, DEFAULT_IFACENAME);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* default is to use tcp through whatever the network layer
|
|
Packit Service |
646995 |
* selects for us with the /etc/iscsi/initiatorname.iscsi iname.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
void iface_setup_defaults(struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
sprintf(iface->transport_name, DEFAULT_TRANSPORT);
|
|
Packit Service |
646995 |
iface_init(iface);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
struct iface_rec *iface_alloc(char *ifname, int *err)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct iface_rec *iface;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strlen(ifname) || strlen(ifname) + 1 > ISCSI_MAX_IFACE_LEN) {
|
|
Packit Service |
646995 |
*err = ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface = calloc(1, sizeof(*iface));
|
|
Packit Service |
646995 |
if (!iface) {
|
|
Packit Service |
646995 |
*err = ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
strlcpy(iface->name, ifname, ISCSI_MAX_IFACE_LEN);
|
|
Packit Service |
646995 |
INIT_LIST_HEAD(&iface->list);
|
|
Packit Service |
646995 |
return iface;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int __iface_conf_read(struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
char *iface_conf;
|
|
Packit Service |
646995 |
recinfo_t *info;
|
|
Packit Service |
646995 |
FILE *f;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_conf = calloc(1, PATH_MAX);
|
|
Packit Service |
646995 |
if (!iface_conf)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
info = idbm_recinfo_alloc(MAX_KEYS);
|
|
Packit Service |
646995 |
if (!info) {
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
goto free_conf;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(iface_conf, PATH_MAX, "%s/%s", IFACE_CONFIG_DIR,
|
|
Packit Service |
646995 |
iface->name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(5, "looking for iface conf %s", iface_conf);
|
|
Packit Service |
646995 |
f = fopen(iface_conf, "r");
|
|
Packit Service |
646995 |
if (!f) {
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* if someone passes in default but has not defined
|
|
Packit Service |
646995 |
* an iface with default then we do it for them
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (!strcmp(iface->name, DEFAULT_IFACENAME)) {
|
|
Packit Service |
646995 |
iface_setup_defaults(iface);
|
|
Packit Service |
646995 |
rc = 0;
|
|
Packit Service |
646995 |
} else
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
goto free_info;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_init(iface);
|
|
Packit Service |
646995 |
idbm_recinfo_iface(iface, info);
|
|
Packit Service |
646995 |
idbm_recinfo_config(info, f);
|
|
Packit Service |
646995 |
fclose(f);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
free_info:
|
|
Packit Service |
646995 |
free(info);
|
|
Packit Service |
646995 |
free_conf:
|
|
Packit Service |
646995 |
free(iface_conf);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int iface_conf_read(struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct iface_rec *def_iface;
|
|
Packit Service |
646995 |
int rc, retry = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
def_iface = iface_match_default(iface);
|
|
Packit Service |
646995 |
if (def_iface) {
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* older tools allowed default to have different
|
|
Packit Service |
646995 |
* transport_names so we do not want to overwrite
|
|
Packit Service |
646995 |
* it.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (!strcmp(def_iface->name, DEFAULT_IFACENAME)) {
|
|
Packit Service |
646995 |
if (!strlen(iface->name))
|
|
Packit Service |
646995 |
strcpy(iface->name, def_iface->name);
|
|
Packit Service |
646995 |
if (!strlen(iface->netdev))
|
|
Packit Service |
646995 |
strcpy(iface->netdev, def_iface->netdev);
|
|
Packit Service |
646995 |
if (!strlen(iface->hwaddress))
|
|
Packit Service |
646995 |
strcpy(iface->hwaddress, def_iface->hwaddress);
|
|
Packit Service |
646995 |
if (!strlen(iface->transport_name))
|
|
Packit Service |
646995 |
strcpy(iface->transport_name,
|
|
Packit Service |
646995 |
def_iface->transport_name);
|
|
Packit Service |
646995 |
if (!strlen(iface->iname))
|
|
Packit Service |
646995 |
strcpy(iface->iname, def_iface->iname);
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
iface_init(iface);
|
|
Packit Service |
646995 |
iface_copy(iface, def_iface);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
retry_read:
|
|
Packit Service |
646995 |
rc = idbm_lock();
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = __iface_conf_read(iface);
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* cmd was run before running -m iface, so force def bindings
|
|
Packit Service |
646995 |
* creation to see if that was the one requested
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (retry < 1 && rc == ISCSI_ERR_IDBM) {
|
|
Packit Service |
646995 |
iface_setup_host_bindings();
|
|
Packit Service |
646995 |
retry++;
|
|
Packit Service |
646995 |
goto retry_read;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int iface_conf_delete(struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct iface_rec *def_iface;
|
|
Packit Service |
646995 |
char *iface_conf;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
def_iface = iface_match_default(iface);
|
|
Packit Service |
646995 |
if (def_iface) {
|
|
Packit Service |
646995 |
log_error("iface %s is a special interface and "
|
|
Packit Service |
646995 |
"cannot be deleted.", iface->name);
|
|
Packit Service |
646995 |
return ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_conf = calloc(1, PATH_MAX);
|
|
Packit Service |
646995 |
if (!iface_conf)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
sprintf(iface_conf, "%s/%s", IFACE_CONFIG_DIR, iface->name);
|
|
Packit Service |
646995 |
rc = idbm_lock();
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto free_conf;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (unlink(iface_conf))
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
free_conf:
|
|
Packit Service |
646995 |
free(iface_conf);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int iface_conf_write(struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct iface_rec *def_iface;
|
|
Packit Service |
646995 |
char *iface_conf;
|
|
Packit Service |
646995 |
FILE *f;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
def_iface = iface_match_default(iface);
|
|
Packit Service |
646995 |
if (def_iface) {
|
|
Packit Service |
646995 |
log_error("iface %s is a special interface and "
|
|
Packit Service |
646995 |
"is not stored in %s.", iface->name,
|
|
Packit Service |
646995 |
IFACE_CONFIG_DIR);
|
|
Packit Service |
646995 |
return ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_conf = calloc(1, PATH_MAX);
|
|
Packit Service |
646995 |
if (!iface_conf)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
sprintf(iface_conf, "%s/%s", IFACE_CONFIG_DIR, iface->name);
|
|
Packit Service |
646995 |
f = fopen(iface_conf, "w");
|
|
Packit Service |
646995 |
if (!f) {
|
|
Packit Service |
646995 |
rc = ISCSI_ERR_IDBM;
|
|
Packit Service |
646995 |
goto free_conf;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = idbm_lock();
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto close_f;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_print(IDBM_PRINT_TYPE_IFACE, iface, 1, f);
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
close_f:
|
|
Packit Service |
646995 |
fclose(f);
|
|
Packit Service |
646995 |
free_conf:
|
|
Packit Service |
646995 |
free(iface_conf);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int iface_conf_update(struct list_head *params, struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct iface_rec *def_iface;
|
|
Packit Service |
646995 |
recinfo_t *info;
|
|
Packit Service |
646995 |
struct user_param *param;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
def_iface = iface_match_default(iface);
|
|
Packit Service |
646995 |
if (def_iface) {
|
|
Packit Service |
646995 |
log_error("iface %s is a special interface and "
|
|
Packit Service |
646995 |
"cannot be modified.", iface->name);
|
|
Packit Service |
646995 |
return ISCSI_ERR_INVAL;
|
|
Packit Service |
646995 |
}
|
|
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_iface(iface, 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 = iface_conf_write(iface);
|
|
Packit Service |
646995 |
free_info:
|
|
Packit Service |
646995 |
free(info);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#if 0 /* Unused */
|
|
Packit Service |
646995 |
static int iface_get_next_id(void)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct stat statb;
|
|
Packit Service |
646995 |
char *iface_conf;
|
|
Packit Service |
646995 |
int i, rc = ENOSPC;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_conf = calloc(1, PATH_MAX);
|
|
Packit Service |
646995 |
if (!iface_conf)
|
|
Packit Service |
646995 |
return ENOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
for (i = 0; i < INT_MAX; i++) {
|
|
Packit Service |
646995 |
memset(iface_conf, 0, PATH_MAX);
|
|
Packit Service |
646995 |
/* check len */
|
|
Packit Service |
646995 |
snprintf(iface_conf, PATH_MAX, "iface%d", i);
|
|
Packit Service |
646995 |
if (strlen(iface_conf) > ISCSI_MAX_IFACE_LEN - 1) {
|
|
Packit Service |
646995 |
log_error("iface namespace is full. Remove unused "
|
|
Packit Service |
646995 |
"iface definitions from %s or send mail "
|
|
Packit Service |
646995 |
"to open-iscsi@googlegroups.com to report "
|
|
Packit Service |
646995 |
"the problem", IFACE_CONFIG_DIR);
|
|
Packit Service |
646995 |
rc = ENOSPC;
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
memset(iface_conf, 0, PATH_MAX);
|
|
Packit Service |
646995 |
snprintf(iface_conf, PATH_MAX, "%s/iface%d", IFACE_CONFIG_DIR,
|
|
Packit Service |
646995 |
i);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!stat(iface_conf, &statb))
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
if (errno == ENOENT) {
|
|
Packit Service |
646995 |
rc = i;
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
free(iface_conf);
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
#endif /* Unused */
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
struct iface_search {
|
|
Packit Service |
646995 |
struct iface_rec *pattern;
|
|
Packit Service |
646995 |
struct iface_rec *found;
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int __iface_get_by_net_binding(void *data, struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct iface_search *search = data;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strcmp(search->pattern->name, iface->name)) {
|
|
Packit Service |
646995 |
iface_copy(search->found, iface);
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface_is_bound_by_hwaddr(search->pattern)) {
|
|
Packit Service |
646995 |
if (!strcasecmp(iface->hwaddress,
|
|
Packit Service |
646995 |
search->pattern->hwaddress)) {
|
|
Packit Service |
646995 |
iface_copy(search->found, iface);
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
} else
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface_is_bound_by_netdev(search->pattern)) {
|
|
Packit Service |
646995 |
if (!strcmp(iface->netdev, search->pattern->netdev)) {
|
|
Packit Service |
646995 |
iface_copy(search->found, iface);
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
} else
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
if (iface_is_bound_by_ipaddr(search->pattern)) {
|
|
Packit Service |
646995 |
if (!strcmp(iface->ipaddress, search->pattern->ipaddress)) {
|
|
Packit Service |
646995 |
iface_copy(search->found, iface);
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
} else
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Before 2.0.870, we only could bind by netdeivce or hwaddress,
|
|
Packit Service |
646995 |
* so we did a simple reverse lookup to go from sysfs info to
|
|
Packit Service |
646995 |
* the iface name. After 2.0.870 we added a lot of options to the
|
|
Packit Service |
646995 |
* iface binding so we added the ifacename to the kernel.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* This function is for older kernels that do not export the ifacename.
|
|
Packit Service |
646995 |
* If the user was doing iscsi_tcp session binding we will find
|
|
Packit Service |
646995 |
* the iface by matching net info.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
int iface_get_by_net_binding(struct iface_rec *pattern,
|
|
Packit Service |
646995 |
struct iface_rec *out_rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int num_found = 0, rc;
|
|
Packit Service |
646995 |
struct iface_search search;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!iface_is_bound_by_hwaddr(pattern) &&
|
|
Packit Service |
646995 |
!iface_is_bound_by_netdev(pattern)) {
|
|
Packit Service |
646995 |
sprintf(out_rec->name, DEFAULT_IFACENAME);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
search.pattern = pattern;
|
|
Packit Service |
646995 |
search.found = out_rec;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = iface_for_each_iface(&search, 0, &num_found,
|
|
Packit Service |
646995 |
__iface_get_by_net_binding);
|
|
Packit Service |
646995 |
if (rc == 1)
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
return ISCSI_ERR_NO_OBJS_FOUND;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int iface_get_iptype(struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
/* address might not be set if user config with another tool */
|
|
Packit Service |
646995 |
if (!strlen(iface->ipaddress) ||
|
|
Packit Service |
646995 |
!strcmp(UNKNOWN_VALUE, iface->ipaddress)) {
|
|
Packit Service |
646995 |
/* try to figure out by name */
|
|
Packit Service |
646995 |
if (strstr(iface->name, "ipv4"))
|
|
Packit Service |
646995 |
return ISCSI_IFACE_TYPE_IPV4;
|
|
Packit Service |
646995 |
else if (strstr(iface->name, "ipv6"))
|
|
Packit Service |
646995 |
return ISCSI_IFACE_TYPE_IPV6;
|
|
Packit Service |
646995 |
else /* assume ipv4 by default */
|
|
Packit Service |
646995 |
return ISCSI_IFACE_TYPE_IPV4;
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
if (strcmp(iface->bootproto, "dhcp") &&
|
|
Packit Service |
646995 |
!strstr(iface->ipaddress, "."))
|
|
Packit Service |
646995 |
return ISCSI_IFACE_TYPE_IPV6;
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
return ISCSI_IFACE_TYPE_IPV4;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int iface_setup_binding_from_kern_iface(void *data,
|
|
Packit Service |
646995 |
struct iface_rec *kern_iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct host_info *hinfo = data;
|
|
Packit Service |
646995 |
struct iface_rec iface;
|
|
Packit Service |
646995 |
char iface_path[PATH_MAX];
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strlen(hinfo->iface.hwaddress)) {
|
|
Packit Service |
646995 |
log_error("Invalid offload iSCSI host %u. Missing "
|
|
Packit Service |
646995 |
"hwaddress. Try upgrading %s driver.",
|
|
Packit Service |
646995 |
hinfo->host_no, hinfo->iface.transport_name);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(&iface, 0, sizeof(struct iface_rec));
|
|
Packit Service |
646995 |
if (kern_iface) {
|
|
Packit Service |
646995 |
memcpy(&iface, kern_iface, sizeof(iface));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
snprintf(iface.name, sizeof(iface.name), "%s.%s.%s.%u",
|
|
Packit Service |
646995 |
kern_iface->transport_name,
|
|
Packit Service |
646995 |
kern_iface->hwaddress,
|
|
Packit Service |
646995 |
iface_get_iptype(kern_iface) == ISCSI_IFACE_TYPE_IPV4 ?
|
|
Packit Service |
646995 |
"ipv4" : "ipv6", kern_iface->iface_num);
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
snprintf(iface.name, sizeof(iface.name), "%s.%s",
|
|
Packit Service |
646995 |
hinfo->iface.transport_name, hinfo->iface.hwaddress);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
strcpy(iface.hwaddress, hinfo->iface.hwaddress);
|
|
Packit Service |
646995 |
strcpy(iface.transport_name, hinfo->iface.transport_name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(iface_path, 0, sizeof(iface_path));
|
|
Packit Service |
646995 |
snprintf(iface_path, PATH_MAX, "%s/%s", IFACE_CONFIG_DIR,
|
|
Packit Service |
646995 |
iface.name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (access(iface_path, F_OK) != 0) {
|
|
Packit Service |
646995 |
/* not found so create it */
|
|
Packit Service |
646995 |
if (iface_conf_write(&iface)) {
|
|
Packit Service |
646995 |
log_error("Could not create default iface conf %s.",
|
|
Packit Service |
646995 |
iface.name);
|
|
Packit Service |
646995 |
/* fall through - will not be persistent */
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int __iface_setup_host_bindings(__attribute__((unused))void *data,
|
|
Packit Service |
646995 |
struct host_info *hinfo)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct iface_rec *def_iface;
|
|
Packit Service |
646995 |
struct iscsi_transport *t;
|
|
Packit Service |
646995 |
int i = 0, nr_found;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
t = iscsi_sysfs_get_transport_by_hba(hinfo->host_no);
|
|
Packit Service |
646995 |
if (!t)
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* do not setup binding for hosts using non offload drivers */
|
|
Packit Service |
646995 |
while ((def_iface = default_ifaces[i++])) {
|
|
Packit Service |
646995 |
if (!strcmp(t->name, def_iface->transport_name))
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
nr_found = 0;
|
|
Packit Service |
646995 |
iscsi_sysfs_for_each_iface_on_host(hinfo, hinfo->host_no,
|
|
Packit Service |
646995 |
&nr_found,
|
|
Packit Service |
646995 |
iface_setup_binding_from_kern_iface);
|
|
Packit Service |
646995 |
if (!nr_found)
|
|
Packit Service |
646995 |
iface_setup_binding_from_kern_iface(hinfo, NULL);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Create a default iface for offload cards. We assume that we will
|
|
Packit Service |
646995 |
* be able identify each host by MAC.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
void iface_setup_host_bindings(void)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int nr_found = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (idbm_lock())
|
|
Packit Service |
646995 |
return;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (access(IFACE_CONFIG_DIR, F_OK) != 0) {
|
|
Packit Service |
646995 |
if (mkdir(IFACE_CONFIG_DIR, 0660) != 0) {
|
|
Packit Service |
646995 |
log_error("Could not make %s. HW/OFFLOAD iscsi "
|
|
Packit Service |
646995 |
"may not be supported", IFACE_CONFIG_DIR);
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
return;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
transport_probe_for_offload();
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iscsi_sysfs_for_each_host(NULL, &nr_found,
|
|
Packit Service |
646995 |
__iface_setup_host_bindings))
|
|
Packit Service |
646995 |
log_error("Could not scan scsi hosts. HW/OFFLOAD iscsi "
|
|
Packit Service |
646995 |
"operations may not be supported, or please "
|
|
Packit Service |
646995 |
"see README for instructions on setting up ifaces.");
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void iface_copy(struct iface_rec *dst, struct iface_rec *src)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (strlen(src->name))
|
|
Packit Service |
646995 |
strcpy(dst->name, src->name);
|
|
Packit Service |
646995 |
if (src->iface_num)
|
|
Packit Service |
646995 |
dst->iface_num = src->iface_num;
|
|
Packit Service |
646995 |
if (strlen(src->netdev))
|
|
Packit Service |
646995 |
strcpy(dst->netdev, src->netdev);
|
|
Packit Service |
646995 |
if (strlen(src->ipaddress))
|
|
Packit Service |
646995 |
strcpy(dst->ipaddress, src->ipaddress);
|
|
Packit Service |
646995 |
if (strlen(src->subnet_mask))
|
|
Packit Service |
646995 |
strcpy(dst->subnet_mask, src->subnet_mask);
|
|
Packit Service |
646995 |
if (strlen(src->gateway))
|
|
Packit Service |
646995 |
strcpy(dst->gateway, src->gateway);
|
|
Packit Service |
646995 |
if (strlen(src->bootproto))
|
|
Packit Service |
646995 |
strcpy(dst->bootproto, src->bootproto);
|
|
Packit Service |
646995 |
if (strlen(src->ipv6_linklocal))
|
|
Packit Service |
646995 |
strcpy(dst->ipv6_linklocal, src->ipv6_linklocal);
|
|
Packit Service |
646995 |
if (strlen(src->ipv6_router))
|
|
Packit Service |
646995 |
strcpy(dst->ipv6_router, src->ipv6_router);
|
|
Packit Service |
646995 |
if (strlen(src->ipv6_autocfg))
|
|
Packit Service |
646995 |
strcpy(dst->ipv6_autocfg, src->ipv6_autocfg);
|
|
Packit Service |
646995 |
if (strlen(src->linklocal_autocfg))
|
|
Packit Service |
646995 |
strcpy(dst->linklocal_autocfg, src->linklocal_autocfg);
|
|
Packit Service |
646995 |
if (strlen(src->router_autocfg))
|
|
Packit Service |
646995 |
strcpy(dst->router_autocfg, src->router_autocfg);
|
|
Packit Service |
646995 |
if (src->vlan_id)
|
|
Packit Service |
646995 |
dst->vlan_id = src->vlan_id;
|
|
Packit Service |
646995 |
if (src->vlan_priority)
|
|
Packit Service |
646995 |
dst->vlan_priority = src->vlan_priority;
|
|
Packit Service |
646995 |
if (strlen(src->vlan_state))
|
|
Packit Service |
646995 |
strcpy(dst->vlan_state, src->vlan_state);
|
|
Packit Service |
646995 |
if (strlen(src->state))
|
|
Packit Service |
646995 |
strcpy(dst->state, src->state);
|
|
Packit Service |
646995 |
if (src->mtu)
|
|
Packit Service |
646995 |
dst->mtu = src->mtu;
|
|
Packit Service |
646995 |
if (src->port)
|
|
Packit Service |
646995 |
dst->port = src->port;
|
|
Packit Service |
646995 |
if (strlen(src->delayed_ack))
|
|
Packit Service |
646995 |
strcpy(dst->delayed_ack, src->delayed_ack);
|
|
Packit Service |
646995 |
if (strlen(src->nagle))
|
|
Packit Service |
646995 |
strcpy(dst->nagle, src->nagle);
|
|
Packit Service |
646995 |
if (strlen(src->tcp_wsf_state))
|
|
Packit Service |
646995 |
strcpy(dst->tcp_wsf_state, src->tcp_wsf_state);
|
|
Packit Service |
646995 |
if (src->tcp_wsf)
|
|
Packit Service |
646995 |
dst->tcp_wsf = src->tcp_wsf;
|
|
Packit Service |
646995 |
if (src->tcp_timer_scale)
|
|
Packit Service |
646995 |
dst->tcp_timer_scale = src->tcp_timer_scale;
|
|
Packit Service |
646995 |
if (strlen(src->tcp_timestamp))
|
|
Packit Service |
646995 |
strcpy(dst->tcp_timestamp, src->tcp_timestamp);
|
|
Packit Service |
646995 |
if (strlen(src->dhcp_dns))
|
|
Packit Service |
646995 |
strcpy(dst->dhcp_dns, src->dhcp_dns);
|
|
Packit Service |
646995 |
if (strlen(src->dhcp_slp_da))
|
|
Packit Service |
646995 |
strcpy(dst->dhcp_slp_da, src->dhcp_slp_da);
|
|
Packit Service |
646995 |
if (strlen(src->tos_state))
|
|
Packit Service |
646995 |
strcpy(dst->tos_state, src->tos_state);
|
|
Packit Service |
646995 |
if (src->tos)
|
|
Packit Service |
646995 |
dst->tos = src->tos;
|
|
Packit Service |
646995 |
if (strlen(src->gratuitous_arp))
|
|
Packit Service |
646995 |
strcpy(dst->gratuitous_arp, src->gratuitous_arp);
|
|
Packit Service |
646995 |
if (strlen(src->dhcp_alt_client_id_state))
|
|
Packit Service |
646995 |
strcpy(dst->dhcp_alt_client_id_state,
|
|
Packit Service |
646995 |
src->dhcp_alt_client_id_state);
|
|
Packit Service |
646995 |
if (strlen(src->dhcp_alt_client_id))
|
|
Packit Service |
646995 |
strcpy(dst->dhcp_alt_client_id, src->dhcp_alt_client_id);
|
|
Packit Service |
646995 |
if (strlen(src->dhcp_req_vendor_id_state))
|
|
Packit Service |
646995 |
strcpy(dst->dhcp_req_vendor_id_state,
|
|
Packit Service |
646995 |
src->dhcp_req_vendor_id_state);
|
|
Packit Service |
646995 |
if (strlen(src->dhcp_vendor_id_state))
|
|
Packit Service |
646995 |
strcpy(dst->dhcp_vendor_id_state, src->dhcp_vendor_id_state);
|
|
Packit Service |
646995 |
if (strlen(src->dhcp_vendor_id))
|
|
Packit Service |
646995 |
strcpy(dst->dhcp_vendor_id, src->dhcp_vendor_id);
|
|
Packit Service |
646995 |
if (strlen(src->dhcp_learn_iqn))
|
|
Packit Service |
646995 |
strcpy(dst->dhcp_learn_iqn, src->dhcp_learn_iqn);
|
|
Packit Service |
646995 |
if (strlen(src->fragmentation))
|
|
Packit Service |
646995 |
strcpy(dst->fragmentation, src->fragmentation);
|
|
Packit Service |
646995 |
if (strlen(src->incoming_forwarding))
|
|
Packit Service |
646995 |
strcpy(dst->incoming_forwarding, src->incoming_forwarding);
|
|
Packit Service |
646995 |
if (src->ttl)
|
|
Packit Service |
646995 |
dst->ttl = src->ttl;
|
|
Packit Service |
646995 |
if (strlen(src->gratuitous_neighbor_adv))
|
|
Packit Service |
646995 |
strcpy(dst->gratuitous_neighbor_adv,
|
|
Packit Service |
646995 |
src->gratuitous_neighbor_adv);
|
|
Packit Service |
646995 |
if (strlen(src->redirect))
|
|
Packit Service |
646995 |
strcpy(dst->redirect, src->redirect);
|
|
Packit Service |
646995 |
if (strlen(src->mld))
|
|
Packit Service |
646995 |
strcpy(dst->mld, src->mld);
|
|
Packit Service |
646995 |
if (src->flow_label)
|
|
Packit Service |
646995 |
dst->flow_label = src->flow_label;
|
|
Packit Service |
646995 |
if (src->traffic_class)
|
|
Packit Service |
646995 |
dst->traffic_class = src->traffic_class;
|
|
Packit Service |
646995 |
if (src->hop_limit)
|
|
Packit Service |
646995 |
dst->hop_limit = src->hop_limit;
|
|
Packit Service |
646995 |
if (src->nd_reachable_tmo)
|
|
Packit Service |
646995 |
dst->nd_reachable_tmo = src->nd_reachable_tmo;
|
|
Packit Service |
646995 |
if (src->nd_rexmit_time)
|
|
Packit Service |
646995 |
dst->nd_rexmit_time = src->nd_rexmit_time;
|
|
Packit Service |
646995 |
if (src->nd_stale_tmo)
|
|
Packit Service |
646995 |
dst->nd_stale_tmo = src->nd_stale_tmo;
|
|
Packit Service |
646995 |
if (src->dup_addr_detect_cnt)
|
|
Packit Service |
646995 |
dst->dup_addr_detect_cnt = src->dup_addr_detect_cnt;
|
|
Packit Service |
646995 |
if (src->router_adv_link_mtu)
|
|
Packit Service |
646995 |
dst->router_adv_link_mtu = src->router_adv_link_mtu;
|
|
Packit Service |
646995 |
if (src->def_task_mgmt_tmo)
|
|
Packit Service |
646995 |
dst->def_task_mgmt_tmo = src->def_task_mgmt_tmo;
|
|
Packit Service |
646995 |
if (strlen(src->header_digest))
|
|
Packit Service |
646995 |
strcpy(dst->header_digest, src->header_digest);
|
|
Packit Service |
646995 |
if (strlen(src->data_digest))
|
|
Packit Service |
646995 |
strcpy(dst->data_digest, src->data_digest);
|
|
Packit Service |
646995 |
if (strlen(src->immediate_data))
|
|
Packit Service |
646995 |
strcpy(dst->immediate_data, src->immediate_data);
|
|
Packit Service |
646995 |
if (strlen(src->initial_r2t))
|
|
Packit Service |
646995 |
strcpy(dst->initial_r2t, src->initial_r2t);
|
|
Packit Service |
646995 |
if (strlen(src->data_seq_inorder))
|
|
Packit Service |
646995 |
strcpy(dst->data_seq_inorder, src->data_seq_inorder);
|
|
Packit Service |
646995 |
if (strlen(src->data_pdu_inorder))
|
|
Packit Service |
646995 |
strcpy(dst->data_pdu_inorder, src->data_pdu_inorder);
|
|
Packit Service |
646995 |
if (src->erl)
|
|
Packit Service |
646995 |
dst->erl = src->erl;
|
|
Packit Service |
646995 |
if (src->max_recv_dlength)
|
|
Packit Service |
646995 |
dst->max_recv_dlength = src->max_recv_dlength;
|
|
Packit Service |
646995 |
if (src->first_burst_len)
|
|
Packit Service |
646995 |
dst->first_burst_len = src->first_burst_len;
|
|
Packit Service |
646995 |
if (src->max_out_r2t)
|
|
Packit Service |
646995 |
dst->max_out_r2t = src->max_out_r2t;
|
|
Packit Service |
646995 |
if (src->max_burst_len)
|
|
Packit Service |
646995 |
dst->max_burst_len = src->max_burst_len;
|
|
Packit Service |
646995 |
if (strlen(src->chap_auth))
|
|
Packit Service |
646995 |
strcpy(dst->chap_auth, src->chap_auth);
|
|
Packit Service |
646995 |
if (strlen(src->bidi_chap))
|
|
Packit Service |
646995 |
strcpy(dst->bidi_chap, src->bidi_chap);
|
|
Packit Service |
646995 |
if (strlen(src->strict_login_comp))
|
|
Packit Service |
646995 |
strcpy(dst->strict_login_comp, src->strict_login_comp);
|
|
Packit Service |
646995 |
if (strlen(src->discovery_auth))
|
|
Packit Service |
646995 |
strcpy(dst->discovery_auth, src->discovery_auth);
|
|
Packit Service |
646995 |
if (strlen(src->discovery_logout))
|
|
Packit Service |
646995 |
strcpy(dst->discovery_logout, src->discovery_logout);
|
|
Packit Service |
646995 |
if (strlen(src->hwaddress))
|
|
Packit Service |
646995 |
strcpy(dst->hwaddress, src->hwaddress);
|
|
Packit Service |
646995 |
if (strlen(src->transport_name))
|
|
Packit Service |
646995 |
strcpy(dst->transport_name, src->transport_name);
|
|
Packit Service |
646995 |
if (strlen(src->iname))
|
|
Packit Service |
646995 |
strcpy(dst->iname, src->iname);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int iface_is_valid(struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (!iface)
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strlen(iface->name))
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strlen(iface->transport_name))
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface_is_bound_by_hwaddr(iface))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface_is_bound_by_netdev(iface))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
// if (iface_is_bound_by_ipaddr(iface))
|
|
Packit Service |
646995 |
// return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* bound by transport name */
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int iface_match(struct iface_rec *pattern, struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (!pattern || !iface)
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strlen(pattern->name))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strcmp(pattern->name, iface->name)) {
|
|
Packit Service |
646995 |
if (!strcmp(pattern->name, DEFAULT_IFACENAME))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* For default we allow the same name, but different
|
|
Packit Service |
646995 |
* transports.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (!strlen(pattern->transport_name))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strcmp(pattern->transport_name, iface->transport_name))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
/* fall through */
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int iface_is_bound_by_hwaddr(struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (iface && strlen(iface->hwaddress) &&
|
|
Packit Service |
646995 |
strcmp(iface->hwaddress, DEFAULT_HWADDRESS))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int iface_is_bound_by_netdev(struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (iface && strlen(iface->netdev) &&
|
|
Packit Service |
646995 |
strcmp(iface->netdev, DEFAULT_NETDEV))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int iface_is_bound_by_ipaddr(struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (iface && strlen(iface->ipaddress) &&
|
|
Packit Service |
646995 |
strcmp(iface->ipaddress, DEFAULT_IPADDRESS))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void iface_print(struct iscsi_iface *iface, char *prefix)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
const char *ipaddress = iscsi_iface_ipaddress_get(iface);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
printf("%sIface Name: %s\n", prefix,
|
|
Packit Service |
646995 |
(strlen(iscsi_iface_name_get(iface)) > 0) ?
|
|
Packit Service |
646995 |
iscsi_iface_name_get(iface) : UNKNOWN_VALUE);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
printf("%sIface Transport: %s\n", prefix,
|
|
Packit Service |
646995 |
(strlen(iscsi_iface_transport_name_get(iface)) > 0) ?
|
|
Packit Service |
646995 |
iscsi_iface_transport_name_get(iface) : UNKNOWN_VALUE);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
printf("%sIface Initiatorname: %s\n", prefix,
|
|
Packit Service |
646995 |
(strlen(iscsi_iface_iname_get(iface)) > 0) ?
|
|
Packit Service |
646995 |
iscsi_iface_iname_get(iface) : UNKNOWN_VALUE);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strlen(ipaddress))
|
|
Packit Service |
646995 |
printf("%sIface IPaddress: %s\n", prefix, UNKNOWN_VALUE);
|
|
Packit Service |
646995 |
else if (strchr(ipaddress, '.'))
|
|
Packit Service |
646995 |
printf("%sIface IPaddress: %s\n", prefix, ipaddress);
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
printf("%sIface IPaddress: [%s]\n", prefix, ipaddress);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
printf("%sIface HWaddress: %s\n", prefix,
|
|
Packit Service |
646995 |
(strlen(iscsi_iface_hwaddress_get(iface)) > 0) ?
|
|
Packit Service |
646995 |
iscsi_iface_hwaddress_get(iface) : UNKNOWN_VALUE);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
printf("%sIface Netdev: %s\n", prefix,
|
|
Packit Service |
646995 |
(strlen(iscsi_iface_netdev_get(iface)) > 0) ?
|
|
Packit Service |
646995 |
iscsi_iface_netdev_get(iface) : UNKNOWN_VALUE);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
struct iface_print_node_data {
|
|
Packit Service |
646995 |
struct node_rec *last_rec;
|
|
Packit Service |
646995 |
struct iface_rec *match_iface;
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int iface_print_nodes(void *data, node_rec_t *rec)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct iface_print_node_data *print_data = data;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!iface_match(print_data->match_iface, &rec->iface))
|
|
Packit Service |
646995 |
return -1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_print_node_tree(print_data->last_rec, rec, "\t");
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* iface_print_tree - print out binding info
|
|
Packit Service |
646995 |
* @iface: iface to print out
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Currently this looks like the iface conf print, because we only
|
|
Packit Service |
646995 |
* have the binding info. When we store the iface specific node settings
|
|
Packit Service |
646995 |
* in the iface record then it will look different.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
int iface_print_tree(__attribute__((unused))void *data,
|
|
Packit Service |
646995 |
struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct node_rec last_rec;
|
|
Packit Service |
646995 |
struct iface_print_node_data print_data;
|
|
Packit Service |
646995 |
int num_found = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
printf("Iface: %s\n", iface->name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(&last_rec, 0, sizeof(struct node_rec ));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
print_data.match_iface = iface;
|
|
Packit Service |
646995 |
print_data.last_rec = &last_rec;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
idbm_for_each_rec(&num_found, &print_data, iface_print_nodes, false);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
void iface_print_flat(struct iscsi_iface *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
printf("%s %s,%s,%s,%s,%s\n",
|
|
Packit Service |
646995 |
_unwrap(iscsi_iface_name_get(iface)),
|
|
Packit Service |
646995 |
_unwrap(iscsi_iface_transport_name_get(iface)),
|
|
Packit Service |
646995 |
_unwrap(iscsi_iface_hwaddress_get(iface)),
|
|
Packit Service |
646995 |
_unwrap(iscsi_iface_ipaddress_get(iface)),
|
|
Packit Service |
646995 |
_unwrap(iscsi_iface_netdev_get(iface)),
|
|
Packit Service |
646995 |
_unwrap(iscsi_iface_iname_get(iface)));
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
int iface_for_each_iface(void *data, int skip_def, int *nr_found,
|
|
Packit Service |
646995 |
iface_op_fn *fn)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
DIR *iface_dirfd;
|
|
Packit Service |
646995 |
struct dirent *iface_dent;
|
|
Packit Service |
646995 |
struct iface_rec *iface, *def_iface;
|
|
Packit Service |
646995 |
int err = 0, i = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!skip_def) {
|
|
Packit Service |
646995 |
while ((def_iface = default_ifaces[i++])) {
|
|
Packit Service |
646995 |
iface = iface_alloc(def_iface->name, &err;;
|
|
Packit Service |
646995 |
if (!iface) {
|
|
Packit Service |
646995 |
log_error("Could not add iface %s.",
|
|
Packit Service |
646995 |
def_iface->name);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
iface_copy(iface, def_iface);
|
|
Packit Service |
646995 |
err = fn(data, iface);
|
|
Packit Service |
646995 |
free(iface);
|
|
Packit Service |
646995 |
if (err)
|
|
Packit Service |
646995 |
return err;
|
|
Packit Service |
646995 |
(*nr_found)++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_dirfd = opendir(IFACE_CONFIG_DIR);
|
|
Packit Service |
646995 |
if (!iface_dirfd)
|
|
Packit Service |
646995 |
return errno;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
while ((iface_dent = readdir(iface_dirfd))) {
|
|
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 |
if (!strcmp(iface_dent->d_name, "iface.example"))
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(5, "iface_for_each_iface found %s",
|
|
Packit Service |
646995 |
iface_dent->d_name);
|
|
Packit Service |
646995 |
iface = iface_alloc(iface_dent->d_name, &err;;
|
|
Packit Service |
646995 |
if (!iface || err) {
|
|
Packit Service |
646995 |
if (err == ISCSI_ERR_INVAL)
|
|
Packit Service |
646995 |
log_error("Invalid iface name %s. Must be "
|
|
Packit Service |
646995 |
"from 1 to %d characters.",
|
|
Packit Service |
646995 |
iface_dent->d_name,
|
|
Packit Service |
646995 |
ISCSI_MAX_IFACE_LEN - 1);
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
log_error("Could not add iface %s.",
|
|
Packit Service |
646995 |
iface_dent->d_name);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
err = idbm_lock();
|
|
Packit Service |
646995 |
if (err) {
|
|
Packit Service |
646995 |
free(iface);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
err = __iface_conf_read(iface);
|
|
Packit Service |
646995 |
idbm_unlock();
|
|
Packit Service |
646995 |
if (err) {
|
|
Packit Service |
646995 |
log_error("Could not read def iface %s (err %d)",
|
|
Packit Service |
646995 |
iface->name, err);
|
|
Packit Service |
646995 |
free(iface);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!iface_is_valid(iface)) {
|
|
Packit Service |
646995 |
log_debug(5, "iface is not valid "
|
|
Packit Service |
646995 |
"Iface settings " iface_fmt,
|
|
Packit Service |
646995 |
iface_str(iface));
|
|
Packit Service |
646995 |
free(iface);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
err = fn(data, iface);
|
|
Packit Service |
646995 |
free(iface);
|
|
Packit Service |
646995 |
if (err)
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
(*nr_found)++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
closedir(iface_dirfd);
|
|
Packit Service |
646995 |
return err;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int iface_link(void *data, struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct list_head *ifaces = data;
|
|
Packit Service |
646995 |
struct iface_rec *iface_copy;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_copy = calloc(1, sizeof(*iface_copy));
|
|
Packit Service |
646995 |
if (!iface_copy)
|
|
Packit Service |
646995 |
return ISCSI_ERR_NOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memcpy(iface_copy, iface, sizeof(*iface_copy));
|
|
Packit Service |
646995 |
INIT_LIST_HEAD(&iface_copy->list);
|
|
Packit Service |
646995 |
list_add_tail(&iface_copy->list, ifaces);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* iface_link_ifaces - link non default ifaces
|
|
Packit Service |
646995 |
* @ifaces: list to add ifaces to
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* This will return a list of the ifaces created by iscsiadm
|
|
Packit Service |
646995 |
* or the user. It does not return the static default ones.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
void iface_link_ifaces(struct list_head *ifaces)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int nr_found = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_for_each_iface(ifaces, 1, &nr_found, iface_link);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* iface_setup_from_boot_context - setup iface from boot context info
|
|
Packit Service |
646995 |
* @iface: iface t setup
|
|
Packit Service |
646995 |
* @context: boot context info
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Returns 1 if setup for offload.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
int iface_setup_from_boot_context(struct iface_rec *iface,
|
|
Packit Service |
646995 |
struct boot_context *context)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct iscsi_transport *t = NULL;
|
|
Packit Service |
646995 |
uint32_t hostno;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strlen(context->initiatorname))
|
|
Packit Service |
646995 |
strlcpy(iface->iname, context->initiatorname,
|
|
Packit Service |
646995 |
sizeof(iface->iname));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strlen(context->scsi_host_name)) {
|
|
Packit Service |
646995 |
if (sscanf(context->scsi_host_name,
|
|
Packit Service |
646995 |
"iscsi_boot%u", &hostno) != 1) {
|
|
Packit Service |
646995 |
log_error("Could not parse %s's host no.",
|
|
Packit Service |
646995 |
context->scsi_host_name);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
} else if (strlen(context->iface)) {
|
|
Packit Service |
f80f6b |
/* this ifdef is only temp until distros and firmwares are updated */
|
|
Packit Service |
f80f6b |
#ifdef OFFLOAD_BOOT_SUPPORTED
|
|
Packit Service |
646995 |
char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN];
|
|
Packit Service |
f80f6b |
int rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(transport_name, 0, ISCSI_TRANSPORT_NAME_MAXLEN);
|
|
Packit Service |
646995 |
/* make sure offload driver is loaded */
|
|
Packit Service |
646995 |
if (!net_get_transport_name_from_netdev(context->iface,
|
|
Packit Service |
646995 |
transport_name))
|
|
Packit Service |
646995 |
t = iscsi_sysfs_get_transport_by_name(transport_name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (net_ifup_netdev(context->iface))
|
|
Packit Service |
646995 |
log_warning("Could not bring up netdev %s for boot",
|
|
Packit Service |
646995 |
context->iface);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
hostno = iscsi_sysfs_get_host_no_from_hwaddress(context->mac,
|
|
Packit Service |
646995 |
&rc);
|
|
Packit Service |
646995 |
if (rc) {
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* If the MAC in the boot info does not match an iscsi
|
|
Packit Service |
646995 |
* host then the MAC must be for network card, so boot
|
|
Packit Service |
646995 |
* is not going to be offloaded.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
log_debug(3, "Could not match %s to host",
|
|
Packit Service |
646995 |
context->mac);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
strlcpy(iface->netdev, context->iface, sizeof(iface->netdev));
|
|
Packit Service |
f80f6b |
#else
|
|
Packit Service |
f80f6b |
return 0;
|
|
Packit Service |
f80f6b |
#endif
|
|
Packit Service |
646995 |
} else
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* set up for access through a offload card.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (!t)
|
|
Packit Service |
646995 |
t = iscsi_sysfs_get_transport_by_hba(hostno);
|
|
Packit Service |
646995 |
if (!t) {
|
|
Packit Service |
646995 |
log_error("Could not get transport for host%u. "
|
|
Packit Service |
646995 |
"Make sure the iSCSI driver is loaded.",
|
|
Packit Service |
646995 |
hostno);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
strcpy(iface->transport_name, t->name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(iface->name, 0, sizeof(iface->name));
|
|
Packit Service |
646995 |
snprintf(iface->name, sizeof(iface->name), "%s.%s",
|
|
Packit Service |
646995 |
iface->transport_name, context->mac);
|
|
Packit Service |
646995 |
strlcpy(iface->hwaddress, context->mac,
|
|
Packit Service |
646995 |
sizeof(iface->hwaddress));
|
|
Packit Service |
646995 |
strlcpy(iface->ipaddress, context->ipaddr,
|
|
Packit Service |
646995 |
sizeof(iface->ipaddress));
|
|
Packit Service |
646995 |
iface->vlan_id = atoi(context->vlan);
|
|
Packit Service |
646995 |
strlcpy(iface->subnet_mask, context->mask,
|
|
Packit Service |
646995 |
sizeof(iface->subnet_mask));
|
|
Packit Service |
646995 |
strlcpy(iface->gateway, context->gateway,
|
|
Packit Service |
646995 |
sizeof(iface->gateway));
|
|
Packit Service |
646995 |
log_debug(1, "iface " iface_fmt "", iface_str(iface));
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* iface_create_ifaces_from_boot_contexts - create ifaces based on boot info
|
|
Packit Service |
646995 |
* @ifaces: list to store ifaces in
|
|
Packit Service |
646995 |
* @targets: list of targets to create ifaces from
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* This function will create an iface struct based on the boot info
|
|
Packit Service |
646995 |
* and it will create (or update if existing already) an iface rec in
|
|
Packit Service |
646995 |
* the ifaces dir based on the info.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
int iface_create_ifaces_from_boot_contexts(struct list_head *ifaces,
|
|
Packit Service |
646995 |
struct list_head *targets)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct boot_context *context;
|
|
Packit Service |
646995 |
struct iface_rec *iface, *tmp_iface;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
list_for_each_entry(context, targets, list) {
|
|
Packit Service |
646995 |
rc = 0;
|
|
Packit Service |
646995 |
/* use dummy name. If valid it will get overwritten below */
|
|
Packit Service |
646995 |
iface = iface_alloc(DEFAULT_IFACENAME, &rc);
|
|
Packit Service |
646995 |
if (!iface) {
|
|
Packit Service |
646995 |
log_error("Could not setup iface %s for boot",
|
|
Packit Service |
646995 |
context->iface);
|
|
Packit Service |
646995 |
goto fail;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
if (!iface_setup_from_boot_context(iface, context)) {
|
|
Packit Service |
646995 |
/* no offload so forget it */
|
|
Packit Service |
646995 |
free(iface);
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = iface_conf_write(iface);
|
|
Packit Service |
646995 |
if (rc) {
|
|
Packit Service |
646995 |
log_error("Could not setup default iface conf "
|
|
Packit Service |
646995 |
"for %s.", iface->name);
|
|
Packit Service |
646995 |
free(iface);
|
|
Packit Service |
646995 |
goto fail;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
list_add_tail(&iface->list, ifaces);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
fail:
|
|
Packit Service |
646995 |
list_for_each_entry_safe(iface, tmp_iface, ifaces, list) {
|
|
Packit Service |
646995 |
list_del(&iface->list);
|
|
Packit Service |
646995 |
free(iface);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
struct iface_param_count {
|
|
Packit Service |
646995 |
struct iface_rec *primary;
|
|
Packit Service |
646995 |
int count;
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define IFACE_NET_PARAM_EN_CNT(param_val, cnt) { \
|
|
Packit Service |
646995 |
if (!strcmp(param_val, "disable") || \
|
|
Packit Service |
646995 |
!strcmp(param_val, "enable")) \
|
|
Packit Service |
646995 |
(*cnt)++; \
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* iface_get_common_param_count - Gets common parameters count for given iface
|
|
Packit Service |
646995 |
* @iface: iface to setup
|
|
Packit Service |
646995 |
* @count: number of parameters to set
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static void iface_get_common_param_count(struct iface_rec *iface, int *count)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (strcmp(iface->vlan_state, "disable")) {
|
|
Packit Service |
646995 |
/* vlan_state enabled */
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->vlan_id)
|
|
Packit Service |
646995 |
/* For vlan value */
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
/* vlan_state disabled */
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->mtu)
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->port)
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->delayed_ack, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->nagle, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->tcp_wsf_state, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->tcp_timestamp, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->redirect, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->header_digest, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->data_digest, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->immediate_data, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->initial_r2t, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->data_seq_inorder, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->data_pdu_inorder, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->chap_auth, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->bidi_chap, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->strict_login_comp, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->discovery_auth, count);
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->discovery_logout, count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->tcp_wsf)
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->tcp_timer_scale)
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->def_task_mgmt_tmo)
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->erl)
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->max_recv_dlength)
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->first_burst_len)
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->max_burst_len)
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->max_out_r2t)
|
|
Packit Service |
646995 |
(*count)++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* __iface_get_param_count - Gets netconfig parameter count for given iface
|
|
Packit Service |
646995 |
* @data: iface_param_count structure
|
|
Packit Service |
646995 |
* @iface: iface to setup
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static int __iface_get_param_count(void *data, struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct iface_param_count *iface_params = data;
|
|
Packit Service |
646995 |
int iptype = ISCSI_IFACE_TYPE_IPV4;
|
|
Packit Service |
646995 |
int count = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strcmp(iface_params->primary->hwaddress, iface->hwaddress))
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iptype = iface_get_iptype(iface);
|
|
Packit Service |
646995 |
if (iptype == ISCSI_IFACE_TYPE_IPV4) {
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strcmp(iface->state, "disable")) {
|
|
Packit Service |
646995 |
if (strstr(iface->bootproto, "dhcp")) {
|
|
Packit Service |
646995 |
/* DHCP enabled */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
/* DHCP disabled */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strstr(iface->ipaddress, ".")) {
|
|
Packit Service |
646995 |
/* User configured IPv4 Address */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strstr(iface->subnet_mask, "."))
|
|
Packit Service |
646995 |
/* User configured Subnet */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strstr(iface->gateway, "."))
|
|
Packit Service |
646995 |
/* User configured Gateway */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* IPv4 Address not valid, decrement
|
|
Packit Service |
646995 |
* count of DHCP
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
count--;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* If IPv4 configuration in iface file is valid,
|
|
Packit Service |
646995 |
* enable state and other parameters (if any)
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (count) {
|
|
Packit Service |
646995 |
/* iface state */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->dhcp_dns,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->dhcp_slp_da,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->tos_state,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->gratuitous_arp,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(
|
|
Packit Service |
646995 |
iface->dhcp_alt_client_id_state,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->dhcp_alt_client_id[0])
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(
|
|
Packit Service |
646995 |
iface->dhcp_req_vendor_id_state,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(
|
|
Packit Service |
646995 |
iface->dhcp_vendor_id_state,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->dhcp_vendor_id[0])
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->dhcp_learn_iqn,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->fragmentation,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(
|
|
Packit Service |
646995 |
iface->incoming_forwarding,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->tos)
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->ttl)
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_get_common_param_count(iface, &count);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
/* IPv4 is disabled, iface state */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
} else if (iptype == ISCSI_IFACE_TYPE_IPV6) {
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strcmp(iface->state, "disable")) {
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* IPv6 Address */
|
|
Packit Service |
646995 |
if (strstr(iface->ipv6_autocfg, "nd") ||
|
|
Packit Service |
646995 |
strstr(iface->ipv6_autocfg, "dhcpv6")) {
|
|
Packit Service |
646995 |
/* Autocfg enabled */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
/* Autocfg disabled */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strstr(iface->ipaddress, ":"))
|
|
Packit Service |
646995 |
/* User configured IPv6 Address */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* IPv6 Address not valid, decrement
|
|
Packit Service |
646995 |
* count of IPv6 Autocfg
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
count--;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* IPv6 LinkLocal Address */
|
|
Packit Service |
646995 |
if (strstr(iface->linklocal_autocfg, "auto"))
|
|
Packit Service |
646995 |
/* Autocfg enabled */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
else {
|
|
Packit Service |
646995 |
/* Autocfg disabled */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strstr(iface->ipv6_linklocal, ":"))
|
|
Packit Service |
646995 |
/* User configured LinkLocal Address */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* LinkLocal Address not valid,
|
|
Packit Service |
646995 |
* decrement count of LinkLocal Autocfg
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
count--;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* IPv6 Router Address */
|
|
Packit Service |
646995 |
if (strstr(iface->router_autocfg, "auto"))
|
|
Packit Service |
646995 |
/* Autocfg enabled */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
else {
|
|
Packit Service |
646995 |
/* Autocfg disabled */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strstr(iface->ipv6_router, ":"))
|
|
Packit Service |
646995 |
/* User configured Router Address */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Router Address not valid,
|
|
Packit Service |
646995 |
* decrement count of Router Autocfg
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
count--;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* If IPv6 configuration in iface file is valid,
|
|
Packit Service |
646995 |
* enable state and other parameters (if any)
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (count) {
|
|
Packit Service |
646995 |
/* iface state */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(
|
|
Packit Service |
646995 |
iface->gratuitous_neighbor_adv,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_NET_PARAM_EN_CNT(iface->mld, &count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->flow_label)
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->traffic_class)
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->hop_limit)
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->nd_reachable_tmo)
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->nd_rexmit_time)
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->nd_stale_tmo)
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->dup_addr_detect_cnt)
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface->router_adv_link_mtu)
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_get_common_param_count(iface, &count);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
/* IPv6 is disabled, iface state */
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_params->count += count;
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* iface_get_param_count - Gets netconfig parameter count from iface
|
|
Packit Service |
646995 |
* @iface: iface to setup
|
|
Packit Service |
646995 |
* @iface_all: Flag for number of ifaces to traverse (1 for all)
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Returns netconfig parameter count.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
int iface_get_param_count(struct iface_rec *iface, int iface_all)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int num_found = 0, rc;
|
|
Packit Service |
646995 |
struct iface_param_count iface_params;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(8, "In iface_get_param_count");
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iface_params.primary = iface;
|
|
Packit Service |
646995 |
iface_params.count = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface_all)
|
|
Packit Service |
646995 |
rc = iface_for_each_iface(&iface_params, 0, &num_found,
|
|
Packit Service |
646995 |
__iface_get_param_count);
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
rc = __iface_get_param_count(&iface_params, iface);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(8, "iface_get_param_count: rc = %d, count = %d",
|
|
Packit Service |
646995 |
rc, iface_params.count);
|
|
Packit Service |
646995 |
return iface_params.count;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* write integer parameter value */
|
|
Packit Service |
646995 |
static int iface_fill_int_param_val(struct iovec *iov, uint32_t iface_num,
|
|
Packit Service |
646995 |
uint8_t iface_type, uint16_t param,
|
|
Packit Service |
646995 |
uint8_t param_type, uint32_t param_len,
|
|
Packit Service |
646995 |
uint32_t param_val)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int len;
|
|
Packit Service |
646995 |
struct iscsi_iface_param_info *net_param;
|
|
Packit Service |
646995 |
struct nlattr *attr;
|
|
Packit Service |
646995 |
uint8_t val8 = 0;
|
|
Packit Service |
646995 |
uint16_t val16 = 0;
|
|
Packit Service |
646995 |
uint32_t val32 = 0;
|
|
Packit Service |
646995 |
char *val = NULL;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
len = sizeof(struct iscsi_iface_param_info) + param_len;
|
|
Packit Service |
646995 |
iov->iov_base = iscsi_nla_alloc(param, len);
|
|
Packit Service |
646995 |
if (!(iov->iov_base))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
attr = iov->iov_base;
|
|
Packit Service |
646995 |
iov->iov_len = NLA_ALIGN(attr->nla_len);
|
|
Packit Service |
646995 |
net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
|
|
Packit Service |
646995 |
net_param->iface_num = iface_num;
|
|
Packit Service |
646995 |
net_param->len = param_len;
|
|
Packit Service |
646995 |
net_param->param = param;
|
|
Packit Service |
646995 |
net_param->iface_type = iface_type;
|
|
Packit Service |
646995 |
net_param->param_type = param_type;
|
|
Packit Service |
646995 |
switch (param_len) {
|
|
Packit Service |
646995 |
case 1:
|
|
Packit Service |
646995 |
val8 = (uint8_t)param_val;
|
|
Packit Service |
646995 |
val = (char *)&val;;
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
case 2:
|
|
Packit Service |
646995 |
val16 = (uint16_t)param_val;
|
|
Packit Service |
646995 |
val = (char *)&val16;
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
case 4:
|
|
Packit Service |
646995 |
val32 = (uint32_t)param_val;
|
|
Packit Service |
646995 |
val = (char *)&val32;
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
default:
|
|
Packit Service |
646995 |
goto free;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
memcpy(net_param->value, val, param_len);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
free:
|
|
Packit Service |
646995 |
free(iov->iov_base);
|
|
Packit Service |
646995 |
iov->iov_base = NULL;
|
|
Packit Service |
646995 |
iov->iov_len = 0;
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define IFACE_SET_PARAM_INTVAL(iov, inum, itype, param, ptype, plen, \
|
|
Packit Service |
646995 |
ival, gcnt, lcnt) { \
|
|
Packit Service |
646995 |
if (ival && !iface_fill_int_param_val(iov, inum, itype, param, \
|
|
Packit Service |
646995 |
ptype, plen, ival)) { \
|
|
Packit Service |
646995 |
(*gcnt)++; \
|
|
Packit Service |
646995 |
(*lcnt)++; \
|
|
Packit Service |
646995 |
} \
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* IPv4/IPv6 VLAN_ID: decimal value <= 4095 */
|
|
Packit Service |
646995 |
static int iface_fill_vlan_id(struct iovec *iov, struct iface_rec *iface,
|
|
Packit Service |
646995 |
uint32_t iface_type)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int len;
|
|
Packit Service |
646995 |
struct iscsi_iface_param_info *net_param;
|
|
Packit Service |
646995 |
uint16_t vlan = 0;
|
|
Packit Service |
646995 |
struct nlattr *attr;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
len = sizeof(struct iscsi_iface_param_info) + 2;
|
|
Packit Service |
646995 |
iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_VLAN_TAG, len);
|
|
Packit Service |
646995 |
if (!(iov->iov_base))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
attr = iov->iov_base;
|
|
Packit Service |
646995 |
iov->iov_len = NLA_ALIGN(attr->nla_len);
|
|
Packit Service |
646995 |
net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
|
|
Packit Service |
646995 |
net_param->param = ISCSI_NET_PARAM_VLAN_TAG;
|
|
Packit Service |
646995 |
net_param->iface_type = iface_type;
|
|
Packit Service |
646995 |
net_param->iface_num = iface->iface_num;
|
|
Packit Service |
646995 |
net_param->param_type = ISCSI_NET_PARAM;
|
|
Packit Service |
646995 |
net_param->len = 2;
|
|
Packit Service |
646995 |
if (iface->vlan_id <= ISCSI_MAX_VLAN_ID &&
|
|
Packit Service |
646995 |
iface->vlan_priority <= ISCSI_MAX_VLAN_PRIORITY)
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Bit 15-13: User Priority of VLAN
|
|
Packit Service |
646995 |
* Bit 11-00: VLAN ID
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
vlan = (iface->vlan_priority << 13) |
|
|
Packit Service |
646995 |
(iface->vlan_id & ISCSI_MAX_VLAN_ID);
|
|
Packit Service |
646995 |
memcpy(net_param->value, &vlan, net_param->len);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* disable/enable parameters */
|
|
Packit Service |
646995 |
static int iface_fill_param_state(struct iovec *iov, uint32_t iface_num,
|
|
Packit Service |
646995 |
uint8_t iface_type, uint16_t param,
|
|
Packit Service |
646995 |
uint8_t param_type, char *param_val)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int len;
|
|
Packit Service |
646995 |
struct iscsi_iface_param_info *net_param;
|
|
Packit Service |
646995 |
struct nlattr *attr;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!param_val[0])
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
len = sizeof(struct iscsi_iface_param_info) + 1;
|
|
Packit Service |
646995 |
iov->iov_base = iscsi_nla_alloc(param, len);
|
|
Packit Service |
646995 |
if (!(iov->iov_base))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
attr = iov->iov_base;
|
|
Packit Service |
646995 |
iov->iov_len = NLA_ALIGN(attr->nla_len);
|
|
Packit Service |
646995 |
net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
|
|
Packit Service |
646995 |
net_param->iface_num = iface_num;
|
|
Packit Service |
646995 |
net_param->len = 1;
|
|
Packit Service |
646995 |
net_param->param = param;
|
|
Packit Service |
646995 |
net_param->iface_type = iface_type;
|
|
Packit Service |
646995 |
net_param->param_type = param_type;
|
|
Packit Service |
646995 |
if (!strcmp(param_val, "disable"))
|
|
Packit Service |
646995 |
net_param->value[0] = ISCSI_NET_PARAM_DISABLE;
|
|
Packit Service |
646995 |
else if (!strcmp(param_val, "enable"))
|
|
Packit Service |
646995 |
net_param->value[0] = ISCSI_NET_PARAM_ENABLE;
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
goto free;
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
free:
|
|
Packit Service |
646995 |
free(iov->iov_base);
|
|
Packit Service |
646995 |
iov->iov_base = NULL;
|
|
Packit Service |
646995 |
iov->iov_len = 0;
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define IFACE_SET_PARAM_STATE(iov, inum, itype, param, ptype, ival, \
|
|
Packit Service |
646995 |
gcnt, lcnt) { \
|
|
Packit Service |
646995 |
if (!iface_fill_param_state(iov, inum, itype, param, ptype, \
|
|
Packit Service |
646995 |
ival)) { \
|
|
Packit Service |
646995 |
(*gcnt)++; \
|
|
Packit Service |
646995 |
(*lcnt)++; \
|
|
Packit Service |
646995 |
} \
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* IPv4 Bootproto: DHCP/static */
|
|
Packit Service |
646995 |
static int iface_fill_net_bootproto(struct iovec *iov, struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int len;
|
|
Packit Service |
646995 |
struct iscsi_iface_param_info *net_param;
|
|
Packit Service |
646995 |
struct nlattr *attr;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
len = sizeof(struct iscsi_iface_param_info) + 1;
|
|
Packit Service |
646995 |
iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_IPV4_BOOTPROTO, len);
|
|
Packit Service |
646995 |
if (!(iov->iov_base))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
attr = iov->iov_base;
|
|
Packit Service |
646995 |
iov->iov_len = NLA_ALIGN(attr->nla_len);
|
|
Packit Service |
646995 |
net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
|
|
Packit Service |
646995 |
net_param->param = ISCSI_NET_PARAM_IPV4_BOOTPROTO;
|
|
Packit Service |
646995 |
net_param->iface_type = ISCSI_IFACE_TYPE_IPV4;
|
|
Packit Service |
646995 |
net_param->iface_num = iface->iface_num;
|
|
Packit Service |
646995 |
net_param->param_type = ISCSI_NET_PARAM;
|
|
Packit Service |
646995 |
net_param->len = 1;
|
|
Packit Service |
646995 |
if (!strcmp(iface->bootproto, "dhcp"))
|
|
Packit Service |
646995 |
net_param->value[0] = ISCSI_BOOTPROTO_DHCP;
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
net_param->value[0] = ISCSI_BOOTPROTO_STATIC;
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* IPv6 IPAddress Autocfg: nd/dhcpv6/disable */
|
|
Packit Service |
646995 |
static int iface_fill_net_autocfg(struct iovec *iov, struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int len;
|
|
Packit Service |
646995 |
struct iscsi_iface_param_info *net_param;
|
|
Packit Service |
646995 |
struct nlattr *attr;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
len = sizeof(struct iscsi_iface_param_info) + 1;
|
|
Packit Service |
646995 |
iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG, len);
|
|
Packit Service |
646995 |
if (!(iov->iov_base))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
attr = iov->iov_base;
|
|
Packit Service |
646995 |
iov->iov_len = NLA_ALIGN(attr->nla_len);
|
|
Packit Service |
646995 |
net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
|
|
Packit Service |
646995 |
net_param->param = ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG;
|
|
Packit Service |
646995 |
net_param->iface_type = ISCSI_IFACE_TYPE_IPV6;
|
|
Packit Service |
646995 |
net_param->param_type = ISCSI_NET_PARAM;
|
|
Packit Service |
646995 |
net_param->len = 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!strcmp(iface->ipv6_autocfg, "nd"))
|
|
Packit Service |
646995 |
net_param->value[0] = ISCSI_IPV6_AUTOCFG_ND_ENABLE;
|
|
Packit Service |
646995 |
else if (!strcmp(iface->ipv6_autocfg, "dhcpv6"))
|
|
Packit Service |
646995 |
net_param->value[0] = ISCSI_IPV6_AUTOCFG_DHCPV6_ENABLE;
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
net_param->value[0] = ISCSI_IPV6_AUTOCFG_DISABLE;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* IPv6 LinkLocal Autocfg: enable/disable */
|
|
Packit Service |
646995 |
static int iface_fill_linklocal_autocfg(struct iovec *iov,
|
|
Packit Service |
646995 |
struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int len;
|
|
Packit Service |
646995 |
struct iscsi_iface_param_info *net_param;
|
|
Packit Service |
646995 |
struct nlattr *attr;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
len = sizeof(struct iscsi_iface_param_info) + 1;
|
|
Packit Service |
646995 |
iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG,
|
|
Packit Service |
646995 |
len);
|
|
Packit Service |
646995 |
if (!(iov->iov_base))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
attr = iov->iov_base;
|
|
Packit Service |
646995 |
iov->iov_len = NLA_ALIGN(attr->nla_len);
|
|
Packit Service |
646995 |
net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
|
|
Packit Service |
646995 |
net_param->param = ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG;
|
|
Packit Service |
646995 |
net_param->iface_type = ISCSI_IFACE_TYPE_IPV6;
|
|
Packit Service |
646995 |
net_param->param_type = ISCSI_NET_PARAM;
|
|
Packit Service |
646995 |
net_param->len = 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strstr(iface->linklocal_autocfg, "auto"))
|
|
Packit Service |
646995 |
net_param->value[0] = ISCSI_IPV6_LINKLOCAL_AUTOCFG_ENABLE;
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
net_param->value[0] = ISCSI_IPV6_LINKLOCAL_AUTOCFG_DISABLE;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* IPv6 Router Autocfg: enable/disable */
|
|
Packit Service |
646995 |
static int iface_fill_router_autocfg(struct iovec *iov, struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int len;
|
|
Packit Service |
646995 |
struct iscsi_iface_param_info *net_param;
|
|
Packit Service |
646995 |
struct nlattr *attr;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
len = sizeof(struct iscsi_iface_param_info) + 1;
|
|
Packit Service |
646995 |
iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG,
|
|
Packit Service |
646995 |
len);
|
|
Packit Service |
646995 |
if (!(iov->iov_base))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
attr = iov->iov_base;
|
|
Packit Service |
646995 |
iov->iov_len = NLA_ALIGN(attr->nla_len);
|
|
Packit Service |
646995 |
net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
|
|
Packit Service |
646995 |
net_param->param = ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG;
|
|
Packit Service |
646995 |
net_param->iface_type = ISCSI_IFACE_TYPE_IPV6;
|
|
Packit Service |
646995 |
net_param->param_type = ISCSI_NET_PARAM;
|
|
Packit Service |
646995 |
net_param->len = 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strstr(iface->router_autocfg, "auto"))
|
|
Packit Service |
646995 |
net_param->value[0] = ISCSI_IPV6_ROUTER_AUTOCFG_ENABLE;
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
net_param->value[0] = ISCSI_IPV6_ROUTER_AUTOCFG_DISABLE;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* IPv4 IPAddress/Subnet Mask/Gateway: 4 bytes */
|
|
Packit Service |
646995 |
static int iface_fill_net_ipv4_addr(struct iovec *iov, uint32_t iface_num,
|
|
Packit Service |
646995 |
uint16_t param, char *param_val)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int rc = 1;
|
|
Packit Service |
646995 |
int len;
|
|
Packit Service |
646995 |
struct iscsi_iface_param_info *net_param;
|
|
Packit Service |
646995 |
struct nlattr *attr;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
len = sizeof(struct iscsi_iface_param_info) + 4;
|
|
Packit Service |
646995 |
iov->iov_base = iscsi_nla_alloc(param, len);
|
|
Packit Service |
646995 |
if (!(iov->iov_base))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
attr = iov->iov_base;
|
|
Packit Service |
646995 |
iov->iov_len = NLA_ALIGN(attr->nla_len);
|
|
Packit Service |
646995 |
net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
|
|
Packit Service |
646995 |
net_param->param = param;
|
|
Packit Service |
646995 |
net_param->iface_type = ISCSI_IFACE_TYPE_IPV4;
|
|
Packit Service |
646995 |
net_param->iface_num = iface_num;
|
|
Packit Service |
646995 |
net_param->len = 4;
|
|
Packit Service |
646995 |
net_param->param_type = ISCSI_NET_PARAM;
|
|
Packit Service |
646995 |
rc = inet_pton(AF_INET, param_val, net_param->value);
|
|
Packit Service |
646995 |
if (rc <= 0)
|
|
Packit Service |
646995 |
goto free;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* validate */
|
|
Packit Service |
646995 |
if (!net_param->value[0] && !net_param->value[1] &&
|
|
Packit Service |
646995 |
!net_param->value[2] && !net_param->value[3])
|
|
Packit Service |
646995 |
goto free;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
free:
|
|
Packit Service |
646995 |
free(iov->iov_base);
|
|
Packit Service |
646995 |
iov->iov_base = NULL;
|
|
Packit Service |
646995 |
iov->iov_len = 0;
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define IFACE_SET_NET_PARAM_IPV4_ADDR(iov, inum, param, ival, gcnt, \
|
|
Packit Service |
646995 |
lcnt) { \
|
|
Packit Service |
646995 |
if (strstr(ival, ".")) { \
|
|
Packit Service |
646995 |
if (!iface_fill_net_ipv4_addr(iov, inum, param, ival)) {\
|
|
Packit Service |
646995 |
(*gcnt)++; \
|
|
Packit Service |
646995 |
(*lcnt)++; \
|
|
Packit Service |
646995 |
} \
|
|
Packit Service |
646995 |
} \
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* IPv6 IPAddress/LinkLocal/Router: 16 bytes */
|
|
Packit Service |
646995 |
static int iface_fill_net_ipv6_addr(struct iovec *iov, uint32_t iface_num,
|
|
Packit Service |
646995 |
uint16_t param, char *param_val)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int rc;
|
|
Packit Service |
646995 |
int len;
|
|
Packit Service |
646995 |
struct iscsi_iface_param_info *net_param;
|
|
Packit Service |
646995 |
struct nlattr *attr;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
len = sizeof(struct iscsi_iface_param_info) + 16;
|
|
Packit Service |
646995 |
iov->iov_base = iscsi_nla_alloc(param, len);
|
|
Packit Service |
646995 |
if (!(iov->iov_base))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
attr = iov->iov_base;
|
|
Packit Service |
646995 |
iov->iov_len = NLA_ALIGN(attr->nla_len);
|
|
Packit Service |
646995 |
net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
|
|
Packit Service |
646995 |
net_param->param = param;
|
|
Packit Service |
646995 |
net_param->iface_type = ISCSI_IFACE_TYPE_IPV6;
|
|
Packit Service |
646995 |
net_param->iface_num = iface_num;
|
|
Packit Service |
646995 |
net_param->param_type = ISCSI_NET_PARAM;
|
|
Packit Service |
646995 |
net_param->len = 16;
|
|
Packit Service |
646995 |
rc = inet_pton(AF_INET6, param_val, net_param->value);
|
|
Packit Service |
646995 |
if (rc <= 0)
|
|
Packit Service |
646995 |
goto free;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
free:
|
|
Packit Service |
646995 |
free(iov->iov_base);
|
|
Packit Service |
646995 |
iov->iov_base = NULL;
|
|
Packit Service |
646995 |
iov->iov_len = 0;
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define IFACE_SET_NET_PARAM_IPV6_ADDR(iov, inum, param, ival, gcnt, \
|
|
Packit Service |
646995 |
lcnt) { \
|
|
Packit Service |
646995 |
if (strstr(ival, ":")) { \
|
|
Packit Service |
646995 |
if (!iface_fill_net_ipv6_addr(iov, inum, param, ival)) {\
|
|
Packit Service |
646995 |
(*gcnt)++; \
|
|
Packit Service |
646995 |
(*lcnt)++; \
|
|
Packit Service |
646995 |
} \
|
|
Packit Service |
646995 |
} \
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* write string parameter value */
|
|
Packit Service |
646995 |
static int iface_fill_str_param_val(struct iovec *iov, uint32_t iface_num,
|
|
Packit Service |
646995 |
uint8_t iface_type, uint16_t param,
|
|
Packit Service |
646995 |
uint32_t param_len, char *param_val)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int len;
|
|
Packit Service |
646995 |
struct iscsi_iface_param_info *net_param;
|
|
Packit Service |
646995 |
struct nlattr *attr;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!param_val[0])
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
len = sizeof(struct iscsi_iface_param_info) + param_len;
|
|
Packit Service |
646995 |
iov->iov_base = iscsi_nla_alloc(param, len);
|
|
Packit Service |
646995 |
if (!(iov->iov_base))
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
attr = iov->iov_base;
|
|
Packit Service |
646995 |
iov->iov_len = NLA_ALIGN(attr->nla_len);
|
|
Packit Service |
646995 |
net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr);
|
|
Packit Service |
646995 |
net_param->iface_num = iface_num;
|
|
Packit Service |
646995 |
net_param->len = param_len;
|
|
Packit Service |
646995 |
net_param->param = param;
|
|
Packit Service |
646995 |
net_param->iface_type = iface_type;
|
|
Packit Service |
646995 |
net_param->param_type = ISCSI_NET_PARAM;
|
|
Packit Service |
646995 |
memcpy(net_param->value, param_val, param_len);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define IFACE_SET_NET_PARAM_STRVAL(iov, inum, itype, param, plen, \
|
|
Packit Service |
646995 |
ival, gcnt, lcnt) { \
|
|
Packit Service |
646995 |
if (!iface_fill_str_param_val(iov, inum, itype, param, plen, \
|
|
Packit Service |
646995 |
ival)) { \
|
|
Packit Service |
646995 |
(*gcnt)++; \
|
|
Packit Service |
646995 |
(*lcnt)++; \
|
|
Packit Service |
646995 |
} \
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
struct iface_net_config {
|
|
Packit Service |
646995 |
struct iface_rec *primary;
|
|
Packit Service |
646995 |
struct iovec *iovs;
|
|
Packit Service |
646995 |
int count;
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int __iface_build_net_config(void *data, struct iface_rec *iface)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct iface_net_config *net_config = data;
|
|
Packit Service |
646995 |
struct iovec *iov;
|
|
Packit Service |
646995 |
int iptype = ISCSI_IFACE_TYPE_IPV4;
|
|
Packit Service |
646995 |
int count = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strcmp(net_config->primary->hwaddress, iface->hwaddress))
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* start at 2, because 0 is for nlmsghdr and 1 for event */
|
|
Packit Service |
646995 |
iov = net_config->iovs + 2;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!iface->port)
|
|
Packit Service |
646995 |
iface->port = 3260;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
iptype = iface_get_iptype(iface);
|
|
Packit Service |
646995 |
switch (iptype) {
|
|
Packit Service |
646995 |
case ISCSI_IFACE_TYPE_IPV4:
|
|
Packit Service |
646995 |
if (!strcmp(iface->state, "disable")) {
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IFACE_ENABLE,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->state,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strstr(iface->bootproto, "dhcp")) {
|
|
Packit Service |
646995 |
if (!iface_fill_net_bootproto(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface)) {
|
|
Packit Service |
646995 |
net_config->count++;
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
} else if (strstr(iface->ipaddress, ".")) {
|
|
Packit Service |
646995 |
if (!iface_fill_net_bootproto(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface)) {
|
|
Packit Service |
646995 |
net_config->count++;
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_NET_PARAM_IPV4_ADDR(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_ADDR,
|
|
Packit Service |
646995 |
iface->ipaddress,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_NET_PARAM_IPV4_ADDR(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_SUBNET,
|
|
Packit Service |
646995 |
iface->subnet_mask,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_NET_PARAM_IPV4_ADDR(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_GW,
|
|
Packit Service |
646995 |
iface->gateway,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* If IPv4 configuration in iface file is valid,
|
|
Packit Service |
646995 |
* fill state and other parameters (if any)
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (count) {
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->dhcp_dns,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->dhcp_slp_da,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_TOS_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->tos_state,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_TOS,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
1,
|
|
Packit Service |
646995 |
iface->tos,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->gratuitous_arp,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->dhcp_alt_client_id_state,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_NET_PARAM_STRVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID,
|
|
Packit Service |
646995 |
strlen(iface->dhcp_alt_client_id),
|
|
Packit Service |
646995 |
iface->dhcp_alt_client_id,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->dhcp_req_vendor_id_state,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->dhcp_vendor_id_state,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_NET_PARAM_STRVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID,
|
|
Packit Service |
646995 |
strlen(iface->dhcp_vendor_id),
|
|
Packit Service |
646995 |
iface->dhcp_vendor_id,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->dhcp_learn_iqn,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->fragmentation,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->incoming_forwarding,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV4,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV4_TTL,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
1,
|
|
Packit Service |
646995 |
iface->ttl,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
case ISCSI_IFACE_TYPE_IPV6:
|
|
Packit Service |
646995 |
if (!strcmp(iface->state, "disable")) {
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV6,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IFACE_ENABLE,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->state,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* For IPv6 Address */
|
|
Packit Service |
646995 |
if (strstr(iface->ipv6_autocfg, "nd") ||
|
|
Packit Service |
646995 |
strstr(iface->ipv6_autocfg, "dhcpv6")) {
|
|
Packit Service |
646995 |
if (!iface_fill_net_autocfg(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface)) {
|
|
Packit Service |
646995 |
net_config->count++;
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
} else if (strstr(iface->ipaddress, ":")) {
|
|
Packit Service |
646995 |
if (!iface_fill_net_autocfg(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface)) {
|
|
Packit Service |
646995 |
net_config->count++;
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
/* User provided IPv6 Address */
|
|
Packit Service |
646995 |
IFACE_SET_NET_PARAM_IPV6_ADDR(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_ADDR,
|
|
Packit Service |
646995 |
iface->ipaddress,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* For LinkLocal Address */
|
|
Packit Service |
646995 |
if (strstr(iface->linklocal_autocfg, "auto")) {
|
|
Packit Service |
646995 |
if (!iface_fill_linklocal_autocfg(
|
|
Packit Service |
646995 |
&iov[net_config->count],
|
|
Packit Service |
646995 |
iface)) {
|
|
Packit Service |
646995 |
net_config->count++;
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
} else if (strstr(iface->ipv6_linklocal, ":")) {
|
|
Packit Service |
646995 |
if (!iface_fill_linklocal_autocfg(
|
|
Packit Service |
646995 |
&iov[net_config->count],
|
|
Packit Service |
646995 |
iface)) {
|
|
Packit Service |
646995 |
net_config->count++;
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
/* User provided Link Local Address */
|
|
Packit Service |
646995 |
IFACE_SET_NET_PARAM_IPV6_ADDR(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_LINKLOCAL,
|
|
Packit Service |
646995 |
iface->ipv6_linklocal,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* For Router Address */
|
|
Packit Service |
646995 |
if (strstr(iface->router_autocfg, "auto")) {
|
|
Packit Service |
646995 |
if (!iface_fill_router_autocfg(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface)) {
|
|
Packit Service |
646995 |
net_config->count++;
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
} else if (strstr(iface->ipv6_router, ":")) {
|
|
Packit Service |
646995 |
if (!iface_fill_router_autocfg(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface)) {
|
|
Packit Service |
646995 |
net_config->count++;
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
/* User provided Router Address */
|
|
Packit Service |
646995 |
IFACE_SET_NET_PARAM_IPV6_ADDR(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_ROUTER,
|
|
Packit Service |
646995 |
iface->ipv6_router,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* If IPv6 configuration in iface file is valid,
|
|
Packit Service |
646995 |
* fill state and other parameters
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (count) {
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV6,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->gratuitous_neighbor_adv,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV6,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_MLD_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->mld,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV6,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_FLOW_LABEL,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
4,
|
|
Packit Service |
646995 |
iface->flow_label,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV6,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
1,
|
|
Packit Service |
646995 |
iface->traffic_class,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV6,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_HOP_LIMIT,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
1,
|
|
Packit Service |
646995 |
iface->hop_limit,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV6,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
4,
|
|
Packit Service |
646995 |
iface->nd_reachable_tmo,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV6,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
4,
|
|
Packit Service |
646995 |
iface->nd_rexmit_time,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV6,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_ND_STALE_TMO,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
4,
|
|
Packit Service |
646995 |
iface->nd_stale_tmo,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV6,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
1,
|
|
Packit Service |
646995 |
iface->dup_addr_detect_cnt,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
ISCSI_IFACE_TYPE_IPV6,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
4,
|
|
Packit Service |
646995 |
iface->router_adv_link_mtu,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Fill parameters common to IPv4 and IPv6 ifaces */
|
|
Packit Service |
646995 |
if (count) {
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_IFACE_ENABLE,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->state,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_VLAN_ENABLED,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->vlan_state,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strcmp(iface->vlan_state, "disable") && iface->vlan_id) {
|
|
Packit Service |
646995 |
if (!iface_fill_vlan_id(&iov[net_config->count], iface,
|
|
Packit Service |
646995 |
iptype)) {
|
|
Packit Service |
646995 |
net_config->count++;
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_MTU,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
2,
|
|
Packit Service |
646995 |
iface->mtu,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_PORT,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
2,
|
|
Packit Service |
646995 |
iface->port,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_DELAYED_ACK_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->delayed_ack,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_TCP_NAGLE_DISABLE,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->nagle,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_TCP_WSF_DISABLE,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->tcp_wsf_state,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_TCP_WSF,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
1,
|
|
Packit Service |
646995 |
iface->tcp_wsf,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_TCP_TIMER_SCALE,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
1,
|
|
Packit Service |
646995 |
iface->tcp_timer_scale,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_TCP_TIMESTAMP_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->tcp_timestamp,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM_REDIRECT_EN,
|
|
Packit Service |
646995 |
ISCSI_NET_PARAM,
|
|
Packit Service |
646995 |
iface->redirect,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
2,
|
|
Packit Service |
646995 |
iface->def_task_mgmt_tmo,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_HDRDGST_EN,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
iface->header_digest,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_DATADGST_EN,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
iface->data_digest,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_IMM_DATA_EN,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
iface->immediate_data,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_INITIAL_R2T_EN,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
iface->initial_r2t,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
iface->data_seq_inorder,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_PDU_INORDER_EN,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
iface->data_pdu_inorder,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_ERL,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
1,
|
|
Packit Service |
646995 |
iface->erl,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
4,
|
|
Packit Service |
646995 |
iface->max_recv_dlength,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_FIRST_BURST,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
4,
|
|
Packit Service |
646995 |
iface->first_burst_len,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_MAX_R2T,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
2,
|
|
Packit Service |
646995 |
iface->max_out_r2t,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_INTVAL(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_MAX_BURST,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
4,
|
|
Packit Service |
646995 |
iface->max_burst_len,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_CHAP_AUTH_EN,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
iface->chap_auth,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_BIDI_CHAP_EN,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
iface->bidi_chap,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
iface->strict_login_comp,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
iface->discovery_auth,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
IFACE_SET_PARAM_STATE(&iov[net_config->count],
|
|
Packit Service |
646995 |
iface->iface_num,
|
|
Packit Service |
646995 |
iptype,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN,
|
|
Packit Service |
646995 |
ISCSI_IFACE_PARAM,
|
|
Packit Service |
646995 |
iface->discovery_logout,
|
|
Packit Service |
646995 |
&net_config->count,
|
|
Packit Service |
646995 |
&count);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* iface_build_net_config - Setup neconfig parameter buffers
|
|
Packit Service |
646995 |
* @iface: iface to setup
|
|
Packit Service |
646995 |
* @iface_all: Flag for number of ifaces to traverse (1 for all)
|
|
Packit Service |
646995 |
* @iovs: iovec buffer for netconfig parameters
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Returns total number of netconfig parameter buffers used.
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
int iface_build_net_config(struct iface_rec *iface, int iface_all,
|
|
Packit Service |
646995 |
struct iovec *iovs)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int num_found = 0, rc;
|
|
Packit Service |
646995 |
struct iface_net_config net_config;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(8, "In iface_build_net_config");
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
net_config.primary = iface;
|
|
Packit Service |
646995 |
net_config.iovs = iovs;
|
|
Packit Service |
646995 |
net_config.count = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (iface_all)
|
|
Packit Service |
646995 |
rc = iface_for_each_iface(&net_config, 0, &num_found,
|
|
Packit Service |
646995 |
__iface_build_net_config);
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
rc = __iface_build_net_config(&net_config, iface);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
log_debug(8, "iface_build_net_config: rc = %d, count = %d",
|
|
Packit Service |
646995 |
rc, net_config.count);
|
|
Packit Service |
646995 |
return net_config.count;
|
|
Packit Service |
646995 |
}
|