diff options
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r-- | net/tipc/msg.c | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index c3e96e815418..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,18 +358,20 @@ 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; |
367 | if ((msg_importance(msg) < TIPC_SYSTEM_IMPORTANCE) && | ||
368 | (msg_importance(bmsg) == TIPC_SYSTEM_IMPORTANCE)) | ||
369 | return false; | ||
368 | 370 | ||
369 | skb_put(bskb, pad + msz); | 371 | skb_put(skb, pad + msz); |
370 | skb_copy_to_linear_data_offset(bskb, start, skb->data, msz); | 372 | skb_copy_to_linear_data_offset(skb, start, msg, msz); |
371 | msg_set_size(bmsg, start + msz); | 373 | msg_set_size(bmsg, start + msz); |
372 | msg_set_msgcnt(bmsg, msg_msgcnt(bmsg) + 1); | 374 | msg_set_msgcnt(bmsg, msg_msgcnt(bmsg) + 1); |
373 | kfree_skb(skb); | ||
374 | return true; | 375 | return true; |
375 | } | 376 | } |
376 | 377 | ||
@@ -416,18 +417,18 @@ none: | |||
416 | 417 | ||
417 | /** | 418 | /** |
418 | * 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 |
419 | * @list: the buffer chain | 420 | * @list: the buffer chain, where head is the buffer to replace/append |
420 | * @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 | ||
421 | * @mtu: max allowable size for the bundle buffer, inclusive header | 423 | * @mtu: max allowable size for the bundle buffer, inclusive header |
422 | * @dnode: destination node for message. (Not always present in header) | 424 | * @dnode: destination node for message. (Not always present in header) |
423 | * Replaces buffer if successful | ||
424 | * Returns true if success, otherwise false | 425 | * Returns true if success, otherwise false |
425 | */ | 426 | */ |
426 | 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) | ||
427 | { | 429 | { |
428 | struct sk_buff *bskb; | 430 | struct sk_buff *_skb; |
429 | struct tipc_msg *bmsg; | 431 | struct tipc_msg *bmsg; |
430 | struct tipc_msg *msg = buf_msg(*skb); | ||
431 | u32 msz = msg_size(msg); | 432 | u32 msz = msg_size(msg); |
432 | u32 max = mtu - INT_H_SIZE; | 433 | u32 max = mtu - INT_H_SIZE; |
433 | 434 | ||
@@ -440,19 +441,23 @@ bool tipc_msg_make_bundle(struct sk_buff **skb, u32 mtu, u32 dnode) | |||
440 | if (msz > (max / 2)) | 441 | if (msz > (max / 2)) |
441 | return false; | 442 | return false; |
442 | 443 | ||
443 | bskb = tipc_buf_acquire(max); | 444 | _skb = tipc_buf_acquire(max); |
444 | if (!bskb) | 445 | if (!_skb) |
445 | return false; | 446 | return false; |
446 | 447 | ||
447 | skb_trim(bskb, INT_H_SIZE); | 448 | skb_trim(_skb, INT_H_SIZE); |
448 | bmsg = buf_msg(bskb); | 449 | bmsg = buf_msg(_skb); |
449 | tipc_msg_init(msg_prevnode(msg), bmsg, MSG_BUNDLER, 0, | 450 | tipc_msg_init(msg_prevnode(msg), bmsg, MSG_BUNDLER, 0, |
450 | INT_H_SIZE, dnode); | 451 | INT_H_SIZE, dnode); |
452 | if (msg_isdata(msg)) | ||
453 | msg_set_importance(bmsg, TIPC_CRITICAL_IMPORTANCE); | ||
454 | else | ||
455 | msg_set_importance(bmsg, TIPC_SYSTEM_IMPORTANCE); | ||
451 | msg_set_seqno(bmsg, msg_seqno(msg)); | 456 | msg_set_seqno(bmsg, msg_seqno(msg)); |
452 | msg_set_ack(bmsg, msg_ack(msg)); | 457 | msg_set_ack(bmsg, msg_ack(msg)); |
453 | msg_set_bcast_ack(bmsg, msg_bcast_ack(msg)); | 458 | msg_set_bcast_ack(bmsg, msg_bcast_ack(msg)); |
454 | tipc_msg_bundle(bskb, *skb, mtu); | 459 | tipc_msg_bundle(_skb, msg, mtu); |
455 | *skb = bskb; | 460 | *skb = _skb; |
456 | return true; | 461 | return true; |
457 | } | 462 | } |
458 | 463 | ||