Lines Matching refs:call
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()
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()
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()
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()
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()
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()
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()
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()
599 trace_rxrpc_recvmsg(call, rxrpc_recvmsg_return, 0, 0, 0, ret); in rxrpc_recvmsg()
606 call = NULL; in rxrpc_recvmsg()
629 int rxrpc_kernel_recv_data(struct socket *sock, struct rxrpc_call *call, in rxrpc_kernel_recv_data() argument
637 call->debug_id, rxrpc_call_states[call->state], in rxrpc_kernel_recv_data()
640 ASSERTCMP(call->state, !=, RXRPC_CALL_SERVER_ACCEPTING); in rxrpc_kernel_recv_data()
642 mutex_lock(&call->user_mutex); in rxrpc_kernel_recv_data()
644 switch (READ_ONCE(call->state)) { in rxrpc_kernel_recv_data()
648 ret = rxrpc_recvmsg_data(sock, call, NULL, iter, in rxrpc_kernel_recv_data()
682 switch (call->ackr_reason) { in rxrpc_kernel_recv_data()
690 rxrpc_send_ack_packet(call, false, NULL); in rxrpc_kernel_recv_data()
694 *_service = call->service_id; in rxrpc_kernel_recv_data()
695 mutex_unlock(&call->user_mutex); in rxrpc_kernel_recv_data()
700 trace_rxrpc_rx_eproto(call, 0, tracepoint_string("short_data")); in rxrpc_kernel_recv_data()
704 trace_rxrpc_rx_eproto(call, 0, tracepoint_string("excess_data")); in rxrpc_kernel_recv_data()
708 *_abort = call->abort_code; in rxrpc_kernel_recv_data()
709 ret = call->error; in rxrpc_kernel_recv_data()
710 if (call->completion == RXRPC_CALL_SUCCEEDED) { in rxrpc_kernel_recv_data()