ospf.h 17 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
#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

Ondřej Filip's avatar
 
Ondřej Filip committed
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
Ondřej Filip's avatar
 
Ondřej Filip committed
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 */
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 */
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
Ondřej Filip's avatar
 
Ondřej Filip committed
201 202
#define OSPF_IT_NBMA 1
#define OSPF_IT_PTP 2
203
#define OSPF_IT_VLINK 3
Ondřej Filip's avatar
Ondřej Filip committed
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 */
Ondřej Filip's avatar
 
Ondřej Filip committed
221 222 223
/* Default values for interface parameters */
#define COST_D 10
#define RXMTINT_D 5
224
#define INFTRANSDELAY_D 1
Ondřej Filip's avatar
 
Ondřej Filip committed
225
#define PRIORITY_D 1
Ondřej Filip's avatar
 
Ondřej Filip committed
226
#define HELLOINT_D 10
227
#define POLLINT_D 20
Ondřej Filip's avatar
 
Ondřej Filip committed
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 */
Ondřej Filip's avatar
Ondřej Filip committed
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;
Ondřej Filip's avatar
 
Ondřej Filip committed
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
{
Ondřej Zajíček's avatar
Ondřej Zajíček committed
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

#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

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

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

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

386

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


#ifdef OSPFv2
394

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

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

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

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

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

449 450 451 452 453 454 455 456 457 458

#else  /* OSPFv3 */

struct ospf_lsa_rt
{
  u32 options;
};

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

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

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

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

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

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

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

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

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

528 529 530 531 532
#endif

#define METRIC_MASK  0x00FFFFFF
#define OPTIONS_MASK 0x00FFFFFF

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

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


548 549
#ifdef OSPFv3

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

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

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

606 607 608 609
#endif



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

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

623

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

674
/* Definitions for interface state machine */
Ondřej Filip's avatar
Ondřej Filip committed
675 676 677 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 */
#define ISM_LOOP 4		/* Loop indicated */
#define ISM_UNLOOP 5		/* Unloop indicated */
#define ISM_DOWN 6		/* Interface down */
682 683

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

Ondřej Filip's avatar
Ondřej Filip committed
715 716
struct proto_ospf
{
717
  struct proto proto;
718 719
  timer *disp_timer;		/* OSPF proto dispatcher */
  unsigned tick;
720 721
  struct top_graph *gr;		/* LSA graph */
  slist lsal;			/* List of all LSA's */
722
  int calcrt;			/* Routing table calculation scheduled? */
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 734
};

Ondřej Filip's avatar
Ondřej Filip committed
735 736
struct ospf_iface_patt
{
Ondřej Filip's avatar
Ondřej Filip committed
737
  struct iface_patt i;
738 739 740 741 742 743 744 745
  u32 cost;
  u32 helloint;
  u32 rxmtint;
  u32 pollint;
  u32 inftransdelay;
  u32 priority;
  u32 waitint;
  u32 deadc;
746
  u32 dead;
747 748 749
  u32 type;
  u32 strictnbma;
  u32 stub;
Ondřej Filip's avatar
Ondřej Filip committed
750
  u32 vid;
751 752 753 754
  u32 rxbuf;
#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
755
  list nbma_list;
756 757 758 759 760 761 762 763 764 765 766 767 768 769

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

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

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

Ondřej Filip's avatar
Ondřej Filip committed
786
void ospf_sh_neigh(struct proto *p, char *iff);
Ondřej Filip's avatar
Ondřej Filip committed
787
void ospf_sh(struct proto *p);
Ondřej Filip's avatar
Ondřej Filip committed
788
void ospf_sh_iface(struct proto *p, char *iff);
789

Martin Mareš's avatar
Martin Mareš committed
790 791 792 793
#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
794
#include "proto/ospf/rt.h"
795 796 797 798 799 800
#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
801
#include "proto/ospf/lsreq.h"
802 803 804
#include "proto/ospf/lsupd.h"
#include "proto/ospf/lsack.h"
#include "proto/ospf/lsalib.h"
805

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