1/* 2 * Copyright (C) 2003 Yasuhiro Ohara 3 * 4 * This file is part of GNU Zebra. 5 * 6 * GNU Zebra is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the 8 * Free Software Foundation; either version 2, or (at your option) any 9 * later version. 10 * 11 * GNU Zebra is distributed in the hope that it will be useful, but 12 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with GNU Zebra; see the file COPYING. If not, write to the 18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 19 * Boston, MA 02111-1307, USA. 20 */ 21 22#ifndef OSPF6_LSA_H 23#define OSPF6_LSA_H 24 25/* Debug option */ 26#define OSPF6_LSA_DEBUG 0x01 27#define OSPF6_LSA_DEBUG_ORIGINATE 0x02 28#define OSPF6_LSA_DEBUG_EXAMIN 0x04 29#define OSPF6_LSA_DEBUG_FLOOD 0x08 30 31#define IS_OSPF6_DEBUG_LSA(name) \ 32 (ospf6_lstype_debug (htons (OSPF6_LSTYPE_ ## name)) & \ 33 OSPF6_LSA_DEBUG) 34#define IS_OSPF6_DEBUG_ORIGINATE(name) \ 35 (ospf6_lstype_debug (htons (OSPF6_LSTYPE_ ## name)) & \ 36 OSPF6_LSA_DEBUG_ORIGINATE) 37#define IS_OSPF6_DEBUG_EXAMIN(name) \ 38 (ospf6_lstype_debug (htons (OSPF6_LSTYPE_ ## name)) & \ 39 OSPF6_LSA_DEBUG_EXAMIN) 40#define IS_OSPF6_DEBUG_LSA_TYPE(type) \ 41 (ospf6_lstype_debug (type) & OSPF6_LSA_DEBUG) 42#define IS_OSPF6_DEBUG_ORIGINATE_TYPE(type) \ 43 (ospf6_lstype_debug (type) & OSPF6_LSA_DEBUG_ORIGINATE) 44#define IS_OSPF6_DEBUG_EXAMIN_TYPE(type) \ 45 (ospf6_lstype_debug (type) & OSPF6_LSA_DEBUG_EXAMIN) 46#define IS_OSPF6_DEBUG_FLOOD_TYPE(type) \ 47 (ospf6_lstype_debug (type) & OSPF6_LSA_DEBUG_FLOOD) 48 49/* LSA definition */ 50 51#define OSPF6_MAX_LSASIZE 4096 52 53/* Type */ 54#define OSPF6_LSTYPE_UNKNOWN 0x0000 55#define OSPF6_LSTYPE_ROUTER 0x2001 56#define OSPF6_LSTYPE_NETWORK 0x2002 57#define OSPF6_LSTYPE_INTER_PREFIX 0x2003 58#define OSPF6_LSTYPE_INTER_ROUTER 0x2004 59#define OSPF6_LSTYPE_AS_EXTERNAL 0x4005 60#define OSPF6_LSTYPE_GROUP_MEMBERSHIP 0x2006 61#define OSPF6_LSTYPE_TYPE_7 0x2007 62#define OSPF6_LSTYPE_LINK 0x0008 63#define OSPF6_LSTYPE_INTRA_PREFIX 0x2009 64#define OSPF6_LSTYPE_SIZE 0x000a 65 66/* Masks for LS Type : RFC 2740 A.4.2.1 "LS type" */ 67#define OSPF6_LSTYPE_UBIT_MASK 0x8000 68#define OSPF6_LSTYPE_SCOPE_MASK 0x6000 69#define OSPF6_LSTYPE_FCODE_MASK 0x1fff 70 71/* LSA scope */ 72#define OSPF6_SCOPE_LINKLOCAL 0x0000 73#define OSPF6_SCOPE_AREA 0x2000 74#define OSPF6_SCOPE_AS 0x4000 75#define OSPF6_SCOPE_RESERVED 0x6000 76 77/* XXX U-bit handling should be treated here */ 78#define OSPF6_LSA_SCOPE(type) \ 79 (ntohs (type) & OSPF6_LSTYPE_SCOPE_MASK) 80 81/* LSA Header */ 82#define OSPF6_LSA_HEADER_SIZE 20U 83struct ospf6_lsa_header 84{ 85 u_int16_t age; /* LS age */ 86 u_int16_t type; /* LS type */ 87 u_int32_t id; /* Link State ID */ 88 u_int32_t adv_router; /* Advertising Router */ 89 u_int32_t seqnum; /* LS sequence number */ 90 u_int16_t checksum; /* LS checksum */ 91 u_int16_t length; /* LSA length */ 92}; 93 94#define OSPF6_LSA_HEADER_END(h) \ 95 ((caddr_t)(h) + sizeof (struct ospf6_lsa_header)) 96#define OSPF6_LSA_SIZE(h) \ 97 (ntohs (((struct ospf6_lsa_header *) (h))->length)) 98#define OSPF6_LSA_END(h) \ 99 ((caddr_t)(h) + ntohs (((struct ospf6_lsa_header *) (h))->length)) 100#define OSPF6_LSA_IS_TYPE(t, L) \ 101 ((L)->header->type == htons (OSPF6_LSTYPE_ ## t) ? 1 : 0) 102#define OSPF6_LSA_IS_SAME(L1, L2) \ 103 ((L1)->header->adv_router == (L2)->header->adv_router && \ 104 (L1)->header->id == (L2)->header->id && \ 105 (L1)->header->type == (L2)->header->type) 106#define OSPF6_LSA_IS_MATCH(t, i, a, L) \ 107 ((L)->header->adv_router == (a) && (L)->header->id == (i) && \ 108 (L)->header->type == (t)) 109#define OSPF6_LSA_IS_DIFFER(L1, L2) ospf6_lsa_is_differ (L1, L2) 110#define OSPF6_LSA_IS_MAXAGE(L) (ospf6_lsa_age_current (L) == OSPF_LSA_MAXAGE) 111#define OSPF6_LSA_IS_CHANGED(L1, L2) ospf6_lsa_is_changed (L1, L2) 112#define OSPF6_LSA_IS_SEQWRAP(L) ((L)->header->seqnum == htonl(OSPF_MAX_SEQUENCE_NUMBER + 1)) 113 114 115struct ospf6_lsa 116{ 117 char name[64]; /* dump string */ 118 119 struct route_node *rn; 120 121 unsigned char lock; /* reference counter */ 122 unsigned char flag; /* special meaning (e.g. floodback) */ 123 124 struct timeval birth; /* tv_sec when LS age 0 */ 125 struct timeval originated; /* used by MinLSInterval check */ 126 struct timeval received; /* used by MinLSArrival check */ 127 struct timeval installed; 128 129 struct thread *expire; 130 struct thread *refresh; /* For self-originated LSA */ 131 132 int retrans_count; 133 134 struct ospf6_lsdb *lsdb; 135 136 /* lsa instance */ 137 struct ospf6_lsa_header *header; 138}; 139 140#define OSPF6_LSA_HEADERONLY 0x01 141#define OSPF6_LSA_FLOODBACK 0x02 142#define OSPF6_LSA_DUPLICATE 0x04 143#define OSPF6_LSA_IMPLIEDACK 0x08 144#define OSPF6_LSA_SEQWRAPPED 0x20 145 146struct ospf6_lsa_handler 147{ 148 u_int16_t type; /* host byte order */ 149 const char *name; 150 const char *short_name; 151 int (*show) (struct vty *, struct ospf6_lsa *); 152 char *(*get_prefix_str) (struct ospf6_lsa *, char *buf, int buflen, int pos); 153 u_char debug; 154}; 155 156extern struct ospf6_lsa_handler unknown_handler; 157#define OSPF6_LSA_IS_KNOWN(type) \ 158 (ospf6_get_lsa_handler (type) != &unknown_handler ? 1 : 0) 159 160/* Macro for LSA Origination */ 161/* addr is (struct prefix *) */ 162#define CONTINUE_IF_ADDRESS_LINKLOCAL(debug,addr) \ 163 if (IN6_IS_ADDR_LINKLOCAL (&(addr)->u.prefix6)) \ 164 { \ 165 char buf[64]; \ 166 prefix2str (addr, buf, sizeof (buf)); \ 167 if (debug) \ 168 zlog_debug ("Filter out Linklocal: %s", buf); \ 169 continue; \ 170 } 171 172#define CONTINUE_IF_ADDRESS_UNSPECIFIED(debug,addr) \ 173 if (IN6_IS_ADDR_UNSPECIFIED (&(addr)->u.prefix6)) \ 174 { \ 175 char buf[64]; \ 176 prefix2str (addr, buf, sizeof (buf)); \ 177 if (debug) \ 178 zlog_debug ("Filter out Unspecified: %s", buf);\ 179 continue; \ 180 } 181 182#define CONTINUE_IF_ADDRESS_LOOPBACK(debug,addr) \ 183 if (IN6_IS_ADDR_LOOPBACK (&(addr)->u.prefix6)) \ 184 { \ 185 char buf[64]; \ 186 prefix2str (addr, buf, sizeof (buf)); \ 187 if (debug) \ 188 zlog_debug ("Filter out Loopback: %s", buf); \ 189 continue; \ 190 } 191 192#define CONTINUE_IF_ADDRESS_V4COMPAT(debug,addr) \ 193 if (IN6_IS_ADDR_V4COMPAT (&(addr)->u.prefix6)) \ 194 { \ 195 char buf[64]; \ 196 prefix2str (addr, buf, sizeof (buf)); \ 197 if (debug) \ 198 zlog_debug ("Filter out V4Compat: %s", buf); \ 199 continue; \ 200 } 201 202#define CONTINUE_IF_ADDRESS_V4MAPPED(debug,addr) \ 203 if (IN6_IS_ADDR_V4MAPPED (&(addr)->u.prefix6)) \ 204 { \ 205 char buf[64]; \ 206 prefix2str (addr, buf, sizeof (buf)); \ 207 if (debug) \ 208 zlog_debug ("Filter out V4Mapped: %s", buf); \ 209 continue; \ 210 } 211 212 213/* Function Prototypes */ 214extern const char *ospf6_lstype_name (u_int16_t type); 215extern const char *ospf6_lstype_short_name (u_int16_t type); 216extern u_char ospf6_lstype_debug (u_int16_t type); 217extern int ospf6_lsa_is_differ (struct ospf6_lsa *lsa1, struct ospf6_lsa *lsa2); 218extern int ospf6_lsa_is_changed (struct ospf6_lsa *lsa1, struct ospf6_lsa *lsa2); 219extern u_int16_t ospf6_lsa_age_current (struct ospf6_lsa *); 220extern void ospf6_lsa_age_update_to_send (struct ospf6_lsa *, u_int32_t); 221extern void ospf6_lsa_premature_aging (struct ospf6_lsa *); 222extern int ospf6_lsa_compare (struct ospf6_lsa *, struct ospf6_lsa *); 223 224extern char *ospf6_lsa_printbuf (struct ospf6_lsa *lsa, char *buf, int size); 225extern void ospf6_lsa_header_print_raw (struct ospf6_lsa_header *header); 226extern void ospf6_lsa_header_print (struct ospf6_lsa *lsa); 227extern void ospf6_lsa_show_summary_header (struct vty *vty); 228extern void ospf6_lsa_show_summary (struct vty *vty, struct ospf6_lsa *lsa); 229extern void ospf6_lsa_show_dump (struct vty *vty, struct ospf6_lsa *lsa); 230extern void ospf6_lsa_show_internal (struct vty *vty, struct ospf6_lsa *lsa); 231extern void ospf6_lsa_show (struct vty *vty, struct ospf6_lsa *lsa); 232 233extern struct ospf6_lsa *ospf6_lsa_create (struct ospf6_lsa_header *header); 234extern struct ospf6_lsa *ospf6_lsa_create_headeronly (struct ospf6_lsa_header *header); 235extern void ospf6_lsa_delete (struct ospf6_lsa *lsa); 236extern struct ospf6_lsa *ospf6_lsa_copy (struct ospf6_lsa *); 237 238extern void ospf6_lsa_lock (struct ospf6_lsa *); 239extern void ospf6_lsa_unlock (struct ospf6_lsa *); 240 241extern int ospf6_lsa_expire (struct thread *); 242extern int ospf6_lsa_refresh (struct thread *); 243 244extern unsigned short ospf6_lsa_checksum (struct ospf6_lsa_header *); 245extern int ospf6_lsa_checksum_valid (struct ospf6_lsa_header *); 246extern int ospf6_lsa_prohibited_duration (u_int16_t type, u_int32_t id, 247 u_int32_t adv_router, void *scope); 248 249extern void ospf6_install_lsa_handler (struct ospf6_lsa_handler *handler); 250extern struct ospf6_lsa_handler *ospf6_get_lsa_handler (u_int16_t type); 251 252extern void ospf6_lsa_init (void); 253extern void ospf6_lsa_terminate (void); 254 255extern int config_write_ospf6_debug_lsa (struct vty *vty); 256extern void install_element_ospf6_debug_lsa (void); 257 258#endif /* OSPF6_LSA_H */ 259 260