Blame usr/idbm.h

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 */