ospf.h 17.1 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)
			 */
Ondřej Filip's avatar
Ondřej Filip committed
21 22 23 24 25 26 27
#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
28

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


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

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

51
#define OSPF_PROTO 89
52

Ondřej Filip's avatar
Ondřej Filip committed
53
#ifndef IPV6
54
#define OSPFv2 1
55
#define OSPF_VERSION 2
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 61 62
#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
63 64
#endif

65

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

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

75

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

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

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

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

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

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

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

/* 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)
139 140
#endif

141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
#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
156 157


Ondřej Filip's avatar
Ondřej Filip committed
158 159
struct ospf_iface
{
160
  node n;
Ondřej Filip's avatar
Ondřej Filip committed
161
  struct iface *iface;		/* Nest's iface */
162
  struct ospf_area *oa;
Ondřej Filip's avatar
Ondřej Filip committed
163
  struct object_lock *lock;
164
  sock *sk;			/* IP socket (for DD ...) */
Ondřej Filip's avatar
Ondřej Filip committed
165
  list neigh_list;		/* List of neigbours */
166
  u32 cost;			/* Cost of iface */
167 168 169
  u32 waitint;			/* number of sec before changing state from wait */
  u32 rxmtint;			/* number of seconds between LSA retransmissions */
  u32 pollint;			/* Poll interval */
170
  u32 dead;			/* after "deadint" missing hellos is router dead */
Ondřej Filip's avatar
Ondřej Filip committed
171 172 173
  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 */
174 175 176
  u16 inftransdelay;		/* The estimated number of seconds it takes to
				   transmit a Link State Update Packet over this
				   interface.  LSAs contained in the update */
177
  u16 helloint;			/* number of seconds between hello sending */
178 179

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

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

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

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

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

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

260 261

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

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


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

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


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

326

327 328 329 330 331
#endif




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

#ifdef OSPFv2
340
  u8 options;
341
  u8 type;
342 343 344 345 346 347 348

#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

349 350 351 352 353
#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)

354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375
#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

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

385

386 387 388 389 390 391 392
#define LSART_PTP 1
#define LSART_NET 2
#define LSART_STUB 3
#define LSART_VLNK 4


#ifdef OSPFv2
393

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

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

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

440 441
#define LSA_SUM_TOS  0xFF000000
#define LSA_EXT_TOS  0x7F000000
442 443
#define LSA_EXT_EBIT 0x80000000

444 445 446 447
/* Endianity swap for lsa->type */
#define ntoht(x) x
#define htont(x) x

448 449 450 451 452 453 454 455 456 457

#else  /* OSPFv3 */

struct ospf_lsa_rt
{
  u32 options;
};

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

Ondřej Filip's avatar
Ondřej Filip committed
472 473
struct ospf_lsa_net
{
474 475
  u32 options;
  u32 routers[];
476 477
};

478
struct ospf_lsa_sum_net
Ondřej Filip's avatar
Ondřej Filip committed
479
{
480 481
  u32 metric;
  u32 prefix[];
482 483
};

484 485 486 487 488 489
struct ospf_lsa_sum_rt
{
  u32 options;
  u32 metric;
  u32 drid;
};
Ondřej Filip's avatar
Ondřej Filip committed
490 491

struct ospf_lsa_ext
Ondřej Filip's avatar
Ondřej Filip committed
492
{
493 494 495 496 497 498 499 500 501 502 503 504 505 506
  u32 metric;
  u32 rest[];
};

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

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

519 520 521 522
#define LSA_EXT_EBIT 0x4000000
#define LSA_EXT_FBIT 0x2000000
#define LSA_EXT_TBIT 0x1000000

523 524 525 526
/* Endianity swap for lsa->type */
#define ntoht(x) ntohs(x)
#define htont(x) htons(x)

527 528 529 530 531
#endif

#define METRIC_MASK  0x00FFFFFF
#define OPTIONS_MASK 0x00FFFFFF

532 533
static inline unsigned
lsa_rt_count(struct ospf_lsa_header *lsa)
534 535 536 537 538
{
  return (lsa->length - sizeof(struct ospf_lsa_header) - sizeof(struct ospf_lsa_rt))
    / sizeof(struct ospf_lsa_rt_link);
}

539 540
static inline unsigned
lsa_net_count(struct ospf_lsa_header *lsa)
541 542 543 544 545 546
{
  return (lsa->length - sizeof(struct ospf_lsa_header) - sizeof(struct ospf_lsa_net))
    / sizeof(u32);
}


547 548
#ifdef OSPFv3

549 550 551
#define IPV6_PREFIX_SPACE(x) ((((x) + 63) / 32) * 4)
#define IPV6_PREFIX_WORDS(x) (((x) + 63) / 32)

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 577 578 579 580 581
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;
}

582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604
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;
}

605 606 607 608
#endif



Ondřej Filip's avatar
Ondřej Filip committed
609 610
struct ospf_lsreq_header
{
611
  u32 type;
Ondřej Filip's avatar
Ondřej Filip committed
612
  u32 id;
Ondřej Filip's avatar
Ondřej Filip committed
613
  u32 rt;			/* Advertising router */
Ondřej Filip's avatar
Ondřej Filip committed
614 615
};

