Provided by: libfabric-dev_1.5.3-1_amd64 bug

NAME

       fi_endpoint - Fabric endpoint operations

       fi_endpoint / fi_scalable_ep / fi_passive_ep / fi_close
              Allocate or close an endpoint.

       fi_ep_bind
              Associate  an  endpoint  with  hardware resources, such as event queues, completion
              queues, counters, address vectors, or shared transmit/receive contexts.

       fi_scalable_ep_bind
              Associate a scalable endpoint with an address vector

       fi_pep_bind
              Associate a passive endpoint with an event queue

       fi_enable
              Transitions an active endpoint into an enabled state.

       fi_cancel
              Cancel a pending asynchronous data transfer

       fi_ep_alias
              Create an alias to the endpoint

       fi_control
              Control endpoint operation.

       fi_getopt / fi_setopt
              Get or set endpoint options.

       fi_rx_context / fi_tx_context / fi_srx_context / fi_stx_context
              Open a transmit or receive context.

       fi_rx_size_left / fi_tx_size_left (DEPRECATED)
              Query the lower bound on how  many  RX/TX  operations  may  be  posted  without  an
              operation  returning  -FI_EAGAIN.   This functions have been deprecated and will be
              removed in a future version of the library.

SYNOPSIS

              #include <rdma/fabric.h>

              #include <rdma/fi_endpoint.h>

              int fi_endpoint(struct fid_domain *domain, struct fi_info *info,
                  struct fid_ep **ep, void *context);

              int fi_scalable_ep(struct fid_domain *domain, struct fi_info *info,
                  struct fid_ep **sep, void *context);

              int fi_passive_ep(struct fi_fabric *fabric, struct fi_info *info,
                  struct fid_pep **pep, void *context);

              int fi_tx_context(struct fid_ep *sep, int index,
                  struct fi_tx_attr *attr, struct fid_ep **tx_ep,
                  void *context);

              int fi_rx_context(struct fid_ep *sep, int index,
                  struct fi_rx_attr *attr, struct fid_ep **rx_ep,
                  void *context);

              int fi_stx_context(struct fid_domain *domain,
                  struct fi_tx_attr *attr, struct fid_stx **stx,
                  void *context);

              int fi_srx_context(struct fid_domain *domain,
                  struct fi_rx_attr *attr, struct fid_ep **rx_ep,
                  void *context);

              int fi_close(struct fid *ep);

              int fi_ep_bind(struct fid_ep *ep, struct fid *fid, uint64_t flags);

              int fi_scalable_ep_bind(struct fid_ep *sep, struct fid *fid, uint64_t flags);

              int fi_pep_bind(struct fid_pep *pep, struct fid *fid, uint64_t flags);

              int fi_enable(struct fid_ep *ep);

              int fi_cancel(struct fid_ep *ep, void *context);

              int fi_ep_alias(struct fid_ep *ep, struct fid_ep **alias_ep, uint64_t flags);

              int fi_control(struct fid *ep, int command, void *arg);

              int fi_getopt(struct fid *ep, int level, int optname,
                  void *optval, size_t *optlen);

              int fi_setopt(struct fid *ep, int level, int optname,
                  const void *optval, size_t optlen);

              DEPRECATED ssize_t fi_rx_size_left(struct fid_ep *ep);

              DEPRECATED ssize_t fi_tx_size_left(struct fid_ep *ep);

ARGUMENTS

       fid : On creation, specifies a fabric or access domain.  On  bind,  identifies  the  event
       queue,  completion  queue,  counter,  or address vector to bind to the endpoint.  In other
       cases, it's a fabric identifier of an associated resource.

       info : Details about the fabric interface endpoint to be opened, obtained from fi_getinfo.

       ep : A fabric endpoint.

       sep : A scalable fabric endpoint.

       pep : A passive fabric endpoint.

       context : Context associated with the endpoint or asynchronous operation.

       index : Index to retrieve a specific transmit/receive context.

       attr : Transmit or receive context attributes.

       flags : Additional flags to apply to the operation.

       command : Command of control operation to perform on endpoint.

       arg : Optional control argument.

       level : Protocol level at which the desired option resides.

       optname : The protocol option to read or set.

       optval : The option value that was read or to set.

       optlen : The size of the optval buffer.

