Merge branch 'release-0.6.5'
[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 /* OLSRD_GLOBAL_CONF_FILE */
67
68 #define MAXMESSAGESIZE          1500    /* max broadcast size */
69 #define UDP_IPV4_HDRSIZE        28
70 #define UDP_IPV6_HDRSIZE        62
71
72 /* Debug helper macro */
73 #ifdef DEBUG
74 #define olsr_debug(lvl, format, args...) do {                           \
75     OLSR_PRINTF(lvl, "%s (%s:%d): ", __func__, __FILE__, __LINE__);     \
76     OLSR_PRINTF(lvl, (format), ##args);                                 \
77   } while (0)
78 #endif /* DEBUG */
79
80 extern FILE *debug_handle;
81
82 #ifdef NODEBUG
83 #define OLSR_PRINTF(lvl, format, args...) do { } while(0)
84 #else /* NODEBUG */
85 #define OLSR_PRINTF(lvl, format, args...) do {                    \
86     if((olsr_cnf->debug_level >= (lvl)) && debug_handle)          \
87       fprintf(debug_handle, (format), ##args);                    \
88   } while (0)
89 #endif /* NODEBUG */
90
91 /*
92  * Provides a timestamp s1 milliseconds in the future according
93  * to system ticks returned by times(2)
94 */
95 #define GET_TIMESTAMP(s1)       olsr_getTimestamp(s1)
96
97 /* Compute the time in milliseconds when a timestamp will expire. */
98 #define TIME_DUE(s1)   olsr_getTimeDue(s1)
99
100 /* Returns TRUE if a timestamp is expired */
101 #define TIMED_OUT(s1)   olsr_isTimedOut(s1)
102
103 #ifndef ARRAYSIZE
104 #define ARRAYSIZE(x)    (sizeof(x)/sizeof(*(x)))
105 #endif /* ARRAYSIZE */
106 #ifndef MAX
107 #define MAX(x,y)        ((x) > (y) ? (x) : (y))
108 #endif /* MAX */
109 #ifndef MIN
110 #define MIN(x,y)        ((x) < (y) ? (x) : (y))
111 #endif /* MIN */
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(x) ((void *)(x))
123 #define CONST_ARM_NOWARN_ALIGN(x) ((const void *)(x))
124
125 /*
126  * A somewhat safe version of strncpy and strncat. Note, that
127  * BSD/Solaris strlcpy()/strlcat() differ in implementation, while
128  * the BSD compiler prints out a warning if you use plain strcpy().
129  */
130
131 static INLINE char *
132 strscpy(char *dest, const char *src, size_t size)
133 {
134   register size_t l = 0;
135 #if !defined(NODEBUG) && defined(DEBUG)
136   if (NULL == dest)
137     fprintf(stderr, "Warning: dest is NULL in strscpy!\n");
138   if (NULL == src)
139     fprintf(stderr, "Warning: src is NULL in strscpy!\n");
140 #endif /* !defined(NODEBUG) && defined(DEBUG) */
141   if (!dest || !src) {
142     return NULL;
143   }
144
145   /* src does not need to be null terminated */
146   if (0 < size--)
147     while (l < size && 0 != src[l])
148       l++;
149   dest[l] = 0;
150
151   return strncpy(dest, src, l);
152 }
153
154 static INLINE char *
155 strscat(char *dest, const char *src, size_t size)
156 {
157   register size_t l = strlen(dest);
158   return strscpy(dest + l, src, size > l ? size - l : 0);
159 }
160
161 /*
162  * Queueing macros
163  */
164
165 /* First "argument" is NOT a pointer! */
166
167 #define QUEUE_ELEM(pre, new) do { \
168     (pre).next->prev = (new);         \
169     (new)->next = (pre).next;         \
170     (new)->prev = &(pre);             \
171     (pre).next = (new);               \
172   } while (0)
173
174 #define DEQUEUE_ELEM(elem) do { \
175     (elem)->prev->next = (elem)->next;     \
176     (elem)->next->prev = (elem)->prev;     \
177   } while (0)
178
179 #define CLOSE(fd)  do { close(fd); (fd) = -1; } while (0)
180
181 /*
182  * Global olsrd configuragtion
183  */
184 extern struct olsrd_config *olsr_cnf;
185
186 /* Timer data */
187 extern uint32_t now_times;              /* current idea of times(2) reported uptime */
188 extern struct olsr_cookie_info *def_timer_ci;
189
190 #if defined _WIN32
191 extern bool olsr_win32_end_request;
192 extern bool olsr_win32_end_flag;
193 #endif /* defined _WIN32 */
194
195 /*
196  *IPC functions
197  *These are moved to a plugin soon
198  * soon... duh!
199  */
200
201 int ipc_init(void);
202
203 int shutdown_ipc(void);
204
205 int ipc_output(struct olsr *);
206
207 #endif /* _OLSR_DEFS */
208
209 /*
210  * Local Variables:
211  * c-basic-offset: 2
212  * indent-tabs-mode: nil
213  * End:
214  */