1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 23 */ 24 25 /* 26 * Copyright (c) 2006 Oracle. All rights reserved. 27 * 28 * This software is available to you under a choice of one of two 29 * licenses. You may choose to be licensed under the terms of the GNU 30 * General Public License (GPL) Version 2, available from the file 31 * COPYING in the main directory of this source tree, or the 32 * OpenIB.org BSD license below: 33 * 34 * Redistribution and use in source and binary forms, with or 35 * without modification, are permitted provided that the following 36 * conditions are met: 37 * 38 * - Redistributions of source code must retain the above 39 * copyright notice, this list of conditions and the following 40 * disclaimer. 41 * 42 * - Redistributions in binary form must reproduce the above 43 * copyright notice, this list of conditions and the following 44 * disclaimer in the documentation and/or other materials 45 * provided with the distribution. 46 * 47 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 48 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 49 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 50 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 51 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 52 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 53 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 54 * SOFTWARE. 55 * 56 */ 57 #include <sys/ksynch.h> 58 #include <sys/list.h> 59 #include <sys/rds.h> 60 #include <sys/sysmacros.h> 61 62 #include <sys/ib/clients/rdsv3/rdsv3.h> 63 #include <sys/ib/clients/rdsv3/loop.h> 64 #include <sys/ib/clients/rdsv3/rdsv3_impl.h> 65 #include <sys/ib/clients/rdsv3/rdsv3_debug.h> 66 67 list_t transports; 68 krwlock_t trans_sem; /* this was a semaphore */ 69 70 int 71 rdsv3_trans_register(struct rdsv3_transport *trans) 72 { 73 RDSV3_DPRINTF4("rdsv3_trans_register", "Enter(trans: %p)", trans); 74 75 rw_enter(&trans_sem, RW_WRITER); 76 77 list_insert_tail(&transports, trans); 78 79 rw_exit(&trans_sem); 80 81 RDSV3_DPRINTF4("rdsv3_trans_register", "Return(trans: %p)", trans); 82 83 return (0); 84 } 85 86 void 87 rdsv3_trans_unregister(struct rdsv3_transport *trans) 88 { 89 RDSV3_DPRINTF4("rdsv3_trans_register", "Enter(trans: %p)", trans); 90 91 rw_enter(&trans_sem, RW_WRITER); 92 93 list_remove(&transports, trans); 94 95 rw_exit(&trans_sem); 96 97 RDSV3_DPRINTF4("rdsv3_trans_register", "Return(trans: %p)", trans); 98 } 99 100 struct rdsv3_transport * 101 rdsv3_trans_get_preferred(uint32_be_t addr) 102 { 103 struct rdsv3_transport *trans; 104 struct rdsv3_transport *ret = NULL; 105 106 RDSV3_DPRINTF4("rdsv3_trans_get_preferred", "Enter(addr: %x)", 107 ntohl(addr)); 108 109 if (rdsv3_isloopback(addr)) 110 return (&rdsv3_loop_transport); 111 112 rw_enter(&trans_sem, RW_READER); 113 RDSV3_FOR_EACH_LIST_NODE(trans, &transports, t_item) { 114 if (trans->laddr_check(addr) == 0) { 115 ret = trans; 116 break; 117 } 118 } 119 rw_exit(&trans_sem); 120 121 RDSV3_DPRINTF4("rdsv3_trans_get_preferred", 122 "Return(addr: %x, ret: %p)", ntohl(addr), ret); 123 124 return (ret); 125 } 126 127 /* 128 * This returns the number of stats entries in the snapshot and only 129 * copies them using the iter if there is enough space for them. The 130 * caller passes in the global stats so that we can size and copy while 131 * holding the lock. 132 */ 133 /* ARGSUSED */ 134 unsigned int 135 rdsv3_trans_stats_info_copy(struct rdsv3_info_iterator *iter, 136 unsigned int avail) 137 { 138 /* 139 * XXX - Add this when we port info (info.c) 140 */ 141 return (0); 142 } 143