aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/bearer.c8
-rw-r--r--net/tipc/bearer.h2
-rw-r--r--net/tipc/discover.c303
-rw-r--r--net/tipc/discover.h8
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 */
62struct tipc_link_req { 62struct 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 */
80static void tipc_disc_init_msg(struct net *net, struct sk_buff *buf, u32 type, 80static 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
98static 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 */
123void tipc_disc_rcv(struct net *net, struct sk_buff *skb, 136void 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 */
187static void disc_update(struct tipc_link_req *req) 189void 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 */
202void tipc_disc_add_dest(struct tipc_link_req *req) 198void 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;
213void 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 */
227static void disc_timeout(struct timer_list *t) 219static 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);
260exit: 245exit:
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:
273int tipc_disc_create(struct net *net, struct tipc_bearer *b, 260int 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 */
306void tipc_disc_delete(struct tipc_link_req *req) 293void 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 */
319void tipc_disc_reset(struct net *net, struct tipc_bearer *b) 306void 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
40struct tipc_link_req; 40struct tipc_discoverer;
41 41
42int tipc_disc_create(struct net *net, struct tipc_bearer *b_ptr, 42int 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);
44void tipc_disc_delete(struct tipc_link_req *req); 44void tipc_disc_delete(struct tipc_discoverer *req);
45void tipc_disc_reset(struct net *net, struct tipc_bearer *b_ptr); 45void tipc_disc_reset(struct net *net, struct tipc_bearer *b_ptr);
46void tipc_disc_add_dest(struct tipc_link_req *req); 46void tipc_disc_add_dest(struct tipc_discoverer *req);
47void tipc_disc_remove_dest(struct tipc_link_req *req); 47void tipc_disc_remove_dest(struct tipc_discoverer *req);
48void tipc_disc_rcv(struct net *net, struct sk_buff *buf, 48void tipc_disc_rcv(struct net *net, struct sk_buff *buf,
49 struct tipc_bearer *b_ptr); 49 struct tipc_bearer *b_ptr);
50 50