ospf.h 16.3 KB
Newer Older
1 2 3
/*
 *	BIRD -- OSPF
 *
4
 *	(c) 1999--2005 Ondrej Filip <feela@network.cz>
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
#define OSPF_VLINK_MTU 576	/* RFC2328 - A.1 */
14 15
#define OSPF_MAX_PKT_SIZE 65536
			/*
16 17 18 19 20
                         * 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)
			 */
21
#define LOCAL_DEBUG 1
Ondřej Filip's avatar
Ondřej Filip committed
22 23 24 25 26 27 28
#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
29

30 31 32 33 34
#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)


35 36 37
#include "nest/bird.h"

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

52
#define OSPF_PROTO 89
53

Ondřej Filip's avatar
Ondřej Filip committed
54
#ifndef IPV6
55
#define OSPFv2 1
56
#define OSPF_VERSION 2
57 58
#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
59
#else
60 61 62 63
#define OSPFv3 1
#define OSPF_VERSION 3
#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 */
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
{
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
{
87 88
  node n;
  ip_addr ip;
89
  int eligible;
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;
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;
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
{
161
  node n;
Ondřej Filip's avatar
Ondřej Filip committed
162
  struct iface *iface;		/* Nest's iface */
163
  struct ospf_area *oa;
Ondřej Filip's avatar
Ondřej Filip committed
164
  struct object_lock *lock;
165
  sock *sk;			/* IP socket (for DD ...) */
Ondřej Filip's avatar
Ondřej Filip committed
166
  list neigh_list;		/* List of neigbours */
167
  u32 cost;			/* Cost of iface */
168 169 170
  u32 waitint;			/* number of sec before changing state from wait */
  u32 rxmtint;			/* number of seconds between LSA retransmissions */
  u32 pollint;			/* Poll interval */
171
  u32 dead;			/* after "deadint" missing hellos is router dead */
Ondřej Filip's avatar
Ondřej Filip committed
172 173 174
  u32 vid;			/* Id of peer of virtual link */
  ip_addr vip;			/* IP of peer of virtual link */
  struct ospf_area *voa;	/* Area wich the vlink goes through */
175 176 177
  u16 inftransdelay;		/* The estimated number of seconds it takes to
				   transmit a Link State Update Packet over this
				   interface.  LSAs contained in the update */
178
  u16 helloint;			/* number of seconds between hello sending */
179 180

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

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

#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 */
196
  ip_addr lladdr;		/* Used link-local addr */
197 198
#endif

Ondřej Filip's avatar
Ondřej Filip committed
199
  u8 type;			/* OSPF view of type */
200
#define OSPF_IT_BCAST 0
201 202
#define OSPF_IT_NBMA 1
#define OSPF_IT_PTP 2
203
#define OSPF_IT_VLINK 3
204
#define OSPF_IT_UNDEF 4
Ondřej Filip's avatar
Ondřej Filip committed
205 206 207 208 209 210
  u8 strictnbma;		/* Can I talk with unknown neighbors? */
  u8 stub;			/* Inactive interface */
#define OSPF_I_OK 0		/* Everything OK */
#define OSPF_I_MC 1		/* I didn't open MC socket */
#define OSPF_I_IP 2		/* I didn't open IP socet */
  u8 state;			/* Interface state machine */
211 212 213 214 215 216 217
#define OSPF_IS_DOWN 0		/* Not working */
#define OSPF_IS_LOOP 1		/* Should never happen */
#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 */
218 219
  timer *wait_timer;		/* WAIT timer */
  timer *hello_timer;		/* HELLOINT timer */
220
  timer *poll_timer;		/* Poll Interval - for NBMA */
221 222 223
/* Default values for interface parameters */
#define COST_D 10
#define RXMTINT_D 5
224
#define INFTRANSDELAY_D 1
225
#define PRIORITY_D 1
226
#define HELLOINT_D 10
227
#define POLLINT_D 20
228
#define DEADC_D 4
229 230 231 232 233 234 235
#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 */
236
  struct top_hash_entry *link_lsa;	/* Originated link LSA */
237 238 239
  struct top_hash_entry *pxn_lsa;	/* Originated prefix LSA */
#endif
  int fadj;				/* Number of full adjacent neigh */
240
  list nbma_list;
241
  u8 priority;				/* A router priority for DR election */
242
  u8 ioprob;
243
  u8 dr_up;				/* Socket is a member of DRouters group */
244
  u32 rxbuf;
245 246
};

247 248 249 250 251 252 253 254 255 256 257 258 259 260
struct ospf_md5
{
  u16 zero;
  u8 keyid;
  u8 len;
  u32 csn;
};

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

261 262

/* Packet types */
Ondřej Filip's avatar
Ondřej Filip committed
263 264 265 266 267
#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 */
268 269

/* Area IDs */
Ondřej Filip's avatar
Ondřej Filip committed
270
#define BACKBONE 0
271 272


Ondřej Filip's avatar
Ondřej Filip committed
273 274
struct immsb
{
275
#ifdef CPU_BIG_ENDIAN
276 277 278 279 280
  u8 padding:5;
  u8 i:1;
  u8 m:1;
  u8 ms:1;
#else
281 282 283 284
  u8 ms:1;
  u8 m:1;
  u8 i:1;
  u8 padding:5;
285
#endif
286 287
};

Ondřej Filip's avatar
Ondřej Filip committed
288 289
union imms
{
290 291 292
  u8 byte;
  struct immsb bit;
};
293 294 295
#define DBDES_MS 1
#define DBDES_M 2
#define DBDES_I 4
296 297 298 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


#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;
325 326
};

327

328 329 330 331 332
#endif




Ondřej Filip's avatar
Ondřej Filip committed
333 334 335 336 337 338
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 */
339 340

#ifdef OSPFv2
341
  u8 options;
342
  u8 type;
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371

#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

#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

372
  u32 id;
Ondřej Filip's avatar
Ondřej Filip committed
373 374
  u32 rt;			/* Advertising router */
  s32 sn;			/* LS Sequence number */
375 376
#define LSA_INITSEQNO ((s32) 0x80000001)
#define LSA_MAXSEQNO ((s32) 0x7fffffff)
377
  u16 checksum;
Ondřej Filip's avatar
Ondřej Filip committed
378
  u16 length;
379 380
};