DESCRIPTION

       Endpoints are transport level communication portals.  There are two  types  of  endpoints:
       active  and  passive.  Passive endpoints belong to a fabric domain and are most often used
       to listen for incoming connection requests.  However, a passive endpoint may  be  used  to
       reserve  a  fabric  address  that  can be granted to an active endpoint.  Active endpoints
       belong to access domains and can perform data transfers.

       Active endpoints may be  connection-oriented  or  connectionless,  and  may  provide  data
       reliability.    The  data  transfer  interfaces  --  messages  (fi_msg),  tagged  messages
       (fi_tagged),  RMA  (fi_rma),  and  atomics  (fi_atomic)  --  are  associated  with  active
       endpoints.   In  basic configurations, an active endpoint has transmit and receive queues.
       In general, operations that generate traffic on the fabric  are  posted  to  the  transmit
       queue.   This  includes  all  RMA and atomic operations, along with sent messages and sent
       tagged messages.  Operations that post buffers for receiving incoming data  are  submitted
       to the receive queue.

       Active  endpoints are created in the disabled state.  They must transition into an enabled
       state before accepting data transfer operations, including  posting  of  receive  buffers.
       The  fi_enable  call  is used to transition an active endpoint into an enabled state.  The
       fi_connect and fi_accept calls will also transition an endpoint into the enabled state, if
       it is not already active.

       In  order to transition an endpoint into an enabled state, it must be bound to one or more
       fabric resources.  An endpoint that will generate asynchronous completions, either through
       data  transfer  operations  or  communication  establishment  events, must be bound to the
       appropriate completion  queues  or  event  queues,  respectively,  before  being  enabled.
       Unconnected endpoints must be bound to an address vector.

       Once an endpoint has been activated, it may be associated with an address vector.  Receive
       buffers may be posted to it and calls may be made to  connection  establishment  routines.
       Connectionless endpoints may also perform data transfers.

       The  behavior  of  an  endpoint  may  be adjusted by setting its control data and protocol
       options.   This  allows  the  underlying  provider   to   redirect   function   calls   to
       implementations optimized to meet the desired application behavior.

       If  an  endpoint  experiences  a  critical  error, it will transition back into a disabled
       state.  Critical errors are reported through the event queue associated with the  EP.   In
       certain cases, a disabled endpoint may be re-enabled.  The ability to transition back into
       an enabled state is provider specific and depends on the type of error that  the  endpoint
       experienced.   When  an  endpoint is disabled as a result of a critical error, all pending
       operations are discarded.

   fi_endpoint / fi_passive_ep / fi_scalable_ep
       fi_endpoint allocates a new  active  endpoint.   fi_passive_ep  allocates  a  new  passive
       endpoint.   fi_scalable_ep  allocates a scalable endpoint.  The properties and behavior of
       the endpoint are defined based  on  the  provided  struct  fi_info.   See  fi_getinfo  for
       additional  details  on  fi_info.  fi_info flags that control the operation of an endpoint
       are defined below.  See section SCALABLE ENDPOINTS.

       If an active endpoint is allocated in order to accept a connection  request,  the  fi_info
       parameter  must  be the same as the fi_info structure provided with the connection request
       (FI_CONNREQ) event.

       An active endpoint may acquire the properties of a passive endpoint by setting the fi_info
       handle  field  to the passive endpoint fabric descriptor.  This is useful for applications
       that need to reserve the fabric address of an endpoint prior to knowing  if  the  endpoint
       will  be used on the active or passive side of a connection.  For example, this feature is
       useful for simulating socket semantics.  Once an active endpoint acquires  the  properties
       of a passive endpoint, the passive endpoint is no longer bound to any fabric resources and
       must no longer be used.  The user is expected to close the passive endpoint after  opening
       the active endpoint in order to free up any lingering resources that had been used.

   fi_close
       Closes an endpoint and release all resources associated with it.

       When  closing  a  scalable endpoint, there must be no opened transmit contexts, or receive
       contexts associated with the scalable endpoint.  If resources are  still  associated  with
       the scalable endpoint when attempting to close, the call will return -FI_EBUSY.

       Outstanding  operations  posted to the endpoint when fi_close is called will be discarded.
       Discarded  operations  will  silently  be   dropped,   with   no   completions   reported.
       Additionally,  a  provider may discard previously completed operations from the associated
       completion queue(s).  The behavior to discard completed operations is provider specific.

   fi_ep_bind
       fi_ep_bind is used to associate an endpoint with hardware resources.  The  common  use  of
       fi_ep_bind  is  to  direct  asynchronous  operations  associated  with  an  endpoint  to a
       completion queue.  An endpoint must be bound with CQs capable of reporting completions for
       any  asynchronous  operation  initiated  on the endpoint.  This is true even for endpoints
       which are configured to suppress successful completions, in  order  that  operations  that
       complete  in  error  may  be  reported  to the user.  For passive endpoints, this requires
       binding the endpoint with an EQ that supports the communication management (CM) domain.

       An active endpoint may direct asynchronous completions to different CQs, based on the type
       of  operation.  This is specified using fi_ep_bind flags.  The following flags may be used
       separately or OR'ed together when binding an endpoint to a completion domain CQ.

       FI_TRANSMIT : Directs the completion of outbound data transfer requests to  the  specified
       completion queue.  This includes send message, RMA, and atomic operations.

       FI_RECV  :  Directs the notification of inbound data transfers to the specified completion
       queue.   This  includes  received   messages.    This   binding   automatically   includes
       FI_REMOTE_WRITE, if applicable to the endpoint.

       FI_SELECTIVE_COMPLETION : By default, data transfer operations generate completion entries
       into a completion queue after they have successfully completed.  Applications can use this
       bind    flag    to    selectively    enable    when   completions   are   generated.    If
       FI_SELECTIVE_COMPLETION is specified, data transfer operations will not  generate  entries
       for  successful  completions  unless  FI_COMPLETION  is set as an operational flag for the
       given operation.  FI_SELECTIVE_COMPLETION must be OR'ed with  FI_TRANSMIT  and/or  FI_RECV
       flags.

       When  FI_SELECTIVE_COMPLETION is set, the user must determine when a request that does NOT
       have FI_COMPLETION set has completed indirectly, usually based  on  the  completion  of  a
       subsequent  operation.   Use of this flag may improve performance by allowing the provider
       to avoid writing a completion entry for every operation.

       Example: An application can selectively generate send completions by using  the  following
       general approach:

                fi_tx_attr::op_flags = 0; // default - no completion
                fi_ep_bind(ep, cq, FI_TRANSMIT | FI_SELECTIVE_COMPLETION);
                fi_send(ep, ...);                   // no completion
                fi_sendv(ep, ...);                  // no completion
                fi_sendmsg(ep, ..., FI_COMPLETION); // completion!
                fi_inject(ep, ...);                 // no completion

       Example:  An  application  can  selectively  disable  send  completions  by  modifying the
       operational flags:

                fi_tx_attr::op_flags = FI_COMPLETION; // default - completion
                fi_ep_bind(ep, cq, FI_TRANSMIT | FI_SELECTIVE_COMPLETION);
                fi_send(ep, ...);       // completion
                fi_sendv(ep, ...);      // completion
                fi_sendmsg(ep, ..., 0); // no completion!
                fi_inject(ep, ...);     // no completion!

       Example: Omitting FI_SELECTIVE_COMPLETION when binding will generate completions  for  all
       non-fi_inject calls:

                fi_tx_attr::op_flags = 0;
                fi_ep_bind(ep, cq, FI_TRANSMIT);    // default - completion
                fi_send(ep, ...);                   // completion
                fi_sendv(ep, ...);                  // completion
                fi_sendmsg(ep, ..., 0);             // completion!
                fi_sendmsg(ep, ..., FI_COMPLETION); // completion
                fi_sendmsg(ep, ..., FI_INJECT|FI_COMPLETION); // completion!
                fi_inject(ep, ...);                 // no completion!

       An  endpoint may also, or instead, be bound to a fabric counter.  When binding an endpoint
       to a counter, the following flags may be specified.

       FI_SEND : Increments the specified counter whenever a message transfer initiated over  the
       endpoint  has  completed  successfully or in error.  Sent messages include both tagged and
       normal message operations.

       FI_RECV : Increments the specified  counter  whenever  a  message  is  received  over  the
       endpoint.  Received messages include both tagged and normal message operations.

       FI_READ  : Increments the specified counter whenever an RMA read or atomic fetch operation
       initiated from the endpoint has completed successfully or in error.

       FI_WRITE : Increments the specified counter whenever an  RMA  write  or  atomic  operation
       initiated from the endpoint has completed successfully or in error.

       FI_REMOTE_READ  :  Increments  the  specified counter whenever an RMA read or atomic fetch
       operation is initiated from a remote endpoint that targets the  given  endpoint.   Use  of
       this flag requires that the endpoint be created using FI_RMA_EVENT.

       FI_REMOTE_WRITE  :  Increments  the  specified  counter  whenever  an  RMA write or atomic
       operation is initiated from a remote endpoint that targets the  given  endpoint.   Use  of
       this flag requires that the endpoint be created using FI_RMA_EVENT.

       An  endpoint  may  only  be bound to a single CQ or counter for a given type of operation.
       For example, a EP may  not  bind  to  two  counters  both  using  FI_WRITE.   Furthermore,
       providers may limit CQ and counter bindings to endpoints of the same endpoint type (DGRAM,
       MSG, RDM, etc.).

       Connectionless endpoints must be bound to a single address vector.

       If an endpoint is using a shared transmit and/or receive context, the shared contexts must
       be  bound  to  the  endpoint.   CQs,  counters,  AV,  and shared contexts must be bound to
       endpoints before they are enabled.

   fi_scalable_ep_bind
       fi_scalable_ep_bind is used to associate a scalable endpoint with an address vector.   See
       section  on  SCALABLE ENDPOINTS.  A scalable endpoint has a single transport level address
       and can support multiple transmit and receive contexts.  The transmit and receive contexts
       share  the  transport-level address.  Address vectors that are bound to scalable endpoints
       are implicitly bound to any transmit  or  receive  contexts  created  using  the  scalable
       endpoint.

   fi_enable
       This  call  transitions  the  endpoint into an enabled state.  An endpoint must be enabled
       before it may be used to perform data transfers.  Enabling an endpoint  typically  results
       in  hardware  resources  being assigned to it.  Endpoints making use of completion queues,
       counters, event queues, and/or address vectors must be bound to them before being enabled.

       Calling connect or accept on an endpoint will implicitly enable an endpoint if it has  not
       already been enabled.

       fi_enable  may also be used to re-enable an endpoint that has been disabled as a result of
       experiencing a critical error.  Applications should check the return value from  fi_enable
       to see if a disabled endpoint has successfully be re-enabled.

   fi_cancel
       fi_cancel  attempts  to  cancel  an  outstanding  asynchronous  operation.   Canceling  an
       operation causes the fabric provider to search for the  operation  and,  if  it  is  still
       pending,  complete  it as having been canceled.  An error queue entry will be available in
       the the associated error queue with error code FI_ECANCELED.  On the other  hand,  if  the
       operation  completed  before  the  call  to  fi_cancel, then the completion status of that
       operation will be available in the associated completion queue.  No specific entry related
       to  fi_cancel itself will be posted.  If multiple outstanding operations match the context
       parameter, only one will be canceled.  In this case, the operation which  is  canceled  is
       provider  specific.   The  cancel  operation  is  asynchronous, but will complete within a
       bounded period of time.

   fi_ep_alias
       This call creates an alias to the specified endpoint.   Conceptually,  an  endpoint  alias
       provides  an  alternate  software  path  from  the  application to the underlying provider
       hardware.  An alias EP differs from its parent endpoint only by its default data  transfer
       flags.  For example, an alias EP may be configured to use a different completion mode.  By
       default, an alias EP inherits the same data transfer flags as  the  parent  endpoint.   An
       application can use fi_control to modify the alias EP operational flags.

       When  allocating  an  alias,  an  application may configure either the transmit or receive
       operational flags.  This avoids needing a separate call to fi_control to set those  flags.
       The  flags passed to fi_ep_alias must include FI_TRANSMIT or FI_RECV (not both) with other
       operational  flags  OR'ed  in.   This  will  override  the  transmit  or  receive   flags,
       respectively,  for  operations  posted  through the alias endpoint.  All allocated aliases
       must be closed for the underlying endpoint to be released.

   fi_control
       The control operation is used to adjust the default behavior of an  endpoint.   It  allows
       the  underlying  provider  to redirect function calls to implementations optimized to meet
       the desired application behavior.  As a result, calls to fi_ep_control must be  serialized
       against all other calls to an endpoint.

       The  base  operation of an endpoint is selected during creation using struct fi_info.  The
       following control commands and arguments may be assigned to an endpoint.

       **FI_GETOPSFLAG -- uint64_t *flags** :  Used  to  retrieve  the  current  value  of  flags
       associated  with  the  data  transfer  operations  initiated on the endpoint.  The control
       argument must include FI_TRANSMIT or FI_RECV (not both) flags to indicate the type of data
       transfer flags to be returned.  See below for a list of control flags.

       **FI_SETOPSFLAG  --  uint64_t  *flags** : Used to change the data transfer operation flags
       associated with an endpoint.  The control argument must  include  FI_TRANSMIT  or  FI_RECV
       (not  both)  to  indicate  the  type of data transfer that the flags should apply to, with
       other flags OR'ed in.  The given flags will override the  previous  transmit  and  receive
       attributes  that  were set when the endpoint was created.  Valid control flags are defined
       below.

       **FI_BACKLOG - int *value** : This option only applies to passive endpoints.  It  is  used
       to set the connection request backlog for listening endpoints.

       FI_GETWAIT  (void  **)  :  This  command  allows  the user to retrieve the file descriptor
       associated with a socket endpoint.  The fi_control arg  parameter  should  be  an  address
       where a pointer to the returned file descriptor will be written.  See fi_eq.3 for addition
       details  using  fi_control  with  FI_GETWAIT.   The  file  descriptor  may  be  used   for
       notification that the endpoint is ready to send or receive data.

   fi_getopt / fi_setopt
       Endpoint  protocol  operations  may  be  retrieved using fi_getopt or set using fi_setopt.
       Applications specify the level that a desired option  exists,  identify  the  option,  and
       provide  input/output buffers to get or set the option.  fi_setopt provides an application
       a way to adjust low-level protocol and implementation specific details of an endpoint.

       The following option levels and option names and parameters are defined.

       FI_OPT_ENDPOINTFI_OPT_MIN_MULTI_RECV - size_t : Defines the minimum receive buffer space available when
         the  receive  buffer  is  released  by the provider (see FI_MULTI_RECV).  Modifying this
         value is only guaranteed to set the minimum buffer space needed on receives posted after
         the  value  has been changed.  It is recommended that applications that want to override
         the default MIN_MULTI_RECV value set  this  option  before  enabling  the  corresponding
         endpoint.

       • FI_OPT_CM_DATA_SIZE  -  size_t  : Defines the size of available space in CM messages for
         user-defined data.  This value limits the amount of data that applications can  exchange
         between  peer  endpoints using the fi_connect, fi_accept, and fi_reject operations.  The
         size returned is dependent upon the properties of the endpoint, except in  the  case  of
         passive  endpoints,  in which the size reflects the maximum size of the data that may be
         present as part of a connection request event.  This option is read only.

   fi_rx_size_left (DEPRECATED)
       This function has been deprecated and will be removed in a future version of the  library.
       It may not be supported by all providers.

       The  fi_rx_size_left  call  returns a lower bound on the number of receive operations that
       may be  posted  to  the  given  endpoint  without  that  operation  returning  -FI_EAGAIN.
       Depending  on  the  specific  details of the subsequently posted receive operations (e.g.,
       number of iov entries, which receive function is called, etc.), it may be possible to post
       more receive operations than originally indicated by fi_rx_size_left.

   fi_tx_size_left (DEPRECATED)
       This  function has been deprecated and will be removed in a future version of the library.
       It may not be supported by all providers.

       The fi_tx_size_left call returns a lower bound on the number of transmit  operations  that
       may  be  posted  to  the  given  endpoint  without  that  operation  returning -FI_EAGAIN.
       Depending on the specific details of the subsequently posted  transmit  operations  (e.g.,
       number  of  iov  entries,  which transmit function is called, etc.), it may be possible to
       post more transmit operations than originally indicated by fi_tx_size_left.

