Lines Matching full:call
24 * Post a call for attention by the socket or kernel service. Further
27 void rxrpc_notify_socket(struct rxrpc_call *call) in rxrpc_notify_socket() argument
32 _enter("%d", call->debug_id); in rxrpc_notify_socket()
34 if (!list_empty(&call->recvmsg_link)) in rxrpc_notify_socket()
39 rx = rcu_dereference(call->socket); in rxrpc_notify_socket()
42 if (call->notify_rx) { in rxrpc_notify_socket()
43 spin_lock_bh(&call->notify_lock); in rxrpc_notify_socket()
44 call->notify_rx(sk, call, call->user_call_ID); in rxrpc_notify_socket()
45 spin_unlock_bh(&call->notify_lock); in rxrpc_notify_socket()
48 if (list_empty(&call->recvmsg_link)) { in rxrpc_notify_socket()
49 rxrpc_get_call(call, rxrpc_call_got); in rxrpc_notify_socket()
50 list_add_tail(&call->recvmsg_link, &rx->recvmsg_q); in rxrpc_notify_socket()
55 _debug("call %ps", sk->sk_data_ready); in rxrpc_notify_socket()
66 * Pass a call terminating message to userspace.
68 static int rxrpc_recvmsg_term(struct rxrpc_call *call, struct msghdr *msg) in rxrpc_recvmsg_term() argument
73 switch (call->completion) { in rxrpc_recvmsg_term()
76 if (rxrpc_is_service_call(call)) in rxrpc_recvmsg_term()
80 tmp = call->abort_code; in rxrpc_recvmsg_term()
84 tmp = call->abort_code; in rxrpc_recvmsg_term()
88 tmp = -call->error; in rxrpc_recvmsg_term()
92 tmp = -call->error; in rxrpc_recvmsg_term()
96 pr_err("Invalid terminal call state %u\n", call->state); in rxrpc_recvmsg_term()
101 trace_rxrpc_recvmsg(call, rxrpc_recvmsg_terminal, call->rx_hard_ack, in rxrpc_recvmsg_term()
102 call->rx_pkt_offset, call->rx_pkt_len, ret); in rxrpc_recvmsg_term()
107 * Pass back notification of a new call. The call is added to the
108 * to-be-accepted list. This means that the next call to be accepted might not
109 * be the last call seen awaiting acceptance, but unless we leave this on the
114 struct rxrpc_call *call, in rxrpc_recvmsg_new_call() argument
124 list_del_init(&call->recvmsg_link); in rxrpc_recvmsg_new_call()
127 rxrpc_get_call(call, rxrpc_call_got); in rxrpc_recvmsg_new_call()
129 list_add_tail(&call->accept_link, &rx->to_be_accepted); in rxrpc_recvmsg_new_call()
133 trace_rxrpc_recvmsg(call, rxrpc_recvmsg_to_be_accepted, 1, 0, 0, ret); in rxrpc_recvmsg_new_call()
140 static void rxrpc_end_rx_phase(struct rxrpc_call *call, rxrpc_serial_t serial) in rxrpc_end_rx_phase() argument
142 _enter("%d,%s", call->debug_id, rxrpc_call_states[call->state]); in rxrpc_end_rx_phase()
144 trace_rxrpc_receive(call, rxrpc_receive_end, 0, call->rx_top); in rxrpc_end_rx_phase()
145 ASSERTCMP(call->rx_hard_ack, ==, call->rx_top); in rxrpc_end_rx_phase()
147 if (call->state == RXRPC_CALL_CLIENT_RECV_REPLY) { in rxrpc_end_rx_phase()
148 rxrpc_propose_ACK(call, RXRPC_ACK_IDLE, 0, serial, false, true, in rxrpc_end_rx_phase()
150 //rxrpc_send_ack_packet(call, false, NULL); in rxrpc_end_rx_phase()
153 write_lock_bh(&call->state_lock); in rxrpc_end_rx_phase()
155 switch (call->state) { in rxrpc_end_rx_phase()
157 __rxrpc_call_completed(call); in rxrpc_end_rx_phase()
158 write_unlock_bh(&call->state_lock); in rxrpc_end_rx_phase()
162 call->tx_phase = true; in rxrpc_end_rx_phase()
163 call->state = RXRPC_CALL_SERVER_ACK_REQUEST; in rxrpc_end_rx_phase()
164 call->expect_req_by = jiffies + MAX_JIFFY_OFFSET; in rxrpc_end_rx_phase()
165 write_unlock_bh(&call->state_lock); in rxrpc_end_rx_phase()
166 rxrpc_propose_ACK(call, RXRPC_ACK_DELAY, 0, serial, false, true, in rxrpc_end_rx_phase()
170 write_unlock_bh(&call->state_lock); in rxrpc_end_rx_phase()
178 static void rxrpc_rotate_rx_window(struct rxrpc_call *call) in rxrpc_rotate_rx_window() argument
187 _enter("%d", call->debug_id); in rxrpc_rotate_rx_window()
189 hard_ack = call->rx_hard_ack; in rxrpc_rotate_rx_window()
190 top = smp_load_acquire(&call->rx_top); in rxrpc_rotate_rx_window()
195 skb = call->rxtx_buffer[ix]; in rxrpc_rotate_rx_window()
200 if (call->rxtx_annotations[ix] & RXRPC_RX_ANNO_JUMBO) in rxrpc_rotate_rx_window()
201 serial += (call->rxtx_annotations[ix] & RXRPC_RX_ANNO_JUMBO) - 1; in rxrpc_rotate_rx_window()
203 call->rxtx_buffer[ix] = NULL; in rxrpc_rotate_rx_window()
204 call->rxtx_annotations[ix] = 0; in rxrpc_rotate_rx_window()
206 smp_store_release(&call->rx_hard_ack, hard_ack); in rxrpc_rotate_rx_window()
211 trace_rxrpc_receive(call, rxrpc_receive_rotate, serial, hard_ack); in rxrpc_rotate_rx_window()
213 rxrpc_end_rx_phase(call, serial); in rxrpc_rotate_rx_window()
216 if (after_eq(hard_ack, call->ackr_consumed + 2) || in rxrpc_rotate_rx_window()
217 after_eq(top, call->ackr_seen + 2) || in rxrpc_rotate_rx_window()
218 (hard_ack == top && after(hard_ack, call->ackr_consumed))) in rxrpc_rotate_rx_window()
219 rxrpc_propose_ACK(call, RXRPC_ACK_DELAY, 0, serial, in rxrpc_rotate_rx_window()
222 if (call->ackr_reason && call->ackr_reason != RXRPC_ACK_DELAY) in rxrpc_rotate_rx_window()
223 rxrpc_send_ack_packet(call, false, NULL); in rxrpc_rotate_rx_window()
233 static int rxrpc_verify_packet(struct rxrpc_call *call, struct sk_buff *skb, in rxrpc_verify_packet() argument
254 return call->conn->security->verify_packet(call, skb, offset, len, in rxrpc_verify_packet()
268 static int rxrpc_locate_data(struct rxrpc_call *call, struct sk_buff *skb, in rxrpc_locate_data() argument
287 ret = rxrpc_verify_packet(call, skb, annotation, offset, len); in rxrpc_locate_data()
295 call->conn->security->locate_data(call, skb, _offset, _len); in rxrpc_locate_data()
300 * Deliver messages to a call. This keeps processing packets until the buffer
304 static int rxrpc_recvmsg_data(struct socket *sock, struct rxrpc_call *call, in rxrpc_recvmsg_data() argument
316 if (test_and_clear_bit(RXRPC_CALL_RX_UNDERRUN, &call->flags) && in rxrpc_recvmsg_data()
317 call->ackr_reason) in rxrpc_recvmsg_data()
318 rxrpc_send_ack_packet(call, false, NULL); in rxrpc_recvmsg_data()
320 rx_pkt_offset = call->rx_pkt_offset; in rxrpc_recvmsg_data()
321 rx_pkt_len = call->rx_pkt_len; in rxrpc_recvmsg_data()
323 if (call->state >= RXRPC_CALL_SERVER_ACK_REQUEST) { in rxrpc_recvmsg_data()
324 seq = call->rx_hard_ack; in rxrpc_recvmsg_data()
330 hard_ack = call->rx_hard_ack; in rxrpc_recvmsg_data()
332 while (top = smp_load_acquire(&call->rx_top), in rxrpc_recvmsg_data()
336 skb = call->rxtx_buffer[ix]; in rxrpc_recvmsg_data()
338 trace_rxrpc_recvmsg(call, rxrpc_recvmsg_hole, seq, in rxrpc_recvmsg_data()
347 trace_rxrpc_receive(call, rxrpc_receive_front, in rxrpc_recvmsg_data()
354 ret2 = rxrpc_locate_data(call, skb, in rxrpc_recvmsg_data()
355 &call->rxtx_annotations[ix], in rxrpc_recvmsg_data()
357 trace_rxrpc_recvmsg(call, rxrpc_recvmsg_next, seq, in rxrpc_recvmsg_data()
364 trace_rxrpc_recvmsg(call, rxrpc_recvmsg_cont, seq, in rxrpc_recvmsg_data()
388 trace_rxrpc_recvmsg(call, rxrpc_recvmsg_full, seq, in rxrpc_recvmsg_data()
398 rxrpc_rotate_rx_window(call); in rxrpc_recvmsg_data()
403 ASSERTCMP(seq, ==, READ_ONCE(call->rx_top)); in rxrpc_recvmsg_data()
413 call->rx_pkt_offset = rx_pkt_offset; in rxrpc_recvmsg_data()
414 call->rx_pkt_len = rx_pkt_len; in rxrpc_recvmsg_data()
417 trace_rxrpc_recvmsg(call, rxrpc_recvmsg_data_return, seq, in rxrpc_recvmsg_data()
420 set_bit(RXRPC_CALL_RX_UNDERRUN, &call->flags); in rxrpc_recvmsg_data()
432 struct rxrpc_call *call; in rxrpc_recvmsg() local
462 call = NULL; in rxrpc_recvmsg()
486 /* Find the next call and dequeue it if we're not just peeking. If we in rxrpc_recvmsg()
491 call = list_entry(l, struct rxrpc_call, recvmsg_link); in rxrpc_recvmsg()
493 list_del_init(&call->recvmsg_link); in rxrpc_recvmsg()
495 rxrpc_get_call(call, rxrpc_call_got); in rxrpc_recvmsg()
498 trace_rxrpc_recvmsg(call, rxrpc_recvmsg_dequeue, 0, 0, 0, 0); in rxrpc_recvmsg()
500 /* We're going to drop the socket lock, so we need to lock the call in rxrpc_recvmsg()
503 if (!mutex_trylock(&call->user_mutex)) { in rxrpc_recvmsg()
508 if (mutex_lock_interruptible(&call->user_mutex) < 0) in rxrpc_recvmsg()
514 if (test_bit(RXRPC_CALL_RELEASED, &call->flags)) in rxrpc_recvmsg()
517 if (test_bit(RXRPC_CALL_HAS_USERID, &call->flags)) { in rxrpc_recvmsg()
519 unsigned int id32 = call->user_call_ID; in rxrpc_recvmsg()
524 unsigned long idl = call->user_call_ID; in rxrpc_recvmsg()
533 if (msg->msg_name && call->peer) { in rxrpc_recvmsg()
535 size_t len = sizeof(call->peer->srx); in rxrpc_recvmsg()
537 memcpy(msg->msg_name, &call->peer->srx, len); in rxrpc_recvmsg()
538 srx->srx_service = call->service_id; in rxrpc_recvmsg()
542 switch (READ_ONCE(call->state)) { in rxrpc_recvmsg()
544 ret = rxrpc_recvmsg_new_call(rx, call, msg, flags); in rxrpc_recvmsg()
549 ret = rxrpc_recvmsg_data(sock, call, msg, &msg->msg_iter, len, in rxrpc_recvmsg()
554 if (after(call->rx_top, call->rx_hard_ack) && in rxrpc_recvmsg()
555 call->rxtx_buffer[(call->rx_hard_ack + 1) & RXRPC_RXTX_BUFF_MASK]) in rxrpc_recvmsg()
556 rxrpc_notify_socket(call); in rxrpc_recvmsg()
566 if (call->state == RXRPC_CALL_COMPLETE) { in rxrpc_recvmsg()
567 ret = rxrpc_recvmsg_term(call, msg); in rxrpc_recvmsg()
571 rxrpc_release_call(rx, call); in rxrpc_recvmsg()
583 mutex_unlock(&call->user_mutex); in rxrpc_recvmsg()
584 rxrpc_put_call(call, rxrpc_call_put); in rxrpc_recvmsg()
585 trace_rxrpc_recvmsg(call, rxrpc_recvmsg_return, 0, 0, 0, ret); in rxrpc_recvmsg()
591 list_add(&call->recvmsg_link, &rx->recvmsg_q); in rxrpc_recvmsg()
593 trace_rxrpc_recvmsg(call, rxrpc_recvmsg_requeue, 0, 0, 0, 0); in rxrpc_recvmsg()
595 rxrpc_put_call(call, rxrpc_call_put); in rxrpc_recvmsg()
600 trace_rxrpc_recvmsg(call, rxrpc_recvmsg_return, 0, 0, 0, ret); in rxrpc_recvmsg()
607 call = NULL; in rxrpc_recvmsg()
613 * @sock: The socket that the call exists on
614 * @call: The call to send data through
621 * state of a call. Returns 0 if got what was asked for and there's more
630 int rxrpc_kernel_recv_data(struct socket *sock, struct rxrpc_call *call, in rxrpc_kernel_recv_data() argument
638 call->debug_id, rxrpc_call_states[call->state], in rxrpc_kernel_recv_data()
641 ASSERTCMP(call->state, !=, RXRPC_CALL_SERVER_ACCEPTING); in rxrpc_kernel_recv_data()
643 mutex_lock(&call->user_mutex); in rxrpc_kernel_recv_data()
645 switch (READ_ONCE(call->state)) { in rxrpc_kernel_recv_data()
649 ret = rxrpc_recvmsg_data(sock, call, NULL, iter, in rxrpc_kernel_recv_data()
683 switch (call->ackr_reason) { in rxrpc_kernel_recv_data()
691 rxrpc_send_ack_packet(call, false, NULL); in rxrpc_kernel_recv_data()
695 *_service = call->service_id; in rxrpc_kernel_recv_data()
696 mutex_unlock(&call->user_mutex); in rxrpc_kernel_recv_data()
701 trace_rxrpc_rx_eproto(call, 0, tracepoint_string("short_data")); in rxrpc_kernel_recv_data()
705 trace_rxrpc_rx_eproto(call, 0, tracepoint_string("excess_data")); in rxrpc_kernel_recv_data()
709 *_abort = call->abort_code; in rxrpc_kernel_recv_data()
710 ret = call->error; in rxrpc_kernel_recv_data()
711 if (call->completion == RXRPC_CALL_SUCCEEDED) { in rxrpc_kernel_recv_data()