diff --git a/changelog b/changelog
index abcfba703..7b2ce7d44 100644
--- a/changelog
+++ b/changelog
@@ -6,6 +6,8 @@ cgrates (0.10) UNRELEASED; urgency=medium
* [SessionS] Added check for missing CGRevent
* [DiameterAgent] Using String function from diam.Message instead of
ToJSON for request String method
+ * [DiameterAgent] Updated 3gp_vendor dictionary
+ * [Templates] Added new dataconvertor: *ip2hex
[ Voivozeanu Teofil ]
* [AgentRequest] Add support for *group type and correctly overwrite
diff --git a/data/diameter/dict/base/3gpp_vendor.xml b/data/diameter/dict/base/3gpp_vendor.xml
index aed4d457a..8f8c370fc 100644
--- a/data/diameter/dict/base/3gpp_vendor.xml
+++ b/data/diameter/dict/base/3gpp_vendor.xml
@@ -2061,7 +2061,7 @@
-
+
diff --git a/utils/consts.go b/utils/consts.go
index 3ad1ee348..1568fce0b 100755
--- a/utils/consts.go
+++ b/utils/consts.go
@@ -586,6 +586,7 @@ const (
ResourceUsage = "ResourceUsage"
MetaDuration = "*duration"
MetaLibPhoneNumber = "*libphonenumber"
+ MetaIP2Hex = "*ip2hex"
MetaReload = "*reload"
MetaLoad = "*load"
MetaRemove = "*remove"
diff --git a/utils/dataconverter.go b/utils/dataconverter.go
index 5dcac41a3..5543d181b 100644
--- a/utils/dataconverter.go
+++ b/utils/dataconverter.go
@@ -19,7 +19,9 @@ along with this program. If not, see
package utils
import (
+ "encoding/hex"
"fmt"
+ "net"
"strconv"
"strings"
"time"
@@ -71,6 +73,8 @@ func NewDataConverter(params string) (conv DataConverter, err error) {
return NewDivideConverter(params[len(MetaDivide)+1:])
case params == MetaDuration:
return NewDurationConverter("")
+ case params == MetaIP2Hex:
+ return &IP2HexConvertor{}, nil
case strings.HasPrefix(params, MetaLibPhoneNumber):
if len(params) == len(MetaLibPhoneNumber) {
return NewPhoneNumberConverter("")
@@ -273,3 +277,25 @@ func (lc *PhoneNumberConverter) Convert(in interface{}) (out interface{}, err er
}
return phonenumbers.Format(num, lc.Format), nil
}
+
+// HexConvertor will round floats
+type IP2HexConvertor struct{}
+
+func (_ *IP2HexConvertor) Convert(in interface{}) (out interface{}, err error) {
+ var ip net.IP
+ switch val := in.(type) {
+ case string:
+ ip = net.ParseIP(val)
+ case net.IP:
+ ip = val
+ default:
+ src := IfaceAsString(in)
+ ip = net.ParseIP(src)
+ }
+
+ hx := hex.EncodeToString([]byte(ip))
+ if len(hx) < 8 {
+ return hx, nil
+ }
+ return "0x" + string([]byte(hx)[len(hx)-8:]), nil
+}
diff --git a/utils/dataconverter_test.go b/utils/dataconverter_test.go
index f0a8206b9..3ae1542e9 100644
--- a/utils/dataconverter_test.go
+++ b/utils/dataconverter_test.go
@@ -19,6 +19,7 @@ package utils
import (
"math"
+ "net"
"reflect"
"testing"
"time"
@@ -611,3 +612,20 @@ func TestPhoneNumberConverter(t *testing.T) {
t.Errorf("expecting: %+v, received: %+v", "+496502530000", phoneNumberConverted)
}
}
+
+func TestHexConvertor(t *testing.T) {
+ hx := IP2HexConvertor{}
+ val := "127.0.0.1"
+ expected := "0x7f000001"
+ if rpl, err := hx.Convert(val); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(expected, rpl) {
+ t.Errorf("expecting: %+v, received: %+v", expected, rpl)
+ }
+ val2 := net.ParseIP("127.0.0.1")
+ if rpl, err := hx.Convert(val2); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(expected, rpl) {
+ t.Errorf("expecting: %+v, received: %+v", expected, rpl)
+ }
+}