diff --git a/agents/dmtagent.go b/agents/dmtagent.go index bce2fa6db..7c78d79bd 100644 --- a/agents/dmtagent.go +++ b/agents/dmtagent.go @@ -69,7 +69,7 @@ func (self *DiameterAgent) handlers() diam.Handler { return dSM } -func (self DiameterAgent) processCCR(ccr *CCR, reqProcessor *config.DARequestProcessor, cca *CCA) (bool, error) { +func (self DiameterAgent) processCCR(ccr *CCR, reqProcessor *config.DARequestProcessor, processorVars map[string]string, cca *CCA) (bool, error) { passesAllFilters := true for _, fldFilter := range reqProcessor.RequestFilter { if passes, _ := passesFieldFilter(ccr.diamMessage, fldFilter, nil); !passes { @@ -122,7 +122,6 @@ func (self DiameterAgent) processCCR(ccr *CCR, reqProcessor *config.DARequestPro } } var maxUsage float64 - processorVars := make(map[string]string) processorVars[CGRResultCode] = strconv.Itoa(diam.Success) processorVars[CGRError] = "" if reqProcessor.DryRun { // DryRun does not send over network @@ -166,6 +165,15 @@ func (self DiameterAgent) processCCR(ccr *CCR, reqProcessor *config.DARequestPro processorVars[CGRResultCode] = strconv.Itoa(DiameterRatingFailed) } } + if maxUsage < 0 { + maxUsage = 0 + } + if prevMaxUsageStr, hasKey := processorVars[CGRMaxUsage]; hasKey { + prevMaxUsage, _ := strconv.ParseFloat(prevMaxUsageStr, 64) + if prevMaxUsage < maxUsage { + maxUsage = prevMaxUsage + } + } processorVars[CGRMaxUsage] = strconv.FormatFloat(maxUsage, 'f', -1, 64) } if err := messageSetAVPsWithPath(cca.diamMessage, []interface{}{"Result-Code"}, processorVars[CGRResultCode], @@ -191,8 +199,9 @@ func (self *DiameterAgent) handleCCR(c diam.Conn, m *diam.Message) { } cca := NewBareCCAFromCCR(ccr, self.cgrCfg.DiameterAgentCfg().OriginHost, self.cgrCfg.DiameterAgentCfg().OriginRealm) var processed, lclProcessed bool + processorVars := make(map[string]string) // Shared between processors for _, reqProcessor := range self.cgrCfg.DiameterAgentCfg().RequestProcessors { - lclProcessed, err = self.processCCR(ccr, reqProcessor, cca) + lclProcessed, err = self.processCCR(ccr, reqProcessor, processorVars, cca) if lclProcessed { // Process local so we don't overwrite globally processed = lclProcessed } diff --git a/agents/dmtagent_it_test.go b/agents/dmtagent_it_test.go index 9826d75f1..b91891107 100644 --- a/agents/dmtagent_it_test.go +++ b/agents/dmtagent_it_test.go @@ -626,7 +626,7 @@ func TestDmtAgentSendCCRSimpaEvent(t *testing.T) { }), diam.NewAVP(29000, avp.Mbit, 2011, &diam.GroupedAVP{ // MC-Information AVP: []*diam.AVP{ - diam.NewAVP(29938, avp.Mbit, 2011, datatype.OctetString("0x38924012914528")), // HighLayerCharacteristics + diam.NewAVP(20938, avp.Mbit, 2011, datatype.OctetString("0x38924012914528")), // HighLayerCharacteristics diam.NewAVP(29002, avp.Mbit, 2011, datatype.UTF8String("12928471313847173")), // MC-Service-Id diam.NewAVP(29003, avp.Mbit, 2011, datatype.UTF8String("SPV123456012123")), // TransparentData diam.NewAVP(1201, avp.Mbit, 10415, &diam.GroupedAVP{ // MC-Information @@ -641,7 +641,7 @@ func TestDmtAgentSendCCRSimpaEvent(t *testing.T) { if err := dmtClient.SendMessage(ccr); err != nil { t.Error(err) } - time.Sleep(time.Duration(100) * time.Millisecond) + time.Sleep(time.Duration(*waitRater) * time.Millisecond) msg := dmtClient.ReceivedMessage() // Discard the received message so we can test next one if msg == nil { t.Fatal("No message returned")