~ubuntu-branches/ubuntu/breezy/quagga/breezy-security

« back to all changes in this revision

Viewing changes to lib/zebra.h

  • Committer: Bazaar Package Importer
  • Author(s): Andreas Mueller
  • Date: 2005-05-20 13:16:12 UTC
  • Revision ID: james.westby@ubuntu.com-20050520131612-pr6paalox60o3x3n
Tags: upstream-0.99.1
ImportĀ upstreamĀ versionĀ 0.99.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Zebra common header.
 
2
   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Kunihiro Ishiguro
 
3
 
 
4
This file is part of GNU Zebra.
 
5
 
 
6
GNU Zebra is free software; you can redistribute it and/or modify it
 
7
under the terms of the GNU General Public License as published by the
 
8
Free Software Foundation; either version 2, or (at your option) any
 
9
later version.
 
10
 
 
11
GNU Zebra is distributed in the hope that it will be useful, but
 
12
WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
14
General Public License for more details.
 
15
 
 
16
You should have received a copy of the GNU General Public License
 
17
along with GNU Zebra; see the file COPYING.  If not, write to the Free
 
18
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 
19
02111-1307, USA.  */
 
20
 
 
21
#ifndef _ZEBRA_H
 
22
#define _ZEBRA_H
 
23
 
 
24
#ifdef HAVE_CONFIG_H
 
25
#include "config.h"
 
26
#endif /* HAVE_CONFIG_H */
 
27
 
 
28
#ifdef GNU_LINUX
 
29
#define _GNU_SOURCE
 
30
#endif /* GNU_LINUX */
 
31
 
 
32
#ifdef SUNOS_5
 
33
#define _XPG4_2
 
34
#define __EXTENSIONS__
 
35
typedef unsigned int    u_int32_t;
 
36
typedef unsigned short  u_int16_t;
 
37
typedef unsigned char   u_int8_t;
 
38
#endif /* SUNOS_5 */
 
39
 
 
40
#ifndef HAVE_SOCKLEN_T
 
41
typedef int socklen_t;
 
42
#endif /* HAVE_SOCKLEN_T */
 
43
 
 
44
#include <unistd.h>
 
45
#include <stdio.h>
 
46
#include <stdlib.h>
 
47
#include <ctype.h>
 
48
#include <errno.h>
 
49
#include <fcntl.h>
 
50
#include <signal.h>
 
51
#include <string.h>
 
52
#include <pwd.h>
 
53
#include <grp.h>
 
54
#ifdef HAVE_STROPTS_H
 
55
#include <stropts.h>
 
56
#endif /* HAVE_STROPTS_H */
 
57
#include <sys/fcntl.h>
 
58
#ifdef HAVE_SYS_SELECT_H
 
59
#include <sys/select.h>
 
60
#endif /* HAVE_SYS_SELECT_H */
 
61
#include <sys/stat.h>
 
62
#include <sys/time.h>
 
63
#include <sys/types.h>
 
64
#include <sys/param.h>
 
65
#ifdef HAVE_SYS_SYSCTL_H
 
66
#include <sys/sysctl.h>
 
67
#endif /* HAVE_SYS_SYSCTL_H */
 
68
#include <sys/ioctl.h>
 
69
#ifdef HAVE_SYS_CONF_H
 
70
#include <sys/conf.h>
 
71
#endif /* HAVE_SYS_CONF_H */
 
72
#ifdef HAVE_SYS_KSYM_H
 
73
#include <sys/ksym.h>
 
74
#endif /* HAVE_SYS_KSYM_H */
 
75
#include <syslog.h>
 
76
#include <time.h>
 
77
#include <sys/uio.h>
 
78
#include <sys/utsname.h>
 
79
#ifdef HAVE_RUSAGE
 
80
#include <sys/resource.h>
 
81
#endif /* HAVE_RUSAGE */
 
82
#ifdef HAVE_LIMITS_H
 
83
#include <limits.h>
 
84
#endif /* HAVE_LIMITS_H */
 
85
 
 
86
/* machine dependent includes */
 
87
#ifdef SUNOS_5
 
88
#include <strings.h>
 
89
#endif /* SUNOS_5 */
 
90
 
 
91
/* machine dependent includes */
 
