mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-23 08:08:45 +05:00
Update diameter sctp multi homing
This commit is contained in:
committed by
Dan Christian Bogos
parent
d0d09240da
commit
1a7f2ae630
@@ -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() {
|
||||
|
||||
@@ -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("<DiameterClient> 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)
|
||||
|
||||
@@ -363,7 +363,6 @@ const CGRATES_CFG_JSON = `
|
||||
"diameter_agent": {
|
||||
"enabled": false, // enables the diameter agent: <true|false>
|
||||
"listen": "127.0.0.1:3868", // address where to listen for diameter requests <x.y.z.y/x1.y1.z1.y1:1234>
|
||||
"client_host_addressed":"", // in case of sctp used for HostIPAddresses <x.y.z.y/x1.y1.z1.y1:1234>
|
||||
"listen_net": "tcp", // transport type for diameter <tcp|sctp>
|
||||
"dictionaries_path": "/usr/share/cgrates/diameter/dict/", // path towards directory holding additional dictionaries to load
|
||||
"sessions_conns": [
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -23,20 +23,19 @@ import (
|
||||
)
|
||||
|
||||
type DiameterAgentCfg struct {
|
||||
Enabled bool // enables the diameter agent: <true|false>
|
||||
ListenNet string // sctp or tcp
|
||||
Listen string // address where to listen for diameter requests <x.y.z.y:1234>
|
||||
ClientHostAddresses string // addresses used for HostIPAddresses on server side <x.y.z.y/x1.y1.z1.y1:1234>
|
||||
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: <true|false>
|
||||
ListenNet string // sctp or tcp
|
||||
Listen string // address where to listen for diameter requests <x.y.z.y:1234>
|
||||
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
|
||||
}
|
||||
|
||||
@@ -327,20 +327,19 @@ type OsipsConnJsonCfg struct {
|
||||
|
||||
// DiameterAgent configuration
|
||||
type DiameterAgentJsonCfg struct {
|
||||
Enabled *bool // enables the diameter agent: <true|false>
|
||||
Listen *string // address where to listen for diameter requests <x.y.z.y:1234>
|
||||
Client_host_addressed *string // addresses used for HostIPAddresses on server side <x.y.z.y/x1.y1.z1.y1:1234>
|
||||
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: <true|false>
|
||||
Listen *string // address where to listen for diameter requests <x.y.z.y:1234>
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user