ospf.h 18.4 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 15 16 17 18 19 20 21
#define OSPF_MAX_PKT_SIZE 65535
/*
 * RFC 2328 says, maximum packet size is 65535 (IP packet size
 * limit). Really a bit less for OSPF, because this contains also IP
 * header. This could be too much for small systems, so I normally
 * allocate 2*mtu (i found one cisco sending packets mtu+16). OSPF
 * packets are almost always sent small enough to not be fragmented.
 */

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
57
#define OSPF_VLINK_MTU 576			/* RFC 2328 A.1 */
Ondřej Filip's avatar
 
Ondřej Filip committed
58 59
#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
60
#else
61 62
#define OSPFv3 1
#define OSPF_VERSION 3
63
#define OSPF_VLINK_MTU 1280			/* RFC 5340 A.1 */
64 65
#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
66 67
#endif

68

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

74
#define DEFAULT_OSPFTICK 1
75
#define DEFAULT_RFC1583 0	/* compatibility with rfc1583 */
Ondřej Filip's avatar
Ondřej Filip committed
76
#define DEFAULT_STUB_COST 1000
Ondřej Zajíček's avatar
Ondřej Zajíček committed
77
#define DEFAULT_ECMP_LIMIT 16
Ondřej Filip's avatar
Ondřej Filip committed
78

79

Ondřej Filip's avatar
Ondřej Filip committed
80 81
struct ospf_config
{
Ondřej Filip's avatar
 
Ondřej Filip committed
82
  struct proto_config c;
83
  unsigned tick;
84 85
  byte rfc1583;
  byte abr;
Ondřej Zajíček's avatar
Ondřej Zajíček committed
86
  int ecmp;
Ondřej Filip's avatar
Ondřej Filip committed
87
  list area_list;
88
  list vlink_list;
Ondřej Filip's avatar
Ondřej Filip committed
89 90
};

Ondřej Filip's avatar
Ondřej Filip committed
91 92
struct nbma_node
{
Ondřej Filip's avatar
Ondřej Filip committed
93 94
  node n;
  ip_addr ip;
95 96
  byte eligible;
  byte found; 
Ondřej Filip's avatar
Ondřej Filip committed
97 98
};

Ondřej Filip's avatar
Ondřej Filip committed
99
struct area_net_config
Ondřej Filip's avatar
Ondřej Filip committed
100
{
101
  node n;
Ondřej Filip's avatar
Ondřej Filip committed
102
  struct prefix px;
103
  int hidden;
Ondřej Filip's avatar
Ondřej Filip committed
104 105 106 107 108 109
};

struct area_net
{
  struct fib_node fn;
  int hidden;
Ondřej Filip's avatar
Ondřej Filip committed
110
  int active;
Ondřej Filip's avatar
 
Ondřej Filip committed
111
  u32 metric;
112 113
};

114 115 116 117 118 119 120 121
struct ospf_stubnet_config
{
  node n;
  struct prefix px;
  int hidden, summary;
  u32 cost;
};

Ondřej Filip's avatar
Ondřej Filip committed
122 123
struct ospf_area_config
{
Ondřej Filip's avatar
Ondřej Filip committed
124 125
  node n;
  u32 areaid;
126
  u32 stub;
Ondřej Filip's avatar
Ondřej Filip committed
127
  list patt_list;
128 129
  list net_list;	      	/* List of aggregate networks for that area */
  list stubnet_list;		/* List of stub networks added to Router LSA */
Ondřej Filip's avatar
 
Ondřej Filip committed
130 131
};

132 133 134 135 136 137 138 139 140 141 142 143 144 145

/* 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)
146 147
#endif

148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
#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
163 164


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

#ifdef OSPFv2
190
  list *passwords;
191
  u16 autype;
192 193
  u32 csn;                      /* Last used crypt seq number */
  bird_clock_t csn_use;         /* Last time when packet with that CSN was sent */
194 195
#endif

Ondřej Filip's avatar
Ondřej Filip committed
196 197
  ip_addr drip;			/* Designated router */
  ip_addr bdrip;		/* Backup DR */
198
  u32 drid;
Ondřej Filip's avatar
 
Ondřej Filip committed
199
  u32 bdrid;
200 201
  s16 rt_pos_beg;		/* Position of iface in Router-LSA, begin, inclusive */
  s16 rt_pos_end;		/* Position of iface in Router-LSA, end, exclusive */
202 203

#ifdef OSPFv3
204 205 206
  s16 px_pos_beg;		/* Position of iface in Rt Prefix-LSA, begin, inclusive */
  s16 px_pos_end;		/* Position of iface in Rt Prefix-LSA, end, exclusive */

207 208 209 210 211
  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
212
  u8 type;			/* OSPF view of type */