92
#ifdef HAVE_LINUX_VERSION_H
 
93
#include <linux/version.h>
 
94
#endif /* HAVE_LINUX_VERSION_H */
 
95
 
 
96
#ifdef HAVE_ASM_TYPES_H
 
97
#include <asm/types.h>
 
98
#endif /* HAVE_ASM_TYPES_H */
 
99
 
 
100
/* misc include group */
 
101
#include <stdarg.h>
 
102
#if !(defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
 
103
/* Not C99; do we need to define va_copy? */
 
104
#ifndef va_copy
 
105
#ifdef __va_copy
 
106
#define va_copy(DST,SRC) __va_copy(DST,SRC)
 
107
#else
 
108
/* Now we are desperate; this should work on many typical platforms. 
 
109
   But this is slightly dangerous, because the standard does not require
 
110
   va_copy to be a macro. */
 
111
#define va_copy(DST,SRC) memcpy(&(DST), &(SRC), sizeof(va_list))
 
112
#warning "Not C99 and no va_copy macro available, falling back to memcpy"
 
113
#endif /* __va_copy */
 
114
#endif /* !va_copy */
 
115
#endif /* !C99 */
 
116
 
 
117
 
 
118
#ifdef HAVE_LCAPS
 
119
#include <sys/capability.h>
 
120
#include <sys/prctl.h>
 
121
#endif /* HAVE_LCAPS */
 
122
 
 
123
/* network include group */
 
124
 
 
125
#include <sys/socket.h>
 
126
 
 
127
#ifdef HAVE_SYS_SOCKIO_H
 
128
#include <sys/sockio.h>
 
129
#endif /* HAVE_SYS_SOCKIO_H */
 
130
 
 
131
#ifdef HAVE_NETINET_IN_H
 
132
#include <netinet/in.h>
 
133
#endif /* HAVE_NETINET_IN_H */
 
134
#include <netinet/in_systm.h>
 
135
#include <netinet/ip.h>
 
136
#include <netinet/tcp.h>
 
137
 
 
138
#ifdef HAVE_NET_NETOPT_H
 
139
#include <net/netopt.h>
 
140
#endif /* HAVE_NET_NETOPT_H */
 
141
 
 
142
#include <net/if.h>
 
143
 
 
144
#ifdef HAVE_NET_IF_DL_H
 
145
#include <net/if_dl.h>
 
146
#endif /* HAVE_NET_IF_DL_H */
 
147
 
 
148
#ifdef HAVE_NET_IF_VAR_H
 
149
#include <net/if_var.h>
 
150
#endif /* HAVE_NET_IF_VAR_H */
 
151
 
 
152
#ifdef HAVE_NET_ROUTE_H
 
153
#include <net/route.h>
 
154
#endif /* HAVE_NET_ROUTE_H */
 
155
 
 
156
#ifdef HAVE_NETLINK
 
157
#include <linux/netlink.h>
 
158
#include <linux/rtnetlink.h>
 
159
#else
 
160
#define RT_TABLE_MAIN           0
 
161
#endif /* HAVE_NETLINK */
 
162
 
 
163
#ifdef HAVE_NETDB_H
 
164
#include <netdb.h>
 
165
#endif /* HAVE_NETDB_H */
 
166
 
 
167
#include <arpa/inet.h>
 
168
 
 
169
#ifdef HAVE_INET_ND_H
 
170
#include <inet/nd.h>
 
171
#endif /* HAVE_INET_ND_H */
 
172
 
 
173
#ifdef HAVE_NETINET_IN_VAR_H
 
174
#include <netinet/in_var.h>
 
175
#endif /* HAVE_NETINET_IN_VAR_H */
 
176
 
 
177
#ifdef HAVE_NETINET6_IN6_VAR_H
 
178
#include <netinet6/in6_var.h>
 
179
#endif /* HAVE_NETINET6_IN6_VAR_H */
 
180
 
 
181
#ifdef HAVE_NETINET_IN6_VAR_H
 
182
#include <netinet/in6_var.h>
 
183
#endif /* HAVE_NETINET_IN6_VAR_H */
 
184
 
 
185
#ifdef HAVE_NETINET6_IN_H
 
186
#include <netinet6/in.h>
 
187
#endif /* HAVE_NETINET6_IN_H */
 
