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"
40 u32 serial, mtu, call_id, padding; in rxrpc_conn_retransmit_call() local
42 _enter("%d", conn->debug_id); in rxrpc_conn_retransmit_call()
44 if (sp && sp->hdr.type == RXRPC_PACKET_TYPE_ACK) { in rxrpc_conn_retransmit_call()
52 chan = &conn->channels[channel]; in rxrpc_conn_retransmit_call()
57 call_id = READ_ONCE(chan->last_call); in rxrpc_conn_retransmit_call()
60 if (skb && call_id != sp->hdr.callNumber) in rxrpc_conn_retransmit_call()
63 msg.msg_name = &conn->params.peer->srx.transport; in rxrpc_conn_retransmit_call()
64 msg.msg_namelen = conn->params.peer->srx.transport_len; in rxrpc_conn_retransmit_call()
76 pkt.whdr.epoch = htonl(conn->proto.epoch); in rxrpc_conn_retransmit_call()
77 pkt.whdr.cid = htonl(conn->proto.cid | channel); in rxrpc_conn_retransmit_call()
80 pkt.whdr.type = chan->last_type; in rxrpc_conn_retransmit_call()
81 pkt.whdr.flags = conn->out_clientflag; in rxrpc_conn_retransmit_call()
83 pkt.whdr.securityIndex = conn->security_ix; in rxrpc_conn_retransmit_call()
85 pkt.whdr.serviceId = htons(conn->service_id); in rxrpc_conn_retransmit_call()
88 switch (chan->last_type) { in rxrpc_conn_retransmit_call()
90 pkt.abort_code = htonl(chan->last_abort); in rxrpc_conn_retransmit_call()
97 mtu = conn->params.peer->if_mtu; in rxrpc_conn_retransmit_call()
98 mtu -= conn->params.peer->hdrsize; in rxrpc_conn_retransmit_call()
100 pkt.ack.maxSkew = htons(skb ? skb->priority : 0); in rxrpc_conn_retransmit_call()
101 pkt.ack.firstPacket = htonl(chan->last_seq + 1); in rxrpc_conn_retransmit_call()
102 pkt.ack.previousPacket = htonl(chan->last_seq); in rxrpc_conn_retransmit_call()
103 pkt.ack.serial = htonl(skb ? sp->hdr.serial : 0); in rxrpc_conn_retransmit_call()
125 if (READ_ONCE(chan->last_call) != call_id) in rxrpc_conn_retransmit_call()
128 serial = atomic_inc_return(&conn->serial); in rxrpc_conn_retransmit_call()
129 pkt.whdr.serial = htonl(serial); in rxrpc_conn_retransmit_call()
131 switch (chan->last_type) { in rxrpc_conn_retransmit_call()
133 _proto("Tx ABORT %%%u { %d } [re]", serial, conn->abort_code); in rxrpc_conn_retransmit_call()
136 trace_rxrpc_tx_ack(chan->call_debug_id, serial, in rxrpc_conn_retransmit_call()
138 ntohl(pkt.ack.serial), in rxrpc_conn_retransmit_call()
140 _proto("Tx ACK %%%u [re]", serial); in rxrpc_conn_retransmit_call()
144 ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, ioc, len); in rxrpc_conn_retransmit_call()
145 conn->params.peer->last_tx_at = ktime_get_seconds(); in rxrpc_conn_retransmit_call()
147 trace_rxrpc_tx_fail(chan->call_debug_id, serial, ret, in rxrpc_conn_retransmit_call()
150 trace_rxrpc_tx_packet(chan->call_debug_id, &pkt.whdr, in rxrpc_conn_retransmit_call()
157 * pass a connection-level abort onto all calls on that connection
161 rxrpc_serial_t serial) in rxrpc_abort_calls() argument
166 _enter("{%d},%x", conn->debug_id, conn->abort_code); in rxrpc_abort_calls()
168 spin_lock(&conn->bundle->channel_lock); in rxrpc_abort_calls()
172 conn->channels[i].call, in rxrpc_abort_calls()
173 lockdep_is_held(&conn->bundle->channel_lock)); in rxrpc_abort_calls()
176 trace_rxrpc_abort(call->debug_id, in rxrpc_abort_calls()
177 "CON", call->cid, in rxrpc_abort_calls()
178 call->call_id, 0, in rxrpc_abort_calls()
179 conn->abort_code, in rxrpc_abort_calls()
180 conn->error); in rxrpc_abort_calls()
182 trace_rxrpc_rx_abort(call, serial, in rxrpc_abort_calls()
183 conn->abort_code); in rxrpc_abort_calls()
185 conn->abort_code, in rxrpc_abort_calls()
186 conn->error); in rxrpc_abort_calls()
190 spin_unlock(&conn->bundle->channel_lock); in rxrpc_abort_calls()
195 * generate a connection-level abort
205 u32 serial; in rxrpc_abort_connection() local
208 _enter("%d,,%u,%u", conn->debug_id, error, abort_code); in rxrpc_abort_connection()
210 /* generate a connection-level abort */ in rxrpc_abort_connection()
211 spin_lock_bh(&conn->state_lock); in rxrpc_abort_connection()
212 if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) { in rxrpc_abort_connection()
213 spin_unlock_bh(&conn->state_lock); in rxrpc_abort_connection()
218 conn->error = error; in rxrpc_abort_connection()
219 conn->abort_code = abort_code; in rxrpc_abort_connection()
220 conn->state = RXRPC_CONN_LOCALLY_ABORTED; in rxrpc_abort_connection()
221 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_abort_connection()
222 spin_unlock_bh(&conn->state_lock); in rxrpc_abort_connection()
224 msg.msg_name = &conn->params.peer->srx.transport; in rxrpc_abort_connection()
225 msg.msg_namelen = conn->params.peer->srx.transport_len; in rxrpc_abort_connection()
230 whdr.epoch = htonl(conn->proto.epoch); in rxrpc_abort_connection()
231 whdr.cid = htonl(conn->proto.cid); in rxrpc_abort_connection()
235 whdr.flags = conn->out_clientflag; in rxrpc_abort_connection()
237 whdr.securityIndex = conn->security_ix; in rxrpc_abort_connection()
239 whdr.serviceId = htons(conn->service_id); in rxrpc_abort_connection()
241 word = htonl(conn->abort_code); in rxrpc_abort_connection()
250 serial = atomic_inc_return(&conn->serial); in rxrpc_abort_connection()
251 rxrpc_abort_calls(conn, RXRPC_CALL_LOCALLY_ABORTED, serial); in rxrpc_abort_connection()
252 whdr.serial = htonl(serial); in rxrpc_abort_connection()
253 _proto("Tx CONN ABORT %%%u { %d }", serial, conn->abort_code); in rxrpc_abort_connection()
255 ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len); in rxrpc_abort_connection()
257 trace_rxrpc_tx_fail(conn->debug_id, serial, ret, in rxrpc_abort_connection()
260 return -EAGAIN; in rxrpc_abort_connection()
263 trace_rxrpc_tx_packet(conn->debug_id, &whdr, rxrpc_tx_point_conn_abort); in rxrpc_abort_connection()
265 conn->params.peer->last_tx_at = ktime_get_seconds(); in rxrpc_abort_connection()
272 * mark a call as being on a now-secured channel
273 * - must be called with BH's disabled.
279 write_lock_bh(&call->state_lock); in rxrpc_call_is_secure()
280 if (call->state == RXRPC_CALL_SERVER_SECURING) { in rxrpc_call_is_secure()
281 call->state = RXRPC_CALL_SERVER_RECV_REQUEST; in rxrpc_call_is_secure()
284 write_unlock_bh(&call->state_lock); in rxrpc_call_is_secure()
289 * connection-level Rx packet processor
300 if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) { in rxrpc_process_event()
301 _leave(" = -ECONNABORTED [%u]", conn->state); in rxrpc_process_event()
302 return -ECONNABORTED; in rxrpc_process_event()
305 _enter("{%d},{%u,%%%u},", conn->debug_id, sp->hdr.type, sp->hdr.serial); in rxrpc_process_event()
307 switch (sp->hdr.type) { in rxrpc_process_event()
311 sp->hdr.cid & RXRPC_CHANNELMASK); in rxrpc_process_event()
321 trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, in rxrpc_process_event()
323 return -EPROTO; in rxrpc_process_event()
326 _proto("Rx ABORT %%%u { ac=%d }", sp->hdr.serial, abort_code); in rxrpc_process_event()
328 conn->error = -ECONNABORTED; in rxrpc_process_event()
329 conn->abort_code = abort_code; in rxrpc_process_event()
330 conn->state = RXRPC_CONN_REMOTELY_ABORTED; in rxrpc_process_event()
331 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_process_event()
332 rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED, sp->hdr.serial); in rxrpc_process_event()
333 return -ECONNABORTED; in rxrpc_process_event()
336 return conn->security->respond_to_challenge(conn, skb, in rxrpc_process_event()
340 ret = conn->security->verify_response(conn, skb, _abort_code); in rxrpc_process_event()
344 ret = conn->security->init_connection_security(conn); in rxrpc_process_event()
348 ret = conn->security->prime_packet_security(conn); in rxrpc_process_event()
352 spin_lock(&conn->bundle->channel_lock); in rxrpc_process_event()
353 spin_lock_bh(&conn->state_lock); in rxrpc_process_event()
355 if (conn->state == RXRPC_CONN_SERVICE_CHALLENGING) { in rxrpc_process_event()
356 conn->state = RXRPC_CONN_SERVICE; in rxrpc_process_event()
357 spin_unlock_bh(&conn->state_lock); in rxrpc_process_event()
361 conn->channels[loop].call, in rxrpc_process_event()
362 lockdep_is_held(&conn->bundle->channel_lock))); in rxrpc_process_event()
364 spin_unlock_bh(&conn->state_lock); in rxrpc_process_event()
367 spin_unlock(&conn->bundle->channel_lock); in rxrpc_process_event()
371 trace_rxrpc_rx_eproto(NULL, sp->hdr.serial, in rxrpc_process_event()
373 return -EPROTO; in rxrpc_process_event()
385 _enter("{%d}", conn->debug_id); in rxrpc_secure_connection()
387 ASSERT(conn->security_ix != 0); in rxrpc_secure_connection()
388 ASSERT(conn->server_key); in rxrpc_secure_connection()
390 if (conn->security->issue_challenge(conn) < 0) { in rxrpc_secure_connection()
392 ret = -ENOMEM; in rxrpc_secure_connection()
418 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_process_delayed_final_acks()
421 if (!test_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags)) in rxrpc_process_delayed_final_acks()
425 ack_at = READ_ONCE(chan->final_ack_at); in rxrpc_process_delayed_final_acks()
436 &conn->flags)) in rxrpc_process_delayed_final_acks()
448 * connection-level event processor
456 if (test_and_clear_bit(RXRPC_CONN_EV_CHALLENGE, &conn->events)) in rxrpc_do_process_connection()
460 if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK) in rxrpc_do_process_connection()
463 /* go through the conn-level event packets, releasing the ref on this in rxrpc_do_process_connection()
465 while ((skb = skb_dequeue(&conn->rx_queue))) { in rxrpc_do_process_connection()
469 case -EPROTO: in rxrpc_do_process_connection()
470 case -EKEYEXPIRED: in rxrpc_do_process_connection()
471 case -EKEYREJECTED: in rxrpc_do_process_connection()
473 case -ENOMEM: in rxrpc_do_process_connection()
474 case -EAGAIN: in rxrpc_do_process_connection()
476 case -ECONNABORTED: in rxrpc_do_process_connection()
486 skb_queue_head(&conn->rx_queue, skb); in rxrpc_do_process_connection()
503 if (__rxrpc_use_local(conn->params.local)) { in rxrpc_process_connection()
505 rxrpc_unuse_local(conn->params.local); in rxrpc_process_connection()