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/
6 * This file is part of GNU Zebra.
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
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.
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
24 #ifndef _ZEBRA_OSPF_MPLS_TE_H
25 #define _ZEBRA_OSPF_MPLS_TE_H
28 * Opaque LSA's link state ID for Traffic Engineering is
29 * structured as follows.
32 * +--------+--------+--------+--------+
33 * | 1 | MBZ |........|........|
34 * +--------+--------+--------+--------+
35 * |<-Type->|<Resv'd>|<-- Instance --->|
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.
44 #define LEGAL_TE_INSTANCE_RANGE(i) (0 <= (i) && (i) <= 0xffff)
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 * +--------+--------+--------+--------+ ---
60 * +--------+--------+--------+--------+ | TLV part for TE; Values might be
61 * | Values ... | V structured as a set of sub-TLVs.
62 * +--------+--------+--------+--------+ ---
66 * Following section defines TLV (tag, length, value) structures,
67 * used for Traffic Engineering.
71 u_int16_t type
; /* TE_TLV_XXX (see below) */
72 u_int16_t length
; /* Value portion only, in octets */
75 #define TLV_HDR_SIZE \
76 (sizeof (struct te_tlv_header))
78 #define TLV_BODY_SIZE(tlvh) \
79 (ROUNDUP (ntohs ((tlvh)->length), sizeof (u_int32_t)))
81 #define TLV_SIZE(tlvh) \
82 (TLV_HDR_SIZE + TLV_BODY_SIZE(tlvh))
84 #define TLV_HDR_TOP(lsah) \
85 (struct te_tlv_header *)((char *)(lsah) + OSPF_LSA_HEADER_SIZE)
87 #define TLV_HDR_NEXT(tlvh) \
88 (struct te_tlv_header *)((char *)(tlvh) + TLV_SIZE(tlvh))
91 * Following section defines TLV body parts.
93 /* Router Address TLV *//* Mandatory */
94 #define TE_TLV_ROUTER_ADDR 1
95 struct te_tlv_router_addr
97 struct te_tlv_header header
; /* Value length is 4 octets. */
102 #define TE_TLV_LINK 2
105 struct te_tlv_header header
;
106 /* A set of link-sub-TLVs will follow. */
109 /* Link Type Sub-TLV *//* Mandatory */
110 #define TE_LINK_SUBTLV_LINK_TYPE 1
111 struct te_link_subtlv_link_type
113 struct te_tlv_header header
; /* Value length is 1 octet. */
115 #define LINK_TYPE_SUBTLV_VALUE_PTP 1
116 #define LINK_TYPE_SUBTLV_VALUE_MA 2
122 /* Link Sub-TLV: Link ID *//* Mandatory */
123 #define TE_LINK_SUBTLV_LINK_ID 2
124 struct te_link_subtlv_link_id
126 struct te_tlv_header header
; /* Value length is 4 octets. */
127 struct in_addr value
; /* Same as router-lsa's link-id. */
130 /* Link Sub-TLV: Local Interface IP Address *//* Optional */
131 #define TE_LINK_SUBTLV_LCLIF_IPADDR 3
132 struct te_link_subtlv_lclif_ipaddr
134 struct te_tlv_header header
; /* Value length is 4 x N octets. */
135 struct in_addr value
[1]; /* Local IP address(es). */
138 /* Link Sub-TLV: Remote Interface IP Address *//* Optional */
139 #define TE_LINK_SUBTLV_RMTIF_IPADDR 4
140 struct te_link_subtlv_rmtif_ipaddr
142 struct te_tlv_header header
; /* Value length is 4 x N octets. */
143 struct in_addr value
[1]; /* Neighbor's IP address(es). */
146 /* Link Sub-TLV: Traffic Engineering Metric *//* Optional */
147 #define TE_LINK_SUBTLV_TE_METRIC 5
148 struct te_link_subtlv_te_metric
150 struct te_tlv_header header
; /* Value length is 4 octets. */
151 u_int32_t value
; /* Link metric for TE purpose. */
154 /* Link Sub-TLV: Maximum Bandwidth *//* Optional */
155 #define TE_LINK_SUBTLV_MAX_BW 6
156 struct te_link_subtlv_max_bw
158 struct te_tlv_header header
; /* Value length is 4 octets. */
159 float value
; /* bytes/sec */
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
166 struct te_tlv_header header
; /* Value length is 4 octets. */
167 float value
; /* bytes/sec */
170 /* Link Sub-TLV: Unreserved Bandwidth *//* Optional */
171 #define TE_LINK_SUBTLV_UNRSV_BW 8
172 struct te_link_subtlv_unrsv_bw
174 struct te_tlv_header header
; /* Value length is 32 octets. */
175 float value
[8]; /* One for each priority level. */
178 /* Link Sub-TLV: Resource Class/Color *//* Optional */
179 #define TE_LINK_SUBTLV_RSC_CLSCLR 9
180 struct te_link_subtlv_rsc_clsclr
182 struct te_tlv_header header
; /* Value length is 4 octets. */
183 u_int32_t value
; /* Admin. group membership. */
186 /* Here are "non-official" architechtual constants. */
187 #define MPLS_TE_MINIMUM_BANDWIDTH 1.0 /* Reasonable? *//* XXX */
190 extern int ospf_mpls_te_init (void);
191 extern void ospf_mpls_te_term (void);
193 #endif /* _ZEBRA_OSPF_MPLS_TE_H */