213
#define OSPF_IT_BCAST 0
Ondřej Filip's avatar
 
Ondřej Filip committed
214 215
#define OSPF_IT_NBMA 1
#define OSPF_IT_PTP 2
216 217 218
#define OSPF_IT_PTMP 3
#define OSPF_IT_VLINK 4
#define OSPF_IT_UNDEF 5
Ondřej Filip's avatar
Ondřej Filip committed
219 220 221
  u8 strictnbma;		/* Can I talk with unknown neighbors? */
  u8 stub;			/* Inactive interface */
  u8 state;			/* Interface state machine */
222
#define OSPF_IS_DOWN 0		/* Not working */
223
#define OSPF_IS_LOOP 1		/* Iface with no link */
224 225 226 227 228
#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 */
229 230
  timer *wait_timer;		/* WAIT timer */
  timer *hello_timer;		/* HELLOINT timer */
231
  timer *poll_timer;		/* Poll Interval - for NBMA */
Ondřej Filip's avatar
 
Ondřej Filip committed
232 233 234
/* Default values for interface parameters */
#define COST_D 10
#define RXMTINT_D 5
235
#define INFTRANSDELAY_D 1
Ondřej Filip's avatar
 
Ondřej Filip committed
236
#define PRIORITY_D 1
Ondřej Filip's avatar
 
Ondřej Filip committed
237
#define HELLOINT_D 10
238
#define POLLINT_D 20
Ondřej Filip's avatar
 
Ondřej Filip committed
239
#define DEADC_D 4
240 241 242 243 244 245 246
#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 */
247
  struct top_hash_entry *link_lsa;	/* Originated link LSA */
248 249 250
  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
251
  list nbma_list;
252
  u8 priority;			/* A router priority for DR election */
253
  u8 ioprob;
254 255 256
#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) */
257
  u8 sk_dr; 			/* Socket is a member of DRouters group */
258
  u8 marked;			/* Used in OSPF reconfigure */
259
  u16 rxbuf;			/* Buffer size */
260
  u8 check_link;		/* Whether iface link change is used */
Ondřej Zajíček's avatar
Ondřej Zajíček committed
261
  u8 ecmp_weight;		/* Weight used for ECMP */
Ondřej Filip's avatar
 
Ondřej Filip committed
262 263
};

264 265 266 267 268 269 270 271 272 273 274 275 276 277
struct ospf_md5
{
  u16 zero;
  u8 keyid;
  u8 len;
  u32 csn;
};

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

278 279

/* Packet types */
Ondřej Filip's avatar
Ondřej Filip committed
280 281 282 283 284
#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 */
285 286

/* Area IDs */
Ondřej Filip's avatar
Ondřej Filip committed
287
#define BACKBONE 0
288 289


Ondřej Filip's avatar
Ondřej Filip committed
290 291
struct immsb
{
Ondřej Zajíček's avatar
Ondřej Zajíček committed
292
#ifdef CPU_BIG_ENDIAN
293 294 295 296 297
  u8 padding:5;
  u8 i:1;
  u8 m:1;
  u8 ms:1;
#else
298 299 300 301
  u8 ms:1;
  u8 m:1;
  u8 i:1;
  u8 padding:5;
302
#endif
303 304
};

Ondřej Filip's avatar
Ondřej Filip committed
305 306
union imms
{
307 308 309
  u8 byte;
  struct immsb bit;
};
310 311 312
#define DBDES_MS 1
#define DBDES_M 2
#define DBDES_I 4
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341


#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;
342 343
};

344

345 346 347 348 349
#endif




Ondřej Filip's avatar
Ondřej Filip committed
350 351 352 353 354 355
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 */
356 357

#ifdef OSPFv2
358
  u8 options;
359
  u8 type;
360 361 362 363 364 365 366

#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

367 368 369 370 371
#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)

372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
#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

394
  u32 id;
Ondřej Filip's avatar
Ondřej Filip committed
395 396
  u32 rt;			/* Advertising router */
  s32 sn;			/* LS Sequence number */
397 398
#define LSA_INITSEQNO ((s32) 0x80000001)
#define LSA_MAXSEQNO ((s32) 0x7fffffff)
399
  u16 checksum;
Ondřej Filip's avatar
Ondřej Filip committed
400
  u16 length;
401 402
};

403

404 405 406 407 408 409 410
#define LSART_PTP 1
#define LSART_NET 2
#define LSART_STUB 3
#define LSART_VLNK 4


#ifdef OSPFv2
411

Ondřej Filip's avatar
Ondřej Filip committed
412 413
struct ospf_lsa_rt
{
414
#ifdef CPU_BIG_ENDIAN
415
  u16 options;	/* VEB flags only */
416
  u16 links;
417 418 419 420
#else
  u16 links;
  u16 options;	/* VEB flags only */
#endif
421 422
};

