]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pceplib: Extract fields needed for PcInitiated with Cisco pce. (1/4)
authorJavier Garcia <javier.garcia@voltanet.io>
Fri, 21 May 2021 07:07:41 +0000 (09:07 +0200)
committerJavier Garcia <javier.garcia@voltanet.io>
Tue, 22 Jun 2021 10:04:03 +0000 (12:04 +0200)
1.- Unknown/non-standard tlv where cisco sends BSID.
2.- Non-standard Vendor Info object where cisco sends color.

Co-authored-by: Javier Garcia <javier.garcia@voltanet.io>
Signed-off-by: Sebastien Merle <sebastien@netdef.org>
Signed-off-by: Javier Garcia <javier.garcia@voltanet.io>
pceplib/pcep_msg_objects.h
pceplib/pcep_msg_objects_encoding.c
pceplib/pcep_msg_tlvs.h
pceplib/pcep_msg_tlvs_encoding.c
pceplib/test/pcep_msg_tools_test.c

index 959a6f8cf6cb51609bcbcd5f0d4441981f7b239f..f26618e2917df8e9e349a5fc11bba877267a0ffb 100644 (file)
@@ -385,11 +385,16 @@ struct pcep_object_lsp {
        bool flag_c;
 };
 
+#define ENTERPRISE_NUMBER_CISCO 9
+#define ENTERPRISE_COLOR_CISCO 65540
 /* RFC 7470 */
 struct pcep_object_vendor_info {
        struct pcep_object_header header;
        uint32_t enterprise_number;
        uint32_t enterprise_specific_info;
+       uint32_t enterprise_specific_info1; /* cisco sends color for PcInit */
+       uint32_t enterprise_specific_info2;
+       uint32_t enterprise_specific_info3;
 };
 
 /* RFC 8282 */
index 9ab96f7bcec04b3ee9271709ef6865067bd2ce3c..69420f8e7abc08bf20c012855dfc4f43f9e576d5 100644 (file)
@@ -1339,8 +1339,15 @@ pcep_decode_obj_vendor_info(struct pcep_object_header *hdr,
        struct pcep_object_vendor_info *obj =
                (struct pcep_object_vendor_info *)common_object_create(
                        hdr, sizeof(struct pcep_object_vendor_info));
+
        obj->enterprise_number = ntohl(*((uint32_t *)(obj_buf)));
        obj->enterprise_specific_info = ntohl(*((uint32_t *)(obj_buf + 4)));
+       if (obj->enterprise_number == ENTERPRISE_NUMBER_CISCO
+           && obj->enterprise_specific_info == ENTERPRISE_COLOR_CISCO)
+               obj->enterprise_specific_info1 =
+                       ntohl(*((uint32_t *)(obj_buf + 8)));
+       else
+               obj->enterprise_specific_info1 = 0;
 
        return (struct pcep_object_header *)obj;
 }
