|
Packit |
eace71 |
/*
|
|
Packit |
eace71 |
* iSCSI Discovery Database Library
|
|
Packit |
eace71 |
*
|
|
Packit |
eace71 |
* Copyright (C) 2004 Dmitry Yusupov, Alex Aizman
|
|
Packit |
eace71 |
* Copyright (C) 2006 Mike Christie
|
|
Packit |
eace71 |
* Copyright (C) 2006 Red Hat, Inc. All rights reserved.
|
|
Packit |
eace71 |
* maintained by open-iscsi@@googlegroups.com
|
|
Packit |
eace71 |
*
|
|
Packit |
eace71 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
eace71 |
* it under the terms of the GNU General Public License as published
|
|
Packit |
eace71 |
* by the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
eace71 |
* (at your option) any later version.
|
|
Packit |
eace71 |
*
|
|
Packit |
eace71 |
* This program is distributed in the hope that it will be useful, but
|
|
Packit |
eace71 |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
eace71 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
eace71 |
* General Public License for more details.
|
|
Packit |
eace71 |
*
|
|
Packit |
eace71 |
* See the file COPYING included with this distribution for more details.
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
#ifndef IDBM_H
|
|
Packit |
eace71 |
#define IDBM_H
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
#include <stdio.h>
|
|
Packit |
eace71 |
#include <stdbool.h>
|
|
Packit |
eace71 |
#include <sys/types.h>
|
|
Packit |
eace71 |
#include "initiator.h"
|
|
Packit |
eace71 |
#include "config.h"
|
|
Packit |
eace71 |
#include "list.h"
|
|
Packit |
eace71 |
#include "flashnode.h"
|
|
Packit |
eace71 |
|
|
Packit |
cc3efd |
#define ISCSIVAR "/var/lib/iscsi/"
|
|
Packit |
cc3efd |
#define NODE_CONFIG_DIR ISCSIVAR"nodes"
|
|
Packit |
cc3efd |
#define SLP_CONFIG_DIR ISCSIVAR"slp"
|
|
Packit |
cc3efd |
#define ISNS_CONFIG_DIR ISCSIVAR"isns"
|
|
Packit |
cc3efd |
#define STATIC_CONFIG_DIR ISCSIVAR"static"
|
|
Packit |
cc3efd |
#define FW_CONFIG_DIR ISCSIVAR"fw"
|
|
Packit |
cc3efd |
#define ST_CONFIG_DIR ISCSIVAR"send_targets"
|
|
Packit |
eace71 |
#define ST_CONFIG_NAME "st_config"
|
|
Packit |
eace71 |
#define ISNS_CONFIG_NAME "isns_config"
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
#define TYPE_INT 0
|
|
Packit |
eace71 |
#define TYPE_INT_O 1
|
|
Packit |
eace71 |
#define TYPE_STR 2
|
|
Packit |
eace71 |
#define TYPE_UINT8 3
|
|
Packit |
eace71 |
#define TYPE_UINT16 4
|
|
Packit |
eace71 |
#define TYPE_UINT32 5
|
|
Packit |
eace71 |
#define MAX_KEYS 256 /* number of keys total(including CNX_MAX) */
|
|
Packit |
eace71 |
#define NAME_MAXVAL 128 /* the maximum length of key name */
|
|
Packit |
eace71 |
#define VALUE_MAXVAL 256 /* the maximum length of 223 bytes in the RFC. */
|
|
Packit |
eace71 |
#define OPTS_MAXVAL 8
|
|
Packit |
eace71 |
typedef struct recinfo {
|
|
Packit |
eace71 |
int type;
|
|
Packit |
eace71 |
char name[NAME_MAXVAL];
|
|
Packit |
eace71 |
char value[VALUE_MAXVAL];
|
|
Packit |
eace71 |
void *data;
|
|
Packit |
eace71 |
int data_len;
|
|
Packit |
eace71 |
int visible;
|
|
Packit |
eace71 |
char* opts[OPTS_MAXVAL];
|
|
Packit |
eace71 |
int numopts;
|
|
Packit |
eace71 |
/*
|
|
Packit |
eace71 |
* bool indicating if we can change it or not.
|
|
Packit |
eace71 |
* TODO: make it a enum that can indicate wheter it also requires
|
|
Packit |
eace71 |
* a relogin to pick up if a session is running.
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
int can_modify;
|
|
Packit |
eace71 |
} recinfo_t;
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
typedef char *(idbm_get_config_file_fn)(void);
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
typedef struct idbm {
|
|
Packit |
eace71 |
void *discdb;
|
|
Packit |
eace71 |
void *nodedb;
|
|
Packit |
eace71 |
char *configfile;
|
|
Packit |
eace71 |
int refs;
|
|
Packit |
eace71 |
idbm_get_config_file_fn *get_config_file;
|
|
Packit |
eace71 |
node_rec_t nrec;
|
|
Packit |
eace71 |
recinfo_t ninfo[MAX_KEYS];
|
|
Packit |
eace71 |
discovery_rec_t drec_st;
|
|
Packit |
eace71 |
recinfo_t dinfo_st[MAX_KEYS];
|
|
Packit |
eace71 |
discovery_rec_t drec_slp;
|
|
Packit |
eace71 |
recinfo_t dinfo_slp[MAX_KEYS];
|
|
Packit |
eace71 |
discovery_rec_t drec_isns;
|
|
Packit |
eace71 |
recinfo_t dinfo_isns[MAX_KEYS];
|
|
Packit |
eace71 |
} idbm_t;
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
struct user_param {
|
|
Packit |
eace71 |
struct list_head list;
|
|
Packit |
eace71 |
char *name;
|
|
Packit |
eace71 |
char *value;
|
|
Packit |
eace71 |
int param;
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
typedef int (idbm_iface_op_fn)(void *data, node_rec_t *rec);
|
|
Packit |
eace71 |
typedef int (idbm_portal_op_fn)(int *found, void *data, char *targetname,
|
|
Packit |
eace71 |
int tpgt, char *ip, int port, bool ruw_lock);
|
|
Packit |
eace71 |
typedef int (idbm_node_op_fn)(int *found, void *data,
|
|
Packit |
eace71 |
char *targetname, bool ruw_lock);
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
struct rec_op_data {
|
|
Packit |
eace71 |
void *data;
|
|
Packit |
eace71 |
node_rec_t *match_rec;
|
|
Packit |
eace71 |
idbm_iface_op_fn *fn;
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
extern int idbm_for_each_portal(int *found, void *data, idbm_portal_op_fn *fn,
|
|
Packit |
eace71 |
char *targetname, bool ruw_lock);
|
|
Packit |
eace71 |
extern int idbm_for_each_node(int *found, void *data,
|
|
Packit |
eace71 |
idbm_node_op_fn *fn, bool ruw_lock);
|
|
Packit |
eace71 |
extern int idbm_for_each_rec(int *found, void *data,
|
|
Packit |
eace71 |
idbm_iface_op_fn *fn, bool ruw_lock);
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
typedef int (idbm_drec_op_fn)(void *data, discovery_rec_t *drec);
|
|
Packit |
eace71 |
extern int idbm_for_each_st_drec(void *data, idbm_drec_op_fn *fn);
|
|
Packit |
eace71 |
extern int idbm_for_each_isns_drec(void *data, idbm_drec_op_fn *fn);
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
extern int idbm_init(idbm_get_config_file_fn *fn);
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
extern void idbm_node_setup_from_conf(node_rec_t *rec);
|
|
Packit |
eace71 |
extern void idbm_terminate(void);
|
|
Packit |
eace71 |
extern int idbm_print_node_info(void *data, node_rec_t *rec);
|
|
Packit |
eace71 |
extern int idbm_print_node_flat(void *data, node_rec_t *rec);
|
|
Packit |
eace71 |
extern int idbm_print_node_tree(struct node_rec *last_rec, struct node_rec *rec,
|
|
Packit |
eace71 |
char *prefix);
|
|
Packit |
eace71 |
extern int idbm_print_node_and_iface_tree(void *data, node_rec_t *rec);
|
|
Packit |
eace71 |
extern int idbm_print_discovery_info(discovery_rec_t *rec, int show);
|
|
Packit |
eace71 |
extern int idbm_print_all_discovery(int info_level);
|
|
Packit |
eace71 |
extern int idbm_delete_discovery(discovery_rec_t *rec);
|
|
Packit |
eace71 |
extern void idbm_node_setup_defaults(node_rec_t *rec);
|
|
Packit |
eace71 |
extern int idbm_delete_node(node_rec_t *rec);
|
|
Packit |
eace71 |
extern int idbm_add_node(node_rec_t *newrec, discovery_rec_t *drec,
|
|
Packit |
eace71 |
int overwrite);
|
|
Packit |
eace71 |
struct list_head;
|
|
Packit |
eace71 |
typedef int (idbm_disc_nodes_fn)(void *data, struct iface_rec *iface,
|
|
Packit |
eace71 |
struct list_head *recs);
|
|
Packit |
eace71 |
extern int idbm_bind_ifaces_to_nodes(idbm_disc_nodes_fn *disc_node_fn,
|
|
Packit |
eace71 |
void *data, struct list_head *ifaces,
|
|
Packit |
eace71 |
struct list_head *bound_recs);
|
|
Packit |
eace71 |
extern int idbm_add_discovery(discovery_rec_t *newrec);
|
|
Packit |
eace71 |
extern void idbm_sendtargets_defaults(struct iscsi_sendtargets_config *cfg);
|
|
Packit |
eace71 |
extern void idbm_isns_defaults(struct iscsi_isns_config *cfg);
|
|
Packit |
eace71 |
extern void idbm_slp_defaults(struct iscsi_slp_config *cfg);
|
|
Packit |
eace71 |
extern int idbm_session_autoscan(struct iscsi_session *session);
|
|
Packit |
eace71 |
extern int idbm_discovery_read(discovery_rec_t *rec, int type, char *addr,
|
|
Packit |
eace71 |
int port);
|
|
Packit |
eace71 |
extern int idbm_rec_read(node_rec_t *out_rec, char *target_name,
|
|
Packit |
eace71 |
int tpgt, char *addr, int port,
|
|
Packit |
eace71 |
struct iface_rec *iface, bool disable_lock);
|
|
Packit |
eace71 |
extern int idbm_node_set_rec_from_param(struct list_head *params,
|
|
Packit |
eace71 |
node_rec_t *rec, int verify);
|
|
Packit |
eace71 |
extern int idbm_node_set_param(void *data, node_rec_t *rec);
|
|
Packit |
eace71 |
extern int idbm_discovery_set_param(void *data, discovery_rec_t *rec);
|
|
Packit |
eace71 |
struct user_param *idbm_alloc_user_param(char *name, char *value);
|
|
Packit |
eace71 |
extern void idbm_node_setup_defaults(node_rec_t *rec);
|
|
Packit |
eace71 |
extern struct node_rec *idbm_find_rec_in_list(struct list_head *rec_list,
|
|
Packit |
eace71 |
char *targetname, char *addr,
|
|
Packit |
eace71 |
int port, struct iface_rec *iface);
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
/* lower level idbm functions for use by iface.c */
|
|
Packit |
eace71 |
extern void idbm_recinfo_config(recinfo_t *info, FILE *f);
|
|
Packit |
eace71 |
extern void idbm_recinfo_iface(struct iface_rec *r, recinfo_t *ri);
|
|
Packit |
eace71 |
extern int idbm_lock(void);
|
|
Packit |
eace71 |
extern void idbm_unlock(void);
|
|
Packit |
eace71 |
extern recinfo_t *idbm_recinfo_alloc(int max_keys);
|
|
Packit |
eace71 |
extern int idbm_verify_param(recinfo_t *info, char *name);
|
|
Packit |
eace71 |
extern int idbm_rec_update_param(recinfo_t *info, char *name, char *value,
|
|
Packit |
eace71 |
int line_number);
|
|
Packit |
eace71 |
extern void idbm_recinfo_node(node_rec_t *r, recinfo_t *ri);
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
enum {
|
|
Packit |
eace71 |
IDBM_PRINT_TYPE_DISCOVERY,
|
|
Packit |
eace71 |
IDBM_PRINT_TYPE_NODE,
|
|
Packit |
eace71 |
IDBM_PRINT_TYPE_IFACE,
|
|
Packit |
eace71 |
IDBM_PRINT_TYPE_HOST_CHAP,
|
|
Packit |
eace71 |
IDBM_PRINT_TYPE_FLASHNODE
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
extern void idbm_print(int type, void *rec, int show, FILE *f);
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
struct boot_context;
|
|
Packit |
eace71 |
extern struct node_rec *idbm_create_rec(char *targetname, int tpgt,
|
|
Packit |
eace71 |
char *ip, int port,
|
|
Packit |
eace71 |
struct iface_rec *iface,
|
|
Packit |
eace71 |
int verbose);
|
|
Packit |
eace71 |
extern struct node_rec *
|
|
Packit |
eace71 |
idbm_create_rec_from_boot_context(struct boot_context *context);
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
extern int idbm_print_host_chap_info(struct iscsi_chap_rec *chap);
|
|
Packit |
eace71 |
extern void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri);
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
extern int idbm_print_flashnode_info(struct flashnode_rec *target);
|
|
Packit |
eace71 |
extern void idbm_recinfo_flashnode(struct flashnode_rec *r, recinfo_t *ri);
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
#endif /* IDBM_H */
|