Ondřej Filip's avatar
Ondřej Filip committed
423 424
struct ospf_lsa_rt_link
{
425 426
  u32 id;
  u32 data;
427
#ifdef CPU_BIG_ENDIAN
428
  u8 type;
429
  u8 padding;
430
  u16 metric;
431 432 433 434 435
#else
  u16 metric;
  u8 padding;
  u8 type;
#endif
436 437
};

438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457
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;
};

458 459
#define LSA_SUM_TOS  0xFF000000
#define LSA_EXT_TOS  0x7F000000
460 461
#define LSA_EXT_EBIT 0x80000000

462 463 464 465
/* Endianity swap for lsa->type */
#define ntoht(x) x
#define htont(x) x

466 467 468 469 470 471 472 473 474 475

#else  /* OSPFv3 */

struct ospf_lsa_rt
{
  u32 options;
};

struct ospf_lsa_rt_link
{
476
#ifdef CPU_BIG_ENDIAN
477
  u8 type;
478 479
  u8 padding;
  u16 metric;
480 481 482 483 484
#else
  u16 metric;
  u8 padding;
  u8 type;
#endif
485 486 487
  u32 lif;	/* Local interface ID */
  u32 nif;	/* Neighbor interface ID */
  u32 id;	/* Neighbor router ID */
488 489
};

Ondřej Filip's avatar
Ondřej Filip committed
490 491
struct ospf_lsa_net
{
492 493
  u32 options;
  u32 routers[];
494 495
};

496
struct ospf_lsa_sum_net
Ondřej Filip's avatar
Ondřej Filip committed
497
{
498 499
  u32 metric;
  u32 prefix[];
500 501
};

502 503 504 505 506 507
struct ospf_lsa_sum_rt
{
  u32 options;
  u32 metric;
  u32 drid;
};
Ondřej Filip's avatar
Ondřej Filip committed
508 509

struct ospf_lsa_ext
Ondřej Filip's avatar
Ondřej Filip committed
510
{
511 512 513 514 515 516 517 518 519 520 521 522 523 524
  u32 metric;
  u32 rest[];
};

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

struct ospf_lsa_prefix
{
525
#ifdef CPU_BIG_ENDIAN
526 527
  u16 pxcount;
  u16 ref_type;
528 529 530 531
#else
  u16 ref_type;
  u16 pxcount;
#endif
532 533 534
  u32 ref_id;
  u32 ref_rt;
  u32 rest[];
Ondřej Filip's avatar
Ondřej Filip committed
535 536
};

537 538 539 540
#define LSA_EXT_EBIT 0x4000000
#define LSA_EXT_FBIT 0x2000000
#define LSA_EXT_TBIT 0x1000000

541 542 543 544
/* Endianity swap for lsa->type */
#define ntoht(x) ntohs(x)
#define htont(x) htons(x)

545 546 547 548 549
#endif

#define METRIC_MASK  0x00FFFFFF
#define OPTIONS_MASK 0x00FFFFFF

550 551
static inline unsigned
lsa_rt_count(struct ospf_lsa_header *lsa)
552 553 554 555 556
{
  return (lsa->length - sizeof(struct ospf_lsa_header) - sizeof(struct ospf_lsa_rt))
    / sizeof(struct ospf_lsa_rt_link);
}

557 558
static inline unsigned
lsa_net_count(struct ospf_lsa_header *lsa)
559 560 561 562 563 564
{
  return (lsa->length - sizeof(struct ospf_lsa_header) - sizeof(struct ospf_lsa_net))
    / sizeof(u32);
}


565 566
#ifdef OSPFv3

567 568 569
#define IPV6_PREFIX_SPACE(x) ((((x) + 63) / 32) * 4)
#define IPV6_PREFIX_WORDS(x) (((x) + 63) / 32)

570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599
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;
}

600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
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;
}

623 624 625 626
#endif



Ondřej Filip's avatar
Ondřej Filip committed
627 628
struct ospf_lsreq_header
{
629
  u32 type;
Ondřej Filip's avatar
Ondřej Filip committed
630
  u32 id;
Ondřej Filip's avatar
Ondřej Filip committed
631
  u32 rt;			/* Advertising router */
Ondřej Filip's avatar
Ondřej Filip committed
632 633
};

Ondřej Filip's avatar
Ondřej Filip committed
634 635
struct l_lsr_head
{
636 637 638 639
  node n;
  struct ospf_lsreq_header lsh;
};

640

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

