]>
Commit | Line | Data |
---|---|---|
ca10883e DS |
1 | /* |
2 | Copyright (c) 2007, 2008 by Juliusz Chroboczek | |
3 | Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek | |
4 | ||
5 | Permission is hereby granted, free of charge, to any person obtaining a copy | |
6 | of this software and associated documentation files (the "Software"), to deal | |
7 | in the Software without restriction, including without limitation the rights | |
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
9 | copies of the Software, and to permit persons to whom the Software is | |
10 | furnished to do so, subject to the following conditions: | |
11 | ||
12 | The above copyright notice and this permission notice shall be included in | |
13 | all copies or substantial portions of the Software. | |
14 | ||
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
21 | THE SOFTWARE. | |
22 | */ | |
23 | ||
24 | #ifndef BABEL_UTIL_H | |
25 | #define BABEL_UTIL_H | |
26 | ||
27 | #include "babeld.h" | |
28 | #include "babel_main.h" | |
29 | #include "log.h" | |
8b7454e9 DL |
30 | #include "memory.h" |
31 | ||
bf8d3d6a | 32 | DECLARE_MGROUP(BABELD); |
ca10883e DS |
33 | |
34 | #if defined(i386) || defined(__mc68020__) || defined(__x86_64__) | |
35 | #define DO_NTOHS(_d, _s) do{ _d = ntohs(*(const unsigned short*)(_s)); }while(0) | |
36 | #define DO_NTOHL(_d, _s) do{ _d = ntohl(*(const unsigned*)(_s)); } while(0) | |
37 | #define DO_HTONS(_d, _s) do{ *(unsigned short*)(_d) = htons(_s); } while(0) | |
38 | #define DO_HTONL(_d, _s) do{ *(unsigned*)(_d) = htonl(_s); } while(0) | |
39 | /* Some versions of gcc seem to be buggy, and ignore the packed attribute. | |
40 | Disable this code until the issue is clarified. */ | |
41 | /* #elif defined __GNUC__*/ | |
42 | #else | |
43 | #define DO_NTOHS(_d, _s) \ | |
44 | do { short _dd; \ | |
45 | memcpy(&(_dd), (_s), 2); \ | |
46 | _d = ntohs(_dd); } while(0) | |
47 | #define DO_NTOHL(_d, _s) \ | |
48 | do { int _dd; \ | |
49 | memcpy(&(_dd), (_s), 4); \ | |
50 | _d = ntohl(_dd); } while(0) | |
51 | #define DO_HTONS(_d, _s) \ | |
52 | do { unsigned short _dd; \ | |
53 | _dd = htons(_s); \ | |
54 | memcpy((_d), &(_dd), 2); } while(0) | |
55 | #define DO_HTONL(_d, _s) \ | |
56 | do { unsigned _dd; \ | |
57 | _dd = htonl(_s); \ | |
58 | memcpy((_d), &(_dd), 4); } while(0) | |
59 | #endif | |
60 | ||
61 | static inline int | |
62 | seqno_compare(unsigned short s1, unsigned short s2) | |
63 | { | |
64 | if(s1 == s2) | |
65 | return 0; | |
66 | else | |
67 | return ((s2 - s1) & 0x8000) ? 1 : -1; | |
68 | } | |
69 | ||
70 | static inline short | |
71 | seqno_minus(unsigned short s1, unsigned short s2) | |
72 | { | |
73 | return (short)((s1 - s2) & 0xFFFF); | |
74 | } | |
75 | ||
76 | static inline unsigned short | |
77 | seqno_plus(unsigned short s, int plus) | |
78 | { | |
79 | return ((s + plus) & 0xFFFF); | |
80 | } | |
81 | ||
82 | /* Returns a time in microseconds on 32 bits (thus modulo 2^32, | |
83 | i.e. about 4295 seconds). */ | |
84 | static inline unsigned int | |
85 | time_us(const struct timeval t) | |
86 | { | |
87 | return (unsigned int) (t.tv_sec * 1000000 + t.tv_usec); | |
88 | } | |
89 | ||
90 | int roughly(int value); | |
91 | void timeval_minus(struct timeval *d, | |
92 | const struct timeval *s1, const struct timeval *s2); | |
93 | unsigned timeval_minus_msec(const struct timeval *s1, const struct timeval *s2) | |
94 | ATTRIBUTE ((pure)); | |
95 | void timeval_add_msec(struct timeval *d, const struct timeval *s, int msecs); | |
96 | void set_timeout (struct timeval *timeout, int msecs); | |
97 | int timeval_compare(const struct timeval *s1, const struct timeval *s2) | |
98 | ATTRIBUTE ((pure)); | |
99 | void timeval_min(struct timeval *d, const struct timeval *s); | |
100 | void timeval_min_sec(struct timeval *d, time_t secs); | |
101 | int parse_nat(const char *string) ATTRIBUTE ((pure)); | |
102 | int parse_msec(const char *string) ATTRIBUTE ((pure)); | |
ca10883e DS |
103 | unsigned char *mask_prefix(unsigned char *restrict ret, |
104 | const unsigned char *restrict prefix, | |
105 | unsigned char plen); | |
106 | const char *format_address(const unsigned char *address); | |
107 | const char *format_prefix(const unsigned char *address, unsigned char prefix); | |
108 | const char *format_eui64(const unsigned char *eui); | |
109 | const char *format_thousands(unsigned int value); | |
110 | int parse_address(const char *address, unsigned char *addr_r, int *af_r); | |
111 | int parse_eui64(const char *eui, unsigned char *eui_r); | |
112 | int wait_for_fd(int direction, int fd, int msecs); | |
113 | int martian_prefix(const unsigned char *prefix, int plen) ATTRIBUTE ((pure)); | |
114 | int linklocal(const unsigned char *address) ATTRIBUTE ((pure)); | |
115 | int v4mapped(const unsigned char *address) ATTRIBUTE ((pure)); | |
116 | void v4tov6(unsigned char *dst, const unsigned char *src); | |
117 | void inaddr_to_uchar(unsigned char *dest, const struct in_addr *src); | |
118 | void uchar_to_inaddr(struct in_addr *dest, const unsigned char *src); | |
119 | void in6addr_to_uchar(unsigned char *dest, const struct in6_addr *src); | |
120 | void uchar_to_in6addr(struct in6_addr *dest, const unsigned char *src); | |
121 | int daemonise(void); | |
b0ba81f8 | 122 | extern const unsigned char v4prefix[16]; |
ca10883e DS |
123 | |
124 | /* If debugging is disabled, we want to avoid calling format_address | |
125 | for every omitted debugging message. So debug is a macro. But | |
126 | vararg macros are not portable. */ | |
127 | #if defined NO_DEBUG | |
128 | ||
ca10883e | 129 | #define debugf(...) do {} while(0) |
ca10883e DS |
130 | |
131 | #else /* NO_DEBUG */ | |
132 | ||
133 | /* some levels */ | |
134 | #define BABEL_DEBUG_COMMON (1 << 0) | |
135 | #define BABEL_DEBUG_KERNEL (1 << 1) | |
136 | #define BABEL_DEBUG_FILTER (1 << 2) | |
137 | #define BABEL_DEBUG_TIMEOUT (1 << 3) | |
138 | #define BABEL_DEBUG_IF (1 << 4) | |
139 | #define BABEL_DEBUG_ROUTE (1 << 5) | |
140 | #define BABEL_DEBUG_ALL (0xFFFF) | |
141 | ||
ca10883e DS |
142 | #define debugf(level, ...) \ |
143 | do { \ | |
144 | if(UNLIKELY(debug & level)) zlog_debug(__VA_ARGS__); \ | |
145 | } while(0) | |
ca10883e DS |
146 | |
147 | #endif /* NO_DEBUG */ | |
148 | ||
149 | #endif /* BABEL_UTIL_H */ |