diff options
-rw-r--r-- | net/tipc/discover.c | 2 | ||||
-rw-r--r-- | net/tipc/link.c | 27 | ||||
-rw-r--r-- | net/tipc/link.h | 3 | ||||
-rw-r--r-- | net/tipc/node.c | 30 | ||||
-rw-r--r-- | net/tipc/node.h | 2 |
5 files changed, 28 insertions, 36 deletions
diff --git a/net/tipc/discover.c b/net/tipc/discover.c index 580b50a79e43..caac5c93b7f7 100644 --- a/net/tipc/discover.c +++ b/net/tipc/discover.c | |||
@@ -169,7 +169,7 @@ void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr) | |||
169 | 169 | ||
170 | /* Create a link endpoint for this bearer, if necessary */ | 170 | /* Create a link endpoint for this bearer, if necessary */ |
171 | if (!link) { | 171 | if (!link) { |
172 | link = tipc_link_create(b_ptr, orig, &media_addr); | 172 | link = tipc_link_create(n_ptr, b_ptr, &media_addr); |
173 | if (!link) { | 173 | if (!link) { |
174 | tipc_node_unlock(n_ptr); | 174 | tipc_node_unlock(n_ptr); |
175 | return; | 175 | return; |
diff --git a/net/tipc/link.c b/net/tipc/link.c index e5f96d5ef1ad..b73adeb5cdee 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -293,19 +293,35 @@ static void link_set_timer(struct link *l_ptr, u32 time) | |||
293 | 293 | ||
294 | /** | 294 | /** |
295 | * tipc_link_create - create a new link | 295 | * tipc_link_create - create a new link |
296 | * @n_ptr: pointer to associated node | ||
296 | * @b_ptr: pointer to associated bearer | 297 | * @b_ptr: pointer to associated bearer |
297 | * @peer: network address of node at other end of link | ||
298 | * @media_addr: media address to use when sending messages over link | 298 | * @media_addr: media address to use when sending messages over link |
299 | * | 299 | * |
300 | * Returns pointer to link. | 300 | * Returns pointer to link. |
301 | */ | 301 | */ |
302 | 302 | ||
303 | struct link *tipc_link_create(struct tipc_bearer *b_ptr, const u32 peer, | 303 | struct link *tipc_link_create(struct tipc_node *n_ptr, |
304 | struct tipc_bearer *b_ptr, | ||
304 | const struct tipc_media_addr *media_addr) | 305 | const struct tipc_media_addr *media_addr) |
305 | { | 306 | { |
306 | struct link *l_ptr; | 307 | struct link *l_ptr; |
307 | struct tipc_msg *msg; | 308 | struct tipc_msg *msg; |
308 | char *if_name; | 309 | char *if_name; |
310 | char addr_string[16]; | ||
311 | u32 peer = n_ptr->addr; | ||
312 | |||
313 | if (n_ptr->link_cnt >= 2) { | ||
314 | tipc_addr_string_fill(addr_string, n_ptr->addr); | ||
315 | err("Attempt to establish third link to %s\n", addr_string); | ||
316 | return NULL; | ||
317 | } | ||
318 | |||
319 | if (n_ptr->links[b_ptr->identity]) { | ||
320 | tipc_addr_string_fill(addr_string, n_ptr->addr); | ||
321 | err("Attempt to establish second link on <%s> to %s\n", | ||
322 | b_ptr->name, addr_string); | ||
323 | return NULL; | ||
324 | } | ||
309 | 325 | ||
310 | l_ptr = kzalloc(sizeof(*l_ptr), GFP_ATOMIC); | 326 | l_ptr = kzalloc(sizeof(*l_ptr), GFP_ATOMIC); |
311 | if (!l_ptr) { | 327 | if (!l_ptr) { |
@@ -322,6 +338,7 @@ struct link *tipc_link_create(struct tipc_bearer *b_ptr, const u32 peer, | |||
322 | tipc_zone(peer), tipc_cluster(peer), tipc_node(peer)); | 338 | tipc_zone(peer), tipc_cluster(peer), tipc_node(peer)); |
323 | /* note: peer i/f is appended to link name by reset/activate */ | 339 | /* note: peer i/f is appended to link name by reset/activate */ |
324 | memcpy(&l_ptr->media_addr, media_addr, sizeof(*media_addr)); | 340 | memcpy(&l_ptr->media_addr, media_addr, sizeof(*media_addr)); |
341 | l_ptr->owner = n_ptr; | ||
325 | l_ptr->checkpoint = 1; | 342 | l_ptr->checkpoint = 1; |
326 | l_ptr->b_ptr = b_ptr; | 343 | l_ptr->b_ptr = b_ptr; |
327 | link_set_supervision_props(l_ptr, b_ptr->media->tolerance); | 344 | link_set_supervision_props(l_ptr, b_ptr->media->tolerance); |
@@ -345,11 +362,7 @@ struct link *tipc_link_create(struct tipc_bearer *b_ptr, const u32 peer, | |||
345 | 362 | ||
346 | link_reset_statistics(l_ptr); | 363 | link_reset_statistics(l_ptr); |
347 | 364 | ||
348 | l_ptr->owner = tipc_node_attach_link(l_ptr); | 365 | tipc_node_attach_link(n_ptr, l_ptr); |
349 | if (!l_ptr->owner) { | ||
350 | kfree(l_ptr); | ||
351 | return NULL; | ||
352 | } | ||
353 | 366 | ||
354 | k_init_timer(&l_ptr->timer, (Handler)link_timeout, (unsigned long)l_ptr); | 367 | k_init_timer(&l_ptr->timer, (Handler)link_timeout, (unsigned long)l_ptr); |
355 | list_add_tail(&l_ptr->link_list, &b_ptr->links); | 368 | list_add_tail(&l_ptr->link_list, &b_ptr->links); |
diff --git a/net/tipc/link.h b/net/tipc/link.h index a7794e7ede29..e6a30dbe1aaa 100644 --- a/net/tipc/link.h +++ b/net/tipc/link.h | |||
@@ -207,7 +207,8 @@ struct link { | |||
207 | 207 | ||
208 | struct tipc_port; | 208 | struct tipc_port; |
209 | 209 | ||
210 | struct link *tipc_link_create(struct tipc_bearer *b_ptr, const u32 peer, | 210 | struct link *tipc_link_create(struct tipc_node *n_ptr, |
211 | struct tipc_bearer *b_ptr, | ||
211 | const struct tipc_media_addr *media_addr); | 212 | const struct tipc_media_addr *media_addr); |
212 | void tipc_link_delete(struct link *l_ptr); | 213 | void tipc_link_delete(struct link *l_ptr); |
213 | void tipc_link_changeover(struct link *l_ptr); | 214 | void tipc_link_changeover(struct link *l_ptr); |
diff --git a/net/tipc/node.c b/net/tipc/node.c index ca09b33fb87f..2d106ef4fa4c 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
@@ -238,33 +238,11 @@ int tipc_node_is_up(struct tipc_node *n_ptr) | |||
238 | return tipc_node_active_links(n_ptr); | 238 | return tipc_node_active_links(n_ptr); |
239 | } | 239 | } |
240 | 240 | ||
241 | struct tipc_node *tipc_node_attach_link(struct link *l_ptr) | 241 | void tipc_node_attach_link(struct tipc_node *n_ptr, struct link *l_ptr) |
242 | { | 242 | { |
243 | struct tipc_node *n_ptr = tipc_node_find(l_ptr->addr); | 243 | n_ptr->links[l_ptr->b_ptr->identity] = l_ptr; |
244 | 244 | atomic_inc(&tipc_num_links); | |
245 | if (!n_ptr) | 245 | n_ptr->link_cnt++; |
246 | n_ptr = tipc_node_create(l_ptr->addr); | ||
247 | if (n_ptr) { | ||
248 | u32 bearer_id = l_ptr->b_ptr->identity; | ||
249 | char addr_string[16]; | ||
250 | |||
251 | if (n_ptr->link_cnt >= 2) { | ||
252 | err("Attempt to create third link to %s\n", | ||
253 | tipc_addr_string_fill(addr_string, n_ptr->addr)); | ||
254 | return NULL; | ||
255 | } | ||
256 | |||
257 | if (!n_ptr->links[bearer_id]) { | ||
258 | n_ptr->links[bearer_id] = l_ptr; | ||
259 | atomic_inc(&tipc_num_links); | ||
260 | n_ptr->link_cnt++; | ||
261 | return n_ptr; | ||
262 | } | ||
263 | err("Attempt to establish second link on <%s> to %s\n", | ||
264 | l_ptr->b_ptr->name, | ||
265 | tipc_addr_string_fill(addr_string, l_ptr->addr)); | ||
266 | } | ||
267 | return NULL; | ||
268 | } | 246 | } |
269 | 247 | ||
270 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct link *l_ptr) | 248 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct link *l_ptr) |
diff --git a/net/tipc/node.h b/net/tipc/node.h index dde316576f81..5c61afc7a0b9 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h | |||
@@ -111,7 +111,7 @@ extern u32 tipc_own_tag; | |||
111 | struct tipc_node *tipc_node_find(u32 addr); | 111 | struct tipc_node *tipc_node_find(u32 addr); |
112 | struct tipc_node *tipc_node_create(u32 addr); | 112 | struct tipc_node *tipc_node_create(u32 addr); |
113 | void tipc_node_delete(struct tipc_node *n_ptr); | 113 | void tipc_node_delete(struct tipc_node *n_ptr); |
114 | struct tipc_node *tipc_node_attach_link(struct link *l_ptr); | 114 | void tipc_node_attach_link(struct tipc_node *n_ptr, struct link *l_ptr); |
115 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct link *l_ptr); | 115 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct link *l_ptr); |
116 | void tipc_node_link_down(struct tipc_node *n_ptr, struct link *l_ptr); | 116 | void tipc_node_link_down(struct tipc_node *n_ptr, struct link *l_ptr); |
117 | void tipc_node_link_up(struct tipc_node *n_ptr, struct link *l_ptr); | 117 | void tipc_node_link_up(struct tipc_node *n_ptr, struct link *l_ptr); |