381

382 383 384 385 386 387 388
#define LSART_PTP 1
#define LSART_NET 2
#define LSART_STUB 3
#define LSART_VLNK 4


#ifdef OSPFv2
389

Ondřej Filip's avatar
Ondřej Filip committed
390 391
struct ospf_lsa_rt
{
392
#ifdef CPU_BIG_ENDIAN
393
  u16 options;	/* VEB flags only */
394
  u16 links;
395 396 397 398
#else
  u16 links;
  u16 options;	/* VEB flags only */
#endif
399 400
};

Ondřej Filip's avatar
Ondřej Filip committed
401 402
struct ospf_lsa_rt_link
{
403 404
  u32 id;
  u32 data;
405
#ifdef CPU_BIG_ENDIAN
406
  u8 type;
407
  u8 padding;
408
  u16 metric;
409 410 411 412 413
#else
  u16 metric;
  u8 padding;
  u8 type;
#endif
414 415
};

416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437
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;
};

#define LSA_EXT_EBIT 0x80000000

438 439 440 441
/* Endianity swap for lsa->type */
#define ntoht(x) x
#define htont(x) x

442 443 444 445 446 447 448 449 450 451

#else  /* OSPFv3 */

struct ospf_lsa_rt
{
  u32 options;
};

struct ospf_lsa_rt_link
{
452
#ifdef CPU_BIG_ENDIAN
453
  u8 type;
454 455
  u8 padding;
  u16 metric;
456 457 458 459 460
#else
  u16 metric;
  u8 padding;
  u8 type;
#endif
461 462 463
  u32 lif;	/* Local interface ID */
  u32 nif;	/* Neighbor interface ID */
  u32 id;	/* Neighbor router ID */
464 465
};

Ondřej Filip's avatar
Ondřej Filip committed
466 467
struct ospf_lsa_net
{
468 469
  u32 options;
  u32 routers[];
470 471
};

472
struct ospf_lsa_sum_net
Ondřej Filip's avatar
Ondřej Filip committed
473
{
474 475
  u32 metric;
  u32 prefix[];
476 477
};

478 479 480 481 482 483
struct ospf_lsa_sum_rt
{
  u32 options;
  u32 metric;
  u32 drid;
};
Ondřej Filip's avatar
Ondřej Filip committed
484 485

struct ospf_lsa_ext
Ondřej Filip's avatar
Ondřej Filip committed
486
{
487 488 489 490 491 492 493 494 495 496 497 498 499 500
  u32 metric;
  u32 rest[];
};

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

