Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 1 | /* |
| 2 | * net/tipc/discover.c |
YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 3 | * |
Jon Paul Maloy | b45db71 | 2015-02-03 08:59:19 -0500 | [diff] [blame] | 4 | * Copyright (c) 2003-2006, 2014-2015, Ericsson AB |
Allan Stephens | 2d627b9 | 2011-01-07 13:00:11 -0500 | [diff] [blame] | 5 | * Copyright (c) 2005-2006, 2010-2011, 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" |
Jon Paul Maloy | d3a43b9 | 2015-07-16 16:54:20 -0400 | [diff] [blame] | 38 | #include "node.h" |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 39 | #include "discover.h" |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 40 | |
Ying Xue | 2f55c43 | 2015-01-09 15:27:00 +0800 | [diff] [blame] | 41 | /* min delay during bearer start up */ |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 42 | #define TIPC_DISC_INIT msecs_to_jiffies(125) |
Ying Xue | 2f55c43 | 2015-01-09 15:27:00 +0800 | [diff] [blame] | 43 | /* max delay if bearer has no links */ |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 44 | #define TIPC_DISC_FAST msecs_to_jiffies(1000) |
Ying Xue | 2f55c43 | 2015-01-09 15:27:00 +0800 | [diff] [blame] | 45 | /* max delay if bearer has links */ |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 46 | #define TIPC_DISC_SLOW msecs_to_jiffies(60000) |
Ying Xue | 2f55c43 | 2015-01-09 15:27:00 +0800 | [diff] [blame] | 47 | /* indicates no timer in use */ |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 48 | #define TIPC_DISC_INACTIVE 0xffffffff |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 49 | |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 50 | /** |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 51 | * struct tipc_discoverer - information about an ongoing link setup request |
Ying Xue | 7a2f7d1 | 2014-04-21 10:55:46 +0800 | [diff] [blame] | 52 | * @bearer_id: identity of bearer issuing requests |
Ying Xue | 7f9f95d | 2015-01-09 15:27:06 +0800 | [diff] [blame] | 53 | * @net: network namespace instance |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 54 | * @dest: destination address for request messages |
Ying Xue | 7a2f7d1 | 2014-04-21 10:55:46 +0800 | [diff] [blame] | 55 | * @domain: network domain to which links can be established |
Allan Stephens | 1209966 | 2011-04-21 19:05:25 -0500 | [diff] [blame] | 56 | * @num_nodes: number of nodes currently discovered (i.e. with an active link) |
Ying Xue | f9a2c80 | 2014-01-07 17:02:43 -0500 | [diff] [blame] | 57 | * @lock: spinlock for controlling access to requests |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 58 | * @skb: request message to be (repeatedly) sent |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 59 | * @timer: timer governing period between requests |
| 60 | * @timer_intv: current interval between requests (in ms) |
| 61 | */ |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 62 | struct tipc_discoverer { |
Ying Xue | 7a2f7d1 | 2014-04-21 10:55:46 +0800 | [diff] [blame] | 63 | u32 bearer_id; |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 64 | struct tipc_media_addr dest; |
Ying Xue | 7f9f95d | 2015-01-09 15:27:06 +0800 | [diff] [blame] | 65 | struct net *net; |
Ying Xue | 7a2f7d1 | 2014-04-21 10:55:46 +0800 | [diff] [blame] | 66 | u32 domain; |
Allan Stephens | 1209966 | 2011-04-21 19:05:25 -0500 | [diff] [blame] | 67 | int num_nodes; |
Ying Xue | f9a2c80 | 2014-01-07 17:02:43 -0500 | [diff] [blame] | 68 | spinlock_t lock; |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 69 | struct sk_buff *skb; |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 70 | struct timer_list timer; |
Ying Xue | 2f55c43 | 2015-01-09 15:27:00 +0800 | [diff] [blame] | 71 | unsigned long timer_intv; |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 72 | }; |
| 73 | |
YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 74 | /** |
Per Liden | 4323add | 2006-01-18 00:38:21 +0100 | [diff] [blame] | 75 | * tipc_disc_init_msg - initialize a link setup message |
Ying Xue | c93d3ba | 2015-01-09 15:27:04 +0800 | [diff] [blame] | 76 | * @net: the applicable net namespace |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 77 | * @type: message type (request or response) |
Jon Paul Maloy | 1a90632 | 2015-11-19 14:30:47 -0500 | [diff] [blame] | 78 | * @b: ptr to bearer issuing message |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 79 | */ |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 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, |
Jon Paul Maloy | 1a90632 | 2015-11-19 14:30:47 -0500 | [diff] [blame] | 100 | struct tipc_bearer *b) |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 101 | { |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 102 | struct sk_buff *skb; |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 103 | |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 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); |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 109 | } |
| 110 | |
| 111 | /** |
Allan Stephens | e91ed0b | 2006-10-16 21:44:59 -0700 | [diff] [blame] | 112 | * disc_dupl_alert - issue node address duplication alert |
Jon Paul Maloy | 1a90632 | 2015-11-19 14:30:47 -0500 | [diff] [blame] | 113 | * @b: pointer to bearer detecting duplication |
Allan Stephens | e91ed0b | 2006-10-16 21:44:59 -0700 | [diff] [blame] | 114 | * @node_addr: duplicated node address |
| 115 | * @media_addr: media address advertised by duplicated node |
| 116 | */ |
Jon Paul Maloy | 1a90632 | 2015-11-19 14:30:47 -0500 | [diff] [blame] | 117 | static void disc_dupl_alert(struct tipc_bearer *b, u32 node_addr, |
Allan Stephens | e91ed0b | 2006-10-16 21:44:59 -0700 | [diff] [blame] | 118 | struct tipc_media_addr *media_addr) |
| 119 | { |
| 120 | char node_addr_str[16]; |
| 121 | char media_addr_str[64]; |
Allan Stephens | e91ed0b | 2006-10-16 21:44:59 -0700 | [diff] [blame] | 122 | |
Allan Stephens | c68ca7b | 2010-05-11 14:30:12 +0000 | [diff] [blame] | 123 | tipc_addr_string_fill(node_addr_str, node_addr); |
Erik Hugne | dc1aed3 | 2012-06-29 00:50:23 -0400 | [diff] [blame] | 124 | tipc_media_addr_printf(media_addr_str, sizeof(media_addr_str), |
| 125 | media_addr); |
Erik Hugne | 2cf8aa1 | 2012-06-29 00:16:37 -0400 | [diff] [blame] | 126 | pr_warn("Duplicate %s using %s seen on <%s>\n", node_addr_str, |
Jon Paul Maloy | 1a90632 | 2015-11-19 14:30:47 -0500 | [diff] [blame] | 127 | media_addr_str, b->name); |
Allan Stephens | e91ed0b | 2006-10-16 21:44:59 -0700 | [diff] [blame] | 128 | } |
| 129 | |
| 130 | /** |
Jon Paul Maloy | c82910e | 2014-05-14 05:39:14 -0400 | [diff] [blame] | 131 | * tipc_disc_rcv - handle incoming discovery message (request or response) |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 132 | * @net: applicable net namespace |
| 133 | * @skb: buffer containing message |
| 134 | * @b: bearer that message arrived on |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 135 | */ |
Jon Paul Maloy | cf14881 | 2015-07-30 18:24:22 -0400 | [diff] [blame] | 136 | void tipc_disc_rcv(struct net *net, struct sk_buff *skb, |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 137 | struct tipc_bearer *b) |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 138 | { |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 139 | struct tipc_net *tn = tipc_net(net); |
Jon Paul Maloy | cf14881 | 2015-07-30 18:24:22 -0400 | [diff] [blame] | 140 | struct tipc_msg *hdr = buf_msg(skb); |
Jon Paul Maloy | cf14881 | 2015-07-30 18:24:22 -0400 | [diff] [blame] | 141 | u16 caps = msg_node_capabilities(hdr); |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 142 | u32 signature = msg_node_sig(hdr); |
| 143 | u32 dst = msg_dest_domain(hdr); |
| 144 | u32 net_id = msg_bc_netid(hdr); |
| 145 | u32 self = tipc_own_addr(net); |
| 146 | struct tipc_media_addr maddr; |
| 147 | u32 src = msg_prevnode(hdr); |
| 148 | u32 mtyp = msg_type(hdr); |
Jon Paul Maloy | cf14881 | 2015-07-30 18:24:22 -0400 | [diff] [blame] | 149 | bool dupl_addr = false; |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 150 | bool respond = false; |
Richard Alpe | e994292 | 2016-06-27 13:34:06 +0200 | [diff] [blame] | 151 | int err; |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 152 | |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 153 | err = b->media->msg2addr(b, &maddr, msg_media_addr(hdr)); |
Jon Paul Maloy | cf14881 | 2015-07-30 18:24:22 -0400 | [diff] [blame] | 154 | kfree_skb(skb); |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 155 | if (err || maddr.broadcast) { |
| 156 | pr_warn_ratelimited("Rcv corrupt discovery message\n"); |
Richard Alpe | e994292 | 2016-06-27 13:34:06 +0200 | [diff] [blame] | 157 | return; |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 158 | } |
| 159 | /* Ignore discovery messages from own node */ |
| 160 | if (!memcmp(&maddr, &b->addr, sizeof(maddr))) |
| 161 | return; |
Ying Xue | c93d3ba | 2015-01-09 15:27:04 +0800 | [diff] [blame] | 162 | if (net_id != tn->net_id) |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 163 | return; |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 164 | if (!tipc_addr_domain_valid(dst)) |
Allan Stephens | d6d4577 | 2011-10-07 15:48:41 -0400 | [diff] [blame] | 165 | return; |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 166 | if (!tipc_addr_node_valid(src)) |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 167 | return; |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 168 | if (in_own_node(net, src)) { |
| 169 | disc_dupl_alert(b, self, &maddr); |
Jon Paul Maloy | c82910e | 2014-05-14 05:39:14 -0400 | [diff] [blame] | 170 | return; |
Allan Stephens | a728750 | 2011-02-28 10:03:05 -0500 | [diff] [blame] | 171 | } |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 172 | if (!tipc_in_scope(dst, self)) |
Jon Paul Maloy | c82910e | 2014-05-14 05:39:14 -0400 | [diff] [blame] | 173 | return; |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 174 | if (!tipc_in_scope(b->domain, src)) |
Jon Paul Maloy | c82910e | 2014-05-14 05:39:14 -0400 | [diff] [blame] | 175 | return; |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 176 | tipc_node_check_dest(net, src, b, caps, signature, |
Jon Paul Maloy | cf14881 | 2015-07-30 18:24:22 -0400 | [diff] [blame] | 177 | &maddr, &respond, &dupl_addr); |
| 178 | if (dupl_addr) |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 179 | disc_dupl_alert(b, src, &maddr); |
| 180 | if (!respond) |
| 181 | return; |
| 182 | if (mtyp != DSC_REQ_MSG) |
| 183 | return; |
| 184 | tipc_disc_msg_xmit(net, DSC_RESP_MSG, src, self, &maddr, b); |
| 185 | } |
Allan Stephens | 97878a4 | 2011-10-28 17:30:08 -0400 | [diff] [blame] | 186 | |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 187 | /* tipc_disc_add_dest - increment set of discovered nodes |
| 188 | */ |
| 189 | void tipc_disc_add_dest(struct tipc_discoverer *d) |
| 190 | { |
| 191 | spin_lock_bh(&d->lock); |
| 192 | d->num_nodes++; |
| 193 | spin_unlock_bh(&d->lock); |
| 194 | } |
| 195 | |
| 196 | /* tipc_disc_remove_dest - decrement set of discovered nodes |
| 197 | */ |
| 198 | void tipc_disc_remove_dest(struct tipc_discoverer *d) |
| 199 | { |
| 200 | int intv, num; |
| 201 | |
| 202 | spin_lock_bh(&d->lock); |
| 203 | d->num_nodes--; |
| 204 | num = d->num_nodes; |
| 205 | intv = d->timer_intv; |
| 206 | if (!num && (intv == TIPC_DISC_INACTIVE || intv > TIPC_DISC_FAST)) { |
| 207 | d->timer_intv = TIPC_DISC_INIT; |
| 208 | mod_timer(&d->timer, jiffies + d->timer_intv); |
Allan Stephens | a728750 | 2011-02-28 10:03:05 -0500 | [diff] [blame] | 209 | } |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 210 | spin_unlock_bh(&d->lock); |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 211 | } |
| 212 | |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 213 | /* tipc_disc_timeout - send a periodic link setup request |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 214 | * Called whenever a link setup request timer associated with a bearer expires. |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 215 | * - Keep doubling time between sent request until limit is reached; |
| 216 | * - Hold at fast polling rate if we don't have any associated nodes |
| 217 | * - Otherwise hold at slow polling rate |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 218 | */ |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 219 | static void tipc_disc_timeout(struct timer_list *t) |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 220 | { |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 221 | struct tipc_discoverer *d = from_timer(d, t, timer); |
| 222 | struct tipc_media_addr maddr; |
| 223 | struct sk_buff *skb = NULL; |
| 224 | struct net *net; |
| 225 | u32 bearer_id; |
Allan Stephens | 972a77f | 2011-04-21 20:34:03 -0500 | [diff] [blame] | 226 | |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 227 | spin_lock_bh(&d->lock); |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 228 | |
Allan Stephens | 972a77f | 2011-04-21 20:34:03 -0500 | [diff] [blame] | 229 | /* Stop searching if only desired node has been found */ |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 230 | if (tipc_node(d->domain) && d->num_nodes) { |
| 231 | d->timer_intv = TIPC_DISC_INACTIVE; |
Allan Stephens | 972a77f | 2011-04-21 20:34:03 -0500 | [diff] [blame] | 232 | goto exit; |
| 233 | } |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 234 | /* Adjust timeout interval according to discovery phase */ |
| 235 | d->timer_intv *= 2; |
| 236 | if (d->num_nodes && d->timer_intv > TIPC_DISC_SLOW) |
| 237 | d->timer_intv = TIPC_DISC_SLOW; |
| 238 | else if (!d->num_nodes && d->timer_intv > TIPC_DISC_FAST) |
| 239 | d->timer_intv = TIPC_DISC_FAST; |
| 240 | mod_timer(&d->timer, jiffies + d->timer_intv); |
| 241 | memcpy(&maddr, &d->dest, sizeof(maddr)); |
| 242 | skb = skb_clone(d->skb, GFP_ATOMIC); |
| 243 | net = d->net; |
| 244 | bearer_id = d->bearer_id; |
Allan Stephens | 972a77f | 2011-04-21 20:34:03 -0500 | [diff] [blame] | 245 | exit: |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 246 | spin_unlock_bh(&d->lock); |
| 247 | if (skb) |
| 248 | tipc_bearer_xmit_skb(net, bearer_id, skb, &maddr); |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 249 | } |
| 250 | |
| 251 | /** |
Allan Stephens | 3a777ff | 2011-04-21 13:58:26 -0500 | [diff] [blame] | 252 | * tipc_disc_create - create object to send periodic link setup requests |
Ying Xue | c93d3ba | 2015-01-09 15:27:04 +0800 | [diff] [blame] | 253 | * @net: the applicable net namespace |
Jon Paul Maloy | 1a90632 | 2015-11-19 14:30:47 -0500 | [diff] [blame] | 254 | * @b: ptr to bearer issuing requests |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 255 | * @dest: destination address for request messages |
Allan Stephens | 66e019a | 2011-04-20 16:24:07 -0500 | [diff] [blame] | 256 | * @dest_domain: network domain to which links can be established |
YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 257 | * |
Allan Stephens | 3a777ff | 2011-04-21 13:58:26 -0500 | [diff] [blame] | 258 | * Returns 0 if successful, otherwise -errno. |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 259 | */ |
Jon Paul Maloy | 1a90632 | 2015-11-19 14:30:47 -0500 | [diff] [blame] | 260 | int tipc_disc_create(struct net *net, struct tipc_bearer *b, |
Jon Paul Maloy | 4e801fa | 2016-04-07 10:09:13 -0400 | [diff] [blame] | 261 | struct tipc_media_addr *dest, struct sk_buff **skb) |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 262 | { |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 263 | struct tipc_discoverer *d; |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 264 | |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 265 | d = kmalloc(sizeof(*d), GFP_ATOMIC); |
| 266 | if (!d) |
Allan Stephens | 3a777ff | 2011-04-21 13:58:26 -0500 | [diff] [blame] | 267 | return -ENOMEM; |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 268 | d->skb = tipc_buf_acquire(MAX_H_SIZE, GFP_ATOMIC); |
| 269 | if (!d->skb) { |
| 270 | kfree(d); |
Ying Xue | a8b9b96e | 2014-04-21 10:55:52 +0800 | [diff] [blame] | 271 | return -ENOMEM; |
Ying Xue | 22e7987 | 2014-04-25 10:44:15 +0800 | [diff] [blame] | 272 | } |
Per Liden | b97bf3f | 2006-01-02 19:04:38 +0100 | [diff] [blame] | 273 | |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 274 | tipc_disc_init_msg(net, d->skb, DSC_REQ_MSG, b); |
| 275 | memcpy(&d->dest, dest, sizeof(*dest)); |
| 276 | d->net = net; |
| 277 | d->bearer_id = b->identity; |
| 278 | d->domain = b->domain; |
| 279 | d->num_nodes = 0; |
| 280 | d->timer_intv = TIPC_DISC_INIT; |
| 281 | spin_lock_init(&d->lock); |
| 282 | timer_setup(&d->timer, tipc_disc_timeout, 0); |
| 283 | mod_timer(&d->timer, jiffies + d->timer_intv); |
| 284 | b->disc = d; |
| 285 | *skb = skb_clone(d->skb, GFP_ATOMIC); |
Allan Stephens | 3a777ff | 2011-04-21 13:58:26 -0500 | [diff] [blame] | 286 | return 0; |
| 287 | } |
| 288 | |
| 289 | /** |
| 290 | * tipc_disc_delete - destroy object sending periodic link setup requests |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 291 | * @d: ptr to link duest structure |
Allan Stephens | 3a777ff | 2011-04-21 13:58:26 -0500 | [diff] [blame] | 292 | */ |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 293 | void tipc_disc_delete(struct tipc_discoverer *d) |
Allan Stephens | 3a777ff | 2011-04-21 13:58:26 -0500 | [diff] [blame] | 294 | { |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 295 | del_timer_sync(&d->timer); |
| 296 | kfree_skb(d->skb); |
| 297 | kfree(d); |
YOSHIFUJI Hideaki | c430728 | 2007-02-09 23:25:21 +0900 | [diff] [blame] | 298 | } |
Ying Xue | a8b9b96e | 2014-04-21 10:55:52 +0800 | [diff] [blame] | 299 | |
| 300 | /** |
| 301 | * tipc_disc_reset - reset object to send periodic link setup requests |
Ying Xue | c93d3ba | 2015-01-09 15:27:04 +0800 | [diff] [blame] | 302 | * @net: the applicable net namespace |
Jon Paul Maloy | 1a90632 | 2015-11-19 14:30:47 -0500 | [diff] [blame] | 303 | * @b: ptr to bearer issuing requests |
Ying Xue | a8b9b96e | 2014-04-21 10:55:52 +0800 | [diff] [blame] | 304 | * @dest_domain: network domain to which links can be established |
| 305 | */ |
Jon Paul Maloy | 1a90632 | 2015-11-19 14:30:47 -0500 | [diff] [blame] | 306 | void tipc_disc_reset(struct net *net, struct tipc_bearer *b) |
Ying Xue | a8b9b96e | 2014-04-21 10:55:52 +0800 | [diff] [blame] | 307 | { |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 308 | struct tipc_discoverer *d = b->disc; |
| 309 | struct tipc_media_addr maddr; |
Jon Paul Maloy | 60852d6 | 2015-10-22 08:51:44 -0400 | [diff] [blame] | 310 | struct sk_buff *skb; |
Ying Xue | a8b9b96e | 2014-04-21 10:55:52 +0800 | [diff] [blame] | 311 | |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 312 | spin_lock_bh(&d->lock); |
| 313 | tipc_disc_init_msg(net, d->skb, DSC_REQ_MSG, b); |
| 314 | d->net = net; |
| 315 | d->bearer_id = b->identity; |
| 316 | d->domain = b->domain; |
| 317 | d->num_nodes = 0; |
| 318 | d->timer_intv = TIPC_DISC_INIT; |
| 319 | memcpy(&maddr, &d->dest, sizeof(maddr)); |
| 320 | mod_timer(&d->timer, jiffies + d->timer_intv); |
| 321 | skb = skb_clone(d->skb, GFP_ATOMIC); |
| 322 | spin_unlock_bh(&d->lock); |
Jon Paul Maloy | 60852d6 | 2015-10-22 08:51:44 -0400 | [diff] [blame] | 323 | if (skb) |
Jon Maloy | b39e465 | 2018-03-22 20:42:46 +0100 | [diff] [blame^] | 324 | tipc_bearer_xmit_skb(net, b->identity, skb, &maddr); |
Ying Xue | a8b9b96e | 2014-04-21 10:55:52 +0800 | [diff] [blame] | 325 | } |