|
|
#include <xti.h>int t_bind(int fd, struct t_bind *req, struct t_bind *ret)
If fd refers to a connection-mode service, the transport provider may then begin listening for connect indications on that endpoint (t_listen), or the provider may begin sending connection requests from that transport endpoint (t_connect).
If fd refers to a connectionless service, the transport user may then proceed with sending or receiving data units through the transport endpoint (t_snd, t_rcv).
struct netbuf addr; /* address */ unsigned qlen; /* connect indications */The netbuf addr fields (
len
, maxlen
and
buf
) are described in
intro(NET).
len
specifies the number of bytes in the address,
buf
points to the address buffer, and
maxlen
is the maximum size of the address buffer.
The qlen
field, in connection mode only, is used to indicate
the maximum number of outstanding connect indications.
In req, len
and buf
are used
to specify the protocol address to be bound to the
transport endpoint.
maxlen
has no meaning for the req argument.
In ret, the user specifies maxlen (which is the maximum size of the address buffer) and buf (which points to the buffer where the address is to be placed).
On return, ret contains the bound address. This is the same
as the address specified by the user in req.
len
specifies the number of bytes in the bound address
and buf
points to the bound address.
If maxlen
is not large enough to hold
the returned address, an error will result.
If the requested address is not available,
t_bind fails with an error and t_errno
is set to TADDRBUSY.
If no address is specified in req (the len
field in addr
is 0 or req is NULL),
the transport provider will assign an appropriate address to be bound,
and will return that address in ret.
req may be NULL if the user does not want to specify
the protocol address to be bound.
Here, the value of qlen
is assumed to be zero, and the transport
provider must assign an address to the transport endpoint.
Similarly, ret
may be NULL if the user does not care what address was
bound by the provider and is not interested in the negotiated
value of qlen
.
It is also valid to set req and ret to NULL for the same call, in which case the provider chooses the address to bind to the transport endpoint and does not return that information to the user.
The qlen
field has meaning only when initializing a
connection-mode service. It specifies the number of outstanding
connect indications the transport provider should support for the
given transport endpoint. An outstanding connect indication is one
that has been passed to the transport user by the transport provider.
A value of qlen
greater than 0 is only meaningful when
issued by a passive transport user that expects other users to call it.
The value of qlen
will be negotiated by the transport
provider and may be changed if the transport provider cannot support
the specified number of outstanding connect indications.
On return, the qlen
field in ret
will contain the negotiated value.
This function allows more than one transport endpoint to be bound to the same protocol address (however, the transport provider must support this capability also), but it is not allowable to bind more than one protocol address to the same transport endpoint.
If a user binds more than one transport endpoint to the same protocol
address, only one endpoint can be used to listen for
connect indications associated with that protocol address.
In other words, only one t_bind
for a given protocol address may specify a value of qlen
greater than 0.
In this way, the transport provider can identify which transport endpoint
should be notified of an incoming connect indication.
If a user attempts to bind a protocol address to a second transport
endpoint with a value of qlen
greater than 0,
t_bind will fail with TADDRBUSY.
A transport provider may not allow an explicit binding of more than one endpoint to the same protocol address, although it allows more than one connection to be accepted (see t_accept) for the same protocol address. To ensure portability, it is recommended not to bind transport endpoints that are used as responding endpoints (resfd) in a call to t_accept, if the responding address is to be the same as the called address.
If a user accepts a connection on the transport endpoint that is being used as the listening endpoint, the bound protocol address will be found to be busy for the duration of that connection. No other transport endpoints may be bound for listening while that initial listening endpoint is in the data transfer phase. This will prevent more than one transport endpoint bound to the same protocol address from accepting connect indications.
maxlen
) allocated for an incoming argument
is greater than zero but not sufficient to store the value of that argument.
The provider's state will change to T_IDLE
and the information to be returned in ret will be discarded.