mpls_return_enum ldp_label_rel_with_send(ldp_global * g, ldp_session * s,
  ldp_attr * a, ldp_notif_status status, uint16_t type)
{
  LDP_ENTER(g->user_data, "ldp_label_rel_with_send");

  ldp_label_rel_with_prepare_msg(s->tx_message, g->message_identifier++, a,
    status, type);

  ldp_mesg_send_tcp(g, s, s->tx_message);

  LDP_EXIT(g->user_data, "ldp_label_rel_with_send");

  return MPLS_SUCCESS;
}
Esempio n. 2
0
mpls_return_enum ldp_label_request_send(ldp_global * g, ldp_session * s,
  ldp_attr * us_attr, ldp_attr ** ds_attr)
{
  ldp_attr *ds_temp;
  mpls_fec fec;

  LDP_ENTER(g->user_data, "ldp_label_request_send");
  MPLS_ASSERT(ds_attr && *ds_attr);

  fec_tlv2mpls_fec(&((*ds_attr)->fecTlv), 0, &fec);

  if ((ds_temp = ldp_attr_find_downstream_state(g, s, &fec,
        LDP_LSP_STATE_REQ_SENT)) != NULL) { /* SLRq.1 */

    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_LABEL,
      "Label Request Send: request already pending(%d)\n", ds_temp->index);

    ldp_attr_add_us2ds(us_attr, ds_temp);

    /* we do not need the one passed in, but make sure that the caller
       is using this one from here forth */
    ldp_attr_remove_complete(g, *ds_attr, MPLS_BOOL_TRUE);
    *ds_attr = ds_temp;
    return MPLS_SUCCESS;
  }

  if (s->no_label_resource_recv == MPLS_BOOL_TRUE) { /* SLRq.2 */
    goto ldp_label_request_send_error;
  }

  (*ds_attr)->msg_id = g->message_identifier++;
  ldp_label_request_prepare_msg(s->tx_message, (*ds_attr)->msg_id, *ds_attr);

  LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_LABEL,
    "Label Request Sent: session(%d)\n", s->index);

  if (ldp_mesg_send_tcp(g, s, s->tx_message) == MPLS_FAILURE) { /* SLRq.3 */
    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_ERROR,
      "Label Request send failed\n");
    goto ldp_label_request_send_error;
  }

  (*ds_attr)->state = LDP_LSP_STATE_REQ_SENT;
  if (ldp_attr_insert_downstream(g, s, (*ds_attr)) == MPLS_FAILURE) { /* SLRq.4 */
    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_ERROR,
      "Couldn't insert sent attributes in tree\n");
    goto ldp_label_request_send_error;
  }
  if (us_attr) {
    ldp_attr_add_us2ds(us_attr, *ds_attr);
  }

  LDP_EXIT(g->user_data, "ldp_label_request_send");

  return MPLS_SUCCESS;           /* SLRq.5 */

ldp_label_request_send_error:

  LDP_PRINT(g->user_data, "SLRq.6\n");
  (*ds_attr)->state = LDP_LSP_STATE_NO_LABEL_RESOURCE_SENT;
  ldp_attr_insert_downstream(g, s, (*ds_attr)); /* SLRq.6 */

  LDP_EXIT(g->user_data, "ldp_label_request_send-error");

  return MPLS_FAILURE;           /* SLRq.7 */
}
Esempio n. 3
0
mpls_return_enum ldp_label_mapping_send(ldp_global * g, ldp_session * s,
  ldp_fec *f, ldp_attr * us_attr, ldp_attr * ds_attr)
{
  ldp_inlabel *in = NULL;
  ldp_attr *us_temp, *existing = NULL;

  LDP_ENTER(g->user_data, "ldp_label_mapping_send");
  MPLS_ASSERT(us_attr);

#if 0
  /*
   * before we can enable this, inlabels need to keep track of all of
   * the attr that link to it.  Then when running in DU independent mode we
   * can correctly attach the us and ds attrs involved when propogating a
   * new mapping for a FEC we've already distributed labels for
   */
  existing = ldp_attr_find_upstream_map_in_labelspace(f, s->cfg_label_space);
#endif

  if (existing) {
    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_ALL, LDP_TRACE_FLAG_BINDING,
      "Using an existing label\n");
    in = existing->inlabel;
    ldp_attr_add_inlabel(us_attr, in);
  } else {
    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_ALL, LDP_TRACE_FLAG_BINDING,
      "Generating a label\n");
    in = ldp_inlabel_create_complete(g, s, us_attr);
  }

  if (!in) { /* SL.1-3 */
    goto Send_Label_9;
  }

  LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_ALL, LDP_TRACE_FLAG_BINDING,
    "In Label Added\n");

  us_attr->state = LDP_LSP_STATE_MAP_SENT;

  us_attr->msg_id = g->message_identifier;
  ldp_label_mapping_prepare_msg(s->tx_message, g->message_identifier++,
    us_attr);

  if (ldp_mesg_send_tcp(g, s, s->tx_message) != MPLS_SUCCESS) { /* SL.4 */
    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_ERROR,
      "Failed sending Label Mapping to %s\n",
      s->session_name);
    goto ldp_label_mapping_send_error;
  }

  LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_LABEL,
    "Label Mapping Sent to %s for %08x/%d\n",
    s->session_name,
    us_attr->fecTlv.fecElArray[0].addressEl.address,
    us_attr->fecTlv.fecElArray[0].addressEl.preLen);

  us_attr->state = LDP_LSP_STATE_MAP_SENT; /* SL.6,7 */

  LDP_EXIT(g->user_data, "ldp_label_mapping_send");
  return MPLS_SUCCESS;           /* SL.8 */

Send_Label_9:
  LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_ALL, LDP_TRACE_FLAG_STATE,
    "No Label Resources\n");

  while ((us_temp = ldp_attr_find_upstream_state2(g, s, us_attr->fec,
        LDP_LSP_STATE_REQ_RECV)) != NULL) { /* SL.9 */
    ldp_notif_send(g, s, us_temp, LDP_NOTIF_NO_LABEL_RESOURCES_AVAILABLE);
    /* SL.10 */
    s->no_label_resource_sent = MPLS_BOOL_TRUE; /* SL.12 */
    us_temp->state = LDP_LSP_STATE_NO_LABEL_RESOURCE_SENT; /* SL.13 */
  }

  LDP_EXIT(g->user_data, "ldp_label_mapping_send");

  return MPLS_SUCCESS;

ldp_label_mapping_send_error:

  LDP_EXIT(g->user_data, "ldp_label_mapping_send-error");
  return MPLS_FAILURE;
}