Skip to content

Commit 0b47cd5

Browse files
authored
fix(timestamp): for ipfix, nanoseconds and microseconds are ntp timestamp formats (#404)
1 parent 0b68ea4 commit 0b47cd5

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

producer/proto/producer_nf.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,14 @@ func addrReplaceCheck(dstAddr *[]byte, v []byte, eType *uint32, ipv6 bool) {
263263
}
264264
}
265265

266+
func ConvertNTPEpoch(ntpTime uint64) uint64 {
267+
seconds := ntpTime >> 32
268+
seconds -= 2208988800
269+
270+
fraction := float64(ntpTime&0xffffffff) * 1.0e9 / (1 << 32)
271+
return seconds*1e9 + uint64(fraction)
272+
}
273+
266274
func ConvertNetFlowDataSet(flowMessage *ProtoProducerMessage, version uint16, baseTime uint32, uptime uint32, record []netflow.DataField, mapperNetFlow TemplateMapper, mapperSFlow PacketMapper) error {
267275
var time uint64
268276
baseTimeNs := uint64(baseTime) * 1000000000
@@ -575,12 +583,12 @@ func ConvertNetFlowDataSet(flowMessage *ProtoProducerMessage, version uint16, ba
575583
if err := DecodeUNumber(v, &time); err != nil {
576584
return err
577585
}
578-
flowMessage.TimeFlowStartNs = time * 1000
586+
flowMessage.TimeFlowStartNs = ConvertNTPEpoch(time)
579587
case netflow.IPFIX_FIELD_flowStartNanoseconds:
580588
if err := DecodeUNumber(v, &time); err != nil {
581589
return err
582590
}
583-
flowMessage.TimeFlowStartNs = time
591+
flowMessage.TimeFlowStartNs = ConvertNTPEpoch(time)
584592
case netflow.IPFIX_FIELD_flowEndSeconds:
585593
if err := DecodeUNumber(v, &time); err != nil {
586594
return err
@@ -595,12 +603,12 @@ func ConvertNetFlowDataSet(flowMessage *ProtoProducerMessage, version uint16, ba
595603
if err := DecodeUNumber(v, &time); err != nil {
596604
return err
597605
}
598-
flowMessage.TimeFlowEndNs = time * 1000
606+
flowMessage.TimeFlowEndNs = ConvertNTPEpoch(time)
599607
case netflow.IPFIX_FIELD_flowEndNanoseconds:
600608
if err := DecodeUNumber(v, &time); err != nil {
601609
return err
602610
}
603-
flowMessage.TimeFlowEndNs = time
611+
flowMessage.TimeFlowEndNs = ConvertNTPEpoch(time)
604612
case netflow.IPFIX_FIELD_flowStartDeltaMicroseconds:
605613
if err := DecodeUNumber(v, &time); err != nil {
606614
return err

producer/proto/producer_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,3 +241,8 @@ func TestNetFlowV9Time(t *testing.T) {
241241
assert.Nil(t, err)
242242
assert.Equal(t, uint64(1704067199)*1e9, flowMessage.TimeFlowStartNs)
243243
}
244+
245+
func TestConvertNTPEpoch(t *testing.T) {
246+
e := ConvertNTPEpoch(0xebe50e38c50cc000)
247+
assert.Equal(t, uint64(1748668344769725799), e)
248+
}

0 commit comments

Comments
 (0)