From aed2e629e516865e32e0db2d02dc7a6479514033 Mon Sep 17 00:00:00 2001 From: leonidla1 <44394213+leonidla1@users.noreply.github.com> Date: Sun, 15 May 2022 18:48:40 +0300 Subject: [PATCH 1/2] Update RouterImpl.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Detect the “loop” in case of getting DEA (Diameter Eap Answer) with code 3006 (DIAMETER_REDIRECT_INDICATION) and setting the additional AAA_FAILURE_INDICATION AVP (1518) in the following DER in order to break it. Loop means that the original DER was already sent with the same Destination-Host AVP which appears in DEA as Redirect-Host AVP. --- .../jdiameter/client/impl/router/RouterImpl.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/router/RouterImpl.java b/core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/router/RouterImpl.java index f2bbfdbce..2952d72db 100644 --- a/core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/router/RouterImpl.java +++ b/core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/router/RouterImpl.java @@ -118,6 +118,8 @@ public class RouterImpl implements IRouter { public static final int ALL_APPLICATION = 4; public static final int ALL_HOST = 5; public static final int ALL_USER = 6; + + public static final long VENDOR_ID_3GPP = 10415L; // private static final Logger logger = LoggerFactory.getLogger(RouterImpl.class); protected MetaData metaData; @@ -660,10 +662,20 @@ private void trimRedirectTable() { /** * @param request * @param destHost + * @throws AvpDataException */ - private void updateRoute(IRequest request, String destHost) { + private void updateRoute(IRequest request, String destHost) throws AvpDataException { // Realm does not change I think... :) - request.getAvps().removeAvp(Avp.DESTINATION_HOST); + AvpSet destinationHostAvps = request.getAvps().removeAvp(Avp.DESTINATION_HOST); + if (destinationHostAvps != null && destinationHostAvps.size() > 0) { + Avp destinationHostAvp = destinationHostAvps.getAvpByIndex(0); + if (destinationHostAvp != null) { + String prevDestHost = destinationHostAvp.getDiameterIdentity(); + if (prevDestHost.equals(destHost)) { // loop detected + request.getAvps().addAvp(Avp.AAA_FAILURE_INDICATION, 1L, VENDOR_ID_3GPP, true, false, true); + } + } + } request.getAvps().addAvp(Avp.DESTINATION_HOST, destHost, true, false, true); } From e89bea03b0b1e83158c9833c61a0df323dbc5bc4 Mon Sep 17 00:00:00 2001 From: leonidla1 <44394213+leonidla1@users.noreply.github.com> Date: Sun, 15 May 2022 18:53:33 +0300 Subject: [PATCH 2/2] Update Avp.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Detect the “loop” in case of getting DEA (Diameter Eap Answer) with code 3006 (DIAMETER_REDIRECT_INDICATION) and setting the additional AAA_FAILURE_INDICATION AVP (1518) in the following DER in order to break it. Loop means that the original DER was already sent with the same Destination-Host AVP which appears in DEA as Redirect-Host AVP. --- .../api/src/main/java/org/jdiameter/api/Avp.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/jdiameter/api/src/main/java/org/jdiameter/api/Avp.java b/core/jdiameter/api/src/main/java/org/jdiameter/api/Avp.java index 2bcaa4761..9fcfecde2 100644 --- a/core/jdiameter/api/src/main/java/org/jdiameter/api/Avp.java +++ b/core/jdiameter/api/src/main/java/org/jdiameter/api/Avp.java @@ -2761,6 +2761,17 @@ public interface Avp extends Wrapper, Serializable { // Service-Area-Identity 1607 3GPP TS 29.272; // GMLC-Address 2405 3GPP TS 29.173; // Visited-PLMN-Id 1407 3GPP TS 29.272 + + /********************************************************/ + /*** SWm interface (3GPP AAA - AGW) AVPs (3GPP TS 29.273) ***/ + /*** Diameter SWM Application (EAP Protocol) ***/ + /********************************************************/ + + /** + * SWm (3GPP TS 29.273-f10) AAA-Failure-Indication AVP code + */ + int AAA_FAILURE_INDICATION = 1518; + /** * @return the AVP code.