Diameter processCCR with remote SMG queries

This commit is contained in:
DanB
2015-11-27 17:34:41 +01:00
parent 6e0cb79349
commit 7bcd168a01

View File

@@ -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("<DiameterAgent> 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("<DiameterAgent> 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("<DiameterAgent> No request processor enabled for CCR: %+v, ignoring request", ccr))