691
/* Definitions for interface state machine */
Ondřej Filip's avatar
Ondřej Filip committed
692 693 694 695
#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 */
696 697
#define ISM_LOOP 4		/* Link down */
#define ISM_UNLOOP 5		/* Link up */
Ondřej Filip's avatar
Ondřej Filip committed
698
#define ISM_DOWN 6		/* Interface down */
699 700

/* Definitions for neighbor state machine */
Ondřej Filip's avatar
Ondřej Filip committed
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716
#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
{
717
  node n;
718
  u32 areaid;
719
  struct ospf_area_config *ac;	/* Related area config, might be NULL */
Ondřej Filip's avatar
Ondřej Filip committed
720
  struct top_hash_entry *rt;	/* My own router LSA */
721
  struct top_hash_entry *pxr_lsa; /* Originated prefix LSA */
722
  list cand;			/* List of candidates for RT calc. */
Ondřej Filip's avatar
Ondřej Filip committed
723
  struct fib net_fib;		/* Networks to advertise or not */
724
  u32 stub;			/* 0 or stub area cost */
725
  u32 options;			/* Optional features */
726 727 728
  byte origrt;			/* Rt lsa origination scheduled? */
  byte trcap;			/* Transit capability? */
  byte marked;			/* Used in OSPF reconfigure */
Ondřej Filip's avatar
Ondřej Filip committed
729
  struct proto_ospf *po;
Ondřej Filip's avatar
Ondřej Filip committed
730
  struct fib rtr;		/* Routing tables for routers */
731 732
};

Ondřej Filip's avatar
Ondřej Filip committed
733 734
struct proto_ospf
{
735
  struct proto proto;
736 737
  timer *disp_timer;		/* OSPF proto dispatcher */
  unsigned tick;
738 739
  struct top_graph *gr;		/* LSA graph */
  slist lsal;			/* List of all LSA's */
740 741
  int calcrt;			/* Routing table calculation scheduled?
				   0=no, 1=normal, 2=forced reload */
742
  list iface_list;		/* Interfaces we really use */
743
  list area_list;
744
  int areano;			/* Number of area I belong to */
Ondřej Filip's avatar
Ondřej Filip committed
745
  struct fib rtf;		/* Routing table */
Ondřej Zajíček's avatar
Ondřej Zajíček committed
746 747 748
  byte rfc1583;			/* RFC1583 compatibility */
  byte ebit;			/* Did I originate any ext lsa? */
  byte ecmp;			/* Maximal number of nexthops in ECMP route, or 0 */
Ondřej Filip's avatar
Ondřej Filip committed
749
  struct ospf_area *backbone;	/* If exists */
750 751
  void *lsab;			/* LSA buffer used when originating router LSAs */
  int lsab_size, lsab_used;
Ondřej Zajíček's avatar
Ondřej Zajíček committed
752
  linpool *nhpool;		/* Linpool used for next hops computed in SPF */
753
  u32 router_id;
754 755
};

Ondřej Filip's avatar
Ondřej Filip committed
756 757
struct ospf_iface_patt
{
Ondřej Filip's avatar
Ondřej Filip committed
758
  struct iface_patt i;
759 760
  u32 type;
  u32 stub;
761 762 763 764 765 766
  u32 cost;
  u32 helloint;
  u32 rxmtint;
  u32 pollint;
  u32 waitint;
  u32 deadc;
767 768 769
  u32 deadint;
  u32 inftransdelay;
  u32 priority;
770
  u32 strictnbma;
771 772
  list nbma_list;
  u32 voa;
Ondřej Filip's avatar
Ondřej Filip committed
773
  u32 vid;
774
  u16 rxbuf;
775
  u8 check_link;
Ondřej Zajíček's avatar
Ondřej Zajíček committed
776
  u8 ecmp_weight;
777 778 779
#define OSPF_RXBUF_NORMAL 0
#define OSPF_RXBUF_LARGE 1
#define OSPF_RXBUF_MINSIZE 256	/* Minimal allowed size */
780
  u32 autype;			/* Not really used in OSPFv3 */
781 782 783 784 785 786 787 788 789 790 791 792
#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
793 794
};

795

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
struct ospf_area *ospf_find_area(struct proto_ospf *po, u32 aid);

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

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

818

Martin Mareš's avatar
Martin Mareš committed
819 820 821
#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)
822
#define EA_OSPF_ROUTER_ID EA_CODE(EAP_OSPF, 3)
Martin Mareš's avatar
Martin Mareš committed
823

Ondřej Filip's avatar
Ondřej Filip committed
824
#include "proto/ospf/rt.h"
825 826 827 828 829 830
#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
831
#include "proto/ospf/lsreq.h"
832 833 834
#include "proto/ospf/lsupd.h"
#include "proto/ospf/lsack.h"
#include "proto/ospf/lsalib.h"
835

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