diff options
Diffstat (limited to 'isisd/isis_te.c')
-rw-r--r-- | isisd/isis_te.c | 2006 |
1 files changed, 1005 insertions, 1001 deletions
diff --git a/isisd/isis_te.c b/isisd/isis_te.c index 271545744..5296d9948 100644 --- a/isisd/isis_te.c +++ b/isisd/isis_te.c @@ -61,1020 +61,1034 @@ /* Global varial for MPLS TE management */ struct isis_mpls_te isisMplsTE; -const char *mode2text[] = { "Disable", "Area", "AS", "Emulate" }; +const char *mode2text[] = {"Disable", "Area", "AS", "Emulate"}; /*------------------------------------------------------------------------* * Followings are control functions for MPLS-TE parameters management. *------------------------------------------------------------------------*/ /* Search MPLS TE Circuit context from Interface */ -static struct mpls_te_circuit * -lookup_mpls_params_by_ifp (struct interface *ifp) +static struct mpls_te_circuit *lookup_mpls_params_by_ifp(struct interface *ifp) { - struct isis_circuit *circuit; + struct isis_circuit *circuit; - if ((circuit = circuit_scan_by_ifp (ifp)) == NULL) - return NULL; + if ((circuit = circuit_scan_by_ifp(ifp)) == NULL) + return NULL; - return circuit->mtc; + return circuit->mtc; } /* Create new MPLS TE Circuit context */ -struct mpls_te_circuit * -mpls_te_circuit_new() +struct mpls_te_circuit *mpls_te_circuit_new() { - struct mpls_te_circuit *mtc; + struct mpls_te_circuit *mtc; - zlog_debug ("ISIS MPLS-TE: Create new MPLS TE Circuit context"); + zlog_debug("ISIS MPLS-TE: Create new MPLS TE Circuit context"); - mtc = XCALLOC(MTYPE_ISIS_MPLS_TE, sizeof (struct mpls_te_circuit)); + mtc = XCALLOC(MTYPE_ISIS_MPLS_TE, sizeof(struct mpls_te_circuit)); - if (mtc == NULL) - return NULL; + if (mtc == NULL) + return NULL; - mtc->status = disable; - mtc->type = STD_TE; - mtc->length = 0; - - return mtc; + mtc->status = disable; + mtc->type = STD_TE; + mtc->length = 0; + return mtc; } -/* Copy SUB TLVs parameters into a buffer - No space verification are performed */ +/* Copy SUB TLVs parameters into a buffer - No space verification are performed + */ /* Caller must verify before that there is enough free space in the buffer */ -u_char -add_te_subtlvs(u_char *buf, struct mpls_te_circuit *mtc) +u_char add_te_subtlvs(u_char *buf, struct mpls_te_circuit *mtc) { - u_char size, *tlvs = buf; - - zlog_debug ("ISIS MPLS-TE: Add TE Sub TLVs to buffer"); - - if (mtc == NULL) - { - zlog_debug("ISIS MPLS-TE: Abort! No MPLS TE Circuit available has been specified"); - return 0; - } - - /* Create buffer if not provided */ - if (buf == NULL) - { - zlog_debug("ISIS MPLS-TE: Abort! No Buffer has been specified"); - return 0; - } - - /* TE_SUBTLV_ADMIN_GRP */ - if (SUBTLV_TYPE(mtc->admin_grp) != 0) - { - size = SUBTLV_SIZE (&(mtc->admin_grp.header)); - memcpy(tlvs, &(mtc->admin_grp), size); - tlvs += size; - } - - /* TE_SUBTLV_LLRI */ - if (SUBTLV_TYPE(mtc->llri) != 0) - { - size = SUBTLV_SIZE (&(mtc->llri.header)); - memcpy(tlvs, &(mtc->llri), size); - tlvs += size; - } - - /* TE_SUBTLV_LCLIF_IPADDR */ - if (SUBTLV_TYPE(mtc->local_ipaddr) != 0) - { - size = SUBTLV_SIZE (&(mtc->local_ipaddr.header)); - memcpy(tlvs, &(mtc->local_ipaddr), size); - tlvs += size; - } - - /* TE_SUBTLV_RMTIF_IPADDR */ - if (SUBTLV_TYPE(mtc->rmt_ipaddr) != 0) - { - size = SUBTLV_SIZE (&(mtc->rmt_ipaddr.header)); - memcpy(tlvs, &(mtc->rmt_ipaddr), size); - tlvs += size; - } - - /* TE_SUBTLV_MAX_BW */ - if (SUBTLV_TYPE(mtc->max_bw) != 0) - { - size = SUBTLV_SIZE (&(mtc->max_bw.header)); - memcpy(tlvs, &(mtc->max_bw), size); - tlvs += size; - } - - /* TE_SUBTLV_MAX_RSV_BW */ - if (SUBTLV_TYPE(mtc->max_rsv_bw) != 0) - { - size = SUBTLV_SIZE (&(mtc->max_rsv_bw.header)); - memcpy(tlvs, &(mtc->max_rsv_bw), size); - tlvs += size; - } - - /* TE_SUBTLV_UNRSV_BW */ - if (SUBTLV_TYPE(mtc->unrsv_bw) != 0) - { - size = SUBTLV_SIZE (&(mtc->unrsv_bw.header)); - memcpy(tlvs, &(mtc->unrsv_bw), size); - tlvs += size; - } - - /* TE_SUBTLV_TE_METRIC */ - if (SUBTLV_TYPE(mtc->te_metric) != 0) - { - size = SUBTLV_SIZE (&(mtc->te_metric.header)); - memcpy(tlvs, &(mtc->te_metric), size); - tlvs += size; - } - - /* TE_SUBTLV_AV_DELAY */ - if (SUBTLV_TYPE(mtc->av_delay) != 0) - { - size = SUBTLV_SIZE (&(mtc->av_delay.header)); - memcpy(tlvs, &(mtc->av_delay), size); - tlvs += size; - } - - /* TE_SUBTLV_MM_DELAY */ - if (SUBTLV_TYPE(mtc->mm_delay) != 0) - { - size = SUBTLV_SIZE (&(mtc->mm_delay.header)); - memcpy(tlvs, &(mtc->mm_delay), size); - tlvs += size; - } - - /* TE_SUBTLV_DELAY_VAR */ - if (SUBTLV_TYPE(mtc->delay_var) != 0) - { - size = SUBTLV_SIZE (&(mtc->delay_var.header)); - memcpy(tlvs, &(mtc->delay_var), size); - tlvs += size; - } - - /* TE_SUBTLV_PKT_LOSS */ - if (SUBTLV_TYPE(mtc->pkt_loss) != 0) - { - size = SUBTLV_SIZE (&(mtc->pkt_loss.header)); - memcpy(tlvs, &(mtc->pkt_loss), size); - tlvs += size; - } - - /* TE_SUBTLV_RES_BW */ - if (SUBTLV_TYPE(mtc->res_bw) != 0) - { - size = SUBTLV_SIZE (&(mtc->res_bw.header)); - memcpy(tlvs, &(mtc->res_bw), size); - tlvs += size; - } - - /* TE_SUBTLV_AVA_BW */ - if (SUBTLV_TYPE(mtc->ava_bw) != 0) - { - size = SUBTLV_SIZE (&(mtc->ava_bw.header)); - memcpy(tlvs, &(mtc->ava_bw), size); - tlvs += size; - } - - /* TE_SUBTLV_USE_BW */ - if (SUBTLV_TYPE(mtc->use_bw) != 0) - { - size = SUBTLV_SIZE (&(mtc->use_bw.header)); - memcpy(tlvs, &(mtc->use_bw), size); - tlvs += size; - } - - /* Update SubTLVs length */ - mtc->length = subtlvs_len(mtc); - - zlog_debug("ISIS MPLS-TE: Add %d bytes length SubTLVs", mtc->length); - - return mtc->length; + u_char size, *tlvs = buf; + + zlog_debug("ISIS MPLS-TE: Add TE Sub TLVs to buffer"); + + if (mtc == NULL) { + zlog_debug( + "ISIS MPLS-TE: Abort! No MPLS TE Circuit available has been specified"); + return 0; + } + + /* Create buffer if not provided */ + if (buf == NULL) { + zlog_debug("ISIS MPLS-TE: Abort! No Buffer has been specified"); + return 0; + } + + /* TE_SUBTLV_ADMIN_GRP */ + if (SUBTLV_TYPE(mtc->admin_grp) != 0) { + size = SUBTLV_SIZE(&(mtc->admin_grp.header)); + memcpy(tlvs, &(mtc->admin_grp), size); + tlvs += size; + } + + /* TE_SUBTLV_LLRI */ + if (SUBTLV_TYPE(mtc->llri) != 0) { + size = SUBTLV_SIZE(&(mtc->llri.header)); + memcpy(tlvs, &(mtc->llri), size); + tlvs += size; + } + + /* TE_SUBTLV_LCLIF_IPADDR */ + if (SUBTLV_TYPE(mtc->local_ipaddr) != 0) { + size = SUBTLV_SIZE(&(mtc->local_ipaddr.header)); + memcpy(tlvs, &(mtc->local_ipaddr), size); + tlvs += size; + } + + /* TE_SUBTLV_RMTIF_IPADDR */ + if (SUBTLV_TYPE(mtc->rmt_ipaddr) != 0) { + size = SUBTLV_SIZE(&(mtc->rmt_ipaddr.header)); + memcpy(tlvs, &(mtc->rmt_ipaddr), size); + tlvs += size; + } + + /* TE_SUBTLV_MAX_BW */ + if (SUBTLV_TYPE(mtc->max_bw) != 0) { + size = SUBTLV_SIZE(&(mtc->max_bw.header)); + memcpy(tlvs, &(mtc->max_bw), size); + tlvs += size; + } + + /* TE_SUBTLV_MAX_RSV_BW */ + if (SUBTLV_TYPE(mtc->max_rsv_bw) != 0) { + size = SUBTLV_SIZE(&(mtc->max_rsv_bw.header)); + memcpy(tlvs, &(mtc->max_rsv_bw), size); + tlvs += size; + } + + /* TE_SUBTLV_UNRSV_BW */ + if (SUBTLV_TYPE(mtc->unrsv_bw) != 0) { + size = SUBTLV_SIZE(&(mtc->unrsv_bw.header)); + memcpy(tlvs, &(mtc->unrsv_bw), size); + tlvs += size; + } + + /* TE_SUBTLV_TE_METRIC */ + if (SUBTLV_TYPE(mtc->te_metric) != 0) { + size = SUBTLV_SIZE(&(mtc->te_metric.header)); + memcpy(tlvs, &(mtc->te_metric), size); + tlvs += size; + } + + /* TE_SUBTLV_AV_DELAY */ + if (SUBTLV_TYPE(mtc->av_delay) != 0) { + size = SUBTLV_SIZE(&(mtc->av_delay.header)); + memcpy(tlvs, &(mtc->av_delay), size); + tlvs += size; + } + + /* TE_SUBTLV_MM_DELAY */ + if (SUBTLV_TYPE(mtc->mm_delay) != 0) { + size = SUBTLV_SIZE(&(mtc->mm_delay.header)); + memcpy(tlvs, &(mtc->mm_delay), size); + tlvs += size; + } + + /* TE_SUBTLV_DELAY_VAR */ + if (SUBTLV_TYPE(mtc->delay_var) != 0) { + size = SUBTLV_SIZE(&(mtc->delay_var.header)); + memcpy(tlvs, &(mtc->delay_var), size); + tlvs += size; + } + + /* TE_SUBTLV_PKT_LOSS */ + if (SUBTLV_TYPE(mtc->pkt_loss) != 0) { + size = SUBTLV_SIZE(&(mtc->pkt_loss.header)); + memcpy(tlvs, &(mtc->pkt_loss), size); + tlvs += size; + } + + /* TE_SUBTLV_RES_BW */ + if (SUBTLV_TYPE(mtc->res_bw) != 0) { + size = SUBTLV_SIZE(&(mtc->res_bw.header)); + memcpy(tlvs, &(mtc->res_bw), size); + tlvs += size; + } + + /* TE_SUBTLV_AVA_BW */ + if (SUBTLV_TYPE(mtc->ava_bw) != 0) { + size = SUBTLV_SIZE(&(mtc->ava_bw.header)); + memcpy(tlvs, &(mtc->ava_bw), size); + tlvs += size; + } + + /* TE_SUBTLV_USE_BW */ + if (SUBTLV_TYPE(mtc->use_bw) != 0) { + size = SUBTLV_SIZE(&(mtc->use_bw.header)); + memcpy(tlvs, &(mtc->use_bw), size); + tlvs += size; + } + + /* Update SubTLVs length */ + mtc->length = subtlvs_len(mtc); + + zlog_debug("ISIS MPLS-TE: Add %d bytes length SubTLVs", mtc->length); + + return mtc->length; } /* Compute total Sub-TLVs size */ -u_char -subtlvs_len (struct mpls_te_circuit *mtc) +u_char subtlvs_len(struct mpls_te_circuit *mtc) { - int length = 0; + int length = 0; - /* Sanity Check */ - if (mtc == NULL) - return 0; + /* Sanity Check */ + if (mtc == NULL) + return 0; - /* TE_SUBTLV_ADMIN_GRP */ - if (SUBTLV_TYPE(mtc->admin_grp) != 0) - length += SUBTLV_SIZE (&(mtc->admin_grp.header)); + /* TE_SUBTLV_ADMIN_GRP */ + if (SUBTLV_TYPE(mtc->admin_grp) != 0) + length += SUBTLV_SIZE(&(mtc->admin_grp.header)); - /* TE_SUBTLV_LLRI */ - if (SUBTLV_TYPE(mtc->llri) != 0) - length += SUBTLV_SIZE (&mtc->llri.header); + /* TE_SUBTLV_LLRI */ + if (SUBTLV_TYPE(mtc->llri) != 0) + length += SUBTLV_SIZE(&mtc->llri.header); - /* TE_SUBTLV_LCLIF_IPADDR */ - if (SUBTLV_TYPE(mtc->local_ipaddr) != 0) - length += SUBTLV_SIZE (&mtc->local_ipaddr.header); + /* TE_SUBTLV_LCLIF_IPADDR */ + if (SUBTLV_TYPE(mtc->local_ipaddr) != 0) + length += SUBTLV_SIZE(&mtc->local_ipaddr.header); - /* TE_SUBTLV_RMTIF_IPADDR */ - if (SUBTLV_TYPE(mtc->rmt_ipaddr) != 0) - length += SUBTLV_SIZE (&mtc->rmt_ipaddr.header); + /* TE_SUBTLV_RMTIF_IPADDR */ + if (SUBTLV_TYPE(mtc->rmt_ipaddr) != 0) + length += SUBTLV_SIZE(&mtc->rmt_ipaddr.header); - /* TE_SUBTLV_MAX_BW */ - if (SUBTLV_TYPE(mtc->max_bw) != 0) - length += SUBTLV_SIZE (&mtc->max_bw.header); + /* TE_SUBTLV_MAX_BW */ + if (SUBTLV_TYPE(mtc->max_bw) != 0) + length += SUBTLV_SIZE(&mtc->max_bw.header); - /* TE_SUBTLV_MAX_RSV_BW */ - if (SUBTLV_TYPE(mtc->max_rsv_bw) != 0) - length += SUBTLV_SIZE (&mtc->max_rsv_bw.header); + /* TE_SUBTLV_MAX_RSV_BW */ + if (SUBTLV_TYPE(mtc->max_rsv_bw) != 0) + length += SUBTLV_SIZE(&mtc->max_rsv_bw.header); - /* TE_SUBTLV_UNRSV_BW */ - if (SUBTLV_TYPE(mtc->unrsv_bw) != 0) - length += SUBTLV_SIZE (&mtc->unrsv_bw.header); + /* TE_SUBTLV_UNRSV_BW */ + if (SUBTLV_TYPE(mtc->unrsv_bw) != 0) + length += SUBTLV_SIZE(&mtc->unrsv_bw.header); - /* TE_SUBTLV_TE_METRIC */ - if (SUBTLV_TYPE(mtc->te_metric) != 0) - length += SUBTLV_SIZE (&mtc->te_metric.header); + /* TE_SUBTLV_TE_METRIC */ + if (SUBTLV_TYPE(mtc->te_metric) != 0) + length += SUBTLV_SIZE(&mtc->te_metric.header); - /* TE_SUBTLV_AV_DELAY */ - if (SUBTLV_TYPE(mtc->av_delay) != 0) - length += SUBTLV_SIZE (&mtc->av_delay.header); + /* TE_SUBTLV_AV_DELAY */ + if (SUBTLV_TYPE(mtc->av_delay) != 0) + length += SUBTLV_SIZE(&mtc->av_delay.header); - /* TE_SUBTLV_MM_DELAY */ - if (SUBTLV_TYPE(mtc->mm_delay) != 0) - length += SUBTLV_SIZE (&mtc->mm_delay.header); + /* TE_SUBTLV_MM_DELAY */ + if (SUBTLV_TYPE(mtc->mm_delay) != 0) + length += SUBTLV_SIZE(&mtc->mm_delay.header); - /* TE_SUBTLV_DELAY_VAR */ - if (SUBTLV_TYPE(mtc->delay_var) != 0) - length += SUBTLV_SIZE (&mtc->delay_var.header); + /* TE_SUBTLV_DELAY_VAR */ + if (SUBTLV_TYPE(mtc->delay_var) != 0) + length += SUBTLV_SIZE(&mtc->delay_var.header); - /* TE_SUBTLV_PKT_LOSS */ - if (SUBTLV_TYPE(mtc->pkt_loss) != 0) - length += SUBTLV_SIZE (&mtc->pkt_loss.header); + /* TE_SUBTLV_PKT_LOSS */ + if (SUBTLV_TYPE(mtc->pkt_loss) != 0) + length += SUBTLV_SIZE(&mtc->pkt_loss.header); - /* TE_SUBTLV_RES_BW */ - if (SUBTLV_TYPE(mtc->res_bw) != 0) - length += SUBTLV_SIZE (&mtc->res_bw.header); + /* TE_SUBTLV_RES_BW */ + if (SUBTLV_TYPE(mtc->res_bw) != 0) + length += SUBTLV_SIZE(&mtc->res_bw.header); - /* TE_SUBTLV_AVA_BW */ - if (SUBTLV_TYPE(mtc->ava_bw) != 0) - length += SUBTLV_SIZE (&mtc->ava_bw.header); + /* TE_SUBTLV_AVA_BW */ + if (SUBTLV_TYPE(mtc->ava_bw) != 0) + length += SUBTLV_SIZE(&mtc->ava_bw.header); - /* TE_SUBTLV_USE_BW */ - if (SUBTLV_TYPE(mtc->use_bw) != 0) - length += SUBTLV_SIZE (&mtc->use_bw.header); + /* TE_SUBTLV_USE_BW */ + if (SUBTLV_TYPE(mtc->use_bw) != 0) + length += SUBTLV_SIZE(&mtc->use_bw.header); - /* Check that length is lower than the MAXIMUM SUBTLV size i.e. 256 */ - if (length > MAX_SUBTLV_SIZE) - { - mtc->length = 0; - return 0; - } + /* Check that length is lower than the MAXIMUM SUBTLV size i.e. 256 */ + if (length > MAX_SUBTLV_SIZE) { + mtc->length = 0; + return 0; + } - mtc->length = (u_char)length; + mtc->length = (u_char)length; - return mtc->length; + return mtc->length; } /* Following are various functions to set MPLS TE parameters */ -static void -set_circuitparams_admin_grp (struct mpls_te_circuit *mtc, u_int32_t admingrp) +static void set_circuitparams_admin_grp(struct mpls_te_circuit *mtc, + u_int32_t admingrp) { - SUBTLV_TYPE(mtc->admin_grp) = TE_SUBTLV_ADMIN_GRP; - SUBTLV_LEN(mtc->admin_grp) = SUBTLV_DEF_SIZE; - mtc->admin_grp.value = htonl(admingrp); - return; + SUBTLV_TYPE(mtc->admin_grp) = TE_SUBTLV_ADMIN_GRP; + SUBTLV_LEN(mtc->admin_grp) = SUBTLV_DEF_SIZE; + mtc->admin_grp.value = htonl(admingrp); + return; } -static void __attribute__ ((unused)) -set_circuitparams_llri (struct mpls_te_circuit *mtc, u_int32_t local, u_int32_t remote) +static void __attribute__((unused)) +set_circuitparams_llri(struct mpls_te_circuit *mtc, u_int32_t local, + u_int32_t remote) { - SUBTLV_TYPE(mtc->llri) = TE_SUBTLV_LLRI; - SUBTLV_LEN(mtc->llri) = TE_SUBTLV_LLRI_SIZE; - mtc->llri.local = htonl(local); - mtc->llri.remote = htonl(remote); + SUBTLV_TYPE(mtc->llri) = TE_SUBTLV_LLRI; + SUBTLV_LEN(mtc->llri) = TE_SUBTLV_LLRI_SIZE; + mtc->llri.local = htonl(local); + mtc->llri.remote = htonl(remote); } -void -set_circuitparams_local_ipaddr (struct mpls_te_circuit *mtc, struct in_addr addr) +void set_circuitparams_local_ipaddr(struct mpls_te_circuit *mtc, + struct in_addr addr) { - SUBTLV_TYPE(mtc->local_ipaddr) = TE_SUBTLV_LOCAL_IPADDR; - SUBTLV_LEN(mtc->local_ipaddr) = SUBTLV_DEF_SIZE; - mtc->local_ipaddr.value.s_addr = addr.s_addr; - return; + SUBTLV_TYPE(mtc->local_ipaddr) = TE_SUBTLV_LOCAL_IPADDR; + SUBTLV_LEN(mtc->local_ipaddr) = SUBTLV_DEF_SIZE; + mtc->local_ipaddr.value.s_addr = addr.s_addr; + return; } -void -set_circuitparams_rmt_ipaddr (struct mpls_te_circuit *mtc, struct in_addr addr) +void set_circuitparams_rmt_ipaddr(struct mpls_te_circuit *mtc, + struct in_addr addr) { - SUBTLV_TYPE(mtc->rmt_ipaddr) = TE_SUBTLV_RMT_IPADDR; - SUBTLV_LEN(mtc->rmt_ipaddr) = SUBTLV_DEF_SIZE; - mtc->rmt_ipaddr.value.s_addr = addr.s_addr; - return; + SUBTLV_TYPE(mtc->rmt_ipaddr) = TE_SUBTLV_RMT_IPADDR; + SUBTLV_LEN(mtc->rmt_ipaddr) = SUBTLV_DEF_SIZE; + mtc->rmt_ipaddr.value.s_addr = addr.s_addr; + return; } -static void -set_circuitparams_max_bw (struct mpls_te_circuit *mtc, float fp) +static void set_circuitparams_max_bw(struct mpls_te_circuit *mtc, float fp) { - SUBTLV_TYPE(mtc->max_bw) = TE_SUBTLV_MAX_BW; - SUBTLV_LEN(mtc->max_bw) = SUBTLV_DEF_SIZE; - mtc->max_bw.value = htonf(fp); - return; + SUBTLV_TYPE(mtc->max_bw) = TE_SUBTLV_MAX_BW; + SUBTLV_LEN(mtc->max_bw) = SUBTLV_DEF_SIZE; + mtc->max_bw.value = htonf(fp); + return; } -static void -set_circuitparams_max_rsv_bw (struct mpls_te_circuit *mtc, float fp) +static void set_circuitparams_max_rsv_bw(struct mpls_te_circuit *mtc, float fp) { - SUBTLV_TYPE(mtc->max_rsv_bw) = TE_SUBTLV_MAX_RSV_BW; - SUBTLV_LEN(mtc->max_rsv_bw) = SUBTLV_DEF_SIZE; - mtc->max_rsv_bw.value = htonf(fp); - return; + SUBTLV_TYPE(mtc->max_rsv_bw) = TE_SUBTLV_MAX_RSV_BW; + SUBTLV_LEN(mtc->max_rsv_bw) = SUBTLV_DEF_SIZE; + mtc->max_rsv_bw.value = htonf(fp); + return; } -static void -set_circuitparams_unrsv_bw (struct mpls_te_circuit *mtc, int priority, float fp) +static void set_circuitparams_unrsv_bw(struct mpls_te_circuit *mtc, + int priority, float fp) { - /* Note that TLV-length field is the size of array. */ - SUBTLV_TYPE(mtc->unrsv_bw) = TE_SUBTLV_UNRSV_BW; - SUBTLV_LEN(mtc->unrsv_bw) = TE_SUBTLV_UNRSV_SIZE; - mtc->unrsv_bw.value[priority] = htonf(fp); - return; + /* Note that TLV-length field is the size of array. */ + SUBTLV_TYPE(mtc->unrsv_bw) = TE_SUBTLV_UNRSV_BW; + SUBTLV_LEN(mtc->unrsv_bw) = TE_SUBTLV_UNRSV_SIZE; + mtc->unrsv_bw.value[priority] = htonf(fp); + return; } -static void -set_circuitparams_te_metric (struct mpls_te_circuit *mtc, u_int32_t te_metric) +static void set_circuitparams_te_metric(struct mpls_te_circuit *mtc, + u_int32_t te_metric) { - SUBTLV_TYPE(mtc->te_metric) = TE_SUBTLV_TE_METRIC; - SUBTLV_LEN(mtc->te_metric) = TE_SUBTLV_TE_METRIC_SIZE; - mtc->te_metric.value[0] = (te_metric >> 16) & 0xFF; - mtc->te_metric.value[1] = (te_metric >> 8) & 0xFF; - mtc->te_metric.value[2] = te_metric & 0xFF; - return; + SUBTLV_TYPE(mtc->te_metric) = TE_SUBTLV_TE_METRIC; + SUBTLV_LEN(mtc->te_metric) = TE_SUBTLV_TE_METRIC_SIZE; + mtc->te_metric.value[0] = (te_metric >> 16) & 0xFF; + mtc->te_metric.value[1] = (te_metric >> 8) & 0xFF; + mtc->te_metric.value[2] = te_metric & 0xFF; + return; } -static void -set_circuitparams_inter_as (struct mpls_te_circuit *mtc, struct in_addr addr, u_int32_t as) +static void set_circuitparams_inter_as(struct mpls_te_circuit *mtc, + struct in_addr addr, u_int32_t as) { - /* Set the Remote ASBR IP address and then the associated AS number */ - SUBTLV_TYPE(mtc->rip) = TE_SUBTLV_RIP; - SUBTLV_LEN(mtc->rip) = SUBTLV_DEF_SIZE; - mtc->rip.value.s_addr = addr.s_addr; + /* Set the Remote ASBR IP address and then the associated AS number */ + SUBTLV_TYPE(mtc->rip) = TE_SUBTLV_RIP; + SUBTLV_LEN(mtc->rip) = SUBTLV_DEF_SIZE; + mtc->rip.value.s_addr = addr.s_addr; - SUBTLV_TYPE(mtc->ras) = TE_SUBTLV_RAS; - SUBTLV_LEN(mtc->ras) = SUBTLV_DEF_SIZE; - mtc->ras.value = htonl(as); + SUBTLV_TYPE(mtc->ras) = TE_SUBTLV_RAS; + SUBTLV_LEN(mtc->ras) = SUBTLV_DEF_SIZE; + mtc->ras.value = htonl(as); } -static void -unset_circuitparams_inter_as (struct mpls_te_circuit *mtc) +static void unset_circuitparams_inter_as(struct mpls_te_circuit *mtc) { - /* Reset the Remote ASBR IP address and then the associated AS number */ - SUBTLV_TYPE(mtc->rip) = 0; - SUBTLV_LEN(mtc->rip) = 0; - mtc->rip.value.s_addr = 0; + /* Reset the Remote ASBR IP address and then the associated AS number */ + SUBTLV_TYPE(mtc->rip) = 0; + SUBTLV_LEN(mtc->rip) = 0; + mtc->rip.value.s_addr = 0; - SUBTLV_TYPE(mtc->ras) = 0; - SUBTLV_LEN(mtc->ras) = 0; - mtc->ras.value = 0; + SUBTLV_TYPE(mtc->ras) = 0; + SUBTLV_LEN(mtc->ras) = 0; + mtc->ras.value = 0; } -static void -set_circuitparams_av_delay (struct mpls_te_circuit *mtc, u_int32_t delay, u_char anormal) +static void set_circuitparams_av_delay(struct mpls_te_circuit *mtc, + u_int32_t delay, u_char anormal) { - u_int32_t tmp; - /* Note that TLV-length field is the size of array. */ - SUBTLV_TYPE(mtc->av_delay) = TE_SUBTLV_AV_DELAY; - SUBTLV_LEN(mtc->av_delay) = SUBTLV_DEF_SIZE; - tmp = delay & TE_EXT_MASK; - if (anormal) - tmp |= TE_EXT_ANORMAL; - mtc->av_delay.value = htonl(tmp); - return; + u_int32_t tmp; + /* Note that TLV-length field is the size of array. */ + SUBTLV_TYPE(mtc->av_delay) = TE_SUBTLV_AV_DELAY; + SUBTLV_LEN(mtc->av_delay) = SUBTLV_DEF_SIZE; + tmp = delay & TE_EXT_MASK; + if (anormal) + tmp |= TE_EXT_ANORMAL; + mtc->av_delay.value = htonl(tmp); + return; } -static void -set_circuitparams_mm_delay (struct mpls_te_circuit *mtc, u_int32_t low, u_int32_t high, u_char anormal) +static void set_circuitparams_mm_delay(struct mpls_te_circuit *mtc, + u_int32_t low, u_int32_t high, + u_char anormal) { - u_int32_t tmp; - /* Note that TLV-length field is the size of array. */ - SUBTLV_TYPE(mtc->mm_delay) = TE_SUBTLV_MM_DELAY; - SUBTLV_LEN(mtc->mm_delay) = TE_SUBTLV_MM_DELAY_SIZE; - tmp = low & TE_EXT_MASK; - if (anormal) - tmp |= TE_EXT_ANORMAL; - mtc->mm_delay.low = htonl(tmp); - mtc->mm_delay.high = htonl(high); - return; + u_int32_t tmp; + /* Note that TLV-length field is the size of array. */ + SUBTLV_TYPE(mtc->mm_delay) = TE_SUBTLV_MM_DELAY; + SUBTLV_LEN(mtc->mm_delay) = TE_SUBTLV_MM_DELAY_SIZE; + tmp = low & TE_EXT_MASK; + if (anormal) + tmp |= TE_EXT_ANORMAL; + mtc->mm_delay.low = htonl(tmp); + mtc->mm_delay.high = htonl(high); + return; } -static void -set_circuitparams_delay_var (struct mpls_te_circuit *mtc, u_int32_t jitter) +static void set_circuitparams_delay_var(struct mpls_te_circuit *mtc, + u_int32_t jitter) { - /* Note that TLV-length field is the size of array. */ - SUBTLV_TYPE(mtc->delay_var) = TE_SUBTLV_DELAY_VAR; - SUBTLV_LEN(mtc->delay_var) = SUBTLV_DEF_SIZE; - mtc->delay_var.value = htonl(jitter & TE_EXT_MASK); - return; + /* Note that TLV-length field is the size of array. */ + SUBTLV_TYPE(mtc->delay_var) = TE_SUBTLV_DELAY_VAR; + SUBTLV_LEN(mtc->delay_var) = SUBTLV_DEF_SIZE; + mtc->delay_var.value = htonl(jitter & TE_EXT_MASK); + return; } -static void -set_circuitparams_pkt_loss (struct mpls_te_circuit *mtc, u_int32_t loss, u_char anormal) +static void set_circuitparams_pkt_loss(struct mpls_te_circuit *mtc, + u_int32_t loss, u_char anormal) { - u_int32_t tmp; - /* Note that TLV-length field is the size of array. */ - SUBTLV_TYPE(mtc->pkt_loss) = TE_SUBTLV_PKT_LOSS; - SUBTLV_LEN(mtc->pkt_loss) = SUBTLV_DEF_SIZE; - tmp = loss & TE_EXT_MASK; - if (anormal) - tmp |= TE_EXT_ANORMAL; - mtc->pkt_loss.value = htonl(tmp); - return; + u_int32_t tmp; + /* Note that TLV-length field is the size of array. */ + SUBTLV_TYPE(mtc->pkt_loss) = TE_SUBTLV_PKT_LOSS; + SUBTLV_LEN(mtc->pkt_loss) = SUBTLV_DEF_SIZE; + tmp = loss & TE_EXT_MASK; + if (anormal) + tmp |= TE_EXT_ANORMAL; + mtc->pkt_loss.value = htonl(tmp); + return; } -static void -set_circuitparams_res_bw (struct mpls_te_circuit *mtc, float fp) +static void set_circuitparams_res_bw(struct mpls_te_circuit *mtc, float fp) { - /* Note that TLV-length field is the size of array. */ - SUBTLV_TYPE(mtc->res_bw) = TE_SUBTLV_RES_BW; - SUBTLV_LEN(mtc->res_bw) = SUBTLV_DEF_SIZE; - mtc->res_bw.value = htonf(fp); - return; + /* Note that TLV-length field is the size of array. */ + SUBTLV_TYPE(mtc->res_bw) = TE_SUBTLV_RES_BW; + SUBTLV_LEN(mtc->res_bw) = SUBTLV_DEF_SIZE; + mtc->res_bw.value = htonf(fp); + return; } -static void -set_circuitparams_ava_bw (struct mpls_te_circuit *mtc, float fp) +static void set_circuitparams_ava_bw(struct mpls_te_circuit *mtc, float fp) { - /* Note that TLV-length field is the size of array. */ - SUBTLV_TYPE(mtc->ava_bw) = TE_SUBTLV_AVA_BW; - SUBTLV_LEN(mtc->ava_bw) = SUBTLV_DEF_SIZE; - mtc->ava_bw.value = htonf(fp); - return; + /* Note that TLV-length field is the size of array. */ + SUBTLV_TYPE(mtc->ava_bw) = TE_SUBTLV_AVA_BW; + SUBTLV_LEN(mtc->ava_bw) = SUBTLV_DEF_SIZE; + mtc->ava_bw.value = htonf(fp); + return; } -static void -set_circuitparams_use_bw (struct mpls_te_circuit *mtc, float fp) +static void set_circuitparams_use_bw(struct mpls_te_circuit *mtc, float fp) { - /* Note that TLV-length field is the size of array. */ - SUBTLV_TYPE(mtc->use_bw) = TE_SUBTLV_USE_BW; - SUBTLV_LEN(mtc->use_bw) = SUBTLV_DEF_SIZE; - mtc->use_bw.value = htonf(fp); - return; + /* Note that TLV-length field is the size of array. */ + SUBTLV_TYPE(mtc->use_bw) = TE_SUBTLV_USE_BW; + SUBTLV_LEN(mtc->use_bw) = SUBTLV_DEF_SIZE; + mtc->use_bw.value = htonf(fp); + return; } /* Main initialization / update function of the MPLS TE Circuit context */ /* Call when interface TE Link parameters are modified */ -void -isis_link_params_update (struct isis_circuit *circuit, struct interface *ifp) +void isis_link_params_update(struct isis_circuit *circuit, + struct interface *ifp) { - int i; - struct prefix_ipv4 *addr; - struct mpls_te_circuit *mtc; - - /* Sanity Check */ - if ((circuit == NULL) || (ifp == NULL)) - return; - - zlog_info ("MPLS-TE: Initialize circuit parameters for interface %s", ifp->name); - - /* Check if MPLS TE Circuit context has not been already created */ - if (circuit->mtc == NULL) - circuit->mtc = mpls_te_circuit_new(); - - mtc = circuit->mtc; - - /* Fulfil MTC TLV from ifp TE Link parameters */ - if (HAS_LINK_PARAMS(ifp)) - { - mtc->status = enable; - /* STD_TE metrics */ - if (IS_PARAM_SET(ifp->link_params, LP_ADM_GRP)) - set_circuitparams_admin_grp (mtc, ifp->link_params->admin_grp); - else - SUBTLV_TYPE(mtc->admin_grp) = 0; - - /* If not already set, register local IP addr from ip_addr list if it exists */ - if (SUBTLV_TYPE(mtc->local_ipaddr) == 0) - { - if (circuit->ip_addrs != NULL && listcount(circuit->ip_addrs) != 0) - { - addr = (struct prefix_ipv4 *)listgetdata ((struct listnode *)listhead (circuit->ip_addrs)); - set_circuitparams_local_ipaddr (mtc, addr->prefix); - } - } - - /* If not already set, try to determine Remote IP addr if circuit is P2P */ - if ((SUBTLV_TYPE(mtc->rmt_ipaddr) == 0) && (circuit->circ_type == CIRCUIT_T_P2P)) - { - struct isis_adjacency *adj = circuit->u.p2p.neighbor; - if (adj->ipv4_addrs != NULL && listcount(adj->ipv4_addrs) != 0) - { - struct in_addr *ip_addr; - ip_addr = (struct in_addr *)listgetdata ((struct listnode *)listhead (adj->ipv4_addrs)); - set_circuitparams_rmt_ipaddr (mtc, *ip_addr); - } - } - - if (IS_PARAM_SET(ifp->link_params, LP_MAX_BW)) - set_circuitparams_max_bw (mtc, ifp->link_params->max_bw); - else - SUBTLV_TYPE(mtc->max_bw) = 0; - - if (IS_PARAM_SET(ifp->link_params, LP_MAX_RSV_BW)) - set_circuitparams_max_rsv_bw (mtc, ifp->link_params->max_rsv_bw); - else - SUBTLV_TYPE(mtc->max_rsv_bw) = 0; - - if (IS_PARAM_SET(ifp->link_params, LP_UNRSV_BW)) - for (i = 0; i < MAX_CLASS_TYPE; i++) - set_circuitparams_unrsv_bw (mtc, i, ifp->link_params->unrsv_bw[i]); - else - SUBTLV_TYPE(mtc->unrsv_bw) = 0; - - if (IS_PARAM_SET(ifp->link_params, LP_TE_METRIC)) - set_circuitparams_te_metric(mtc, ifp->link_params->te_metric); - else - SUBTLV_TYPE(mtc->te_metric) = 0; - - /* TE metric Extensions */ - if (IS_PARAM_SET(ifp->link_params, LP_DELAY)) - set_circuitparams_av_delay(mtc, ifp->link_params->av_delay, 0); - else - SUBTLV_TYPE(mtc->av_delay) = 0; - - if (IS_PARAM_SET(ifp->link_params, LP_MM_DELAY)) - set_circuitparams_mm_delay(mtc, ifp->link_params->min_delay, ifp->link_params->max_delay, 0); - else - SUBTLV_TYPE(mtc->mm_delay) = 0; - - if (IS_PARAM_SET(ifp->link_params, LP_DELAY_VAR)) - set_circuitparams_delay_var(mtc, ifp->link_params->delay_var); - else - SUBTLV_TYPE(mtc->delay_var) = 0; - - if (IS_PARAM_SET(ifp->link_params, LP_PKT_LOSS)) - set_circuitparams_pkt_loss(mtc, ifp->link_params->pkt_loss, 0); - else - SUBTLV_TYPE(mtc->pkt_loss) = 0; - - if (IS_PARAM_SET(ifp->link_params, LP_RES_BW)) - set_circuitparams_res_bw(mtc, ifp->link_params->res_bw); - else - SUBTLV_TYPE(mtc->res_bw) = 0; - - if (IS_PARAM_SET(ifp->link_params, LP_AVA_BW)) - set_circuitparams_ava_bw(mtc, ifp->link_params->ava_bw); - else - SUBTLV_TYPE(mtc->ava_bw) = 0; - - if (IS_PARAM_SET(ifp->link_params, LP_USE_BW)) - set_circuitparams_use_bw(mtc, ifp->link_params->use_bw); - else - SUBTLV_TYPE(mtc->use_bw) = 0; - - /* INTER_AS */ - if (IS_PARAM_SET(ifp->link_params, LP_RMT_AS)) - set_circuitparams_inter_as(mtc, ifp->link_params->rmt_ip, ifp->link_params->rmt_as); - else - /* reset inter-as TE params */ - unset_circuitparams_inter_as (mtc); - - /* Compute total length of SUB TLVs */ - mtc->length = subtlvs_len(mtc); - - } - else - mtc->status = disable; - - /* Finally Update LSP */ + int i; + struct prefix_ipv4 *addr; + struct mpls_te_circuit *mtc; + + /* Sanity Check */ + if ((circuit == NULL) || (ifp == NULL)) + return; + + zlog_info("MPLS-TE: Initialize circuit parameters for interface %s", + ifp->name); + + /* Check if MPLS TE Circuit context has not been already created */ + if (circuit->mtc == NULL) + circuit->mtc = mpls_te_circuit_new(); + + mtc = circuit->mtc; + + /* Fulfil MTC TLV from ifp TE Link parameters */ + if (HAS_LINK_PARAMS(ifp)) { + mtc->status = enable; + /* STD_TE metrics */ + if (IS_PARAM_SET(ifp->link_params, LP_ADM_GRP)) + set_circuitparams_admin_grp( + mtc, ifp->link_params->admin_grp); + else + SUBTLV_TYPE(mtc->admin_grp) = 0; + + /* If not already set, register local IP addr from ip_addr list + * if it exists */ + if (SUBTLV_TYPE(mtc->local_ipaddr) == 0) { + if (circuit->ip_addrs != NULL + && listcount(circuit->ip_addrs) != 0) { + addr = (struct prefix_ipv4 *)listgetdata( + (struct listnode *)listhead( + circuit->ip_addrs)); + set_circuitparams_local_ipaddr(mtc, + addr->prefix); + } + } + + /* If not already set, try to determine Remote IP addr if + * circuit is P2P */ + if ((SUBTLV_TYPE(mtc->rmt_ipaddr) == 0) + && (circuit->circ_type == CIRCUIT_T_P2P)) { + struct isis_adjacency *adj = circuit->u.p2p.neighbor; + if (adj->ipv4_addrs != NULL + && listcount(adj->ipv4_addrs) != 0) { + struct in_addr *ip_addr; + ip_addr = (struct in_addr *)listgetdata( + (struct listnode *)listhead( + adj->ipv4_addrs)); + set_circuitparams_rmt_ipaddr(mtc, *ip_addr); + } + } + + if (IS_PARAM_SET(ifp->link_params, LP_MAX_BW)) + set_circuitparams_max_bw(mtc, ifp->link_params->max_bw); + else + SUBTLV_TYPE(mtc->max_bw) = 0; + + if (IS_PARAM_SET(ifp->link_params, LP_MAX_RSV_BW)) + set_circuitparams_max_rsv_bw( + mtc, ifp->link_params->max_rsv_bw); + else + SUBTLV_TYPE(mtc->max_rsv_bw) = 0; + + if (IS_PARAM_SET(ifp->link_params, LP_UNRSV_BW)) + for (i = 0; i < MAX_CLASS_TYPE; i++) + set_circuitparams_unrsv_bw( + mtc, i, ifp->link_params->unrsv_bw[i]); + else + SUBTLV_TYPE(mtc->unrsv_bw) = 0; + + if (IS_PARAM_SET(ifp->link_params, LP_TE_METRIC)) + set_circuitparams_te_metric( + mtc, ifp->link_params->te_metric); + else + SUBTLV_TYPE(mtc->te_metric) = 0; + + /* TE metric Extensions */ + if (IS_PARAM_SET(ifp->link_params, LP_DELAY)) + set_circuitparams_av_delay( + mtc, ifp->link_params->av_delay, 0); + else + SUBTLV_TYPE(mtc->av_delay) = 0; + + if (IS_PARAM_SET(ifp->link_params, LP_MM_DELAY)) + set_circuitparams_mm_delay( + mtc, ifp->link_params->min_delay, + ifp->link_params->max_delay, 0); + else + SUBTLV_TYPE(mtc->mm_delay) = 0; + + if (IS_PARAM_SET(ifp->link_params, LP_DELAY_VAR)) + set_circuitparams_delay_var( + mtc, ifp->link_params->delay_var); + else + SUBTLV_TYPE(mtc->delay_var) = 0; + + if (IS_PARAM_SET(ifp->link_params, LP_PKT_LOSS)) + set_circuitparams_pkt_loss( + mtc, ifp->link_params->pkt_loss, 0); + else + SUBTLV_TYPE(mtc->pkt_loss) = 0; + + if (IS_PARAM_SET(ifp->link_params, LP_RES_BW)) + set_circuitparams_res_bw(mtc, ifp->link_params->res_bw); + else + SUBTLV_TYPE(mtc->res_bw) = 0; + + if (IS_PARAM_SET(ifp->link_params, LP_AVA_BW)) + set_circuitparams_ava_bw(mtc, ifp->link_params->ava_bw); + else + SUBTLV_TYPE(mtc->ava_bw) = 0; + + if (IS_PARAM_SET(ifp->link_params, LP_USE_BW)) + set_circuitparams_use_bw(mtc, ifp->link_params->use_bw); + else + SUBTLV_TYPE(mtc->use_bw) = 0; + + /* INTER_AS */ + if (IS_PARAM_SET(ifp->link_params, LP_RMT_AS)) + set_circuitparams_inter_as(mtc, + ifp->link_params->rmt_ip, + ifp->link_params->rmt_as); + else + /* reset inter-as TE params */ + unset_circuitparams_inter_as(mtc); + + /* Compute total length of SUB TLVs */ + mtc->length = subtlvs_len(mtc); + + } else + mtc->status = disable; + +/* Finally Update LSP */ #if 0 if (IS_MPLS_TE(isisMplsTE) && circuit->area) lsp_regenerate_schedule (circuit->area, circuit->is_type, 0); #endif - return; + return; } -void -isis_mpls_te_update (struct interface *ifp) +void isis_mpls_te_update(struct interface *ifp) { - struct isis_circuit *circuit; + struct isis_circuit *circuit; - /* Sanity Check */ - if (ifp == NULL) - return; + /* Sanity Check */ + if (ifp == NULL) + return; - /* Get circuit context from interface */ - if ((circuit = circuit_scan_by_ifp(ifp)) == NULL) - return; + /* Get circuit context from interface */ + if ((circuit = circuit_scan_by_ifp(ifp)) == NULL) + return; - /* Update TE TLVs ... */ - isis_link_params_update(circuit, ifp); + /* Update TE TLVs ... */ + isis_link_params_update(circuit, ifp); - /* ... and LSP */ - if (IS_MPLS_TE(isisMplsTE) && circuit->area) - lsp_regenerate_schedule (circuit->area, circuit->is_type, 0); + /* ... and LSP */ + if (IS_MPLS_TE(isisMplsTE) && circuit->area) + lsp_regenerate_schedule(circuit->area, circuit->is_type, 0); - return; + return; } /*------------------------------------------------------------------------* * Followings are vty session control functions. *------------------------------------------------------------------------*/ -static u_char -show_vty_subtlv_admin_grp (struct vty *vty, struct te_subtlv_admin_grp *tlv) +static u_char show_vty_subtlv_admin_grp(struct vty *vty, + struct te_subtlv_admin_grp *tlv) { - if (vty != NULL) - vty_out (vty, " Administrative Group: 0x%x\n", - (u_int32_t)ntohl(tlv->value)); - else - zlog_debug (" Administrative Group: 0x%x", - (u_int32_t) ntohl (tlv->value)); + if (vty != NULL) + vty_out(vty, " Administrative Group: 0x%x\n", + (u_int32_t)ntohl(tlv->value)); + else + zlog_debug(" Administrative Group: 0x%x", + (u_int32_t)ntohl(tlv->value)); - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_llri (struct vty *vty, struct te_subtlv_llri *tlv) +static u_char show_vty_subtlv_llri(struct vty *vty, struct te_subtlv_llri *tlv) { - if (vty != NULL) - { - vty_out (vty, " Link Local ID: %d\n",(u_int32_t)ntohl(tlv->local)); - vty_out (vty, " Link Remote ID: %d\n", - (u_int32_t)ntohl(tlv->remote)); - } - else - { - zlog_debug (" Link Local ID: %d", (u_int32_t) ntohl (tlv->local)); - zlog_debug (" Link Remote ID: %d", (u_int32_t) ntohl (tlv->remote)); - } - - return (SUBTLV_HDR_SIZE + TE_SUBTLV_LLRI_SIZE); + if (vty != NULL) { + vty_out(vty, " Link Local ID: %d\n", + (u_int32_t)ntohl(tlv->local)); + vty_out(vty, " Link Remote ID: %d\n", + (u_int32_t)ntohl(tlv->remote)); + } else { + zlog_debug(" Link Local ID: %d", + (u_int32_t)ntohl(tlv->local)); + zlog_debug(" Link Remote ID: %d", + (u_int32_t)ntohl(tlv->remote)); + } + + return (SUBTLV_HDR_SIZE + TE_SUBTLV_LLRI_SIZE); } -static u_char -show_vty_subtlv_local_ipaddr (struct vty *vty, struct te_subtlv_local_ipaddr *tlv) +static u_char show_vty_subtlv_local_ipaddr(struct vty *vty, + struct te_subtlv_local_ipaddr *tlv) { - if (vty != NULL) - vty_out (vty, " Local Interface IP Address(es): %s\n", - inet_ntoa(tlv->value)); - else - zlog_debug (" Local Interface IP Address(es): %s", inet_ntoa (tlv->value)); - - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + if (vty != NULL) + vty_out(vty, " Local Interface IP Address(es): %s\n", + inet_ntoa(tlv->value)); + else + zlog_debug(" Local Interface IP Address(es): %s", + inet_ntoa(tlv->value)); + + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_rmt_ipaddr (struct vty *vty, struct te_subtlv_rmt_ipaddr *tlv) +static u_char show_vty_subtlv_rmt_ipaddr(struct vty *vty, + struct te_subtlv_rmt_ipaddr *tlv) { - if (vty != NULL) - vty_out (vty, " Remote Interface IP Address(es): %s\n", - inet_ntoa(tlv->value)); - else - zlog_debug (" Remote Interface IP Address(es): %s", inet_ntoa (tlv->value)); - - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + if (vty != NULL) + vty_out(vty, " Remote Interface IP Address(es): %s\n", + inet_ntoa(tlv->value)); + else + zlog_debug(" Remote Interface IP Address(es): %s", + inet_ntoa(tlv->value)); + + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_max_bw (struct vty *vty, struct te_subtlv_max_bw *tlv) +static u_char show_vty_subtlv_max_bw(struct vty *vty, + struct te_subtlv_max_bw *tlv) { - float fval; + float fval; - fval = ntohf (tlv->value); + fval = ntohf(tlv->value); - if (vty != NULL) - vty_out (vty, " Maximum Bandwidth: %g (Bytes/sec)\n", fval); - else - zlog_debug (" Maximum Bandwidth: %g (Bytes/sec)", fval); + if (vty != NULL) + vty_out(vty, " Maximum Bandwidth: %g (Bytes/sec)\n", fval); + else + zlog_debug(" Maximum Bandwidth: %g (Bytes/sec)", fval); - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_max_rsv_bw (struct vty *vty, struct te_subtlv_max_rsv_bw *tlv) +static u_char show_vty_subtlv_max_rsv_bw(struct vty *vty, + struct te_subtlv_max_rsv_bw *tlv) { - float fval; + float fval; - fval = ntohf (tlv->value); + fval = ntohf(tlv->value); - if (vty != NULL) - vty_out (vty, " Maximum Reservable Bandwidth: %g (Bytes/sec)\n",fval); - else - zlog_debug (" Maximum Reservable Bandwidth: %g (Bytes/sec)", fval); + if (vty != NULL) + vty_out(vty, + " Maximum Reservable Bandwidth: %g (Bytes/sec)\n", + fval); + else + zlog_debug(" Maximum Reservable Bandwidth: %g (Bytes/sec)", + fval); - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_unrsv_bw (struct vty *vty, struct te_subtlv_unrsv_bw *tlv) +static u_char show_vty_subtlv_unrsv_bw(struct vty *vty, + struct te_subtlv_unrsv_bw *tlv) { - float fval1, fval2; - int i; - - if (vty != NULL) - vty_out (vty, " Unreserved Bandwidth:\n"); - else - zlog_debug (" Unreserved Bandwidth:"); - - for (i = 0; i < MAX_CLASS_TYPE; i+=2) - { - fval1 = ntohf (tlv->value[i]); - fval2 = ntohf (tlv->value[i+1]); - if (vty != NULL) - vty_out (vty, " [%d]: %g (Bytes/sec),\t[%d]: %g (Bytes/sec)\n", i, fval1, i+1, - fval2); - else - zlog_debug (" [%d]: %g (Bytes/sec),\t[%d]: %g (Bytes/sec)", i, fval1, i+1, fval2); - } - - return (SUBTLV_HDR_SIZE + TE_SUBTLV_UNRSV_SIZE); + float fval1, fval2; + int i; + + if (vty != NULL) + vty_out(vty, " Unreserved Bandwidth:\n"); + else + zlog_debug(" Unreserved Bandwidth:"); + + for (i = 0; i < MAX_CLASS_TYPE; i += 2) { + fval1 = ntohf(tlv->value[i]); + fval2 = ntohf(tlv->value[i + 1]); + if (vty != NULL) + vty_out(vty, + " [%d]: %g (Bytes/sec),\t[%d]: %g (Bytes/sec)\n", + i, fval1, i + 1, fval2); + else + zlog_debug( + " [%d]: %g (Bytes/sec),\t[%d]: %g (Bytes/sec)", + i, fval1, i + 1, fval2); + } + + return (SUBTLV_HDR_SIZE + TE_SUBTLV_UNRSV_SIZE); } -static u_char -show_vty_subtlv_te_metric (struct vty *vty, struct te_subtlv_te_metric *tlv) +static u_char show_vty_subtlv_te_metric(struct vty *vty, + struct te_subtlv_te_metric *tlv) { - u_int32_t te_metric; + u_int32_t te_metric; - te_metric = tlv->value[2] | tlv->value[1] << 8 | tlv->value[0] << 16; - if (vty != NULL) - vty_out (vty, " Traffic Engineering Metric: %u\n", te_metric); - else - zlog_debug (" Traffic Engineering Metric: %u", te_metric); + te_metric = tlv->value[2] | tlv->value[1] << 8 | tlv->value[0] << 16; + if (vty != NULL) + vty_out(vty, " Traffic Engineering Metric: %u\n", te_metric); + else + zlog_debug(" Traffic Engineering Metric: %u", te_metric); - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_ras (struct vty *vty, struct te_subtlv_ras *tlv) +static u_char show_vty_subtlv_ras(struct vty *vty, struct te_subtlv_ras *tlv) { - if (vty != NULL) - vty_out (vty, " Inter-AS TE Remote AS number: %u\n", - ntohl(tlv->value)); - else - zlog_debug (" Inter-AS TE Remote AS number: %u", ntohl (tlv->value)); - - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + if (vty != NULL) + vty_out(vty, " Inter-AS TE Remote AS number: %u\n", + ntohl(tlv->value)); + else + zlog_debug(" Inter-AS TE Remote AS number: %u", + ntohl(tlv->value)); + + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_rip (struct vty *vty, struct te_subtlv_rip *tlv) +static u_char show_vty_subtlv_rip(struct vty *vty, struct te_subtlv_rip *tlv) { - if (vty != NULL) - vty_out (vty, " Inter-AS TE Remote ASBR IP address: %s\n", - inet_ntoa(tlv->value)); - else - zlog_debug (" Inter-AS TE Remote ASBR IP address: %s", inet_ntoa (tlv->value)); - - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + if (vty != NULL) + vty_out(vty, " Inter-AS TE Remote ASBR IP address: %s\n", + inet_ntoa(tlv->value)); + else + zlog_debug(" Inter-AS TE Remote ASBR IP address: %s", + inet_ntoa(tlv->value)); + + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_av_delay (struct vty *vty, struct te_subtlv_av_delay *tlv) +static u_char show_vty_subtlv_av_delay(struct vty *vty, + struct te_subtlv_av_delay *tlv) { - u_int32_t delay; - u_int32_t A; + u_int32_t delay; + u_int32_t A; - delay = (u_int32_t) ntohl (tlv->value) & TE_EXT_MASK; - A = (u_int32_t) ntohl (tlv->value) & TE_EXT_ANORMAL; + delay = (u_int32_t)ntohl(tlv->value) & TE_EXT_MASK; + A = (u_int32_t)ntohl(tlv->value) & TE_EXT_ANORMAL; - if (vty != NULL) - vty_out (vty, " %s Average Link Delay: %d (micro-sec)\n", A ? "Anomalous" : "Normal", - delay); - else - zlog_debug (" %s Average Link Delay: %d (micro-sec)", A ? "Anomalous" : "Normal", delay); + if (vty != NULL) + vty_out(vty, " %s Average Link Delay: %d (micro-sec)\n", + A ? "Anomalous" : "Normal", delay); + else + zlog_debug(" %s Average Link Delay: %d (micro-sec)", + A ? "Anomalous" : "Normal", delay); - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_mm_delay (struct vty *vty, struct te_subtlv_mm_delay *tlv) +static u_char show_vty_subtlv_mm_delay(struct vty *vty, + struct te_subtlv_mm_delay *tlv) { - u_int32_t low, high; - u_int32_t A; + u_int32_t low, high; + u_int32_t A; - low = (u_int32_t) ntohl (tlv->low) & TE_EXT_MASK; - A = (u_int32_t) ntohl (tlv->low) & TE_EXT_ANORMAL; - high = (u_int32_t) ntohl (tlv->high) & TE_EXT_MASK; + low = (u_int32_t)ntohl(tlv->low) & TE_EXT_MASK; + A = (u_int32_t)ntohl(tlv->low) & TE_EXT_ANORMAL; + high = (u_int32_t)ntohl(tlv->high) & TE_EXT_MASK; - if (vty != NULL) - vty_out (vty, " %s Min/Max Link Delay: %d / %d (micro-sec)\n", A ? "Anomalous" : "Normal", low, - high); - else - zlog_debug (" %s Min/Max Link Delay: %d / %d (micro-sec)", A ? "Anomalous" : "Normal", low, high); + if (vty != NULL) + vty_out(vty, " %s Min/Max Link Delay: %d / %d (micro-sec)\n", + A ? "Anomalous" : "Normal", low, high); + else + zlog_debug(" %s Min/Max Link Delay: %d / %d (micro-sec)", + A ? "Anomalous" : "Normal", low, high); - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_delay_var (struct vty *vty, struct te_subtlv_delay_var *tlv) +static u_char show_vty_subtlv_delay_var(struct vty *vty, + struct te_subtlv_delay_var *tlv) { - u_int32_t jitter; + u_int32_t jitter; - jitter = (u_int32_t) ntohl (tlv->value) & TE_EXT_MASK; + jitter = (u_int32_t)ntohl(tlv->value) & TE_EXT_MASK; - if (vty != NULL) - vty_out (vty, " Delay Variation: %d (micro-sec)\n", jitter); - else - zlog_debug (" Delay Variation: %d (micro-sec)", jitter); + if (vty != NULL) + vty_out(vty, " Delay Variation: %d (micro-sec)\n", jitter); + else + zlog_debug(" Delay Variation: %d (micro-sec)", jitter); - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_pkt_loss (struct vty *vty, struct te_subtlv_pkt_loss *tlv) +static u_char show_vty_subtlv_pkt_loss(struct vty *vty, + struct te_subtlv_pkt_loss *tlv) { - u_int32_t loss; - u_int32_t A; - float fval; - - loss = (u_int32_t) ntohl (tlv->value) & TE_EXT_MASK; - fval = (float) (loss * LOSS_PRECISION); - A = (u_int32_t) ntohl (tlv->value) & TE_EXT_ANORMAL; - - if (vty != NULL) - vty_out (vty, " %s Link Packet Loss: %g (%%)\n", A ? "Anomalous" : "Normal", - fval); - else - zlog_debug (" %s Link Packet Loss: %g (%%)", A ? "Anomalous" : "Normal", fval); - - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + u_int32_t loss; + u_int32_t A; + float fval; + + loss = (u_int32_t)ntohl(tlv->value) & TE_EXT_MASK; + fval = (float)(loss * LOSS_PRECISION); + A = (u_int32_t)ntohl(tlv->value) & TE_EXT_ANORMAL; + + if (vty != NULL) + vty_out(vty, " %s Link Packet Loss: %g (%%)\n", + A ? "Anomalous" : "Normal", fval); + else + zlog_debug(" %s Link Packet Loss: %g (%%)", + A ? "Anomalous" : "Normal", fval); + + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_res_bw (struct vty *vty, struct te_subtlv_res_bw *tlv) +static u_char show_vty_subtlv_res_bw(struct vty *vty, + struct te_subtlv_res_bw *tlv) { - float fval; + float fval; - fval = ntohf(tlv->value); + fval = ntohf(tlv->value); - if (vty != NULL) - vty_out (vty, " Unidirectional Residual Bandwidth: %g (Bytes/sec)\n", - fval); - else - zlog_debug (" Unidirectional Residual Bandwidth: %g (Bytes/sec)", fval); + if (vty != NULL) + vty_out(vty, + " Unidirectional Residual Bandwidth: %g (Bytes/sec)\n", + fval); + else + zlog_debug( + " Unidirectional Residual Bandwidth: %g (Bytes/sec)", + fval); - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_ava_bw (struct vty *vty, struct te_subtlv_ava_bw *tlv) +static u_char show_vty_subtlv_ava_bw(struct vty *vty, + struct te_subtlv_ava_bw *tlv) { - float fval; + float fval; - fval = ntohf (tlv->value); + fval = ntohf(tlv->value); - if (vty != NULL) - vty_out (vty, " Unidirectional Available Bandwidth: %g (Bytes/sec)\n", - fval); - else - zlog_debug (" Unidirectional Available Bandwidth: %g (Bytes/sec)", fval); + if (vty != NULL) + vty_out(vty, + " Unidirectional Available Bandwidth: %g (Bytes/sec)\n", + fval); + else + zlog_debug( + " Unidirectional Available Bandwidth: %g (Bytes/sec)", + fval); - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_subtlv_use_bw (struct vty *vty, struct te_subtlv_use_bw *tlv) +static u_char show_vty_subtlv_use_bw(struct vty *vty, + struct te_subtlv_use_bw *tlv) { - float fval; + float fval; - fval = ntohf (tlv->value); + fval = ntohf(tlv->value); - if (vty != NULL) - vty_out (vty, " Unidirectional Utilized Bandwidth: %g (Bytes/sec)\n", - fval); - else - zlog_debug (" Unidirectional Utilized Bandwidth: %g (Bytes/sec)", fval); + if (vty != NULL) + vty_out(vty, + " Unidirectional Utilized Bandwidth: %g (Bytes/sec)\n", + fval); + else + zlog_debug( + " Unidirectional Utilized Bandwidth: %g (Bytes/sec)", + fval); - return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); + return (SUBTLV_HDR_SIZE + SUBTLV_DEF_SIZE); } -static u_char -show_vty_unknown_tlv (struct vty *vty, struct subtlv_header *tlvh) +static u_char show_vty_unknown_tlv(struct vty *vty, struct subtlv_header *tlvh) { - int i, rtn = 1; - u_char *v = (u_char *)tlvh; - - if (vty != NULL) - { - if (tlvh->length != 0) - { - vty_out (vty, " Unknown TLV: [type(%#.2x), length(%#.2x)]\n", - tlvh->type, tlvh->length); - vty_out(vty, " Dump: [00]"); - rtn = 1; /* initialize end of line counter */ - for (i = 0; i < tlvh->length; i++) - { - vty_out (vty, " %#.2x", v[i]); - if (rtn == 8) - { - vty_out (vty, "\n [%.2x]", i + 1); - rtn = 1; - } - else - rtn++; - } - vty_out (vty, "\n"); - } - else - vty_out (vty, " Unknown TLV: [type(%#.2x), length(%#.2x)]\n", - tlvh->type, tlvh->length); - } - else - { - zlog_debug (" Unknown TLV: [type(%#.2x), length(%#.2x)]", - tlvh->type, tlvh->length); - } - - return SUBTLV_SIZE(tlvh); + int i, rtn = 1; + u_char *v = (u_char *)tlvh; + + if (vty != NULL) { + if (tlvh->length != 0) { + vty_out(vty, + " Unknown TLV: [type(%#.2x), length(%#.2x)]\n", + tlvh->type, tlvh->length); + vty_out(vty, " Dump: [00]"); + rtn = 1; /* initialize end of line counter */ + for (i = 0; i < tlvh->length; i++) { + vty_out(vty, " %#.2x", v[i]); + if (rtn == 8) { + vty_out(vty, "\n [%.2x]", + i + 1); + rtn = 1; + } else + rtn++; + } + vty_out(vty, "\n"); + } else + vty_out(vty, + " Unknown TLV: [type(%#.2x), length(%#.2x)]\n", + tlvh->type, tlvh->length); + } else { + zlog_debug(" Unknown TLV: [type(%#.2x), length(%#.2x)]", + tlvh->type, tlvh->length); + } + + return SUBTLV_SIZE(tlvh); } /* Main Show function */ -void -mpls_te_print_detail(struct vty *vty, struct te_is_neigh *te) +void mpls_te_print_detail(struct vty *vty, struct te_is_neigh *te) { - struct subtlv_header *tlvh; - u_int16_t sum = 0; - - zlog_debug ("ISIS MPLS-TE: Show database TE detail"); - - tlvh = (struct subtlv_header *)te->sub_tlvs; - - for (; sum < te->sub_tlvs_length; tlvh = SUBTLV_HDR_NEXT (tlvh)) - { - switch (tlvh->type) - { - case TE_SUBTLV_ADMIN_GRP: - sum += show_vty_subtlv_admin_grp (vty, (struct te_subtlv_admin_grp *)tlvh); - break; - case TE_SUBTLV_LLRI: - sum += show_vty_subtlv_llri (vty, (struct te_subtlv_llri *)tlvh); - break; - case TE_SUBTLV_LOCAL_IPADDR: - sum += show_vty_subtlv_local_ipaddr (vty, (struct te_subtlv_local_ipaddr *)tlvh); - break; - case TE_SUBTLV_RMT_IPADDR: - sum += show_vty_subtlv_rmt_ipaddr (vty, (struct te_subtlv_rmt_ipaddr *)tlvh); - break; - case TE_SUBTLV_MAX_BW: - sum += show_vty_subtlv_max_bw (vty, (struct te_subtlv_max_bw *)tlvh); - break; - case TE_SUBTLV_MAX_RSV_BW: - sum += show_vty_subtlv_max_rsv_bw (vty, (struct te_subtlv_max_rsv_bw *)tlvh); - break; - case TE_SUBTLV_UNRSV_BW: - sum += show_vty_subtlv_unrsv_bw (vty, (struct te_subtlv_unrsv_bw *)tlvh); - break; - case TE_SUBTLV_TE_METRIC: - sum += show_vty_subtlv_te_metric (vty, (struct te_subtlv_te_metric *)tlvh); - break; - case TE_SUBTLV_RAS: - sum += show_vty_subtlv_ras (vty, (struct te_subtlv_ras *)tlvh); - break; - case TE_SUBTLV_RIP: - sum += show_vty_subtlv_rip (vty, (struct te_subtlv_rip *)tlvh); - break; - case TE_SUBTLV_AV_DELAY: - sum += show_vty_subtlv_av_delay (vty, (struct te_subtlv_av_delay *)tlvh); - break; - case TE_SUBTLV_MM_DELAY: - sum += show_vty_subtlv_mm_delay (vty, (struct te_subtlv_mm_delay *)tlvh); - break; - case TE_SUBTLV_DELAY_VAR: - sum += show_vty_subtlv_delay_var (vty, (struct te_subtlv_delay_var *)tlvh); - break; - case TE_SUBTLV_PKT_LOSS: - sum += show_vty_subtlv_pkt_loss (vty, (struct te_subtlv_pkt_loss *)tlvh); - break; - case TE_SUBTLV_RES_BW: - sum += show_vty_subtlv_res_bw (vty, (struct te_subtlv_res_bw *)tlvh); - break; - case TE_SUBTLV_AVA_BW: - sum += show_vty_subtlv_ava_bw (vty, (struct te_subtlv_ava_bw *)tlvh); - break; - case TE_SUBTLV_USE_BW: - sum += show_vty_subtlv_use_bw (vty, (struct te_subtlv_use_bw *)tlvh); - break; - default: - sum += show_vty_unknown_tlv (vty, tlvh); - break; - } - } - return; + struct subtlv_header *tlvh; + u_int16_t sum = 0; + + zlog_debug("ISIS MPLS-TE: Show database TE detail"); + + tlvh = (struct subtlv_header *)te->sub_tlvs; + + for (; sum < te->sub_tlvs_length; tlvh = SUBTLV_HDR_NEXT(tlvh)) { + switch (tlvh->type) { + case TE_SUBTLV_ADMIN_GRP: + sum += show_vty_subtlv_admin_grp( + vty, (struct te_subtlv_admin_grp *)tlvh); + break; + case TE_SUBTLV_LLRI: + sum += show_vty_subtlv_llri( + vty, (struct te_subtlv_llri *)tlvh); + break; + case TE_SUBTLV_LOCAL_IPADDR: + sum += show_vty_subtlv_local_ipaddr( + vty, (struct te_subtlv_local_ipaddr *)tlvh); + break; + case TE_SUBTLV_RMT_IPADDR: + sum += show_vty_subtlv_rmt_ipaddr( + vty, (struct te_subtlv_rmt_ipaddr *)tlvh); + break; + case TE_SUBTLV_MAX_BW: + sum += show_vty_subtlv_max_bw( + vty, (struct te_subtlv_max_bw *)tlvh); + break; + case TE_SUBTLV_MAX_RSV_BW: + sum += show_vty_subtlv_max_rsv_bw( + vty, (struct te_subtlv_max_rsv_bw *)tlvh); + break; + case TE_SUBTLV_UNRSV_BW: + sum += show_vty_subtlv_unrsv_bw( + vty, (struct te_subtlv_unrsv_bw *)tlvh); + break; + case TE_SUBTLV_TE_METRIC: + sum += show_vty_subtlv_te_metric( + vty, (struct te_subtlv_te_metric *)tlvh); + break; + case TE_SUBTLV_RAS: + sum += show_vty_subtlv_ras( + vty, (struct te_subtlv_ras *)tlvh); + break; + case TE_SUBTLV_RIP: + sum += show_vty_subtlv_rip( + vty, (struct te_subtlv_rip *)tlvh); + break; + case TE_SUBTLV_AV_DELAY: + sum += show_vty_subtlv_av_delay( + vty, (struct te_subtlv_av_delay *)tlvh); + break; + case TE_SUBTLV_MM_DELAY: + sum += show_vty_subtlv_mm_delay( + vty, (struct te_subtlv_mm_delay *)tlvh); + break; + case TE_SUBTLV_DELAY_VAR: + sum += show_vty_subtlv_delay_var( + vty, (struct te_subtlv_delay_var *)tlvh); + break; + case TE_SUBTLV_PKT_LOSS: + sum += show_vty_subtlv_pkt_loss( + vty, (struct te_subtlv_pkt_loss *)tlvh); + break; + case TE_SUBTLV_RES_BW: + sum += show_vty_subtlv_res_bw( + vty, (struct te_subtlv_res_bw *)tlvh); + break; + case TE_SUBTLV_AVA_BW: + sum += show_vty_subtlv_ava_bw( + vty, (struct te_subtlv_ava_bw *)tlvh); + break; + case TE_SUBTLV_USE_BW: + sum += show_vty_subtlv_use_bw( + vty, (struct te_subtlv_use_bw *)tlvh); + break; + default: + sum += show_vty_unknown_tlv(vty, tlvh); + break; + } + } + return; } /* Specific MPLS TE router parameters write function */ -void -isis_mpls_te_config_write_router (struct vty *vty) +void isis_mpls_te_config_write_router(struct vty *vty) { - if (IS_MPLS_TE(isisMplsTE)) - { - vty_out (vty, " mpls-te on\n"); - vty_out (vty, " mpls-te router-address %s\n", - inet_ntoa(isisMplsTE.router_id)); - } - - return; + if (IS_MPLS_TE(isisMplsTE)) { + vty_out(vty, " mpls-te on\n"); + vty_out(vty, " mpls-te router-address %s\n", + inet_ntoa(isisMplsTE.router_id)); + } + + return; } @@ -1088,41 +1102,42 @@ DEFUN (isis_mpls_te_on, MPLS_TE_STR "Enable MPLS-TE functionality\n") { - struct listnode *node; - struct isis_circuit *circuit; - - if (IS_MPLS_TE(isisMplsTE)) - return CMD_SUCCESS; - - if (IS_DEBUG_ISIS(DEBUG_TE)) - zlog_debug ("ISIS MPLS-TE: OFF -> ON"); - - isisMplsTE.status = enable; - - /* - * Following code is intended to handle two cases; - * - * 1) MPLS-TE was disabled at startup time, but now become enabled. - * In this case, we must enable MPLS-TE Circuit regarding interface MPLS_TE flag - * 2) MPLS-TE was once enabled then disabled, and now enabled again. - */ - for (ALL_LIST_ELEMENTS_RO (isisMplsTE.cir_list, node, circuit)) - { - if (circuit->mtc == NULL || IS_FLOOD_AS (circuit->mtc->type)) - continue; - - if ((circuit->mtc->status == disable) - && HAS_LINK_PARAMS(circuit->interface)) - circuit->mtc->status = enable; - else - continue; - - /* Reoriginate STD_TE & GMPLS circuits */ - if (circuit->area) - lsp_regenerate_schedule (circuit->area, circuit->is_type, 0); - } - - return CMD_SUCCESS; + struct listnode *node; + struct isis_circuit *circuit; + + if (IS_MPLS_TE(isisMplsTE)) + return CMD_SUCCESS; + + if (IS_DEBUG_ISIS(DEBUG_TE)) + zlog_debug("ISIS MPLS-TE: OFF -> ON"); + + isisMplsTE.status = enable; + + /* + * Following code is intended to handle two cases; + * + * 1) MPLS-TE was disabled at startup time, but now become enabled. + * In this case, we must enable MPLS-TE Circuit regarding interface + * MPLS_TE flag + * 2) MPLS-TE was once enabled then disabled, and now enabled again. + */ + for (ALL_LIST_ELEMENTS_RO(isisMplsTE.cir_list, node, circuit)) { + if (circuit->mtc == NULL || IS_FLOOD_AS(circuit->mtc->type)) + continue; + + if ((circuit->mtc->status == disable) + && HAS_LINK_PARAMS(circuit->interface)) + circuit->mtc->status = enable; + else + continue; + + /* Reoriginate STD_TE & GMPLS circuits */ + if (circuit->area) + lsp_regenerate_schedule(circuit->area, circuit->is_type, + 0); + } + + return CMD_SUCCESS; } DEFUN (no_isis_mpls_te_on, @@ -1131,32 +1146,32 @@ DEFUN (no_isis_mpls_te_on, NO_STR "Disable the MPLS-TE functionality\n") { - struct listnode *node; - struct isis_circuit *circuit; + struct listnode *node; + struct isis_circuit *circuit; - if (isisMplsTE.status == disable) - return CMD_SUCCESS; + if (isisMplsTE.status == disable) + return CMD_SUCCESS; - if (IS_DEBUG_ISIS(DEBUG_TE)) - zlog_debug ("ISIS MPLS-TE: ON -> OFF"); + if (IS_DEBUG_ISIS(DEBUG_TE)) + zlog_debug("ISIS MPLS-TE: ON -> OFF"); - isisMplsTE.status = disable; + isisMplsTE.status = disable; - /* Flush LSP if circuit engage */ - for (ALL_LIST_ELEMENTS_RO (isisMplsTE.cir_list, node, circuit)) - { - if (circuit->mtc == NULL || (circuit->mtc->status == disable)) - continue; + /* Flush LSP if circuit engage */ + for (ALL_LIST_ELEMENTS_RO(isisMplsTE.cir_list, node, circuit)) { + if (circuit->mtc == NULL || (circuit->mtc->status == disable)) + continue; - /* disable MPLS_TE Circuit */ - circuit->mtc->status = disable; + /* disable MPLS_TE Circuit */ + circuit->mtc->status = disable; - /* Re-originate circuit without STD_TE & GMPLS parameters */ - if (circuit->area) - lsp_regenerate_schedule (circuit->area, circuit->is_type, 0); - } + /* Re-originate circuit without STD_TE & GMPLS parameters */ + if (circuit->area) + lsp_regenerate_schedule(circuit->area, circuit->is_type, + 0); + } - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (isis_mpls_te_router_addr, @@ -1166,30 +1181,29 @@ DEFUN (isis_mpls_te_router_addr, "Stable IP address of the advertising router\n" "MPLS-TE router address in IPv4 address format\n") { - int idx_ipv4 = 2; - struct in_addr value; - struct listnode *node; - struct isis_area *area; - - if (! inet_aton (argv[idx_ipv4]->arg, &value)) - { - vty_out (vty, "Please specify Router-Addr by A.B.C.D\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - isisMplsTE.router_id.s_addr = value.s_addr; - - if (isisMplsTE.status == disable) - return CMD_SUCCESS; - - /* Update main Router ID in isis global structure */ - isis->router_id = value.s_addr; - /* And re-schedule LSP update */ - for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area)) - if (listcount (area->area_addrs) > 0) - lsp_regenerate_schedule (area, area->is_type, 0); - - return CMD_SUCCESS; + int idx_ipv4 = 2; + struct in_addr value; + struct listnode *node; + struct isis_area *area; + + if (!inet_aton(argv[idx_ipv4]->arg, &value)) { + vty_out(vty, "Please specify Router-Addr by A.B.C.D\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + isisMplsTE.router_id.s_addr = value.s_addr; + + if (isisMplsTE.status == disable) + return CMD_SUCCESS; + + /* Update main Router ID in isis global structure */ + isis->router_id = value.s_addr; + /* And re-schedule LSP update */ + for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) + if (listcount(area->area_addrs) > 0) + lsp_regenerate_schedule(area, area->is_type, 0); + + return CMD_SUCCESS; } DEFUN (isis_mpls_te_inter_as, @@ -1201,8 +1215,8 @@ DEFUN (isis_mpls_te_inter_as, "AREA native mode self originate INTER-AS LSP with L1 and L2 flooding scope)\n" "AS native mode self originate INTER-AS LSP with L2 only flooding scope\n") { - vty_out (vty, "Not yet supported\n"); - return CMD_SUCCESS; + vty_out(vty, "Not yet supported\n"); + return CMD_SUCCESS; } DEFUN (no_isis_mpls_te_inter_as, @@ -1213,8 +1227,8 @@ DEFUN (no_isis_mpls_te_inter_as, "Disable MPLS-TE Inter-AS support\n") { - vty_out (vty, "Not yet supported\n"); - return CMD_SUCCESS; + vty_out(vty, "Not yet supported\n"); + return CMD_SUCCESS; } DEFUN (show_isis_mpls_te_router, @@ -1225,89 +1239,80 @@ DEFUN (show_isis_mpls_te_router, MPLS_TE_STR "Router information\n") { - if (IS_MPLS_TE(isisMplsTE)) - { - vty_out (vty, "--- MPLS-TE router parameters ---\n"); - - if (ntohs (isisMplsTE.router_id.s_addr) != 0) - vty_out (vty, " Router-Address: %s\n", - inet_ntoa(isisMplsTE.router_id)); - else - vty_out (vty, " N/A\n"); - } - else - vty_out (vty, " MPLS-TE is disable on this router\n"); - - return CMD_SUCCESS; + if (IS_MPLS_TE(isisMplsTE)) { + vty_out(vty, "--- MPLS-TE router parameters ---\n"); + + if (ntohs(isisMplsTE.router_id.s_addr) != 0) + vty_out(vty, " Router-Address: %s\n", + inet_ntoa(isisMplsTE.router_id)); + else + vty_out(vty, " N/A\n"); + } else + vty_out(vty, " MPLS-TE is disable on this router\n"); + + return CMD_SUCCESS; } -static void -show_mpls_te_sub (struct vty *vty, struct interface *ifp) +static void show_mpls_te_sub(struct vty *vty, struct interface *ifp) { - struct mpls_te_circuit *mtc; - - if ((IS_MPLS_TE(isisMplsTE)) - && ((mtc = lookup_mpls_params_by_ifp (ifp)) != NULL)) - { - /* Continue only if interface is not passive or support Inter-AS TEv2 */ - if (mtc->status != enable) - { - if (IS_INTER_AS(mtc->type)) - { - vty_out (vty, "-- Inter-AS TEv2 link parameters for %s --\n", - ifp->name); - } - else - { - /* MPLS-TE is not activate on this interface */ - /* or this interface is passive and Inter-AS TEv2 is not activate */ - vty_out (vty, " %s: MPLS-TE is disabled on this interface\n", - ifp->name); - return; - } - } - else - { - vty_out (vty, "-- MPLS-TE link parameters for %s --\n", - ifp->name); - } - - show_vty_subtlv_admin_grp (vty, &mtc->admin_grp); - - if (SUBTLV_TYPE(mtc->local_ipaddr) != 0) - show_vty_subtlv_local_ipaddr (vty, &mtc->local_ipaddr); - if (SUBTLV_TYPE(mtc->rmt_ipaddr) != 0) - show_vty_subtlv_rmt_ipaddr (vty, &mtc->rmt_ipaddr); - - show_vty_subtlv_max_bw (vty, &mtc->max_bw); - show_vty_subtlv_max_rsv_bw (vty, &mtc->max_rsv_bw); - show_vty_subtlv_unrsv_bw (vty, &mtc->unrsv_bw); - show_vty_subtlv_te_metric (vty, &mtc->te_metric); - - if (IS_INTER_AS(mtc->type)) - { - if (SUBTLV_TYPE(mtc->ras) != 0) - show_vty_subtlv_ras (vty, &mtc->ras); - if (SUBTLV_TYPE(mtc->rip) != 0) - show_vty_subtlv_rip (vty, &mtc->rip); - } - - show_vty_subtlv_av_delay (vty, &mtc->av_delay); - show_vty_subtlv_mm_delay (vty, &mtc->mm_delay); - show_vty_subtlv_delay_var (vty, &mtc->delay_var); - show_vty_subtlv_pkt_loss (vty, &mtc->pkt_loss); - show_vty_subtlv_res_bw (vty, &mtc->res_bw); - show_vty_subtlv_ava_bw (vty, &mtc->ava_bw); - show_vty_subtlv_use_bw (vty, &mtc->use_bw); - vty_out (vty, "---------------\n\n"); - } - else - { - vty_out (vty, " %s: MPLS-TE is disabled on this interface\n", - ifp->name); - } - - return; + struct mpls_te_circuit *mtc; + + if ((IS_MPLS_TE(isisMplsTE)) + && ((mtc = lookup_mpls_params_by_ifp(ifp)) != NULL)) { + /* Continue only if interface is not passive or support Inter-AS + * TEv2 */ + if (mtc->status != enable) { + if (IS_INTER_AS(mtc->type)) { + vty_out(vty, + "-- Inter-AS TEv2 link parameters for %s --\n", + ifp->name); + } else { + /* MPLS-TE is not activate on this interface */ + /* or this interface is passive and Inter-AS + * TEv2 is not activate */ + vty_out(vty, + " %s: MPLS-TE is disabled on this interface\n", + ifp->name); + return; + } + } else { + vty_out(vty, "-- MPLS-TE link parameters for %s --\n", + ifp->name); + } + + show_vty_subtlv_admin_grp(vty, &mtc->admin_grp); + + if (SUBTLV_TYPE(mtc->local_ipaddr) != 0) + show_vty_subtlv_local_ipaddr(vty, &mtc->local_ipaddr); + if (SUBTLV_TYPE(mtc->rmt_ipaddr) != 0) + show_vty_subtlv_rmt_ipaddr(vty, &mtc->rmt_ipaddr); + + show_vty_subtlv_max_bw(vty, &mtc->max_bw); + show_vty_subtlv_max_rsv_bw(vty, &mtc->max_rsv_bw); + show_vty_subtlv_unrsv_bw(vty, &mtc->unrsv_bw); + show_vty_subtlv_te_metric(vty, &mtc->te_metric); + + if (IS_INTER_AS(mtc->type)) { + if (SUBTLV_TYPE(mtc->ras) != 0) + show_vty_subtlv_ras(vty, &mtc->ras); + if (SUBTLV_TYPE(mtc->rip) != 0) + show_vty_subtlv_rip(vty, &mtc->rip); + } + + show_vty_subtlv_av_delay(vty, &mtc->av_delay); + show_vty_subtlv_mm_delay(vty, &mtc->mm_delay); + show_vty_subtlv_delay_var(vty, &mtc->delay_var); + show_vty_subtlv_pkt_loss(vty, &mtc->pkt_loss); + show_vty_subtlv_res_bw(vty, &mtc->res_bw); + show_vty_subtlv_ava_bw(vty, &mtc->ava_bw); + show_vty_subtlv_use_bw(vty, &mtc->use_bw); + vty_out(vty, "---------------\n\n"); + } else { + vty_out(vty, " %s: MPLS-TE is disabled on this interface\n", + ifp->name); + } + + return; } DEFUN (show_isis_mpls_te_interface, @@ -1319,52 +1324,51 @@ DEFUN (show_isis_mpls_te_interface, "Interface information\n" "Interface name\n") { - int idx_interface = 4; - struct interface *ifp; - struct listnode *node; - - /* Show All Interfaces. */ - if (argc == 4) - { - for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp)) - show_mpls_te_sub (vty, ifp); - } - /* Interface name is specified. */ - else - { - if ((ifp = if_lookup_by_name (argv[idx_interface]->arg, VRF_DEFAULT)) == NULL) - vty_out (vty, "No such interface name\n"); - else - show_mpls_te_sub (vty, ifp); - } - - return CMD_SUCCESS; + int idx_interface = 4; + struct interface *ifp; + struct listnode *node; + + /* Show All Interfaces. */ + if (argc == 4) { + for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) + show_mpls_te_sub(vty, ifp); + } + /* Interface name is specified. */ + else { + if ((ifp = if_lookup_by_name(argv[idx_interface]->arg, + VRF_DEFAULT)) + == NULL) + vty_out(vty, "No such interface name\n"); + else + show_mpls_te_sub(vty, ifp); + } + + return CMD_SUCCESS; } /* Initialize MPLS_TE */ -void -isis_mpls_te_init (void) +void isis_mpls_te_init(void) { - zlog_debug("ISIS MPLS-TE: Initialize"); + zlog_debug("ISIS MPLS-TE: Initialize"); - /* Initialize MPLS_TE structure */ - isisMplsTE.status = disable; - isisMplsTE.level = 0; - isisMplsTE.inter_as = off; - isisMplsTE.interas_areaid.s_addr = 0; - isisMplsTE.cir_list = list_new(); - isisMplsTE.router_id.s_addr = 0; + /* Initialize MPLS_TE structure */ + isisMplsTE.status = disable; + isisMplsTE.level = 0; + isisMplsTE.inter_as = off; + isisMplsTE.interas_areaid.s_addr = 0; + isisMplsTE.cir_list = list_new(); + isisMplsTE.router_id.s_addr = 0; - /* Register new VTY commands */ - install_element (VIEW_NODE, &show_isis_mpls_te_router_cmd); - install_element (VIEW_NODE, &show_isis_mpls_te_interface_cmd); + /* Register new VTY commands */ + install_element(VIEW_NODE, &show_isis_mpls_te_router_cmd); + install_element(VIEW_NODE, &show_isis_mpls_te_interface_cmd); - install_element (ISIS_NODE, &isis_mpls_te_on_cmd); - install_element (ISIS_NODE, &no_isis_mpls_te_on_cmd); - install_element (ISIS_NODE, &isis_mpls_te_router_addr_cmd); - install_element (ISIS_NODE, &isis_mpls_te_inter_as_cmd); - install_element (ISIS_NODE, &no_isis_mpls_te_inter_as_cmd); + install_element(ISIS_NODE, &isis_mpls_te_on_cmd); + install_element(ISIS_NODE, &no_isis_mpls_te_on_cmd); + install_element(ISIS_NODE, &isis_mpls_te_router_addr_cmd); + install_element(ISIS_NODE, &isis_mpls_te_inter_as_cmd); + install_element(ISIS_NODE, &no_isis_mpls_te_inter_as_cmd); - return; + return; } |