@@ -98,7 +98,8 @@ func (b *ofFlowBuilder) MatchXXReg(regID int, data []byte) FlowBuilder {
9898
9999// matchRegRange adds match condition for matching data in the target register at specified range.
100100func (b * ofFlowBuilder ) matchRegRange (regID int , data uint32 , rng * Range ) FlowBuilder {
101- s := fmt .Sprintf ("reg%d[%d..%d]=0x%x" , regID , rng [0 ], rng [1 ], data )
101+ mask := rng .ToNXRange ().ToUint32Mask ()
102+ s := fmt .Sprintf ("reg%d=0x%x/0x%x" , regID , (data << rng .Offset ())& mask , mask )
102103 b .matchers = append (b .matchers , s )
103104 reg := & ofctrl.NXRegister {
104105 ID : regID ,
@@ -302,31 +303,37 @@ func ctLabelRange(high, low uint64, rng *Range, match *ofctrl.FlowMatch) {
302303 match .CtLabelLo = low
303304 match .CtLabelHiMask = 0xffff_ffff_ffff_ffff
304305 match .CtLabelLoMask = 0xffff_ffff_ffff_ffff
305- if rng [0 ] == rng [1 ] {
306- if rng [0 ] < 64 {
307- match .CtLabelLoMask = 1 << rng [0 ]
308- match .CtLabelHiMask = 0
309- } else {
310- match .CtLabelHiMask = 1 << (rng [0 ] - 64 )
311- match .CtLabelLoMask = 0
312- }
313- } else if rng [0 ] < 64 && rng [1 ] >= 64 {
314- match .CtLabelLoMask <<= rng [0 ]
315- match .CtLabelHiMask >>= 127 - rng [1 ]
316- } else if rng [1 ] < 64 {
306+ if rng [1 ] < 64 {
317307 match .CtLabelLoMask &= 0xffff_ffff_ffff_ffff << rng [0 ]
318308 match .CtLabelLoMask &= 0xffff_ffff_ffff_ffff >> (63 - rng [1 ])
309+ match .CtLabelLo &= match .CtLabelLoMask
310+ match .CtLabelHi = 0
319311 match .CtLabelHiMask = 0
320312 } else if rng [0 ] >= 64 {
321313 match .CtLabelHiMask &= 0xffff_ffff_ffff_ffff << (rng [0 ] - 64 )
322314 match .CtLabelHiMask &= 0xffff_ffff_ffff_ffff >> (127 - rng [1 ])
315+ match .CtLabelHi &= match .CtLabelHiMask
316+ match .CtLabelLo = 0
323317 match .CtLabelLoMask = 0
318+ } else {
319+ match .CtLabelLoMask <<= rng [0 ]
320+ match .CtLabelHiMask >>= 127 - rng [1 ]
321+ match .CtLabelLo &= match .CtLabelLoMask
322+ match .CtLabelHi &= match .CtLabelHiMask
324323 }
325324}
326325
327326func (b * ofFlowBuilder ) MatchCTLabelField (high , low uint64 , field * CtLabel ) FlowBuilder {
328- b .matchers = append (b .matchers , fmt .Sprintf ("ct_label[%d..%d]=0x%x%x" , field .rng [0 ], field .rng [1 ], high , low ))
329327 ctLabelRange (high , low , field .GetRange (), & b .ofFlow .Match )
328+ var matchStr string
329+ if field .rng [1 ] < 64 {
330+ matchStr = fmt .Sprintf ("ct_label=0x%x/0x%x" , b .ofFlow .Match .CtLabelLo , b .ofFlow .Match .CtLabelLoMask )
331+ } else if field .rng [0 ] > 63 {
332+ matchStr = fmt .Sprintf ("ct_label=0x%x%016x/0x%x%016x" , b .ofFlow .Match .CtLabelHi , 0 , b .ofFlow .Match .CtLabelHiMask , 0 )
333+ } else {
334+ matchStr = fmt .Sprintf ("ct_label=0x%x%016x/0x%x%016x" , b .ofFlow .Match .CtLabelHi , b .ofFlow .Match .CtLabelLo , b .ofFlow .Match .CtLabelHiMask , b .ofFlow .Match .CtLabelLoMask )
335+ }
336+ b .matchers = append (b .matchers , matchStr )
330337 return b
331338}
332339
0 commit comments