mirror of
				https://github.com/open5gs/open5gs.git
				synced 2025-10-31 03:53:38 +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 | ||||
|  | ||||
|   | ||||
| @@ -5,14 +5,14 @@ FROM ${dist}:${tag} | ||||
| MAINTAINER Sukchan Lee <acetcom@gmail.com> | ||||
|  | ||||
| ARG tag=stable | ||||
| RUN apt-get update && \ | ||||
|     apt-get install -y netselect-apt && \ | ||||
|     apt-get clean && \ | ||||
|     if [ "x$tag" = "xlatest" ]; then \ | ||||
|         netselect-apt -o /etc/apt/sources.list; \ | ||||
|     else \ | ||||
|         netselect-apt ${tag} -o /etc/apt/sources.list; \ | ||||
|     fi | ||||
| #RUN apt-get update && \ | ||||
| #    apt-get install -y netselect-apt && \ | ||||
| #    apt-get clean && \ | ||||
| #    if [ "x$tag" = "xlatest" ]; then \ | ||||
| #        netselect-apt -o /etc/apt/sources.list; \ | ||||
| #    else \ | ||||
| #        netselect-apt ${tag} -o /etc/apt/sources.list; \ | ||||
| #    fi | ||||
|  | ||||
| RUN apt-get update && \ | ||||
|     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: | ||||
|  | ||||
| ```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 install nextepc | ||||
| ``` | ||||
| @@ -39,12 +39,12 @@ $ sudo apt install nextepc | ||||
| Other Linux distributions can be installed by changing the path. | ||||
|  | ||||
| ``` | ||||
| https://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/Debian_9.0/ | ||||
| https://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/Raspbian_9.0/ | ||||
| https://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_16.04/ | ||||
| https://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_17.10/ | ||||
| https://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/Debian_9.0/ | ||||
| http://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/Raspbian_9.0/ | ||||
| http://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_16.04/ | ||||
| http://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_17.10/ | ||||
| http://download.opensuse.org/repositories/home:/acetcom:/open5gs:/latest/xUbuntu_18.04/ | ||||
| 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). | ||||
| @@ -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: | ||||
|  | ||||
|     ```bash | ||||
|     $ sudo apt update | ||||
|     $ sudo apt install curl | ||||
|     $ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - | ||||
|     $ sudo apt install nodejs | ||||
| @@ -133,7 +134,7 @@ $ sudo systemctl restart nextepc-sgwd | ||||
| You can now install WebUI of NextEPC. | ||||
|  | ||||
| ```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 | ||||
|   | ||||
| @@ -8,4 +8,4 @@ tags: | ||||
|   - 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 | ||||
| --- | ||||
|  | ||||
| - Fix the bug related to Mongo C Driver. [[More Info](https://github.com/acetcom/nextepc/commit/4245502ae287df9c457621b3f4cccb519c4d4878)] | ||||
| - Assets -- [v0.1.1.tar.gz](https://github.com/acetcom/nextepc/archive/v0.1.1.tar.gz) | ||||
| - 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/open5gs/nextepc/archive/v0.1.1.tar.gz) | ||||
|   | ||||
| @@ -11,4 +11,4 @@ tags: | ||||
| - Publish Debian/Ubuntu Package | ||||
| - 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) | ||||
| - 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 | ||||
| --- | ||||
|  | ||||
| - Add Authentication Synch Failure ([#11](https://github.com/acetcom/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) | ||||
| - 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/open5gs/nextepc/archive/v0.3.1.tar.gz) | ||||
|   | ||||
| @@ -10,11 +10,11 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" | ||||
| --- | ||||
|  | ||||
| #### 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 | ||||
| - 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 EPS attach type of Attach accept -- [#12](https://github.com/acetcom/nextepc/issues/12) from [pcminitech](https://github.com/pcminitech) | ||||
| - 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/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} | ||||
|   | ||||
| @@ -10,11 +10,11 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" | ||||
| --- | ||||
|  | ||||
| #### 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 | ||||
| - Fix the BUG for security capabilities mismatch ([#27](https://github.com/acetcom/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 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/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} | ||||
|   | ||||
| @@ -8,8 +8,8 @@ tags: | ||||
|   - Release | ||||
| --- | ||||
|  | ||||
| - Support eNB/MME Configuration Transfer, Error Indication ([#29](https://github.com/acetcom/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) | ||||
| - 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/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} | ||||
|   | ||||
| @@ -8,5 +8,5 @@ tags: | ||||
|   - 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} | ||||
|   | ||||
| @@ -13,11 +13,11 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" | ||||
| - Support NAS encryption(EEA1/EEA2/EEA3) | ||||
|  | ||||
| #### Bug fixes | ||||
| - Confirm with 36.412 requirement of SCTP stream id ([#54](https://github.com/acetcom/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 change MME's integrity order ([#64](https://github.com/acetcom/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 indirect tunnel ([#29](https://github.com/acetcom/nextepc/issues/29)) -- [wayne43290](https://github.com/wayne43290) | ||||
| - 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/open5gs/nextepc/pull/61)) -- [medeiros405](https://github.com/medeiros405) | ||||
| - 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/open5gs/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} | ||||
|   | ||||
| @@ -10,12 +10,12 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" | ||||
| --- | ||||
|  | ||||
| #### 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) | ||||
|   - Fix TLV uint32 bug ([#73](https://github.com/acetcom/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) | ||||
|   - Show reason string for YAML parser error ([#40](https://github.com/acetcom/nextepc/issues/40)) -- [Raw1mage](https://github.com/Raw1mage) | ||||
|   - 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/open5gs/nextepc/pull/73)) -- [giuliol](https://github.com/giuliol) | ||||
|   - 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/open5gs/nextepc/issues/40)) -- [Raw1mage](https://github.com/Raw1mage) | ||||
|   - Fix compile error for GCC 8.1 | ||||
|   - 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} | ||||
|   | ||||
| @@ -10,19 +10,19 @@ head_inline: "<style> ul { padding-bottom: 1em; } </style>" | ||||
| --- | ||||
|  | ||||
| #### Enhancements | ||||
| - Support 4-bytes RES in NAS Auth ([#147](https://github.com/acetcom/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) | ||||
| - 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/open5gs/nextepc/pull/100)) -- [TerryAlu](https://github.com/TerryAlu) | ||||
|  | ||||
| #### Bug fixes | ||||
| - Increase packet memory buffer ([#161](https://github.com/acetcom/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 incorrect timezone in NAS & GTP ([#140](https://github.com/acetcom/nextepc/issues/140)) --  [EugeneBogush](https://github.com/EugeneBogush) | ||||
| - 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/open5gs/nextepc/issues/156)) -- [hypercloud2017](https://github.com/hypercloud2017) | ||||
| - Fix incorrect timezone in NAS & GTP ([#140](https://github.com/open5gs/nextepc/issues/140)) --  [EugeneBogush](https://github.com/EugeneBogush) | ||||
|  | ||||
| #### Miscellaneous | ||||
| - nas_message.py: Fix copy+paste error([#159](https://github.com/acetcom/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) | ||||
| - Add missing C namespace ([#109](https://github.com/acetcom/nextepc/pull/109)) -- [brchiu](https://github.com/brchiu) | ||||
| - 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/open5gs/nextepc/pull/129)) -- [EugeneBogush](https://github.com/EugeneBogush) | ||||
| - Add missing C namespace ([#109](https://github.com/open5gs/nextepc/pull/109)) -- [brchiu](https://github.com/brchiu) | ||||
| - 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} | ||||
|   | ||||
							
								
								
									
										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_init.h" | ||||
|  | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wdate-time" | ||||
| static char *version = "NextEPC daemon v" \ | ||||
|                 PACKAGE_VERSION " - "__DATE__ " " __TIME__; | ||||
| #pragma GCC diagnostic pop | ||||
| static char *version = "NextEPC daemon v" PACKAGE_VERSION; | ||||
|  | ||||
| static void show_version() | ||||
| { | ||||
|   | ||||
| @@ -114,16 +114,11 @@ int app_did_initialize(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) | ||||
| { | ||||
|     context_db_final(); | ||||
|     context_final(); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -298,7 +298,10 @@ int context_db_init(const char *db_uri) | ||||
|  | ||||
|     const mongoc_uri_t *uri; | ||||
|  | ||||
|     memset(&self.db, 0, sizeof self.db); | ||||
|  | ||||
|     mongoc_init(); | ||||
|     self.db.initialized = true; | ||||
|  | ||||
|     self.db.client = mongoc_client_new(db_uri); | ||||
|     if (!self.db.client) | ||||
| @@ -335,18 +338,19 @@ int context_db_init(const char *db_uri) | ||||
|  | ||||
| int context_db_final() | ||||
| { | ||||
|     if (self.db.database) | ||||
|     { | ||||
|     if (self.db.database) { | ||||
|         mongoc_database_destroy(self.db.database); | ||||
|         self.db.database = NULL; | ||||
|     } | ||||
|     if (self.db.client) | ||||
|     { | ||||
|     if (self.db.client) { | ||||
|         mongoc_client_destroy(self.db.client); | ||||
|         self.db.client = NULL; | ||||
|     } | ||||
|  | ||||
|     if (self.db.initialized) { | ||||
|         mongoc_cleanup(); | ||||
|         self.db.initialized = false; | ||||
|     } | ||||
|  | ||||
|     return OGS_OK; | ||||
| } | ||||
|   | ||||
| @@ -46,6 +46,7 @@ typedef struct _context_t { | ||||
|     config_t config; | ||||
|  | ||||
|     struct { | ||||
|         bool initialized; | ||||
|         const char *name; | ||||
|         void *uri; | ||||
|         void *client; | ||||
|   | ||||
| @@ -8,7 +8,7 @@ extern "C" { | ||||
| int app_initialize(app_param_t *param); | ||||
| #define app_terminate epc_terminate | ||||
|  | ||||
| int epc_initialize(); | ||||
| int epc_initialize(app_param_t *param); | ||||
| void epc_terminate(void); | ||||
|  | ||||
| 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_sem2) ogs_proc_mutex_delete(pcrf_sem2); | ||||
|  | ||||
|             app_did_terminate(); | ||||
|  | ||||
|             context_final(); | ||||
|             ogs_core_finalize(); | ||||
|  | ||||
|             _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_sem2) ogs_proc_mutex_delete(pgw_sem2); | ||||
|  | ||||
|             app_did_terminate(); | ||||
|  | ||||
|             context_final(); | ||||
|             ogs_core_finalize(); | ||||
|  | ||||
|             _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_sem2) ogs_proc_mutex_delete(sgw_sem2); | ||||
|  | ||||
|             app_did_terminate(); | ||||
|  | ||||
|             context_final(); | ||||
|             ogs_core_finalize(); | ||||
|  | ||||
|             _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_sem2) ogs_proc_mutex_delete(hss_sem2); | ||||
|  | ||||
|             app_did_terminate(); | ||||
|  | ||||
|             context_final(); | ||||
|             ogs_core_finalize(); | ||||
|  | ||||
|             _exit(EXIT_SUCCESS); | ||||
|   | ||||
| @@ -18,7 +18,7 @@ hss_context_t* hss_self() | ||||
|     return &self; | ||||
| } | ||||
|  | ||||
| int hss_context_init(void) | ||||
| void hss_context_init(void) | ||||
| { | ||||
|     ogs_assert(context_initialized == 0); | ||||
|  | ||||
| @@ -34,19 +34,15 @@ int hss_context_init(void) | ||||
|     ogs_thread_mutex_init(&self.db_lock); | ||||
|  | ||||
|     context_initialized = 1; | ||||
|  | ||||
| 	return OGS_OK; | ||||
| } | ||||
|  | ||||
| int hss_context_final(void) | ||||
| void hss_context_final(void) | ||||
| { | ||||
|     ogs_assert(context_initialized == 1); | ||||
|  | ||||
|     ogs_thread_mutex_destroy(&self.db_lock); | ||||
|  | ||||
|     context_initialized = 0; | ||||
|  | ||||
| 	return OGS_OK; | ||||
| } | ||||
|  | ||||
| static int hss_context_prepare() | ||||
|   | ||||
| @@ -36,8 +36,8 @@ typedef struct _hss_context_t { | ||||
|     ogs_thread_mutex_t db_lock; | ||||
| } hss_context_t; | ||||
|  | ||||
| int hss_context_init(void); | ||||
| int hss_context_final(void); | ||||
| void hss_context_init(void); | ||||
| void hss_context_final(void); | ||||
| hss_context_t* hss_self(void); | ||||
|  | ||||
| int hss_context_parse_config(void); | ||||
|   | ||||
| @@ -9,8 +9,7 @@ int hss_initialize(void) | ||||
| { | ||||
|     int rv; | ||||
|  | ||||
|     rv = hss_context_init(); | ||||
|     if (rv != OGS_OK) return rv; | ||||
|     hss_context_init(); | ||||
|  | ||||
|     rv = hss_context_parse_config(); | ||||
|     if (rv != OGS_OK) return rv; | ||||
|   | ||||
| @@ -35,7 +35,7 @@ static OGS_POOL(mme_bearer_pool, mme_bearer_t); | ||||
|  | ||||
| static int context_initialized = 0; | ||||
|  | ||||
| int mme_context_init() | ||||
| void mme_context_init() | ||||
| { | ||||
|     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 */ | ||||
|  | ||||
|     context_initialized = 1; | ||||
|  | ||||
|     return OGS_OK; | ||||
| } | ||||
|  | ||||
| int mme_context_final() | ||||
| void mme_context_final() | ||||
| { | ||||
|     ogs_assert(context_initialized == 1); | ||||
|  | ||||
| @@ -129,8 +127,6 @@ int mme_context_final() | ||||
|     ogs_sock_remove_all_nodes(&self.gtpc_list6); | ||||
|  | ||||
|     context_initialized = 0; | ||||
|  | ||||
|     return OGS_OK; | ||||
| } | ||||
|  | ||||
| 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); | ||||
|  | ||||
|     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_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_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_addr_hash, enb->addr, sizeof(ogs_sockaddr_t), 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; | ||||
| } mme_bearer_t; | ||||
|  | ||||
| int mme_context_init(void); | ||||
| int mme_context_final(void); | ||||
| void mme_context_init(void); | ||||
| void mme_context_final(void); | ||||
| mme_context_t *mme_self(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); | ||||
|  | ||||
| #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); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|   | ||||
| @@ -383,13 +383,20 @@ static void mme_s6a_aia_cb(void *data, struct msg **msg) | ||||
| out: | ||||
|     if (!error) | ||||
|     { | ||||
|         int rv; | ||||
|         e = mme_event_new(MME_EVT_S6A_MESSAGE); | ||||
|         ogs_assert(e); | ||||
|         e->mme_ue = mme_ue; | ||||
|         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); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* Free the message */ | ||||
|     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) | ||||
|     { | ||||
|         int rv; | ||||
|         e = mme_event_new(MME_EVT_S6A_MESSAGE); | ||||
|         ogs_assert(e); | ||||
|         e->mme_ue = mme_ue; | ||||
|         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); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* Free the message */ | ||||
|     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); | ||||
|     ogs_assert(e); | ||||
|     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) | ||||
|   | ||||
| @@ -18,7 +18,10 @@ int mme_initialize() | ||||
| { | ||||
|     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; | ||||
|  | ||||
|     rv = mme_context_parse_config(); | ||||
| @@ -71,9 +74,6 @@ static void mme_main(void *data) | ||||
|     ogs_fsm_t mme_sm; | ||||
|     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_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); | ||||
|     if (new) | ||||
|     { | ||||
|         int rv; | ||||
|         ogs_sockaddr_t *addr = 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); | ||||
|         e->enb_sock = new; | ||||
|         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 | ||||
|     { | ||||
| @@ -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) | ||||
| { | ||||
|     int rv; | ||||
|     ogs_pkbuf_t *pkbuf; | ||||
|     int size; | ||||
|     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; | ||||
|                     e->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 || | ||||
|                         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); | ||||
|                     e->enb_sock = sock; | ||||
|                     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; | ||||
|             } | ||||
| @@ -228,7 +245,12 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data) | ||||
|                 ogs_assert(e); | ||||
|                 e->enb_sock = sock; | ||||
|                 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; | ||||
|             } | ||||
|             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_addr = addr; | ||||
|         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; | ||||
|     } | ||||
|   | ||||
| @@ -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 rv; | ||||
|     mme_event_t *e = NULL; | ||||
|  | ||||
|     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); | ||||
|     e->mme_ue = mme_ue; | ||||
|     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; | ||||
| } | ||||
| @@ -207,13 +213,19 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue, | ||||
|     ogs_assert(h); | ||||
|     if (h->protocol_discriminator == NAS_PROTOCOL_DISCRIMINATOR_EMM) | ||||
|     { | ||||
|         int rv; | ||||
|         e = mme_event_new(MME_EVT_EMM_MESSAGE); | ||||
|         ogs_assert(e); | ||||
|         e->enb_ue = enb_ue; | ||||
|         e->s1ap_code = procedureCode; | ||||
|         e->nas_type = security_header_type.type; | ||||
|         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) | ||||
|     { | ||||
|   | ||||
| @@ -384,6 +384,7 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock, | ||||
| { | ||||
|     if (data) | ||||
|     { | ||||
|         int rv; | ||||
|         mme_event_t *e = NULL; | ||||
|  | ||||
| #undef MSG_NOTIFICATION | ||||
| @@ -425,9 +426,15 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock, | ||||
|                             ogs_assert(e); | ||||
|                             e->enb_sock = (ogs_sock_t *)sock; | ||||
|                             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); | ||||
|                             } | ||||
|                         } | ||||
|                         else if (not->sn_assoc_change.sac_state == SCTP_COMM_UP) | ||||
|                         { | ||||
|                             ogs_sockaddr_t *addr = | ||||
| @@ -444,9 +451,15 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock, | ||||
|                                 not->sn_assoc_change.sac_inbound_streams; | ||||
|                             e->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); | ||||
|                             } | ||||
|                         } | ||||
|                         break; | ||||
|                     } | ||||
|                     case SCTP_SHUTDOWN_EVENT : | ||||
| @@ -464,8 +477,14 @@ static int s1ap_usrsctp_recv_handler(struct socket *sock, | ||||
|                         ogs_assert(e); | ||||
|                         e->enb_sock = (ogs_sock_t *)sock; | ||||
|                         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); | ||||
|                         } | ||||
|                         break; | ||||
|                     } | ||||
|                     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_addr = addr; | ||||
|             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); | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             ogs_error("Not engough buffer. Need more recv : 0x%x", flags); | ||||
|   | ||||
| @@ -18,7 +18,7 @@ pcrf_context_t* pcrf_self() | ||||
|     return &self; | ||||
| } | ||||
|  | ||||
| int pcrf_context_init(void) | ||||
| void pcrf_context_init(void) | ||||
| { | ||||
|     ogs_assert(context_initialized == 0); | ||||
|  | ||||
| @@ -37,11 +37,9 @@ int pcrf_context_init(void) | ||||
|     self.ip_hash = ogs_hash_make(); | ||||
|  | ||||
|     context_initialized = 1; | ||||
|  | ||||
| 	return OGS_OK; | ||||
| } | ||||
|  | ||||
| int pcrf_context_final(void) | ||||
| void pcrf_context_final(void) | ||||
| { | ||||
|     ogs_assert(context_initialized == 1); | ||||
|     ogs_assert(self.ip_hash); | ||||
| @@ -51,8 +49,6 @@ int pcrf_context_final(void) | ||||
|     ogs_thread_mutex_destroy(&self.db_lock); | ||||
|  | ||||
|     context_initialized = 0; | ||||
|  | ||||
| 	return OGS_OK; | ||||
| } | ||||
|  | ||||
| static int pcrf_context_prepare() | ||||
|   | ||||
| @@ -26,8 +26,8 @@ typedef struct _pcrf_context_t { | ||||
|     ogs_thread_mutex_t hash_lock; | ||||
| } pcrf_context_t; | ||||
|  | ||||
| int pcrf_context_init(void); | ||||
| int pcrf_context_final(void); | ||||
| void pcrf_context_init(void); | ||||
| void pcrf_context_final(void); | ||||
| pcrf_context_t *pcrf_self(void); | ||||
|  | ||||
| int pcrf_context_parse_config(void); | ||||
|   | ||||
| @@ -8,8 +8,7 @@ int pcrf_initialize(void) | ||||
| { | ||||
|     int rv; | ||||
|  | ||||
|     rv = pcrf_context_init(); | ||||
|     if (rv != OGS_OK) return rv; | ||||
|     pcrf_context_init(); | ||||
|  | ||||
|     rv = pcrf_context_parse_config(); | ||||
|     if (rv != OGS_OK) return rv; | ||||
|   | ||||
| @@ -27,7 +27,7 @@ static OGS_POOL(pgw_pf_pool, pgw_pf_t); | ||||
|  | ||||
| static int context_initiaized = 0; | ||||
|  | ||||
| int pgw_context_init() | ||||
| void pgw_context_init() | ||||
| { | ||||
|     ogs_assert(context_initiaized == 0); | ||||
|  | ||||
| @@ -62,11 +62,9 @@ int pgw_context_init() | ||||
|     self.sess_hash = ogs_hash_make(); | ||||
|  | ||||
|     context_initiaized = 1; | ||||
|  | ||||
|     return OGS_OK; | ||||
| } | ||||
|  | ||||
| int pgw_context_final() | ||||
| void pgw_context_final() | ||||
| { | ||||
|     ogs_assert(context_initiaized == 1); | ||||
|  | ||||
| @@ -95,8 +93,6 @@ int pgw_context_final() | ||||
|     ogs_sock_remove_all_nodes(&self.gtpu_list6); | ||||
|  | ||||
|     context_initiaized = 0; | ||||
|      | ||||
|     return OGS_OK; | ||||
| } | ||||
|  | ||||
| pgw_context_t* pgw_self() | ||||
| @@ -915,7 +911,9 @@ pgw_sess_t *pgw_sess_add( | ||||
|     else | ||||
|         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->ipv6 ?  INET6_NTOP(&sess->ipv6->addr, buf2) : ""); | ||||
|  | ||||
|   | ||||
| @@ -193,8 +193,8 @@ ED3(uint8_t spare:2;, | ||||
|     pgw_bearer_t    *bearer; | ||||
| } pgw_pf_t; | ||||
|  | ||||
| int pgw_context_init(void); | ||||
| int pgw_context_final(void); | ||||
| void pgw_context_init(void); | ||||
| void pgw_context_final(void); | ||||
| pgw_context_t *pgw_self(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); | ||||
| 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); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|   | ||||
| @@ -712,14 +712,21 @@ out: | ||||
|         e->gxbuf = gxbuf; | ||||
|         e->xact_index = xact->index; | ||||
|         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); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         gx_message_free(gx_message); | ||||
|         ogs_pkbuf_free(gxbuf); | ||||
|  | ||||
|         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->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); | ||||
|     } | ||||
|  | ||||
|     /* Set the Auth-Application-Id 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); | ||||
|     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) | ||||
|   | ||||
| @@ -16,7 +16,10 @@ int pgw_initialize() | ||||
| { | ||||
|     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; | ||||
|  | ||||
|     rv = pgw_context_parse_config(); | ||||
| @@ -61,9 +64,6 @@ static void pgw_main(void *data) | ||||
|     ogs_fsm_t pgw_sm; | ||||
|     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_init(&pgw_sm, 0); | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,6 @@ | ||||
| #define _DEFAULT_SOURCE 1 | ||||
| #define _BSD_SOURCE     1 | ||||
|  | ||||
| #include "base/base.h" | ||||
|  | ||||
| #if HAVE_NETINET_IP_H | ||||
|   | ||||
| @@ -21,7 +21,7 @@ static OGS_POOL(sgw_tunnel_pool, sgw_tunnel_t); | ||||
|  | ||||
| static int context_initialized = 0; | ||||
|  | ||||
| int sgw_context_init() | ||||
| void sgw_context_init() | ||||
| { | ||||
|     ogs_assert(context_initialized == 0); | ||||
|  | ||||
| @@ -48,11 +48,9 @@ int sgw_context_init() | ||||
|     self.imsi_ue_hash = ogs_hash_make(); | ||||
|  | ||||
|     context_initialized = 1; | ||||
|  | ||||
|     return OGS_OK; | ||||
| } | ||||
|  | ||||
| int sgw_context_final() | ||||
| void sgw_context_final() | ||||
| { | ||||
|     ogs_assert(context_initialized == 1); | ||||
|  | ||||
| @@ -78,8 +76,6 @@ int sgw_context_final() | ||||
|     ogs_sock_remove_all_nodes(&self.gtpu_list6); | ||||
|  | ||||
|     context_initialized = 0; | ||||
|      | ||||
|     return OGS_OK; | ||||
| } | ||||
|  | ||||
| sgw_context_t* sgw_self() | ||||
|   | ||||
| @@ -129,8 +129,8 @@ typedef struct _sgw_tunnel_t { | ||||
|     gtp_node_t      *gnode; | ||||
| } sgw_tunnel_t; | ||||
|  | ||||
| int sgw_context_init(void); | ||||
| int sgw_context_final(void); | ||||
| void sgw_context_init(void); | ||||
| void sgw_context_final(void); | ||||
| sgw_context_t* sgw_self(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); | ||||
| 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); | ||||
|  | ||||
| #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); | ||||
|  | ||||
|     if (SGW_S5C_TEID(teid)) | ||||
|     { | ||||
|         e = sgw_event_new(SGW_EVT_S5C_MESSAGE); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         e = sgw_event_new(SGW_EVT_S11_MESSAGE); | ||||
|     } | ||||
|     ogs_assert(e); | ||||
|     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) | ||||
| @@ -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); | ||||
|                         ogs_assert(e); | ||||
|                         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); | ||||
|                     } | ||||
|   | ||||
| @@ -14,7 +14,10 @@ int sgw_initialize() | ||||
| { | ||||
|     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; | ||||
|  | ||||
|     rv = sgw_context_parse_config(); | ||||
| @@ -51,9 +54,6 @@ static void sgw_main(void *data) | ||||
|     ogs_fsm_t sgw_sm; | ||||
|     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_init(&sgw_sm, 0); | ||||
|  | ||||
|   | ||||
| @@ -369,8 +369,6 @@ static void attach_test1(abts_case *tc, void *data) | ||||
|     ABTS_PTR_NOTNULL(tc, recvbuf); | ||||
|     ogs_pkbuf_free(recvbuf); | ||||
|  | ||||
|     ogs_msleep(300); | ||||
|  | ||||
|     /* Send Detach Request */ | ||||
|     rv = tests1ap_build_detach_request(&sendbuf, msgindex); | ||||
|     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); | ||||
|     ABTS_INT_EQUAL(tc, OGS_OK, rv); | ||||
|  | ||||
|     ogs_msleep(300); | ||||
|     return; | ||||
|  | ||||
| #if IT_WILL_BE_REMOVED | ||||
| @@ -706,8 +705,6 @@ static void attach_test2(abts_case *tc, void *data) | ||||
|     ABTS_PTR_NOTNULL(tc, recvbuf); | ||||
|     ogs_pkbuf_free(recvbuf); | ||||
|  | ||||
|     ogs_msleep(300); | ||||
|  | ||||
|     /***************************************************************** | ||||
|      * Attach Request : IMSI, Integrity Protected, MAC Matched | ||||
|      * 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 | ||||
|      * Send Initial-UE Message + Attach Request + PDN Connectivity  */ | ||||
|     ogs_msleep(300); | ||||
|  | ||||
|     rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+2); | ||||
|     ABTS_INT_EQUAL(tc, OGS_OK, rv); | ||||
|     rv = testenb_s1ap_send(sock, sendbuf); | ||||
| @@ -815,6 +810,8 @@ static void attach_test2(abts_case *tc, void *data) | ||||
|     /* eNB disonncect from MME */ | ||||
|     rv = testenb_s1ap_close(sock); | ||||
|     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 */ | ||||
|     rv = testenb_gtpu_close(gtpu); | ||||
|     ABTS_INT_EQUAL(tc, OGS_OK, rv); | ||||
|  | ||||
|     ogs_msleep(300); | ||||
| } | ||||
|  | ||||
| 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 */ | ||||
|     rv = testenb_s1ap_close(sock); | ||||
|     ABTS_INT_EQUAL(tc, OGS_OK, rv); | ||||
|  | ||||
|     ogs_msleep(300); | ||||
| } | ||||
|  | ||||
| abts_suite *test_attach(abts_suite *suite) | ||||
|   | ||||
| @@ -313,18 +313,18 @@ static void handover_test1(abts_case *tc, void *data) | ||||
|  | ||||
|     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 */ | ||||
|     rv = testenb_gtpu_close(gtpu2); | ||||
|     ABTS_INT_EQUAL(tc, OGS_OK, rv); | ||||
|  | ||||
|     rv = testenb_gtpu_close(gtpu1); | ||||
|     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); | ||||
|  | ||||
|     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); | ||||
|     ogs_pkbuf_free(recvbuf); | ||||
|  | ||||
|     ogs_msleep(300); | ||||
|  | ||||
|     /* Send GTP-U ICMP Packet */ | ||||
|     rv = testgtpu_build_ping(&sendbuf, "45.45.0.2", "45.45.0.1"); | ||||
|     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); | ||||
|     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 */ | ||||
|     doc = BCON_NEW("imsi", BCON_UTF8("310014987654004")); | ||||
|     ABTS_PTR_NOTNULL(tc, doc); | ||||
| @@ -261,8 +249,6 @@ static void test1_func(abts_case *tc, void *data) | ||||
|  | ||||
|     mongoc_collection_destroy(collection); | ||||
|  | ||||
|     ogs_msleep(300); | ||||
|  | ||||
|     /* eNB disonncect from MME */ | ||||
|     rv = testenb_s1ap_close(sock); | ||||
|     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); | ||||
|     ABTS_INT_EQUAL(tc, OGS_OK, rv); | ||||
|  | ||||
|     return; | ||||
|     ogs_msleep(300); | ||||
| } | ||||
|  | ||||
| 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"); | ||||
|         return OGS_ERROR; | ||||
|     } | ||||
|     rv = mme_context_init(); | ||||
|     if (rv != OGS_OK) | ||||
|     { | ||||
|         ogs_error("mme_context_init() failed"); | ||||
|         return OGS_ERROR; | ||||
|     } | ||||
|  | ||||
|     mme_context_init(); | ||||
|     app_did_initialize(); | ||||
|  | ||||
|     return rv; | ||||
|   | ||||
| @@ -111,6 +111,7 @@ int main(int argc, const char **argv) | ||||
|  | ||||
|     abts_init(argc, argv); | ||||
|  | ||||
|     memset(¶m, 0, sizeof(param)); | ||||
|     for (i = 1; i < argc; i++) { | ||||
|         /* abts_init(argc, argv) handles the following options */ | ||||
|         if (!strcmp(argv[i], "-v")) continue; | ||||
| @@ -154,7 +155,6 @@ int main(int argc, const char **argv) | ||||
|         ogs_core()->log.level = OGS_LOG_ERROR; | ||||
|     test_initialize(¶m, argc, argv); | ||||
|  | ||||
|  | ||||
|     for (i = 0; alltests[i].func; i++) | ||||
|     { | ||||
|         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_sem2) ogs_proc_mutex_delete(pcrf_sem2); | ||||
|  | ||||
|             app_did_terminate(); | ||||
|             context_final(); | ||||
|             ogs_core_finalize(); | ||||
|  | ||||
|             _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_sem2) ogs_proc_mutex_delete(pgw_sem2); | ||||
|  | ||||
|             app_did_terminate(); | ||||
|             context_final(); | ||||
|             ogs_core_finalize(); | ||||
|  | ||||
|             _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_sem2) ogs_proc_mutex_delete(sgw_sem2); | ||||
|  | ||||
|             app_did_terminate(); | ||||
|             context_final(); | ||||
|             ogs_core_finalize(); | ||||
|  | ||||
|             _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_sem2) ogs_proc_mutex_delete(hss_sem2); | ||||
|  | ||||
|             app_did_terminate(); | ||||
|             context_final(); | ||||
|             ogs_core_finalize(); | ||||
|  | ||||
|             _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_sem2) ogs_proc_mutex_delete(mme_sem2); | ||||
|  | ||||
|             app_did_terminate(); | ||||
|             context_final(); | ||||
|             ogs_core_finalize(); | ||||
|  | ||||
|             _exit(EXIT_SUCCESS); | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user