diff options
Diffstat (limited to 'proto/ospf/ospf.h')
-rw-r--r-- | proto/ospf/ospf.h | 385 |
1 files changed, 255 insertions, 130 deletions
diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h index 22790899..1e46d3be 100644 --- a/proto/ospf/ospf.h +++ b/proto/ospf/ospf.h @@ -49,13 +49,17 @@ do { if ((p->debug & D_PACKETS) || OSPF_FORCE_DEBUG) \ #include "lib/string.h" #define OSPF_PROTO 89 + #ifndef IPV6 +#define OSPFv2 1 #define OSPF_VERSION 2 #define AllSPFRouters ipa_from_u32(0xe0000005) /* 224.0.0.5 */ #define AllDRouters ipa_from_u32(0xe0000006) /* 224.0.0.6 */ -#define DEFAULTDES ipa_from_u32(0) #else -#error OSPF for IPv6 is not implemented (mail to Feela <feela@network.cz>) +#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 */ #endif @@ -118,32 +122,37 @@ struct ospf_area_config list stubnet_list; }; -struct obits -{ -#ifdef CPU_BIG_ENDIAN - u8 unused2:2; - u8 dc:1; - u8 ea:1; - u8 np:1; - u8 mc:1; - u8 e:1; - u8 unused1:1; -#else - u8 unused1:1; - u8 e:1; - u8 mc:1; - u8 np:1; - u8 ea:1; - u8 dc:1; - u8 unused2:2; + +/* 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) #endif -}; -union options -{ - u8 byte; - struct obits bit; -}; +#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 struct ospf_iface @@ -167,15 +176,26 @@ struct ospf_iface u16 inftransdelay; /* The estimated number of seconds it takes to transmit a Link State Update Packet over this interface. LSAs contained in the update */ - u16 autype; u16 helloint; /* number of seconds between hello sending */ + +#ifdef OSPFv2 list *passwords; + u16 autype; u32 csn; /* Last used crypt seq number */ bird_clock_t csn_use; /* Last time when packet with that CSN was sent */ +#endif + ip_addr drip; /* Designated router */ u32 drid; ip_addr bdrip; /* Backup DR */ u32 bdrid; + +#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 */ +#endif + u8 type; /* OSPF view of type */ #define OSPF_IT_BCAST 0 #define OSPF_IT_NBMA 1 @@ -206,14 +226,19 @@ struct ospf_iface #define HELLOINT_D 10 #define POLLINT_D 20 #define DEADC_D 4 -#define WAIT_DMH 4 /* Value of Wait timer - not found it in RFC - * - using 4*HELLO - */ - struct top_hash_entry *nlsa; /* Originated net lsa */ - int orignet; /* Schedule network LSA origination */ - int fadj; /* Number of full adjacent neigh */ +#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 + struct top_hash_entry *link_lsa; /* Originated link LSA */ + int origlink; /* Schedule link LSA origination */ + struct top_hash_entry *pxn_lsa; /* Originated prefix LSA */ +#endif + int fadj; /* Number of full adjacent neigh */ list nbma_list; - u8 priority; /* A router priority for DR election */ + u8 priority; /* A router priority for DR election */ u8 ioprob; u32 rxbuf; }; @@ -232,35 +257,17 @@ union ospf_auth struct ospf_md5 md5; }; -struct ospf_packet -{ - u8 version; - u8 type; + +/* Packet types */ #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 */ - u16 length; - u32 routerid; - u32 areaid; + +/* Area IDs */ #define BACKBONE 0 - u16 checksum; - u16 autype; - union ospf_auth u; -}; -struct ospf_hello_packet -{ - struct ospf_packet ospf_packet; - ip_addr netmask; - u16 helloint; - u8 options; - u8 priority; - u32 deadint; - ip_addr dr; - ip_addr bdr; -}; struct immsb { @@ -282,34 +289,86 @@ union imms u8 byte; struct immsb bit; }; - -struct ospf_dbdes_packet -{ - struct ospf_packet ospf_packet; - u16 iface_mtu; - u8 options; - union imms imms; /* I, M, MS bits */ #define DBDES_MS 1 #define DBDES_M 2 #define DBDES_I 4 - u32 ddseq; + + +#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; }; +#endif + + + + 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 */ + +#ifdef OSPFv2 u8 options; u8 type; + +#define LSA_T_RT 1 +#define LSA_T_NET 2 +#define LSA_T_SUM_NET 3 +#define LSA_T_SUM_RT 4 +#define LSA_T_EXT 5 + +#else /* OSPFv3 */ + u16 type; + +#define LSA_T_RT 0x2001 +#define LSA_T_NET 0x2002 +#define LSA_T_SUM_NET 0x2003 +#define LSA_T_SUM_RT 0x2004 +#define LSA_T_EXT 0x4005 +#define LSA_T_LINK 0x0008 +#define LSA_T_PREFIX 0x2009 + +#define LSA_UBIT 0x8000 + +#define LSA_SCOPE_LINK 0x0000 +#define LSA_SCOPE_AREA 0x2000 +#define LSA_SCOPE_AS 0x4000 +#define LSA_SCOPE_RES 0x6000 +#define LSA_SCOPE_MASK 0x6000 + +#define LSA_SCOPE(lsa) ((lsa)->type & LSA_SCOPE_MASK) +#endif + u32 id; -#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 u32 rt; /* Advertising router */ s32 sn; /* LS Sequence number */ #define LSA_INITSEQNO 0x80000001 @@ -318,31 +377,18 @@ struct ospf_lsa_header u16 length; }; -struct vebb -{ -#ifdef CPU_BIG_ENDIAN - u8 padding:5; - u8 v:1; - u8 e:1; - u8 b:1; -#else - u8 b:1; - u8 e:1; - u8 v:1; - u8 padding:5; -#endif -}; -union veb -{ - u8 byte; - struct vebb bit; -}; +#define LSART_PTP 1 +#define LSART_NET 2 +#define LSART_STUB 3 +#define LSART_VLNK 4 + + +#ifdef OSPFv2 struct ospf_lsa_rt { - union veb veb; - u8 padding; + u16 options; /* VEB flags only */ u16 links; }; @@ -351,37 +397,115 @@ struct ospf_lsa_rt_link u32 id; u32 data; u8 type; -#define LSART_PTP 1 -#define LSART_NET 2 -#define LSART_STUB 3 -#define LSART_VLNK 4 u8 notos; u16 metric; }; -struct ospf_lsa_rt_link_tos -{ /* Actually we ignore TOS. This is useless */ - u8 tos; +struct ospf_lsa_net +{ + ip_addr netmask; + u32 routers[]; +}; + +struct ospf_lsa_sum +{ + ip_addr netmask; + u32 metric; +}; + +struct ospf_lsa_ext +{ + ip_addr netmask; + u32 metric; + ip_addr fwaddr; + u32 tag; +}; + +#define LSA_EXT_EBIT 0x80000000 + + +#else /* OSPFv3 */ + +struct ospf_lsa_rt +{ + u32 options; +}; + +struct ospf_lsa_rt_link +{ + u8 type; u8 padding; u16 metric; + u32 lif; /* Local interface ID */ + u32 nif; /* Neighbor interface ID */ + u32 id; /* Neighbor router ID */ }; struct ospf_lsa_net { - ip_addr netmask; + u32 options; + u32 routers[]; }; -struct ospf_lsa_sum +struct ospf_lsa_sum_net { - ip_addr netmask; + u32 metric; + u32 prefix[]; }; +struct ospf_lsa_sum_rt +{ + u32 options; + u32 metric; + u32 drid; +}; struct ospf_lsa_ext { - ip_addr netmask; + u32 metric; + u32 rest[]; +}; + +struct ospf_lsa_link +{ + u32 options; + ip_addr lladdr; + u32 pxcount; + u32 rest[]; +}; + +struct ospf_lsa_prefix +{ + u16 pxcount; + u16 ref_type; + u32 ref_id; + u32 ref_rt; + u32 rest[]; }; +#define LSA_EXT_EBIT 0x4000000 +#define LSA_EXT_FBIT 0x2000000 +#define LSA_EXT_TBIT 0x1000000 + +#endif + +#define METRIC_MASK 0x00FFFFFF +#define OPTIONS_MASK 0x00FFFFFF + +static inline unsigned lsa_rt_count(struct ospf_lsa_header *lsa) +{ + return (lsa->length - sizeof(struct ospf_lsa_header) - sizeof(struct ospf_lsa_rt)) + / sizeof(struct ospf_lsa_rt_link); +} + +static inline unsigned lsa_net_count(struct ospf_lsa_header *lsa) +{ + return (lsa->length - sizeof(struct ospf_lsa_header) - sizeof(struct ospf_lsa_net)) + / sizeof(u32); +} + + +/* struct ospf_lsa_ext_etos { #ifdef CPU_BIG_ENDIAN @@ -397,7 +521,7 @@ struct ospf_lsa_ext_etos #endif }; -#define METRIC_MASK 0x00FFFFFF + struct ospf_lsa_sum_tos { #ifdef CPU_BIG_ENDIAN @@ -430,16 +554,11 @@ struct ospf_lsa_ext_tos u32 tag; }; -struct ospf_lsreq_packet -{ - struct ospf_packet ospf_packet; -}; +*/ struct ospf_lsreq_header { - u16 padd1; - u8 padd2; - u8 type; + u32 type; u32 id; u32 rt; /* Advertising router */ }; @@ -450,17 +569,6 @@ struct l_lsr_head struct ospf_lsreq_header lsh; }; -struct ospf_lsupd_packet -{ - struct ospf_packet ospf_packet; - u32 lsano; /* Number of LSA's */ -}; - -struct ospf_lsack_packet -{ - struct ospf_packet ospf_packet; -}; - struct ospf_neighbor { @@ -484,10 +592,18 @@ struct ospf_neighbor u32 rid; /* Router ID */ ip_addr ip; /* IP of it's interface */ u8 priority; /* Priority */ - u8 options; /* Options received */ - ip_addr dr; /* Neigbour's idea of DR */ - ip_addr bdr; /* Neigbour's idea of BDR */ u8 adj; /* built adjacency? */ + 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 + siterator dbsi; /* Database summary list iterator */ slist lsrql; /* Link state request */ struct top_graph *lsrqh; /* LSA graph */ @@ -535,13 +651,14 @@ struct ospf_area struct ospf_area_config *ac; /* Related area config */ int origrt; /* Rt lsa origination scheduled? */ struct top_hash_entry *rt; /* My own router LSA */ + struct top_hash_entry *pxr_lsa; /* Originated prefix LSA */ list cand; /* List of candidates for RT calc. */ struct fib net_fib; /* Networks to advertise or not */ int stub; int trcap; /* Transit capability? */ + u32 options; /* Optional features */ struct proto_ospf *po; struct fib rtr; /* Routing tables for routers */ - union options opt; /* RFC2328 - A.2 */ }; struct proto_ospf @@ -577,20 +694,28 @@ struct ospf_iface_patt u32 deadc; u32 dead; u32 type; - u32 autype; u32 strictnbma; u32 stub; u32 vid; -#define OSPF_AUTH_NONE 0 -#define OSPF_AUTH_SIMPLE 1 -#define OSPF_AUTH_CRYPT 2 -#define OSPF_AUTH_CRYPT_SIZE 16 u32 rxbuf; #define OSPF_RXBUF_NORMAL 0 #define OSPF_RXBUF_LARGE 1 #define OSPF_RXBUF_MINSIZE 256 /* Minimal allowed size */ - list *passwords; list nbma_list; + + 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 }; int ospf_import_control(struct proto *p, rte **new, ea_list **attrs, |