1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
// Copyright (C) 2014 Nippon Telegraph and Telephone Corporation.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package bgp
import (
"fmt"
"strings"
)
const AS_TRANS = 23456
const BGP_PORT = 179
type FSMState int
const (
BGP_FSM_IDLE FSMState = iota
BGP_FSM_CONNECT
BGP_FSM_ACTIVE
BGP_FSM_OPENSENT
BGP_FSM_OPENCONFIRM
BGP_FSM_ESTABLISHED
)
// partially taken from http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
type Protocol int
const (
Unknown Protocol = iota
ICMP = 0x01
IGMP = 0x02
TCP = 0x06
EGP = 0x08
IGP = 0x09
UDP = 0x11
RSVP = 0x2e
GRE = 0x2f
OSPF = 0x59
IPIP = 0x5e
PIM = 0x67
SCTP = 0x84
)
var ProtocolNameMap = map[Protocol]string{
Unknown: "unknown",
ICMP: "icmp",
IGMP: "igmp",
TCP: "tcp",
EGP: "egp",
IGP: "igp",
UDP: "udp",
RSVP: "rsvp",
GRE: "gre",
OSPF: "ospf",
IPIP: "ipip",
PIM: "pim",
SCTP: "sctp",
}
var ProtocolValueMap = map[string]Protocol{
ProtocolNameMap[ICMP]: ICMP,
ProtocolNameMap[IGMP]: IGMP,
ProtocolNameMap[TCP]: TCP,
ProtocolNameMap[EGP]: EGP,
ProtocolNameMap[IGP]: IGP,
ProtocolNameMap[UDP]: UDP,
ProtocolNameMap[RSVP]: RSVP,
ProtocolNameMap[GRE]: GRE,
ProtocolNameMap[OSPF]: OSPF,
ProtocolNameMap[IPIP]: IPIP,
ProtocolNameMap[PIM]: PIM,
ProtocolNameMap[SCTP]: SCTP,
}
func (p Protocol) String() string {
name, ok := ProtocolNameMap[p]
if !ok {
return fmt.Sprintf("%d", p)
}
return name
}
type TCPFlag int
const (
TCP_FLAG_FIN = 0x01
TCP_FLAG_SYN = 0x02
TCP_FLAG_RST = 0x04
TCP_FLAG_PUSH = 0x08
TCP_FLAG_ACK = 0x10
TCP_FLAG_URGENT = 0x20
)
var TCPFlagNameMap = map[TCPFlag]string{
TCP_FLAG_FIN: "fin",
TCP_FLAG_SYN: "syn",
TCP_FLAG_RST: "rst",
TCP_FLAG_PUSH: "push",
TCP_FLAG_ACK: "ack",
TCP_FLAG_URGENT: "urgent",
}
var TCPFlagValueMap = map[string]TCPFlag{
TCPFlagNameMap[TCP_FLAG_FIN]: TCP_FLAG_FIN,
TCPFlagNameMap[TCP_FLAG_SYN]: TCP_FLAG_SYN,
TCPFlagNameMap[TCP_FLAG_RST]: TCP_FLAG_RST,
TCPFlagNameMap[TCP_FLAG_PUSH]: TCP_FLAG_PUSH,
TCPFlagNameMap[TCP_FLAG_ACK]: TCP_FLAG_ACK,
TCPFlagNameMap[TCP_FLAG_URGENT]: TCP_FLAG_URGENT,
}
func (f TCPFlag) String() string {
ss := make([]string, 0, 6)
for _, v := range []TCPFlag{TCP_FLAG_FIN, TCP_FLAG_SYN, TCP_FLAG_RST, TCP_FLAG_PUSH, TCP_FLAG_ACK, TCP_FLAG_URGENT} {
if f&v > 0 {
ss = append(ss, TCPFlagNameMap[v])
}
}
return strings.Join(ss, "|")
}
type EthernetType int
const (
IPv4 EthernetType = 0x0800
ARP EthernetType = 0x0806
RARP EthernetType = 0x8035
VMTP EthernetType = 0x805B
APPLE_TALK EthernetType = 0x809B
AARP EthernetType = 0x80F3
IPX EthernetType = 0x8137
SNMP EthernetType = 0x814C
NET_BIOS EthernetType = 0x8191
XTP EthernetType = 0x817D
IPv6 EthernetType = 0x86DD
PPPoE_DISCOVERY EthernetType = 0x8863
PPPoE_SESSION EthernetType = 0x8864
LOOPBACK EthernetType = 0x9000
)
var EthernetTypeNameMap = map[EthernetType]string{
IPv4: "ipv4",
ARP: "arp",
RARP: "rarp",
VMTP: "vmtp",
APPLE_TALK: "apple-talk",
AARP: "aarp",
IPX: "ipx",
SNMP: "snmp",
NET_BIOS: "net-bios",
XTP: "xtp",
IPv6: "ipv6",
PPPoE_DISCOVERY: "pppoe-discovery",
PPPoE_SESSION: "pppoe-session",
LOOPBACK: "loopback",
}
var EthernetTypeValueMap = map[string]EthernetType{
EthernetTypeNameMap[IPv4]: IPv4,
EthernetTypeNameMap[ARP]: ARP,
EthernetTypeNameMap[RARP]: RARP,
EthernetTypeNameMap[VMTP]: VMTP,
EthernetTypeNameMap[APPLE_TALK]: APPLE_TALK,
EthernetTypeNameMap[AARP]: AARP,
EthernetTypeNameMap[IPX]: IPX,
EthernetTypeNameMap[SNMP]: SNMP,
EthernetTypeNameMap[NET_BIOS]: NET_BIOS,
EthernetTypeNameMap[XTP]: XTP,
EthernetTypeNameMap[IPv6]: IPv6,
EthernetTypeNameMap[PPPoE_DISCOVERY]: PPPoE_DISCOVERY,
EthernetTypeNameMap[PPPoE_SESSION]: PPPoE_SESSION,
EthernetTypeNameMap[LOOPBACK]: LOOPBACK,
}
func (t EthernetType) String() string {
n, ok := EthernetTypeNameMap[t]
if !ok {
return fmt.Sprintf("%d", t)
}
return n
}
|