Lines Matching +full:- +full:encoded
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
68 * skip_to_next_elem() - Skip to next element in the structure to be encoded
77 * Return: struct info of the next element that can be encoded.
89 tlv_type = temp_ei->tlv_type; in skip_to_next_elem()
91 } while (tlv_type == temp_ei->tlv_type); in skip_to_next_elem()
98 * qmi_calc_min_msg_len() - Calculate the minimum length of a QMI message
113 while (temp_ei->data_type != QMI_EOTI) { in qmi_calc_min_msg_len()
115 if (temp_ei->data_type == QMI_OPT_FLAG) { in qmi_calc_min_msg_len()
120 if (temp_ei->data_type == QMI_DATA_LEN) { in qmi_calc_min_msg_len()
121 min_msg_len += (temp_ei->elem_size == sizeof(u8) ? in qmi_calc_min_msg_len()
125 } else if (temp_ei->data_type == QMI_STRUCT) { in qmi_calc_min_msg_len()
126 min_msg_len += qmi_calc_min_msg_len(temp_ei->ei_array, in qmi_calc_min_msg_len()
129 } else if (temp_ei->data_type == QMI_STRING) { in qmi_calc_min_msg_len()
131 min_msg_len += temp_ei->elem_len <= U8_MAX ? in qmi_calc_min_msg_len()
133 min_msg_len += temp_ei->elem_len * temp_ei->elem_size; in qmi_calc_min_msg_len()
136 min_msg_len += (temp_ei->elem_len * temp_ei->elem_size); in qmi_calc_min_msg_len()
152 * qmi_encode_basic_elem() - Encodes elements of basic/primary data type
153 * @buf_dst: Buffer to store the encoded information.
154 * @buf_src: Buffer containing the elements to be encoded.
155 * @elem_len: Number of elements, in the buf_src, to be encoded.
156 * @elem_size: Size of a single instance of the element to be encoded.
160 * encoded information in the destination buffer "buf_dst". The elements are
161 * of primary data type which include u8 - u64 or similar. This
162 * function returns the number of bytes of encoded information.
164 * Return: The number of bytes of encoded information.
180 * qmi_encode_struct_elem() - Encodes elements of struct data type
182 * @buf_dst: Buffer to store the encoded information.
183 * @buf_src: Buffer containing the elements to be encoded.
184 * @elem_len: Number of elements, in the buf_src, to be encoded.
189 * size "ei_array->elem_size" bytes from the source buffer "buf_src" and
190 * stores the encoded information in the destination buffer "buf_dst". The
192 * function returns the number of bytes of encoded information.
194 * Return: The number of bytes of encoded information on success or negative
206 rc = qmi_encode(temp_ei->ei_array, buf_dst, buf_src, in qmi_encode_struct_elem()
207 out_buf_len - encoded_bytes, enc_level); in qmi_encode_struct_elem()
213 buf_src = buf_src + temp_ei->elem_size; in qmi_encode_struct_elem()
221 * qmi_encode_string_elem() - Encodes elements of string data type
223 * @buf_dst: Buffer to store the encoded information.
224 * @buf_src: Buffer containing the elements to be encoded.
228 * This function encodes a string element of maximum length "ei_array->elem_len"
229 * bytes from the source buffer "buf_src" and stores the encoded information in
231 * of encoded information.
233 * Return: The number of bytes of encoded information on success or negative
247 string_len_sz = temp_ei->elem_len <= U8_MAX ? in qmi_encode_string_elem()
249 if (string_len > temp_ei->elem_len) { in qmi_encode_string_elem()
250 pr_err("%s: String to be encoded is longer - %d > %d\n", in qmi_encode_string_elem()
251 __func__, string_len, temp_ei->elem_len); in qmi_encode_string_elem()
252 return -EINVAL; in qmi_encode_string_elem()
260 return -ETOOSMALL; in qmi_encode_string_elem()
266 return -ETOOSMALL; in qmi_encode_string_elem()
274 string_len, temp_ei->elem_size); in qmi_encode_string_elem()
281 * qmi_encode() - Core Encode Function
282 * @ei_array: Struct info array describing the structure to be encoded.
283 * @out_buf: Buffer to hold the encoded QMI message.
284 * @in_c_struct: Pointer to the C structure to be encoded.
287 * within the main structure, being encoded.
289 * Return: The number of bytes of encoded information on success or negative
316 while (temp_ei->data_type != QMI_EOTI) { in qmi_encode()
317 buf_src = in_c_struct + temp_ei->offset; in qmi_encode()
318 tlv_type = temp_ei->tlv_type; in qmi_encode()
320 if (temp_ei->array_type == NO_ARRAY) { in qmi_encode()
322 } else if (temp_ei->array_type == STATIC_ARRAY) { in qmi_encode()
323 data_len_value = temp_ei->elem_len; in qmi_encode()
325 temp_ei->elem_len < data_len_value) { in qmi_encode()
327 return -EINVAL; in qmi_encode()
330 switch (temp_ei->data_type) { in qmi_encode()
341 memcpy(&data_len_value, buf_src, temp_ei->elem_size); in qmi_encode()
342 data_len_sz = temp_ei->elem_size == sizeof(u8) ? in qmi_encode()
349 return -ETOOSMALL; in qmi_encode()
369 if (((data_len_value * temp_ei->elem_size) + in qmi_encode()
373 __func__, temp_ei->data_type); in qmi_encode()
374 return -ETOOSMALL; in qmi_encode()
378 temp_ei->elem_size); in qmi_encode()
387 out_buf_len - encoded_bytes, in qmi_encode()
398 out_buf_len - encoded_bytes, in qmi_encode()
408 return -EINVAL; in qmi_encode()
425 * qmi_decode_basic_elem() - Decodes elements of basic/primary data type
434 * of primary data type which include u8 - u64 or similar. This
453 * qmi_decode_struct_elem() - Decodes elements of struct data type
458 * @tlv_len: Total size of the encoded information corresponding to
480 rc = qmi_decode(temp_ei->ei_array, buf_dst, buf_src, in qmi_decode_struct_elem()
481 tlv_len - decoded_bytes, dec_level); in qmi_decode_struct_elem()
485 buf_dst = buf_dst + temp_ei->elem_size; in qmi_decode_struct_elem()
494 return -EFAULT; in qmi_decode_struct_elem()
501 * qmi_decode_string_elem() - Decodes elements of string data type
505 * @tlv_len: Total size of the encoded information corresponding to
510 * "ei_array->elem_len" from the source buffer "buf_src" and puts it into
530 string_len_sz = temp_ei->elem_len <= U8_MAX ? in qmi_decode_string_elem()
537 if (string_len >= temp_ei->elem_len) { in qmi_decode_string_elem()
539 __func__, string_len, temp_ei->elem_len); in qmi_decode_string_elem()
540 return -ETOOSMALL; in qmi_decode_string_elem()
544 return -EFAULT; in qmi_decode_string_elem()
548 string_len, temp_ei->elem_size); in qmi_decode_string_elem()
556 * find_ei() - Find element info corresponding to TLV Type
560 * Every element that got encoded in the QMI message will have a type
572 while (temp_ei->data_type != QMI_EOTI) { in find_ei()
573 if (temp_ei->tlv_type == (u8)type) in find_ei()
582 * qmi_decode() - Core Decode Function
609 if (dec_level >= 2 && temp_ei->data_type == QMI_EOTI) in qmi_decode()
621 return -EINVAL; in qmi_decode()
632 tlv_len = in_buf_len - decoded_bytes; in qmi_decode()
635 buf_dst = out_c_struct + temp_ei->offset; in qmi_decode()
636 if (temp_ei->data_type == QMI_OPT_FLAG) { in qmi_decode()
639 buf_dst = out_c_struct + temp_ei->offset; in qmi_decode()
642 if (temp_ei->data_type == QMI_DATA_LEN) { in qmi_decode()
643 data_len_sz = temp_ei->elem_size == sizeof(u8) ? in qmi_decode()
649 buf_dst = out_c_struct + temp_ei->offset; in qmi_decode()
650 tlv_len -= data_len_sz; in qmi_decode()
654 if (temp_ei->array_type == NO_ARRAY) { in qmi_decode()
656 } else if (temp_ei->array_type == STATIC_ARRAY) { in qmi_decode()
657 data_len_value = temp_ei->elem_len; in qmi_decode()
658 } else if (data_len_value > temp_ei->elem_len) { in qmi_decode()
660 __func__, data_len_value, temp_ei->elem_len); in qmi_decode()
661 return -ETOOSMALL; in qmi_decode()
664 switch (temp_ei->data_type) { in qmi_decode()
673 temp_ei->elem_size); in qmi_decode()
696 return -EINVAL; in qmi_decode()
705 * qmi_encode_message() - Encode C structure as QMI encoded message
713 * Return: Buffer with encoded message, or negative ERR_PTR() on error
730 return ERR_PTR(-EINVAL); in qmi_encode_message()
736 return ERR_PTR(-ENOMEM); in qmi_encode_message()
748 hdr->type = type; in qmi_encode_message()
749 hdr->txn_id = txn_id; in qmi_encode_message()
750 hdr->msg_id = msg_id; in qmi_encode_message()
751 hdr->msg_len = msglen; in qmi_encode_message()
760 * qmi_decode_message() - Decode QMI encoded message to C structure
761 * @buf: Buffer with encoded message
773 return -EINVAL; in qmi_decode_message()
776 return -EINVAL; in qmi_decode_message()
779 len - sizeof(struct qmi_header), 1); in qmi_decode_message()