188
 
 
189
 
 
190
#ifdef HAVE_NETINET6_IP6_H
 
191
#include <netinet6/ip6.h>
 
192
#endif /* HAVE_NETINET6_IP6_H */
 
193
 
 
194
#ifdef HAVE_NETINET_ICMP6_H
 
195
#include <netinet/icmp6.h>
 
196
#endif /* HAVE_NETINET_ICMP6_H */
 
197
 
 
198
#ifdef HAVE_NETINET6_ND6_H
 
199
#include <netinet6/nd6.h>
 
200
#endif /* HAVE_NETINET6_ND6_H */
 
201
 
 
202
/* Some systems do not define UINT32_MAX */
 
203
#ifndef UINT32_MAX
 
204
#define UINT32_MAX 0xFFFFFFFFU
 
205
#endif /* UINT32_MAX */
 
206
 
 
207
#ifdef HAVE_LIBUTIL_H
 
208
#include <libutil.h>
 
209
#endif /* HAVE_LIBUTIL_H */
 
210
 
 
211
#ifdef HAVE_GLIBC_BACKTRACE
 
212
#include <execinfo.h>
 
213
#endif /* HAVE_GLIBC_BACKTRACE */
 
214
 
 
215
#ifdef BSDI_NRL
 
216
 
 
217
#ifdef HAVE_NETINET6_IN6_H
 
218
#include <netinet6/in6.h>
 
219
#endif /* HAVE_NETINET6_IN6_H */
 
220
 
 
221
#ifdef NRL
 
222
#include <netinet6/in6.h>
 
223
#endif /* NRL */
 
224
 
 
225
#define IN6_ARE_ADDR_EQUAL IN6_IS_ADDR_EQUAL
 
226
 
 
227
#endif /* BSDI_NRL */
 
228
 
 
229
/* Local includes: */
 
230
#if !(defined(__GNUC__) || defined(VTYSH_EXTRACT_PL)) 
 
231
#define __attribute__(x)
 
232
#endif  /* !__GNUC__ || VTYSH_EXTRACT_PL */
 
233
 
 
234
#include "zassert.h"
 
235
#include "str.h"
 
236
 
 
237
 
 
238
#ifdef HAVE_BROKEN_CMSG_FIRSTHDR
 
239
/* This bug is present in Solaris 8 and pre-patch Solaris 9 <sys/socket.h>;
 
240
   please refer to http://bugzilla.quagga.net/show_bug.cgi?id=142 */
 
241
 
 
242
/* Check that msg_controllen is large enough. */
 
243
#define ZCMSG_FIRSTHDR(mhdr) \
 
244
  (((size_t)((mhdr)->msg_controllen) >= sizeof(struct cmsghdr)) ? \
 
245
   CMSG_FIRSTHDR(mhdr) : (struct cmsghdr *)NULL)
 
246
 
 
247
#warning "CMSG_FIRSTHDR is broken on this platform, using a workaround"
 
248
 
 
249
#else /* HAVE_BROKEN_CMSG_FIRSTHDR */
 
250
#define ZCMSG_FIRSTHDR(M) CMSG_FIRSTHDR(M)
 
251
#endif /* HAVE_BROKEN_CMSG_FIRSTHDR */
 
252
 
 
253
 
 
254
 
 
255
/* 
 
256
 * RFC 3542 defines several macros for using struct cmsghdr.
 
257
 * Here, we define those that are not present
 
258
 */
 
259
 
 
260
/*
 
261
 * Internal defines, for use only in this file.
 
262
 * These are likely wrong on other than ILP32 machines, so warn.
 
263
 */
 
264
#ifndef _CMSG_DATA_ALIGN
 
265
#define _CMSG_DATA_ALIGN(n)           (((n) + 3) & ~3)
 
266
#endif /* _CMSG_DATA_ALIGN */
 
267
 
 
268
#ifndef _CMSG_HDR_ALIGN
 
269
#define _CMSG_HDR_ALIGN(n)            (((n) + 3) & ~3)
 
270
#endif /* _CMSG_HDR_ALIGN */
 
271
 
 
272
/*
 
273
 * CMSG_SPACE and CMSG_LEN are required in RFC3542, but were new in that
 
274
 * version.
 
275
 */
 
