iscontrol.h revision 359754
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2005-2010 Daniel Braniss <danny@cs.huji.ac.il>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $FreeBSD: stable/11/sbin/iscontrol/iscontrol.h 359754 2020-04-09 20:38:36Z kevans $
29 */
30/*
31 | $Id: iscontrol.h,v 2.3 2007/04/27 08:36:49 danny Exp danny $
32 */
33#ifdef DEBUG
34int vflag;
35
36# define debug(level, fmt, args...)	do {if (level <= vflag) printf("%s: " fmt "\n", __func__ , ##args);} while(0)
37# define debug_called(level)		do {if (level <= vflag) printf("%s: called\n", __func__);} while(0)
38#else
39# define debug(level, fmt, args...)
40# define debug_called(level)
41#endif // DEBUG
42#define xdebug(fmt, args...)	printf("%s: " fmt "\n", __func__ , ##args)
43
44#define BIT(n)	(1 <<(n))
45
46#define MAXREDIRECTS	2
47
48typedef int auth_t(void *sess);
49
50typedef struct {
51     char      *address;
52     int       port;
53     int       pgt;
54} target_t;
55
56typedef struct isess {
57     int	flags;
58#define SESS_CONNECTED		BIT(0)
59#define SESS_DISCONNECT		BIT(1)
60#define SESS_LOGGEDIN		BIT(2)
61#define SESS_RECONNECT		BIT(3)
62#define SESS_REDIRECT		BIT(4)
63
64#define SESS_NEGODONE		BIT(10)	// XXX: kludge
65
66#define SESS_FULLFEATURE	BIT(29)
67#define SESS_INITIALLOGIN1	BIT(30)
68#define SESS_INITIALLOGIN	BIT(31)
69
70
71     isc_opt_t	*op;		// operational values
72     target_t  target;         // the Original target address
73     int	fd;		// the session fd
74     int	soc;		// the socket
75     iscsi_cam_t	cam;
76     struct cam_device	*camdev;
77
78     time_t	open_time;
79     int	redirect_cnt;
80     time_t	redirect_time;
81     int	reconnect_cnt;
82     int	reconnect_cnt1;
83     time_t	reconnect_time;
84     char	isid[6+1];
85     int	csg;		// current stage
86     int	nsg;		// next stage
87     // Phases/Stages
88#define	SN_PHASE	0	// Security Negotiation
89#define LON_PHASE	1	// Login Operational Negotiation
90#define FF_PHASE	3	// FuLL-Feature
91     uint	tsih;
92     sn_t	sn;
93} isess_t;
94
95typedef struct token {
96     char	*name;
97     int	val;
98} token_t;
99
100typedef enum {
101     NONE	= 0,
102     KRB5,
103     SPKM1,
104     SPKM2,
105     SRP,
106     CHAP
107} authm_t;
108
109extern token_t AuthMethods[];
110extern token_t DigestMethods[];
111
112typedef enum {
113     SET,
114     GET
115} oper_t;
116
117typedef enum {
118     U_PR,	// private
119     U_IO,	// Initialize Only -- during login
120     U_LO,	// Leading Only -- when TSIH is zero
121     U_FFPO,	// Full Feature Phase Only
122     U_ALL	// in any phase
123} usage_t;
124
125typedef enum {
126     S_PR,
127     S_CO,	// Connect only
128     S_SW	// Session Wide
129} scope_t;
130
131typedef void keyfun_t(isess_t *, oper_t);
132
133typedef struct {
134     usage_t	usage;
135     scope_t	scope;
136     char	*name;
137     int	tokenID;
138} textkey_t;
139
140typedef int handler_t(isess_t *sess, pdu_t *pp);
141
142int	authenticateLogin(isess_t *sess);
143int	fsm(isc_opt_t *op);
144int	sendPDU(isess_t *sess, pdu_t *pp, handler_t *hdlr);
145int	addText(pdu_t *pp, char *fmt, ...);
146void	freePDU(pdu_t *pp);
147int	xmitpdu(isess_t *sess, pdu_t *pp);
148int	recvpdu(isess_t *sess, pdu_t *pp);
149
150int	lookup(token_t *tbl, char *m);
151
152extern int	vflag;
153extern char	*iscsidev;
154
155void	parseArgs(int nargs, char **args, isc_opt_t *op);
156void	parseConfig(FILE *fd, char *key, isc_opt_t *op);
157
158char	*chapDigest(char *ap, char id, char *cp, char *chapSecret);
159char	*genChapChallenge(char *encoding, uint len);
160
161int	str2bin(char *str, char **rsp);
162char	*bin2str(char *fmt, unsigned char *md, int blen);
163
164int	negotiateOPV(isess_t *sess);
165int	setOptions(isess_t *sess, int flag);
166
167int	loginPhase(isess_t *sess);
168