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 LEGAL_TE_INSTANCE_RANGE(i) (0 <= (i) && (i) <= 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 */ 69struct 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 95struct 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 103struct 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 111struct 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 124struct 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 132struct 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 140struct 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 148struct 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 156struct 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 164struct 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 172struct 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 180struct 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. */ 190extern int ospf_mpls_te_init (void); 191extern void ospf_mpls_te_term (void); 192 193#endif /* _ZEBRA_OSPF_MPLS_TE_H */ 194