ospf.h 17.9 KB
Newer Older
Ondřej Filip's avatar
   
Ondřej Filip committed
1
2
3
/*
 *	BIRD -- OSPF
 *
4
 *	(c) 1999--2005 Ondrej Filip <feela@network.cz>
Ondřej Filip's avatar
   
Ondřej Filip committed
5
6
7
8
9
10
11
 *
 *	Can be freely distributed and used under the terms of the GNU GPL.
 */

#ifndef _BIRD_OSPF_H_
#define _BIRD_OSPF_H_

12
#define MAXNETS 10
13
14
#define OSPF_MAX_PKT_SIZE 65536
			/*
15
16
17
18
19
                         * RFC 2328 says, maximum packet size is 65535
			 * This could be too much for small systems, so I
			 * normally allocate 2*mtu - (I found one cisco
			 * sending packets mtu+16)
			 */
Ondřej Filip's avatar
Ondřej Filip committed
20
21
22
23
24
25
26
#ifdef LOCAL_DEBUG
#define OSPF_FORCE_DEBUG 1
#else
#define OSPF_FORCE_DEBUG 0
#endif
#define OSPF_TRACE(flags, msg, args...) do { if ((p->debug & flags) || OSPF_FORCE_DEBUG) \
  log(L_TRACE "%s: " msg, p->name , ## args ); } while(0)
Ondřej Filip's avatar
Ondřej Filip committed
27

28
29
30
31
32
#define OSPF_PACKET(dumpfn, buffer, msg, args...) \
do { if ((p->debug & D_PACKETS) || OSPF_FORCE_DEBUG) \
{ log(L_TRACE "%s: " msg, p->name, ## args ); dumpfn(p, buffer); } } while(0)


33
34
35
#include "nest/bird.h"

#include "lib/checksum.h"
36
37
#include "lib/ip.h"
#include "lib/lists.h"
38
#include "lib/slists.h"
39
40
41
42
43
#include "lib/socket.h"
#include "lib/timer.h"
#include "lib/resource.h"
#include "nest/protocol.h"
#include "nest/iface.h"
44
#include "nest/route.h"
45
#include "nest/cli.h"
Ondřej Filip's avatar
Ondřej Filip committed
46
#include "nest/locks.h"
47
#include "conf/conf.h"
48
#include "lib/string.h"
49

Ondřej Filip's avatar
   
Ondřej Filip committed
50
#define OSPF_PROTO 89
51

Ondřej Filip's avatar
   
Ondřej Filip committed
52
#ifndef IPV6
53
#define OSPFv2 1
54
#define OSPF_VERSION 2
55
#define OSPF_VLINK_MTU 576			/* RFC 2328 A.1 */
Ondřej Filip's avatar
   
Ondřej Filip committed
56
57
#define AllSPFRouters ipa_from_u32(0xe0000005)	/* 224.0.0.5 */
#define AllDRouters ipa_from_u32(0xe0000006)	/* 224.0.0.6 */
Ondřej Filip's avatar
   
Ondřej Filip committed
58
#else
59
60
#define OSPFv3 1
#define OSPF_VERSION 3
61
#define OSPF_VLINK_MTU 1280			/* RFC 5340 A.1 */
62
63
#define AllSPFRouters _MI(0xFF020000, 0, 0, 5)	/* FF02::5 */
#define AllDRouters   _MI(0xFF020000, 0, 0, 6)	/* FF02::6 */
Ondřej Filip's avatar
   
Ondřej Filip committed
64
65
#endif

66

Ondřej Filip's avatar
Ondřej Filip committed
67
#define LSREFRESHTIME 1800	/* 30 minutes */
68
69
#define MINLSINTERVAL 5
#define MINLSARRIVAL 1
Ondřej Filip's avatar
Ondřej Filip committed
70
#define LSINFINITY 0xffffff
Ondřej Filip's avatar
Ondřej Filip committed
71

72
#define DEFAULT_OSPFTICK 1
73
#define DEFAULT_RFC1583 0	/* compatibility with rfc1583 */
Ondřej Filip's avatar
Ondřej Filip committed
74
#define DEFAULT_STUB_COST 1000
Ondřej Filip's avatar
Ondřej Filip committed
75

76

Ondřej Filip's avatar
Ondřej Filip committed
77
78
struct ospf_config
{
Ondřej Filip's avatar
   
Ondřej Filip committed
79
  struct proto_config c;
80
  unsigned tick;
81
  int rfc1583;
Ondřej Filip's avatar
Ondřej Filip committed
82
83
84
  list area_list;
};

Ondřej Filip's avatar
Ondřej Filip committed
85
86
struct nbma_node
{
Ondřej Filip's avatar
Ondřej Filip committed
87
88
  node n;
  ip_addr ip;
89
  int eligible;
Ondřej Filip's avatar
Ondřej Filip committed
90
91
};

Ondřej Filip's avatar
Ondřej Filip committed
92
struct area_net_config
Ondřej Filip's avatar
Ondřej Filip committed
93
{
94
  node n;
Ondřej Filip's avatar
Ondřej Filip committed
95
  struct prefix px;
96
  int hidden;
Ondřej Filip's avatar
Ondřej Filip committed
97
98
99
100
101
102
};

struct area_net
{
  struct fib_node fn;
  int hidden;
Ondřej Filip's avatar
Ondřej Filip committed
103
  int active;
Ondřej Filip's avatar
   
Ondřej Filip committed
104
  u32 metric;
105
106
};

107
108
109
110
111
112
113
114
struct ospf_stubnet_config
{
  node n;
  struct prefix px;
  int hidden, summary;
  u32 cost;
};

Ondřej Filip's avatar
Ondřej Filip committed
115
116
struct ospf_area_config
{
Ondřej Filip's avatar
Ondřej Filip committed
117
118
119
  node n;
  u32 areaid;
  int stub;
Ondřej Filip's avatar
Ondřej Filip committed
120
  list patt_list;
121
  list vlink_list;
122
  list net_list;
123
  list stubnet_list;
Ondřej Filip's avatar
   
Ondřej Filip committed
124
125
};

126
127
128
129
130
131
132
133
134
135
136
137
138
139

/* Option flags */

#define OPT_E	0x02
#define OPT_N	0x08
#define OPT_DC	0x20

#ifdef OSPFv2
#define OPT_EA	0x10

/* VEB flags are are stored independently in 'u16 options' */
#define OPT_RT_B  (0x01 << 8)
#define OPT_RT_E  (0x02 << 8)
#define OPT_RT_V  (0x04 << 8)
140
141
#endif

142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#ifdef OSPFv3
#define OPT_V6	0x01
#define OPT_R	0x10

/* VEB flags are are stored together with options in 'u32 options' */
#define OPT_RT_B  (0x01 << 24)
#define OPT_RT_E  (0x02 << 24)
#define OPT_RT_V  (0x04 << 24)
#define OPT_RT_NT (0x10 << 24)

#define OPT_PX_NU 0x01
#define OPT_PX_LA 0x02
#define OPT_PX_P  0x08
#define OPT_PX_DN 0x10
#endif
157
158


Ondřej Filip's avatar
Ondřej Filip committed
159
160
struct ospf_iface
{
Ondřej Filip's avatar
   
Ondřej Filip committed
161
  node n;
Ondřej Filip's avatar
Ondřej Filip committed
162
  struct iface *iface;		/* Nest's iface */
Ondřej Zajíček's avatar
Ondřej Zajíček committed
163
  struct ifa *addr;		/* IP prefix associated with that OSPF iface */
164
  struct ospf_area *oa;
165
  pool *pool;
166
  sock *sk;			/* IP socket (for DD ...) */
Ondřej Filip's avatar
Ondřej Filip committed
167
  list neigh_list;		/* List of neigbours */
168
  u32 cost;			/* Cost of iface */
169
170
171
  u32 waitint;			/* number of sec before changing state from wait */
  u32 rxmtint;			/* number of seconds between LSA retransmissions */
  u32 pollint;			/* Poll interval */
172
  u32 dead;			/* after "deadint" missing hellos is router dead */
Ondřej Filip's avatar
Ondřej Filip committed
173
174
  u32 vid;			/* Id of peer of virtual link */
  ip_addr vip;			/* IP of peer of virtual link */
175
176
  struct ospf_iface *vifa;	/* OSPF iface which the vlink goes through */
  struct ospf_area *voa;	/* OSPF area which the vlink goes through */
177
178
179
  u16 inftransdelay;		/* The estimated number of seconds it takes to
				   transmit a Link State Update Packet over this
				   interface.  LSAs contained in the update */
180
  u16 helloint;			/* number of seconds between hello sending */
181
182

#ifdef OSPFv2
183
  list *passwords;
184
  u16 autype;
185
186
  u32 csn;                      /* Last used crypt seq number */
  bird_clock_t csn_use;         /* Last time when packet with that CSN was sent */
187
188
#endif

Ondřej Filip's avatar
Ondřej Filip committed
189
190
  ip_addr drip;			/* Designated router */
  ip_addr bdrip;		/* Backup DR */
191
  u32 drid;
Ondřej Filip's avatar
   
Ondřej Filip committed
192
  u32 bdrid;
193
194
195
196
197
198
199

#ifdef OSPFv3
  u32 dr_iface_id;		/* if drid is valid, this is iface_id of DR (for connecting network) */
  u8 instance_id;		/* Used to differentiate between more OSPF
				   instances on one interface */
#endif

Ondřej Filip's avatar
Ondřej Filip committed
200
  u8 type;			/* OSPF view of type */
201
#define OSPF_IT_BCAST 0
Ondřej Filip's avatar
   
Ondřej Filip committed
202
203
#define OSPF_IT_NBMA 1
#define OSPF_IT_PTP 2
204
#define OSPF_IT_VLINK 3
Ondřej Filip's avatar
Ondřej Filip committed
205
#define OSPF_IT_UNDEF 4
Ondřej Filip's avatar
Ondřej Filip committed
206
207
208
  u8 strictnbma;		/* Can I talk with unknown neighbors? */
  u8 stub;			/* Inactive interface */
  u8 state;			/* Interface state machine */
209
#define OSPF_IS_DOWN 0		/* Not working */
210
#define OSPF_IS_LOOP 1		/* Iface with no link */
211
212
213
214
215
#define OSPF_IS_WAITING 2	/* Waiting for Wait timer */
#define OSPF_IS_PTP 3		/* PTP operational */
#define OSPF_IS_DROTHER 4	/* I'm on BCAST or NBMA and I'm not DR */
#define OSPF_IS_BACKUP 5	/* I'm BDR */
#define OSPF_IS_DR 6		/* I'm DR */
216
217
  timer *wait_timer;		/* WAIT timer */
  timer *hello_timer;		/* HELLOINT timer */
218
  timer *poll_timer;		/* Poll Interval - for NBMA */
Ondřej Filip's avatar
   
Ondřej Filip committed
219
220
221
/* Default values for interface parameters */
#define COST_D 10
#define RXMTINT_D 5
222
#define INFTRANSDELAY_D 1
Ondřej Filip's avatar
   
Ondřej Filip committed
223
#define PRIORITY_D 1
Ondřej Filip's avatar
   
Ondřej Filip committed
224
#define HELLOINT_D 10
225
#define POLLINT_D 20
Ondřej Filip's avatar
   
Ondřej Filip committed
226
#define DEADC_D 4
227
228
229
230
231
232
233
#define WAIT_DMH 4		
  /* Value of Wait timer - not found it in RFC * - using 4*HELLO */

  struct top_hash_entry *net_lsa;	/* Originated network LSA */
  int orignet;				/* Schedule network LSA origination */
#ifdef OSPFv3
  int origlink;				/* Schedule link LSA origination */
234
  struct top_hash_entry *link_lsa;	/* Originated link LSA */
235
236
237
  struct top_hash_entry *pxn_lsa;	/* Originated prefix LSA */
#endif
  int fadj;				/* Number of full adjacent neigh */
Ondřej Filip's avatar
Ondřej Filip committed
238
  list nbma_list;
239
  u8 priority;			/* A router priority for DR election */
240
  u8 ioprob;
241
242
243
#define OSPF_I_OK 0		/* Everything OK */
#define OSPF_I_SK 1		/* Socket open failed */
#define OSPF_I_LL 2		/* Missing link-local address (OSPFv3) */
244
245
  u8 sk_spf;			/* Socket is a member of SPFRouters group */
  u8 sk_dr; 			/* Socket is a member of DRouters group */
246
247
  u16 rxbuf;			/* Buffer size */
  u8 use_link;			/* Whether iface link change is used */
Ondřej Filip's avatar
   
Ondřej Filip committed
248
249
};

250
251
252
253
254
255
256
257
258
259
260
261
262
263
struct ospf_md5
{
  u16 zero;
  u8 keyid;
  u8 len;
  u32 csn;
};

union ospf_auth
{
  u8 password[8];
  struct ospf_md5 md5;
};

264
265

/* Packet types */
Ondřej Filip's avatar
Ondřej Filip committed
266
267
268
269
270
#define HELLO_P 1		/* Hello */
#define DBDES_P 2		/* Database description */
#define LSREQ_P 3		/* Link state request */
#define LSUPD_P 4		/* Link state update */
#define LSACK_P 5		/* Link state acknowledgement */
271
272

/* Area IDs */
Ondřej Filip's avatar
Ondřej Filip committed
273
#define BACKBONE 0
274
275


Ondřej Filip's avatar
Ondřej Filip committed
276
277
struct immsb
{
Ondřej Zajíček's avatar
Ondřej Zajíček committed
278
#ifdef CPU_BIG_ENDIAN
279
280
281
282
283
  u8 padding:5;
  u8 i:1;
  u8 m:1;
  u8 ms:1;
#else
284
285
286
287
  u8 ms:1;
  u8 m:1;
  u8 i:1;
  u8 padding:5;
288
#endif
289
290
};

Ondřej Filip's avatar
Ondřej Filip committed
291
292
union imms
{
293
294
295
  u8 byte;
  struct immsb bit;
};
296
297
298
#define DBDES_MS 1
#define DBDES_M 2
#define DBDES_I 4
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327


#ifdef OSPFv2

struct ospf_packet
{
  u8 version;
  u8 type;
  u16 length;
  u32 routerid;
  u32 areaid;
  u16 checksum;
  u16 autype;
  union ospf_auth u;
};


#else /* OSPFv3 packet descriptions */

struct ospf_packet
{
  u8 version;
  u8 type;
  u16 length;
  u32 routerid;
  u32 areaid;
  u16 checksum;
  u8 instance_id;
  u8 zero;
328
329
};

330

331
332
333
334
335
#endif




Ondřej Filip's avatar
Ondřej Filip committed
336
337
338
339
340
341
struct ospf_lsa_header
{
  u16 age;			/* LS Age */
#define LSA_MAXAGE 3600		/* 1 hour */
#define LSA_CHECKAGE 300	/* 5 minutes */
#define LSA_MAXAGEDIFF 900	/* 15 minutes */
342
343

#ifdef OSPFv2
344
  u8 options;
345
  u8 type;
346
347
348
349
350
351
352

#define LSA_T_RT	1
#define LSA_T_NET	2
#define LSA_T_SUM_NET	3
#define LSA_T_SUM_RT	4
#define LSA_T_EXT	5

353
354
355
356
357
#define LSA_SCOPE_AREA	0x2000
#define LSA_SCOPE_AS	0x4000

#define LSA_SCOPE(lsa)	(((lsa)->type == LSA_T_EXT) ? LSA_SCOPE_AS : LSA_SCOPE_AREA)

358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
#else /* OSPFv3 */
  u16 type;

#define LSA_T_RT	0x2001
#define LSA_T_NET	0x2002
#define LSA_T_SUM_NET	0x2003
#define LSA_T_SUM_RT	0x2004
#define LSA_T_EXT	0x4005
#define LSA_T_LINK	0x0008
#define LSA_T_PREFIX	0x2009

#define LSA_UBIT	0x8000

#define LSA_SCOPE_LINK	0x0000
#define LSA_SCOPE_AREA	0x2000
#define LSA_SCOPE_AS	0x4000
#define LSA_SCOPE_RES	0x6000
#define LSA_SCOPE_MASK	0x6000

#define LSA_SCOPE(lsa)	((lsa)->type & LSA_SCOPE_MASK)
#endif

380
  u32 id;
Ondřej Filip's avatar
Ondřej Filip committed
381
382
  u32 rt;			/* Advertising router */
  s32 sn;			/* LS Sequence number */
383
384
#define LSA_INITSEQNO ((s32) 0x80000001)
#define LSA_MAXSEQNO ((s32) 0x7fffffff)
385
  u16 checksum;
Ondřej Filip's avatar
Ondřej Filip committed
386
  u16 length;
387
388
};

389

390
391
392
393
394
395
396
#define LSART_PTP 1
#define LSART_NET 2
#define LSART_STUB 3
#define LSART_VLNK 4


#ifdef OSPFv2
397

Ondřej Filip's avatar
Ondřej Filip committed
398
399
struct ospf_lsa_rt
{
400
#ifdef CPU_BIG_ENDIAN
401
  u16 options;	/* VEB flags only */
402
  u16 links;
403
404
405
406
#else
  u16 links;
  u16 options;	/* VEB flags only */
#endif
407
408
};

Ondřej Filip's avatar
Ondřej Filip committed
409
410
struct ospf_lsa_rt_link
{
411
412
  u32 id;
  u32 data;
413
#ifdef CPU_BIG_ENDIAN
414
  u8 type;
415
  u8 padding;
416
  u16 metric;
417
418
419
420
421
#else
  u16 metric;
  u8 padding;
  u8 type;
#endif
422
423
};

424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
struct ospf_lsa_net
{
  ip_addr netmask;
  u32 routers[];
};

struct ospf_lsa_sum
{
  ip_addr netmask;
  u32 metric;
};

struct ospf_lsa_ext
{
  ip_addr netmask;
  u32 metric;
  ip_addr fwaddr;
  u32 tag;
};

444
445
#define LSA_SUM_TOS  0xFF000000
#define LSA_EXT_TOS  0x7F000000
446
447
#define LSA_EXT_EBIT 0x80000000

448
449
450
451
/* Endianity swap for lsa->type */
#define ntoht(x) x
#define htont(x) x

452
453
454
455
456
457
458
459
460
461

#else  /* OSPFv3 */

struct ospf_lsa_rt
{
  u32 options;
};

struct ospf_lsa_rt_link
{
462
#ifdef CPU_BIG_ENDIAN
463
  u8 type;
464
465
  u8 padding;
  u16 metric;
466
467
468
469
470
#else
  u16 metric;
  u8 padding;
  u8 type;
#endif
471
472
473
  u32 lif;	/* Local interface ID */
  u32 nif;	/* Neighbor interface ID */
  u32 id;	/* Neighbor router ID */
474
475
};

Ondřej Filip's avatar
Ondřej Filip committed
476
477
struct ospf_lsa_net
{
478
479
  u32 options;
  u32 routers[];
480
481
};

482
struct ospf_lsa_sum_net
Ondřej Filip's avatar
Ondřej Filip committed
483
{
484
485
  u32 metric;
  u32 prefix[];
486
487
};

488
489
490
491
492
493
struct ospf_lsa_sum_rt
{
  u32 options;
  u32 metric;
  u32 drid;
};
Ondřej Filip's avatar
Ondřej Filip committed
494
495

struct ospf_lsa_ext
Ondřej Filip's avatar
Ondřej Filip committed
496
{
497
498
499
500
501
502
503
504
505
506
507
508
509
510
  u32 metric;
  u32 rest[];
};

struct ospf_lsa_link
{
  u32 options;
  ip_addr lladdr;
  u32 pxcount;
  u32 rest[];
};

struct ospf_lsa_prefix
{
511
#ifdef CPU_BIG_ENDIAN
512
513
  u16 pxcount;
  u16 ref_type;
514
515
516
517
#else
  u16 ref_type;
  u16 pxcount;
#endif
518
519
520
  u32 ref_id;
  u32 ref_rt;
  u32 rest[];
Ondřej Filip's avatar
Ondřej Filip committed
521
522
};

523
524
525
526
#define LSA_EXT_EBIT 0x4000000
#define LSA_EXT_FBIT 0x2000000
#define LSA_EXT_TBIT 0x1000000

527
528
529
530
/* Endianity swap for lsa->type */
#define ntoht(x) ntohs(x)
#define htont(x) htons(x)

531
532
533
534
535
#endif

#define METRIC_MASK  0x00FFFFFF
#define OPTIONS_MASK 0x00FFFFFF

536
537
static inline unsigned
lsa_rt_count(struct ospf_lsa_header *lsa)
538
539
540
541
542
{
  return (lsa->length - sizeof(struct ospf_lsa_header) - sizeof(struct ospf_lsa_rt))
    / sizeof(struct ospf_lsa_rt_link);
}

543
544
static inline unsigned
lsa_net_count(struct ospf_lsa_header *lsa)
545
546
547
548
549
550
{
  return (lsa->length - sizeof(struct ospf_lsa_header) - sizeof(struct ospf_lsa_net))
    / sizeof(u32);
}


551
552
#ifdef OSPFv3

553
554
555
#define IPV6_PREFIX_SPACE(x) ((((x) + 63) / 32) * 4)
#define IPV6_PREFIX_WORDS(x) (((x) + 63) / 32)

556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
static inline u32 *
lsa_get_ipv6_prefix(u32 *buf, ip_addr *addr, int *pxlen, u8 *pxopts, u16 *rest)
{
  u8 pxl = (*buf >> 24);
  *pxopts = (*buf >> 16);
  *rest = *buf;
  *pxlen = pxl;
  buf++;

  *addr = IPA_NONE;

  if (pxl > 0)
    _I0(*addr) = *buf++;
  if (pxl > 32)
    _I1(*addr) = *buf++;
  if (pxl > 64)
    _I2(*addr) = *buf++;
  if (pxl > 96)
    _I3(*addr) = *buf++;

  return buf;
}

static inline u32 *
lsa_get_ipv6_addr(u32 *buf, ip_addr *addr)
{
  *addr = *(ip_addr *) buf;
  return buf + 4;
}

586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
static inline u32 *
put_ipv6_prefix(u32 *buf, ip_addr addr, u8 pxlen, u8 pxopts, u16 lh)
{
  *buf++ = ((pxlen << 24) | (pxopts << 16) | lh);

  if (pxlen > 0)
    *buf++ = _I0(addr);
  if (pxlen > 32)
    *buf++ = _I1(addr);
  if (pxlen > 64)
    *buf++ = _I2(addr);
  if (pxlen > 96)
    *buf++ = _I3(addr);
  return buf;
}

static inline u32 *
put_ipv6_addr(u32 *buf, ip_addr addr)
{
  *(ip_addr *) buf = addr;
  return buf + 4;
}

609
610
611
612
#endif



Ondřej Filip's avatar
Ondřej Filip committed
613
614
struct ospf_lsreq_header
{
615
  u32 type;
Ondřej Filip's avatar
Ondřej Filip committed
616
  u32 id;
Ondřej Filip's avatar
Ondřej Filip committed
617
  u32 rt;			/* Advertising router */
Ondřej Filip's avatar
Ondřej Filip committed
618
619
};

Ondřej Filip's avatar
Ondřej Filip committed
620
621
struct l_lsr_head
{
622
623
624
625
  node n;
  struct ospf_lsreq_header lsh;
};

626

Ondřej Filip's avatar
   
Ondřej Filip committed
627
628
struct ospf_neighbor
{
629
  node n;
630
  pool *pool;
Ondřej Filip's avatar
   
Ondřej Filip committed
631
  struct ospf_iface *ifa;
632
  u8 state;
Ondřej Filip's avatar
   
Ondřej Filip committed
633
#define NEIGHBOR_DOWN 0
Ondřej Filip's avatar
   
Ondřej Filip committed
634
635
636
#define NEIGHBOR_ATTEMPT 1
#define NEIGHBOR_INIT 2
#define NEIGHBOR_2WAY 3
Ondřej Filip's avatar
   
Ondřej Filip committed
637
#define NEIGHBOR_EXSTART 4
Ondřej Filip's avatar
   
Ondřej Filip committed
638
639
640
#define NEIGHBOR_EXCHANGE 5
#define NEIGHBOR_LOADING 6
#define NEIGHBOR_FULL 7
Ondřej Filip's avatar
Ondřej Filip committed
641
  timer *inactim;		/* Inactivity timer */
642
  union imms imms;		/* I, M, Master/slave received */
Ondřej Filip's avatar
Ondřej Filip committed
643
644
  u32 dds;			/* DD Sequence number being sent */
  u32 ddr;			/* last Dat Des packet received */
645
  union imms myimms;		/* I, M Master/slave */
Ondřej Filip's avatar
Ondřej Filip committed
646
647
648
649
  u32 rid;			/* Router ID */
  ip_addr ip;			/* IP of it's interface */
  u8 priority;			/* Priority */
  u8 adj;			/* built adjacency? */
650
651
652
653
654
655
656
657
658
659
660
  u32 options;			/* Options received */

  /* dr and bdr store IP address in OSPFv2 and router ID in OSPFv3,
     we use the same type to simplify handling */
  u32 dr;			/* Neigbour's idea of DR */
  u32 bdr;			/* Neigbour's idea of BDR */

#ifdef OSPFv3
  u32 iface_id;			/* ID of Neighbour's iface connected to common network */
#endif

Ondřej Filip's avatar
Ondřej Filip committed
661
662
663
  siterator dbsi;		/* Database summary list iterator */
  slist lsrql;			/* Link state request */
  struct top_graph *lsrqh;	/* LSA graph */
664
  siterator lsrqi;
Ondřej Filip's avatar
Ondřej Filip committed
665
  slist lsrtl;			/* Link state retransmission list */
666
  siterator lsrti;
Ondřej Filip's avatar
Ondřej Filip committed
667
  struct top_graph *lsrth;
Ondřej Filip's avatar
Ondřej Filip committed
668
669
  void *ldbdes;			/* Last database description packet */
  timer *rxmt_timer;		/* RXMT timer */
670
671
672
  list ackl[2];
#define ACKL_DIRECT 0
#define ACKL_DELAY 1
Ondřej Filip's avatar
Ondřej Filip committed
673
  timer *ackd_timer;		/* Delayed ack timer */
674
  u32 csn;                      /* Last received crypt seq number (for MD5) */
Ondřej Filip's avatar
   
Ondřej Filip committed
675
676
};

677
/* Definitions for interface state machine */
Ondřej Filip's avatar
Ondřej Filip committed
678
679
680
681
#define ISM_UP 0		/* Interface Up */
#define ISM_WAITF 1		/* Wait timer fired */
#define ISM_BACKS 2		/* Backup seen */
#define ISM_NEICH 3		/* Neighbor change */
682
683
#define ISM_LOOP 4		/* Link down */
#define ISM_UNLOOP 5		/* Link up */
Ondřej Filip's avatar
Ondřej Filip committed
684
#define ISM_DOWN 6		/* Interface down */
685
686

/* Definitions for neighbor state machine */
Ondřej Filip's avatar
Ondřej Filip committed
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
#define INM_HELLOREC 0		/* Hello Received */
#define INM_START 1		/* Neighbor start - for NBMA */
#define INM_2WAYREC 2		/* 2-Way received */
#define INM_NEGDONE 3		/* Negotiation done */
#define INM_EXDONE 4		/* Exchange done */
#define INM_BADLSREQ 5		/* Bad LS Request */
#define INM_LOADDONE 6		/* Load done */
#define INM_ADJOK 7		/* AdjOK? */
#define INM_SEQMIS 8		/* Sequence number mismatch */
#define INM_1WAYREC 9		/* 1-Way */
#define INM_KILLNBR 10		/* Kill Neighbor */
#define INM_INACTTIM 11		/* Inactivity timer */
#define INM_LLDOWN 12		/* Line down */

struct ospf_area
{
703
  node n;
704
  u32 areaid;
705
  struct ospf_area_config *ac;	/* Related area config, might be NULL */
706
  int origrt;			/* Rt lsa origination scheduled? */
Ondřej Filip's avatar
Ondřej Filip committed
707
  struct top_hash_entry *rt;	/* My own router LSA */
708
  struct top_hash_entry *pxr_lsa; /* Originated prefix LSA */
709
  list cand;			/* List of candidates for RT calc. */
Ondřej Filip's avatar
Ondřej Filip committed
710
  struct fib net_fib;		/* Networks to advertise or not */
711
  unsigned stub;
Ondřej Filip's avatar
Ondřej Filip committed
712
  int trcap;			/* Transit capability? */
713
  u32 options;			/* Optional features */
Ondřej Filip's avatar
Ondřej Filip committed
714
  struct proto_ospf *po;
Ondřej Filip's avatar
Ondřej Filip committed
715
  struct fib rtr;		/* Routing tables for routers */
716
717
};

Ondřej Filip's avatar
Ondřej Filip committed
718
719
struct proto_ospf
{
720
  struct proto proto;
721
722
  timer *disp_timer;		/* OSPF proto dispatcher */
  unsigned tick;
723
724
  struct top_graph *gr;		/* LSA graph */
  slist lsal;			/* List of all LSA's */
725
726
  int calcrt;			/* Routing table calculation scheduled?
				   0=no, 1=normal, 2=forced reload */
727
  list iface_list;		/* Interfaces we really use */
728
  list area_list;
729
  int areano;			/* Number of area I belong to */
Ondřej Filip's avatar
Ondřej Filip committed
730
  struct fib rtf;		/* Routing table */
731
732
  int rfc1583;			/* RFC1583 compatibility */
  int ebit;			/* Did I originate any ext lsa? */
Ondřej Filip's avatar
Ondřej Filip committed
733
  struct ospf_area *backbone;	/* If exists */
734
735
  void *lsab;			/* LSA buffer used when originating router LSAs */
  int lsab_size, lsab_used;
736
  u32 router_id;
737
738
};

Ondřej Filip's avatar
Ondřej Filip committed
739
740
struct ospf_iface_patt
{
Ondřej Filip's avatar
Ondřej Filip committed
741
  struct iface_patt i;
742
743
744
745
746
747
748
749
  u32 cost;
  u32 helloint;
  u32 rxmtint;
  u32 pollint;
  u32 inftransdelay;
  u32 priority;
  u32 waitint;
  u32 deadc;
750
  u32 dead;
751
752
753
  u32 type;
  u32 strictnbma;
  u32 stub;
Ondřej Filip's avatar
Ondřej Filip committed
754
  u32 vid;
755
756
  u16 rxbuf;
  u8 use_link;
757
758
759
#define OSPF_RXBUF_NORMAL 0
#define OSPF_RXBUF_LARGE 1
#define OSPF_RXBUF_MINSIZE 256	/* Minimal allowed size */
Ondřej Filip's avatar
Ondřej Filip committed
760
  list nbma_list;
761
762
763
764
765
766
767
768
769
770
771
772
773
774

  u32 autype;			  /* Not really used in OSPFv3 */
#define OSPF_AUTH_NONE 0
#define OSPF_AUTH_SIMPLE 1
#define OSPF_AUTH_CRYPT 2
#define OSPF_AUTH_CRYPT_SIZE 16

#ifdef OSPFv2
  list *passwords;
#endif

#ifdef OSPFv3
  u8 instance_id;
#endif
Ondřej Filip's avatar
Ondřej Filip committed
775
776
};

777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
#if defined(OSPFv2) && !defined(CONFIG_MC_PROPER_SRC)
static inline int
ospf_iface_stubby(struct ospf_iface_patt *ip, struct ifa *addr)
{
  /*
   * We cannot properly support multiple OSPF ifaces on real iface
   * with multiple prefixes, therefore we force OSPF ifaces with
   * non-primary IP prefixes to be stub.
   */
  return ip->stub || !(addr->flags & IA_PRIMARY);
}
#else
static inline int
ospf_iface_stubby(struct ospf_iface_patt *ip, struct ifa *addr UNUSED)
{
  return ip->stub;
}
#endif

796
int ospf_import_control(struct proto *p, rte **new, ea_list **attrs,
Ondřej Filip's avatar
Ondřej Filip committed
797
			struct linpool *pool);
Martin Mareš's avatar
Martin Mareš committed
798
799
struct ea_list *ospf_make_tmp_attrs(struct rte *rt, struct linpool *pool);
void ospf_store_tmp_attrs(struct rte *rt, struct ea_list *attrs);
800
void schedule_rt_lsa(struct ospf_area *oa);
801
void schedule_rtcalc(struct proto_ospf *po);
Ondřej Filip's avatar
Ondřej Filip committed
802
void schedule_net_lsa(struct ospf_iface *ifa);
803
804
805
806

#ifdef OSPFv3
void schedule_link_lsa(struct ospf_iface *ifa);
#else
807
static inline void schedule_link_lsa(struct ospf_iface *ifa UNUSED) {}
808
809
#endif

Ondřej Filip's avatar
Ondřej Filip committed
810
void ospf_sh_neigh(struct proto *p, char *iff);
Ondřej Filip's avatar
Ondřej Filip committed
811
void ospf_sh(struct proto *p);
Ondřej Filip's avatar
Ondřej Filip committed
812
void ospf_sh_iface(struct proto *p, char *iff);
813
void ospf_sh_state(struct proto *p, int verbose, int reachable);
814
void ospf_sh_lsadb(struct proto *p);
Ondřej Zajíček's avatar
Ondřej Zajíček committed
815

816

Martin Mareš's avatar
Martin Mareš committed
817
818
819
#define EA_OSPF_METRIC1	EA_CODE(EAP_OSPF, 0)
#define EA_OSPF_METRIC2	EA_CODE(EAP_OSPF, 1)
#define EA_OSPF_TAG	EA_CODE(EAP_OSPF, 2)
820
#define EA_OSPF_ROUTER_ID EA_CODE(EAP_OSPF, 3)
Martin Mareš's avatar
Martin Mareš committed
821

Ondřej Filip's avatar
Ondřej Filip committed
822
#include "proto/ospf/rt.h"
823
824
825
826
827
828
#include "proto/ospf/hello.h"
#include "proto/ospf/packet.h"
#include "proto/ospf/iface.h"
#include "proto/ospf/neighbor.h"
#include "proto/ospf/topology.h"
#include "proto/ospf/dbdes.h"
Ondřej Filip's avatar
Ondřej Filip committed
829
#include "proto/ospf/lsreq.h"
830
831
832
#include "proto/ospf/lsupd.h"
#include "proto/ospf/lsack.h"
#include "proto/ospf/lsalib.h"
833

Ondřej Filip's avatar
   
Ondřej Filip committed
834
#endif /* _BIRD_OSPF_H_ */