ENDPOINT ATTRIBUTES

       The fi_ep_attr structure defines the  set  of  attributes  associated  with  an  endpoint.
       Endpoint  attributes  may  be  further  refined  using  the  transmit  and receive context
       attributes as shown below.

              struct fi_ep_attr {
                  enum fi_ep_type type;
                  uint32_t        protocol;
                  uint32_t        protocol_version;
                  size_t          max_msg_size;
                  size_t          msg_prefix_size;
                  size_t          max_order_raw_size;
                  size_t          max_order_war_size;
                  size_t          max_order_waw_size;
                  uint64_t        mem_tag_format;
                  size_t          tx_ctx_cnt;
                  size_t          rx_ctx_cnt;
                  size_t          auth_key_size;
                  uint8_t         *auth_key;
              };

   type - Endpoint Type
       If specified, indicates the type of fabric  interface  communication  desired.   Supported
       types are:

       FI_EP_UNSPEC  : The type of endpoint is not specified.  This is usually provided as input,
       with other attributes of the endpoint or the provider selecting the type.

       FI_EP_MSG : Provides a reliable,  connection-oriented  data  transfer  service  with  flow
       control that maintains message boundaries.

       FI_EP_DGRAM  :  Supports  a  connectionless,  unreliable  datagram communication.  Message
       boundaries are maintained, but the maximum message size may be limited to the fabric  MTU.
       Flow control is not guaranteed.

       FI_EP_RDM  :  Reliable  datagram  message.  Provides a reliable, unconnected data transfer
       service with flow control that maintains message boundaries.

       FI_EP_SOCK_STREAM : Data streaming endpoint with TCP socket-like  semantics.   Provides  a
       reliable,  connection-oriented  data  transfer  service  that  does  not  maintain message
       boundaries.  FI_EP_SOCK_STREAM is most useful for applications designed around  using  TCP
       sockets.   See  the  SOCKET  ENDPOINT section for additional details and restrictions that
       apply to stream endpoints.

       FI_EP_SOCK_DGRAM : A connectionless, unreliable datagram  endpoint  with  UDP  socket-like
       semantics.   FI_EP_SOCK_DGRAM  is  most  useful for applications designed around using UDP
       sockets.  See the SOCKET ENDPOINT section for additional  details  and  restrictions  that
       apply to datagram socket endpoints.

   Protocol
       Specifies the low-level end to end protocol employed by the provider.  A matching protocol
       must be used  by  communicating  endpoints  to  ensure  interoperability.   The  following
       protocol  values  are  defined.   Provider  specific protocols are also allowed.  Provider
       specific protocols will be indicated by having the upper bit of the protocol value set  to
       one.

       FI_PROTO_UNSPEC  : The protocol is not specified.  This is usually provided as input, with
       other attributes of the socket or the provider selecting the actual protocol.

       FI_PROTO_RDMA_CM_IB_RC : The protocol runs over Infiniband reliable-connected queue pairs,
       using the RDMA CM protocol for connection establishment.

       FI_PROTO_IWARP : The protocol runs over the Internet wide area RDMA protocol transport.

       FI_PROTO_IB_UD : The protocol runs over Infiniband unreliable datagram queue pairs.

       FI_PROTO_PSMX  :  The  protocol  is  based  on an Intel proprietary protocol known as PSM,
       performance scaled messaging.  PSMX is an extended version of the PSM protocol to  support
       the libfabric interfaces.

       FI_PROTO_UDP  :  The  protocol sends and receives UDP datagrams.  For example, an endpoint
       using FI_PROTO_UDP will be able to communicate with a remote peer that is  using  Berkeley
       SOCK_DGRAM sockets using IPPROTO_UDP.

       FI_PROTO_SOCK_TCP : The protocol is layered over TCP packets.

   protocol_version - Protocol Version
       Identifies  which  version  of  the  protocol  is  employed by the provider.  The protocol
       version allows providers to extend an existing protocol, by adding support for  additional
       features  or  functionality  for example, in a backward compatible manner.  Providers that
       support different versions of the same protocol should inter-operate, but only when  using
       the capabilities defined for the lesser version.

   max_msg_size - Max Message Size
       Defines the maximum size for an application data transfer as a single operation.

   msg_prefix_size - Message Prefix Size
       Specifies  the  size  of  any  required message prefix buffer space.  This field will be 0
       unless the FI_MSG_PREFIX mode is enabled.  If msg_prefix_size is > 0 the  specified  value
       will be a multiple of 8-bytes.

   Max RMA Ordered Size
       The maximum ordered size specifies the delivery order of transport data into target memory
       for RMA and atomic operations.  Data  ordering  is  separate,  but  dependent  on  message
       ordering  (defined  below).   Data  ordering  is  unspecified  where  message order is not
       defined.

       Data ordering refers to the access of target memory by subsequent operations.   When  back
       to  back  RMA  read  or  write operations access the same registered memory location, data
       ordering indicates whether the second operation reads or writes the  target  memory  after
       the  first  operation has completed.  Because RMA ordering applies between two operations,
       and not within a single data transfer, ordering is  defined  per  byte-addressable  memory
       location.  I.e.  ordering specifies whether location X is accessed by the second operation
       after the first operation.  Nothing is implied about the completion of the first operation
       before the second operation is initiated.

       In order to support large data transfers being broken into multiple packets and sent using
       multiple paths through the fabric, data ordering may be limited to transfers of a specific
       size  or  less.   Providers specify when data ordering is maintained through the following
       values.  Note that even if data ordering is not maintained, message ordering may be.

       max_order_raw_size : Read after write size.  If set,  an  RMA  or  atomic  read  operation
       issued  after  an  RMA or atomic write operation, both of which are smaller than the size,
       will be ordered.  Where the target memory  locations  overlap,  the  RMA  or  atomic  read
       operation will see the results of the previous RMA or atomic write.

       max_order_war_size  :  Write  after  read  size.  If set, an RMA or atomic write operation
       issued after an RMA or atomic read operation, both of which are  smaller  than  the  size,
       will  be  ordered.   The  RMA  or  atomic read operation will see the initial value of the
       target memory location before a subsequent RMA or atomic write updates the value.

       max_order_waw_size : Write after write size.  If set, an RMA  or  atomic  write  operation
       issued  after  an  RMA or atomic write operation, both of which are smaller than the size,
       will be ordered.  The target memory location will reflect the results of the second RMA or
       atomic write.

       An  order  size  value  of  0  indicates  that  ordering is not guaranteed.  A value of -1
       guarantees ordering for any data size.

   mem_tag_format - Memory Tag Format
       The memory tag format is a bit array used to convey the number of tagged bits supported by
       a  provider.   Additionally,  it may be used to divide the bit array into separate fields.
       The mem_tag_format optionally begins with a series of bits set to 0, to signify bits which
       are ignored by the provider.  Following the initial prefix of ignored bits, the array will
       consist of alternating groups of bits set to all 1's or  all  0's.   Each  group  of  bits
       corresponds  to a tagged field.  The implication of defining a tagged field is that when a
       mask is applied to the tagged bit array, all bits belonging to a single field will  either
       be set to 1 or 0, collectively.

       For  example,  a  mem_tag_format of 0x30FF indicates support for 14 tagged bits, separated
       into 3 fields.  The first field consists of 2-bits, the second field 4-bits, and the final
       field  8-bits.   Valid  masks for such a tagged field would be a bitwise OR'ing of zero or
       more of the following values: 0x3000, 0x0F00, and 0x00FF.

       By identifying fields within a tag, a provider  may  be  able  to  optimize  their  search
       routines.  An application which requests tag fields must provide tag masks that either set
       all mask bits corresponding to a field to all 0 or all 1.  When negotiating tag fields, an
       application  can  request  a  specific  number of fields of a given size.  A provider must
       return a tag format that supports the requested number of fields, with each field being at
       least  the  size  requested, or fail the request.  A provider may increase the size of the
       fields.  When reporting completions (see FI_CQ_FORMAT_TAGGED), the provider  must  provide
       the exact value of the received tag, clearing out any unsupported tag bits.

       It  is  recommended  that  field  sizes  be  ordered from smallest to largest.  A generic,
       unstructured tag and mask can  be  achieved  by  requesting  a  bit  array  consisting  of
       alternating 1's and 0's.

   tx_ctx_cnt - Transmit Context Count
       Number  of  transmit  contexts  to  associate  with the endpoint.  If not specified (0), 1
       context will be assigned if the endpoint supports outbound transfers.   Transmit  contexts
       are  independent transmit queues that may be separately configured.  Each transmit context
       may be bound to a separate CQ, and no ordering is defined between contexts.  Additionally,
       no synchronization is needed when accessing contexts in parallel.

       If the count is set to the value FI_SHARED_CONTEXT, the endpoint will be configured to use
       a shared transmit context, if supported by the provider.  Providers that  do  not  support
       shared transmit contexts will fail the request.

       See the scalable endpoint and shared contexts sections for additional details.

   rx_ctx_cnt - Receive Context Count
       Number  of  receive  contexts to associate with the endpoint.  If not specified, 1 context
       will be assigned if  the  endpoint  supports  inbound  transfers.   Receive  contexts  are
       independent processing queues that may be separately configured.  Each receive context may
       be bound to a separate CQ, and no ordering is defined between contexts.  Additionally,  no
       synchronization is needed when accessing contexts in parallel.

       If the count is set to the value FI_SHARED_CONTEXT, the endpoint will be configured to use
       a shared receive context, if supported by the provider.  Providers  that  do  not  support
       shared receive contexts will fail the request.

       See the scalable endpoint and shared contexts sections for additional details.

   auth_key_size - Authorization Key Length
       The  length of the authorization key in bytes.  This field will be 0 if authorization keys
       are not available or used.  This field is ignored unless the fabric  is  opened  with  API
       version 1.5 or greater.

   auth_key - Authorization Key
       If  supported  by the fabric, an authorization key (a.k.a.  job key) to associate with the
       endpoint.  An authorization key is used to limit communication  between  endpoints.   Only
       peer  endpoints  that  are  programmed  to use the same authorization key may communicate.
       Authorization keys are often used to implement job keys, to ensure that processes  running
       in different jobs do not accidentally cross traffic.  The domain authorization key will be
       used if auth_key_size is set to 0.  This field is ignored unless the fabric is opened with
       API version 1.5 or greater.

