Merge tag 'rxrpc-next-20171018' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs
David Howells says: ==================== rxrpc: Add bits for kernel services Here are some patches that add a few things for kernel services to use: (1) Allow service upgrade to be requested and allow the resultant actual service ID to be obtained. (2) Allow the RTT time of a call to be obtained. (3) Allow a kernel service to find out if a call is still alive on a server between transmitting a request and getting the reply. (4) Allow data transmission to ignore signals if transmission progress is being made in reasonable time. This is also usable by userspace by passing MSG_WAITALL to sendmsg()[*]. [*] I'm not sure this is the right interface for this or whether a sockopt should be used instead. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -280,6 +280,18 @@ Interaction with the user of the RxRPC socket:
|
||||
nominated by a socket option.
|
||||
|
||||
|
||||
Notes on sendmsg:
|
||||
|
||||
(*) MSG_WAITALL can be set to tell sendmsg to ignore signals if the peer is
|
||||
making progress at accepting packets within a reasonable time such that we
|
||||
manage to queue up all the data for transmission. This requires the
|
||||
client to accept at least one packet per 2*RTT time period.
|
||||
|
||||
If this isn't set, sendmsg() will return immediately, either returning
|
||||
EINTR/ERESTARTSYS if nothing was consumed or returning the amount of data
|
||||
consumed.
|
||||
|
||||
|
||||
Notes on recvmsg:
|
||||
|
||||
(*) If there's a sequence of data messages belonging to a particular call on
|
||||
@@ -782,7 +794,9 @@ The kernel interface functions are as follows:
|
||||
struct key *key,
|
||||
unsigned long user_call_ID,
|
||||
s64 tx_total_len,
|
||||
gfp_t gfp);
|
||||
gfp_t gfp,
|
||||
rxrpc_notify_rx_t notify_rx,
|
||||
bool upgrade);
|
||||
|
||||
This allocates the infrastructure to make a new RxRPC call and assigns
|
||||
call and connection numbers. The call will be made on the UDP port that
|
||||
@@ -803,6 +817,13 @@ The kernel interface functions are as follows:
|
||||
allows the kernel to encrypt directly to the packet buffers, thereby
|
||||
saving a copy. The value may not be less than -1.
|
||||
|
||||
notify_rx is a pointer to a function to be called when events such as
|
||||
incoming data packets or remote aborts happen.
|
||||
|
||||
upgrade should be set to true if a client operation should request that
|
||||
the server upgrade the service to a better one. The resultant service ID
|
||||
is returned by rxrpc_kernel_recv_data().
|
||||
|
||||
If this function is successful, an opaque reference to the RxRPC call is
|
||||
returned. The caller now holds a reference on this and it must be
|
||||
properly ended.
|
||||
@@ -850,7 +871,8 @@ The kernel interface functions are as follows:
|
||||
size_t size,
|
||||
size_t *_offset,
|
||||
bool want_more,
|
||||
u32 *_abort)
|
||||
u32 *_abort,
|
||||
u16 *_service)
|
||||
|
||||
This is used to receive data from either the reply part of a client call
|
||||
or the request part of a service call. buf and size specify how much
|
||||
@@ -873,6 +895,9 @@ The kernel interface functions are as follows:
|
||||
If a remote ABORT is detected, the abort code received will be stored in
|
||||
*_abort and ECONNABORTED will be returned.
|
||||
|
||||
The service ID that the call ended up with is returned into *_service.
|
||||
This can be used to see if a call got a service upgrade.
|
||||
|
||||
(*) Abort a call.
|
||||
|
||||
void rxrpc_kernel_abort_call(struct socket *sock,
|
||||
@@ -1020,6 +1045,30 @@ The kernel interface functions are as follows:
|
||||
|
||||
It returns 0 if the call was requeued and an error otherwise.
|
||||
|
||||
(*) Get call RTT.
|
||||
|
||||
u64 rxrpc_kernel_get_rtt(struct socket *sock, struct rxrpc_call *call);
|
||||
|
||||
Get the RTT time to the peer in use by a call. The value returned is in
|
||||
nanoseconds.
|
||||
|
||||
(*) Check call still alive.
|
||||
|
||||
u32 rxrpc_kernel_check_life(struct socket *sock,
|
||||
struct rxrpc_call *call);
|
||||
|
||||
This returns a number that is updated when ACKs are received from the peer
|
||||
(notably including PING RESPONSE ACKs which we can elicit by sending PING
|
||||
ACKs to see if the call still exists on the server). The caller should
|
||||
compare the numbers of two calls to see if the call is still alive after
|
||||
waiting for a suitable interval.
|
||||
|
||||
This allows the caller to work out if the server is still contactable and
|
||||
if the call is still alive on the server whilst waiting for the server to
|
||||
process a client operation.
|
||||
|
||||
This function may transmit a PING ACK.
|
||||
|
||||
|
||||
=======================
|
||||
CONFIGURABLE PARAMETERS
|
||||
|
Reference in New Issue
Block a user