diff options
Diffstat (limited to 'net/rxrpc/ar-recvmsg.c')
-rw-r--r-- | net/rxrpc/ar-recvmsg.c | 75 |
1 files changed, 73 insertions, 2 deletions
diff --git a/net/rxrpc/ar-recvmsg.c b/net/rxrpc/ar-recvmsg.c index e947d5c15900..f19121d4795b 100644 --- a/net/rxrpc/ar-recvmsg.c +++ b/net/rxrpc/ar-recvmsg.c | |||
@@ -19,7 +19,7 @@ | |||
19 | * removal a call's user ID from the socket tree to make the user ID available | 19 | * removal a call's user ID from the socket tree to make the user ID available |
20 | * again and so that it won't be seen again in association with that call | 20 | * again and so that it won't be seen again in association with that call |
21 | */ | 21 | */ |
22 | static void rxrpc_remove_user_ID(struct rxrpc_sock *rx, struct rxrpc_call *call) | 22 | void rxrpc_remove_user_ID(struct rxrpc_sock *rx, struct rxrpc_call *call) |
23 | { | 23 | { |
24 | _debug("RELEASE CALL %d", call->debug_id); | 24 | _debug("RELEASE CALL %d", call->debug_id); |
25 | 25 | ||
@@ -33,7 +33,7 @@ static void rxrpc_remove_user_ID(struct rxrpc_sock *rx, struct rxrpc_call *call) | |||
33 | read_lock_bh(&call->state_lock); | 33 | read_lock_bh(&call->state_lock); |
34 | if (!test_bit(RXRPC_CALL_RELEASED, &call->flags) && | 34 | if (!test_bit(RXRPC_CALL_RELEASED, &call->flags) && |
35 | !test_and_set_bit(RXRPC_CALL_RELEASE, &call->events)) | 35 | !test_and_set_bit(RXRPC_CALL_RELEASE, &call->events)) |
36 | schedule_work(&call->processor); | 36 | rxrpc_queue_call(call); |
37 | read_unlock_bh(&call->state_lock); | 37 | read_unlock_bh(&call->state_lock); |
38 | } | 38 | } |
39 | 39 | ||
@@ -364,3 +364,74 @@ wait_error: | |||
364 | return copied; | 364 | return copied; |
365 | 365 | ||
366 | } | 366 | } |
367 | |||
368 | /** | ||
369 | * rxrpc_kernel_data_delivered - Record delivery of data message | ||
370 | * @skb: Message holding data | ||
371 | * | ||
372 | * Record the delivery of a data message. This permits RxRPC to keep its | ||
373 | * tracking correct. The socket buffer will be deleted. | ||
374 | */ | ||
375 | void rxrpc_kernel_data_delivered(struct sk_buff *skb) | ||
376 | { | ||
377 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); | ||
378 | struct rxrpc_call *call = sp->call; | ||
379 | |||
380 | ASSERTCMP(ntohl(sp->hdr.seq), >=, call->rx_data_recv); | ||
381 | ASSERTCMP(ntohl(sp->hdr.seq), <=, call->rx_data_recv + 1); | ||
382 | call->rx_data_recv = ntohl(sp->hdr.seq); | ||
383 | |||
384 | ASSERTCMP(ntohl(sp->hdr.seq), >, call->rx_data_eaten); | ||
385 | rxrpc_free_skb(skb); | ||
386 | } | ||
387 | |||
388 | EXPORT_SYMBOL(rxrpc_kernel_data_delivered); | ||
389 | |||
390 | /** | ||
391 | * rxrpc_kernel_is_data_last - Determine if data message is last one | ||
392 | * @skb: Message holding data | ||
393 | * | ||
394 | * Determine if data message is last one for the parent call. | ||
395 | */ | ||
396 | bool rxrpc_kernel_is_data_last(struct sk_buff *skb) | ||
397 | { | ||
398 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); | ||
399 | |||
400 | ASSERTCMP(skb->mark, ==, RXRPC_SKB_MARK_DATA); | ||
401 | |||
402 | return sp->hdr.flags & RXRPC_LAST_PACKET; | ||
403 | } | ||
404 | |||
405 | EXPORT_SYMBOL(rxrpc_kernel_is_data_last); | ||
406 | |||
407 | /** | ||
408 | * rxrpc_kernel_get_abort_code - Get the abort code from an RxRPC abort message | ||
409 | * @skb: Message indicating an abort | ||
410 | * | ||
411 | * Get the abort code from an RxRPC abort message. | ||
412 | */ | ||
413 | u32 rxrpc_kernel_get_abort_code(struct sk_buff *skb) | ||
414 | { | ||
415 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); | ||
416 | |||
417 | ASSERTCMP(skb->mark, ==, RXRPC_SKB_MARK_REMOTE_ABORT); | ||
418 | |||
419 | return sp->call->abort_code; | ||
420 | } | ||
421 | |||
422 | EXPORT_SYMBOL(rxrpc_kernel_get_abort_code); | ||
423 | |||
424 | /** | ||
425 | * rxrpc_kernel_get_error - Get the error number from an RxRPC error message | ||
426 | * @skb: Message indicating an error | ||
427 | * | ||
428 | * Get the error number from an RxRPC error message. | ||
429 | */ | ||
430 | int rxrpc_kernel_get_error_number(struct sk_buff *skb) | ||
431 | { | ||
432 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); | ||
433 | |||
434 | return sp->error; | ||
435 | } | ||
436 | |||
437 | EXPORT_SYMBOL(rxrpc_kernel_get_error_number); | ||