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