ospf_opaque.h
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:6k
源码类别:

网络

开发平台:

Unix_Linux

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