1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
#ifndef UMP_COMMON_H
#define UMP_COMMON_H
#include <stddef.h>
#include <stdint.h>
#include <string.h>
/* Common macro without namespace */
#define SOCKADDR_IN(x) ((struct sockaddr_in*)(x))
#define SOCKADDR_IN6(x) ((struct sockaddr_in6*)(x))
static inline void ump_common_copy (
void* dest, const void* src, size_t len) {
uint8_t* dest_byte = dest;
const uint8_t* src_byte = src;
for (int i = 0; i < len; i++) {
dest_byte[i] = src_byte[i];
}
}
#define UMP_COMMON_MOVE_POINTER(x,offset) (((uint8_t*)(x)) + (offset))
#define UMP_COMMON_UINT8_ONE ((uint8_t)(1))
#define UMP_COMMON_IPV4_ADDRLEN 4
#define UMP_COMMON_IPV6_ADDRLEN 16
#define UMP_COMMON_DEFINE_GETTER(struct_type,func_ns,name,offset,type) \
static inline type func_ns ## _get_ ## name (struct_type* pkt) { \
type x; \
ump_common_copy (&x, UMP_COMMON_MOVE_POINTER (pkt, offset), \
sizeof (type) / sizeof (uint8_t)); \
return x; \
}
#define UMP_COMMON_DEFINE_SETTER(struct_type,func_ns,name,offset,type) \
static inline void func_ns ## _set_ ## name (struct_type* pkt, type x) { \
memcpy (UMP_COMMON_MOVE_POINTER (pkt, offset), &x, \
sizeof (type) / sizeof (uint8_t)); \
}
#define UMP_COMMON_DEFINE_BOTH(struct_type,func_ns,name,offset,type) \
UMP_COMMON_DEFINE_GETTER (struct_type,func_ns,name,offset,type) \
UMP_COMMON_DEFINE_SETTER (struct_type,func_ns,name,offset,type)
#define UMP_COMMON_DEFINE_GETTER_FLAG(struct_type,func_ns,name,offset,bit) \
static inline uint8_t func_ns ## _get_ ## name (struct_type* pkt) { \
uint8_t* x = UMP_COMMON_MOVE_POINTER (pkt, offset); \
return *x & (UMP_COMMON_UINT8_ONE << bit); \
}
#define UMP_COMMON_DEFINE_SETTER_FLAG(struct_type,func_ns,name,offset,bit) \
static inline void func_ns ## _set_ ## name (struct_type* pkt, uint8_t x) { \
uint8_t* d = UMP_COMMON_MOVE_POINTER (pkt, offset); \
if (x) { \
*d &= ~(UMP_COMMON_UINT8_ONE << bit); \
} else { \
*d |= (UMP_COMMON_UINT8_ONE << bit); \
} \
}
#define UMP_COMMON_DEFINE_BOTH_FLAG(struct_type,func_ns,name,offset,bit) \
UMP_COMMON_DEFINE_GETTER_FLAG (struct_type,func_ns,name,offset,bit) \
UMP_COMMON_DEFINE_SETTER_FLAG (struct_type,func_ns,name,offset,bit)
#endif /* UMP_COMMON_H */
|