Files
vxWorks/h/wrn/ospfv3/ospfv3Structures.h
2025-08-20 18:25:46 +08:00

1789 lines
76 KiB
C

/* ospfv3Structures.h - OSPFv3 structures header file */
/* Copyright 2004 Wind River Systems, Inc. */
#include "copyright_wrs.h"
/*
modification history
--------------------
02k,10dec04,tlu Clean up compile warning on #endif (line 1751)
02j,29nov04,tlu OSPF stack decoupling
02i,31jul04,dsk code insepction fixes
02h,28apr04,dsk Interop with dual stack routing table
02g,14apr04,ram Performance optimization changes
02f,13apr04,ram OSPFv3 Routing Table Hash Modifications
02e,13apr04,ram LSDB AVL modifications
02d,07apr04,ram OSPF v2/v3 coexistance compile
02c,31mar04,dsk Modifications for OSPFv3 ANVL conformance
02b,31mar04,dsk Modifications for OSPFv3 ANVL conformance
02a,11mar04,dsk Modifications for OSPFv3 ANVL conformance
01z,16dec03,ram Mods per type 3 & 4 testing
01y,27nov03,dsk Mods according to integration testing
01x,06nov03,ram Modifications for external routes
01w,06nov03,dsk mods to type 5 LSAs due to var length address prefix
01v,22oct03,ram Modifications for LS request & separating performance
01u,21oct03,ram Modifications for adjacency establishment
01t,17oct03,ram Modifications for memory corruption, traffic, & debug output
01s,10oct03,ram Modifications for LSDB, dynamic config, & NSSA cleanup
01r,07oct03,agi added inter_area_prefix_lsa_id, inter_area_router_lsa_id to
OSPFV3_CLASS
01q,30sep03,ram OSPF datapath changes
01p,25sep03,ram Second general modifications submission
01r,05aug03,agi code clean-up
01p,29jul03,ram Added sockets, processing, and external route changes
01o,23jul03,agi added RWOS removal changes
updated copyright
01n,03jun03,agi fixed structure declaration order for diab compilation, added
number_of_prefixes to the interface structures
01m,22may03,dsk added definition for surrogate hello processing
definitions for prioritized hello processing
definitions for routing table entry prefix list
removed redundant fields of routing table and of LSDB
changes for routing table lookup due to multiple prefixes per entry
added LSA counts needed by MIB
added advertising router for unique identification of SPF nodes
added definitions for replacing rwos objects with vxWorks objects
(removed rwos dispatchers, added task descriptors, timer and semaphores)
definitions for generating unique IDs for LSAs in aggregates
fix early LSA retransmission filter (SPR 88619)
01l,04feb02,dsk added list of address prefixes for interface and hash table changes
01k,18feb03,dsk ported from OSPFv2 to OSPFv3 structures
01j,04feb02,dsk added usage of in6_addr (from IPv6 router stack) for IPv6 address
01i,23jan03,htm added changes for IPv6
01h,21jan03,agi updated LSA datastructures
01g,10jan03,agi propogated SPR#85432, 83418 fixes from OSPFv2
01f,10jan03,agi initial changes to the LSA datastructures
removed unused TE datastructures
01e,06jan03,agi propogated SPR#75194, ANVL 27.15 fix from OSPFv2
fixed compilation
01d,06jan03,hme changed all OSPFv3 data structures as per RFC 2740
01c,23dec02,agi propogated TMS code merge for SPR#84284
propogated SPR#75796 ANVL 37.1 fix from OSPFv2
propogated fix for SPR#81628 ANVL 13.6 to pass on MIPS board
01b,25oct02,agi added initial structures
first pass at clean-up
01a,23oct02,agi written
*/
#ifndef __INCospfv3Structuresh
#define __INCospfv3Structuresh
#ifdef __cplusplus
extern "C" {
#endif
#include <inetLib.h>
#include <net/if.h>
/*#include <netinet/ipv6.h> */ /* for struct ip6_hdr, TODO: TBD include path */
#include <sys/socket.h>
#include <net/socketvar.h>
#define OSPFV3_SURROGATE_HELLO_ENABLED
enum PROTOCOL_STACK_TYPE
{
IP_PROTOCOL_STACK,
IPX_PROTOCOL_STACK,
SPANNING_TREE_STACK,
SOURCE_ROUTING_STACK,
NLSP_PROTOCOL_STACK,
DLSW_PROTOCOL_STACK,
OSPFV3_PROTOCOL_STACK,
APPLETALK_PROTOCOL_STACK,
NETBIOS_PROTOCOL_STACK,
VINES_PROTOCOL_STACK,
CONSOLE_PROTOCOL_STACK,
L2TP_PROTOCOL_STACK,
RTM_PROTOCOL_STACK,
PPTP_DATA_TUNNEL,
PPP_OVER_ETHERNET_PROTOCOL_STACK,
VPN_INTERFACE_VIRTUAL_PROTOCOL_STACK
};
enum PROTOCOL_CONTROL_OPERATION
{
OPEN_PROTOCOL_STACK,
CLOSE_PROTOCOL_STACK,
GET_IP_ADDRESS_FOR_PORT,
IS_PROTOCOL_STACK_ENABLED = 0x0100,
GET_NUMBER_OF_PROTOCOL_STACKS_VIRTUAL_PORTS,
GET_PROTOCOL_STACK_TYPE,
GET_PROTOCOL_STACK_PROTOCOL_ID,
GET_PROTOCOL_STACK_SSAP,
GET_PROTOCOL_STACK_DSAP,
GET_PROTOCOL_STACK_VIRTUAL_PORT_PACKET_TYPE,
GET_PROTOCOL_STACK_REAL_PORT_NUMBER_USING_VIRTUAL_PORT_NUMBER,
INITIALIZE_SOCKET_PROTOCOL_STACK_INTERFACE,
IS_TOKEN_RING_FRAME_SOURCE_ROUTED,
IS_TOKEN_RING_FRAME_A_MAC,
GET_LENGTH_OF_TOKEN_RING_RIF,
CLEAR_SOURCE_ROUTED_BIT,
MOVE_RIF_INTO_PACKET,
IS_MAC_ADDRESS_SOURCE_ROUTED,
REGISTER_TO_IP_FROM_UPPER_LAYER,
INITIALIZE_STACK_FUNCTION_POINTERS,
INITIALIZE_PROTOCOL_FUNCTION_POINTERS,
GET_PROTOCOL_ADDRESS,
CLEAR_CACHED_ROUTE,
REINITIALIZE_PROTOCOL_STACK,
PROTOCOL_STACK_ROUTERWARE_CONTROL,
UNINITIALIZE_PROTOCOL_STACK,
PROTOCOL_ROUTE_ADDED,
PROTOCOL_ROUTE_DELETED,
PROTOCOL_ROUTE_CHANGED,
LLC_PROTOCOL_STACK,
REGISTER_NAT_FILTER = 200,
DEREGISTER_NAT_FILTER,
OPEN_PROTOCOL_STACK_PORT,
CLOSE_PROTOCOL_STACK_PORT,
ADD_IP_ADDRESS_AND_NETWORK_MASK_FOR_PORT,
ADD_REMOTE_IP_ADDRESS_FOR_PORT,
OPEN_VIRTUAL_PORT,
CLOSE_VIRTUAL_PORT,
REINITIALIZE_VIRTUAL_PORT,
UNINITIALIZE_VIRTUAL_PORT
};
typedef struct OSPFV3_RETURN_TYPE
{
enum OSPFV3_PACKET_STATE packet_state;
BYTE_ENUM (BOOLEAN) exit_routine;
} OSPFV3_RETURN_TYPE;
/**************************************************************************************/
/* Definition of the generic node structure for database containers like LSDB and routing table.
Links LSAs into their container (DLL or AVL),
links routing table entries into their container (DLL or AVL) */
/* used for pointer manipulation when inserting and removing nodes in a list */
typedef struct OSPFV3_GENERIC_NODE
{
struct OSPFV3_GENERIC_NODE *sptr_forward_link;
struct OSPFV3_GENERIC_NODE *sptr_backward_link;
} OSPFV3_GENERIC_NODE;
/**************************************************************************************/
/* RFC 2740 definition of options, annex A.2 */
#if (_BYTE_ORDER == _LITTLE_ENDIAN )
typedef _struct OSPFV3_OPTIONS
{
BIT_FIELD_8 (enum,BOOLEAN) V6:1;
BIT_FIELD_8 (enum,BOOLEAN) externals:1;
BIT_FIELD_8 (enum,BOOLEAN) multicast:1;
BIT_FIELD_8 (enum,BOOLEAN) nssa:1;
BIT_FIELD_8 (enum,BOOLEAN) R:1;
BIT_FIELD_8 (enum,BOOLEAN) demand_circuit:1; /* not supported, RFC 1793 */
BIT_FIELD_8 (enum,BOOLEAN) not_used_1:2; /* should be set to zero */
BIT_FIELD_8 (enum,BOOLEAN) not_used_2:8; /* should be set to zero */
BIT_FIELD_8 (enum,BOOLEAN) not_used_3:8; /* should be set to zero */
} _pack OSPFV3_OPTIONS;
#else /* _BYTE_ORDER == _BIG_ENDIAN */
typedef _struct OSPFV3_OPTIONS
{
BIT_FIELD_8 (enum,BOOLEAN) not_used_3:8; /* should be set to zero */
BIT_FIELD_8 (enum,BOOLEAN) not_used_2:8; /* should be set to zero */
BIT_FIELD_8 (enum,BOOLEAN) not_used_1:2; /* should be set to zero */
BIT_FIELD_8 (enum,BOOLEAN) demand_circuit:1; /* not supported */
BIT_FIELD_8 (enum,BOOLEAN) R:1;
BIT_FIELD_8 (enum,BOOLEAN) nssa:1;
BIT_FIELD_8 (enum,BOOLEAN) multicast:1;
BIT_FIELD_8 (enum,BOOLEAN) externals:1;
BIT_FIELD_8 (enum,BOOLEAN) V6:1;
} _pack OSPFV3_OPTIONS;
#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
typedef _union UNION_OSPFV3_OPTIONS
{
OSPFV3_OPTIONS _bit;
/*BYTE _byte[3];*/
} _pack UNION_OSPFV3_OPTIONS;
/**************************************************************************************/
/* DD packets flags */
#if (_BYTE_ORDER == _LITTLE_ENDIAN )
typedef _struct OSPFV3_FLAGS
{
BIT_FIELD (enum,BOOLEAN) master:1;
BIT_FIELD (enum,BOOLEAN) more:1;
BIT_FIELD (enum,BOOLEAN) initialize:1;
BIT_FIELD (enum,BOOLEAN) not_used:5;
} _pack OSPFV3_FLAGS;
#else /* _BYTE_ORDER == _BIG_ENDIAN */
typedef _struct OSPFV3_FLAGS
{
BIT_FIELD (enum,BOOLEAN) not_used:5;
BIT_FIELD (enum,BOOLEAN) initialize:1;
BIT_FIELD (enum,BOOLEAN) more:1;
BIT_FIELD (enum,BOOLEAN) master:1;
} _pack OSPFV3_FLAGS;
#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
typedef _union UNION_OSPFV3_FLAGS
{
OSPFV3_FLAGS _bit;
BYTE _byte;
} _pack UNION_OSPFV3_FLAGS;
/**************************************************************************************/
/* RFC 2740 definition of LS_type, RFC 2740, annex A.4.2.1, page 59
This field combines flooding scope and type. Is to be used ONLY by ntoh at LSA receival
and by hton at LSA sending.
For all computation purpose, please use the distinct fields flood and type defined in
structure OSPFV3_LS_HEADER below,
Reason: type preserves its index properties that it had in OSPFv2 (contiguous range, start at 0) so
type can be and is extensively used as index in LSDB.
Presenting the 2 fields flood and type combined into one field only affect order of endianness,
should only be taken in consideration at receiving / sending the LSA */
#if (_BYTE_ORDER == _LITTLE_ENDIAN )
typedef _struct OSPFV3_LS_TYPE_AND_FLOOD_FIELD
{
BIT_FIELD_8 (enum,BOOLEAN) U:1;
BIT_FIELD_8 (enum,BOOLEAN) S1:1;
BIT_FIELD_8 (enum,BOOLEAN) S2:1;
BIT_FIELD_8 (enum,BOOLEAN) unused:5;
BIT_FIELD_8 (enum,BOOLEAN) lsa_function_code:8;
} _pack OSPFV3_LS_TYPE_AND_FLOOD_FIELD;
#else /* _BYTE_ORDER == _BIG_ENDIAN */
typedef _struct OSPFV3_LS_TYPE_AND_FLOOD_FIELD
{
BIT_FIELD_8 (enum,BOOLEAN) lsa_function_code:8;
BIT_FIELD_8 (enum,BOOLEAN) unused:5;
BIT_FIELD_8 (enum,BOOLEAN) S2:1;
BIT_FIELD_8 (enum,BOOLEAN) S1:1;
BIT_FIELD_8 (enum,BOOLEAN) U:1;
} _pack OSPFV3_LS_TYPE_AND_FLOOD_FIELD;
#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
typedef _union UNION_OSPFV3_LS_TYPE
{
OSPFV3_LS_TYPE_AND_FLOOD_FIELD _bit;
USHORT _ushort;
} _pack UNION_OSPFV3_LS_TYPE;
/**************************************************************************************/
/* definition of LSA header, as per RFC 2740, annex A.4.2, page 58 */
typedef _struct OSPFV3_LS_HEADER
{
USHORT age;
BYTE_ENUM (OSPFV3_LS_FLOODING_SCOPE) flood; /* OSPFv3 flooding scope,
first byte of LS type, RFC 2740 section A.4.2 */
BYTE_ENUM (OSPFV3_LS_TYPE) type; /* Type of advertisement */
ULONG id; /* Link State Id */
ULONG advertising_router;
seq_t sequence_number;
USHORT checksum;
USHORT length; /* length of advertisement*/
} _pack OSPFV3_LS_HEADER;
/**************************************************************************************/
/* definition of OSPF HELLO PDU, as per RFC 2740, annex A.3.2, page 50 */
typedef _struct OSPFV3_HELLO_HEADER
{
ULONG interface_id;
BYTE router_priority; /* if set to 0, this router is not eligible to
become designated router */
UNION_OSPFV3_OPTIONS options;
USHORT hello_interval; /* number of seconds between this router's Hello packets */
USHORT router_dead_interval; /* number of seconds before declaring a silent router down */
ULONG designated_router; /* identity of the designated router for
this network */
ULONG backup_designated_router; /* identity of the backup designated
router for this network */
ULONG neighbor; /* IDs of each router from whom valid Hello packets
have been seen recently on this network */
} _pack OSPFV3_HELLO_HEADER;
/**************************************************************************************/
/* definition of OSPF Database Description PDU, as per RFC 2740, annex A.3.3, page 51 */
typedef _struct OSPFV3_DATABASE_HEADER
{
/* RFC 2178 G.9 */
BYTE zero_field_1;
UNION_OSPFV3_OPTIONS options;
USHORT interface_mtu;
BYTE zero_field_2;
UNION_OSPFV3_FLAGS flags;
ULONG sequence;
OSPFV3_LS_HEADER link_state_advertisement_header;
} _pack OSPFV3_DATABASE_HEADER;
/**************************************************************************************/
/* definition of OSPF Link State Request PDU, as per RFC 2740, annex A.3.4, page 53 */
typedef _struct OSPFV3_LS_REQUESTED_ADVERTISEMENT
{
BYTE reserved_bytes[2];
BYTE_ENUM (OSPFV3_LS_FLOODING_SCOPE) flood;
BYTE_ENUM(OSPFV3_LS_TYPE) type; /* type of advertisement */
ULONG id; /* Link State Id */
ULONG advertising_router;
} _pack OSPFV3_LS_REQUESTED_ADVERTISEMENT;
typedef _struct OSPFV3_LS_REQUEST_HEADER
{
OSPFV3_LS_REQUESTED_ADVERTISEMENT requested_advertisement;
} _pack OSPFV3_LS_REQUEST_HEADER;
/* Definition of OSPFv3 Link State Request PDU, as defined by RFC 2740, annex A.3.4, page 53 */
typedef struct OSPFV3_LS_REQUEST
{
struct OSPFV3_LS_REQUEST *sptr_forward_link;
struct OSPFV3_LS_REQUEST *sptr_backward_link;
OSPFV3_LS_REQUESTED_ADVERTISEMENT lsr; /* link state requst PDU contents */
seq_t sequence_number;
USHORT checksum;
USHORT age;
} OSPFV3_LS_REQUEST;
/**************************************************************************************/
/* definition of OSPF Type 1 Lsa = Router LSA, as per RFC 2740, annex A.4.3, page 60 */
#if (_BYTE_ORDER == _LITTLE_ENDIAN )
typedef _struct OSPFV3_ROUTER_LINK_BIT_OPTIONS
{
BIT_FIELD (enum,BOOLEAN) bit_B:1;
BIT_FIELD (enum,BOOLEAN) bit_E:1;
BIT_FIELD (enum,BOOLEAN) bit_V:1;
BIT_FIELD (enum,BOOLEAN) bit_W:1;
BIT_FIELD (enum,BOOLEAN) not_used:4;
} _pack OSPFV3_ROUTER_LINK_BIT_OPTIONS;
#else /* _BYTE_ORDER == _BIG_ENDIAN */
typedef _struct OSPFV3_ROUTER_LINK_BIT_OPTIONS
{
BIT_FIELD (enum,BOOLEAN) not_used:4;
BIT_FIELD (enum,BOOLEAN) bit_W:1;
BIT_FIELD (enum,BOOLEAN) bit_V:1;
BIT_FIELD (enum,BOOLEAN) bit_E:1;
BIT_FIELD (enum,BOOLEAN) bit_B:1;
} _pack OSPFV3_ROUTER_LINK_BIT_OPTIONS;
#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
typedef _union UNION_OSPFV3_ROUTER_LINK_BIT_OPTIONS
{
OSPFV3_ROUTER_LINK_BIT_OPTIONS _bit;
BYTE _byte; /* was _ushort in OSPFv2 */
} _pack UNION_OSPFV3_ROUTER_LINK_BIT_OPTIONS;
typedef _struct OSPFV3_ROUTER_LINK_PIECE
{
BYTE_ENUM (OSPFV3_ROUTER_LINK_TYPE) type;
BYTE zero_filed;
USHORT metric;
ULONG interface_id;
ULONG neighbor_interface_id;
ULONG neighbor_router_id;
} _pack OSPFV3_ROUTER_LINK_PIECE;
typedef _struct OSPFV3_ROUTER_LINK_ADVERTISEMENT_HEADER
{
OSPFV3_LS_HEADER ls_header;
UNION_OSPFV3_ROUTER_LINK_BIT_OPTIONS bit_options;
UNION_OSPFV3_OPTIONS options;
OSPFV3_ROUTER_LINK_PIECE link;
} _pack OSPFV3_ROUTER_LINK_ADVERTISEMENT_HEADER;
typedef _struct OSPFV3_ROUTER_LSA_LINK
{
OSPFV3_GENERIC_NODE links;
OSPFV3_ROUTER_LINK_ADVERTISEMENT_HEADER lsa;
} _pack OSPFV3_ROUTER_LSA_LINK;
/**************************************************************************************/
/* definition of OSPF type 2 LSA = Network LSAs, as per RFC 2740, annex A.4.4, page 63 */
typedef _struct OSPFV3_NETWORK_LINK_PIECE
{
ULONG link_id;
} _pack OSPFV3_NETWORK_LINK_PIECE;
typedef _struct OSPFV3_NETWORK_LINK_ADVERTISEMENT_HEADER
{
OSPFV3_LS_HEADER ls_header;
BYTE zero_field;
UNION_OSPFV3_OPTIONS options; /* three bytes */
OSPFV3_NETWORK_LINK_PIECE attached_router;
} _pack OSPFV3_NETWORK_LINK_ADVERTISEMENT_HEADER;
typedef _struct OSPFV3_NETWORK_LSA_LINK
{
OSPFV3_GENERIC_NODE links;
OSPFV3_NETWORK_LINK_ADVERTISEMENT_HEADER lsa;
} _pack OSPFV3_NETWORK_LSA_LINK;
/**************************************************************************************/
/* definition of OSPFv3 address prefix, as defined by RFC 2740, annex A.4.1, page 57,
for all LSAs including address prefix lists */
#if (_BYTE_ORDER == _LITTLE_ENDIAN )
typedef _struct OSPFV3_IPV6_ADDR_PREFIX_BIT_OPTIONS
{
BIT_FIELD_8 (enum,BOOLEAN) NU:1;
BIT_FIELD_8 (enum,BOOLEAN) LA:1;
BIT_FIELD_8 (enum,BOOLEAN) MC:1;
BIT_FIELD_8 (enum,BOOLEAN) P:1;
BIT_FIELD_8 (enum,BOOLEAN) not_used:4;
} _pack OSPFV3_IPV6_ADDR_PREFIX_BIT_OPTIONS;
#else /* _BYTE_ORDER == _BIG_ENDIAN */
typedef _struct PREFIX_BIT_OPTIONS
{
BIT_FIELD_8 (enum,BOOLEAN) not_used:4;
BIT_FIELD_8 (enum,BOOLEAN) P:1;
BIT_FIELD_8 (enum,BOOLEAN) MC:1;
BIT_FIELD_8 (enum,BOOLEAN) LA:1;
BIT_FIELD_8 (enum,BOOLEAN) NU:1;
} _pack OSPFV3_IPV6_ADDR_PREFIX_BIT_OPTIONS;
#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
typedef _union UNION_OSPFV3_IPV6_ADDR_PREFIX_BIT_OPTIONS
{
OSPFV3_IPV6_ADDR_PREFIX_BIT_OPTIONS _bit;
BYTE _byte;
} _pack UNION_OSPFV3_IPV6_ADDR_PREFIX_BIT_OPTIONS;
typedef _struct OSPFV3_IPV6_ADDR_PREFIX
{
BYTE prefix_length;
UNION_OSPFV3_IPV6_ADDR_PREFIX_BIT_OPTIONS prefix_options;
USHORT null_or_referenced_type_or_metric; /* this
2 byte field always exists
between prefix_options and address_prefix in all prefix LSAs. Its value is:
null, unused in inter-area prefix LSAs and link-lsas,
metric for intra-area prefix LSAs,
referenced_ls_type for external LSAs */
struct in6_addr address_prefix; /* dsk changed to use definition of IPv6 address
from target/h/netinet6/in6.h */
} _pack OSPFV3_IPV6_ADDR_PREFIX;
typedef _struct OSPFV3_IPV6_ADDR_PREFIX_LINKS
{
OSPFV3_GENERIC_NODE links;
OSPFV3_IPV6_ADDR_PREFIX prefix;
} _pack OSPFV3_IPV6_ADDR_PREFIX_LINKS;
/* RFC 2740, section A.4.1:
Within OSPF, IPv6 address prefixes are always represented by a
combination of three fields: PrefixLength, PrefixOptions, and Address
Prefix. PrefixLength is the length in bits of the prefix.
PrefixOptions is an 8-bit field describing various capabilities
associated with the prefix (see Section A.4.2). Address Prefix is an
encoding of the prefix itself as an even multiple of 32-bit words,
padding with zero bits as necessary; this encoding consumes
(PrefixLength + 31) / 32) 32-bit words.
*/
typedef _struct OSPFV3_IPV6_ADDR_PREFIX_RECEIVED
{
BYTE prefix_length;
UNION_OSPFV3_IPV6_ADDR_PREFIX_BIT_OPTIONS prefix_options;
USHORT null_or_referencedLSType_or_metric; /* this 2 byte field always exists
between prefix_options and address_prefix in all prefix LSAs. Its value is:
null, unused in inter-area prefix LSAs and link-lsas,
metric for intra-area prefix LSAs,
referenced_ls_type for external LSAs */
ULONG address_prefix[OSPFV3_SIZE_OF_IPV6_ADDRESS_32BITWORDS];
/* address prefix received is an even multiple of
32 bit words = 0, 2 or 4 LWORDs */
} _pack OSPFV3_IPV6_ADDR_PREFIX_RECEIVED;
/* these are used for storing prefixes associated with a routing table entry */
typedef _struct OSPFV3_ROUTING_TABLE_ADDR_PREFIX
{
BYTE prefix_length; /* mask length */
UNION_OSPFV3_IPV6_ADDR_PREFIX_BIT_OPTIONS prefix_options;
USHORT prefix_metric;
BYTE prefix_address; /* at least 1 byte in compressed format */
} _pack OSPFV3_ROUTING_TABLE_ADDR_PREFIX;
typedef _struct OSPFV3_ROUTING_TABLE_PREFIXES_AREA
{
short length;
short num_prefixes;
OSPFV3_ROUTING_TABLE_ADDR_PREFIX prefixes;
} _pack OSPFV3_ROUTING_TABLE_PREFIXES_AREA;
/**************************************************************************************/
/* Definition of OPSFv3 type 3 LSA = Inter-area Prefix LSA, as defined by
RFC 2740, annex A.4.5, page 64 */
typedef _struct OSPFV3_INTER_AREA_PREFIX_LSA_HEADER
{
OSPFV3_LS_HEADER ls_header;
ULONG metric;
OSPFV3_IPV6_ADDR_PREFIX address_prefix;
} _pack OSPFV3_INTER_AREA_PREFIX_LSA_HEADER;
typedef _struct OSPFV3_INTER_AREA_PREFIX_LSA_LINK
{
OSPFV3_GENERIC_NODE links;
OSPFV3_INTER_AREA_PREFIX_LSA_HEADER lsa;
} _pack OSPFV3_INTER_AREA_PREFIX_LSA_LINK;
/**************************************************************************************/
/* Definition of OSPFv3 type 4 LSAs = Inter-Area Router LSAs, as defined by
RFC 2740, annex A.4.6, page 65 */
typedef _struct OSPFV3_INTER_AREA_ROUTER_LSA_HEADER
{
OSPFV3_LS_HEADER ls_header;
BYTE zero_field;
UNION_OSPFV3_OPTIONS options;
ULONG metric;
ULONG destination_router_id;
} _pack OSPFV3_INTER_AREA_ROUTER_LSA_HEADER;
typedef _struct OSPFV3_INTER_AREA_ROUTER_LSA_LINK
{
OSPFV3_GENERIC_NODE links;
OSPFV3_INTER_AREA_ROUTER_LSA_HEADER lsa;
} _pack OSPFV3_INTER_AREA_ROUTER_LSA_LINK;
/**************************************************************************************/
/* Definition of OSPFv3 type 5 LSAs = AS-external LSAs, as defined by
RFC 2740, annex A.4.7, page 66 */
typedef _struct OSPF_EXTERNAL_LINK_METRIC_PIECE
{
USHORT tos;
USHORT metric;
ULONG forwarding_address;
ULONG external_route_tag;
} _pack OSPFV3_EXTERNAL_LSA_LINK_METRIC_PIECE;
#if (_BYTE_ORDER == _LITTLE_ENDIAN )
typedef _struct OSPFV3_AS_EXTERNAL_LSA_FLAGS_AND_METRIC
{
BIT_FIELD_32 (enum,BOOLEAN) metric:24;
BIT_FIELD_8 (enum,BOOLEAN) T:1;
BIT_FIELD_8 (enum,BOOLEAN) F:1;
BIT_FIELD_8 (enum,BOOLEAN) E:1;
BIT_FIELD_8 (enum,BOOLEAN) not_used:5;
} _pack OSPFV3_AS_EXTERNAL_LSA_FLAGS_AND_METRIC;
#else /* _BYTE_ORDER == _BIG_ENDIAN */
typedef _struct OSPFV3_AS_EXTERNAL_LSA_FLAGS_AND_METRIC
{
BIT_FIELD_8 (enum,BOOLEAN) not_used:5;
BIT_FIELD_8 (enum,BOOLEAN) E:1;
BIT_FIELD_8 (enum,BOOLEAN) F:1;
BIT_FIELD_8 (enum,BOOLEAN) T:1;
BIT_FIELD_32 (enum,BOOLEAN) metric:24;
} _pack OSPFV3_AS_EXTERNAL_LSA_FLAGS_AND_METRIC;
#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
typedef _union UNION_OSPFV3_AS_EXTERNAL_LSA_FLAGS_AND_METRIC
{
OSPFV3_AS_EXTERNAL_LSA_FLAGS_AND_METRIC _bit;
ULONG _ulong;
} _pack UNION_OSPFV3_AS_EXTERNAL_LSA_FLAGS_AND_METRIC;
typedef _struct OSPFV3_EXTERNAL_LINK_ADVERTISEMENT_HEADER {
OSPFV3_LS_HEADER ls_header;
UNION_OSPFV3_AS_EXTERNAL_LSA_FLAGS_AND_METRIC union_external_flags_metric;
OSPFV3_IPV6_ADDR_PREFIX address_prefix;
struct in6_addr template_forwarding_address;
ULONG template_external_route_tag;
ULONG template_referenced_link_state_id;
} _pack OSPFV3_EXTERNAL_LINK_ADVERTISEMENT_HEADER;
typedef _struct OSPFV3_EXTERNAL_LSA_LINK
{
OSPFV3_GENERIC_NODE links;
OSPFV3_EXTERNAL_LINK_ADVERTISEMENT_HEADER lsa;
} _pack OSPFV3_EXTERNAL_LSA_LINK;
/**************************************************************************************/
/* Definition of OSPFv3 type 7 LSAs = NSSA (Not-so-stubby-area) LSAs */
/* dsk: port type 7 (NSSA) to IPv6 when specified (not part of RFC 2740,
it only specifies they are supported, not their format) OSPFV3_TYPE_7_LINK_ADVERTISEMENT_HEADER
*/
#define OSPFV3_TYPE_7_LINK_ADVERTISEMENT_HEADER OSPFV3_EXTERNAL_LINK_ADVERTISEMENT_HEADER
typedef _struct OSPFV3_TYPE_7_LSA_LINK
{
OSPFV3_GENERIC_NODE links;
OSPFV3_TYPE_7_LINK_ADVERTISEMENT_HEADER lsa;
} _pack OSPFV3_TYPE_7_LSA_LINK;
/**************************************************************************************/
/* Definition of OSPFv3 type 8 LSA = Link LSA, as defined by RFC 2740, annex A.4.8, page 68 */
typedef _struct OSPFV3_LINK_LSA_HEADER
{
OSPFV3_LS_HEADER ls_header;
BYTE rtr_priority;
UNION_OSPFV3_OPTIONS options;
struct in6_addr link_local_interface_address;
ULONG number_prefixes;
OSPFV3_IPV6_ADDR_PREFIX address_prefix;
} _pack OSPFV3_LINK_LSA_HEADER;
typedef _struct OSPFV3_LINK_LSA_LINK
{
OSPFV3_GENERIC_NODE links;
OSPFV3_LINK_LSA_HEADER lsa;
} _pack OSPFV3_LINK_LSA_LINK;
/**************************************************************************************/
/* Definition of OPSFv3 type 9 LSA = intra-area prefix LSA, as defined by
RFC 2740, annex A.4.9, page 70 */
typedef _struct OSPFV3_INTRA_AREA_PREFIX_LSA_HEADER
{
OSPFV3_LS_HEADER ls_header;
USHORT number_prefixes;
USHORT referenced_ls_type;
ULONG referenced_link_state_id;
ULONG referenced_adv_router;
OSPFV3_IPV6_ADDR_PREFIX address_prefix;
} _pack OSPFV3_INTRA_AREA_PREFIX_LSA_HEADER;
typedef _struct OSPFV3_INTRA_AREA_PREFIX_LSA_LINK
{
OSPFV3_GENERIC_NODE links;
OSPFV3_INTRA_AREA_PREFIX_LSA_HEADER lsa;
} _pack OSPFV3_INTRA_AREA_PREFIX_LSA_LINK;
/**************************************************************************************/
/* Definition of union of all LSAs
UNION_OSPFV3_ADVERTISEMENT_HEADER is union of LSAs of all types, used for definition of
link state update
UNION_OSPFV3_LINK_STATE_ADVERTISEMENT is union of pointers to LSAs of all types,
used for LSDB traversal
*/
typedef _union UNION_OSPFV3_ADVERTISEMENT_HEADER
{
OSPFV3_ROUTER_LINK_ADVERTISEMENT_HEADER router;
OSPFV3_NETWORK_LINK_ADVERTISEMENT_HEADER network;
OSPFV3_INTER_AREA_PREFIX_LSA_HEADER inter_area_prefix;
OSPFV3_INTER_AREA_ROUTER_LSA_HEADER inter_area_router;
OSPFV3_EXTERNAL_LINK_ADVERTISEMENT_HEADER external;
OSPFV3_EXTERNAL_LINK_ADVERTISEMENT_HEADER type_7;
OSPFV3_LINK_LSA_HEADER link_lsa;
OSPFV3_INTRA_AREA_PREFIX_LSA_HEADER intra_area_prefix;
} _pack UNION_OSPFV3_ADVERTISEMENT_HEADER;
/* Definition of union of LSA pointers for all LSA types */
typedef union UNION_OSPFV3_LINK_STATE_ADVERTISEMENT
{
struct OSPFV3_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_router;
struct OSPFV3_NETWORK_LINK_ADVERTISEMENT_HEADER *sptr_network;
struct OSPFV3_INTER_AREA_PREFIX_LSA_HEADER *sptr_inter_area_prefix;
struct OSPFV3_INTER_AREA_ROUTER_LSA_HEADER *sptr_inter_area_router;
struct OSPFV3_EXTERNAL_LINK_ADVERTISEMENT_HEADER *sptr_external;
struct OSPFV3_TYPE_7_LINK_ADVERTISEMENT_HEADER *sptr_type_7;
struct OSPFV3_LINK_LSA_HEADER *sptr_link_lsa;
struct OSPFV3_INTRA_AREA_PREFIX_LSA_HEADER *sptr_intra_area_prefix;
} UNION_OSPFV3_LINK_STATE_ADVERTISEMENT;
/**************************************************************************************/
/* Definition of OSPFv3 Link State Update PDU, as defined by RFC 2740, annex A.3.5, page 54 */
typedef _struct OSPFV3_LS_UPDATE_HEADER
{
ULONG number_of_advertisements;
UNION_OSPFV3_ADVERTISEMENT_HEADER advertisement_header;
} _pack OSPFV3_LS_UPDATE_HEADER;
/**************************************************************************************/
/* Definition of OSPFv3 Link State Acknowledge PDU, as defined by RFC 2740, annex A.3.6, page 55 */
typedef _struct OSPFV3_LS_ACKNOWLEDGEMENT_HEADER
{
OSPFV3_LS_HEADER ls_advertisement_header;
} _pack OSPFV3_LS_ACKNOWLEDGEMENT_HEADER;
/**************************************************************************************/
/* Definition of union of OSPFv3 PDUs */
typedef _union UNION_OSPFV3_PACKET_TYPES
{
OSPFV3_HELLO_HEADER hello;
OSPFV3_DATABASE_HEADER database;
OSPFV3_LS_REQUEST_HEADER ls_request;
OSPFV3_LS_UPDATE_HEADER ls_update;
OSPFV3_LS_ACKNOWLEDGEMENT_HEADER ls_acknowledgement;
} _pack UNION_OSPFV3_PACKET_TYPES;
/**************************************************************************************/
/* Definition of OSPFv3 PDU header as defined by RFC 2740, annex A.3.1, page 48 */
typedef _struct OSPFV3_HEADER /* the standard 24 byte header for OSPF (page 178) */
{
BYTE version; /* set to 2 for this implementation */
BYTE_ENUM(OSPFV3_UNION_PACKET_TYPES) type;
USHORT length; /* length of entire OSPF protocol packet
in bytes, including the standard OSPF header */
ULONG router_id; /* identity of the router originating the packet */
ULONG area_id; /* a 32 bit number identifying the area
this packet belongs to */
USHORT checksum; /* checksum of the entire contents of the packet
starting with the OSPF packet header
but excluding the 64 bit authentication field */
BYTE instance_id;
BYTE zero_field;
UNION_OSPFV3_PACKET_TYPES rest_of_packet;
} _pack OSPFV3_HEADER;
/**************************************************************************************/
/* Definition of OSPFv3 PDU including IPv6 header, ip6_hdr, defined in wrn/coreip/protos/ipv6/ipv6.h */
typedef _struct OSPFV3_PACKET
{
OSPFV3_HEADER header;
} _pack OSPFV3_PACKET;
/**************************************************************************************/
typedef struct OSPFV3_LS_DATABASE_SUMMARY
{
struct OSPFV3_GENERIC_NODE links;
OSPFV3_HEADER *sptr_ospfv3_header;
USHORT size_of_packet; /* length of this packet including ospf header size */
USHORT number_of_database_entries;
} OSPFV3_LS_DATABASE_SUMMARY;
/**************************************************************************************/
/**************************************************************************************/
/****************************/
/* Routing Table Structures */
/****************************/
typedef struct OSPFV3_NEXT_HOP_BLOCK
{
struct OSPFV3_NEXT_HOP_BLOCK *sptr_forward_link;
struct OSPFV3_NEXT_HOP_BLOCK *sptr_backward_link;
ULONG outgoing_router_interface;
ULONG next_hop_router;
enum OSPFV3_ROUTE_STATUS route_status;
} OSPFV3_NEXT_HOP_BLOCK;
/**************************************************************************************/
/* SPR 88619 start */
typedef struct OSPFV3_LSA_TIMESTAMP_PER_INTERFACE_LIST
{
struct OSPFV3_LSA_TIMESTAMP_PER_INTERFACE_LIST *sptr_forward_link;
struct OSPFV3_LSA_TIMESTAMP_PER_INTERFACE_LIST *sptr_backward_link;
ULONG if_index;
ULONG neighbor_id;
ULONG timestamp;
} OSPFV3_LSA_TIMESTAMP_PER_INTERFACE_LIST;
typedef struct OSPFV3_LS_DATABASE_ENTRY
{
OSPFV3_GENERIC_NODE links;
#ifdef OSPFV3_AGGREGATE_OPTIMIZE
OSPFV3_GENERIC_NODE links_lsa_aggregate; /* links the chain LSAs that
are pieces of an aggregate LSA together:
Type 1 LSA: chain multiple router LSAs of same router
chain last type 1 LSA of aggregate to
type 9 LSA describing the router
Type 2 LSA: chain to type 9 LSA describing the link
Type 9 LSA: chain multiple type 9 LSAs describing
same link (for type 9 LSA describing
a router, only 1 LSA per router,
RFC 2740, page 32) */
#endif
UNION_OSPFV3_LINK_STATE_ADVERTISEMENT advertisement;
struct OSPFV3_AREA_ENTRY *sptr_ls_database_area; /* for keeping count of db's in each area */
struct OSPFV3_INTERFACE *sptr_ls_database_interface; /* This is necessary for local scope lsas to associate
them to the interface received or originated on.*/
ULONG ls_database_time_stamp; /* for keeping age - stamped when arrived */
struct OSPFV3_NEIGHBOR_LIST *sptr_ls_database_retrans; /* neighbors pointing to this ls_database */
enum OSPFV3_SEQUENCE_STATE ls_database_sequence_state;
/* SPR 88619 start */
OSPFV3_LSA_TIMESTAMP_PER_INTERFACE_LIST * sptr_lsa_retransmit_timestamps_per_neighbor;
/* SPR 88619 end */
enum OSPFV3_LS_TYPE ls_database_type;
ULONG lsa_age_after_maxage; /* counts age of LSA after maxage */
} OSPFV3_LS_DATABASE_ENTRY;
typedef struct OSPFV3_ROUTING_TABLE_ENTRY
{
enum OSPFV3_ROUTE_DESTINATION_TYPE destination_type;
ULONG destination_id;
OSPFV3_ROUTING_TABLE_PREFIXES_AREA *sptr_prefixes; /* area with all prefixes defined for this network entity (router or network link) */
BYTE_ENUM (BOOLEAN) type_5_route_originated;
UNION_OSPFV3_OPTIONS optional_capabilities;
struct OSPFV3_AREA_ENTRY *sptr_area;
enum OSPFV3_ROUTE_PATH_TYPE path_type;
ULONG path_cost;
ULONG type2_cost;
ULONG link_state_id;
BYTE_ENUM (OSPFV3_LS_TYPE) link_type;
ULONG advertising_router;
OSPFV3_LS_DATABASE_ENTRY *sptr_link_state_origin;
OSPFV3_NEXT_HOP_BLOCK *sptr_next_hop;
struct in6_addr forwarding_address;
} OSPFV3_ROUTING_TABLE_ENTRY;
typedef struct OSPFV3_ROUTING_TABLE_NODE
{
struct OSPFV3_ROUTING_TABLE_NODE *sptr_forward_link;
struct OSPFV3_ROUTING_TABLE_NODE *sptr_backward_link;
BYTE_ENUM (BOOLEAN) active_areas_discarded_entry; /* discard_entry */
enum OSPFV3_ROUTE_STATUS route_node_status;
OSPFV3_ROUTING_TABLE_ENTRY *sptr_routing_table_entry;
} OSPFV3_ROUTING_TABLE_NODE;
/* this is used during routing table lookup, to avoid 2 passes through the
list of prefixes of a routing table entry,
one to find a match, one to find best match,
maintain best match from first pass.
This has exactly same fields of OSPFV3_ROUTING_TABLE_NODE plus the most specific mask */
typedef struct OSPFV3_ROUTING_TABLE_LOOKUP_TEMP_NODE
{
struct OSPFV3_ROUTING_TABLE_LOOKUP_TEMP_NODE *sptr_forward_link;
struct OSPFV3_ROUTING_TABLE_LOOKUP_TEMP_NODE *sptr_backward_link;
BYTE_ENUM (BOOLEAN) active_areas_discarded_entry; /* discard_entry */
enum OSPFV3_ROUTE_STATUS route_node_status;
OSPFV3_ROUTING_TABLE_ENTRY *sptr_routing_table_entry;
BYTE most_specific_mask;
} OSPFV3_ROUTING_TABLE_LOOKUP_TEMP_NODE;
/**************************************************************************************/
typedef union UNION_OSPFV3_VIRTUAL_ROUTE
{
OSPFV3_ROUTING_TABLE_ENTRY *sptr_ospfv3_route;
} UNION_OSPFV3_VIRTUAL_ROUTE;
typedef struct OSPFV3_LS_DATABASE_NODE
{
struct OSPFV3_LS_DATABASE_NODE *sptr_forward_link;
struct OSPFV3_LS_DATABASE_NODE *sptr_backward_link;
OSPFV3_LS_DATABASE_ENTRY *sptr_ls_database_entry;
ULONG periodic_retransmit_time_counter;
BYTE_ENUM (BOOLEAN) flood; /* true if flooding this one */
} OSPFV3_LS_DATABASE_NODE;
typedef struct OSPFV3_DATABASE_INFORMATION_STRUCTURE /* used in ospfv3_flood.c */
{
BYTE_ENUM (BOOLEAN) found_link_state_advertisement_in_database;
OSPFV3_LS_DATABASE_ENTRY *sptr_database_entry;
struct OSPFV3_INTERFACE *sptr_interface;
struct OSPFV3_NEIGHBOR *sptr_neighbor;
UNION_OSPFV3_LINK_STATE_ADVERTISEMENT new_advertisement;
ULONG time_difference;
struct in6_addr source_address;
struct in6_addr destination_address;
} OSPFV3_DATABASE_INFORMATION_STRUCTURE;
/**************************************************************************************/
/* Definition of OSPFV3_NEIGHBOR */
typedef struct OSPFV3_NEIGHBOR
{
struct OSPFV3_NEIGHBOR *sptr_forward_link;
struct OSPFV3_NEIGHBOR *sptr_backward_link;
struct OSPFV3_INTERFACE *sptr_interface;
enum OSPFV3_NEIGHBOR_STATE state;
ULONG events; /* Number of state changes */
ULONG last_hello; /* Time last hello was received from this neighbor */
ULONG periodic_inactivity_time_counter;
BYTE_ENUM (BOOLEAN) inactivity_timer_enabled;
enum OSPFV3_NEIGHBOR_MODE mode; /* Master or slave mode */
UNION_OSPFV3_FLAGS flags; /* For passing initialize, more and master/slave bits */
/* ANVL 43.2 */
UNION_OSPFV3_FLAGS last_dd_flags; /* For recording values received in last DD packet from neighbor
for initialize, more and master/slave bits */
UNION_OSPFV3_OPTIONS options;
seq_t database_description_sequence_number;
seq_t last_received_dd_sequence_number;
ULONG last_exchange; /* Time last exchange was received from this neighbor - hold timer */
ULONG periodic_slave_hold_time_counter;
USHORT priority; /* 0 means not eligible to become the Designated Router */
ULONG id; /* neighbor ID = its router ID */
/* Neighbor's Interface ID. RFC 2740, section 3.1.3
The interface ID that the neighbor advertises in its Hello packets
*/
ULONG neighbor_interface_id;
/* Neighbor IP address. RFC 2740, section 3.1.3 */
struct in6_addr address;
/* In OSPFv3 Neighbor's designated and backup designated routers are encoded as
Router IDs, instead of IP addresses. See RFC 2740, section 3.1.3
HME kept the structures as ULONG
*/
ULONG designated_router;
ULONG backup_designated_router;
OSPFV3_LS_DATABASE_NODE *sptr_retransmit; /* Link state advertisements waiting for acknowledgements */
OSPFV3_LS_DATABASE_SUMMARY *sptr_database_summary; /* Database summary packets that make up area database */
OSPFV3_LS_REQUEST *sptr_ls_request[OSPFV3_NUM_LSA_REQUEST_INDEX];
USHORT retransmit_queue_count;
USHORT database_summary_queue_count;
USHORT ls_request_queue_count;
BYTE_ENUM (BOOLEAN) ls_request_list_has_changed;
ULONG mib_address_less_index;
BYTE_ENUM (BOOLEAN) mib_nbma_status;
BYTE_ENUM (BOOLEAN) mib_nbma_permanence;
BYTE_ENUM (BOOLEAN) mib_hello_suppressed;
ULONG mib_area_id;
} OSPFV3_NEIGHBOR;
/**************************************************************************************/
typedef struct OSPFV3_DESIGNATED_ROUTER_NODE
{
ULONG id;
struct in6_addr address;
enum OSPFV3_NEIGHBOR_STATE state;
USHORT priority; /* 0 means not eligible to become the Designated Router */
} OSPFV3_DESIGNATED_ROUTER_NODE;
/**************************************************************************************/
/* Definition of OSPFv3 interface */
#if (_BYTE_ORDER == _LITTLE_ENDIAN )
typedef _struct OSPFV3_INTERFACE_FLAGS
{
BIT_FIELD (enum, BOOLEAN) network_scheduled:1; /* When designated router: semaphore for generating link state advertisements */
BIT_FIELD (enum, BOOLEAN) enable:1; /* Interface is enabled */
BIT_FIELD (enum, BOOLEAN) build_network:1; /* Flag to build_net_lsa */
BIT_FIELD (enum, BOOLEAN) neighbor_change:1; /* Schedule neighbor change */
BIT_FIELD (enum, BOOLEAN) multicast:1; /* Interface is multicast capable */
BIT_FIELD (enum, BOOLEAN) cost_set:1; /* Cost was manually configured */
BIT_FIELD (enum, BOOLEAN) unused:1; /* Secondary authentication key */
BIT_FIELD (enum,BOOLEAN) build_type9:1;
} _pack OSPFV3_INTERFACE_FLAGS;
#else /* _BYTE_ORDER == _BIG_ENDIAN */
typedef _struct OSPFV3_INTERFACE_FLAGS
{
BIT_FIELD (enum, BOOLEAN) build_type9:1; /* Type 8 LSA received, must build type 9 LSA if designated router */
BIT_FIELD (enum, BOOLEAN) unused:1; /* Secondary authentication key */
BIT_FIELD (enum, BOOLEAN) cost_set:1; /* Cost was manually configured */
BIT_FIELD (enum, BOOLEAN) multicast:1; /* Interface is multicast capable */
BIT_FIELD (enum, BOOLEAN) neighbor_change:1; /* Schedule neighbor change */
BIT_FIELD (enum, BOOLEAN) build_network:1; /* Flag to build_net_lsa */
BIT_FIELD (enum, BOOLEAN) enable:1; /* Interface is enabled */
BIT_FIELD (enum, BOOLEAN) network_scheduled:1; /* When designated router: semaphore for generating link state advertisements */
} _pack OSPFV3_INTERFACE_FLAGS;
#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
typedef _union UNION_OSPFV3_INTERFACE_FLAGS
{
OSPFV3_INTERFACE_FLAGS _bit;
BYTE _byte;
} _pack UNION_OSPFV3_INTERFACE_FLAGS;
typedef struct OSPFV3_LS_HEADER_QUEUE
{
struct OSPFV3_LS_HEADER_QUEUE *sptr_forward_link;
struct OSPFV3_LS_HEADER_QUEUE *sptr_backward_link;
OSPFV3_LS_HEADER ls_header;
} OSPFV3_LS_HEADER_QUEUE;
typedef struct OSPFV3_LS_DATABASE_HEAD
{
OSPFV3_LS_DATABASE_ENTRY *sptr_database_entry;
AVL_NODE * sptr_avl_database_entry; /* AVL LSA tree */
} OSPFV3_LS_DATABASE_HEAD;
/* OSPFv3 interface datastructure */
typedef struct OSPFV3_INTERFACE
{
struct OSPFV3_INTERFACE *sptr_forward_link;
struct OSPFV3_INTERFACE *sptr_backward_link;
struct ifnet *vx_ospfv3_interface;
/* HME add new structures for OSPFv3 as per RFC 2740, section 3.1.2. */
ULONG interface_id;
/* Instance ID enables multiple instances of OSPF to be run over a single link. */
BYTE instance_id;
/* A new data structure for LSAs with Link-Local flooding scope.
link_local_database_hash_table[1] contains all LSAs with UNKNOWN LS types and Link-Local flooding scope.
link_local_database_hash_table[0] contains all LSAs with KNOWN LS types and Link-Local flooding scope
*/
OSPFV3_LS_DATABASE_HEAD ls_database_hash_table[OSPFV3_NUM_INTERFACE_LSA_HASHES][OSPFV3_HASH_TABLE_SIZE];
/* number of interface link LSAs in the interface LSDB */
ULONG interface_lsa_count;
/* sum of checksums of all link LSAs for fast comparison of LSDB of 2 routers */
ULONG interface_lsa_checksum;
/* The list of IPv6 prefixes configured for the attached link*/
OSPFV3_IPV6_ADDR_PREFIX_LINKS *sptr_list_of_prefixes;
/* IP interface address. */
struct in6_addr address; /* a link_local address */
BYTE netmask; /* link local address length */
USHORT ifnet_flags;
ULONG area_id;
BYTE_ENUM (BOOLEAN) port_enabled;
enum OSPFV3_INTERFACE_TYPE type;
enum OSPFV3_INTERFACE_STATE state;
ULONG events; /* Number of state changes */
ULONG mtu;
struct OSPFV3_AREA_ENTRY *sptr_area; /* The area this interface is in */
struct OSPFV3_AREA_ENTRY *sptr_transit_area;
ULONG source_area_id_for_virtual_link;
ULONG router_dead_interval; /* Number of seconds before the router's sptr_neighbors will declare it down */
ULONG transmit_delay; /* Estimated number of seconds it takes to transmit a link state update packet over this interface */
USHORT priority; /* If set to 0, this router is not eligible to become designated router on the attached network */
OSPFV3_NEIGHBOR *sptr_neighbor;
OSPFV3_NEIGHBOR potential_neighbor;
ULONG virtual_neighbor_rid;
ULONG virtual_neighbor_intf_id;
USHORT number_of_neighbors_in_init_state;
USHORT number_of_neighbors_in_exchange_state;
USHORT number_of_neighbors_in_full_state;
OSPFV3_DESIGNATED_ROUTER_NODE designated_router;
OSPFV3_DESIGNATED_ROUTER_NODE backup_designated_router;
USHORT cost; /* One for each type of service */
ULONG hello_interval; /* Length of time, in seconds, between Hello packets sent on this interface */
ULONG poll_interval; /* the default poll interval is 4 * the hello interval */
ULONG periodic_hello_time_counter;
BYTE_ENUM (BOOLEAN) hello_timer_enabled;
ULONG last_hello_time;
ULONG retransmit_interval;
ULONG periodic_retransmit_time_counter;
BYTE_ENUM (BOOLEAN) retransmit_timer_enabled;
ULONG periodic_wait_time_counter; /* single shot timer */
BYTE_ENUM (BOOLEAN) wait_timer_enabled;
ULONG periodic_delayed_acknowledgement_time_counter; /* single shot timer - sort of */
BYTE_ENUM (BOOLEAN) delayed_acknowledgement_timer_enabled;
UNION_OSPFV3_INTERFACE_FLAGS flags;
OSPFV3_LS_HEADER_QUEUE *sptr_head_of_delayed_acknowledgement_list;
ULONG number_of_acknowledgements_on_delayed_acknowledgement_list;
ULONG lock_time;
ULONG up_time; /* Time interface came up */
BYTE_ENUM (BOOLEAN) point_timer_enabled;
ULONG port_number; /* Unnumbered link support jkw */
BYTE_ENUM (BOOLEAN) passive;
/* TBD: for unnumbered interfaces, should this interface be of type in6_addr or ULONG */
ULONG unnumbered_dest_ip; /* unnumbered link dest ip */
ULONG unnumbered_router_id; /* unnumbered link router id */
ULONG nbma_ptmp_neighbor_id; /* __NBMA_PTMP__ */
struct in6_addr nbma_ptmp_neighbor_address; /* __NBMA_PTMP__ */
ULONG nbma_ptmp_neighbor_intf_id;
ULONG number_of_prefixes;
OSPFV3_IPV6_ADDR_PREFIX_LINKS * sptr_site_local_or_global_addresses;
} OSPFV3_INTERFACE;
typedef struct OSPFV3_INTERFACE_NODE
{
struct OSPFV3_INTERFACE_NODE *sptr_forward_link;
struct OSPFV3_INTERFACE_NODE *sptr_backward_link;
OSPFV3_INTERFACE *sptr_interface;
} OSPFV3_INTERFACE_NODE ;
/**************************************************************************************/
typedef struct OSPFV3_HOSTS
{
struct OSPFV3_HOSTS *sptr_forward_link;
struct OSPFV3_HOSTS *sptr_backward_link;
struct in6_addr interface_address;
ULONG type_of_service;
USHORT cost;
BYTE_ENUM (BOOLEAN) status;
ULONG area_id;
} OSPFV3_HOSTS;
/**************************************************************************************/
typedef struct OSPFV3_SHORTEST_PATH_NODE
{
struct OSPFV3_SHORTEST_PATH_NODE *sptr_forward_link;
struct OSPFV3_SHORTEST_PATH_NODE *sptr_backward_link;
/* unique identification for a vertex (or any entity) in OSPFv3:
ID and advertising router, not just ID */
/*ULONG vertex;*/ /* temporary
comment out vertex to locate via compiler all places where
identification via vertex
should be replaced with identification via (vertex and adv. router) */
ULONG vertexv3;
ULONG adv_router;
BYTE_ENUM (OSPFV3_LS_TYPE) vertex_type;
OSPFV3_LS_DATABASE_ENTRY *sptr_database_entry;
ULONG cost;
ULONG intervening_router;
OSPFV3_NEXT_HOP_BLOCK *sptr_next_hop;
} OSPFV3_SHORTEST_PATH_NODE;
/**************************************************************************************/
/* definition of Area and address range */
#if (_BYTE_ORDER == _LITTLE_ENDIAN )
typedef _struct OSPFV3_AREA_FLAGS
{
BIT_FIELD (enum, BOOLEAN) transit:1; /* This is a transit area */
BIT_FIELD (enum, BOOLEAN) virtual_up:1; /* One or more virtual links in this area are up */
BIT_FIELD (enum, BOOLEAN) stub:1; /* This is a area (no external routes) */
BIT_FIELD (enum, BOOLEAN) nssa:1; /* This is a not so stubby area */
BIT_FIELD (enum, BOOLEAN) stub_default:1; /* Inject default into this stub area */
BIT_FIELD (enum,BOOLEAN) not_used:3;
} _pack OSPFV3_AREA_FLAGS;
#else /* _BYTE_ORDER == _BIG_ENDIAN */
typedef _struct OSPFV3_AREA_FLAGS
{
BIT_FIELD (enum,BOOLEAN) not_used:3;
BIT_FIELD (enum, BOOLEAN) stub_default:1; /* Inject default into this stub area */
BIT_FIELD (enum, BOOLEAN) nssa:1; /* This is a not so stubby area */
BIT_FIELD (enum, BOOLEAN) stub:1; /* This is a area (no external routes) */
BIT_FIELD (enum, BOOLEAN) virtual_up:1; /* One or more virtual links in this area are up */
BIT_FIELD (enum, BOOLEAN) transit:1; /* This is a transit area */
} _pack OSPFV3_AREA_FLAGS;
#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
typedef _union UNION_OSPFV3_AREA_FLAGS
{
OSPFV3_AREA_FLAGS _bit;
BYTE _byte;
} _pack UNION_OSPFV3_AREA_FLAGS;
typedef struct OSPFV3_ADDRESS_RANGE_LIST_ENTRY /* list of networks associated with an area (section 6 of OSPF Version 2 specification, dated June 1995) */
{
struct OSPFV3_ADDRESS_RANGE_LIST_ENTRY *sptr_forward_link;
struct OSPFV3_ADDRESS_RANGE_LIST_ENTRY *sptr_backward_link;
ULONG area_id;
struct in6_addr network;
ULONG mask;
BYTE_ENUM (BOOLEAN) advertise;
BYTE_ENUM (BOOLEAN) active;
ULONG cost;
struct OSPFV3_ROUTING_TABLE_NODE *sptr_discard_entries;
} OSPFV3_ADDRESS_RANGE_LIST_ENTRY;
/* OSPFv3 area datastructure */
typedef struct OSPFV3_AREA_ENTRY
{
struct OSPFV3_AREA_ENTRY *sptr_forward_link;
struct OSPFV3_AREA_ENTRY *sptr_backward_link;
ULONG area_id;
/* area address ranges */
ULONG number_of_address_ranges; /* for this area */
OSPFV3_ADDRESS_RANGE_LIST_ENTRY *sptr_address_ranges;
/* associated router interfaces */
OSPFV3_INTERFACE *sptr_interfaces; /* this is setup at configuration time */
/* summary links advertisements */
/*TODO!!!!!!: convert this to OSPFV3_LS_DATABASE_NODE or move it to ls_database_hash_table*/
struct OSPFV3_ADVERTISEMENT_NODE *sptr_summary_advertisement_list_head;
UNION_OSPFV3_AREA_FLAGS flags; /* Various state bits */
ULONG stub_default_cost;
/* shortest-path tree */
OSPFV3_SHORTEST_PATH_NODE shortest_path_first_tree; /* area's shortest path first tree; head is this router */
ULONG shortest_path_first_run_count; /* # times spf has been run for this area */
BYTE_ENUM (BOOLEAN) run_shortest_path_calculation;
ULONG shortest_path_calculation_time_counter;
OSPFV3_SHORTEST_PATH_NODE *sptr_candidate; /* area's candidate list for dijkstra */
OSPFV3_LS_DATABASE_HEAD ls_database_hash_table[OSPFV3_NUM_AREA_LSA_HASHES][OSPFV3_HASH_TABLE_SIZE];
/* number of LSAs in the area LSDB */
ULONG area_lsa_count;
/* sum of checksums of all LSAs of an area for fast comparison of LSDB of 2 routers */
ULONG area_lsa_checksum;
USHORT number_of_autonomous_system_boundary_routers;
USHORT number_of_area_border_routers;
USHORT number_of_neighbors_in_init_state;
USHORT number_of_neighbors_in_exchange_state;
USHORT number_of_neighbors_in_full_state;
USHORT number_of_interfaces_in_up_state;
ULONG lock_time;
BYTE build_router;
BYTE_ENUM (BOOLEAN) bring_up_virtual_links;
ULONG periodic_MinLSInterval_time_counter;
BYTE_ENUM (BOOLEAN) MinLSInterval_timer_enabled;
BYTE_ENUM (BOOLEAN) inject_default_route_if_stub_area;
USHORT mib_number_of_link_state_advertisements;
ULONG mib_checksum_sum;
ULONG mib_stub_metric_type; /* 1 = ospf metric, 2 = comparable cost, 3 = non comparable */
USHORT mib_number_of_type10_lsa;
ULONG mib_type10_checksum_sum;
ULONG nssa_abr_to_convert_type_7_to_type_5;
/* RFC 2740 page 19, a routing table for wach area holding
intermediate results during routing table build for area.
It contains:
one entry for every router in the area
one entry for every transit link traversing the area */
OSPFV3_ROUTING_TABLE_NODE *sptr_routing_table_for_area;
} OSPFV3_AREA_ENTRY;
typedef struct OSPFV3_STUB_AREA_ENTRY
{
struct OSPFV3_STUB_AREA_ENTRY *sptr_forward_link;
struct OSPFV3_STUB_AREA_ENTRY *sptr_backward_link;
struct OSPFV3_AREA_ENTRY *sptr_area;
} OSPFV3_STUB_AREA_ENTRY;
typedef struct OSPFV3_TRANSIT_AREA_ENTRY
{
struct OSPFV3_TRANSIT_AREA_ENTRY *sptr_forward_link;
struct OSPFV3_TRANSIT_AREA_ENTRY *sptr_backward_link;
struct OSPFV3_AREA_ENTRY *sptr_area;
} OSPFV3_TRANSIT_AREA_ENTRY;
/**************************************************************************************/
/**********************************/
/* Link State Database Structures */
/**********************************/
typedef struct OSPFV3_ADVERTISEMENT_NODE
{
struct OSPFV3_ADVERTISEMENT_NODE *sptr_forward_link;
struct OSPFV3_ADVERTISEMENT_NODE *sptr_backward_link;
UNION_OSPFV3_LINK_STATE_ADVERTISEMENT advertisement;
} OSPFV3_ADVERTISEMENT_NODE;
/**************************************************************************************/
typedef struct OSPFV3_NEIGHBOR_LIST
{
struct OSPFV3_NEIGHBOR_LIST *sptr_forward_link;
struct OSPFV3_NEIGHBOR_LIST *sptr_backward_link;
struct OSPFV3_NEIGHBOR *sptr_neighbor;
} OSPFV3_NEIGHBOR_LIST;
/**************************************************************************************/
/* definition of port structures */
typedef struct OSPFV3_PORT_CONFIGURATION_CLASS
{
BYTE_ENUM (BOOLEAN) port_enabled;
USHORT virtual_port_number;
ULONG if_index;
ULONG area_id;
ULONG transit_area_id;
ULONG source_area_id_for_virtual_link; /* The area to which VLink belongs */
ULONG type;
ULONG router_dead_interval;
ULONG transmit_delay;
USHORT priority;
USHORT cost;
ULONG hello_interval;
ULONG virtual_neighbor_rid; /* Router ID */
ULONG virtual_neighbor_intf_id;
BYTE_ENUM (BOOLEAN) passive;
/* dsk: TODO: figure out functionality of unnumbered interfaces (unnumbered = do not have IPv6 address, only some ID, keep it at ULONG size */
ULONG unnumbered_dest_ip; /* unnumbered dest ip*/
ULONG poll_interval;
ULONG retransmit_interval;
struct in6_addr nbma_ptmp_neighbor_address; /* __NBMA_PTMP__ */
ULONG nbma_ptmp_neighbor_id; /* __NBMA_PTMP__ */
ULONG nbma_ptmp_neighbor_intf_id;
} OSPFV3_PORT_CONFIGURATION_CLASS;
typedef struct OSPFV3_PORT_CLASS
{
OSPFV3_PORT_CONFIGURATION_CLASS config; /* this portion is configured by NVRAM */
} OSPFV3_PORT_CLASS;
/**************************************************************************************/
typedef struct OSPFV3_AREA_CONFIGURATION_CLASS
{
ULONG area_id;
BYTE_ENUM (BOOLEAN) advertise_address_range;
ULONG address_range_cost;
BYTE_ENUM (BOOLEAN) external_routing_capability_enabled;
BYTE_ENUM (BOOLEAN) inject_default_route_if_stub_area;
ULONG stub_default_cost;
ULONG number_of_area_address_ranges; /* number of areas, 0 will always be the backbone */
} OSPFV3_AREA_CONFIGURATION_CLASS;
typedef struct OSPFV3_AREA_CLASS
{
OSPFV3_AREA_CONFIGURATION_CLASS config; /* this portion is configured by NVRAM */
} OSPFV3_AREA_CLASS;
/**************************************************************************************/
/* RFC 2178 G.3 */
typedef struct OSPFV3_AREA_ADDRESS_RANGE_CONFIGURATION_CLASS
{
struct in6_addr network;
ULONG mask_length;
BYTE_ENUM (BOOLEAN) advertise;
BYTE_ENUM (BOOLEAN) active;
ULONG cost;
ULONG area_id;
} OSPFV3_AREA_ADDRESS_RANGE_CONFIGURATION_CLASS;
/* RFC 2178 G.3 */
typedef struct OSPFV3_AREA_ADDRESS_RANGE_CLASS
{
OSPFV3_AREA_ADDRESS_RANGE_CONFIGURATION_CLASS config;
} OSPFV3_AREA_ADDRESS_RANGE_CLASS;
/**************************************************************************************/
typedef struct OSPFV3_EXTERNAL_ROUTE
{
struct OSPFV3_EXTERNAL_ROUTE *sptr_forward_link;
struct OSPFV3_EXTERNAL_ROUTE *sptr_backward_link;
ULONG destination_id;
struct in6_addr destination_network;
ULONG destination_mask;
ULONG metric;
struct in6_addr forwarding_address;
ULONG tag;
ULONG time_stamp;
ULONG advertising_router;
/* SPR 85050 */
ULONG route_protocol;
} OSPFV3_EXTERNAL_ROUTE;
/**************************************************************************************/
typedef struct OSPFV3_MIB_GENERAL_ENTRY
{
ULONG ospfv3VersionNumber;
BYTE_ENUM (BOOLEAN) ospfv3AreaBdrRtrStatus;
ULONG ospfv3ExternLsaCount;
ULONG ospfv3ExternLsaCksumSum;
ULONG ospfv3OriginateNewLsas;
ULONG ospfv3RxNewLsas;
} OSPFV3_MIB_GENERAL_ENTRY;
typedef struct WRN_OSPFV3_MIB_GENERAL_ENTRY
{
int dummy;
} WRN_OSPFV3_MIB_GENERAL_ENTRY;
typedef struct OSPFV3_ADDRESS_MASK_PAIRS
{
struct OSPFV3_ADDRESS_MASK_PAIRS *sptr_forward_link;
struct OSPFV3_ADDRESS_MASK_PAIRS *sptr_backward_link;
struct in6_addr network_address;
ULONG network_mask;
ULONG metric_type;
ULONG metric_value;
} OSPFV3_ADDRESS_MASK_PAIRS;
typedef struct OSPFV3_REDISTRIBUTION_CONFIGURATION
{
enum BOOLEAN redistribute_all_bgp;
enum BOOLEAN redistribute_all_rip;
enum BOOLEAN redistribute_all_static;
enum BOOLEAN redistribute_ip_default_route;
OSPFV3_GENERIC_NODE ospfv3_imported_rip_subnets;
OSPFV3_GENERIC_NODE ospfv3_imported_static_subnets;
OSPFV3_GENERIC_NODE ospfv3_imported_bgp_subnets;
} OSPFV3_REDISTRIBUTION_CONFIGURATION;
/**************************************************************************************/
typedef struct OSPFV3_IP6_ROUTE_ENTRY
{
struct in6_addr target; /* network address */
ULONG mask; /* network address prefix length */
struct in6_addr forwarding_address; /* forwarding address when redistributing routes from other protocols into OSPF: local attached subnet, or point-to-point link */
ULONG gateway;/* next hop router for redistributing OSPF routes to other protocols. 0: local attached subnet, or point-to-point link */
ULONG metric; /* primary metric */
ULONG metric_2; /* alternative metric 2 */
ULONG metric_3; /* alternative metric 3 */
ULONG metric_4; /* alternative metric 4 */
ULONG metric_5; /* alternative metric 5 */
ULONG flags;
BYTE weight;
ULONG protocol;
USHORT route_tag;
ULONG advertising_router;
void* p_ifnet;
} OSPFV3_IP6_ROUTE_ENTRY;
/**************************************************************************************/
#define OSPFV3_TASK_NAME_SIZE 11 /* 10 chars + null terminator */
typedef struct OSPFV3_TASK_DESCRIPTOR
{
int task_id;
int task_priority;
int task_stack_size;
FUNCPTR task_start_func;
OSPFV3_TASK_STATES task_state;
char task_name[OSPFV3_TASK_NAME_SIZE];
} OSPFV3_TASK_DESCRIPTOR;
/* hello prioritized handling start */
typedef struct OSPFV3_BACKLOG_NON_HELLO_PDU
{
/* 50 bytes overhead per queued PDU, up to OSPFV3_BACKLOG_PDU_MAX */
OSPFV3_INTERFACE *sptr_interface;
OSPFV3_PACKET *sptr_ospfv3_packet;
USHORT packet_size;
struct in6_addr source_ip_address;
struct in6_addr destination_ip_address;
} OSPFV3_BACKLOG_NON_HELLO_PDU;
/* OSPFV3_BACKLOG_NON_HELLO_PDU_QUEUE Used to be (without LIST from lstLib.h):
typedef struct OSPFV3_BACKLOG_NON_HELLO_PDU_QUEUE
{
ULONG number_of_pdus_queued;
OSPFV3_BACKLOG_NON_HELLO_PDU *sptr_non_hello_pdu_queue;
SEM_ID backlog_queue_semaphore_id;
} OSPFV3_BACKLOG_NON_HELLO_PDU_QUEUE;
*/
typedef struct OSPFV3_BACKLOG_NON_HELLO_PDU_QUEUE
{
int read_index;
int write_index;
int num_pdus_in_queue;
OSPFV3_BACKLOG_NON_HELLO_PDU *sptr_pdu;
SEM_ID pdu_queue_sem_id; /* semaphore guarding concurrent LIST operations from multiple tasks */
} OSPFV3_BACKLOG_NON_HELLO_PDU_QUEUE;
/* hello prioritized handling end */
/* Definition of main OSPF structure */
/* OSPFv3 meta-structure */
typedef struct OSPFV3_CLASS
{
enum BOOLEAN protocol_enabled;
/*ULONG tid;*/ /* ospf task ID */
ULONG stack_id;
ULONG router_id; /* uniquely identifies this router in the Autonomous System */
enum BOOLEAN type_of_service_capability; /* TRUE means this router will calculate separate routes based on type of service */
enum BOOLEAN autonomous_system_border_router;
enum BOOLEAN ip_multicast;
OSPFV3_PORT_CLASS port[NUMBER_OF_OSPFV3_PORTS];
/* make sptr_interface linked list visible here. Was in OSPFV3_PORT_CLASS */
OSPFV3_INTERFACE *sptr_interface_list;
ULONG number_of_ports;
ULONG starting_port_number;
ULONG number_of_interfaces;
/* areas */
ULONG number_of_areas; /* number of areas */
ULONG number_of_area_address_ranges; /* total number of area address ranges for all areas */
ULONG number_of_stub_areas;
/* NOTE: areat[] shall only be used during startup for processing configuration
* read from ospfv3_cfg()
*/
OSPFV3_AREA_CLASS area[NUMBER_OF_OSPFV3_AREAS];
struct OSPFV3_AREA_ENTRY *sptr_area_list; /* an array of areas connected to this router which will be
* allocated at initialization time, area 0 is the backbone */
/* RFC 2178 G.3 */
OSPFV3_AREA_ADDRESS_RANGE_CLASS area_address_range[NUMBER_OF_OSPFV3_AREA_ADDRESS_RANGES]; /* area address ranges for a particular area */
struct OSPFV3_AREA_ENTRY *sptr_backbone_area;
struct OSPFV3_STUB_AREA_ENTRY *sptr_stub_area_list;
/* virtual links */
ULONG number_of_virtual_links;
ULONG number_of_virtual_links_in_Up_state;
OSPFV3_INTERFACE_NODE *sptr_configured_virtual_links;
OSPFV3_EXTERNAL_ROUTE *sptr_external_route_queue;
ULONG external_lsa_queue_process_interval;
ULONG ospfv3_rtm_sequence;
ULONG ospfv3_rtm_pid;
/* ip and routing socket */
int ospfv3_ip_socket;
int ospfv3_rtm_socket;
/* neighbors */
ULONG number_of_neighbors; /* number of neighbors known to this router */
ULONG number_of_neighbors_in_init_state;
ULONG number_of_neighbors_in_exchange_state;
ULONG number_of_neighbors_in_full_state;
OSPFV3_ROUTING_TABLE_NODE *sptr_routing_table_head[OSPFV3_RT_HASH_TABLE_SIZE];
enum BOOLEAN build_routing_table;
ULONG routing_table_build_time_counter;
OSPFV3_LS_DATABASE_ENTRY *sptr_free_database_entry_list; /* list of LSAs to be freed */
enum BOOLEAN timer_enabled;
ULONG _1_second_counter;
ULONG clock_ticks_per_second;
OSPFV3_MIB_GENERAL_ENTRY ospfv3GeneralGroupEntry;
/* only contains RFC 1583 compatibility and opaque LSA support, obsoleted by RFC 2740 */
WRN_OSPFV3_MIB_GENERAL_ENTRY wrnOspfv3GeneralGroupEntry;
OSPFV3_HOSTS *sptr_host_list;
/* various debug flags */
enum BOOLEAN printing_enabled;
enum BOOLEAN interface_printing_enabled;
enum BOOLEAN neighbor_printing_enabled;
enum BOOLEAN memory_printing_enabled;
enum BOOLEAN alarm_printing_enabled;
enum BOOLEAN snmp_printing_enabled;
enum BOOLEAN packet_printing_enabled;
enum BOOLEAN hello_packet_printing_enabled;
enum BOOLEAN dd_packet_printing_enabled;
enum BOOLEAN ls_request_packet_printing_enabled;
enum BOOLEAN ls_update_packet_printing_enabled;
enum BOOLEAN ls_ack_packet_printing_enabled;
enum BOOLEAN routing_table_printing_enabled;
enum BOOLEAN debug_printing_enabled;
enum BOOLEAN rtm_printing_enabled; /* ### RTM */
enum BOOLEAN db_overflow_printing_enabled;
enum BOOLEAN search_printing_enabled;
enum BOOLEAN prologue_printing_enabled;
ULONG routing_table_revision_number;
ULONG ospfv3_maxaged_lsas_removed_per_tick;
ULONG ospfv3_maxaged_lsas_removed_this_tick;
OSPFV3_REDISTRIBUTION_CONFIGURATION ospfv3_redistribution_configuration;
int ospfv3_multicast_extensions;
enum BOOLEAN ospfv3_demand_extensions;
ULONG ospfv3_point_to_point_router_lsa_option;
/* RFC 1765 */
ULONG ospfv3_external_lsdb_limit;
ULONG ospfv3_exit_overflow_interval;
ULONG ospfv3_external_lsa_count;
enum BOOLEAN in_overflow_state;
enum BOOLEAN force_out_of_overflow_state;
enum BOOLEAN reset_ospfv3_exit_overflow_interval;
#if defined (__OSPFV3_FTP__)
const char * ftp_configuration_file;
const char * ftp_server_address;
const char * ftp_dir;
const char * ftp_user;
const char * ftp_pwd;
#endif
OSPFV3_LS_DATABASE_HEAD external_database_hash_table[OSPFV3_NUM_AS_LSA_HASHES][OSPFV3_HASH_TABLE_SIZE];
/* HME add new structure for LSAs with unknown LS types and AS flooding scope. RFC 2740, section 3.1*/
/* number of LSAs in the AS LSDB */
ULONG as_lsa_count;
/* sum of checksums of all LSAs in main structure for fast comparison of LSDB of 2 routers */
ULONG as_lsa_checksum;
/*
* Pointer to old routing table, valid during SPF computation, NULL
* otherwise, Inter-area SPF computation can be invoked: from receive
* task at reception of type 3 or type 4 LSA from timer task (or SPF
* task) during regular SPF computation. This "sptr_old_routing_table"
* is used during inter-area SPF to prevent flooding of type 3 and 4
* LSAs from receive task and enable flooding of type 3 LSAs from timer
* task depending on result of SPF computation. Reason: RFC 2328
* specifies that type 3 LSAs should only be issued based on routing
* table entries.
*/
OSPFV3_ROUTING_TABLE_NODE * sptr_old_routing_table[OSPFV3_RT_HASH_TABLE_SIZE];
/* watchdog timer: runs every second in the system timer interrupt.
All it does is give the semaphore timer_semaphore_id.
OSPF timer task is blocked on this semaphore and wakes up executing
the 1 second OSPF timer activities at task level when awaken by the watchdog */
WDOG_ID watchdog_timer;
/* semaphore to trigger 1 second timer interrupt activities:
taken by timer task, given by watchdog timer */
SEM_ID timer_semaphore_id;
/* semaphore to synchronize startup of OSPF tasks. Taken by every OSPF task
after finishing own initialization. Given synchronously via semFlush to all ospf
tasks pending on it when task state of all tasks is OSPFV3_TASK_STATE_INIT_COMPLETE */
SEM_ID startup_sem_id;
OSPFV3_TASK_DESCRIPTOR ospfv3_tasks[OSPFV3_NUM_TASKS];
/* hello prioritized handling start */
OSPFV3_BACKLOG_NON_HELLO_PDU_QUEUE backlog_pdus_queue;
ULONG num_discarded_pdus;
#ifdef OSPFV3_SURROGATE_HELLO_ENABLED
BOOLEAN surrogate_hello_processing_enabled;
#endif
/* hello prioritized handling end */
/* these are used by the algorithm to generate unique link state IDs for individual
LSAs that participate in an aggregate LSA originated by this router */
ULONG router_lsa_id;
ULONG inter_area_prefix_lsa_id;
ULONG inter_area_router_lsa_id;
ULONG intra_area_prefix_lsa_id;
ULONG external_lsa_id;
} OSPFV3_CLASS;
/* OSPFv3 AVL LSDB node */
typedef struct OSPFV3_AVL_LSDB_NODE
{
AVL_NODE node;
OSPFV3_LS_DATABASE_ENTRY *sptr_database_entry;
} OSPFV3_AVL_LSDB_NODE;
typedef struct OSPFV3_AVL_LSDB_KEY
{
ULONG id;
ULONG router;
BYTE_ENUM (OSPF_LS_TYPE) type;
} OSPFV3_AVL_LSDB_KEY;
/**************************************************************************************/
#ifdef __cplusplus
}
#endif
#endif /* __INCospfv3Structuresh */