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#include "vty.h" 28 29#define IS_OPAQUE_LSA(type) \ 30 ((type) == OSPF_OPAQUE_LINK_LSA || \ 31 (type) == OSPF_OPAQUE_AREA_LSA || \ 32 (type) == OSPF_OPAQUE_AS_LSA) 33 34/* 35 * Usage of Opaque-LSA administrative flags in "struct ospf". 36 * 37 * 7 6 5 4 3 2 1 0 38 * +---+---+---+---+---+---+---+---+ 39 * |///|///|///|///|B11|B10|B09| O | 40 * +---+---+---+---+---+---+---+---+ 41 * |<--------->| A 42 * | +--- Operation status (operational = 1) 43 * +----------- Blocking status for each LSA type 44 */ 45 46#define IS_OPAQUE_LSA_ORIGINATION_BLOCKED(V) \ 47 CHECK_FLAG((V), (OPAQUE_BLOCK_TYPE_09_LSA_BIT | \ 48 OPAQUE_BLOCK_TYPE_10_LSA_BIT | \ 49 OPAQUE_BLOCK_TYPE_11_LSA_BIT)) 50 51/* 52 * Opaque LSA's link state ID is redefined as follows. 53 * 54 * 24 16 8 0 55 * +--------+--------+--------+--------+ 56 * |tttttttt|........|........|........| 57 * +--------+--------+--------+--------+ 58 * |<-Type->|<------- Opaque ID ------>| 59 */ 60#define LSID_OPAQUE_TYPE_MASK 0xff000000 /* 8 bits */ 61#define LSID_OPAQUE_ID_MASK 0x00ffffff /* 24 bits */ 62 63#define GET_OPAQUE_TYPE(lsid) \ 64 (((u_int32_t)(lsid) & LSID_OPAQUE_TYPE_MASK) >> 24) 65 66#define GET_OPAQUE_ID(lsid) \ 67 ((u_int32_t)(lsid) & LSID_OPAQUE_ID_MASK) 68 69#define SET_OPAQUE_LSID(type, id) \ 70 ((((type) << 24) & LSID_OPAQUE_TYPE_MASK) \ 71 | ((id) & LSID_OPAQUE_ID_MASK)) 72 73/* 74 * Opaque LSA types will be assigned by IANA. 75 * <http://www.iana.org/assignments/ospf-opaque-types> 76 */ 77#define OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA 1 78#define OPAQUE_TYPE_SYCAMORE_OPTICAL_TOPOLOGY_DESC 2 79#define OPAQUE_TYPE_GRACE_LSA 3 80 81/* Followings types are proposed in internet-draft documents. */ 82#define OPAQUE_TYPE_8021_QOSPF 129 83#define OPAQUE_TYPE_SECONDARY_NEIGHBOR_DISCOVERY 224 84#define OPAQUE_TYPE_FLOODGATE 225 85 86/* Ugly hack to make use of an unallocated value for wildcard matching! */ 87#define OPAQUE_TYPE_WILDCARD 0 88 89#define OPAQUE_TYPE_RANGE_UNASSIGNED(type) \ 90 ( 4 <= (type) && (type) <= 127) 91 92#define OPAQUE_TYPE_RANGE_RESERVED(type) \ 93 (127 < (type) && (type) <= 255) 94 95#define VALID_OPAQUE_INFO_LEN(lsahdr) \ 96 ((ntohs((lsahdr)->length) >= sizeof (struct lsa_header)) && \ 97 ((ntohs((lsahdr)->length) % sizeof (u_int32_t)) == 0)) 98 99/* Prototypes. */ 100 101extern void ospf_opaque_init (void); 102extern void ospf_opaque_term (void); 103extern int ospf_opaque_type9_lsa_init (struct ospf_interface *oi); 104extern void ospf_opaque_type9_lsa_term (struct ospf_interface *oi); 105extern int ospf_opaque_type10_lsa_init (struct ospf_area *area); 106extern void ospf_opaque_type10_lsa_term (struct ospf_area *area); 107extern int ospf_opaque_type11_lsa_init (struct ospf *ospf); 108extern void ospf_opaque_type11_lsa_term (struct ospf *ospf); 109 110extern int 111ospf_register_opaque_functab ( 112 u_char lsa_type, 113 u_char opaque_type, 114 int (* new_if_hook)(struct interface *ifp), 115 int (* del_if_hook)(struct interface *ifp), 116 void (* ism_change_hook)(struct ospf_interface *oi, int old_status), 117 void (* nsm_change_hook)(struct ospf_neighbor *nbr, int old_status), 118 void (* config_write_router)(struct vty *vty), 119 void (* config_write_if )(struct vty *vty, struct interface *ifp), 120 void (* config_write_debug )(struct vty *vty), 121 void (* show_opaque_info )(struct vty *vty, struct ospf_lsa *lsa), 122 int (* lsa_originator)(void *arg), 123 struct ospf_lsa *(* lsa_refresher )(struct ospf_lsa *lsa), 124 int (* new_lsa_hook)(struct ospf_lsa *lsa), 125 int (* del_lsa_hook)(struct ospf_lsa *lsa) 126); 127extern void ospf_delete_opaque_functab (u_char lsa_type, u_char opaque_type); 128 129extern int ospf_opaque_new_if (struct interface *ifp); 130extern int ospf_opaque_del_if (struct interface *ifp); 131extern void ospf_opaque_ism_change (struct ospf_interface *oi, 132 int old_status); 133extern void ospf_opaque_nsm_change (struct ospf_neighbor *nbr, 134 int old_status); 135extern void ospf_opaque_config_write_router (struct vty *vty, struct ospf *); 136extern void ospf_opaque_config_write_if (struct vty *vty, 137 struct interface *ifp); 138extern void ospf_opaque_config_write_debug (struct vty *vty); 139extern void show_opaque_info_detail (struct vty *vty, struct ospf_lsa *lsa); 140extern void ospf_opaque_lsa_dump (struct stream *s, u_int16_t length); 141 142extern void ospf_opaque_lsa_originate_schedule (struct ospf_interface *oi, 143 int *init_delay); 144extern struct ospf_lsa *ospf_opaque_lsa_install (struct ospf_lsa *, 145 int rt_recalc); 146extern struct ospf_lsa *ospf_opaque_lsa_refresh (struct ospf_lsa *lsa); 147 148extern void ospf_opaque_lsa_reoriginate_schedule (void *lsa_type_dependent, 149 u_char lsa_type, 150 u_char opaque_type); 151extern void ospf_opaque_lsa_refresh_schedule (struct ospf_lsa *lsa); 152extern void ospf_opaque_lsa_flush_schedule (struct ospf_lsa *lsa); 153 154extern void ospf_opaque_adjust_lsreq (struct ospf_neighbor *nbr, 155 struct list *lsas); 156extern void ospf_opaque_self_originated_lsa_received (struct ospf_neighbor 157 *nbr, 158 struct ospf_lsa *lsa); 159extern void ospf_opaque_ls_ack_received (struct ospf_neighbor *nbr, 160 struct ospf_lsa *lsa); 161 162extern void htonf (float *src, float *dst); 163extern void ntohf (float *src, float *dst); 164extern struct ospf *oi_to_top (struct ospf_interface *oi); 165 166#endif /* _ZEBRA_OSPF_OPAQUE_H */ 167