1 1.5 rillig /* $NetBSD: tlv.h,v 1.5 2022/02/07 02:35:09 rillig Exp $ */ 2 1.1 kefren 3 1.1 kefren /*- 4 1.1 kefren * Copyright (c) 2010 The NetBSD Foundation, Inc. 5 1.1 kefren * All rights reserved. 6 1.1 kefren * 7 1.1 kefren * This code is derived from software contributed to The NetBSD Foundation 8 1.1 kefren * by Mihai Chelaru <kefren (at) NetBSD.org> 9 1.1 kefren * 10 1.1 kefren * Redistribution and use in source and binary forms, with or without 11 1.1 kefren * modification, are permitted provided that the following conditions 12 1.1 kefren * are met: 13 1.1 kefren * 1. Redistributions of source code must retain the above copyright 14 1.1 kefren * notice, this list of conditions and the following disclaimer. 15 1.1 kefren * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 kefren * notice, this list of conditions and the following disclaimer in the 17 1.1 kefren * documentation and/or other materials provided with the distribution. 18 1.1 kefren * 19 1.1 kefren * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 kefren * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 kefren * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 kefren * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 kefren * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 kefren * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 kefren * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 kefren * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 kefren * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 kefren * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 kefren * POSSIBILITY OF SUCH DAMAGE. 30 1.1 kefren */ 31 1.1 kefren 32 1.1 kefren #ifndef _TLV_H_ 33 1.1 kefren #define _TLV_H_ 34 1.1 kefren 35 1.1 kefren /* TLV messages */ 36 1.1 kefren #define TLV_FEC 0x0100 37 1.1 kefren #define TLV_ADDRESS_LIST 0x0101 38 1.1 kefren #define TLV_HOP_COUNT 0x0103 39 1.1 kefren #define TLV_PATH_VECTOR 0x0104 40 1.1 kefren #define TLV_GENERIC_LABEL 0x0200 41 1.1 kefren #define TLV_ATM_LABEL 0x0201 42 1.1 kefren #define TLV_FR_LABEL 0x0202 43 1.1 kefren #define TLV_STATUS 0x0300 44 1.1 kefren #define TLV_EXTENDED_STATUS 0x0301 45 1.1 kefren #define TLV_RETURNED_PDU 0x0302 46 1.1 kefren #define TLV_RETURNED_MESSAGE 0x0303 47 1.1 kefren #define TLV_COMMON_HELLO 0x0400 48 1.1 kefren #define TLV_IPV4_TRANSPORT 0x0401 49 1.1 kefren #define TLV_CONFIGURATION_SEQ 0x0402 50 1.1 kefren #define TLV_IPV6_TRANSPORT 0x0403 51 1.1 kefren #define TLV_COMMON_SESSION 0x0500 52 1.1 kefren #define TLV_ATM_SESSION 0x0501 53 1.1 kefren #define TLV_FR_SESSION 0x0502 54 1.1 kefren #define TLV_LABEL_REQUEST 0x0600 55 1.1 kefren 56 1.1 kefren /* Some common lengths in order to avoid writing them every time */ 57 1.1 kefren #define TLV_TYPE_LENGTH (sizeof(uint16_t) + sizeof(uint16_t)) 58 1.1 kefren #define MSGID_SIZE (sizeof(uint32_t)) 59 1.1 kefren 60 1.1 kefren /* General TLV structure */ 61 1.1 kefren struct tlv { 62 1.1 kefren uint16_t type; 63 1.1 kefren uint16_t length; 64 1.1 kefren uint32_t messageid; 65 1.1 kefren } __packed; 66 1.1 kefren 67 1.1 kefren /* Common Hello TLV structure */ 68 1.1 kefren struct common_hello_tlv { 69 1.1 kefren uint16_t type; 70 1.1 kefren uint16_t length; 71 1.1 kefren uint16_t holdtime; 72 1.5 rillig uint16_t res; 73 1.1 kefren } __packed; 74 1.1 kefren 75 1.1 kefren /* Hello TLV structure */ 76 1.1 kefren struct hello_tlv { 77 1.1 kefren uint16_t type; 78 1.1 kefren uint16_t length; 79 1.1 kefren uint32_t messageid; 80 1.1 kefren struct common_hello_tlv ch; 81 1.1 kefren /* XXX: optional parameters */ 82 1.1 kefren } __packed; 83 1.1 kefren 84 1.3 kefren /* Transport address TLV */ 85 1.1 kefren struct transport_address_tlv { 86 1.1 kefren uint16_t type; 87 1.1 kefren uint16_t length; 88 1.2 kefren union { 89 1.2 kefren struct in_addr ip4addr; 90 1.2 kefren struct in6_addr ip6addr; 91 1.2 kefren } address; 92 1.1 kefren } __packed; 93 1.1 kefren 94 1.1 kefren 95 1.1 kefren #define CS_LEN (sizeof(struct init_tlv) - TLV_TYPE_LENGTH - MSGID_SIZE - \ 96 1.1 kefren sizeof(uint32_t)) 97 1.1 kefren 98 1.1 kefren /* Initialization TLV structure */ 99 1.1 kefren struct init_tlv { 100 1.1 kefren uint16_t type; 101 1.1 kefren uint16_t length; 102 1.1 kefren uint32_t messageid; 103 1.1 kefren /* 104 1.1 kefren * Common Session Parameters 105 1.1 kefren */ 106 1.1 kefren uint16_t cs_type; 107 1.1 kefren uint16_t cs_len; 108 1.1 kefren uint16_t cs_version; 109 1.1 kefren uint16_t cs_keepalive; 110 1.1 kefren uint16_t cs_adpvlim; /* XXX */ 111 1.1 kefren uint16_t cs_maxpdulen; 112 1.1 kefren struct in_addr cs_peeraddress; 113 1.1 kefren uint16_t cs_peeraddrspace; 114 1.1 kefren } __packed; 115 1.1 kefren 116 1.1 kefren /* Keepalive TLV */ 117 1.1 kefren struct ka_tlv { /* Keepalive message */ 118 1.1 kefren uint16_t type; 119 1.1 kefren uint16_t length; 120 1.1 kefren uint32_t messageid; 121 1.1 kefren } __packed; 122 1.1 kefren 123 1.1 kefren /* Notification TLV */ 124 1.1 kefren struct notification_tlv { 125 1.1 kefren uint16_t type; 126 1.1 kefren uint16_t length; 127 1.1 kefren uint32_t messageid; 128 1.1 kefren uint16_t status; 129 1.1 kefren uint16_t st_len; 130 1.1 kefren uint32_t st_code; 131 1.1 kefren uint32_t msg_id; 132 1.1 kefren uint32_t msg_type; 133 1.1 kefren } __packed; 134 1.1 kefren 135 1.1 kefren /* Address LIST TLV for SEND */ 136 1.1 kefren struct address_list_tlv { 137 1.1 kefren uint16_t type; 138 1.1 kefren uint16_t length; 139 1.1 kefren uint32_t messageid; 140 1.1 kefren uint16_t a_type; 141 1.1 kefren uint16_t a_length; 142 1.1 kefren uint16_t a_af; 143 1.1 kefren struct in_addr a_address; 144 1.1 kefren } __packed; 145 1.1 kefren 146 1.1 kefren /* Real AL TLV used for RCV for now */ 147 1.1 kefren struct al_tlv { 148 1.1 kefren uint16_t type; 149 1.1 kefren uint16_t length; 150 1.1 kefren uint16_t af; 151 1.1 kefren struct in_addr address; 152 1.1 kefren } __packed; 153 1.1 kefren 154 1.1 kefren struct address_tlv { 155 1.1 kefren uint16_t type; 156 1.1 kefren uint16_t length; 157 1.1 kefren uint32_t messageid; 158 1.1 kefren } __packed; 159 1.1 kefren 160 1.1 kefren /* Label map TLV */ 161 1.1 kefren struct label_map_tlv { 162 1.1 kefren uint16_t type; 163 1.1 kefren uint16_t length; 164 1.1 kefren uint32_t messageid; 165 1.1 kefren } __packed; 166 1.1 kefren 167 1.1 kefren /* FEC TLV */ 168 1.1 kefren struct fec_tlv { 169 1.1 kefren uint16_t type; 170 1.1 kefren uint16_t length; 171 1.1 kefren } __packed; 172 1.1 kefren 173 1.1 kefren struct prefix_tlv { 174 1.1 kefren uint8_t type; 175 1.1 kefren uint16_t af; 176 1.1 kefren uint8_t prelen; 177 1.1 kefren struct in_addr prefix; 178 1.1 kefren } __packed; 179 1.1 kefren 180 1.1 kefren struct host_tlv { 181 1.1 kefren uint8_t type; 182 1.1 kefren uint16_t af; 183 1.1 kefren uint8_t length; 184 1.1 kefren struct in_addr address; 185 1.1 kefren } __packed; 186 1.1 kefren 187 1.1 kefren struct label_tlv { 188 1.1 kefren uint16_t type; 189 1.1 kefren uint16_t length; 190 1.1 kefren uint32_t label; 191 1.1 kefren } __packed; 192 1.1 kefren 193 1.1 kefren /* Label Request Message ID TLV */ 194 1.1 kefren struct label_request_tlv { 195 1.1 kefren uint16_t type; 196 1.1 kefren uint16_t length; /* 4 */ 197 1.1 kefren uint32_t messageid; 198 1.1 kefren } __packed; 199 1.1 kefren 200 1.1 kefren struct hello_tlv * get_hello_tlv(unsigned char *, uint); 201 1.1 kefren void debug_tlv(struct tlv *); 202 1.1 kefren 203 1.1 kefren #endif /* !_TLV_H_ */ 204