1*9e39c5baSBill Taylor /*
2*9e39c5baSBill Taylor  * CDDL HEADER START
3*9e39c5baSBill Taylor  *
4*9e39c5baSBill Taylor  * The contents of this file are subject to the terms of the
5*9e39c5baSBill Taylor  * Common Development and Distribution License (the "License").
6*9e39c5baSBill Taylor  * You may not use this file except in compliance with the License.
7*9e39c5baSBill Taylor  *
8*9e39c5baSBill Taylor  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*9e39c5baSBill Taylor  * or http://www.opensolaris.org/os/licensing.
10*9e39c5baSBill Taylor  * See the License for the specific language governing permissions
11*9e39c5baSBill Taylor  * and limitations under the License.
12*9e39c5baSBill Taylor  *
13*9e39c5baSBill Taylor  * When distributing Covered Code, include this CDDL HEADER in each
14*9e39c5baSBill Taylor  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*9e39c5baSBill Taylor  * If applicable, add the following below this CDDL HEADER, with the
16*9e39c5baSBill Taylor  * fields enclosed by brackets "[]" replaced with your own identifying
17*9e39c5baSBill Taylor  * information: Portions Copyright [yyyy] [name of copyright owner]
18*9e39c5baSBill Taylor  *
19*9e39c5baSBill Taylor  * CDDL HEADER END
20*9e39c5baSBill Taylor  */
21*9e39c5baSBill Taylor 
22*9e39c5baSBill Taylor /*
23*9e39c5baSBill Taylor  * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
24*9e39c5baSBill Taylor  */
25*9e39c5baSBill Taylor 
26*9e39c5baSBill Taylor /*
27*9e39c5baSBill Taylor  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
28*9e39c5baSBill Taylor  * Use is subject to license terms.
29*9e39c5baSBill Taylor  */
30*9e39c5baSBill Taylor 
31*9e39c5baSBill Taylor /*
32*9e39c5baSBill Taylor  *
33*9e39c5baSBill Taylor  * MODULE: dapl_provider.c
34*9e39c5baSBill Taylor  *
35*9e39c5baSBill Taylor  * PURPOSE: Provider function table
36*9e39c5baSBill Taylor  * Description: DAT Interfaces to this provider
37*9e39c5baSBill Taylor  *
38*9e39c5baSBill Taylor  * $Id: dapl_provider.c,v 1.7 2003/08/08 19:42:54 sjs2 Exp $
39*9e39c5baSBill Taylor  */
40*9e39c5baSBill Taylor 
41*9e39c5baSBill Taylor #include "dapl_provider.h"
42*9e39c5baSBill Taylor 
43*9e39c5baSBill Taylor 
44*9e39c5baSBill Taylor /*
45*9e39c5baSBill Taylor  *
46*9e39c5baSBill Taylor  * Global Data
47*9e39c5baSBill Taylor  *
48*9e39c5baSBill Taylor  */
49*9e39c5baSBill Taylor 
50*9e39c5baSBill Taylor DAPL_PROVIDER_LIST 		g_dapl_provider_list;
51*9e39c5baSBill Taylor 
52*9e39c5baSBill Taylor 
53*9e39c5baSBill Taylor /*
54*9e39c5baSBill Taylor  * the function table for this provider
55*9e39c5baSBill Taylor  */
56*9e39c5baSBill Taylor 
57*9e39c5baSBill Taylor DAT_PROVIDER g_dapl_provider_template =
58*9e39c5baSBill Taylor {
59*9e39c5baSBill Taylor 	NULL,
60*9e39c5baSBill Taylor 	0,
61*9e39c5baSBill Taylor 	&dapl_ia_open,
62*9e39c5baSBill Taylor 	&dapl_ia_query,
63*9e39c5baSBill Taylor 	&dapl_ia_close,
64*9e39c5baSBill Taylor 
65*9e39c5baSBill Taylor 	&dapl_set_consumer_context,
66*9e39c5baSBill Taylor 	&dapl_get_consumer_context,
67*9e39c5baSBill Taylor 	&dapl_get_handle_type,
68*9e39c5baSBill Taylor 
69*9e39c5baSBill Taylor 	&dapl_cno_create,
70*9e39c5baSBill Taylor 	&dapl_cno_modify_agent,
71*9e39c5baSBill Taylor 	&dapl_cno_query,
72*9e39c5baSBill Taylor 	&dapl_cno_free,
73*9e39c5baSBill Taylor 	&dapl_cno_wait,
74*9e39c5baSBill Taylor 
75*9e39c5baSBill Taylor 	&dapl_cr_query,
76*9e39c5baSBill Taylor 	&dapl_cr_accept,
77*9e39c5baSBill Taylor 	&dapl_cr_reject,
78*9e39c5baSBill Taylor 	&dapl_cr_handoff,
79*9e39c5baSBill Taylor 
80*9e39c5baSBill Taylor 	&dapl_evd_create,
81*9e39c5baSBill Taylor 	&dapl_evd_query,
82*9e39c5baSBill Taylor 	&dapl_evd_modify_cno,
83*9e39c5baSBill Taylor 	&dapl_evd_enable,
84*9e39c5baSBill Taylor 	&dapl_evd_disable,
85*9e39c5baSBill Taylor 	&dapl_evd_wait,
86*9e39c5baSBill Taylor 	&dapl_evd_resize,
87*9e39c5baSBill Taylor 	&dapl_evd_post_se,
88*9e39c5baSBill Taylor 	&dapl_evd_dequeue,
89*9e39c5baSBill Taylor 	&dapl_evd_free,
90*9e39c5baSBill Taylor 
91*9e39c5baSBill Taylor 	&dapl_ep_create,
92*9e39c5baSBill Taylor 	&dapl_ep_query,
93*9e39c5baSBill Taylor 	&dapl_ep_modify,
94*9e39c5baSBill Taylor 	&dapl_ep_connect,
95*9e39c5baSBill Taylor 	&dapl_ep_dup_connect,
96*9e39c5baSBill Taylor 	&dapl_ep_disconnect,
97*9e39c5baSBill Taylor 	&dapl_ep_post_send,
98*9e39c5baSBill Taylor 	&dapl_ep_post_recv,
99*9e39c5baSBill Taylor 	&dapl_ep_post_rdma_read,
100*9e39c5baSBill Taylor 	&dapl_ep_post_rdma_write,
101*9e39c5baSBill Taylor 	&dapl_ep_get_status,
102*9e39c5baSBill Taylor 	&dapl_ep_free,
103*9e39c5baSBill Taylor 
104*9e39c5baSBill Taylor 	&dapl_lmr_create,
105*9e39c5baSBill Taylor 	&dapl_lmr_query,
106*9e39c5baSBill Taylor 	&dapl_lmr_free,
107*9e39c5baSBill Taylor 
108*9e39c5baSBill Taylor 	&dapl_rmr_create,
109*9e39c5baSBill Taylor 	&dapl_rmr_query,
110*9e39c5baSBill Taylor 	&dapl_rmr_bind,
111*9e39c5baSBill Taylor 	&dapl_rmr_free,
112*9e39c5baSBill Taylor 
113*9e39c5baSBill Taylor 	&dapl_psp_create,
114*9e39c5baSBill Taylor 	&dapl_psp_query,
115*9e39c5baSBill Taylor 	&dapl_psp_free,
116*9e39c5baSBill Taylor 
117*9e39c5baSBill Taylor 	&dapl_rsp_create,
118*9e39c5baSBill Taylor 	&dapl_rsp_query,
119*9e39c5baSBill Taylor 	&dapl_rsp_free,
120*9e39c5baSBill Taylor 
121*9e39c5baSBill Taylor 	&dapl_pz_create,
122*9e39c5baSBill Taylor 	&dapl_pz_query,
123*9e39c5baSBill Taylor 	&dapl_pz_free,
124*9e39c5baSBill Taylor 
125*9e39c5baSBill Taylor 	&dapl_psp_create_any,
126*9e39c5baSBill Taylor 	&dapl_ep_reset,
127*9e39c5baSBill Taylor 	&dapl_evd_set_unwaitable,
128*9e39c5baSBill Taylor 	&dapl_evd_clear_unwaitable,
129*9e39c5baSBill Taylor 
130*9e39c5baSBill Taylor 	&dapl_lmr_sync_rdma_read,
131*9e39c5baSBill Taylor 	&dapl_lmr_sync_rdma_write,
132*9e39c5baSBill Taylor 
133*9e39c5baSBill Taylor 	&dapl_ep_create_with_srq,
134*9e39c5baSBill Taylor 	&dapl_ep_recv_query,
135*9e39c5baSBill Taylor 	&dapl_ep_set_watermark,
136*9e39c5baSBill Taylor 
137*9e39c5baSBill Taylor 	&dapl_srq_create,
138*9e39c5baSBill Taylor 	&dapl_srq_free,
139*9e39c5baSBill Taylor 	&dapl_srq_post_recv,
140*9e39c5baSBill Taylor 	&dapl_srq_query,
141*9e39c5baSBill Taylor 	&dapl_srq_resize,
142*9e39c5baSBill Taylor 	&dapl_srq_set_lw
143*9e39c5baSBill Taylor };
144*9e39c5baSBill Taylor 
145*9e39c5baSBill Taylor 
146*9e39c5baSBill Taylor 
147*9e39c5baSBill Taylor /*
148*9e39c5baSBill Taylor  *
149*9e39c5baSBill Taylor  * Function Prototypes
150*9e39c5baSBill Taylor  *
151*9e39c5baSBill Taylor  */
152*9e39c5baSBill Taylor 
153*9e39c5baSBill Taylor static DAT_BOOLEAN
154*9e39c5baSBill Taylor dapl_provider_list_key_cmp(
155*9e39c5baSBill Taylor     const char *name_a,
156*9e39c5baSBill Taylor     const char *name_b);
157*9e39c5baSBill Taylor 
158*9e39c5baSBill Taylor 
159*9e39c5baSBill Taylor /*
160*9e39c5baSBill Taylor  *
161*9e39c5baSBill Taylor  * Function Definitions
162*9e39c5baSBill Taylor  *
163*9e39c5baSBill Taylor  */
164*9e39c5baSBill Taylor 
165*9e39c5baSBill Taylor DAT_RETURN
dapl_provider_list_create(void)166*9e39c5baSBill Taylor dapl_provider_list_create(void)
167*9e39c5baSBill Taylor {
168*9e39c5baSBill Taylor 	DAT_RETURN status;
169*9e39c5baSBill Taylor 
170*9e39c5baSBill Taylor 	status = DAT_SUCCESS;
171*9e39c5baSBill Taylor 
172*9e39c5baSBill Taylor 	/* create the head node */
173*9e39c5baSBill Taylor 	g_dapl_provider_list.head = dapl_os_alloc(
174*9e39c5baSBill Taylor 	    sizeof (DAPL_PROVIDER_LIST_NODE));
175*9e39c5baSBill Taylor 	if (NULL == g_dapl_provider_list.head) {
176*9e39c5baSBill Taylor 		status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
177*9e39c5baSBill Taylor 		    DAT_RESOURCE_MEMORY);
178*9e39c5baSBill Taylor 		goto bail;
179*9e39c5baSBill Taylor 	}
180*9e39c5baSBill Taylor 
181*9e39c5baSBill Taylor 	(void) dapl_os_memzero(g_dapl_provider_list.head,
182*9e39c5baSBill Taylor 	    sizeof (DAPL_PROVIDER_LIST_NODE));
183*9e39c5baSBill Taylor 
184*9e39c5baSBill Taylor 	/* create the tail node */
185*9e39c5baSBill Taylor 	g_dapl_provider_list.tail = dapl_os_alloc(
186*9e39c5baSBill Taylor 	    sizeof (DAPL_PROVIDER_LIST_NODE));
187*9e39c5baSBill Taylor 	if (NULL == g_dapl_provider_list.tail) {
188*9e39c5baSBill Taylor 		status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
189*9e39c5baSBill Taylor 		    DAT_RESOURCE_MEMORY);
190*9e39c5baSBill Taylor 		goto bail;
191*9e39c5baSBill Taylor 	}
192*9e39c5baSBill Taylor 
193*9e39c5baSBill Taylor 	(void) dapl_os_memzero(g_dapl_provider_list.tail,
194*9e39c5baSBill Taylor 	    sizeof (DAPL_PROVIDER_LIST_NODE));
195*9e39c5baSBill Taylor 
196*9e39c5baSBill Taylor 	g_dapl_provider_list.head->next = g_dapl_provider_list.tail;
197*9e39c5baSBill Taylor 	g_dapl_provider_list.tail->prev = g_dapl_provider_list.head;
198*9e39c5baSBill Taylor 	g_dapl_provider_list.size = 0;
199*9e39c5baSBill Taylor 
200*9e39c5baSBill Taylor bail:
201*9e39c5baSBill Taylor 	if (DAT_SUCCESS != status) {
202*9e39c5baSBill Taylor 		if (NULL != g_dapl_provider_list.head) {
203*9e39c5baSBill Taylor 			dapl_os_free(g_dapl_provider_list.head,
204*9e39c5baSBill Taylor 			    sizeof (DAPL_PROVIDER_LIST_NODE));
205*9e39c5baSBill Taylor 		}
206*9e39c5baSBill Taylor 
207*9e39c5baSBill Taylor 		if (NULL != g_dapl_provider_list.tail) {
208*9e39c5baSBill Taylor 			dapl_os_free(g_dapl_provider_list.tail,
209*9e39c5baSBill Taylor 			    sizeof (DAPL_PROVIDER_LIST_NODE));
210*9e39c5baSBill Taylor 		}
211*9e39c5baSBill Taylor 	}
212*9e39c5baSBill Taylor 
213*9e39c5baSBill Taylor 	return (status);
214*9e39c5baSBill Taylor }
215*9e39c5baSBill Taylor 
216*9e39c5baSBill Taylor 
217*9e39c5baSBill Taylor DAT_RETURN
dapl_provider_list_destroy(void)218*9e39c5baSBill Taylor dapl_provider_list_destroy(void)
219*9e39c5baSBill Taylor {
220*9e39c5baSBill Taylor 	DAPL_PROVIDER_LIST_NODE *cur_node;
221*9e39c5baSBill Taylor 
222*9e39c5baSBill Taylor 	while (NULL != g_dapl_provider_list.head) {
223*9e39c5baSBill Taylor 		cur_node = g_dapl_provider_list.head;
224*9e39c5baSBill Taylor 		g_dapl_provider_list.head = cur_node->next;
225*9e39c5baSBill Taylor 
226*9e39c5baSBill Taylor 		dapl_os_free(cur_node, sizeof (DAPL_PROVIDER_LIST_NODE));
227*9e39c5baSBill Taylor 	}
228*9e39c5baSBill Taylor 
229*9e39c5baSBill Taylor 	return (DAT_SUCCESS);
230*9e39c5baSBill Taylor }
231*9e39c5baSBill Taylor 
232*9e39c5baSBill Taylor 
233*9e39c5baSBill Taylor DAT_COUNT
dapl_provider_list_size(void)234*9e39c5baSBill Taylor dapl_provider_list_size(void)
235*9e39c5baSBill Taylor {
236*9e39c5baSBill Taylor 	return (g_dapl_provider_list.size);
237*9e39c5baSBill Taylor }
238*9e39c5baSBill Taylor 
239*9e39c5baSBill Taylor 
240*9e39c5baSBill Taylor DAT_RETURN
dapl_provider_list_insert(IN const char * name,IN DAT_PROVIDER ** p_data)241*9e39c5baSBill Taylor dapl_provider_list_insert(
242*9e39c5baSBill Taylor     IN  const char *name,
243*9e39c5baSBill Taylor     IN  DAT_PROVIDER **p_data)
244*9e39c5baSBill Taylor {
245*9e39c5baSBill Taylor 	DAPL_PROVIDER_LIST_NODE *cur_node, *prev_node, *next_node;
246*9e39c5baSBill Taylor 	DAT_RETURN status;
247*9e39c5baSBill Taylor 	unsigned int len;
248*9e39c5baSBill Taylor 
249*9e39c5baSBill Taylor 	status = DAT_SUCCESS;
250*9e39c5baSBill Taylor 	*p_data = NULL;
251*9e39c5baSBill Taylor 
252*9e39c5baSBill Taylor 	cur_node = dapl_os_alloc(sizeof (DAPL_PROVIDER_LIST_NODE));
253*9e39c5baSBill Taylor 
254*9e39c5baSBill Taylor 	if (NULL == cur_node) {
255*9e39c5baSBill Taylor 		status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
256*9e39c5baSBill Taylor 		    DAT_RESOURCE_MEMORY);
257*9e39c5baSBill Taylor 		goto bail;
258*9e39c5baSBill Taylor 	}
259*9e39c5baSBill Taylor 
260*9e39c5baSBill Taylor 	len = dapl_os_strlen(name);
261*9e39c5baSBill Taylor 
262*9e39c5baSBill Taylor 	if (DAT_NAME_MAX_LENGTH <= len) {
263*9e39c5baSBill Taylor 		status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
264*9e39c5baSBill Taylor 		    DAT_RESOURCE_MEMORY);
265*9e39c5baSBill Taylor 		goto bail;
266*9e39c5baSBill Taylor 	}
267*9e39c5baSBill Taylor 
268*9e39c5baSBill Taylor 	/* insert node at end of list to preserve registration order */
269*9e39c5baSBill Taylor 	prev_node = g_dapl_provider_list.tail->prev;
270*9e39c5baSBill Taylor 	next_node = g_dapl_provider_list.tail;
271*9e39c5baSBill Taylor 
272*9e39c5baSBill Taylor 	(void) dapl_os_memcpy(cur_node->name, name, len);
273*9e39c5baSBill Taylor 	cur_node->name[len] = '\0';
274*9e39c5baSBill Taylor 	cur_node->data = g_dapl_provider_template;
275*9e39c5baSBill Taylor 	cur_node->data.device_name = cur_node->name;
276*9e39c5baSBill Taylor 	cur_node->next = next_node;
277*9e39c5baSBill Taylor 	cur_node->prev = prev_node;
278*9e39c5baSBill Taylor 
279*9e39c5baSBill Taylor 	prev_node->next = cur_node;
280*9e39c5baSBill Taylor 	next_node->prev = cur_node;
281*9e39c5baSBill Taylor 
282*9e39c5baSBill Taylor 	g_dapl_provider_list.size++;
283*9e39c5baSBill Taylor 
284*9e39c5baSBill Taylor 	if (NULL != p_data) {
285*9e39c5baSBill Taylor 		*p_data = &cur_node->data;
286*9e39c5baSBill Taylor 	}
287*9e39c5baSBill Taylor 
288*9e39c5baSBill Taylor bail:
289*9e39c5baSBill Taylor 	if (DAT_SUCCESS != status) {
290*9e39c5baSBill Taylor 		if (NULL != cur_node) {
291*9e39c5baSBill Taylor 			dapl_os_free(cur_node,
292*9e39c5baSBill Taylor 			    sizeof (DAPL_PROVIDER_LIST_NODE));
293*9e39c5baSBill Taylor 		}
294*9e39c5baSBill Taylor 	}
295*9e39c5baSBill Taylor 
296*9e39c5baSBill Taylor 	return (status);
297*9e39c5baSBill Taylor }
298*9e39c5baSBill Taylor 
299*9e39c5baSBill Taylor 
300*9e39c5baSBill Taylor DAT_RETURN
dapl_provider_list_search(IN const char * name,OUT DAT_PROVIDER ** p_data)301*9e39c5baSBill Taylor dapl_provider_list_search(
302*9e39c5baSBill Taylor     IN  const char *name,
303*9e39c5baSBill Taylor     OUT DAT_PROVIDER **p_data)
304*9e39c5baSBill Taylor {
305*9e39c5baSBill Taylor 	DAPL_PROVIDER_LIST_NODE *cur_node;
306*9e39c5baSBill Taylor 	DAT_RETURN		status;
307*9e39c5baSBill Taylor 
308*9e39c5baSBill Taylor 	status = DAT_ERROR(DAT_NAME_NOT_FOUND, 0);
309*9e39c5baSBill Taylor 
310*9e39c5baSBill Taylor 	for (cur_node = g_dapl_provider_list.head->next;
311*9e39c5baSBill Taylor 	    g_dapl_provider_list.tail != cur_node;
312*9e39c5baSBill Taylor 	    cur_node = cur_node->next) {
313*9e39c5baSBill Taylor 		if (dapl_provider_list_key_cmp(cur_node->name, name)) {
314*9e39c5baSBill Taylor 			if (NULL != p_data) {
315*9e39c5baSBill Taylor 				*p_data = &cur_node->data;
316*9e39c5baSBill Taylor 			}
317*9e39c5baSBill Taylor 
318*9e39c5baSBill Taylor 			status = DAT_SUCCESS;
319*9e39c5baSBill Taylor 			goto bail;
320*9e39c5baSBill Taylor 		}
321*9e39c5baSBill Taylor 	}
322*9e39c5baSBill Taylor 
323*9e39c5baSBill Taylor bail:
324*9e39c5baSBill Taylor 	return (status);
325*9e39c5baSBill Taylor }
326*9e39c5baSBill Taylor 
327*9e39c5baSBill Taylor 
328*9e39c5baSBill Taylor DAT_RETURN
dapl_provider_list_remove(IN const char * name)329*9e39c5baSBill Taylor dapl_provider_list_remove(
330*9e39c5baSBill Taylor     IN  const char *name)
331*9e39c5baSBill Taylor {
332*9e39c5baSBill Taylor 	DAPL_PROVIDER_LIST_NODE *cur_node, *prev_node, *next_node;
333*9e39c5baSBill Taylor 	DAT_RETURN status;
334*9e39c5baSBill Taylor 
335*9e39c5baSBill Taylor 	status = DAT_ERROR(DAT_NAME_NOT_FOUND, 0);
336*9e39c5baSBill Taylor 
337*9e39c5baSBill Taylor 	for (cur_node = g_dapl_provider_list.head->next;
338*9e39c5baSBill Taylor 	    g_dapl_provider_list.tail != cur_node;
339*9e39c5baSBill Taylor 	    cur_node = cur_node->next) {
340*9e39c5baSBill Taylor 		if (dapl_provider_list_key_cmp(cur_node->name, name)) {
341*9e39c5baSBill Taylor 			prev_node = cur_node->prev;
342*9e39c5baSBill Taylor 			next_node = cur_node->next;
343*9e39c5baSBill Taylor 
344*9e39c5baSBill Taylor 			prev_node->next = next_node;
345*9e39c5baSBill Taylor 			next_node->prev = prev_node;
346*9e39c5baSBill Taylor 
347*9e39c5baSBill Taylor 			dapl_os_free(cur_node,
348*9e39c5baSBill Taylor 			    sizeof (DAPL_PROVIDER_LIST_NODE));
349*9e39c5baSBill Taylor 
350*9e39c5baSBill Taylor 			g_dapl_provider_list.size--;
351*9e39c5baSBill Taylor 
352*9e39c5baSBill Taylor 			status = DAT_SUCCESS;
353*9e39c5baSBill Taylor 			goto bail;
354*9e39c5baSBill Taylor 		}
355*9e39c5baSBill Taylor 	}
356*9e39c5baSBill Taylor 
357*9e39c5baSBill Taylor bail:
358*9e39c5baSBill Taylor 	return (status);
359*9e39c5baSBill Taylor }
360*9e39c5baSBill Taylor 
361*9e39c5baSBill Taylor 
362*9e39c5baSBill Taylor DAT_BOOLEAN
dapl_provider_list_key_cmp(const char * name_a,const char * name_b)363*9e39c5baSBill Taylor dapl_provider_list_key_cmp(
364*9e39c5baSBill Taylor     const char *name_a,
365*9e39c5baSBill Taylor     const char *name_b)
366*9e39c5baSBill Taylor {
367*9e39c5baSBill Taylor 	unsigned int len;
368*9e39c5baSBill Taylor 
369*9e39c5baSBill Taylor 	len = dapl_os_strlen(name_a);
370*9e39c5baSBill Taylor 
371*9e39c5baSBill Taylor 	if (dapl_os_strlen(name_b) != len) {
372*9e39c5baSBill Taylor 		return (DAT_FALSE);
373*9e39c5baSBill Taylor 	} else if (dapl_os_memcmp(name_a, name_b, len)) {
374*9e39c5baSBill Taylor 		return (DAT_FALSE);
375*9e39c5baSBill Taylor 	} else {
376*9e39c5baSBill Taylor 		return (DAT_TRUE);
377*9e39c5baSBill Taylor 	}
378*9e39c5baSBill Taylor }
379