Blame view
net/tipc/net.c
8.02 KB
b97bf3fd8 [TIPC] Initial merge |
1 2 |
/* * net/tipc/net.c: TIPC network routing code |
c43072852 [NET] TIPC: Fix w... |
3 |
* |
5a379074a tipc: introduce m... |
4 |
* Copyright (c) 1995-2006, 2014, Ericsson AB |
9df3b7eb6 tipc: Fix problem... |
5 |
* Copyright (c) 2005, 2010-2011, Wind River Systems |
b97bf3fd8 [TIPC] Initial merge |
6 7 8 9 10 |
* All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * |
9ea1fd3c1 [TIPC] License he... |
11 12 13 14 15 16 17 18 19 20 21 22 |
* 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the names of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. |
b97bf3fd8 [TIPC] Initial merge |
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
* * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "core.h" |
b97bf3fd8 [TIPC] Initial merge |
38 |
#include "net.h" |
b97bf3fd8 [TIPC] Initial merge |
39 40 |
#include "name_distr.h" #include "subscr.h" |
9816f0615 tipc: merge port ... |
41 |
#include "socket.h" |
672d99e19 tipc: Convert nod... |
42 |
#include "node.h" |
a6bf70f79 tipc: simplify in... |
43 |
#include "bcast.h" |
49cc66eae tipc: move netlin... |
44 |
#include "netlink.h" |
fd3cf2ad5 tipc: add net dum... |
45 |
|
c43072852 [NET] TIPC: Fix w... |
46 |
/* |
b97bf3fd8 [TIPC] Initial merge |
47 48 |
* The TIPC locking policy is designed to ensure a very fine locking * granularity, permitting complete parallel access to individual |
7216cd949 tipc: purge tipc_... |
49 |
* port and node/link instances. The code consists of four major |
b97bf3fd8 [TIPC] Initial merge |
50 51 |
* locking domains, each protected with their own disjunct set of locks. * |
7216cd949 tipc: purge tipc_... |
52 53 54 55 56 |
* 1: The bearer level. * RTNL lock is used to serialize the process of configuring bearer * on update side, and RCU lock is applied on read side to make * bearer instance valid on both paths of message transmission and * reception. |
b97bf3fd8 [TIPC] Initial merge |
57 |
* |
7216cd949 tipc: purge tipc_... |
58 59 60 61 62 63 64 65 66 |
* 2: The node and link level. * All node instances are saved into two tipc_node_list and node_htable * lists. The two lists are protected by node_list_lock on write side, * and they are guarded with RCU lock on read side. Especially node * instance is destroyed only when TIPC module is removed, and we can * confirm that there has no any user who is accessing the node at the * moment. Therefore, Except for iterating the two lists within RCU * protection, it's no needed to hold RCU that we access node instance * in other places. |
b97bf3fd8 [TIPC] Initial merge |
67 |
* |
7216cd949 tipc: purge tipc_... |
68 69 |
* In addition, all members in node structure including link instances * are protected by node spin lock. |
c43072852 [NET] TIPC: Fix w... |
70 |
* |
7216cd949 tipc: purge tipc_... |
71 72 73 74 |
* 3: The transport level of the protocol. * This consists of the structures port, (and its user level * representations, such as user_port and tipc_sock), reference and * tipc_user (port.c, reg.c, socket.c). |
b97bf3fd8 [TIPC] Initial merge |
75 |
* |
7216cd949 tipc: purge tipc_... |
76 |
* This layer has four different locks: |
b97bf3fd8 [TIPC] Initial merge |
77 |
* - The tipc_port spin_lock. This is protecting each port instance |
c43072852 [NET] TIPC: Fix w... |
78 79 |
* from parallel data access and removal. Since we can not place * this lock in the port itself, it has been placed in the |
b97bf3fd8 [TIPC] Initial merge |
80 |
* corresponding reference table entry, which has the same life |
c43072852 [NET] TIPC: Fix w... |
81 82 83 |
* cycle as the module. This entry is difficult to access from * outside the TIPC core, however, so a pointer to the lock has * been added in the port instance, -to be used for unlocking |
b97bf3fd8 [TIPC] Initial merge |
84 |
* only. |
c43072852 [NET] TIPC: Fix w... |
85 86 |
* - A read/write lock to protect the reference table itself (teg.c). * (Nobody is using read-only access to this, so it can just as |
b97bf3fd8 [TIPC] Initial merge |
87 88 |
* well be changed to a spin_lock) * - A spin lock to protect the registry of kernel/driver users (reg.c) |
c43072852 [NET] TIPC: Fix w... |
89 |
* - A global spin_lock (tipc_port_lock), which only task is to ensure |
b97bf3fd8 [TIPC] Initial merge |
90 91 92 93 |
* consistency where more than one port is involved in an operation, * i.e., whe a port is part of a linked list of ports. * There are two such lists; 'port_list', which is used for management, * and 'wait_list', which is used to queue ports during congestion. |
c43072852 [NET] TIPC: Fix w... |
94 |
* |
7216cd949 tipc: purge tipc_... |
95 |
* 4: The name table (name_table.c, name_distr.c, subscription.c) |
c43072852 [NET] TIPC: Fix w... |
96 97 |
* - There is one big read/write-lock (tipc_nametbl_lock) protecting the * overall name table structure. Nothing must be added/removed to |
b97bf3fd8 [TIPC] Initial merge |
98 99 |
* this structure without holding write access to it. * - There is one local spin_lock per sub_sequence, which can be seen |
4323add67 [TIPC] Avoid poll... |
100 |
* as a sub-domain to the tipc_nametbl_lock domain. It is used only |
b97bf3fd8 [TIPC] Initial merge |
101 102 |
* for translation operations, and is needed because a translation * steps the root of the 'publication' linked list between each lookup. |
4323add67 [TIPC] Avoid poll... |
103 |
* This is always used within the scope of a tipc_nametbl_lock(read). |
b97bf3fd8 [TIPC] Initial merge |
104 105 |
* - A local spin_lock protecting the queue of subscriber events. */ |
b97bf3fd8 [TIPC] Initial merge |
106 |
|
c93d3baa2 tipc: involve nam... |
107 |
int tipc_net_start(struct net *net, u32 addr) |
b97bf3fd8 [TIPC] Initial merge |
108 |
{ |
c93d3baa2 tipc: involve nam... |
109 |
struct tipc_net *tn = net_generic(net, tipc_net_id); |
b97bf3fd8 [TIPC] Initial merge |
110 |
char addr_string[16]; |
b97bf3fd8 [TIPC] Initial merge |
111 |
|
347475395 tipc: make tipc n... |
112 |
tn->own_addr = addr; |
4ac1c8d0e tipc: name tipc n... |
113 |
tipc_named_reinit(net); |
e05b31f4b tipc: make tipc s... |
114 |
tipc_sk_reinit(net); |
eb8b00f5f tipc: convert all... |
115 |
|
347475395 tipc: make tipc n... |
116 117 |
tipc_nametbl_publish(net, TIPC_CFG_SRV, tn->own_addr, tn->own_addr, TIPC_ZONE_SCOPE, 0, tn->own_addr); |
7216cd949 tipc: purge tipc_... |
118 |
|
2cf8aa19f tipc: use standar... |
119 120 121 122 |
pr_info("Started in network mode "); pr_info("Own node address %s, network identity %u ", |
347475395 tipc: make tipc n... |
123 |
tipc_addr_string_fill(addr_string, tn->own_addr), |
c93d3baa2 tipc: involve nam... |
124 |
tn->net_id); |
eb8b00f5f tipc: convert all... |
125 |
return 0; |
b97bf3fd8 [TIPC] Initial merge |
126 |
} |
f2f9800d4 tipc: make tipc n... |
127 |
void tipc_net_stop(struct net *net) |
b97bf3fd8 [TIPC] Initial merge |
128 |
{ |
347475395 tipc: make tipc n... |
129 130 131 |
struct tipc_net *tn = net_generic(net, tipc_net_id); if (!tn->own_addr) |
b97bf3fd8 [TIPC] Initial merge |
132 |
return; |
46651c59c tipc: rename node... |
133 |
|
347475395 tipc: make tipc n... |
134 135 |
tipc_nametbl_withdraw(net, TIPC_CFG_SRV, tn->own_addr, 0, tn->own_addr); |
f97e455ab tipc: use RTNL lo... |
136 |
rtnl_lock(); |
f2f9800d4 tipc: make tipc n... |
137 |
tipc_bearer_stop(net); |
f2f9800d4 tipc: make tipc n... |
138 |
tipc_node_stop(net); |
f97e455ab tipc: use RTNL lo... |
139 |
rtnl_unlock(); |
46651c59c tipc: rename node... |
140 |
|
2cf8aa19f tipc: use standar... |
141 142 |
pr_info("Left network mode "); |
b97bf3fd8 [TIPC] Initial merge |
143 |
} |
fd3cf2ad5 tipc: add net dum... |
144 |
|
c93d3baa2 tipc: involve nam... |
145 |
static int __tipc_nl_add_net(struct net *net, struct tipc_nl_msg *msg) |
fd3cf2ad5 tipc: add net dum... |
146 |
{ |
c93d3baa2 tipc: involve nam... |
147 |
struct tipc_net *tn = net_generic(net, tipc_net_id); |
fd3cf2ad5 tipc: add net dum... |
148 149 |
void *hdr; struct nlattr *attrs; |
bfb3e5dd8 tipc: move and re... |
150 |
hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family, |
fd3cf2ad5 tipc: add net dum... |
151 152 153 154 155 156 157 |
NLM_F_MULTI, TIPC_NL_NET_GET); if (!hdr) return -EMSGSIZE; attrs = nla_nest_start(msg->skb, TIPC_NLA_NET); if (!attrs) goto msg_full; |
c93d3baa2 tipc: involve nam... |
158 |
if (nla_put_u32(msg->skb, TIPC_NLA_NET_ID, tn->net_id)) |
fd3cf2ad5 tipc: add net dum... |
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
goto attr_msg_full; nla_nest_end(msg->skb, attrs); genlmsg_end(msg->skb, hdr); return 0; attr_msg_full: nla_nest_cancel(msg->skb, attrs); msg_full: genlmsg_cancel(msg->skb, hdr); return -EMSGSIZE; } int tipc_nl_net_dump(struct sk_buff *skb, struct netlink_callback *cb) { |
c93d3baa2 tipc: involve nam... |
176 |
struct net *net = sock_net(skb->sk); |
fd3cf2ad5 tipc: add net dum... |
177 178 179 180 181 182 183 184 185 186 |
int err; int done = cb->args[0]; struct tipc_nl_msg msg; if (done) return 0; msg.skb = skb; msg.portid = NETLINK_CB(cb->skb).portid; msg.seq = cb->nlh->nlmsg_seq; |
c93d3baa2 tipc: involve nam... |
187 |
err = __tipc_nl_add_net(net, &msg); |
fd3cf2ad5 tipc: add net dum... |
188 189 190 191 192 193 194 195 196 |
if (err) goto out; done = 1; out: cb->args[0] = done; return skb->len; } |
27c214167 tipc: add net set... |
197 198 199 |
int tipc_nl_net_set(struct sk_buff *skb, struct genl_info *info) { |
d7cc75d3c tipc: convert leg... |
200 |
struct net *net = sock_net(skb->sk); |
c93d3baa2 tipc: involve nam... |
201 |
struct tipc_net *tn = net_generic(net, tipc_net_id); |
27c214167 tipc: add net set... |
202 |
struct nlattr *attrs[TIPC_NLA_NET_MAX + 1]; |
c93d3baa2 tipc: involve nam... |
203 |
int err; |
27c214167 tipc: add net set... |
204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
if (!info->attrs[TIPC_NLA_NET]) return -EINVAL; err = nla_parse_nested(attrs, TIPC_NLA_NET_MAX, info->attrs[TIPC_NLA_NET], tipc_nl_net_policy); if (err) return err; if (attrs[TIPC_NLA_NET_ID]) { u32 val; /* Can't change net id once TIPC has joined a network */ |
347475395 tipc: make tipc n... |
218 |
if (tn->own_addr) |
27c214167 tipc: add net set... |
219 220 221 222 223 |
return -EPERM; val = nla_get_u32(attrs[TIPC_NLA_NET_ID]); if (val < 1 || val > 9999) return -EINVAL; |
c93d3baa2 tipc: involve nam... |
224 |
tn->net_id = val; |
27c214167 tipc: add net set... |
225 226 227 228 229 230 |
} if (attrs[TIPC_NLA_NET_ADDR]) { u32 addr; /* Can't change net addr once TIPC has joined a network */ |
347475395 tipc: make tipc n... |
231 |
if (tn->own_addr) |
27c214167 tipc: add net set... |
232 233 234 235 236 237 238 |
return -EPERM; addr = nla_get_u32(attrs[TIPC_NLA_NET_ADDR]); if (!tipc_addr_node_valid(addr)) return -EINVAL; rtnl_lock(); |
c93d3baa2 tipc: involve nam... |
239 |
tipc_net_start(net, addr); |
27c214167 tipc: add net set... |
240 241 242 243 244 |
rtnl_unlock(); } return 0; } |