struct ospf_lsa_prefix
{
501
#ifdef CPU_BIG_ENDIAN
502 503
  u16 pxcount;
  u16 ref_type;
504 505 506 507
#else
  u16 ref_type;
  u16 pxcount;
#endif
508 509 510
  u32 ref_id;
  u32 ref_rt;
  u32 rest[];
Ondřej Filip's avatar
Ondřej Filip committed
511 512
};

513 514 515 516
#define LSA_EXT_EBIT 0x4000000
#define LSA_EXT_FBIT 0x2000000
#define LSA_EXT_TBIT 0x1000000

517 518 519 520
/* Endianity swap for lsa->type */
#define ntoht(x) ntohs(x)
#define htont(x) htons(x)

521 522 523 524 525
#endif

#define METRIC_MASK  0x00FFFFFF
#define OPTIONS_MASK 0x00FFFFFF

526 527
static inline unsigned
lsa_rt_count(struct ospf_lsa_header *lsa)
528 529 530 531 532
{
  return (lsa->length - sizeof(struct ospf_lsa_header) - sizeof(struct ospf_lsa_rt))
    / sizeof(struct ospf_lsa_rt_link);
}

533 534
static inline unsigned
lsa_net_count(struct ospf_lsa_header *lsa)
535 536 537 538 539 540
{
  return (lsa->length - sizeof(struct ospf_lsa_header) - sizeof(struct ospf_lsa_net))
    / sizeof(u32);
}


541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576
#ifdef OSPFv3

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;
}

#endif



Ondřej Filip's avatar
Ondřej Filip committed
577 578
struct ospf_lsreq_header
{
579
  u32 type;
Ondřej Filip's avatar
Ondřej Filip committed
580
  u32 id;
Ondřej Filip's avatar
Ondřej Filip committed
581
  u32 rt;			/* Advertising router */
Ondřej Filip's avatar
Ondřej Filip committed
582 583
};

Ondřej Filip's avatar
Ondřej Filip committed
584 585
struct l_lsr_head
{
586 587 588 589
  node n;
  struct ospf_lsreq_header lsh;
};

590

591 592
struct ospf_neighbor
{
593
  node n;
594
  pool *pool;
595
  struct ospf_iface *ifa;
596
  u8 state;
597
#define NEIGHBOR_DOWN 0
598 599 600
#define NEIGHBOR_ATTEMPT 1
#define NEIGHBOR_INIT 2
#define NEIGHBOR_2WAY 3
601
#define NEIGHBOR_EXSTART 4
602 603 604
#define NEIGHBOR_EXCHANGE 5
#define NEIGHBOR_LOADING 6
#define NEIGHBOR_FULL 7
Ondřej Filip's avatar
Ondřej Filip committed
605
  timer *inactim;		/* Inactivity timer */
606
  union imms imms;		/* I, M, Master/slave received */
Ondřej Filip's avatar
Ondřej Filip committed
607 608
  u32 dds;			/* DD Sequence number being sent */
  u32 ddr;			/* last Dat Des packet received */
609
  union imms myimms;		/* I, M Master/slave */
Ondřej Filip's avatar
Ondřej Filip committed
610 611 612 613
  u32 rid;			/* Router ID */
  ip_addr ip;			/* IP of it's interface */
  u8 priority;			/* Priority */
  u8 adj;			/* built adjacency? */
614 615 616 617 618 619 620 621 622 623 624
  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
625 626 627
  siterator dbsi;		/* Database summary list iterator */
  slist lsrql;			/* Link state request */
  struct top_graph *lsrqh;	/* LSA graph */
628
  siterator lsrqi;
Ondřej Filip's avatar
Ondřej Filip committed
629
  slist lsrtl;			/* Link state retransmission list */
630
  siterator lsrti;
Ondřej Filip's avatar
Ondřej Filip committed
631
  struct top_graph *lsrth;
Ondřej Filip's avatar
Ondřej Filip committed
632 633
  void *ldbdes;			/* Last database description packet */
  timer *rxmt_timer;		/* RXMT timer */
634 635 636
  list ackl[2];
#define ACKL_DIRECT 0
#define ACKL_DELAY 1
Ondřej Filip's avatar
Ondřej Filip committed
637
  timer *ackd_timer;		/* Delayed ack timer */
638
  u32 csn;                      /* Last received crypt seq number (for MD5) */
639 640
};