TRANSMIT CONTEXT ATTRIBUTES

       Attributes specific to the transmit capabilities of an endpoint are specified using struct
       fi_tx_attr.

              struct fi_tx_attr {
                  uint64_t  caps;
                  uint64_t  mode;
                  uint64_t  op_flags;
                  uint64_t  msg_order;
                  uint64_t  comp_order;
                  size_t    inject_size;
                  size_t    size;
                  size_t    iov_limit;
                  size_t    rma_iov_limit;
              };

   caps - Capabilities
       The requested capabilities of the context.  The capabilities must be  a  subset  of  those
       requested  of  the associated endpoint.  See the CAPABILITIES section of fi_getinfo(3) for
       capability details.  If the caps field is 0 on input to fi_getinfo(3), the caps value from
       the fi_info structure will be used.

   mode
       The  operational  mode  bits  of  the  context.   The  mode bits will be a subset of those
       associated with the endpoint.  See the MODE section of fi_getinfo(3) for details.  A  mode
       value  of  0 will be ignored on input to fi_getinfo(3), with the mode value of the fi_info
       structure used instead.  On return from fi_getinfo(3), the mode will be set only to  those
       constraints specific to transmit operations.

   op_flags - Default transmit operation flags
       Flags  that control the operation of operations submitted against the context.  Applicable
       flags are listed in the Operation Flags section.

   msg_order - Message Ordering
       Message ordering refers to the order in which transport layer headers (as  viewed  by  the
       application)  are  processed.  Relaxed message order enables data transfers to be sent and
       received out of order, which may improve performance by utilizing multiple  paths  through
       the  fabric from the initiating endpoint to a target endpoint.  Message order applies only
       between a single source and destination endpoint pair.  Ordering between different  target
       endpoints is not defined.

       Message  order  is  determined  using a set of ordering bits.  Each set bit indicates that
       ordering is maintained between data transfers of the specified  type.   Message  order  is
       defined  for  [read  |  write | send] operations submitted by an application after [read |
       write | send] operations.

       Message ordering only applies to  the  end  to  end  transmission  of  transport  headers.
       Message  ordering is necessary, but does not guarantee, the order in which message data is
       sent or received by the transport layer.   Message  ordering  requires  matching  ordering
       semantics  on  the  receiving side of a data transfer operation in order to guarantee that
       ordering is met.

       FI_ORDER_NONE : No ordering is specified.  This value may be used as  input  in  order  to
       obtain the default message order supported by the provider.  FI_ORDER_NONE is an alias for
       the value 0.

       FI_ORDER_RAR : Read after read.  If set, RMA and atomic read operations are transmitted in
       the order submitted relative to other RMA and atomic read operations.  If not set, RMA and
       atomic reads may be transmitted out of order from their submission.

       FI_ORDER_RAW : Read after write.  If set, RMA and atomic read operations  are  transmitted
       in  the  order submitted relative to RMA and atomic write operations.  If not set, RMA and
       atomic reads may be transmitted ahead of RMA and atomic writes.

       FI_ORDER_RAS : Read after send.  If set, RMA and atomic read operations are transmitted in
       the  order  submitted relative to message send operations, including tagged sends.  If not
       set, RMA and atomic reads may be transmitted ahead of sends.

       FI_ORDER_WAR : Write after read.  If set, RMA and atomic write operations are  transmitted
       in  the  order  submitted relative to RMA and atomic read operations.  If not set, RMA and
       atomic writes may be transmitted ahead of RMA and atomic reads.

       FI_ORDER_WAW : Write after write.  If set, RMA and atomic write operations are transmitted
       in the order submitted relative to other RMA and atomic write operations.  If not set, RMA
       and atomic writes may be transmitted out of order from their submission.

       FI_ORDER_WAS : Write after send.  If set, RMA and atomic write operations are  transmitted
       in  the  order  submitted relative to message send operations, including tagged sends.  If
       not set, RMA and atomic writes may be transmitted ahead of sends.

       FI_ORDER_SAR : Send after read.  If set, message send operations, including tagged  sends,
       are  transmitted  in  order  submitted relative to RMA and atomic read operations.  If not
       set, message sends may be transmitted ahead of RMA and atomic reads.

       FI_ORDER_SAW : Send after write.  If set, message send operations, including tagged sends,
       are  transmitted  in  order submitted relative to RMA and atomic write operations.  If not
       set, message sends may be transmitted ahead of RMA and atomic writes.

       FI_ORDER_SAS : Send after send.  If set, message send operations, including tagged  sends,
       are  transmitted  in  the  order  submitted  relative  to other message send.  If not set,
       message sends may be transmitted out of order from their submission.

   comp_order - Completion Ordering
       Completion ordering refers to the order in which completed requests are written  into  the
       completion  queue.   Completion  ordering is similar to message order.  Relaxed completion
       order may enable faster reporting of completed transfers, allow acknowledgments to be sent
       over  different  fabric  paths, and support more sophisticated retry mechanisms.  This can
       result in  lower-latency  completions,  particularly  when  using  unconnected  endpoints.
       Strict  completion ordering may require that providers queue completed operations or limit
       available optimizations.

       For transmit requests, completion ordering depends on  the  endpoint  communication  type.
       For  unreliable  communication,  completion ordering applies to all data transfer requests
       submitted to an endpoint.  For reliable communication, completion ordering only applies to
       requests  that target a single destination endpoint.  Completion ordering of requests that
       target different endpoints over a reliable transport is not defined.

       Applications should  specify  the  completion  ordering  that  they  support  or  require.
       Providers  should  return  the  completion  order  that  they  actually  provide, with the
       constraint that the returned ordering is stricter than that specified by the  application.
       Supported completion order values are:

       FI_ORDER_NONE  :  No  ordering is defined for completed operations.  Requests submitted to
       the transmit context may complete in any order.

       FI_ORDER_STRICT : Requests complete in the order  in  which  they  are  submitted  to  the
       transmit context.

   inject_size
       The  requested  inject  operation  size  (see  the  FI_INJECT  flag) that the context will
       support.  This is the maximum size data transfer that can be  associated  with  an  inject
       operation (such as fi_inject) or may be used with the FI_INJECT data transfer flag.

   size
       The  size  of  the  context.   The  size  is  specified  as the minimum number of transmit
       operations that may be posted to the endpoint without the operation returning -FI_EAGAIN.

   iov_limit
       This is the maximum number of IO vectors (scatter-gather elements) that  a  single  posted
       operation may reference.

   rma_iov_limit
       This  is  the  maximum  number  of RMA IO vectors (scatter-gather elements) that an RMA or
       atomic operation may reference.  The rma_iov_limit corresponds to the rma_iov_count values
       in  RMA and atomic operations.  See struct fi_msg_rma and struct fi_msg_atomic in fi_rma.3
       and fi_atomic.3, for additional details.  This limit applies to both the number of RMA  IO
       vectors  that  may  be  specified when initiating an operation from the local endpoint, as
       well as the maximum number of IO vectors that may be carried in a single  request  from  a
       remote endpoint.

