Try to use gopacket to create an Ethernet packet (ARP, BGP, UDP, TCP) and get the header bytes and length of it.
Try to play with the example as below, try to list all layers and find the payload location then workout the total header length and bytes:
package main
import (
"fmt"
"net"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
)
func main() {
var (
buffer gopacket.SerializeBuffer
options gopacket.SerializeOptions
)
// Create the layers
ethernetLayer := &layers.Ethernet{
SrcMAC: net.HardwareAddr{0xff, 0xaa, 0xfa, 0xaa, 0xff, 0xaa},
DstMAC: net.HardwareAddr{0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd},
EthernetType: layers.EthernetTypeIPv4,
}
ipLayer := &layers.IPv4{
SrcIP: net.IP{192, 168, 1, 3},
DstIP: net.IP{8, 8, 8, 8},
// Version: 4,
// IHL: 5,
Length: 24,
}
tcpLayer := &layers.TCP{
SrcPort: layers.TCPPort(4321),
DstPort: layers.TCPPort(80),
}
fmt.Println(tcpLayer)
payload := []byte{10, 20, 30, 40, 50, 60}
buffer = gopacket.NewSerializeBuffer()
gopacket.SerializeLayers(buffer, options, ethernetLayer, ipLayer, tcpLayer, gopacket.Payload(payload))
outgoingPacket := buffer.Bytes()
packet := gopacket.NewPacket(outgoingPacket, layers.LayerTypeEthernet, gopacket.Default)
for _, layer := range packet.Layers() {
fmt.Println("Packet layer:", layer.LayerType())
}
}
I got the error as below:
Packet layer: Ethernet
Packet layer: IPv4
Packet layer: DecodeFailure
Did I do anything wrong there?
Can anyone give me any idea how can I get the header bytes?