123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 |
- package layers
- import (
- "encoding/binary"
- "errors"
- "github.com/google/gopacket"
- )
- const ntpMinimumRecordSizeInBytes int = 48
- type NTPLeapIndicator uint8
- type NTPVersion uint8
- type NTPMode uint8
- type NTPStratum uint8
- type NTPLog2Seconds int8
- type NTPFixed16Seconds uint32
- type NTPReferenceID uint32
- type NTPTimestamp uint64
- type NTP struct {
- BaseLayer
- LeapIndicator NTPLeapIndicator
- Version NTPVersion
- Mode NTPMode
- Stratum NTPStratum
- Poll NTPLog2Seconds
- Precision NTPLog2Seconds
- RootDelay NTPFixed16Seconds
- RootDispersion NTPFixed16Seconds
- ReferenceID NTPReferenceID
- ReferenceTimestamp NTPTimestamp
- OriginTimestamp NTPTimestamp
- ReceiveTimestamp NTPTimestamp
- TransmitTimestamp NTPTimestamp
-
- ExtensionBytes []byte
- }
- func (d *NTP) LayerType() gopacket.LayerType {
- return LayerTypeNTP
- }
- func decodeNTP(data []byte, p gopacket.PacketBuilder) error {
-
- d := &NTP{}
- err := d.DecodeFromBytes(data, p)
- if err != nil {
- return err
- }
-
-
- p.AddLayer(d)
- p.SetApplicationLayer(d)
- return nil
- }
- func (d *NTP) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
-
- if len(data) < ntpMinimumRecordSizeInBytes {
- df.SetTruncated()
- return errors.New("NTP packet too short")
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- d.BaseLayer = BaseLayer{Contents: data[:len(data)]}
-
-
-
-
- f := data[0]
- d.LeapIndicator = NTPLeapIndicator((f & 0xC0) >> 6)
- d.Version = NTPVersion((f & 0x38) >> 3)
- d.Mode = NTPMode(f & 0x07)
- d.Stratum = NTPStratum(data[1])
- d.Poll = NTPLog2Seconds(data[2])
- d.Precision = NTPLog2Seconds(data[3])
-
- d.RootDelay = NTPFixed16Seconds(binary.BigEndian.Uint32(data[4:8]))
- d.RootDispersion = NTPFixed16Seconds(binary.BigEndian.Uint32(data[8:12]))
- d.ReferenceID = NTPReferenceID(binary.BigEndian.Uint32(data[12:16]))
- d.ReferenceTimestamp = NTPTimestamp(binary.BigEndian.Uint64(data[16:24]))
- d.OriginTimestamp = NTPTimestamp(binary.BigEndian.Uint64(data[24:32]))
- d.ReceiveTimestamp = NTPTimestamp(binary.BigEndian.Uint64(data[32:40]))
- d.TransmitTimestamp = NTPTimestamp(binary.BigEndian.Uint64(data[40:48]))
-
-
-
- d.ExtensionBytes = data[48:]
-
- return nil
- }
- func (d *NTP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- data, err := b.PrependBytes(ntpMinimumRecordSizeInBytes)
- if err != nil {
- return err
- }
-
- h := uint8(0)
- h |= (uint8(d.LeapIndicator) << 6) & 0xC0
- h |= (uint8(d.Version) << 3) & 0x38
- h |= (uint8(d.Mode)) & 0x07
- data[0] = byte(h)
- data[1] = byte(d.Stratum)
- data[2] = byte(d.Poll)
- data[3] = byte(d.Precision)
-
- binary.BigEndian.PutUint32(data[4:8], uint32(d.RootDelay))
- binary.BigEndian.PutUint32(data[8:12], uint32(d.RootDispersion))
- binary.BigEndian.PutUint32(data[12:16], uint32(d.ReferenceID))
- binary.BigEndian.PutUint64(data[16:24], uint64(d.ReferenceTimestamp))
- binary.BigEndian.PutUint64(data[24:32], uint64(d.OriginTimestamp))
- binary.BigEndian.PutUint64(data[32:40], uint64(d.ReceiveTimestamp))
- binary.BigEndian.PutUint64(data[40:48], uint64(d.TransmitTimestamp))
- ex, err := b.AppendBytes(len(d.ExtensionBytes))
- if err != nil {
- return err
- }
- copy(ex, d.ExtensionBytes)
- return nil
- }
- func (d *NTP) CanDecode() gopacket.LayerClass {
- return LayerTypeNTP
- }
- func (d *NTP) NextLayerType() gopacket.LayerType {
- return gopacket.LayerTypeZero
- }
- func (d *NTP) Payload() []byte {
- return nil
- }
|