276
#ifndef CMSG_SPACE
 
277
#define CMSG_SPACE(l)       (_CMSG_DATA_ALIGN(sizeof(struct cmsghdr)) + \
 
278
                              _CMSG_HDR_ALIGN(l))
 
279
#warning "assuming 4-byte alignment for CMSG_SPACE"
 
280
#endif  /* CMSG_SPACE */
 
281
 
 
282
 
 
283
#ifndef CMSG_LEN
 
284
#define CMSG_LEN(l)         (_CMSG_DATA_ALIGN(sizeof(struct cmsghdr)) + (l))
 
285
#warning "assuming 4-byte alignment for CMSG_LEN"
 
286
#endif /* CMSG_LEN */
 
287
 
 
288
 
 
289
/*  The definition of struct in_pktinfo is missing in old version of
 
290
    GLIBC 2.1 (Redhat 6.1).  */
 
291
#if defined (GNU_LINUX) && ! defined (HAVE_INPKTINFO)
 
292
struct in_pktinfo
 
293
{
 
294
  int ipi_ifindex;
 
295
  struct in_addr ipi_spec_dst;
 
296
  struct in_addr ipi_addr;
 
297
};
 
298
#endif
 
299
 
 
300
/* 
 
301
 * OSPF Fragmentation / fragmented writes
 
302
 *
 
303
 * ospfd can support writing fragmented packets, for cases where
 
304
 * kernel will not fragment IP_HDRINCL and/or multicast destined
 
305
 * packets (ie TTBOMK all kernels, BSD, SunOS, Linux). However,
 
306
 * SunOS, probably BSD too, clobber the user supplied IP ID and IP
 
307
 * flags fields, hence user-space fragmentation will not work.
 
308
 * Only Linux is known to leave IP header unmolested.
 
309
 * Further, fragmentation really should be done the kernel, which already
 
310
 * supports it, and which avoids nasty IP ID state problems.
 
311
 *
 
312
 * Fragmentation of OSPF packets can be required on networks with router
 
313
 * with many many interfaces active in one area, or on networks with links
 
314
 * with low MTUs.
 
315
 */
 
316
#ifdef GNU_LINUX
 
317
#define WANT_OSPF_WRITE_FRAGMENT
 
318
#endif
 
319
 
 
320
/* 
 
321
 * IP_HDRINCL / struct ip byte order
 
322
 *
 
323
 * Linux: network byte order
 
324
 * *BSD: network, except for length and offset. (cf Stevens)
 
325
 * SunOS: nominally as per BSD. but bug: network order on LE.
 
326
 * OpenBSD: network byte order, apart from older versions which are as per 
 
327
 *          *BSD
 
328
 */
 
329
#if defined(__NetBSD__) || defined(__FreeBSD__) \
 
330
   || (defined(__OpenBSD__) && (OpenBSD < 200311)) \
 
331
   || (defined(SUNOS_5) && defined(WORDS_BIGENDIAN))
 
332
#define HAVE_IP_HDRINCL_BSD_ORDER
 
333
#endif
 
334
 
 
335
/* MAX / MIN are not commonly defined, but useful */
 
336
#ifndef MAX
 
337
#define MAX(a, b) ((a) > (b) ? (a) : (b))
 
338
#endif 
 
339
#ifndef MIN
 
340
#define MIN(a, b) ((a) < (b) ? (a) : (b))
 
341
#endif
 
342
 
 
343
/* For old definition. */
 
344
#ifndef IN6_ARE_ADDR_EQUAL
 
345
#define IN6_ARE_ADDR_EQUAL IN6_IS_ADDR_EQUAL
 
346
#endif /* IN6_ARE_ADDR_EQUAL */
 
347
 
 
348
/* Zebra message types. */
 
349
#define ZEBRA_INTERFACE_ADD                1
 
350
#define ZEBRA_INTERFACE_DELETE             2
 
351
#define ZEBRA_INTERFACE_ADDRESS_ADD        3
 
352
#define ZEBRA_INTERFACE_ADDRESS_DELETE     4
 
353
#define ZEBRA_INTERFACE_UP                 5
 
354
#define ZEBRA_INTERFACE_DOWN               6
 
355
#define ZEBRA_IPV4_ROUTE_ADD               7
 
