Provided by: kafs-client_0.5-4build1_amd64 bug

NAME

       rxrpc - Linux RxRPC (AFS) protocol implementation

SYNOPSIS

             #include <sys/socket.h>
             #include <linux/rxrpc.h>

             socket = socket(AF_RXRPC, SOCK_DGRAM, PF_INET);
             socket = socket(AF_RXRPC, SOCK_DGRAM, PF_INET6);

DESCRIPTION

       Linux optionally implements the RxRPC transport protocol, as used by the AFS network filesystem.  Both
       client and server ends are support - even on the same socket - and authentication is supported at both
       ends.

       This can be used through the BSD socket interface, using the sendmsg(2) and recvmsg(2) system calls with
       control data to multiplex calls over the socket and to provide or retrieve call metadata.  request_key(2)
       is used to find the authentication keys to use in the calling process's keyrings.

       The AF_RXRPC driver uses udp(7) sockets underneath, either IPv4-only or IPv6 (with IPv4), for transport.
       Under certain circumstances, the underlying transport sockets may be shared between client-only sockets
       (but are never shared if a socket is implementing a server).

   Address format
             struct sockaddr_rxrpc {
                 sa_family_t     srx_family;     /* AF_RXRPC */
                 uint16_t        srx_service;    /* The service identifier */
                 uint16_t        transport_type; /* The type of transport */
                 uint16_t        transport_len;  /* Transport address length */
                 union {
                     sa_family_t family;         /* Transport address family */
                     struct sockaddr_in sin;     /* IPv4 transport address */
                     struct sockaddr_in6 sin6;   /* IPv6 transport address */
                 } transport;
             };

       Where "srx_family" is always set to "AF_RXRPC" ; "srx_service" is set to the service ID of the desired
       service; transport_type is set to the transport type, which is always SOCK_DGRAM for now; transport_len
       says how big the address in transport is.

       Inside the transport address part, and appropriate address for the underlying socket should be set,
       including things like family, port and address as appropriate.  Note that it may be permissible to use
       IPv4 addresses on an IPv6 socket.

   Socket Options
       AF_RXRPC provides a number of socket options that can be set with setsockopt(2) and read with
       getsockopt(2).  The socket option level for IPv6 is SOL_RXRPC.

       RXRPC_SECURITY_KEY
           The  option  value  is  a string that specifies the name of a key to pass to request_key(2) to get an
           appropriate authentication key.  Such keys are expected to be of rxrpc type.

           If this isn't set, AF_RXRPC will perform an unauthenticated, unencrypted call to the server.

       RXRPC_SECURITY_KEYRING
           The option value is a string that specifies the name of  a  keyring  to  pass  to  request_key(2)  to
           specify the keys used by the server end to authenticate connections.

           The  service  keys in the ring should be of type rxrpc_s and their descriptions should be of the form
           "<service-id>:<security-index>" and each should be given an 8-byte secret.

       RXRPC_EXCLUSIVE_CONNECTION
           The option value should be empty.  This causes each call made on this socket to get its  own  virtual
           connection and thus its own negotiated security context.

       RXRPC_MIN_SECURITY_LEVEL
           The  option  value  should be a 4-byte unsigned integer.  This can be one of the following constants:
           RXRPC_SECURITY_PLAIN, RXRPC_SECURITY_AUTH, or  RXRPC_SECURITY_ENCRYPT  ;  the  first  indicating  the
           packets  should be securely checksummed only, the second that packets should be authenticated and the
           third that full encryption should be employed.

       RXRPC_UPGRADEABLE_SERVICE
           The option value should be a 2-slot array of 2-byte unsigned integers.  To use this, the socket  must
           be  a  server  socket  and  must  have been bound to more than one address with different srx_service
           specifiers.

           Slot[0] in the array specified the service ID to upgrade from; slot[1] specifies the  service  ID  to
           upgrade  to.  This allows a client to find out if there's a 'better' version of the service available
           on the same address, but a different service ID.

           If the client follows the correct protocol for  probing  an  upgradeable  service,  the  kernel  will
           automatically  upgrade  the  service  ID  on the connection and this will be reflected in the address
           returned by recvmsg(2).

       RXRPC_SUPPORTED_CMSG
           The option buffer should have room for a 4-byte integer.  The maximum  control  buffer  message  type
           supported  by  the  kernel  is  written into the buffer.  This allows an application to find out what
           control messages it may use so that it can avoid getting an  error  if  it  tries  to  use  something
           unsupported.

   Message flags
       AF_RXRPC  communicates  certain  information  by  way  of  the  message flags passed to and received from
       sendmsg(2) and recvmsg(2).

       MSG_MORE
           This is passed to sendmsg() to indicate that there is more data to be  transmitted  as  part  of  the
           request  phase  of  a  client call or the reply phase of a service operation.  MSG_EOR recvmsg() sets
           this to indicate that the call  has  been  terminated  (the  control  messages  must  be  parsed  for
           information  as  to  why) and that the kernel has discarded the user call ID tag.  The tag may now be
           reused.  MSG_PEEK This is passed to recvmsg() to look at the  front  of  the  message  queue  without
           removing  any messages or changing the state of any outstanding calls.  MSG_WAITALL This is passed to
           sendmsg() to instruct it not to return for a signal if it is still loading up the message  queue  and
           progress  is being made at the other side in emptying it.  This works around the problem of sendmsg()
           getting interrupted after partially queuing its data, but not then being able to return how  much  it
           has  consumed.   MSG_DONTWAIT  This  is passed to recvmsg() to indicate that it shouldn't wait if the
           message queue is empty.

   Control messages
       AF_RXRPC communicates metadata to the caller through the  ancillary  data  buffer  (msg_control)  in  the
       messages  passed  to and fro using sendmsg(2) and recvmsg(2).  When building a control message buffer for
       sendmsg(), the RXRPC_SUPPORTED_CMSG value should be consulted to make sure that the control message  type
       is supported.

       RXRPC_USER_CALL_ID
           The  data  for  this  is  an arbitrary long integer/pointer-sized tag that represents the call to the
           kernel.  It may, for example, hold a pointer to some userspace structure representing the call to the
           process.

           [sendmsg] This is passed to sendmsg() when the message proposed will create a client call.   It  must
           thereafter be included in all future sendmsg() calls pertaining to that call.

           [recvmsg] recvmsg() includes the tag in all messages pertaining to a call until the final termination
           message is reached - which recvmsg() will mark by setting MSG_EOR.

       RXRPC_ABORT
           The data for this is a 32-bit integer that is the abort code.

           [sendmsg]  When  passed  to sendmsg(), this causes the operation matching the tag to be aborted; this
           will be followed up by recvmsg() indicating MSG_EOR  and  a  local  error  of  ECONNABORTED,  thereby
           terminating the tag.

           [recvmsg] When obtained from recvmsg(), this indicates that a remote abort was received from the peer
           and the data gives the code for that abort.

       RXRPC_ACK
           [recvmsg]  This  conveys  no data.  It indicates the final acknowledgement to a service call has been
           received.

       RXRPC_NET_ERROR
           [recvmsg] This conveys a 32-bit integer into which the network error that terminated a call will have
           been placed.

       RXRPC_BUSY
           [recvmsg] This conveys no data.  It indicates that the operation has been rejected because the server
           is busy.

       RXRPC_LOCAL_ERROR
           [recvmsg] This conveys a 32-bit integer into which the local error that terminated a call  will  have
           been placed.

       RXRPC_NEW_CALL
           [recvmsg]  This conveys no data.  It indicates that a new service call has arrived at a server socket
           and is in need of a tag.  RXRPC_ACCEPT is must be used for that.

       RXRPC_ACCEPT
           The data for this is an arbitrary long integer/pointer-sized tag that  represents  the  call  to  the
           kernel with the same semantics as for RXRPC_USER_CALL_ID.

           [sendmsg] Supply a user call ID tag to a new service call.

       RXRPC_EXCLUSIVE_CALL
           [sendmsg]  Indicate  that  this particular call should be made on its own connection with an unshared
           negotiated security context.  This requires no additional data.

       RXRPC_UPGRADE_SERVICE
           [sendmsg] Indicate that this call should attempt to probe the service ID on the other side to see  if
           it  gets  upgraded.   The  answer can be found in the srx_service value of the peer address recvmsg()
           returns for this call.  This requires no additional data.

       RXRPC_TX_LENGTH
           The data for this is a signed 64-bit integer.

           [sendmsg] Specify the exact total transmit size.  This allows AF_RXRPC to work out in advance how big
           encrypted packets are going to be (under some circumstances, there's a data length  encrypted  inside
           the packet).

           If  this  is set, it may allow AF_RXRPC to be more efficient at filling packets.  If the wrong amount
           of data is given (too little or too much), then the call will be aborted.

       RXRPC_SET_CALL_TIMEOUT
           The data for this is an array of 1-3 32-bit integers.

           [sendmsg] Specify various call timeouts.  The first timeout is the  hard  timeout  for  the  call  in
           seconds: the call will be aborted if it takes longer than this amount of time in total.

           The  second  timeout is the \fIidle\fP timeout for the call in milliseconds: the call will be aborted
           if we don't receive the next DATA packet within that amount of time during the reception phase.

           The third timeout is the \fInormal\fP timeout for the call in milliseconds: the call will be  aborted
           if we go for that amount of time without receiving any type of packet pertaining to the call.

SEE ALSO

       kafs(7), request_key(2)

COPYRIGHT

       Copyright (C) 2019 Red Hat, Inc. All Rights Reserved.

       Written by David Howells (dhowells@redhat.com)

       This  program  is  free  software;  you  can  redistribute it and/or modify it under the terms of the GNU
       General Public License as published by the Free Software Foundation; either version 2 of the License,  or
       (at your option) any later version.

0.5-4build1                                        2024-04-22                                           RXRPC(7)