numeric.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright 2023 Red Hat
  4. */
  5. #ifndef UDS_NUMERIC_H
  6. #define UDS_NUMERIC_H
  7. #include <linux/unaligned.h>
  8. #include <linux/kernel.h>
  9. #include <linux/types.h>
  10. /*
  11. * These utilities encode or decode a number from an offset in a larger data buffer and then
  12. * advance the offset pointer to the next field in the buffer.
  13. */
  14. static inline void decode_s64_le(const u8 *buffer, size_t *offset, s64 *decoded)
  15. {
  16. *decoded = get_unaligned_le64(buffer + *offset);
  17. *offset += sizeof(s64);
  18. }
  19. static inline void encode_s64_le(u8 *data, size_t *offset, s64 to_encode)
  20. {
  21. put_unaligned_le64(to_encode, data + *offset);
  22. *offset += sizeof(s64);
  23. }
  24. static inline void decode_u64_le(const u8 *buffer, size_t *offset, u64 *decoded)
  25. {
  26. *decoded = get_unaligned_le64(buffer + *offset);
  27. *offset += sizeof(u64);
  28. }
  29. static inline void encode_u64_le(u8 *data, size_t *offset, u64 to_encode)
  30. {
  31. put_unaligned_le64(to_encode, data + *offset);
  32. *offset += sizeof(u64);
  33. }
  34. static inline void decode_s32_le(const u8 *buffer, size_t *offset, s32 *decoded)
  35. {
  36. *decoded = get_unaligned_le32(buffer + *offset);
  37. *offset += sizeof(s32);
  38. }
  39. static inline void encode_s32_le(u8 *data, size_t *offset, s32 to_encode)
  40. {
  41. put_unaligned_le32(to_encode, data + *offset);
  42. *offset += sizeof(s32);
  43. }
  44. static inline void decode_u32_le(const u8 *buffer, size_t *offset, u32 *decoded)
  45. {
  46. *decoded = get_unaligned_le32(buffer + *offset);
  47. *offset += sizeof(u32);
  48. }
  49. static inline void encode_u32_le(u8 *data, size_t *offset, u32 to_encode)
  50. {
  51. put_unaligned_le32(to_encode, data + *offset);
  52. *offset += sizeof(u32);
  53. }
  54. static inline void decode_u16_le(const u8 *buffer, size_t *offset, u16 *decoded)
  55. {
  56. *decoded = get_unaligned_le16(buffer + *offset);
  57. *offset += sizeof(u16);
  58. }
  59. static inline void encode_u16_le(u8 *data, size_t *offset, u16 to_encode)
  60. {
  61. put_unaligned_le16(to_encode, data + *offset);
  62. *offset += sizeof(u16);
  63. }
  64. #endif /* UDS_NUMERIC_H */