// decodeDNS decodes the byte slice into a DNS type. It also // setups the application Layer in PacketBuilder. func decodeDNS(data []byte, p gopacket.PacketBuilder) error { d := &DNS{} err := d.DecodeFromBytes(data, p) if err != nil { return err } p.AddLayer(d) p.SetApplicationLayer(d) return nil }
func decodeSCTPData(data []byte, p gopacket.PacketBuilder) error { sc := &SCTPData{ SCTPChunk: decodeSCTPChunk(data), Unordered: data[1]&0x4 != 0, BeginFragment: data[1]&0x2 != 0, EndFragment: data[1]&0x1 != 0, TSN: binary.BigEndian.Uint32(data[4:8]), StreamId: binary.BigEndian.Uint16(data[8:10]), StreamSequence: binary.BigEndian.Uint16(data[10:12]), PayloadProtocol: binary.BigEndian.Uint32(data[12:16]), } // Length is the length in bytes of the data, INCLUDING the 16-byte header. sc.PayloadData = data[16:sc.Length] p.AddLayer(sc) p.SetApplicationLayer(sc) return p.NextDecoder(gopacket.DecodeFunc(decodeWithSCTPChunkTypePrefix)) }
// decodeEthernetCTPFromFunctionType reads in the first 2 bytes to determine the EthernetCTP // layer type to decode next, then decodes based on that. func decodeEthernetCTPFromFunctionType(data []byte, p gopacket.PacketBuilder) error { function := EthernetCTPFunction(binary.LittleEndian.Uint16(data[:2])) switch function { case EthernetCTPFunctionReply: reply := &EthernetCTPReply{ Function: function, ReceiptNumber: binary.LittleEndian.Uint16(data[2:4]), Data: data[4:], BaseLayer: BaseLayer{data, nil}, } p.AddLayer(reply) p.SetApplicationLayer(reply) return nil case EthernetCTPFunctionForwardData: forward := &EthernetCTPForwardData{ Function: function, ForwardAddress: data[2:8], BaseLayer: BaseLayer{data[:8], data[8:]}, } p.AddLayer(forward) return p.NextDecoder(gopacket.DecodeFunc(decodeEthernetCTPFromFunctionType)) } return fmt.Errorf("Unknown EthernetCTP function type %v", function) }