File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / ospfd / ospf_opaque.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:12 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, v0_99_21, v0_99_20_1, v0_99_20, HEAD
quagga

    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: 
  101: extern void ospf_opaque_init (void);
  102: extern void ospf_opaque_term (void);
  103: extern int ospf_opaque_type9_lsa_init (struct ospf_interface *oi);
  104: extern void ospf_opaque_type9_lsa_term (struct ospf_interface *oi);
  105: extern int ospf_opaque_type10_lsa_init (struct ospf_area *area);
  106: extern void ospf_opaque_type10_lsa_term (struct ospf_area *area);
  107: extern int ospf_opaque_type11_lsa_init (struct ospf *ospf);
  108: extern void ospf_opaque_type11_lsa_term (struct ospf *ospf);
  109: 
  110: extern int
  111: ospf_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: );
  127: extern void ospf_delete_opaque_functab (u_char lsa_type, u_char opaque_type);
  128: 
  129: extern int ospf_opaque_new_if (struct interface *ifp);
  130: extern int ospf_opaque_del_if (struct interface *ifp);
  131: extern void ospf_opaque_ism_change (struct ospf_interface *oi,
  132: 				    int old_status);
  133: extern void ospf_opaque_nsm_change (struct ospf_neighbor *nbr,
  134: 				    int old_status);
  135: extern void ospf_opaque_config_write_router (struct vty *vty, struct ospf *);
  136: extern void ospf_opaque_config_write_if (struct vty *vty,
  137: 					 struct interface *ifp);
  138: extern void ospf_opaque_config_write_debug (struct vty *vty);
  139: extern void show_opaque_info_detail (struct vty *vty, struct ospf_lsa *lsa);
  140: extern void ospf_opaque_lsa_dump (struct stream *s, u_int16_t length);
  141: 
  142: extern void ospf_opaque_lsa_originate_schedule (struct ospf_interface *oi,
  143: 						int *init_delay);
  144: extern struct ospf_lsa *ospf_opaque_lsa_install (struct ospf_lsa *,
  145: 						 int rt_recalc);
  146: extern struct ospf_lsa *ospf_opaque_lsa_refresh (struct ospf_lsa *lsa);
  147: 
  148: extern void ospf_opaque_lsa_reoriginate_schedule (void *lsa_type_dependent,
  149: 						  u_char lsa_type,
  150: 						  u_char opaque_type);
  151: extern void ospf_opaque_lsa_refresh_schedule (struct ospf_lsa *lsa);
  152: extern void ospf_opaque_lsa_flush_schedule (struct ospf_lsa *lsa);
  153: 
  154: extern void ospf_opaque_adjust_lsreq (struct ospf_neighbor *nbr,
  155: 				      struct list *lsas);
  156: extern void ospf_opaque_self_originated_lsa_received (struct ospf_neighbor
  157: 						      *nbr,
  158: 						      struct ospf_lsa *lsa);
  159: extern void ospf_opaque_ls_ack_received (struct ospf_neighbor *nbr,
  160: 					 struct ospf_lsa *lsa);
  161: 
  162: extern void htonf (float *src, float *dst);
  163: extern void ntohf (float *src, float *dst);
  164: extern struct ospf *oi_to_top (struct ospf_interface *oi);
  165: 
  166: #endif /* _ZEBRA_OSPF_OPAQUE_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>