diff --git a/src/cmdu_validate.c b/src/cmdu_validate.c index 13ba37367fe6e3fb814109f028f15f2d19dde9ae..c44418f310dbf62108b0b91e3c92ed5f59a3b461 100644 --- a/src/cmdu_validate.c +++ b/src/cmdu_validate.c @@ -267,8 +267,7 @@ static int check_wsc_tlv(struct tlv *t) return validate_wsc_m2(tv_data, tlv_len); } -/* Check 1905.1 AL MAC address type TLV */ -static int check_al_mac_addr_type_tlv(struct tlv *t) +static int check_serialized_tlv(struct tlv *t, uint16_t len) { uint8_t *tv_data; uint16_t tlv_len; @@ -278,8 +277,7 @@ static int check_al_mac_addr_type_tlv(struct tlv *t) tlv_len = tlv_length(t); - /* macaddr (6 bytes) */ - if (tlv_len != 6) + if (tlv_len != len) return -1; tv_data = (uint8_t *)t->data; @@ -289,158 +287,66 @@ static int check_al_mac_addr_type_tlv(struct tlv *t) return 0; } +/* Check 1905.1 AL MAC address type TLV */ +static int check_al_mac_addr_type_tlv(struct tlv *t) +{ + /* macaddr (6 bytes) */ + return check_serialized_tlv(t, 6); +} + /* Check AP Radio Indentifier TLV */ static int check_ap_radio_dentifier_tlv(struct tlv *t) { - uint8_t *tv_data; - uint16_t tlv_len; - - if (!t) - return -1; - - tlv_len = tlv_length(t); - /* bssid (6 bytes) */ - if (tlv_len != 6) - return -1; - - tv_data = (uint8_t *)t->data; - if (!tv_data) - return -1; - - return 0; + return check_serialized_tlv(t, 6); } /* Check Default 802.1Q Settings TLV */ static int check_default_11q_settings_tlv(struct tlv *t) { - struct tlv_default_8021q_settings *tlv; - uint16_t tlv_len; - - if (!t) - return -1; - - tlv_len = tlv_length(t); - /* pvid + pcp (3 bytes) */ - if (tlv_len != sizeof(struct tlv_default_8021q_settings)) - return -1; - - tlv = (struct tlv_default_8021q_settings *)t->data; - if (!tlv) - return -1; - - return 0; + return check_serialized_tlv(t, + sizeof(struct tlv_default_8021q_settings)); } /* Check SupportedFreqBand TLV */ static int check_supported_band_tlv(struct tlv *t) { - struct tlv_supported_band *tlv; - uint16_t tlv_len; - - if (!t) - return -1; - - tlv_len = tlv_length(t); - /* band (1 byte) */ - if (tlv_len != sizeof(struct tlv_supported_band)) - return -1; - - tlv = (struct tlv_supported_band *)t->data; - if (!tlv) - return -1; - - return 0; + return check_serialized_tlv(t, + sizeof(struct tlv_supported_band)); } /* Check SupportedRole TLV */ static int check_supported_role_tlv(struct tlv *t) { - struct tlv_supported_role *tlv; - uint16_t tlv_len; - - if (!t) - return -1; - - tlv_len = tlv_length(t); - /* role (1 byte) */ - if (tlv_len != sizeof(struct tlv_supported_role)) - return -1; - - tlv = (struct tlv_supported_role *)t->data; - if (!tlv) - return -1; - - return 0; + return check_serialized_tlv(t, + sizeof(struct tlv_supported_role)); } /* Check MultiAP Profile TLV */ static int check_map_profile_tlv(struct tlv *t) { - struct tlv_map_profile *tlv; - uint16_t tlv_len; - - if (!t) - return -1; - - tlv_len = tlv_length(t); - /* profile (1 byte) */ - if (tlv_len != sizeof(struct tlv_map_profile)) - return -1; - - tlv = (struct tlv_map_profile *)t->data; - if (!tlv) - return -1; - - return 0; + return check_serialized_tlv(t, + sizeof(struct tlv_map_profile)); } /* Check SearchedRole TLV */ static int check_searched_role_tlv(struct tlv *t) { - struct tlv_searched_role *tlv; - uint16_t tlv_len; - - if (!t) - return -1; - - tlv_len = tlv_length(t); - /* role (1 byte) */ - if (tlv_len != sizeof(struct tlv_searched_role)) - return -1; - - tlv = (struct tlv_searched_role *)t->data; - if (!tlv) - return -1; - - return 0; + return check_serialized_tlv(t, + sizeof(struct tlv_searched_role)); } /* Check AutoconfigFreqBand TLV */ static int check_autoconfig_freq_band_tlv(struct tlv *t) { - struct tlv_autoconfig_band *tlv; - uint16_t tlv_len; - - if (!t) - return -1; - - tlv_len = tlv_length(t); - /* band (1 byte) */ - if (tlv_len != sizeof(struct tlv_autoconfig_band)) - return -1; - - tlv = (struct tlv_autoconfig_band *)t->data; - if (!tlv) - return -1; - - return 0; + return check_serialized_tlv(t, + sizeof(struct tlv_autoconfig_band)); } /* Check Traffic Separation Policy TLV */ @@ -487,8 +393,8 @@ static int check_traffic_separation_policy_tlv(struct tlv *t) return 0; } -/* Check SupportedService TLV */ -static int check_supported_service_tlv(struct tlv *t) +/* Check service TLV */ +static int check_service_tlv(struct tlv *t) { int offset = 0; uint8_t num_services; @@ -516,33 +422,16 @@ static int check_supported_service_tlv(struct tlv *t) return 0; } +/* Check SupportedService TLV */ +static int check_supported_service_tlv(struct tlv *t) +{ + return check_service_tlv(t); +} + /* Check SearchedService TLV */ static int check_searched_service_tlv(struct tlv *t) { - int offset = 0; - uint8_t num_services; - uint8_t *tv_data; - uint16_t tlv_len; - - if (!t) - return -1; - - tlv_len = tlv_length(t); - /* at least 1 byte: num_services */ - if (tlv_len < 1) - return -1; - - tv_data = (uint8_t *)t->data; - if (!tv_data) - return -1; - - num_services = tv_data[offset++]; - - /* services (num_services bytes) */ - if (offset + num_services > tlv_len) - return -1; - - return 0; + return check_service_tlv(t); } bool validate_ap_autoconfig_wsc(struct cmdu_buff *cmdu, struct tlv *tv[][16])