xref: /OK3568_Linux_fs/kernel/net/rxrpc/conn_event.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /* connection-level event handling
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
5*4882a593Smuzhiyun  * Written by David Howells (dhowells@redhat.com)
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/module.h>
11*4882a593Smuzhiyun #include <linux/net.h>
12*4882a593Smuzhiyun #include <linux/skbuff.h>
13*4882a593Smuzhiyun #include <linux/errqueue.h>
14*4882a593Smuzhiyun #include <net/sock.h>
15*4882a593Smuzhiyun #include <net/af_rxrpc.h>
16*4882a593Smuzhiyun #include <net/ip.h>
17*4882a593Smuzhiyun #include "ar-internal.h"
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /*
20*4882a593Smuzhiyun  * Retransmit terminal ACK or ABORT of the previous call.
21*4882a593Smuzhiyun  */
rxrpc_conn_retransmit_call(struct rxrpc_connection * conn,struct sk_buff * skb,unsigned int channel)22*4882a593Smuzhiyun static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
23*4882a593Smuzhiyun 				       struct sk_buff *skb,
24*4882a593Smuzhiyun 				       unsigned int channel)
25*4882a593Smuzhiyun {
26*4882a593Smuzhiyun 	struct rxrpc_skb_priv *sp = skb ? rxrpc_skb(skb) : NULL;
27*4882a593Smuzhiyun 	struct rxrpc_channel *chan;
28*4882a593Smuzhiyun 	struct msghdr msg;
29*4882a593Smuzhiyun 	struct kvec iov[3];
30*4882a593Smuzhiyun 	struct {
31*4882a593Smuzhiyun 		struct rxrpc_wire_header whdr;
32*4882a593Smuzhiyun 		union {
33*4882a593Smuzhiyun 			__be32 abort_code;
34*4882a593Smuzhiyun 			struct rxrpc_ackpacket ack;
35*4882a593Smuzhiyun 		};
36*4882a593Smuzhiyun 	} __attribute__((packed)) pkt;
37*4882a593Smuzhiyun 	struct rxrpc_ackinfo ack_info;
38*4882a593Smuzhiyun 	size_t len;
39*4882a593Smuzhiyun 	int ret, ioc;
40*4882a593Smuzhiyun 	u32 serial, mtu, call_id, padding;
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	_enter("%d", conn->debug_id);
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	chan = &conn->channels[channel];
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun 	/* If the last call got moved on whilst we were waiting to run, just
47*4882a593Smuzhiyun 	 * ignore this packet.
48*4882a593Smuzhiyun 	 */
49*4882a593Smuzhiyun 	call_id = READ_ONCE(chan->last_call);
50*4882a593Smuzhiyun 	/* Sync with __rxrpc_disconnect_call() */
51*4882a593Smuzhiyun 	smp_rmb();
52*4882a593Smuzhiyun 	if (skb && call_id != sp->hdr.callNumber)
53*4882a593Smuzhiyun 		return;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	msg.msg_name	= &conn->params.peer->srx.transport;
56*4882a593Smuzhiyun 	msg.msg_namelen	= conn->params.peer->srx.transport_len;
57*4882a593Smuzhiyun 	msg.msg_control	= NULL;
58*4882a593Smuzhiyun 	msg.msg_controllen = 0;
59*4882a593Smuzhiyun 	msg.msg_flags	= 0;
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	iov[0].iov_base	= &pkt;
62*4882a593Smuzhiyun 	iov[0].iov_len	= sizeof(pkt.whdr);
63*4882a593Smuzhiyun 	iov[1].iov_base	= &padding;
64*4882a593Smuzhiyun 	iov[1].iov_len	= 3;
65*4882a593Smuzhiyun 	iov[2].iov_base	= &ack_info;
66*4882a593Smuzhiyun 	iov[2].iov_len	= sizeof(ack_info);
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	pkt.whdr.epoch		= htonl(conn->proto.epoch);
69*4882a593Smuzhiyun 	pkt.whdr.cid		= htonl(conn->proto.cid | channel);
70*4882a593Smuzhiyun 	pkt.whdr.callNumber	= htonl(call_id);
71*4882a593Smuzhiyun 	pkt.whdr.seq		= 0;
72*4882a593Smuzhiyun 	pkt.whdr.type		= chan->last_type;
73*4882a593Smuzhiyun 	pkt.whdr.flags		= conn->out_clientflag;
74*4882a593Smuzhiyun 	pkt.whdr.userStatus	= 0;
75*4882a593Smuzhiyun 	pkt.whdr.securityIndex	= conn->security_ix;
76*4882a593Smuzhiyun 	pkt.whdr._rsvd		= 0;
77*4882a593Smuzhiyun 	pkt.whdr.serviceId	= htons(conn->service_id);
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	len = sizeof(pkt.whdr);
80*4882a593Smuzhiyun 	switch (chan->last_type) {
81*4882a593Smuzhiyun 	case RXRPC_PACKET_TYPE_ABORT:
82*4882a593Smuzhiyun 		pkt.abort_code	= htonl(chan->last_abort);
83*4882a593Smuzhiyun 		iov[0].iov_len += sizeof(pkt.abort_code);
84*4882a593Smuzhiyun 		len += sizeof(pkt.abort_code);
85*4882a593Smuzhiyun 		ioc = 1;
86*4882a593Smuzhiyun 		break;
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	case RXRPC_PACKET_TYPE_ACK:
89*4882a593Smuzhiyun 		mtu = conn->params.peer->if_mtu;
90*4882a593Smuzhiyun 		mtu -= conn->params.peer->hdrsize;
91*4882a593Smuzhiyun 		pkt.ack.bufferSpace	= 0;
92*4882a593Smuzhiyun 		pkt.ack.maxSkew		= htons(skb ? skb->priority : 0);
93*4882a593Smuzhiyun 		pkt.ack.firstPacket	= htonl(chan->last_seq + 1);
94*4882a593Smuzhiyun 		pkt.ack.previousPacket	= htonl(chan->last_seq);
95*4882a593Smuzhiyun 		pkt.ack.serial		= htonl(skb ? sp->hdr.serial : 0);
96*4882a593Smuzhiyun 		pkt.ack.reason		= skb ? RXRPC_ACK_DUPLICATE : RXRPC_ACK_IDLE;
97*4882a593Smuzhiyun 		pkt.ack.nAcks		= 0;
98*4882a593Smuzhiyun 		ack_info.rxMTU		= htonl(rxrpc_rx_mtu);
99*4882a593Smuzhiyun 		ack_info.maxMTU		= htonl(mtu);
100*4882a593Smuzhiyun 		ack_info.rwind		= htonl(rxrpc_rx_window_size);
101*4882a593Smuzhiyun 		ack_info.jumbo_max	= htonl(rxrpc_rx_jumbo_max);
102*4882a593Smuzhiyun 		pkt.whdr.flags		|= RXRPC_SLOW_START_OK;
103*4882a593Smuzhiyun 		padding			= 0;
104*4882a593Smuzhiyun 		iov[0].iov_len += sizeof(pkt.ack);
105*4882a593Smuzhiyun 		len += sizeof(pkt.ack) + 3 + sizeof(ack_info);
106*4882a593Smuzhiyun 		ioc = 3;
107*4882a593Smuzhiyun 		break;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	default:
110*4882a593Smuzhiyun 		return;
111*4882a593Smuzhiyun 	}
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	/* Resync with __rxrpc_disconnect_call() and check that the last call
114*4882a593Smuzhiyun 	 * didn't get advanced whilst we were filling out the packets.
115*4882a593Smuzhiyun 	 */
116*4882a593Smuzhiyun 	smp_rmb();
117*4882a593Smuzhiyun 	if (READ_ONCE(chan->last_call) != call_id)
118*4882a593Smuzhiyun 		return;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	serial = atomic_inc_return(&conn->serial);
121*4882a593Smuzhiyun 	pkt.whdr.serial = htonl(serial);
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	switch (chan->last_type) {
124*4882a593Smuzhiyun 	case RXRPC_PACKET_TYPE_ABORT:
125*4882a593Smuzhiyun 		_proto("Tx ABORT %%%u { %d } [re]", serial, conn->abort_code);
126*4882a593Smuzhiyun 		break;
127*4882a593Smuzhiyun 	case RXRPC_PACKET_TYPE_ACK:
128*4882a593Smuzhiyun 		trace_rxrpc_tx_ack(chan->call_debug_id, serial,
129*4882a593Smuzhiyun 				   ntohl(pkt.ack.firstPacket),
130*4882a593Smuzhiyun 				   ntohl(pkt.ack.serial),
131*4882a593Smuzhiyun 				   pkt.ack.reason, 0);
132*4882a593Smuzhiyun 		_proto("Tx ACK %%%u [re]", serial);
133*4882a593Smuzhiyun 		break;
134*4882a593Smuzhiyun 	}
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, ioc, len);
137*4882a593Smuzhiyun 	conn->params.peer->last_tx_at = ktime_get_seconds();
138*4882a593Smuzhiyun 	if (ret < 0)
139*4882a593Smuzhiyun 		trace_rxrpc_tx_fail(chan->call_debug_id, serial, ret,
140*4882a593Smuzhiyun 				    rxrpc_tx_point_call_final_resend);
141*4882a593Smuzhiyun 	else
142*4882a593Smuzhiyun 		trace_rxrpc_tx_packet(chan->call_debug_id, &pkt.whdr,
143*4882a593Smuzhiyun 				      rxrpc_tx_point_call_final_resend);
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	_leave("");
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /*
149*4882a593Smuzhiyun  * pass a connection-level abort onto all calls on that connection
150*4882a593Smuzhiyun  */
rxrpc_abort_calls(struct rxrpc_connection * conn,enum rxrpc_call_completion compl,rxrpc_serial_t serial)151*4882a593Smuzhiyun static void rxrpc_abort_calls(struct rxrpc_connection *conn,
152*4882a593Smuzhiyun 			      enum rxrpc_call_completion compl,
153*4882a593Smuzhiyun 			      rxrpc_serial_t serial)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun 	struct rxrpc_call *call;
156*4882a593Smuzhiyun 	int i;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	_enter("{%d},%x", conn->debug_id, conn->abort_code);
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	spin_lock(&conn->bundle->channel_lock);
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	for (i = 0; i < RXRPC_MAXCALLS; i++) {
163*4882a593Smuzhiyun 		call = rcu_dereference_protected(
164*4882a593Smuzhiyun 			conn->channels[i].call,
165*4882a593Smuzhiyun 			lockdep_is_held(&conn->bundle->channel_lock));
166*4882a593Smuzhiyun 		if (call) {
167*4882a593Smuzhiyun 			if (compl == RXRPC_CALL_LOCALLY_ABORTED)
168*4882a593Smuzhiyun 				trace_rxrpc_abort(call->debug_id,
169*4882a593Smuzhiyun 						  "CON", call->cid,
170*4882a593Smuzhiyun 						  call->call_id, 0,
171*4882a593Smuzhiyun 						  conn->abort_code,
172*4882a593Smuzhiyun 						  conn->error);
173*4882a593Smuzhiyun 			else
174*4882a593Smuzhiyun 				trace_rxrpc_rx_abort(call, serial,
175*4882a593Smuzhiyun 						     conn->abort_code);
176*4882a593Smuzhiyun 			rxrpc_set_call_completion(call, compl,
177*4882a593Smuzhiyun 						  conn->abort_code,
178*4882a593Smuzhiyun 						  conn->error);
179*4882a593Smuzhiyun 		}
180*4882a593Smuzhiyun 	}
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	spin_unlock(&conn->bundle->channel_lock);
183*4882a593Smuzhiyun 	_leave("");
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun /*
187*4882a593Smuzhiyun  * generate a connection-level abort
188*4882a593Smuzhiyun  */
rxrpc_abort_connection(struct rxrpc_connection * conn,int error,u32 abort_code)189*4882a593Smuzhiyun static int rxrpc_abort_connection(struct rxrpc_connection *conn,
190*4882a593Smuzhiyun 				  int error, u32 abort_code)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun 	struct rxrpc_wire_header whdr;
193*4882a593Smuzhiyun 	struct msghdr msg;
194*4882a593Smuzhiyun 	struct kvec iov[2];
195*4882a593Smuzhiyun 	__be32 word;
196*4882a593Smuzhiyun 	size_t len;
197*4882a593Smuzhiyun 	u32 serial;
198*4882a593Smuzhiyun 	int ret;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	_enter("%d,,%u,%u", conn->debug_id, error, abort_code);
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 	/* generate a connection-level abort */
203*4882a593Smuzhiyun 	spin_lock_bh(&conn->state_lock);
204*4882a593Smuzhiyun 	if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) {
205*4882a593Smuzhiyun 		spin_unlock_bh(&conn->state_lock);
206*4882a593Smuzhiyun 		_leave(" = 0 [already dead]");
207*4882a593Smuzhiyun 		return 0;
208*4882a593Smuzhiyun 	}
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	conn->error = error;
211*4882a593Smuzhiyun 	conn->abort_code = abort_code;
212*4882a593Smuzhiyun 	conn->state = RXRPC_CONN_LOCALLY_ABORTED;
213*4882a593Smuzhiyun 	set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags);
214*4882a593Smuzhiyun 	spin_unlock_bh(&conn->state_lock);
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 	msg.msg_name	= &conn->params.peer->srx.transport;
217*4882a593Smuzhiyun 	msg.msg_namelen	= conn->params.peer->srx.transport_len;
218*4882a593Smuzhiyun 	msg.msg_control	= NULL;
219*4882a593Smuzhiyun 	msg.msg_controllen = 0;
220*4882a593Smuzhiyun 	msg.msg_flags	= 0;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 	whdr.epoch	= htonl(conn->proto.epoch);
223*4882a593Smuzhiyun 	whdr.cid	= htonl(conn->proto.cid);
224*4882a593Smuzhiyun 	whdr.callNumber	= 0;
225*4882a593Smuzhiyun 	whdr.seq	= 0;
226*4882a593Smuzhiyun 	whdr.type	= RXRPC_PACKET_TYPE_ABORT;
227*4882a593Smuzhiyun 	whdr.flags	= conn->out_clientflag;
228*4882a593Smuzhiyun 	whdr.userStatus	= 0;
229*4882a593Smuzhiyun 	whdr.securityIndex = conn->security_ix;
230*4882a593Smuzhiyun 	whdr._rsvd	= 0;
231*4882a593Smuzhiyun 	whdr.serviceId	= htons(conn->service_id);
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	word		= htonl(conn->abort_code);
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun 	iov[0].iov_base	= &whdr;
236*4882a593Smuzhiyun 	iov[0].iov_len	= sizeof(whdr);
237*4882a593Smuzhiyun 	iov[1].iov_base	= &word;
238*4882a593Smuzhiyun 	iov[1].iov_len	= sizeof(word);
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	len = iov[0].iov_len + iov[1].iov_len;
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	serial = atomic_inc_return(&conn->serial);
243*4882a593Smuzhiyun 	rxrpc_abort_calls(conn, RXRPC_CALL_LOCALLY_ABORTED, serial);
244*4882a593Smuzhiyun 	whdr.serial = htonl(serial);
245*4882a593Smuzhiyun 	_proto("Tx CONN ABORT %%%u { %d }", serial, conn->abort_code);
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 	ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
248*4882a593Smuzhiyun 	if (ret < 0) {
249*4882a593Smuzhiyun 		trace_rxrpc_tx_fail(conn->debug_id, serial, ret,
250*4882a593Smuzhiyun 				    rxrpc_tx_point_conn_abort);
251*4882a593Smuzhiyun 		_debug("sendmsg failed: %d", ret);
252*4882a593Smuzhiyun 		return -EAGAIN;
253*4882a593Smuzhiyun 	}
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	trace_rxrpc_tx_packet(conn->debug_id, &whdr, rxrpc_tx_point_conn_abort);
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	conn->params.peer->last_tx_at = ktime_get_seconds();
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	_leave(" = 0");
260*4882a593Smuzhiyun 	return 0;
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun /*
264*4882a593Smuzhiyun  * mark a call as being on a now-secured channel
265*4882a593Smuzhiyun  * - must be called with BH's disabled.
266*4882a593Smuzhiyun  */
rxrpc_call_is_secure(struct rxrpc_call * call)267*4882a593Smuzhiyun static void rxrpc_call_is_secure(struct rxrpc_call *call)
268*4882a593Smuzhiyun {
269*4882a593Smuzhiyun 	_enter("%p", call);
270*4882a593Smuzhiyun 	if (call) {
271*4882a593Smuzhiyun 		write_lock_bh(&call->state_lock);
272*4882a593Smuzhiyun 		if (call->state == RXRPC_CALL_SERVER_SECURING) {
273*4882a593Smuzhiyun 			call->state = RXRPC_CALL_SERVER_RECV_REQUEST;
274*4882a593Smuzhiyun 			rxrpc_notify_socket(call);
275*4882a593Smuzhiyun 		}
276*4882a593Smuzhiyun 		write_unlock_bh(&call->state_lock);
277*4882a593Smuzhiyun 	}
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun /*
281*4882a593Smuzhiyun  * connection-level Rx packet processor
282*4882a593Smuzhiyun  */
rxrpc_process_event(struct rxrpc_connection * conn,struct sk_buff * skb,u32 * _abort_code)283*4882a593Smuzhiyun static int rxrpc_process_event(struct rxrpc_connection *conn,
284*4882a593Smuzhiyun 			       struct sk_buff *skb,
285*4882a593Smuzhiyun 			       u32 *_abort_code)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun 	struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
288*4882a593Smuzhiyun 	__be32 wtmp;
289*4882a593Smuzhiyun 	u32 abort_code;
290*4882a593Smuzhiyun 	int loop, ret;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) {
293*4882a593Smuzhiyun 		_leave(" = -ECONNABORTED [%u]", conn->state);
294*4882a593Smuzhiyun 		return -ECONNABORTED;
295*4882a593Smuzhiyun 	}
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	_enter("{%d},{%u,%%%u},", conn->debug_id, sp->hdr.type, sp->hdr.serial);
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 	switch (sp->hdr.type) {
300*4882a593Smuzhiyun 	case RXRPC_PACKET_TYPE_DATA:
301*4882a593Smuzhiyun 	case RXRPC_PACKET_TYPE_ACK:
302*4882a593Smuzhiyun 		rxrpc_conn_retransmit_call(conn, skb,
303*4882a593Smuzhiyun 					   sp->hdr.cid & RXRPC_CHANNELMASK);
304*4882a593Smuzhiyun 		return 0;
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 	case RXRPC_PACKET_TYPE_BUSY:
307*4882a593Smuzhiyun 		/* Just ignore BUSY packets for now. */
308*4882a593Smuzhiyun 		return 0;
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun 	case RXRPC_PACKET_TYPE_ABORT:
311*4882a593Smuzhiyun 		if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header),
312*4882a593Smuzhiyun 				  &wtmp, sizeof(wtmp)) < 0) {
313*4882a593Smuzhiyun 			trace_rxrpc_rx_eproto(NULL, sp->hdr.serial,
314*4882a593Smuzhiyun 					      tracepoint_string("bad_abort"));
315*4882a593Smuzhiyun 			return -EPROTO;
316*4882a593Smuzhiyun 		}
317*4882a593Smuzhiyun 		abort_code = ntohl(wtmp);
318*4882a593Smuzhiyun 		_proto("Rx ABORT %%%u { ac=%d }", sp->hdr.serial, abort_code);
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 		conn->error = -ECONNABORTED;
321*4882a593Smuzhiyun 		conn->abort_code = abort_code;
322*4882a593Smuzhiyun 		conn->state = RXRPC_CONN_REMOTELY_ABORTED;
323*4882a593Smuzhiyun 		set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags);
324*4882a593Smuzhiyun 		rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED, sp->hdr.serial);
325*4882a593Smuzhiyun 		return -ECONNABORTED;
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	case RXRPC_PACKET_TYPE_CHALLENGE:
328*4882a593Smuzhiyun 		return conn->security->respond_to_challenge(conn, skb,
329*4882a593Smuzhiyun 							    _abort_code);
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	case RXRPC_PACKET_TYPE_RESPONSE:
332*4882a593Smuzhiyun 		ret = conn->security->verify_response(conn, skb, _abort_code);
333*4882a593Smuzhiyun 		if (ret < 0)
334*4882a593Smuzhiyun 			return ret;
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 		ret = conn->security->init_connection_security(conn);
337*4882a593Smuzhiyun 		if (ret < 0)
338*4882a593Smuzhiyun 			return ret;
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 		ret = conn->security->prime_packet_security(conn);
341*4882a593Smuzhiyun 		if (ret < 0)
342*4882a593Smuzhiyun 			return ret;
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 		spin_lock(&conn->bundle->channel_lock);
345*4882a593Smuzhiyun 		spin_lock_bh(&conn->state_lock);
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 		if (conn->state == RXRPC_CONN_SERVICE_CHALLENGING) {
348*4882a593Smuzhiyun 			conn->state = RXRPC_CONN_SERVICE;
349*4882a593Smuzhiyun 			spin_unlock_bh(&conn->state_lock);
350*4882a593Smuzhiyun 			for (loop = 0; loop < RXRPC_MAXCALLS; loop++)
351*4882a593Smuzhiyun 				rxrpc_call_is_secure(
352*4882a593Smuzhiyun 					rcu_dereference_protected(
353*4882a593Smuzhiyun 						conn->channels[loop].call,
354*4882a593Smuzhiyun 						lockdep_is_held(&conn->bundle->channel_lock)));
355*4882a593Smuzhiyun 		} else {
356*4882a593Smuzhiyun 			spin_unlock_bh(&conn->state_lock);
357*4882a593Smuzhiyun 		}
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun 		spin_unlock(&conn->bundle->channel_lock);
360*4882a593Smuzhiyun 		return 0;
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun 	default:
363*4882a593Smuzhiyun 		trace_rxrpc_rx_eproto(NULL, sp->hdr.serial,
364*4882a593Smuzhiyun 				      tracepoint_string("bad_conn_pkt"));
365*4882a593Smuzhiyun 		return -EPROTO;
366*4882a593Smuzhiyun 	}
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun /*
370*4882a593Smuzhiyun  * set up security and issue a challenge
371*4882a593Smuzhiyun  */
rxrpc_secure_connection(struct rxrpc_connection * conn)372*4882a593Smuzhiyun static void rxrpc_secure_connection(struct rxrpc_connection *conn)
373*4882a593Smuzhiyun {
374*4882a593Smuzhiyun 	u32 abort_code;
375*4882a593Smuzhiyun 	int ret;
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun 	_enter("{%d}", conn->debug_id);
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun 	ASSERT(conn->security_ix != 0);
380*4882a593Smuzhiyun 	ASSERT(conn->server_key);
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun 	if (conn->security->issue_challenge(conn) < 0) {
383*4882a593Smuzhiyun 		abort_code = RX_CALL_DEAD;
384*4882a593Smuzhiyun 		ret = -ENOMEM;
385*4882a593Smuzhiyun 		goto abort;
386*4882a593Smuzhiyun 	}
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	_leave("");
389*4882a593Smuzhiyun 	return;
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun abort:
392*4882a593Smuzhiyun 	_debug("abort %d, %d", ret, abort_code);
393*4882a593Smuzhiyun 	rxrpc_abort_connection(conn, ret, abort_code);
394*4882a593Smuzhiyun 	_leave(" [aborted]");
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun /*
398*4882a593Smuzhiyun  * Process delayed final ACKs that we haven't subsumed into a subsequent call.
399*4882a593Smuzhiyun  */
rxrpc_process_delayed_final_acks(struct rxrpc_connection * conn,bool force)400*4882a593Smuzhiyun void rxrpc_process_delayed_final_acks(struct rxrpc_connection *conn, bool force)
401*4882a593Smuzhiyun {
402*4882a593Smuzhiyun 	unsigned long j = jiffies, next_j;
403*4882a593Smuzhiyun 	unsigned int channel;
404*4882a593Smuzhiyun 	bool set;
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun again:
407*4882a593Smuzhiyun 	next_j = j + LONG_MAX;
408*4882a593Smuzhiyun 	set = false;
409*4882a593Smuzhiyun 	for (channel = 0; channel < RXRPC_MAXCALLS; channel++) {
410*4882a593Smuzhiyun 		struct rxrpc_channel *chan = &conn->channels[channel];
411*4882a593Smuzhiyun 		unsigned long ack_at;
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun 		if (!test_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags))
414*4882a593Smuzhiyun 			continue;
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun 		smp_rmb(); /* vs rxrpc_disconnect_client_call */
417*4882a593Smuzhiyun 		ack_at = READ_ONCE(chan->final_ack_at);
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 		if (time_before(j, ack_at) && !force) {
420*4882a593Smuzhiyun 			if (time_before(ack_at, next_j)) {
421*4882a593Smuzhiyun 				next_j = ack_at;
422*4882a593Smuzhiyun 				set = true;
423*4882a593Smuzhiyun 			}
424*4882a593Smuzhiyun 			continue;
425*4882a593Smuzhiyun 		}
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 		if (test_and_clear_bit(RXRPC_CONN_FINAL_ACK_0 + channel,
428*4882a593Smuzhiyun 				       &conn->flags))
429*4882a593Smuzhiyun 			rxrpc_conn_retransmit_call(conn, NULL, channel);
430*4882a593Smuzhiyun 	}
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun 	j = jiffies;
433*4882a593Smuzhiyun 	if (time_before_eq(next_j, j))
434*4882a593Smuzhiyun 		goto again;
435*4882a593Smuzhiyun 	if (set)
436*4882a593Smuzhiyun 		rxrpc_reduce_conn_timer(conn, next_j);
437*4882a593Smuzhiyun }
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun /*
440*4882a593Smuzhiyun  * connection-level event processor
441*4882a593Smuzhiyun  */
rxrpc_do_process_connection(struct rxrpc_connection * conn)442*4882a593Smuzhiyun static void rxrpc_do_process_connection(struct rxrpc_connection *conn)
443*4882a593Smuzhiyun {
444*4882a593Smuzhiyun 	struct sk_buff *skb;
445*4882a593Smuzhiyun 	u32 abort_code = RX_PROTOCOL_ERROR;
446*4882a593Smuzhiyun 	int ret;
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun 	if (test_and_clear_bit(RXRPC_CONN_EV_CHALLENGE, &conn->events))
449*4882a593Smuzhiyun 		rxrpc_secure_connection(conn);
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	/* Process delayed ACKs whose time has come. */
452*4882a593Smuzhiyun 	if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK)
453*4882a593Smuzhiyun 		rxrpc_process_delayed_final_acks(conn, false);
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun 	/* go through the conn-level event packets, releasing the ref on this
456*4882a593Smuzhiyun 	 * connection that each one has when we've finished with it */
457*4882a593Smuzhiyun 	while ((skb = skb_dequeue(&conn->rx_queue))) {
458*4882a593Smuzhiyun 		rxrpc_see_skb(skb, rxrpc_skb_seen);
459*4882a593Smuzhiyun 		ret = rxrpc_process_event(conn, skb, &abort_code);
460*4882a593Smuzhiyun 		switch (ret) {
461*4882a593Smuzhiyun 		case -EPROTO:
462*4882a593Smuzhiyun 		case -EKEYEXPIRED:
463*4882a593Smuzhiyun 		case -EKEYREJECTED:
464*4882a593Smuzhiyun 			goto protocol_error;
465*4882a593Smuzhiyun 		case -ENOMEM:
466*4882a593Smuzhiyun 		case -EAGAIN:
467*4882a593Smuzhiyun 			goto requeue_and_leave;
468*4882a593Smuzhiyun 		case -ECONNABORTED:
469*4882a593Smuzhiyun 		default:
470*4882a593Smuzhiyun 			rxrpc_free_skb(skb, rxrpc_skb_freed);
471*4882a593Smuzhiyun 			break;
472*4882a593Smuzhiyun 		}
473*4882a593Smuzhiyun 	}
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun 	return;
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun requeue_and_leave:
478*4882a593Smuzhiyun 	skb_queue_head(&conn->rx_queue, skb);
479*4882a593Smuzhiyun 	return;
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun protocol_error:
482*4882a593Smuzhiyun 	if (rxrpc_abort_connection(conn, ret, abort_code) < 0)
483*4882a593Smuzhiyun 		goto requeue_and_leave;
484*4882a593Smuzhiyun 	rxrpc_free_skb(skb, rxrpc_skb_freed);
485*4882a593Smuzhiyun 	return;
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun 
rxrpc_process_connection(struct work_struct * work)488*4882a593Smuzhiyun void rxrpc_process_connection(struct work_struct *work)
489*4882a593Smuzhiyun {
490*4882a593Smuzhiyun 	struct rxrpc_connection *conn =
491*4882a593Smuzhiyun 		container_of(work, struct rxrpc_connection, processor);
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun 	rxrpc_see_connection(conn);
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	if (__rxrpc_use_local(conn->params.local)) {
496*4882a593Smuzhiyun 		rxrpc_do_process_connection(conn);
497*4882a593Smuzhiyun 		rxrpc_unuse_local(conn->params.local);
498*4882a593Smuzhiyun 	}
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun 	rxrpc_put_connection(conn);
501*4882a593Smuzhiyun 	_leave("");
502*4882a593Smuzhiyun 	return;
503*4882a593Smuzhiyun }
504