Skip to content

Commit 4812417

Browse files
committed
rxrpc: Split the call params from the operation params
When rxrpc_sendmsg() parses the control message buffer, it places the parameters extracted into a structure, but lumps together call parameters (such as user call ID) with operation parameters (such as whether to send data, send an abort or accept a call). Split the call parameters out into their own structure, a copy of which is then embedded in the operation parameters struct. The call parameters struct is then passed down into the places that need it instead of passing the individual parameters. This allows for extra call parameters to be added. Signed-off-by: David Howells <[email protected]>
1 parent 3136ef4 commit 4812417

File tree

4 files changed

+60
-45
lines changed

4 files changed

+60
-45
lines changed

net/rxrpc/af_rxrpc.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock,
285285
bool upgrade)
286286
{
287287
struct rxrpc_conn_parameters cp;
288+
struct rxrpc_call_params p;
288289
struct rxrpc_call *call;
289290
struct rxrpc_sock *rx = rxrpc_sk(sock->sk);
290291
int ret;
@@ -302,15 +303,18 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock,
302303
if (key && !key->payload.data[0])
303304
key = NULL; /* a no-security key */
304305

306+
memset(&p, 0, sizeof(p));
307+
p.user_call_ID = user_call_ID;
308+
p.tx_total_len = tx_total_len;
309+
305310
memset(&cp, 0, sizeof(cp));
306311
cp.local = rx->local;
307312
cp.key = key;
308313
cp.security_level = 0;
309314
cp.exclusive = false;
310315
cp.upgrade = upgrade;
311316
cp.service_id = srx->srx_service;
312-
call = rxrpc_new_client_call(rx, &cp, srx, user_call_ID, tx_total_len,
313-
gfp);
317+
call = rxrpc_new_client_call(rx, &cp, srx, &p, gfp);
314318
/* The socket has been unlocked. */
315319
if (!IS_ERR(call)) {
316320
call->notify_rx = notify_rx;

net/rxrpc/ar-internal.h

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,35 @@ struct rxrpc_ack_summary {
643643
u8 cumulative_acks;
644644
};
645645

646+
/*
647+
* sendmsg() cmsg-specified parameters.
648+
*/
649+
enum rxrpc_command {
650+
RXRPC_CMD_SEND_DATA, /* send data message */
651+
RXRPC_CMD_SEND_ABORT, /* request abort generation */
652+
RXRPC_CMD_ACCEPT, /* [server] accept incoming call */
653+
RXRPC_CMD_REJECT_BUSY, /* [server] reject a call as busy */
654+
};
655+
656+
struct rxrpc_call_params {
657+
s64 tx_total_len; /* Total Tx data length (if send data) */
658+
unsigned long user_call_ID; /* User's call ID */
659+
struct {
660+
u32 hard; /* Maximum lifetime (sec) */
661+
u32 idle; /* Max time since last data packet (msec) */
662+
u32 normal; /* Max time since last call packet (msec) */
663+
} timeouts;
664+
u8 nr_timeouts; /* Number of timeouts specified */
665+
};
666+
667+
struct rxrpc_send_params {
668+
struct rxrpc_call_params call;
669+
u32 abort_code; /* Abort code to Tx (if abort) */
670+
enum rxrpc_command command : 8; /* The command to implement */
671+
bool exclusive; /* Shared or exclusive call */
672+
bool upgrade; /* If the connection is upgradeable */
673+
};
674+
646675
#include <trace/events/rxrpc.h>
647676

648677
/*
@@ -687,7 +716,7 @@ struct rxrpc_call *rxrpc_alloc_call(struct rxrpc_sock *, gfp_t);
687716
struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *,
688717
struct rxrpc_conn_parameters *,
689718
struct sockaddr_rxrpc *,
690-
unsigned long, s64, gfp_t);
719+
struct rxrpc_call_params *, gfp_t);
691720
int rxrpc_retry_client_call(struct rxrpc_sock *,
692721
struct rxrpc_call *,
693722
struct rxrpc_conn_parameters *,

net/rxrpc/call_object.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,7 @@ static void rxrpc_start_call_timer(struct rxrpc_call *call)
208208
struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
209209
struct rxrpc_conn_parameters *cp,
210210
struct sockaddr_rxrpc *srx,
211-
unsigned long user_call_ID,
212-
s64 tx_total_len,
211+
struct rxrpc_call_params *p,
213212
gfp_t gfp)
214213
__releases(&rx->sk.sk_lock.slock)
215214
{
@@ -219,7 +218,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
219218
const void *here = __builtin_return_address(0);
220219
int ret;
221220

222-
_enter("%p,%lx", rx, user_call_ID);
221+
_enter("%p,%lx", rx, p->user_call_ID);
223222

224223
call = rxrpc_alloc_client_call(rx, srx, gfp);
225224
if (IS_ERR(call)) {
@@ -228,9 +227,9 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
228227
return call;
229228
}
230229

231-
call->tx_total_len = tx_total_len;
230+
call->tx_total_len = p->tx_total_len;
232231
trace_rxrpc_call(call, rxrpc_call_new_client, atomic_read(&call->usage),
233-
here, (const void *)user_call_ID);
232+
here, (const void *)p->user_call_ID);
234233

235234
/* We need to protect a partially set up call against the user as we
236235
* will be acting outside the socket lock.
@@ -246,16 +245,16 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
246245
parent = *pp;
247246
xcall = rb_entry(parent, struct rxrpc_call, sock_node);
248247

249-
if (user_call_ID < xcall->user_call_ID)
248+
if (p->user_call_ID < xcall->user_call_ID)
250249
pp = &(*pp)->rb_left;
251-
else if (user_call_ID > xcall->user_call_ID)
250+
else if (p->user_call_ID > xcall->user_call_ID)
252251
pp = &(*pp)->rb_right;
253252
else
254253
goto error_dup_user_ID;
255254
}
256255

257256
rcu_assign_pointer(call->socket, rx);
258-
call->user_call_ID = user_call_ID;
257+
call->user_call_ID = p->user_call_ID;
259258
__set_bit(RXRPC_CALL_HAS_USERID, &call->flags);
260259
rxrpc_get_call(call, rxrpc_call_got_userid);
261260
rb_link_node(&call->sock_node, parent, pp);

net/rxrpc/sendmsg.c

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,6 @@
2121
#include <net/af_rxrpc.h>
2222
#include "ar-internal.h"
2323

24-
enum rxrpc_command {
25-
RXRPC_CMD_SEND_DATA, /* send data message */
26-
RXRPC_CMD_SEND_ABORT, /* request abort generation */
27-
RXRPC_CMD_ACCEPT, /* [server] accept incoming call */
28-
RXRPC_CMD_REJECT_BUSY, /* [server] reject a call as busy */
29-
};
30-
31-
struct rxrpc_send_params {
32-
s64 tx_total_len; /* Total Tx data length (if send data) */
33-
unsigned long user_call_ID; /* User's call ID */
34-
u32 abort_code; /* Abort code to Tx (if abort) */
35-
enum rxrpc_command command : 8; /* The command to implement */
36-
bool exclusive; /* Shared or exclusive call */
37-
bool upgrade; /* If the connection is upgradeable */
38-
};
39-
4024
/*
4125
* Wait for space to appear in the Tx queue or a signal to occur.
4226
*/
@@ -480,11 +464,11 @@ static int rxrpc_sendmsg_cmsg(struct msghdr *msg, struct rxrpc_send_params *p)
480464
if (msg->msg_flags & MSG_CMSG_COMPAT) {
481465
if (len != sizeof(u32))
482466
return -EINVAL;
483-
p->user_call_ID = *(u32 *)CMSG_DATA(cmsg);
467+
p->call.user_call_ID = *(u32 *)CMSG_DATA(cmsg);
484468
} else {
485469
if (len != sizeof(unsigned long))
486470
return -EINVAL;
487-
p->user_call_ID = *(unsigned long *)
471+
p->call.user_call_ID = *(unsigned long *)
488472
CMSG_DATA(cmsg);
489473
}
490474
got_user_ID = true;
@@ -522,10 +506,10 @@ static int rxrpc_sendmsg_cmsg(struct msghdr *msg, struct rxrpc_send_params *p)
522506
break;
523507

524508
case RXRPC_TX_LENGTH:
525-
if (p->tx_total_len != -1 || len != sizeof(__s64))
509+
if (p->call.tx_total_len != -1 || len != sizeof(__s64))
526510
return -EINVAL;
527-
p->tx_total_len = *(__s64 *)CMSG_DATA(cmsg);
528-
if (p->tx_total_len < 0)
511+
p->call.tx_total_len = *(__s64 *)CMSG_DATA(cmsg);
512+
if (p->call.tx_total_len < 0)
529513
return -EINVAL;
530514
break;
531515

@@ -536,7 +520,7 @@ static int rxrpc_sendmsg_cmsg(struct msghdr *msg, struct rxrpc_send_params *p)
536520

537521
if (!got_user_ID)
538522
return -EINVAL;
539-
if (p->tx_total_len != -1 && p->command != RXRPC_CMD_SEND_DATA)
523+
if (p->call.tx_total_len != -1 && p->command != RXRPC_CMD_SEND_DATA)
540524
return -EINVAL;
541525
_leave(" = 0");
542526
return 0;
@@ -576,8 +560,7 @@ rxrpc_new_client_call_for_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg,
576560
cp.exclusive = rx->exclusive | p->exclusive;
577561
cp.upgrade = p->upgrade;
578562
cp.service_id = srx->srx_service;
579-
call = rxrpc_new_client_call(rx, &cp, srx, p->user_call_ID,
580-
p->tx_total_len, GFP_KERNEL);
563+
call = rxrpc_new_client_call(rx, &cp, srx, &p->call, GFP_KERNEL);
581564
/* The socket is now unlocked */
582565

583566
_leave(" = %p\n", call);
@@ -597,12 +580,12 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len)
597580
int ret;
598581

