in c/src/core/transport.c [2009:2094]
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 %u", ssn_state->remote_handle_max );
return PN_ERR;
}
const pn_distribution_mode_t dist_mode = (pn_distribution_mode_t) link->source.distribution_mode;
// Until we encode directly from the raw
pni_switch_to_raw(&transport->scratch_space, &link->source.properties, &link->source.properties_raw);
pni_switch_to_raw(&transport->scratch_space, &link->source.filter, &link->source.filter_raw);
pni_switch_to_raw_multiple(&transport->scratch_space, &link->source.outcomes, &link->source.outcomes_raw);
pni_switch_to_raw_multiple(&transport->scratch_space, &link->source.capabilities, &link->source.capabilities_raw);
pni_switch_to_raw_multiple(&transport->scratch_space, &link->target.capabilities, &link->target.capabilities_raw);
if (link->target.type == PN_COORDINATOR) {
pn_bytes_t buf = pn_amqp_encode_DLESIoBBQDLESIsIoRQsRnRReDLERennIe(&transport->scratch_space, AMQP_DESC_ATTACH,
pn_string_bytes(link->name),
state->local_handle,
endpoint->type == RECEIVER,
link->snd_settle_mode,
link->rcv_settle_mode,
(bool) link->source.type, AMQP_DESC_SOURCE,
pn_string_bytes(link->source.address),
link->source.durability,
expiry_symbol(&link->source),
link->source.timeout,
link->source.dynamic,
link->source.properties_raw,
(dist_mode != PN_DIST_MODE_UNSPECIFIED), dist_mode2symbol(dist_mode),
link->source.filter_raw,
link->source.outcomes_raw,
link->source.capabilities_raw,
AMQP_DESC_COORDINATOR, link->target.capabilities_raw,
0);
int err = pn_framing_send_amqp(transport, ssn_state->local_channel, buf);
if (err) return err;
} else {
pni_switch_to_raw(&transport->scratch_space, &link->properties, &link->properties_raw);
pni_switch_to_raw(&transport->scratch_space, &link->target.properties, &link->target.properties_raw);
pn_bytes_t buf = pn_amqp_encode_DLESIoBBQDLESIsIoRQsRnMMeQDLESIsIoRMennILnnRe(&transport->scratch_space, AMQP_DESC_ATTACH,
pn_string_bytes(link->name),
state->local_handle,
endpoint->type == RECEIVER,
link->snd_settle_mode,
link->rcv_settle_mode,
(bool) link->source.type, AMQP_DESC_SOURCE,
pn_string_bytes(link->source.address),
link->source.durability,
expiry_symbol(&link->source),
link->source.timeout,
link->source.dynamic,
link->source.properties_raw,
(dist_mode != PN_DIST_MODE_UNSPECIFIED), dist_mode2symbol(dist_mode),
link->source.filter_raw,
link->source.outcomes_raw,
link->source.capabilities_raw,
(bool) link->target.type, AMQP_DESC_TARGET,
pn_string_bytes(link->target.address),
link->target.durability,
expiry_symbol(&link->target),
link->target.timeout,
link->target.dynamic,
link->target.properties_raw,
link->target.capabilities_raw,
0,
link->max_message_size,
link->properties_raw);
int err = pn_framing_send_amqp(transport, ssn_state->local_channel, buf);
if (err) return err;
}
}
}
return 0;
}