1 #ifndef __CEPH_DECODE_H
2 #define __CEPH_DECODE_H
4 #include <asm/unaligned.h>
10 * void **p pointer to position pointer
11 * void *end pointer to end of buffer (last byte + 1)
14 static inline u64 ceph_decode_64(void **p)
16 u64 v = get_unaligned_le64(*p);
20 static inline u32 ceph_decode_32(void **p)
22 u32 v = get_unaligned_le32(*p);
26 static inline u16 ceph_decode_16(void **p)
28 u16 v = get_unaligned_le16(*p);
32 static inline u8 ceph_decode_8(void **p)
38 static inline void ceph_decode_copy(void **p, void *pv, size_t n)
47 #define ceph_decode_need(p, end, n, bad) \
49 if (unlikely(*(p) + (n) > (end))) \
53 #define ceph_decode_64_safe(p, end, v, bad) \
55 ceph_decode_need(p, end, sizeof(u64), bad); \
56 v = ceph_decode_64(p); \
58 #define ceph_decode_32_safe(p, end, v, bad) \
60 ceph_decode_need(p, end, sizeof(u32), bad); \
61 v = ceph_decode_32(p); \
63 #define ceph_decode_16_safe(p, end, v, bad) \
65 ceph_decode_need(p, end, sizeof(u16), bad); \
66 v = ceph_decode_16(p); \
69 #define ceph_decode_copy_safe(p, end, pv, n, bad) \
71 ceph_decode_need(p, end, n, bad); \
72 ceph_decode_copy(p, pv, n); \
76 * struct ceph_timespec <-> struct timespec
78 static inline void ceph_decode_timespec(struct timespec *ts,
79 const struct ceph_timespec *tv)
81 ts->tv_sec = le32_to_cpu(tv->tv_sec);
82 ts->tv_nsec = le32_to_cpu(tv->tv_nsec);
84 static inline void ceph_encode_timespec(struct ceph_timespec *tv,
85 const struct timespec *ts)
87 tv->tv_sec = cpu_to_le32(ts->tv_sec);
88 tv->tv_nsec = cpu_to_le32(ts->tv_nsec);
92 * sockaddr_storage <-> ceph_sockaddr
94 static inline void ceph_encode_addr(struct ceph_entity_addr *a)
96 a->in_addr.ss_family = htons(a->in_addr.ss_family);
98 static inline void ceph_decode_addr(struct ceph_entity_addr *a)
100 a->in_addr.ss_family = ntohs(a->in_addr.ss_family);
101 WARN_ON(a->in_addr.ss_family == 512);
107 static inline void ceph_encode_64(void **p, u64 v)
109 put_unaligned_le64(v, (__le64 *)*p);
112 static inline void ceph_encode_32(void **p, u32 v)
114 put_unaligned_le32(v, (__le32 *)*p);
117 static inline void ceph_encode_16(void **p, u16 v)
119 put_unaligned_le16(v, (__le16 *)*p);
122 static inline void ceph_encode_8(void **p, u8 v)
127 static inline void ceph_encode_copy(void **p, const void *s, int len)
134 * filepath, string encoders
136 static inline void ceph_encode_filepath(void **p, void *end,
137 u64 ino, const char *path)
139 u32 len = path ? strlen(path) : 0;
140 BUG_ON(*p + sizeof(ino) + sizeof(len) + len > end);
142 ceph_encode_64(p, ino);
143 ceph_encode_32(p, len);
145 memcpy(*p, path, len);
149 static inline void ceph_encode_string(void **p, void *end,
150 const char *s, u32 len)
152 BUG_ON(*p + sizeof(len) + len > end);
153 ceph_encode_32(p, len);