// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. // See the docs for gopacket.SerializableLayer for more info. func (eth *VxlanEthernet) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { if len(eth.DstMAC) != 6 { return fmt.Errorf("invalid dst MAC: %v", eth.DstMAC) } if len(eth.SrcMAC) != 6 { return fmt.Errorf("invalid src MAC: %v", eth.SrcMAC) } payload := b.Bytes() bytes, err := b.PrependBytes(14) if err != nil { return err } copy(bytes, eth.DstMAC) copy(bytes[6:], eth.SrcMAC) if eth.Length != 0 || eth.EthernetType == EthernetTypeLLC { if opts.FixLengths { eth.Length = uint16(len(payload)) } if eth.EthernetType != EthernetTypeLLC { return fmt.Errorf("ethernet type %v not compatible with length value %v", eth.EthernetType, eth.Length) } else if eth.Length > 0x0600 { return fmt.Errorf("invalid ethernet length %v", eth.Length) } binary.BigEndian.PutUint16(bytes[12:], eth.Length) } else { binary.BigEndian.PutUint16(bytes[12:], uint16(eth.EthernetType)) } return nil }
// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. // See the docs for gopacket.SerializableLayer for more info. func (i *IPv6Destination) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { var bytes []byte var err error o := make([]*ipv6HeaderTLVOption, 0, len(i.Options)) for _, v := range i.Options { o = append(o, (*ipv6HeaderTLVOption)(v)) } l := serializeIPv6HeaderTLVOptions(nil, o, opts.FixLengths) bytes, err = b.PrependBytes(l) if err != nil { return err } serializeIPv6HeaderTLVOptions(bytes, o, opts.FixLengths) length := len(bytes) + 2 if length%8 != 0 { return fmt.Errorf("IPv6Destination actual length must be multiple of 8") } bytes, err = b.PrependBytes(2) if err != nil { return err } bytes[0] = uint8(i.NextHeader) if opts.FixLengths { i.HeaderLength = uint8((length / 8) - 1) } bytes[1] = uint8(i.HeaderLength) return nil }
// SerializeTo is for gopacket.SerializableLayer. func (sc SCTPData) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { length := 16 + len(sc.PayloadData) bytes, err := b.PrependBytes(roundUpToNearest4(length)) if err != nil { return err } bytes[0] = uint8(sc.Type) flags := uint8(0) if sc.Unordered { flags |= 0x4 } if sc.BeginFragment { flags |= 0x2 } if sc.EndFragment { flags |= 0x1 } bytes[1] = flags binary.BigEndian.PutUint16(bytes[2:4], uint16(length)) binary.BigEndian.PutUint32(bytes[4:8], sc.TSN) binary.BigEndian.PutUint16(bytes[8:10], sc.StreamId) binary.BigEndian.PutUint16(bytes[10:12], sc.StreamSequence) binary.BigEndian.PutUint32(bytes[12:16], sc.PayloadProtocol) copy(bytes[16:], sc.PayloadData) return nil }
// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. // See the docs for gopacket.SerializableLayer for more info. func (arp *ARP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { size := 8 + len(arp.SourceHwAddress) + len(arp.SourceProtAddress) + len(arp.DstHwAddress) + len(arp.DstProtAddress) bytes, err := b.PrependBytes(size) if err != nil { return err } if opts.FixLengths { if len(arp.SourceHwAddress) != len(arp.DstHwAddress) { return fmt.Errorf("mismatched hardware address sizes") } arp.HwAddressSize = uint8(len(arp.SourceHwAddress)) if len(arp.SourceProtAddress) != len(arp.DstProtAddress) { return fmt.Errorf("mismatched prot address sizes") } arp.ProtAddressSize = uint8(len(arp.SourceProtAddress)) } binary.BigEndian.PutUint16(bytes, uint16(arp.AddrType)) binary.BigEndian.PutUint16(bytes[2:], uint16(arp.Protocol)) bytes[4] = arp.HwAddressSize bytes[5] = arp.ProtAddressSize binary.BigEndian.PutUint16(bytes[6:], arp.Operation) start := 8 for _, addr := range [][]byte{ arp.SourceHwAddress, arp.SourceProtAddress, arp.DstHwAddress, arp.DstProtAddress, } { copy(bytes[start:], addr) start += len(addr) } return nil }
// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. // See the docs for gopacket.SerializableLayer for more info. func (u *UDP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { payload := b.Bytes() bytes, err := b.PrependBytes(8) if err != nil { return err } binary.BigEndian.PutUint16(bytes, uint16(u.SrcPort)) binary.BigEndian.PutUint16(bytes[2:], uint16(u.DstPort)) if opts.FixLengths { u.Length = uint16(len(payload)) + 8 } binary.BigEndian.PutUint16(bytes[4:], u.Length) if opts.ComputeChecksums { // zero out checksum bytes bytes[6] = 0 bytes[7] = 0 csum, err := u.computeChecksum(b.Bytes(), IPProtocolUDP) if err != nil { return err } u.Checksum = csum } binary.BigEndian.PutUint16(bytes[6:], u.Checksum) return nil }
// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. // See the docs for gopacket.SerializableLayer for more info. func (i *IPv6Destination) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { optionLength := 0 for _, opt := range i.Options { l, err := opt.serializeTo(b, opts.FixLengths) if err != nil { return err } optionLength += l } bytes, err := b.PrependBytes(2) if err != nil { return err } bytes[0] = uint8(i.NextHeader) if opts.FixLengths { if optionLength <= 0 { return fmt.Errorf("cannot serialize empty IPv6Destination") } length := optionLength + 2 if length%8 != 0 { return fmt.Errorf("IPv6Destination actual length must be multiple of 8 (check TLV alignment)") } i.HeaderLength = uint8((length / 8) - 1) } bytes[1] = i.HeaderLength return nil }
// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. // See the docs for gopacket.SerializableLayer for more info. func (ip6 *IPv6) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { payload := b.Bytes() if ip6.HopByHop != nil { return fmt.Errorf("unable to serialize hopbyhop for now") } bytes, err := b.PrependBytes(40) if err != nil { return err } bytes[0] = (ip6.Version << 4) | (ip6.TrafficClass >> 4) bytes[1] = (ip6.TrafficClass << 4) | uint8(ip6.FlowLabel>>16) binary.BigEndian.PutUint16(bytes[2:], uint16(ip6.FlowLabel)) if opts.FixLengths { ip6.Length = uint16(len(payload)) } binary.BigEndian.PutUint16(bytes[4:], ip6.Length) bytes[6] = byte(ip6.NextHeader) bytes[7] = byte(ip6.HopLimit) if err := ip6.AddressTo16(); err != nil { return err } copy(bytes[8:], ip6.SrcIP) copy(bytes[24:], ip6.DstIP) return nil }
// SerializeTo is for gopacket.SerializableLayer. func (sc SCTPData) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { payload := b.Bytes() // Pad the payload to a 32 bit boundary if rem := len(payload) % 4; rem != 0 { b.AppendBytes(4 - rem) } length := 16 bytes, err := b.PrependBytes(length) if err != nil { return err } bytes[0] = uint8(sc.Type) flags := uint8(0) if sc.Unordered { flags |= 0x4 } if sc.BeginFragment { flags |= 0x2 } if sc.EndFragment { flags |= 0x1 } bytes[1] = flags binary.BigEndian.PutUint16(bytes[2:4], uint16(length+len(payload))) binary.BigEndian.PutUint32(bytes[4:8], sc.TSN) binary.BigEndian.PutUint16(bytes[8:10], sc.StreamId) binary.BigEndian.PutUint16(bytes[10:12], sc.StreamSequence) binary.BigEndian.PutUint32(bytes[12:16], uint32(sc.PayloadProtocol)) return nil }
// SerializeTo is for gopacket.SerializableLayer. func (s SCTPUnknownChunkType) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { bytes, err := b.PrependBytes(s.ActualLength) if err != nil { return err } copy(bytes, s.bytes) return nil }
// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. func (l *Loopback) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { bytes, err := b.PrependBytes(4) if err != nil { return err } binary.LittleEndian.PutUint32(bytes, uint32(l.Family)) return nil }
// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. // See the docs for gopacket.SerializableLayer for more info. func (s *SlowProtocol) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { bytes, err := b.PrependBytes(1) if err != nil { return err } bytes[0] = uint8(s.SubType) return nil }
func (m *MoldUDP64) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) (err error) { defer errs.PassE(&err) bytes, err := b.PrependBytes(20) errs.CheckE(err) copy(bytes[0:10], m.Session[0:10]) binary.BigEndian.PutUint64(bytes[10:18], m.SequenceNumber) binary.BigEndian.PutUint16(bytes[18:20], m.MessageCount) return }
// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. // See the docs for gopacket.SerializableLayer for more info. func (t *TCP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { var optionLength int for _, o := range t.Options { switch o.OptionType { case 0, 1: optionLength += 1 default: optionLength += 2 + len(o.OptionData) } } if opts.FixLengths { if rem := optionLength % 4; rem != 0 { t.Padding = lotsOfZeros[:4-rem] } t.DataOffset = uint8((len(t.Padding) + optionLength + 20) / 4) } bytes, err := b.PrependBytes(20 + optionLength + len(t.Padding)) if err != nil { return err } binary.BigEndian.PutUint16(bytes, uint16(t.SrcPort)) binary.BigEndian.PutUint16(bytes[2:], uint16(t.DstPort)) binary.BigEndian.PutUint32(bytes[4:], t.Seq) binary.BigEndian.PutUint32(bytes[8:], t.Ack) binary.BigEndian.PutUint16(bytes[12:], t.flagsAndOffset()) binary.BigEndian.PutUint16(bytes[14:], t.Window) binary.BigEndian.PutUint16(bytes[18:], t.Urgent) start := 20 for _, o := range t.Options { bytes[start] = byte(o.OptionType) switch o.OptionType { case 0, 1: start++ default: if opts.FixLengths { o.OptionLength = uint8(len(o.OptionData) + 2) } bytes[start+1] = o.OptionLength copy(bytes[start+2:start+len(o.OptionData)+2], o.OptionData) start += int(o.OptionLength) } } copy(bytes[start:], t.Padding) if opts.ComputeChecksums { // zero out checksum bytes in current serialization. bytes[16] = 0 bytes[17] = 0 csum, err := t.computeChecksum(b.Bytes(), IPProtocolTCP) if err != nil { return err } t.Checksum = csum } binary.BigEndian.PutUint16(bytes[16:], t.Checksum) return nil }
// SerializeTo is for gopacket.SerializableLayer. func (sc SCTPEmptyLayer) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { bytes, err := b.PrependBytes(4) if err != nil { return err } bytes[0] = uint8(sc.Type) bytes[1] = sc.Flags binary.BigEndian.PutUint16(bytes[2:4], 4) return nil }
func (m *MoldUDP64MessageBlockChained) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) (err error) { defer errs.PassE(&err) payload := b.Bytes() bytes, err := b.PrependBytes(2) errs.CheckE(err) if opts.FixLengths { m.MessageLength = uint16(len(payload)) } binary.BigEndian.PutUint16(bytes, uint16(m.MessageLength)) return }
func (self Lwapp) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { bytes, err := b.PrependBytes(6) if err != nil { return err } bytes[0] = uint8(self.Flags) bytes[1] = self.FragID binary.BigEndian.PutUint16(bytes[2:], uint16(len(self.Payload))) binary.BigEndian.PutUint16(bytes[4:], self.StatusWLANs) return nil }
// SerializeTo is for gopacket.SerializableLayer. func (sc SCTPShutdown) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { bytes, err := b.PrependBytes(8) if err != nil { return err } bytes[0] = uint8(sc.Type) bytes[1] = sc.Flags binary.BigEndian.PutUint16(bytes[2:4], 8) binary.BigEndian.PutUint32(bytes[4:8], sc.CumulativeTSNAck) return nil }
func (m Dot11MgmtDeauthentication) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { buf, err := b.PrependBytes(2) if err != nil { return err } binary.LittleEndian.PutUint16(buf[0:2], uint16(m.Reason)) return nil }
func (self LwappControl) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { bytes, err := b.PrependBytes(8) if err != nil { return err } bytes[0] = self.MessageType bytes[1] = self.SeqNum binary.BigEndian.PutUint16(bytes[2:], uint16(len(self.Payload))) binary.BigEndian.PutUint32(bytes[4:], self.SessionID) return nil }
// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. func (ip *IPv4) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { optionLength := ip.getIPv4OptionSize() bytes, err := b.PrependBytes(20 + int(optionLength)) if err != nil { return err } if opts.FixLengths { ip.IHL = 5 + (optionLength / 4) ip.Length = uint16(len(b.Bytes())) } bytes[0] = (ip.Version << 4) | ip.IHL bytes[1] = ip.TOS binary.BigEndian.PutUint16(bytes[2:], ip.Length) binary.BigEndian.PutUint16(bytes[4:], ip.Id) binary.BigEndian.PutUint16(bytes[6:], ip.flagsfrags()) bytes[8] = ip.TTL bytes[9] = byte(ip.Protocol) if err := ip.AddressTo4(); err != nil { return err } copy(bytes[12:16], ip.SrcIP) copy(bytes[16:20], ip.DstIP) curLocation := 20 // Now, we will encode the options for _, opt := range ip.Options { switch opt.OptionType { case 0: // this is the end of option lists bytes[curLocation] = 0 curLocation++ case 1: // this is the padding bytes[curLocation] = 1 curLocation++ default: bytes[curLocation] = opt.OptionType bytes[curLocation+1] = opt.OptionLength // sanity checking to protect us from buffer overrun if len(opt.OptionData) > int(opt.OptionLength-2) { return fmt.Errorf("option length is smaller than length of option data") } copy(bytes[curLocation+2:curLocation+int(opt.OptionLength)], opt.OptionData) curLocation += int(opt.OptionLength) } } if opts.ComputeChecksums { ip.Checksum = checksum(bytes) } binary.BigEndian.PutUint16(bytes[10:], ip.Checksum) return nil }
// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. // See the docs for gopacket.SerializableLayer for more info. func (l *BPDUTopology) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { bytes, err := b.PrependBytes(BPDUTopologyLength) if err != nil { fmt.Println("Error in Serialize to for BPDU Topology") return err } binary.BigEndian.PutUint16(bytes[0:], l.ProtocolId) bytes[2] = byte(l.ProtocolVersionId) bytes[3] = byte(l.BPDUType) return nil }
func (m Dot11InformationElement) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { length := len(m.Info) + len(m.OUI) if buf, err := b.PrependBytes(2 + length); err != nil { return err } else { buf[0] = uint8(m.ID) buf[1] = uint8(length) copy(buf[2:], m.OUI) copy(buf[2+len(m.OUI):], m.Info) } return nil }
func (m Dot11MgmtAssociationReq) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { buf, err := b.PrependBytes(4) if err != nil { return err } binary.LittleEndian.PutUint16(buf[0:2], m.CapabilityInfo) binary.LittleEndian.PutUint16(buf[2:4], m.ListenInterval) return nil }
// SerializeTo is for gopacket.SerializableLayer. func (sc SCTPCookieEcho) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { length := 4 + len(sc.Cookie) bytes, err := b.PrependBytes(roundUpToNearest4(length)) if err != nil { return err } bytes[0] = uint8(sc.Type) bytes[1] = sc.Flags binary.BigEndian.PutUint16(bytes[2:4], uint16(length)) copy(bytes[4:], sc.Cookie) return nil }
// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. // See the docs for gopacket.SerializableLayer for more info. func (s *SNAP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { if buf, err := b.PrependBytes(5); err != nil { return err } else { buf[0] = s.OrganizationalCode[0] buf[1] = s.OrganizationalCode[1] buf[2] = s.OrganizationalCode[2] binary.BigEndian.PutUint16(buf[3:5], uint16(s.Type)) } return nil }
func (m Dot11MgmtAuthentication) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { buf, err := b.PrependBytes(6) if err != nil { return err } binary.LittleEndian.PutUint16(buf[0:2], uint16(m.Algorithm)) binary.LittleEndian.PutUint16(buf[2:4], m.Sequence) binary.LittleEndian.PutUint16(buf[4:6], uint16(m.Status)) return nil }
func (m Dot11MgmtBeacon) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { buf, err := b.PrependBytes(12) if err != nil { return err } binary.LittleEndian.PutUint64(buf[0:8], m.Timestamp) binary.LittleEndian.PutUint16(buf[8:10], m.Interval) binary.LittleEndian.PutUint16(buf[10:12], m.Flags) return nil }
func (m Dot11MgmtAssociationResp) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { buf, err := b.PrependBytes(6) if err != nil { return err } binary.LittleEndian.PutUint16(buf[0:2], m.CapabilityInfo) binary.LittleEndian.PutUint16(buf[2:4], uint16(m.Status)) binary.LittleEndian.PutUint16(buf[4:6], m.AID) return nil }
func (h *ipv6HeaderTLVOption) serializeTo(b gopacket.SerializeBuffer, fixLengths bool) (int, error) { if fixLengths { h.OptionLength = uint8(len(h.OptionData)) } length := int(h.OptionLength) + 2 data, err := b.PrependBytes(length) if err != nil { return 0, err } data[0] = h.OptionType data[1] = h.OptionLength copy(data[2:], h.OptionData) return length, nil }
// SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. // See the docs for gopacket.SerializableLayer for more info. func (m *MPLS) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { bytes, err := b.PrependBytes(4) if err != nil { return err } encoded := m.Label << 12 encoded |= uint32(m.TrafficClass) << 9 encoded |= uint32(m.TTL) if m.StackBottom { encoded |= 0x100 } binary.BigEndian.PutUint32(bytes, encoded) return nil }