static int pni_process_link_setup()

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