Update diameter sctp multi homing

This commit is contained in:
TeoV
2018-12-17 04:50:55 -05:00
committed by Dan Christian Bogos
parent d0d09240da
commit 1a7f2ae630
6 changed files with 48 additions and 62 deletions

View File

@@ -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() {

View File

@@ -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)

View File

@@ -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": [

View File

@@ -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),

View File

@@ -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
}

View File

@@ -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