From 1a7f2ae630417fbae508914a54fd9b0b224b9d93 Mon Sep 17 00:00:00 2001 From: TeoV Date: Mon, 17 Dec 2018 04:50:55 -0500 Subject: [PATCH] Update diameter sctp multi homing --- agents/diamagent.go | 23 ++++++++++------------- agents/diamclient.go | 20 ++++++++------------ config/config_defaults.go | 1 - config/config_json_test.go | 9 ++++----- config/diametercfg.go | 30 +++++++++++++----------------- config/libconfig_json.go | 27 +++++++++++++-------------- 6 files changed, 48 insertions(+), 62 deletions(-) diff --git a/agents/diamagent.go b/agents/diamagent.go index 5ee19c5d6..600ac2cb9 100644 --- a/agents/diamagent.go +++ b/agents/diamagent.go @@ -20,8 +20,8 @@ package agents import ( "fmt" + "net" "reflect" - "strconv" "strings" "sync" @@ -33,7 +33,6 @@ import ( "github.com/fiorix/go-diameter/diam" "github.com/fiorix/go-diameter/diam/datatype" "github.com/fiorix/go-diameter/diam/sm" - "github.com/ishidawataru/sctp" ) func NewDiameterAgent(cgrCfg *config.CGRConfig, filterS *engine.FilterS, @@ -87,20 +86,18 @@ func (da *DiameterAgent) handlers() diam.Handler { ProductName: datatype.UTF8String(da.cgrCfg.DiameterAgentCfg().ProductName), FirmwareRevision: datatype.Unsigned32(utils.DIAMETER_FIRMWARE_REVISION), } - if strings.Contains(da.cgrCfg.DiameterAgentCfg().ListenNet, utils.SCTPLow) { - addrs, err := sctp.ResolveSCTPAddr(da.cgrCfg.DiameterAgentCfg().ListenNet, - da.cgrCfg.DiameterAgentCfg().ClientHostAddresses) - if err != nil { - utils.Logger.Err(fmt.Sprintf("<%s> resolving sctp addresses: %v", utils.DiameterAgent, err)) - return nil - } - settings.HostIPAddresses = make([]datatype.Address, len((addrs.IPAddrs))) - for i, addr := range addrs.IPAddrs { - settings.HostIPAddresses[i] = datatype.Address( - utils.ConcatenatedKey(addr.String(), strconv.Itoa(addrs.Port))) + interfaces, _ := net.Interfaces() + for _, inter := range interfaces { + fmt.Println(inter.Name, inter.HardwareAddr) + if addrs, err := inter.Addrs(); err == nil { + for _, iAddr := range addrs { + settings.HostIPAddresses = append(settings.HostIPAddresses, datatype.Address( + strings.Split(iAddr.String(), utils.HDR_VAL_SEP)[0])) // address came in form x.y.z.t/24 + } } } dSM := sm.New(settings) + dSM.HandleFunc("ALL", da.handleMessage) // route all commands to one dispatcher go func() { for err := range dSM.ErrorReports() { diff --git a/agents/diamclient.go b/agents/diamclient.go index a52a59d24..54f8bbd13 100644 --- a/agents/diamclient.go +++ b/agents/diamclient.go @@ -20,7 +20,7 @@ package agents import ( "fmt" - "strconv" + "net" "strings" "time" @@ -29,7 +29,6 @@ import ( "github.com/fiorix/go-diameter/diam/avp" "github.com/fiorix/go-diameter/diam/datatype" "github.com/fiorix/go-diameter/diam/sm" - "github.com/ishidawataru/sctp" ) func NewDiameterClient(addr, originHost, originRealm string, vendorId int, productName string, @@ -41,16 +40,13 @@ func NewDiameterClient(addr, originHost, originRealm string, vendorId int, produ ProductName: datatype.UTF8String(productName), FirmwareRevision: datatype.Unsigned32(firmwareRev), } - if strings.Contains(network, utils.SCTPLow) { - addrs, err := sctp.ResolveSCTPAddr(network, addr) - if err != nil { - utils.Logger.Err(fmt.Sprintf(" resolving sctp addresses: %v", err)) - return nil, err - } - cfg.HostIPAddresses = make([]datatype.Address, len((addrs.IPAddrs))) - for i, addr := range addrs.IPAddrs { - cfg.HostIPAddresses[i] = datatype.Address( - utils.ConcatenatedKey(addr.String(), strconv.Itoa(addrs.Port))) + interfaces, _ := net.Interfaces() + for _, inter := range interfaces { + if addrs, err := inter.Addrs(); err == nil { + for _, iAddr := range addrs { + cfg.HostIPAddresses = append(cfg.HostIPAddresses, datatype.Address( + strings.Split(iAddr.String(), utils.HDR_VAL_SEP)[0])) // address came in form x.y.z.t/24 + } } } dSM := sm.New(cfg) diff --git a/config/config_defaults.go b/config/config_defaults.go index 6cf0b3f6b..963bf69c5 100755 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -363,7 +363,6 @@ const CGRATES_CFG_JSON = ` "diameter_agent": { "enabled": false, // enables the diameter agent: "listen": "127.0.0.1:3868", // address where to listen for diameter requests - "client_host_addressed":"", // in case of sctp used for HostIPAddresses "listen_net": "tcp", // transport type for diameter "dictionaries_path": "/usr/share/cgrates/diameter/dict/", // path towards directory holding additional dictionaries to load "sessions_conns": [ diff --git a/config/config_json_test.go b/config/config_json_test.go index f93935fdd..fee282a08 100755 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -572,11 +572,10 @@ func TestAsteriskAgentJsonCfg(t *testing.T) { func TestDiameterAgentJsonCfg(t *testing.T) { eCfg := &DiameterAgentJsonCfg{ - Enabled: utils.BoolPointer(false), - Listen: utils.StringPointer("127.0.0.1:3868"), - Listen_net: utils.StringPointer("tcp"), - Dictionaries_path: utils.StringPointer("/usr/share/cgrates/diameter/dict/"), - Client_host_addressed: utils.StringPointer(""), + Enabled: utils.BoolPointer(false), + Listen: utils.StringPointer("127.0.0.1:3868"), + Listen_net: utils.StringPointer("tcp"), + Dictionaries_path: utils.StringPointer("/usr/share/cgrates/diameter/dict/"), Sessions_conns: &[]*HaPoolJsonCfg{ { Address: utils.StringPointer(utils.MetaInternal), diff --git a/config/diametercfg.go b/config/diametercfg.go index 194d8b305..be6177cff 100644 --- a/config/diametercfg.go +++ b/config/diametercfg.go @@ -23,20 +23,19 @@ import ( ) type DiameterAgentCfg struct { - Enabled bool // enables the diameter agent: - ListenNet string // sctp or tcp - Listen string // address where to listen for diameter requests - ClientHostAddresses string // addresses used for HostIPAddresses on server side - DictionariesPath string - SessionSConns []*HaPoolConfig // connections towards SMG component - OriginHost string - OriginRealm string - VendorId int - ProductName string - MaxActiveReqs int // limit the maximum number of requests processed - ASRTempalte string - Templates map[string][]*FCTemplate - RequestProcessors []*DARequestProcessor + Enabled bool // enables the diameter agent: + ListenNet string // sctp or tcp + Listen string // address where to listen for diameter requests + DictionariesPath string + SessionSConns []*HaPoolConfig // connections towards SMG component + OriginHost string + OriginRealm string + VendorId int + ProductName string + MaxActiveReqs int // limit the maximum number of requests processed + ASRTempalte string + Templates map[string][]*FCTemplate + RequestProcessors []*DARequestProcessor } func (da *DiameterAgentCfg) loadFromJsonCfg(jsnCfg *DiameterAgentJsonCfg, separator string) (err error) { @@ -49,9 +48,6 @@ func (da *DiameterAgentCfg) loadFromJsonCfg(jsnCfg *DiameterAgentJsonCfg, separa if jsnCfg.Listen != nil { da.Listen = *jsnCfg.Listen } - if jsnCfg.Client_host_addressed != nil { - da.ClientHostAddresses = *jsnCfg.Client_host_addressed - } if jsnCfg.Listen_net != nil { da.ListenNet = *jsnCfg.Listen_net } diff --git a/config/libconfig_json.go b/config/libconfig_json.go index 9a2f6fbcc..899a0cc96 100755 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -327,20 +327,19 @@ type OsipsConnJsonCfg struct { // DiameterAgent configuration type DiameterAgentJsonCfg struct { - Enabled *bool // enables the diameter agent: - Listen *string // address where to listen for diameter requests - Client_host_addressed *string // addresses used for HostIPAddresses on server side - Listen_net *string - Dictionaries_path *string // path towards additional dictionaries - Sessions_conns *[]*HaPoolJsonCfg // Connections towards SessionS - Origin_host *string - Origin_realm *string - Vendor_id *int - Product_name *string - Max_active_requests *int - Asr_template *string - Templates map[string][]*FcTemplateJsonCfg - Request_processors *[]*DARequestProcessorJsnCfg + Enabled *bool // enables the diameter agent: + Listen *string // address where to listen for diameter requests + Listen_net *string + Dictionaries_path *string // path towards additional dictionaries + Sessions_conns *[]*HaPoolJsonCfg // Connections towards SessionS + Origin_host *string + Origin_realm *string + Vendor_id *int + Product_name *string + Max_active_requests *int + Asr_template *string + Templates map[string][]*FcTemplateJsonCfg + Request_processors *[]*DARequestProcessorJsnCfg } // One Diameter request processor configuration