17c006017SMilanka Ringwald /* 27c006017SMilanka Ringwald * Copyright (C) 2019 BlueKitchen GmbH 37c006017SMilanka Ringwald * 47c006017SMilanka Ringwald * Redistribution and use in source and binary forms, with or without 57c006017SMilanka Ringwald * modification, are permitted provided that the following conditions 67c006017SMilanka Ringwald * are met: 77c006017SMilanka Ringwald * 87c006017SMilanka Ringwald * 1. Redistributions of source code must retain the above copyright 97c006017SMilanka Ringwald * notice, this list of conditions and the following disclaimer. 107c006017SMilanka Ringwald * 2. Redistributions in binary form must reproduce the above copyright 117c006017SMilanka Ringwald * notice, this list of conditions and the following disclaimer in the 127c006017SMilanka Ringwald * documentation and/or other materials provided with the distribution. 137c006017SMilanka Ringwald * 3. Neither the name of the copyright holders nor the names of 147c006017SMilanka Ringwald * contributors may be used to endorse or promote products derived 157c006017SMilanka Ringwald * from this software without specific prior written permission. 167c006017SMilanka Ringwald * 4. Any redistribution, use, or modification is done solely for 177c006017SMilanka Ringwald * personal benefit and not for any commercial purpose or for 187c006017SMilanka Ringwald * monetary gain. 197c006017SMilanka Ringwald * 207c006017SMilanka Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 217c006017SMilanka Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 227c006017SMilanka Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 232fca4dadSMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 242fca4dadSMilanka Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 257c006017SMilanka Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 267c006017SMilanka Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 277c006017SMilanka Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 287c006017SMilanka Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 297c006017SMilanka Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 307c006017SMilanka Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 317c006017SMilanka Ringwald * SUCH DAMAGE. 327c006017SMilanka Ringwald * 337c006017SMilanka Ringwald * Please inquire about commercial licensing options at 347c006017SMilanka Ringwald * [email protected] 357c006017SMilanka Ringwald * 367c006017SMilanka Ringwald */ 377c006017SMilanka Ringwald 38e501bae0SMatthias Ringwald #define BTSTACK_FILE__ "obex_message_builder.c" 397c006017SMilanka Ringwald 407c006017SMilanka Ringwald #include "btstack_config.h" 417c006017SMilanka Ringwald 427c006017SMilanka Ringwald #include <stdint.h> 437c006017SMilanka Ringwald #include <stdlib.h> 447c006017SMilanka Ringwald 457c006017SMilanka Ringwald #include "btstack_util.h" 467c006017SMilanka Ringwald #include "btstack_debug.h" 477c006017SMilanka Ringwald #include "classic/obex.h" 487c006017SMilanka Ringwald #include "classic/obex_message_builder.h" 497c006017SMilanka Ringwald 508460ee57SMatthias Ringwald static uint8_t obex_message_builder_packet_init(uint8_t * buffer, uint16_t buffer_len, uint8_t opcode_or_response_code){ 517c006017SMilanka Ringwald if (buffer_len < 3) return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; 528460ee57SMatthias Ringwald buffer[0] = opcode_or_response_code; 537c006017SMilanka Ringwald big_endian_store_16(buffer, 1, 3); 547c006017SMilanka Ringwald return ERROR_CODE_SUCCESS; 557c006017SMilanka Ringwald } 567c006017SMilanka Ringwald 577c006017SMilanka Ringwald static uint8_t obex_message_builder_packet_append(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t len){ 587c006017SMilanka Ringwald uint16_t pos = big_endian_read_16(buffer, 1); 597c006017SMilanka Ringwald if (buffer_len < pos + len) return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; 606535961aSMatthias Ringwald (void)memcpy(&buffer[pos], data, len); 617c006017SMilanka Ringwald pos += len; 627c006017SMilanka Ringwald big_endian_store_16(buffer, 1, pos); 637c006017SMilanka Ringwald return ERROR_CODE_SUCCESS; 647c006017SMilanka Ringwald } 657c006017SMilanka Ringwald 661f6020d5SMilanka Ringwald uint16_t obex_message_builder_get_message_length(uint8_t * buffer){ 671f6020d5SMilanka Ringwald return big_endian_read_16(buffer, 1); 681f6020d5SMilanka Ringwald } 691f6020d5SMilanka Ringwald 7081fb6ec9SMilanka Ringwald uint8_t obex_message_builder_header_add_byte(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint8_t value){ 7181fb6ec9SMilanka Ringwald uint8_t header[2]; 7281fb6ec9SMilanka Ringwald header[0] = header_type; 7381fb6ec9SMilanka Ringwald header[1] = value; 7481fb6ec9SMilanka Ringwald return obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); 7581fb6ec9SMilanka Ringwald } 7681fb6ec9SMilanka Ringwald 7781fb6ec9SMilanka Ringwald uint8_t obex_message_builder_header_add_word(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint32_t value){ 7881fb6ec9SMilanka Ringwald uint8_t header[5]; 7981fb6ec9SMilanka Ringwald header[0] = header_type; 8081fb6ec9SMilanka Ringwald big_endian_store_32(header, 1, value); 8181fb6ec9SMilanka Ringwald return obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); 8281fb6ec9SMilanka Ringwald } 8381fb6ec9SMilanka Ringwald 8481fb6ec9SMilanka Ringwald uint8_t obex_message_builder_header_add_variable(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, const uint8_t * header_data, uint16_t header_data_length){ 857c006017SMilanka Ringwald uint8_t header[3]; 867c006017SMilanka Ringwald header[0] = header_type; 877c006017SMilanka Ringwald big_endian_store_16(header, 1, sizeof(header) + header_data_length); 887c006017SMilanka Ringwald 897c006017SMilanka Ringwald uint8_t status = obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); 907c006017SMilanka Ringwald if (status != ERROR_CODE_SUCCESS) return status; 917c006017SMilanka Ringwald 927c006017SMilanka Ringwald return obex_message_builder_packet_append(buffer, buffer_len, header_data, header_data_length); 937c006017SMilanka Ringwald } 947c006017SMilanka Ringwald 9549df53afSSimon Budig uint8_t obex_message_builder_header_fillup_variable(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, const uint8_t * header_data, uint16_t header_data_length, uint32_t * ret_length){ 9649df53afSSimon Budig uint8_t header[3]; 9749df53afSSimon Budig header[0] = header_type; 98*8eaca332SSimon Budig uint16_t pos = big_endian_read_16(buffer, 1); 9949df53afSSimon Budig 100*8eaca332SSimon Budig if (sizeof (header) + header_data_length + pos > buffer_len) 101*8eaca332SSimon Budig header_data_length = buffer_len - pos - sizeof (header); 10249df53afSSimon Budig 10349df53afSSimon Budig big_endian_store_16(header, 1, sizeof(header) + header_data_length); 10449df53afSSimon Budig *ret_length = 0; 10549df53afSSimon Budig uint8_t status = obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); 10649df53afSSimon Budig if (status != ERROR_CODE_SUCCESS) return status; 10749df53afSSimon Budig 10849df53afSSimon Budig *ret_length = header_data_length; 10949df53afSSimon Budig return obex_message_builder_packet_append(buffer, buffer_len, header_data, header_data_length); 11049df53afSSimon Budig } 11149df53afSSimon Budig 1127c006017SMilanka Ringwald static uint8_t obex_message_builder_header_add_connection_id(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ 1137c006017SMilanka Ringwald // add connection_id header if set, must be first header if used 1147c006017SMilanka Ringwald if (obex_connection_id == OBEX_CONNECTION_ID_INVALID) return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE; 1157c006017SMilanka Ringwald return obex_message_builder_header_add_word(buffer, buffer_len, OBEX_HEADER_CONNECTION_ID, obex_connection_id); 1167c006017SMilanka Ringwald } 1177c006017SMilanka Ringwald 1181f6020d5SMilanka Ringwald static inline uint8_t obex_message_builder_create_connect(uint8_t * buffer, uint16_t buffer_len, uint8_t opcode, 1191f6020d5SMilanka Ringwald uint8_t obex_version_number, uint8_t flags, uint16_t maximum_obex_packet_length){ 1201f6020d5SMilanka Ringwald uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, opcode); 1217c006017SMilanka Ringwald if (status != ERROR_CODE_SUCCESS) return status; 1227c006017SMilanka Ringwald 1237c006017SMilanka Ringwald uint8_t fields[4]; 1247c006017SMilanka Ringwald fields[0] = obex_version_number; 1257c006017SMilanka Ringwald fields[1] = flags; 1267c006017SMilanka Ringwald big_endian_store_16(fields, 2, maximum_obex_packet_length); 1277c006017SMilanka Ringwald return obex_message_builder_packet_append(buffer, buffer_len, &fields[0], sizeof(fields)); 1287c006017SMilanka Ringwald } 1297c006017SMilanka Ringwald 1301f6020d5SMilanka Ringwald uint8_t obex_message_builder_request_create_connect(uint8_t * buffer, uint16_t buffer_len, 1311f6020d5SMilanka Ringwald uint8_t obex_version_number, uint8_t flags, uint16_t maximum_obex_packet_length){ 1321f6020d5SMilanka Ringwald 1331f6020d5SMilanka Ringwald return obex_message_builder_create_connect(buffer, buffer_len, OBEX_OPCODE_CONNECT, obex_version_number, flags, maximum_obex_packet_length); 1341f6020d5SMilanka Ringwald } 1351f6020d5SMilanka Ringwald 1361f6020d5SMilanka Ringwald uint8_t obex_message_builder_response_create_connect(uint8_t * buffer, uint16_t buffer_len, uint8_t obex_version_number, 1371f6020d5SMilanka Ringwald uint8_t flags, uint16_t maximum_obex_packet_length, uint32_t obex_connection_id){ 1381f6020d5SMilanka Ringwald 1391f6020d5SMilanka Ringwald uint8_t status = obex_message_builder_create_connect(buffer, buffer_len, OBEX_RESP_SUCCESS, obex_version_number, flags, maximum_obex_packet_length); 1401f6020d5SMilanka Ringwald if (status != ERROR_CODE_SUCCESS) return status; 1411f6020d5SMilanka Ringwald return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); 1421f6020d5SMilanka Ringwald } 1431f6020d5SMilanka Ringwald 1448460ee57SMatthias Ringwald uint8_t obex_message_builder_response_create_general(uint8_t * buffer, uint16_t buffer_len, uint8_t response_code){ 1458460ee57SMatthias Ringwald return obex_message_builder_packet_init(buffer, buffer_len, response_code); 14609ef1e1eSMatthias Ringwald } 14709ef1e1eSMatthias Ringwald 148c2e0c88eSMatthias Ringwald uint8_t obex_message_builder_response_update_code(uint8_t * buffer, uint16_t buffer_len, uint8_t response_code){ 149c2e0c88eSMatthias Ringwald if (buffer_len < 3) return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; 150c2e0c88eSMatthias Ringwald buffer[0] = response_code; 151c2e0c88eSMatthias Ringwald return ERROR_CODE_SUCCESS; 152c2e0c88eSMatthias Ringwald } 153c2e0c88eSMatthias Ringwald 1547c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_get(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ 1557c006017SMilanka Ringwald uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_GET | OBEX_OPCODE_FINAL_BIT_MASK); 1567c006017SMilanka Ringwald if (status != ERROR_CODE_SUCCESS) return status; 1577c006017SMilanka Ringwald return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); 1587c006017SMilanka Ringwald } 1597c006017SMilanka Ringwald 1607c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_put(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ 1617c006017SMilanka Ringwald uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_PUT | OBEX_OPCODE_FINAL_BIT_MASK); 1627c006017SMilanka Ringwald if (status != ERROR_CODE_SUCCESS) return status; 1637c006017SMilanka Ringwald 1647c006017SMilanka Ringwald return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); 1657c006017SMilanka Ringwald } 1667c006017SMilanka Ringwald 1677c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_set_path(uint8_t * buffer, uint16_t buffer_len, uint8_t flags, uint32_t obex_connection_id){ 1687c006017SMilanka Ringwald uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_SETPATH); 1697c006017SMilanka Ringwald if (status != ERROR_CODE_SUCCESS) return status; 1707c006017SMilanka Ringwald 1717c006017SMilanka Ringwald uint8_t fields[2]; 1727c006017SMilanka Ringwald fields[0] = flags; 1737c006017SMilanka Ringwald fields[1] = 0; // reserved 1747c006017SMilanka Ringwald status = obex_message_builder_packet_append(buffer, buffer_len, &fields[0], sizeof(fields)); 1757c006017SMilanka Ringwald if (status != ERROR_CODE_SUCCESS) return status; 1767c006017SMilanka Ringwald return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); 1777c006017SMilanka Ringwald } 1787c006017SMilanka Ringwald 1797c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_abort(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ 1807c006017SMilanka Ringwald uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_ABORT); 1817c006017SMilanka Ringwald if (status != ERROR_CODE_SUCCESS) return status; 1827c006017SMilanka Ringwald return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); 1837c006017SMilanka Ringwald } 1847c006017SMilanka Ringwald 1857c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_disconnect(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ 1867c006017SMilanka Ringwald uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_DISCONNECT); 1877c006017SMilanka Ringwald if (status != ERROR_CODE_SUCCESS) return status; 1887c006017SMilanka Ringwald return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); 1897c006017SMilanka Ringwald } 1907c006017SMilanka Ringwald 19149df53afSSimon Budig uint8_t obex_message_builder_set_final_bit (uint8_t * buffer, uint16_t buffer_len, bool final){ 19249df53afSSimon Budig if (buffer_len < 1) return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; 19349df53afSSimon Budig if (buffer[0] == OBEX_OPCODE_CONNECT || 19449df53afSSimon Budig buffer[0] == OBEX_OPCODE_DISCONNECT || 19549df53afSSimon Budig buffer[0] == OBEX_OPCODE_SETPATH || 19649df53afSSimon Budig buffer[0] == OBEX_OPCODE_SESSION || 19749df53afSSimon Budig buffer[0] == OBEX_OPCODE_ABORT){ 19849df53afSSimon Budig return ERROR_CODE_COMMAND_DISALLOWED; 19949df53afSSimon Budig } 20049df53afSSimon Budig buffer[0] &= ~OBEX_OPCODE_FINAL_BIT_MASK; 20149df53afSSimon Budig buffer[0] |= (final ? OBEX_OPCODE_FINAL_BIT_MASK : 0); 20249df53afSSimon Budig return ERROR_CODE_SUCCESS; 20349df53afSSimon Budig } 20449df53afSSimon Budig 2057c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_srm_enable(uint8_t * buffer, uint16_t buffer_len){ 2067c006017SMilanka Ringwald return obex_message_builder_header_add_byte(buffer, buffer_len, OBEX_HEADER_SINGLE_RESPONSE_MODE, OBEX_SRM_ENABLE); 2077c006017SMilanka Ringwald } 2087c006017SMilanka Ringwald 2097c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_target(uint8_t * buffer, uint16_t buffer_len, const uint8_t * target, uint16_t length){ 2107c006017SMilanka Ringwald return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_TARGET, target, length); 2117c006017SMilanka Ringwald } 2127c006017SMilanka Ringwald 2137c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_application_parameters(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length){ 2147c006017SMilanka Ringwald return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_APPLICATION_PARAMETERS, data, length); 2157c006017SMilanka Ringwald } 2167c006017SMilanka Ringwald 217c4466456SMilanka Ringwald uint8_t obex_message_builder_header_add_challenge_response(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length){ 2187c006017SMilanka Ringwald return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_AUTHENTICATION_RESPONSE, data, length); 2197c006017SMilanka Ringwald } 2207c006017SMilanka Ringwald 2211f6020d5SMilanka Ringwald uint8_t obex_message_builder_header_add_who(uint8_t * buffer, uint16_t buffer_len, const uint8_t * who){ 2221f6020d5SMilanka Ringwald return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_WHO, who, 16); 2231f6020d5SMilanka Ringwald } 2241f6020d5SMilanka Ringwald 225948b3642SMilanka Ringwald uint8_t obex_message_builder_body_add_static(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint32_t length){ 2267c006017SMilanka Ringwald return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_END_OF_BODY, data, length); 2277c006017SMilanka Ringwald } 2287c006017SMilanka Ringwald 22949df53afSSimon Budig uint8_t obex_message_builder_body_fillup_static(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint32_t length, uint32_t *ret_length){ 23049df53afSSimon Budig return obex_message_builder_header_fillup_variable(buffer, buffer_len, OBEX_HEADER_END_OF_BODY, data, length, ret_length); 23149df53afSSimon Budig } 23249df53afSSimon Budig 2332946c1e3SMatthias Ringwald uint8_t obex_message_builder_header_add_name_prefix(uint8_t * buffer, uint16_t buffer_len, const char * name, uint16_t name_len){ 23495f75094SMatthias Ringwald // non-empty string have trailing \0 23595f75094SMatthias Ringwald bool add_trailing_zero = name_len > 0; 23695f75094SMatthias Ringwald 23795f75094SMatthias Ringwald uint16_t header_len = 1 + 2 + (name_len * 2) + (add_trailing_zero ? 2 : 0); 23895f75094SMatthias Ringwald if (buffer_len < header_len) return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; 2397c006017SMilanka Ringwald 2407c006017SMilanka Ringwald uint16_t pos = big_endian_read_16(buffer, 1); 2417c006017SMilanka Ringwald buffer[pos++] = OBEX_HEADER_NAME; 24295f75094SMatthias Ringwald big_endian_store_16(buffer, pos, header_len); 2437c006017SMilanka Ringwald pos += 2; 2447c006017SMilanka Ringwald int i; 2457c006017SMilanka Ringwald // @note name[len] == 0 2462946c1e3SMatthias Ringwald for (i = 0 ; i < name_len ; i++){ 2477c006017SMilanka Ringwald buffer[pos++] = 0; 2487c006017SMilanka Ringwald buffer[pos++] = *name++; 2497c006017SMilanka Ringwald } 25095f75094SMatthias Ringwald if (add_trailing_zero){ 25195f75094SMatthias Ringwald buffer[pos++] = 0; 25295f75094SMatthias Ringwald buffer[pos++] = 0; 25395f75094SMatthias Ringwald } 2547c006017SMilanka Ringwald big_endian_store_16(buffer, 1, pos); 2557c006017SMilanka Ringwald return ERROR_CODE_SUCCESS; 2567c006017SMilanka Ringwald } 2572946c1e3SMatthias Ringwald uint8_t obex_message_builder_header_add_name(uint8_t * buffer, uint16_t buffer_len, const char * name){ 258b56e8b56SMatthias Ringwald uint16_t name_len = (uint16_t) strlen(name); 25995f75094SMatthias Ringwald return obex_message_builder_header_add_name_prefix(buffer, buffer_len, name, name_len); 2602946c1e3SMatthias Ringwald } 2617c006017SMilanka Ringwald 2627c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_type(uint8_t * buffer, uint16_t buffer_len, const char * type){ 2637c006017SMilanka Ringwald uint8_t header[3]; 2647c006017SMilanka Ringwald header[0] = OBEX_HEADER_TYPE; 265b56e8b56SMatthias Ringwald int len_incl_zero = (uint16_t) strlen(type) + 1; 2667c006017SMilanka Ringwald big_endian_store_16(header, 1, 1 + 2 + len_incl_zero); 2677c006017SMilanka Ringwald 2687c006017SMilanka Ringwald uint8_t status = obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); 2697c006017SMilanka Ringwald if (status != ERROR_CODE_SUCCESS) return status; 2707c006017SMilanka Ringwald return obex_message_builder_packet_append(buffer, buffer_len, (const uint8_t*)type, len_incl_zero); 2717c006017SMilanka Ringwald } 27249df53afSSimon Budig 27349df53afSSimon Budig uint8_t obex_message_builder_header_add_length(uint8_t * buffer, uint16_t buffer_len, uint32_t length){ 27449df53afSSimon Budig return obex_message_builder_header_add_word(buffer, buffer_len, OBEX_HEADER_LENGTH, length); 27549df53afSSimon Budig } 276