9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or http://www.opensolaris.org/os/licensing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Use is subject to license terms.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * MODULE: dapl_provider.c
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PURPOSE: Provider function table
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Description: DAT Interfaces to this provider
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * $Id: dapl_provider.c,v 1.7 2003/08/08 19:42:54 sjs2 Exp $
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_provider.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Global Data
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAPL_PROVIDER_LIST g_dapl_provider_list;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the function table for this provider
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_PROVIDER g_dapl_provider_template =
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor NULL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor 0,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ia_open,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ia_query,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ia_close,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_set_consumer_context,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_get_consumer_context,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_get_handle_type,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_cno_create,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_cno_modify_agent,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_cno_query,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_cno_free,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_cno_wait,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_cr_query,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_cr_accept,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_cr_reject,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_cr_handoff,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_evd_create,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_evd_query,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_evd_modify_cno,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_evd_enable,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_evd_disable,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_evd_wait,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_evd_resize,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_evd_post_se,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_evd_dequeue,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_evd_free,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_create,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_query,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_modify,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_connect,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_dup_connect,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_disconnect,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_post_send,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_post_recv,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_post_rdma_read,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_post_rdma_write,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_get_status,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_free,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_lmr_create,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_lmr_query,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_lmr_free,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_rmr_create,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_rmr_query,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_rmr_bind,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_rmr_free,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_psp_create,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_psp_query,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_psp_free,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_rsp_create,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_rsp_query,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_rsp_free,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_pz_create,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_pz_query,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_pz_free,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_psp_create_any,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_reset,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_evd_set_unwaitable,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_evd_clear_unwaitable,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_lmr_sync_rdma_read,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_lmr_sync_rdma_write,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_create_with_srq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_recv_query,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_ep_set_watermark,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_srq_create,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_srq_free,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_srq_post_recv,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_srq_query,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_srq_resize,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &dapl_srq_set_lw
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor};
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Function Prototypes
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic DAT_BOOLEAN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_provider_list_key_cmp(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor const char *name_a,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor const char *name_b);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Function Definitions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_provider_list_create(void)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RETURN status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = DAT_SUCCESS;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* create the head node */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_dapl_provider_list.head = dapl_os_alloc(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sizeof (DAPL_PROVIDER_LIST_NODE));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL == g_dapl_provider_list.head) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RESOURCE_MEMORY);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_memzero(g_dapl_provider_list.head,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sizeof (DAPL_PROVIDER_LIST_NODE));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* create the tail node */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_dapl_provider_list.tail = dapl_os_alloc(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sizeof (DAPL_PROVIDER_LIST_NODE));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL == g_dapl_provider_list.tail) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RESOURCE_MEMORY);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_memzero(g_dapl_provider_list.tail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sizeof (DAPL_PROVIDER_LIST_NODE));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_dapl_provider_list.head->next = g_dapl_provider_list.tail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_dapl_provider_list.tail->prev = g_dapl_provider_list.head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_dapl_provider_list.size = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorbail:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_SUCCESS != status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != g_dapl_provider_list.head) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_free(g_dapl_provider_list.head,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sizeof (DAPL_PROVIDER_LIST_NODE));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != g_dapl_provider_list.tail) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_free(g_dapl_provider_list.tail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sizeof (DAPL_PROVIDER_LIST_NODE));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_provider_list_destroy(void)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_PROVIDER_LIST_NODE *cur_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (NULL != g_dapl_provider_list.head) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cur_node = g_dapl_provider_list.head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_dapl_provider_list.head = cur_node->next;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_free(cur_node, sizeof (DAPL_PROVIDER_LIST_NODE));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_COUNT
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_provider_list_size(void)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (g_dapl_provider_list.size);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_provider_list_insert(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN const char *name,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_PROVIDER **p_data)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_PROVIDER_LIST_NODE *cur_node, *prev_node, *next_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RETURN status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor unsigned int len;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = DAT_SUCCESS;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *p_data = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cur_node = dapl_os_alloc(sizeof (DAPL_PROVIDER_LIST_NODE));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL == cur_node) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RESOURCE_MEMORY);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor len = dapl_os_strlen(name);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_NAME_MAX_LENGTH <= len) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RESOURCE_MEMORY);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* insert node at end of list to preserve registration order */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor prev_node = g_dapl_provider_list.tail->prev;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor next_node = g_dapl_provider_list.tail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_memcpy(cur_node->name, name, len);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cur_node->name[len] = '\0';
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cur_node->data = g_dapl_provider_template;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cur_node->data.device_name = cur_node->name;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cur_node->next = next_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cur_node->prev = prev_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor prev_node->next = cur_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor next_node->prev = cur_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_dapl_provider_list.size++;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != p_data) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *p_data = &cur_node->data;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorbail:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_SUCCESS != status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != cur_node) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_free(cur_node,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sizeof (DAPL_PROVIDER_LIST_NODE));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_provider_list_search(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN const char *name,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor OUT DAT_PROVIDER **p_data)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_PROVIDER_LIST_NODE *cur_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RETURN status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = DAT_ERROR(DAT_NAME_NOT_FOUND, 0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor for (cur_node = g_dapl_provider_list.head->next;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_dapl_provider_list.tail != cur_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cur_node = cur_node->next) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dapl_provider_list_key_cmp(cur_node->name, name)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != p_data) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *p_data = &cur_node->data;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = DAT_SUCCESS;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorbail:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_provider_list_remove(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN const char *name)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_PROVIDER_LIST_NODE *cur_node, *prev_node, *next_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RETURN status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = DAT_ERROR(DAT_NAME_NOT_FOUND, 0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor for (cur_node = g_dapl_provider_list.head->next;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_dapl_provider_list.tail != cur_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cur_node = cur_node->next) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dapl_provider_list_key_cmp(cur_node->name, name)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor prev_node = cur_node->prev;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor next_node = cur_node->next;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor prev_node->next = next_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor next_node->prev = prev_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_free(cur_node,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sizeof (DAPL_PROVIDER_LIST_NODE));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_dapl_provider_list.size--;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = DAT_SUCCESS;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorbail:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_BOOLEAN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_provider_list_key_cmp(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor const char *name_a,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor const char *name_b)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor unsigned int len;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor len = dapl_os_strlen(name_a);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dapl_os_strlen(name_b) != len) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_FALSE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else if (dapl_os_memcmp(name_a, name_b, len)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_FALSE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_TRUE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}