8cbf110d7b7d07a17dbcd47fe2e6c33a7cf46bd8
[olsrd.git] / src / defs.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 #ifndef _OLSR_DEFS
43 #define _OLSR_DEFS
44
45 /* Common includes */
46 #include <sys/time.h>
47 #include <sys/times.h>
48 #include <sys/socket.h>
49 #include <netinet/in.h>
50 #include <stdio.h>
51 #include <stdlib.h>
52 #include <string.h>
53 #include <errno.h>
54 #include <time.h>
55
56 #include "olsr_protocol.h"
57 #include "olsr_cfg.h"
58
59 extern const char olsrd_version[];
60 extern const char build_date[];
61 extern const char build_host[];
62
63 #ifndef OLSRD_GLOBAL_CONF_FILE
64 #define OLSRD_CONF_FILE_NAME    "olsrd.conf"
65 #define OLSRD_GLOBAL_CONF_FILE  "/etc/" OLSRD_CONF_FILE_NAME
66 #endif
67
68 #define MAXMESSAGESIZE          1500    /* max broadcast size */
69 #define UDP_IPV4_HDRSIZE        28
70 #define UDP_IPV6_HDRSIZE        62
71
72 #define MIN_PACKET_SIZE(ver)    ((int)(sizeof(uint8_t) * (((ver) == AF_INET) ? 4 : 7)))
73
74 /* Debug helper macro */
75 #ifdef DEBUG
76 #define olsr_debug(lvl, format, args...) do {                           \
77     OLSR_PRINTF(lvl, "%s (%s:%d): ", __func__, __FILE__, __LINE__);     \
78     OLSR_PRINTF(lvl, (format), ##args);                                 \
79   } while (0)
80 #endif
81
82 extern FILE *debug_handle;
83
84 #ifdef NODEBUG
85 #define OLSR_PRINTF(lvl, format, args...) do { } while(0)
86 #else
87 #define OLSR_PRINTF(lvl, format, args...) do {                    \
88     if((olsr_cnf->debug_level >= (lvl)) && debug_handle)          \
89       fprintf(debug_handle, (format), ##args);                    \
90   } while (0)
91 #endif
92
93 /*
94  * Provides a timestamp s1 milliseconds in the future according
95  * to system ticks returned by times(2)
96 */
97 #define GET_TIMESTAMP(s1)       (now_times + ((s1) / olsr_cnf->system_tick_divider))
98
99 /* Compute the time in milliseconds when a timestamp will expire. */
100 #define TIME_DUE(s1)   ((int)((s1) * olsr_cnf->system_tick_divider) - now_times)
101
102 /* Returns TRUE if a timestamp is expired */
103 #define TIMED_OUT(s1)   ((int)((s1) - now_times) < 0)
104
105 #define ARRAYSIZE(x)    (sizeof(x)/sizeof(*(x)))
106 #ifndef MAX
107 #define MAX(x,y)        ((x) > (y) ? (x) : (y))
108 #endif
109 #ifndef MIN
110 #define MIN(x,y)        ((x) < (y) ? (x) : (y))
111 #endif
112
113 #define INLINE inline __attribute__((always_inline))
114
115 /*
116  * On ARM, the compiler spits out additional warnings if called
117  * with -Wcast-align if you cast e.g. char* -> int*. While this
118  * is fine, most of that warnings are un-critical. Also the ARM
119  * CPU will throw BUS_ERROR if alignment does not fit. For this,
120  * we add an additional cast to (void *) to prevent the warning.
121  */
122 #define ARM_NOWARN_ALIGN void *
123
124 /*
125  * A somewhat safe version of strncpy and strncat. Note, that
126  * BSD/Solaris strlcpy()/strlcat() differ in implementation, while
127  * the BSD compiler prints out a warning if you use plain strcpy().
128  */
129
130 static INLINE char *
131 strscpy(char *dest, const char *src, size_t size)
132 {
133   register size_t l = 0;
134 #if !defined(NODEBUG) && defined(DEBUG)
135   if (sizeof(dest) == size)
136     fprintf(stderr, "Warning: probably sizeof(pointer) in strscpy(%p, %s, %zd)!\n", dest, src, size);
137   if (NULL == dest)
138     fprintf(stderr, "Warning: dest is NULL in strscpy!\n");
139   if (NULL == src)
140     fprintf(stderr, "Warning: src is NULL in strscpy!\n");
141 #endif
142   if (NULL != dest && NULL != src) {
143     /* src does not need to be null terminated */
144     if (0 < size--)
145       while (l < size && 0 != src[l])
146         l++;
147     dest[l] = 0;
148   }
149   return strncpy(dest, src, l);
150 }
151
152 static INLINE char *
153 strscat(char *dest, const char *src, size_t size)
154 {
155   register size_t l = strlen(dest);
156   return strscpy(dest + l, src, size > l ? size - l : 0);
157 }
158
159 /*
160  * Queueing macros
161  */
162
163 /* First "argument" is NOT a pointer! */
164
165 #define QUEUE_ELEM(pre, new) do { \
166     (pre).next->prev = (new);         \
167     (new)->next = (pre).next;         \
168     (new)->prev = &(pre);             \
169     (pre).next = (new);               \
170   } while (0)
171
172 #define DEQUEUE_ELEM(elem) do { \
173     (elem)->prev->next = (elem)->next;     \
174     (elem)->next->prev = (elem)->prev;     \
175   } while (0)
176
177 #define CLOSE(fd)  do { close(fd); (fd) = -1; } while (0)
178
179 /*
180  * Global olsrd configuragtion
181  */
182 extern struct olsrd_config *olsr_cnf;
183
184 /* Timer data */
185 extern clock_t now_times;              /* current idea of times(2) reported uptime */
186
187 #if defined WIN32
188 extern bool olsr_win32_end_request;
189 extern bool olsr_win32_end_flag;
190 #endif
191
192 /*
193  * a wrapper around times(2). times(2) has the problem, that it may return -1
194  * in case of an err (e.g. EFAULT on the parameter) or immediately before an
195  * overrun (though it is not en error) just because the jiffies (or whatever
196  * the underlying kernel calls the smallest accountable time unit) are
197  * inherently "unsigned" (and always incremented).
198  */
199 clock_t olsr_times(void);
200
201 /*
202  *IPC functions
203  *These are moved to a plugin soon
204  * soon... duh!
205  */
206
207 int ipc_init(void);
208
209 #if 0
210 int ipc_input(int);
211 #endif
212
213 int shutdown_ipc(void);
214
215 int ipc_output(struct olsr *);
216
217 #endif
218
219 /*
220  * Local Variables:
221  * c-basic-offset: 2
222  * indent-tabs-mode: nil
223  * End:
224  */