641
/* Definitions for interface state machine */
Ondřej Filip's avatar
Ondřej Filip committed
642 643 644 645 646 647 648
#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 */
#define ISM_LOOP 4		/* Loop indicated */
#define ISM_UNLOOP 5		/* Unloop indicated */
#define ISM_DOWN 6		/* Interface down */
649 650

/* Definitions for neighbor state machine */
Ondřej Filip's avatar
Ondřej Filip committed
651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666
#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
{
667
  node n;
668
  u32 areaid;
669
  struct ospf_area_config *ac;	/* Related area config */
670
  int origrt;			/* Rt lsa origination scheduled? */
671
  struct top_hash_entry *rt;	/* My own router LSA */
672
  struct top_hash_entry *pxr_lsa; /* Originated prefix LSA */
673
  list cand;			/* List of candidates for RT calc. */
Ondřej Filip's avatar
Ondřej Filip committed
674
  struct fib net_fib;		/* Networks to advertise or not */
Ondřej Filip's avatar
Ondřej Filip committed
675 676
  int stub;
  int trcap;			/* Transit capability? */
677
  u32 options;			/* Optional features */
678
  struct proto_ospf *po;
Ondřej Filip's avatar
Ondřej Filip committed
679
  struct fib rtr;		/* Routing tables for routers */
680 681
};

Ondřej Filip's avatar
Ondřej Filip committed
682 683
struct proto_ospf
{
684
  struct proto proto;
685 686
  timer *disp_timer;		/* OSPF proto dispatcher */
  unsigned tick;
687 688
  struct top_graph *gr;		/* LSA graph */
  slist lsal;			/* List of all LSA's */
689
  int calcrt;			/* Routing table calculation scheduled? */
690
  int cleanup;                  /* Should I cleanup after RT calculation? */
691
  list iface_list;		/* Interfaces we really use */
692
  list area_list;
693
  int areano;			/* Number of area I belong to */
Ondřej Filip's avatar
Ondřej Filip committed
694
  struct fib rtf;		/* Routing table */
695 696
  int rfc1583;			/* RFC1583 compatibility */
  int ebit;			/* Did I originate any ext lsa? */
Ondřej Filip's avatar
Ondřej Filip committed
697
  struct ospf_area *backbone;	/* If exists */
698 699
  void *lsab;			/* LSA buffer used when originating router LSAs */
  int lsab_size, lsab_used;
700 701
};

Ondřej Filip's avatar
Ondřej Filip committed
702 703
struct ospf_iface_patt
{
Ondřej Filip's avatar
Ondřej Filip committed
704
  struct iface_patt i;
705 706 707 708 709 710 711 712
  u32 cost;
  u32 helloint;
  u32 rxmtint;
  u32 pollint;
  u32 inftransdelay;
  u32 priority;
  u32 waitint;
  u32 deadc;
713
  u32 dead;
714 715 716
  u32 type;
  u32 strictnbma;
  u32 stub;
Ondřej Filip's avatar
Ondřej Filip committed
717
  u32 vid;
718 719 720 721
  u32 rxbuf;
#define OSPF_RXBUF_NORMAL 0
#define OSPF_RXBUF_LARGE 1
#define OSPF_RXBUF_MINSIZE 256	/* Minimal allowed size */
722
  list nbma_list;
723 724 725 726 727 728 729 730 731 732 733 734 735 736

  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
737 738
};

739
int ospf_import_control(struct proto *p, rte **new, ea_list **attrs,
Ondřej Filip's avatar
Ondřej Filip committed
740
			struct linpool *pool);
741 742
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);
743
void schedule_rt_lsa(struct ospf_area *oa);
744
void schedule_rtcalc(struct proto_ospf *po);
Ondřej Filip's avatar
Ondřej Filip committed
745
void schedule_net_lsa(struct ospf_iface *ifa);
746 747 748 749 750 751 752

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

753
void ospf_sh_neigh(struct proto *p, char *iff);
Ondřej Filip's avatar
Ondřej Filip committed
754
void ospf_sh(struct proto *p);
755
void ospf_sh_iface(struct proto *p, char *iff);
756

757 758 759 760
#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)

Ondřej Filip's avatar
Ondřej Filip committed
761
#include "proto/ospf/rt.h"
762 763 764 765 766 767
#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
768
#include "proto/ospf/lsreq.h"
769 770 771
#include "proto/ospf/lsupd.h"
#include "proto/ospf/lsack.h"
#include "proto/ospf/lsalib.h"
772

773
#endif /* _BIRD_OSPF_H_ */