RECEIVE CONTEXT ATTRIBUTES

       Attributes  specific to the receive capabilities of an endpoint are specified using struct
       fi_rx_attr.

              struct fi_rx_attr {
                  uint64_t  caps;
                  uint64_t  mode;
                  uint64_t  op_flags;
                  uint64_t  msg_order;
                  uint64_t  comp_order;
                  size_t    total_buffered_recv;
                  size_t    size;
                  size_t    iov_limit;
              };

   caps - Capabilities
       The requested capabilities of the context.  The capabilities must be  a  subset  of  those
       requested  of  the associated endpoint.  See the CAPABILITIES section if fi_getinfo(3) for
       capability details.  If the caps field is 0 on input to fi_getinfo(3), the caps value from
       the fi_info structure will be used.

   mode
       The  operational  mode  bits  of  the  context.   The  mode bits will be a subset of those
       associated with the endpoint.  See the MODE section of fi_getinfo(3) for details.  A  mode
       value  of  0 will be ignored on input to fi_getinfo(3), with the mode value of the fi_info
       structure used instead.  On return from fi_getinfo(3), the mode will be set only to  those
       constraints specific to receive operations.

   op_flags - Default receive operation flags
       Flags  that control the operation of operations submitted against the context.  Applicable
       flags are listed in the Operation Flags section.

   msg_order - Message Ordering
       For a description of message ordering, see the msg_order field  in  the  Transmit  Context
       Attribute  section.   Receive context message ordering defines the order in which received
       transport message headers are processed when received by an endpoint.

       The following ordering flags,  as  defined  for  transmit  ordering,  also  apply  to  the
       processing    of   received   operations:   FI_ORDER_NONE,   FI_ORDER_RAR,   FI_ORDER_RAW,
       FI_ORDER_RAS, FI_ORDER_WAR, FI_ORDER_WAW, FI_ORDER_WAS,  FI_ORDER_SAR,  FI_ORDER_SAW,  and
       FI_ORDER_SAS.

   comp_order - Completion Ordering
       For a description of completion ordering, see the comp_order field in the Transmit Context
       Attribute section.

       FI_ORDER_NONE : No ordering is defined for completed operations.  Receive  operations  may
       complete in any order, regardless of their submission order.

       FI_ORDER_STRICT  : Receive operations complete in the order in which they are processed by
       the receive context, based on the receive side msg_order attribute.

       FI_ORDER_DATA : When set, this bit indicates that received data is written into memory  in
       order.  Data ordering applies to memory accessed as part of a single operation and between
       operations if message ordering is guaranteed.

   total_buffered_recv
       This field is supported for backwards  compatibility  purposes.   It  is  a  hint  to  the
       provider  of  the  total  available  space  that may be needed to buffer messages that are
       received for which there is no matching receive operation.  The  provider  may  adjust  or
       ignore this value.  The allocation of internal network buffering among received message is
       provider specific.  For instance, a provider may limit the size of messages which  can  be
       buffered or the amount of buffering allocated to a single message.

       If  receive side buffering is disabled (total_buffered_recv = 0) and a message is received
       by an endpoint, then the behavior is dependent on whether  resource  management  has  been
       enabled  (FI_RM_ENABLED  has  be  set  or  not).   See  the Resource Management section of
       fi_domain.3 for  further  clarification.   It  is  recommended  that  applications  enable
       resource  management  if  they  anticipate  receiving  unexpected  messages,  rather  than
       modifying this value.

   size
       The size of the context.   The  size  is  specified  as  the  minimum  number  of  receive
       operations that may be posted to the endpoint without the operation returning -FI_EAGAIN.

   iov_limit
       This  is  the  maximum number of IO vectors (scatter-gather elements) that a single posted
       operating may reference.

