Skip to content

Commit

Permalink
Fixes issue RestComm#73 - SSN is compared if present when rule is mat…
Browse files Browse the repository at this point in the history
…ched over pattern. Additional debug logging added as to make SCCP GTT algorithm more verbose.
  • Loading branch information
Grzegorz Figiel committed May 4, 2016
1 parent dff7d06 commit d4ca1f1
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 22 deletions.
Expand Up @@ -30,6 +30,8 @@
*/
public interface Rule {

String getRuleId();

String getMask();

RuleType getRuleType();
Expand Down
Expand Up @@ -22,25 +22,12 @@

package org.mobicents.protocols.ss7.sccp.impl.router;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import javolution.text.TextBuilder;
import javolution.util.FastMap;
import javolution.xml.XMLBinding;
import javolution.xml.XMLObjectReader;
import javolution.xml.XMLObjectWriter;
import javolution.xml.stream.XMLStreamException;

import org.apache.log4j.Logger;
import org.mobicents.protocols.ss7.sccp.LoadSharingAlgorithm;
import org.mobicents.protocols.ss7.sccp.LongMessageRule;
Expand All @@ -58,9 +45,20 @@
import org.mobicents.protocols.ss7.sccp.impl.parameter.GlobalTitle0100Impl;
import org.mobicents.protocols.ss7.sccp.impl.parameter.NoGlobalTitle;
import org.mobicents.protocols.ss7.sccp.impl.parameter.SccpAddressImpl;

import org.mobicents.protocols.ss7.sccp.parameter.SccpAddress;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
* <p>
* The default implementation for the SCCP router.
Expand Down Expand Up @@ -275,6 +273,9 @@ public Rule findRule(SccpAddress calledParty, boolean isMtpOriginated, int msgNe
for (FastMap.Entry<Integer, Rule> e = this.rulesMap.head(), end = this.rulesMap.tail(); (e = e.getNext()) != end;) {
Rule rule = e.getValue();
if (rule.matches(calledParty, isMtpOriginated, msgNetworkId)) {
if(logger.isDebugEnabled()) {
logger.debug("Matched SCCP rule ID: " + rule.getRuleId());
}
return rule;
}
}
Expand Down
Expand Up @@ -22,12 +22,9 @@

package org.mobicents.protocols.ss7.sccp.impl.router;

import java.io.Serializable;

import javolution.text.CharArray;
import javolution.xml.XMLFormat;
import javolution.xml.stream.XMLStreamException;

import org.apache.log4j.Logger;
import org.mobicents.protocols.ss7.indicator.GlobalTitleIndicator;
import org.mobicents.protocols.ss7.indicator.RoutingIndicator;
Expand All @@ -51,6 +48,8 @@
import org.mobicents.protocols.ss7.sccp.parameter.GlobalTitle0100;
import org.mobicents.protocols.ss7.sccp.parameter.SccpAddress;

import java.io.Serializable;

/**
* @author amit bhayani
* @author sergey vetyutnev
Expand Down Expand Up @@ -137,14 +136,14 @@ public String getMask() {
/**
* @return the ruleId
*/
protected int getRuleId() {
public int getRuleId() {
return ruleId;
}

/**
* @param ruleId the ruleId to set
*/
protected void setRuleId(int ruleId) {
public void setRuleId(int ruleId) {
this.ruleId = ruleId;
}

Expand Down Expand Up @@ -298,9 +297,19 @@ private EncodingScheme getEncodingScheme(final EncodingScheme scheme, String tra
}
public boolean matches(SccpAddress address, boolean isMtpOriginated, int msgNetworkId) {

if (logger.isDebugEnabled()) {
logger.debug(String.format("Matching rule Id=%s Rule=[%s]", this.getRuleId(), this.toString()));
}

// checking NetworkId
if (this.networkId != msgNetworkId)
if (this.networkId != msgNetworkId) {
if (logger.isDebugEnabled()) {
logger.debug(String.format("networkId didn't match. Pattern networkId=%s Address networkId=%s Return False",
this.networkId, msgNetworkId));
}

return false;
}

// Rule is for GTT only
if (address.getAddressIndicator().getRoutingIndicator() == RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN) {
Expand All @@ -311,10 +320,25 @@ public boolean matches(SccpAddress address, boolean isMtpOriginated, int msgNetw
}

// checking firstly about rule OriginationType
if (this.getOriginationType() == OriginationType.LOCAL && isMtpOriginated)
boolean isOrigitnationTypeCorrect = true;
if (this.getOriginationType() == OriginationType.LOCAL && isMtpOriginated) {
isOrigitnationTypeCorrect = false;
}
if (this.getOriginationType() == OriginationType.REMOTE && !isMtpOriginated) {
isOrigitnationTypeCorrect = false;
}
if(!isOrigitnationTypeCorrect) {
if (logger.isDebugEnabled()) {
logger.debug(String.format("OriginationType didn't match. Pattern OriginationType=%s Address isMtpOriginated=%s Return False",
this.getOriginationType(), isMtpOriginated));
}
return false;
if (this.getOriginationType() == OriginationType.REMOTE && !isMtpOriginated)
}

//SSN if present flag is set in pattern - must match address SSN & flag
if( !isSsnMatch(address, pattern) ) {
return false;
}

// Routing on GTT
GlobalTitleIndicator gti = address.getAddressIndicator().getGlobalTitleIndicator();
Expand Down Expand Up @@ -472,6 +496,31 @@ public boolean matches(SccpAddress address, boolean isMtpOriginated, int msgNetw
}
}

/**
* Checks if SSN matches between rule address pattern and provided address
* @param address - a provided address to match
* @param pattern - a rule pattern address
* @return true if SSN is present in both patern and received addresses and they are the same
* or pattern has SSN flag unset in AI (bit 7)(isSsnPresent = false for pattern)
*/
private boolean isSsnMatch(SccpAddress address, SccpAddress pattern) {
if(pattern.getAddressIndicator().isSSNPresent() && address.getAddressIndicator().isSSNPresent()) {
if(address.getSubsystemNumber() == pattern.getSubsystemNumber()) {
return true;
}
} else if(!pattern.getAddressIndicator().isSSNPresent()) {
return true;
}

if (logger.isDebugEnabled()) {
logger.debug(String.format("SSN didn't match. Pattern: isSsnPresent=%s, SSN=%s Address: isSsnPresent=%s, SSN=%s Return False",
pattern.getAddressIndicator().isSSNPresent(), pattern.getSubsystemNumber(),
address.getAddressIndicator().isSSNPresent(), address.getSubsystemNumber()));
}

return false;
}

private String translateDigits(String digits, String[] masks, String[] patternDigits, String[] addressDigits) {
StringBuffer translatedDigits = new StringBuffer();
String[] digitComponents = new String[patternDigits.length];
Expand Down

0 comments on commit d4ca1f1

Please sign in to comment.