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