diff options
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r-- | net/tipc/msg.c | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index ff7362d40cb3..08b4cc7d496d 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -331,16 +331,15 @@ error: | |||
331 | 331 | ||
332 | /** | 332 | /** |
333 | * tipc_msg_bundle(): Append contents of a buffer to tail of an existing one | 333 | * tipc_msg_bundle(): Append contents of a buffer to tail of an existing one |
334 | * @bskb: the buffer to append to ("bundle") | 334 | * @skb: the buffer to append to ("bundle") |
335 | * @skb: buffer to be appended | 335 | * @msg: message to be appended |
336 | * @mtu: max allowable size for the bundle buffer | 336 | * @mtu: max allowable size for the bundle buffer |
337 | * Consumes buffer if successful | 337 | * Consumes buffer if successful |
338 | * Returns true if bundling could be performed, otherwise false | 338 | * Returns true if bundling could be performed, otherwise false |
339 | */ | 339 | */ |
340 | bool tipc_msg_bundle(struct sk_buff *bskb, struct sk_buff *skb, u32 mtu) | 340 | bool tipc_msg_bundle(struct sk_buff *skb, struct tipc_msg *msg, u32 mtu) |
341 | { | 341 | { |
342 | struct tipc_msg *bmsg; | 342 | struct tipc_msg *bmsg; |
343 | struct tipc_msg *msg = buf_msg(skb); | ||
344 | unsigned int bsz; | 343 | unsigned int bsz; |
345 | unsigned int msz = msg_size(msg); | 344 | unsigned int msz = msg_size(msg); |
346 | u32 start, pad; | 345 | u32 start, pad; |
@@ -348,9 +347,9 @@ bool tipc_msg_bundle(struct sk_buff *bskb, struct sk_buff *skb, u32 mtu) | |||
348 | 347 | ||
349 | if (likely(msg_user(msg) == MSG_FRAGMENTER)) | 348 | if (likely(msg_user(msg) == MSG_FRAGMENTER)) |
350 | return false; | 349 | return false; |
351 | if (!bskb) | 350 | if (!skb) |
352 | return false; | 351 | return false; |
353 | bmsg = buf_msg(bskb); | 352 | bmsg = buf_msg(skb); |
354 | bsz = msg_size(bmsg); | 353 | bsz = msg_size(bmsg); |
355 | start = align(bsz); | 354 | start = align(bsz); |
356 | pad = start - bsz; | 355 | pad = start - bsz; |
@@ -359,9 +358,9 @@ bool tipc_msg_bundle(struct sk_buff *bskb, struct sk_buff *skb, u32 mtu) | |||
359 | return false; | 358 | return false; |
360 | if (unlikely(msg_user(msg) == BCAST_PROTOCOL)) | 359 | if (unlikely(msg_user(msg) == BCAST_PROTOCOL)) |
361 | return false; | 360 | return false; |
362 | if (likely(msg_user(bmsg) != MSG_BUNDLER)) | 361 | if (unlikely(msg_user(bmsg) != MSG_BUNDLER)) |
363 | return false; | 362 | return false; |
364 | if (unlikely(skb_tailroom(bskb) < (pad + msz))) | 363 | if (unlikely(skb_tailroom(skb) < (pad + msz))) |
365 | return false; | 364 | return false; |
366 | if (unlikely(max < (start + msz))) | 365 | if (unlikely(max < (start + msz))) |
367 | return false; | 366 | return false; |
@@ -369,11 +368,10 @@ bool tipc_msg_bundle(struct sk_buff *bskb, struct sk_buff *skb, u32 mtu) | |||
369 | (msg_importance(bmsg) == TIPC_SYSTEM_IMPORTANCE)) | 368 | (msg_importance(bmsg) == TIPC_SYSTEM_IMPORTANCE)) |
370 | return false; | 369 | return false; |
371 | 370 | ||
372 | skb_put(bskb, pad + msz); | 371 | skb_put(skb, pad + msz); |
373 | skb_copy_to_linear_data_offset(bskb, start, skb->data, msz); | 372 | skb_copy_to_linear_data_offset(skb, start, msg, msz); |
374 | msg_set_size(bmsg, start + msz); | 373 | msg_set_size(bmsg, start + msz); |
375 | msg_set_msgcnt(bmsg, msg_msgcnt(bmsg) + 1); | 374 | msg_set_msgcnt(bmsg, msg_msgcnt(bmsg) + 1); |
376 | kfree_skb(skb); | ||
377 | return true; | 375 | return true; |
378 | } | 376 | } |
379 | 377 | ||
@@ -419,18 +417,18 @@ none: | |||
419 | 417 | ||
420 | /** | 418 | /** |
421 | * tipc_msg_make_bundle(): Create bundle buf and append message to its tail | 419 | * tipc_msg_make_bundle(): Create bundle buf and append message to its tail |
422 | * @list: the buffer chain | 420 | * @list: the buffer chain, where head is the buffer to replace/append |
423 | * @skb: buffer to be appended and replaced | 421 | * @skb: buffer to be created, appended to and returned in case of success |
422 | * @msg: message to be appended | ||
424 | * @mtu: max allowable size for the bundle buffer, inclusive header | 423 | * @mtu: max allowable size for the bundle buffer, inclusive header |
425 | * @dnode: destination node for message. (Not always present in header) | 424 | * @dnode: destination node for message. (Not always present in header) |
426 | * Replaces buffer if successful | ||
427 | * Returns true if success, otherwise false | 425 | * Returns true if success, otherwise false |
428 | */ | 426 | */ |
429 | bool tipc_msg_make_bundle(struct sk_buff **skb, u32 mtu, u32 dnode) | 427 | bool tipc_msg_make_bundle(struct sk_buff **skb, struct tipc_msg *msg, |
428 | u32 mtu, u32 dnode) | ||
430 | { | 429 | { |
431 | struct sk_buff *bskb; | 430 | struct sk_buff *_skb; |
432 | struct tipc_msg *bmsg; | 431 | struct tipc_msg *bmsg; |
433 | struct tipc_msg *msg = buf_msg(*skb); | ||
434 | u32 msz = msg_size(msg); | 432 | u32 msz = msg_size(msg); |
435 | u32 max = mtu - INT_H_SIZE; | 433 | u32 max = mtu - INT_H_SIZE; |
436 | 434 | ||
@@ -443,12 +441,12 @@ bool tipc_msg_make_bundle(struct sk_buff **skb, u32 mtu, u32 dnode) | |||
443 | if (msz > (max / 2)) | 441 | if (msz > (max / 2)) |
444 | return false; | 442 | return false; |
445 | 443 | ||
446 | bskb = tipc_buf_acquire(max); | 444 | _skb = tipc_buf_acquire(max); |
447 | if (!bskb) | 445 | if (!_skb) |
448 | return false; | 446 | return false; |
449 | 447 | ||
450 | skb_trim(bskb, INT_H_SIZE); | 448 | skb_trim(_skb, INT_H_SIZE); |
451 | bmsg = buf_msg(bskb); | 449 | bmsg = buf_msg(_skb); |
452 | tipc_msg_init(msg_prevnode(msg), bmsg, MSG_BUNDLER, 0, | 450 | tipc_msg_init(msg_prevnode(msg), bmsg, MSG_BUNDLER, 0, |
453 | INT_H_SIZE, dnode); | 451 | INT_H_SIZE, dnode); |
454 | if (msg_isdata(msg)) | 452 | if (msg_isdata(msg)) |
@@ -458,8 +456,8 @@ bool tipc_msg_make_bundle(struct sk_buff **skb, u32 mtu, u32 dnode) | |||
458 | msg_set_seqno(bmsg, msg_seqno(msg)); | 456 | msg_set_seqno(bmsg, msg_seqno(msg)); |
459 | msg_set_ack(bmsg, msg_ack(msg)); | 457 | msg_set_ack(bmsg, msg_ack(msg)); |
460 | msg_set_bcast_ack(bmsg, msg_bcast_ack(msg)); | 458 | msg_set_bcast_ack(bmsg, msg_bcast_ack(msg)); |
461 | tipc_msg_bundle(bskb, *skb, mtu); | 459 | tipc_msg_bundle(_skb, msg, mtu); |
462 | *skb = bskb; | 460 | *skb = _skb; |
463 | return true; | 461 | return true; |
464 | } | 462 | } |
465 | 463 | ||