Skip to content

Commit 63e42d2

Browse files
author
shadowy-pycoder
committed
Added Layer interface, deleted some code
1 parent 2e02505 commit 63e42d2

File tree

16 files changed

+207
-127
lines changed

16 files changed

+207
-127
lines changed

layers/arp.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ func (ap *ARPPacket) Parse(data []byte) error {
8282
return nil
8383
}
8484

85+
func (ap *ARPPacket) NextLayer() (string, []byte) {
86+
return "", nil
87+
}
88+
8589
func (ap *ARPPacket) ptype() string {
8690
var proto string
8791
switch ap.ProtocolType {

layers/dns.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,15 @@ package layers
33
// https://en.wikipedia.org/wiki/Domain_Name_System
44
// port 53
55
type DNSMessage struct{}
6+
7+
func (d *DNSMessage) String() string {
8+
return ""
9+
}
10+
11+
func (d *DNSMessage) Parse(data []byte) error {
12+
return nil
13+
}
14+
15+
func (d *DNSMessage) NextLayer() (string, []byte) {
16+
return "", nil
17+
}

layers/ethernet.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ type EthernetFrame struct {
1414
DstMAC net.HardwareAddr // MAC address of the destination device.
1515
SrcMAC net.HardwareAddr // MAC address of the source device.
1616
EtherType uint16 // The protocol of the upper layer.
17-
Payload []byte
17+
payload []byte
1818
}
1919

2020
func (ef *EthernetFrame) String() string {
21+
ethType, _ := ef.NextLayer()
2122
return fmt.Sprintf(`Ethernet Frame:
2223
- DstMAC: %s
2324
- SrcMAC: %s
@@ -26,11 +27,11 @@ func (ef *EthernetFrame) String() string {
2627
%s`,
2728
ef.DstMAC,
2829
ef.SrcMAC,
29-
ef.NextLayer(),
30+
ethType,
3031
ef.EtherType,
31-
len(ef.Payload),
32-
ef.Payload,
33-
hex.Dump(ef.Payload))
32+
len(ef.payload),
33+
ef.payload,
34+
hex.Dump(ef.payload))
3435
}
3536

3637
// Parse parses the given byte data into an Ethernet frame.
@@ -41,22 +42,22 @@ func (ef *EthernetFrame) Parse(data []byte) error {
4142
ef.DstMAC = net.HardwareAddr(data[0:6])
4243
ef.SrcMAC = net.HardwareAddr(data[6:12])
4344
ef.EtherType = binary.BigEndian.Uint16(data[12:14])
44-
ef.Payload = data[ethernetHeaderSize:]
45+
ef.payload = data[ethernetHeaderSize:]
4546
return nil
4647
}
4748

48-
// NextLayer returns the name of the next layer protocol based on the EtherType field of the EthernetFrame.
49-
func (ef *EthernetFrame) NextLayer() string {
50-
var ets string
49+
// NextLayer returns the name and payload of the next layer protocol based on the EtherType field of the EthernetFrame.
50+
func (ef *EthernetFrame) NextLayer() (string, []byte) {
51+
var layer string
5152
switch ef.EtherType {
5253
case 0x0800:
53-
ets = "IPv4"
54+
layer = "IPv4"
5455
case 0x0806:
55-
ets = "ARP"
56+
layer = "ARP"
5657
case 0x86dd:
57-
ets = "IPv6"
58+
layer = "IPv6"
5859
default:
59-
ets = "Unknown"
60+
layer = ""
6061
}
61-
return ets
62+
return layer, ef.payload
6263
}

layers/ftp.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,15 @@ package layers
33
// https://mavlink.io/zh/services/ftp.html
44
// port 21 port 20
55
type FTPMessage struct{}
6+
7+
func (f *FTPMessage) String() string {
8+
return ""
9+
}
10+
11+
func (f *FTPMessage) Parse(data []byte) error {
12+
return nil
13+
}
14+
15+
func (f *FTPMessage) NextLayer() (string, []byte) {
16+
return "", nil
17+
}

layers/http.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,15 @@ package layers
33
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages
44
// port 80
55
type HTTPMessage struct{}
6+
7+
func (h *HTTPMessage) String() string {
8+
return ""
9+
}
10+
11+
func (h *HTTPMessage) Parse(data []byte) error {
12+
return nil
13+
}
14+
15+
func (h *HTTPMessage) NextLayer() (string, []byte) {
16+
return "", nil
17+
}

layers/icmp.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ func (i *ICMPSegment) Parse(data []byte) error {
5858
}
5959
return nil
6060
}
61+
func (i *ICMPSegment) NextLayer() (string, []byte) {
62+
return "", nil
63+
}
6164

6265
func (i *ICMPSegment) typecode() (string, string) {
6366
// https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol

layers/icmpv6.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ func (i *ICMPv6Segment) Parse(data []byte) error {
6161
return nil
6262
}
6363

64+
func (i *ICMPv6Segment) NextLayer() (string, []byte) {
65+
return "", nil
66+
}
67+
6468
func (i *ICMPv6Segment) typecode() (string, string) {
6569
// https://en.wikipedia.org/wiki/ICMPv6
6670
var mtype, code string

layers/ipv4.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ type IPv4Packet struct {
2424
SrcIP netip.Addr // IPv4 address of the sender of the packet.
2525
DstIP netip.Addr // IPv4 address of the receiver of the packet.
2626
Options []byte // if ihl > 5
27-
Payload []byte
27+
payload []byte
2828
}
2929

3030
func (p *IPv4Packet) String() string {
31+
proto, _ := p.NextLayer()
3132
return fmt.Sprintf(`IPv4 Packet:
3233
- Version: %d
3334
- IHL: %d
@@ -55,14 +56,14 @@ func (p *IPv4Packet) String() string {
5556
p.flags(),
5657
p.FragmentOffset,
5758
p.TTL,
58-
p.NextLayer(),
59+
proto,
5960
p.Protocol,
6061
p.HeaderChecksum,
6162
p.SrcIP,
6263
p.DstIP,
6364
p.Options,
64-
len(p.Payload),
65-
p.Payload)
65+
len(p.payload),
66+
p.payload)
6667
}
6768

6869
// Parse parses the given byte data into an IPv4 packet struct.
@@ -89,27 +90,27 @@ func (p *IPv4Packet) Parse(data []byte) error {
8990
if p.IHL > 5 {
9091
offset := headerSizeIPv4 + ((p.IHL - 5) << 2)
9192
p.Options = data[headerSizeIPv4:offset]
92-
p.Payload = data[offset:]
93+
p.payload = data[offset:]
9394
} else {
94-
p.Payload = data[headerSizeIPv4:]
95+
p.payload = data[headerSizeIPv4:]
9596
}
9697
return nil
9798
}
9899

99-
func (p *IPv4Packet) NextLayer() string {
100+
func (p *IPv4Packet) NextLayer() (string, []byte) {
100101
// https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
101-
var proto string
102+
var layer string
102103
switch p.Protocol {
103104
case 1:
104-
proto = "ICMP"
105+
layer = "ICMP"
105106
case 6:
106-
proto = "TCP"
107+
layer = "TCP"
107108
case 17:
108-
proto = "UDP"
109+
layer = "UDP"
109110
default:
110-
proto = "Unknown"
111+
layer = ""
111112
}
112-
return proto
113+
return layer, p.payload
113114
}
114115

115116
func (p *IPv4Packet) dscp() string {

layers/ipv6.go

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ type IPv6Packet struct {
2222
HopLimit uint8
2323
SrcIP netip.Addr // The unicast IPv6 address of the sending node.
2424
DstIP netip.Addr // The IPv6 unicast or multicast address of the destination node(s).
25-
Payload []byte
25+
payload []byte
2626
}
2727

2828
func (p *IPv6Packet) String() string {
29+
proto, _ := p.NextLayer()
2930
return fmt.Sprintf(`IPv6 Packet:
3031
- Version: %d
3132
- Traffic Class: %s
@@ -39,13 +40,13 @@ func (p *IPv6Packet) String() string {
3940
p.Version,
4041
p.trafficClass(),
4142
p.PayloadLength,
42-
p.NextLayer(),
43+
proto,
4344
p.NextHeader,
4445
p.HopLimit,
4546
p.SrcIP,
4647
p.DstIP,
47-
len(p.Payload),
48-
p.Payload,
48+
len(p.payload),
49+
p.payload,
4950
)
5051
}
5152

@@ -63,45 +64,45 @@ func (p *IPv6Packet) Parse(data []byte) error {
6364
p.HopLimit = data[7]
6465
p.SrcIP, _ = netip.AddrFromSlice(data[8:24])
6566
p.DstIP, _ = netip.AddrFromSlice(data[24:headerSizeIPv6])
66-
p.Payload = data[headerSizeIPv6:]
67+
p.payload = data[headerSizeIPv6:]
6768
return nil
6869
}
6970

70-
// NextLayer returns the type of the next header.
71-
func (p *IPv6Packet) NextLayer() string {
71+
// NextLayer returns the type of the next header and payload.
72+
func (p *IPv6Packet) NextLayer() (string, []byte) {
7273
// https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
73-
var proto string
74+
var layer string
7475
switch p.NextHeader {
7576
case 0:
76-
proto = "HOPOPT"
77+
layer = "HOPOPT"
7778
case 6:
78-
proto = "TCP"
79+
layer = "TCP"
7980
case 17:
80-
proto = "UDP"
81+
layer = "UDP"
8182
case 43:
82-
proto = "Route"
83+
layer = "Route"
8384
case 44:
84-
proto = "Fragment"
85+
layer = "Fragment"
8586
case 50:
86-
proto = "Encapsulating Security Payload"
87+
layer = "Encapsulating Security payload"
8788
case 51:
88-
proto = "Authentication Header"
89+
layer = "Authentication Header"
8990
case 58:
90-
proto = "ICMPv6"
91+
layer = "ICMPv6"
9192
case 59:
92-
proto = "NoNxt"
93+
layer = "NoNxt"
9394
case 60:
94-
proto = "Opts"
95+
layer = "Opts"
9596
case 135:
96-
proto = "Mobility"
97+
layer = "Mobility"
9798
case 139:
98-
proto = "Host Identity Protocol"
99+
layer = "Host Identity Protocol"
99100
case 140:
100-
proto = "Shim6 Protocol"
101+
layer = "Shim6 Protocol"
101102
default:
102-
proto = "Unknown"
103+
layer = ""
103104
}
104-
return proto
105+
return layer, p.payload
105106
}
106107

107108
func (p *IPv6Packet) trafficClass() string {

layers/layers.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package layers
2+
3+
import "fmt"
4+
5+
var LayerMap = map[string]Layer{
6+
"ETH": &EthernetFrame{},
7+
"IPv4": &IPv4Packet{},
8+
"IPv6": &IPv6Packet{},
9+
"ARP": &ARPPacket{},
10+
"TCP": &TCPSegment{},
11+
"UDP": &UDPSegment{},
12+
"ICMP": &ICMPSegment{},
13+
"ICMPv6": &ICMPv6Segment{},
14+
"DNS": &DNSMessage{},
15+
"FTP": &DNSMessage{},
16+
"HTTP": &HTTPMessage{},
17+
"SNMP": &SNMPMessage{},
18+
"SSH": &SSHMessage{},
19+
"TLS": &TLSMessage{},
20+
}
21+
22+
type Layer interface {
23+
fmt.Stringer
24+
Parse(data []byte) error
25+
NextLayer() (name string, payload []byte)
26+
}
27+
28+
func nextAppLayer(src, dst uint16) string {
29+
var layer string
30+
switch {
31+
case src == 20 || dst == 20 || src == 21 || dst == 21:
32+
layer = "FTP"
33+
case src == 22 || dst == 22:
34+
layer = "SSH"
35+
case src == 53 || dst == 53:
36+
layer = "DNS"
37+
case src == 80 || dst == 80:
38+
layer = "HTTP"
39+
case src == 161 || dst == 161 || src == 162 || dst == 162:
40+
layer = "SNMP"
41+
case src == 443 || dst == 443:
42+
layer = "TLS"
43+
default:
44+
layer = ""
45+
}
46+
return layer
47+
}

0 commit comments

Comments
 (0)