356
#define ZEBRA_IPV4_ROUTE_DELETE            8
 
357
#define ZEBRA_IPV6_ROUTE_ADD               9
 
358
#define ZEBRA_IPV6_ROUTE_DELETE           10
 
359
#define ZEBRA_REDISTRIBUTE_ADD            11
 
360
#define ZEBRA_REDISTRIBUTE_DELETE         12
 
361
#define ZEBRA_REDISTRIBUTE_DEFAULT_ADD    13
 
362
#define ZEBRA_REDISTRIBUTE_DEFAULT_DELETE 14
 
363
#define ZEBRA_IPV4_NEXTHOP_LOOKUP         15
 
364
#define ZEBRA_IPV6_NEXTHOP_LOOKUP         16
 
365
#define ZEBRA_IPV4_IMPORT_LOOKUP          17
 
366
#define ZEBRA_IPV6_IMPORT_LOOKUP          18
 
367
#define ZEBRA_INTERFACE_RENAME            19
 
368
#define ZEBRA_ROUTER_ID_ADD               20
 
369
#define ZEBRA_ROUTER_ID_DELETE            21
 
370
#define ZEBRA_ROUTER_ID_UPDATE            22
 
371
#define ZEBRA_MESSAGE_MAX                 23
 
372
 
 
373
/* Zebra route's types. */
 
374
#define ZEBRA_ROUTE_SYSTEM               0
 
375
#define ZEBRA_ROUTE_KERNEL               1
 
376
#define ZEBRA_ROUTE_CONNECT              2
 
377
#define ZEBRA_ROUTE_STATIC               3
 
378
#define ZEBRA_ROUTE_RIP                  4
 
379
#define ZEBRA_ROUTE_RIPNG                5
 
380
#define ZEBRA_ROUTE_OSPF                 6
 
381
#define ZEBRA_ROUTE_OSPF6                7
 
382
#define ZEBRA_ROUTE_ISIS                 8
 
383
#define ZEBRA_ROUTE_BGP                  9
 
384
#define ZEBRA_ROUTE_HSLS                 10
 
385
#define ZEBRA_ROUTE_MAX                  11
 
386
 
 
387
/* Zebra's family types. */
 
388
#define ZEBRA_FAMILY_IPV4                1
 
389
#define ZEBRA_FAMILY_IPV6                2
 
390
#define ZEBRA_FAMILY_MAX                 3
 
391
 
 
392
/* Error codes of zebra. */
 
393
#define ZEBRA_ERR_RTEXIST               -1
 
394
#define ZEBRA_ERR_RTUNREACH             -2
 
395
#define ZEBRA_ERR_EPERM                 -3
 
396
#define ZEBRA_ERR_RTNOEXIST             -4
 
397
 
 
398
/* Zebra message flags */
 
399
#define ZEBRA_FLAG_INTERNAL           0x01
 
400
#define ZEBRA_FLAG_SELFROUTE          0x02
 
401
#define ZEBRA_FLAG_BLACKHOLE          0x04
 
402
#define ZEBRA_FLAG_IBGP               0x08
 
403
#define ZEBRA_FLAG_SELECTED           0x10
 
404
#define ZEBRA_FLAG_CHANGED            0x20
 
405
#define ZEBRA_FLAG_STATIC             0x40
 
406
#define ZEBRA_FLAG_REJECT             0x80
 
407
 
 
408
/* Zebra nexthop flags. */
 
409
#define ZEBRA_NEXTHOP_IFINDEX            1
 
410
#define ZEBRA_NEXTHOP_IFNAME             2
 
411
#define ZEBRA_NEXTHOP_IPV4               3
 
412
#define ZEBRA_NEXTHOP_IPV4_IFINDEX       4
 
413
#define ZEBRA_NEXTHOP_IPV4_IFNAME        5
 
414
#define ZEBRA_NEXTHOP_IPV6               6
 
415
#define ZEBRA_NEXTHOP_IPV6_IFINDEX       7
 
416
#define ZEBRA_NEXTHOP_IPV6_IFNAME        8
 
417
#define ZEBRA_NEXTHOP_BLACKHOLE          9
 
418
 
 
419
#ifndef INADDR_LOOPBACK
 