599582
struct rxrpc_send_params p = {
600-
.tx_total_len = -1,
601-
.user_call_ID = 0,
602-
.abort_code = 0,
603-
.command = RXRPC_CMD_SEND_DATA,
604-
.exclusive = false,
605-
.upgrade = false,
583+
.call.tx_total_len = -1,
584+
.call.user_call_ID = 0,
585+
.abort_code = 0,
586+
.command = RXRPC_CMD_SEND_DATA,
587+
.exclusive = false,
588+
.upgrade = false,
606589
};
607590

608591
_enter("");
@@ -615,15 +598,15 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len)
615598
ret = -EINVAL;
616599
if (rx->sk.sk_state != RXRPC_SERVER_LISTENING)
617600
goto error_release_sock;
618-
call = rxrpc_accept_call(rx, p.user_call_ID, NULL);
601+
call = rxrpc_accept_call(rx, p.call.user_call_ID, NULL);
619602
/* The socket is now unlocked. */
620603
if (IS_ERR(call))
621604
return PTR_ERR(call);
622605
ret = 0;
623606
goto out_put_unlock;
624607
}
625608

626-
call = rxrpc_find_call_by_user_ID(rx, p.user_call_ID);
609+
call = rxrpc_find_call_by_user_ID(rx, p.call.user_call_ID);
627610
if (!call) {
628611
ret = -EBADSLT;
629612
if (p.command != RXRPC_CMD_SEND_DATA)
@@ -653,13 +636,13 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len)
653636
goto error_put;
654637
}
655638

656-
if (p.tx_total_len != -1) {
639+
if (p.call.tx_total_len != -1) {
657640
ret = -EINVAL;
658641
if (call->tx_total_len != -1 ||
659642
call->tx_pending ||
660643
call->tx_top != 0)
661644
goto error_put;
662-
call->tx_total_len = p.tx_total_len;
645+
call->tx_total_len = p.call.tx_total_len;
663646
}
664647
}
665648

0 commit comments

Comments
 (0)