Envoy/Downloads/GoNetDev-master/Protocols/Decoder.go

53 lines
1.6 KiB
Go
Raw Normal View History

2023-10-27 16:45:33 +00:00
package Protocols
import (
"encoding/binary"
"github.com/sabouaram/GoNetDev/Protocols/Const_Fields"
"github.com/sabouaram/GoNetDev/Protocols/Utils/GLogger"
)
func Parse(byte_slice []byte) Frame {
logger := GLogger.GetInstance()
EthHeader := NewEthHeader()
IPHeader := NewIpv4Header()
ARPHeader := NewArpHeader()
ICMPHeader := NewICMPHeader()
padding := 0
Tag1q := binary.BigEndian.Uint16(byte_slice[12:14])
logger.Println(Tag1q)
//In case of a Trunk link
if Tag1q == 33024 {
padding = 4
EthHeader.ParseEthernet(byte_slice, true)
} else {
EthHeader.ParseEthernet(byte_slice, false)
}
logger.Printf("=>ETHERNET: SRC_MAC_ADDRESS:%x, DST_MAC_ADDRESS:%x \n", EthHeader.SourceMacAddress, EthHeader.DestMacAddress)
switch binary.BigEndian.Uint16(EthHeader.Type) {
case Const_Fields.Type_IPV4:
{
IPHeader.ParseIPV4(byte_slice[padding+14:])
logger.Printf(" =>IPV4: SRC_IP_ADDRESS:%x, DST_IP_ADDRESS:%x \n", IPHeader.Src_address, IPHeader.Dst_address)
switch uint8(IPHeader.Protocol[0]) {
case Const_Fields.Type_ICMP:
ICMPHeader.ParseICMP(byte_slice[padding+34:])
logger.Println(" =>ICMP")
case Const_Fields.Type_TCP:
logger.Println(" =>TCP")
case Const_Fields.Type_UDP:
logger.Println(" =>UDP")
}
}
case 0x0806:
{
ARPHeader.ParseARP(byte_slice[padding+14:])
logger.Printf(" =>ARP: SRC_MAC_ADDRESS:%x, SRC_IP_ADDRESS:%x , TARGET_MAC_ADDRESS:%x, TARGET_IP_ADDRESS:%x, Operation: %x \n", ARPHeader.SenderMACaddress, ARPHeader.SenderIPaddress, ARPHeader.TargetMACaddress, ARPHeader.TargetIPaddress, ARPHeader.Operation)
}
}
return Frame{EthHeader, ARPHeader, IPHeader, ICMPHeader}
}