420
#define INADDR_LOOPBACK 0x7f000001      /* Internet address 127.0.0.1.  */
 
421
#endif
 
422
 
 
423
/* Address family numbers from RFC1700. */
 
424
#define AFI_IP                    1
 
425
#define AFI_IP6                   2
 
426
#define AFI_MAX                   3
 
427
 
 
428
/* Subsequent Address Family Identifier. */
 
429
#define SAFI_UNICAST              1
 
430
#define SAFI_MULTICAST            2
 
431
#define SAFI_UNICAST_MULTICAST    3
 
432
#define SAFI_MPLS_VPN             4
 
433
#define SAFI_MAX                  5
 
434
 
 
435
/* Filter direction.  */
 
436
#define FILTER_IN                 0
 
437
#define FILTER_OUT                1
 
438
#define FILTER_MAX                2
 
439
 
 
440
/* Default Administrative Distance of each protocol. */
 
441
#define ZEBRA_KERNEL_DISTANCE_DEFAULT      0
 
442
#define ZEBRA_CONNECT_DISTANCE_DEFAULT     0
 
443
#define ZEBRA_STATIC_DISTANCE_DEFAULT      1
 
444
#define ZEBRA_RIP_DISTANCE_DEFAULT       120
 
445
#define ZEBRA_RIPNG_DISTANCE_DEFAULT     120
 
446
#define ZEBRA_OSPF_DISTANCE_DEFAULT      110
 
447
#define ZEBRA_OSPF6_DISTANCE_DEFAULT     110
 
448
#define ZEBRA_ISIS_DISTANCE_DEFAULT      115
 
449
#define ZEBRA_IBGP_DISTANCE_DEFAULT      200
 
450
#define ZEBRA_EBGP_DISTANCE_DEFAULT       20
 
451
 
 
452
/* Flag manipulation macros. */
 
453
#define CHECK_FLAG(V,F)      ((V) & (F))
 
454
#define SET_FLAG(V,F)        (V) |= (F)
 
455
#define UNSET_FLAG(V,F)      (V) &= ~(F)
 
456
 
 
457
/* AFI and SAFI type. */
 
458
typedef u_int16_t afi_t;
 
459
typedef u_int8_t safi_t;
 
460
 
 
461
/* Zebra types. */
 
462
typedef u_int16_t zebra_size_t;
 
463
typedef u_int8_t zebra_command_t;
 
464
 
 
465
/* FIFO -- first in first out structure and macros.  */
 
466
struct fifo
 
467
{
 
468
  struct fifo *next;
 
469
  struct fifo *prev;
 
470
};
 
471
 
 
472
#define FIFO_INIT(F)                                  \
 
473
  do {                                                \
 
474
    struct fifo *Xfifo = (struct fifo *)(F);          \
 
475
    Xfifo->next = Xfifo->prev = Xfifo;                \
 
476
  } while (0)
 
477
 
 
478
#define FIFO_ADD(F,N)                                 \
 
479
  do {                                                \
 
480
    struct fifo *Xfifo = (struct fifo *)(F);          \
 
481
    struct fifo *Xnode = (struct fifo *)(N);          \
 
482
    Xnode->next = Xfifo;                              \
 
483
    Xnode->prev = Xfifo->prev;                        \
 
484
    Xfifo->prev = Xfifo->prev->next = Xnode;          \
 
485
  } while (0)
 
486
 
 
487
#define FIFO_DEL(N)                                   \
 
488
  do {                                                \
 
489
    struct fifo *Xnode = (struct fifo *)(N);          \
 
490
    Xnode->prev->next = Xnode->next;                  \
 
491
    Xnode->next->prev = Xnode->prev;                  \
 
492
  } while (0)
 
493
 
 
494
#define FIFO_HEAD(F)                                  \
 
495
  ((((struct fifo *)(F))->next == (struct fifo *)(F)) \
 
496
  ? NULL : (F)->next)
 
497
 
 
498
#define FIFO_EMPTY(F)                                 \
 
499
  (((struct fifo *)(F))->next == (struct fifo *)(F))
 
500
 
 
501
#define FIFO_TOP(F)                                   \
 
502
  (FIFO_EMPTY(F) ? NULL : ((struct fifo *)(F))->next)
 
503
 
 
504
#endif /* _ZEBRA_H */