Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
fi_endpoint(3)			Libfabric v1.15.1		  fi_endpoint(3)

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/re-
	    ceive 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_tc_dscp_set / fi_tc_dscp_get
	    Convert between a DSCP value and a network traffic class

     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);

	    uint32_t fi_tc_dscp_set(uint8_t dscp);

	    uint8_t fi_tc_dscp_get(uint32_t tclass);

	    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,  identi-
	    fies  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 do-
     main  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 pro-
     vide 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  end-
     point  has transmit and receive queues.  In general, operations that gener-
     ate 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 al-
     ready 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 asynchro-
     nous 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.  Additionally, endpoints
     that use manual progress must be associated with relevant completion queues
     or event queues in order to drive progress.  For endpoints  that  are  only
     used as the target of RMA or atomic operations, this means binding the end-
     point  to	a  completion queue associated with receive processing.  Connec-
     tionless 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 con-
     nection 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 behav-
     ior.

     If an endpoint experiences a critical error, it will transition back into a
     disabled state.  Critical errors are reported through the event queue asso-
     ciated with the EP.  In certain cases, a disabled endpoint  may  be  re-en-
     abled.   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 prop-
     erties 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 set-
     ting  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 sim-
     ulating socket semantics.	Once an active endpoint acquires the  properties
     of  a passive endpoint, the passive endpoint is no longer bound to any fab-
     ric 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  con-
     texts,  or  receive contexts associated with the scalable endpoint.  If re-
     sources 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  com-
     pletions  reported.   Additionally,  a provider may discard previously com-
     pleted 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 other allocated resources,
     such as completion queues, counters, address vectors, event queues,  shared
     contexts,	and memory regions.  The type of objects that must be bound with
     an endpoint depend on the endpoint type and its configuration.

     Passive endpoints must be bound with an EQ that supports connection manage-
     ment events.  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 either
     explicitly or implicitly.

     An endpoint must be bound with CQs capable of reporting completions for any
     asynchronous operation initiated on the endpoint.	For example, if the end-
     point supports any outbound transfers (sends, RMA, atomics, etc.), then  it
     must  be  bound to a completion queue that can report transmit completions.
     This is true even if the endpoint is configured to suppress successful com-
     pletions, in order that operations that complete in error may  be	reported
     to the user.

     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 OR'ed together when binding an endpoint to a
     completion domain CQ.

     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  end-
	    point.

     FI_SELECTIVE_COMPLETION
	    By	default,  data	transfer  operations write CQ completion entries
	    into the associated completion queue after	they  have  successfully
	    completed.	 Applications  can use this bind flag to selectively en-
	    able when completions are generated.  If FI_SELECTIVE_COMPLETION  is
	    specified, data transfer operations will not generate CQ entries for
	    successful completions unless FI_COMPLETION is set as an operational
	    flag  for  the given operation.  Operations that fail asynchronously
	    will still generate completions, even if a	completion  is	not  re-
	    quested.   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 or by using completion
     counters.	Use of	this  flag  may  improve  performance  by  allowing  the
     provider to avoid writing a CQ completion entry for every operation.

     See  Notes section below for additional information on how this flag inter-
     acts with the FI_CONTEXT and FI_CONTEXT2 mode bits.

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

     An endpoint may optionally be bound to a completion  counter.   Associating
     an  endpoint  with  a  counter  is in addition to binding the EP with a CQ.
     When binding an endpoint to a counter, the following flags  may  be  speci-
     fied.

     FI_READ
	    Increments the specified counter whenever an RMA read, atomic fetch,
	    or	atomic	compare  operation  initiated from the endpoint has com-
	    pleted successfully or in error.

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

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

     FI_REMOTE_WRITE
	    Increments the specified counter  whenever	an  RMA  write	or  base
	    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.

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

     FI_WRITE
	    Increments the specified counter  whenever	an  RMA  write	or  base
	    atomic  operation initiated from the endpoint has completed success-
	    fully or in error.

     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 end-
     points of the same endpoint type (DGRAM, MSG, RDM, etc.).

   fi_scalable_ep_bind
     fi_scalable_ep_bind  is  used  to associate a scalable endpoint with an ad-
     dress vector.  See section on SCALABLE ENDPOINTS.	A scalable endpoint  has
     a	single transport level address and can support multiple transmit and re-
     ceive contexts.   The  transmit  and  receive  contexts  share  the  trans-
     port-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	success-
     fully be re-enabled.

   fi_cancel
     fi_cancel	attempts  to cancel an outstanding asynchronous operation.  Can-
     celing 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 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.

     Cancel  uses the context parameter associated with an operation to identify
     the request to cancel.  Operations posted without a valid context parameter
     - either no context parameter is specified or the context value was ignored
     by the provider - cannot be canceled.  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 end-
     point  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 appli-
     cation 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  in-
     clude  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  end-
     point.  It allows the underlying provider to redirect function calls to im-
     plementations optimized to meet the desired application behavior.	As a re-
     sult,  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_BACKLOG - int *value**
	    This option only applies to passive endpoints.  It is  used  to  set
	    the connection request backlog for listening endpoints.

     **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_GETWAIT - void **
	    This command allows the user to retrieve the file descriptor associ-
	    ated 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_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 be-
	    low.

   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 op-
     tion.  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_ENDPOINT * .RS 2

     FI_OPT_BUFFERED_LIMIT - size_t
	    Defines the maximum size of a buffered message that will be reported
	    to users as part of a receive completion when  the	FI_BUFFERED_RECV
	    mode is enabled on an endpoint.

     fi_getopt()   will  return  the  currently  configured  threshold,  or  the
     provider's default threshold if one has not  be  set  by  the  application.
     fi_setopt()  allows  an  application  to  configure  the threshold.  If the
     provider cannot support the requested threshold, it will  fail  the  fi_se-
     topt()  call  with FI_EMSGSIZE.  Calling fi_setopt() with the threshold set
     to SIZE_MAX will  set  the  threshold  to	the  maximum  supported  by  the
     provider.	fi_getopt() can then be used to retrieve the set size.

     In  most  cases,  the sending and receiving endpoints must be configured to
     use the same threshold value, and the threshold must be set  prior  to  en-
     abling the endpoint.
     * .RS 2

     FI_OPT_BUFFERED_MIN - size_t
	    Defines  the  minimum  size  of  a buffered message that will be re-
	    ported.  Applications would set this to a size that's big enough  to
	    decide  whether  to  discard  or claim a buffered receive or when to
	    claim a buffered receive on getting a buffered  receive  completion.
	    The  value is typically used by a provider when sending a rendezvous
	    protocol request where it would send  at  least  FI_OPT_BUFFERED_MIN
	    bytes of application data along with it.  A smaller sized rendezvous
	    protocol  message  usually results in better latency for the overall
	    transfer of a large message.
     * .RS 2

     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 prop-
	    erties 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.
     * .RS 2

     FI_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 recom-
	    mended  that  applications	that  want  to	override   the	 default
	    MIN_MULTI_RECV value set this option before enabling the correspond-
	    ing endpoint.
     * .RS 2

     FI_OPT_FI_HMEM_P2P - int
	    Defines  how  the provider should handle peer to peer FI_HMEM trans-
	    fers for this endpoint.  By default, the provider will chose whether
	    to	use  peer  to  peer  support  based  on  the  type  of	transfer
	    (FI_HMEM_P2P_ENABLED).  Valid values defined in fi_endpoint.h are:

	    * FI_HMEM_P2P_ENABLED:  Peer  to  peer  support  may  be used by the
	      provider to handle FI_HMEM transfers, and which transfers are ini-
	      tiated using peer to peer is subject to the  provider  implementa-
	      tion.

	    * FI_HMEM_P2P_REQUIRED: Peer to peer support must be used for trans-
	      fers,  transfers	that  cannot  be performed using p2p will be re-
	      ported as failing.

	    * FI_HMEM_P2P_PREFERRED: Peer to peer support should be used by  the
	      provider	for  all  transfers  if  available, but the provider may
	      choose to copy the data to initiate the transfer if peer	to  peer
	      support is unavailable.

	    * FI_HMEM_P2P_DISABLED: Peer to peer support should not be used.
     fi_setopt() will return -FI_EOPNOTSUPP if the mode requested cannot be sup-
     ported  by the provider.  The FI_HMEM_DISABLE_P2P environment variable dis-
     cussed in fi_mr(3) takes precedence over this setopt option.
     * .RS 2

     FI_OPT_XPU_TRIGGER - struct fi_trigger_xpu *
	    This option only applies to the fi_getopt() call.	It  is	used  to
	    query  the maximum number of variables required to support XPU trig-
	    gered operations, along with the size of each variable.

     The user provides a filled out struct fi_trigger_xpu on input.   The  iface
     and  device  fields  should reference an HMEM domain.  If the provider does
     not support XPU triggered operations from	the  given  device,  fi_getopt()
     will  return  -FI_EOPNOTSUPP.   On  input, var should reference an array of
     struct fi_trigger_var data structures, with count set to the  size  of  the
     referenced  array.   If  count is 0, the var field will be ignored, and the
     provider will return the number of fi_trigger_var	structures  needed.   If
     count is > 0, the provider will set count to the needed value, and for each
     fi_trigger_var  available,  set the datatype and count of the variable used
     for the trigger.

   fi_tc_dscp_set
     This call converts a DSCP defined value  into  a  libfabric  traffic  class
     value.   It  should  be  used  when assigning a DSCP value when setting the
     tclass field in either domain or endpoint attributes

   fi_tc_dscp_get
     This call returns the DSCP value associated with the tclass field	for  the
     domain or endpoint attributes.

   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 op-
     erations that may be posted to the given endpoint	without  that  operation
     returning	-FI_EAGAIN.   Depending  on  the  specific details of the subse-
     quently posted receive operations (e.g., number of iov entries,  which  re-
     ceive  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 subse-
     quently posted transmit operations (e.g.,	number	of  iov  entries,  which
     transmit  function is called, etc.), it may be possible to post more trans-
     mit 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_DGRAM
	    Supports a connectionless, unreliable datagram communication.   Mes-
	    sage  boundaries are maintained, but the maximum message size may be
	    limited to the fabric MTU.	Flow control is not guaranteed.

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

     FI_EP_RDM
	    Reliable datagram message.	Provides a reliable, connectionless data
	    transfer  service  with  flow  control that maintains message bound-
	    aries.

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

     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 END-
	    POINT  section for additional details and restrictions that apply to
	    stream endpoints.

     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 select-
	    ing the type.

   Protocol
     Specifies	the  low-level	end to end protocol employed by the provider.  A
     matching protocol must be used by communicating endpoints to ensure  inter-
     operability.  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_GNI
	    Protocol runs over Cray GNI low-level interface.

     FI_PROTO_IB_RDM
	    Reliable-datagram protocol implemented over InfiniBand reliable-con-
	    nected queue pairs.

     FI_PROTO_IB_UD
	    The protocol runs over Infiniband unreliable datagram queue pairs.

     FI_PROTO_IWARP
	    The protocol runs over the Internet wide area RDMA	protocol  trans-
	    port.

     FI_PROTO_IWARP_RDM
	    Reliable-datagram protocol implemented over iWarp reliable-connected
	    queue pairs.

     FI_PROTO_NETWORKDIRECT
	    Protocol  runs  over Microsoft NetworkDirect service provider inter-
	    face.  This adds reliable-datagram semantics over the  NetworkDirect
	    connection- oriented endpoint semantics.

     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_PSMX2
	    The protocol is based on an  Intel	proprietary  protocol  known  as
	    PSM2,  performance scaled messaging version 2.  PSMX2 is an extended
	    version of the PSM2 protocol to support the libfabric interfaces.

     FI_PROTO_PSMX3
	    The protocol is Intel's protocol known as PSM3,  performance  scaled
	    messaging version 3.  PSMX3 is implemented over RoCEv2 and verbs.

     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_RXD
	    Reliable-datagram protocol implemented over datagram endpoints.  RXD
	    is a libfabric utility component that adds	RDM  endpoint  semantics
	    over DGRAM endpoint semantics.

     FI_PROTO_RXM
	    Reliable-datagram  protocol implemented over message endpoints.  RXM
	    is a libfabric utility component that adds	RDM  endpoint  semantics
	    over MSG endpoint semantics.

     FI_PROTO_SOCK_TCP
	    The protocol is layered over TCP packets.

     FI_PROTO_UDP
	    The protocol sends and receives UDP datagrams.  For example, an end-
	    point  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_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.

   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 oper-
     ation.

   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  sepa-
     rate,  but dependent on message ordering (defined below).	Data ordering is
     unspecified where message order is not defined.

     Data ordering refers to the access of the same 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 op-
     eration reads or writes the target memory after  the  first  operation  has
     completed.   For  example,  will an RMA read that follows an RMA write read
     back the data that was written?  Similarly, will an RMA write that  follows
     an  RMA  read  update  the target buffer after the read has transferred the
     original data?  Data ordering answers these questions, even in the presence
     of errors, such as the need to resend data because  of  lost  or  corrupted
     network traffic.

     RMA  ordering  applies between two operations, and not within a single data
     transfer.	Therefore, ordering is defined per byte-addressable memory loca-
     tion.  I.e.  ordering specifies whether location X is accessed by the  sec-
     ond operation after the first operation.  Nothing is implied about the com-
     pletion  of  the  first operation before the second operation is initiated.
     For example, if the first operation updates locations X and Y, but the sec-
     ond operation only accesses location X, there  are  no  guarantees  defined
     relative to location Y and the second operation.

     In order to support large data transfers being broken into multiple packets
     and sent using multiple paths through the fabric, data ordering may be lim-
     ited  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 is-
	    sued after an RMA or atomic  write	operation,  both  of  which  are
	    smaller than the size, will be ordered.  Where the target memory lo-
	    cations  overlap,  the RMA or atomic read operation will see the re-
	    sults of the previous RMA or atomic write.

     max_order_war_size
	    Write after read size.  If set, an RMA or atomic write operation is-
	    sued after an RMA or  atomic  read	operation,  both  of  which  are
	    smaller  than the size, will be ordered.  The RMA or atomic read op-
	    eration will see the initial value of the target memory location be-
	    fore 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, collec-
     tively.

     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.  The provider may not validate the mask
     provided by the application for performance reasons.

     By identifying fields within a tag, a provider  may  be  able  to	optimize
     their  search routines.  An application which requests tag fields must pro-
     vide 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_FOR-
     MAT_TAGGED), it is not guaranteed that the provider would clear out any un-
     supported tag bits in the tag field of the completion entry.

     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 ar-
     ray 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  speci-
     fied  (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 synchro-
     nization 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  re-
     quest.

     See  the  scalable endpoint and shared contexts sections for additional de-
     tails.

   rx_ctx_cnt - Receive Context Count
     Number of receive contexts to associate with the endpoint.  If  not  speci-
     fied,  1  context	will be assigned if the endpoint supports inbound trans-
     fers.  Receive contexts are independent processing queues that may be sepa-
     rately 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 re-
     quest.

     See the scalable endpoint and shared contexts sections for  additional  de-
     tails.

   auth_key_size - Authorization Key Length
     The  length of the authorization key in bytes.  This field will be 0 if au-
     thorization 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 asso-
     ciate  with the endpoint.	An authorization key is used to limit communica-
     tion 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 speci-
     fied 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;
		uint32_t  tclass;
	    };

   caps - Capabilities
     The requested capabilities of the context.  The capabilities must be a sub-
     set 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  applicable capability bits from the fi_info
     structure will be used.

     The following  capabilities  apply  to  the  transmit  attributes:  FI_MSG,
     FI_RMA, FI_TAGGED, FI_ATOMIC, FI_READ, FI_WRITE, FI_SEND, FI_HMEM, FI_TRIG-
     GER,  FI_FENCE,  FI_MULTICAST, FI_RMA_PMEM, FI_NAMED_RX_CTX, FI_COLLECTIVE,
     and FI_XPU.

     Many applications will be able to ignore this field and rely solely on  the
     fi_info::caps  field.  Use of this field provides fine grained control over
     the transmit capabilities associated with an endpoint.  It is  useful  when
     handling  scalable endpoints, with multiple transmit contexts, for example,
     and allows configuring a specific transmit context with fewer  capabilities
     than that supported by the endpoint or other transmit contexts.

   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_get-
     info(3) for details.  A mode value of 0 will be ignored on input to fi_get-
     info(3), with the mode value of the fi_info structure used instead.  On re-
     turn  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  con-
     text.  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 identified and 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 in-
     dicates that ordering is maintained between data transfers of the specified
     type.  Message order is defined for [read | write | send]	operations  sub-
     mitted 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_ATOMIC_RAR
	    Atomic  read after read.  If set, atomic fetch operations are trans-
	    mitted in the order submitted relative to other atomic fetch  opera-
	    tions.   If  not set, atomic fetches may be transmitted out of order
	    from their submission.

     FI_ORDER_ATOMIC_RAW
	    Atomic read after write.  If set, atomic fetch operations are trans-
	    mitted in the order submitted relative to atomic update  operations.
	    If	not  set,  atomic fetches may be transmitted ahead of atomic up-
	    dates.

     FI_ORDER_ATOMIC_WAR
	    RMA write after read.  If set, atomic update operations  are  trans-
	    mitted  in	the order submitted relative to atomic fetch operations.
	    If not set, atomic	updates  may  be  transmitted  ahead  of  atomic
	    fetches.

     FI_ORDER_ATOMIC_WAW
	    RMA  write after write.  If set, atomic update operations are trans-
	    mitted in the order submitted relative to other atomic update opera-
	    tions.  If not atomic updates may be transmitted out of  order  from
	    their submission.

     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 trans-
	    mitted 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_RAS
	    Read  after send.  If set, RMA and atomic read operations are trans-
	    mitted 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_RAW
	    Read after write.  If set, RMA and atomic read operations are trans-
	    mitted in the order submitted relative to RMA and atomic write oper-
	    ations.  If not set, RMA and atomic reads may be  transmitted  ahead
	    of RMA and atomic writes.

     FI_ORDER_RMA_RAR
	    RMA read after read.  If set, RMA read operations are transmitted in
	    the  order	submitted relative to other RMA read operations.  If not
	    set, RMA reads may be transmitted out of order  from  their  submis-
	    sion.

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

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

     FI_ORDER_RMA_WAW
	    RMA write after write.  If set, RMA write operations are transmitted
	    in the order submitted relative to other RMA write	operations.   If
	    not  set, RMA writes may be transmitted out of order from their sub-
	    mission.

     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_SAS
	    Send  after send.  If set, message send operations, including tagged
	    sends, are transmitted in the order submitted relative to other mes-
	    sage send.	If not set, message sends may be transmitted out of  or-
	    der from their submission.

     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_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_WAS
	    Write  after  send.   If  set,  RMA  and atomic write operations are
	    transmitted in the order submitted relative to message  send  opera-
	    tions,  including  tagged  sends.  If not set, RMA and atomic writes
	    may be transmitted ahead of sends.

     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  trans-
	    mitted 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  mes-
     sage  order.   Relaxed completion order may enable faster reporting of com-
     pleted 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  connectionless end-
     points.  Strict completion ordering may require that providers  queue  com-
     pleted operations or limit available optimizations.

     For transmit requests, completion ordering depends on the endpoint communi-
     cation  type.  For unreliable communication, completion ordering applies to
     all data transfer requests submitted to an endpoint.  For reliable communi-
     cation, completion ordering only applies to requests that target  a  single
     destination  endpoint.  Completion ordering of requests that target differ-
     ent 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  con-
     text  will support.  This is the maximum size data transfer that can be as-
     sociated with an inject operation (such as fi_inject) or may be  used  with
     the FI_INJECT data transfer flag.

   size
     The  size	of  the  transmit context.  The mapping of the size value to re-
     sources is provider specific, but it is directly related to the  number  of
     command  entries allocated for the endpoint.  A smaller size value consumes
     fewer hardware and software resources, while a larger size  allows  queuing
     more transmit requests.

     While  the  size  attribute guides the size of underlying endpoint transmit
     queue, there is not necessarily a one-to-one mapping between a transmit op-
     eration and a queue entry.  A single transmit operation may consume  multi-
     ple  queue  entries;  for example, one per scatter-gather entry.  Addition-
     ally, the size field is intended to guide the allocation of the  endpoint's
     transmit context.	Specifically, for connectionless endpoints, there may be
     lower-level  queues  use  to  track communication on a per peer basis.  The
     sizes of any lower-level queues may only be significantly smaller than  the
     endpoint's transmit size, in order to reduce resource utilization.

   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 addi-
     tional 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.

   Traffic Class (tclass)
     Traffic  classes  can be a differentiated services code point (DSCP) value,
     one of the following defined labels, or a provider-specific definition.  If
     tclass is unset or set to FI_TC_UNSPEC, the endpoint will use  the  default
     traffic class associated with the domain.

     FI_TC_BEST_EFFORT
	    This is the default in the absence of any other local or fabric con-
	    figuration.  This class carries the traffic for a number of applica-
	    tions  executing  concurrently over the same network infrastructure.
	    Even though it is shared, network capacity and  resource  allocation
	    are distributed fairly across the applications.

     FI_TC_BULK_DATA
	    This  class is intended for large data transfers associated with I/O
	    and is present to separate sustained I/O transfers from other appli-
	    cation inter-process communications.

     FI_TC_DEDICATED_ACCESS
	    This class operates at the highest priority, except  the  management
	    class.  It carries a high bandwidth allocation, minimum latency tar-
	    gets, and the highest scheduling and arbitration priority.

     FI_TC_LOW_LATENCY
	    This  class supports low latency, low jitter data patterns typically
	    caused by transactional data  exchanges,  barrier  synchronizations,
	    and  collective  operations  that  are  typical of HPC applications.
	    This class often requires  maximum	tolerable  latencies  that  data
	    transfers  must achieve for correct or performance operations.  Ful-
	    fillment of such requests in this class will typically  require  ac-
	    companying	bandwidth and message size limitations so as not to con-
	    sume excessive bandwidth at high priority.

     FI_TC_NETWORK_CTRL
	    This class is intended for traffic directly related to fabric  (net-
	    work)  management, which is critical to the correct operation of the
	    network.  Its use is typically restricted to privileged network man-
	    agement applications.

     FI_TC_SCAVENGER
	    This class is used for data that is desired but does not have strict
	    delivery requirements, such as in-band network or application  level
	    monitoring	data.	Use  of this class indicates that the traffic is
	    considered lower priority and should not interfere with higher  pri-
	    ority workflows.

     fi_tc_dscp_set / fi_tc_dscp_get
	    DSCP  values  are supported via the DSCP get and set functions.  The
	    definitions for DSCP values are outside the scope of libfabric.  See
	    the fi_tc_dscp_set and fi_tc_dscp_get function definitions	for  de-
	    tails on their use.

