@@ -19,14 +19,19 @@ const (
1919
2020const (
2121 // dropNotifyV1Len is the amount of packet data provided in a v0/v1 drop notification.
22- dropNotifyV1Len = 36
22+ dropNotifyV1Len = 36
23+ dropPktmonNotifyV1Len = 57
2324)
2425
2526var dropNotifyLengthFromVersion = map [uint16 ]uint {
2627 DropNotifyVersion0 : dropNotifyV1Len , // retain backwards compatibility for testing.
2728 DropNotifyVersion1 : dropNotifyV1Len ,
2829}
2930
31+ // var PktmonDropNotifyLengthFromVersion = map[uint16]uint{
32+ // DropNotifyVersion0: dropPktmonNotifyV1Len, // retain backwards compatibility for testing.
33+ // }
34+
3035var (
3136 errUnexpectedDropNotifyLength = errors .New ("unexpected DropNotify data length" )
3237 errInvalidDropNotifyVersion = errors .New ("invalid DropNotify version" )
@@ -50,21 +55,41 @@ type DropNotify struct {
5055 Ifindex uint32
5156}
5257
58+ type NetEventDataHeader struct {
59+ Type uint8 // uint8_t type
60+ Version uint16 // uint16_t version
61+ }
62+
63+ type PktmonEvtStreamPacketDescriptor struct {
64+ PacketOriginalLength uint32 // uint32_t packet_original_length
65+ PacketLoggedLength uint32 // uint32_t packet_logged_length
66+ PacketMetadataLength uint32 // uint32_t packet_metadata_length
67+ }
68+
69+ type PktmonEvtStreamMetadata struct {
70+ PktGroupID uint64 // uint64_t pkt_groupid
71+ PktCount uint16 // uint16_t pkt_count
72+ AppearanceCount uint16 // uint16_t appearance_count
73+ DirectionName uint16 // uint16_t direction_name
74+ PacketType uint16 // uint16_t packet_type
75+ ComponentID uint16 // uint16_t component_id
76+ EdgeID uint16 // uint16_t edge_id
77+ FilterID uint16 // uint16_t filter_id
78+ DropReason uint32 // uint32_t drop_reason
79+ DropLocation uint32 // uint32_t drop_location
80+ ProcNum uint16 // uint16_t proc_num
81+ Timestamp uint64 // uint64_t timestamp
82+ }
83+
84+ type PktmonEvtStreamPacketHeader struct {
85+ EventID uint8 // uint8_t eventid
86+ PacketDescriptor PktmonEvtStreamPacketDescriptor // pktmon_evt_stream_packet_descriptor
87+ Metadata PktmonEvtStreamMetadata // pktmon_evt_stream_metadata
88+ }
89+
5390type PktmonDropNotify struct {
54- Type uint8
55- Version uint16
56- SubType uint8
57- Source uint16
58- Hash uint32
59- OrigLen uint32
60- CapLen uint16
61- SrcLabel identity.NumericIdentity
62- DstLabel identity.NumericIdentity
63- DstID uint32
64- Line uint16
65- File uint8
66- ExtError int8
67- Ifindex uint32
91+ VersionHeader NetEventDataHeader // netevent_data_header_t version_header
92+ PktmonHeader PktmonEvtStreamPacketHeader // pktmon_evt_stream_packet_header pktmon_header
6893}
6994
7095// DecodeDropNotify will decode 'data' into the provided DropNotify structure
@@ -73,69 +98,47 @@ func DecodePktmonDrop(data []byte, dn *DropNotify) error {
7398 if err := pdn .decodePktmonDrop (data ); err != nil {
7499 return err
75100 }
76- pdn .Type = 1
77- dn .Type = pdn .Type
78- dn .SubType = pdn .SubType
79- dn .Source = pdn .Source
80- dn .Hash = pdn .Hash
81- dn .OrigLen = pdn .OrigLen
82- dn .CapLen = pdn .CapLen
83- dn .Version = pdn .Version
84- dn .SrcLabel = pdn .SrcLabel
85- dn .DstLabel = pdn .DstLabel
86- dn .DstID = pdn .DstID
87- dn .Line = pdn .Line
88- dn .File = pdn .File
89- dn .ExtError = pdn .ExtError
90- dn .Ifindex = pdn .Ifindex
101+ dn .Type = 1
102+ dn .SubType = uint8 (pdn .PktmonHeader .Metadata .DropReason )
103+ dn .OrigLen = 128
104+ dn .CapLen = 128
105+ dn .Version = pdn .VersionHeader .Version
91106 return nil
92107}
93108
94109func (n * PktmonDropNotify ) decodePktmonDrop (data []byte ) error {
95- if l := len (data ); l < dropNotifyV1Len {
96- return fmt .Errorf ("%w: expected at least %d but got %d" , errUnexpectedDropNotifyLength , dropNotifyV1Len , l )
110+ if l := len (data ); l < dropPktmonNotifyV1Len {
111+ return fmt .Errorf ("%w: expected at least %d but got %d" , errUnexpectedDropNotifyLength , dropPktmonNotifyV1Len , l )
97112 }
98113 version := byteorder .Native .Uint16 (data [2 :4 ])
99114
100115 // Check against max version.
101116 if version > DropNotifyVersion1 {
102- return fmt .Errorf ("%w: Unrecognized pktmon drop event version %d\n Raw data bytes: %v\n Data size: %d\n Type: %d\n Version (bytes 1-2): %v (uint16: %d) \n SubType: %d \n Source (bytes 4-5): %v (uint16: %d) \n Hash (bytes 6-9): %v (uint32: %d) \n OrigLen (bytes 10-13): %v (uint32: %d) \n CapLen (bytes 14-15): %v (uint16: %d) \n SrcLabel (bytes 16-19): %v (uint32: %d) \n DstLabel (bytes 20-23): %v (uint32: %d) \n DstID (bytes 24-27): %v (uint32: %d) \n Line (bytes 28-29): %v (uint16: %d) \n File (byte 30): %d \n ExtError (byte 31): %d \n Ifindex (bytes 32-35): %v (uint32: %d) " ,
117+ return fmt .Errorf ("%w: Unrecognized pktmon drop event version %d\n Raw data bytes: %v\n Data size: %d\n Type: %d\n " ,
103118 errInvalidDropNotifyVersion , version ,
104119 data ,
105- len (data ),
106- data [0 ],
107- data [2 :4 ], version ,
108- data [4 ],
109- data [6 :8 ], byteorder .Native .Uint16 (data [6 :8 ]),
110- data [8 :12 ], byteorder .Native .Uint32 (data [8 :12 ]),
111- data [12 :16 ], byteorder .Native .Uint32 (data [12 :16 ]),
112- data [16 :18 ], byteorder .Native .Uint16 (data [16 :18 ]),
113- data [18 :22 ], byteorder .Native .Uint32 (data [20 :24 ]),
114- data [22 :26 ], byteorder .Native .Uint32 (data [24 :28 ]),
115- data [26 :30 ], byteorder .Native .Uint32 (data [28 :32 ]),
116- data [30 :32 ], byteorder .Native .Uint16 (data [32 :34 ]),
117- data [32 ],
118- int8 (data [33 ]),
119- data [34 :38 ], byteorder .Native .Uint32 (data [34 :38 ]),
120- )
120+ len (data ))
121121 }
122122
123123 // Decode logic for version >= v0/v1.
124- n .Type = data [0 ]
125- n .SubType = data [4 ]
126- n .Source = byteorder .Native .Uint16 (data [6 :8 ])
127- n .Hash = byteorder .Native .Uint32 (data [8 :12 ])
128- n .OrigLen = byteorder .Native .Uint32 (data [12 :16 ])
129- n .CapLen = byteorder .Native .Uint16 (data [16 :18 ])
130- n .Version = version
131- n .SrcLabel = identity .NumericIdentity (byteorder .Native .Uint32 (data [20 :24 ]))
132- n .DstLabel = identity .NumericIdentity (byteorder .Native .Uint32 (data [24 :28 ]))
133- n .DstID = byteorder .Native .Uint32 (data [28 :32 ])
134- n .Line = byteorder .Native .Uint16 (data [32 :34 ])
135- n .File = data [34 ]
136- n .ExtError = int8 (data [35 ])
137- n .Ifindex = byteorder .Native .Uint32 (data [36 :40 ])
138-
124+ n .VersionHeader .Type = data [0 ]
125+ n .VersionHeader .Version = version
126+ n .PktmonHeader .EventID = data [4 ]
127+ n .PktmonHeader .PacketDescriptor .PacketOriginalLength = byteorder .Native .Uint32 (data [6 :10 ])
128+ n .PktmonHeader .PacketDescriptor .PacketLoggedLength = byteorder .Native .Uint32 (data [10 :14 ])
129+ n .PktmonHeader .PacketDescriptor .PacketMetadataLength = byteorder .Native .Uint32 (data [14 :18 ])
130+ n .PktmonHeader .Metadata .PktGroupID = byteorder .Native .Uint64 (data [18 :26 ])
131+ n .PktmonHeader .Metadata .PktCount = byteorder .Native .Uint16 (data [26 :28 ])
132+ n .PktmonHeader .Metadata .AppearanceCount = byteorder .Native .Uint16 (data [28 :30 ])
133+ n .PktmonHeader .Metadata .DirectionName = byteorder .Native .Uint16 (data [30 :32 ])
134+ n .PktmonHeader .Metadata .PacketType = byteorder .Native .Uint16 (data [32 :34 ])
135+ n .PktmonHeader .Metadata .ComponentID = byteorder .Native .Uint16 (data [34 :36 ])
136+ n .PktmonHeader .Metadata .EdgeID = byteorder .Native .Uint16 (data [36 :38 ])
137+ n .PktmonHeader .Metadata .FilterID = byteorder .Native .Uint16 (data [38 :40 ])
138+ n .PktmonHeader .Metadata .DropReason = byteorder .Native .Uint32 (data [40 :44 ])
139+ n .PktmonHeader .Metadata .DropLocation = byteorder .Native .Uint32 (data [44 :48 ])
140+ n .PktmonHeader .Metadata .ProcNum = byteorder .Native .Uint16 (data [48 :50 ])
141+ n .PktmonHeader .Metadata .Timestamp = byteorder .Native .Uint64 (data [50 :58 ])
139142 return nil
140143}
141144
0 commit comments