From d4fc68c86b7bbb7bedae159967d3053fafd9da47 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 19 Mar 2020 18:16:44 +0200 Subject: [PATCH] Added disconnect_method config for diameter agent --- agents/diamagent.go | 32 ++++++++++++++++++++++---------- config/config_defaults.go | 3 ++- config/config_json_test.go | 1 + config/diametercfg.go | 4 ++++ config/libconfig_json.go | 1 + packages/debian/changelog | 1 + 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/agents/diamagent.go b/agents/diamagent.go index e797c05b4..fd510c84c 100644 --- a/agents/diamagent.go +++ b/agents/diamagent.go @@ -441,11 +441,29 @@ func (da *DiameterAgent) V1DisconnectSession(args utils.AttrDisconnectSession, r utils.DiameterAgent, utils.ToJSON(args.EventStart))) return utils.ErrMandatoryIeMissing } - msg, has := engine.Cache.Get(utils.CacheDiameterMessages, ssID.(string)) + originID := ssID.(string) + switch da.cgrCfg.DiameterAgentCfg().DisconnectMethod { + case utils.MetaASR: + return da.sendASR(originID, reply) + case utils.MetaRAR: + return da.V1SendRAR(originID, reply) + default: + return fmt.Errorf("Unsupported request type <%s>", da.cgrCfg.DiameterAgentCfg().DisconnectMethod) + } +} + +// V1GetActiveSessionIDs is part of the sessions.BiRPClient +func (da *DiameterAgent) V1GetActiveSessionIDs(ignParam string, + sessionIDs *[]*sessions.SessionID) error { + return utils.ErrNotImplemented +} + +func (da *DiameterAgent) sendASR(originID string, reply *string) (err error) { + msg, has := engine.Cache.Get(utils.CacheDiameterMessages, originID) if !has { utils.Logger.Warning( fmt.Sprintf("<%s> cannot retrieve message from cache with OriginID: <%s>", - utils.DiameterAgent, ssID)) + utils.DiameterAgent, originID)) return utils.ErrMandatoryIeMissing } dmd := msg.(*diamMsgData) @@ -460,7 +478,7 @@ func (da *DiameterAgent) V1DisconnectSession(args utils.AttrDisconnectSession, r if err = aReq.SetFields(da.cgrCfg.DiameterAgentCfg().Templates[da.cgrCfg.DiameterAgentCfg().ASRTemplate]); err != nil { utils.Logger.Warning( fmt.Sprintf("<%s> cannot disconnect session with OriginID: <%s>, err: %s", - utils.DiameterAgent, ssID, err.Error())) + utils.DiameterAgent, originID, err.Error())) return utils.ErrServerError } m := diam.NewRequest(dmd.m.Header.CommandCode, @@ -469,7 +487,7 @@ func (da *DiameterAgent) V1DisconnectSession(args utils.AttrDisconnectSession, r da.cgrCfg.GeneralCfg().DefaultTimezone); err != nil { utils.Logger.Warning( fmt.Sprintf("<%s> cannot disconnect session with OriginID: <%s>, err: %s", - utils.DiameterAgent, ssID, err.Error())) + utils.DiameterAgent, originID, err.Error())) return utils.ErrServerError } if err = writeOnConn(dmd.c, m); err != nil { @@ -479,12 +497,6 @@ func (da *DiameterAgent) V1DisconnectSession(args utils.AttrDisconnectSession, r return } -// V1GetActiveSessionIDs is part of the sessions.BiRPClient -func (da *DiameterAgent) V1GetActiveSessionIDs(ignParam string, - sessionIDs *[]*sessions.SessionID) error { - return utils.ErrNotImplemented -} - // V1SendRAR sends a rar meseage to diameter client func (da *DiameterAgent) V1SendRAR(originID string, reply *string) (err error) { if originID == "" { diff --git a/config/config_defaults.go b/config/config_defaults.go index 00c502993..b24a5d398 100755 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -415,7 +415,8 @@ const CGRATES_CFG_JSON = ` "concurrent_requests": -1, // limit the number of active requests processed by the server <-1|0-n> "synced_conn_requests": false, // process one request at the time per connection "asr_template": "", // enable AbortSession message being sent to client on DisconnectSession - "rar_template": "", // for building the RAR + "rar_template": "", // template used to build the Re-Auth-Request + "disconnect_method": "*asr", // the request to send to diameter on DisconnectSession <*asr|*rar> "templates":{ // default message templates "*err": [ {"tag": "SessionId", "path": "*rep.Session-Id", "type": "*variable", diff --git a/config/config_json_test.go b/config/config_json_test.go index 73d6c81d6..0896a67cd 100755 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -757,6 +757,7 @@ func TestDiameterAgentJsonCfg(t *testing.T) { Synced_conn_requests: utils.BoolPointer(false), Asr_template: utils.StringPointer(""), Rar_template: utils.StringPointer(""), + Disconnect_method: utils.StringPointer(utils.MetaASR), Templates: map[string][]*FcTemplateJsonCfg{ utils.MetaErr: { { diff --git a/config/diametercfg.go b/config/diametercfg.go index 3c9618b9b..ef1023468 100644 --- a/config/diametercfg.go +++ b/config/diametercfg.go @@ -34,6 +34,7 @@ type DiameterAgentCfg struct { SyncedConnReqs bool ASRTemplate string RARTemplate string + DisconnectMethod string Templates map[string][]*FCTemplate RequestProcessors []*RequestProcessor } @@ -89,6 +90,9 @@ func (da *DiameterAgentCfg) loadFromJsonCfg(jsnCfg *DiameterAgentJsonCfg, separa if jsnCfg.Rar_template != nil { da.RARTemplate = *jsnCfg.Rar_template } + if jsnCfg.Disconnect_method != nil { + da.DisconnectMethod = *jsnCfg.Disconnect_method + } if jsnCfg.Templates != nil { if da.Templates == nil { da.Templates = make(map[string][]*FCTemplate) diff --git a/config/libconfig_json.go b/config/libconfig_json.go index ff25cb225..5f98547a4 100755 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -314,6 +314,7 @@ type DiameterAgentJsonCfg struct { Synced_conn_requests *bool Asr_template *string Rar_template *string + Disconnect_method *string Templates map[string][]*FcTemplateJsonCfg Request_processors *[]*ReqProcessorJsnCfg } diff --git a/packages/debian/changelog b/packages/debian/changelog index 4de391bbc..5e16777c3 100644 --- a/packages/debian/changelog +++ b/packages/debian/changelog @@ -33,6 +33,7 @@ cgrates (0.11.0~dev) UNRELEASED; urgency=medium DataDB/StorDB * [Migrator] Auto discover tenant from key instead of taking it from config * [Templates] Fixed missing "*" for strip and pading strategy + * [DiameterAgent] Added RAR support -- Alexandru Tripon Wed, 19 Feb 2020 13:25:52 +0200