index 5197201e40724a16f64eb082f69eeadf672e1ee3..6dd2b5655268c7be2ece34756c16a9ddc6ae52fb 100644 (file)
@@ -53,16 +53,16 @@ extern "C" {
  * https://www.iana.org/assignments/pcep/pcep.xhtml */
 enum pcep_object_tlv_types {
        PCEP_OBJ_TLV_TYPE_NO_PATH_VECTOR = 1,
-       PCEP_OBJ_TLV_TYPE_OBJECTIVE_FUNCTION_LIST = 4,  /* RFC 5541 */
+       PCEP_OBJ_TLV_TYPE_OBJECTIVE_FUNCTION_LIST = 4,  /* RFC 5541 */
        PCEP_OBJ_TLV_TYPE_VENDOR_INFO = 7,              /* RFC 7470 */
        PCEP_OBJ_TLV_TYPE_STATEFUL_PCE_CAPABILITY = 16, /* RFC 8231 */
-       PCEP_OBJ_TLV_TYPE_SYMBOLIC_PATH_NAME = 17,      /* RFC 8232 */
-       PCEP_OBJ_TLV_TYPE_IPV4_LSP_IDENTIFIERS = 18,    /* RFC 8231 */
-       PCEP_OBJ_TLV_TYPE_IPV6_LSP_IDENTIFIERS = 19,    /* RFC 8231 */
+       PCEP_OBJ_TLV_TYPE_SYMBOLIC_PATH_NAME = 17,      /* RFC 8232 */
+       PCEP_OBJ_TLV_TYPE_IPV4_LSP_IDENTIFIERS = 18,    /* RFC 8231 */
+       PCEP_OBJ_TLV_TYPE_IPV6_LSP_IDENTIFIERS = 19,    /* RFC 8231 */
        PCEP_OBJ_TLV_TYPE_LSP_ERROR_CODE = 20,          /* RFC 8232 */
        PCEP_OBJ_TLV_TYPE_RSVP_ERROR_SPEC = 21,         /* RFC 8232 */
        PCEP_OBJ_TLV_TYPE_LSP_DB_VERSION = 23,          /* RFC 8232 */
-       PCEP_OBJ_TLV_TYPE_SPEAKER_ENTITY_ID = 24,       /* RFC 8232 */
+       PCEP_OBJ_TLV_TYPE_SPEAKER_ENTITY_ID = 24,       /* RFC 8232 */
        PCEP_OBJ_TLV_TYPE_SR_PCE_CAPABILITY =
                26, /* draft-ietf-pce-segment-routing-16 */
        PCEP_OBJ_TLV_TYPE_PATH_SETUP_TYPE = 28, /* RFC 8408 */
@@ -77,10 +77,12 @@ enum pcep_object_tlv_types {
        PCEP_OBJ_TLV_TYPE_SRPOLICY_CPATH_PREFERENCE =
                63, /*TDB5 draft-barth-pce-segment-routing-policy-cp-04 */
        PCEP_OBJ_TLV_TYPE_UNKNOWN = 128,
-       PCEP_OBJ_TLV_TYPE_ARBITRARY =
-               65533 /* Max IANA To write arbitrary data */
+       PCEP_OBJ_TYPE_CISCO_BSID = 65505,
+       /* Max IANA To write arbitrary data */
+       PCEP_OBJ_TLV_TYPE_ARBITRARY = 65533
 };
 
+
 struct pcep_object_tlv_header {
        enum pcep_object_tlv_types type;
        /* Pointer into encoded_message field from the pcep_message */
index 37f3353f76cf3a4012f994510605020859bd8658..d59c97c9daca39d3af2710f521512edd935d1b9c 100644 (file)
@@ -838,7 +838,15 @@ struct pcep_object_tlv_header *pcep_decode_tlv(const uint8_t *tlv_buf)
                return NULL;
        }
 
-       tlv_decoder_funcptr tlv_decoder = tlv_decoders[tlv_hdr.type];
+       tlv_decoder_funcptr tlv_decoder = NULL;
+       if (tlv_hdr.type == PCEP_OBJ_TYPE_CISCO_BSID) {
+               pcep_log(LOG_INFO,
+                        "%s: Cisco BSID TLV decoder found for TLV type [%d]",
+                        __func__, tlv_hdr.type);
+               tlv_decoder = tlv_decoders[PCEP_OBJ_TLV_TYPE_ARBITRARY];
+       } else {
+               tlv_decoder = tlv_decoders[tlv_hdr.type];
+       }
        if (tlv_decoder == NULL) {
                pcep_log(LOG_INFO, "%s: No TLV decoder found for TLV type [%d]",
                         __func__, tlv_hdr.type);
index 5a7644b21a42b52ba7f91dc5faa0dd77fbdd3e0b..e25ddb21799a089a49c812451badfa1bff7a7bff 100644 (file)
@@ -809,8 +809,8 @@ void test_pcep_msg_read_pcep_report_cisco_pcc()
        CU_ASSERT_EQUAL(lsp->header.object_type, PCEP_OBJ_TYPE_LSP);
        CU_ASSERT_EQUAL(lsp->header.encoded_object_length, 60);
        CU_ASSERT_PTR_NOT_NULL(lsp->header.tlv_list);
-       /* The TLV with ID 65505 is not recognized, and its not in the list */
-       CU_ASSERT_EQUAL(lsp->header.tlv_list->num_entries, 2);
+       /* The TLV with ID 65505 is now recognized, and its in the list */
+       CU_ASSERT_EQUAL(lsp->header.tlv_list->num_entries, 3);
        CU_ASSERT_EQUAL(lsp->plsp_id, 524303);
        CU_ASSERT_EQUAL(lsp->operational_status, PCEP_LSP_OPERATIONAL_DOWN);
        CU_ASSERT_TRUE(lsp->flag_a);