@@ -2,11 +2,13 @@ package flow
22
33import (
44 "container/list"
5+ "reflect"
56 "time"
67
78 "github.com/sirupsen/logrus"
89
910 "github.com/netobserv/netobserv-ebpf-agent/pkg/ebpf"
11+ "github.com/netobserv/netobserv-ebpf-agent/pkg/utils"
1012)
1113
1214var dlog = logrus .WithField ("component" , "flow/Deduper" )
@@ -93,8 +95,17 @@ func (c *deduperCache) checkDupe(r *Record, justMark, mergeDup bool, fwd *[]*Rec
9395 * fwd = append (* fwd , r )
9496 }
9597 if mergeDup {
96- mergeEntry [r .Interface ] = r .Id .Direction
97- * fEntry .dupList = append (* fEntry .dupList , mergeEntry )
98+ ifName := utils .GetInterfaceName (r .Id .IfIndex )
99+ mergeEntry [ifName ] = r .Id .Direction
100+ if dupEntryNew (* fEntry .dupList , mergeEntry ) {
101+ * fEntry .dupList = append (* fEntry .dupList , mergeEntry )
102+ dlog .Debugf ("merge list entries dump:" )
103+ for _ , entry := range * fEntry .dupList {
104+ for k , v := range entry {
105+ dlog .Debugf ("interface %s dir %d" , k , v )
106+ }
107+ }
108+ }
98109 }
99110 return
100111 }
@@ -111,22 +122,34 @@ func (c *deduperCache) checkDupe(r *Record, justMark, mergeDup bool, fwd *[]*Rec
111122 expiryTime : timeNow ().Add (c .expire ),
112123 }
113124 if mergeDup {
114- mergeEntry [r .Interface ] = r .Id .Direction
125+ ifName := utils .GetInterfaceName (r .Id .IfIndex )
126+ mergeEntry [ifName ] = r .Id .Direction
115127 r .DupList = append (r .DupList , mergeEntry )
116128 e .dupList = & r .DupList
117129 }
118130 c .ifaces [rk ] = c .entries .PushFront (& e )
119131 * fwd = append (* fwd , r )
120132}
121133
134+ func dupEntryNew (dupList []map [string ]uint8 , mergeEntry map [string ]uint8 ) bool {
135+ for _ , entry := range dupList {
136+ if reflect .DeepEqual (entry , mergeEntry ) {
137+ return false
138+ }
139+ }
140+ return true
141+ }
142+
122143func (c * deduperCache ) removeExpired () {
123144 now := timeNow ()
124145 ele := c .entries .Back ()
125146 evicted := 0
126147 for ele != nil && now .After (ele .Value .(* entry ).expiryTime ) {
127148 evicted ++
128149 c .entries .Remove (ele )
129- delete (c .ifaces , * ele .Value .(* entry ).key )
150+ fEntry := ele .Value .(* entry )
151+ fEntry .dupList = nil
152+ delete (c .ifaces , * fEntry .key )
130153 ele = c .entries .Back ()
131154 }
132155 if evicted > 0 {
0 commit comments