Statistics
| Branch: | Revision:

iof-bird-daemon / lib / birdlib.h @ 9b0a0ba9

History | View | Annotate | Download (3.79 KB)

1
/*
2
 *        BIRD Library
3
 *
4
 *        (c) 1998--2004 Martin Mares <mj@ucw.cz>
5
 *
6
 *        Can be freely distributed and used under the terms of the GNU GPL.
7
 */
8

    
9
#ifndef _BIRD_BIRDLIB_H_
10
#define _BIRD_BIRDLIB_H_
11

    
12
#include "sysdep/unix/timer.h"
13
#include "lib/alloca.h"
14

    
15
/* Ugly structure offset handling macros */
16

    
17
#define OFFSETOF(s, i) ((size_t) &((s *)0)->i)
18
#define SKIP_BACK(s, i, p) ((s *)((char *)p - OFFSETOF(s, i)))
19
#define BIRD_ALIGN(s, a) (((s)+a-1)&~(a-1))
20

    
21
/* Utility macros */
22

    
23
#define MIN_(a,b) (((a)<(b))?(a):(b))
24
#define MAX_(a,b) (((a)>(b))?(a):(b))
25

    
26
#ifndef PARSER
27
#undef MIN
28
#undef MAX
29
#define MIN(a,b) MIN_(a,b)
30
#define MAX(a,b) MAX_(a,b)
31
#endif
32

    
33
#define U64(c) UINT64_C(c)
34
#define ABS(a)   ((a)>=0 ? (a) : -(a))
35
#define DELTA(a,b) (((a)>=(b))?(a)-(b):(b)-(a))
36
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(*(a)))
37
#define CALL(fn, args...) ({ if (fn) fn(args); })
38

    
39
static inline int uint_cmp(uint i1, uint i2)
40
{ return (int)(i1 > i2) - (int)(i1 < i2); }
41

    
42
static inline int u64_cmp(u64 i1, u64 i2)
43
{ return (int)(i1 > i2) - (int)(i1 < i2); }
44

    
45

    
46
/* Bitfield macros */
47

    
48
/* b is u32 array (or ptr), l is size of it in bits (multiple of 32), p is 0..(l-1) */
49
#define BIT32_VAL(p)                (((u32) 1) << ((p) % 32))
50
#define BIT32_TEST(b,p)                ((b)[(p)/32] & BIT32_VAL(p))
51
#define BIT32_SET(b,p)                ((b)[(p)/32] |= BIT32_VAL(p))
52
#define BIT32_CLR(b,p)                ((b)[(p)/32] &= ~BIT32_VAL(p))
53
#define BIT32_ZERO(b,l)                memset((b), 0, (l)/8)
54

    
55
#ifndef NULL
56
#define NULL ((void *) 0)
57
#endif
58

    
59
/* Macros for gcc attributes */
60

    
61
#define NORET __attribute__((noreturn))
62
#define UNUSED __attribute__((unused))
63
#define PACKED __attribute__((packed))
64

    
65
/* Microsecond time */
66

    
67
typedef s64 btime;
68

    
69
#define S_        *1000000
70
#define MS_        *1000
71
#define US_        *1
72
#define TO_S        /1000000
73
#define TO_MS        /1000
74
#define TO_US        /1
75

    
76
#ifndef PARSER
77
#define S        S_
78
#define MS        MS_
79
#define US        US_
80
#endif
81

    
82

    
83
/* Rate limiting */
84

    
85
struct tbf {
86
  bird_clock_t timestamp;                /* Last update */
87
  u16 count;                                /* Available tokens */
88
  u16 burst;                                /* Max number of tokens */
89
  u16 rate;                                /* Rate of replenishment */
90
  u16 mark;                                /* Whether last op was limited */
91
};
92

    
93
/* Default TBF values for rate limiting log messages */
94
#define TBF_DEFAULT_LOG_LIMITS { .rate = 1, .burst = 5 }
95

    
96
void tbf_update(struct tbf *f);
97

    
98
static inline int
99
tbf_limit(struct tbf *f)
100
{
101
  tbf_update(f);
102

    
103
  if (!f->count)
104
  {
105
    f->mark = 1;
106
    return 1;
107
  }
108

    
109
  f->count--;
110
  f->mark = 0;
111
  return 0;
112
}
113

    
114

    
115
/* Logging and dying */
116

    
117
typedef struct buffer {
118
  byte *start;
119
  byte *pos;
120
  byte *end;
121
} buffer;
122

    
123
#define STACK_BUFFER_INIT(buf,size)                \
124
  do {                                                \
125
    buf.start = alloca(size);                        \
126
    buf.pos = buf.start;                        \
127
    buf.end = buf.start + size;                        \
128
  } while(0)
129

    
130
#define LOG_BUFFER_INIT(buf)                        \
131
  STACK_BUFFER_INIT(buf, LOG_BUFFER_SIZE)
132

    
133
#define LOG_BUFFER_SIZE 1024
134

    
135
#define log log_msg
136
void log_commit(int class, buffer *buf);
137
void log_msg(const char *msg, ...);
138
void log_rl(struct tbf *rl, const char *msg, ...);
139
void die(const char *msg, ...) NORET;
140
void bug(const char *msg, ...) NORET;
141

    
142
#define L_DEBUG "\001"                        /* Debugging messages */
143
#define L_TRACE "\002"                        /* Protocol tracing */
144
#define L_INFO "\003"                        /* Informational messages */
145
#define L_REMOTE "\004"                        /* Remote protocol errors */
146
#define L_WARN "\005"                        /* Local warnings */
147
#define L_ERR "\006"                        /* Local errors */
148
#define L_AUTH "\007"                        /* Authorization failed etc. */
149
#define L_FATAL "\010"                        /* Fatal errors */
150
#define L_BUG "\011"                        /* BIRD bugs */
151

    
152
void debug(const char *msg, ...);        /* Printf to debug output */
153

    
154
/* Debugging */
155

    
156
#if defined(LOCAL_DEBUG) || defined(GLOBAL_DEBUG)
157
#define DBG(x, y...) debug(x, ##y)
158
#else
159
#define DBG(x, y...) do { } while(0)
160
#endif
161

    
162
#ifdef DEBUGGING
163
#define ASSERT(x) do { if (!(x)) bug("Assertion `%s' failed at %s:%d", #x, __FILE__, __LINE__); } while(0)
164
#else
165
#define ASSERT(x) do { } while(0)
166
#endif
167

    
168
/* Pseudorandom numbers */
169

    
170
u32 random_u32(void);
171

    
172
#endif