Blame view
net/rds/transport.c
4.47 KB
0fbc78cbf RDS: Transport code |
1 |
/* |
eee2fa6ab rds: Changing IP ... |
2 |
* Copyright (c) 2006, 2017 Oracle and/or its affiliates. All rights reserved. |
0fbc78cbf RDS: Transport code |
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
* * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/in.h> |
eee2fa6ab rds: Changing IP ... |
36 |
#include <linux/ipv6.h> |
0fbc78cbf RDS: Transport code |
37 38 39 |
#include "rds.h" #include "loop.h" |
4c342f778 rds: transport mo... |
40 41 42 43 44 |
static char * const rds_trans_modules[] = { [RDS_TRANS_IB] = "rds_rdma", [RDS_TRANS_GAP] = NULL, [RDS_TRANS_TCP] = "rds_tcp", }; |
335776bd6 RDS: Track transp... |
45 |
static struct rds_transport *transports[RDS_TRANS_COUNT]; |
0fbc78cbf RDS: Transport code |
46 |
static DECLARE_RWSEM(rds_trans_sem); |
a8d63a53b rds: remove unnec... |
47 |
void rds_trans_register(struct rds_transport *trans) |
0fbc78cbf RDS: Transport code |
48 49 50 51 |
{ BUG_ON(strlen(trans->t_name) + 1 > TRANSNAMSIZ); down_write(&rds_trans_sem); |
335776bd6 RDS: Track transp... |
52 53 54 55 56 57 58 59 60 |
if (transports[trans->t_type]) printk(KERN_ERR "RDS Transport type %d already registered ", trans->t_type); else { transports[trans->t_type] = trans; printk(KERN_INFO "Registered RDS/%s transport ", trans->t_name); } |
0fbc78cbf RDS: Transport code |
61 62 |
up_write(&rds_trans_sem); |
0fbc78cbf RDS: Transport code |
63 |
} |
616b757ae RDS: Export symbo... |
64 |
EXPORT_SYMBOL_GPL(rds_trans_register); |
0fbc78cbf RDS: Transport code |
65 66 67 68 |
void rds_trans_unregister(struct rds_transport *trans) { down_write(&rds_trans_sem); |
335776bd6 RDS: Track transp... |
69 |
transports[trans->t_type] = NULL; |
0fbc78cbf RDS: Transport code |
70 71 72 73 74 |
printk(KERN_INFO "Unregistered RDS/%s transport ", trans->t_name); up_write(&rds_trans_sem); } |
616b757ae RDS: Export symbo... |
75 |
EXPORT_SYMBOL_GPL(rds_trans_unregister); |
0fbc78cbf RDS: Transport code |
76 |
|
5adb5bc65 RDS: have sockets... |
77 78 |
void rds_trans_put(struct rds_transport *trans) { |
f6e1c9166 net-RDS: Delete a... |
79 |
if (trans) |
5adb5bc65 RDS: have sockets... |
80 81 |
module_put(trans->t_owner); } |
eee2fa6ab rds: Changing IP ... |
82 83 84 |
struct rds_transport *rds_trans_get_preferred(struct net *net, const struct in6_addr *addr, __u32 scope_id) |
0fbc78cbf RDS: Transport code |
85 |
{ |
0fbc78cbf RDS: Transport code |
86 |
struct rds_transport *ret = NULL; |
5adb5bc65 RDS: have sockets... |
87 88 |
struct rds_transport *trans; unsigned int i; |
0fbc78cbf RDS: Transport code |
89 |
|
eee2fa6ab rds: Changing IP ... |
90 91 92 93 |
if (ipv6_addr_v4mapped(addr)) { if (*(u_int8_t *)&addr->s6_addr32[3] == IN_LOOPBACKNET) return &rds_loop_transport; } else if (ipv6_addr_loopback(addr)) { |
0fbc78cbf RDS: Transport code |
94 |
return &rds_loop_transport; |
eee2fa6ab rds: Changing IP ... |
95 |
} |
0fbc78cbf RDS: Transport code |
96 97 |
down_read(&rds_trans_sem); |
5adb5bc65 RDS: have sockets... |
98 99 |
for (i = 0; i < RDS_TRANS_COUNT; i++) { trans = transports[i]; |
eee2fa6ab rds: Changing IP ... |
100 |
if (trans && (trans->laddr_check(net, addr, scope_id) == 0) && |
5adb5bc65 RDS: have sockets... |
101 102 |
(!trans->t_owner || try_module_get(trans->t_owner))) { ret = trans; |
0fbc78cbf RDS: Transport code |
103 104 105 106 107 108 109 |
break; } } up_read(&rds_trans_sem); return ret; } |
d97dac54b net/rds: Add sets... |
110 111 112 113 |
struct rds_transport *rds_trans_get(int t_type) { struct rds_transport *ret = NULL; struct rds_transport *trans; |
d97dac54b net/rds: Add sets... |
114 115 |
down_read(&rds_trans_sem); |
4c342f778 rds: transport mo... |
116 117 118 119 120 121 122 |
trans = transports[t_type]; if (!trans) { up_read(&rds_trans_sem); if (rds_trans_modules[t_type]) request_module(rds_trans_modules[t_type]); down_read(&rds_trans_sem); trans = transports[t_type]; |
d97dac54b net/rds: Add sets... |
123 |
} |
4c342f778 rds: transport mo... |
124 125 126 |
if (trans && trans->t_type == t_type && (!trans->t_owner || try_module_get(trans->t_owner))) ret = trans; |
d97dac54b net/rds: Add sets... |
127 128 129 130 |
up_read(&rds_trans_sem); return ret; } |
0fbc78cbf RDS: Transport code |
131 132 133 134 135 136 137 138 139 140 141 142 143 |
/* * This returns the number of stats entries in the snapshot and only * copies them using the iter if there is enough space for them. The * caller passes in the global stats so that we can size and copy while * holding the lock. */ unsigned int rds_trans_stats_info_copy(struct rds_info_iterator *iter, unsigned int avail) { struct rds_transport *trans; unsigned int total = 0; unsigned int part; |
335776bd6 RDS: Track transp... |
144 |
int i; |
0fbc78cbf RDS: Transport code |
145 146 147 |
rds_info_iter_unmap(iter); down_read(&rds_trans_sem); |
5c3da57d7 net: rds: fix cod... |
148 |
for (i = 0; i < RDS_TRANS_COUNT; i++) { |
335776bd6 RDS: Track transp... |
149 150 |
trans = transports[i]; if (!trans || !trans->stats_info_copy) |
0fbc78cbf RDS: Transport code |
151 152 153 154 155 156 157 158 159 160 161 |
continue; part = trans->stats_info_copy(iter, avail); avail -= min(avail, part); total += part; } up_read(&rds_trans_sem); return total; } |