RECEIVE CONTEXT ATTRIBUTES
     Attributes  specific  to the receive capabilities of an endpoint are speci-
     fied 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 sub-
     set 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  applicable capability bits from the fi_info
     structure will be used.

     The following capabilities apply to the receive attributes: FI_MSG, FI_RMA,
     FI_TAGGED, FI_ATOMIC, FI_REMOTE_READ,  FI_REMOTE_WRITE,  FI_RECV,	FI_HMEM,
     FI_TRIGGER,  FI_RMA_PMEM, FI_DIRECTED_RECV, FI_VARIABLE_MSG, FI_MULTI_RECV,
     FI_SOURCE, FI_RMA_EVENT, FI_SOURCE_ERR, FI_COLLECTIVE, and FI_XPU.

     Many applications will be able to ignore this field and rely solely on  the
     fi_info::caps  field.  Use of this field provides fine grained control over
     the receive capabilities associated with an endpoint.  It	is  useful  when
     handling  scalable  endpoints, with multiple receive contexts, for example,
     and allows configuring a specific receive context with  fewer  capabilities
     than that supported by the endpoint or other receive contexts.

   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_get-
     info(3) for details.  A mode value of 0 will be ignored on input to fi_get-
     info(3), with the mode value of the fi_info structure used instead.  On re-
     turn  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  con-
     text.  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  de-
     fines  the  order in which received transport message headers are processed
     when received by an endpoint.  When ordering is set, it indicates that mes-
     sage headers will be processed in order, based on how the transmit side has
     identified the messages.  Typically, this means that messages will be  han-
     dled in order based on a message level sequence number.

     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,   FI_ORDER_SAS,   FI_ORDER_RMA_RAR,	  FI_OR-
     DER_RMA_RAW,   FI_ORDER_RMA_WAR,	FI_ORDER_RMA_WAW,   FI_ORDER_ATOMIC_RAR,
     FI_ORDER_ATOMIC_RAW, FI_ORDER_ATOMIC_WAR, and FI_ORDER_ATOMIC_WAW.

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

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

     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 at-
	    tribute.

   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 opera-
     tion.  The provider may adjust or ignore this value.  The allocation of in-
     ternal 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  mes-
     sage  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 clarifica-
     tion.  It is recommended that applications enable	resource  management  if
     they  anticipate  receiving unexpected messages, rather than modifying this
     value.

   size
     The size of the receive context.  The mapping of  the  size  value  to  re-
     sources  is  provider specific, but it is directly related to the number of
     command entries allocated for the endpoint.  A smaller size value	consumes
     fewer  hardware  and software resources, while a larger size allows queuing
     more transmit requests.

     While the size attribute guides the size  of  underlying  endpoint  receive
     queue,  there is not necessarily a one-to-one mapping between a receive op-
     eration and a queue entry.  A single receive operation may consume multiple
     queue entries; for example, one per  scatter-gather  entry.   Additionally,
     the  size	field  is intended to guide the allocation of the endpoint's re-
     ceive context.  Specifically, for connectionless endpoints,  there  may  be
     lower-level  queues  use  to  track communication on a per peer basis.  The
     sizes of any lower-level queues may only be significantly smaller than  the
     endpoint's receive size, in order to reduce resource utilization.

   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 trans-
     mit 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 appli-
     cations, 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 di-
     rectly for communication operations, and require the application to explic-
     itly create transmit and receive contexts as described below.

   fi_tx_context
     Transmit contexts are independent transmit queues.  Ordering  and	synchro-
     nization between contexts are not defined.  Conceptually a transmit context
     behaves similar to a send-only endpoint.  A transmit context may be config-
     ured  with fewer capabilities than the base endpoint and with different at-
     tributes (such as ordering requirements and inject size)  than  other  con-
     texts  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  de-
     fault,  a	transmit  context inherits the properties of its associated end-
     point.  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 at-
     tributes 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  end-
     point.   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'.  Sup-
     port  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  de-
     fault,  a	receive  context  inherits the properties of its associated end-
     point.  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 at-
     tributes 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 communi-
     cation over multiple endpoints by multiplexing transmit and/or receive pro-
     cessing, with the potential cost of serializing access across multiple end-
     points.  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  re-
     ceive  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 re-
     ceive contexts, and vice-versa.  Or an endpoint may use shared transmit and
     receive contexts.	And there is no requirement that the same group of  end-
     points 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 de-
     tails on the transmit context attributes).   Endpoints  associated  with  a
     shared transmit context must use a subset of the transmit context's attrib-
     utes.   Note  that this is the reverse of the requirement for transmit con-
     texts 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 ver-
     sions.

     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  middle-
     ware that exposes the socket API, while still taking advantage of high-per-
     formance 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 re-
     turning 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 opera-
     tions 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  end-
     points.  Unlike UNIX sockets, socket endpoint must still be declared as ei-
     ther active or passive.

     Socket endpoints behave like non-blocking sockets.  In order to support se-
     lect 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.  Oper-
     ation flags define the default flags applied to an endpoint's data transfer
     operations, where a flags parameter is not available.  Data transfer opera-
     tions that take flags as input override the op_flags value of  transmit  or
     receive context attributes of an endpoint.

     FI_COMMIT_COMPLETE
	    Indicates  that  a completion should not be generated (locally or at
	    the peer) until the result of an operation have  been  made  persis-
	    tent.  See fi_cq(3) for additional details on completion semantics.

     FI_COMPLETION
	    Indicates  that  a completion queue entry should be written for data
	    transfer operations.  This flag only applies to operations issued on
	    an endpoint that was bound to a completion queue with the  FI_SELEC-
	    TIVE_COMPLETION  flag  set,  otherwise,  it  is  ignored.	See  the
	    fi_ep_bind section above for more detail.

     FI_DELIVERY_COMPLETE
	    Indicates that a completion should be generated when  the  operation
	    has been processed by the destination endpoint(s).	See fi_cq(3) for
	    additional details on completion semantics.

     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 in-
	    ject_size above).

     FI_INJECT_COMPLETE
	    Indicates that a completion should	be  generated  when  the  source
	    buffer(s)  may  be	reused.   See fi_cq(3) for additional details on
	    completion semantics.

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

     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 mes-
	    sages are placed into the buffer.  The placement  of  received  data
	    into  the buffer may be subjected to provider specific alignment re-
	    strictions.  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_TRANSMIT_COMPLETE
	    Indicates that a completion should be generated  when  the	transmit
	    operation  has  completed  relative  to  the  local  provider.   See
	    fi_cq(3) for additional details on completion semantics.

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

     Endpoints allocated with the FI_CONTEXT or FI_CONTEXT2 mode bits  set  must
     typically provide struct fi_context(2) as their per operation context para-
     meter.   (See fi_getinfo.3 for details.) However, when FI_SELECTIVE_COMPLE-
     TION is enabled to suppress CQ completion entries, and an operation is ini-
     tiated without the FI_COMPLETION flag set, then the  context  parameter  is
     ignored.	An  application  does not need to pass in a valid struct fi_con-
     text(2) into such data transfers.

     Operations that complete in error that are not associated with valid opera-
     tional context will use the endpoint context in any error reporting  struc-
     tures.

     Although  applications  typically associate individual completions with ei-
     ther completion queues or counters, an endpoint can be attached to  both  a
     counter  and  completion queue.  When combined with using selective comple-
     tions, this allows an application to use counters to track successful  com-
     pletions,	with  a CQ used to report errors.  Operations that complete with
     an error increment the error counter and generate a CQ completion event.

     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 fi_getinfo may have all the  ordering  bits  set.
     The application can reset the ordering bits it does not require before cre-
     ating  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_cq(3) fi_msg(3), fi_tagged(3), fi_rma(3)

AUTHORS
     OpenFabrics.

Libfabric Programmer's Manual	   2021-11-20			  fi_endpoint(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=fi_enable&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help