SCALABLE ENDPOINTS

       A scalable endpoint is a communication portal that supports multiple transmit and  receive
       contexts.   Scalable  endpoints  are  loosely  modeled  after  the  networking  concept of
       transmit/receive side scaling, also known as multi-queue.  Support for scalable  endpoints
       is  domain specific.  Scalable endpoints may improve the performance of multi-threaded and
       parallel applications, by allowing threads to  access  independent  transmit  and  receive
       queues.   A  scalable  endpoint has a single transport level address, which can reduce the
       memory requirements  needed  to  store  remote  addressing  data,  versus  using  standard
       endpoints.   Scalable  endpoints cannot be used directly for communication operations, and
       require the application to explicitly create transmit and receive  contexts  as  described
       below.

   fi_tx_context
       Transmit  contexts  are independent transmit queues.  Ordering and synchronization between
       contexts are not defined.  Conceptually a transmit context behaves similar to a  send-only
       endpoint.   A  transmit  context  may  be configured with fewer capabilities than the base
       endpoint and with different attributes (such as ordering  requirements  and  inject  size)
       than other contexts associated with the same scalable endpoint.  Each transmit context has
       its own completion queue.  The number of transmit contexts associated with an endpoint  is
       specified during endpoint creation.

       The fi_tx_context call is used to retrieve a specific context, identified by an index (see
       above for details on transmit context attributes).   Providers  may  dynamically  allocate
       contexts  when  fi_tx_context  is  called,  or  may  statically  create  all contexts when
       fi_endpoint is invoked.  By default, a transmit context inherits  the  properties  of  its
       associated  endpoint.   However,  applications  may  request  context  specific attributes
       through the attr parameter.  Support for  per  transmit  context  attributes  is  provider
       specific  and not guaranteed.  Providers will return the actual attributes assigned to the
       context through the attr parameter, if provided.

   fi_rx_context
       Receive contexts are independent receive queues for receiving incoming data.  Ordering and
       synchronization  between  contexts  are  not  guaranteed.   Conceptually a receive context
       behaves similar to a receive-only endpoint.  A receive  context  may  be  configured  with
       fewer  capabilities than the base endpoint and with different attributes (such as ordering
       requirements and inject size) than  other  contexts  associated  with  the  same  scalable
       endpoint.   Each  receive  context  has  its  own completion queue.  The number of receive
       contexts associated with an endpoint is specified during endpoint creation.

       Receive contexts are often associated with steering flows,  that  specify  which  incoming
       packets  targeting  a  scalable  endpoint  to  process.   However, receive contexts may be
       targeted directly by the  initiator,  if  supported  by  the  underlying  protocol.   Such
       contexts  are  referred  to  as  'named'.  Support for named contexts must be indicated by
       setting the caps FI_NAMED_RX_CTX capability when the corresponding  endpoint  is  created.
       Support  for named receive contexts is coordinated with address vectors.  See fi_av(3) and
       fi_rx_addr(3).

       The fi_rx_context call is used to retrieve a specific context, identified by an index (see
       above  for  details  on  receive  context attributes).  Providers may dynamically allocate
       contexts when fi_rx_context  is  called,  or  may  statically  create  all  contexts  when
       fi_endpoint  is  invoked.   By  default,  a receive context inherits the properties of its
       associated endpoint.   However,  applications  may  request  context  specific  attributes
       through  the  attr  parameter.   Support  for  per  receive context attributes is provider
       specific and not guaranteed.  Providers will return the actual attributes assigned to  the
       context through the attr parameter, if provided.

