Lines Matching +full:serial +full:- +full:state

1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* connection-level event handling
17 #include "ar-internal.h"
20 * Set the completion state on an aborted connection.
28 if (conn->state != RXRPC_CONN_ABORTED) { in rxrpc_set_conn_aborted()
29 spin_lock_irq(&conn->state_lock); in rxrpc_set_conn_aborted()
30 if (conn->state != RXRPC_CONN_ABORTED) { in rxrpc_set_conn_aborted()
31 conn->abort_code = abort_code; in rxrpc_set_conn_aborted()
32 conn->error = err; in rxrpc_set_conn_aborted()
33 conn->completion = compl; in rxrpc_set_conn_aborted()
34 /* Order the abort info before the state change. */ in rxrpc_set_conn_aborted()
35 smp_store_release(&conn->state, RXRPC_CONN_ABORTED); in rxrpc_set_conn_aborted()
36 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_set_conn_aborted()
37 set_bit(RXRPC_CONN_EV_ABORT_CALLS, &conn->events); in rxrpc_set_conn_aborted()
40 spin_unlock_irq(&conn->state_lock); in rxrpc_set_conn_aborted()
56 trace_rxrpc_abort(0, why, sp->hdr.cid, sp->hdr.callNumber, in rxrpc_abort_conn()
57 sp->hdr.seq, abort_code, err); in rxrpc_abort_conn()
60 return -EPROTO; in rxrpc_abort_conn()
70 rxrpc_set_conn_aborted(conn, skb, skb->priority, -ECONNABORTED, in rxrpc_input_conn_abort()
95 u32 serial, max_mtu, if_mtu, call_id, padding; in rxrpc_conn_retransmit_call() local
97 _enter("%d", conn->debug_id); in rxrpc_conn_retransmit_call()
99 if (sp && sp->hdr.type == RXRPC_PACKET_TYPE_ACK) { in rxrpc_conn_retransmit_call()
107 chan = &conn->channels[channel]; in rxrpc_conn_retransmit_call()
112 call_id = chan->last_call; in rxrpc_conn_retransmit_call()
113 if (skb && call_id != sp->hdr.callNumber) in rxrpc_conn_retransmit_call()
116 msg.msg_name = &conn->peer->srx.transport; in rxrpc_conn_retransmit_call()
117 msg.msg_namelen = conn->peer->srx.transport_len; in rxrpc_conn_retransmit_call()
129 serial = rxrpc_get_next_serial(conn); in rxrpc_conn_retransmit_call()
131 pkt.whdr.epoch = htonl(conn->proto.epoch); in rxrpc_conn_retransmit_call()
132 pkt.whdr.cid = htonl(conn->proto.cid | channel); in rxrpc_conn_retransmit_call()
134 pkt.whdr.serial = htonl(serial); in rxrpc_conn_retransmit_call()
136 pkt.whdr.type = chan->last_type; in rxrpc_conn_retransmit_call()
137 pkt.whdr.flags = conn->out_clientflag; in rxrpc_conn_retransmit_call()
139 pkt.whdr.securityIndex = conn->security_ix; in rxrpc_conn_retransmit_call()
141 pkt.whdr.serviceId = htons(conn->service_id); in rxrpc_conn_retransmit_call()
144 switch (chan->last_type) { in rxrpc_conn_retransmit_call()
146 pkt.abort_code = htonl(chan->last_abort); in rxrpc_conn_retransmit_call()
153 if_mtu = conn->peer->if_mtu - conn->peer->hdrsize; in rxrpc_conn_retransmit_call()
154 if (conn->peer->ackr_adv_pmtud) { in rxrpc_conn_retransmit_call()
155 max_mtu = umax(conn->peer->max_data, rxrpc_rx_mtu); in rxrpc_conn_retransmit_call()
161 pkt.ack.maxSkew = htons(skb ? skb->priority : 0); in rxrpc_conn_retransmit_call()
162 pkt.ack.firstPacket = htonl(chan->last_seq + 1); in rxrpc_conn_retransmit_call()
163 pkt.ack.previousPacket = htonl(chan->last_seq); in rxrpc_conn_retransmit_call()
164 pkt.ack.serial = htonl(skb ? sp->hdr.serial : 0); in rxrpc_conn_retransmit_call()
177 trace_rxrpc_tx_ack(chan->call_debug_id, serial, in rxrpc_conn_retransmit_call()
179 ntohl(pkt.ack.serial), in rxrpc_conn_retransmit_call()
188 ret = kernel_sendmsg(conn->local->socket, &msg, iov, ioc, len); in rxrpc_conn_retransmit_call()
189 conn->peer->last_tx_at = ktime_get_seconds(); in rxrpc_conn_retransmit_call()
191 trace_rxrpc_tx_fail(chan->call_debug_id, serial, ret, in rxrpc_conn_retransmit_call()
194 trace_rxrpc_tx_packet(chan->call_debug_id, &pkt.whdr, in rxrpc_conn_retransmit_call()
201 * pass a connection-level abort onto all calls on that connection
208 _enter("{%d},%x", conn->debug_id, conn->abort_code); in rxrpc_abort_calls()
211 call = conn->channels[i].call; in rxrpc_abort_calls()
215 conn->completion, in rxrpc_abort_calls()
216 conn->abort_code, in rxrpc_abort_calls()
217 conn->error); in rxrpc_abort_calls()
226 * mark a call as being on a now-secured channel
227 * - must be called with BH's disabled.
231 if (call && __test_and_clear_bit(RXRPC_CALL_CONN_CHALLENGING, &call->flags)) in rxrpc_call_is_secure()
236 * connection-level Rx packet processor
244 if (conn->state == RXRPC_CONN_ABORTED) in rxrpc_process_event()
245 return -ECONNABORTED; in rxrpc_process_event()
247 _enter("{%d},{%u,%%%u},", conn->debug_id, sp->hdr.type, sp->hdr.serial); in rxrpc_process_event()
249 switch (sp->hdr.type) { in rxrpc_process_event()
251 return conn->security->respond_to_challenge(conn, skb); in rxrpc_process_event()
254 ret = conn->security->verify_response(conn, skb); in rxrpc_process_event()
258 ret = conn->security->init_connection_security( in rxrpc_process_event()
259 conn, conn->key->payload.data[0]); in rxrpc_process_event()
263 spin_lock_irq(&conn->state_lock); in rxrpc_process_event()
264 if (conn->state == RXRPC_CONN_SERVICE_CHALLENGING) in rxrpc_process_event()
265 conn->state = RXRPC_CONN_SERVICE; in rxrpc_process_event()
266 spin_unlock_irq(&conn->state_lock); in rxrpc_process_event()
268 if (conn->state == RXRPC_CONN_SERVICE) { in rxrpc_process_event()
269 /* Offload call state flipping to the I/O thread. As in rxrpc_process_event()
273 sp->conn = rxrpc_get_connection(conn, rxrpc_conn_get_poke_secured); in rxrpc_process_event()
274 skb->mark = RXRPC_SKB_MARK_SERVICE_CONN_SECURED; in rxrpc_process_event()
276 skb_queue_head(&conn->local->rx_queue, skb); in rxrpc_process_event()
277 rxrpc_wake_up_io_thread(conn->local); in rxrpc_process_event()
283 return -EPROTO; in rxrpc_process_event()
292 if (conn->security->issue_challenge(conn) < 0) in rxrpc_secure_connection()
293 rxrpc_abort_conn(conn, NULL, RX_CALL_DEAD, -ENOMEM, in rxrpc_secure_connection()
310 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_process_delayed_final_acks()
313 if (!test_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags)) in rxrpc_process_delayed_final_acks()
316 ack_at = chan->final_ack_at; in rxrpc_process_delayed_final_acks()
326 &conn->flags)) in rxrpc_process_delayed_final_acks()
338 * connection-level event processor
345 if (test_and_clear_bit(RXRPC_CONN_EV_CHALLENGE, &conn->events)) in rxrpc_do_process_connection()
348 /* go through the conn-level event packets, releasing the ref on this in rxrpc_do_process_connection()
350 while ((skb = skb_dequeue(&conn->rx_queue))) { in rxrpc_do_process_connection()
354 case -ENOMEM: in rxrpc_do_process_connection()
355 case -EAGAIN: in rxrpc_do_process_connection()
356 skb_queue_head(&conn->rx_queue, skb); in rxrpc_do_process_connection()
373 if (__rxrpc_use_local(conn->local, rxrpc_local_use_conn_work)) { in rxrpc_process_connection()
375 rxrpc_unuse_local(conn->local, rxrpc_local_unuse_conn_work); in rxrpc_process_connection()
380 * post connection-level events to the connection
381 * - this includes challenges, responses, some aborts and call terminal packet
390 skb_queue_tail(&conn->rx_queue, skb); in rxrpc_post_packet_to_conn()
395 * Input a connection-level packet.
401 switch (sp->hdr.type) { in rxrpc_input_conn_packet()
416 if (conn->completion == RXRPC_CALL_LOCALLY_ABORTED) in rxrpc_input_conn_packet()
436 if (test_and_clear_bit(RXRPC_CONN_EV_ABORT_CALLS, &conn->events)) in rxrpc_input_conn_event()
440 switch (skb->mark) { in rxrpc_input_conn_event()
442 if (conn->state != RXRPC_CONN_SERVICE) in rxrpc_input_conn_event()
446 rxrpc_call_is_secure(conn->channels[loop].call); in rxrpc_input_conn_event()
452 if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK) in rxrpc_input_conn_event()