Lines Matching full:conn
22 static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn, in rxrpc_conn_retransmit_call() argument
42 _enter("%d", conn->debug_id); in rxrpc_conn_retransmit_call()
44 chan = &conn->channels[channel]; in rxrpc_conn_retransmit_call()
55 msg.msg_name = &conn->params.peer->srx.transport; in rxrpc_conn_retransmit_call()
56 msg.msg_namelen = conn->params.peer->srx.transport_len; in rxrpc_conn_retransmit_call()
68 pkt.whdr.epoch = htonl(conn->proto.epoch); in rxrpc_conn_retransmit_call()
69 pkt.whdr.cid = htonl(conn->proto.cid | channel); in rxrpc_conn_retransmit_call()
73 pkt.whdr.flags = conn->out_clientflag; in rxrpc_conn_retransmit_call()
75 pkt.whdr.securityIndex = conn->security_ix; in rxrpc_conn_retransmit_call()
77 pkt.whdr.serviceId = htons(conn->service_id); in rxrpc_conn_retransmit_call()
89 mtu = conn->params.peer->if_mtu; in rxrpc_conn_retransmit_call()
90 mtu -= conn->params.peer->hdrsize; in rxrpc_conn_retransmit_call()
120 serial = atomic_inc_return(&conn->serial); in rxrpc_conn_retransmit_call()
125 _proto("Tx ABORT %%%u { %d } [re]", serial, conn->abort_code); in rxrpc_conn_retransmit_call()
136 ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, ioc, len); in rxrpc_conn_retransmit_call()
137 conn->params.peer->last_tx_at = ktime_get_seconds(); in rxrpc_conn_retransmit_call()
151 static void rxrpc_abort_calls(struct rxrpc_connection *conn, in rxrpc_abort_calls() argument
158 _enter("{%d},%x", conn->debug_id, conn->abort_code); in rxrpc_abort_calls()
160 spin_lock(&conn->bundle->channel_lock); in rxrpc_abort_calls()
164 conn->channels[i].call, in rxrpc_abort_calls()
165 lockdep_is_held(&conn->bundle->channel_lock)); in rxrpc_abort_calls()
171 conn->abort_code, in rxrpc_abort_calls()
172 conn->error); in rxrpc_abort_calls()
175 conn->abort_code); in rxrpc_abort_calls()
177 conn->abort_code, in rxrpc_abort_calls()
178 conn->error); in rxrpc_abort_calls()
182 spin_unlock(&conn->bundle->channel_lock); in rxrpc_abort_calls()
189 static int rxrpc_abort_connection(struct rxrpc_connection *conn, in rxrpc_abort_connection() argument
200 _enter("%d,,%u,%u", conn->debug_id, error, abort_code); in rxrpc_abort_connection()
203 spin_lock_bh(&conn->state_lock); in rxrpc_abort_connection()
204 if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) { in rxrpc_abort_connection()
205 spin_unlock_bh(&conn->state_lock); in rxrpc_abort_connection()
210 conn->error = error; in rxrpc_abort_connection()
211 conn->abort_code = abort_code; in rxrpc_abort_connection()
212 conn->state = RXRPC_CONN_LOCALLY_ABORTED; in rxrpc_abort_connection()
213 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_abort_connection()
214 spin_unlock_bh(&conn->state_lock); in rxrpc_abort_connection()
216 msg.msg_name = &conn->params.peer->srx.transport; in rxrpc_abort_connection()
217 msg.msg_namelen = conn->params.peer->srx.transport_len; in rxrpc_abort_connection()
222 whdr.epoch = htonl(conn->proto.epoch); in rxrpc_abort_connection()
223 whdr.cid = htonl(conn->proto.cid); in rxrpc_abort_connection()
227 whdr.flags = conn->out_clientflag; in rxrpc_abort_connection()
229 whdr.securityIndex = conn->security_ix; in rxrpc_abort_connection()
231 whdr.serviceId = htons(conn->service_id); in rxrpc_abort_connection()
233 word = htonl(conn->abort_code); in rxrpc_abort_connection()
242 serial = atomic_inc_return(&conn->serial); in rxrpc_abort_connection()
243 rxrpc_abort_calls(conn, RXRPC_CALL_LOCALLY_ABORTED, serial); in rxrpc_abort_connection()
245 _proto("Tx CONN ABORT %%%u { %d }", serial, conn->abort_code); in rxrpc_abort_connection()
247 ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len); in rxrpc_abort_connection()
249 trace_rxrpc_tx_fail(conn->debug_id, serial, ret, in rxrpc_abort_connection()
255 trace_rxrpc_tx_packet(conn->debug_id, &whdr, rxrpc_tx_point_conn_abort); in rxrpc_abort_connection()
257 conn->params.peer->last_tx_at = ktime_get_seconds(); in rxrpc_abort_connection()
283 static int rxrpc_process_event(struct rxrpc_connection *conn, in rxrpc_process_event() argument
292 if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) { in rxrpc_process_event()
293 _leave(" = -ECONNABORTED [%u]", conn->state); in rxrpc_process_event()
297 _enter("{%d},{%u,%%%u},", conn->debug_id, sp->hdr.type, sp->hdr.serial); in rxrpc_process_event()
302 rxrpc_conn_retransmit_call(conn, skb, in rxrpc_process_event()
320 conn->error = -ECONNABORTED; in rxrpc_process_event()
321 conn->abort_code = abort_code; in rxrpc_process_event()
322 conn->state = RXRPC_CONN_REMOTELY_ABORTED; in rxrpc_process_event()
323 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_process_event()
324 rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED, sp->hdr.serial); in rxrpc_process_event()
328 return conn->security->respond_to_challenge(conn, skb, in rxrpc_process_event()
332 ret = conn->security->verify_response(conn, skb, _abort_code); in rxrpc_process_event()
336 ret = conn->security->init_connection_security( in rxrpc_process_event()
337 conn, conn->params.key->payload.data[0]); in rxrpc_process_event()
341 spin_lock(&conn->bundle->channel_lock); in rxrpc_process_event()
342 spin_lock_bh(&conn->state_lock); in rxrpc_process_event()
344 if (conn->state == RXRPC_CONN_SERVICE_CHALLENGING) { in rxrpc_process_event()
345 conn->state = RXRPC_CONN_SERVICE; in rxrpc_process_event()
346 spin_unlock_bh(&conn->state_lock); in rxrpc_process_event()
350 conn->channels[loop].call, in rxrpc_process_event()
351 lockdep_is_held(&conn->bundle->channel_lock))); in rxrpc_process_event()
353 spin_unlock_bh(&conn->state_lock); in rxrpc_process_event()
356 spin_unlock(&conn->bundle->channel_lock); in rxrpc_process_event()
369 static void rxrpc_secure_connection(struct rxrpc_connection *conn) in rxrpc_secure_connection() argument
374 _enter("{%d}", conn->debug_id); in rxrpc_secure_connection()
376 ASSERT(conn->security_ix != 0); in rxrpc_secure_connection()
378 if (conn->security->issue_challenge(conn) < 0) { in rxrpc_secure_connection()
389 rxrpc_abort_connection(conn, ret, abort_code); in rxrpc_secure_connection()
396 void rxrpc_process_delayed_final_acks(struct rxrpc_connection *conn, bool force) in rxrpc_process_delayed_final_acks() argument
406 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_process_delayed_final_acks()
409 if (!test_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags)) in rxrpc_process_delayed_final_acks()
424 &conn->flags)) in rxrpc_process_delayed_final_acks()
425 rxrpc_conn_retransmit_call(conn, NULL, channel); in rxrpc_process_delayed_final_acks()
432 rxrpc_reduce_conn_timer(conn, next_j); in rxrpc_process_delayed_final_acks()
438 static void rxrpc_do_process_connection(struct rxrpc_connection *conn) in rxrpc_do_process_connection() argument
444 if (test_and_clear_bit(RXRPC_CONN_EV_CHALLENGE, &conn->events)) in rxrpc_do_process_connection()
445 rxrpc_secure_connection(conn); in rxrpc_do_process_connection()
448 if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK) in rxrpc_do_process_connection()
449 rxrpc_process_delayed_final_acks(conn, false); in rxrpc_do_process_connection()
451 /* go through the conn-level event packets, releasing the ref on this in rxrpc_do_process_connection()
453 while ((skb = skb_dequeue(&conn->rx_queue))) { in rxrpc_do_process_connection()
455 ret = rxrpc_process_event(conn, skb, &abort_code); in rxrpc_do_process_connection()
474 skb_queue_head(&conn->rx_queue, skb); in rxrpc_do_process_connection()
478 if (rxrpc_abort_connection(conn, ret, abort_code) < 0) in rxrpc_do_process_connection()
486 struct rxrpc_connection *conn = in rxrpc_process_connection() local
489 rxrpc_see_connection(conn); in rxrpc_process_connection()
491 if (__rxrpc_use_local(conn->params.local)) { in rxrpc_process_connection()
492 rxrpc_do_process_connection(conn); in rxrpc_process_connection()
493 rxrpc_unuse_local(conn->params.local); in rxrpc_process_connection()
496 rxrpc_put_connection(conn); in rxrpc_process_connection()