SHARED CONTEXTS

       Shared  contexts  are  transmit  and  receive contexts explicitly shared among one or more
       endpoints.  A shareable context allows an application to use a single  dedicated  provider
       resource  among  multiple  transport  addressable  endpoints.  This can greatly reduce the
       resources needed to manage communication over multiple endpoints by multiplexing  transmit
       and/or  receive  processing, with the potential cost of serializing access across multiple
       endpoints.  Support for shareable contexts is domain specific.

       Conceptually, shareable transmit contexts are transmit queues that may be accessed by many
       endpoints.   The  use  of  a  shared  transmit context is mostly opaque to an application.
       Applications must allocate and bind shared transmit contexts to endpoints, but  operations
       are  posted  directly  to  the endpoint.  Shared transmit contexts are not associated with
       completion queues or counters.  Completed operations are posted to the CQs  bound  to  the
       endpoint.  An endpoint may only be associated with a single shared transmit context.

       Unlike  shared  transmit  contexts,  applications  interact  directly  with shared receive
       contexts.  Users post receive buffers directly to  a  shared  receive  context,  with  the
       buffers  usable  by  any  endpoint  bound  to  the shared receive context.  Shared receive
       contexts are not  associated  with  completion  queues  or  counters.   Completed  receive
       operations  are  posted  to  the  CQs  bound  to  the  endpoint.   An endpoint may only be
       associated with a single receive context, and all connectionless endpoints associated with
       a shared receive context must also share the same address vector.

       Endpoints  associated  with  a shared transmit context may use dedicated receive contexts,
       and vice-versa.  Or an endpoint may use shared transmit and receive contexts.   And  there
       is  no  requirement  that  the  same group of endpoints sharing a context of one type also
       share the context of an alternate type.  Furthermore, an endpoint may use a shared context
       of one type, but a scalable set of contexts of the alternate type.

   fi_stx_context
       This  call  is  used  to  open  a shareable transmit context (see above for details on the
       transmit context attributes).  Endpoints associated with a shared  transmit  context  must
       use  a  subset of the transmit context's attributes.  Note that this is the reverse of the
       requirement for transmit contexts for scalable endpoints.

   fi_srx_context
       This allocates a shareable receive context (see above for details on the  receive  context
       attributes).   Endpoints associated with a shared receive context must use a subset of the
       receive context's attributes.  Note that this  is  the  reverse  of  the  requirement  for
       receive contexts for scalable endpoints.

