File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / ospfd / ospf_te.h
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jul 21 23:54:40 2013 UTC (10 years, 11 months ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, v0_99_22p0, v0_99_22, HEAD
0.99.22

    1: /*
    2:  * This is an implementation of draft-katz-yeung-ospf-traffic-06.txt
    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_MPLS_TE_H
   25: #define _ZEBRA_OSPF_MPLS_TE_H
   26: 
   27: /*
   28:  * Opaque LSA's link state ID for Traffic Engineering is
   29:  * structured as follows.
   30:  *
   31:  *        24       16        8        0
   32:  * +--------+--------+--------+--------+
   33:  * |    1   |  MBZ   |........|........|
   34:  * +--------+--------+--------+--------+
   35:  * |<-Type->|<Resv'd>|<-- Instance --->|
   36:  *
   37:  *
   38:  * Type:      IANA has assigned '1' for Traffic Engineering.
   39:  * MBZ:       Reserved, must be set to zero.
   40:  * Instance:  User may select an arbitrary 16-bit value.
   41:  *
   42:  */
   43: 
   44: #define	MAX_LEGAL_TE_INSTANCE_NUM (0xffff)
   45: 
   46: /*
   47:  *        24       16        8        0
   48:  * +--------+--------+--------+--------+ ---
   49:  * |   LS age        |Options |   10   |  A
   50:  * +--------+--------+--------+--------+  |
   51:  * |    1   |   0    |    Instance     |  |
   52:  * +--------+--------+--------+--------+  |
   53:  * |        Advertising router         |  |  Standard (Opaque) LSA header;
   54:  * +--------+--------+--------+--------+  |  Only type-10 is used.
   55:  * |        LS sequence number         |  |
   56:  * +--------+--------+--------+--------+  |
   57:  * |   LS checksum   |     Length      |  V
   58:  * +--------+--------+--------+--------+ ---
   59:  * |      Type       |     Length      |  A
   60:  * +--------+--------+--------+--------+  |  TLV part for TE; Values might be
   61:  * |              Values ...           |  V  structured as a set of sub-TLVs.
   62:  * +--------+--------+--------+--------+ ---
   63:  */
   64: 
   65: /*
   66:  * Following section defines TLV (tag, length, value) structures,
   67:  * used for Traffic Engineering.
   68:  */
   69: struct te_tlv_header
   70: {
   71:   u_int16_t	type;			/* TE_TLV_XXX (see below) */
   72:   u_int16_t	length;			/* Value portion only, in octets */
   73: };
   74: 
   75: #define TLV_HDR_SIZE \
   76: 	(sizeof (struct te_tlv_header))
   77: 
   78: #define TLV_BODY_SIZE(tlvh) \
   79: 	(ROUNDUP (ntohs ((tlvh)->length), sizeof (u_int32_t)))
   80: 
   81: #define TLV_SIZE(tlvh) \
   82: 	(TLV_HDR_SIZE + TLV_BODY_SIZE(tlvh))
   83: 
   84: #define TLV_HDR_TOP(lsah) \
   85: 	(struct te_tlv_header *)((char *)(lsah) + OSPF_LSA_HEADER_SIZE)
   86: 
   87: #define TLV_HDR_NEXT(tlvh) \
   88: 	(struct te_tlv_header *)((char *)(tlvh) + TLV_SIZE(tlvh))
   89: 
   90: /*
   91:  * Following section defines TLV body parts.
   92:  */
   93: /* Router Address TLV *//* Mandatory */
   94: #define	TE_TLV_ROUTER_ADDR		1
   95: struct te_tlv_router_addr
   96: {
   97:   struct te_tlv_header	header;		/* Value length is 4 octets. */
   98:   struct in_addr	value;
   99: };
  100: 
  101: /* Link TLV */
  102: #define	TE_TLV_LINK			2
  103: struct te_tlv_link
  104: {
  105:   struct te_tlv_header	header;
  106:   /* A set of link-sub-TLVs will follow. */
  107: };
  108: 
  109: /* Link Type Sub-TLV *//* Mandatory */
  110: #define	TE_LINK_SUBTLV_LINK_TYPE		1
  111: struct te_link_subtlv_link_type
  112: {
  113:   struct te_tlv_header	header;		/* Value length is 1 octet. */
  114:   struct {
  115: #define	LINK_TYPE_SUBTLV_VALUE_PTP	1
  116: #define	LINK_TYPE_SUBTLV_VALUE_MA	2
  117:       u_char	value;
  118:       u_char	padding[3];
  119:   } link_type;
  120: };
  121: 
  122: /* Link Sub-TLV: Link ID *//* Mandatory */
  123: #define	TE_LINK_SUBTLV_LINK_ID			2
  124: struct te_link_subtlv_link_id
  125: {
  126:   struct te_tlv_header	header;		/* Value length is 4 octets. */
  127:   struct in_addr	value;		/* Same as router-lsa's link-id. */
  128: };
  129: 
  130: /* Link Sub-TLV: Local Interface IP Address *//* Optional */
  131: #define	TE_LINK_SUBTLV_LCLIF_IPADDR		3
  132: struct te_link_subtlv_lclif_ipaddr
  133: {
  134:   struct te_tlv_header	header;		/* Value length is 4 x N octets. */
  135:   struct in_addr	value[1];	/* Local IP address(es). */
  136: };
  137: 
  138: /* Link Sub-TLV: Remote Interface IP Address *//* Optional */
  139: #define	TE_LINK_SUBTLV_RMTIF_IPADDR		4
  140: struct te_link_subtlv_rmtif_ipaddr
  141: {
  142:   struct te_tlv_header	header;		/* Value length is 4 x N octets. */
  143:   struct in_addr	value[1];	/* Neighbor's IP address(es). */
  144: };
  145: 
  146: /* Link Sub-TLV: Traffic Engineering Metric *//* Optional */
  147: #define	TE_LINK_SUBTLV_TE_METRIC		5
  148: struct te_link_subtlv_te_metric
  149: {
  150:   struct te_tlv_header	header;		/* Value length is 4 octets. */
  151:   u_int32_t		value;		/* Link metric for TE purpose. */
  152: };
  153: 
  154: /* Link Sub-TLV: Maximum Bandwidth *//* Optional */
  155: #define	TE_LINK_SUBTLV_MAX_BW			6
  156: struct te_link_subtlv_max_bw
  157: {
  158:   struct te_tlv_header	header;		/* Value length is 4 octets. */
  159:   float			value;		/* bytes/sec */
  160: };
  161: 
  162: /* Link Sub-TLV: Maximum Reservable Bandwidth *//* Optional */
  163: #define	TE_LINK_SUBTLV_MAX_RSV_BW		7
  164: struct te_link_subtlv_max_rsv_bw
  165: {
  166:   struct te_tlv_header	header;		/* Value length is 4 octets. */
  167:   float			value;		/* bytes/sec */
  168: };
  169: 
  170: /* Link Sub-TLV: Unreserved Bandwidth *//* Optional */
  171: #define	TE_LINK_SUBTLV_UNRSV_BW			8
  172: struct te_link_subtlv_unrsv_bw
  173: {
  174:   struct te_tlv_header	header;		/* Value length is 32 octets. */
  175:   float			value[8];	/* One for each priority level. */
  176: };
  177: 
  178: /* Link Sub-TLV: Resource Class/Color *//* Optional */
  179: #define	TE_LINK_SUBTLV_RSC_CLSCLR		9
  180: struct te_link_subtlv_rsc_clsclr
  181: {
  182:   struct te_tlv_header	header;		/* Value length is 4 octets. */
  183:   u_int32_t		value;		/* Admin. group membership. */
  184: };
  185: 
  186: /* Here are "non-official" architechtual constants. */
  187: #define MPLS_TE_MINIMUM_BANDWIDTH	1.0	/* Reasonable? *//* XXX */
  188: 
  189: /* Prototypes. */
  190: extern int ospf_mpls_te_init (void);
  191: extern void ospf_mpls_te_term (void);
  192: 
  193: #endif /* _ZEBRA_OSPF_MPLS_TE_H */

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