| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 1 | /* | 
|  | 2 | * net/tipc/name_distr.c: TIPC name distribution code | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 3 | * | 
| Per Liden | 593a5f2 | 2006-01-11 19:14:19 +0100 | [diff] [blame] | 4 | * Copyright (c) 2000-2006, Ericsson AB | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 5 | * Copyright (c) 2005, Wind River Systems | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 6 | * All rights reserved. | 
|  | 7 | * | 
| Per Liden | 9ea1fd3 | 2006-01-11 13:30:43 +0100 | [diff] [blame] | 8 | * Redistribution and use in source and binary forms, with or without | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 9 | * modification, are permitted provided that the following conditions are met: | 
|  | 10 | * | 
| Per Liden | 9ea1fd3 | 2006-01-11 13:30:43 +0100 | [diff] [blame] | 11 | * 1. Redistributions of source code must retain the above copyright | 
|  | 12 | *    notice, this list of conditions and the following disclaimer. | 
|  | 13 | * 2. Redistributions in binary form must reproduce the above copyright | 
|  | 14 | *    notice, this list of conditions and the following disclaimer in the | 
|  | 15 | *    documentation and/or other materials provided with the distribution. | 
|  | 16 | * 3. Neither the names of the copyright holders nor the names of its | 
|  | 17 | *    contributors may be used to endorse or promote products derived from | 
|  | 18 | *    this software without specific prior written permission. | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 19 | * | 
| Per Liden | 9ea1fd3 | 2006-01-11 13:30:43 +0100 | [diff] [blame] | 20 | * Alternatively, this software may be distributed under the terms of the | 
|  | 21 | * GNU General Public License ("GPL") version 2 as published by the Free | 
|  | 22 | * Software Foundation. | 
|  | 23 | * | 
|  | 24 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
|  | 25 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
|  | 26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
|  | 27 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | 
|  | 28 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
|  | 29 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
|  | 30 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
|  | 31 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
|  | 32 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
|  | 33 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 34 | * POSSIBILITY OF SUCH DAMAGE. | 
|  | 35 | */ | 
|  | 36 |  | 
|  | 37 | #include "core.h" | 
|  | 38 | #include "cluster.h" | 
|  | 39 | #include "dbg.h" | 
|  | 40 | #include "link.h" | 
|  | 41 | #include "msg.h" | 
|  | 42 | #include "name_distr.h" | 
|  | 43 |  | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 44 | #define ITEM_SIZE sizeof(struct distr_item) | 
|  | 45 |  | 
|  | 46 | /** | 
|  | 47 | * struct distr_item - publication info distributed to other nodes | 
|  | 48 | * @type: name sequence type | 
|  | 49 | * @lower: name sequence lower bound | 
|  | 50 | * @upper: name sequence upper bound | 
|  | 51 | * @ref: publishing port reference | 
|  | 52 | * @key: publication key | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 53 | * | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 54 | * ===> All fields are stored in network byte order. <=== | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 55 | * | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 56 | * First 3 fields identify (name or) name sequence being published. | 
|  | 57 | * Reference field uniquely identifies port that published name sequence. | 
|  | 58 | * Key field uniquely identifies publication, in the event a port has | 
|  | 59 | * multiple publications of the same name sequence. | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 60 | * | 
|  | 61 | * Note: There is no field that identifies the publishing node because it is | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 62 | * the same for all items contained within a publication message. | 
|  | 63 | */ | 
|  | 64 |  | 
|  | 65 | struct distr_item { | 
| Al Viro | 3e6c8cd | 2006-11-08 00:19:09 -0800 | [diff] [blame] | 66 | __be32 type; | 
|  | 67 | __be32 lower; | 
|  | 68 | __be32 upper; | 
|  | 69 | __be32 ref; | 
|  | 70 | __be32 key; | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 71 | }; | 
|  | 72 |  | 
|  | 73 | /** | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 74 | * List of externally visible publications by this node -- | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 75 | * that is, all publications having scope > TIPC_NODE_SCOPE. | 
|  | 76 | */ | 
|  | 77 |  | 
|  | 78 | static LIST_HEAD(publ_root); | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 79 | static u32 publ_cnt = 0; | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 80 |  | 
|  | 81 | /** | 
|  | 82 | * publ_to_item - add publication info to a publication message | 
|  | 83 | */ | 
|  | 84 |  | 
|  | 85 | static void publ_to_item(struct distr_item *i, struct publication *p) | 
|  | 86 | { | 
|  | 87 | i->type = htonl(p->type); | 
|  | 88 | i->lower = htonl(p->lower); | 
|  | 89 | i->upper = htonl(p->upper); | 
|  | 90 | i->ref = htonl(p->ref); | 
|  | 91 | i->key = htonl(p->key); | 
|  | 92 | dbg("publ_to_item: %u, %u, %u\n", p->type, p->lower, p->upper); | 
|  | 93 | } | 
|  | 94 |  | 
|  | 95 | /** | 
|  | 96 | * named_prepare_buf - allocate & initialize a publication message | 
|  | 97 | */ | 
|  | 98 |  | 
|  | 99 | static struct sk_buff *named_prepare_buf(u32 type, u32 size, u32 dest) | 
|  | 100 | { | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 101 | struct sk_buff *buf = buf_acquire(LONG_H_SIZE + size); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 102 | struct tipc_msg *msg; | 
|  | 103 |  | 
|  | 104 | if (buf != NULL) { | 
|  | 105 | msg = buf_msg(buf); | 
| Allan Stephens | 7571521 | 2008-06-04 17:37:34 -0700 | [diff] [blame] | 106 | msg_init(msg, NAME_DISTRIBUTOR, type, LONG_H_SIZE, dest); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 107 | msg_set_size(msg, LONG_H_SIZE + size); | 
|  | 108 | } | 
|  | 109 | return buf; | 
|  | 110 | } | 
|  | 111 |  | 
|  | 112 | /** | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 113 | * tipc_named_publish - tell other nodes about a new publication by this node | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 114 | */ | 
|  | 115 |  | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 116 | void tipc_named_publish(struct publication *publ) | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 117 | { | 
|  | 118 | struct sk_buff *buf; | 
|  | 119 | struct distr_item *item; | 
|  | 120 |  | 
| Allan Stephens | 08c31f7 | 2006-10-16 21:56:04 -0700 | [diff] [blame] | 121 | list_add_tail(&publ->local_list, &publ_root); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 122 | publ_cnt++; | 
|  | 123 |  | 
|  | 124 | buf = named_prepare_buf(PUBLICATION, ITEM_SIZE, 0); | 
|  | 125 | if (!buf) { | 
| Allan Stephens | a10bd92 | 2006-06-25 23:52:17 -0700 | [diff] [blame] | 126 | warn("Publication distribution failure\n"); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 127 | return; | 
|  | 128 | } | 
|  | 129 |  | 
|  | 130 | item = (struct distr_item *)msg_data(buf_msg(buf)); | 
|  | 131 | publ_to_item(item, publ); | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 132 | dbg("tipc_named_withdraw: broadcasting publish msg\n"); | 
|  | 133 | tipc_cltr_broadcast(buf); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 134 | } | 
|  | 135 |  | 
|  | 136 | /** | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 137 | * tipc_named_withdraw - tell other nodes about a withdrawn publication by this node | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 138 | */ | 
|  | 139 |  | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 140 | void tipc_named_withdraw(struct publication *publ) | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 141 | { | 
|  | 142 | struct sk_buff *buf; | 
|  | 143 | struct distr_item *item; | 
|  | 144 |  | 
|  | 145 | list_del(&publ->local_list); | 
|  | 146 | publ_cnt--; | 
|  | 147 |  | 
|  | 148 | buf = named_prepare_buf(WITHDRAWAL, ITEM_SIZE, 0); | 
|  | 149 | if (!buf) { | 
| Allan Stephens | a10bd92 | 2006-06-25 23:52:17 -0700 | [diff] [blame] | 150 | warn("Withdrawl distribution failure\n"); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 151 | return; | 
|  | 152 | } | 
|  | 153 |  | 
|  | 154 | item = (struct distr_item *)msg_data(buf_msg(buf)); | 
|  | 155 | publ_to_item(item, publ); | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 156 | dbg("tipc_named_withdraw: broadcasting withdraw msg\n"); | 
|  | 157 | tipc_cltr_broadcast(buf); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 158 | } | 
|  | 159 |  | 
|  | 160 | /** | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 161 | * tipc_named_node_up - tell specified node about all publications by this node | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 162 | */ | 
|  | 163 |  | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 164 | void tipc_named_node_up(unsigned long node) | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 165 | { | 
|  | 166 | struct publication *publ; | 
| Sam Ravnborg | 1fc54d8 | 2006-03-20 22:36:47 -0800 | [diff] [blame] | 167 | struct distr_item *item = NULL; | 
|  | 168 | struct sk_buff *buf = NULL; | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 169 | u32 left = 0; | 
|  | 170 | u32 rest; | 
|  | 171 | u32 max_item_buf; | 
|  | 172 |  | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 173 | read_lock_bh(&tipc_nametbl_lock); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 174 | max_item_buf = TIPC_MAX_USER_MSG_SIZE / ITEM_SIZE; | 
|  | 175 | max_item_buf *= ITEM_SIZE; | 
|  | 176 | rest = publ_cnt * ITEM_SIZE; | 
|  | 177 |  | 
|  | 178 | list_for_each_entry(publ, &publ_root, local_list) { | 
|  | 179 | if (!buf) { | 
|  | 180 | left = (rest <= max_item_buf) ? rest : max_item_buf; | 
|  | 181 | rest -= left; | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 182 | buf = named_prepare_buf(PUBLICATION, left, node); | 
| Allan Stephens | a10bd92 | 2006-06-25 23:52:17 -0700 | [diff] [blame] | 183 | if (!buf) { | 
|  | 184 | warn("Bulk publication distribution failure\n"); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 185 | goto exit; | 
|  | 186 | } | 
|  | 187 | item = (struct distr_item *)msg_data(buf_msg(buf)); | 
|  | 188 | } | 
|  | 189 | publ_to_item(item, publ); | 
|  | 190 | item++; | 
|  | 191 | left -= ITEM_SIZE; | 
|  | 192 | if (!left) { | 
|  | 193 | msg_set_link_selector(buf_msg(buf), node); | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 194 | dbg("tipc_named_node_up: sending publish msg to " | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 195 | "<%u.%u.%u>\n", tipc_zone(node), | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 196 | tipc_cluster(node), tipc_node(node)); | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 197 | tipc_link_send(buf, node, node); | 
| Sam Ravnborg | 1fc54d8 | 2006-03-20 22:36:47 -0800 | [diff] [blame] | 198 | buf = NULL; | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 199 | } | 
|  | 200 | } | 
|  | 201 | exit: | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 202 | read_unlock_bh(&tipc_nametbl_lock); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 203 | } | 
|  | 204 |  | 
|  | 205 | /** | 
|  | 206 | * node_is_down - remove publication associated with a failed node | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 207 | * | 
|  | 208 | * Invoked for each publication issued by a newly failed node. | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 209 | * Removes publication structure from name table & deletes it. | 
|  | 210 | * In rare cases the link may have come back up again when this | 
|  | 211 | * function is called, and we have two items representing the same | 
|  | 212 | * publication. Nudge this item's key to distinguish it from the other. | 
|  | 213 | * (Note: Publication's node subscription is already unsubscribed.) | 
|  | 214 | */ | 
|  | 215 |  | 
|  | 216 | static void node_is_down(struct publication *publ) | 
|  | 217 | { | 
|  | 218 | struct publication *p; | 
| Allan Stephens | f131072 | 2006-06-25 23:51:37 -0700 | [diff] [blame] | 219 |  | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 220 | write_lock_bh(&tipc_nametbl_lock); | 
|  | 221 | dbg("node_is_down: withdrawing %u, %u, %u\n", | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 222 | publ->type, publ->lower, publ->upper); | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 223 | publ->key += 1222345; | 
|  | 224 | p = tipc_nametbl_remove_publ(publ->type, publ->lower, | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 225 | publ->node, publ->ref, publ->key); | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 226 | write_unlock_bh(&tipc_nametbl_lock); | 
| Allan Stephens | f131072 | 2006-06-25 23:51:37 -0700 | [diff] [blame] | 227 |  | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 228 | if (p != publ) { | 
| Allan Stephens | f131072 | 2006-06-25 23:51:37 -0700 | [diff] [blame] | 229 | err("Unable to remove publication from failed node\n" | 
|  | 230 | "(type=%u, lower=%u, node=0x%x, ref=%u, key=%u)\n", | 
|  | 231 | publ->type, publ->lower, publ->node, publ->ref, publ->key); | 
|  | 232 | } | 
|  | 233 |  | 
|  | 234 | if (p) { | 
|  | 235 | kfree(p); | 
|  | 236 | } | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 237 | } | 
|  | 238 |  | 
|  | 239 | /** | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 240 | * tipc_named_recv - process name table update message sent by another node | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 241 | */ | 
|  | 242 |  | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 243 | void tipc_named_recv(struct sk_buff *buf) | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 244 | { | 
|  | 245 | struct publication *publ; | 
|  | 246 | struct tipc_msg *msg = buf_msg(buf); | 
|  | 247 | struct distr_item *item = (struct distr_item *)msg_data(msg); | 
|  | 248 | u32 count = msg_data_sz(msg) / ITEM_SIZE; | 
|  | 249 |  | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 250 | write_lock_bh(&tipc_nametbl_lock); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 251 | while (count--) { | 
|  | 252 | if (msg_type(msg) == PUBLICATION) { | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 253 | dbg("tipc_named_recv: got publication for %u, %u, %u\n", | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 254 | ntohl(item->type), ntohl(item->lower), | 
|  | 255 | ntohl(item->upper)); | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 256 | publ = tipc_nametbl_insert_publ(ntohl(item->type), | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 257 | ntohl(item->lower), | 
|  | 258 | ntohl(item->upper), | 
|  | 259 | TIPC_CLUSTER_SCOPE, | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 260 | msg_orignode(msg), | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 261 | ntohl(item->ref), | 
|  | 262 | ntohl(item->key)); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 263 | if (publ) { | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 264 | tipc_nodesub_subscribe(&publ->subscr, | 
|  | 265 | msg_orignode(msg), | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 266 | publ, | 
|  | 267 | (net_ev_handler)node_is_down); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 268 | } | 
|  | 269 | } else if (msg_type(msg) == WITHDRAWAL) { | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 270 | dbg("tipc_named_recv: got withdrawl for %u, %u, %u\n", | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 271 | ntohl(item->type), ntohl(item->lower), | 
|  | 272 | ntohl(item->upper)); | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 273 | publ = tipc_nametbl_remove_publ(ntohl(item->type), | 
|  | 274 | ntohl(item->lower), | 
|  | 275 | msg_orignode(msg), | 
|  | 276 | ntohl(item->ref), | 
|  | 277 | ntohl(item->key)); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 278 |  | 
|  | 279 | if (publ) { | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 280 | tipc_nodesub_unsubscribe(&publ->subscr); | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 281 | kfree(publ); | 
| Allan Stephens | f131072 | 2006-06-25 23:51:37 -0700 | [diff] [blame] | 282 | } else { | 
|  | 283 | err("Unable to remove publication by node 0x%x\n" | 
|  | 284 | "(type=%u, lower=%u, ref=%u, key=%u)\n", | 
|  | 285 | msg_orignode(msg), | 
|  | 286 | ntohl(item->type), ntohl(item->lower), | 
|  | 287 | ntohl(item->ref), ntohl(item->key)); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 288 | } | 
|  | 289 | } else { | 
| Allan Stephens | a10bd92 | 2006-06-25 23:52:17 -0700 | [diff] [blame] | 290 | warn("Unrecognized name table message received\n"); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 291 | } | 
|  | 292 | item++; | 
|  | 293 | } | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 294 | write_unlock_bh(&tipc_nametbl_lock); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 295 | buf_discard(buf); | 
|  | 296 | } | 
|  | 297 |  | 
|  | 298 | /** | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 299 | * tipc_named_reinit - re-initialize local publication list | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 300 | * | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 301 | * This routine is called whenever TIPC networking is (re)enabled. | 
|  | 302 | * All existing publications by this node that have "cluster" or "zone" scope | 
|  | 303 | * are updated to reflect the node's current network address. | 
|  | 304 | * (If the node's address is unchanged, the update loop terminates immediately.) | 
|  | 305 | */ | 
|  | 306 |  | 
| Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 307 | void tipc_named_reinit(void) | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 308 | { | 
|  | 309 | struct publication *publ; | 
|  | 310 |  | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 311 | write_lock_bh(&tipc_nametbl_lock); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 312 | list_for_each_entry(publ, &publ_root, local_list) { | 
|  | 313 | if (publ->node == tipc_own_addr) | 
|  | 314 | break; | 
|  | 315 | publ->node = tipc_own_addr; | 
|  | 316 | } | 
| YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 317 | write_unlock_bh(&tipc_nametbl_lock); | 
| Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 318 | } |