{"id":13720785,"url":"https://github.com/travelping/ergw","last_synced_at":"2026-02-03T13:12:34.327Z","repository":{"id":4097312,"uuid":"45920311","full_name":"travelping/ergw","owner":"travelping","description":"erGW - Erlang implementations of GGSN or P-GW","archived":false,"fork":false,"pushed_at":"2022-03-14T09:20:50.000Z","size":7884,"stargazers_count":85,"open_issues_count":13,"forks_count":33,"subscribers_count":28,"default_branch":"master","last_synced_at":"2025-05-07T13:34:39.332Z","etag":null,"topics":["3gpp","ergw","erlang","eutran","ggsn","gtp","lte","pdn-gw","pgw","umts","utran"],"latest_commit_sha":null,"homepage":"","language":"Erlang","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/travelping.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null}},"created_at":"2015-11-10T15:18:41.000Z","updated_at":"2025-04-06T12:37:00.000Z","dependencies_parsed_at":"2022-08-06T15:00:26.998Z","dependency_job_id":null,"html_url":"https://github.com/travelping/ergw","commit_stats":null,"previous_names":[],"tags_count":84,"template":false,"template_full_name":null,"purl":"pkg:github/travelping/ergw","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travelping%2Fergw","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travelping%2Fergw/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travelping%2Fergw/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travelping%2Fergw/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/travelping","download_url":"https://codeload.github.com/travelping/ergw/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travelping%2Fergw/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29046503,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-03T10:09:22.136Z","status":"ssl_error","status_checked_at":"2026-02-03T10:09:16.814Z","response_time":96,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3gpp","ergw","erlang","eutran","ggsn","gtp","lte","pdn-gw","pgw","umts","utran"],"created_at":"2024-08-03T01:01:08.024Z","updated_at":"2026-02-03T13:12:34.310Z","avatar_url":"https://github.com/travelping.png","language":"Erlang","funding_links":[],"categories":["General Libraries","Core"],"sub_categories":["4G"],"readme":"# erGW - 3GPP GGSN and PDN-GW in Erlang\n[![Build Status][gh badge]][gh]\n[![Coverage Status][coveralls badge]][coveralls]\n[![Erlang Versions][erlang version badge]][gh]\n\nThis is a 3GPP GGSN and PDN-GW implemented in Erlang. It strives to eventually support all the functionality as defined by [3GPP TS 23.002](http://www.3gpp.org/dynareport/23002.htm) Section 4.1.3.1 for the GGSN and Section 4.1.4.2.2 for the PDN-GW.\n\n# CONTENTS\n* [IMPLEMENTED FEATURES](#implemented-features)\n* [EXPERIMENTAL FEATURES](#experimental-features)\n* [USER PLANE](#user-plane)\n* [DIAMETER and RADIUS over Gi/SGi](#diameter-and-radius-over-gisgi)\n* [POLICY CONTROL](#policy-control)\n* [ONLINE/OFFLINE CHARING](#onlineoffline-charing)\n* [MISSING FEATURES](#missing-features)\n* [ERLANG Version Support](#erlang-version-support)\n* [DOCKER IMAGES](#docker-images)\n   * [BUILDING DOCKER IMAGE](#building-docker-image)\n* [BUILDING \u0026 RUNNING](#building--running)\n   * [REQUIRED](#required)\n   * [CONFIGURATION](#configuration)\n   * [COMPILE \u0026 RUN](#compile--run)\n\n# IMPLEMENTED FEATURES\nMessages:\n\n * GTPv1 Create/Update/Delete PDP Context Request on Gn\n * GTPv2 Create/Delete Session Request on S5/S8\n\nFrom the above the following procedures as defined by 3GPP T 23.060 should work:\n\n * PDP Context Activation/Modification/Deactivation Procedure\n * PDP Context Activation/Modification/Deactivation Procedure using S4\n * Intersystem Change Procedures (handover 2G/3G/LTE)\n * 3GPP TS 23.401:\n   * Sect. 5.4.2.2, HSS Initiated Subscribed QoS Modification (without PCRF)\n   * Annex D, Interoperation with Gn/Gp SGSNs procedures (see [CONFIG.md](CONFIG.md))\n\n# EXPERIMENTAL FEATURES\nExperimental features may change or be removed at any moment. Configuration settings\nfor them are not guaranteed to work across versions. Check [CONFIG.md](CONFIG.md) and\n[NEWS.md](NEWS.md) on version upgrades.\n\n * rate limiting, defaults to 100 requests/second\n * metrics, see [METRICS.md](METRICS.md)\n\n# USER PLANE\n*erGW* uses the 3GPP control and user plane separation (CUPS) of EPC nodes\narchitecture as layed out in [3GPP TS 23.214](http://www.3gpp.org/dynareport/23244.htm)\nand [3GPP TS 29.244](http://www.3gpp.org/dynareport/29244.htm).\n\n# DIAMETER and RADIUS over Gi/SGi\nThe SAE-GW, PGW and GGSN interfaces supports DIAMETER and RADIUS over the Gi/SGi interface\nas specified by 3GPP TS 29.061 Section 16.\nThis support is experimental in this version and not all aspects are functional. For RADIUS\nonly the Authentication and Authorization is full working, Accounting is experimental and\nnot fully supported. For DIAMETER NASREQ only the Accounting is working.\n\nSee [RADIUS.md](RADIUS.md) for a list of supported Attrbiutes.\n\nMany thanks to [On Waves](https://www.on-waves.com/) for sponsoring the RADIUS Authentication implementation.\n\nExample of configuration **RADIUS**:\n```erlang\n%% ...\n{ergw_aaa, [\n    {handlers, [\n        {ergw_aaa_static, [\n            {'Node-Id',        \u003c\u003c\"CHANGE-ME\"\u003e\u003e},            %% \u003c- CHANGE\n            {'NAS-Identifier', \u003c\u003c\"CHANGE-ME\"\u003e\u003e},            %% \u003c- CHANGE\n            {'NAS-IP-Address', {127,0,0,3}},                %% \u003c- CHANGE\n            {'Acct-Interim-Interval',   1800},              %% \u003c- CHANGE\n            {'Framed-Protocol',         'PPP'},\n            {'Service-Type',            'Framed-User'}\n        ]},\n        {ergw_aaa_radius, [\n            {server,\n                {{127,0,0,4}, 1813, \u003c\u003c\"CHANGE-ME-SECRET\"\u003e\u003e} %% \u003c- CHANGE IP and SECRET\n            },\n            {termination_cause_mapping, [\n                {normal, 1},\n                {administrative, 6},\n                {link_broken, 2},\n                {upf_failure, 9},\n                {remote_failure, 9},\n                {cp_inactivity_timeout, 4},\n                {up_inactivity_timeout, 4},\n                {'ASR', 6},\n                {error, 9},\n                {peer_restart, 7}\n            ]}\n        ]}\n    ]},\n    {services, [\n        {'Default', [\n            {handler, 'ergw_aaa_static'}\n        ]},\n        {'RADIUS-Acct', [\n            {handler, 'ergw_aaa_radius'}\n        ]}\n    ]},\n    {apps, [\n        {default, [\n            {session, ['Default']},\n            {procedures, [\n                {authenticate, []},\n                {authorize, []},\n                {start, ['RADIUS-Acct']},\n                {interim, ['RADIUS-Acct']},\n                {stop, ['RADIUS-Acct']}\n            ]}\n        ]}\n    ]}\n]},\n%% ...\n```\nExample of configuration **epc-ocs** `function` of **DIAMETER**:\n```erlang\n%% ...\n{ergw_aaa, [\n%% ...\n    {functions, [\n        {'epc-ocs', [\n            {handler, ergw_aaa_diameter},\n            {'Origin-Host', \u003c\u003c\"CHANGE-ME\"\u003e\u003e},                           %% \u003c- CHANGE: Origin-Host needs to be resolvable \n                                                                        %% to local IP (either through /etc/hosts or DNS)\n            {'Origin-Realm', \u003c\u003c\"CHANGE-ME\"\u003e\u003e},                          %% \u003c- CHANGE\n            {transports, [\n                [\n                    {connect_to, \u003c\u003c\"aaa://CHANGE-ME;transport=tcp\"\u003e\u003e},  %% \u003c- CHANGE\n                    {recbuf,131072},                                    %% \u003c- CHANGE\n                    {sndbuf,131072}                                     %% \u003c- CHANGE\n                ]\n            ]}\n        ]}\n    ]},\n%% ...\n]},\n%% ...\n```\nExample of configuration **ergw-pgw-epc-rf** `function` of **DIAMETER**:\n```erlang\n%% ...\n{ergw_aaa, [\n    %% ...\n    {functions, [\n        {'ergw-pgw-epc-rf', [\n            {handler, ergw_aaa_diameter},\n            {'Origin-Host', \u003c\u003c\"CHANGE-ME\"\u003e\u003e},                           %% \u003c- CHANGE\n            {'Origin-Realm', \u003c\u003c\"CHANGE-ME\"\u003e\u003e},                          %% \u003c- CHANGE\n            {transports, [\n                [\n                    {connect_to, \u003c\u003c\"aaa://CHANGE-ME;transport=tcp\"\u003e\u003e},  %% \u003c- CHANGE\n                    {recbuf,131072},                                    %% \u003c- CHANGE\n                    {reuseaddr,false},                                  %% \u003c- CHANGE\n                    {sndbuf,131072}                                     %% \u003c- CHANGE\n                ]\n            ]}\n        ]},\n    ]},\n    {handlers, [\n        %% ...\n        {ergw_aaa_rf, [\n            {function, 'ergw-pgw-epc-rf'},\n            {'Destination-Realm', \u003c\u003c\"CHANGE-ME\"\u003e\u003e}                      %% \u003c- CHANGE\n        ]},\n        {termination_cause_mapping, [\n            {normal, 1},           \n            {administrative, 4}, \n            {link_broken, 5},      \n            {upf_failure, 5},      \n            {remote_failure, 1},   \n            {cp_inactivity_timeout, 4},\n            {up_inactivity_timeout, 4},\n            {'ASR', 6},\n            {error, 9},\n            {peer_restart, 1} \n        ]}\n        %% ...\n    ]},\n    {services, [\n        %% ...\n        {'Rf', [{handler, 'ergw_aaa_rf'}]},\n        %% ...\n    ]},\n    {apps, [\n        {default, [\n            %% ...\n            {procedures, [\n                %% ...\n                { {rf, 'Initial'}, ['Rf']},\n                { {rf, 'Update'}, ['Rf']},\n                { {rf, 'Terminate'}, ['Rf']},\n                %% ...\n            ]}\n        ]}\n        %% ...\n    ]}\n]},\n%% ...\n```\n\n# POLICY CONTROL\nDIAMETER is Gx is supported as experimental feature. Only Credit-Control-Request/Answer\n(CCR/CCA) and Abort-Session-Request/Answer (ASR/ASA) procedures are supported.\nRe-Auth-Request/Re-Auth-Answer (RAR/RAA) procedures are not supported.\n\n# ONLINE/OFFLINE CHARING\nOnline charging through Gy is in beta quality with the following known caveats:\n\n * When multiple rating groups are in use, CCR Update requests will contain unit\n   reservation requests for all rating groups, however they should only contain the entries\n   for the rating groups where new quotas, threshold and validity's are needed.\n\nOffline charging through Rf is supported in beta quality in this version and works only in\n\"independent online and offline charging\" mode (tight interworking of online and offline\ncharging is not supported).\n\nLike on Gx only CCR/CCR and ASR/ASA procredures are supported.\n\n# MISSING FEATURES\nThe following procedures are assumed/known to be *NOT* working:\n\n * Secondary PDP Context Activation Procedure\n * Secondary PDP Context Activation Procedure using S4\n\nOther shortcomings:\n\n * QoS parameters are hard-coded\n\n# ERLANG Version Support\nAll minor version of the current major release and the highest minor version of\nthe previous major release will be supported.\nDue to a bug in OTP 22.x, the `netdev` configuration option of *erGW* is broken\n([see](https://github.com/erlang/otp/pull/2600)). If you need this feature, you\nmust use OTP 23.x.\n\nWhen in doubt check the `otp_release` section in [.github/workflows/main.yml](.github/workflows/main.yml) for tested\nversions.\n\n# DOCKER IMAGES\nDocker images are build by [GitHub Actions](.github/workflows/docker.yaml) and pushed to [hub.docker.com](https://hub.docker.com/r/ergw/ergw-c-node/tags),\nand by gitlab.com and pushed to [quay.io](https://quay.io/repository/travelping/ergw-c-node?tab=tags).\n\n## BUILDING DOCKER IMAGE\n**erGW** Docker image can be get from [quay.io](https://quay.io/repository/travelping/ergw-c-node?tab=tags). For create a new image based on `ergw-c-node` from `quay.io` need run second command:\n\n```sh\n$ docker run -t -i --rm quay.io/travelping/ergw-c-node:2.4.2 -- /bin/sh\n/ # cd opt\n/opt # ls\nergw-c-node\n```\n\n# BUILDING \u0026 RUNNING\n## REQUIRED\n* Erlang OTP **23.2.7** is the recommended version.\n* [Rebar3](https://www.rebar3.org/)\nAn *erGW* installation needs a user plane provider to handle the GTP-U path. This\ninstance can be installed on the same or different host.\n\nA suitable user plane node based on [VPP](https://wiki.fd.io/view/VPP) can be found at [VPP-UFP](https://github.com/travelping/vpp/).\n\n## CONFIGURATION\n**erGW** can be started with [rebar3](https://s3.amazonaws.com/rebar3/rebar3) command line tools, and build with run can looks like:\n\n```sh\n$ git clone https://github.com/travelping/ergw.git\n$ cd ergw\n$ wget https://s3.amazonaws.com/rebar3/rebar3\n$ chmod u+x ./rebar3\n$ touch ergw.config\n```\n\nThen fill just created **ergw.config** file with content like described below providing a suitable configuration, e.g.:\n\n```erlang\n%-*-Erlang-*-\n[{setup, [{data_dir, \"/var/lib/ergw\"},\n          {log_dir,  \"/var/log/ergw-c-node\"}\n         ]},\n\n {kernel,\n  [{logger,\n    [{handler, default, logger_std_h,\n      #{level =\u003e info,\n        config =\u003e\n            #{sync_mode_qlen =\u003e 10000,\n              drop_mode_qlen =\u003e 10000,\n              flush_qlen     =\u003e 10000}\n       }\n     }\n    ]}\n  ]},\n\n {ergw, [{'$setup_vars',\n          [{\"ORIGIN\", {value, \"epc.mnc001.mcc001.3gppnetwork.org\"}}]},\n         {plmn_id, {\u003c\u003c\"001\"\u003e\u003e, \u003c\u003c\"01\"\u003e\u003e}},\n\n         {http_api,\n          [{port, 8080},\n           {ip, {0,0,0,0}}\n          ]},\n\n         {node_id, \u003c\u003c\"pgw.$ORIGIN\"\u003e\u003e},\n         {sockets,\n          [{cp, [{type, 'gtp-u'},\n             {vrf, cp},\n             {ip,  {127,0,0,1}},\n             freebind,\n             {reuseaddr, true}\n            ]},\n           {irx, [{type, 'gtp-c'},\n                  {vrf, epc},\n                  {ip,  {127,0,0,1}},\n                  {reuseaddr, true}\n                 ]},\n           {sx, [{type, 'pfcp'},\n                 {socket, cp},\n                 {ip,  {172,21,16,2}}\n           ]}\n          ]},\n\n         {vrfs,\n          [{sgi, [{pools,  [{{10, 106, 0, 1}, {10, 106, 255, 254}, 32},\n                            {{16#8001, 0, 0, 0, 0, 0, 0, 0},\n                             {16#8001, 0, 0, 16#FFFF, 0, 0, 0, 0}, 64}\n                           ]},\n                  {'MS-Primary-DNS-Server', {8,8,8,8}},\n                  {'MS-Secondary-DNS-Server', {8,8,4,4}},\n                  {'MS-Primary-NBNS-Server', {127,0,0,1}},\n                  {'MS-Secondary-NBNS-Server', {127,0,0,1}}\n                 ]}\n          ]},\n\n         {handlers,\n          [{'h1', [{handler, pgw_s5s8},\n                   {protocol, gn},\n                   {sockets, [irx]},\n                   {node_selection, [default]}\n                  ]},\n           {'h2', [{handler, pgw_s5s8},\n                   {protocol, s5s8},\n                   {sockets, [irx]},\n                   {node_selection, [default]}\n                  ]}\n          ]},\n\n         {apns,\n          [{[\u003c\u003c\"tpip\"\u003e\u003e, \u003c\u003c\"net\"\u003e\u003e], [{vrf, sgi}]},\n           {[\u003c\u003c\"APN1\"\u003e\u003e], [{vrf, sgi}]}\n          ]},\n\n         {teid, {3, 6}}, % {teid, {Prefix, Length}} - optional, default: {0, 0}\n\n         {metrics, [\n             {gtp_path_rtt_millisecond_intervals, [10, 100]} % optional, default: [10, 30, 50, 75, 100, 1000, 2000]\n         ]},\n\n         {node_selection,\n          [{default,\n            {static,\n             [\n              %% APN NAPTR alternative\n              {\"_default.apn.$ORIGIN\", {300,64536},\n               [{\"x-3gpp-upf\",\"x-sxb\"}],\n               \"topon.sx.prox01.$ORIGIN\"},\n\n              %% A/AAAA record alternatives\n              {\"topon.sx.prox01.$ORIGIN\", [{127,0,0,1}], []}\n             ]\n            }\n           }\n          ]\n         },\n\n         {nodes,\n          [{default,\n            [{vrfs,\n              [{cp, [{features, ['CP-Function']}]},\n               {epc, [{features, ['Access']}]},\n               {sgi, [{features, ['SGi-LAN']}]}]\n             },\n             {heartbeat, [\n               {interval, 5000},\n               {timeout, 500},\n               {retry, 5}\n             ]},\n             {request,\n               [{timeout, 30000},\n               {retry, 5}]}]\n           }]\n         },\n\n         {path_management, [\n           {t3, 10000},\n           {n3,  5},\n           {echo, 60000},\n           {idle_timeout, 1800000},\n           {idle_echo,     600000},\n           {down_timeout, 3600000},\n           {down_echo,     600000},\n           {icmp_error_handling, immediate} % optional, can be 'ignore' | 'immediate', by default: immediate\n         ]}\n        ]},\n\n {ergw_aaa,\n  [{handlers,\n    [{ergw_aaa_static,\n        [{'NAS-Identifier',          \u003c\u003c\"NAS-Identifier\"\u003e\u003e},\n         {'Acct-Interim-Interval',   600},\n         {'Framed-Protocol',         'PPP'},\n         {'Service-Type',            'Framed-User'},\n         {'Node-Id',                 \u003c\u003c\"PGW-001\"\u003e\u003e},\n         {'Charging-Rule-Base-Name', \u003c\u003c\"cr-01\"\u003e\u003e},\n         {rules, #{'Default' =\u003e\n                       #{'Rating-Group' =\u003e [3000],\n                         'Flow-Information' =\u003e\n                             [#{'Flow-Description' =\u003e [\u003c\u003c\"permit out ip from any to assigned\"\u003e\u003e],\n                                'Flow-Direction'   =\u003e [1]    %% DownLink\n                               },\n                              #{'Flow-Description' =\u003e [\u003c\u003c\"permit out ip from any to assigned\"\u003e\u003e],\n                                'Flow-Direction'   =\u003e [2]    %% UpLink\n                               }],\n                         'Metering-Method'  =\u003e [1],\n                         'Precedence' =\u003e [100]\n                        }\n                  }\n         }\n        ]}\n    ]},\n\n   {services,\n    [{'Default', [{handler, 'ergw_aaa_static'}]}\n    ]},\n\n   {apps,\n    [{default,\n      [{session, ['Default']},\n       {procedures, [{authenticate, []},\n                     {authorize, []},\n                     {start, []},\n                     {interim, []},\n                     {stop, []}\n                    ]}\n      ]}\n    ]}\n  ]},\n\n {jobs, [{samplers,\n          [{cpu_feedback, jobs_sampler_cpu, []}\n          ]},\n         {queues,\n          [{path_restart,\n            [{regulators, [{counter, [{limit, 100}]}]},\n             {modifiers,  [{cpu_feedback, 10}]} %% 10 = % increment by which to modify the limit\n            ]},\n           {create,\n            [{max_time, 5000}, %% max 5 seconds\n             {regulators, [{rate, [{limit, 100}]}]},\n             {modifiers,  [{cpu_feedback, 10}]} %% 10 = % increment by which to modify the limit\n            ]},\n           {delete,\n            [{regulators, [{counter, [{limit, 100}]}]},\n             {modifiers,  [{cpu_feedback, 10}]} %% 10 = % increment by which to modify the limit\n            ]},\n           {other,\n            [{max_time, 10000}, %% max 10 seconds\n             {regulators, [{rate, [{limit, 1000}]}]},\n             {modifiers,  [{cpu_feedback, 10}]} %% 10 = % increment by which to modify the limit\n            ]}\n          ]}\n        ]}\n].\n```\n\n## COMPILE \u0026 RUN\n```sh\n$ ./rebar3 compile\n$ sudo ./rebar3 shell --setcookie secret --sname ergw --config ergw.config --apps ergw\n===\u003e Verifying dependencies...\nCONFIG: enabling persistent_term support\n===\u003e Analyzing applications...\n===\u003e Compiling ergw\nErlang/OTP 23 [erts-11.0.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]\n\nEshell V11.0.3  (abort with ^G)\n(ergw@localhost)1\u003e application:info().\n```\n\nThe configuration is documented in [CONFIG.md](CONFIG.md)\n\n## RUNNING UNIT TEST\n\nUnit test can be run local with:\n\n```sh\n$ rebar ct\n```\n\nIn order to run the IPv6 a number of locap IPv6 addresses have to be added to the host.\nCheck [.github/workflows/main.yml](.github/workflows/main.yml) or [.gitlab-ci.yml](.gitlab-ci.yml) the list.\n\nThe DNS resolver tests can be run with a local DNS server. The docker image use with\nthe CI test can also be use for that.\n\nRun it with:\n```sh\ndocker run -d --rm \\\n        --name=bind9 \\\n        --publish 127.0.10.1:53:53/udp \\\n        --publish 127.0.10.1:53:53/tcp \\\n        --publish 127.0.10.1:953:953/tcp \\\n        quay.io/travelping/ergw-dns-test-server:latest\n```\n\nand\n\n```sh\nexport CI_DNS_SERVER=127.0.10.1\n```\n\nbefore running the unit tests.\n\n\u003c!-- Badges --\u003e\n[gh]: https://github.com/travelping/ergw/actions/workflows/main.yml\n[gh badge]: https://img.shields.io/github/workflow/status/travelping/ergw/CI?style=flat-square\n[coveralls]: https://coveralls.io/github/travelping/ergw\n[coveralls badge]: https://img.shields.io/coveralls/travelping/ergw/master.svg?style=flat-square\n[erlang version badge]: https://img.shields.io/badge/erlang-R22.3.4%20to%2023.1-blue.svg?style=flat-square\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftravelping%2Fergw","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftravelping%2Fergw","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftravelping%2Fergw/lists"}