1 /* 2 * OSPF Link State Advertisement 3 * Copyright (C) 1999, 2000 Toshiaki Takada 4 * 5 * This file is part of GNU Zebra. 6 * 7 * GNU Zebra is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the 9 * Free Software Foundation; either version 2, or (at your option) any 10 * later version. 11 * 12 * GNU Zebra is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with GNU Zebra; see the file COPYING. If not, write to the Free 19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 20 * 02111-1307, USA. 21 */ 22 23 #ifndef _ZEBRA_OSPF_LSA_H 24 #define _ZEBRA_OSPF_LSA_H 25 26 #include "stream.h" 27 28 /* OSPF LSA Range definition. */ 29 #define OSPF_MIN_LSA 1 /* begin range here */ 30 #define OSPF_MAX_LSA 12 31 32 /* OSPF LSA Type definition. */ 33 #define OSPF_UNKNOWN_LSA 0 34 #define OSPF_ROUTER_LSA 1 35 #define OSPF_NETWORK_LSA 2 36 #define OSPF_SUMMARY_LSA 3 37 #define OSPF_ASBR_SUMMARY_LSA 4 38 #define OSPF_AS_EXTERNAL_LSA 5 39 #define OSPF_GROUP_MEMBER_LSA 6 /* Not supported. */ 40 #define OSPF_AS_NSSA_LSA 7 41 #define OSPF_EXTERNAL_ATTRIBUTES_LSA 8 /* Not supported. */ 42 #define OSPF_OPAQUE_LINK_LSA 9 43 #define OSPF_OPAQUE_AREA_LSA 10 44 #define OSPF_OPAQUE_AS_LSA 11 45 46 #define OSPF_LSA_HEADER_SIZE 20U 47 #define OSPF_ROUTER_LSA_LINK_SIZE 12U 48 #define OSPF_ROUTER_LSA_TOS_SIZE 4U 49 #define OSPF_MAX_LSA_SIZE 1500U 50 51 /* AS-external-LSA refresh method. */ 52 #define LSA_REFRESH_IF_CHANGED 0 53 #define LSA_REFRESH_FORCE 1 54 55 /* OSPF LSA header. */ 56 struct lsa_header 57 { 58 u_int16_t ls_age; 59 u_char options; 60 u_char type; 61 struct in_addr id; 62 struct in_addr adv_router; 63 u_int32_t ls_seqnum; 64 u_int16_t checksum; 65 u_int16_t length; 66 }; 67 68 /* OSPF LSA. */ 69 struct ospf_lsa 70 { 71 /* LSA origination flag. */ 72 u_char flags; 73 #define OSPF_LSA_SELF 0x01 74 #define OSPF_LSA_SELF_CHECKED 0x02 75 #define OSPF_LSA_RECEIVED 0x04 76 #define OSPF_LSA_APPROVED 0x08 77 #define OSPF_LSA_DISCARD 0x10 78 #define OSPF_LSA_LOCAL_XLT 0x20 79 #define OSPF_LSA_PREMATURE_AGE 0x40 80 #define OSPF_LSA_IN_MAXAGE 0x80 81 82 /* LSA data. */ 83 struct lsa_header *data; 84 85 /* Received time stamp. */ 86 struct timeval tv_recv; 87 88 /* Last time it was originated */ 89 struct timeval tv_orig; 90 91 /* All of reference count, also lock to remove. */ 92 int lock; 93 94 /* Flags for the SPF calculation. */ 95 int stat; 96 #define LSA_SPF_NOT_EXPLORED -1 97 #define LSA_SPF_IN_SPFTREE -2 98 /* If stat >= 0, stat is LSA position in candidates heap. */ 99 100 /* References to this LSA in neighbor retransmission lists*/ 101 int retransmit_counter; 102 103 /* Area the LSA belongs to, may be NULL if AS-external-LSA. */ 104 struct ospf_area *area; 105 106 /* Parent LSDB. */ 107 struct ospf_lsdb *lsdb; 108 109 /* Related Route. */ 110 void *route; 111 112 /* Refreshement List or Queue */ 113 int refresh_list; 114 115 /* For Type-9 Opaque-LSAs */ 116 struct ospf_interface *oi; 117 }; 118 119 /* OSPF LSA Link Type. */ 120 #define LSA_LINK_TYPE_POINTOPOINT 1 121 #define LSA_LINK_TYPE_TRANSIT 2 122 #define LSA_LINK_TYPE_STUB 3 123 #define LSA_LINK_TYPE_VIRTUALLINK 4 124 125 /* OSPF Router LSA Flag. */ 126 #define ROUTER_LSA_BORDER 0x01 /* The router is an ABR */ 127 #define ROUTER_LSA_EXTERNAL 0x02 /* The router is an ASBR */ 128 #define ROUTER_LSA_VIRTUAL 0x04 /* The router has a VL in this area */ 129 #define ROUTER_LSA_NT 0x10 /* The routers always translates Type-7 */ 130 #define ROUTER_LSA_SHORTCUT 0x20 /* Shortcut-ABR specific flag */ 131 132 #define IS_ROUTER_LSA_VIRTUAL(x) ((x)->flags & ROUTER_LSA_VIRTUAL) 133 #define IS_ROUTER_LSA_EXTERNAL(x) ((x)->flags & ROUTER_LSA_EXTERNAL) 134 #define IS_ROUTER_LSA_BORDER(x) ((x)->flags & ROUTER_LSA_BORDER) 135 #define IS_ROUTER_LSA_SHORTCUT(x) ((x)->flags & ROUTER_LSA_SHORTCUT) 136 #define IS_ROUTER_LSA_NT(x) ((x)->flags & ROUTER_LSA_NT) 137 138 /* OSPF Router-LSA Link information. */ 139 struct router_lsa_link 140 { 141 struct in_addr link_id; 142 struct in_addr link_data; 143 struct 144 { 145 u_char type; 146 u_char tos_count; 147 u_int16_t metric; 148 } m[1]; 149 }; 150 151 /* OSPF Router-LSAs structure. */ 152 #define OSPF_ROUTER_LSA_MIN_SIZE 4U /* w/0 link descriptors */ 153 /* There is an edge case, when number of links in a Router-LSA may be 0 without 154 breaking the specification. A router, which has no other links to backbone 155 area besides one virtual link, will not put any VL descriptor blocks into 156 the Router-LSA generated for area 0 until a full adjacency over the VL is 157 reached (RFC2328 12.4.1.3). In this case the Router-LSA initially received 158 by the other end of the VL will have 0 link descriptor blocks, but soon will 159 be replaced with the next revision having 1 descriptor block. */ 160 struct router_lsa 161 { 162 struct lsa_header header; 163 u_char flags; 164 u_char zero; 165 u_int16_t links; 166 struct 167 { 168 struct in_addr link_id; 169 struct in_addr link_data; 170 u_char type; 171 u_char tos; 172 u_int16_t metric; 173 } link[1]; 174 }; 175 176 /* OSPF Network-LSAs structure. */ 177 #define OSPF_NETWORK_LSA_MIN_SIZE 8U /* w/1 router-ID */ 178 struct network_lsa 179 { 180 struct lsa_header header; 181 struct in_addr mask; 182 struct in_addr routers[1]; 183 }; 184 185 /* OSPF Summary-LSAs structure. */ 186 #define OSPF_SUMMARY_LSA_MIN_SIZE 8U /* w/1 TOS metric block */ 187 struct summary_lsa 188 { 189 struct lsa_header header; 190 struct in_addr mask; 191 u_char tos; 192 u_char metric[3]; 193 }; 194 195 /* OSPF AS-external-LSAs structure. */ 196 #define OSPF_AS_EXTERNAL_LSA_MIN_SIZE 16U /* w/1 TOS forwarding block */ 197 struct as_external_lsa 198 { 199 struct lsa_header header; 200 struct in_addr mask; 201 struct 202 { 203 u_char tos; 204 u_char metric[3]; 205 struct in_addr fwd_addr; 206 u_int32_t route_tag; 207 } e[1]; 208 }; 209 210 #include "ospfd/ospf_opaque.h" 211 212 /* Macros. */ 213 #define GET_METRIC(x) get_metric(x) 214 #define IS_EXTERNAL_METRIC(x) ((x) & 0x80) 215 216 #define GET_AGE(x) (ntohs ((x)->data->ls_age) + time (NULL) - (x)->tv_recv) 217 #define LS_AGE(x) (OSPF_LSA_MAXAGE < get_age(x) ? \ 218 OSPF_LSA_MAXAGE : get_age(x)) 219 #define IS_LSA_SELF(L) (CHECK_FLAG ((L)->flags, OSPF_LSA_SELF)) 220 #define IS_LSA_MAXAGE(L) (LS_AGE ((L)) == OSPF_LSA_MAXAGE) 221 222 #define OSPF_LSA_UPDATE_DELAY 2 223 224 #define OSPF_LSA_UPDATE_TIMER_ON(T,F) \ 225 if (!(T)) \ 226 (T) = thread_add_timer (master, (F), 0, 2) 227 228 /* Prototypes. */ 229 /* XXX: Eek, time functions, similar are in lib/thread.c */ 230 extern struct timeval tv_adjust (struct timeval); 231 extern int tv_ceil (struct timeval); 232 extern int tv_floor (struct timeval); 233 extern struct timeval int2tv (int); 234 extern struct timeval msec2tv (int); 235 extern struct timeval tv_add (struct timeval, struct timeval); 236 extern struct timeval tv_sub (struct timeval, struct timeval); 237 extern int tv_cmp (struct timeval, struct timeval); 238 239 extern int get_age (struct ospf_lsa *); 240 extern u_int16_t ospf_lsa_checksum (struct lsa_header *); 241 extern int ospf_lsa_checksum_valid (struct lsa_header *); 242 extern int ospf_lsa_refresh_delay (struct ospf_lsa *); 243 244 extern const char *dump_lsa_key (struct ospf_lsa *); 245 extern u_int32_t lsa_seqnum_increment (struct ospf_lsa *); 246 extern void lsa_header_set (struct stream *, u_char, u_char, struct in_addr, 247 struct in_addr); 248 extern struct ospf_neighbor *ospf_nbr_lookup_ptop (struct ospf_interface *); 249 extern int ospf_check_nbr_status (struct ospf *); 250 251 /* Prototype for LSA primitive. */ 252 extern struct ospf_lsa *ospf_lsa_new (void); 253 extern struct ospf_lsa *ospf_lsa_dup (struct ospf_lsa *); 254 extern void ospf_lsa_free (struct ospf_lsa *); 255 extern struct ospf_lsa *ospf_lsa_lock (struct ospf_lsa *); 256 extern void ospf_lsa_unlock (struct ospf_lsa **); 257 extern void ospf_lsa_discard (struct ospf_lsa *); 258 259 extern struct lsa_header *ospf_lsa_data_new (size_t); 260 extern struct lsa_header *ospf_lsa_data_dup (struct lsa_header *); 261 extern void ospf_lsa_data_free (struct lsa_header *); 262 263 /* Prototype for various LSAs */ 264 extern int ospf_router_lsa_update (struct ospf *); 265 extern int ospf_router_lsa_update_area (struct ospf_area *); 266 267 extern void ospf_network_lsa_update (struct ospf_interface *); 268 269 extern struct ospf_lsa *ospf_summary_lsa_originate (struct prefix_ipv4 *, u_int32_t, 270 struct ospf_area *); 271 extern struct ospf_lsa *ospf_summary_asbr_lsa_originate (struct prefix_ipv4 *, 272 u_int32_t, 273 struct ospf_area *); 274 275 extern struct ospf_lsa *ospf_lsa_install (struct ospf *, 276 struct ospf_interface *, struct ospf_lsa *); 277 278 extern void ospf_nssa_lsa_flush (struct ospf *ospf, struct prefix_ipv4 *p); 279 extern void ospf_external_lsa_flush (struct ospf *, u_char, struct prefix_ipv4 *, 280 ifindex_t /* , struct in_addr nexthop */); 281 282 extern struct in_addr ospf_get_ip_from_ifp (struct ospf_interface *); 283 284 extern struct ospf_lsa *ospf_external_lsa_originate (struct ospf *, struct external_info *); 285 extern int ospf_external_lsa_originate_timer (struct thread *); 286 extern int ospf_default_originate_timer (struct thread *); 287 extern struct ospf_lsa *ospf_lsa_lookup (struct ospf_area *, u_int32_t, 288 struct in_addr, struct in_addr); 289 extern struct ospf_lsa *ospf_lsa_lookup_by_id (struct ospf_area *, 290 u_int32_t, 291 struct in_addr); 292 extern struct ospf_lsa *ospf_lsa_lookup_by_header (struct ospf_area *, 293 struct lsa_header *); 294 extern int ospf_lsa_more_recent (struct ospf_lsa *, struct ospf_lsa *); 295 extern int ospf_lsa_different (struct ospf_lsa *, struct ospf_lsa *); 296 extern void ospf_flush_self_originated_lsas_now (struct ospf *); 297 298 extern int ospf_lsa_is_self_originated (struct ospf *, struct ospf_lsa *); 299 300 extern struct ospf_lsa *ospf_lsa_lookup_by_prefix (struct ospf_lsdb *, u_char, 301 struct prefix_ipv4 *, 302 struct in_addr); 303 304 extern void ospf_lsa_maxage (struct ospf *, struct ospf_lsa *); 305 extern u_int32_t get_metric (u_char *); 306 307 extern int ospf_lsa_maxage_walker (struct thread *); 308 extern struct ospf_lsa *ospf_lsa_refresh (struct ospf *, struct ospf_lsa *); 309 310 extern void ospf_external_lsa_refresh_default (struct ospf *); 311 312 extern void ospf_external_lsa_refresh_type (struct ospf *, u_char, int); 313 extern struct ospf_lsa *ospf_external_lsa_refresh (struct ospf *, 314 struct ospf_lsa *, 315 struct external_info *, 316 int); 317 extern struct in_addr ospf_lsa_unique_id (struct ospf *, struct ospf_lsdb *, u_char, 318 struct prefix_ipv4 *); 319 extern void ospf_schedule_lsa_flood_area (struct ospf_area *, struct ospf_lsa *); 320 extern void ospf_schedule_lsa_flush_area (struct ospf_area *, struct ospf_lsa *); 321 322 extern void ospf_refresher_register_lsa (struct ospf *, struct ospf_lsa *); 323 extern void ospf_refresher_unregister_lsa (struct ospf *, struct ospf_lsa *); 324 extern int ospf_lsa_refresh_walker (struct thread *); 325 326 extern void ospf_lsa_maxage_delete (struct ospf *, struct ospf_lsa *); 327 328 extern void ospf_discard_from_db (struct ospf *, struct ospf_lsdb *, struct ospf_lsa*); 329 extern int is_prefix_default (struct prefix_ipv4 *); 330 331 extern int metric_type (struct ospf *, u_char); 332 extern int metric_value (struct ospf *, u_char); 333 334 extern struct in_addr ospf_get_nssa_ip (struct ospf_area *); 335 extern int ospf_translated_nssa_compare (struct ospf_lsa *, struct ospf_lsa *); 336 extern struct ospf_lsa *ospf_translated_nssa_refresh (struct ospf *, struct ospf_lsa *, 337 struct ospf_lsa *); 338 extern struct ospf_lsa *ospf_translated_nssa_originate (struct ospf *, struct ospf_lsa *); 339 340 #endif /* _ZEBRA_OSPF_LSA_H */ 341