forked from acouzens/open5gs
[ALL] Removing trailing whitespace and tab
This commit is contained in:
parent
5295c108ad
commit
1d17e68c56
|
@ -20,17 +20,17 @@ set -e
|
||||||
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
configure)
|
configure)
|
||||||
# create a open5gs group and user
|
# create a open5gs group and user
|
||||||
if ! getent passwd open5gs >/dev/null; then
|
if ! getent passwd open5gs >/dev/null; then
|
||||||
adduser --system --disabled-password --disabled-login \
|
adduser --system --disabled-password --disabled-login \
|
||||||
--home /var/run/open5gs --no-create-home \
|
--home /var/run/open5gs --no-create-home \
|
||||||
--quiet --group open5gs
|
--quiet --group open5gs
|
||||||
fi
|
fi
|
||||||
for dir in /var/log/open5gs; do
|
for dir in /var/log/open5gs; do
|
||||||
if ! dpkg-statoverride --list "$dir" >/dev/null 2>&1; then
|
if ! dpkg-statoverride --list "$dir" >/dev/null 2>&1; then
|
||||||
dpkg-statoverride --update --add open5gs open5gs 0755 "$dir"
|
dpkg-statoverride --update --add open5gs open5gs 0755 "$dir"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
;;
|
;;
|
||||||
|
|
||||||
abort-upgrade|abort-remove|abort-deconfigure)
|
abort-upgrade|abort-remove|abort-deconfigure)
|
||||||
|
|
|
@ -20,20 +20,20 @@ set -e
|
||||||
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
configure)
|
configure)
|
||||||
if test "x`sysctl -n net.ipv6.conf.all.disable_ipv6`" = x1; then
|
if test "x`sysctl -n net.ipv6.conf.all.disable_ipv6`" = x1; then
|
||||||
echo "net.ipv6.conf.all.disable_ipv6=0" > /etc/sysctl.d/30-open5gs.conf
|
echo "net.ipv6.conf.all.disable_ipv6=0" > /etc/sysctl.d/30-open5gs.conf
|
||||||
sysctl -p /etc/sysctl.d/30-open5gs.conf
|
sysctl -p /etc/sysctl.d/30-open5gs.conf
|
||||||
fi
|
fi
|
||||||
if test "x`systemctl is-enabled systemd-networkd`" = xdisabled; then
|
if test "x`systemctl is-enabled systemd-networkd`" = xdisabled; then
|
||||||
systemctl enable systemd-networkd
|
systemctl enable systemd-networkd
|
||||||
fi
|
fi
|
||||||
if test -d "/run/systemd"; then
|
if test -d "/run/systemd"; then
|
||||||
deb-systemd-invoke restart systemd-networkd
|
deb-systemd-invoke restart systemd-networkd
|
||||||
fi
|
fi
|
||||||
if test -f /etc/sysctl.d/30-open5gs.conf && grep "ogstun" /proc/net/dev > /dev/null; then
|
if test -f /etc/sysctl.d/30-open5gs.conf && grep "ogstun" /proc/net/dev > /dev/null; then
|
||||||
echo "net.ipv6.conf.ogstun.disable_ipv6=0" > /etc/sysctl.d/30-open5gs.conf
|
echo "net.ipv6.conf.ogstun.disable_ipv6=0" > /etc/sysctl.d/30-open5gs.conf
|
||||||
sysctl -p /etc/sysctl.d/30-open5gs.conf
|
sysctl -p /etc/sysctl.d/30-open5gs.conf
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
abort-upgrade|abort-remove|abort-deconfigure)
|
abort-upgrade|abort-remove|abort-deconfigure)
|
||||||
|
|
|
@ -24,7 +24,7 @@ case "$1" in
|
||||||
if grep "ogstun" /proc/net/dev > /dev/null; then
|
if grep "ogstun" /proc/net/dev > /dev/null; then
|
||||||
ip tuntap del name ogstun mode tun
|
ip tuntap del name ogstun mode tun
|
||||||
fi
|
fi
|
||||||
rm -f /etc/sysctl.d/30-open5gs.conf
|
rm -f /etc/sysctl.d/30-open5gs.conf
|
||||||
;;
|
;;
|
||||||
|
|
||||||
remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
|
remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
|
||||||
|
|
|
@ -97,8 +97,8 @@ Modify [install/etc/open5gs/amf.yaml](https://github.com/{{ site.github_username
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
$ diff -u /etc/open5gs/amf.yaml.old /etc/open5gs/amf.yaml
|
$ diff -u /etc/open5gs/amf.yaml.old /etc/open5gs/amf.yaml
|
||||||
--- amf.yaml 2020-09-05 20:52:28.652234967 -0400
|
--- amf.yaml 2020-09-05 20:52:28.652234967 -0400
|
||||||
+++ amf.yaml.new 2020-09-05 20:55:07.453114885 -0400
|
+++ amf.yaml.new 2020-09-05 20:55:07.453114885 -0400
|
||||||
@@ -165,23 +165,23 @@
|
@@ -165,23 +165,23 @@
|
||||||
- addr: 127.0.0.5
|
- addr: 127.0.0.5
|
||||||
port: 7777
|
port: 7777
|
||||||
|
@ -136,8 +136,8 @@ $ diff -u /etc/open5gs/amf.yaml.old /etc/open5gs/amf.yaml
|
||||||
Modify [install/etc/open5gs/upf.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/upf.yaml.in) to set the GTP-U and PFCP IP address.
|
Modify [install/etc/open5gs/upf.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/upf.yaml.in) to set the GTP-U and PFCP IP address.
|
||||||
```diff
|
```diff
|
||||||
$ diff -u /etc/open5gs/upf.yaml.old /etc/open5gs/upf.yaml
|
$ diff -u /etc/open5gs/upf.yaml.old /etc/open5gs/upf.yaml
|
||||||
--- upf.yaml 2020-09-05 20:52:28.652234967 -0400
|
--- upf.yaml 2020-09-05 20:52:28.652234967 -0400
|
||||||
+++ upf.yaml.new 2020-09-05 20:52:55.279052142 -0400
|
+++ upf.yaml.new 2020-09-05 20:52:55.279052142 -0400
|
||||||
@@ -137,9 +137,7 @@
|
@@ -137,9 +137,7 @@
|
||||||
pfcp:
|
pfcp:
|
||||||
- addr: 127.0.0.7
|
- addr: 127.0.0.7
|
||||||
|
@ -156,8 +156,8 @@ Modify [install/etc/open5gs/mme.yaml](https://github.com/{{ site.github_username
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
$ diff -u /etc/open5gs/mme.yaml.old /etc/open5gs/mme.yaml
|
$ diff -u /etc/open5gs/mme.yaml.old /etc/open5gs/mme.yaml
|
||||||
--- mme.yaml 2020-09-05 20:52:28.648235143 -0400
|
--- mme.yaml 2020-09-05 20:52:28.648235143 -0400
|
||||||
+++ mme.yaml.new 2020-09-05 20:56:05.434484208 -0400
|
+++ mme.yaml.new 2020-09-05 20:56:05.434484208 -0400
|
||||||
@@ -204,20 +204,20 @@
|
@@ -204,20 +204,20 @@
|
||||||
mme:
|
mme:
|
||||||
freeDiameter: /home/acetcom/Documents/git/open5gs/install/etc/freeDiameter/mme.conf
|
freeDiameter: /home/acetcom/Documents/git/open5gs/install/etc/freeDiameter/mme.conf
|
||||||
|
@ -190,8 +190,8 @@ $ diff -u /etc/open5gs/mme.yaml.old /etc/open5gs/mme.yaml
|
||||||
Modify [install/etc/open5gs/sgwu.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/sgwu.yaml.in) to set the GTP-U IP address.
|
Modify [install/etc/open5gs/sgwu.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/sgwu.yaml.in) to set the GTP-U IP address.
|
||||||
```diff
|
```diff
|
||||||
$ diff -u /etc/open5gs/sgwu.yaml.old /etc/open5gs/sgwu.yaml
|
$ diff -u /etc/open5gs/sgwu.yaml.old /etc/open5gs/sgwu.yaml
|
||||||
--- sgwu.yaml 2020-09-05 20:50:39.393022566 -0400
|
--- sgwu.yaml 2020-09-05 20:50:39.393022566 -0400
|
||||||
+++ sgwu.yaml.new 2020-09-05 20:51:06.667838823 -0400
|
+++ sgwu.yaml.new 2020-09-05 20:51:06.667838823 -0400
|
||||||
@@ -51,7 +51,7 @@
|
@@ -51,7 +51,7 @@
|
||||||
#
|
#
|
||||||
sgwu:
|
sgwu:
|
||||||
|
|
|
@ -56,8 +56,8 @@ Modify [install/etc/open5gs/mme.yaml](https://github.com/{{ site.github_username
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
$ diff -u /etc/open5gs/mme.yaml.old /etc/open5gs/mme.yaml
|
$ diff -u /etc/open5gs/mme.yaml.old /etc/open5gs/mme.yaml
|
||||||
--- mme.yaml.old 2020-08-22 11:36:40.512418765 -0400
|
--- mme.yaml.old 2020-08-22 11:36:40.512418765 -0400
|
||||||
+++ mme.yaml 2020-08-22 11:36:27.081466682 -0400
|
+++ mme.yaml 2020-08-22 11:36:27.081466682 -0400
|
||||||
@@ -204,20 +204,20 @@
|
@@ -204,20 +204,20 @@
|
||||||
mme:
|
mme:
|
||||||
freeDiameter: /home/acetcom/Documents/git/open5gs/install/etc/freeDiameter/mme.conf
|
freeDiameter: /home/acetcom/Documents/git/open5gs/install/etc/freeDiameter/mme.conf
|
||||||
|
@ -113,8 +113,8 @@ $ diff -u /etc/open5gs/sgwc.yaml.old /etc/open5gs/sgwc.yaml
|
||||||
Modify [install/etc/open5gs/smf.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/smf.yaml.in) to set the PFCP IP address.
|
Modify [install/etc/open5gs/smf.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/smf.yaml.in) to set the PFCP IP address.
|
||||||
```diff
|
```diff
|
||||||
$ diff -u /etc/open5gs/smf.yaml.old /etc/open5gs/smf.yaml
|
$ diff -u /etc/open5gs/smf.yaml.old /etc/open5gs/smf.yaml
|
||||||
--- smf.yaml.old 2020-08-22 11:37:39.990816411 -0400
|
--- smf.yaml.old 2020-08-22 11:37:39.990816411 -0400
|
||||||
+++ smf.yaml 2020-08-22 11:38:18.647999952 -0400
|
+++ smf.yaml 2020-08-22 11:38:18.647999952 -0400
|
||||||
@@ -187,8 +187,7 @@
|
@@ -187,8 +187,7 @@
|
||||||
- addr: 127.0.0.4
|
- addr: 127.0.0.4
|
||||||
- addr: ::1
|
- addr: ::1
|
||||||
|
@ -141,8 +141,8 @@ Modify [install/etc/open5gs/amf.yaml](https://github.com/{{ site.github_username
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
diff -u /etc/open5gs/amf.yaml.old /etc/open5gs/amf.yaml
|
diff -u /etc/open5gs/amf.yaml.old /etc/open5gs/amf.yaml
|
||||||
--- amf.yaml.old 2020-06-21 23:34:14.643114779 -0400
|
--- amf.yaml.old 2020-06-21 23:34:14.643114779 -0400
|
||||||
+++ amf.yaml 2020-06-21 23:34:28.718482095 -0400
|
+++ amf.yaml 2020-06-21 23:34:28.718482095 -0400
|
||||||
@@ -67,25 +67,25 @@
|
@@ -67,25 +67,25 @@
|
||||||
- addr: 127.0.0.5
|
- addr: 127.0.0.5
|
||||||
port: 7777
|
port: 7777
|
||||||
|
@ -183,8 +183,8 @@ diff -u /etc/open5gs/amf.yaml.old /etc/open5gs/amf.yaml
|
||||||
Modify [install/etc/open5gs/sgwu.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/sgwu.yaml.in) to set the GTP-U and PFCP IP address.
|
Modify [install/etc/open5gs/sgwu.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/sgwu.yaml.in) to set the GTP-U and PFCP IP address.
|
||||||
```diff
|
```diff
|
||||||
$ diff -u /etc/open5gs/sgwu.yaml.old /etc/open5gs/sgwu.yaml
|
$ diff -u /etc/open5gs/sgwu.yaml.old /etc/open5gs/sgwu.yaml
|
||||||
--- sgwu.yaml.old 2020-08-22 11:41:09.214670723 -0400
|
--- sgwu.yaml.old 2020-08-22 11:41:09.214670723 -0400
|
||||||
+++ sgwu.yaml 2020-08-22 11:41:27.433937124 -0400
|
+++ sgwu.yaml 2020-08-22 11:41:27.433937124 -0400
|
||||||
@@ -51,9 +51,9 @@
|
@@ -51,9 +51,9 @@
|
||||||
#
|
#
|
||||||
sgwu:
|
sgwu:
|
||||||
|
@ -202,8 +202,8 @@ $ diff -u /etc/open5gs/sgwu.yaml.old /etc/open5gs/sgwu.yaml
|
||||||
Modify [install/etc/open5gs/upf.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/upf.yaml.in) to set the GTP-U and PFCP IP address.
|
Modify [install/etc/open5gs/upf.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/upf.yaml.in) to set the GTP-U and PFCP IP address.
|
||||||
```diff
|
```diff
|
||||||
$ diff -u /etc/open5gs/upf.yaml.old /etc/open5gs/upf.yaml
|
$ diff -u /etc/open5gs/upf.yaml.old /etc/open5gs/upf.yaml
|
||||||
--- upf.yaml.old 2020-08-22 11:42:57.781750067 -0400
|
--- upf.yaml.old 2020-08-22 11:42:57.781750067 -0400
|
||||||
+++ upf.yaml 2020-08-22 11:43:13.268901616 -0400
|
+++ upf.yaml 2020-08-22 11:43:13.268901616 -0400
|
||||||
@@ -59,11 +59,9 @@
|
@@ -59,11 +59,9 @@
|
||||||
#
|
#
|
||||||
upf:
|
upf:
|
||||||
|
|
|
@ -176,8 +176,8 @@ You can modify the configuration file to record more logs.
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
$ diff -u /etc/open5gs/amf.yaml.old /etc/open5gs/amf.yaml
|
$ diff -u /etc/open5gs/amf.yaml.old /etc/open5gs/amf.yaml
|
||||||
--- amf.yaml.old 2020-08-22 12:26:56.132213488 -0400
|
--- amf.yaml.old 2020-08-22 12:26:56.132213488 -0400
|
||||||
+++ amf.yaml 2020-08-22 12:27:04.135901201 -0400
|
+++ amf.yaml 2020-08-22 12:27:04.135901201 -0400
|
||||||
@@ -20,6 +20,7 @@
|
@@ -20,6 +20,7 @@
|
||||||
#
|
#
|
||||||
logger:
|
logger:
|
||||||
|
|
|
@ -96,63 +96,63 @@ $ mongo
|
||||||
> use open5gs
|
> use open5gs
|
||||||
> db.subscribers.find().pretty()
|
> db.subscribers.find().pretty()
|
||||||
{
|
{
|
||||||
"_id" : ObjectId("60969fe79459f8b40d8d3f68"),
|
"_id" : ObjectId("60969fe79459f8b40d8d3f68"),
|
||||||
"imsi" : "999700000000001",
|
"imsi" : "999700000000001",
|
||||||
"__v" : 0,
|
"__v" : 0,
|
||||||
"access_restriction_data" : 32,
|
"access_restriction_data" : 32,
|
||||||
"ambr" : {
|
"ambr" : {
|
||||||
"uplink" : {
|
"uplink" : {
|
||||||
"value" : 1,
|
"value" : 1,
|
||||||
"unit" : 3
|
"unit" : 3
|
||||||
},
|
},
|
||||||
"downlink" : {
|
"downlink" : {
|
||||||
"value" : 1,
|
"value" : 1,
|
||||||
"unit" : 3
|
"unit" : 3
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network_access_mode" : 2,
|
"network_access_mode" : 2,
|
||||||
"security" : {
|
"security" : {
|
||||||
"k" : "465b5ce8b199b49faa5f0a2ee238a6bc",
|
"k" : "465b5ce8b199b49faa5f0a2ee238a6bc",
|
||||||
"amf" : "8000",
|
"amf" : "8000",
|
||||||
"op" : null,
|
"op" : null,
|
||||||
"opc" : "e8ed289deba952e4283b54e88e6183ca",
|
"opc" : "e8ed289deba952e4283b54e88e6183ca",
|
||||||
"sqn" : NumberLong(97)
|
"sqn" : NumberLong(97)
|
||||||
},
|
},
|
||||||
"slice" : [
|
"slice" : [
|
||||||
{
|
{
|
||||||
"sst" : 1,
|
"sst" : 1,
|
||||||
"default_indicator" : true,
|
"default_indicator" : true,
|
||||||
"_id" : ObjectId("60969fe7de8743b3c7b1a973"),
|
"_id" : ObjectId("60969fe7de8743b3c7b1a973"),
|
||||||
"session" : [
|
"session" : [
|
||||||
{
|
{
|
||||||
"name" : "internet",
|
"name" : "internet",
|
||||||
"type" : 3,
|
"type" : 3,
|
||||||
"_id" : ObjectId("60969fe7de8743b3c7b1a974"),
|
"_id" : ObjectId("60969fe7de8743b3c7b1a974"),
|
||||||
"pcc_rule" : [ ],
|
"pcc_rule" : [ ],
|
||||||
"ambr" : {
|
"ambr" : {
|
||||||
"uplink" : {
|
"uplink" : {
|
||||||
"value" : 1,
|
"value" : 1,
|
||||||
"unit" : 3
|
"unit" : 3
|
||||||
},
|
},
|
||||||
"downlink" : {
|
"downlink" : {
|
||||||
"value" : 1,
|
"value" : 1,
|
||||||
"unit" : 3
|
"unit" : 3
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"qos" : {
|
"qos" : {
|
||||||
"index" : 9,
|
"index" : 9,
|
||||||
"arp" : {
|
"arp" : {
|
||||||
"priority_level" : 8,
|
"priority_level" : 8,
|
||||||
"pre_emption_capability" : 1,
|
"pre_emption_capability" : 1,
|
||||||
"pre_emption_vulnerability" : 1
|
"pre_emption_vulnerability" : 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"subscribed_rau_tau_timer" : 12,
|
"subscribed_rau_tau_timer" : 12,
|
||||||
"subscriber_status" : 0
|
"subscriber_status" : 0
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -163,43 +163,43 @@ $ mongo
|
||||||
> use open5gs
|
> use open5gs
|
||||||
> db.subscribers.find().pretty()
|
> db.subscribers.find().pretty()
|
||||||
{
|
{
|
||||||
"_id" : ObjectId("609715fda08851a0744e6ae7"),
|
"_id" : ObjectId("609715fda08851a0744e6ae7"),
|
||||||
"imsi" : "999700000021309",
|
"imsi" : "999700000021309",
|
||||||
"__v" : 0,
|
"__v" : 0,
|
||||||
"access_restriction_data" : 32,
|
"access_restriction_data" : 32,
|
||||||
"ambr" : {
|
"ambr" : {
|
||||||
"downlink" : NumberLong(1024000),
|
"downlink" : NumberLong(1024000),
|
||||||
"uplink" : NumberLong(1024000)
|
"uplink" : NumberLong(1024000)
|
||||||
},
|
},
|
||||||
"network_access_mode" : 2,
|
"network_access_mode" : 2,
|
||||||
"pdn" : [
|
"pdn" : [
|
||||||
{
|
{
|
||||||
"apn" : "internet",
|
"apn" : "internet",
|
||||||
"_id" : ObjectId("609715fd455bcd38c884ce85"),
|
"_id" : ObjectId("609715fd455bcd38c884ce85"),
|
||||||
"pcc_rule" : [ ],
|
"pcc_rule" : [ ],
|
||||||
"ambr" : {
|
"ambr" : {
|
||||||
"downlink" : NumberLong(1024000),
|
"downlink" : NumberLong(1024000),
|
||||||
"uplink" : NumberLong(1024000)
|
"uplink" : NumberLong(1024000)
|
||||||
},
|
},
|
||||||
"qos" : {
|
"qos" : {
|
||||||
"qci" : 9,
|
"qci" : 9,
|
||||||
"arp" : {
|
"arp" : {
|
||||||
"priority_level" : 8,
|
"priority_level" : 8,
|
||||||
"pre_emption_vulnerability" : 1,
|
"pre_emption_vulnerability" : 1,
|
||||||
"pre_emption_capability" : 0
|
"pre_emption_capability" : 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"type" : 0
|
"type" : 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"security" : {
|
"security" : {
|
||||||
"k" : "70D49A71DD1A2B806A25ABE0EF749F1E",
|
"k" : "70D49A71DD1A2B806A25ABE0EF749F1E",
|
||||||
"amf" : "8000",
|
"amf" : "8000",
|
||||||
"op" : null,
|
"op" : null,
|
||||||
"opc" : "6F1BF53D624B3A43AF6592854E2444C7"
|
"opc" : "6F1BF53D624B3A43AF6592854E2444C7"
|
||||||
},
|
},
|
||||||
"subscribed_rau_tau_timer" : 12,
|
"subscribed_rau_tau_timer" : 12,
|
||||||
"subscriber_status" : 0
|
"subscriber_status" : 0
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -226,12 +226,12 @@ $ mongo
|
||||||
> db.subscribers.find().pretty()
|
> db.subscribers.find().pretty()
|
||||||
{
|
{
|
||||||
...
|
...
|
||||||
"slice" : [
|
"slice" : [
|
||||||
{
|
{
|
||||||
"sst" : 1,
|
"sst" : 1,
|
||||||
"default_indicator" : true,
|
"default_indicator" : true,
|
||||||
"_id" : ObjectId("60969fe7de8743b3c7b1a973"),
|
"_id" : ObjectId("60969fe7de8743b3c7b1a973"),
|
||||||
"session" : [
|
"session" : [
|
||||||
...
|
...
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -476,8 +476,8 @@ The Open5GS package contains a systemd-networkd configuration file for `ogstun`.
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
$ diff -u /etc/systemd/network/99-open5gs.network /etc/systemd/network/99-open5gs.network.new
|
$ diff -u /etc/systemd/network/99-open5gs.network /etc/systemd/network/99-open5gs.network.new
|
||||||
--- /etc/systemd/network/99-open5gs.network 2020-09-17 09:29:09.137392040 -0400
|
--- /etc/systemd/network/99-open5gs.network 2020-09-17 09:29:09.137392040 -0400
|
||||||
+++ /etc/systemd/network/99-open5gs.network.new 2020-09-17 09:29:03.375719620 -0400
|
+++ /etc/systemd/network/99-open5gs.network.new 2020-09-17 09:29:03.375719620 -0400
|
||||||
@@ -2,5 +2,5 @@
|
@@ -2,5 +2,5 @@
|
||||||
Name=ogstun
|
Name=ogstun
|
||||||
|
|
||||||
|
@ -501,8 +501,8 @@ Now, you need to modify the configuration file of Open5GS to adjust the UE IP Po
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
$ diff -u smf.yaml smf.yaml.new
|
$ diff -u smf.yaml smf.yaml.new
|
||||||
--- smf.yaml 2020-09-17 09:31:16.547882093 -0400
|
--- smf.yaml 2020-09-17 09:31:16.547882093 -0400
|
||||||
+++ smf.yaml.new 2020-09-17 09:32:18.267726844 -0400
|
+++ smf.yaml.new 2020-09-17 09:32:18.267726844 -0400
|
||||||
@@ -190,7 +190,7 @@
|
@@ -190,7 +190,7 @@
|
||||||
- addr: 127.0.0.4
|
- addr: 127.0.0.4
|
||||||
- addr: ::1
|
- addr: ::1
|
||||||
|
@ -516,8 +516,8 @@ $ diff -u smf.yaml smf.yaml.new
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
$ diff -u upf.yaml upf.yaml.new
|
$ diff -u upf.yaml upf.yaml.new
|
||||||
--- upf.yaml 2020-09-17 09:31:16.547882093 -0400
|
--- upf.yaml 2020-09-17 09:31:16.547882093 -0400
|
||||||
+++ upf.yaml.new 2020-09-17 09:32:25.199619989 -0400
|
+++ upf.yaml.new 2020-09-17 09:32:25.199619989 -0400
|
||||||
@@ -139,7 +139,7 @@
|
@@ -139,7 +139,7 @@
|
||||||
gtpu:
|
gtpu:
|
||||||
- addr: 127.0.0.7
|
- addr: 127.0.0.7
|
||||||
|
@ -766,8 +766,8 @@ Create **newtables** file as below.
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
$ diff -u oldtables newtables
|
$ diff -u oldtables newtables
|
||||||
--- oldtables 2019-06-01 23:43:50.354974226 +0900
|
--- oldtables 2019-06-01 23:43:50.354974226 +0900
|
||||||
+++ newtables 2019-06-01 23:44:16.110931684 +0900
|
+++ newtables 2019-06-01 23:44:16.110931684 +0900
|
||||||
@@ -8,6 +8,7 @@
|
@@ -8,6 +8,7 @@
|
||||||
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
|
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
|
||||||
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
|
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
|
||||||
|
@ -1273,10 +1273,10 @@ $ echo $(cd $(dirname ./install/lib/x86_64-linux-gnu/) && pwd -P)/$(basename ./i
|
||||||
$ export LD_LIBRARY_PATH=/home/acetcom/Documents/git/open5gs/install/lib/x86_64-linux-gnu
|
$ export LD_LIBRARY_PATH=/home/acetcom/Documents/git/open5gs/install/lib/x86_64-linux-gnu
|
||||||
$ ldd ./install/bin/open5gs-amfd
|
$ ldd ./install/bin/open5gs-amfd
|
||||||
...
|
...
|
||||||
libogsapp.so.1 => /home/acetcom/Documents/git/open5gs/install/lib/x86_64-linux-gnu/libogsapp.so.1 (0x00007f161ab51000)
|
libogsapp.so.1 => /home/acetcom/Documents/git/open5gs/install/lib/x86_64-linux-gnu/libogsapp.so.1 (0x00007f161ab51000)
|
||||||
libogscore.so.1 => /home/acetcom/Documents/git/open5gs/install/lib/x86_64-linux-gnu/libogscore.so.1 (0x00007f161a922000)
|
libogscore.so.1 => /home/acetcom/Documents/git/open5gs/install/lib/x86_64-linux-gnu/libogscore.so.1 (0x00007f161a922000)
|
||||||
libogssctp.so.1 => /home/acetcom/Documents/git/open5gs/install/lib/x86_64-linux-gnu/libogssctp.so.1 (0x00007f161a71d000)
|
libogssctp.so.1 => /home/acetcom/Documents/git/open5gs/install/lib/x86_64-linux-gnu/libogssctp.so.1 (0x00007f161a71d000)
|
||||||
libogss1ap.so.1 => /home/acetcom/Documents/git/open5gs/install/lib/x86_64-linux-gnu/libogss1ap.so.1 (0x00007f161a519000)
|
libogss1ap.so.1 => /home/acetcom/Documents/git/open5gs/install/lib/x86_64-linux-gnu/libogss1ap.so.1 (0x00007f161a519000)
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -190,7 +190,7 @@ Title : sysmocom SIM Card Details / AM93\PICK\00859
|
||||||
|
|
||||||
IMSI ICCID ACC PIN1 PUK1 PIN2 PUK2 Ki OPC ADM1 KIC1 KID1 KIK1
|
IMSI ICCID ACC PIN1 PUK1 PIN2 PUK2 Ki OPC ADM1 KIC1 KID1 KIK1
|
||||||
...
|
...
|
||||||
999700000017408 8988211000000174089 0100 3623 84724035 8774 57473966 B1233463AB9BC2AD2DB1830EB6417E7B 625150E2A943E3353DD23554101CAFD4 47190711 C865CAA0A54542333929B29B116F4375 7D7F65DCD99003C0A0D5D31CA3E5253E 5B27983AF628FC3FCB36B89300012944
|
999700000017408 8988211000000174089 0100 3623 84724035 8774 57473966 B1233463AB9BC2AD2DB1830EB6417E7B 625150E2A943E3353DD23554101CAFD4 47190711 C865CAA0A54542333929B29B116F4375 7D7F65DCD99003C0A0D5D31CA3E5253E 5B27983AF628FC3FCB36B89300012944
|
||||||
```
|
```
|
||||||
|
|
||||||
Here's my subscriber information from above.
|
Here's my subscriber information from above.
|
||||||
|
@ -229,8 +229,8 @@ Modify [install/etc/open5gs/mme.yaml](https://github.com/{{ site.github_username
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
$ diff -u /etc/open5gs/mme.yaml.old /etc/open5gs/mme.yaml
|
$ diff -u /etc/open5gs/mme.yaml.old /etc/open5gs/mme.yaml
|
||||||
--- mme.yaml.old 2020-08-22 12:07:32.755250028 -0400
|
--- mme.yaml.old 2020-08-22 12:07:32.755250028 -0400
|
||||||
+++ mme.yaml 2020-08-22 12:08:17.309320211 -0400
|
+++ mme.yaml 2020-08-22 12:08:17.309320211 -0400
|
||||||
@@ -208,20 +208,20 @@
|
@@ -208,20 +208,20 @@
|
||||||
mme:
|
mme:
|
||||||
freeDiameter: /home/acetcom/Documents/git/open5gs/install/etc/freeDiameter/mme.conf
|
freeDiameter: /home/acetcom/Documents/git/open5gs/install/etc/freeDiameter/mme.conf
|
||||||
|
@ -263,8 +263,8 @@ $ diff -u /etc/open5gs/mme.yaml.old /etc/open5gs/mme.yaml
|
||||||
Modify [install/etc/open5gs/sgwu.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/sgwu.yaml.in) to set the GTP-U IP address.
|
Modify [install/etc/open5gs/sgwu.yaml](https://github.com/{{ site.github_username }}/open5gs/blob/main/configs/open5gs/sgwu.yaml.in) to set the GTP-U IP address.
|
||||||
```diff
|
```diff
|
||||||
$ diff -u /etc/open5gs/sgwu.yaml.old /etc/open5gs/sgwu.yaml
|
$ diff -u /etc/open5gs/sgwu.yaml.old /etc/open5gs/sgwu.yaml
|
||||||
--- sgwu.yaml.old 2020-08-22 12:08:44.782880778 -0400
|
--- sgwu.yaml.old 2020-08-22 12:08:44.782880778 -0400
|
||||||
+++ sgwu.yaml 2020-08-22 12:06:49.809299514 -0400
|
+++ sgwu.yaml 2020-08-22 12:06:49.809299514 -0400
|
||||||
@@ -82,7 +82,7 @@
|
@@ -82,7 +82,7 @@
|
||||||
#
|
#
|
||||||
sgwu:
|
sgwu:
|
||||||
|
@ -338,8 +338,8 @@ You should check your phone frequency. If your phone does not support Band-3, yo
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
$ diff -u enb.conf.example enb.conf
|
$ diff -u enb.conf.example enb.conf
|
||||||
-- enb.conf.example 2022-01-19 20:30:13.612993155 +0900
|
-- enb.conf.example 2022-01-19 20:30:13.612993155 +0900
|
||||||
+++ enb.conf 2022-01-19 21:04:15.674419300 +0900
|
+++ enb.conf 2022-01-19 21:04:15.674419300 +0900
|
||||||
@@ -20,9 +20,9 @@
|
@@ -20,9 +20,9 @@
|
||||||
#####################################################################
|
#####################################################################
|
||||||
[enb]
|
[enb]
|
||||||
|
@ -375,8 +375,8 @@ $ diff -u enb.conf.example enb.conf
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
$ diff -u rr.conf.example rr.conf
|
$ diff -u rr.conf.example rr.conf
|
||||||
-- rr.conf.example 2022-01-19 20:30:13.620992794 +0900
|
-- rr.conf.example 2022-01-19 20:30:13.620992794 +0900
|
||||||
+++ rr.conf 2022-01-19 21:05:21.959044145 +0900
|
+++ rr.conf 2022-01-19 21:05:21.959044145 +0900
|
||||||
@@ -55,10 +55,10 @@
|
@@ -55,10 +55,10 @@
|
||||||
{
|
{
|
||||||
// rf_port = 0;
|
// rf_port = 0;
|
||||||
|
@ -409,8 +409,8 @@ Device Argument : Clock source from external GPS-DO
|
||||||
If you are not using GPS-DO, you can just comment out `device_args` as shown below.
|
If you are not using GPS-DO, you can just comment out `device_args` as shown below.
|
||||||
```diff
|
```diff
|
||||||
$ diff -u enb.conf enb.conf.no_gps_do
|
$ diff -u enb.conf enb.conf.no_gps_do
|
||||||
--- enb.conf 2022-01-19 21:08:32.941527373 +0900
|
--- enb.conf 2022-01-19 21:08:32.941527373 +0900
|
||||||
+++ enb.conf.no_gps_do 2022-01-19 21:10:18.612581261 +0900
|
+++ enb.conf.no_gps_do 2022-01-19 21:10:18.612581261 +0900
|
||||||
@@ -81,7 +81,7 @@
|
@@ -81,7 +81,7 @@
|
||||||
|
|
||||||
# Example for ZMQ-based operation with TCP transport for I/Q samples
|
# Example for ZMQ-based operation with TCP transport for I/Q samples
|
||||||
|
|
|
@ -307,9 +307,9 @@ Username: test
|
||||||
Password: testpasswd
|
Password: testpasswd
|
||||||
Server: ims.mnc001.mcc001.3gppnetwork.org (Created DNS Domain Name or IP to which IMS components are bound to, visible interface IP address)
|
Server: ims.mnc001.mcc001.3gppnetwork.org (Created DNS Domain Name or IP to which IMS components are bound to, visible interface IP address)
|
||||||
Optional Settings:
|
Optional Settings:
|
||||||
Authentication username: test
|
Authentication username: test
|
||||||
Outbound proxy address: 172.24.15.30 (Floating IP of VM in case of OpenStack or else no need to fill in case of physical machine)
|
Outbound proxy address: 172.24.15.30 (Floating IP of VM in case of OpenStack or else no need to fill in case of physical machine)
|
||||||
Transport type: UDP
|
Transport type: UDP
|
||||||
```
|
```
|
||||||
|
|
||||||
In Phone 2:
|
In Phone 2:
|
||||||
|
@ -319,9 +319,9 @@ Username: test2
|
||||||
Password: testpasswd
|
Password: testpasswd
|
||||||
Server: ims.mnc001.mcc001.3gppnetwork.org (Created DNS Domain Name or IP to which IMS components are bound to, visible interface IP address)
|
Server: ims.mnc001.mcc001.3gppnetwork.org (Created DNS Domain Name or IP to which IMS components are bound to, visible interface IP address)
|
||||||
Optional Settings:
|
Optional Settings:
|
||||||
Authentication username: test2
|
Authentication username: test2
|
||||||
Outbound proxy address: 172.24.15.30 (Floating IP of VM in case of OpenStack or else no need to fill in case of physical machine)
|
Outbound proxy address: 172.24.15.30 (Floating IP of VM in case of OpenStack or else no need to fill in case of physical machine)
|
||||||
Transport type: UDP
|
Transport type: UDP
|
||||||
```
|
```
|
||||||
|
|
||||||
- Set "Receive incoming calls" option to enabled state in both phones
|
- Set "Receive incoming calls" option to enabled state in both phones
|
||||||
|
@ -566,8 +566,8 @@ options {
|
||||||
// the all-0's placeholder.
|
// the all-0's placeholder.
|
||||||
|
|
||||||
//forwarders {
|
//forwarders {
|
||||||
// Put here the IP address of other DNS server which could be used if name cannot be resolved with DNS server running in this machine (Optional)
|
// Put here the IP address of other DNS server which could be used if name cannot be resolved with DNS server running in this machine (Optional)
|
||||||
//10.4.128.2;
|
//10.4.128.2;
|
||||||
//};
|
//};
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
@ -1068,8 +1068,8 @@ In the below example. epc-ims is the hostname of the machine
|
||||||
|
|
||||||
```
|
```
|
||||||
root@epc-ims:~# cat /etc/hosts
|
root@epc-ims:~# cat /etc/hosts
|
||||||
127.0.0.1 localhost
|
127.0.0.1 localhost
|
||||||
127.0.0.1 epc-ims
|
127.0.0.1 epc-ims
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 20. Add IMS subscription use in FoHSS as follows from the Web GUI
|
#### 20. Add IMS subscription use in FoHSS as follows from the Web GUI
|
||||||
|
@ -1078,7 +1078,7 @@ Assuming IMSI of the user as 001010123456791 and MSISDN is 0198765432100
|
||||||
|
|
||||||
```
|
```
|
||||||
Login to the HSS web console.
|
Login to the HSS web console.
|
||||||
Navigate to the User Identities page
|
Navigate to the User Identities page
|
||||||
Create the IMSU
|
Create the IMSU
|
||||||
Click IMS Subscription / Create
|
Click IMS Subscription / Create
|
||||||
Enter:
|
Enter:
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
char *ogs_strerror(ogs_err_t err, char *buf, size_t size)
|
char *ogs_strerror(ogs_err_t err, char *buf, size_t size)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/*
|
/*
|
||||||
* The following code is stolen from APR Library
|
* The following code is stolen from APR Library
|
||||||
* http://svn.apache.org/repos/asf/apr/apr/trunk/misc/unix/errorcodes.c
|
* http://svn.apache.org/repos/asf/apr/apr/trunk/misc/unix/errorcodes.c
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -52,8 +52,8 @@ const ogs_pollset_actions_t ogs_kqueue_actions = {
|
||||||
struct kqueue_context_s {
|
struct kqueue_context_s {
|
||||||
int kqueue;
|
int kqueue;
|
||||||
|
|
||||||
struct kevent *change_list;
|
struct kevent *change_list;
|
||||||
struct kevent *event_list;
|
struct kevent *event_list;
|
||||||
int nchanges, nevents;
|
int nchanges, nevents;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -66,12 +66,12 @@ static void kqueue_init(ogs_pollset_t *pollset)
|
||||||
ogs_assert(context);
|
ogs_assert(context);
|
||||||
pollset->context = context;
|
pollset->context = context;
|
||||||
|
|
||||||
context->change_list = ogs_calloc(
|
context->change_list = ogs_calloc(
|
||||||
pollset->capacity, sizeof(struct kevent));
|
pollset->capacity, sizeof(struct kevent));
|
||||||
ogs_assert(context->change_list);
|
ogs_assert(context->change_list);
|
||||||
context->event_list = ogs_calloc(
|
context->event_list = ogs_calloc(
|
||||||
pollset->capacity, sizeof(struct kevent));
|
pollset->capacity, sizeof(struct kevent));
|
||||||
ogs_assert(context->change_list);
|
ogs_assert(context->change_list);
|
||||||
context->nchanges = 0;
|
context->nchanges = 0;
|
||||||
context->nevents = pollset->capacity;
|
context->nevents = pollset->capacity;
|
||||||
|
|
||||||
|
@ -89,8 +89,8 @@ static void kqueue_cleanup(ogs_pollset_t *pollset)
|
||||||
context = pollset->context;
|
context = pollset->context;
|
||||||
ogs_assert(context);
|
ogs_assert(context);
|
||||||
|
|
||||||
ogs_free(context->change_list);
|
ogs_free(context->change_list);
|
||||||
ogs_free(context->event_list);
|
ogs_free(context->event_list);
|
||||||
|
|
||||||
close(context->kqueue);
|
close(context->kqueue);
|
||||||
|
|
||||||
|
@ -215,75 +215,75 @@ static int kqueue_process(ogs_pollset_t *pollset, ogs_time_t timeout)
|
||||||
return OGS_TIMEUP;
|
return OGS_TIMEUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
ogs_poll_t *poll = NULL;
|
ogs_poll_t *poll = NULL;
|
||||||
short when = 0;
|
short when = 0;
|
||||||
|
|
||||||
if (context->event_list[i].flags & EV_ERROR) {
|
if (context->event_list[i].flags & EV_ERROR) {
|
||||||
switch (context->event_list[i].data) {
|
switch (context->event_list[i].data) {
|
||||||
|
|
||||||
/* Can occur on delete if we are not currently
|
/* Can occur on delete if we are not currently
|
||||||
* watching any events on this fd. That can
|
* watching any events on this fd. That can
|
||||||
* happen when the fd was closed and another
|
* happen when the fd was closed and another
|
||||||
* file was opened with that fd. */
|
* file was opened with that fd. */
|
||||||
case ENOENT:
|
case ENOENT:
|
||||||
/* Can occur for reasons not fully understood
|
/* Can occur for reasons not fully understood
|
||||||
* on FreeBSD. */
|
* on FreeBSD. */
|
||||||
case EINVAL:
|
case EINVAL:
|
||||||
continue;
|
continue;
|
||||||
#if defined(__FreeBSD__)
|
#if defined(__FreeBSD__)
|
||||||
/*
|
/*
|
||||||
* This currently occurs if an FD is closed
|
* This currently occurs if an FD is closed
|
||||||
* before the EV_DELETE makes it out via kevent().
|
* before the EV_DELETE makes it out via kevent().
|
||||||
* The FreeBSD capabilities code sees the blank
|
* The FreeBSD capabilities code sees the blank
|
||||||
* capability set and rejects the request to
|
* capability set and rejects the request to
|
||||||
* modify an event.
|
* modify an event.
|
||||||
*
|
*
|
||||||
* To be strictly correct - when an FD is closed,
|
* To be strictly correct - when an FD is closed,
|
||||||
* all the registered events are also removed.
|
* all the registered events are also removed.
|
||||||
* Queuing EV_DELETE to a closed FD is wrong.
|
* Queuing EV_DELETE to a closed FD is wrong.
|
||||||
* The event(s) should just be deleted from
|
* The event(s) should just be deleted from
|
||||||
* the pending changelist.
|
* the pending changelist.
|
||||||
*/
|
*/
|
||||||
case ENOTCAPABLE:
|
case ENOTCAPABLE:
|
||||||
continue;
|
continue;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Can occur on a delete if the fd is closed. */
|
/* Can occur on a delete if the fd is closed. */
|
||||||
case EBADF:
|
case EBADF:
|
||||||
/* XXXX On NetBSD, we can also get EBADF if we
|
/* XXXX On NetBSD, we can also get EBADF if we
|
||||||
* try to add the write side of a pipe, but
|
* try to add the write side of a pipe, but
|
||||||
* the read side has already been closed.
|
* the read side has already been closed.
|
||||||
* Other BSDs call this situation 'EPIPE'. It
|
* Other BSDs call this situation 'EPIPE'. It
|
||||||
* would be good if we had a way to report
|
* would be good if we had a way to report
|
||||||
* this situation. */
|
* this situation. */
|
||||||
continue;
|
continue;
|
||||||
/* These two can occur on an add if the fd was one side
|
/* These two can occur on an add if the fd was one side
|
||||||
* of a pipe, and the other side was closed. */
|
* of a pipe, and the other side was closed. */
|
||||||
case EPERM:
|
case EPERM:
|
||||||
case EPIPE:
|
case EPIPE:
|
||||||
/* Report read events, if we're listening for
|
/* Report read events, if we're listening for
|
||||||
* them, so that the user can learn about any
|
* them, so that the user can learn about any
|
||||||
* add errors. (If the operation was a
|
* add errors. (If the operation was a
|
||||||
* delete, then udata should be cleared.) */
|
* delete, then udata should be cleared.) */
|
||||||
if (context->event_list[i].udata) {
|
if (context->event_list[i].udata) {
|
||||||
/* The operation was an add:
|
/* The operation was an add:
|
||||||
* report the error as a read. */
|
* report the error as a read. */
|
||||||
when |= OGS_POLLIN;
|
when |= OGS_POLLIN;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
/* The operation was a del:
|
/* The operation was a del:
|
||||||
* report nothing. */
|
* report nothing. */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Other errors shouldn't occur. */
|
/* Other errors shouldn't occur. */
|
||||||
default:
|
default:
|
||||||
ogs_error("kevent() error : flags = 0x%x, errno = %d",
|
ogs_error("kevent() error : flags = 0x%x, errno = %d",
|
||||||
context->event_list[i].flags,
|
context->event_list[i].flags,
|
||||||
(int)context->event_list[i].data);
|
(int)context->event_list[i].data);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
} else if (context->event_list[i].filter == EVFILT_READ) {
|
} else if (context->event_list[i].filter == EVFILT_READ) {
|
||||||
when |= OGS_POLLIN;
|
when |= OGS_POLLIN;
|
||||||
} else if (context->event_list[i].filter == EVFILT_WRITE) {
|
} else if (context->event_list[i].filter == EVFILT_WRITE) {
|
||||||
|
@ -316,7 +316,7 @@ static void kqueue_notify_init(ogs_pollset_t *pollset)
|
||||||
int rc;
|
int rc;
|
||||||
struct kqueue_context_s *context = NULL;
|
struct kqueue_context_s *context = NULL;
|
||||||
struct kevent kev;
|
struct kevent kev;
|
||||||
struct timespec timeout = { 0, 0 };
|
struct timespec timeout = { 0, 0 };
|
||||||
ogs_assert(pollset);
|
ogs_assert(pollset);
|
||||||
|
|
||||||
ogs_assert(pollset);
|
ogs_assert(pollset);
|
||||||
|
@ -325,8 +325,8 @@ static void kqueue_notify_init(ogs_pollset_t *pollset)
|
||||||
|
|
||||||
memset(&kev, 0, sizeof kev);
|
memset(&kev, 0, sizeof kev);
|
||||||
kev.ident = NOTIFY_IDENT;
|
kev.ident = NOTIFY_IDENT;
|
||||||
kev.filter = EVFILT_USER;
|
kev.filter = EVFILT_USER;
|
||||||
kev.flags = EV_ADD | EV_CLEAR;
|
kev.flags = EV_ADD | EV_CLEAR;
|
||||||
|
|
||||||
rc = kevent(context->kqueue, &kev, 1, NULL, 0, &timeout);
|
rc = kevent(context->kqueue, &kev, 1, NULL, 0, &timeout);
|
||||||
ogs_assert(rc != -1);
|
ogs_assert(rc != -1);
|
||||||
|
@ -337,7 +337,7 @@ static int kqueue_notify_pollset(ogs_pollset_t *pollset)
|
||||||
int rc;
|
int rc;
|
||||||
struct kqueue_context_s *context = NULL;
|
struct kqueue_context_s *context = NULL;
|
||||||
struct kevent kev;
|
struct kevent kev;
|
||||||
struct timespec timeout = { 0, 0 };
|
struct timespec timeout = { 0, 0 };
|
||||||
ogs_assert(pollset);
|
ogs_assert(pollset);
|
||||||
|
|
||||||
ogs_assert(pollset);
|
ogs_assert(pollset);
|
||||||
|
@ -346,8 +346,8 @@ static int kqueue_notify_pollset(ogs_pollset_t *pollset)
|
||||||
|
|
||||||
memset(&kev, 0, sizeof kev);
|
memset(&kev, 0, sizeof kev);
|
||||||
kev.ident = NOTIFY_IDENT;
|
kev.ident = NOTIFY_IDENT;
|
||||||
kev.filter = EVFILT_USER;
|
kev.filter = EVFILT_USER;
|
||||||
kev.fflags = NOTE_TRIGGER;
|
kev.fflags = NOTE_TRIGGER;
|
||||||
|
|
||||||
rc = kevent(context->kqueue, &kev, 1, NULL, 0, &timeout);
|
rc = kevent(context->kqueue, &kev, 1, NULL, 0, &timeout);
|
||||||
if (rc == -1) {
|
if (rc == -1) {
|
||||||
|
|
|
@ -79,7 +79,7 @@ void ogs_random(void *buf, size_t buflen)
|
||||||
fd = -1; /* force open() again */
|
fd = -1; /* force open() again */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
buf = (unsigned char *)buf + rc;
|
buf = (unsigned char *)buf + rc;
|
||||||
buflen -= rc;
|
buflen -= rc;
|
||||||
}
|
}
|
||||||
} while (buflen > 0);
|
} while (buflen > 0);
|
||||||
|
@ -123,7 +123,7 @@ void *(*volatile evutil_memset_volatile_)(void *, int, size_t) = memset;
|
||||||
|
|
||||||
static void evutil_memclear_(void *mem, size_t len)
|
static void evutil_memclear_(void *mem, size_t len)
|
||||||
{
|
{
|
||||||
evutil_memset_volatile_(mem, 0, len);
|
evutil_memset_volatile_(mem, 0, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "arc4random.c"
|
#include "arc4random.c"
|
||||||
|
|
|
@ -369,7 +369,7 @@ int ogs_signal_thread(int(*signal_handler)(int signum))
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
#elif HAVE_SIGSUSPEND
|
#elif HAVE_SIGSUSPEND
|
||||||
sigsuspend(&sig_mask);
|
sigsuspend(&sig_mask);
|
||||||
#else
|
#else
|
||||||
#error No sigwait() and no sigsuspend()
|
#error No sigwait() and no sigsuspend()
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -255,23 +255,23 @@ int ogs_sortaddrinfo(ogs_sockaddr_t **sa_list, int family)
|
||||||
ogs_sockaddr_t *ogs_link_local_addr(const char *dev, const ogs_sockaddr_t *sa)
|
ogs_sockaddr_t *ogs_link_local_addr(const char *dev, const ogs_sockaddr_t *sa)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_GETIFADDRS)
|
#if defined(HAVE_GETIFADDRS)
|
||||||
struct ifaddrs *iflist, *cur;
|
struct ifaddrs *iflist, *cur;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = getifaddrs(&iflist);
|
rc = getifaddrs(&iflist);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, "getifaddrs failed");
|
ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, "getifaddrs failed");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (cur = iflist; cur != NULL; cur = cur->ifa_next) {
|
for (cur = iflist; cur != NULL; cur = cur->ifa_next) {
|
||||||
ogs_sockaddr_t *ifa_addr = NULL;
|
ogs_sockaddr_t *ifa_addr = NULL;
|
||||||
ogs_sockaddr_t *addr = NULL;
|
ogs_sockaddr_t *addr = NULL;
|
||||||
|
|
||||||
ifa_addr = (ogs_sockaddr_t *)cur->ifa_addr;
|
ifa_addr = (ogs_sockaddr_t *)cur->ifa_addr;
|
||||||
|
|
||||||
if (ifa_addr == NULL) /* may happen with ppp interfaces */
|
if (ifa_addr == NULL) /* may happen with ppp interfaces */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (ifa_addr->ogs_sa_family == AF_INET)
|
if (ifa_addr->ogs_sa_family == AF_INET)
|
||||||
continue;
|
continue;
|
||||||
|
@ -293,9 +293,9 @@ ogs_sockaddr_t *ogs_link_local_addr(const char *dev, const ogs_sockaddr_t *sa)
|
||||||
|
|
||||||
freeifaddrs(iflist);
|
freeifaddrs(iflist);
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
freeifaddrs(iflist);
|
freeifaddrs(iflist);
|
||||||
#endif
|
#endif
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,16 +112,16 @@ int ogs_socknode_probe(ogs_list_t *list, ogs_list_t *list6,
|
||||||
{
|
{
|
||||||
#if defined(HAVE_GETIFADDRS)
|
#if defined(HAVE_GETIFADDRS)
|
||||||
ogs_socknode_t *node = NULL;
|
ogs_socknode_t *node = NULL;
|
||||||
struct ifaddrs *iflist, *cur;
|
struct ifaddrs *iflist, *cur;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = getifaddrs(&iflist);
|
rc = getifaddrs(&iflist);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, "getifaddrs failed");
|
ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno, "getifaddrs failed");
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (cur = iflist; cur != NULL; cur = cur->ifa_next) {
|
for (cur = iflist; cur != NULL; cur = cur->ifa_next) {
|
||||||
ogs_sockaddr_t *addr = NULL;
|
ogs_sockaddr_t *addr = NULL;
|
||||||
|
|
||||||
if (cur->ifa_flags & IFF_LOOPBACK)
|
if (cur->ifa_flags & IFF_LOOPBACK)
|
||||||
|
@ -130,8 +130,8 @@ int ogs_socknode_probe(ogs_list_t *list, ogs_list_t *list6,
|
||||||
if (cur->ifa_flags & IFF_POINTOPOINT)
|
if (cur->ifa_flags & IFF_POINTOPOINT)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (cur->ifa_addr == NULL) /* may happen with ppp interfaces */
|
if (cur->ifa_addr == NULL) /* may happen with ppp interfaces */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (dev && strcmp(dev, cur->ifa_name) != 0)
|
if (dev && strcmp(dev, cur->ifa_name) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
@ -185,9 +185,9 @@ int ogs_socknode_probe(ogs_list_t *list, ogs_list_t *list6,
|
||||||
|
|
||||||
if (option)
|
if (option)
|
||||||
node->option = ogs_memdup(option, sizeof *option);
|
node->option = ogs_memdup(option, sizeof *option);
|
||||||
}
|
}
|
||||||
|
|
||||||
freeifaddrs(iflist);
|
freeifaddrs(iflist);
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
#elif defined(_WIN32)
|
#elif defined(_WIN32)
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
|
@ -202,7 +202,7 @@ int ogs_socknode_probe(ogs_list_t *list, ogs_list_t *list6,
|
||||||
int ogs_socknode_fill_scope_id_in_local(ogs_sockaddr_t *sa_list)
|
int ogs_socknode_fill_scope_id_in_local(ogs_sockaddr_t *sa_list)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_GETIFADDRS)
|
#if defined(HAVE_GETIFADDRS)
|
||||||
struct ifaddrs *iflist = NULL, *cur;
|
struct ifaddrs *iflist = NULL, *cur;
|
||||||
int rc;
|
int rc;
|
||||||
ogs_sockaddr_t *addr, *ifaddr;
|
ogs_sockaddr_t *addr, *ifaddr;
|
||||||
|
|
||||||
|
|
|
@ -78,18 +78,18 @@ int ogs_gettimeofday(struct timeval *tv)
|
||||||
#else
|
#else
|
||||||
#define DELTA_EPOCH_IN_MICROSEC 11644473600000000ULL
|
#define DELTA_EPOCH_IN_MICROSEC 11644473600000000ULL
|
||||||
#endif
|
#endif
|
||||||
FILETIME ft;
|
FILETIME ft;
|
||||||
uint64_t tmp = 0;
|
uint64_t tmp = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The const value is shamelessy stolen from
|
* The const value is shamelessy stolen from
|
||||||
* http://www.boost.org/doc/libs/1_55_0/boost/chrono/detail/inlined/win/chrono.hpp
|
* http://www.boost.org/doc/libs/1_55_0/boost/chrono/detail/inlined/win/chrono.hpp
|
||||||
*
|
*
|
||||||
* File times are the number of 100 nanosecond intervals elapsed since
|
* File times are the number of 100 nanosecond intervals elapsed since
|
||||||
* 12:00 am Jan 1, 1601 UTC. I haven't check the math particularly hard
|
* 12:00 am Jan 1, 1601 UTC. I haven't check the math particularly hard
|
||||||
*
|
*
|
||||||
* ... good luck
|
* ... good luck
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (tv) {
|
if (tv) {
|
||||||
GetSystemTimeAsFileTime (&ft);
|
GetSystemTimeAsFileTime (&ft);
|
||||||
|
@ -182,7 +182,7 @@ int ogs_time_from_gmt(ogs_time_t *t, struct tm *tm, int tm_usec)
|
||||||
*/
|
*/
|
||||||
uint32_t ogs_time_ntp32_now(void)
|
uint32_t ogs_time_ntp32_now(void)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
rc = ogs_gettimeofday(&tv);
|
rc = ogs_gettimeofday(&tv);
|
||||||
|
@ -192,13 +192,13 @@ uint32_t ogs_time_ntp32_now(void)
|
||||||
}
|
}
|
||||||
ogs_time_t ogs_time_from_ntp32(uint32_t ntp_timestamp)
|
ogs_time_t ogs_time_from_ntp32(uint32_t ntp_timestamp)
|
||||||
{
|
{
|
||||||
if (ntp_timestamp < OGS_1970_1900_SEC_DIFF)
|
if (ntp_timestamp < OGS_1970_1900_SEC_DIFF)
|
||||||
return 0;
|
return 0;
|
||||||
return (ntp_timestamp - OGS_1970_1900_SEC_DIFF) * OGS_USEC_PER_SEC;
|
return (ntp_timestamp - OGS_1970_1900_SEC_DIFF) * OGS_USEC_PER_SEC;
|
||||||
}
|
}
|
||||||
uint32_t ogs_time_to_ntp32(ogs_time_t time)
|
uint32_t ogs_time_to_ntp32(ogs_time_t time)
|
||||||
{
|
{
|
||||||
return (time / OGS_USEC_PER_SEC) + OGS_1970_1900_SEC_DIFF;
|
return (time / OGS_USEC_PER_SEC) + OGS_1970_1900_SEC_DIFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ogs_timezone(void)
|
int ogs_timezone(void)
|
||||||
|
|
|
@ -174,31 +174,31 @@ static int diam_config_apply(ogs_diam_config_t *fd_config)
|
||||||
CHECK_FCT_DO( fd_ext_add( fname, cfname ), return OGS_ERROR );
|
CHECK_FCT_DO( fd_ext_add( fname, cfname ), return OGS_ERROR );
|
||||||
}
|
}
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ogs_diam_config_init(ogs_diam_config_t *fd_config)
|
int ogs_diam_config_init(ogs_diam_config_t *fd_config)
|
||||||
{
|
{
|
||||||
char * buf = NULL, *b;
|
char * buf = NULL, *b;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
|
||||||
CHECK_FCT( diam_config_apply(fd_config) );
|
CHECK_FCT( diam_config_apply(fd_config) );
|
||||||
|
|
||||||
/* The following module use data from the configuration */
|
/* The following module use data from the configuration */
|
||||||
CHECK_FCT( fd_rtdisp_init() );
|
CHECK_FCT( fd_rtdisp_init() );
|
||||||
|
|
||||||
/* Now, load all dynamic extensions */
|
/* Now, load all dynamic extensions */
|
||||||
CHECK_FCT( fd_ext_load() );
|
CHECK_FCT( fd_ext_load() );
|
||||||
|
|
||||||
/* Display configuration */
|
/* Display configuration */
|
||||||
b = fd_conf_dump(&buf, &len, NULL);
|
b = fd_conf_dump(&buf, &len, NULL);
|
||||||
LOG_SPLIT(FD_LOG_NOTICE, NULL,
|
LOG_SPLIT(FD_LOG_NOTICE, NULL,
|
||||||
b ?: (char*)"<Error during configuration dump...>", NULL);
|
b ?: (char*)"<Error during configuration dump...>", NULL);
|
||||||
free(buf);
|
free(buf);
|
||||||
|
|
||||||
/* Since some extensions might have modified the definitions from the dict_base_protocol, we only load the objects now */
|
/* Since some extensions might have modified the definitions from the dict_base_protocol, we only load the objects now */
|
||||||
CHECK_FCT( fd_msg_init() );
|
CHECK_FCT( fd_msg_init() );
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ int ogs_diam_init(int mode, const char *conffile, ogs_diam_config_t *fd_config)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse the configuration file */
|
/* Parse the configuration file */
|
||||||
if (conffile) {
|
if (conffile) {
|
||||||
CHECK_FCT_DO( fd_core_parseconf(conffile), goto error );
|
CHECK_FCT_DO( fd_core_parseconf(conffile), goto error );
|
||||||
} else {
|
} else {
|
||||||
|
@ -59,35 +59,35 @@ int ogs_diam_init(int mode, const char *conffile, ogs_diam_config_t *fd_config)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
error:
|
error:
|
||||||
CHECK_FCT_DO( fd_core_shutdown(), );
|
CHECK_FCT_DO( fd_core_shutdown(), );
|
||||||
CHECK_FCT_DO( fd_core_wait_shutdown_complete(), );
|
CHECK_FCT_DO( fd_core_wait_shutdown_complete(), );
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ogs_diam_start(void)
|
int ogs_diam_start(void)
|
||||||
{
|
{
|
||||||
/* Start the servers */
|
/* Start the servers */
|
||||||
CHECK_FCT_DO( fd_core_start(), goto error );
|
CHECK_FCT_DO( fd_core_start(), goto error );
|
||||||
|
|
||||||
CHECK_FCT_DO( fd_core_waitstartcomplete(), goto error );
|
CHECK_FCT_DO( fd_core_waitstartcomplete(), goto error );
|
||||||
|
|
||||||
CHECK_FCT( ogs_diam_logger_stats_start() );
|
CHECK_FCT( ogs_diam_logger_stats_start() );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
error:
|
error:
|
||||||
CHECK_FCT_DO( fd_core_shutdown(), );
|
CHECK_FCT_DO( fd_core_shutdown(), );
|
||||||
CHECK_FCT_DO( fd_core_wait_shutdown_complete(), );
|
CHECK_FCT_DO( fd_core_wait_shutdown_complete(), );
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ogs_diam_final()
|
void ogs_diam_final()
|
||||||
{
|
{
|
||||||
ogs_diam_logger_final();
|
ogs_diam_logger_final();
|
||||||
|
|
||||||
CHECK_FCT_DO( fd_core_shutdown(), ogs_error("fd_core_shutdown() failed") );
|
CHECK_FCT_DO( fd_core_shutdown(), ogs_error("fd_core_shutdown() failed") );
|
||||||
CHECK_FCT_DO( fd_core_wait_shutdown_complete(),
|
CHECK_FCT_DO( fd_core_wait_shutdown_complete(),
|
||||||
ogs_error("fd_core_wait_shutdown_complete() failed"));
|
ogs_error("fd_core_wait_shutdown_complete() failed"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,27 +34,27 @@ static void * diam_stats_worker(void * arg);
|
||||||
|
|
||||||
int ogs_diam_logger_init(int mode)
|
int ogs_diam_logger_init(int mode)
|
||||||
{
|
{
|
||||||
uint32_t mask_peers = HOOK_MASK( HOOK_PEER_CONNECT_SUCCESS );
|
uint32_t mask_peers = HOOK_MASK( HOOK_PEER_CONNECT_SUCCESS );
|
||||||
|
|
||||||
memset(&self, 0, sizeof(struct ogs_diam_logger_t));
|
memset(&self, 0, sizeof(struct ogs_diam_logger_t));
|
||||||
|
|
||||||
self.mode = mode;
|
self.mode = mode;
|
||||||
self.duration = 60; /* 60 seconds */
|
self.duration = 60; /* 60 seconds */
|
||||||
|
|
||||||
CHECK_FCT( fd_hook_register(
|
CHECK_FCT( fd_hook_register(
|
||||||
mask_peers, ogs_diam_logger_cb, NULL, NULL, &logger_hdl) );
|
mask_peers, ogs_diam_logger_cb, NULL, NULL, &logger_hdl) );
|
||||||
|
|
||||||
CHECK_POSIX( pthread_mutex_init(&self.stats_lock, NULL) );
|
CHECK_POSIX( pthread_mutex_init(&self.stats_lock, NULL) );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ogs_diam_logger_final()
|
void ogs_diam_logger_final()
|
||||||
{
|
{
|
||||||
CHECK_FCT_DO( fd_thr_term(&fd_stats_th), );
|
CHECK_FCT_DO( fd_thr_term(&fd_stats_th), );
|
||||||
CHECK_POSIX_DO( pthread_mutex_destroy(&self.stats_lock), );
|
CHECK_POSIX_DO( pthread_mutex_destroy(&self.stats_lock), );
|
||||||
|
|
||||||
if (logger_hdl) { CHECK_FCT_DO( fd_hook_unregister( logger_hdl ), ); }
|
if (logger_hdl) { CHECK_FCT_DO( fd_hook_unregister( logger_hdl ), ); }
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ogs_diam_logger_t* ogs_diam_logger_self()
|
struct ogs_diam_logger_t* ogs_diam_logger_self()
|
||||||
|
@ -64,8 +64,8 @@ struct ogs_diam_logger_t* ogs_diam_logger_self()
|
||||||
|
|
||||||
int ogs_diam_logger_stats_start()
|
int ogs_diam_logger_stats_start()
|
||||||
{
|
{
|
||||||
/* Start the statistics thread */
|
/* Start the statistics thread */
|
||||||
CHECK_POSIX( pthread_create(&fd_stats_th, NULL, diam_stats_worker, NULL) );
|
CHECK_POSIX( pthread_create(&fd_stats_th, NULL, diam_stats_worker, NULL) );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -85,74 +85,74 @@ static void ogs_diam_logger_cb(enum fd_hook_type type, struct msg * msg,
|
||||||
struct peer_hdr * peer, void * other, struct fd_hook_permsgdata *pmd,
|
struct peer_hdr * peer, void * other, struct fd_hook_permsgdata *pmd,
|
||||||
void * regdata)
|
void * regdata)
|
||||||
{
|
{
|
||||||
const char * peer_name = peer ? peer->info.pi_diamid : "<unknown peer>";
|
const char * peer_name = peer ? peer->info.pi_diamid : "<unknown peer>";
|
||||||
|
|
||||||
CHECK_POSIX_DO( pthread_mutex_lock(&mtx), );
|
CHECK_POSIX_DO( pthread_mutex_lock(&mtx), );
|
||||||
|
|
||||||
if (user_handler)
|
if (user_handler)
|
||||||
{
|
{
|
||||||
user_handler(type, msg, peer, other, pmd, regdata);
|
user_handler(type, msg, peer, other, pmd, regdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
/* peers */
|
/* peers */
|
||||||
case HOOK_PEER_CONNECT_SUCCESS:
|
case HOOK_PEER_CONNECT_SUCCESS:
|
||||||
{
|
{
|
||||||
char protobuf[40];
|
char protobuf[40];
|
||||||
if (peer) {
|
if (peer) {
|
||||||
CHECK_FCT_DO(fd_peer_cnx_proto_info(peer, protobuf, sizeof(protobuf)), break );
|
CHECK_FCT_DO(fd_peer_cnx_proto_info(peer, protobuf, sizeof(protobuf)), break );
|
||||||
} else {
|
} else {
|
||||||
protobuf[0] = '-';
|
protobuf[0] = '-';
|
||||||
protobuf[1] = '\0';
|
protobuf[1] = '\0';
|
||||||
}
|
}
|
||||||
ogs_info("CONNECTED TO '%s' (%s):", peer_name, protobuf);
|
ogs_info("CONNECTED TO '%s' (%s):", peer_name, protobuf);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ogs_warn("Unknown type(%d)", type);
|
ogs_warn("Unknown type(%d)", type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK_POSIX_DO( pthread_mutex_unlock(&mtx), );
|
CHECK_POSIX_DO( pthread_mutex_unlock(&mtx), );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function to display statistics periodically */
|
/* Function to display statistics periodically */
|
||||||
static void * diam_stats_worker(void * arg)
|
static void * diam_stats_worker(void * arg)
|
||||||
{
|
{
|
||||||
struct timespec start, now;
|
struct timespec start, now;
|
||||||
struct fd_stats copy;
|
struct fd_stats copy;
|
||||||
|
|
||||||
/* Get the start time */
|
/* Get the start time */
|
||||||
CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &start), );
|
CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &start), );
|
||||||
|
|
||||||
/* Now, loop until canceled */
|
/* Now, loop until canceled */
|
||||||
while (1) {
|
while (1) {
|
||||||
/* Display statistics every XX seconds */
|
/* Display statistics every XX seconds */
|
||||||
sleep(self.duration);
|
sleep(self.duration);
|
||||||
|
|
||||||
/* Now, get the current stats */
|
/* Now, get the current stats */
|
||||||
CHECK_POSIX_DO( pthread_mutex_lock(&self.stats_lock), );
|
CHECK_POSIX_DO( pthread_mutex_lock(&self.stats_lock), );
|
||||||
memcpy(©, &self.stats, sizeof(struct fd_stats));
|
memcpy(©, &self.stats, sizeof(struct fd_stats));
|
||||||
CHECK_POSIX_DO( pthread_mutex_unlock(&self.stats_lock), );
|
CHECK_POSIX_DO( pthread_mutex_unlock(&self.stats_lock), );
|
||||||
|
|
||||||
/* Get the current execution time */
|
/* Get the current execution time */
|
||||||
CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &now), );
|
CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &now), );
|
||||||
|
|
||||||
/* Now, display everything */
|
/* Now, display everything */
|
||||||
ogs_trace("------- fd statistics ---------");
|
ogs_trace("------- fd statistics ---------");
|
||||||
if (now.tv_nsec >= start.tv_nsec)
|
if (now.tv_nsec >= start.tv_nsec)
|
||||||
{
|
{
|
||||||
ogs_trace(" Executing for: %d.%06ld sec",
|
ogs_trace(" Executing for: %d.%06ld sec",
|
||||||
(int)(now.tv_sec - start.tv_sec),
|
(int)(now.tv_sec - start.tv_sec),
|
||||||
(long)(now.tv_nsec - start.tv_nsec) / 1000);
|
(long)(now.tv_nsec - start.tv_nsec) / 1000);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ogs_trace(" Executing for: %d.%06ld sec",
|
ogs_trace(" Executing for: %d.%06ld sec",
|
||||||
(int)(now.tv_sec - 1 - start.tv_sec),
|
(int)(now.tv_sec - 1 - start.tv_sec),
|
||||||
(long)(now.tv_nsec + 1000000000 - start.tv_nsec) / 1000);
|
(long)(now.tv_nsec + 1000000000 - start.tv_nsec) / 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self.mode & FD_MODE_SERVER) {
|
if (self.mode & FD_MODE_SERVER) {
|
||||||
ogs_trace(" Server: %llu message(s) echoed",
|
ogs_trace(" Server: %llu message(s) echoed",
|
||||||
copy.nb_echoed);
|
copy.nb_echoed);
|
||||||
|
@ -169,9 +169,9 @@ static void * diam_stats_worker(void * arg)
|
||||||
ogs_trace(" Average: %ld.%06ld sec.",
|
ogs_trace(" Average: %ld.%06ld sec.",
|
||||||
copy.avg / 1000000, copy.avg % 1000000);
|
copy.avg / 1000000, copy.avg % 1000000);
|
||||||
}
|
}
|
||||||
ogs_trace("-------------------------------------");
|
ogs_trace("-------------------------------------");
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL; /* never called */
|
return NULL; /* never called */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
|
|
||||||
#include "ogs-diameter-common.h"
|
#include "ogs-diameter-common.h"
|
||||||
|
|
||||||
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
||||||
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
||||||
|
|
||||||
struct dict_object *ogs_diam_session_id = NULL;
|
struct dict_object *ogs_diam_session_id = NULL;
|
||||||
struct dict_object *ogs_diam_termination_cause = NULL;
|
struct dict_object *ogs_diam_termination_cause = NULL;
|
||||||
|
@ -107,17 +107,17 @@ int ogs_diam_message_session_id_set(
|
||||||
struct avp *avp;
|
struct avp *avp;
|
||||||
union avp_value val;
|
union avp_value val;
|
||||||
|
|
||||||
/* Create an AVP to hold it */
|
/* Create an AVP to hold it */
|
||||||
CHECK_FCT( fd_msg_avp_new( ogs_diam_session_id, 0, &avp ) );
|
CHECK_FCT( fd_msg_avp_new( ogs_diam_session_id, 0, &avp ) );
|
||||||
|
|
||||||
/* Set its value */
|
/* Set its value */
|
||||||
memset(&val, 0, sizeof(val));
|
memset(&val, 0, sizeof(val));
|
||||||
val.os.data = sid;
|
val.os.data = sid;
|
||||||
val.os.len = sidlen;
|
val.os.len = sidlen;
|
||||||
CHECK_FCT( fd_msg_avp_setvalue( avp, &val ) );
|
CHECK_FCT( fd_msg_avp_setvalue( avp, &val ) );
|
||||||
|
|
||||||
/* Add it to the message */
|
/* Add it to the message */
|
||||||
CHECK_FCT( fd_msg_avp_add( msg, MSG_BRW_FIRST_CHILD, avp ) );
|
CHECK_FCT( fd_msg_avp_add( msg, MSG_BRW_FIRST_CHILD, avp ) );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ bool ogs_diam_app_connected(uint32_t app_id)
|
||||||
struct fd_list *li = NULL;
|
struct fd_list *li = NULL;
|
||||||
struct fd_app *found = NULL;
|
struct fd_app *found = NULL;
|
||||||
|
|
||||||
CHECK_POSIX( pthread_rwlock_rdlock(&fd_g_peers_rw) );
|
CHECK_POSIX( pthread_rwlock_rdlock(&fd_g_peers_rw) );
|
||||||
for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) {
|
for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) {
|
||||||
struct peer_hdr *p = (struct peer_hdr *)li->o;
|
struct peer_hdr *p = (struct peer_hdr *)li->o;
|
||||||
int state = fd_peer_get_state(p);
|
int state = fd_peer_get_state(p);
|
||||||
|
@ -44,7 +44,7 @@ bool ogs_diam_app_connected(uint32_t app_id)
|
||||||
ogs_debug("'%s' STATE[%d] is NOT open ", p->info.pi_diamid, state);
|
ogs_debug("'%s' STATE[%d] is NOT open ", p->info.pi_diamid, state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) );
|
CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) );
|
||||||
|
|
||||||
if (found)
|
if (found)
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
|
|
||||||
#include "ogs-diameter-cx.h"
|
#include "ogs-diameter-cx.h"
|
||||||
|
|
||||||
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
||||||
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
||||||
|
|
||||||
struct dict_object *ogs_diam_cx_application = NULL;
|
struct dict_object *ogs_diam_cx_application = NULL;
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
|
|
||||||
#include "ogs-diameter-gx.h"
|
#include "ogs-diameter-gx.h"
|
||||||
|
|
||||||
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
||||||
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
||||||
|
|
||||||
struct dict_object *ogs_diam_gx_application = NULL;
|
struct dict_object *ogs_diam_gx_application = NULL;
|
||||||
|
|
||||||
|
@ -113,19 +113,19 @@ int ogs_diam_gx_init(void)
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Framed-IPv6-Prefix", &ogs_diam_gx_framed_ipv6_prefix);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Framed-IPv6-Prefix", &ogs_diam_gx_framed_ipv6_prefix);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "IP-CAN-Type", &ogs_diam_gx_ip_can_type);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "IP-CAN-Type", &ogs_diam_gx_ip_can_type);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "QoS-Information", &ogs_diam_gx_qos_information);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "QoS-Information", &ogs_diam_gx_qos_information);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "QoS-Class-Identifier" , &ogs_diam_gx_qos_class_identifier);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "QoS-Class-Identifier" , &ogs_diam_gx_qos_class_identifier);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-UL" , &ogs_diam_gx_max_requested_bandwidth_ul);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-UL" , &ogs_diam_gx_max_requested_bandwidth_ul);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-DL" , &ogs_diam_gx_max_requested_bandwidth_dl);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-DL" , &ogs_diam_gx_max_requested_bandwidth_dl);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Min-Requested-Bandwidth-UL" , &ogs_diam_gx_min_requested_bandwidth_ul);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Min-Requested-Bandwidth-UL" , &ogs_diam_gx_min_requested_bandwidth_ul);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Min-Requested-Bandwidth-DL" , &ogs_diam_gx_min_requested_bandwidth_dl);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Min-Requested-Bandwidth-DL" , &ogs_diam_gx_min_requested_bandwidth_dl);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Guaranteed-Bitrate-UL" , &ogs_diam_gx_guaranteed_bitrate_ul);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Guaranteed-Bitrate-UL" , &ogs_diam_gx_guaranteed_bitrate_ul);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Guaranteed-Bitrate-DL" , &ogs_diam_gx_guaranteed_bitrate_dl);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Guaranteed-Bitrate-DL" , &ogs_diam_gx_guaranteed_bitrate_dl);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Allocation-Retention-Priority" , &ogs_diam_gx_allocation_retention_priority);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Allocation-Retention-Priority" , &ogs_diam_gx_allocation_retention_priority);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Priority-Level", &ogs_diam_gx_priority_level);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Priority-Level", &ogs_diam_gx_priority_level);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Pre-emption-Capability", &ogs_diam_gx_pre_emption_capability);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Pre-emption-Capability", &ogs_diam_gx_pre_emption_capability);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Pre-emption-Vulnerability", &ogs_diam_gx_pre_emption_vulnerability);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Pre-emption-Vulnerability", &ogs_diam_gx_pre_emption_vulnerability);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Aggregate-Max-Bitrate-UL" , &ogs_diam_gx_apn_aggregate_max_bitrate_ul);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Aggregate-Max-Bitrate-UL" , &ogs_diam_gx_apn_aggregate_max_bitrate_ul);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Aggregate-Max-Bitrate-DL" , &ogs_diam_gx_apn_aggregate_max_bitrate_dl);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Aggregate-Max-Bitrate-DL" , &ogs_diam_gx_apn_aggregate_max_bitrate_dl);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-User-Location-Info", &ogs_diam_gx_3gpp_user_location_info);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-User-Location-Info", &ogs_diam_gx_3gpp_user_location_info);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Called-Station-Id", &ogs_diam_gx_called_station_id);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Called-Station-Id", &ogs_diam_gx_called_station_id);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Default-EPS-Bearer-QoS", &ogs_diam_gx_default_eps_bearer_qos);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Default-EPS-Bearer-QoS", &ogs_diam_gx_default_eps_bearer_qos);
|
||||||
|
@ -150,8 +150,8 @@ int ogs_diam_gx_init(void)
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Description", &ogs_diam_gx_media_component_description);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Description", &ogs_diam_gx_media_component_description);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Number", &ogs_diam_gx_media_component_number);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Number", &ogs_diam_gx_media_component_number);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Type", &ogs_diam_gx_media_type);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Type", &ogs_diam_gx_media_type);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RR-Bandwidth" , &ogs_diam_gx_rr_bandwidth);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RR-Bandwidth" , &ogs_diam_gx_rr_bandwidth);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RS-Bandwidth" , &ogs_diam_gx_rs_bandwidth);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RS-Bandwidth" , &ogs_diam_gx_rs_bandwidth);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Codec-Data", &ogs_diam_gx_codec_data);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Codec-Data", &ogs_diam_gx_codec_data);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Sub-Component", &ogs_diam_gx_media_sub_component);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Sub-Component", &ogs_diam_gx_media_sub_component);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flow-Number", &ogs_diam_gx_flow_number);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flow-Number", &ogs_diam_gx_flow_number);
|
||||||
|
|
|
@ -20,8 +20,8 @@
|
||||||
|
|
||||||
#include "ogs-diameter-gy.h"
|
#include "ogs-diameter-gy.h"
|
||||||
|
|
||||||
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
||||||
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
||||||
|
|
||||||
struct dict_object *ogs_diam_gy_application = NULL;
|
struct dict_object *ogs_diam_gy_application = NULL;
|
||||||
|
|
||||||
|
@ -86,70 +86,70 @@ extern int ogs_dict_gy_entry(char *conffile);
|
||||||
|
|
||||||
int ogs_diam_gy_init(void)
|
int ogs_diam_gy_init(void)
|
||||||
{
|
{
|
||||||
application_id_t id = OGS_DIAM_GY_APPLICATION_ID;
|
application_id_t id = OGS_DIAM_GY_APPLICATION_ID;
|
||||||
|
|
||||||
ogs_assert(ogs_dict_gy_entry(NULL) == 0);
|
ogs_assert(ogs_dict_gy_entry(NULL) == 0);
|
||||||
|
|
||||||
CHECK_dict_search(DICT_APPLICATION, APPLICATION_BY_ID, (void *)&id, &ogs_diam_gy_application);
|
CHECK_dict_search(DICT_APPLICATION, APPLICATION_BY_ID, (void *)&id, &ogs_diam_gy_application);
|
||||||
|
|
||||||
CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Request", &ogs_diam_gy_cmd_ccr);
|
CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Request", &ogs_diam_gy_cmd_ccr);
|
||||||
CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Answer", &ogs_diam_gy_cmd_cca);
|
CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Answer", &ogs_diam_gy_cmd_cca);
|
||||||
CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Re-Auth-Request", &ogs_diam_gy_cmd_rar);
|
CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Re-Auth-Request", &ogs_diam_gy_cmd_rar);
|
||||||
CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Re-Auth-Answer", &ogs_diam_gy_cmd_raa);
|
CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Re-Auth-Answer", &ogs_diam_gy_cmd_raa);
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Request-Type", &ogs_diam_gy_cc_request_type);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Request-Type", &ogs_diam_gy_cc_request_type);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Request-Number", &ogs_diam_gy_cc_request_number);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Request-Number", &ogs_diam_gy_cc_request_number);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Requested-Action", &ogs_diam_gy_requested_action);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Requested-Action", &ogs_diam_gy_requested_action);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "AoC-Request-Type", &ogs_diam_gy_aoc_request_type);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "AoC-Request-Type", &ogs_diam_gy_aoc_request_type);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Multiple-Services-Indicator", &ogs_diam_gy_multiple_services_ind);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Multiple-Services-Indicator", &ogs_diam_gy_multiple_services_ind);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Multiple-Services-Credit-Control", &ogs_diam_gy_multiple_services_cc);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Multiple-Services-Credit-Control", &ogs_diam_gy_multiple_services_cc);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Requested-Service-Unit", &ogs_diam_gy_requested_service_unit);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Requested-Service-Unit", &ogs_diam_gy_requested_service_unit);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Used-Service-Unit", &ogs_diam_gy_used_service_unit);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Used-Service-Unit", &ogs_diam_gy_used_service_unit);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Time", &ogs_diam_gy_cc_time);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Time", &ogs_diam_gy_cc_time);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Total-Octets", &ogs_diam_gy_cc_total_octets);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Total-Octets", &ogs_diam_gy_cc_total_octets);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Input-Octets", &ogs_diam_gy_cc_input_octets);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Input-Octets", &ogs_diam_gy_cc_input_octets);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Output-Octets", &ogs_diam_gy_cc_output_octets);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Output-Octets", &ogs_diam_gy_cc_output_octets);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Service-Specific-Units", &ogs_diam_gy_cc_service_specific_units);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CC-Service-Specific-Units", &ogs_diam_gy_cc_service_specific_units);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Reporting-Reason", &ogs_diam_gy_reporting_reason);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Reporting-Reason", &ogs_diam_gy_reporting_reason);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Service-Identifier", &ogs_diam_gy_service_id);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Service-Identifier", &ogs_diam_gy_service_id);
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Service-Information", &ogs_diam_gy_service_information);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Service-Information", &ogs_diam_gy_service_information);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PS-Information", &ogs_diam_gy_ps_information);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PS-Information", &ogs_diam_gy_ps_information);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-Charging-Id", &ogs_diam_gy_3gpp_charging_id);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-Charging-Id", &ogs_diam_gy_3gpp_charging_id);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-PDP-Type", &ogs_diam_gy_3gpp_pdp_type);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-PDP-Type", &ogs_diam_gy_3gpp_pdp_type);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PDP-Address", &ogs_diam_gy_pdp_address);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PDP-Address", &ogs_diam_gy_pdp_address);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "SGSN-Address", &ogs_diam_gy_sgsn_address);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "SGSN-Address", &ogs_diam_gy_sgsn_address);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "GGSN-Address", &ogs_diam_gy_ggsn_address);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "GGSN-Address", &ogs_diam_gy_ggsn_address);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-NSAPI", &ogs_diam_gy_3gpp_nsapi);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-NSAPI", &ogs_diam_gy_3gpp_nsapi);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-Selection-Mode", &ogs_diam_gy_3gpp_selection_mode);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-Selection-Mode", &ogs_diam_gy_3gpp_selection_mode);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-Charging-Characteristics", &ogs_diam_gy_3gpp_charging_characteristics);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-Charging-Characteristics", &ogs_diam_gy_3gpp_charging_characteristics);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "User-Equipment-Info", &ogs_diam_gy_user_equipment_info);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "User-Equipment-Info", &ogs_diam_gy_user_equipment_info);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "User-Equipment-Info-Type", &ogs_diam_gy_user_equipment_info_type);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "User-Equipment-Info-Type", &ogs_diam_gy_user_equipment_info_type);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "User-Equipment-Info-Value", &ogs_diam_gy_user_equipment_info_value);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "User-Equipment-Info-Value", &ogs_diam_gy_user_equipment_info_value);
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Feature-List-ID", &ogs_diam_gy_feature_list_id);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Feature-List-ID", &ogs_diam_gy_feature_list_id);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Feature-List", &ogs_diam_gy_feature_list);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Feature-List", &ogs_diam_gy_feature_list);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "QoS-Information", &ogs_diam_gy_qos_information);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "QoS-Information", &ogs_diam_gy_qos_information);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "QoS-Class-Identifier" , &ogs_diam_gy_qos_class_identifier);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "QoS-Class-Identifier" , &ogs_diam_gy_qos_class_identifier);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-UL" , &ogs_diam_gy_max_requested_bandwidth_ul);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-UL" , &ogs_diam_gy_max_requested_bandwidth_ul);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-DL" , &ogs_diam_gy_max_requested_bandwidth_dl);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-DL" , &ogs_diam_gy_max_requested_bandwidth_dl);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Guaranteed-Bitrate-UL" , &ogs_diam_gy_guaranteed_bitrate_ul);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Guaranteed-Bitrate-UL" , &ogs_diam_gy_guaranteed_bitrate_ul);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Guaranteed-Bitrate-DL" , &ogs_diam_gy_guaranteed_bitrate_dl);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Guaranteed-Bitrate-DL" , &ogs_diam_gy_guaranteed_bitrate_dl);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Allocation-Retention-Priority" , &ogs_diam_gy_allocation_retention_priority);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Allocation-Retention-Priority" , &ogs_diam_gy_allocation_retention_priority);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Priority-Level", &ogs_diam_gy_priority_level);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Priority-Level", &ogs_diam_gy_priority_level);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Pre-emption-Capability", &ogs_diam_gy_pre_emption_capability);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Pre-emption-Capability", &ogs_diam_gy_pre_emption_capability);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Pre-emption-Vulnerability", &ogs_diam_gy_pre_emption_vulnerability);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Pre-emption-Vulnerability", &ogs_diam_gy_pre_emption_vulnerability);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Aggregate-Max-Bitrate-UL" , &ogs_diam_gy_apn_aggregate_max_bitrate_ul);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Aggregate-Max-Bitrate-UL" , &ogs_diam_gy_apn_aggregate_max_bitrate_ul);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Aggregate-Max-Bitrate-DL" , &ogs_diam_gy_apn_aggregate_max_bitrate_dl);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Aggregate-Max-Bitrate-DL" , &ogs_diam_gy_apn_aggregate_max_bitrate_dl);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-RAT-Type" , &ogs_diam_gy_3gpp_rat_type);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-RAT-Type" , &ogs_diam_gy_3gpp_rat_type);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-User-Location-Info", &ogs_diam_gy_3gpp_user_location_info);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-User-Location-Info", &ogs_diam_gy_3gpp_user_location_info);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Called-Station-Id", &ogs_diam_gy_called_station_id);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Called-Station-Id", &ogs_diam_gy_called_station_id);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-MS-TimeZone", &ogs_diam_gy_3gpp_ms_timezone);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-MS-TimeZone", &ogs_diam_gy_3gpp_ms_timezone);
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Charging-Rule-Base-Name", &ogs_diam_gy_charging_rule_base_name);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Charging-Rule-Base-Name", &ogs_diam_gy_charging_rule_base_name);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flows", &ogs_diam_gy_flows);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flows", &ogs_diam_gy_flows);
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-SGSN-MCC-MNC", &ogs_diam_gy_3gpp_sgsn_mcc_mnc);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-SGSN-MCC-MNC", &ogs_diam_gy_3gpp_sgsn_mcc_mnc);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
|
|
||||||
#include "ogs-diameter-rx.h"
|
#include "ogs-diameter-rx.h"
|
||||||
|
|
||||||
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
||||||
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
||||||
|
|
||||||
struct dict_object *ogs_diam_rx_application = NULL;
|
struct dict_object *ogs_diam_rx_application = NULL;
|
||||||
|
|
||||||
|
@ -78,12 +78,12 @@ int ogs_diam_rx_init(void)
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Description", &ogs_diam_rx_media_component_description);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Description", &ogs_diam_rx_media_component_description);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Number", &ogs_diam_rx_media_component_number);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Component-Number", &ogs_diam_rx_media_component_number);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Type", &ogs_diam_rx_media_type);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Type", &ogs_diam_rx_media_type);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-UL" , &ogs_diam_rx_max_requested_bandwidth_ul);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-UL" , &ogs_diam_rx_max_requested_bandwidth_ul);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-DL" , &ogs_diam_rx_max_requested_bandwidth_dl);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Max-Requested-Bandwidth-DL" , &ogs_diam_rx_max_requested_bandwidth_dl);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Min-Requested-Bandwidth-UL" , &ogs_diam_rx_min_requested_bandwidth_ul);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Min-Requested-Bandwidth-UL" , &ogs_diam_rx_min_requested_bandwidth_ul);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Min-Requested-Bandwidth-DL" , &ogs_diam_rx_min_requested_bandwidth_dl);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Min-Requested-Bandwidth-DL" , &ogs_diam_rx_min_requested_bandwidth_dl);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RR-Bandwidth" , &ogs_diam_rx_rr_bandwidth);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RR-Bandwidth" , &ogs_diam_rx_rr_bandwidth);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RS-Bandwidth" , &ogs_diam_rx_rs_bandwidth);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RS-Bandwidth" , &ogs_diam_rx_rs_bandwidth);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flow-Status", &ogs_diam_rx_flow_status);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Flow-Status", &ogs_diam_rx_flow_status);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Codec-Data", &ogs_diam_rx_codec_data);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Codec-Data", &ogs_diam_rx_codec_data);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Sub-Component", &ogs_diam_rx_media_sub_component);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Media-Sub-Component", &ogs_diam_rx_media_sub_component);
|
||||||
|
|
|
@ -33,62 +33,62 @@
|
||||||
|
|
||||||
/* The content of this file follows the same structure as dict_base_proto.c */
|
/* The content of this file follows the same structure as dict_base_proto.c */
|
||||||
|
|
||||||
#define CHECK_dict_new( _type, _data, _parent, _ref ) \
|
#define CHECK_dict_new( _type, _data, _parent, _ref ) \
|
||||||
CHECK_FCT( fd_dict_new( fd_g_config->cnf_dict, (_type), (_data), (_parent), (_ref)) );
|
CHECK_FCT( fd_dict_new( fd_g_config->cnf_dict, (_type), (_data), (_parent), (_ref)) );
|
||||||
|
|
||||||
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
||||||
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
||||||
|
|
||||||
struct local_rules_definition {
|
struct local_rules_definition {
|
||||||
struct dict_avp_request avp_vendor_plus_name;
|
struct dict_avp_request avp_vendor_plus_name;
|
||||||
enum rule_position position;
|
enum rule_position position;
|
||||||
int min;
|
int min;
|
||||||
int max;
|
int max;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define RULE_ORDER( _position ) ((((_position) == RULE_FIXED_HEAD) || ((_position) == RULE_FIXED_TAIL)) ? 1 : 0 )
|
#define RULE_ORDER( _position ) ((((_position) == RULE_FIXED_HEAD) || ((_position) == RULE_FIXED_TAIL)) ? 1 : 0 )
|
||||||
|
|
||||||
/* Attention! This version of the macro uses AVP_BY_NAME_AND_VENDOR, in contrast to most other copies! */
|
/* Attention! This version of the macro uses AVP_BY_NAME_AND_VENDOR, in contrast to most other copies! */
|
||||||
#define PARSE_loc_rules( _rulearray, _parent) { \
|
#define PARSE_loc_rules( _rulearray, _parent) { \
|
||||||
int __ar; \
|
int __ar; \
|
||||||
for (__ar=0; __ar < sizeof(_rulearray) / sizeof((_rulearray)[0]); __ar++) { \
|
for (__ar=0; __ar < sizeof(_rulearray) / sizeof((_rulearray)[0]); __ar++) { \
|
||||||
struct dict_rule_data __data = { NULL, \
|
struct dict_rule_data __data = { NULL, \
|
||||||
(_rulearray)[__ar].position, \
|
(_rulearray)[__ar].position, \
|
||||||
0, \
|
0, \
|
||||||
(_rulearray)[__ar].min, \
|
(_rulearray)[__ar].min, \
|
||||||
(_rulearray)[__ar].max}; \
|
(_rulearray)[__ar].max}; \
|
||||||
__data.rule_order = RULE_ORDER(__data.rule_position); \
|
__data.rule_order = RULE_ORDER(__data.rule_position); \
|
||||||
CHECK_FCT( fd_dict_search( \
|
CHECK_FCT( fd_dict_search( \
|
||||||
fd_g_config->cnf_dict, \
|
fd_g_config->cnf_dict, \
|
||||||
DICT_AVP, \
|
DICT_AVP, \
|
||||||
AVP_BY_NAME_AND_VENDOR, \
|
AVP_BY_NAME_AND_VENDOR, \
|
||||||
&(_rulearray)[__ar].avp_vendor_plus_name, \
|
&(_rulearray)[__ar].avp_vendor_plus_name, \
|
||||||
&__data.rule_avp, 0 ) ); \
|
&__data.rule_avp, 0 ) ); \
|
||||||
if ( !__data.rule_avp ) { \
|
if ( !__data.rule_avp ) { \
|
||||||
TRACE_DEBUG(INFO, "AVP Not found: '%s'", (_rulearray)[__ar].avp_vendor_plus_name.avp_name); \
|
TRACE_DEBUG(INFO, "AVP Not found: '%s'", (_rulearray)[__ar].avp_vendor_plus_name.avp_name); \
|
||||||
return ENOENT; \
|
return ENOENT; \
|
||||||
} \
|
} \
|
||||||
CHECK_FCT_DO( fd_dict_new( fd_g_config->cnf_dict, DICT_RULE, &__data, _parent, NULL), \
|
CHECK_FCT_DO( fd_dict_new( fd_g_config->cnf_dict, DICT_RULE, &__data, _parent, NULL), \
|
||||||
{ \
|
{ \
|
||||||
TRACE_DEBUG(INFO, "Error on rule with AVP '%s'", \
|
TRACE_DEBUG(INFO, "Error on rule with AVP '%s'", \
|
||||||
(_rulearray)[__ar].avp_vendor_plus_name.avp_name); \
|
(_rulearray)[__ar].avp_vendor_plus_name.avp_name); \
|
||||||
return EINVAL; \
|
return EINVAL; \
|
||||||
} ); \
|
} ); \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define enumval_def_u32( _val_, _str_ ) \
|
#define enumval_def_u32( _val_, _str_ ) \
|
||||||
{ _str_, { .u32 = _val_ }}
|
{ _str_, { .u32 = _val_ }}
|
||||||
|
|
||||||
#define enumval_def_os( _len_, _val_, _str_ ) \
|
#define enumval_def_os( _len_, _val_, _str_ ) \
|
||||||
{ _str_, { .os = { .data = (unsigned char *)_val_, .len = _len_ }}}
|
{ _str_, { .os = { .data = (unsigned char *)_val_, .len = _len_ }}}
|
||||||
|
|
||||||
int ogs_dict_s6a_entry(char *conffile)
|
int ogs_dict_s6a_entry(char *conffile)
|
||||||
{
|
{
|
||||||
struct dict_object *s6a;
|
struct dict_object *s6a;
|
||||||
TRACE_ENTRY("%p", conffile);
|
TRACE_ENTRY("%p", conffile);
|
||||||
|
|
||||||
/* Applications section */
|
/* Applications section */
|
||||||
{
|
{
|
||||||
struct dict_object * vendor;
|
struct dict_object * vendor;
|
||||||
CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_VENDOR, VENDOR_BY_NAME, "3GPP", &vendor, ENOENT));
|
CHECK_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_VENDOR, VENDOR_BY_NAME, "3GPP", &vendor, ENOENT));
|
||||||
|
@ -96,8 +96,8 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
CHECK_FCT(fd_dict_new(fd_g_config->cnf_dict, DICT_APPLICATION, &app_data, vendor, &s6a));
|
CHECK_FCT(fd_dict_new(fd_g_config->cnf_dict, DICT_APPLICATION, &app_data, vendor, &s6a));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* AVP section */
|
/* AVP section */
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
/* AIR-Flags AVP - 3GPP TS 29.272 #7.3.201 */
|
/* AIR-Flags AVP - 3GPP TS 29.272 #7.3.201 */
|
||||||
struct dict_avp_data data = {
|
struct dict_avp_data data = {
|
||||||
|
@ -111,155 +111,155 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
CHECK_dict_new(DICT_AVP, &data, NULL, NULL);
|
CHECK_dict_new(DICT_AVP, &data, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Terminal Information AVP - 3GPP TS 29.272 #7.3.3 */
|
/* Terminal Information AVP - 3GPP TS 29.272 #7.3.3 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_vendor = 10415, .avp_name = "IMEI" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "IMEI" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "3GPP2-MEID" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "3GPP2-MEID" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Software-Version" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Software-Version" }, RULE_OPTIONAL, -1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Terminal-Information", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Terminal-Information", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Requested-EUTRAN-Authentication-Info AVP - 3GPP TS 29.272 #7.3.11 */
|
/* Requested-EUTRAN-Authentication-Info AVP - 3GPP TS 29.272 #7.3.11 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Number-Of-Requested-Vectors" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Number-Of-Requested-Vectors" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Immediate-Response-Preferred" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Immediate-Response-Preferred" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Re-Synchronization-Info" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Re-Synchronization-Info" }, RULE_OPTIONAL, -1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Requested-EUTRAN-Authentication-Info", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Requested-EUTRAN-Authentication-Info", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Requested-UTRAN-GERAN-Authentication-Info AVP - 3GPP TS 29.272 #7.3.12 */
|
/* Requested-UTRAN-GERAN-Authentication-Info AVP - 3GPP TS 29.272 #7.3.12 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Number-Of-Requested-Vectors" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Number-Of-Requested-Vectors" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Immediate-Response-Preferred" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Immediate-Response-Preferred" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Re-Synchronization-Info" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Re-Synchronization-Info" }, RULE_OPTIONAL, -1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Requested-UTRAN-GERAN-Authentication-Info", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Requested-UTRAN-GERAN-Authentication-Info", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* E-UTRAN-Vector - 3GPP TS 29.272 #7.3.18 */
|
/* E-UTRAN-Vector - 3GPP TS 29.272 #7.3.18 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Item-Number" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Item-Number" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "RAND" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "RAND" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "XRES" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "XRES" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "AUTN" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "AUTN" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "KASME" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "KASME" }, RULE_REQUIRED, -1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "E-UTRAN-Vector", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "E-UTRAN-Vector", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* UTRAN-Vector - 3GPP TS 29.272 #7.3.19 */
|
/* UTRAN-Vector - 3GPP TS 29.272 #7.3.19 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Item-Number" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Item-Number" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "RAND" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "RAND" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "XRES" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "XRES" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "AUTN" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "AUTN" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Confidentiality-Key" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Confidentiality-Key" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Integrity-Key" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Integrity-Key" }, RULE_REQUIRED, -1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "UTRAN-Vector", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "UTRAN-Vector", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* GERAN-Vector - 3GPP TS 29.272 #7.3.20 */
|
/* GERAN-Vector - 3GPP TS 29.272 #7.3.20 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Item-Number" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Item-Number" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "RAND" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "RAND" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "SRES" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "SRES" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Kc" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Kc" }, RULE_REQUIRED, -1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "GERAN-Vector", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "GERAN-Vector", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Authentication-Info - 3GPP TS 29.272 #7.3.17 */
|
/* Authentication-Info - 3GPP TS 29.272 #7.3.17 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_vendor = 10415, .avp_name = "E-UTRAN-Vector" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "E-UTRAN-Vector" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "UTRAN-Vector" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "UTRAN-Vector" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "GERAN-Vector" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "GERAN-Vector" }, RULE_OPTIONAL, -1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Authentication-Info", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Authentication-Info", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EPS-Subscribed-QoS-Profile AVP - 3GPP TS 29.272 #7.3.37 */
|
/* EPS-Subscribed-QoS-Profile AVP - 3GPP TS 29.272 #7.3.37 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_vendor = 10415, .avp_name = "QoS-Class-Identifier" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "QoS-Class-Identifier" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Allocation-Retention-Priority" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Allocation-Retention-Priority" }, RULE_REQUIRED, -1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "EPS-Subscribed-QoS-Profile", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "EPS-Subscribed-QoS-Profile", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* AMBR AVP - 3GPP TS 29.272 #7.3.41 */
|
/* AMBR AVP - 3GPP TS 29.272 #7.3.41 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Max-Requested-Bandwidth-UL" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Max-Requested-Bandwidth-UL" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Max-Requested-Bandwidth-DL" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Max-Requested-Bandwidth-DL" }, RULE_REQUIRED, -1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "AMBR", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "AMBR", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Specific-APN-Info AVP - 3GPP TS 29.272 #7.3.82 */
|
/* Specific-APN-Info AVP - 3GPP TS 29.272 #7.3.82 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_name = "Service-Selection" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_name = "Service-Selection" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_name = "MIP6-Agent-Info" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_name = "MIP6-Agent-Info" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Visited-Network-Identifier" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Visited-Network-Identifier" }, RULE_OPTIONAL, -1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Specific-APN-Info", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Specific-APN-Info", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* APN-Configuration AVP - 3GPP TS 29.272 #7.3.35 */
|
/* APN-Configuration AVP - 3GPP TS 29.272 #7.3.35 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Context-Identifier" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Context-Identifier" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Served-Party-IP-Address" }, RULE_OPTIONAL, -1, 2 },
|
{ { .avp_vendor = 10415, .avp_name = "Served-Party-IP-Address" }, RULE_OPTIONAL, -1, 2 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "PDN-Type" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "PDN-Type" }, RULE_REQUIRED, -1, 1 },
|
||||||
|
@ -275,31 +275,31 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
{ { .avp_vendor = 10415, .avp_name = "APN-OI-Replacement" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "APN-OI-Replacement" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "SIPTO-Permission" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "SIPTO-Permission" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "LIPA-Permission" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "LIPA-Permission" }, RULE_OPTIONAL, -1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Configuration", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Configuration", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* APN-Configuration-Profile AVP - 3GPP TS 29.272 #7.3.34 */
|
/* APN-Configuration-Profile AVP - 3GPP TS 29.272 #7.3.34 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Context-Identifier" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Context-Identifier" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "All-APN-Configurations-Included-Indicator" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "All-APN-Configurations-Included-Indicator" }, RULE_REQUIRED, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "APN-Configuration" }, RULE_REQUIRED, -1, -1 },
|
{ { .avp_vendor = 10415, .avp_name = "APN-Configuration" }, RULE_REQUIRED, -1, -1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Configuration-Profile", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Configuration-Profile", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Subscription-Data AVP - 3GPP TS 29.272 #7.3.2 */
|
/* Subscription-Data AVP - 3GPP TS 29.272 #7.3.2 */
|
||||||
{
|
{
|
||||||
struct dict_object * avp;
|
struct dict_object * avp;
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Subscriber-Status" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Subscriber-Status" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "MSISDN" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "MSISDN" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "STN-SR" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "STN-SR" }, RULE_OPTIONAL, -1, 1 },
|
||||||
|
@ -326,18 +326,18 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
{ { .avp_vendor = 10415, .avp_name = "VPLMN-LIPA-Allowed" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "VPLMN-LIPA-Allowed" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "Relay-Node-Indicator" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "Relay-Node-Indicator" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_vendor = 10415, .avp_name = "MDT-User-Consent" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "MDT-User-Consent" }, RULE_OPTIONAL, -1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscription-Data", &avp);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscription-Data", &avp);
|
||||||
PARSE_loc_rules( rules, avp );
|
PARSE_loc_rules( rules, avp );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Command section */
|
/* Command section */
|
||||||
{
|
{
|
||||||
/* S6A-Update Location Request - 3GPP TS 29.272 #7.2.3 */
|
/* S6A-Update Location Request - 3GPP TS 29.272 #7.2.3 */
|
||||||
{
|
{
|
||||||
struct dict_object * cmd;
|
struct dict_object * cmd;
|
||||||
struct dict_cmd_data data = {
|
struct dict_cmd_data data = {
|
||||||
316, /* Code */
|
316, /* Code */
|
||||||
"Update-Location-Request", /* Name */
|
"Update-Location-Request", /* Name */
|
||||||
|
@ -372,9 +372,9 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
PARSE_loc_rules(rules, cmd);
|
PARSE_loc_rules(rules, cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* S6A-Update Location Answer - 3GPP TS 29.272 #7.2.4 */
|
/* S6A-Update Location Answer - 3GPP TS 29.272 #7.2.4 */
|
||||||
{
|
{
|
||||||
struct dict_object * cmd;
|
struct dict_object * cmd;
|
||||||
struct dict_cmd_data data = {
|
struct dict_cmd_data data = {
|
||||||
316, /* Code */
|
316, /* Code */
|
||||||
"Update-Location-Answer", /* Name */
|
"Update-Location-Answer", /* Name */
|
||||||
|
@ -402,9 +402,9 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
PARSE_loc_rules(rules, cmd);
|
PARSE_loc_rules(rules, cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* S6A-Authentication-Information-Request - 3GPP TS 29.272 #7.2.4 */
|
/* S6A-Authentication-Information-Request - 3GPP TS 29.272 #7.2.4 */
|
||||||
{
|
{
|
||||||
struct dict_object * cmd;
|
struct dict_object * cmd;
|
||||||
struct dict_cmd_data data = {
|
struct dict_cmd_data data = {
|
||||||
318, /* Code */
|
318, /* Code */
|
||||||
"Authentication-Information-Request", /* Name */
|
"Authentication-Information-Request", /* Name */
|
||||||
|
@ -434,9 +434,9 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
PARSE_loc_rules(rules, cmd);
|
PARSE_loc_rules(rules, cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* S6A-Authentication-Information-Answer - 3GPP TS 29.272 #7.2.6 */
|
/* S6A-Authentication-Information-Answer - 3GPP TS 29.272 #7.2.6 */
|
||||||
{
|
{
|
||||||
struct dict_object * cmd;
|
struct dict_object * cmd;
|
||||||
struct dict_cmd_data data = {
|
struct dict_cmd_data data = {
|
||||||
318, /* Code */
|
318, /* Code */
|
||||||
"Authentication-Information-Answer", /* Name */
|
"Authentication-Information-Answer", /* Name */
|
||||||
|
@ -464,17 +464,17 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
PARSE_loc_rules(rules, cmd);
|
PARSE_loc_rules(rules, cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Purge-UE-Request (PUR) Command - 3GPP TS 29.272 #7.2.13 */
|
/* Purge-UE-Request (PUR) Command - 3GPP TS 29.272 #7.2.13 */
|
||||||
{
|
{
|
||||||
struct dict_object * cmd;
|
struct dict_object * cmd;
|
||||||
struct dict_cmd_data data = {
|
struct dict_cmd_data data = {
|
||||||
321, /* Code */
|
321, /* Code */
|
||||||
"Purge-UE-Request", /* Name */
|
"Purge-UE-Request", /* Name */
|
||||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */
|
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||||
};
|
};
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
|
{ { .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
|
||||||
{ { .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_name = "Auth-Session-State" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_name = "Auth-Session-State" }, RULE_REQUIRED, -1, 1 },
|
||||||
|
@ -491,23 +491,23 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
#endif
|
#endif
|
||||||
{ { .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
|
||||||
{ { .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
|
CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
|
||||||
PARSE_loc_rules( rules, cmd );
|
PARSE_loc_rules( rules, cmd );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Purge-UE-Answer (PUA) Command - 3GPP TS 29.272 #7.2.14 */
|
/* Purge-UE-Answer (PUA) Command - 3GPP TS 29.272 #7.2.14 */
|
||||||
{
|
{
|
||||||
struct dict_object * cmd;
|
struct dict_object * cmd;
|
||||||
struct dict_cmd_data data = {
|
struct dict_cmd_data data = {
|
||||||
321, /* Code */
|
321, /* Code */
|
||||||
"Purge-UE-Answer", /* Name */
|
"Purge-UE-Answer", /* Name */
|
||||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||||
CMD_FLAG_PROXIABLE /* Fixed flag values */
|
CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||||
};
|
};
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
|
{ { .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
|
||||||
{ { .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_name = "Result-Code" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_name = "Result-Code" }, RULE_OPTIONAL, -1, 1 },
|
||||||
|
@ -520,23 +520,23 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
{ { .avp_name = "Failed-AVP" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Failed-AVP" }, RULE_OPTIONAL, -1, -1 },
|
||||||
{ { .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
|
||||||
{ { .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
|
CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
|
||||||
PARSE_loc_rules( rules, cmd );
|
PARSE_loc_rules( rules, cmd );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cancel-Location-Request (CLR) Command - 3GPP TS 29.272 #7.2.7 */
|
/* Cancel-Location-Request (CLR) Command - 3GPP TS 29.272 #7.2.7 */
|
||||||
{
|
{
|
||||||
struct dict_object * cmd;
|
struct dict_object * cmd;
|
||||||
struct dict_cmd_data data = {
|
struct dict_cmd_data data = {
|
||||||
317, /* Code */
|
317, /* Code */
|
||||||
"Cancel-Location-Request", /* Name */
|
"Cancel-Location-Request", /* Name */
|
||||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */
|
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||||
};
|
};
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
|
{ { .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
|
||||||
{ { .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_name = "Auth-Session-State" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_name = "Auth-Session-State" }, RULE_REQUIRED, -1, 1 },
|
||||||
|
@ -550,23 +550,23 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
{ { .avp_vendor = 10415, .avp_name = "CLR-Flags" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "CLR-Flags" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
|
||||||
{ { .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
|
CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
|
||||||
PARSE_loc_rules( rules, cmd );
|
PARSE_loc_rules( rules, cmd );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cancel-Location-Answer (CLA) Command - 3GPP TS 29.272 #7.2.8 */
|
/* Cancel-Location-Answer (CLA) Command - 3GPP TS 29.272 #7.2.8 */
|
||||||
{
|
{
|
||||||
struct dict_object * cmd;
|
struct dict_object * cmd;
|
||||||
struct dict_cmd_data data = {
|
struct dict_cmd_data data = {
|
||||||
317, /* Code */
|
317, /* Code */
|
||||||
"Cancel-Location-Answer", /* Name */
|
"Cancel-Location-Answer", /* Name */
|
||||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||||
CMD_FLAG_PROXIABLE /* Fixed flag values */
|
CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||||
};
|
};
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
|
{ { .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
|
||||||
{ { .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_name = "Result-Code" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_name = "Result-Code" }, RULE_OPTIONAL, -1, 1 },
|
||||||
|
@ -577,23 +577,23 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
{ { .avp_name = "Failed-AVP" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Failed-AVP" }, RULE_OPTIONAL, -1, -1 },
|
||||||
{ { .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
|
||||||
{ { .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
|
CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
|
||||||
PARSE_loc_rules( rules, cmd );
|
PARSE_loc_rules( rules, cmd );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Insert-Subscriber-Data-Request (IDR) Command - 3GPP TS 29.272 #7.2.9 */
|
/* Insert-Subscriber-Data-Request (IDR) Command - 3GPP TS 29.272 #7.2.9 */
|
||||||
{
|
{
|
||||||
struct dict_object * cmd;
|
struct dict_object * cmd;
|
||||||
struct dict_cmd_data data = {
|
struct dict_cmd_data data = {
|
||||||
319, /* Code */
|
319, /* Code */
|
||||||
"Insert-Subscriber-Data-Request", /* Name */
|
"Insert-Subscriber-Data-Request", /* Name */
|
||||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */
|
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||||
};
|
};
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
|
{ { .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
|
||||||
{ { .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_name = "Auth-Session-State" }, RULE_REQUIRED, -1, 1 },
|
{ { .avp_name = "Auth-Session-State" }, RULE_REQUIRED, -1, 1 },
|
||||||
|
@ -607,23 +607,23 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
{ { .avp_vendor = 10415, .avp_name = "IDR-Flags" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_vendor = 10415, .avp_name = "IDR-Flags" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
|
||||||
{ { .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
|
CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
|
||||||
PARSE_loc_rules( rules, cmd );
|
PARSE_loc_rules( rules, cmd );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Insert-Subscriber-Data-Answer (IDA) Command - 3GPP TS 29.272 #7.2.10 */
|
/* Insert-Subscriber-Data-Answer (IDA) Command - 3GPP TS 29.272 #7.2.10 */
|
||||||
{
|
{
|
||||||
struct dict_object * cmd;
|
struct dict_object * cmd;
|
||||||
struct dict_cmd_data data = {
|
struct dict_cmd_data data = {
|
||||||
319, /* Code */
|
319, /* Code */
|
||||||
"Insert-Subscriber-Data-Answer", /* Name */
|
"Insert-Subscriber-Data-Answer", /* Name */
|
||||||
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
|
||||||
CMD_FLAG_PROXIABLE /* Fixed flag values */
|
CMD_FLAG_PROXIABLE /* Fixed flag values */
|
||||||
};
|
};
|
||||||
struct local_rules_definition rules[] =
|
struct local_rules_definition rules[] =
|
||||||
{
|
{
|
||||||
{ { .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
|
{ { .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
|
||||||
{ { .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
|
||||||
{ { .avp_name = "Result-Code" }, RULE_OPTIONAL, -1, 1 },
|
{ { .avp_name = "Result-Code" }, RULE_OPTIONAL, -1, 1 },
|
||||||
|
@ -642,16 +642,16 @@ int ogs_dict_s6a_entry(char *conffile)
|
||||||
{ { .avp_name = "Failed-AVP" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Failed-AVP" }, RULE_OPTIONAL, -1, -1 },
|
||||||
{ { .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
|
||||||
{ { .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
|
{ { .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
|
CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
|
||||||
PARSE_loc_rules( rules, cmd );
|
PARSE_loc_rules( rules, cmd );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D( "Extension 'Dictionary definitions for DCCA 3GPP S6A' initialized");
|
LOG_D( "Extension 'Dictionary definitions for DCCA 3GPP S6A' initialized");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 /* modified by acetcom */
|
#if 0 /* modified by acetcom */
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
|
|
||||||
#include "ogs-diameter-s6a.h"
|
#include "ogs-diameter-s6a.h"
|
||||||
|
|
||||||
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
||||||
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
||||||
|
|
||||||
struct dict_object *ogs_diam_s6a_application = NULL;
|
struct dict_object *ogs_diam_s6a_application = NULL;
|
||||||
|
|
||||||
|
@ -166,5 +166,5 @@ int ogs_diam_s6a_init(void)
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "MSISDN", &ogs_diam_s6a_msisdn);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "MSISDN", &ogs_diam_s6a_msisdn);
|
||||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "A-MSISDN", &ogs_diam_s6a_a_msisdn);
|
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "A-MSISDN", &ogs_diam_s6a_a_msisdn);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
|
|
||||||
#include "ogs-diameter-s6b.h"
|
#include "ogs-diameter-s6b.h"
|
||||||
|
|
||||||
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
||||||
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
||||||
|
|
||||||
struct dict_object *ogs_diam_s6b_application = NULL;
|
struct dict_object *ogs_diam_s6b_application = NULL;
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
|
|
||||||
#include "ogs-diameter-swx.h"
|
#include "ogs-diameter-swx.h"
|
||||||
|
|
||||||
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
||||||
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
||||||
|
|
||||||
struct dict_object *ogs_diam_swx_application = NULL;
|
struct dict_object *ogs_diam_swx_application = NULL;
|
||||||
|
|
||||||
|
|
|
@ -321,14 +321,14 @@ int ogs_sctp_sendmsg(ogs_sock_t *sock, const void *msg, size_t len,
|
||||||
int ogs_sctp_recvmsg(ogs_sock_t *sock, void *msg, size_t len,
|
int ogs_sctp_recvmsg(ogs_sock_t *sock, void *msg, size_t len,
|
||||||
ogs_sockaddr_t *from, ogs_sctp_info_t *sinfo, int *msg_flags)
|
ogs_sockaddr_t *from, ogs_sctp_info_t *sinfo, int *msg_flags)
|
||||||
{
|
{
|
||||||
struct socket *socket = (struct socket *)sock;
|
struct socket *socket = (struct socket *)sock;
|
||||||
ogs_sockaddr_t addr;
|
ogs_sockaddr_t addr;
|
||||||
ssize_t n = 0;
|
ssize_t n = 0;
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
socklen_t addrlen = sizeof(struct sockaddr_storage);
|
socklen_t addrlen = sizeof(struct sockaddr_storage);
|
||||||
socklen_t infolen;
|
socklen_t infolen;
|
||||||
struct sctp_rcvinfo rcv_info;
|
struct sctp_rcvinfo rcv_info;
|
||||||
unsigned int infotype = 0;
|
unsigned int infotype = 0;
|
||||||
|
|
||||||
ogs_assert(socket);
|
ogs_assert(socket);
|
||||||
|
|
||||||
|
|
|
@ -39,42 +39,42 @@
|
||||||
|
|
||||||
static int utun_open(int unit, char *ifname, socklen_t maxlen)
|
static int utun_open(int unit, char *ifname, socklen_t maxlen)
|
||||||
{
|
{
|
||||||
struct sockaddr_ctl addr;
|
struct sockaddr_ctl addr;
|
||||||
struct ctl_info info;
|
struct ctl_info info;
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
ogs_assert(ifname);
|
ogs_assert(ifname);
|
||||||
ogs_assert(maxlen);
|
ogs_assert(maxlen);
|
||||||
|
|
||||||
fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL);
|
fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL);
|
||||||
if (fd < 0) return fd;
|
if (fd < 0) return fd;
|
||||||
|
|
||||||
bzero(&info, sizeof (info));
|
bzero(&info, sizeof (info));
|
||||||
strncpy(info.ctl_name, UTUN_CONTROL_NAME, MAX_KCTL_NAME);
|
strncpy(info.ctl_name, UTUN_CONTROL_NAME, MAX_KCTL_NAME);
|
||||||
|
|
||||||
err = ioctl(fd, CTLIOCGINFO, &info);
|
err = ioctl(fd, CTLIOCGINFO, &info);
|
||||||
if (err != 0) goto on_error;
|
if (err != 0) goto on_error;
|
||||||
|
|
||||||
addr.sc_len = sizeof(addr);
|
addr.sc_len = sizeof(addr);
|
||||||
addr.sc_family = AF_SYSTEM;
|
addr.sc_family = AF_SYSTEM;
|
||||||
addr.ss_sysaddr = AF_SYS_CONTROL;
|
addr.ss_sysaddr = AF_SYS_CONTROL;
|
||||||
addr.sc_id = info.ctl_id;
|
addr.sc_id = info.ctl_id;
|
||||||
addr.sc_unit = unit + 1;
|
addr.sc_unit = unit + 1;
|
||||||
|
|
||||||
err = connect(fd, (struct sockaddr *)&addr, sizeof (addr));
|
err = connect(fd, (struct sockaddr *)&addr, sizeof (addr));
|
||||||
if (err != 0) goto on_error;
|
if (err != 0) goto on_error;
|
||||||
|
|
||||||
err = getsockopt(fd, SYSPROTO_CONTROL, UTUN_OPT_IFNAME, ifname, &maxlen);
|
err = getsockopt(fd, SYSPROTO_CONTROL, UTUN_OPT_IFNAME, ifname, &maxlen);
|
||||||
if (err != 0) goto on_error;
|
if (err != 0) goto on_error;
|
||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
close(fd);
|
close(fd);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -118,51 +118,51 @@ static int tun_set_ipv4(char *ifname,
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
struct ifaliasreq ifa;
|
struct ifaliasreq ifa;
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
struct sockaddr_in mask;
|
struct sockaddr_in mask;
|
||||||
|
|
||||||
char buf[512];
|
char buf[512];
|
||||||
int len;
|
int len;
|
||||||
struct rt_msghdr *rtm;
|
struct rt_msghdr *rtm;
|
||||||
struct sockaddr_in dst, gw;
|
struct sockaddr_in dst, gw;
|
||||||
struct sockaddr_in *paddr;
|
struct sockaddr_in *paddr;
|
||||||
|
|
||||||
ogs_assert(ipaddr);
|
ogs_assert(ipaddr);
|
||||||
ogs_assert(ipsub);
|
ogs_assert(ipsub);
|
||||||
|
|
||||||
fd = socket(ipaddr->family, SOCK_DGRAM, 0);
|
fd = socket(ipaddr->family, SOCK_DGRAM, 0);
|
||||||
|
|
||||||
(void)memset(&ifa, '\0', sizeof ifa);
|
(void)memset(&ifa, '\0', sizeof ifa);
|
||||||
(void)strlcpy(ifa.ifra_name, ifname, sizeof ifa.ifra_name);
|
(void)strlcpy(ifa.ifra_name, ifname, sizeof ifa.ifra_name);
|
||||||
|
|
||||||
(void)memset(&ifr, '\0', sizeof ifr);
|
(void)memset(&ifr, '\0', sizeof ifr);
|
||||||
(void)strlcpy(ifr.ifr_name, ifname, sizeof ifr.ifr_name);
|
(void)strlcpy(ifr.ifr_name, ifname, sizeof ifr.ifr_name);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* Delete previously assigned address */
|
/* Delete previously assigned address */
|
||||||
(void)ioctl(fd, SIOCDIFADDR, &ifr);
|
(void)ioctl(fd, SIOCDIFADDR, &ifr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
(void)memset(&addr, '\0', sizeof(addr));
|
(void)memset(&addr, '\0', sizeof(addr));
|
||||||
addr.sin_family = ipaddr->family;
|
addr.sin_family = ipaddr->family;
|
||||||
addr.sin_addr.s_addr = ipaddr->sub[0];
|
addr.sin_addr.s_addr = ipaddr->sub[0];
|
||||||
addr.sin_len = sizeof(addr);
|
addr.sin_len = sizeof(addr);
|
||||||
(void)memcpy(&ifa.ifra_addr, &addr, sizeof(addr));
|
(void)memcpy(&ifa.ifra_addr, &addr, sizeof(addr));
|
||||||
(void)memcpy(&ifa.ifra_broadaddr, &addr, sizeof(addr));
|
(void)memcpy(&ifa.ifra_broadaddr, &addr, sizeof(addr));
|
||||||
|
|
||||||
(void)memset(&mask, '\0', sizeof(mask));
|
(void)memset(&mask, '\0', sizeof(mask));
|
||||||
mask.sin_family = ipaddr->family;
|
mask.sin_family = ipaddr->family;
|
||||||
mask.sin_addr.s_addr = ipaddr->mask[0];
|
mask.sin_addr.s_addr = ipaddr->mask[0];
|
||||||
mask.sin_len = sizeof(mask);
|
mask.sin_len = sizeof(mask);
|
||||||
(void)memcpy(&ifa.ifra_mask, &mask, sizeof(ifa.ifra_mask));
|
(void)memcpy(&ifa.ifra_mask, &mask, sizeof(ifa.ifra_mask));
|
||||||
|
|
||||||
if (ioctl(fd, SIOCAIFADDR, &ifa) == -1) {
|
if (ioctl(fd, SIOCAIFADDR, &ifa) == -1) {
|
||||||
ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno,
|
ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno,
|
||||||
"Can't IP address : dev[%s]", ifname);
|
"Can't IP address : dev[%s]", ifname);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
close(fd); /* SOCK_DGRAM */
|
close(fd); /* SOCK_DGRAM */
|
||||||
|
|
||||||
|
@ -183,27 +183,27 @@ static int tun_set_ipv4(char *ifname,
|
||||||
rtm->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
|
rtm->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
|
||||||
paddr = (struct sockaddr_in *)(rtm + 1);
|
paddr = (struct sockaddr_in *)(rtm + 1);
|
||||||
|
|
||||||
(void)memset(&dst, '\0', sizeof(dst));
|
(void)memset(&dst, '\0', sizeof(dst));
|
||||||
dst.sin_family = ipaddr->family;
|
dst.sin_family = ipaddr->family;
|
||||||
dst.sin_addr.s_addr = ipsub->sub[0];
|
dst.sin_addr.s_addr = ipsub->sub[0];
|
||||||
dst.sin_len = sizeof(dst);
|
dst.sin_len = sizeof(dst);
|
||||||
(void)memcpy(paddr, &dst, sizeof(dst));
|
(void)memcpy(paddr, &dst, sizeof(dst));
|
||||||
paddr = (struct sockaddr_in *)((char *)paddr +
|
paddr = (struct sockaddr_in *)((char *)paddr +
|
||||||
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
||||||
|
|
||||||
(void)memset(&gw, '\0', sizeof(gw));
|
(void)memset(&gw, '\0', sizeof(gw));
|
||||||
gw.sin_family = ipaddr->family;
|
gw.sin_family = ipaddr->family;
|
||||||
gw.sin_addr.s_addr = ipaddr->sub[0];
|
gw.sin_addr.s_addr = ipaddr->sub[0];
|
||||||
gw.sin_len = sizeof(gw);
|
gw.sin_len = sizeof(gw);
|
||||||
(void)memcpy(paddr, &gw, sizeof(gw));
|
(void)memcpy(paddr, &gw, sizeof(gw));
|
||||||
paddr = (struct sockaddr_in *)((char *)paddr +
|
paddr = (struct sockaddr_in *)((char *)paddr +
|
||||||
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
||||||
|
|
||||||
(void)memset(&mask, '\0', sizeof(mask));
|
(void)memset(&mask, '\0', sizeof(mask));
|
||||||
mask.sin_family = ipaddr->family;
|
mask.sin_family = ipaddr->family;
|
||||||
mask.sin_addr.s_addr = ipsub->mask[0];
|
mask.sin_addr.s_addr = ipsub->mask[0];
|
||||||
mask.sin_len = sizeof(mask);
|
mask.sin_len = sizeof(mask);
|
||||||
(void)memcpy(paddr, &mask, sizeof(mask));
|
(void)memcpy(paddr, &mask, sizeof(mask));
|
||||||
paddr = (struct sockaddr_in *)((char *)paddr +
|
paddr = (struct sockaddr_in *)((char *)paddr +
|
||||||
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
||||||
|
|
||||||
|
@ -217,7 +217,7 @@ static int tun_set_ipv4(char *ifname,
|
||||||
|
|
||||||
close(fd); /* PF_ROUTE, SOCK_RAW */
|
close(fd); /* PF_ROUTE, SOCK_RAW */
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tun_set_ipv6(char *ifname,
|
static int tun_set_ipv6(char *ifname,
|
||||||
|
@ -263,54 +263,54 @@ static int tun_set_ipv6(char *ifname,
|
||||||
#else /* IPv6 Setting API is not working in UTUN */
|
#else /* IPv6 Setting API is not working in UTUN */
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
struct in6_aliasreq ifa;
|
struct in6_aliasreq ifa;
|
||||||
struct in6_ifreq ifr;
|
struct in6_ifreq ifr;
|
||||||
struct sockaddr_in6 addr;
|
struct sockaddr_in6 addr;
|
||||||
struct sockaddr_in6 mask;
|
struct sockaddr_in6 mask;
|
||||||
|
|
||||||
char buf[512];
|
char buf[512];
|
||||||
int len;
|
int len;
|
||||||
struct rt_msghdr *rtm;
|
struct rt_msghdr *rtm;
|
||||||
struct sockaddr_in6 dst, gw;
|
struct sockaddr_in6 dst, gw;
|
||||||
struct sockaddr_in6 *paddr;
|
struct sockaddr_in6 *paddr;
|
||||||
|
|
||||||
ogs_assert(ipaddr);
|
ogs_assert(ipaddr);
|
||||||
ogs_assert(ipsub);
|
ogs_assert(ipsub);
|
||||||
|
|
||||||
fd = socket(ipaddr->family, SOCK_DGRAM, 0);
|
fd = socket(ipaddr->family, SOCK_DGRAM, 0);
|
||||||
|
|
||||||
(void)memset(&ifa, '\0', sizeof ifa);
|
(void)memset(&ifa, '\0', sizeof ifa);
|
||||||
(void)strlcpy(ifa.ifra_name, ifname, sizeof ifa.ifra_name);
|
(void)strlcpy(ifa.ifra_name, ifname, sizeof ifa.ifra_name);
|
||||||
|
|
||||||
(void)memset(&ifr, '\0', sizeof ifr);
|
(void)memset(&ifr, '\0', sizeof ifr);
|
||||||
(void)strlcpy(ifr.ifr_name, ifname, sizeof ifr.ifr_name);
|
(void)strlcpy(ifr.ifr_name, ifname, sizeof ifr.ifr_name);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* Delete previously assigned address */
|
/* Delete previously assigned address */
|
||||||
(void)ioctl(fd, SIOCDIFADDR, &ifr);
|
(void)ioctl(fd, SIOCDIFADDR, &ifr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
(void)memset(&addr, '\0', sizeof(addr));
|
(void)memset(&addr, '\0', sizeof(addr));
|
||||||
addr.sin6_family = ipaddr->family;
|
addr.sin6_family = ipaddr->family;
|
||||||
memcpy(addr.sin6_addr.s6_addr, ipaddr->sub, sizeof ipaddr->sub);
|
memcpy(addr.sin6_addr.s6_addr, ipaddr->sub, sizeof ipaddr->sub);
|
||||||
addr.sin6_len = sizeof(addr);
|
addr.sin6_len = sizeof(addr);
|
||||||
(void)memcpy(&ifa.ifra_addr, &addr, sizeof(addr));
|
(void)memcpy(&ifa.ifra_addr, &addr, sizeof(addr));
|
||||||
(void)memcpy(&ifa.ifra_dstaddr, &addr, sizeof(addr));
|
(void)memcpy(&ifa.ifra_dstaddr, &addr, sizeof(addr));
|
||||||
|
|
||||||
(void)memset(&mask, '\0', sizeof(mask));
|
(void)memset(&mask, '\0', sizeof(mask));
|
||||||
mask.sin6_family = ipaddr->family;
|
mask.sin6_family = ipaddr->family;
|
||||||
memcpy(mask.sin6_addr.s6_addr, ipaddr->mask, sizeof ipaddr->mask);
|
memcpy(mask.sin6_addr.s6_addr, ipaddr->mask, sizeof ipaddr->mask);
|
||||||
mask.sin6_len = sizeof(mask);
|
mask.sin6_len = sizeof(mask);
|
||||||
(void)memcpy(&ifa.ifra_prefixmask, &mask, sizeof(ifa.ifra_prefixmask));
|
(void)memcpy(&ifa.ifra_prefixmask, &mask, sizeof(ifa.ifra_prefixmask));
|
||||||
|
|
||||||
ifa.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME;
|
ifa.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME;
|
||||||
ifa.ifra_lifetime.ia6t_pltime = ND6_INFINITE_LIFETIME;
|
ifa.ifra_lifetime.ia6t_pltime = ND6_INFINITE_LIFETIME;
|
||||||
|
|
||||||
if (ioctl(fd, SIOCAIFADDR_IN6, &ifa) == -1) {
|
if (ioctl(fd, SIOCAIFADDR_IN6, &ifa) == -1) {
|
||||||
ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno,
|
ogs_log_message(OGS_LOG_ERROR, ogs_socket_errno,
|
||||||
"Can't IP address : dev[%s]", ifname);
|
"Can't IP address : dev[%s]", ifname);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
close(fd); /* SOCK_DGRAM */
|
close(fd); /* SOCK_DGRAM */
|
||||||
|
|
||||||
|
@ -331,11 +331,11 @@ static int tun_set_ipv6(char *ifname,
|
||||||
rtm->rtm_addrs = RTA_DST;
|
rtm->rtm_addrs = RTA_DST;
|
||||||
paddr = (struct sockaddr_in6 *)(rtm + 1);
|
paddr = (struct sockaddr_in6 *)(rtm + 1);
|
||||||
|
|
||||||
(void)memset(&dst, '\0', sizeof(dst));
|
(void)memset(&dst, '\0', sizeof(dst));
|
||||||
dst.sin6_family = ipaddr->family;
|
dst.sin6_family = ipaddr->family;
|
||||||
memcpy(dst.sin6_addr.s6_addr, ipaddr->sub, sizeof ipsub->sub);
|
memcpy(dst.sin6_addr.s6_addr, ipaddr->sub, sizeof ipsub->sub);
|
||||||
dst.sin6_len = sizeof(dst);
|
dst.sin6_len = sizeof(dst);
|
||||||
(void)memcpy(paddr, &dst, sizeof(dst));
|
(void)memcpy(paddr, &dst, sizeof(dst));
|
||||||
paddr = (struct sockaddr_in6 *)((char *)paddr +
|
paddr = (struct sockaddr_in6 *)((char *)paddr +
|
||||||
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
||||||
|
|
||||||
|
@ -359,27 +359,27 @@ static int tun_set_ipv6(char *ifname,
|
||||||
rtm->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
|
rtm->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
|
||||||
paddr = (struct sockaddr_in6 *)(rtm + 1);
|
paddr = (struct sockaddr_in6 *)(rtm + 1);
|
||||||
|
|
||||||
(void)memset(&dst, '\0', sizeof(dst));
|
(void)memset(&dst, '\0', sizeof(dst));
|
||||||
dst.sin6_family = ipaddr->family;
|
dst.sin6_family = ipaddr->family;
|
||||||
memcpy(dst.sin6_addr.s6_addr, ipsub->sub, sizeof ipsub->sub);
|
memcpy(dst.sin6_addr.s6_addr, ipsub->sub, sizeof ipsub->sub);
|
||||||
dst.sin6_len = sizeof(dst);
|
dst.sin6_len = sizeof(dst);
|
||||||
(void)memcpy(paddr, &dst, sizeof(dst));
|
(void)memcpy(paddr, &dst, sizeof(dst));
|
||||||
paddr = (struct sockaddr_in6 *)((char *)paddr +
|
paddr = (struct sockaddr_in6 *)((char *)paddr +
|
||||||
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
||||||
|
|
||||||
(void)memset(&gw, '\0', sizeof(gw));
|
(void)memset(&gw, '\0', sizeof(gw));
|
||||||
gw.sin6_family = ipaddr->family;
|
gw.sin6_family = ipaddr->family;
|
||||||
memcpy(gw.sin6_addr.s6_addr, ipaddr->sub, sizeof ipaddr->sub);
|
memcpy(gw.sin6_addr.s6_addr, ipaddr->sub, sizeof ipaddr->sub);
|
||||||
gw.sin6_len = sizeof(gw);
|
gw.sin6_len = sizeof(gw);
|
||||||
(void)memcpy(paddr, &gw, sizeof(gw));
|
(void)memcpy(paddr, &gw, sizeof(gw));
|
||||||
paddr = (struct sockaddr_in6 *)((char *)paddr +
|
paddr = (struct sockaddr_in6 *)((char *)paddr +
|
||||||
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
||||||
|
|
||||||
(void)memset(&mask, '\0', sizeof(mask));
|
(void)memset(&mask, '\0', sizeof(mask));
|
||||||
mask.sin6_family = ipaddr->family;
|
mask.sin6_family = ipaddr->family;
|
||||||
memcpy(mask.sin6_addr.s6_addr, ipsub->mask, sizeof ipsub->mask);
|
memcpy(mask.sin6_addr.s6_addr, ipsub->mask, sizeof ipsub->mask);
|
||||||
mask.sin6_len = sizeof(mask);
|
mask.sin6_len = sizeof(mask);
|
||||||
(void)memcpy(paddr, &mask, sizeof(mask));
|
(void)memcpy(paddr, &mask, sizeof(mask));
|
||||||
paddr = (struct sockaddr_in6 *)((char *)paddr +
|
paddr = (struct sockaddr_in6 *)((char *)paddr +
|
||||||
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
TUN_ALIGN(sizeof(*paddr), sizeof(uintptr_t)));
|
||||||
|
|
||||||
|
@ -395,7 +395,7 @@ static int tun_set_ipv6(char *ifname,
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ogs_tun_set_ip(char *ifname, ogs_ipsubnet_t *gw, ogs_ipsubnet_t *sub)
|
int ogs_tun_set_ip(char *ifname, ogs_ipsubnet_t *gw, ogs_ipsubnet_t *sub)
|
||||||
|
|
|
@ -6,10 +6,10 @@ if [ "$SYSTEM" = "Linux" ]; then
|
||||||
if ! grep "ogstun" /proc/net/dev > /dev/null; then
|
if ! grep "ogstun" /proc/net/dev > /dev/null; then
|
||||||
ip tuntap add name ogstun mode tun
|
ip tuntap add name ogstun mode tun
|
||||||
fi
|
fi
|
||||||
if test "x`sysctl -n net.ipv6.conf.ogstun.disable_ipv6`" = x1; then
|
if test "x`sysctl -n net.ipv6.conf.ogstun.disable_ipv6`" = x1; then
|
||||||
echo "net.ipv6.conf.ogstun.disable_ipv6=0" > /etc/sysctl.d/30-open5gs.conf
|
echo "net.ipv6.conf.ogstun.disable_ipv6=0" > /etc/sysctl.d/30-open5gs.conf
|
||||||
sysctl -p /etc/sysctl.d/30-open5gs.conf
|
sysctl -p /etc/sysctl.d/30-open5gs.conf
|
||||||
fi
|
fi
|
||||||
ip addr del 10.45.0.1/16 dev ogstun 2> /dev/null
|
ip addr del 10.45.0.1/16 dev ogstun 2> /dev/null
|
||||||
ip addr add 10.45.0.1/16 dev ogstun
|
ip addr add 10.45.0.1/16 dev ogstun
|
||||||
ip addr del 2001:db8:cafe::1/48 dev ogstun 2> /dev/null
|
ip addr del 2001:db8:cafe::1/48 dev ogstun 2> /dev/null
|
||||||
|
|
|
@ -203,7 +203,7 @@ int ngap_send_to_nas(ran_ue_t *ran_ue,
|
||||||
if (nas_5gs_security_decode(ran_ue->amf_ue,
|
if (nas_5gs_security_decode(ran_ue->amf_ue,
|
||||||
security_header_type, nasbuf) != OGS_OK) {
|
security_header_type, nasbuf) != OGS_OK) {
|
||||||
ogs_error("nas_eps_security_decode failed()");
|
ogs_error("nas_eps_security_decode failed()");
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,12 +78,12 @@ void ngap_recv_upcall(short when, ogs_socket_t fd, void *data)
|
||||||
#if HAVE_USRSCTP
|
#if HAVE_USRSCTP
|
||||||
static void usrsctp_recv_handler(struct socket *socket, void *data, int flags)
|
static void usrsctp_recv_handler(struct socket *socket, void *data, int flags)
|
||||||
{
|
{
|
||||||
int events;
|
int events;
|
||||||
|
|
||||||
while ((events = usrsctp_get_events(socket)) &&
|
while ((events = usrsctp_get_events(socket)) &&
|
||||||
(events & SCTP_EVENT_READ)) {
|
(events & SCTP_EVENT_READ)) {
|
||||||
ngap_recv_handler((ogs_sock_t *)socket);
|
ngap_recv_handler((ogs_sock_t *)socket);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static void lksctp_accept_handler(short when, ogs_socket_t fd, void *data)
|
static void lksctp_accept_handler(short when, ogs_socket_t fd, void *data)
|
||||||
|
|
|
@ -37,10 +37,10 @@ static struct disp_hdl *hdl_cx_lir = NULL;
|
||||||
static int hss_ogs_diam_cx_fb_cb(struct msg **msg, struct avp *avp,
|
static int hss_ogs_diam_cx_fb_cb(struct msg **msg, struct avp *avp,
|
||||||
struct session *session, void *opaque, enum disp_action *act)
|
struct session *session, void *opaque, enum disp_action *act)
|
||||||
{
|
{
|
||||||
/* This CB should never be called */
|
/* This CB should never be called */
|
||||||
ogs_warn("Unexpected message received!");
|
ogs_warn("Unexpected message received!");
|
||||||
|
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Callback for incoming User-Authorization-Request messages */
|
/* Callback for incoming User-Authorization-Request messages */
|
||||||
|
@ -50,7 +50,7 @@ static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv, ret;
|
int rv, ret;
|
||||||
uint32_t result_code = 0;
|
uint32_t result_code = 0;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
|
|
||||||
struct avp_hdr *hdr;
|
struct avp_hdr *hdr;
|
||||||
union avp_value val;
|
union avp_value val;
|
||||||
|
@ -63,14 +63,14 @@ static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp,
|
||||||
char imsi_or_msisdn_bcd[OGS_MAX_IMSI_BCD_LEN+1];
|
char imsi_or_msisdn_bcd[OGS_MAX_IMSI_BCD_LEN+1];
|
||||||
|
|
||||||
ogs_msisdn_data_t msisdn_data;
|
ogs_msisdn_data_t msisdn_data;
|
||||||
|
|
||||||
ogs_assert(msg);
|
ogs_assert(msg);
|
||||||
|
|
||||||
ogs_debug("User-Authorization-Request");
|
ogs_debug("User-Authorization-Request");
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp,
|
||||||
else
|
else
|
||||||
result_code = OGS_DIAM_CX_SUBSEQUENT_REGISTRATION;
|
result_code = OGS_DIAM_CX_SUBSEQUENT_REGISTRATION;
|
||||||
|
|
||||||
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
||||||
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
|
@ -159,22 +159,22 @@ static int hss_ogs_diam_cx_uar_cb( struct msg **msg, struct avp *avp,
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_debug("User-Authorization-Answer");
|
ogs_debug("User-Authorization-Answer");
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
|
|
||||||
ogs_free(user_name);
|
ogs_free(user_name);
|
||||||
ogs_free(public_identity);
|
ogs_free(public_identity);
|
||||||
ogs_free(visited_network_identifier);
|
ogs_free(visited_network_identifier);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* Set Vendor-Specific-Application-Id AVP */
|
/* Set Vendor-Specific-Application-Id AVP */
|
||||||
|
@ -182,7 +182,7 @@ out:
|
||||||
ans, OGS_DIAM_CX_APPLICATION_ID);
|
ans, OGS_DIAM_CX_APPLICATION_ID);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
||||||
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
|
@ -195,7 +195,7 @@ out:
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_free(user_name);
|
ogs_free(user_name);
|
||||||
|
@ -212,7 +212,7 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv, ret;
|
int rv, ret;
|
||||||
uint32_t result_code = 0;
|
uint32_t result_code = 0;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
|
|
||||||
struct avp *sip_auth_data_item_avp = NULL;
|
struct avp *sip_auth_data_item_avp = NULL;
|
||||||
struct avp *authentication_scheme_avp = NULL;
|
struct avp *authentication_scheme_avp = NULL;
|
||||||
|
@ -252,9 +252,9 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp,
|
||||||
|
|
||||||
ogs_debug("Multimedia-Auth-Request");
|
ogs_debug("Multimedia-Auth-Request");
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -449,8 +449,8 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, and Result-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, and Result-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the User-Name AVP */
|
/* Set the User-Name AVP */
|
||||||
|
@ -548,16 +548,16 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_debug("Multimedia-Auth-Answer");
|
ogs_debug("Multimedia-Auth-Answer");
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
|
|
||||||
if (authentication_scheme)
|
if (authentication_scheme)
|
||||||
ogs_free(authentication_scheme);
|
ogs_free(authentication_scheme);
|
||||||
|
@ -566,7 +566,7 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp,
|
||||||
ogs_free(public_identity);
|
ogs_free(public_identity);
|
||||||
ogs_free(server_name);
|
ogs_free(server_name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* Set Vendor-Specific-Application-Id AVP */
|
/* Set Vendor-Specific-Application-Id AVP */
|
||||||
|
@ -574,7 +574,7 @@ out:
|
||||||
ans, OGS_DIAM_CX_APPLICATION_ID);
|
ans, OGS_DIAM_CX_APPLICATION_ID);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
||||||
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
|
@ -587,7 +587,7 @@ out:
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
if (authentication_scheme)
|
if (authentication_scheme)
|
||||||
|
@ -607,7 +607,7 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv, ret;
|
int rv, ret;
|
||||||
uint32_t result_code = 0;
|
uint32_t result_code = 0;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
|
|
||||||
bool matched = false;
|
bool matched = false;
|
||||||
struct avp *user_name_avp = NULL;
|
struct avp *user_name_avp = NULL;
|
||||||
|
@ -629,9 +629,9 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp,
|
||||||
|
|
||||||
ogs_debug("Server-Assignment-Request");
|
ogs_debug("Server-Assignment-Request");
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -733,8 +733,8 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, and Result-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, and Result-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
if (user_name_avp) {
|
if (user_name_avp) {
|
||||||
|
@ -808,16 +808,16 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_debug("Server-Assignment-Answer");
|
ogs_debug("Server-Assignment-Answer");
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
|
|
||||||
if (user_data)
|
if (user_data)
|
||||||
ogs_free(user_data);
|
ogs_free(user_data);
|
||||||
|
@ -825,7 +825,7 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp,
|
||||||
ogs_free(public_identity);
|
ogs_free(public_identity);
|
||||||
ogs_free(server_name);
|
ogs_free(server_name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* Set Vendor-Specific-Application-Id AVP */
|
/* Set Vendor-Specific-Application-Id AVP */
|
||||||
|
@ -833,7 +833,7 @@ out:
|
||||||
ans, OGS_DIAM_CX_APPLICATION_ID);
|
ans, OGS_DIAM_CX_APPLICATION_ID);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
||||||
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
|
@ -846,7 +846,7 @@ out:
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
if (user_data)
|
if (user_data)
|
||||||
|
@ -865,7 +865,7 @@ static int hss_ogs_diam_cx_lir_cb( struct msg **msg, struct avp *avp,
|
||||||
int ret;
|
int ret;
|
||||||
uint32_t result_code = 0;
|
uint32_t result_code = 0;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
|
|
||||||
struct avp_hdr *hdr;
|
struct avp_hdr *hdr;
|
||||||
union avp_value val;
|
union avp_value val;
|
||||||
|
@ -877,9 +877,9 @@ static int hss_ogs_diam_cx_lir_cb( struct msg **msg, struct avp *avp,
|
||||||
|
|
||||||
ogs_debug("Location-Info-Request");
|
ogs_debug("Location-Info-Request");
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -915,8 +915,8 @@ static int hss_ogs_diam_cx_lir_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, and Result-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, and Result-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set Server-Name AVPs */
|
/* Set Server-Name AVPs */
|
||||||
|
@ -929,20 +929,20 @@ static int hss_ogs_diam_cx_lir_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_debug("Location-Info-Answer");
|
ogs_debug("Location-Info-Answer");
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
|
|
||||||
ogs_free(public_identity);
|
ogs_free(public_identity);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* Set Vendor-Specific-Application-Id AVP */
|
/* Set Vendor-Specific-Application-Id AVP */
|
||||||
|
@ -950,7 +950,7 @@ out:
|
||||||
ans, OGS_DIAM_CX_APPLICATION_ID);
|
ans, OGS_DIAM_CX_APPLICATION_ID);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
||||||
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
|
@ -963,7 +963,7 @@ out:
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_free(public_identity);
|
ogs_free(public_identity);
|
||||||
|
@ -974,61 +974,61 @@ out:
|
||||||
int hss_cx_init(void)
|
int hss_cx_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
/* Install objects definitions for this application */
|
/* Install objects definitions for this application */
|
||||||
ret = ogs_diam_cx_init();
|
ret = ogs_diam_cx_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.app = ogs_diam_cx_application;
|
data.app = ogs_diam_cx_application;
|
||||||
|
|
||||||
/* Fallback CB if command != unexpected message received */
|
/* Fallback CB if command != unexpected message received */
|
||||||
ret = fd_disp_register(hss_ogs_diam_cx_fb_cb, DISP_HOW_APPID,
|
ret = fd_disp_register(hss_ogs_diam_cx_fb_cb, DISP_HOW_APPID,
|
||||||
&data, NULL, &hdl_cx_fb);
|
&data, NULL, &hdl_cx_fb);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Specific handler for User-Authorization-Request */
|
/* Specific handler for User-Authorization-Request */
|
||||||
data.command = ogs_diam_cx_cmd_uar;
|
data.command = ogs_diam_cx_cmd_uar;
|
||||||
ret = fd_disp_register(hss_ogs_diam_cx_uar_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(hss_ogs_diam_cx_uar_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_cx_uar);
|
&hdl_cx_uar);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Specific handler for Multimedia-Auth-Request */
|
/* Specific handler for Multimedia-Auth-Request */
|
||||||
data.command = ogs_diam_cx_cmd_mar;
|
data.command = ogs_diam_cx_cmd_mar;
|
||||||
ret = fd_disp_register(hss_ogs_diam_cx_mar_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(hss_ogs_diam_cx_mar_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_cx_mar);
|
&hdl_cx_mar);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Specific handler for Server-Assignment-Request */
|
/* Specific handler for Server-Assignment-Request */
|
||||||
data.command = ogs_diam_cx_cmd_sar;
|
data.command = ogs_diam_cx_cmd_sar;
|
||||||
ret = fd_disp_register(hss_ogs_diam_cx_sar_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(hss_ogs_diam_cx_sar_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_cx_sar);
|
&hdl_cx_sar);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Specific handler for Location-Info-Request */
|
/* Specific handler for Location-Info-Request */
|
||||||
data.command = ogs_diam_cx_cmd_lir;
|
data.command = ogs_diam_cx_cmd_lir;
|
||||||
ret = fd_disp_register(hss_ogs_diam_cx_lir_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(hss_ogs_diam_cx_lir_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_cx_lir);
|
&hdl_cx_lir);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Advertise the support for the application in the peer */
|
/* Advertise the support for the application in the peer */
|
||||||
ret = fd_disp_app_support(ogs_diam_cx_application, ogs_diam_vendor, 1, 0);
|
ret = fd_disp_app_support(ogs_diam_cx_application, ogs_diam_vendor, 1, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hss_cx_final(void)
|
void hss_cx_final(void)
|
||||||
{
|
{
|
||||||
if (hdl_cx_fb)
|
if (hdl_cx_fb)
|
||||||
(void) fd_disp_unregister(&hdl_cx_fb, NULL);
|
(void) fd_disp_unregister(&hdl_cx_fb, NULL);
|
||||||
if (hdl_cx_uar)
|
if (hdl_cx_uar)
|
||||||
(void) fd_disp_unregister(&hdl_cx_uar, NULL);
|
(void) fd_disp_unregister(&hdl_cx_uar, NULL);
|
||||||
if (hdl_cx_mar)
|
if (hdl_cx_mar)
|
||||||
(void) fd_disp_unregister(&hdl_cx_mar, NULL);
|
(void) fd_disp_unregister(&hdl_cx_mar, NULL);
|
||||||
if (hdl_cx_sar)
|
if (hdl_cx_sar)
|
||||||
(void) fd_disp_unregister(&hdl_cx_sar, NULL);
|
(void) fd_disp_unregister(&hdl_cx_sar, NULL);
|
||||||
if (hdl_cx_lir)
|
if (hdl_cx_lir)
|
||||||
(void) fd_disp_unregister(&hdl_cx_lir, NULL);
|
(void) fd_disp_unregister(&hdl_cx_lir, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ int hss_fd_init(void)
|
||||||
rv = ogs_diam_start();
|
rv = ogs_diam_start();
|
||||||
ogs_assert(rv == 0);
|
ogs_assert(rv == 0);
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hss_fd_final(void)
|
void hss_fd_final(void)
|
||||||
|
|
|
@ -43,7 +43,7 @@ int hss_initialize(void)
|
||||||
|
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hss_terminate(void)
|
void hss_terminate(void)
|
||||||
|
@ -54,6 +54,6 @@ void hss_terminate(void)
|
||||||
|
|
||||||
ogs_dbi_final();
|
ogs_dbi_final();
|
||||||
hss_context_final();
|
hss_context_final();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,10 +33,10 @@ static struct disp_hdl *hdl_s6a_ulr = NULL;
|
||||||
static int hss_ogs_diam_s6a_fb_cb(struct msg **msg, struct avp *avp,
|
static int hss_ogs_diam_s6a_fb_cb(struct msg **msg, struct avp *avp,
|
||||||
struct session *session, void *opaque, enum disp_action *act)
|
struct session *session, void *opaque, enum disp_action *act)
|
||||||
{
|
{
|
||||||
/* This CB should never be called */
|
/* This CB should never be called */
|
||||||
ogs_warn("Unexpected message received!");
|
ogs_warn("Unexpected message received!");
|
||||||
|
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Callback for incoming Authentication-Information-Request messages */
|
/* Callback for incoming Authentication-Information-Request messages */
|
||||||
|
@ -75,9 +75,9 @@ static int hss_ogs_diam_s6a_air_cb( struct msg **msg, struct avp *avp,
|
||||||
|
|
||||||
ogs_debug("Authentication-Information-Request");
|
ogs_debug("Authentication-Information-Request");
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -211,8 +211,8 @@ static int hss_ogs_diam_s6a_air_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Auth-Session-State AVP */
|
/* Set the Auth-Session-State AVP */
|
||||||
|
@ -229,18 +229,18 @@ static int hss_ogs_diam_s6a_air_cb( struct msg **msg, struct avp *avp,
|
||||||
ans, OGS_DIAM_S6A_APPLICATION_ID);
|
ans, OGS_DIAM_S6A_APPLICATION_ID);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_debug("Authentication-Information-Answer");
|
ogs_debug("Authentication-Information-Answer");
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
||||||
|
@ -260,7 +260,7 @@ out:
|
||||||
ans, OGS_DIAM_S6A_APPLICATION_ID);
|
ans, OGS_DIAM_S6A_APPLICATION_ID);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -866,45 +866,45 @@ out:
|
||||||
int hss_s6a_init(void)
|
int hss_s6a_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
/* Install objects definitions for this application */
|
/* Install objects definitions for this application */
|
||||||
ret = ogs_diam_s6a_init();
|
ret = ogs_diam_s6a_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.app = ogs_diam_s6a_application;
|
data.app = ogs_diam_s6a_application;
|
||||||
|
|
||||||
/* Fallback CB if command != unexpected message received */
|
/* Fallback CB if command != unexpected message received */
|
||||||
ret = fd_disp_register(hss_ogs_diam_s6a_fb_cb, DISP_HOW_APPID, &data, NULL,
|
ret = fd_disp_register(hss_ogs_diam_s6a_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||||
&hdl_s6a_fb);
|
&hdl_s6a_fb);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Specific handler for Authentication-Information-Request */
|
/* Specific handler for Authentication-Information-Request */
|
||||||
data.command = ogs_diam_s6a_cmd_air;
|
data.command = ogs_diam_s6a_cmd_air;
|
||||||
ret = fd_disp_register(hss_ogs_diam_s6a_air_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(hss_ogs_diam_s6a_air_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_s6a_air);
|
&hdl_s6a_air);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Specific handler for Location-Update-Request */
|
/* Specific handler for Location-Update-Request */
|
||||||
data.command = ogs_diam_s6a_cmd_ulr;
|
data.command = ogs_diam_s6a_cmd_ulr;
|
||||||
ret = fd_disp_register(hss_ogs_diam_s6a_ulr_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(hss_ogs_diam_s6a_ulr_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_s6a_ulr);
|
&hdl_s6a_ulr);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Advertise the support for the application in the peer */
|
/* Advertise the support for the application in the peer */
|
||||||
ret = fd_disp_app_support(ogs_diam_s6a_application, ogs_diam_vendor, 1, 0);
|
ret = fd_disp_app_support(ogs_diam_s6a_application, ogs_diam_vendor, 1, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hss_s6a_final(void)
|
void hss_s6a_final(void)
|
||||||
{
|
{
|
||||||
if (hdl_s6a_fb)
|
if (hdl_s6a_fb)
|
||||||
(void) fd_disp_unregister(&hdl_s6a_fb, NULL);
|
(void) fd_disp_unregister(&hdl_s6a_fb, NULL);
|
||||||
if (hdl_s6a_air)
|
if (hdl_s6a_air)
|
||||||
(void) fd_disp_unregister(&hdl_s6a_air, NULL);
|
(void) fd_disp_unregister(&hdl_s6a_air, NULL);
|
||||||
if (hdl_s6a_ulr)
|
if (hdl_s6a_ulr)
|
||||||
(void) fd_disp_unregister(&hdl_s6a_ulr, NULL);
|
(void) fd_disp_unregister(&hdl_s6a_ulr, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,10 +33,10 @@ static struct disp_hdl *hdl_swx_sar = NULL;
|
||||||
static int hss_ogs_diam_swx_fb_cb(struct msg **msg, struct avp *avp,
|
static int hss_ogs_diam_swx_fb_cb(struct msg **msg, struct avp *avp,
|
||||||
struct session *session, void *opaque, enum disp_action *act)
|
struct session *session, void *opaque, enum disp_action *act)
|
||||||
{
|
{
|
||||||
/* This CB should never be called */
|
/* This CB should never be called */
|
||||||
ogs_warn("Unexpected message received!");
|
ogs_warn("Unexpected message received!");
|
||||||
|
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Callback for incoming Multimedia-Auth-Request messages */
|
/* Callback for incoming Multimedia-Auth-Request messages */
|
||||||
|
@ -46,7 +46,7 @@ static int hss_ogs_diam_swx_mar_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv, ret;
|
int rv, ret;
|
||||||
uint32_t result_code = 0;
|
uint32_t result_code = 0;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
|
|
||||||
struct avp *sip_auth_data_item_avp = NULL;
|
struct avp *sip_auth_data_item_avp = NULL;
|
||||||
struct avp *authentication_scheme_avp = NULL;
|
struct avp *authentication_scheme_avp = NULL;
|
||||||
|
@ -82,9 +82,9 @@ static int hss_ogs_diam_swx_mar_cb( struct msg **msg, struct avp *avp,
|
||||||
|
|
||||||
ogs_debug("Multimedia-Auth-Request");
|
ogs_debug("Multimedia-Auth-Request");
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -238,8 +238,8 @@ static int hss_ogs_diam_swx_mar_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, and Result-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, and Result-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the User-Name AVP */
|
/* Set the User-Name AVP */
|
||||||
|
@ -327,23 +327,23 @@ static int hss_ogs_diam_swx_mar_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_debug("Multimedia-Auth-Answer");
|
ogs_debug("Multimedia-Auth-Answer");
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
|
|
||||||
if (authentication_scheme)
|
if (authentication_scheme)
|
||||||
ogs_free(authentication_scheme);
|
ogs_free(authentication_scheme);
|
||||||
|
|
||||||
ogs_free(user_name);
|
ogs_free(user_name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* Set Vendor-Specific-Application-Id AVP */
|
/* Set Vendor-Specific-Application-Id AVP */
|
||||||
|
@ -351,7 +351,7 @@ out:
|
||||||
ans, OGS_DIAM_SWX_APPLICATION_ID);
|
ans, OGS_DIAM_SWX_APPLICATION_ID);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
||||||
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
|
@ -364,7 +364,7 @@ out:
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
if (authentication_scheme)
|
if (authentication_scheme)
|
||||||
|
@ -382,7 +382,7 @@ static int hss_ogs_diam_swx_sar_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv, ret;
|
int rv, ret;
|
||||||
uint32_t result_code = 0;
|
uint32_t result_code = 0;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
|
|
||||||
struct avp_hdr *hdr;
|
struct avp_hdr *hdr;
|
||||||
union avp_value val;
|
union avp_value val;
|
||||||
|
@ -402,9 +402,9 @@ static int hss_ogs_diam_swx_sar_cb( struct msg **msg, struct avp *avp,
|
||||||
|
|
||||||
memset(&subscription_data, 0, sizeof(ogs_subscription_data_t));
|
memset(&subscription_data, 0, sizeof(ogs_subscription_data_t));
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -826,8 +826,8 @@ static int hss_ogs_diam_swx_sar_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, and Result-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, and Result-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the User-Name AVP */
|
/* Set the User-Name AVP */
|
||||||
|
@ -840,21 +840,21 @@ static int hss_ogs_diam_swx_sar_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_debug("Server-Assignment-Answer");
|
ogs_debug("Server-Assignment-Answer");
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
|
|
||||||
ogs_subscription_data_free(&subscription_data);
|
ogs_subscription_data_free(&subscription_data);
|
||||||
ogs_free(user_name);
|
ogs_free(user_name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* Set Vendor-Specific-Application-Id AVP */
|
/* Set Vendor-Specific-Application-Id AVP */
|
||||||
|
@ -862,7 +862,7 @@ out:
|
||||||
ans, OGS_DIAM_SWX_APPLICATION_ID);
|
ans, OGS_DIAM_SWX_APPLICATION_ID);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
/* Set the Experimental-Result, Origin-Host and Origin-Realm AVPs */
|
||||||
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
|
@ -875,7 +875,7 @@ out:
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_subscription_data_free(&subscription_data);
|
ogs_subscription_data_free(&subscription_data);
|
||||||
|
@ -887,45 +887,45 @@ out:
|
||||||
int hss_swx_init(void)
|
int hss_swx_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
/* Install objects definitions for this application */
|
/* Install objects definitions for this application */
|
||||||
ret = ogs_diam_swx_init();
|
ret = ogs_diam_swx_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.app = ogs_diam_swx_application;
|
data.app = ogs_diam_swx_application;
|
||||||
|
|
||||||
/* Fallback CB if command != unexpected message received */
|
/* Fallback CB if command != unexpected message received */
|
||||||
ret = fd_disp_register(hss_ogs_diam_swx_fb_cb, DISP_HOW_APPID,
|
ret = fd_disp_register(hss_ogs_diam_swx_fb_cb, DISP_HOW_APPID,
|
||||||
&data, NULL, &hdl_swx_fb);
|
&data, NULL, &hdl_swx_fb);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Specific handler for Multimedia-Auth-Request */
|
/* Specific handler for Multimedia-Auth-Request */
|
||||||
data.command = ogs_diam_cx_cmd_mar;
|
data.command = ogs_diam_cx_cmd_mar;
|
||||||
ret = fd_disp_register(hss_ogs_diam_swx_mar_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(hss_ogs_diam_swx_mar_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_swx_mar);
|
&hdl_swx_mar);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Specific handler for Server-Assignment-Request */
|
/* Specific handler for Server-Assignment-Request */
|
||||||
data.command = ogs_diam_cx_cmd_sar;
|
data.command = ogs_diam_cx_cmd_sar;
|
||||||
ret = fd_disp_register(hss_ogs_diam_swx_sar_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(hss_ogs_diam_swx_sar_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_swx_sar);
|
&hdl_swx_sar);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Advertise the support for the application in the peer */
|
/* Advertise the support for the application in the peer */
|
||||||
ret = fd_disp_app_support(ogs_diam_swx_application, ogs_diam_vendor, 1, 0);
|
ret = fd_disp_app_support(ogs_diam_swx_application, ogs_diam_vendor, 1, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hss_swx_final(void)
|
void hss_swx_final(void)
|
||||||
{
|
{
|
||||||
if (hdl_swx_fb)
|
if (hdl_swx_fb)
|
||||||
(void) fd_disp_unregister(&hdl_swx_fb, NULL);
|
(void) fd_disp_unregister(&hdl_swx_fb, NULL);
|
||||||
if (hdl_swx_mar)
|
if (hdl_swx_mar)
|
||||||
(void) fd_disp_unregister(&hdl_swx_mar, NULL);
|
(void) fd_disp_unregister(&hdl_swx_mar, NULL);
|
||||||
if (hdl_swx_sar)
|
if (hdl_swx_sar)
|
||||||
(void) fd_disp_unregister(&hdl_swx_sar, NULL);
|
(void) fd_disp_unregister(&hdl_swx_sar, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ ogs_pkbuf_t *mme_s11_build_create_session_request(
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
struct tm time_exp;
|
struct tm time_exp;
|
||||||
char apn[OGS_MAX_APN_LEN+1];
|
char apn[OGS_MAX_APN_LEN+1];
|
||||||
|
|
||||||
ogs_gtp2_indication_t indication;
|
ogs_gtp2_indication_t indication;
|
||||||
|
|
||||||
ogs_assert(sess);
|
ogs_assert(sess);
|
||||||
|
@ -195,14 +195,14 @@ ogs_pkbuf_t *mme_s11_build_create_session_request(
|
||||||
* we need to change position of addresses in struct. */
|
* we need to change position of addresses in struct. */
|
||||||
if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4 &&
|
if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4 &&
|
||||||
session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) {
|
session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) {
|
||||||
uint32_t addr = session->paa.both.addr;
|
uint32_t addr = session->paa.both.addr;
|
||||||
session->paa.addr = addr;
|
session->paa.addr = addr;
|
||||||
}
|
}
|
||||||
if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV6 &&
|
if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV6 &&
|
||||||
session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) {
|
session->session_type == OGS_PDU_SESSION_TYPE_IPV4V6) {
|
||||||
uint8_t addr[16];
|
uint8_t addr[16];
|
||||||
memcpy(&addr, session->paa.both.addr6, OGS_IPV6_LEN);
|
memcpy(&addr, session->paa.both.addr6, OGS_IPV6_LEN);
|
||||||
memcpy(session->paa.addr6, &addr, OGS_IPV6_LEN);
|
memcpy(session->paa.addr6, &addr, OGS_IPV6_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&indication, 0, sizeof(ogs_gtp2_indication_t));
|
memset(&indication, 0, sizeof(ogs_gtp2_indication_t));
|
||||||
|
@ -214,13 +214,13 @@ ogs_pkbuf_t *mme_s11_build_create_session_request(
|
||||||
indication.enb_change_reporting_support_indication = 1;
|
indication.enb_change_reporting_support_indication = 1;
|
||||||
|
|
||||||
if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4V6)
|
if (req->pdn_type.u8 == OGS_PDU_SESSION_TYPE_IPV4V6)
|
||||||
indication.dual_address_bearer_flag = 1;
|
indication.dual_address_bearer_flag = 1;
|
||||||
|
|
||||||
if (sess->request_type.value == OGS_NAS_EPS_REQUEST_TYPE_HANDOVER)
|
if (sess->request_type.value == OGS_NAS_EPS_REQUEST_TYPE_HANDOVER)
|
||||||
indication.handover_indication = 1;
|
indication.handover_indication = 1;
|
||||||
|
|
||||||
if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST)
|
if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST)
|
||||||
indication.operation_indication = 1;
|
indication.operation_indication = 1;
|
||||||
|
|
||||||
session->paa.session_type = req->pdn_type.u8;
|
session->paa.session_type = req->pdn_type.u8;
|
||||||
req->pdn_address_allocation.data = &session->paa;
|
req->pdn_address_allocation.data = &session->paa;
|
||||||
|
|
|
@ -211,7 +211,7 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue,
|
||||||
if (nas_eps_security_decode(enb_ue->mme_ue,
|
if (nas_eps_security_decode(enb_ue->mme_ue,
|
||||||
security_header_type, nasbuf) != OGS_OK) {
|
security_header_type, nasbuf) != OGS_OK) {
|
||||||
ogs_error("nas_eps_security_decode failed()");
|
ogs_error("nas_eps_security_decode failed()");
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,12 +79,12 @@ void s1ap_recv_upcall(short when, ogs_socket_t fd, void *data)
|
||||||
#if HAVE_USRSCTP
|
#if HAVE_USRSCTP
|
||||||
static void usrsctp_recv_handler(struct socket *socket, void *data, int flags)
|
static void usrsctp_recv_handler(struct socket *socket, void *data, int flags)
|
||||||
{
|
{
|
||||||
int events;
|
int events;
|
||||||
|
|
||||||
while ((events = usrsctp_get_events(socket)) &&
|
while ((events = usrsctp_get_events(socket)) &&
|
||||||
(events & SCTP_EVENT_READ)) {
|
(events & SCTP_EVENT_READ)) {
|
||||||
s1ap_recv_handler((ogs_sock_t *)socket);
|
s1ap_recv_handler((ogs_sock_t *)socket);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static void lksctp_accept_handler(short when, ogs_socket_t fd, void *data)
|
static void lksctp_accept_handler(short when, ogs_socket_t fd, void *data)
|
||||||
|
|
|
@ -62,9 +62,9 @@ ogs_sock_t *sgsap_client(mme_vlr_t *vlr)
|
||||||
#if HAVE_USRSCTP
|
#if HAVE_USRSCTP
|
||||||
static void usrsctp_recv_handler(struct socket *socket, void *data, int flags)
|
static void usrsctp_recv_handler(struct socket *socket, void *data, int flags)
|
||||||
{
|
{
|
||||||
int events;
|
int events;
|
||||||
|
|
||||||
while ((events = usrsctp_get_events(socket)) &&
|
while ((events = usrsctp_get_events(socket)) &&
|
||||||
(events & SCTP_EVENT_READ)) {
|
(events & SCTP_EVENT_READ)) {
|
||||||
recv_handler((ogs_sock_t *)socket);
|
recv_handler((ogs_sock_t *)socket);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ int pcrf_fd_init(void)
|
||||||
rv = ogs_diam_start();
|
rv = ogs_diam_start();
|
||||||
ogs_assert(rv == 0);
|
ogs_assert(rv == 0);
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pcrf_fd_final(void)
|
void pcrf_fd_final(void)
|
||||||
|
|
|
@ -188,10 +188,10 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque)
|
||||||
static int pcrf_gx_fb_cb(struct msg **msg, struct avp *avp,
|
static int pcrf_gx_fb_cb(struct msg **msg, struct avp *avp,
|
||||||
struct session *sess, void *opaque, enum disp_action *act)
|
struct session *sess, void *opaque, enum disp_action *act)
|
||||||
{
|
{
|
||||||
/* This CB should never be called */
|
/* This CB should never be called */
|
||||||
ogs_warn("Unexpected message received!");
|
ogs_warn("Unexpected message received!");
|
||||||
|
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
||||||
|
@ -200,7 +200,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv;
|
int rv;
|
||||||
int ret = 0, i;
|
int ret = 0, i;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
struct avp *avpch1, *avpch2;
|
struct avp *avpch1, *avpch2;
|
||||||
struct avp_hdr *hdr;
|
struct avp_hdr *hdr;
|
||||||
union avp_value val;
|
union avp_value val;
|
||||||
|
@ -211,7 +211,7 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
||||||
uint32_t cc_request_type = OGS_DIAM_GX_CC_REQUEST_TYPE_INITIAL_REQUEST;
|
uint32_t cc_request_type = OGS_DIAM_GX_CC_REQUEST_TYPE_INITIAL_REQUEST;
|
||||||
uint32_t cc_request_number = 0;
|
uint32_t cc_request_number = 0;
|
||||||
uint32_t result_code = OGS_DIAM_MISSING_AVP;
|
uint32_t result_code = OGS_DIAM_MISSING_AVP;
|
||||||
|
|
||||||
ogs_debug("[Credit-Control-Request]");
|
ogs_debug("[Credit-Control-Request]");
|
||||||
|
|
||||||
ogs_assert(msg);
|
ogs_assert(msg);
|
||||||
|
@ -219,9 +219,9 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
||||||
/* Initialize Message */
|
/* Initialize Message */
|
||||||
memset(&gx_message, 0, sizeof(ogs_diam_gx_message_t));
|
memset(&gx_message, 0, sizeof(ogs_diam_gx_message_t));
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -578,8 +578,8 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
if (cc_request_type != OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST) {
|
if (cc_request_type != OGS_DIAM_GX_CC_REQUEST_TYPE_TERMINATION_REQUEST) {
|
||||||
|
@ -591,23 +591,23 @@ static int pcrf_gx_ccr_cb( struct msg **msg, struct avp *avp,
|
||||||
state_cleanup(sess_data, NULL, NULL);
|
state_cleanup(sess_data, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_debug("[Credit-Control-Answer]");
|
ogs_debug("[Credit-Control-Answer]");
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) ==0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) ==0);
|
||||||
|
|
||||||
ogs_session_data_free(&gx_message.session_data);
|
ogs_session_data_free(&gx_message.session_data);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* Set the Result-Code */
|
/* Set the Result-Code */
|
||||||
if (result_code == OGS_DIAM_AVP_UNSUPPORTED) {
|
if (result_code == OGS_DIAM_AVP_UNSUPPORTED) {
|
||||||
ret = fd_msg_rescode_set(ans,
|
ret = fd_msg_rescode_set(ans,
|
||||||
(char *)"DIAMETER_AVP_UNSUPPORTED", NULL, NULL, 1);
|
(char *)"DIAMETER_AVP_UNSUPPORTED", NULL, NULL, 1);
|
||||||
|
@ -636,7 +636,7 @@ out:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_session_data_free(&gx_message.session_data);
|
ogs_session_data_free(&gx_message.session_data);
|
||||||
|
@ -1144,50 +1144,50 @@ static void pcrf_gx_raa_cb(void *data, struct msg **msg)
|
||||||
int pcrf_gx_init(void)
|
int pcrf_gx_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
ogs_thread_mutex_init(&sess_state_mutex);
|
ogs_thread_mutex_init(&sess_state_mutex);
|
||||||
ogs_pool_init(&sess_state_pool, ogs_app()->pool.sess);
|
ogs_pool_init(&sess_state_pool, ogs_app()->pool.sess);
|
||||||
ogs_pool_init(&rx_sess_state_pool, ogs_app()->pool.sess);
|
ogs_pool_init(&rx_sess_state_pool, ogs_app()->pool.sess);
|
||||||
|
|
||||||
/* Install objects definitions for this application */
|
/* Install objects definitions for this application */
|
||||||
ret = ogs_diam_gx_init();
|
ret = ogs_diam_gx_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Create handler for sessions */
|
/* Create handler for sessions */
|
||||||
ret = fd_sess_handler_create(&pcrf_gx_reg, state_cleanup, NULL, NULL);
|
ret = fd_sess_handler_create(&pcrf_gx_reg, state_cleanup, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.app = ogs_diam_gx_application;
|
data.app = ogs_diam_gx_application;
|
||||||
|
|
||||||
ret = fd_disp_register(pcrf_gx_fb_cb, DISP_HOW_APPID, &data, NULL,
|
ret = fd_disp_register(pcrf_gx_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||||
&hdl_gx_fb);
|
&hdl_gx_fb);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
data.command = ogs_diam_gx_cmd_ccr;
|
data.command = ogs_diam_gx_cmd_ccr;
|
||||||
ret = fd_disp_register(pcrf_gx_ccr_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(pcrf_gx_ccr_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_gx_ccr);
|
&hdl_gx_ccr);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Advertise the support for the application in the peer */
|
/* Advertise the support for the application in the peer */
|
||||||
ret = fd_disp_app_support(ogs_diam_gx_application, ogs_diam_vendor, 1, 0);
|
ret = fd_disp_app_support(ogs_diam_gx_application, ogs_diam_vendor, 1, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pcrf_gx_final(void)
|
void pcrf_gx_final(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = fd_sess_handler_destroy(&pcrf_gx_reg, NULL);
|
ret = fd_sess_handler_destroy(&pcrf_gx_reg, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
if (hdl_gx_fb)
|
if (hdl_gx_fb)
|
||||||
(void) fd_disp_unregister(&hdl_gx_fb, NULL);
|
(void) fd_disp_unregister(&hdl_gx_fb, NULL);
|
||||||
if (hdl_gx_ccr)
|
if (hdl_gx_ccr)
|
||||||
(void) fd_disp_unregister(&hdl_gx_ccr, NULL);
|
(void) fd_disp_unregister(&hdl_gx_ccr, NULL);
|
||||||
|
|
||||||
ogs_pool_final(&sess_state_pool);
|
ogs_pool_final(&sess_state_pool);
|
||||||
ogs_pool_final(&rx_sess_state_pool);
|
ogs_pool_final(&rx_sess_state_pool);
|
||||||
|
|
|
@ -43,7 +43,7 @@ int pcrf_initialize(void)
|
||||||
|
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pcrf_terminate(void)
|
void pcrf_terminate(void)
|
||||||
|
@ -54,6 +54,6 @@ void pcrf_terminate(void)
|
||||||
|
|
||||||
ogs_dbi_final();
|
ogs_dbi_final();
|
||||||
pcrf_context_final();
|
pcrf_context_final();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,10 +81,10 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque)
|
||||||
static int pcrf_rx_fb_cb(struct msg **msg, struct avp *avp,
|
static int pcrf_rx_fb_cb(struct msg **msg, struct avp *avp,
|
||||||
struct session *sess, void *opaque, enum disp_action *act)
|
struct session *sess, void *opaque, enum disp_action *act)
|
||||||
{
|
{
|
||||||
/* This CB should never be called */
|
/* This CB should never be called */
|
||||||
ogs_warn("Unexpected message received!");
|
ogs_warn("Unexpected message received!");
|
||||||
|
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp,
|
static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp,
|
||||||
|
@ -93,7 +93,7 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv;
|
int rv;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
struct avp *avpch1, *avpch2, *avpch3;
|
struct avp *avpch1, *avpch2, *avpch3;
|
||||||
struct avp_hdr *hdr;
|
struct avp_hdr *hdr;
|
||||||
union avp_value val;
|
union avp_value val;
|
||||||
|
@ -110,7 +110,7 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp,
|
||||||
uint32_t result_code = OGS_DIAM_RX_DIAMETER_IP_CAN_SESSION_NOT_AVAILABLE;
|
uint32_t result_code = OGS_DIAM_RX_DIAMETER_IP_CAN_SESSION_NOT_AVAILABLE;
|
||||||
|
|
||||||
ogs_debug("[PCRF] AA-Request");
|
ogs_debug("[PCRF] AA-Request");
|
||||||
|
|
||||||
ogs_assert(msg);
|
ogs_assert(msg);
|
||||||
ogs_assert(sess);
|
ogs_assert(sess);
|
||||||
|
|
||||||
|
@ -129,9 +129,9 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp,
|
||||||
memset(&rx_message, 0, sizeof(ogs_diam_rx_message_t));
|
memset(&rx_message, 0, sizeof(ogs_diam_rx_message_t));
|
||||||
rx_message.cmd_code = OGS_DIAM_RX_CMD_CODE_AA;
|
rx_message.cmd_code = OGS_DIAM_RX_CMD_CODE_AA;
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -359,8 +359,8 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Store this value in the session */
|
/* Store this value in the session */
|
||||||
|
@ -368,16 +368,16 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp,
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(sess_data == NULL);
|
ogs_assert(sess_data == NULL);
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_debug("[PCRF] AA-Answer");
|
ogs_debug("[PCRF] AA-Answer");
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
|
|
||||||
ogs_ims_data_free(&rx_message.ims_data);
|
ogs_ims_data_free(&rx_message.ims_data);
|
||||||
|
|
||||||
|
@ -401,7 +401,7 @@ out:
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
state_cleanup(sess_data, NULL, NULL);
|
state_cleanup(sess_data, NULL, NULL);
|
||||||
|
@ -604,7 +604,7 @@ static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv;
|
int rv;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
struct avp_hdr *hdr;
|
struct avp_hdr *hdr;
|
||||||
union avp_value val;
|
union avp_value val;
|
||||||
struct sess_state *sess_data = NULL;
|
struct sess_state *sess_data = NULL;
|
||||||
|
@ -614,7 +614,7 @@ static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp,
|
||||||
uint32_t result_code = OGS_DIAM_RX_DIAMETER_IP_CAN_SESSION_NOT_AVAILABLE;
|
uint32_t result_code = OGS_DIAM_RX_DIAMETER_IP_CAN_SESSION_NOT_AVAILABLE;
|
||||||
|
|
||||||
ogs_debug("[PCRF] Session-Termination-Request");
|
ogs_debug("[PCRF] Session-Termination-Request");
|
||||||
|
|
||||||
ogs_assert(msg);
|
ogs_assert(msg);
|
||||||
ogs_assert(sess);
|
ogs_assert(sess);
|
||||||
|
|
||||||
|
@ -628,9 +628,9 @@ static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp,
|
||||||
memset(&rx_message, 0, sizeof(ogs_diam_rx_message_t));
|
memset(&rx_message, 0, sizeof(ogs_diam_rx_message_t));
|
||||||
rx_message.cmd_code = OGS_DIAM_RX_CMD_CODE_SESSION_TERMINATION;
|
rx_message.cmd_code = OGS_DIAM_RX_CMD_CODE_SESSION_TERMINATION;
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -684,20 +684,20 @@ static int pcrf_rx_str_cb( struct msg **msg, struct avp *avp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_debug("[PCRF] Session-Termination-Answer");
|
ogs_debug("[PCRF] Session-Termination-Answer");
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
|
|
||||||
state_cleanup(sess_data, NULL, NULL);
|
state_cleanup(sess_data, NULL, NULL);
|
||||||
ogs_ims_data_free(&rx_message.ims_data);
|
ogs_ims_data_free(&rx_message.ims_data);
|
||||||
|
@ -723,7 +723,7 @@ out:
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_debug("[PCRF] Session-Termination-Answer");
|
ogs_debug("[PCRF] Session-Termination-Answer");
|
||||||
|
|
||||||
|
@ -736,59 +736,59 @@ out:
|
||||||
int pcrf_rx_init(void)
|
int pcrf_rx_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
ogs_thread_mutex_init(&sess_state_mutex);
|
ogs_thread_mutex_init(&sess_state_mutex);
|
||||||
ogs_pool_init(&sess_state_pool, ogs_app()->pool.sess);
|
ogs_pool_init(&sess_state_pool, ogs_app()->pool.sess);
|
||||||
|
|
||||||
/* Install objects definitions for this application */
|
/* Install objects definitions for this application */
|
||||||
ret = ogs_diam_rx_init();
|
ret = ogs_diam_rx_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Create handler for sessions */
|
/* Create handler for sessions */
|
||||||
ret = fd_sess_handler_create(&pcrf_rx_reg, state_cleanup, NULL, NULL);
|
ret = fd_sess_handler_create(&pcrf_rx_reg, state_cleanup, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Fallback CB if command != unexpected message received */
|
/* Fallback CB if command != unexpected message received */
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.app = ogs_diam_rx_application;
|
data.app = ogs_diam_rx_application;
|
||||||
|
|
||||||
ret = fd_disp_register(pcrf_rx_fb_cb, DISP_HOW_APPID, &data, NULL,
|
ret = fd_disp_register(pcrf_rx_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||||
&hdl_rx_fb);
|
&hdl_rx_fb);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Specific handler for AA-Request */
|
/* Specific handler for AA-Request */
|
||||||
data.command = ogs_diam_rx_cmd_aar;
|
data.command = ogs_diam_rx_cmd_aar;
|
||||||
ret = fd_disp_register(pcrf_rx_aar_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(pcrf_rx_aar_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_rx_aar);
|
&hdl_rx_aar);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Specific handler for STR-Request */
|
/* Specific handler for STR-Request */
|
||||||
data.command = ogs_diam_rx_cmd_str;
|
data.command = ogs_diam_rx_cmd_str;
|
||||||
ret = fd_disp_register(pcrf_rx_str_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(pcrf_rx_str_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_rx_str);
|
&hdl_rx_str);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Advertise the support for the application in the peer */
|
/* Advertise the support for the application in the peer */
|
||||||
ret = fd_disp_app_support(ogs_diam_rx_application, ogs_diam_vendor, 1, 0);
|
ret = fd_disp_app_support(ogs_diam_rx_application, ogs_diam_vendor, 1, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pcrf_rx_final(void)
|
void pcrf_rx_final(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = fd_sess_handler_destroy(&pcrf_rx_reg, NULL);
|
ret = fd_sess_handler_destroy(&pcrf_rx_reg, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
if (hdl_rx_fb)
|
if (hdl_rx_fb)
|
||||||
(void) fd_disp_unregister(&hdl_rx_fb, NULL);
|
(void) fd_disp_unregister(&hdl_rx_fb, NULL);
|
||||||
if (hdl_rx_aar)
|
if (hdl_rx_aar)
|
||||||
(void) fd_disp_unregister(&hdl_rx_aar, NULL);
|
(void) fd_disp_unregister(&hdl_rx_aar, NULL);
|
||||||
if (hdl_rx_str)
|
if (hdl_rx_str)
|
||||||
(void) fd_disp_unregister(&hdl_rx_str, NULL);
|
(void) fd_disp_unregister(&hdl_rx_str, NULL);
|
||||||
|
|
||||||
ogs_pool_final(&sess_state_pool);
|
ogs_pool_final(&sess_state_pool);
|
||||||
ogs_thread_mutex_destroy(&sess_state_mutex);
|
ogs_thread_mutex_destroy(&sess_state_mutex);
|
||||||
|
|
|
@ -2648,22 +2648,22 @@ static const uint8_t *ipcp_contains_option(
|
||||||
const ogs_pco_ipcp_t *ipcp, size_t ipcp_len,
|
const ogs_pco_ipcp_t *ipcp, size_t ipcp_len,
|
||||||
enum ogs_pco_ipcp_options opt, size_t opt_minlen)
|
enum ogs_pco_ipcp_options opt, size_t opt_minlen)
|
||||||
{
|
{
|
||||||
const uint8_t *cur_opt = (const uint8_t *)ipcp->options;
|
const uint8_t *cur_opt = (const uint8_t *)ipcp->options;
|
||||||
|
|
||||||
/* iterate over Options and check if protocol contained */
|
/* iterate over Options and check if protocol contained */
|
||||||
while (cur_opt + sizeof(struct ogs_pco_ipcp_options_s) <=
|
while (cur_opt + sizeof(struct ogs_pco_ipcp_options_s) <=
|
||||||
(uint8_t*)ipcp + ipcp_len) {
|
(uint8_t*)ipcp + ipcp_len) {
|
||||||
const struct ogs_pco_ipcp_options_s *cur_opt_hdr =
|
const struct ogs_pco_ipcp_options_s *cur_opt_hdr =
|
||||||
(const struct ogs_pco_ipcp_options_s *)cur_opt;
|
(const struct ogs_pco_ipcp_options_s *)cur_opt;
|
||||||
/* length value includes 2 bytes type/length */
|
/* length value includes 2 bytes type/length */
|
||||||
if (cur_opt_hdr->len < 2)
|
if (cur_opt_hdr->len < 2)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (cur_opt_hdr->type == opt &&
|
if (cur_opt_hdr->type == opt &&
|
||||||
cur_opt_hdr->len >= 2 + opt_minlen)
|
cur_opt_hdr->len >= 2 + opt_minlen)
|
||||||
return cur_opt;
|
return cur_opt;
|
||||||
cur_opt += cur_opt_hdr->len;
|
cur_opt += cur_opt_hdr->len;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "../version.h"
|
#include "../version.h"
|
||||||
|
|
|
@ -41,7 +41,7 @@ int smf_fd_init(void)
|
||||||
rv = smf_gy_init();
|
rv = smf_gy_init();
|
||||||
ogs_assert(rv == OGS_OK);
|
ogs_assert(rv == OGS_OK);
|
||||||
|
|
||||||
rv = ogs_diam_rx_init();
|
rv = ogs_diam_rx_init();
|
||||||
ogs_assert(rv == 0);
|
ogs_assert(rv == 0);
|
||||||
rv = smf_s6b_init();
|
rv = smf_s6b_init();
|
||||||
ogs_assert(rv == OGS_OK);
|
ogs_assert(rv == OGS_OK);
|
||||||
|
@ -49,7 +49,7 @@ int smf_fd_init(void)
|
||||||
rv = ogs_diam_start();
|
rv = ogs_diam_start();
|
||||||
ogs_assert(rv == 0);
|
ogs_assert(rv == 0);
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void smf_fd_final(void)
|
void smf_fd_final(void)
|
||||||
|
|
|
@ -295,8 +295,8 @@ uint8_t smf_gn_handle_create_pdp_context_request(
|
||||||
}
|
}
|
||||||
|
|
||||||
ogs_info("UE IMSI[%s] APN[%s] IPv4[%s] IPv6[%s]",
|
ogs_info("UE IMSI[%s] APN[%s] IPv4[%s] IPv6[%s]",
|
||||||
smf_ue->imsi_bcd,
|
smf_ue->imsi_bcd,
|
||||||
sess->session.name,
|
sess->session.name,
|
||||||
sess->ipv4 ? OGS_INET_NTOP(&sess->ipv4->addr, buf1) : "",
|
sess->ipv4 ? OGS_INET_NTOP(&sess->ipv4->addr, buf1) : "",
|
||||||
sess->ipv6 ? OGS_INET6_NTOP(&sess->ipv6->addr, buf2) : "");
|
sess->ipv6 ? OGS_INET6_NTOP(&sess->ipv6->addr, buf2) : "");
|
||||||
|
|
||||||
|
|
|
@ -116,7 +116,7 @@ void smf_gx_send_ccr(smf_sess_t *sess, ogs_gtp_xact_t *xact,
|
||||||
if (sess->gx_sid) {
|
if (sess->gx_sid) {
|
||||||
/* Retrieve session by Session-Id */
|
/* Retrieve session by Session-Id */
|
||||||
size_t sidlen = strlen(sess->gx_sid);
|
size_t sidlen = strlen(sess->gx_sid);
|
||||||
ret = fd_sess_fromsid_msg((os0_t)sess->gx_sid, sidlen, &session, &new);
|
ret = fd_sess_fromsid_msg((os0_t)sess->gx_sid, sidlen, &session, &new);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(new == 0);
|
ogs_assert(new == 0);
|
||||||
|
|
||||||
|
@ -1097,10 +1097,10 @@ out:
|
||||||
static int smf_gx_fb_cb(struct msg **msg, struct avp *avp,
|
static int smf_gx_fb_cb(struct msg **msg, struct avp *avp,
|
||||||
struct session *sess, void *opaque, enum disp_action *act)
|
struct session *sess, void *opaque, enum disp_action *act)
|
||||||
{
|
{
|
||||||
/* This CB should never be called */
|
/* This CB should never be called */
|
||||||
ogs_warn("Unexpected message received!");
|
ogs_warn("Unexpected message received!");
|
||||||
|
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smf_gx_rar_cb( struct msg **msg, struct avp *avp,
|
static int smf_gx_rar_cb( struct msg **msg, struct avp *avp,
|
||||||
|
@ -1109,7 +1109,7 @@ static int smf_gx_rar_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv;
|
int rv;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
struct avp *avpch1;
|
struct avp *avpch1;
|
||||||
struct avp_hdr *hdr;
|
struct avp_hdr *hdr;
|
||||||
union avp_value val;
|
union avp_value val;
|
||||||
|
@ -1132,9 +1132,9 @@ static int smf_gx_rar_cb( struct msg **msg, struct avp *avp,
|
||||||
/* Set Credit Control Command */
|
/* Set Credit Control Command */
|
||||||
gx_message->cmd_code = OGS_DIAM_GX_CMD_RE_AUTH;
|
gx_message->cmd_code = OGS_DIAM_GX_CMD_RE_AUTH;
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -1284,8 +1284,8 @@ static int smf_gx_rar_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Store this value in the session */
|
/* Store this value in the session */
|
||||||
|
@ -1293,16 +1293,16 @@ static int smf_gx_rar_cb( struct msg **msg, struct avp *avp,
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(sess_data == NULL);
|
ogs_assert(sess_data == NULL);
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_debug("Re-Auth-Answer");
|
ogs_debug("Re-Auth-Answer");
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -1332,49 +1332,49 @@ out:
|
||||||
int smf_gx_init(void)
|
int smf_gx_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
ogs_thread_mutex_init(&sess_state_mutex);
|
ogs_thread_mutex_init(&sess_state_mutex);
|
||||||
ogs_pool_init(&sess_state_pool, ogs_app()->pool.sess);
|
ogs_pool_init(&sess_state_pool, ogs_app()->pool.sess);
|
||||||
|
|
||||||
/* Install objects definitions for this application */
|
/* Install objects definitions for this application */
|
||||||
ret = ogs_diam_gx_init();
|
ret = ogs_diam_gx_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Create handler for sessions */
|
/* Create handler for sessions */
|
||||||
ret = fd_sess_handler_create(&smf_gx_reg, state_cleanup, NULL, NULL);
|
ret = fd_sess_handler_create(&smf_gx_reg, state_cleanup, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.app = ogs_diam_gx_application;
|
data.app = ogs_diam_gx_application;
|
||||||
|
|
||||||
ret = fd_disp_register(smf_gx_fb_cb, DISP_HOW_APPID, &data, NULL,
|
ret = fd_disp_register(smf_gx_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||||
&hdl_gx_fb);
|
&hdl_gx_fb);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
data.command = ogs_diam_gx_cmd_rar;
|
data.command = ogs_diam_gx_cmd_rar;
|
||||||
ret = fd_disp_register(smf_gx_rar_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(smf_gx_rar_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_gx_rar);
|
&hdl_gx_rar);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Advertise the support for the application in the peer */
|
/* Advertise the support for the application in the peer */
|
||||||
ret = fd_disp_app_support(ogs_diam_gx_application, ogs_diam_vendor, 1, 0);
|
ret = fd_disp_app_support(ogs_diam_gx_application, ogs_diam_vendor, 1, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void smf_gx_final(void)
|
void smf_gx_final(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = fd_sess_handler_destroy(&smf_gx_reg, NULL);
|
ret = fd_sess_handler_destroy(&smf_gx_reg, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
if (hdl_gx_fb)
|
if (hdl_gx_fb)
|
||||||
(void) fd_disp_unregister(&hdl_gx_fb, NULL);
|
(void) fd_disp_unregister(&hdl_gx_fb, NULL);
|
||||||
if (hdl_gx_rar)
|
if (hdl_gx_rar)
|
||||||
(void) fd_disp_unregister(&hdl_gx_rar, NULL);
|
(void) fd_disp_unregister(&hdl_gx_rar, NULL);
|
||||||
|
|
||||||
ogs_pool_final(&sess_state_pool);
|
ogs_pool_final(&sess_state_pool);
|
||||||
ogs_thread_mutex_destroy(&sess_state_mutex);
|
ogs_thread_mutex_destroy(&sess_state_mutex);
|
||||||
|
|
|
@ -582,7 +582,7 @@ void smf_gy_send_ccr(smf_sess_t *sess, void *xact,
|
||||||
if (sess->gy_sid) {
|
if (sess->gy_sid) {
|
||||||
/* Retrieve session by Session-Id */
|
/* Retrieve session by Session-Id */
|
||||||
size_t sidlen = strlen(sess->gy_sid);
|
size_t sidlen = strlen(sess->gy_sid);
|
||||||
ret = fd_sess_fromsid_msg((os0_t)sess->gy_sid, sidlen, &session, &new);
|
ret = fd_sess_fromsid_msg((os0_t)sess->gy_sid, sidlen, &session, &new);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(new == 0);
|
ogs_assert(new == 0);
|
||||||
|
|
||||||
|
@ -1175,10 +1175,10 @@ out:
|
||||||
static int smf_gy_fb_cb(struct msg **msg, struct avp *avp,
|
static int smf_gy_fb_cb(struct msg **msg, struct avp *avp,
|
||||||
struct session *sess, void *opaque, enum disp_action *act)
|
struct session *sess, void *opaque, enum disp_action *act)
|
||||||
{
|
{
|
||||||
/* This CB should never be called */
|
/* This CB should never be called */
|
||||||
ogs_warn("Unexpected message received!");
|
ogs_warn("Unexpected message received!");
|
||||||
|
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smf_gy_rar_cb( struct msg **msg, struct avp *avp,
|
static int smf_gy_rar_cb( struct msg **msg, struct avp *avp,
|
||||||
|
@ -1187,7 +1187,7 @@ static int smf_gy_rar_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv;
|
int rv;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
struct msg *ans;
|
struct msg *ans;
|
||||||
union avp_value val;
|
union avp_value val;
|
||||||
struct sess_state *sess_data = NULL;
|
struct sess_state *sess_data = NULL;
|
||||||
|
|
||||||
|
@ -1207,8 +1207,8 @@ static int smf_gy_rar_cb( struct msg **msg, struct avp *avp,
|
||||||
/* Set Credit Control Command */
|
/* Set Credit Control Command */
|
||||||
gy_message->cmd_code = OGS_DIAM_GY_CMD_RE_AUTH;
|
gy_message->cmd_code = OGS_DIAM_GY_CMD_RE_AUTH;
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -1249,8 +1249,8 @@ static int smf_gy_rar_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Store this value in the session */
|
/* Store this value in the session */
|
||||||
|
@ -1258,16 +1258,16 @@ static int smf_gy_rar_cb( struct msg **msg, struct avp *avp,
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(sess_data == NULL);
|
ogs_assert(sess_data == NULL);
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ogs_debug("Re-Auth-Answer");
|
ogs_debug("Re-Auth-Answer");
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -1296,49 +1296,49 @@ out:
|
||||||
int smf_gy_init(void)
|
int smf_gy_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
ogs_thread_mutex_init(&sess_state_mutex);
|
ogs_thread_mutex_init(&sess_state_mutex);
|
||||||
ogs_pool_init(&sess_state_pool, ogs_app()->pool.sess);
|
ogs_pool_init(&sess_state_pool, ogs_app()->pool.sess);
|
||||||
|
|
||||||
/* Install objects definitions for this application */
|
/* Install objects definitions for this application */
|
||||||
ret = ogs_diam_gy_init();
|
ret = ogs_diam_gy_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Create handler for sessions */
|
/* Create handler for sessions */
|
||||||
ret = fd_sess_handler_create(&smf_gy_reg, state_cleanup, NULL, NULL);
|
ret = fd_sess_handler_create(&smf_gy_reg, state_cleanup, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.app = ogs_diam_gy_application;
|
data.app = ogs_diam_gy_application;
|
||||||
|
|
||||||
ret = fd_disp_register(smf_gy_fb_cb, DISP_HOW_APPID, &data, NULL,
|
ret = fd_disp_register(smf_gy_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||||
&hdl_gy_fb);
|
&hdl_gy_fb);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
data.command = ogs_diam_gy_cmd_rar;
|
data.command = ogs_diam_gy_cmd_rar;
|
||||||
ret = fd_disp_register(smf_gy_rar_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(smf_gy_rar_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_gy_rar);
|
&hdl_gy_rar);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Advertise the support for the application in the peer */
|
/* Advertise the support for the application in the peer */
|
||||||
ret = fd_disp_app_support(ogs_diam_gy_application, NULL, 1, 0);
|
ret = fd_disp_app_support(ogs_diam_gy_application, NULL, 1, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void smf_gy_final(void)
|
void smf_gy_final(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = fd_sess_handler_destroy(&smf_gy_reg, NULL);
|
ret = fd_sess_handler_destroy(&smf_gy_reg, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
if (hdl_gy_fb)
|
if (hdl_gy_fb)
|
||||||
(void) fd_disp_unregister(&hdl_gy_fb, NULL);
|
(void) fd_disp_unregister(&hdl_gy_fb, NULL);
|
||||||
if (hdl_gy_rar)
|
if (hdl_gy_rar)
|
||||||
(void) fd_disp_unregister(&hdl_gy_rar, NULL);
|
(void) fd_disp_unregister(&hdl_gy_rar, NULL);
|
||||||
|
|
||||||
ogs_pool_final(&sess_state_pool);
|
ogs_pool_final(&sess_state_pool);
|
||||||
ogs_thread_mutex_destroy(&sess_state_mutex);
|
ogs_thread_mutex_destroy(&sess_state_mutex);
|
||||||
|
|
|
@ -493,7 +493,7 @@ bool smf_npcf_smpolicycontrol_handle_create(
|
||||||
&ul_pdr->ue_ip_addr, &ul_pdr->ue_ip_addr_len));
|
&ul_pdr->ue_ip_addr, &ul_pdr->ue_ip_addr_len));
|
||||||
|
|
||||||
ogs_info("UE SUPI[%s] DNN[%s] IPv4[%s] IPv6[%s]",
|
ogs_info("UE SUPI[%s] DNN[%s] IPv4[%s] IPv6[%s]",
|
||||||
smf_ue->supi, sess->session.name,
|
smf_ue->supi, sess->session.name,
|
||||||
sess->ipv4 ? OGS_INET_NTOP(&sess->ipv4->addr, buf1) : "",
|
sess->ipv4 ? OGS_INET_NTOP(&sess->ipv4->addr, buf1) : "",
|
||||||
sess->ipv6 ? OGS_INET6_NTOP(&sess->ipv6->addr, buf2) : "");
|
sess->ipv6 ? OGS_INET6_NTOP(&sess->ipv6->addr, buf2) : "");
|
||||||
|
|
||||||
|
|
|
@ -253,8 +253,8 @@ uint8_t smf_s5c_handle_create_session_request(
|
||||||
ogs_assert(OGS_PFCP_CAUSE_REQUEST_ACCEPTED == smf_sess_set_ue_ip(sess));
|
ogs_assert(OGS_PFCP_CAUSE_REQUEST_ACCEPTED == smf_sess_set_ue_ip(sess));
|
||||||
|
|
||||||
ogs_info("UE IMSI[%s] APN[%s] IPv4[%s] IPv6[%s]",
|
ogs_info("UE IMSI[%s] APN[%s] IPv4[%s] IPv6[%s]",
|
||||||
smf_ue->imsi_bcd,
|
smf_ue->imsi_bcd,
|
||||||
sess->session.name,
|
sess->session.name,
|
||||||
sess->ipv4 ? OGS_INET_NTOP(&sess->ipv4->addr, buf1) : "",
|
sess->ipv4 ? OGS_INET_NTOP(&sess->ipv4->addr, buf1) : "",
|
||||||
sess->ipv6 ? OGS_INET6_NTOP(&sess->ipv6->addr, buf2) : "");
|
sess->ipv6 ? OGS_INET6_NTOP(&sess->ipv6->addr, buf2) : "");
|
||||||
|
|
||||||
|
|
|
@ -65,10 +65,10 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque)
|
||||||
static int smf_s6b_fb_cb(struct msg **msg, struct avp *avp,
|
static int smf_s6b_fb_cb(struct msg **msg, struct avp *avp,
|
||||||
struct session *sess, void *opaque, enum disp_action *act)
|
struct session *sess, void *opaque, enum disp_action *act)
|
||||||
{
|
{
|
||||||
/* This CB should never be called */
|
/* This CB should never be called */
|
||||||
ogs_warn("Unexpected message received!");
|
ogs_warn("Unexpected message received!");
|
||||||
|
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void smf_s6b_send_aar(smf_sess_t *sess, ogs_gtp_xact_t *xact)
|
void smf_s6b_send_aar(smf_sess_t *sess, ogs_gtp_xact_t *xact)
|
||||||
|
@ -111,7 +111,7 @@ void smf_s6b_send_aar(smf_sess_t *sess, ogs_gtp_xact_t *xact)
|
||||||
if (sess->s6b_sid) {
|
if (sess->s6b_sid) {
|
||||||
/* Retrieve session by Session-Id */
|
/* Retrieve session by Session-Id */
|
||||||
size_t sidlen = strlen(sess->s6b_sid);
|
size_t sidlen = strlen(sess->s6b_sid);
|
||||||
ret = fd_sess_fromsid_msg((os0_t)sess->s6b_sid, sidlen, &session, &new);
|
ret = fd_sess_fromsid_msg((os0_t)sess->s6b_sid, sidlen, &session, &new);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(new == 0);
|
ogs_assert(new == 0);
|
||||||
|
|
||||||
|
@ -772,42 +772,42 @@ static void smf_s6b_sta_cb(void *data, struct msg **msg)
|
||||||
int smf_s6b_init(void)
|
int smf_s6b_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
ogs_thread_mutex_init(&sess_state_mutex);
|
ogs_thread_mutex_init(&sess_state_mutex);
|
||||||
ogs_pool_init(&sess_state_pool, ogs_app()->pool.sess);
|
ogs_pool_init(&sess_state_pool, ogs_app()->pool.sess);
|
||||||
|
|
||||||
/* Install objects definitions for this application */
|
/* Install objects definitions for this application */
|
||||||
ret = ogs_diam_s6b_init();
|
ret = ogs_diam_s6b_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Create handler for sessions */
|
/* Create handler for sessions */
|
||||||
ret = fd_sess_handler_create(&smf_s6b_reg, state_cleanup, NULL, NULL);
|
ret = fd_sess_handler_create(&smf_s6b_reg, state_cleanup, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.app = ogs_diam_s6b_application;
|
data.app = ogs_diam_s6b_application;
|
||||||
|
|
||||||
ret = fd_disp_register(smf_s6b_fb_cb, DISP_HOW_APPID, &data, NULL,
|
ret = fd_disp_register(smf_s6b_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||||
&hdl_s6b_fb);
|
&hdl_s6b_fb);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Advertise the support for the application in the peer */
|
/* Advertise the support for the application in the peer */
|
||||||
ret = fd_disp_app_support(ogs_diam_s6b_application, ogs_diam_vendor, 1, 0);
|
ret = fd_disp_app_support(ogs_diam_s6b_application, ogs_diam_vendor, 1, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void smf_s6b_final(void)
|
void smf_s6b_final(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = fd_sess_handler_destroy(&smf_s6b_reg, NULL);
|
ret = fd_sess_handler_destroy(&smf_s6b_reg, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
if (hdl_s6b_fb)
|
if (hdl_s6b_fb)
|
||||||
(void) fd_disp_unregister(&hdl_s6b_fb, NULL);
|
(void) fd_disp_unregister(&hdl_s6b_fb, NULL);
|
||||||
|
|
||||||
ogs_pool_final(&sess_state_pool);
|
ogs_pool_final(&sess_state_pool);
|
||||||
ogs_thread_mutex_destroy(&sess_state_mutex);
|
ogs_thread_mutex_destroy(&sess_state_mutex);
|
||||||
|
|
|
@ -301,8 +301,8 @@ ogs_pkbuf_t *testemm_build_authentication_response(test_ue_t *test_ue)
|
||||||
milenage_f2345(test_ue->opc, test_ue->k, test_ue->rand,
|
milenage_f2345(test_ue->opc, test_ue->k, test_ue->rand,
|
||||||
res, ck, ik, ak, NULL);
|
res, ck, ik, ak, NULL);
|
||||||
|
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
sqn[i] = test_ue->autn[i] ^ ak[i];
|
sqn[i] = test_ue->autn[i] ^ ak[i];
|
||||||
|
|
||||||
ogs_nas_from_plmn_id(&nas_plmn_id, &test_ue->e_tai.plmn_id);
|
ogs_nas_from_plmn_id(&nas_plmn_id, &test_ue->e_tai.plmn_id);
|
||||||
ogs_auc_kasme(ck, ik, &nas_plmn_id, sqn, ak, test_ue->kasme);
|
ogs_auc_kasme(ck, ik, &nas_plmn_id, sqn, ak, test_ue->kasme);
|
||||||
|
|
|
@ -1717,10 +1717,10 @@ ogs_pkbuf_t *test_s1ap_build_enb_status_transfer(test_ue_t *test_ue)
|
||||||
S1AP_ENB_UE_S1AP_ID_t *ENB_UE_S1AP_ID = NULL;
|
S1AP_ENB_UE_S1AP_ID_t *ENB_UE_S1AP_ID = NULL;
|
||||||
S1AP_ENB_StatusTransfer_TransparentContainer_t
|
S1AP_ENB_StatusTransfer_TransparentContainer_t
|
||||||
*ENB_StatusTransfer_TransparentContainer = NULL;
|
*ENB_StatusTransfer_TransparentContainer = NULL;
|
||||||
S1AP_Bearers_SubjectToStatusTransferList_t
|
S1AP_Bearers_SubjectToStatusTransferList_t
|
||||||
*Bearers_SubjectToStatusTransferList = NULL;
|
*Bearers_SubjectToStatusTransferList = NULL;
|
||||||
S1AP_Bearers_SubjectToStatusTransfer_ItemIEs_t *ie2 = NULL;
|
S1AP_Bearers_SubjectToStatusTransfer_ItemIEs_t *ie2 = NULL;
|
||||||
S1AP_Bearers_SubjectToStatusTransfer_Item_t *item = NULL;
|
S1AP_Bearers_SubjectToStatusTransfer_Item_t *item = NULL;
|
||||||
|
|
||||||
ogs_assert(test_ue);
|
ogs_assert(test_ue);
|
||||||
|
|
||||||
|
|
|
@ -305,7 +305,7 @@ void ogs_tlv_test_check_embed_ogs_tlv_test(abts_case *tc, ogs_tlv_t *root_tlv, i
|
||||||
ogs_tlv_free_all(parsed_tlv);
|
ogs_tlv_free_all(parsed_tlv);
|
||||||
ABTS_INT_EQUAL(tc, ogs_tlv_pool_avail(), ogs_core()->tlv.pool);
|
ABTS_INT_EQUAL(tc, ogs_tlv_pool_avail(), ogs_core()->tlv.pool);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* basic encoding/decoding/finding Test */
|
/* basic encoding/decoding/finding Test */
|
||||||
|
@ -467,7 +467,7 @@ static void test2_func(abts_case *tc, void *data)
|
||||||
|
|
||||||
ogs_tlv_test_check_embed_ogs_tlv_test(tc, root_tlv, mode);
|
ogs_tlv_test_check_embed_ogs_tlv_test(tc, root_tlv, mode);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -858,23 +858,23 @@ abts_suite *test_tlv(abts_suite *suite)
|
||||||
|
|
||||||
abts_run_test(suite, test1_func, (void*)OGS_TLV_MODE_T2_L2);
|
abts_run_test(suite, test1_func, (void*)OGS_TLV_MODE_T2_L2);
|
||||||
abts_run_test(suite, test2_func, (void*)OGS_TLV_MODE_T2_L2);
|
abts_run_test(suite, test2_func, (void*)OGS_TLV_MODE_T2_L2);
|
||||||
abts_run_test(suite, test3_func, (void*)OGS_TLV_MODE_T2_L2);
|
abts_run_test(suite, test3_func, (void*)OGS_TLV_MODE_T2_L2);
|
||||||
abts_run_test(suite, test4_func, (void*)OGS_TLV_MODE_T2_L2);
|
abts_run_test(suite, test4_func, (void*)OGS_TLV_MODE_T2_L2);
|
||||||
abts_run_test(suite, test5_func, (void*)OGS_TLV_MODE_T2_L2);
|
abts_run_test(suite, test5_func, (void*)OGS_TLV_MODE_T2_L2);
|
||||||
abts_run_test(suite, test1_func, (void*)OGS_TLV_MODE_T1_L1);
|
abts_run_test(suite, test1_func, (void*)OGS_TLV_MODE_T1_L1);
|
||||||
abts_run_test(suite, test5_func, (void*)OGS_TLV_MODE_T1_L1);
|
abts_run_test(suite, test5_func, (void*)OGS_TLV_MODE_T1_L1);
|
||||||
abts_run_test(suite, test1_func, (void*)OGS_TLV_MODE_T1_L2);
|
abts_run_test(suite, test1_func, (void*)OGS_TLV_MODE_T1_L2);
|
||||||
abts_run_test(suite, test2_func, (void*)OGS_TLV_MODE_T1_L2);
|
abts_run_test(suite, test2_func, (void*)OGS_TLV_MODE_T1_L2);
|
||||||
abts_run_test(suite, test3_func, (void*)OGS_TLV_MODE_T1_L2);
|
abts_run_test(suite, test3_func, (void*)OGS_TLV_MODE_T1_L2);
|
||||||
abts_run_test(suite, test4_func, (void*)OGS_TLV_MODE_T1_L2);
|
abts_run_test(suite, test4_func, (void*)OGS_TLV_MODE_T1_L2);
|
||||||
abts_run_test(suite, test5_func, (void*)OGS_TLV_MODE_T1_L2);
|
abts_run_test(suite, test5_func, (void*)OGS_TLV_MODE_T1_L2);
|
||||||
abts_run_test(suite, test1_func, (void*)OGS_TLV_MODE_T1_L2_I1);
|
abts_run_test(suite, test1_func, (void*)OGS_TLV_MODE_T1_L2_I1);
|
||||||
abts_run_test(suite, test2_func, (void*)OGS_TLV_MODE_T1_L2_I1);
|
abts_run_test(suite, test2_func, (void*)OGS_TLV_MODE_T1_L2_I1);
|
||||||
abts_run_test(suite, test3_func, (void*)OGS_TLV_MODE_T1_L2_I1);
|
abts_run_test(suite, test3_func, (void*)OGS_TLV_MODE_T1_L2_I1);
|
||||||
abts_run_test(suite, test4_func, (void*)OGS_TLV_MODE_T1_L2_I1);
|
abts_run_test(suite, test4_func, (void*)OGS_TLV_MODE_T1_L2_I1);
|
||||||
abts_run_test(suite, test5_func, (void*)OGS_TLV_MODE_T1_L2_I1);
|
abts_run_test(suite, test5_func, (void*)OGS_TLV_MODE_T1_L2_I1);
|
||||||
|
|
||||||
abts_run_test(suite, test6_func, NULL);
|
abts_run_test(suite, test6_func, NULL);
|
||||||
|
|
||||||
return suite;
|
return suite;
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,10 +69,10 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque)
|
||||||
static int test_s6b_fb_cb(struct msg **msg, struct avp *avp,
|
static int test_s6b_fb_cb(struct msg **msg, struct avp *avp,
|
||||||
struct session *sess, void *opaque, enum disp_action *act)
|
struct session *sess, void *opaque, enum disp_action *act)
|
||||||
{
|
{
|
||||||
/* This CB should never be called */
|
/* This CB should never be called */
|
||||||
ogs_warn("Unexpected message received!");
|
ogs_warn("Unexpected message received!");
|
||||||
|
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test_s6b_aar_cb( struct msg **msg, struct avp *avp,
|
static int test_s6b_aar_cb( struct msg **msg, struct avp *avp,
|
||||||
|
@ -81,7 +81,7 @@ static int test_s6b_aar_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv;
|
int rv;
|
||||||
int ret = 0, i;
|
int ret = 0, i;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
struct avp *avpch1, *avpch2;
|
struct avp *avpch1, *avpch2;
|
||||||
struct avp_hdr *hdr;
|
struct avp_hdr *hdr;
|
||||||
union avp_value val;
|
union avp_value val;
|
||||||
|
@ -91,9 +91,9 @@ static int test_s6b_aar_cb( struct msg **msg, struct avp *avp,
|
||||||
|
|
||||||
ogs_assert(msg);
|
ogs_assert(msg);
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -151,8 +151,8 @@ static int test_s6b_aar_cb( struct msg **msg, struct avp *avp,
|
||||||
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Store this value in the session */
|
/* Store this value in the session */
|
||||||
|
@ -160,19 +160,19 @@ static int test_s6b_aar_cb( struct msg **msg, struct avp *avp,
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(sess_data == NULL);
|
ogs_assert(sess_data == NULL);
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) ==0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) ==0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* Set the Result-Code */
|
/* Set the Result-Code */
|
||||||
if (result_code == OGS_DIAM_AVP_UNSUPPORTED) {
|
if (result_code == OGS_DIAM_AVP_UNSUPPORTED) {
|
||||||
ret = fd_msg_rescode_set(ans,
|
ret = fd_msg_rescode_set(ans,
|
||||||
(char *)"DIAMETER_AVP_UNSUPPORTED", NULL, NULL, 1);
|
(char *)"DIAMETER_AVP_UNSUPPORTED", NULL, NULL, 1);
|
||||||
|
@ -196,7 +196,7 @@ out:
|
||||||
ogs_assert(sess_data == NULL);
|
ogs_assert(sess_data == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -208,7 +208,7 @@ static int test_s6b_str_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv;
|
int rv;
|
||||||
int ret = 0, i;
|
int ret = 0, i;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
struct avp *avpch1, *avpch2;
|
struct avp *avpch1, *avpch2;
|
||||||
struct avp_hdr *hdr;
|
struct avp_hdr *hdr;
|
||||||
union avp_value val;
|
union avp_value val;
|
||||||
|
@ -218,9 +218,9 @@ static int test_s6b_str_cb( struct msg **msg, struct avp *avp,
|
||||||
|
|
||||||
ogs_assert(msg);
|
ogs_assert(msg);
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -251,8 +251,8 @@ static int test_s6b_str_cb( struct msg **msg, struct avp *avp,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char *)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Store this value in the session */
|
/* Store this value in the session */
|
||||||
|
@ -260,19 +260,19 @@ static int test_s6b_str_cb( struct msg **msg, struct avp *avp,
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(sess_data == NULL);
|
ogs_assert(sess_data == NULL);
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) ==0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) ==0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* Set the Result-Code */
|
/* Set the Result-Code */
|
||||||
if (result_code == OGS_DIAM_AVP_UNSUPPORTED) {
|
if (result_code == OGS_DIAM_AVP_UNSUPPORTED) {
|
||||||
ret = fd_msg_rescode_set(ans,
|
ret = fd_msg_rescode_set(ans,
|
||||||
(char *)"DIAMETER_AVP_UNSUPPORTED", NULL, NULL, 1);
|
(char *)"DIAMETER_AVP_UNSUPPORTED", NULL, NULL, 1);
|
||||||
|
@ -296,7 +296,7 @@ out:
|
||||||
ogs_assert(sess_data == NULL);
|
ogs_assert(sess_data == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -305,57 +305,57 @@ out:
|
||||||
int test_s6b_init(void)
|
int test_s6b_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
ogs_thread_mutex_init(&sess_state_mutex);
|
ogs_thread_mutex_init(&sess_state_mutex);
|
||||||
ogs_pool_init(&sess_state_pool, ogs_app()->pool.sess);
|
ogs_pool_init(&sess_state_pool, ogs_app()->pool.sess);
|
||||||
|
|
||||||
/* Install objects definitions for this application */
|
/* Install objects definitions for this application */
|
||||||
ret = ogs_diam_s6b_init();
|
ret = ogs_diam_s6b_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Create handler for sessions */
|
/* Create handler for sessions */
|
||||||
ret = fd_sess_handler_create(&test_s6b_reg, &state_cleanup, NULL, NULL);
|
ret = fd_sess_handler_create(&test_s6b_reg, &state_cleanup, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Fallback CB if command != unexpected message received */
|
/* Fallback CB if command != unexpected message received */
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.app = ogs_diam_s6b_application;
|
data.app = ogs_diam_s6b_application;
|
||||||
|
|
||||||
ret = fd_disp_register(test_s6b_fb_cb, DISP_HOW_APPID, &data, NULL,
|
ret = fd_disp_register(test_s6b_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||||
&hdl_s6b_fb);
|
&hdl_s6b_fb);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
data.command = ogs_diam_rx_cmd_aar;
|
data.command = ogs_diam_rx_cmd_aar;
|
||||||
ret = fd_disp_register(test_s6b_aar_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(test_s6b_aar_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_s6b_aar);
|
&hdl_s6b_aar);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
data.command = ogs_diam_rx_cmd_str;
|
data.command = ogs_diam_rx_cmd_str;
|
||||||
ret = fd_disp_register(test_s6b_str_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(test_s6b_str_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_s6b_str);
|
&hdl_s6b_str);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Advertise the support for the application in the peer */
|
/* Advertise the support for the application in the peer */
|
||||||
ret = fd_disp_app_support(ogs_diam_s6b_application, ogs_diam_vendor, 1, 0);
|
ret = fd_disp_app_support(ogs_diam_s6b_application, ogs_diam_vendor, 1, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_s6b_final(void)
|
void test_s6b_final(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = fd_sess_handler_destroy(&test_s6b_reg, NULL);
|
ret = fd_sess_handler_destroy(&test_s6b_reg, NULL);
|
||||||
ogs_assert(ret == OGS_OK);
|
ogs_assert(ret == OGS_OK);
|
||||||
|
|
||||||
if (hdl_s6b_fb)
|
if (hdl_s6b_fb)
|
||||||
(void) fd_disp_unregister(&hdl_s6b_fb, NULL);
|
(void) fd_disp_unregister(&hdl_s6b_fb, NULL);
|
||||||
if (hdl_s6b_aar)
|
if (hdl_s6b_aar)
|
||||||
(void) fd_disp_unregister(&hdl_s6b_aar, NULL);
|
(void) fd_disp_unregister(&hdl_s6b_aar, NULL);
|
||||||
if (hdl_s6b_str)
|
if (hdl_s6b_str)
|
||||||
(void) fd_disp_unregister(&hdl_s6b_str, NULL);
|
(void) fd_disp_unregister(&hdl_s6b_str, NULL);
|
||||||
|
|
||||||
ogs_pool_final(&sess_state_pool);
|
ogs_pool_final(&sess_state_pool);
|
||||||
ogs_thread_mutex_destroy(&sess_state_mutex);
|
ogs_thread_mutex_destroy(&sess_state_mutex);
|
||||||
|
|
|
@ -57,10 +57,10 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque)
|
||||||
static int test_swx_fb_cb(struct msg **msg, struct avp *avp,
|
static int test_swx_fb_cb(struct msg **msg, struct avp *avp,
|
||||||
struct session *sess, void *opaque, enum disp_action *act)
|
struct session *sess, void *opaque, enum disp_action *act)
|
||||||
{
|
{
|
||||||
/* This CB should never be called */
|
/* This CB should never be called */
|
||||||
ogs_warn("Unexpected message received!");
|
ogs_warn("Unexpected message received!");
|
||||||
|
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_swx_send(test_sess_t *sess, bool handover_ind,
|
void test_swx_send(test_sess_t *sess, bool handover_ind,
|
||||||
|
@ -629,38 +629,38 @@ static void test_swx_saa_cb(void *data, struct msg **msg)
|
||||||
int test_swx_init(void)
|
int test_swx_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
/* Install objects definitions for this application */
|
/* Install objects definitions for this application */
|
||||||
ret = ogs_diam_swx_init();
|
ret = ogs_diam_swx_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Create handler for sessions */
|
/* Create handler for sessions */
|
||||||
ret = fd_sess_handler_create(&test_swx_reg, &state_cleanup, NULL, NULL);
|
ret = fd_sess_handler_create(&test_swx_reg, &state_cleanup, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Fallback CB if command != unexpected message received */
|
/* Fallback CB if command != unexpected message received */
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.app = ogs_diam_swx_application;
|
data.app = ogs_diam_swx_application;
|
||||||
|
|
||||||
ret = fd_disp_register(test_swx_fb_cb, DISP_HOW_APPID, &data, NULL,
|
ret = fd_disp_register(test_swx_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||||
&hdl_swx_fb);
|
&hdl_swx_fb);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Advertise the support for the application in the peer */
|
/* Advertise the support for the application in the peer */
|
||||||
ret = fd_disp_app_support(ogs_diam_swx_application, ogs_diam_vendor, 1, 0);
|
ret = fd_disp_app_support(ogs_diam_swx_application, ogs_diam_vendor, 1, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_swx_final(void)
|
void test_swx_final(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = fd_sess_handler_destroy(&test_swx_reg, NULL);
|
ret = fd_sess_handler_destroy(&test_swx_reg, NULL);
|
||||||
ogs_assert(ret == OGS_OK);
|
ogs_assert(ret == OGS_OK);
|
||||||
|
|
||||||
if (hdl_swx_fb)
|
if (hdl_swx_fb)
|
||||||
(void) fd_disp_unregister(&hdl_swx_fb, NULL);
|
(void) fd_disp_unregister(&hdl_swx_fb, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,11 +59,11 @@ ogs_pkbuf_t *test_s2b_build_create_session_request(
|
||||||
memset(>p_message, 0, sizeof(ogs_gtp2_message_t));
|
memset(>p_message, 0, sizeof(ogs_gtp2_message_t));
|
||||||
|
|
||||||
if (handover_ind == true) {
|
if (handover_ind == true) {
|
||||||
memset(&indication, 0, sizeof(ogs_gtp2_indication_t));
|
memset(&indication, 0, sizeof(ogs_gtp2_indication_t));
|
||||||
indication.handover_indication = 1;
|
indication.handover_indication = 1;
|
||||||
req->indication_flags.presence = 1;
|
req->indication_flags.presence = 1;
|
||||||
req->indication_flags.data = &indication;
|
req->indication_flags.data = &indication;
|
||||||
req->indication_flags.len = sizeof(ogs_gtp2_indication_t);
|
req->indication_flags.len = sizeof(ogs_gtp2_indication_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
ogs_assert(test_ue->imsi_len);
|
ogs_assert(test_ue->imsi_len);
|
||||||
|
|
|
@ -69,18 +69,18 @@ static void test_diam_config(void)
|
||||||
int test_fd_init(void)
|
int test_fd_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
test_diam_config();
|
test_diam_config();
|
||||||
|
|
||||||
ret = ogs_diam_init(FD_MODE_CLIENT, NULL, &diam_config);
|
ret = ogs_diam_init(FD_MODE_CLIENT, NULL, &diam_config);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
ret = ogs_diam_s6a_init();
|
ret = ogs_diam_s6a_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ret = ogs_diam_cx_init();
|
ret = ogs_diam_cx_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ret = ogs_diam_rx_init();
|
ret = ogs_diam_rx_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
test_swx_init();
|
test_swx_init();
|
||||||
|
@ -89,7 +89,7 @@ int test_fd_init(void)
|
||||||
ret = ogs_diam_start();
|
ret = ogs_diam_start();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_fd_final(void)
|
void test_fd_final(void)
|
||||||
|
|
|
@ -22,11 +22,11 @@
|
||||||
|
|
||||||
static void sbi_message_test1(abts_case *tc, void *data)
|
static void sbi_message_test1(abts_case *tc, void *data)
|
||||||
{
|
{
|
||||||
cJSON *item = NULL;
|
cJSON *item = NULL;
|
||||||
OpenAPI_lnode_t *entry;
|
OpenAPI_lnode_t *entry;
|
||||||
|
|
||||||
OpenAPI_nf_profile_t *nf_profile1;
|
OpenAPI_nf_profile_t *nf_profile1;
|
||||||
OpenAPI_nf_profile_t *nf_profile2;
|
OpenAPI_nf_profile_t *nf_profile2;
|
||||||
|
|
||||||
OpenAPI_udr_info_t *udr_info1;
|
OpenAPI_udr_info_t *udr_info1;
|
||||||
OpenAPI_udr_info_t *udr_info2;
|
OpenAPI_udr_info_t *udr_info2;
|
||||||
|
@ -41,9 +41,9 @@ static void sbi_message_test1(abts_case *tc, void *data)
|
||||||
|
|
||||||
nf_profile1 = ogs_calloc(1, sizeof(*nf_profile1));
|
nf_profile1 = ogs_calloc(1, sizeof(*nf_profile1));
|
||||||
ABTS_PTR_NOTNULL(tc, nf_profile1);
|
ABTS_PTR_NOTNULL(tc, nf_profile1);
|
||||||
nf_profile1->nf_instance_id = "NF_INSTANCE_ID";
|
nf_profile1->nf_instance_id = "NF_INSTANCE_ID";
|
||||||
nf_profile1->nf_type = OpenAPI_nf_type_SMF;
|
nf_profile1->nf_type = OpenAPI_nf_type_SMF;
|
||||||
nf_profile1->nf_status = OpenAPI_nf_status_REGISTERED;
|
nf_profile1->nf_status = OpenAPI_nf_status_REGISTERED;
|
||||||
|
|
||||||
memset(plmn_id1, 0, sizeof(plmn_id1));
|
memset(plmn_id1, 0, sizeof(plmn_id1));
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ static void sbi_message_test1(abts_case *tc, void *data)
|
||||||
identity_range1->end = "9";
|
identity_range1->end = "9";
|
||||||
OpenAPI_list_add(udr_info1->gpsi_ranges, identity_range1);
|
OpenAPI_list_add(udr_info1->gpsi_ranges, identity_range1);
|
||||||
|
|
||||||
item = OpenAPI_nf_profile_convertToJSON(nf_profile1);
|
item = OpenAPI_nf_profile_convertToJSON(nf_profile1);
|
||||||
ABTS_PTR_NOTNULL(tc, item);
|
ABTS_PTR_NOTNULL(tc, item);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -94,7 +94,7 @@ static void sbi_message_test1(abts_case *tc, void *data)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
nf_profile2 = OpenAPI_nf_profile_parseFromJSON(item);
|
nf_profile2 = OpenAPI_nf_profile_parseFromJSON(item);
|
||||||
ABTS_PTR_NOTNULL(tc, nf_profile2);
|
ABTS_PTR_NOTNULL(tc, nf_profile2);
|
||||||
|
|
||||||
ABTS_STR_EQUAL(tc,
|
ABTS_STR_EQUAL(tc,
|
||||||
|
@ -170,27 +170,27 @@ static void sbi_message_test1(abts_case *tc, void *data)
|
||||||
|
|
||||||
cJSON_Delete(item);
|
cJSON_Delete(item);
|
||||||
|
|
||||||
OpenAPI_nf_profile_free(nf_profile2);
|
OpenAPI_nf_profile_free(nf_profile2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sbi_message_test2(abts_case *tc, void *data)
|
static void sbi_message_test2(abts_case *tc, void *data)
|
||||||
{
|
{
|
||||||
cJSON *item = NULL;
|
cJSON *item = NULL;
|
||||||
OpenAPI_lnode_t *entry;
|
OpenAPI_lnode_t *entry;
|
||||||
|
|
||||||
OpenAPI_nf_group_cond_t *nf_group_cond1;
|
OpenAPI_nf_group_cond_t *nf_group_cond1;
|
||||||
OpenAPI_nf_group_cond_t *nf_group_cond2;
|
OpenAPI_nf_group_cond_t *nf_group_cond2;
|
||||||
|
|
||||||
OpenAPI_smf_info_t *smf_info1;
|
OpenAPI_smf_info_t *smf_info1;
|
||||||
OpenAPI_smf_info_t *smf_info2;
|
OpenAPI_smf_info_t *smf_info2;
|
||||||
OpenAPI_access_type_e access_type;
|
OpenAPI_access_type_e access_type;
|
||||||
|
|
||||||
nf_group_cond1 = ogs_calloc(1, sizeof(*nf_group_cond1));
|
nf_group_cond1 = ogs_calloc(1, sizeof(*nf_group_cond1));
|
||||||
ABTS_PTR_NOTNULL(tc, nf_group_cond1);
|
ABTS_PTR_NOTNULL(tc, nf_group_cond1);
|
||||||
nf_group_cond1->nf_type = OpenAPI_nf_group_cond_NFTYPE_UDR;
|
nf_group_cond1->nf_type = OpenAPI_nf_group_cond_NFTYPE_UDR;
|
||||||
nf_group_cond1->nf_group_id = "group";
|
nf_group_cond1->nf_group_id = "group";
|
||||||
|
|
||||||
item = OpenAPI_nf_group_cond_convertToJSON(nf_group_cond1);
|
item = OpenAPI_nf_group_cond_convertToJSON(nf_group_cond1);
|
||||||
ABTS_PTR_NOTNULL(tc, item);
|
ABTS_PTR_NOTNULL(tc, item);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -201,7 +201,7 @@ static void sbi_message_test2(abts_case *tc, void *data)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
nf_group_cond2 = OpenAPI_nf_group_cond_parseFromJSON(item);
|
nf_group_cond2 = OpenAPI_nf_group_cond_parseFromJSON(item);
|
||||||
ABTS_PTR_NOTNULL(tc, nf_group_cond2);
|
ABTS_PTR_NOTNULL(tc, nf_group_cond2);
|
||||||
|
|
||||||
ABTS_STR_EQUAL(tc,
|
ABTS_STR_EQUAL(tc,
|
||||||
|
@ -218,7 +218,7 @@ static void sbi_message_test2(abts_case *tc, void *data)
|
||||||
smf_info1 = ogs_calloc(1, sizeof(*smf_info1));
|
smf_info1 = ogs_calloc(1, sizeof(*smf_info1));
|
||||||
ABTS_PTR_NOTNULL(tc, smf_info1);
|
ABTS_PTR_NOTNULL(tc, smf_info1);
|
||||||
smf_info1->s_nssai_smf_info_list = OpenAPI_list_create();
|
smf_info1->s_nssai_smf_info_list = OpenAPI_list_create();
|
||||||
smf_info1->pgw_fqdn = "PGW_FQDN";
|
smf_info1->pgw_fqdn = "PGW_FQDN";
|
||||||
smf_info1->access_type = OpenAPI_list_create();
|
smf_info1->access_type = OpenAPI_list_create();
|
||||||
ABTS_PTR_NOTNULL(tc, smf_info1->access_type);
|
ABTS_PTR_NOTNULL(tc, smf_info1->access_type);
|
||||||
|
|
||||||
|
@ -226,7 +226,7 @@ static void sbi_message_test2(abts_case *tc, void *data)
|
||||||
(void*)OpenAPI_access_type_3GPP_ACCESS);
|
(void*)OpenAPI_access_type_3GPP_ACCESS);
|
||||||
OpenAPI_list_add(smf_info1->access_type,
|
OpenAPI_list_add(smf_info1->access_type,
|
||||||
(void*)OpenAPI_access_type_NON_3GPP_ACCESS);
|
(void*)OpenAPI_access_type_NON_3GPP_ACCESS);
|
||||||
item = OpenAPI_smf_info_convertToJSON(smf_info1);
|
item = OpenAPI_smf_info_convertToJSON(smf_info1);
|
||||||
ABTS_PTR_NOTNULL(tc, item);
|
ABTS_PTR_NOTNULL(tc, item);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -237,7 +237,7 @@ static void sbi_message_test2(abts_case *tc, void *data)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
smf_info2 = OpenAPI_smf_info_parseFromJSON(item);
|
smf_info2 = OpenAPI_smf_info_parseFromJSON(item);
|
||||||
ABTS_PTR_NOTNULL(tc, smf_info2);
|
ABTS_PTR_NOTNULL(tc, smf_info2);
|
||||||
|
|
||||||
ABTS_STR_EQUAL(tc,
|
ABTS_STR_EQUAL(tc,
|
||||||
|
@ -270,11 +270,11 @@ static void sbi_message_test2(abts_case *tc, void *data)
|
||||||
|
|
||||||
static void sbi_message_test3(abts_case *tc, void *data)
|
static void sbi_message_test3(abts_case *tc, void *data)
|
||||||
{
|
{
|
||||||
cJSON *item = NULL;
|
cJSON *item = NULL;
|
||||||
OpenAPI_lnode_t *entry;
|
OpenAPI_lnode_t *entry;
|
||||||
|
|
||||||
OpenAPI_nrf_info_t *nrf_info1;
|
OpenAPI_nrf_info_t *nrf_info1;
|
||||||
OpenAPI_nrf_info_t *nrf_info2;
|
OpenAPI_nrf_info_t *nrf_info2;
|
||||||
|
|
||||||
OpenAPI_map_t *served_pcf_info1 = NULL;
|
OpenAPI_map_t *served_pcf_info1 = NULL;
|
||||||
OpenAPI_map_t *served_pcf_info2 = NULL;
|
OpenAPI_map_t *served_pcf_info2 = NULL;
|
||||||
|
@ -301,7 +301,7 @@ static void sbi_message_test3(abts_case *tc, void *data)
|
||||||
OpenAPI_list_add(nrf_info1->served_pcf_info, served_pcf_info1);
|
OpenAPI_list_add(nrf_info1->served_pcf_info, served_pcf_info1);
|
||||||
OpenAPI_list_add(nrf_info1->served_pcf_info, served_pcf_info2);
|
OpenAPI_list_add(nrf_info1->served_pcf_info, served_pcf_info2);
|
||||||
|
|
||||||
item = OpenAPI_nrf_info_convertToJSON(nrf_info1);
|
item = OpenAPI_nrf_info_convertToJSON(nrf_info1);
|
||||||
ABTS_PTR_NOTNULL(tc, item);
|
ABTS_PTR_NOTNULL(tc, item);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -317,7 +317,7 @@ static void sbi_message_test3(abts_case *tc, void *data)
|
||||||
ogs_free(pcf_info1);
|
ogs_free(pcf_info1);
|
||||||
ogs_free(pcf_info2);
|
ogs_free(pcf_info2);
|
||||||
|
|
||||||
nrf_info2 = OpenAPI_nrf_info_parseFromJSON(item);
|
nrf_info2 = OpenAPI_nrf_info_parseFromJSON(item);
|
||||||
ABTS_PTR_NOTNULL(tc, nrf_info2);
|
ABTS_PTR_NOTNULL(tc, nrf_info2);
|
||||||
|
|
||||||
ABTS_INT_EQUAL(tc, nrf_info1->served_pcf_info->count,
|
ABTS_INT_EQUAL(tc, nrf_info1->served_pcf_info->count,
|
||||||
|
|
|
@ -63,10 +63,10 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque)
|
||||||
static int test_cx_fb_cb(struct msg **msg, struct avp *avp,
|
static int test_cx_fb_cb(struct msg **msg, struct avp *avp,
|
||||||
struct session *sess, void *opaque, enum disp_action *act)
|
struct session *sess, void *opaque, enum disp_action *act)
|
||||||
{
|
{
|
||||||
/* This CB should never be called */
|
/* This CB should never be called */
|
||||||
ogs_warn("Unexpected message received!");
|
ogs_warn("Unexpected message received!");
|
||||||
|
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_cx_send_uar(test_ue_t *test_ue, int id_type)
|
void test_cx_send_uar(test_ue_t *test_ue, int id_type)
|
||||||
|
@ -485,8 +485,8 @@ static void test_cx_send_mar(struct sess_state *sess_data)
|
||||||
/* Set the Server-Name AVP */
|
/* Set the Server-Name AVP */
|
||||||
ret = fd_msg_avp_new(ogs_diam_cx_server_name, 0, &avp);
|
ret = fd_msg_avp_new(ogs_diam_cx_server_name, 0, &avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
val.os.data = (os0_t)fd_g_config->cnf_diamid;
|
val.os.data = (os0_t)fd_g_config->cnf_diamid;
|
||||||
val.os.len = fd_g_config->cnf_diamid_len;
|
val.os.len = fd_g_config->cnf_diamid_len;
|
||||||
ret = fd_msg_avp_setvalue(avp, &val);
|
ret = fd_msg_avp_setvalue(avp, &val);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
|
||||||
|
@ -735,8 +735,8 @@ static void test_cx_send_sar(struct sess_state *sess_data)
|
||||||
/* Set the Server-Name AVP */
|
/* Set the Server-Name AVP */
|
||||||
ret = fd_msg_avp_new(ogs_diam_cx_server_name, 0, &avp);
|
ret = fd_msg_avp_new(ogs_diam_cx_server_name, 0, &avp);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
val.os.data = (os0_t)fd_g_config->cnf_diamid;
|
val.os.data = (os0_t)fd_g_config->cnf_diamid;
|
||||||
val.os.len = fd_g_config->cnf_diamid_len;
|
val.os.len = fd_g_config->cnf_diamid_len;
|
||||||
ret = fd_msg_avp_setvalue(avp, &val);
|
ret = fd_msg_avp_setvalue(avp, &val);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
|
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
|
||||||
|
@ -1129,38 +1129,38 @@ static void test_cx_lia_cb(void *data, struct msg **msg)
|
||||||
int test_cx_init(void)
|
int test_cx_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
/* Install objects definitions for this application */
|
/* Install objects definitions for this application */
|
||||||
ret = ogs_diam_cx_init();
|
ret = ogs_diam_cx_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Create handler for sessions */
|
/* Create handler for sessions */
|
||||||
ret = fd_sess_handler_create(&test_cx_reg, &state_cleanup, NULL, NULL);
|
ret = fd_sess_handler_create(&test_cx_reg, &state_cleanup, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Fallback CB if command != unexpected message received */
|
/* Fallback CB if command != unexpected message received */
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.app = ogs_diam_cx_application;
|
data.app = ogs_diam_cx_application;
|
||||||
|
|
||||||
ret = fd_disp_register(test_cx_fb_cb, DISP_HOW_APPID, &data, NULL,
|
ret = fd_disp_register(test_cx_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||||
&hdl_cx_fb);
|
&hdl_cx_fb);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Advertise the support for the application in the peer */
|
/* Advertise the support for the application in the peer */
|
||||||
ret = fd_disp_app_support(ogs_diam_cx_application, ogs_diam_vendor, 1, 0);
|
ret = fd_disp_app_support(ogs_diam_cx_application, ogs_diam_vendor, 1, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_cx_final(void)
|
void test_cx_final(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = fd_sess_handler_destroy(&test_cx_reg, NULL);
|
ret = fd_sess_handler_destroy(&test_cx_reg, NULL);
|
||||||
ogs_assert(ret == OGS_OK);
|
ogs_assert(ret == OGS_OK);
|
||||||
|
|
||||||
if (hdl_cx_fb)
|
if (hdl_cx_fb)
|
||||||
(void) fd_disp_unregister(&hdl_cx_fb, NULL);
|
(void) fd_disp_unregister(&hdl_cx_fb, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,10 +60,10 @@ static void state_cleanup(struct sess_state *sess_data, os0_t sid, void *opaque)
|
||||||
static int pcscf_rx_fb_cb(struct msg **msg, struct avp *avp,
|
static int pcscf_rx_fb_cb(struct msg **msg, struct avp *avp,
|
||||||
struct session *sess, void *opaque, enum disp_action *act)
|
struct session *sess, void *opaque, enum disp_action *act)
|
||||||
{
|
{
|
||||||
/* This CB should never be called */
|
/* This CB should never be called */
|
||||||
ogs_warn("Unexpected message received!");
|
ogs_warn("Unexpected message received!");
|
||||||
|
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_rx_send_aar_audio(uint8_t **rx_sid,
|
void test_rx_send_aar_audio(uint8_t **rx_sid,
|
||||||
|
@ -115,7 +115,7 @@ void test_rx_send_aar_audio(uint8_t **rx_sid,
|
||||||
if (*rx_sid) {
|
if (*rx_sid) {
|
||||||
/* Retrieve session by Session-Id */
|
/* Retrieve session by Session-Id */
|
||||||
size_t sidlen = strlen((char *)*rx_sid);
|
size_t sidlen = strlen((char *)*rx_sid);
|
||||||
ret = fd_sess_fromsid_msg(*rx_sid, sidlen, &session, &new);
|
ret = fd_sess_fromsid_msg(*rx_sid, sidlen, &session, &new);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(new == 0);
|
ogs_assert(new == 0);
|
||||||
|
|
||||||
|
@ -612,7 +612,7 @@ void test_rx_send_aar_video(uint8_t **rx_sid, test_sess_t *sess, int id_type)
|
||||||
if (*rx_sid) {
|
if (*rx_sid) {
|
||||||
/* Retrieve session by Session-Id */
|
/* Retrieve session by Session-Id */
|
||||||
size_t sidlen = strlen((char *)*rx_sid);
|
size_t sidlen = strlen((char *)*rx_sid);
|
||||||
ret = fd_sess_fromsid_msg(*rx_sid, sidlen, &session, &new);
|
ret = fd_sess_fromsid_msg(*rx_sid, sidlen, &session, &new);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(new == 0);
|
ogs_assert(new == 0);
|
||||||
|
|
||||||
|
@ -1290,7 +1290,7 @@ void test_rx_send_aar_ctrl(uint8_t **rx_sid, test_sess_t *sess, int id_type)
|
||||||
if (*rx_sid) {
|
if (*rx_sid) {
|
||||||
/* Retrieve session by Session-Id */
|
/* Retrieve session by Session-Id */
|
||||||
size_t sidlen = strlen((char *)*rx_sid);
|
size_t sidlen = strlen((char *)*rx_sid);
|
||||||
ret = fd_sess_fromsid_msg(*rx_sid, sidlen, &session, &new);
|
ret = fd_sess_fromsid_msg(*rx_sid, sidlen, &session, &new);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(new == 0);
|
ogs_assert(new == 0);
|
||||||
|
|
||||||
|
@ -1789,7 +1789,7 @@ static int pcscf_rx_asr_cb( struct msg **msg, struct avp *avp,
|
||||||
int rv;
|
int rv;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
struct msg *ans, *qry;
|
struct msg *ans, *qry;
|
||||||
struct avp *avpch1, *avpch2, *avpch3;
|
struct avp *avpch1, *avpch2, *avpch3;
|
||||||
struct avp_hdr *hdr;
|
struct avp_hdr *hdr;
|
||||||
union avp_value val;
|
union avp_value val;
|
||||||
|
@ -1804,9 +1804,9 @@ static int pcscf_rx_asr_cb( struct msg **msg, struct avp *avp,
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(sess_data);
|
ogs_assert(sess_data);
|
||||||
|
|
||||||
/* Create answer header */
|
/* Create answer header */
|
||||||
qry = *msg;
|
qry = *msg;
|
||||||
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ans = *msg;
|
ans = *msg;
|
||||||
|
|
||||||
|
@ -1838,8 +1838,8 @@ static int pcscf_rx_asr_cb( struct msg **msg, struct avp *avp,
|
||||||
ogs_error("no_Abort-Cause ");
|
ogs_error("no_Abort-Cause ");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
||||||
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Store this value in the session */
|
/* Store this value in the session */
|
||||||
|
@ -1850,14 +1850,14 @@ static int pcscf_rx_asr_cb( struct msg **msg, struct avp *avp,
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
ogs_assert(sess_data == NULL);
|
ogs_assert(sess_data == NULL);
|
||||||
|
|
||||||
/* Send the answer */
|
/* Send the answer */
|
||||||
ret = fd_msg_send(msg, NULL, NULL);
|
ret = fd_msg_send(msg, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Add this value to the stats */
|
/* Add this value to the stats */
|
||||||
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
ogs_diam_logger_self()->stats.nb_echoed++;
|
ogs_diam_logger_self()->stats.nb_echoed++;
|
||||||
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
|
||||||
|
|
||||||
test_rx_send_str(sid);
|
test_rx_send_str(sid);
|
||||||
|
|
||||||
|
@ -2102,48 +2102,48 @@ out:
|
||||||
int test_rx_init(void)
|
int test_rx_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
test_cx_init();
|
test_cx_init();
|
||||||
|
|
||||||
/* Install objects definitions for this application */
|
/* Install objects definitions for this application */
|
||||||
ret = ogs_diam_rx_init();
|
ret = ogs_diam_rx_init();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Create handler for sessions */
|
/* Create handler for sessions */
|
||||||
ret = fd_sess_handler_create(&pcscf_rx_reg, state_cleanup, NULL, NULL);
|
ret = fd_sess_handler_create(&pcscf_rx_reg, state_cleanup, NULL, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Fallback CB if command != unexpected message received */
|
/* Fallback CB if command != unexpected message received */
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.app = ogs_diam_rx_application;
|
data.app = ogs_diam_rx_application;
|
||||||
|
|
||||||
ret = fd_disp_register(pcscf_rx_fb_cb, DISP_HOW_APPID, &data, NULL,
|
ret = fd_disp_register(pcscf_rx_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||||
&hdl_rx_fb);
|
&hdl_rx_fb);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Specific handler for Abort-Session-Request */
|
/* Specific handler for Abort-Session-Request */
|
||||||
data.command = ogs_diam_rx_cmd_asr;
|
data.command = ogs_diam_rx_cmd_asr;
|
||||||
ret = fd_disp_register(pcscf_rx_asr_cb, DISP_HOW_CC, &data, NULL,
|
ret = fd_disp_register(pcscf_rx_asr_cb, DISP_HOW_CC, &data, NULL,
|
||||||
&hdl_rx_asr);
|
&hdl_rx_asr);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
/* Advertise the support for the application in the peer */
|
/* Advertise the support for the application in the peer */
|
||||||
ret = fd_disp_app_support(ogs_diam_rx_application, ogs_diam_vendor, 1, 0);
|
ret = fd_disp_app_support(ogs_diam_rx_application, ogs_diam_vendor, 1, 0);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_rx_final(void)
|
void test_rx_final(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = fd_sess_handler_destroy(&pcscf_rx_reg, NULL);
|
ret = fd_sess_handler_destroy(&pcscf_rx_reg, NULL);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
if (hdl_rx_fb)
|
if (hdl_rx_fb)
|
||||||
(void) fd_disp_unregister(&hdl_rx_fb, NULL);
|
(void) fd_disp_unregister(&hdl_rx_fb, NULL);
|
||||||
if (hdl_rx_asr)
|
if (hdl_rx_asr)
|
||||||
(void) fd_disp_unregister(&hdl_rx_asr, NULL);
|
(void) fd_disp_unregister(&hdl_rx_asr, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,7 @@ static void test_diam_config(void)
|
||||||
int test_fd_init(void)
|
int test_fd_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct disp_when data;
|
struct disp_when data;
|
||||||
|
|
||||||
test_diam_config();
|
test_diam_config();
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ int test_fd_init(void)
|
||||||
ret = ogs_diam_start();
|
ret = ogs_diam_start();
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_fd_final(void)
|
void test_fd_final(void)
|
||||||
|
|
Loading…
Reference in New Issue