Ondřej Filip's avatar
Ondřej Filip committed
616 617
struct l_lsr_head
{
618 619 620 621
  node n;
  struct ospf_lsreq_header lsh;
};

622

623 624
struct ospf_neighbor
{
625
  node n;
626
  pool *pool;
627
  struct ospf_iface *ifa;
628
  u8 state;
629
#define NEIGHBOR_DOWN 0
630 631 632
#define NEIGHBOR_ATTEMPT 1
#define NEIGHBOR_INIT 2
#define NEIGHBOR_2WAY 3
633
#define NEIGHBOR_EXSTART 4
634 635 636
#define NEIGHBOR_EXCHANGE 5
#define NEIGHBOR_LOADING 6
#define NEIGHBOR_FULL 7
Ondřej Filip's avatar
Ondřej Filip committed
637
  timer *inactim;		/* Inactivity timer */
638
  union imms imms;		/* I, M, Master/slave received */
Ondřej Filip's avatar
Ondřej Filip committed
639 640
  u32 dds;			/* DD Sequence number being sent */
  u32 ddr;			/* last Dat Des packet received */
641
  union imms myimms;		/* I, M Master/slave */
Ondřej Filip's avatar
Ondřej Filip committed
642 643 644 645
  u32 rid;			/* Router ID */
  ip_addr ip;			/* IP of it's interface */
  u8 priority;			/* Priority */
  u8 adj;			/* built adjacency? */
646 647 648 649 650 651 652 653 654 655 656
  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
657 658 659
  siterator dbsi;		/* Database summary list iterator */
  slist lsrql;			/* Link state request */
  struct top_graph *lsrqh;	/* LSA graph */
660
  siterator lsrqi;
Ondřej Filip's avatar
Ondřej Filip committed
661
  slist lsrtl;			/* Link state retransmission list */
662
  siterator lsrti;
Ondřej Filip's avatar
Ondřej Filip committed
663
  struct top_graph *lsrth;
Ondřej Filip's avatar
Ondřej Filip committed
664 665
  void *ldbdes;			/* Last database description packet */
  timer *rxmt_timer;		/* RXMT timer */
666 667 668
  list ackl[2];
#define ACKL_DIRECT 0
#define ACKL_DELAY 1
Ondřej Filip's avatar
Ondřej Filip committed
669
  timer *ackd_timer;		/* Delayed ack timer */
670
  u32 csn;                      /* Last received crypt seq number (for MD5) */
671 672
};

673
/* Definitions for interface state machine */
Ondřej Filip's avatar
Ondřej Filip committed
674 675 676 677 678 679 680
#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 */
681 682

/* Definitions for neighbor state machine */
Ondřej Filip's avatar
Ondřej Filip committed
683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
#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
{
699
  node n;
700
  u32 areaid;
701
  struct ospf_area_config *ac;	/* Related area config */
702
  int origrt;			/* Rt lsa origination scheduled? */
703
  struct top_hash_entry *rt;	/* My own router LSA */
704
  struct top_hash_entry *pxr_lsa; /* Originated prefix LSA */
705
  list cand;			/* List of candidates for RT calc. */
Ondřej Filip's avatar
Ondřej Filip committed
706
  struct fib net_fib;		/* Networks to advertise or not */
Ondřej Filip's avatar
Ondřej Filip committed
707 708
  int stub;
  int trcap;			/* Transit capability? */
709
  u32 options;			/* Optional features */
710
  struct proto_ospf *po;
Ondřej Filip's avatar
Ondřej Filip committed
711
  struct fib rtr;		/* Routing tables for routers */
712 713
};

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

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

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

773
int ospf_import_control(struct proto *p, rte **new, ea_list **attrs,
Ondřej Filip's avatar
Ondřej Filip committed
774
			struct linpool *pool);
775 776
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);
777
void schedule_rt_lsa(struct ospf_area *oa);
778
void schedule_rtcalc(struct proto_ospf *po);
Ondřej Filip's avatar
Ondřej Filip committed
779
void schedule_net_lsa(struct ospf_iface *ifa);
780 781 782 783 784 785 786

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

787
void ospf_sh_neigh(struct proto *p, char *iff);
Ondřej Filip's avatar
Ondřej Filip committed
788
void ospf_sh(struct proto *p);
789
void ospf_sh_iface(struct proto *p, char *iff);
Ondřej Zajíček's avatar
Ondřej Zajíček committed
790 791
void ospf_sh_state(struct proto *p, int verbose);

792

793 794 795 796
#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
797
#include "proto/ospf/rt.h"
798 799 800 801 802 803
#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
804
#include "proto/ospf/lsreq.h"
805 806 807
#include "proto/ospf/lsupd.h"
#include "proto/ospf/lsack.h"
#include "proto/ospf/lsalib.h"
808

809
#endif /* _BIRD_OSPF_H_ */