github.com/osrg/gobgp@v2.0.0+incompatible/pkg/packet/bgp/constant.go (about) 1 // Copyright (C) 2014 Nippon Telegraph and Telephone Corporation. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 12 // implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 package bgp 17 18 import ( 19 "fmt" 20 "strings" 21 ) 22 23 const AS_TRANS = 23456 24 25 const BGP_PORT = 179 26 27 type FSMState int 28 29 const ( 30 BGP_FSM_IDLE FSMState = iota 31 BGP_FSM_CONNECT 32 BGP_FSM_ACTIVE 33 BGP_FSM_OPENSENT 34 BGP_FSM_OPENCONFIRM 35 BGP_FSM_ESTABLISHED 36 ) 37 38 // partially taken from http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml 39 type Protocol int 40 41 const ( 42 Unknown Protocol = iota 43 ICMP = 0x01 44 IGMP = 0x02 45 TCP = 0x06 46 EGP = 0x08 47 IGP = 0x09 48 UDP = 0x11 49 RSVP = 0x2e 50 GRE = 0x2f 51 OSPF = 0x59 52 IPIP = 0x5e 53 PIM = 0x67 54 SCTP = 0x84 55 ) 56 57 var ProtocolNameMap = map[Protocol]string{ 58 Unknown: "unknown", 59 ICMP: "icmp", 60 IGMP: "igmp", 61 TCP: "tcp", 62 EGP: "egp", 63 IGP: "igp", 64 UDP: "udp", 65 RSVP: "rsvp", 66 GRE: "gre", 67 OSPF: "ospf", 68 IPIP: "ipip", 69 PIM: "pim", 70 SCTP: "sctp", 71 } 72 73 func (p Protocol) String() string { 74 name, ok := ProtocolNameMap[p] 75 if !ok { 76 return fmt.Sprintf("%d", p) 77 } 78 return name 79 } 80 81 type TCPFlag int 82 83 const ( 84 _ TCPFlag = iota 85 TCP_FLAG_FIN = 0x01 86 TCP_FLAG_SYN = 0x02 87 TCP_FLAG_RST = 0x04 88 TCP_FLAG_PUSH = 0x08 89 TCP_FLAG_ACK = 0x10 90 TCP_FLAG_URGENT = 0x20 91 TCP_FLAG_ECE = 0x40 92 TCP_FLAG_CWR = 0x80 93 ) 94 95 var TCPFlagNameMap = map[TCPFlag]string{ 96 TCP_FLAG_FIN: "F", 97 TCP_FLAG_SYN: "S", 98 TCP_FLAG_RST: "R", 99 TCP_FLAG_PUSH: "P", 100 TCP_FLAG_ACK: "A", 101 TCP_FLAG_URGENT: "U", 102 TCP_FLAG_CWR: "C", 103 TCP_FLAG_ECE: "E", 104 } 105 106 // Prepares a sorted list of flags because map iterations does not happen 107 // in a consistent order in Golang. 108 var TCPSortedFlags = []TCPFlag{ 109 TCP_FLAG_FIN, 110 TCP_FLAG_SYN, 111 TCP_FLAG_RST, 112 TCP_FLAG_PUSH, 113 TCP_FLAG_ACK, 114 TCP_FLAG_URGENT, 115 TCP_FLAG_ECE, 116 TCP_FLAG_CWR, 117 } 118 119 func (f TCPFlag) String() string { 120 flags := make([]string, 0, len(TCPSortedFlags)) 121 for _, v := range TCPSortedFlags { 122 if f&v > 0 { 123 flags = append(flags, TCPFlagNameMap[v]) 124 } 125 } 126 return strings.Join(flags, "") 127 } 128 129 type BitmaskFlagOp uint8 130 131 const ( 132 BITMASK_FLAG_OP_OR BitmaskFlagOp = iota 133 BITMASK_FLAG_OP_MATCH = 0x01 134 BITMASK_FLAG_OP_NOT = 0x02 135 BITMASK_FLAG_OP_NOT_MATCH = 0x03 136 BITMASK_FLAG_OP_AND = 0x40 137 BITMASK_FLAG_OP_END = 0x80 138 ) 139 140 var BitmaskFlagOpNameMap = map[BitmaskFlagOp]string{ 141 BITMASK_FLAG_OP_OR: " ", 142 BITMASK_FLAG_OP_AND: "&", 143 BITMASK_FLAG_OP_END: "E", 144 BITMASK_FLAG_OP_NOT: "!", 145 BITMASK_FLAG_OP_MATCH: "=", 146 } 147 148 // Note: Meaning of "" is different from that of the numeric operator because 149 // RFC5575 says if the Match bit in the bitmask operand is set, it should be 150 // "strictly" matching against the given value. 151 var BitmaskFlagOpValueMap = map[string]BitmaskFlagOp{ 152 " ": BITMASK_FLAG_OP_OR, 153 "": BITMASK_FLAG_OP_OR, 154 "==": BITMASK_FLAG_OP_MATCH, 155 "=": BITMASK_FLAG_OP_MATCH, 156 "!": BITMASK_FLAG_OP_NOT, 157 "!=": BITMASK_FLAG_OP_NOT_MATCH, 158 "=!": BITMASK_FLAG_OP_NOT_MATCH, // For the backward compatibility 159 "&": BITMASK_FLAG_OP_AND, 160 "E": BITMASK_FLAG_OP_END, 161 } 162 163 func (f BitmaskFlagOp) String() string { 164 ops := make([]string, 0) 165 if f&BITMASK_FLAG_OP_AND > 0 { 166 ops = append(ops, BitmaskFlagOpNameMap[BITMASK_FLAG_OP_AND]) 167 } else { 168 ops = append(ops, BitmaskFlagOpNameMap[BITMASK_FLAG_OP_OR]) 169 } 170 if f&BITMASK_FLAG_OP_NOT > 0 { 171 ops = append(ops, BitmaskFlagOpNameMap[BITMASK_FLAG_OP_NOT]) 172 } 173 if f&BITMASK_FLAG_OP_MATCH > 0 { 174 ops = append(ops, BitmaskFlagOpNameMap[BITMASK_FLAG_OP_MATCH]) 175 } 176 return strings.Join(ops, "") 177 } 178 179 type FragmentFlag int 180 181 const ( 182 FRAG_FLAG_NOT FragmentFlag = iota 183 FRAG_FLAG_DONT = 0x01 184 FRAG_FLAG_IS = 0x02 185 FRAG_FLAG_FIRST = 0x04 186 FRAG_FLAG_LAST = 0x08 187 ) 188 189 var FragmentFlagNameMap = map[FragmentFlag]string{ 190 FRAG_FLAG_NOT: "not-a-fragment", 191 FRAG_FLAG_DONT: "dont-fragment", 192 FRAG_FLAG_IS: "is-fragment", 193 FRAG_FLAG_FIRST: "first-fragment", 194 FRAG_FLAG_LAST: "last-fragment", 195 } 196 197 // Prepares a sorted list of flags because map iterations does not happen 198 // in a consistent order in Golang. 199 var FragmentSortedFlags = []FragmentFlag{ 200 FRAG_FLAG_NOT, 201 FRAG_FLAG_DONT, 202 FRAG_FLAG_IS, 203 FRAG_FLAG_FIRST, 204 FRAG_FLAG_LAST, 205 } 206 207 func (f FragmentFlag) String() string { 208 flags := make([]string, 0, len(FragmentSortedFlags)) 209 for _, v := range FragmentSortedFlags { 210 if f&v > 0 { 211 flags = append(flags, FragmentFlagNameMap[v]) 212 } 213 } 214 // Note: If multiple bits are set, joins them with "+". 215 return strings.Join(flags, "+") 216 } 217 218 type DECNumOp uint8 219 220 const ( 221 DEC_NUM_OP_TRUE DECNumOp = iota // true always with END bit set 222 DEC_NUM_OP_EQ = 0x01 223 DEC_NUM_OP_GT = 0x02 224 DEC_NUM_OP_GT_EQ = 0x03 225 DEC_NUM_OP_LT = 0x04 226 DEC_NUM_OP_LT_EQ = 0x05 227 DEC_NUM_OP_NOT_EQ = 0x06 228 DEC_NUM_OP_FALSE = 0x07 // false always with END bit set 229 DEC_NUM_OP_OR = 0x00 230 DEC_NUM_OP_AND = 0x40 231 DEC_NUM_OP_END = 0x80 232 ) 233 234 var DECNumOpNameMap = map[DECNumOp]string{ 235 DEC_NUM_OP_TRUE: "true", 236 DEC_NUM_OP_EQ: "==", 237 DEC_NUM_OP_GT: ">", 238 DEC_NUM_OP_GT_EQ: ">=", 239 DEC_NUM_OP_LT: "<", 240 DEC_NUM_OP_LT_EQ: "<=", 241 DEC_NUM_OP_NOT_EQ: "!=", 242 DEC_NUM_OP_FALSE: "false", 243 //DEC_NUM_OP_OR: " ", // duplicate with DEC_NUM_OP_TRUE 244 DEC_NUM_OP_AND: "&", 245 DEC_NUM_OP_END: "E", 246 } 247 248 var DECNumOpValueMap = map[string]DECNumOp{ 249 "true": DEC_NUM_OP_TRUE, 250 "": DEC_NUM_OP_EQ, 251 "==": DEC_NUM_OP_EQ, 252 "=": DEC_NUM_OP_EQ, 253 ">": DEC_NUM_OP_GT, 254 ">=": DEC_NUM_OP_GT_EQ, 255 "<": DEC_NUM_OP_LT, 256 "<=": DEC_NUM_OP_LT_EQ, 257 "!=": DEC_NUM_OP_NOT_EQ, 258 "=!": DEC_NUM_OP_NOT_EQ, 259 "!": DEC_NUM_OP_NOT_EQ, 260 "false": DEC_NUM_OP_FALSE, 261 " ": DEC_NUM_OP_OR, 262 "&": DEC_NUM_OP_AND, 263 "E": DEC_NUM_OP_END, 264 } 265 266 func (f DECNumOp) String() string { 267 ops := make([]string, 0) 268 logicFlag := DECNumOp(f & 0xc0) // higher 2 bits 269 if logicFlag&DEC_NUM_OP_AND > 0 { 270 ops = append(ops, DECNumOpNameMap[DEC_NUM_OP_AND]) 271 } else { 272 ops = append(ops, " ") // DEC_NUM_OP_OR 273 } 274 // Omits DEC_NUM_OP_END 275 cmpFlag := DECNumOp(f & 0x7) // lower 3 bits 276 for v, s := range DECNumOpNameMap { 277 if cmpFlag == v { 278 ops = append(ops, s) 279 break 280 } 281 } 282 return strings.Join(ops, "") 283 } 284 285 // Potentially taken from https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xhtml 286 type EthernetType int 287 288 const ( 289 IPv4 EthernetType = 0x0800 290 ARP EthernetType = 0x0806 291 RARP EthernetType = 0x8035 292 VMTP EthernetType = 0x805B 293 APPLE_TALK EthernetType = 0x809B 294 AARP EthernetType = 0x80F3 295 IPX EthernetType = 0x8137 296 SNMP EthernetType = 0x814C 297 NET_BIOS EthernetType = 0x8191 298 XTP EthernetType = 0x817D 299 IPv6 EthernetType = 0x86DD 300 PPPoE_DISCOVERY EthernetType = 0x8863 301 PPPoE_SESSION EthernetType = 0x8864 302 LOOPBACK EthernetType = 0x9000 303 ) 304 305 var EthernetTypeNameMap = map[EthernetType]string{ 306 IPv4: "ipv4", 307 ARP: "arp", 308 RARP: "rarp", 309 VMTP: "vmtp", 310 APPLE_TALK: "apple-talk", 311 AARP: "aarp", 312 IPX: "ipx", 313 SNMP: "snmp", 314 NET_BIOS: "net-bios", 315 XTP: "xtp", 316 IPv6: "ipv6", 317 PPPoE_DISCOVERY: "pppoe-discovery", 318 PPPoE_SESSION: "pppoe-session", 319 LOOPBACK: "loopback", 320 } 321 322 func (t EthernetType) String() string { 323 if name, ok := EthernetTypeNameMap[t]; ok { 324 return name 325 } 326 return fmt.Sprintf("%d", t) 327 }