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