Exemple #1
0
void ldp_inlabel_delete_complete(ldp_global * g, ldp_inlabel * in,
  ldp_session * s, ldp_attr * a)
{
  ldp_attr_del_inlabel(a);
  ldp_session_del_inlabel(s, in);
  _ldp_global_del_inlabel(g, in);
  ldp_inlabel_del_outlabel(g, in);
}
Exemple #2
0
void ldp_attr_remove_complete(ldp_global * g, ldp_attr * attr,
		mpls_bool complete)
{
  ldp_session *session = attr->session;
  ldp_outlabel *out = NULL;
  ldp_inlabel *in = NULL;
  ldp_attr *us_temp = NULL;
  mpls_fec fec;
  int i;

  switch (attr->state) {
    case LDP_LSP_STATE_MAP_RECV:
      if (attr->ingress == MPLS_BOOL_TRUE) {
        out = attr->outlabel;
        MPLS_ASSERT(out != NULL);
        while ((in = MPLS_LIST_HEAD(&out->inlabel_root)) != NULL) {
          ldp_inlabel_del_outlabel(g, in);
        }

        if (out->merge_count > 0) {
          for (i = 0; i < attr->fecTlv.numberFecElements; i++) {
            fec_tlv2mpls_fec(&attr->fecTlv, i, &fec);
            out->merge_count--;
#if MPLS_USE_LSR
            {
              lsr_ftn ftn;
              memcpy(&ftn.fec, &fec, sizeof(mpls_fec));
              ftn.outsegment_index = out->info.handle;
              lsr_cfg_ftn_set2(g->lsr_handle, &ftn, LSR_CFG_DEL);
            }
#else
            mpls_mpls_fec2out_del(g->mpls_handle, &fec, &out->info);
#endif
          }
        }
        MPLS_ASSERT(out->merge_count == 0);
        ldp_attr_del_outlabel(g, attr);
        ldp_session_del_outlabel(g, session, out);
      }
      while ((us_temp = MPLS_LIST_HEAD(&attr->us_attr_root)) != NULL) {
        ldp_attr_del_us2ds(g, us_temp, attr);
      }
      ldp_attr_delete_downstream(g, session, attr);
      break;
    case LDP_LSP_STATE_MAP_SENT:
      in = attr->inlabel;
      out = in->outlabel;

      if (in->reuse_count == 1 && out) {
        ldp_inlabel_del_outlabel(g, in);
      }
      ldp_attr_del_inlabel(g, attr);
      ldp_attr_delete_upstream(g, session, attr);
      ldp_attr_del_us2ds(g, attr, attr->ds_attr);
      ldp_session_del_inlabel(g, session, in);
      break;
    case LDP_LSP_STATE_ABORT_SENT:
    case LDP_LSP_STATE_NOTIF_SENT:
    case LDP_LSP_STATE_REQ_RECV:
    case LDP_LSP_STATE_WITH_SENT:
    case LDP_LSP_STATE_NO_LABEL_RESOURCE_SENT:
      {
        ldp_attr_del_us2ds(g, attr, attr->ds_attr);
        ldp_attr_delete_upstream(g, session, attr);
        break;
      }
    case LDP_LSP_STATE_ABORT_RECV:
    case LDP_LSP_STATE_NOTIF_RECV:
    case LDP_LSP_STATE_REQ_SENT:
    case LDP_LSP_STATE_WITH_RECV:
    case LDP_LSP_STATE_NO_LABEL_RESOURCE_RECV:
      {
        while ((us_temp = MPLS_LIST_HEAD(&attr->us_attr_root)) != NULL) {
          ldp_attr_del_us2ds(g, us_temp, attr);
        }
        ldp_attr_delete_downstream(g, session, attr);
        break;
      }
  }
}