1/*	$NetBSD: ffs_wapbl.c,v 1.12 2009/02/22 20:28:06 ad Exp $	*/
2
3/*-
4 * Copyright (c) 2004,2009 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Wasabi Systems, Inc.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31/*
32 * isns_task.h
33 */
34
35#ifndef _ISNS_TASK_H_
36#define _ISNS_TASK_H_
37
38#include <sys/event.h>
39
40#define ISNS_TASK_DISCOVER_SERVER	0
41#define ISNS_TASK_RECONNECT_SERVER	1
42#define ISNS_TASK_SEND_PDU		2
43#define ISNS_TASK_INIT_SOCKET_IO	3
44#define ISNS_TASK_INIT_REFRESH		4
45#define ISNS_NUM_TASKS			5
46
47
48union isns_task_var_u {
49	struct {
50		struct isns_trans_s *trans_p;
51		struct isns_pdu_s *pdu_p;
52	} send_pdu;
53
54	struct {
55		struct addrinfo *ai_p;
56	} reconnect_server;
57
58	struct {
59		isns_socket_t sd;
60		struct addrinfo *ai_p;
61	} init_socket_io;
62
63	struct {
64		struct isns_refresh_s *ref_p;
65	} init_refresh;
66
67	void *data_p;
68};
69
70struct isns_task_s {
71	uint8_t task_type;
72	struct isns_config_s *cfg_p;
73	union isns_task_var_u var;
74
75	int waitable;
76	pthread_mutex_t wait_mutex;
77	pthread_cond_t wait_condvar;
78	int wait_ref_count;
79
80	SIMPLEQ_ENTRY(isns_task_s) taskq_entry;
81};
82
83typedef void (isns_task_handler)(struct isns_task_s *);
84
85void isns_run_task(struct isns_task_s *);
86void isns_end_task(struct isns_task_s *);
87int isns_wait_task(struct isns_task_s *, const struct timespec *);
88
89struct isns_task_s *isns_new_task(struct isns_config_s *, uint8_t, int);
90void isns_free_task(struct isns_task_s *);
91void isns_taskq_insert_tail(struct isns_config_s *, struct isns_task_s *);
92void isns_taskq_insert_head(struct isns_config_s *, struct isns_task_s *);
93struct isns_task_s *isns_taskq_remove(struct isns_config_s *);
94struct isns_task_s *isns_taskq_remove_trans(struct isns_config_s *, uint16_t);
95
96
97#endif /* !_ISNS_TASK_H_ */
98