diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..83aa88b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +_build +*.beam diff --git a/dia/diameter_3gpp_ts29_273.dia b/dia/diameter_3gpp_ts29_273.dia deleted file mode 100644 index ab42e5d..0000000 --- a/dia/diameter_3gpp_ts29_273.dia +++ /dev/null @@ -1,321 +0,0 @@ -;; -;; %CopyrightBegin% -;; -;; Copyright (C) 2019 by Harald Welte. All Rights Reserved. -;; -;; This resembles 3GPP TS 29.273 version 15.3.0 Release 15 -;; -;; Licensed under the Apache License, Version 2.0 (the "License"); -;; you may not use this file except in compliance with the License. -;; You may obtain a copy of the License at -;; -;; http://www.apache.org/licenses/LICENSE-2.0 -;; -;; Unless required by applicable law or agreed to in writing, software -;; distributed under the License is distributed on an "AS IS" BASIS, -;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -;; See the License for the specific language governing permissions and -;; limitations under the License. -;; -;; %CopyrightEnd% -;; - -;; -;; Edits: -;; -;; - -@id 16777250 -@name diameter_3gpp_ts29_273 -@prefix diameter_aaa -@vendor 10415 3GPP - -@inherits diameter_gen_base_rfc6733 -@inherits diameter_rfc4005_nasreq -@inherits diameter_rfc4006_cc -@inherits diameter_3gpp_base -@inherits diameter_etsi_es283_034 -;; @inherits diameter_3gpp_ts29_061_gmb -;; @inherits diameter_3gpp_ts29_214 -@inherits diameter_3gpp_ts29_229 -@inherits diameter_3gpp_ts32_299 - -@inherits diameter_rfc7944 -@inherits diameter_rfc7683 -@inherits diameter_rfc6942 -@inherits diameter_rfc4072 -@inherits diameter_rfc6734 -@inherits diameter_3gpp_break_circles -;;@inherits diameter_rfc5778 -;;@inherits diameter_3gpp_ts29_212 - -@avp_types - - MIP6-Feature-Vector 124 Unsigned64 M - Service-Selection 493 UTF8String M - Mobile-Node-Identifier 506 UTF8String M - QoS-Capability 578 Grouped M - RAT-Type 1032 Enumerated MV - APN-Configuration 1430 Grouped MV - ANID 1504 UTF8String MV - Trace-Info 1505 Grouped V - AN-Trusted 1503 Enumerated MV - MIP-FA-RK 1506 OctetString MV - MIP-FA-RK-SPI 1507 Unsigned32 MV - PPR-Flags 1508 Unsigned32 V - WLAN-Identifier 1509 Grouped V - TWAN-Access-Info 1510 Grouped V - Access-Authorization-Flags 1511 Unsigned32 V - TWAN-Default-APN-Context-Id 1512 Unsigned32 V - Full-Network-Name 1516 OctetString V - Short-Network-Name 1517 OctetString V - AAA-Failure-Indication 1518 Unsigned32 V - Transport-Access-Type 1519 Enumerated V - DER-Flags 1520 Unsigned32 V - DEA-Flags 1521 Unsigned32 V - SSID 1524 UTF8String V - HESSID 1525 UTF8String V - Access-Network-Info 1526 Grouped V - TWAN-Connection-Mode 1527 Unsigned32 V - TWAN-Connectivity-Parameters 1528 Grouped V - Connectivity-Flags 1529 Unsigned32 V - TWAN-PCO 1530 OctetString V - TWAG-CP-Address 1531 Address V - TWAG-UG-Address 1532 UTF8String V - TWAN-S2a-Failure-Cause 1533 Unsigned32 V - SM-Back-Off-Timer 1534 Unsigned32 V - WLCP-Key 1535 OctetString V - Emergency-Services 1538 Unsigned32 V - IMEI-Check-In-VPLMN-Result 1540 Unsigned32 V - -@messages - - ;; 5.2.2.1.1 Diameter-EAP-Request (DER) Command - DER ::= < Diameter Header: 268, REQ, PXY > - < Session-Id > - { Auth-Application-Id } - { Origin-Host } - { Origin-Realm } - { Destination-Realm } - { Auth-Request-Type } - { EAP-Payload } - [ DRMP ] - [ Destination-Host ] - [ User-Name ] - [ Calling-Station-Id ] - [ RAT-Type ] - [ ANID ] - [ Full-Network-Name ] - [ Short-Network-Name ] - [ QoS-Capability ] - [ MIP6-Feature-Vector ] - [ Visited-Network-Identifier ] - [ Service-Selection ] - [ Terminal-Information ] - [ OC-Supported-Features ] - *[ Supported-Features ] - [ AAA-Failure-Indication ] - [ WLAN-Identifier ] - [ DER-Flags ] - [ TWAN-Connection-Mode ] - [ TWAN-Connectivity-Parameters ] - * 2 [ TWAG-CP-Address ] - [ ERP-RK-Request ] - *[ AVP ] - - ;; 5.2.2.1.2 Diameter-EAP-Answer (DEA) Command - DEA ::= < Diameter Header: 268, PXY > - < Session-Id > - { Auth-Application-Id } - { Result-Code } - { Origin-Host } - { Origin-Realm } - { Auth-Request-Type } - [ DRMP ] - [ Experimental-Result ] - [ EAP-Payload ] - [ User-Name ] - [ Session-Timeout ] - [ Accoting-Interim-Interval ] - [ EAP-Master-Session-Key ] - [ Context-Identifier ] - [ APN-OI-Replacement ] - *[ APN-Configuration ] - [MIP6-Agent-Info ] - [ MIP6-Feature-Vector ] - [ Mobile-Node-Identifier ] - [ 3GPP-Charging-Characteristics ] - [ AMBR ] - *[ Redirect-Host ] - [ AN-Trusted ] - [ Trace-Info ] - [ Subscription-Id ] - [ OC-Supported-Features ] - [ OC-OLR ] - ;;*[ Load ] - *[ Supported-Features ] - [ MIP-FA-RK ] - [ MIP-FA-RK-SPI ] - [ NSWO-Authorization ] - [ DEA-Flags ] - [ TWAN-Connection-Mode ] - [ TWAN-Connectivity-Parameters ] - [ WLCP-Key ] - [ Terminal-Information ] - [ UE-Usage-Type ] - [ Emergency-Services ] - [ Emergency-Info ] - [ Key ] - [ ERP-Realm ] - *[ AVP ] - - ;; 5.2.2.2.1 Abort-Session-Request - ASR ::= < Diameter Header: 274, REQ, PXY > - < Session-Id > - { Origin-Host } - { Origin-Realm } - { Destination-Realm } - { Destination-Host } - { Auth-Application-Id } - [ DRMP ] - [ User-Name ] - [ Auth-Session-State ] - *[ AVP ] - - ;; 5.2.2.2.2 Abort-Session-Answer - ASA ::= < Diameter Header: 274, PXY > - < Session-Id > - { Result-Code } - { Origin-Host } - { Origin-Realm } - [ DRMP ] - *[ AVP ] - - ;; 5.2.2.2.3 Session-Termination-Request - STR ::= < Diameter Header: 275, REQ, PXY > - < Session-Id > - { Origin-Host } - { Origin-Realm } - { Destination-Realm } - { Auth-Application-Id } - { Termination-Cause } - [ DRMP ] - [ Destination-Host ] - [ User-Name ] - [ OC-Supported-Features ] - *[ AVP ] - - ;; 5.2.2.2.4 Session-Termination-Answer - STA ::= < Diameter Header: 275, PXY > - < Session-Id > - { Result-Code } - { Origin-Host } - { Origin-Realm } - [ DRMP ] - [ OC-Supported-Features ] - [ OC-OLR ] - ;;*[ Load ] - *[ AVP ] - - ;; 5.2.2.3.1 Re-Auth-Request - RAR ::= < Diameter Header: 258, REQ, PXY > - < Session-Id > - { Origin-Host } - { Origin-Realm } - { Destination-Realm } - { Destination-Host } - { Auth-Application-Id } - { Re-Auth-Request-Type } - [ DRMP ] - [ User-Name ] - *[ AVP ] - - ;; 5.2.2.3.2 Re-Auth-Answer - RAA ::= < Diameter Header: 258, PXY > - < Session-Id > - { Result-Code } - { Origin-Host } - { Origin-Realm } - [ DRMP ] - *[ AVP ] - - ;; 5.2.2.3.3 AA-Request - AAR ::= < Diameter Header: 265, REQ, PXY > - < Session-Id > - { Auth-Application-Id } - { Origin-Host } - { Origin-Realm } - { Destination-Realm } - { Auth-Request-Type } - [ DRMP ] - [ Destination-Host ] - [ User-Name ] - [ MIP6-Feature-Vector ] - [ Access-Network-Info ] - [ Local-Time-Zone ] - [ OC-Supported-Features ] - *[ AVP ] - - ;; 5.2.2.3.4 AA-Answer - AAA ::= < Diameter Header: 265, PXY > - < Session-Id > - { Auth-Application-Id } - { Auth-Request-Type } - { Result-Code } - { Origin-Host } - { Origin-Realm } - [ DRMP ] - [ Experimental-Result ] - [ Session-Timeout ] - [ Acct-Interim-Interval ] - [ Context-Identifier ] - [ APN-OI-Replacement ] - *[ APN-Configuration ] - [ 3GPP-Charging-Characteristics ] - [ Trace-Info ] - [ Subscription-Id ] - [ OC-Supported-Features ] - [ OC-OLR ] - [ UE-Usage-Type ] - [ Emergency-Info] - ;;*[ Load ] - *[ AVP ] - -@enum Transport-Acess-Type - BBF 0 - -@enum AN-Trusted - TRUSTED 0 - UNTRUSTED 1 - -@grouped - -WLAN-Identifier ::= < AVP Header: 1509 10415 > - [SSID ] - [HESSID ] - *[ AVP ] - -Access-Network-Info ::= < AVP Header: 1526 10415 > - [ SSID ] - [ BSSID ] - [ Location-Information ] - [ Location-Data ] - [ Operator-Name ] - [ Logical-Access-ID ] - *[ AVP ] - -TWAN-Connectivity-Parameters ::= < AVP Header: 1528 10415 > - [ Connectivity-Flags ] - [ Service-Selection ] - [ PDN-Type ] - * 2 [ Served-Party-IP-Address ] - [ TWAN-PCO ] - [ TWAG-UP-Address ] - [ TWAN-S2a-Failure-Cause ] - [ SM-Back-Off-Timer ] - *[ AVP ] - -TWAN-Access-Info::= < AVP Header: 1510 10415 > - [ Access-Authorization-Flags ] - [ WLAN-Identifier ] - *[ AVP ] diff --git a/dia/diameter_3gpp_ts32_299.dia b/dia/diameter_3gpp_ts32_299.dia index 01cc8c1..450896b 100644 --- a/dia/diameter_3gpp_ts32_299.dia +++ b/dia/diameter_3gpp_ts32_299.dia @@ -33,6 +33,7 @@ @inherits diameter_3gpp_ts29_212 @inherits diameter_3gpp_ts29_214 @inherits diameter_3gpp_ts29_329 +@inherits diameter_3gpp_ts29_229 ;; =========================================================================== diff --git a/dia/diameter_rfc6942.erl b/dia/diameter_rfc6942.erl deleted file mode 100644 index 1300ecd..0000000 --- a/dia/diameter_rfc6942.erl +++ /dev/null @@ -1,582 +0,0 @@ -%% ------------------------------------------------------------------- -%% This is a generated file. -%% ------------------------------------------------------------------- - --module(diameter_rfc6942). - --compile({parse_transform, diameter_exprecs}). - --compile(nowarn_unused_function). - --export_records(['ERP-RK-Request', 'Proxy-Info', - 'Failed-AVP', 'Experimental-Result', - 'Vendor-Specific-Application-Id']). - --record('ERP-RK-Request', {'ERP-Realm', 'AVP' = []}). - --record('Proxy-Info', - {'Proxy-Host', 'Proxy-State', 'AVP' = []}). - --record('Failed-AVP', {'AVP' = []}). - --record('Experimental-Result', - {'Vendor-Id', 'Experimental-Result-Code'}). - --record('Vendor-Specific-Application-Id', - {'Vendor-Id', 'Auth-Application-Id' = [], - 'Acct-Application-Id' = []}). - --export([name/0, id/0, vendor_id/0, vendor_name/0, - decode_avps/3, encode_avps/3, grouped_avp/4, msg_name/2, - msg_header/1, rec2msg/1, msg2rec/1, name2rec/1, - avp_name/2, avp_arity/1, avp_arity/2, avp_header/1, - avp/4, enumerated_avp/3, empty_value/2, dict/0]). - --include_lib("diameter/include/diameter.hrl"). - --include_lib("diameter/include/diameter_gen.hrl"). - -name() -> diameter_rfc6942. - -id() -> 1. - -vendor_id() -> erlang:error(undefined). - -vendor_name() -> erlang:error(undefined). - -msg_name(_, _) -> ''. - -msg_header(_) -> erlang:error(badarg). - -rec2msg(_) -> erlang:error(badarg). - -msg2rec(_) -> erlang:error(badarg). - -name2rec('ERP-RK-Request') -> 'ERP-RK-Request'; -name2rec('Proxy-Info') -> 'Proxy-Info'; -name2rec('Failed-AVP') -> 'Failed-AVP'; -name2rec('Experimental-Result') -> - 'Experimental-Result'; -name2rec('Vendor-Specific-Application-Id') -> - 'Vendor-Specific-Application-Id'; -name2rec(T) -> msg2rec(T). - -avp_name(618, undefined) -> - {'ERP-RK-Request', 'Grouped'}; -avp_name(619, undefined) -> - {'ERP-Realm', 'DiameterIdentity'}; -avp_name(483, undefined) -> - {'Accounting-Realtime-Required', 'Enumerated'}; -avp_name(485, undefined) -> - {'Accounting-Record-Number', 'Unsigned32'}; -avp_name(480, undefined) -> - {'Accounting-Record-Type', 'Enumerated'}; -avp_name(287, undefined) -> - {'Accounting-Sub-Session-Id', 'Unsigned64'}; -avp_name(259, undefined) -> - {'Acct-Application-Id', 'Unsigned32'}; -avp_name(85, undefined) -> - {'Acct-Interim-Interval', 'Unsigned32'}; -avp_name(50, undefined) -> - {'Acct-Multi-Session-Id', 'UTF8String'}; -avp_name(44, undefined) -> - {'Acct-Session-Id', 'OctetString'}; -avp_name(258, undefined) -> - {'Auth-Application-Id', 'Unsigned32'}; -avp_name(276, undefined) -> - {'Auth-Grace-Period', 'Unsigned32'}; -avp_name(274, undefined) -> - {'Auth-Request-Type', 'Enumerated'}; -avp_name(277, undefined) -> - {'Auth-Session-State', 'Enumerated'}; -avp_name(291, undefined) -> - {'Authorization-Lifetime', 'Unsigned32'}; -avp_name(25, undefined) -> {'Class', 'OctetString'}; -avp_name(293, undefined) -> - {'Destination-Host', 'DiameterIdentity'}; -avp_name(283, undefined) -> - {'Destination-Realm', 'DiameterIdentity'}; -avp_name(273, undefined) -> - {'Disconnect-Cause', 'Enumerated'}; -avp_name(281, undefined) -> - {'Error-Message', 'UTF8String'}; -avp_name(294, undefined) -> - {'Error-Reporting-Host', 'DiameterIdentity'}; -avp_name(55, undefined) -> {'Event-Timestamp', 'Time'}; -avp_name(297, undefined) -> - {'Experimental-Result', 'Grouped'}; -avp_name(298, undefined) -> - {'Experimental-Result-Code', 'Unsigned32'}; -avp_name(279, undefined) -> {'Failed-AVP', 'Grouped'}; -avp_name(267, undefined) -> - {'Firmware-Revision', 'Unsigned32'}; -avp_name(257, undefined) -> - {'Host-IP-Address', 'Address'}; -avp_name(299, undefined) -> - {'Inband-Security-Id', 'Unsigned32'}; -avp_name(272, undefined) -> - {'Multi-Round-Time-Out', 'Unsigned32'}; -avp_name(264, undefined) -> - {'Origin-Host', 'DiameterIdentity'}; -avp_name(296, undefined) -> - {'Origin-Realm', 'DiameterIdentity'}; -avp_name(278, undefined) -> - {'Origin-State-Id', 'Unsigned32'}; -avp_name(269, undefined) -> - {'Product-Name', 'UTF8String'}; -avp_name(280, undefined) -> - {'Proxy-Host', 'DiameterIdentity'}; -avp_name(284, undefined) -> {'Proxy-Info', 'Grouped'}; -avp_name(33, undefined) -> - {'Proxy-State', 'OctetString'}; -avp_name(285, undefined) -> - {'Re-Auth-Request-Type', 'Enumerated'}; -avp_name(292, undefined) -> - {'Redirect-Host', 'DiameterURI'}; -avp_name(261, undefined) -> - {'Redirect-Host-Usage', 'Enumerated'}; -avp_name(262, undefined) -> - {'Redirect-Max-Cache-Time', 'Unsigned32'}; -avp_name(268, undefined) -> - {'Result-Code', 'Unsigned32'}; -avp_name(282, undefined) -> - {'Route-Record', 'DiameterIdentity'}; -avp_name(270, undefined) -> - {'Session-Binding', 'Unsigned32'}; -avp_name(263, undefined) -> - {'Session-Id', 'UTF8String'}; -avp_name(271, undefined) -> - {'Session-Server-Failover', 'Enumerated'}; -avp_name(27, undefined) -> - {'Session-Timeout', 'Unsigned32'}; -avp_name(265, undefined) -> - {'Supported-Vendor-Id', 'Unsigned32'}; -avp_name(295, undefined) -> - {'Termination-Cause', 'Enumerated'}; -avp_name(1, undefined) -> {'User-Name', 'UTF8String'}; -avp_name(266, undefined) -> {'Vendor-Id', 'Unsigned32'}; -avp_name(260, undefined) -> - {'Vendor-Specific-Application-Id', 'Grouped'}; -avp_name(_, _) -> 'AVP'. - -avp_arity('ERP-RK-Request') -> - [{'ERP-Realm', 1}, {'AVP', {0, '*'}}]; -avp_arity('Proxy-Info') -> - [{'Proxy-Host', 1}, {'Proxy-State', 1}, - {'AVP', {0, '*'}}]; -avp_arity('Failed-AVP') -> [{'AVP', {1, '*'}}]; -avp_arity('Experimental-Result') -> - [{'Vendor-Id', 1}, {'Experimental-Result-Code', 1}]; -avp_arity('Vendor-Specific-Application-Id') -> - [{'Vendor-Id', 1}, {'Auth-Application-Id', {0, 1}}, - {'Acct-Application-Id', {0, 1}}]; -avp_arity(_) -> erlang:error(badarg). - -avp_arity('ERP-RK-Request', 'ERP-Realm') -> 1; -avp_arity('ERP-RK-Request', 'AVP') -> {0, '*'}; -avp_arity('Proxy-Info', 'Proxy-Host') -> 1; -avp_arity('Proxy-Info', 'Proxy-State') -> 1; -avp_arity('Proxy-Info', 'AVP') -> {0, '*'}; -avp_arity('Failed-AVP', 'AVP') -> {1, '*'}; -avp_arity('Experimental-Result', 'Vendor-Id') -> 1; -avp_arity('Experimental-Result', - 'Experimental-Result-Code') -> - 1; -avp_arity('Vendor-Specific-Application-Id', - 'Vendor-Id') -> - 1; -avp_arity('Vendor-Specific-Application-Id', - 'Auth-Application-Id') -> - {0, 1}; -avp_arity('Vendor-Specific-Application-Id', - 'Acct-Application-Id') -> - {0, 1}; -avp_arity(_, _) -> 0. - -avp_header('ERP-RK-Request') -> {618, 0, undefined}; -avp_header('ERP-Realm') -> {619, 0, undefined}; -avp_header('Accounting-Realtime-Required') -> - diameter_gen_base_rfc6733:avp_header('Accounting-Realtime-Required'); -avp_header('Accounting-Record-Number') -> - diameter_gen_base_rfc6733:avp_header('Accounting-Record-Number'); -avp_header('Accounting-Record-Type') -> - diameter_gen_base_rfc6733:avp_header('Accounting-Record-Type'); -avp_header('Accounting-Sub-Session-Id') -> - diameter_gen_base_rfc6733:avp_header('Accounting-Sub-Session-Id'); -avp_header('Acct-Application-Id') -> - diameter_gen_base_rfc6733:avp_header('Acct-Application-Id'); -avp_header('Acct-Interim-Interval') -> - diameter_gen_base_rfc6733:avp_header('Acct-Interim-Interval'); -avp_header('Acct-Multi-Session-Id') -> - diameter_gen_base_rfc6733:avp_header('Acct-Multi-Session-Id'); -avp_header('Acct-Session-Id') -> - diameter_gen_base_rfc6733:avp_header('Acct-Session-Id'); -avp_header('Auth-Application-Id') -> - diameter_gen_base_rfc6733:avp_header('Auth-Application-Id'); -avp_header('Auth-Grace-Period') -> - diameter_gen_base_rfc6733:avp_header('Auth-Grace-Period'); -avp_header('Auth-Request-Type') -> - diameter_gen_base_rfc6733:avp_header('Auth-Request-Type'); -avp_header('Auth-Session-State') -> - diameter_gen_base_rfc6733:avp_header('Auth-Session-State'); -avp_header('Authorization-Lifetime') -> - diameter_gen_base_rfc6733:avp_header('Authorization-Lifetime'); -avp_header('Class') -> - diameter_gen_base_rfc6733:avp_header('Class'); -avp_header('Destination-Host') -> - diameter_gen_base_rfc6733:avp_header('Destination-Host'); -avp_header('Destination-Realm') -> - diameter_gen_base_rfc6733:avp_header('Destination-Realm'); -avp_header('Disconnect-Cause') -> - diameter_gen_base_rfc6733:avp_header('Disconnect-Cause'); -avp_header('Error-Message') -> - diameter_gen_base_rfc6733:avp_header('Error-Message'); -avp_header('Error-Reporting-Host') -> - diameter_gen_base_rfc6733:avp_header('Error-Reporting-Host'); -avp_header('Event-Timestamp') -> - diameter_gen_base_rfc6733:avp_header('Event-Timestamp'); -avp_header('Experimental-Result') -> - diameter_gen_base_rfc6733:avp_header('Experimental-Result'); -avp_header('Experimental-Result-Code') -> - diameter_gen_base_rfc6733:avp_header('Experimental-Result-Code'); -avp_header('Failed-AVP') -> - diameter_gen_base_rfc6733:avp_header('Failed-AVP'); -avp_header('Firmware-Revision') -> - diameter_gen_base_rfc6733:avp_header('Firmware-Revision'); -avp_header('Host-IP-Address') -> - diameter_gen_base_rfc6733:avp_header('Host-IP-Address'); -avp_header('Inband-Security-Id') -> - diameter_gen_base_rfc6733:avp_header('Inband-Security-Id'); -avp_header('Multi-Round-Time-Out') -> - diameter_gen_base_rfc6733:avp_header('Multi-Round-Time-Out'); -avp_header('Origin-Host') -> - diameter_gen_base_rfc6733:avp_header('Origin-Host'); -avp_header('Origin-Realm') -> - diameter_gen_base_rfc6733:avp_header('Origin-Realm'); -avp_header('Origin-State-Id') -> - diameter_gen_base_rfc6733:avp_header('Origin-State-Id'); -avp_header('Product-Name') -> - diameter_gen_base_rfc6733:avp_header('Product-Name'); -avp_header('Proxy-Host') -> - diameter_gen_base_rfc6733:avp_header('Proxy-Host'); -avp_header('Proxy-Info') -> - diameter_gen_base_rfc6733:avp_header('Proxy-Info'); -avp_header('Proxy-State') -> - diameter_gen_base_rfc6733:avp_header('Proxy-State'); -avp_header('Re-Auth-Request-Type') -> - diameter_gen_base_rfc6733:avp_header('Re-Auth-Request-Type'); -avp_header('Redirect-Host') -> - diameter_gen_base_rfc6733:avp_header('Redirect-Host'); -avp_header('Redirect-Host-Usage') -> - diameter_gen_base_rfc6733:avp_header('Redirect-Host-Usage'); -avp_header('Redirect-Max-Cache-Time') -> - diameter_gen_base_rfc6733:avp_header('Redirect-Max-Cache-Time'); -avp_header('Result-Code') -> - diameter_gen_base_rfc6733:avp_header('Result-Code'); -avp_header('Route-Record') -> - diameter_gen_base_rfc6733:avp_header('Route-Record'); -avp_header('Session-Binding') -> - diameter_gen_base_rfc6733:avp_header('Session-Binding'); -avp_header('Session-Id') -> - diameter_gen_base_rfc6733:avp_header('Session-Id'); -avp_header('Session-Server-Failover') -> - diameter_gen_base_rfc6733:avp_header('Session-Server-Failover'); -avp_header('Session-Timeout') -> - diameter_gen_base_rfc6733:avp_header('Session-Timeout'); -avp_header('Supported-Vendor-Id') -> - diameter_gen_base_rfc6733:avp_header('Supported-Vendor-Id'); -avp_header('Termination-Cause') -> - diameter_gen_base_rfc6733:avp_header('Termination-Cause'); -avp_header('User-Name') -> - diameter_gen_base_rfc6733:avp_header('User-Name'); -avp_header('Vendor-Id') -> - diameter_gen_base_rfc6733:avp_header('Vendor-Id'); -avp_header('Vendor-Specific-Application-Id') -> - diameter_gen_base_rfc6733:avp_header('Vendor-Specific-Application-Id'); -avp_header(_) -> erlang:error(badarg). - -avp(T, Data, 'ERP-RK-Request', Opts) -> - grouped_avp(T, 'ERP-RK-Request', Data, Opts); -avp(T, Data, 'ERP-Realm', Opts) -> - diameter_types:'DiameterIdentity'(T, Data, Opts); -avp(T, Data, 'Accounting-Realtime-Required', Opts) -> - avp(T, Data, 'Accounting-Realtime-Required', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Accounting-Record-Number', Opts) -> - avp(T, Data, 'Accounting-Record-Number', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Accounting-Record-Type', Opts) -> - avp(T, Data, 'Accounting-Record-Type', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Accounting-Sub-Session-Id', Opts) -> - avp(T, Data, 'Accounting-Sub-Session-Id', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Acct-Application-Id', Opts) -> - avp(T, Data, 'Acct-Application-Id', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Acct-Interim-Interval', Opts) -> - avp(T, Data, 'Acct-Interim-Interval', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Acct-Multi-Session-Id', Opts) -> - avp(T, Data, 'Acct-Multi-Session-Id', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Acct-Session-Id', Opts) -> - avp(T, Data, 'Acct-Session-Id', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Auth-Application-Id', Opts) -> - avp(T, Data, 'Auth-Application-Id', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Auth-Grace-Period', Opts) -> - avp(T, Data, 'Auth-Grace-Period', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Auth-Request-Type', Opts) -> - avp(T, Data, 'Auth-Request-Type', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Auth-Session-State', Opts) -> - avp(T, Data, 'Auth-Session-State', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Authorization-Lifetime', Opts) -> - avp(T, Data, 'Authorization-Lifetime', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Class', Opts) -> - avp(T, Data, 'Class', Opts, diameter_gen_base_rfc6733); -avp(T, Data, 'Destination-Host', Opts) -> - avp(T, Data, 'Destination-Host', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Destination-Realm', Opts) -> - avp(T, Data, 'Destination-Realm', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Disconnect-Cause', Opts) -> - avp(T, Data, 'Disconnect-Cause', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Error-Message', Opts) -> - avp(T, Data, 'Error-Message', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Error-Reporting-Host', Opts) -> - avp(T, Data, 'Error-Reporting-Host', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Event-Timestamp', Opts) -> - avp(T, Data, 'Event-Timestamp', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Experimental-Result', Opts) -> - grouped_avp(T, 'Experimental-Result', Data, Opts); -avp(T, Data, 'Experimental-Result-Code', Opts) -> - avp(T, Data, 'Experimental-Result-Code', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Failed-AVP', Opts) -> - grouped_avp(T, 'Failed-AVP', Data, Opts); -avp(T, Data, 'Firmware-Revision', Opts) -> - avp(T, Data, 'Firmware-Revision', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Host-IP-Address', Opts) -> - avp(T, Data, 'Host-IP-Address', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Inband-Security-Id', Opts) -> - avp(T, Data, 'Inband-Security-Id', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Multi-Round-Time-Out', Opts) -> - avp(T, Data, 'Multi-Round-Time-Out', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Origin-Host', Opts) -> - avp(T, Data, 'Origin-Host', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Origin-Realm', Opts) -> - avp(T, Data, 'Origin-Realm', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Origin-State-Id', Opts) -> - avp(T, Data, 'Origin-State-Id', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Product-Name', Opts) -> - avp(T, Data, 'Product-Name', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Proxy-Host', Opts) -> - avp(T, Data, 'Proxy-Host', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Proxy-Info', Opts) -> - grouped_avp(T, 'Proxy-Info', Data, Opts); -avp(T, Data, 'Proxy-State', Opts) -> - avp(T, Data, 'Proxy-State', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Re-Auth-Request-Type', Opts) -> - avp(T, Data, 'Re-Auth-Request-Type', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Redirect-Host', Opts) -> - avp(T, Data, 'Redirect-Host', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Redirect-Host-Usage', Opts) -> - avp(T, Data, 'Redirect-Host-Usage', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Redirect-Max-Cache-Time', Opts) -> - avp(T, Data, 'Redirect-Max-Cache-Time', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Result-Code', Opts) -> - avp(T, Data, 'Result-Code', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Route-Record', Opts) -> - avp(T, Data, 'Route-Record', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Session-Binding', Opts) -> - avp(T, Data, 'Session-Binding', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Session-Id', Opts) -> - avp(T, Data, 'Session-Id', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Session-Server-Failover', Opts) -> - avp(T, Data, 'Session-Server-Failover', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Session-Timeout', Opts) -> - avp(T, Data, 'Session-Timeout', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Supported-Vendor-Id', Opts) -> - avp(T, Data, 'Supported-Vendor-Id', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Termination-Cause', Opts) -> - avp(T, Data, 'Termination-Cause', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'User-Name', Opts) -> - avp(T, Data, 'User-Name', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Vendor-Id', Opts) -> - avp(T, Data, 'Vendor-Id', Opts, - diameter_gen_base_rfc6733); -avp(T, Data, 'Vendor-Specific-Application-Id', Opts) -> - grouped_avp(T, 'Vendor-Specific-Application-Id', Data, - Opts); -avp(_, _, _, _) -> erlang:error(badarg). - -enumerated_avp(_, _, _) -> erlang:error(badarg). - -empty_value('ERP-RK-Request', Opts) -> - empty_group('ERP-RK-Request', Opts); -empty_value('Proxy-Info', Opts) -> - empty_group('Proxy-Info', Opts); -empty_value('Failed-AVP', Opts) -> - empty_group('Failed-AVP', Opts); -empty_value('Experimental-Result', Opts) -> - empty_group('Experimental-Result', Opts); -empty_value('Vendor-Specific-Application-Id', Opts) -> - empty_group('Vendor-Specific-Application-Id', Opts); -empty_value('Disconnect-Cause', _) -> <<0, 0, 0, 0>>; -empty_value('Redirect-Host-Usage', _) -> <<0, 0, 0, 0>>; -empty_value('Auth-Request-Type', _) -> <<0, 0, 0, 0>>; -empty_value('Auth-Session-State', _) -> <<0, 0, 0, 0>>; -empty_value('Re-Auth-Request-Type', _) -> - <<0, 0, 0, 0>>; -empty_value('Termination-Cause', _) -> <<0, 0, 0, 0>>; -empty_value('Session-Server-Failover', _) -> - <<0, 0, 0, 0>>; -empty_value('Accounting-Record-Type', _) -> - <<0, 0, 0, 0>>; -empty_value('Accounting-Realtime-Required', _) -> - <<0, 0, 0, 0>>; -empty_value(Name, Opts) -> empty(Name, Opts). - -dict() -> - [1, - {avp_types, - [{"ERP-RK-Request", 618, "Grouped", []}, - {"ERP-Realm", 619, "DiameterIdentity", []}]}, - {avp_vendor_id, []}, {codecs, []}, {command_codes, []}, - {custom_types, []}, {define, []}, {enum, []}, - {grouped, - [{"ERP-RK-Request", 618, [], - [{"ERP-Realm"}, {'*', ["AVP"]}]}]}, - {id, 1}, - {import_avps, - [{diameter_gen_base_rfc6733, - [{"Accounting-Realtime-Required", 483, "Enumerated", - "M"}, - {"Accounting-Record-Number", 485, "Unsigned32", "M"}, - {"Accounting-Record-Type", 480, "Enumerated", "M"}, - {"Accounting-Sub-Session-Id", 287, "Unsigned64", "M"}, - {"Acct-Application-Id", 259, "Unsigned32", "M"}, - {"Acct-Interim-Interval", 85, "Unsigned32", "M"}, - {"Acct-Multi-Session-Id", 50, "UTF8String", "M"}, - {"Acct-Session-Id", 44, "OctetString", "M"}, - {"Auth-Application-Id", 258, "Unsigned32", "M"}, - {"Auth-Grace-Period", 276, "Unsigned32", "M"}, - {"Auth-Request-Type", 274, "Enumerated", "M"}, - {"Auth-Session-State", 277, "Enumerated", "M"}, - {"Authorization-Lifetime", 291, "Unsigned32", "M"}, - {"Class", 25, "OctetString", "M"}, - {"Destination-Host", 293, "DiameterIdentity", "M"}, - {"Destination-Realm", 283, "DiameterIdentity", "M"}, - {"Disconnect-Cause", 273, "Enumerated", "M"}, - {"Error-Message", 281, "UTF8String", []}, - {"Error-Reporting-Host", 294, "DiameterIdentity", []}, - {"Event-Timestamp", 55, "Time", "M"}, - {"Experimental-Result", 297, "Grouped", "M"}, - {"Experimental-Result-Code", 298, "Unsigned32", "M"}, - {"Failed-AVP", 279, "Grouped", "M"}, - {"Firmware-Revision", 267, "Unsigned32", []}, - {"Host-IP-Address", 257, "Address", "M"}, - {"Inband-Security-Id", 299, "Unsigned32", "M"}, - {"Multi-Round-Time-Out", 272, "Unsigned32", "M"}, - {"Origin-Host", 264, "DiameterIdentity", "M"}, - {"Origin-Realm", 296, "DiameterIdentity", "M"}, - {"Origin-State-Id", 278, "Unsigned32", "M"}, - {"Product-Name", 269, "UTF8String", []}, - {"Proxy-Host", 280, "DiameterIdentity", "M"}, - {"Proxy-Info", 284, "Grouped", "M"}, - {"Proxy-State", 33, "OctetString", "M"}, - {"Re-Auth-Request-Type", 285, "Enumerated", "M"}, - {"Redirect-Host", 292, "DiameterURI", "M"}, - {"Redirect-Host-Usage", 261, "Enumerated", "M"}, - {"Redirect-Max-Cache-Time", 262, "Unsigned32", "M"}, - {"Result-Code", 268, "Unsigned32", "M"}, - {"Route-Record", 282, "DiameterIdentity", "M"}, - {"Session-Binding", 270, "Unsigned32", "M"}, - {"Session-Id", 263, "UTF8String", "M"}, - {"Session-Server-Failover", 271, "Enumerated", "M"}, - {"Session-Timeout", 27, "Unsigned32", "M"}, - {"Supported-Vendor-Id", 265, "Unsigned32", "M"}, - {"Termination-Cause", 295, "Enumerated", "M"}, - {"User-Name", 1, "UTF8String", "M"}, - {"Vendor-Id", 266, "Unsigned32", "M"}, - {"Vendor-Specific-Application-Id", 260, "Grouped", - "M"}]}]}, - {import_enums, - [{diameter_gen_base_rfc6733, - [{"Disconnect-Cause", - [{"REBOOTING", 0}, {"BUSY", 1}, - {"DO_NOT_WANT_TO_TALK_TO_YOU", 2}]}, - {"Redirect-Host-Usage", - [{"DONT_CACHE", 0}, {"ALL_SESSION", 1}, - {"ALL_REALM", 2}, {"REALM_AND_APPLICATION", 3}, - {"ALL_APPLICATION", 4}, {"ALL_HOST", 5}, - {"ALL_USER", 6}]}, - {"Auth-Request-Type", - [{"AUTHENTICATE_ONLY", 1}, {"AUTHORIZE_ONLY", 2}, - {"AUTHORIZE_AUTHENTICATE", 3}]}, - {"Auth-Session-State", - [{"STATE_MAINTAINED", 0}, {"NO_STATE_MAINTAINED", 1}]}, - {"Re-Auth-Request-Type", - [{"AUTHORIZE_ONLY", 0}, {"AUTHORIZE_AUTHENTICATE", 1}]}, - {"Termination-Cause", - [{"LOGOUT", 1}, {"SERVICE_NOT_PROVIDED", 2}, - {"BAD_ANSWER", 3}, {"ADMINISTRATIVE", 4}, - {"LINK_BROKEN", 5}, {"AUTH_EXPIRED", 6}, - {"USER_MOVED", 7}, {"SESSION_TIMEOUT", 8}]}, - {"Session-Server-Failover", - [{"REFUSE_SERVICE", 0}, {"TRY_AGAIN", 1}, - {"ALLOW_SERVICE", 2}, {"TRY_AGAIN_ALLOW_SERVICE", 3}]}, - {"Accounting-Record-Type", - [{"EVENT_RECORD", 1}, {"START_RECORD", 2}, - {"INTERIM_RECORD", 3}, {"STOP_RECORD", 4}]}, - {"Accounting-Realtime-Required", - [{"DELIVER_AND_GRANT", 1}, {"GRANT_AND_STORE", 2}, - {"GRANT_AND_LOSE", 3}]}]}]}, - {import_groups, - [{diameter_gen_base_rfc6733, - [{"Proxy-Info", 284, [], - [{"Proxy-Host"}, {"Proxy-State"}, {'*', ["AVP"]}]}, - {"Failed-AVP", 279, [], [{'*', {"AVP"}}]}, - {"Experimental-Result", 297, [], - [{"Vendor-Id"}, {"Experimental-Result-Code"}]}, - {"Vendor-Specific-Application-Id", 260, [], - [{"Vendor-Id"}, ["Auth-Application-Id"], - ["Acct-Application-Id"]]}]}]}, - {inherits, [{"diameter_gen_base_rfc6733", []}]}, - {messages, []}]. - - diff --git a/rebar.config b/rebar.config new file mode 100644 index 0000000..24ec03c --- /dev/null +++ b/rebar.config @@ -0,0 +1,31 @@ +{erl_opts, [debug_info, {parse_transform, lager_transform}]}. + +{deps, [ + {setup, "2.0.2"}, + {lager, "3.6.8"} +]}. + +{minimum_otp_vsn, "20.3"}. +{plugins, [ + {rebar3_diameter_compiler, + {git, "https://github.com/carlosedp/rebar3_diameter_compiler.git", {branch, "master"}}} +]}. + +{xref_checks, [undefined_function_calls, undefined_functions, + deprecated_function_calls, deprecated_functions]}. + +{provider_hooks, + [{pre, + [{compile, {diameter, compile}}, + {clean, {diameter, clean}} + ]} +]}. + +{dia_first_files, ["diameter_3gpp_base.dia", "diameter_rfc7155_nasreq.dia", "diameter_3gpp_ts29_212.dia", "diameter_3gpp_ts32_299.dia", "diameter_3gpp_ts29_272.dia"]}. + +{dia_opts, []}. + +{dialyzer, [ + {plt_extra_apps, [kernel, stdlib, erts, tools, inets, compiler, diameter]}, + {warnings, [no_improper_lists]} + ]}. diff --git a/src/osmo_dia2gsup.app.src b/src/osmo_dia2gsup.app.src new file mode 100644 index 0000000..97c1cb6 --- /dev/null +++ b/src/osmo_dia2gsup.app.src @@ -0,0 +1,13 @@ +{application, osmo_dia2gsup, [ + {decription, "Osmocom DIAMETER -> GSUP translator"}, + {vsn, "1"}, + {registered, []}, + {applications, [ + kernel, + stdlib, + lager, + diameter + ]}, + {mod, {osmo_dia2gsup_app, []}}, + {env, []} +]}. diff --git a/src/osmo_dia2gsup.erl b/src/osmo_dia2gsup.erl new file mode 100644 index 0000000..a064a99 --- /dev/null +++ b/src/osmo_dia2gsup.erl @@ -0,0 +1,117 @@ +-module(osmo_dia2gsup). +-behavior(gen_server). + +-include_lib("diameter/include/diameter.hrl"). +-include_lib("diameter/include/diameter_gen_base_rfc6733.hrl"). +%-include_lib("diameter_settings.hrl"). + +% API +-export([start_link/0]). +-export([start/0, stop/0]). + +% gen_server callbacks +-export([init/1, handle_call/3, handle_cast/2, handle_info/2]). +-export([code_change/3, terminate/2]). + +-define(SERVER, ?MODULE). + +% Diameter application definitions + +-define(DIA_STATS_TAB, iwf_stats). +-define(DIA_STATS_COUNTERS, [event_OK, event_ERR]). + +-define(SVC_NAME, ?MODULE). +-define(APP_ALIAS, ?MODULE). +-define(CALLBACK_MOD, server_cb). +-define(DIAMETER_DICT_HSS, diameter_3gpp_ts29_272). + +-define(SERVICE(Name), [{'Origin-Host', application:get_env(osmo_dia2gsup, origin_host, "hss.localdomain")}, + {'Origin-Realm', applicaiton:get_env(osmo_dia2gsup, origin_realm, "localdomain")}, + {'Vendor-Id', application:get_env(osmo_dia2gsup, vendor_id, 0)}, + {'Product-Name', "osmo_dia2gsup"}, + {'Auth-Application-Id', []}, + {application, + [{alias, ?APP_ALIAS}, + {dictionary, ?DIAMETER_DICT_HSS}, + {module, ?CALLBACK_MOD}] + }]). + + + +%% ------------------------------------------------------------------ +%% API +%% ------------------------------------------------------------------ + +start_link() -> + gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). + +start() -> + application:sensure_all_started(?MODULE), + start_link(). + +stop() -> + gen_server:cast(?SERVER, stop). + +%% ------------------------------------------------------------------ +%% gen_server Function Definitions +%% ------------------------------------------------------------------ + +%% @callback gen_server +init(State) -> + SvcName = ?MODULE, + diameter:start_service(SvcName, ?SERVICE(SvcName)), + Ip = application:get_env(osmo_dia2gsup, diameter_ip, "127.0.0.1"), + Port = application:get_env(osmo_dia2gsup, diameter_port, 3868), + Proto = applicaiton:get_env(osmo_dia2gsup, diameter_proto, sctp), + listen({address, Proto, element(2,inet:parse_address(Ip)), Port}), + lager:info("Diameter HSS Application started on IP ~s, ~p port ~p~n", [Ip, Proto, Port]), + {ok, State}. + +%% @callback gen_server +handle_call(_Req, _From, State) -> + {noreply, State}. + +%% @callback gen_server +handle_cast(stop, State) -> + {stop, normal, State}; +handle_cast(_req, State) -> + {noreply, State}. + + +%% @callback gen_server +handle_info(_Info, State) -> + {noreply, State}. + +%% @callback gen_server +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%% @callback gen_server +terminate(normal, _State) -> + diameter:stop_service(?SVC_NAME), + lager:info("Diameter HSS Application stopped.~n"), + ok; +terminate(shutdown, _State) -> + ok; +terminate({shutdown, _Reason}, _State) -> + ok; +terminate(_Reason, _State) -> + ok. + + + +%% ------------------------------------------------------------------ +%% Internal Function Definitions +%% ------------------------------------------------------------------ + +listen(Name, {address, Protocol, IPAddr, Port}) -> + TransOpts = [{transport_module, tmod(Protocol)}, + {transport_config, [{reuseaddr, true}, + {ip, IPAddr}, {port, Port}]}], + diameter:add_transport(Name, {listen, TransOpts}). + +listen(Address) -> + listen(?SVC_NAME, Address). + +tmod(tcp) -> diameter_tcp; +tmod(sctp) -> diameter_sctp. diff --git a/src/osmo_dia2gsup_app.erl b/src/osmo_dia2gsup_app.erl new file mode 100644 index 0000000..e22bad9 --- /dev/null +++ b/src/osmo_dia2gsup_app.erl @@ -0,0 +1,17 @@ +-module(osmo_dia2gsup_app). +-behaviour(application). + +-export([start/2, stop/1]). + +start(_StartType, _StartArgs) -> + case somo_dia2gsup_sup:start_link() of + {ok, _} = Net -> + osmo_dia2gsup_sup:start_childs(SrvSupSpecs), + ret; + Other -> + Other + end. + +stop(_State) -> + ok. + diff --git a/src/server_cb.erl b/src/server_cb.erl new file mode 100644 index 0000000..2256f5b --- /dev/null +++ b/src/server_cb.erl @@ -0,0 +1,42 @@ +-module(server_cb). + + +-include_lib("diameter/include/diameter.hrl"). +-include_lib("diameter/include/diameter_gen_base_rfc6733.hrl"). +-include_lib("diameter_3gpp_ts29_272.hrl"). +%-include_lib("diameter_settings.hrl"). + + +%% diameter callbacks +-export([peer_up/3, peer_down/3, pick_peer/4, prepare_request/3, prepare_retransmit/3, + handle_answer/4, handle_error/4, handle_request/3]). + +-define(UNEXPECTED, erlang:error({unexpected, ?MODULE, ?LINE})). + +peer_up(_SvcName, {PeerRef, Caps}, State) -> + lager:info("Peer up ~p - ~p~n", [PeerRef, lager:pr(Caps, ?MODULE)]), + State. + +peer_down(_SvcName, {PeerRef, Caps}, State) -> + lager:info("Peer down ~p - ~p~n", [PeerRef, lager:pr(Caps, ?MODULE)]), + State. + +pick_peer(_, _, _SvcName, _State) -> + ?UNEXPECTED. + +prepare_request(_, _SvcName, _Peer) -> + ?UNEXPECTED. + +prepare_retransmit(_Packet, _SvcName, _Peer) -> + ?UNEXPECTED. + +handle_answer(_Packet, _Request, _SvcName, _Peer) -> + ?UNEXPECTED. + +handle_error(_Reason, _Request, _SvcName, _Peer) -> + lager:error("Request error: ~p~n", [_Reason]), + ?UNEXPECTED. + +handle_request(#diameter_packet{}, _SvcName, {_,_}) -> + lager:error("Unsuppoerted message.~n"), + discard.