From 7bcd168a01b70b5f60f3ad19eb08e89496639e6f Mon Sep 17 00:00:00 2001 From: DanB Date: Fri, 27 Nov 2015 17:34:41 +0100 Subject: [PATCH] Diameter processCCR with remote SMG queries --- agents/dmtagent.go | 54 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/agents/dmtagent.go b/agents/dmtagent.go index 2f5c54cfc..73d68b394 100644 --- a/agents/dmtagent.go +++ b/agents/dmtagent.go @@ -65,7 +65,10 @@ func (self *DiameterAgent) handlers() diam.Handler { return dSM } -func (self *DiameterAgent) processCCR(ccr *CCR) (*CCA, error) { +/* + case 1: // Initial credit control + self.smg.Call("SMGenericV1.SessionStart",ev sessionmanager.SMGenericEvent, maxUsage *float64)") + } cca := NewCCAFromCCR(ccr) cca.OriginHost = self.cgrCfg.DiameterAgentCfg().OriginHost cca.OriginRealm = self.cgrCfg.DiameterAgentCfg().OriginRealm @@ -73,6 +76,39 @@ func (self *DiameterAgent) processCCR(ccr *CCR) (*CCA, error) { cca.ResultCode = diam.Success return cca, nil } +*/ + +func (self DiameterAgent) processCCR(ccr *CCR, reqProcessor *config.DARequestProcessor) (*CCA, error) { + passesAllFilters := true + for _, fldFilter := range reqProcessor.RequestFilter { + if !ccr.passesFieldFilter(fldFilter) { + passesAllFilters = false + } + } + if !passesAllFilters { // Not going with this processor further + return nil, nil + } + smgEv, err := ccr.AsSMGenericEvent(reqProcessor.ContentFields) + if err != nil { + return nil, err + } + var maxUsage float64 + switch ccr.CCRequestType { + case 1: + err = self.smg.Call("SMGenericV1.SessionStart", smgEv, &maxUsage) + case 2: + err = self.smg.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage) + case 3: + var rpl string + err = self.smg.Call("SMGenericV1.SessionEnd", smgEv, &rpl) + } + cca := NewCCAFromCCR(ccr) + cca.OriginHost = self.cgrCfg.DiameterAgentCfg().OriginHost + cca.OriginRealm = self.cgrCfg.DiameterAgentCfg().OriginRealm + cca.GrantedServiceUnit.CCTime = int(maxUsage) + cca.ResultCode = diam.Success + return cca, nil +} func (self *DiameterAgent) handleCCR(c diam.Conn, m *diam.Message) { ccr, err := NewCCRFromDiameterMessage(m) @@ -82,22 +118,14 @@ func (self *DiameterAgent) handleCCR(c diam.Conn, m *diam.Message) { } var cca *CCA // For now we simply overload in loop, maybe we will find some other use of this for _, reqProcessor := range self.cgrCfg.DiameterAgentCfg().RequestProcessors { - passesAllFilters := true - for _, fldFilter := range reqProcessor.RequestFilter { - if !ccr.passesFieldFilter(fldFilter) { - passesAllFilters = false - } + if cca, err = self.processCCR(ccr, reqProcessor); err != nil { + utils.Logger.Err(fmt.Sprintf(" Error processing CCR %+v, processor id: %s, error: %s", ccr, reqProcessor.Id, err.Error())) } - if !passesAllFilters { // Not going with this processor further - continue - } - cca, err = self.processCCR(ccr) - if !reqProcessor.ContinueOnSuccess { + if cca != nil && !reqProcessor.ContinueOnSuccess { break } } - if err != nil { - utils.Logger.Err(fmt.Sprintf(" Failed to generate CCA, error: %s", err.Error())) + if err != nil { //ToDo: return standard diameter error return } else if cca == nil { utils.Logger.Err(fmt.Sprintf(" No request processor enabled for CCR: %+v, ignoring request", ccr))