diff --git a/src/extensions/map/cmduchecker.c b/src/extensions/map/cmduchecker.c index 51cc819a64c453e19feb02e35bcc10425a2cdf3c..841095d2f3e2fbad55151e2f8e9a02e0db70fe06 100644 --- a/src/extensions/map/cmduchecker.c +++ b/src/extensions/map/cmduchecker.c @@ -224,6 +224,19 @@ bool DEFINE_FUNC(CMDU_TYPE_TOPOLOGY_RESPONSE)(struct cmdu_buff *cmdu, return true; } +bool DEFINE_FUNC(CMDU_TYPE_VENDOR_SPECIFIC)(struct cmdu_buff *cmdu, + struct tlv *tv[][TLV_MAXNUM], + size_t num_tv, + uint8_t profile) +{ + trace("SA = " MACFMT ", profile = %d\n", MAC2STR(cmdu->origin), profile); + + if (tlv_validate(TLV_TYPE_VENDOR_SPECIFIC, tv[0][0])) + return false; + + return true; +} + enum CMDU_TYPE_AP_AUTOCONFIGURATION_SEARCH_ATTRS { AP_CONFIG_SEARCH_ATTR_1905_AL_MACADDR, AP_CONFIG_SEARCH_ATTR_SEARCHED_ROLE, @@ -683,6 +696,7 @@ bool DEFINE_FUNC(CMDU_EARLY_AP_CAPABILITY_REPORT)(struct cmdu_buff *cmdu, struct map_cmdu_validator map_cmdu_validate[] = { FUNC(CMDU_TYPE_TOPOLOGY_NOTIFICATION), FUNC(CMDU_TYPE_TOPOLOGY_RESPONSE), + FUNC(CMDU_TYPE_VENDOR_SPECIFIC), FUNC(CMDU_TYPE_AP_AUTOCONFIGURATION_SEARCH), FUNC(CMDU_TYPE_AP_AUTOCONFIGURATION_RESPONSE), FUNC(CMDU_TYPE_AP_AUTOCONFIGURATION_WSC), diff --git a/src/extensions/map/r1.c b/src/extensions/map/r1.c index 8cc688ad8fab8d6f82505c3a296a06e907128d0a..29f89b799ed2f2b43a9f35dc8d5c45fb90a606ef 100644 --- a/src/extensions/map/r1.c +++ b/src/extensions/map/r1.c @@ -76,7 +76,12 @@ DEFINE_POLICY(CMDU_TYPE_TOPOLOGY_RESPONSE) = { }; DEFINE_POLICY(CMDU_TYPE_VENDOR_SPECIFIC) = { - /* user defined */ + [0] = { + .type = TLV_TYPE_VENDOR_SPECIFIC, + .present = TLV_PRESENT_ONE, + .minlen = 3, + }, + /* any number and/or type of tlvs may follow */ }; DEFINE_POLICY(CMDU_TYPE_LINK_METRIC_QUERY) = { diff --git a/src/extensions/map/r2.c b/src/extensions/map/r2.c index 3b4a195161b62f695bc971ec73ccaf0f5f36318d..a0cc962fe3ffbfa62608ede39a2dbfad2ba86cba 100644 --- a/src/extensions/map/r2.c +++ b/src/extensions/map/r2.c @@ -85,7 +85,12 @@ DEFINE_POLICY(CMDU_TYPE_TOPOLOGY_RESPONSE) = { }; DEFINE_POLICY(CMDU_TYPE_VENDOR_SPECIFIC) = { - /* user defined */ + [0] = { + .type = TLV_TYPE_VENDOR_SPECIFIC, + .present = TLV_PRESENT_ONE, + .minlen = 3, + }, + /* any number and/or type of tlvs may follow */ }; DEFINE_POLICY(CMDU_TYPE_LINK_METRIC_QUERY) = { diff --git a/src/extensions/map/r3.c b/src/extensions/map/r3.c index 9f4b90d17e74d68ad6067973452815c228f7bcbf..a5d5259530df39fe1f47d7b6e5bc29a9ae876c81 100644 --- a/src/extensions/map/r3.c +++ b/src/extensions/map/r3.c @@ -85,7 +85,12 @@ DEFINE_POLICY(CMDU_TYPE_TOPOLOGY_RESPONSE) = { }; DEFINE_POLICY(CMDU_TYPE_VENDOR_SPECIFIC) = { - /* user defined */ + [0] = { + .type = TLV_TYPE_VENDOR_SPECIFIC, + .present = TLV_PRESENT_ONE, + .minlen = 3, + }, + /* any number and/or type of tlvs may follow */ }; DEFINE_POLICY(CMDU_TYPE_LINK_METRIC_QUERY) = { diff --git a/src/extensions/map/r4.c b/src/extensions/map/r4.c index 77b3f4f5b442c76db8cdc01f7f72bbc7d9fe0efd..2c0cf8d63ed0c0d992a0692636ff0d924dd0b0f1 100644 --- a/src/extensions/map/r4.c +++ b/src/extensions/map/r4.c @@ -85,7 +85,12 @@ DEFINE_POLICY(CMDU_TYPE_TOPOLOGY_RESPONSE) = { }; DEFINE_POLICY(CMDU_TYPE_VENDOR_SPECIFIC) = { - /* user defined */ + [0] = { + .type = TLV_TYPE_VENDOR_SPECIFIC, + .present = TLV_PRESENT_ONE, + .minlen = 3, + }, + /* any number and/or type of tlvs may follow */ }; DEFINE_POLICY(CMDU_TYPE_LINK_METRIC_QUERY) = { diff --git a/src/extensions/map/r6.c b/src/extensions/map/r6.c index 5448bbc544b93ea726555d961ee4bb4c1e647865..41973409e44f9e4604a52cd0e21caa8baf6004ac 100644 --- a/src/extensions/map/r6.c +++ b/src/extensions/map/r6.c @@ -100,7 +100,12 @@ DEFINE_POLICY(CMDU_TYPE_TOPOLOGY_RESPONSE) = { }; DEFINE_POLICY(CMDU_TYPE_VENDOR_SPECIFIC) = { - /* user defined */ + [0] = { + .type = TLV_TYPE_VENDOR_SPECIFIC, + .present = TLV_PRESENT_ONE, + .minlen = 3, + }, + /* any number and/or type of tlvs may follow */ }; DEFINE_POLICY(CMDU_TYPE_LINK_METRIC_QUERY) = { diff --git a/src/extensions/map/tlv_checker.c b/src/extensions/map/tlv_checker.c index 88011ea11bc94b48fe4050bcb62980f22b161094..6dd20234a681a78345a07201ca94885104776a3d 100644 --- a/src/extensions/map/tlv_checker.c +++ b/src/extensions/map/tlv_checker.c @@ -74,6 +74,14 @@ int FUNC(TLV_TYPE_WSC)(const uint8_t *data, size_t datalen) return ret; } +int FUNC(TLV_TYPE_VENDOR_SPECIFIC)(const uint8_t *data, size_t datalen) +{ + if (datalen < 3) /* atleast oui size */ + return -1; + + return 0; +} + int FUNC(MAP_TLV_SUPPORTED_SERVICE)(const uint8_t *data, size_t datalen) { uint8_t num_services; @@ -1909,6 +1917,7 @@ int FUNC(MAP_TLV_EHT_OPERATIONS)(const uint8_t *data, size_t datalen) /* List of TLV validators */ struct tlv_validator tlv_validators[] = { DEFINE_VALIDATOR(TLV_TYPE_WSC), + DEFINE_VALIDATOR(TLV_TYPE_VENDOR_SPECIFIC), DEFINE_VALIDATOR(MAP_TLV_SUPPORTED_SERVICE), DEFINE_VALIDATOR(MAP_TLV_SEARCHED_SERVICE), DEFINE_VALIDATOR(MAP_TLV_AP_RADIO_IDENTIFIER), diff --git a/src/extensions/map/tlv_checker.h b/src/extensions/map/tlv_checker.h index 784cff8b76e37c6c629af9daf2a78f31793394e8..4c6335bc5a5e8c54c57f7f22df950f79a0b3036a 100644 --- a/src/extensions/map/tlv_checker.h +++ b/src/extensions/map/tlv_checker.h @@ -16,6 +16,7 @@ #define DECL(t) int validate_ ## t(const uint8_t *data, size_t datalen) DECL(TLV_TYPE_WSC); +DECL(TLV_TYPE_VENDOR_SPECIFIC); DECL(MAP_TLV_SUPPORTED_SERVICE); DECL(MAP_TLV_SEARCHED_SERVICE);