in c/src/core/transport.c [2007:2085]
static int pni_process_link_setup(pn_transport_t *transport, pn_endpoint_t *endpoint)
{
if (transport->open_sent && (endpoint->type == SENDER ||
endpoint->type == RECEIVER))
{
pn_link_t *link = (pn_link_t *) endpoint;
pn_session_state_t *ssn_state = &link->session->state;
pn_link_state_t *state = &link->state;
if (((int16_t) ssn_state->local_channel >= 0) &&
!(endpoint->state & PN_LOCAL_UNINIT) && state->local_handle == (uint32_t) -1)
{
if (! pni_map_local_handle(link)) {
pn_logger_logf(&transport->logger, PN_SUBSYSTEM_AMQP, PN_LEVEL_WARNING, "unable to find an open available handle within limit of %d", ssn_state->remote_handle_max );
return PN_ERR;
}
const pn_distribution_mode_t dist_mode = (pn_distribution_mode_t) link->source.distribution_mode;
if (link->target.type == PN_COORDINATOR) {
pn_bytes_t buf = pn_amqp_encode_DLESIoBBQDLESIsIoCQsCnCCeDLECennIe(&transport->scratch_space, ATTACH,
pn_string_bytes(link->name),
state->local_handle,
endpoint->type == RECEIVER,
link->snd_settle_mode,
link->rcv_settle_mode,
(bool) link->source.type, SOURCE,
pn_string_bytes(link->source.address),
link->source.durability,
expiry_symbol(&link->source),
link->source.timeout,
link->source.dynamic,
link->source.properties,
(dist_mode != PN_DIST_MODE_UNSPECIFIED), dist_mode2symbol(dist_mode),
link->source.filter,
link->source.outcomes,
link->source.capabilities,
COORDINATOR, link->target.capabilities,
0);
int err = pn_framing_send_amqp(transport, ssn_state->local_channel, buf);
if (err) return err;
} else {
/* "DL[SIoBB?DL[SIsIoC?sCnMM]?DL[SIsIoCM]nnILnnC]" */
pn_bytes_t buf = pn_amqp_encode_DLESIoBBQDLESIsIoCQsCnMMeQDLESIsIoCMennILnnCe(&transport->scratch_space, ATTACH,
pn_string_bytes(link->name),
state->local_handle,
endpoint->type == RECEIVER,
link->snd_settle_mode,
link->rcv_settle_mode,
(bool) link->source.type, SOURCE,
pn_string_bytes(link->source.address),
link->source.durability,
expiry_symbol(&link->source),
link->source.timeout,
link->source.dynamic,
link->source.properties,
(dist_mode != PN_DIST_MODE_UNSPECIFIED), dist_mode2symbol(dist_mode),
link->source.filter,
link->source.outcomes,
link->source.capabilities,
(bool) link->target.type, TARGET,
pn_string_bytes(link->target.address),
link->target.durability,
expiry_symbol(&link->target),
link->target.timeout,
link->target.dynamic,
link->target.properties,
link->target.capabilities,
0,
link->max_message_size,
link->properties);
int err = pn_framing_send_amqp(transport, ssn_state->local_channel, buf);
if (err) return err;
}
}
}
return 0;
}