SOCKET ENDPOINTS

       The  following  feature  and  description  should  be  considered experimental.  Until the
       experimental tag is removed, the interfaces, semantics,  and  data  structures  associated
       with socket endpoints may change between library versions.

       This section applies to endpoints of type FI_EP_SOCK_STREAM and FI_EP_SOCK_DGRAM, commonly
       referred to as socket endpoints.

       Socket endpoints are defined with semantics that allow them to more easily be  adopted  by
       developers  familiar  with  the  UNIX socket API, or by middleware that exposes the socket
       API, while still taking advantage of high-performance hardware features.

       The key difference  between  socket  endpoints  and  other  active  endpoints  are  socket
       endpoints use synchronous data transfers.  Buffers passed into send and receive operations
       revert to the control of the application upon returning from  the  function  call.   As  a
       result, no data transfer completions are reported to the application, and socket endpoints
       are not associated with completion queues or counters.

       Socket endpoints support a subset of message operations:  fi_send,  fi_sendv,  fi_sendmsg,
       fi_recv, fi_recvv, fi_recvmsg, and fi_inject.  Because data transfers are synchronous, the
       return value from send and receive operations indicate the number of bytes transferred  on
       success, or a negative value on error, including -FI_EAGAIN if the endpoint cannot send or
       receive any data because of full or empty queues, respectively.

       Socket endpoints are associated  with  event  queues  and  address  vectors,  and  process
       connection  management  events  asynchronously,  similar  to other endpoints.  Unlike UNIX
       sockets, socket endpoint must still be declared as either active or passive.

       Socket endpoints behave like non-blocking sockets.  In order to support  select  and  poll
       semantics,  active socket endpoints are associated with a file descriptor that is signaled
       whenever the endpoint is ready to send and/or receive data.  The file  descriptor  may  be
       retrieved using fi_control.

OPERATION FLAGS

       Operation  flags  are  obtained  by  OR-ing the following flags together.  Operation flags
       define the default flags applied to an endpoint's data transfer operations, where a  flags
       parameter  is  not  available.  Data transfer operations that take flags as input override
       the op_flags value of transmit or receive context attributes of an endpoint.

       FI_INJECT : Indicates that all outbound data buffers should  be  returned  to  the  user's
       control  immediately  after a data transfer call returns, even if the operation is handled
       asynchronously.  This may require that the provider copy the data into a local buffer  and
       transfer  out of that buffer.  A provider can limit the total amount of send data that may
       be buffered and/or the size of a single send that  can  use  this  flag.   This  limit  is
       indicated using inject_size (see inject_size above).

       FI_MULTI_RECV : Applies to posted receive operations.  This flag allows the user to post a
       single buffer that will receive multiple incoming messages.   Received  messages  will  be
       packed  into  the receive buffer until the buffer has been consumed.  Use of this flag may
       cause a single posted receive operation to generate multiple completions as  messages  are
       placed  into  the buffer.  The placement of received data into the buffer may be subjected
       to provider specific alignment restrictions.  The buffer will be released by the  provider
       when   the   available   buffer   space   falls   below   the   specified   minimum   (see
       FI_OPT_MIN_MULTI_RECV).

       FI_COMPLETION : Indicates that a completion entry should be generated  for  data  transfer
       operations.  This flag only applies to operations issued on endpoints that were bound to a
       CQ or counter with the FI_SELECTIVE_COMPLETION flag.  See the fi_ep_bind section above for
       more detail.

       FI_INJECT_COMPLETE  :  Indicates  that  a  completion  should be generated when the source
       buffer(s) may be reused.  A completion guarantees that the buffers will not be  read  from
       again  and the application may reclaim them.  No other guarantees are made with respect to
       the state of the operation.

       Note: This flag is used to control when a completion entry is inserted into  a  completion
       queue.   It  does  not  apply to operations that do not generate a completion queue entry,
       such as the fi_inject operation, and is not  subject  to  the  inject_size  message  limit
       restriction.

       FI_TRANSMIT_COMPLETE  :  Indicates that a completion should be generated when the transmit
       operation has completed relative to the local provider.  The exact behavior  is  dependent
       on the endpoint type.

       For reliable endpoints:

       Indicates  that  a completion should be generated when the operation has been delivered to
       the peer endpoint.  A completion guarantees that the operation is no longer  dependent  on
       the  fabric  or  local  resources.  The state of the operation at the peer endpoint is not
       defined.

       For unreliable endpoints:

       Indicates that a completion should be generated when the operation has been  delivered  to
       the  fabric.   A  completion guarantees that the operation is no longer dependent on local
       resources.  The state of the operation within the fabric is not defined.

       FI_DELIVERY_COMPLETE : Indicates that a  completion  should  not  be  generated  until  an
       operation has been processed by the destination endpoint(s).  A completion guarantees that
       the result of the operation is available.

       This completion mode applies only to reliable endpoints.  For operations that return  data
       to the initiator, such as RMA read or atomic-fetch, the source endpoint is also considered
       a destination endpoint.  This is the default completion mode for such operations.

       FI_MULTICAST : Indicates that data transfers will target multicast addresses  by  default.
       Any  fi_addr_t  passed  into  a  data  transfer  operation  will be treated as a multicast
       address.

NOTES

       Users should call fi_close to release all resources allocated to the fabric endpoint.

       Endpoints allocated with the FI_CONTEXT mode set must typically provide struct  fi_context
       as  their  per operation context parameter.  (See fi_getinfo.3 for details.) However, when
       FI_SELECTIVE_COMPLETION is enabled to suppress completion entries,  and  an  operation  is
       initiated  without  FI_COMPLETION  flag  set,  then  the context parameter is ignored.  An
       application does not need to pass in a valid struct fi_context into such data transfers.

       Operations that complete in error that are not associated with valid  operational  context
       will use the endpoint context in any error reporting structures.

       Although  applications  typically  associate individual completions with either completion
       queues or counters, an endpoint can be attached to both a counter  and  completion  queue.
       When combined with using selective completions, this allows an application to use counters
       to track successful completions, with  a  CQ  used  to  report  errors.   Operations  that
       complete  with  an error increment the error counter and generate a completion event.  The
       generation   of   entries   going   to   the   CQ   can   then   be    controlled    using
       FI_SELECTIVE_COMPLETION.

       As  mentioned  in fi_getinfo(3), the ep_attr structure can be used to query providers that
       support various endpoint attributes.  fi_getinfo can return provider info structures  that
       can  support  the  minimal  set  of  requirements  (such  that  the  application maintains
       correctness).   However,  it  can  also  return  provider  info  structures  that   exceed
       application  requirements.  As an example, consider an application requesting msg_order as
       FI_ORDER_NONE.  The resulting output from getinfo may have all the ordering bits set.  The
       application  can reset the ordering bits it does not require before creating the endpoint.
       The provider is free to implement a stricter ordering than is required by the application.

RETURN VALUES

       Returns 0 on success.  On error,  a  negative  value  corresponding  to  fabric  errno  is
       returned.   For  fi_cancel,  a  return  value  of  0 indicates that the cancel request was
       submitted for processing.

       Fabric errno values are defined in rdma/fi_errno.h.

ERRORS

       -FI_EDOMAIN : A resource domain was not bound to the endpoint or an attempt  was  made  to
       bind multiple domains.

       -FI_ENOCQ : The endpoint has not been configured with necessary event queue.

       -FI_EOPBADSTATE : The endpoint's state does not permit the requested operation.

SEE ALSO

       fi_getinfo(3), fi_domain(3), fi_msg(3), fi_tagged(3), fi_rma(3)

AUTHORS

       OpenFabrics.