Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tipc: some cleanups in the file discover.c

To facilitate the coming changes in the neighbor discovery functionality
we make some renaming and refactoring of that code. The functional changes
in this commit are trivial, e.g., that we move the message sending call in
tipc_disc_timeout() outside the spinlock protected region.

Acked-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jon Maloy and committed by
David S. Miller
b39e465e cb30a633

+164 -175
+4 -4
net/tipc/bearer.c
··· 210 210 rcu_read_lock(); 211 211 b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]); 212 212 if (b) 213 - tipc_disc_add_dest(b->link_req); 213 + tipc_disc_add_dest(b->disc); 214 214 rcu_read_unlock(); 215 215 } 216 216 ··· 222 222 rcu_read_lock(); 223 223 b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]); 224 224 if (b) 225 - tipc_disc_remove_dest(b->link_req); 225 + tipc_disc_remove_dest(b->disc); 226 226 rcu_read_unlock(); 227 227 } 228 228 ··· 389 389 tipc_node_delete_links(net, bearer_id); 390 390 b->media->disable_media(b); 391 391 RCU_INIT_POINTER(b->media_ptr, NULL); 392 - if (b->link_req) 393 - tipc_disc_delete(b->link_req); 392 + if (b->disc) 393 + tipc_disc_delete(b->disc); 394 394 RCU_INIT_POINTER(tn->bearer_list[bearer_id], NULL); 395 395 kfree_rcu(b, rcu); 396 396 tipc_mon_delete(net, bearer_id);
+1 -1
net/tipc/bearer.h
··· 159 159 u32 tolerance; 160 160 u32 domain; 161 161 u32 identity; 162 - struct tipc_link_req *link_req; 162 + struct tipc_discoverer *disc; 163 163 char net_plane; 164 164 unsigned long up; 165 165 };
+155 -166
net/tipc/discover.c
··· 39 39 #include "discover.h" 40 40 41 41 /* min delay during bearer start up */ 42 - #define TIPC_LINK_REQ_INIT msecs_to_jiffies(125) 42 + #define TIPC_DISC_INIT msecs_to_jiffies(125) 43 43 /* max delay if bearer has no links */ 44 - #define TIPC_LINK_REQ_FAST msecs_to_jiffies(1000) 44 + #define TIPC_DISC_FAST msecs_to_jiffies(1000) 45 45 /* max delay if bearer has links */ 46 - #define TIPC_LINK_REQ_SLOW msecs_to_jiffies(60000) 46 + #define TIPC_DISC_SLOW msecs_to_jiffies(60000) 47 47 /* indicates no timer in use */ 48 - #define TIPC_LINK_REQ_INACTIVE 0xffffffff 48 + #define TIPC_DISC_INACTIVE 0xffffffff 49 49 50 50 /** 51 - * struct tipc_link_req - information about an ongoing link setup request 51 + * struct tipc_discoverer - information about an ongoing link setup request 52 52 * @bearer_id: identity of bearer issuing requests 53 53 * @net: network namespace instance 54 54 * @dest: destination address for request messages 55 55 * @domain: network domain to which links can be established 56 56 * @num_nodes: number of nodes currently discovered (i.e. with an active link) 57 57 * @lock: spinlock for controlling access to requests 58 - * @buf: request message to be (repeatedly) sent 58 + * @skb: request message to be (repeatedly) sent 59 59 * @timer: timer governing period between requests 60 60 * @timer_intv: current interval between requests (in ms) 61 61 */ 62 - struct tipc_link_req { 62 + struct tipc_discoverer { 63 63 u32 bearer_id; 64 64 struct tipc_media_addr dest; 65 65 struct net *net; 66 66 u32 domain; 67 67 int num_nodes; 68 68 spinlock_t lock; 69 - struct sk_buff *buf; 69 + struct sk_buff *skb; 70 70 struct timer_list timer; 71 71 unsigned long timer_intv; 72 72 }; ··· 77 77 * @type: message type (request or response) 78 78 * @b: ptr to bearer issuing message 79 79 */ 80 - static void tipc_disc_init_msg(struct net *net, struct sk_buff *buf, u32 type, 80 + static void tipc_disc_init_msg(struct net *net, struct sk_buff *skb, 81 + u32 mtyp, struct tipc_bearer *b) 82 + { 83 + struct tipc_net *tn = tipc_net(net); 84 + u32 dest_domain = b->domain; 85 + struct tipc_msg *hdr; 86 + 87 + hdr = buf_msg(skb); 88 + tipc_msg_init(tn->own_addr, hdr, LINK_CONFIG, mtyp, 89 + MAX_H_SIZE, dest_domain); 90 + msg_set_non_seq(hdr, 1); 91 + msg_set_node_sig(hdr, tn->random); 92 + msg_set_node_capabilities(hdr, TIPC_NODE_CAPABILITIES); 93 + msg_set_dest_domain(hdr, dest_domain); 94 + msg_set_bc_netid(hdr, tn->net_id); 95 + b->media->addr2msg(msg_media_addr(hdr), &b->addr); 96 + } 97 + 98 + static void tipc_disc_msg_xmit(struct net *net, u32 mtyp, u32 dst, u32 src, 99 + struct tipc_media_addr *maddr, 81 100 struct tipc_bearer *b) 82 101 { 83 - struct tipc_net *tn = net_generic(net, tipc_net_id); 84 - struct tipc_msg *msg; 85 - u32 dest_domain = b->domain; 102 + struct sk_buff *skb; 86 103 87 - msg = buf_msg(buf); 88 - tipc_msg_init(tn->own_addr, msg, LINK_CONFIG, type, 89 - MAX_H_SIZE, dest_domain); 90 - msg_set_non_seq(msg, 1); 91 - msg_set_node_sig(msg, tn->random); 92 - msg_set_node_capabilities(msg, TIPC_NODE_CAPABILITIES); 93 - msg_set_dest_domain(msg, dest_domain); 94 - msg_set_bc_netid(msg, tn->net_id); 95 - b->media->addr2msg(msg_media_addr(msg), &b->addr); 104 + skb = tipc_buf_acquire(MAX_H_SIZE, GFP_ATOMIC); 105 + if (!skb) 106 + return; 107 + tipc_disc_init_msg(net, skb, mtyp, b); 108 + tipc_bearer_xmit_skb(net, b->identity, skb, maddr); 96 109 } 97 110 98 111 /** ··· 129 116 130 117 /** 131 118 * tipc_disc_rcv - handle incoming discovery message (request or response) 132 - * @net: the applicable net namespace 133 - * @buf: buffer containing message 134 - * @bearer: bearer that message arrived on 119 + * @net: applicable net namespace 120 + * @skb: buffer containing message 121 + * @b: bearer that message arrived on 135 122 */ 136 123 void tipc_disc_rcv(struct net *net, struct sk_buff *skb, 137 - struct tipc_bearer *bearer) 124 + struct tipc_bearer *b) 138 125 { 139 - struct tipc_net *tn = net_generic(net, tipc_net_id); 140 - struct tipc_media_addr maddr; 141 - struct sk_buff *rskb; 126 + struct tipc_net *tn = tipc_net(net); 142 127 struct tipc_msg *hdr = buf_msg(skb); 143 - u32 ddom = msg_dest_domain(hdr); 144 - u32 onode = msg_prevnode(hdr); 145 - u32 net_id = msg_bc_netid(hdr); 146 - u32 mtyp = msg_type(hdr); 147 - u32 signature = msg_node_sig(hdr); 148 128 u16 caps = msg_node_capabilities(hdr); 149 - bool respond = false; 129 + u32 signature = msg_node_sig(hdr); 130 + u32 dst = msg_dest_domain(hdr); 131 + u32 net_id = msg_bc_netid(hdr); 132 + u32 self = tipc_own_addr(net); 133 + struct tipc_media_addr maddr; 134 + u32 src = msg_prevnode(hdr); 135 + u32 mtyp = msg_type(hdr); 150 136 bool dupl_addr = false; 137 + bool respond = false; 151 138 int err; 152 139 153 - err = bearer->media->msg2addr(bearer, &maddr, msg_media_addr(hdr)); 140 + err = b->media->msg2addr(b, &maddr, msg_media_addr(hdr)); 154 141 kfree_skb(skb); 155 - if (err) 142 + if (err || maddr.broadcast) { 143 + pr_warn_ratelimited("Rcv corrupt discovery message\n"); 156 144 return; 157 - 158 - /* Ensure message from node is valid and communication is permitted */ 145 + } 146 + /* Ignore discovery messages from own node */ 147 + if (!memcmp(&maddr, &b->addr, sizeof(maddr))) 148 + return; 159 149 if (net_id != tn->net_id) 160 150 return; 161 - if (maddr.broadcast) 151 + if (!tipc_addr_domain_valid(dst)) 162 152 return; 163 - if (!tipc_addr_domain_valid(ddom)) 153 + if (!tipc_addr_node_valid(src)) 164 154 return; 165 - if (!tipc_addr_node_valid(onode)) 166 - return; 167 - 168 - if (in_own_node(net, onode)) { 169 - if (memcmp(&maddr, &bearer->addr, sizeof(maddr))) 170 - disc_dupl_alert(bearer, tn->own_addr, &maddr); 155 + if (in_own_node(net, src)) { 156 + disc_dupl_alert(b, self, &maddr); 171 157 return; 172 158 } 173 - if (!tipc_in_scope(ddom, tn->own_addr)) 159 + if (!tipc_in_scope(dst, self)) 174 160 return; 175 - if (!tipc_in_scope(bearer->domain, onode)) 161 + if (!tipc_in_scope(b->domain, src)) 176 162 return; 177 - 178 - tipc_node_check_dest(net, onode, bearer, caps, signature, 163 + tipc_node_check_dest(net, src, b, caps, signature, 179 164 &maddr, &respond, &dupl_addr); 180 165 if (dupl_addr) 181 - disc_dupl_alert(bearer, onode, &maddr); 166 + disc_dupl_alert(b, src, &maddr); 167 + if (!respond) 168 + return; 169 + if (mtyp != DSC_REQ_MSG) 170 + return; 171 + tipc_disc_msg_xmit(net, DSC_RESP_MSG, src, self, &maddr, b); 172 + } 182 173 183 - /* Send response, if necessary */ 184 - if (respond && (mtyp == DSC_REQ_MSG)) { 185 - rskb = tipc_buf_acquire(MAX_H_SIZE, GFP_ATOMIC); 186 - if (!rskb) 187 - return; 188 - tipc_disc_init_msg(net, rskb, DSC_RESP_MSG, bearer); 189 - tipc_bearer_xmit_skb(net, bearer->identity, rskb, &maddr); 174 + /* tipc_disc_add_dest - increment set of discovered nodes 175 + */ 176 + void tipc_disc_add_dest(struct tipc_discoverer *d) 177 + { 178 + spin_lock_bh(&d->lock); 179 + d->num_nodes++; 180 + spin_unlock_bh(&d->lock); 181 + } 182 + 183 + /* tipc_disc_remove_dest - decrement set of discovered nodes 184 + */ 185 + void tipc_disc_remove_dest(struct tipc_discoverer *d) 186 + { 187 + int intv, num; 188 + 189 + spin_lock_bh(&d->lock); 190 + d->num_nodes--; 191 + num = d->num_nodes; 192 + intv = d->timer_intv; 193 + if (!num && (intv == TIPC_DISC_INACTIVE || intv > TIPC_DISC_FAST)) { 194 + d->timer_intv = TIPC_DISC_INIT; 195 + mod_timer(&d->timer, jiffies + d->timer_intv); 190 196 } 197 + spin_unlock_bh(&d->lock); 191 198 } 192 199 193 - /** 194 - * disc_update - update frequency of periodic link setup requests 195 - * @req: ptr to link request structure 196 - * 197 - * Reinitiates discovery process if discovery object has no associated nodes 198 - * and is either not currently searching or is searching at a slow rate 199 - */ 200 - static void disc_update(struct tipc_link_req *req) 201 - { 202 - if (!req->num_nodes) { 203 - if ((req->timer_intv == TIPC_LINK_REQ_INACTIVE) || 204 - (req->timer_intv > TIPC_LINK_REQ_FAST)) { 205 - req->timer_intv = TIPC_LINK_REQ_INIT; 206 - mod_timer(&req->timer, jiffies + req->timer_intv); 207 - } 208 - } 209 - } 210 - 211 - /** 212 - * tipc_disc_add_dest - increment set of discovered nodes 213 - * @req: ptr to link request structure 214 - */ 215 - void tipc_disc_add_dest(struct tipc_link_req *req) 216 - { 217 - spin_lock_bh(&req->lock); 218 - req->num_nodes++; 219 - spin_unlock_bh(&req->lock); 220 - } 221 - 222 - /** 223 - * tipc_disc_remove_dest - decrement set of discovered nodes 224 - * @req: ptr to link request structure 225 - */ 226 - void tipc_disc_remove_dest(struct tipc_link_req *req) 227 - { 228 - spin_lock_bh(&req->lock); 229 - req->num_nodes--; 230 - disc_update(req); 231 - spin_unlock_bh(&req->lock); 232 - } 233 - 234 - /** 235 - * disc_timeout - send a periodic link setup request 236 - * @data: ptr to link request structure 237 - * 200 + /* tipc_disc_timeout - send a periodic link setup request 238 201 * Called whenever a link setup request timer associated with a bearer expires. 202 + * - Keep doubling time between sent request until limit is reached; 203 + * - Hold at fast polling rate if we don't have any associated nodes 204 + * - Otherwise hold at slow polling rate 239 205 */ 240 - static void disc_timeout(struct timer_list *t) 206 + static void tipc_disc_timeout(struct timer_list *t) 241 207 { 242 - struct tipc_link_req *req = from_timer(req, t, timer); 243 - struct sk_buff *skb; 244 - int max_delay; 208 + struct tipc_discoverer *d = from_timer(d, t, timer); 209 + struct tipc_media_addr maddr; 210 + struct sk_buff *skb = NULL; 211 + struct net *net; 212 + u32 bearer_id; 245 213 246 - spin_lock_bh(&req->lock); 214 + spin_lock_bh(&d->lock); 247 215 248 216 /* Stop searching if only desired node has been found */ 249 - if (tipc_node(req->domain) && req->num_nodes) { 250 - req->timer_intv = TIPC_LINK_REQ_INACTIVE; 217 + if (tipc_node(d->domain) && d->num_nodes) { 218 + d->timer_intv = TIPC_DISC_INACTIVE; 251 219 goto exit; 252 220 } 253 - 254 - /* 255 - * Send discovery message, then update discovery timer 256 - * 257 - * Keep doubling time between requests until limit is reached; 258 - * hold at fast polling rate if don't have any associated nodes, 259 - * otherwise hold at slow polling rate 260 - */ 261 - skb = skb_clone(req->buf, GFP_ATOMIC); 262 - if (skb) 263 - tipc_bearer_xmit_skb(req->net, req->bearer_id, skb, &req->dest); 264 - req->timer_intv *= 2; 265 - if (req->num_nodes) 266 - max_delay = TIPC_LINK_REQ_SLOW; 267 - else 268 - max_delay = TIPC_LINK_REQ_FAST; 269 - if (req->timer_intv > max_delay) 270 - req->timer_intv = max_delay; 271 - 272 - mod_timer(&req->timer, jiffies + req->timer_intv); 221 + /* Adjust timeout interval according to discovery phase */ 222 + d->timer_intv *= 2; 223 + if (d->num_nodes && d->timer_intv > TIPC_DISC_SLOW) 224 + d->timer_intv = TIPC_DISC_SLOW; 225 + else if (!d->num_nodes && d->timer_intv > TIPC_DISC_FAST) 226 + d->timer_intv = TIPC_DISC_FAST; 227 + mod_timer(&d->timer, jiffies + d->timer_intv); 228 + memcpy(&maddr, &d->dest, sizeof(maddr)); 229 + skb = skb_clone(d->skb, GFP_ATOMIC); 230 + net = d->net; 231 + bearer_id = d->bearer_id; 273 232 exit: 274 - spin_unlock_bh(&req->lock); 233 + spin_unlock_bh(&d->lock); 234 + if (skb) 235 + tipc_bearer_xmit_skb(net, bearer_id, skb, &maddr); 275 236 } 276 237 277 238 /** ··· 260 273 int tipc_disc_create(struct net *net, struct tipc_bearer *b, 261 274 struct tipc_media_addr *dest, struct sk_buff **skb) 262 275 { 263 - struct tipc_link_req *req; 276 + struct tipc_discoverer *d; 264 277 265 - req = kmalloc(sizeof(*req), GFP_ATOMIC); 266 - if (!req) 278 + d = kmalloc(sizeof(*d), GFP_ATOMIC); 279 + if (!d) 267 280 return -ENOMEM; 268 - req->buf = tipc_buf_acquire(MAX_H_SIZE, GFP_ATOMIC); 269 - if (!req->buf) { 270 - kfree(req); 281 + d->skb = tipc_buf_acquire(MAX_H_SIZE, GFP_ATOMIC); 282 + if (!d->skb) { 283 + kfree(d); 271 284 return -ENOMEM; 272 285 } 273 286 274 - tipc_disc_init_msg(net, req->buf, DSC_REQ_MSG, b); 275 - memcpy(&req->dest, dest, sizeof(*dest)); 276 - req->net = net; 277 - req->bearer_id = b->identity; 278 - req->domain = b->domain; 279 - req->num_nodes = 0; 280 - req->timer_intv = TIPC_LINK_REQ_INIT; 281 - spin_lock_init(&req->lock); 282 - timer_setup(&req->timer, disc_timeout, 0); 283 - mod_timer(&req->timer, jiffies + req->timer_intv); 284 - b->link_req = req; 285 - *skb = skb_clone(req->buf, GFP_ATOMIC); 287 + tipc_disc_init_msg(net, d->skb, DSC_REQ_MSG, b); 288 + memcpy(&d->dest, dest, sizeof(*dest)); 289 + d->net = net; 290 + d->bearer_id = b->identity; 291 + d->domain = b->domain; 292 + d->num_nodes = 0; 293 + d->timer_intv = TIPC_DISC_INIT; 294 + spin_lock_init(&d->lock); 295 + timer_setup(&d->timer, tipc_disc_timeout, 0); 296 + mod_timer(&d->timer, jiffies + d->timer_intv); 297 + b->disc = d; 298 + *skb = skb_clone(d->skb, GFP_ATOMIC); 286 299 return 0; 287 300 } 288 301 289 302 /** 290 303 * tipc_disc_delete - destroy object sending periodic link setup requests 291 - * @req: ptr to link request structure 304 + * @d: ptr to link duest structure 292 305 */ 293 - void tipc_disc_delete(struct tipc_link_req *req) 306 + void tipc_disc_delete(struct tipc_discoverer *d) 294 307 { 295 - del_timer_sync(&req->timer); 296 - kfree_skb(req->buf); 297 - kfree(req); 308 + del_timer_sync(&d->timer); 309 + kfree_skb(d->skb); 310 + kfree(d); 298 311 } 299 312 300 313 /** ··· 305 318 */ 306 319 void tipc_disc_reset(struct net *net, struct tipc_bearer *b) 307 320 { 308 - struct tipc_link_req *req = b->link_req; 321 + struct tipc_discoverer *d = b->disc; 322 + struct tipc_media_addr maddr; 309 323 struct sk_buff *skb; 310 324 311 - spin_lock_bh(&req->lock); 312 - tipc_disc_init_msg(net, req->buf, DSC_REQ_MSG, b); 313 - req->net = net; 314 - req->bearer_id = b->identity; 315 - req->domain = b->domain; 316 - req->num_nodes = 0; 317 - req->timer_intv = TIPC_LINK_REQ_INIT; 318 - mod_timer(&req->timer, jiffies + req->timer_intv); 319 - skb = skb_clone(req->buf, GFP_ATOMIC); 325 + spin_lock_bh(&d->lock); 326 + tipc_disc_init_msg(net, d->skb, DSC_REQ_MSG, b); 327 + d->net = net; 328 + d->bearer_id = b->identity; 329 + d->domain = b->domain; 330 + d->num_nodes = 0; 331 + d->timer_intv = TIPC_DISC_INIT; 332 + memcpy(&maddr, &d->dest, sizeof(maddr)); 333 + mod_timer(&d->timer, jiffies + d->timer_intv); 334 + skb = skb_clone(d->skb, GFP_ATOMIC); 335 + spin_unlock_bh(&d->lock); 320 336 if (skb) 321 - tipc_bearer_xmit_skb(net, req->bearer_id, skb, &req->dest); 322 - spin_unlock_bh(&req->lock); 337 + tipc_bearer_xmit_skb(net, b->identity, skb, &maddr); 323 338 }
+4 -4
net/tipc/discover.h
··· 37 37 #ifndef _TIPC_DISCOVER_H 38 38 #define _TIPC_DISCOVER_H 39 39 40 - struct tipc_link_req; 40 + struct tipc_discoverer; 41 41 42 42 int tipc_disc_create(struct net *net, struct tipc_bearer *b_ptr, 43 43 struct tipc_media_addr *dest, struct sk_buff **skb); 44 - void tipc_disc_delete(struct tipc_link_req *req); 44 + void tipc_disc_delete(struct tipc_discoverer *req); 45 45 void tipc_disc_reset(struct net *net, struct tipc_bearer *b_ptr); 46 - void tipc_disc_add_dest(struct tipc_link_req *req); 47 - void tipc_disc_remove_dest(struct tipc_link_req *req); 46 + void tipc_disc_add_dest(struct tipc_discoverer *req); 47 + void tipc_disc_remove_dest(struct tipc_discoverer *req); 48 48 void tipc_disc_rcv(struct net *net, struct sk_buff *buf, 49 49 struct tipc_bearer *b_ptr); 50 50