⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ldp_label_mapping.c

📁 Linux平台下
💻 C
📖 第 1 页 / 共 3 页
字号:
      g->label_merge == MPLS_BOOL_FALSE || !ds_temp) {    /* !merging then this is always a new LSP     * merging w/o a recv'd mapping is a new LSP     * this check comes from Note 6     */    goto LMp_11;  }  /* searching all recv'd attrs for matched mappings,   * stop after finding 1st match   */  if ((ds_list = ldp_attr_find_downstream_all2(g, s, f))) {    ds_temp = MPLS_LIST_HEAD(ds_list);    while (ds_temp) {      if (ds_temp->state == LDP_LSP_STATE_MAP_RECV) { /* LMp.9 */        if (ldp_attr_is_equal(ds_attr, ds_temp, LDP_ATTR_LABEL) ==          MPLS_BOOL_TRUE) { /* LMp.10 */          /*           * this mapping matches an existing mapping, but it           * could contain updated attributes           */          existing = ds_temp;          break;        } else {          /*           * we have been given another label for the same FEC and we           * didn't request it, release it           */          LDP_PRINT(g->user_data, "LMp.10 dup without req\n");          goto LMp_32;        }      }      ds_temp = MPLS_LIST_NEXT(ds_list, ds_temp, _fs);    }  }  if (existing) {    ldp_attr2ldp_attr(ds_attr, existing, LDP_ATTR_HOPCOUNT | LDP_ATTR_PATH |      LDP_ATTR_MSGID | LDP_ATTR_LSPID | LDP_ATTR_TRAFFIC);    ds_attr = existing;    /*     * no need to free ds_attr, since it was not added to the tree it     * will be deleted when we exit ldp_label_mapping_process(), see     * ldp_state_process().     */  }  /*   * from this point on.... if this is an updated mapping then ds_attr   * is the existing mapping which has now been update, else ds_attr   * is the new mapping   */LMp_11:  /*   * existing ONLY has a value for updated label mapping   */  nh = ldp_nexthop_for_fec_session(f,s);			 /* LMp.11 */  /*   * the following departs from the procedure, it allows for filtering   * of label mappings   *   * Are we configured to accept and INSTALL this mapping?   */  if (mpls_policy_import_check(g->user_data, &f->info, &nh->info) ==    MPLS_BOOL_FALSE) {    /*     * policy has rejected it, store it away     */    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV, LDP_TRACE_FLAG_LABEL,      "Label Mapping for %08x/%d from %s filtered by import policy\n",      r_attr->fecTlv.fecElArray[0].addressEl.address,      r_attr->fecTlv.fecElArray[0].addressEl.preLen, s->session_name);    if (existing) {      ds_attr->filtered = MPLS_BOOL_TRUE;      if (ds_attr->outlabel && ds_attr->outlabel->switching == MPLS_BOOL_TRUE) {        /* the mapping has been filtered, but the original wasn't? */        MPLS_ASSERT(0);      }    } else {      ds_attr->filtered = MPLS_BOOL_TRUE;      if (ldp_attr_insert_downstream(g, s, ds_attr) != MPLS_SUCCESS) {        retval = MPLS_FAILURE;      }    }    goto LMp_33;  }  if (!nh) {							 /* LMp.12 */    /*     * if we did not find a nh hop for this FEC that corresponded to the     * MsgSource then the MsgSource is not a nexthop for the FEC     */    if (g->label_retention_mode == LDP_RETENTION_CONSERVATIVE) { /* LMp.13C */      LDP_PRINT(g->user_data, "LMp.13C conservative\n");      goto LMp_32;    }    /*     * store it away     */    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV, LDP_TRACE_FLAG_LABEL,      "Session %s is not a valid nexthop for %08x/%d\n", s->session_name,      r_attr->fecTlv.fecElArray[0].addressEl.address,      r_attr->fecTlv.fecElArray[0].addressEl.preLen);    if (!existing) {      /* LMp.13L */      if (ldp_attr_insert_downstream(g, s, ds_attr) != MPLS_SUCCESS) {        retval = MPLS_FAILURE;      }    }    goto LMp_33;  }  /*   * this is slightly different form the procedure, we can still be   * transit for a FEC we are not configured to be ingress for.   * Either way we only need to do the "install for fwd/switching"   * only once.  We could arrive here multiple times due to updates,   * only install it the first time   */  if ((!existing) || (!existing->outlabel)) {    /*     * we haven't installed it yet.     * Either new (!existing), or a result of a "Detect FEC Nexthop Change"     * and we had this mapping in our database (!existing->outlabel))     */    if (!(out = ldp_outlabel_create_complete(g, s, ds_attr, nh))) {      LDP_PRINT(g->user_data, "LMp.15 failure creating outlabel\n");      goto LMp_32;    }    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_ALL, LDP_TRACE_FLAG_BINDING,      "Out Label Added\n");  }  /*   * are we configured to act as ingress for this FEC?   */  if (mpls_policy_ingress_check(g->user_data, &f->info, &nh->info) ==    MPLS_BOOL_TRUE) { /* LMp.14 */    /*     * yep, bind the label to the FEC     */    if (ds_attr->ingress != MPLS_BOOL_TRUE) {#if MPLS_USE_LSR      lsr_ftn ftn;      ftn.outsegment_index = ds_attr->outlabel->info.handle;      memcpy(&ftn.fec, &f->info, sizeof(mpls_fec));      lsr_cfg_ftn_set2(g->lsr_handle, &ftn, LSR_CFG_ADD|LSR_FTN_CFG_FEC|        LSR_FTN_CFG_OUTSEGMENT);#else      mpls_mpls_fec2out_add(g->mpls_handle, &f->info, &ds_attr->outlabel->info);#endif      ds_attr->ingress = MPLS_BOOL_TRUE;      ds_attr->outlabel->merge_count++;      LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV, LDP_TRACE_FLAG_BINDING,        "Acting as ingress for %08x/%d from %s\n",        r_attr->fecTlv.fecElArray[0].addressEl.address,        r_attr->fecTlv.fecElArray[0].addressEl.preLen, s->session_name);    }  }  /* create a set of attrs that we will fill and compare against   * if this mapping were to be propogate these are the attrs it would have   * by comparing what we did sent in the past to these, we con figure out   * if we need to send an updated mapping   */  memset(&dumb_attr, 0, sizeof(ldp_attr));  mpls_fec2fec_tlv(&f->info, &dumb_attr.fecTlv, 0);  dumb_attr.fecTlvExists = 1;  dumb_attr.fecTlv.numberFecElements = 1;  /*   * by definition (we received a label mapping that will be used) this   * LSR is _not_ the egress, so calculate a hop and path based on the   * mapping we received.  We will compare this with mapping that have   * already been sent.  If they differ, we will send an updated mapping   */  Prepare_Label_Mapping_Attributes(g, s, &f->info, ds_attr, &dumb_attr,    MPLS_BOOL_TRUE, MPLS_BOOL_TRUE, MPLS_BOOL_FALSE);  if (!existing) {    /*     * this is the first time we've seen this mapping, add it to the database.     * all future updates will modify this entry in place     */    /* LMp.16 */    if (ldp_attr_insert_downstream(g, s, ds_attr) != MPLS_SUCCESS) {      retval = MPLS_FAILURE;      goto LMp_33;    }  }  peer = MPLS_LIST_HEAD(&g->session);  while (peer) {					/* LMp.17 */    /* can't send messages to non-operational sessions */    if (peer->state != LDP_STATE_OPERATIONAL) {      goto next_peer;    }    /*     * don't send the mapping to the session     * from which we recv'd the mapping     */    if (peer->index == s->index) {      goto next_peer;    }    /*     * it is just as easy to walk the list of all upstream attr for this     * peer as it is to the individual check to see if we have sent a     * label mapping for this FEC LSP     */    /* LMp.22 - 27 */    if ((us_list = ldp_attr_find_upstream_all2(g, peer, f))) {      us_temp = MPLS_LIST_HEAD(us_list);      while (us_temp) {	/*	 * if we have sent a label mapping for the FEC and that label mapping	 * was an done in independent mode or it is part of an LSP created         * due as part of an existing received label mapping	 */	/* LMp.18 */        if (us_temp->state == LDP_LSP_STATE_MAP_SENT) {          LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,            LDP_TRACE_FLAG_BINDING, "Already sent mapping for %08x/%d to %s\n",            r_attr->fecTlv.fecElArray[0].addressEl.address,            r_attr->fecTlv.fecElArray[0].addressEl.preLen, peer->session_name);          if ((!existing) || (existing->index == us_temp->ds_attr->index)) {            LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,              LDP_TRACE_FLAG_BINDING, "Part of same LSP\n");            /* LMp.23 */            if (ldp_attr_is_equal(us_temp, &dumb_attr,                LDP_ATTR_HOPCOUNT | LDP_ATTR_PATH) != MPLS_BOOL_TRUE) {              LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,                LDP_TRACE_FLAG_BINDING, "Propogating updated attrs\n");              /* send an updated label mapping */              if (ldp_label_mapping_with_xc(g, us_temp->session, f, &us_temp,                  ds_attr) != MPLS_SUCCESS) {			/* LMp.24-26 */                retval = MPLS_FAILURE;                goto LMp_33;              }            }          }        }        us_temp = MPLS_LIST_NEXT(us_list, us_temp, _fs);      }    }    if ((peer->oper_distribution_mode == LDP_DISTRIBUTION_UNSOLICITED) &&      (g->lsp_control_mode == LDP_CONTROL_ORDERED)) { /* LMp.19 */      /*       * if we're not merging and we have multiple ORDERED DU sessions,       * we will need to start requesting labels after we propogate the       * mapping to the first peer       */      if (need_request == MPLS_BOOL_TRUE) {        if (ldp_attr_find_downstream_state2(g, peer, f,            LDP_LSP_STATE_REQ_SENT) == NULL) {          /*           * we don't have a request for FEC to peer outstanding, make one           */          ds_temp = NULL;          if (ldp_label_request_for_xc(g, peer, &f->info, NULL, &ds_temp) !=            MPLS_SUCCESS) {            retval = MPLS_FAILURE;            goto LMp_33;          }        }      } else {        /*         * We're in DU more, either we're merging, or we're not merging and         * this is the first peer we're propogating this mapping to         */        /* LMp.20-21,30 */        us_attr = NULL;        if (ldp_label_mapping_with_xc(g, peer, f, &us_attr, ds_attr) !=          MPLS_SUCCESS) {          retval = MPLS_FAILURE;          goto LMp_33;        }        /*         * if we're not merging, we will need to request a label for         * the next DU peer         */        if (g->label_merge == MPLS_BOOL_FALSE) {          need_request = MPLS_BOOL_TRUE;        }      }    }    /* LMp.28 */    while ((us_temp = ldp_attr_find_upstream_state2(g, peer, f,      LDP_LSP_STATE_REQ_RECV))) {      if (peer->oper_distribution_mode == LDP_DISTRIBUTION_UNSOLICITED) {        if (need_request == MPLS_BOOL_TRUE) {          if (ldp_attr_find_downstream_state2(g, peer, f,            LDP_LSP_STATE_REQ_SENT) == NULL) {            /*              * we don't have a request for FEC to peer outstanding             */            ds_temp = NULL;            if (ldp_label_request_for_xc(g, peer, &f->info, us_temp,                &ds_temp) != MPLS_SUCCESS) {              retval = MPLS_FAILURE;              goto LMp_33;            }          }        } else {          if (ldp_label_mapping_with_xc(g, peer, f, &us_temp,            ds_attr) != MPLS_SUCCESS) {            retval = MPLS_FAILURE;            goto LMp_33;          }        }      } else {        if ((us_list = ldp_attr_find_upstream_all2(g, peer, f))) {          us_temp = MPLS_LIST_HEAD(ds_list);          while (us_temp) {            if (us_temp->state == LDP_LSP_STATE_REQ_RECV) {              if (need_request == MPLS_BOOL_TRUE) {                if (ldp_attr_find_downstream_state2(g, peer, f,                  LDP_LSP_STATE_REQ_SENT) == NULL) {                  /*                   * we don't have a request for FEC to peer outstanding                   */                  ds_temp = NULL;                  if (ldp_label_request_for_xc(g, peer, &f->info, us_temp,                      &ds_temp) != MPLS_SUCCESS) {                    retval = MPLS_FAILURE;                    goto LMp_33;                  }                }              } else {                if (ldp_label_mapping_with_xc(g, peer, f, &us_temp,                    ds_attr) != MPLS_SUCCESS) {                  retval = MPLS_FAILURE;                  goto LMp_33;                }                /*                 * if we're not merging, we will need to request a label for                 * the next DU peer                 */                if (g->label_merge == MPLS_BOOL_FALSE) {                  need_request = MPLS_BOOL_TRUE;                }              }            }            us_temp = MPLS_LIST_NEXT(us_list, us_temp, _fs);          }        }      }    }  next_peer:    peer = MPLS_LIST_NEXT(&g->session, peer, _global);  }LMp_33:  LDP_EXIT(g->user_data, "ldp_label_mapping_process");  return retval;LMp_32:  LDP_PRINT(g->user_data, "Receive_Label_Map_32: send release");  if (ldp_label_release_send(g, s, ds_attr, LDP_NOTIF_NONE) != MPLS_SUCCESS) {    retval = MPLS_FAILURE;  }  LDP_EXIT(g->user_data, "ldp_label_mapping_process");  return retval;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -