1/* 2 * This is an implementation of rfc2370. 3 * Copyright (C) 2001 KDD R&D Laboratories, Inc. 4 * http://www.kddlabs.co.jp/ 5 * 6 * This file is part of GNU Zebra. 7 * 8 * GNU Zebra is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the 10 * Free Software Foundation; either version 2, or (at your option) any 11 * later version. 12 * 13 * GNU Zebra is distributed in the hope that it will be useful, but 14 * WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with GNU Zebra; see the file COPYING. If not, write to the Free 20 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 21 * 02111-1307, USA. 22 */ 23 24#ifndef _ZEBRA_OSPF_OPAQUE_H 25#define _ZEBRA_OSPF_OPAQUE_H 26 27#define IS_OPAQUE_LSA(type) \ 28 ((type) == OSPF_OPAQUE_LINK_LSA || \ 29 (type) == OSPF_OPAQUE_AREA_LSA || \ 30 (type) == OSPF_OPAQUE_AS_LSA) 31 32/* 33 * Define opaque-lsa handling flag "top->opaque" as follows. 34 * 35 * 7 6 5 4 3 2 1 0 36 * +---+---+---+---+---+---+---+---+ 37 * |///|///|///|B11|B10|B09| O | C | 38 * +---+---+---+---+---+---+---+---+ 39 * |<--------->| A A 40 * | | +--- Opaque capability (capable = 1) 41 * | +------- Operation status (operational = 1) 42 * +--------------- Blocking status for each LSA type 43 */ 44 45#define IS_OPAQUE_LSA_ORIGINATION_BLOCKED(V) \ 46 CHECK_FLAG((V), (OPAQUE_BLOCK_TYPE_09_LSA_BIT | \ 47 OPAQUE_BLOCK_TYPE_10_LSA_BIT | \ 48 OPAQUE_BLOCK_TYPE_11_LSA_BIT)) 49 50/* 51 * Opaque LSA's link state ID is redefined as follows. 52 * 53 * 24 16 8 0 54 * +--------+--------+--------+--------+ 55 * |tttttttt|........|........|........| 56 * +--------+--------+--------+--------+ 57 * |<-Type->|<------- Opaque ID ------>| 58 */ 59#define LSID_OPAQUE_TYPE_MASK 0xff000000 /* 8 bits */ 60#define LSID_OPAQUE_ID_MASK 0x00ffffff /* 24 bits */ 61 62#define GET_OPAQUE_TYPE(lsid) \ 63 (((u_int32_t)(lsid) & LSID_OPAQUE_TYPE_MASK) >> 24) 64 65#define GET_OPAQUE_ID(lsid) \ 66 ((u_int32_t)(lsid) & LSID_OPAQUE_ID_MASK) 67 68#define SET_OPAQUE_LSID(type, id) \ 69 ((((type) << 24) & LSID_OPAQUE_TYPE_MASK) \ 70 | ((id) & LSID_OPAQUE_ID_MASK)) 71 72/* 73 * Opaque LSA types will be assigned by IANA. 74 * <http://www.iana.org/assignments/ospf-opaque-types> 75 */ 76#define OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA 1 77#define OPAQUE_TYPE_SYCAMORE_OPTICAL_TOPOLOGY_DESC 2 78#define OPAQUE_TYPE_GRACE_LSA 3 79 80/* Followings types are proposed in internet-draft documents. */ 81#define OPAQUE_TYPE_8021_QOSPF 129 82#define OPAQUE_TYPE_SECONDARY_NEIGHBOR_DISCOVERY 224 83#define OPAQUE_TYPE_FLOODGATE 225 84 85/* Ugly hack to make use of an unallocated value for wildcard matching! */ 86#define OPAQUE_TYPE_WILDCARD 0 87 88#define OPAQUE_TYPE_RANGE_UNASSIGNED(type) \ 89 ( 4 <= (type) && (type) <= 127) 90 91#define OPAQUE_TYPE_RANGE_RESERVED(type) \ 92 (127 < (type) && (type) <= 255) 93 94#define VALID_OPAQUE_INFO_LEN(lsahdr) \ 95 ((ntohs((lsahdr)->length) >= sizeof (struct lsa_header)) && \ 96 ((ntohs((lsahdr)->length) % sizeof (u_int32_t)) == 0)) 97 98/* Prototypes. */ 99struct vty; 100struct stream; 101 102extern void ospf_opaque_init (void); 103extern void ospf_opaque_term (void); 104extern int ospf_opaque_type9_lsa_init (struct ospf_interface *oi); 105extern void ospf_opaque_type9_lsa_term (struct ospf_interface *oi); 106extern int ospf_opaque_type10_lsa_init (struct ospf_area *area); 107extern void ospf_opaque_type10_lsa_term (struct ospf_area *area); 108extern int ospf_opaque_type11_lsa_init (struct ospf *ospf); 109extern void ospf_opaque_type11_lsa_term (struct ospf *ospf); 110 111extern int 112ospf_register_opaque_functab ( 113 u_char lsa_type, 114 u_char opaque_type, 115 int (* new_if_hook)(struct interface *ifp), 116 int (* del_if_hook)(struct interface *ifp), 117 void (* ism_change_hook)(struct ospf_interface *oi, int old_status), 118 void (* nsm_change_hook)(struct ospf_neighbor *nbr, int old_status), 119 void (* config_write_router)(struct vty *vty), 120 void (* config_write_if )(struct vty *vty, struct interface *ifp), 121 void (* config_write_debug )(struct vty *vty), 122 void (* show_opaque_info )(struct vty *vty, struct ospf_lsa *lsa), 123 int (* lsa_originator)(void *arg), 124 void (* lsa_refresher )(struct ospf_lsa *lsa), 125 int (* new_lsa_hook)(struct ospf_lsa *lsa), 126 int (* del_lsa_hook)(struct ospf_lsa *lsa) 127); 128extern void ospf_delete_opaque_functab (u_char lsa_type, u_char opaque_type); 129 130extern int ospf_opaque_new_if (struct interface *ifp); 131extern int ospf_opaque_del_if (struct interface *ifp); 132extern void ospf_opaque_ism_change (struct ospf_interface *oi, int old_status); 133extern void ospf_opaque_nsm_change (struct ospf_neighbor *nbr, int old_status); 134extern void ospf_opaque_config_write_router (struct vty *vty, struct ospf *); 135extern void ospf_opaque_config_write_if (struct vty *vty, struct interface *ifp); 136extern void ospf_opaque_config_write_debug (struct vty *vty); 137extern void show_opaque_info_detail (struct vty *vty, struct ospf_lsa *lsa); 138extern void ospf_opaque_lsa_dump (struct stream *s, u_int16_t length); 139 140extern void ospf_opaque_lsa_originate_schedule (struct ospf_interface *oi, int *init_delay); 141extern struct ospf_lsa *ospf_opaque_lsa_install (struct ospf_lsa *new, int rt_recalc); 142extern void ospf_opaque_lsa_refresh (struct ospf_lsa *lsa); 143 144extern void ospf_opaque_lsa_reoriginate_schedule (void *lsa_type_dependent, u_char lsa_type, u_char opaque_type); 145extern void ospf_opaque_lsa_refresh_schedule (struct ospf_lsa *lsa); 146extern void ospf_opaque_lsa_flush_schedule (struct ospf_lsa *lsa); 147 148extern void ospf_opaque_adjust_lsreq (struct ospf_neighbor *nbr, list lsas); 149extern void ospf_opaque_self_originated_lsa_received (struct ospf_neighbor *nbr, list lsas); 150extern void ospf_opaque_ls_ack_received (struct ospf_neighbor *nbr, list acks); 151 152extern void htonf (float *src, float *dst); 153extern void ntohf (float *src, float *dst); 154extern struct ospf *oi_to_top (struct ospf_interface *oi); 155 156#endif /* _ZEBRA_OSPF_OPAQUE_H */ 157