| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /* SPDX-License-Identifier: GPL-2.0-only */
- /*
- * Copyright 2023 Red Hat
- */
- #ifndef UDS_NUMERIC_H
- #define UDS_NUMERIC_H
- #include <linux/unaligned.h>
- #include <linux/kernel.h>
- #include <linux/types.h>
- /*
- * These utilities encode or decode a number from an offset in a larger data buffer and then
- * advance the offset pointer to the next field in the buffer.
- */
- static inline void decode_s64_le(const u8 *buffer, size_t *offset, s64 *decoded)
- {
- *decoded = get_unaligned_le64(buffer + *offset);
- *offset += sizeof(s64);
- }
- static inline void encode_s64_le(u8 *data, size_t *offset, s64 to_encode)
- {
- put_unaligned_le64(to_encode, data + *offset);
- *offset += sizeof(s64);
- }
- static inline void decode_u64_le(const u8 *buffer, size_t *offset, u64 *decoded)
- {
- *decoded = get_unaligned_le64(buffer + *offset);
- *offset += sizeof(u64);
- }
- static inline void encode_u64_le(u8 *data, size_t *offset, u64 to_encode)
- {
- put_unaligned_le64(to_encode, data + *offset);
- *offset += sizeof(u64);
- }
- static inline void decode_s32_le(const u8 *buffer, size_t *offset, s32 *decoded)
- {
- *decoded = get_unaligned_le32(buffer + *offset);
- *offset += sizeof(s32);
- }
- static inline void encode_s32_le(u8 *data, size_t *offset, s32 to_encode)
- {
- put_unaligned_le32(to_encode, data + *offset);
- *offset += sizeof(s32);
- }
- static inline void decode_u32_le(const u8 *buffer, size_t *offset, u32 *decoded)
- {
- *decoded = get_unaligned_le32(buffer + *offset);
- *offset += sizeof(u32);
- }
- static inline void encode_u32_le(u8 *data, size_t *offset, u32 to_encode)
- {
- put_unaligned_le32(to_encode, data + *offset);
- *offset += sizeof(u32);
- }
- static inline void decode_u16_le(const u8 *buffer, size_t *offset, u16 *decoded)
- {
- *decoded = get_unaligned_le16(buffer + *offset);
- *offset += sizeof(u16);
- }
- static inline void encode_u16_le(u8 *data, size_t *offset, u16 to_encode)
- {
- put_unaligned_le16(to_encode, data + *offset);
- *offset += sizeof(u16);
- }
- #endif /* UDS_NUMERIC_H */
|