mirror of
https://github.com/open5gs/open5gs.git
synced 2025-11-05 06:23:28 +00:00
Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
179df88c32 | ||
|
|
bc180c3ffc | ||
|
|
ab81e38487 | ||
|
|
2d7438313d | ||
|
|
bb67705a66 | ||
|
|
f097364d52 | ||
|
|
0992fbe7f3 | ||
|
|
9bef56806e | ||
|
|
2ef9718209 | ||
|
|
d744893fba | ||
|
|
0291d97dd5 | ||
|
|
a5f764544f | ||
|
|
39766bc379 | ||
|
|
bf1c6c00fe | ||
|
|
c8ed909f46 | ||
|
|
49adabdc70 | ||
|
|
e5523342d4 | ||
|
|
08efe857a0 | ||
|
|
aec51b399a | ||
|
|
ce2590d6fc | ||
|
|
157d5fd739 |
6
debian/changelog
vendored
6
debian/changelog
vendored
@@ -1,8 +1,8 @@
|
|||||||
nextepc (0.4.0-5~ubuntu) bionic; urgency=medium
|
nextepc (0.4.1) unstable; urgency=medium
|
||||||
|
|
||||||
* Integration with OGSLIB
|
* Bug Fixed
|
||||||
|
|
||||||
-- Sukchan Lee <acetcom@gmail.com> Mon, 29 Apr 2019 14:30:15 +0000
|
-- Sukchan Lee <acetcom@gmail.com> Sat, 18 May 2019 08:18:59 +0000
|
||||||
|
|
||||||
nextepc (0.4.0) unstable; urgency=medium
|
nextepc (0.4.0) unstable; urgency=medium
|
||||||
|
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ FROM ${dist}:${tag}
|
|||||||
MAINTAINER Sukchan Lee <acetcom@gmail.com>
|
MAINTAINER Sukchan Lee <acetcom@gmail.com>
|
||||||
|
|
||||||
ARG tag=stable
|
ARG tag=stable
|
||||||
RUN apt-get update && \
|
#RUN apt-get update && \
|
||||||
apt-get install -y netselect-apt && \
|
# apt-get install -y netselect-apt && \
|
||||||
apt-get clean && \
|
# apt-get clean && \
|
||||||
if [ "x$tag" = "xlatest" ]; then \
|
# if [ "x$tag" = "xlatest" ]; then \
|
||||||
netselect-apt -o /etc/apt/sources.list; \
|
# netselect-apt -o /etc/apt/sources.list; \
|
||||||
else \
|
# else \
|
||||||
netselect-apt ${tag} -o /etc/apt/sources.list; \
|
# netselect-apt ${tag} -o /etc/apt/sources.list; \
|
||||||
fi
|
# fi
|
||||||
|
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get upgrade -y && \
|
apt-get upgrade -y && \
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
27
|
29
|
||||||
@@ -31,7 +31,7 @@ $ sudo apt-key add Release.key
|
|||||||
In Debian 9.0(stretch), you can install it as follows:
|
In Debian 9.0(stretch), you can install it as follows:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ sudo sh -c "echo 'deb https://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/Debian_9.0/ ./' > /etc/apt/sources.list.d/open5gs.list"
|
$ sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/Debian_9.0/ ./' > /etc/apt/sources.list.d/open5gs.list"
|
||||||
$ sudo apt update
|
$ sudo apt update
|
||||||
$ sudo apt install nextepc
|
$ sudo apt install nextepc
|
||||||
```
|
```
|
||||||
@@ -39,12 +39,12 @@ $ sudo apt install nextepc
|
|||||||
Other Linux distributions can be installed by changing the path.
|
Other Linux distributions can be installed by changing the path.
|
||||||
|
|
||||||
```
|
```
|
||||||
https://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/Debian_9.0/
|
http://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/Debian_9.0/
|
||||||
https://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/Raspbian_9.0/
|
http://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/Raspbian_9.0/
|
||||||
https://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_16.04/
|
http://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_16.04/
|
||||||
https://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_17.10/
|
http://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_17.10/
|
||||||
https://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_18.04/
|
http://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_18.04/
|
||||||
https://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_18.10/
|
http://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_18.10/
|
||||||
```
|
```
|
||||||
|
|
||||||
[Martin Hauke](https://build.opensuse.org/user/show/mnhauke) packaged NextEPC for *openSUSE* on [OBS](https://build.opensuse.org/package/show/home:mnhauke:nextepc/nextepc).
|
[Martin Hauke](https://build.opensuse.org/user/show/mnhauke) packaged NextEPC for *openSUSE* on [OBS](https://build.opensuse.org/package/show/home:mnhauke:nextepc/nextepc).
|
||||||
@@ -119,6 +119,7 @@ $ sudo systemctl restart nextepc-sgwd
|
|||||||
1. *Debian and Ubuntu* based Linux distributions can install [Node.js](https://nodejs.org/) as follows:
|
1. *Debian and Ubuntu* based Linux distributions can install [Node.js](https://nodejs.org/) as follows:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
$ sudo apt update
|
||||||
$ sudo apt install curl
|
$ sudo apt install curl
|
||||||
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
|
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
|
||||||
$ sudo apt install nodejs
|
$ sudo apt install nodejs
|
||||||
@@ -133,7 +134,7 @@ $ sudo systemctl restart nextepc-sgwd
|
|||||||
You can now install WebUI of NextEPC.
|
You can now install WebUI of NextEPC.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ curl -sL {{ site.url }}/static/webui/install | sudo -E bash -
|
$ curl -sL {{ site.url }}{{ site.baseurl }}/assets/webui/install | sudo -E bash -
|
||||||
```
|
```
|
||||||
|
|
||||||
### Register Subscriber Information
|
### Register Subscriber Information
|
||||||
|
|||||||
@@ -8,4 +8,4 @@ tags:
|
|||||||
- Release
|
- Release
|
||||||
---
|
---
|
||||||
|
|
||||||
- Assets -- [v0.1.0.tar.gz](https://github.com/acetcom/nextepc/archive/v0.1.0.tar.gz)
|
- Assets -- [v0.1.0.tar.gz](https://github.com/open5gs/nextepc/archive/v0.1.0.tar.gz)
|
||||||
|
|||||||
@@ -8,5 +8,5 @@ tags:
|
|||||||
- Release
|
- Release
|
||||||
---
|
---
|
||||||
|
|
||||||
- Fix the bug related to Mongo C Driver. [[More Info](https://github.com/acetcom/nextepc/commit/4245502ae287df9c457621b3f4cccb519c4d4878)]
|
- Fix the bug related to Mongo C Driver. [[More Info](https://github.com/open5gs/nextepc/commit/4245502ae287df9c457621b3f4cccb519c4d4878)]
|
||||||
- Assets -- [v0.1.1.tar.gz](https://github.com/acetcom/nextepc/archive/v0.1.1.tar.gz)
|
- Assets -- [v0.1.1.tar.gz](https://github.com/open5gs/nextepc/archive/v0.1.1.tar.gz)
|
||||||
|
|||||||
@@ -11,4 +11,4 @@ tags:
|
|||||||
- Publish Debian/Ubuntu Package
|
- Publish Debian/Ubuntu Package
|
||||||
- Support FreeBSD and Mac OS X"
|
- Support FreeBSD and Mac OS X"
|
||||||
|
|
||||||
- Assets -- [v0.2.0.tar.gz](https://github.com/acetcom/nextepc/archive/v0.2.0.tar.gz)
|
- Assets -- [v0.2.0.tar.gz](https://github.com/open5gs/nextepc/archive/v0.2.0.tar.gz)
|
||||||
|
|||||||
@@ -11,4 +11,4 @@ tags:
|
|||||||
- IPv6 Support (Linux Only)
|
- IPv6 Support (Linux Only)
|
||||||
- Change Configuration File (JSON -> YAML)
|
- Change Configuration File (JSON -> YAML)
|
||||||
|
|
||||||
- Assets -- [v0.3.0.tar.gz](https://github.com/acetcom/nextepc/archive/v0.3.0.tar.gz)
|
- Assets -- [v0.3.0.tar.gz](https://github.com/open5gs/nextepc/archive/v0.3.0.tar.gz)
|
||||||
|
|||||||
@@ -8,5 +8,5 @@ tags:
|
|||||||
- Release
|
- Release
|
||||||
---
|
---
|
||||||
|
|
||||||
- Add Authentication Synch Failure ([#11](https://github.com/acetcom/nextepc/issues/11)) -- [eric80s](https://github.com/eric80s)
|
- Add Authentication Synch Failure ([#11](https://github.com/open5gs/nextepc/issues/11)) -- [eric80s](https://github.com/eric80s)
|
||||||
- Assets -- [v0.3.1.tar.gz](https://github.com/acetcom/nextepc/archive/v0.3.1.tar.gz)
|
- Assets -- [v0.3.1.tar.gz](https://github.com/open5gs/nextepc/archive/v0.3.1.tar.gz)
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>"
|
|||||||
---
|
---
|
||||||
|
|
||||||
#### New
|
#### New
|
||||||
- Docker support ([#16](https://github.com/acetcom/nextepc/issues/16)) -- [amilenovic](https://github.com/amilenovic)
|
- Docker support ([#16](https://github.com/open5gs/nextepc/issues/16)) -- [amilenovic](https://github.com/amilenovic)
|
||||||
|
|
||||||
#### Bug fixes
|
#### Bug fixes
|
||||||
- Fix the BUG for MAC failure of authentication failure -- [#17](https://github.com/acetcom/nextepc/issues/17) from [razaborg](https://github.com/razaborg)
|
- Fix the BUG for MAC failure of authentication failure -- [#17](https://github.com/open5gs/nextepc/issues/17) from [razaborg](https://github.com/razaborg)
|
||||||
- Fix the BUG for EPS attach type of Attach accept -- [#12](https://github.com/acetcom/nextepc/issues/12) from [pcminitech](https://github.com/pcminitech)
|
- Fix the BUG for EPS attach type of Attach accept -- [#12](https://github.com/open5gs/nextepc/issues/12) from [pcminitech](https://github.com/pcminitech)
|
||||||
|
|
||||||
Download -- [v0.3.3.tar.gz](https://github.com/acetcom/nextepc/archive/v0.3.3.tar.gz)
|
Download -- [v0.3.3.tar.gz](https://github.com/open5gs/nextepc/archive/v0.3.3.tar.gz)
|
||||||
{: .notice--info}
|
{: .notice--info}
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>"
|
|||||||
---
|
---
|
||||||
|
|
||||||
#### New
|
#### New
|
||||||
- Support Network Name ([#22](https://github.com/acetcom/nextepc/pull/22)) -- [medeiros405](https://github.com/medeiros405)
|
- Support Network Name ([#22](https://github.com/open5gs/nextepc/pull/22)) -- [medeiros405](https://github.com/medeiros405)
|
||||||
|
|
||||||
#### Bug fixes
|
#### Bug fixes
|
||||||
- Fix the BUG for security capabilities mismatch ([#27](https://github.com/acetcom/nextepc/issues/27)) -- [wayne43290](https://github.com/wayne43290)
|
- Fix the BUG for security capabilities mismatch ([#27](https://github.com/open5gs/nextepc/issues/27)) -- [wayne43290](https://github.com/wayne43290)
|
||||||
- Fix the BUG that SGW process is dead during paging process ([#18](https://github.com/acetcom/nextepc/issues/18)) -- [jackson040407](https://github.com/jackson040407)
|
- Fix the BUG that SGW process is dead during paging process ([#18](https://github.com/open5gs/nextepc/issues/18)) -- [jackson040407](https://github.com/jackson040407)
|
||||||
|
|
||||||
Download -- [v0.3.5.tar.gz](https://github.com/acetcom/nextepc/archive/v0.3.5.tar.gz)
|
Download -- [v0.3.5.tar.gz](https://github.com/open5gs/nextepc/archive/v0.3.5.tar.gz)
|
||||||
{: .notice--info}
|
{: .notice--info}
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ tags:
|
|||||||
- Release
|
- Release
|
||||||
---
|
---
|
||||||
|
|
||||||
- Support eNB/MME Configuration Transfer, Error Indication ([#29](https://github.com/acetcom/nextepc/issues/29)) -- [wayne43290](https://github.com/wayne43290)
|
- Support eNB/MME Configuration Transfer, Error Indication ([#29](https://github.com/open5gs/nextepc/issues/29)) -- [wayne43290](https://github.com/wayne43290)
|
||||||
- Increase SCTP recv buffer : 2048->8192 ([#35](https://github.com/acetcom/nextepc/issues/35)) -- [EugeneBogush](https://github.com/EugeneBogush)
|
- Increase SCTP recv buffer : 2048->8192 ([#35](https://github.com/open5gs/nextepc/issues/35)) -- [EugeneBogush](https://github.com/EugeneBogush)
|
||||||
|
|
||||||
Download -- [v0.3.6.tar.gz](https://github.com/acetcom/nextepc/archive/v0.3.6.tar.gz)
|
Download -- [v0.3.6.tar.gz](https://github.com/open5gs/nextepc/archive/v0.3.6.tar.gz)
|
||||||
{: .notice--info}
|
{: .notice--info}
|
||||||
|
|||||||
@@ -8,5 +8,5 @@ tags:
|
|||||||
- Release
|
- Release
|
||||||
---
|
---
|
||||||
|
|
||||||
Download -- [v0.3.7.tar.gz](https://github.com/acetcom/nextepc/archive/v0.3.7.tar.gz)
|
Download -- [v0.3.7.tar.gz](https://github.com/open5gs/nextepc/archive/v0.3.7.tar.gz)
|
||||||
{: .notice--info}
|
{: .notice--info}
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>"
|
|||||||
- Support NAS encryption(EEA1/EEA2/EEA3)
|
- Support NAS encryption(EEA1/EEA2/EEA3)
|
||||||
|
|
||||||
#### Bug fixes
|
#### Bug fixes
|
||||||
- Confirm with 36.412 requirement of SCTP stream id ([#54](https://github.com/acetcom/nextepc/issues/54)) -- [brchiu](https://github.com/brchiu)
|
- Confirm with 36.412 requirement of SCTP stream id ([#54](https://github.com/open5gs/nextepc/issues/54)) -- [brchiu](https://github.com/brchiu)
|
||||||
- Fix to set correct timezone in UE ([#61](https://github.com/acetcom/nextepc/pull/61)) -- [medeiros405](https://github.com/medeiros405)
|
- Fix to set correct timezone in UE ([#61](https://github.com/open5gs/nextepc/pull/61)) -- [medeiros405](https://github.com/medeiros405)
|
||||||
- Fix to change MME's integrity order ([#64](https://github.com/acetcom/nextepc/issues/64)) -- [kewinrausch](https://github.com/kewinrausch)
|
- Fix to change MME's integrity order ([#64](https://github.com/open5gs/nextepc/issues/64)) -- [kewinrausch](https://github.com/kewinrausch)
|
||||||
- Fix the bug for tracking area update ([#29](https://github.com/acetcom/nextepc/issues/29)) -- [wayne43290](https://github.com/wayne43290)
|
- Fix the bug for tracking area update ([#29](https://github.com/open5gs/nextepc/issues/29)) -- [wayne43290](https://github.com/wayne43290)
|
||||||
- Fix the bug for indirect tunnel ([#29](https://github.com/acetcom/nextepc/issues/29)) -- [wayne43290](https://github.com/wayne43290)
|
- Fix the bug for indirect tunnel ([#29](https://github.com/open5gs/nextepc/issues/29)) -- [wayne43290](https://github.com/wayne43290)
|
||||||
|
|
||||||
Download -- [v0.3.9.tar.gz](https://github.com/acetcom/nextepc/archive/v0.3.9.tar.gz)
|
Download -- [v0.3.9.tar.gz](https://github.com/open5gs/nextepc/archive/v0.3.9.tar.gz)
|
||||||
{: .notice--info}
|
{: .notice--info}
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>"
|
|||||||
---
|
---
|
||||||
|
|
||||||
#### Bug fixes
|
#### Bug fixes
|
||||||
- Renew freeDiameter Certificate ([#93](https://github.com/acetcom/nextepc/issues/93), [#94](https://github.com/acetcom/nextepc/issues/94)) -- [Ravi-t](https://github.com/Ravi-t), [hchenji](https://github.com/hchenji)
|
- Renew freeDiameter Certificate ([#93](https://github.com/open5gs/nextepc/issues/93), [#94](https://github.com/open5gs/nextepc/issues/94)) -- [Ravi-t](https://github.com/Ravi-t), [hchenji](https://github.com/hchenji)
|
||||||
- Fix TLV uint32 bug ([#73](https://github.com/acetcom/nextepc/pull/73)) -- [giuliol](https://github.com/giuliol)
|
- Fix TLV uint32 bug ([#73](https://github.com/open5gs/nextepc/pull/73)) -- [giuliol](https://github.com/giuliol)
|
||||||
- Add TRACE for IP address of connected UEs ([#71](https://github.com/acetcom/nextepc/issues/71)) -- [pgupta408](https://github.com/Ravi-t)
|
- Add TRACE for IP address of connected UEs ([#71](https://github.com/open5gs/nextepc/issues/71)) -- [pgupta408](https://github.com/Ravi-t)
|
||||||
- Show reason string for YAML parser error ([#40](https://github.com/acetcom/nextepc/issues/40)) -- [Raw1mage](https://github.com/Raw1mage)
|
- Show reason string for YAML parser error ([#40](https://github.com/open5gs/nextepc/issues/40)) -- [Raw1mage](https://github.com/Raw1mage)
|
||||||
- Fix compile error for GCC 8.1
|
- Fix compile error for GCC 8.1
|
||||||
- Fix compile error for Mongo-C-Driver 1.11
|
- Fix compile error for Mongo-C-Driver 1.11
|
||||||
|
|
||||||
Download -- [v0.3.10.tar.gz](https://github.com/acetcom/nextepc/archive/v0.3.10.tar.gz)
|
Download -- [v0.3.10.tar.gz](https://github.com/open5gs/nextepc/archive/v0.3.10.tar.gz)
|
||||||
{: .notice--info}
|
{: .notice--info}
|
||||||
|
|||||||
@@ -10,19 +10,19 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>"
|
|||||||
---
|
---
|
||||||
|
|
||||||
#### Enhancements
|
#### Enhancements
|
||||||
- Support 4-bytes RES in NAS Auth ([#147](https://github.com/acetcom/nextepc/issues/147)) -- [Ranjjiitsingh](https://github.com/Ranjjiitsingh)
|
- Support 4-bytes RES in NAS Auth ([#147](https://github.com/open5gs/nextepc/issues/147)) -- [Ranjjiitsingh](https://github.com/Ranjjiitsingh)
|
||||||
- Add SGW selection mode ([#100](https://github.com/acetcom/nextepc/pull/100)) -- [TerryAlu](https://github.com/TerryAlu)
|
- Add SGW selection mode ([#100](https://github.com/open5gs/nextepc/pull/100)) -- [TerryAlu](https://github.com/TerryAlu)
|
||||||
|
|
||||||
#### Bug fixes
|
#### Bug fixes
|
||||||
- Increase packet memory buffer ([#161](https://github.com/acetcom/nextepc/issues/161)) -- [mathieuxilan](https://github.com/mathieuxilan)
|
- Increase packet memory buffer ([#161](https://github.com/open5gs/nextepc/issues/161)) -- [mathieuxilan](https://github.com/mathieuxilan)
|
||||||
- Fix setting END-ID to 0 ([#156](https://github.com/acetcom/nextepc/issues/156)) -- [hypercloud2017](https://github.com/hypercloud2017)
|
- Fix setting END-ID to 0 ([#156](https://github.com/open5gs/nextepc/issues/156)) -- [hypercloud2017](https://github.com/hypercloud2017)
|
||||||
- Fix incorrect timezone in NAS & GTP ([#140](https://github.com/acetcom/nextepc/issues/140)) -- [EugeneBogush](https://github.com/EugeneBogush)
|
- Fix incorrect timezone in NAS & GTP ([#140](https://github.com/open5gs/nextepc/issues/140)) -- [EugeneBogush](https://github.com/EugeneBogush)
|
||||||
|
|
||||||
#### Miscellaneous
|
#### Miscellaneous
|
||||||
- nas_message.py: Fix copy+paste error([#159](https://github.com/acetcom/nextepc/issues/159)) -- [laf0rge](https://github.com/laf0rge)
|
- nas_message.py: Fix copy+paste error([#159](https://github.com/open5gs/nextepc/issues/159)) -- [laf0rge](https://github.com/laf0rge)
|
||||||
- Fix missing 'break' statement ([#129](https://github.com/acetcom/nextepc/pull/129)) -- [EugeneBogush](https://github.com/EugeneBogush)
|
- Fix missing 'break' statement ([#129](https://github.com/open5gs/nextepc/pull/129)) -- [EugeneBogush](https://github.com/EugeneBogush)
|
||||||
- Add missing C namespace ([#109](https://github.com/acetcom/nextepc/pull/109)) -- [brchiu](https://github.com/brchiu)
|
- Add missing C namespace ([#109](https://github.com/open5gs/nextepc/pull/109)) -- [brchiu](https://github.com/brchiu)
|
||||||
- Refine EXIT routine for daemon process
|
- Refine EXIT routine for daemon process
|
||||||
|
|
||||||
Download -- [v0.3.11.tar.gz](https://github.com/acetcom/nextepc/archive/v0.3.11.tar.gz)
|
Download -- [v0.3.11.tar.gz](https://github.com/open5gs/nextepc/archive/v0.3.11.tar.gz)
|
||||||
{: .notice--info}
|
{: .notice--info}
|
||||||
|
|||||||
20
docs/_posts/2019-04-29-release-v0.4.0.md
Normal file
20
docs/_posts/2019-04-29-release-v0.4.0.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
title: "v0.4.0 - Integration with OGSLib"
|
||||||
|
date: 2019-04-29 23:44:00 +0900
|
||||||
|
categories:
|
||||||
|
- Release
|
||||||
|
tags:
|
||||||
|
- News
|
||||||
|
- Release
|
||||||
|
head_inline: "<style> ul { padding-bottom: 1em; } </style>"
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Enhancements
|
||||||
|
- Integration with OGSLib
|
||||||
|
- High CPU usage on idle ([#87](https://github.com/open5gs/nextepc/issues/87)) -- [hchenji](https://github.com/hchenji)
|
||||||
|
|
||||||
|
#### Bug fixes
|
||||||
|
- The problem related to MNC of LENGTH 3 ([#163](https://github.com/open5gs/nextepc/issues/163)) -- [Avi-Dekra](https://github.com/Avi-Dekra)
|
||||||
|
|
||||||
|
Download -- [v0.4.0.tar.gz](https://github.com/open5gs/nextepc/archive/v0.4.0.tar.gz)
|
||||||
|
{: .notice--info}
|
||||||
Submodule lib/ogslib updated: e34d0156ea...dd37f7714d
6
main.c
6
main.c
@@ -9,11 +9,7 @@
|
|||||||
#include "app/application.h"
|
#include "app/application.h"
|
||||||
#include "app_init.h"
|
#include "app_init.h"
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
static char *version = "NextEPC daemon v" PACKAGE_VERSION;
|
||||||
#pragma GCC diagnostic ignored "-Wdate-time"
|
|
||||||
static char *version = "NextEPC daemon v" \
|
|
||||||
PACKAGE_VERSION " - "__DATE__ " " __TIME__;
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
|
||||||
static void show_version()
|
static void show_version()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -114,16 +114,11 @@ int app_did_initialize(void)
|
|||||||
|
|
||||||
void app_will_terminate(void)
|
void app_will_terminate(void)
|
||||||
{
|
{
|
||||||
if (context_self()->config.db_uri)
|
|
||||||
{
|
|
||||||
ogs_info("DB-Client try to terminate");
|
|
||||||
context_db_final();
|
|
||||||
ogs_info("DB-Client terminate...done");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_did_terminate(void)
|
void app_did_terminate(void)
|
||||||
{
|
{
|
||||||
|
context_db_final();
|
||||||
context_final();
|
context_final();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -298,7 +298,10 @@ int context_db_init(const char *db_uri)
|
|||||||
|
|
||||||
const mongoc_uri_t *uri;
|
const mongoc_uri_t *uri;
|
||||||
|
|
||||||
|
memset(&self.db, 0, sizeof self.db);
|
||||||
|
|
||||||
mongoc_init();
|
mongoc_init();
|
||||||
|
self.db.initialized = true;
|
||||||
|
|
||||||
self.db.client = mongoc_client_new(db_uri);
|
self.db.client = mongoc_client_new(db_uri);
|
||||||
if (!self.db.client)
|
if (!self.db.client)
|
||||||
@@ -335,18 +338,19 @@ int context_db_init(const char *db_uri)
|
|||||||
|
|
||||||
int context_db_final()
|
int context_db_final()
|
||||||
{
|
{
|
||||||
if (self.db.database)
|
if (self.db.database) {
|
||||||
{
|
|
||||||
mongoc_database_destroy(self.db.database);
|
mongoc_database_destroy(self.db.database);
|
||||||
self.db.database = NULL;
|
self.db.database = NULL;
|
||||||
}
|
}
|
||||||
if (self.db.client)
|
if (self.db.client) {
|
||||||
{
|
|
||||||
mongoc_client_destroy(self.db.client);
|
mongoc_client_destroy(self.db.client);
|
||||||
self.db.client = NULL;
|
self.db.client = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (self.db.initialized) {
|
||||||
mongoc_cleanup();
|
mongoc_cleanup();
|
||||||
|
self.db.initialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ typedef struct _context_t {
|
|||||||
config_t config;
|
config_t config;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
bool initialized;
|
||||||
const char *name;
|
const char *name;
|
||||||
void *uri;
|
void *uri;
|
||||||
void *client;
|
void *client;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ extern "C" {
|
|||||||
int app_initialize(app_param_t *param);
|
int app_initialize(app_param_t *param);
|
||||||
#define app_terminate epc_terminate
|
#define app_terminate epc_terminate
|
||||||
|
|
||||||
int epc_initialize();
|
int epc_initialize(app_param_t *param);
|
||||||
void epc_terminate(void);
|
void epc_terminate(void);
|
||||||
|
|
||||||
int mme_initialize();
|
int mme_initialize();
|
||||||
|
|||||||
12
src/epc.c
12
src/epc.c
@@ -61,8 +61,7 @@ int epc_initialize(app_param_t *param)
|
|||||||
if (pcrf_sem1) ogs_proc_mutex_delete(pcrf_sem1);
|
if (pcrf_sem1) ogs_proc_mutex_delete(pcrf_sem1);
|
||||||
if (pcrf_sem2) ogs_proc_mutex_delete(pcrf_sem2);
|
if (pcrf_sem2) ogs_proc_mutex_delete(pcrf_sem2);
|
||||||
|
|
||||||
app_did_terminate();
|
context_final();
|
||||||
|
|
||||||
ogs_core_finalize();
|
ogs_core_finalize();
|
||||||
|
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
@@ -108,8 +107,7 @@ int epc_initialize(app_param_t *param)
|
|||||||
if (pgw_sem1) ogs_proc_mutex_delete(pgw_sem1);
|
if (pgw_sem1) ogs_proc_mutex_delete(pgw_sem1);
|
||||||
if (pgw_sem2) ogs_proc_mutex_delete(pgw_sem2);
|
if (pgw_sem2) ogs_proc_mutex_delete(pgw_sem2);
|
||||||
|
|
||||||
app_did_terminate();
|
context_final();
|
||||||
|
|
||||||
ogs_core_finalize();
|
ogs_core_finalize();
|
||||||
|
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
@@ -157,8 +155,7 @@ int epc_initialize(app_param_t *param)
|
|||||||
if (sgw_sem1) ogs_proc_mutex_delete(sgw_sem1);
|
if (sgw_sem1) ogs_proc_mutex_delete(sgw_sem1);
|
||||||
if (sgw_sem2) ogs_proc_mutex_delete(sgw_sem2);
|
if (sgw_sem2) ogs_proc_mutex_delete(sgw_sem2);
|
||||||
|
|
||||||
app_did_terminate();
|
context_final();
|
||||||
|
|
||||||
ogs_core_finalize();
|
ogs_core_finalize();
|
||||||
|
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
@@ -207,8 +204,7 @@ int epc_initialize(app_param_t *param)
|
|||||||
if (hss_sem1) ogs_proc_mutex_delete(hss_sem1);
|
if (hss_sem1) ogs_proc_mutex_delete(hss_sem1);
|
||||||
if (hss_sem2) ogs_proc_mutex_delete(hss_sem2);
|
if (hss_sem2) ogs_proc_mutex_delete(hss_sem2);
|
||||||
|
|
||||||
app_did_terminate();
|
context_final();
|
||||||
|
|
||||||
ogs_core_finalize();
|
ogs_core_finalize();
|
||||||
|
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ hss_context_t* hss_self()
|
|||||||
return &self;
|
return &self;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hss_context_init(void)
|
void hss_context_init(void)
|
||||||
{
|
{
|
||||||
ogs_assert(context_initialized == 0);
|
ogs_assert(context_initialized == 0);
|
||||||
|
|
||||||
@@ -34,19 +34,15 @@ int hss_context_init(void)
|
|||||||
ogs_thread_mutex_init(&self.db_lock);
|
ogs_thread_mutex_init(&self.db_lock);
|
||||||
|
|
||||||
context_initialized = 1;
|
context_initialized = 1;
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int hss_context_final(void)
|
void hss_context_final(void)
|
||||||
{
|
{
|
||||||
ogs_assert(context_initialized == 1);
|
ogs_assert(context_initialized == 1);
|
||||||
|
|
||||||
ogs_thread_mutex_destroy(&self.db_lock);
|
ogs_thread_mutex_destroy(&self.db_lock);
|
||||||
|
|
||||||
context_initialized = 0;
|
context_initialized = 0;
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hss_context_prepare()
|
static int hss_context_prepare()
|
||||||
|
|||||||
@@ -36,8 +36,8 @@ typedef struct _hss_context_t {
|
|||||||
ogs_thread_mutex_t db_lock;
|
ogs_thread_mutex_t db_lock;
|
||||||
} hss_context_t;
|
} hss_context_t;
|
||||||
|
|
||||||
int hss_context_init(void);
|
void hss_context_init(void);
|
||||||
int hss_context_final(void);
|
void hss_context_final(void);
|
||||||
hss_context_t* hss_self(void);
|
hss_context_t* hss_self(void);
|
||||||
|
|
||||||
int hss_context_parse_config(void);
|
int hss_context_parse_config(void);
|
||||||
|
|||||||
@@ -9,8 +9,7 @@ int hss_initialize(void)
|
|||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv = hss_context_init();
|
hss_context_init();
|
||||||
if (rv != OGS_OK) return rv;
|
|
||||||
|
|
||||||
rv = hss_context_parse_config();
|
rv = hss_context_parse_config();
|
||||||
if (rv != OGS_OK) return rv;
|
if (rv != OGS_OK) return rv;
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ static OGS_POOL(mme_bearer_pool, mme_bearer_t);
|
|||||||
|
|
||||||
static int context_initialized = 0;
|
static int context_initialized = 0;
|
||||||
|
|
||||||
int mme_context_init()
|
void mme_context_init()
|
||||||
{
|
{
|
||||||
ogs_assert(context_initialized == 0);
|
ogs_assert(context_initialized == 0);
|
||||||
|
|
||||||
@@ -82,11 +82,9 @@ int mme_context_init()
|
|||||||
self.t3413_value = ogs_time_from_sec(2); /* Paging retry timer: 2 secs */
|
self.t3413_value = ogs_time_from_sec(2); /* Paging retry timer: 2 secs */
|
||||||
|
|
||||||
context_initialized = 1;
|
context_initialized = 1;
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int mme_context_final()
|
void mme_context_final()
|
||||||
{
|
{
|
||||||
ogs_assert(context_initialized == 1);
|
ogs_assert(context_initialized == 1);
|
||||||
|
|
||||||
@@ -129,8 +127,6 @@ int mme_context_final()
|
|||||||
ogs_sock_remove_all_nodes(&self.gtpc_list6);
|
ogs_sock_remove_all_nodes(&self.gtpc_list6);
|
||||||
|
|
||||||
context_initialized = 0;
|
context_initialized = 0;
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mme_context_t* mme_self()
|
mme_context_t* mme_self()
|
||||||
@@ -1653,6 +1649,7 @@ mme_enb_t *mme_enb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr)
|
|||||||
|
|
||||||
ogs_list_init(&enb->enb_ue_list);
|
ogs_list_init(&enb->enb_ue_list);
|
||||||
|
|
||||||
|
if (enb->sock_type == SOCK_STREAM)
|
||||||
ogs_hash_set(self.enb_sock_hash, enb->sock, sizeof(ogs_sock_t), enb);
|
ogs_hash_set(self.enb_sock_hash, enb->sock, sizeof(ogs_sock_t), enb);
|
||||||
ogs_hash_set(self.enb_addr_hash, enb->addr, sizeof(ogs_sockaddr_t), enb);
|
ogs_hash_set(self.enb_addr_hash, enb->addr, sizeof(ogs_sockaddr_t), enb);
|
||||||
|
|
||||||
@@ -1680,6 +1677,7 @@ int mme_enb_remove(mme_enb_t *enb)
|
|||||||
ogs_fsm_fini(&enb->sm, &e);
|
ogs_fsm_fini(&enb->sm, &e);
|
||||||
ogs_fsm_delete(&enb->sm);
|
ogs_fsm_delete(&enb->sm);
|
||||||
|
|
||||||
|
if (enb->sock_type == SOCK_STREAM)
|
||||||
ogs_hash_set(self.enb_sock_hash, enb->sock, sizeof(ogs_sock_t), NULL);
|
ogs_hash_set(self.enb_sock_hash, enb->sock, sizeof(ogs_sock_t), NULL);
|
||||||
ogs_hash_set(self.enb_addr_hash, enb->addr, sizeof(ogs_sockaddr_t), NULL);
|
ogs_hash_set(self.enb_addr_hash, enb->addr, sizeof(ogs_sockaddr_t), NULL);
|
||||||
ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), NULL);
|
ogs_hash_set(self.enb_id_hash, &enb->enb_id, sizeof(enb->enb_id), NULL);
|
||||||
|
|||||||
@@ -499,8 +499,8 @@ typedef struct _mme_bearer_t {
|
|||||||
gtp_xact_t *xact;
|
gtp_xact_t *xact;
|
||||||
} mme_bearer_t;
|
} mme_bearer_t;
|
||||||
|
|
||||||
int mme_context_init(void);
|
void mme_context_init(void);
|
||||||
int mme_context_final(void);
|
void mme_context_final(void);
|
||||||
mme_context_t *mme_self(void);
|
mme_context_t *mme_self(void);
|
||||||
|
|
||||||
int mme_context_parse_config(void);
|
int mme_context_parse_config(void);
|
||||||
|
|||||||
@@ -68,9 +68,6 @@ void mme_event_free(mme_event_t *e);
|
|||||||
|
|
||||||
void mme_event_timeout(void *data);
|
void mme_event_timeout(void *data);
|
||||||
|
|
||||||
#define mme_event_send(__ptr_e) \
|
|
||||||
ogs_assert(ogs_queue_push(mme_self()->queue, ((__ptr_e))) == OGS_OK)
|
|
||||||
|
|
||||||
const char *mme_event_get_name(mme_event_t *e);
|
const char *mme_event_get_name(mme_event_t *e);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -383,13 +383,20 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg)
|
|||||||
out:
|
out:
|
||||||
if (!error)
|
if (!error)
|
||||||
{
|
{
|
||||||
|
int rv;
|
||||||
e = mme_event_new(MME_EVT_S6A_MESSAGE);
|
e = mme_event_new(MME_EVT_S6A_MESSAGE);
|
||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->mme_ue = mme_ue;
|
e->mme_ue = mme_ue;
|
||||||
e->pkbuf = s6abuf;
|
e->pkbuf = s6abuf;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_pkbuf_free(e->pkbuf);
|
||||||
|
mme_event_free(e);
|
||||||
|
} else {
|
||||||
ogs_pollset_notify(mme_self()->pollset);
|
ogs_pollset_notify(mme_self()->pollset);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Free the message */
|
/* Free the message */
|
||||||
ogs_assert(pthread_mutex_lock(&fd_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&fd_logger_self()->stats_lock) == 0);
|
||||||
@@ -1029,13 +1036,20 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||||||
|
|
||||||
if (!error)
|
if (!error)
|
||||||
{
|
{
|
||||||
|
int rv;
|
||||||
e = mme_event_new(MME_EVT_S6A_MESSAGE);
|
e = mme_event_new(MME_EVT_S6A_MESSAGE);
|
||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->mme_ue = mme_ue;
|
e->mme_ue = mme_ue;
|
||||||
e->pkbuf = s6abuf;
|
e->pkbuf = s6abuf;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_pkbuf_free(e->pkbuf);
|
||||||
|
mme_event_free(e);
|
||||||
|
} else {
|
||||||
ogs_pollset_notify(mme_self()->pollset);
|
ogs_pollset_notify(mme_self()->pollset);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Free the message */
|
/* Free the message */
|
||||||
ogs_assert(pthread_mutex_lock(&fd_logger_self()->stats_lock) == 0);
|
ogs_assert(pthread_mutex_lock(&fd_logger_self()->stats_lock) == 0);
|
||||||
|
|||||||
@@ -25,7 +25,12 @@ static void _gtpv2_c_recv_cb(short when, ogs_socket_t fd, void *data)
|
|||||||
e = mme_event_new(MME_EVT_S11_MESSAGE);
|
e = mme_event_new(MME_EVT_S11_MESSAGE);
|
||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->pkbuf = pkbuf;
|
e->pkbuf = pkbuf;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_pkbuf_free(e->pkbuf);
|
||||||
|
mme_event_free(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static ogs_sockaddr_t *pgw_addr_find_by_family(ogs_list_t *list, int family)
|
static ogs_sockaddr_t *pgw_addr_find_by_family(ogs_list_t *list, int family)
|
||||||
|
|||||||
@@ -18,7 +18,10 @@ int mme_initialize()
|
|||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv = mme_context_init();
|
mme_context_init();
|
||||||
|
mme_event_init();
|
||||||
|
|
||||||
|
rv = gtp_xact_init(mme_self()->timer_mgr);
|
||||||
if (rv != OGS_OK) return rv;
|
if (rv != OGS_OK) return rv;
|
||||||
|
|
||||||
rv = mme_context_parse_config();
|
rv = mme_context_parse_config();
|
||||||
@@ -71,9 +74,6 @@ static void mme_main(void *data)
|
|||||||
ogs_fsm_t mme_sm;
|
ogs_fsm_t mme_sm;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
mme_event_init();
|
|
||||||
gtp_xact_init(mme_self()->timer_mgr);
|
|
||||||
|
|
||||||
ogs_fsm_create(&mme_sm, mme_state_initial, mme_state_final);
|
ogs_fsm_create(&mme_sm, mme_state_initial, mme_state_final);
|
||||||
ogs_fsm_init(&mme_sm, 0);
|
ogs_fsm_init(&mme_sm, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ static void accept_handler(short when, ogs_socket_t fd, void *data)
|
|||||||
new = ogs_sock_accept(sock);
|
new = ogs_sock_accept(sock);
|
||||||
if (new)
|
if (new)
|
||||||
{
|
{
|
||||||
|
int rv;
|
||||||
ogs_sockaddr_t *addr = NULL;
|
ogs_sockaddr_t *addr = NULL;
|
||||||
mme_event_t *e = NULL;
|
mme_event_t *e = NULL;
|
||||||
|
|
||||||
@@ -112,7 +113,12 @@ static void accept_handler(short when, ogs_socket_t fd, void *data)
|
|||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->enb_sock = new;
|
e->enb_sock = new;
|
||||||
e->enb_addr = addr;
|
e->enb_addr = addr;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_free(e->enb_addr);
|
||||||
|
mme_event_free(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -122,6 +128,7 @@ static void accept_handler(short when, ogs_socket_t fd, void *data)
|
|||||||
|
|
||||||
void s1ap_recv_handler(short when, ogs_socket_t fd, void *data)
|
void s1ap_recv_handler(short when, ogs_socket_t fd, void *data)
|
||||||
{
|
{
|
||||||
|
int rv;
|
||||||
ogs_pkbuf_t *pkbuf;
|
ogs_pkbuf_t *pkbuf;
|
||||||
int size;
|
int size;
|
||||||
mme_event_t *e = NULL;
|
mme_event_t *e = NULL;
|
||||||
@@ -190,7 +197,12 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data)
|
|||||||
not->sn_assoc_change.sac_inbound_streams;
|
not->sn_assoc_change.sac_inbound_streams;
|
||||||
e->outbound_streams =
|
e->outbound_streams =
|
||||||
not->sn_assoc_change.sac_outbound_streams;
|
not->sn_assoc_change.sac_outbound_streams;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_free(e->enb_addr);
|
||||||
|
mme_event_free(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (not->sn_assoc_change.sac_state == SCTP_SHUTDOWN_COMP ||
|
else if (not->sn_assoc_change.sac_state == SCTP_SHUTDOWN_COMP ||
|
||||||
not->sn_assoc_change.sac_state == SCTP_COMM_LOST)
|
not->sn_assoc_change.sac_state == SCTP_COMM_LOST)
|
||||||
@@ -209,7 +221,12 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data)
|
|||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->enb_sock = sock;
|
e->enb_sock = sock;
|
||||||
e->enb_addr = addr;
|
e->enb_addr = addr;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_free(e->enb_addr);
|
||||||
|
mme_event_free(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -228,7 +245,12 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data)
|
|||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->enb_sock = sock;
|
e->enb_sock = sock;
|
||||||
e->enb_addr = addr;
|
e->enb_addr = addr;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_free(e->enb_addr);
|
||||||
|
mme_event_free(e);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SCTP_PEER_ADDR_CHANGE:
|
case SCTP_PEER_ADDR_CHANGE:
|
||||||
@@ -276,7 +298,13 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data)
|
|||||||
e->enb_sock = sock;
|
e->enb_sock = sock;
|
||||||
e->enb_addr = addr;
|
e->enb_addr = addr;
|
||||||
e->pkbuf = pkbuf;
|
e->pkbuf = pkbuf;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_free(e->enb_addr);
|
||||||
|
ogs_pkbuf_free(e->pkbuf);
|
||||||
|
mme_event_free(e);
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ int s1ap_delayed_send_to_enb_ue(
|
|||||||
|
|
||||||
int s1ap_send_to_esm(mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf)
|
int s1ap_send_to_esm(mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf)
|
||||||
{
|
{
|
||||||
|
int rv;
|
||||||
mme_event_t *e = NULL;
|
mme_event_t *e = NULL;
|
||||||
|
|
||||||
ogs_assert(mme_ue);
|
ogs_assert(mme_ue);
|
||||||
@@ -136,7 +137,12 @@ int s1ap_send_to_esm(mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf)
|
|||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->mme_ue = mme_ue;
|
e->mme_ue = mme_ue;
|
||||||
e->pkbuf = esmbuf;
|
e->pkbuf = esmbuf;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_pkbuf_free(e->pkbuf);
|
||||||
|
mme_event_free(e);
|
||||||
|
}
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
@@ -207,13 +213,19 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue,
|
|||||||
ogs_assert(h);
|
ogs_assert(h);
|
||||||
if (h->protocol_discriminator == NAS_PROTOCOL_DISCRIMINATOR_EMM)
|
if (h->protocol_discriminator == NAS_PROTOCOL_DISCRIMINATOR_EMM)
|
||||||
{
|
{
|
||||||
|
int rv;
|
||||||
e = mme_event_new(MME_EVT_EMM_MESSAGE);
|
e = mme_event_new(MME_EVT_EMM_MESSAGE);
|
||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->enb_ue = enb_ue;
|
e->enb_ue = enb_ue;
|
||||||
e->s1ap_code = procedureCode;
|
e->s1ap_code = procedureCode;
|
||||||
e->nas_type = security_header_type.type;
|
e->nas_type = security_header_type.type;
|
||||||
e->pkbuf = nasbuf;
|
e->pkbuf = nasbuf;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_pkbuf_free(e->pkbuf);
|
||||||
|
mme_event_free(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (h->protocol_discriminator == NAS_PROTOCOL_DISCRIMINATOR_ESM)
|
else if (h->protocol_discriminator == NAS_PROTOCOL_DISCRIMINATOR_ESM)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock,
|
|||||||
{
|
{
|
||||||
if (data)
|
if (data)
|
||||||
{
|
{
|
||||||
|
int rv;
|
||||||
mme_event_t *e = NULL;
|
mme_event_t *e = NULL;
|
||||||
|
|
||||||
#undef MSG_NOTIFICATION
|
#undef MSG_NOTIFICATION
|
||||||
@@ -425,9 +426,15 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock,
|
|||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->enb_sock = (ogs_sock_t *)sock;
|
e->enb_sock = (ogs_sock_t *)sock;
|
||||||
e->enb_addr = addr;
|
e->enb_addr = addr;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_free(e->enb_addr);
|
||||||
|
mme_event_free(e);
|
||||||
|
} else {
|
||||||
ogs_pollset_notify(mme_self()->pollset);
|
ogs_pollset_notify(mme_self()->pollset);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if (not->sn_assoc_change.sac_state == SCTP_COMM_UP)
|
else if (not->sn_assoc_change.sac_state == SCTP_COMM_UP)
|
||||||
{
|
{
|
||||||
ogs_sockaddr_t *addr =
|
ogs_sockaddr_t *addr =
|
||||||
@@ -444,9 +451,15 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock,
|
|||||||
not->sn_assoc_change.sac_inbound_streams;
|
not->sn_assoc_change.sac_inbound_streams;
|
||||||
e->outbound_streams =
|
e->outbound_streams =
|
||||||
not->sn_assoc_change.sac_outbound_streams;
|
not->sn_assoc_change.sac_outbound_streams;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_free(e->enb_addr);
|
||||||
|
mme_event_free(e);
|
||||||
|
} else {
|
||||||
ogs_pollset_notify(mme_self()->pollset);
|
ogs_pollset_notify(mme_self()->pollset);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SCTP_SHUTDOWN_EVENT :
|
case SCTP_SHUTDOWN_EVENT :
|
||||||
@@ -464,8 +477,14 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock,
|
|||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->enb_sock = (ogs_sock_t *)sock;
|
e->enb_sock = (ogs_sock_t *)sock;
|
||||||
e->enb_addr = addr;
|
e->enb_addr = addr;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_free(e->enb_addr);
|
||||||
|
mme_event_free(e);
|
||||||
|
} else {
|
||||||
ogs_pollset_notify(mme_self()->pollset);
|
ogs_pollset_notify(mme_self()->pollset);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SCTP_PEER_ADDR_CHANGE:
|
case SCTP_PEER_ADDR_CHANGE:
|
||||||
@@ -517,9 +536,16 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock,
|
|||||||
e->enb_sock = (ogs_sock_t *)sock;
|
e->enb_sock = (ogs_sock_t *)sock;
|
||||||
e->enb_addr = addr;
|
e->enb_addr = addr;
|
||||||
e->pkbuf = pkbuf;
|
e->pkbuf = pkbuf;
|
||||||
mme_event_send(e);
|
rv = ogs_queue_push(mme_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_free(e->enb_addr);
|
||||||
|
ogs_pkbuf_free(e->pkbuf);
|
||||||
|
mme_event_free(e);
|
||||||
|
} else {
|
||||||
ogs_pollset_notify(mme_self()->pollset);
|
ogs_pollset_notify(mme_self()->pollset);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ogs_error("Not engough buffer. Need more recv : 0x%x", flags);
|
ogs_error("Not engough buffer. Need more recv : 0x%x", flags);
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ pcrf_context_t* pcrf_self()
|
|||||||
return &self;
|
return &self;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pcrf_context_init(void)
|
void pcrf_context_init(void)
|
||||||
{
|
{
|
||||||
ogs_assert(context_initialized == 0);
|
ogs_assert(context_initialized == 0);
|
||||||
|
|
||||||
@@ -37,11 +37,9 @@ int pcrf_context_init(void)
|
|||||||
self.ip_hash = ogs_hash_make();
|
self.ip_hash = ogs_hash_make();
|
||||||
|
|
||||||
context_initialized = 1;
|
context_initialized = 1;
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int pcrf_context_final(void)
|
void pcrf_context_final(void)
|
||||||
{
|
{
|
||||||
ogs_assert(context_initialized == 1);
|
ogs_assert(context_initialized == 1);
|
||||||
ogs_assert(self.ip_hash);
|
ogs_assert(self.ip_hash);
|
||||||
@@ -51,8 +49,6 @@ int pcrf_context_final(void)
|
|||||||
ogs_thread_mutex_destroy(&self.db_lock);
|
ogs_thread_mutex_destroy(&self.db_lock);
|
||||||
|
|
||||||
context_initialized = 0;
|
context_initialized = 0;
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pcrf_context_prepare()
|
static int pcrf_context_prepare()
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ typedef struct _pcrf_context_t {
|
|||||||
ogs_thread_mutex_t hash_lock;
|
ogs_thread_mutex_t hash_lock;
|
||||||
} pcrf_context_t;
|
} pcrf_context_t;
|
||||||
|
|
||||||
int pcrf_context_init(void);
|
void pcrf_context_init(void);
|
||||||
int pcrf_context_final(void);
|
void pcrf_context_final(void);
|
||||||
pcrf_context_t *pcrf_self(void);
|
pcrf_context_t *pcrf_self(void);
|
||||||
|
|
||||||
int pcrf_context_parse_config(void);
|
int pcrf_context_parse_config(void);
|
||||||
|
|||||||
@@ -8,8 +8,7 @@ int pcrf_initialize(void)
|
|||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv = pcrf_context_init();
|
pcrf_context_init();
|
||||||
if (rv != OGS_OK) return rv;
|
|
||||||
|
|
||||||
rv = pcrf_context_parse_config();
|
rv = pcrf_context_parse_config();
|
||||||
if (rv != OGS_OK) return rv;
|
if (rv != OGS_OK) return rv;
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ static OGS_POOL(pgw_pf_pool, pgw_pf_t);
|
|||||||
|
|
||||||
static int context_initiaized = 0;
|
static int context_initiaized = 0;
|
||||||
|
|
||||||
int pgw_context_init()
|
void pgw_context_init()
|
||||||
{
|
{
|
||||||
ogs_assert(context_initiaized == 0);
|
ogs_assert(context_initiaized == 0);
|
||||||
|
|
||||||
@@ -62,11 +62,9 @@ int pgw_context_init()
|
|||||||
self.sess_hash = ogs_hash_make();
|
self.sess_hash = ogs_hash_make();
|
||||||
|
|
||||||
context_initiaized = 1;
|
context_initiaized = 1;
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int pgw_context_final()
|
void pgw_context_final()
|
||||||
{
|
{
|
||||||
ogs_assert(context_initiaized == 1);
|
ogs_assert(context_initiaized == 1);
|
||||||
|
|
||||||
@@ -95,8 +93,6 @@ int pgw_context_final()
|
|||||||
ogs_sock_remove_all_nodes(&self.gtpu_list6);
|
ogs_sock_remove_all_nodes(&self.gtpu_list6);
|
||||||
|
|
||||||
context_initiaized = 0;
|
context_initiaized = 0;
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pgw_context_t* pgw_self()
|
pgw_context_t* pgw_self()
|
||||||
@@ -915,7 +911,9 @@ pgw_sess_t *pgw_sess_add(
|
|||||||
else
|
else
|
||||||
ogs_assert_if_reached();
|
ogs_assert_if_reached();
|
||||||
|
|
||||||
ogs_info("UE IPv4:[%s] IPv6:[%s]",
|
ogs_info("UE IMSI:[%s] APN:[%s] IPv4:[%s] IPv6:[%s]",
|
||||||
|
sess->imsi_bcd,
|
||||||
|
apn,
|
||||||
sess->ipv4 ? INET_NTOP(&sess->ipv4->addr, buf1) : "",
|
sess->ipv4 ? INET_NTOP(&sess->ipv4->addr, buf1) : "",
|
||||||
sess->ipv6 ? INET6_NTOP(&sess->ipv6->addr, buf2) : "");
|
sess->ipv6 ? INET6_NTOP(&sess->ipv6->addr, buf2) : "");
|
||||||
|
|
||||||
|
|||||||
@@ -193,8 +193,8 @@ ED3(uint8_t spare:2;,
|
|||||||
pgw_bearer_t *bearer;
|
pgw_bearer_t *bearer;
|
||||||
} pgw_pf_t;
|
} pgw_pf_t;
|
||||||
|
|
||||||
int pgw_context_init(void);
|
void pgw_context_init(void);
|
||||||
int pgw_context_final(void);
|
void pgw_context_final(void);
|
||||||
pgw_context_t *pgw_self(void);
|
pgw_context_t *pgw_self(void);
|
||||||
|
|
||||||
int pgw_context_parse_config(void);
|
int pgw_context_parse_config(void);
|
||||||
|
|||||||
@@ -32,9 +32,6 @@ void pgw_event_final(void);
|
|||||||
pgw_event_t *pgw_event_new(pgw_event_e id);
|
pgw_event_t *pgw_event_new(pgw_event_e id);
|
||||||
void pgw_event_free(pgw_event_t *e);
|
void pgw_event_free(pgw_event_t *e);
|
||||||
|
|
||||||
#define pgw_event_send(__ptr_e) \
|
|
||||||
ogs_assert(ogs_queue_push(pgw_self()->queue, ((__ptr_e))) == OGS_OK)
|
|
||||||
|
|
||||||
const char *pgw_event_get_name(pgw_event_t *e);
|
const char *pgw_event_get_name(pgw_event_t *e);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -712,14 +712,21 @@ out:
|
|||||||
e->gxbuf = gxbuf;
|
e->gxbuf = gxbuf;
|
||||||
e->xact_index = xact->index;
|
e->xact_index = xact->index;
|
||||||
e->gtpbuf = gtpbuf;
|
e->gtpbuf = gtpbuf;
|
||||||
pgw_event_send(e);
|
rv = ogs_queue_push(pgw_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
gx_message_free(gx_message);
|
||||||
|
ogs_pkbuf_free(e->gxbuf);
|
||||||
|
ogs_pkbuf_free(e->gtpbuf);
|
||||||
|
pgw_event_free(e);
|
||||||
|
} else {
|
||||||
ogs_pollset_notify(pgw_self()->pollset);
|
ogs_pollset_notify(pgw_self()->pollset);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gx_message_free(gx_message);
|
gx_message_free(gx_message);
|
||||||
ogs_pkbuf_free(gxbuf);
|
ogs_pkbuf_free(gxbuf);
|
||||||
|
|
||||||
ogs_pkbuf_free(gtpbuf);
|
ogs_pkbuf_free(gtpbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -942,8 +949,15 @@ static int pgw_gx_rar_cb( struct msg **msg, struct avp *avp,
|
|||||||
|
|
||||||
e->sess_index = sess->index;
|
e->sess_index = sess->index;
|
||||||
e->gxbuf = gxbuf;
|
e->gxbuf = gxbuf;
|
||||||
pgw_event_send(e);
|
rv = ogs_queue_push(pgw_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
gx_message_free(gx_message);
|
||||||
|
ogs_pkbuf_free(e->gxbuf);
|
||||||
|
pgw_event_free(e);
|
||||||
|
} else {
|
||||||
ogs_pollset_notify(pgw_self()->pollset);
|
ogs_pollset_notify(pgw_self()->pollset);
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the Auth-Application-Id AVP */
|
/* Set the Auth-Application-Id AVP */
|
||||||
ret = fd_msg_avp_new(fd_auth_application_id, 0, &avp);
|
ret = fd_msg_avp_new(fd_auth_application_id, 0, &avp);
|
||||||
|
|||||||
@@ -94,7 +94,12 @@ static void _gtpv2_c_recv_cb(short when, ogs_socket_t fd, void *data)
|
|||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->gtpbuf = pkbuf;
|
e->gtpbuf = pkbuf;
|
||||||
|
|
||||||
pgw_event_send(e);
|
rv = ogs_queue_push(pgw_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_pkbuf_free(e->gtpbuf);
|
||||||
|
pgw_event_free(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
|
static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
|
||||||
|
|||||||
@@ -16,7 +16,10 @@ int pgw_initialize()
|
|||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv = pgw_context_init();
|
pgw_context_init();
|
||||||
|
pgw_event_init();
|
||||||
|
|
||||||
|
rv = gtp_xact_init(pgw_self()->timer_mgr);
|
||||||
if (rv != OGS_OK) return rv;
|
if (rv != OGS_OK) return rv;
|
||||||
|
|
||||||
rv = pgw_context_parse_config();
|
rv = pgw_context_parse_config();
|
||||||
@@ -61,9 +64,6 @@ static void pgw_main(void *data)
|
|||||||
ogs_fsm_t pgw_sm;
|
ogs_fsm_t pgw_sm;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
pgw_event_init();
|
|
||||||
gtp_xact_init(pgw_self()->timer_mgr);
|
|
||||||
|
|
||||||
ogs_fsm_create(&pgw_sm, pgw_state_initial, pgw_state_final);
|
ogs_fsm_create(&pgw_sm, pgw_state_initial, pgw_state_final);
|
||||||
ogs_fsm_init(&pgw_sm, 0);
|
ogs_fsm_init(&pgw_sm, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
#define _DEFAULT_SOURCE 1
|
||||||
|
#define _BSD_SOURCE 1
|
||||||
|
|
||||||
#include "base/base.h"
|
#include "base/base.h"
|
||||||
|
|
||||||
#if HAVE_NETINET_IP_H
|
#if HAVE_NETINET_IP_H
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ static OGS_POOL(sgw_tunnel_pool, sgw_tunnel_t);
|
|||||||
|
|
||||||
static int context_initialized = 0;
|
static int context_initialized = 0;
|
||||||
|
|
||||||
int sgw_context_init()
|
void sgw_context_init()
|
||||||
{
|
{
|
||||||
ogs_assert(context_initialized == 0);
|
ogs_assert(context_initialized == 0);
|
||||||
|
|
||||||
@@ -48,11 +48,9 @@ int sgw_context_init()
|
|||||||
self.imsi_ue_hash = ogs_hash_make();
|
self.imsi_ue_hash = ogs_hash_make();
|
||||||
|
|
||||||
context_initialized = 1;
|
context_initialized = 1;
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int sgw_context_final()
|
void sgw_context_final()
|
||||||
{
|
{
|
||||||
ogs_assert(context_initialized == 1);
|
ogs_assert(context_initialized == 1);
|
||||||
|
|
||||||
@@ -78,8 +76,6 @@ int sgw_context_final()
|
|||||||
ogs_sock_remove_all_nodes(&self.gtpu_list6);
|
ogs_sock_remove_all_nodes(&self.gtpu_list6);
|
||||||
|
|
||||||
context_initialized = 0;
|
context_initialized = 0;
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sgw_context_t* sgw_self()
|
sgw_context_t* sgw_self()
|
||||||
|
|||||||
@@ -129,8 +129,8 @@ typedef struct _sgw_tunnel_t {
|
|||||||
gtp_node_t *gnode;
|
gtp_node_t *gnode;
|
||||||
} sgw_tunnel_t;
|
} sgw_tunnel_t;
|
||||||
|
|
||||||
int sgw_context_init(void);
|
void sgw_context_init(void);
|
||||||
int sgw_context_final(void);
|
void sgw_context_final(void);
|
||||||
sgw_context_t* sgw_self(void);
|
sgw_context_t* sgw_self(void);
|
||||||
|
|
||||||
int sgw_context_parse_config(void);
|
int sgw_context_parse_config(void);
|
||||||
|
|||||||
@@ -32,9 +32,6 @@ void sgw_event_final(void);
|
|||||||
sgw_event_t *sgw_event_new(sgw_event_e id);
|
sgw_event_t *sgw_event_new(sgw_event_e id);
|
||||||
void sgw_event_free(sgw_event_t *e);
|
void sgw_event_free(sgw_event_t *e);
|
||||||
|
|
||||||
#define sgw_event_send(__ptr_e) \
|
|
||||||
ogs_assert(ogs_queue_push(sgw_self()->queue, ((__ptr_e))) == OGS_OK)
|
|
||||||
|
|
||||||
const char *sgw_event_get_name(sgw_event_t *e);
|
const char *sgw_event_get_name(sgw_event_t *e);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -29,17 +29,18 @@ static void _gtpv2_c_recv_cb(short when, ogs_socket_t fd, void *data)
|
|||||||
teid = ntohl(gtp_h->teid);
|
teid = ntohl(gtp_h->teid);
|
||||||
|
|
||||||
if (SGW_S5C_TEID(teid))
|
if (SGW_S5C_TEID(teid))
|
||||||
{
|
|
||||||
e = sgw_event_new(SGW_EVT_S5C_MESSAGE);
|
e = sgw_event_new(SGW_EVT_S5C_MESSAGE);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
e = sgw_event_new(SGW_EVT_S11_MESSAGE);
|
e = sgw_event_new(SGW_EVT_S11_MESSAGE);
|
||||||
}
|
|
||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->pkbuf = pkbuf;
|
e->pkbuf = pkbuf;
|
||||||
|
|
||||||
sgw_event_send(e);
|
rv = ogs_queue_push(sgw_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
ogs_pkbuf_free(e->pkbuf);
|
||||||
|
sgw_event_free(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
|
static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
|
||||||
@@ -206,7 +207,11 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
|
|||||||
e = sgw_event_new(SGW_EVT_LO_DLDATA_NOTI);
|
e = sgw_event_new(SGW_EVT_LO_DLDATA_NOTI);
|
||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
e->bearer = bearer;
|
e->bearer = bearer;
|
||||||
sgw_event_send(e);
|
rv = ogs_queue_push(sgw_self()->queue, e);
|
||||||
|
if (rv != OGS_OK) {
|
||||||
|
ogs_error("ogs_queue_push() failed:%d", (int)rv);
|
||||||
|
sgw_event_free(e);
|
||||||
|
}
|
||||||
|
|
||||||
SGW_SET_UE_STATE(sgw_ue, SGW_DL_NOTI_SENT);
|
SGW_SET_UE_STATE(sgw_ue, SGW_DL_NOTI_SENT);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,10 @@ int sgw_initialize()
|
|||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv = sgw_context_init();
|
sgw_context_init();
|
||||||
|
sgw_event_init();
|
||||||
|
|
||||||
|
rv = gtp_xact_init(sgw_self()->timer_mgr);
|
||||||
if (rv != OGS_OK) return rv;
|
if (rv != OGS_OK) return rv;
|
||||||
|
|
||||||
rv = sgw_context_parse_config();
|
rv = sgw_context_parse_config();
|
||||||
@@ -51,9 +54,6 @@ static void sgw_main(void *data)
|
|||||||
ogs_fsm_t sgw_sm;
|
ogs_fsm_t sgw_sm;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
sgw_event_init();
|
|
||||||
gtp_xact_init(sgw_self()->timer_mgr);
|
|
||||||
|
|
||||||
ogs_fsm_create(&sgw_sm, sgw_state_initial, sgw_state_final);
|
ogs_fsm_create(&sgw_sm, sgw_state_initial, sgw_state_final);
|
||||||
ogs_fsm_init(&sgw_sm, 0);
|
ogs_fsm_init(&sgw_sm, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -369,8 +369,6 @@ static void attach_test1(abts_case *tc, void *data)
|
|||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
ogs_pkbuf_free(recvbuf);
|
ogs_pkbuf_free(recvbuf);
|
||||||
|
|
||||||
ogs_msleep(300);
|
|
||||||
|
|
||||||
/* Send Detach Request */
|
/* Send Detach Request */
|
||||||
rv = tests1ap_build_detach_request(&sendbuf, msgindex);
|
rv = tests1ap_build_detach_request(&sendbuf, msgindex);
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
@@ -444,6 +442,7 @@ static void attach_test1(abts_case *tc, void *data)
|
|||||||
rv = testenb_gtpu_close(gtpu);
|
rv = testenb_gtpu_close(gtpu);
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
ogs_msleep(300);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#if IT_WILL_BE_REMOVED
|
#if IT_WILL_BE_REMOVED
|
||||||
@@ -706,8 +705,6 @@ static void attach_test2(abts_case *tc, void *data)
|
|||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
ogs_pkbuf_free(recvbuf);
|
ogs_pkbuf_free(recvbuf);
|
||||||
|
|
||||||
ogs_msleep(300);
|
|
||||||
|
|
||||||
/*****************************************************************
|
/*****************************************************************
|
||||||
* Attach Request : IMSI, Integrity Protected, MAC Matched
|
* Attach Request : IMSI, Integrity Protected, MAC Matched
|
||||||
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
||||||
@@ -751,8 +748,6 @@ static void attach_test2(abts_case *tc, void *data)
|
|||||||
/*****************************************************************
|
/*****************************************************************
|
||||||
* Attach Request : Unknown IMSI, Integrity Protected
|
* Attach Request : Unknown IMSI, Integrity Protected
|
||||||
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
||||||
ogs_msleep(300);
|
|
||||||
|
|
||||||
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+2);
|
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+2);
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
rv = testenb_s1ap_send(sock, sendbuf);
|
rv = testenb_s1ap_send(sock, sendbuf);
|
||||||
@@ -815,6 +810,8 @@ static void attach_test2(abts_case *tc, void *data)
|
|||||||
/* eNB disonncect from MME */
|
/* eNB disonncect from MME */
|
||||||
rv = testenb_s1ap_close(sock);
|
rv = testenb_s1ap_close(sock);
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
ogs_msleep(300);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************
|
/**************************************************************
|
||||||
@@ -1350,6 +1347,8 @@ static void attach_test4(abts_case *tc, void *data)
|
|||||||
/* eNB disonncect from SGW */
|
/* eNB disonncect from SGW */
|
||||||
rv = testenb_gtpu_close(gtpu);
|
rv = testenb_gtpu_close(gtpu);
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
ogs_msleep(300);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void attach_test5(abts_case *tc, void *data)
|
static void attach_test5(abts_case *tc, void *data)
|
||||||
@@ -1687,6 +1686,8 @@ static void attach_test5(abts_case *tc, void *data)
|
|||||||
/* eNB disonncect from MME */
|
/* eNB disonncect from MME */
|
||||||
rv = testenb_s1ap_close(sock);
|
rv = testenb_s1ap_close(sock);
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
ogs_msleep(300);
|
||||||
}
|
}
|
||||||
|
|
||||||
abts_suite *test_attach(abts_suite *suite)
|
abts_suite *test_attach(abts_suite *suite)
|
||||||
|
|||||||
@@ -313,18 +313,18 @@ static void handover_test1(abts_case *tc, void *data)
|
|||||||
|
|
||||||
mongoc_collection_destroy(collection);
|
mongoc_collection_destroy(collection);
|
||||||
|
|
||||||
/* Two eNB disonncect from MME */
|
|
||||||
rv = testenb_s1ap_close(sock1);
|
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
||||||
|
|
||||||
rv = testenb_s1ap_close(sock2);
|
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
||||||
|
|
||||||
/* eNB disonncect from SGW */
|
/* eNB disonncect from SGW */
|
||||||
|
rv = testenb_gtpu_close(gtpu2);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
rv = testenb_gtpu_close(gtpu1);
|
rv = testenb_gtpu_close(gtpu1);
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
rv = testenb_gtpu_close(gtpu2);
|
/* Two eNB disonncect from MME */
|
||||||
|
rv = testenb_s1ap_close(sock2);
|
||||||
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
|
rv = testenb_s1ap_close(sock1);
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
ogs_msleep(300);
|
ogs_msleep(300);
|
||||||
|
|||||||
@@ -229,8 +229,6 @@ static void test1_func(abts_case *tc, void *data)
|
|||||||
ABTS_TRUE(tc, memcmp(recvbuf->data+32, tmp+32, 20) == 0);
|
ABTS_TRUE(tc, memcmp(recvbuf->data+32, tmp+32, 20) == 0);
|
||||||
ogs_pkbuf_free(recvbuf);
|
ogs_pkbuf_free(recvbuf);
|
||||||
|
|
||||||
ogs_msleep(300);
|
|
||||||
|
|
||||||
/* Send GTP-U ICMP Packet */
|
/* Send GTP-U ICMP Packet */
|
||||||
rv = testgtpu_build_ping(&sendbuf, "45.45.0.2", "45.45.0.1");
|
rv = testgtpu_build_ping(&sendbuf, "45.45.0.2", "45.45.0.1");
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
@@ -242,16 +240,6 @@ static void test1_func(abts_case *tc, void *data)
|
|||||||
ABTS_PTR_NOTNULL(tc, recvbuf);
|
ABTS_PTR_NOTNULL(tc, recvbuf);
|
||||||
ogs_pkbuf_free(recvbuf);
|
ogs_pkbuf_free(recvbuf);
|
||||||
|
|
||||||
ogs_msleep(300);
|
|
||||||
|
|
||||||
/* eNB disonncect from MME */
|
|
||||||
rv = testenb_s1ap_close(sock);
|
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
||||||
|
|
||||||
/* eNB disonncect from SGW */
|
|
||||||
rv = testenb_gtpu_close(gtpu);
|
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
|
||||||
|
|
||||||
/********** Remove Subscriber in Database */
|
/********** Remove Subscriber in Database */
|
||||||
doc = BCON_NEW("imsi", BCON_UTF8("310014987654004"));
|
doc = BCON_NEW("imsi", BCON_UTF8("310014987654004"));
|
||||||
ABTS_PTR_NOTNULL(tc, doc);
|
ABTS_PTR_NOTNULL(tc, doc);
|
||||||
@@ -261,8 +249,6 @@ static void test1_func(abts_case *tc, void *data)
|
|||||||
|
|
||||||
mongoc_collection_destroy(collection);
|
mongoc_collection_destroy(collection);
|
||||||
|
|
||||||
ogs_msleep(300);
|
|
||||||
|
|
||||||
/* eNB disonncect from MME */
|
/* eNB disonncect from MME */
|
||||||
rv = testenb_s1ap_close(sock);
|
rv = testenb_s1ap_close(sock);
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
@@ -271,7 +257,7 @@ static void test1_func(abts_case *tc, void *data)
|
|||||||
rv = testenb_gtpu_close(gtpu);
|
rv = testenb_gtpu_close(gtpu);
|
||||||
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
ABTS_INT_EQUAL(tc, OGS_OK, rv);
|
||||||
|
|
||||||
return;
|
ogs_msleep(300);
|
||||||
}
|
}
|
||||||
|
|
||||||
abts_suite *test_mnc3(abts_suite *suite)
|
abts_suite *test_mnc3(abts_suite *suite)
|
||||||
|
|||||||
@@ -74,12 +74,8 @@ int test_initialize(app_param_t *param, int argc, const char *const argv[])
|
|||||||
ogs_error("app_will_initialize() failed");
|
ogs_error("app_will_initialize() failed");
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
rv = mme_context_init();
|
|
||||||
if (rv != OGS_OK)
|
mme_context_init();
|
||||||
{
|
|
||||||
ogs_error("mme_context_init() failed");
|
|
||||||
return OGS_ERROR;
|
|
||||||
}
|
|
||||||
app_did_initialize();
|
app_did_initialize();
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ int main(int argc, const char **argv)
|
|||||||
|
|
||||||
abts_init(argc, argv);
|
abts_init(argc, argv);
|
||||||
|
|
||||||
|
memset(¶m, 0, sizeof(param));
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
/* abts_init(argc, argv) handles the following options */
|
/* abts_init(argc, argv) handles the following options */
|
||||||
if (!strcmp(argv[i], "-v")) continue;
|
if (!strcmp(argv[i], "-v")) continue;
|
||||||
@@ -154,7 +155,6 @@ int main(int argc, const char **argv)
|
|||||||
ogs_core()->log.level = OGS_LOG_ERROR;
|
ogs_core()->log.level = OGS_LOG_ERROR;
|
||||||
test_initialize(¶m, argc, argv);
|
test_initialize(¶m, argc, argv);
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; alltests[i].func; i++)
|
for (i = 0; alltests[i].func; i++)
|
||||||
{
|
{
|
||||||
suite = alltests[i].func(suite);
|
suite = alltests[i].func(suite);
|
||||||
|
|||||||
@@ -59,7 +59,8 @@ int test_app_initialize(app_param_t *param)
|
|||||||
if (pcrf_sem1) ogs_proc_mutex_delete(pcrf_sem1);
|
if (pcrf_sem1) ogs_proc_mutex_delete(pcrf_sem1);
|
||||||
if (pcrf_sem2) ogs_proc_mutex_delete(pcrf_sem2);
|
if (pcrf_sem2) ogs_proc_mutex_delete(pcrf_sem2);
|
||||||
|
|
||||||
app_did_terminate();
|
context_final();
|
||||||
|
ogs_core_finalize();
|
||||||
|
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
@@ -104,7 +105,8 @@ int test_app_initialize(app_param_t *param)
|
|||||||
if (pgw_sem1) ogs_proc_mutex_delete(pgw_sem1);
|
if (pgw_sem1) ogs_proc_mutex_delete(pgw_sem1);
|
||||||
if (pgw_sem2) ogs_proc_mutex_delete(pgw_sem2);
|
if (pgw_sem2) ogs_proc_mutex_delete(pgw_sem2);
|
||||||
|
|
||||||
app_did_terminate();
|
context_final();
|
||||||
|
ogs_core_finalize();
|
||||||
|
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
@@ -151,7 +153,8 @@ int test_app_initialize(app_param_t *param)
|
|||||||
if (sgw_sem1) ogs_proc_mutex_delete(sgw_sem1);
|
if (sgw_sem1) ogs_proc_mutex_delete(sgw_sem1);
|
||||||
if (sgw_sem2) ogs_proc_mutex_delete(sgw_sem2);
|
if (sgw_sem2) ogs_proc_mutex_delete(sgw_sem2);
|
||||||
|
|
||||||
app_did_terminate();
|
context_final();
|
||||||
|
ogs_core_finalize();
|
||||||
|
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
@@ -199,7 +202,8 @@ int test_app_initialize(app_param_t *param)
|
|||||||
if (hss_sem1) ogs_proc_mutex_delete(hss_sem1);
|
if (hss_sem1) ogs_proc_mutex_delete(hss_sem1);
|
||||||
if (hss_sem2) ogs_proc_mutex_delete(hss_sem2);
|
if (hss_sem2) ogs_proc_mutex_delete(hss_sem2);
|
||||||
|
|
||||||
app_did_terminate();
|
context_final();
|
||||||
|
ogs_core_finalize();
|
||||||
|
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
@@ -248,7 +252,8 @@ int test_app_initialize(app_param_t *param)
|
|||||||
if (mme_sem1) ogs_proc_mutex_delete(mme_sem1);
|
if (mme_sem1) ogs_proc_mutex_delete(mme_sem1);
|
||||||
if (mme_sem2) ogs_proc_mutex_delete(mme_sem2);
|
if (mme_sem2) ogs_proc_mutex_delete(mme_sem2);
|
||||||
|
|
||||||
app_did_terminate();
|
context_final();
|
||||||
|
ogs_core_finalize();
|
||||||
|
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user