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 | ||
