Improved deployment of examples. Default deployment dir depending on type of example.
Added a new script to transform a raw pcap into diameter hex content & metadata, ready for launcher encoder.
Launcher accepts now hexadecimal content with colons (as rawshark output)
DCTDTD=../../../include/anna/diameter/stack/dictionary.dtd
BASE_PROT=commands_baseProtocol.xml
EXEC=./debug/example_diameter_launcher
-DPATH_dflt=$HOME/ADL
#############
# FUNCTIONS #
echo "Anna Diameter Launcher (ADL) deployment"
echo "---------------------------------------"
echo
-echo "Input deployment path [$DPATH_dflt]:"
-read DPATH
-[ "$DPATH" = "" ] && DPATH=$DPATH_dflt
-[ -d $DPATH ] && _exit "The path '$DPATH' already exists. Remove it before continue..."
-
echo "Basic checkings ..."
[ ! -f $EXEC ] && _exit "Anna Diameter Launcher (ADL) is not linked. Execute 'scons' for 'anna' suite."
-[ ! -d $SETUPS_DIR ] && _exit "Diameter stacks not found ($SETUPS_DIR). Perhaps you executed this script out of its parent path."
+[ ! -d $SETUPS_DIR ] && _exit "Diameter stacks not found ($SETUPS_DIR)."
echo
echo "Deploy one of these versions:"
[ "$option" = "" ] && option=b
case $option in
a)
- RESOURCES_DIR=resources/advanced
+ DEPLOYMENTS_DIR=deployments/advanced
+ DPATH_dflt=$HOME/ADL-advanced
;;
b)
- RESOURCES_DIR=resources/basic
+ DEPLOYMENTS_DIR=deployments/basic
+ DPATH_dflt=$HOME/ADL-basic
;;
f)
- RESOURCES_DIR=resources/ft-client
+ DEPLOYMENTS_DIR=deployments/ft-client
+ DPATH_dflt=$HOME/ADL-ft-client
;;
*)
;;
esac
+echo
+echo "Input deployment path [$DPATH_dflt]:"
+read DPATH
+[ "$DPATH" = "" ] && DPATH=$DPATH_dflt
+[ -d $DPATH ] && _exit "The path '$DPATH' already exists. Remove it before continue..."
+
echo "Copying ..."
mkdir -p $DPATH
mkdir -p $DPATH/stacks
mkdir -p $DPATH/DTDs
mkdir -p $DPATH/counters
+mkdir -p $DPATH/resources
cp $EXEC $DPATH/ADL-launcher
-cp -rL $RESOURCES_DIR/* $DPATH
+cp -rL $DEPLOYMENTS_DIR/* $DPATH
+cp resources/* $DPATH/resources
cp $SETUPS_DIR/*xml $DPATH/stacks
cp $SETUPS_DIR/*sh $DPATH/stacks
cp $SETUPS_DIR/readme.txt $DPATH/stacks
--- /dev/null
+<message version="1" code="265" flags="0" application-id="0" hop-by-hop-id="1" end-by-end-id="2">
+ <avp name="Session-Id" data="ocs3;1332909618;0;1332909618"/>
+ <avp name="Auth-Application-Id" data="16777236"/>
+ <avp name="Origin-Host" data="OCS3"/>
+ <avp name="Origin-Realm" data="OCS3"/>
+</message>
+
--- /dev/null
+Encode 1.xml to 2.hex|code|1.xml|2.hex
+Decode 2.hex to 3.xml (we will diff 1.xml and 3.xml)|decode|2.hex|3.xml
--- /dev/null
+
+ABOUT CONTENT
+-------------
+Stacks available at './stacks'.
+The launcher uses the configuration given by '.dictionary' which points to a specification list.
+Available different setups by mean files named as '.dictionary__<stack description>'.
+
+Template for xml messages (message.dtd) and dictionaries (dictionary.dtd) are informative, not
+actually required by process. Located at './DTDs'.
+
+Additional helpers/scripts could be found at './resources' directory.
+
+STARTING THE PROCESS
+--------------------
+Start with 'run.sh'. You could manually edit such script adding parameters as '-trace debug' to
+get complete 'launcher.traces'. Execute 'ADL-launcher' without arguments to see a complete
+command-line help.
+
+DEPLOYED SCRIPTS
+----------------
+You could get help about installed resources by mean 'help.sh', which launch a help request to
+the started ADL-launcher process http interface. All the implemented http operations could be
+launched through a script to make easy use. The http client 'curl' is used by default due to
+its presence on common linux distributions.
+
--- /dev/null
+#!/bin/bash
+> curl_log.txt
+TRACE="--trace-ascii curl_log.txt"
+SERVER=`cat .httpServer`
+
+echo
+echo
+echo "Use: $0 [xml_file] [2e]"
+echo
+echo "Programm 'xml_file' answer to the diameter client or to the server (entity) when"
+echo "'2e' parameter is provided. If missing xml file, current programmed answers will"
+echo "be shown: '$0' (answers to client), '$0 2e' (answers to server)."
+echo
+if test "$1" != ""
+then
+ if test "$1" = "2e"
+ then
+ operation="answerxml2e"
+ else
+ [[ ! -f "$1" ]] && { echo "ERROR: file '$1' not found" ; echo; echo; exit ; }
+ operation="answerxml|$1"
+ [[ "$2" = "2e" ]] && operation="answerxml2e|$1"
+ fi
+else
+ operation="answerxml"
+fi
+echo
+curl -m 1 --data "$operation" $TRACE ${SERVER}
+
--- /dev/null
+-httpServer `grep -v ^# .httpServer`
+-dictionary `grep -v ^# .dictionary`
+-diameterServer `grep -v ^# .diameterServer`
+-diameterServerSessions `grep -v ^# .diameterServerSessions`
+-entity `grep -v ^# .entity`
+-entityServerSessions `grep -v ^# .entityServerSessions`
--- /dev/null
+#!/bin/bash
+> curl_log.txt
+TRACE="--trace-ascii curl_log.txt"
+SERVER=`cat .httpServer`
+
+use () {
+
+ echo "Use: $0 <test file> [time between operations: 0 second by default]"
+ echo
+ echo " Batch launcher script"
+ echo " ---------------------"
+ echo
+ echo " Test file must contain a operations with this syntax: <description>|<operation>|<arg1>|..."
+ echo " Three operations: code, decode and sendxml:"
+ echo
+ echo " code|<source>|<target> i.e.: code|1.xml|2.hex"
+ echo " decode|<source>|<target> i.e.: decode|2.hex|1.xml-bis"
+ echo " sendxml|<source> i.e.: sendxml|1.xml"
+ echo
+ echo " Test file example:"
+ echo
+ echo " $0 1xml-23.txt"
+ echo
+ echo " where 1xml-23.txt contains:"
+ echo " Encode 1.xml to 2.hex|code|1.xml|2.hex"
+ echo " Decode 2.hex to 3.xml (we will diff 1.xml and 3.xml)|decode|2.hex|3.xml"
+ echo
+ echo
+ echo " Test file could contain any number of operations and could include comments (will be ignored)."
+ echo
+ exit
+}
+
+echo
+echo
+[[ "$1" = "" ]] && use
+LAPSE=${2:-0}
+echo
+echo "Test '$1' is going to be launched:"
+echo
+cat $1
+echo
+echo "Pulse ENTER para lanzar, CTRL+C para abortar..."
+read dummy
+
+while read -r line
+do
+ comment=$(echo $line | grep "^#")
+ ok=
+ [[ "$comment" = "" ]] && { [[ "$line" != "" ]] && ok=s ; }
+ if test "$ok" = "s"
+ then
+ echo "Launching $(echo $line | cut -d'|' -f1) ..."
+ sleep $LAPSE
+ operation=$(echo $line | cut -d'|' -f2-)
+ curl -m 1 --data "$operation" $TRACE ${SERVER}
+ fi
+
+done < $1
+
--- /dev/null
+#!/bin/bash
+> curl_log.txt
+TRACE="--trace-ascii curl_log.txt"
+SERVER=`cat .httpServer`
+burstMargin__dflt=1
+
+salir () {
+ echo
+ echo $1
+ echo
+ exit
+}
+
+calc () { echo "$1" | bc -l ; }
+
+entero () {
+ limpio=$(calc "scale=0;${1}/1")
+ [[ $limpio != $1 ]] && salir "Invalid value '$1'. Must be integer"
+}
+
+uso () {
+
+ echo "Load tests configuration script"
+ echo
+ echo "Use: $0 <action: clear | load | start | push | pop | stop | resume | repeat | send | goto | look> [action parameters]"
+ echo
+ echo " clear:"
+ echo " Clears all loaded burst messages."
+ echo
+ echo " load <amount> <traffic type: mms | sms | voice | data | content>:"
+ echo " Loads 'amount' messages for the provided traffic type. For example:"
+ echo " $0 load 2000 sms"
+ echo
+ echo " start [initial launch: default $burstMargin__dflt]:"
+ echo " Starts the message sending from the begining of the burst list loaded,"
+ echo " with a certain initial load. For example:"
+ echo " $0 start 200"
+ echo
+ echo " push [amount: default $burstMargin__dflt]:"
+ echo " Launch 'amount' messages as initial load does (non-asynchronous mode)."
+ echo " It works even if burst launch is stopped. Useful to achieve congestion"
+ echo " conditions. For example:"
+ echo " $0 push 300"
+ echo
+ echo " pop [amount: default $burstMargin__dflt]:"
+ echo " Skip send burst messages in order to reduce over-the-air requests."
+ echo
+ echo " stop:"
+ echo " Stops the burst cycle at the current position. It could affect sessions"
+ echo " on the air (i.e. data contexts). Totally safe for IEC scenaries as SMS."
+ echo
+ echo " resume:"
+ echo " Resume an stopped burst launch from the same point (start will reset"
+ echo " the work pointer to the first burst list position). This is equivalent"
+ echo " to one-message-push operation."
+ echo
+ echo " repeat [[yes] | no]:"
+ echo " Restarts the burst launch cycle when finished."
+ echo
+ echo " send [amount: default 1]:"
+ echo " send messages from burst list. The main difference with start/push operations"
+ echo " is that burst won't be awaken. Externally we could control sending time (no"
+ echo " request will be sent for answers). When reach the last position, starts again."
+ echo
+ echo " sendXS <requests per second> [amount: default -1 (no limit)]:"
+ echo " send messages from burst list with the TPS provided. User could hot change"
+ echo " speed by mean 'echo <TPS> > .tps' at another shell. You can stop the load"
+ echo " removing that hidden file or using CTRL+C from the shell where you launched"
+ echo " the burst command. Real tps is dumped on '.real_tps' file during testing."
+ echo " You could limit the amount of messages sent by mean the second parameter."
+ echo " No limit is established by default (-1 or negative value)."
+ echo
+ echo " goto <order>:"
+ echo " Updates current burst pointer position."
+ echo
+ echo " look <order>:"
+ echo " Show programmed burst message for order provided."
+ echo
+ echo
+ salir
+}
+
+_curl () {
+ curl -m 5 --data "$1" $TRACE ${SERVER}
+}
+
+echo
+echo
+[[ "$1" = "" ]] && uso
+case $1 in
+ clear) _curl "burst|clear"
+ ;;
+ load) [[ "$3" = "" ]] && uso
+ [[ ! -f "${3}.sh" ]] && salir "Burst generation file '${3}.sh' not found!"
+ entero $2
+ if test "$3" = "data"
+ then
+ count=$2
+ RESTO=$((count%4))
+ [[ "$RESTO" != "0" ]] && salir "Data context should load a multiple of 4 (messages generated by data.sh)"
+ fi
+ count=1
+ while test "$count" -le "$2"
+ do
+ ${3}.sh $count > .${3}.xml
+ echo -n "Loading message ${count}; "
+ _curl "burst|load|.${3}.xml"
+ count=$((count+1))
+ done
+ ;;
+ start) load=$burstMargin__dflt
+ [[ "$2" != "" ]] && load=$2
+ entero $load
+ _curl "burst|start|$load"
+ ;;
+ pop) release=$burstMargin__dflt
+ [[ "$2" != "" ]] && release=$2
+ entero $release
+ _curl "burst|pop|$release"
+ ;;
+ push) [[ "$2" = "" ]] && uso
+ entero $2
+ _curl "burst|push|$2"
+ ;;
+ stop) _curl "burst|stop"
+ ;;
+ resume) _curl "burst|push|1"
+ ;;
+ repeat) repeat=yes
+ [[ "$2" != "" ]] && repeat=$2
+ _curl "burst|repeat|$repeat"
+ ;;
+ send) amount=1
+ [[ "$2" != "" ]] && amount=$2
+ entero $amount
+ _curl "burst|send|$amount"
+ ;;
+ sendXS) [[ "$2" = "" ]] && uso
+ limit=$3
+ [[ "$limit" = "" ]] && limit=-1
+ entero $2
+ entero $limit
+ TPS=0
+ count=0
+ amount=1
+ echo $2 > .tps
+ while test -f .tps
+ do
+ [[ "$count" = "$limit" ]] && break
+ BEFORE_ns=`date +%s%N`
+ READ_TPS=`cat .tps`
+ # Hot change could make .tps still unavailable:
+ [[ "$READ_TPS" = "" ]] && READ_TPS=$TPS
+ # Volvemos a calcular medias (REAL_TPS) cada 10 segundos o cuando cambia el TPS en caliente:
+ [[ "$READ_TPS" != "$TPS" ]] && { BEGIN_ns=$BEFORE_ns ; count=0 ; }
+ [[ $count = $((10*TPS)) ]] && { BEGIN_ns=$BEFORE_ns ; count=0 ; }
+ TPS=$READ_TPS
+ [[ "$TPS" = "0" ]] && salir "Test stopped due to 0-tps value read"
+ # Background:
+ _curl "burst|send|$amount" &
+ count=$((count+amount))
+ AFTER_ns=`date +%s%N`
+ # Real tps:
+ REAL_TPS=$(calc "1000000000 * $count / ($AFTER_ns - $BEGIN_ns)")
+ echo $REAL_TPS > .real_tps
+
+ COEF=1
+ [[ $(calc "$TPS > $REAL_TPS") = "1" ]] && COEF=$(calc "$REAL_TPS / $TPS")
+ K=$(calc "$COEF ^ 10")
+ amount=$(calc "scale=0;1/$K")
+ usleep $(calc "$K * 1000000/$TPS")
+ done
+ ;;
+ goto) [[ "$2" = "" ]] && uso
+ entero $2
+ _curl "burst|goto|$2"
+ ;;
+ look) [[ "$2" = "" ]] && uso
+ entero $2
+ _curl "burst|look|$2"
+ ;;
+ *) uso
+esac
+
--- /dev/null
+#!/bin/bash
+> curl_log.txt
+TRACE="--trace-ascii curl_log.txt"
+SERVER=`cat .httpServer`
+ENTITY=`cat .entity 2>/dev/null`
+# If missing following, 1 is assigned (ENTITY_SS_1 is ENTITY_SS - 1)
+ENTITY_SS=`cat .entityServerSessions 2>/dev/null`
+[[ "$ENTITY_SS" = "" ]] && ENTITY_SS=1
+TARGET=$2
+
+use () {
+ echo
+ echo
+ echo "Use: $0 <hide|show|hidden|shown> \"[<address>:<port>]|[socket id]\""
+ echo
+ echo "Hides/shows/query hidden state/query shown state, the socket/s provided."
+ echo "If missing server (first parameter) all applications sockets will be affected by action."
+ echo "If missing socket (second parameter) for specific server, all its sockets will be affected by action."
+ echo
+ exit
+}
+
+states () {
+ echo
+ echo "Select option to switch (0 = quit):"
+ echo
+ option=1
+ for i in `echo $ENTITY | sed 's/,/ /g'`
+ do
+ for j in `seq 0 $ENTITY_SS_1`
+ do
+ TARGET="${i}|${j}"
+ RES=$(curl -m 1 --data "shown|$TARGET" ${SERVER} 2>&1 | tail -1 | grep "true$")
+ res=hidden
+ [[ "$RES" != "" ]] && res=shown
+ echo "${option}. $TARGET ($res)"
+ action=show
+ [[ "$RES" != "" ]] && action=hide
+ echo "curl -m 1 --data \"$action|$TARGET\" ${SERVER}" > .switch_${option}
+ chmod a+x .switch_${option}
+ option=$((option+1))
+ done
+ done
+ echo
+}
+
+if test "$ENTITY" != ""
+then
+ ENTITY_SS_1=$((ENTITY_SS-1))
+ while true
+ do
+ states
+ read option
+ [[ "$option" = "0" ]] && break
+ .switch_${option}
+ done
+ echo
+ echo "Exiting"
+ rm .switch_*
+ exit
+else
+ [[ "$1" = "" ]] && use
+fi
+
+echo
+echo
+operation="$1|$TARGET"
+[[ "$TARGET" = "" ]] && operation="$1"
+curl -m 1 --data "$operation" $TRACE ${SERVER}
+
--- /dev/null
+#!/bin/bash
+> curl_log.txt
+TRACE="--trace-ascii curl_log.txt"
+SERVER=`cat .httpServer`
+
+use () {
+
+ echo "Use: $0 <xml_file>"
+ echo
+ echo "Creates '<xml_file>.hex' with encoded result."
+ echo
+ exit
+}
+
+echo
+[[ "$1" = "" ]] && use
+[[ ! -f "$1" ]] && { echo "ERROR: file '$1' not found" ; echo; echo; exit ; }
+echo
+operation="code|$1|${1}.hex"
+curl -m 1 --data "$operation" $TRACE ${SERVER}
+
--- /dev/null
+#!/bin/bash
+> curl_log.txt
+TRACE="--trace-ascii curl_log.txt"
+SERVER=`cat .httpServer`
+curl -m 1 --data "collect" $TRACE ${SERVER}
+
--- /dev/null
+<message version="1" name="Credit-Control-Request" p-bit="yes" application-id="4" hop-by-hop-id="__HBH_ETE__" end-by-end-id="__HBH_ETE__">
+ <avp name="Session-Id" data="__SID_DI__;__SID_HIGH__;__SID_LOW__;__SID_SUFFIX__"/>
+ <avp name="Origin-Host" data="__SID_DI__"/>
+ <avp name="Origin-Realm" data="sandvine.com"/>
+ <avp name="Destination-Realm" data="telefonica.com.co"/>
+ <avp name="Auth-Application-Id" data="4"/>
+ <avp name="Service-Context-Id" data="770.32251@3gpp.org"/>
+ <avp name="CC-Request-Type" data="1" alias="INITIAL_REQUEST"/>
+ <avp name="CC-Request-Number" data="0"/>
+ <avp name="User-Name" data="__MSISDN__"/>
+ <avp name="Origin-State-Id" data="1339077627"/>
+ <avp name="Event-Timestamp" data="__NTPTIMESTAMP__"/>
+ <avp name="Subscription-Id">
+ <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
+ <avp name="Subscription-Id-Data" data="__MSISDN__"/>
+ </avp>
+ <avp name="Multiple-Services-Indicator" data="1" alias="MULTIPLE_SERVICES_SUPPORTED"/>
+ <avp name="User-Equipment-Info">
+ <avp name="User-Equipment-Info-Type" data="0" alias="IMEISV"/>
+ <avp name="User-Equipment-Info-Value" hex-data="33353430343630343130363438333030"/>
+ </avp>
+ <avp name="Service-Information">
+ <avp name="PS-Information">
+ <avp name="3GPP-Charging-Id" data="29"/>
+ <avp name="3GPP-PDP-Type" data="0" alias="IPV4"/>
+ <avp name="PDP-Address" data="10.193.49.133"/>
+ <avp name="3GPP-GPRS-Neg-QoS-Profile" data="05-1b921f7196fefe74fbfefe00"/>
+ <avp name="SGSN-Address" data="190.98.183.240"/>
+ <avp name="GGSN-Address" data="190.98.183.243"/>
+ <avp name="CG-Address" data="10.193.249.1"/>
+ <avp name="3GPP-IMSI-MCC-MNC" data="71204"/>
+ <avp name="3GPP-GGSN-MCC-MNC" data="71204"/>
+ <avp name="3GPP-NSAPI" data="5"/>
+ <avp name="Called-Station-Id" data="internet.movistar.ni"/>
+ <avp name="3GPP-Selection-Mode" data="0"/>
+ <avp name="3GPP-Charging-Characteristics" data="0800"/>
+ <avp name="3GPP-SGSN-MCC-MNC" data="33403"/>
+ <avp name="3GPP-MS-TimeZone" hex-data="4a00"/>
+ <avp name="3GPP-User-Location-Info" hex-data="0117f240a4780218"/>
+ <avp name="3GPP-Rat-Type" hex-data="01"/>
+ <avp name="PDP-Context-Type" data="0"/>
+ </avp>
+ </avp>
+</message>
--- /dev/null
+<message version="1" name="Credit-Control-Request" p-bit="yes" application-id="4" hop-by-hop-id="__HBH_ETE__" end-by-end-id="__HBH_ETE__">
+ <avp name="Session-Id" data="__SID_DI__;__SID_HIGH__;__SID_LOW__;__SID_SUFFIX__"/>
+ <avp name="Origin-Host" data="__SID_DI__"/>
+ <avp name="Origin-Realm" data="sandvine.com"/>
+ <avp name="Destination-Realm" data="telefonica.com.co"/>
+ <avp name="Auth-Application-Id" data="4"/>
+ <avp name="Service-Context-Id" data="770.32251@3gpp.org"/>
+ <avp name="CC-Request-Type" data="3" alias="TERMINATION_REQUEST"/>
+ <avp name="CC-Request-Number" data="3"/>
+ <avp name="Destination-Host" data="mqmty1besdp1.movistar.pa"/>
+ <avp name="User-Name" data="__MSISDN__"/>
+ <avp name="Origin-State-Id" data="1339077627"/>
+ <avp name="Event-Timestamp" data="__NTPTIMESTAMP__"/>
+ <avp name="Subscription-Id">
+ <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
+ <avp name="Subscription-Id-Data" data="__MSISDN__"/>
+ </avp>
+ <avp name="Termination-Cause" data="1" alias="DIAMETER_LOGOUT"/>
+ <avp name="Multiple-Services-Indicator" data="1" alias="MULTIPLE_SERVICES_SUPPORTED"/>
+ <avp name="Multiple-Services-Credit-Control">
+ <avp name="Used-Service-Unit">
+ <avp name="CC-Total-Octets" data="524288"/>
+ <avp name="CC-Input-Octets" data="424288"/>
+ <avp name="CC-Output-Octets" data="100000"/>
+ <avp name="Reporting-Reason" data="2" alias="FINAL"/>
+ </avp>
+ <avp name="Rating-Group" data="99"/>
+ </avp>
+ <avp name="User-Equipment-Info">
+ <avp name="User-Equipment-Info-Type" data="0" alias="IMEISV"/>
+ <avp name="User-Equipment-Info-Value" hex-data="33353430343630343130363438333030"/>
+ </avp>
+ <avp name="Service-Information">
+ <avp name="PS-Information">
+ <avp name="3GPP-Charging-Id" data="29"/>
+ <avp name="3GPP-PDP-Type" data="0" alias="IPV4"/>
+ <avp name="PDP-Address" data="10.193.49.133"/>
+ <avp name="3GPP-GPRS-Neg-QoS-Profile" data="05-1b921f7196fefe74fbfefe00"/>
+ <avp name="SGSN-Address" data="190.98.183.240"/>
+ <avp name="GGSN-Address" data="190.98.183.243"/>
+ <avp name="CG-Address" data="10.193.249.1"/>
+ <avp name="3GPP-IMSI-MCC-MNC" data="71204"/>
+ <avp name="3GPP-GGSN-MCC-MNC" data="71204"/>
+ <avp name="3GPP-NSAPI" data="5"/>
+ <avp name="Called-Station-Id" data="internet.movistar.ni"/>
+ <avp name="3GPP-Session-Stop-Indicator" hex-data="ff"/>
+ <avp name="3GPP-Selection-Mode" data="0"/>
+ <avp name="3GPP-Charging-Characteristics" data="0800"/>
+ <avp name="3GPP-SGSN-MCC-MNC" data="33403"/>
+ <avp name="3GPP-MS-TimeZone" hex-data="4a00"/>
+ <avp name="3GPP-User-Location-Info" hex-data="0117f240a4780218"/>
+ <avp name="3GPP-Rat-Type" hex-data="01"/>
+ </avp>
+ </avp>
+</message>
--- /dev/null
+<message version="1" name="Credit-Control-Request" p-bit="yes" application-id="4" hop-by-hop-id="__HBH_ETE__" end-by-end-id="__HBH_ETE__">
+ <avp name="Session-Id" data="__SID_DI__;__SID_HIGH__;__SID_LOW__;__SID_SUFFIX__"/>
+ <avp name="Origin-Host" data="__SID_DI__"/>
+ <avp name="Origin-Realm" data="sandvine.com"/>
+ <avp name="Destination-Realm" data="telefonica.com.co"/>
+ <avp name="Auth-Application-Id" data="4"/>
+ <avp name="Service-Context-Id" data="770.32251@3gpp.org"/>
+ <avp name="CC-Request-Type" data="2" alias="UPDATE_REQUEST"/>
+ <avp name="CC-Request-Number" data="1"/>
+ <avp name="Destination-Host" data="mqmty1besdp1.movistar.pa"/>
+ <avp name="Origin-State-Id" data="1339077627"/>
+ <avp name="Event-Timestamp" data="__NTPTIMESTAMP__"/>
+ <avp name="Subscription-Id">
+ <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
+ <avp name="Subscription-Id-Data" data="__MSISDN__"/>
+ </avp>
+ <avp name="Multiple-Services-Indicator" data="1" alias="MULTIPLE_SERVICES_SUPPORTED"/>
+ <avp name="Multiple-Services-Credit-Control">
+ <avp name="Requested-Service-Unit"/>
+ <avp name="Rating-Group" data="99"/>
+ </avp>
+ <avp name="User-Equipment-Info">
+ <avp name="User-Equipment-Info-Type" data="0" alias="IMEISV"/>
+ <avp name="User-Equipment-Info-Value" hex-data="33353430343630343130363438333030"/>
+ </avp>
+ <avp name="Service-Information">
+ <avp name="PS-Information">
+ <avp name="3GPP-Charging-Id" data="29"/>
+ <avp name="3GPP-PDP-Type" data="0" alias="IPV4"/>
+ <avp name="PDP-Address" data="10.193.49.133"/>
+ <avp name="3GPP-GPRS-Neg-QoS-Profile" data="05-1b921f7196fefe74fbfefe00"/>
+ <avp name="SGSN-Address" data="190.98.183.240"/>
+ <avp name="GGSN-Address" data="190.98.183.243"/>
+ <avp name="CG-Address" data="10.193.249.1"/>
+ <avp name="3GPP-IMSI-MCC-MNC" data="71204"/>
+ <avp name="3GPP-GGSN-MCC-MNC" data="71204"/>
+ <avp name="3GPP-NSAPI" data="5"/>
+ <avp name="Called-Station-Id" data="internet.movistar.ni"/>
+ <avp name="3GPP-Selection-Mode" data="0"/>
+ <avp name="3GPP-Charging-Characteristics" data="0800"/>
+ <avp name="3GPP-SGSN-MCC-MNC" data="33403"/>
+ <avp name="3GPP-MS-TimeZone" hex-data="4a00"/>
+ <avp name="3GPP-User-Location-Info" hex-data="0117f240a4780218"/>
+ <avp name="3GPP-Rat-Type" hex-data="01"/>
+ </avp>
+ </avp>
+</message>
--- /dev/null
+<message version="1" name="Credit-Control-Request" p-bit="yes" application-id="4" hop-by-hop-id="__HBH_ETE__" end-by-end-id="__HBH_ETE__">
+ <avp name="Session-Id" data="__SID_DI__;__SID_HIGH__;__SID_LOW__;__SID_SUFFIX__"/>
+ <avp name="Origin-Host" data="__SID_DI__"/>
+ <avp name="Origin-Realm" data="sandvine.com"/>
+ <avp name="Destination-Realm" data="telefonica.com.co"/>
+ <avp name="Auth-Application-Id" data="4"/>
+ <avp name="Service-Context-Id" data="770.32251@3gpp.org"/>
+ <avp name="CC-Request-Type" data="2" alias="UPDATE_REQUEST"/>
+ <avp name="CC-Request-Number" data="2"/>
+ <avp name="Destination-Host" data="mqmty1besdp1.movistar.pa"/>
+ <avp name="User-Name" data="__MSISDN__"/>
+ <avp name="Origin-State-Id" data="1339077627"/>
+ <avp name="Event-Timestamp" data="__NTPTIMESTAMP__"/>
+ <avp name="Subscription-Id">
+ <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
+ <avp name="Subscription-Id-Data" data="__MSISDN__"/>
+ </avp>
+ <avp name="Multiple-Services-Indicator" data="1" alias="MULTIPLE_SERVICES_SUPPORTED"/>
+ <avp name="Multiple-Services-Credit-Control">
+ <avp name="Requested-Service-Unit"/>
+ <avp name="Used-Service-Unit">
+ <avp name="CC-Total-Octets" data="524288"/>
+ <avp name="CC-Input-Octets" data="224288"/>
+ <avp name="CC-Output-Octets" data="300000"/>
+ </avp>
+ <avp name="Rating-Group" data="99"/>
+ </avp>
+ <avp name="User-Equipment-Info">
+ <avp name="User-Equipment-Info-Type" data="0" alias="IMEISV"/>
+ <avp name="User-Equipment-Info-Value" hex-data="33353430343630343130363438333030"/>
+ </avp>
+ <avp name="Service-Information">
+ <avp name="PS-Information">
+ <avp name="3GPP-Charging-Id" data="29"/>
+ <avp name="3GPP-PDP-Type" data="0" alias="IPV4"/>
+ <avp name="PDP-Address" data="10.193.49.133"/>
+ <avp name="3GPP-GPRS-Neg-QoS-Profile" data="05-1b921f7196fefe74fbfefe00"/>
+ <avp name="SGSN-Address" data="190.98.183.240"/>
+ <avp name="GGSN-Address" data="190.98.183.243"/>
+ <avp name="CG-Address" data="10.193.249.1"/>
+ <avp name="3GPP-IMSI-MCC-MNC" data="71204"/>
+ <avp name="3GPP-GGSN-MCC-MNC" data="71204"/>
+ <avp name="3GPP-NSAPI" data="5"/>
+ <avp name="Called-Station-Id" data="internet.movistar.ni"/>
+ <avp name="3GPP-Selection-Mode" data="0"/>
+ <avp name="3GPP-Charging-Characteristics" data="0800"/>
+ <avp name="3GPP-SGSN-MCC-MNC" data="33403"/>
+ <avp name="3GPP-MS-TimeZone" hex-data="4a00"/>
+ <avp name="3GPP-User-Location-Info" hex-data="0117f240a4780218"/>
+ <avp name="3GPP-Rat-Type" hex-data="01"/>
+ </avp>
+ </avp>
+</message>
--- /dev/null
+#!/bin/bash
+
+# Generates DATA burst sequence for provided order number (1: first, 2: second, etc.)
+# We will generate a simple scenario with initial, two updates and termination, that is to say: four messages:
+# 1,2,3,4 5,6,7,8 9,10,11,12 etc.
+#
+# Category = ((Number-1) % 4) + 1 = 1 for initial, 2 for first update, 3 for second update and 4 for termination
+SEQN=$1
+OFFSET=$((SEQN-1))
+CAT=$((OFFSET%4 + 1))
+
+salir () {
+ echo
+ echo $1
+ echo
+ exit
+}
+
+check_template () {
+ [[ ! -f $1 ]] && salir "Template file ($1) not found!"
+}
+
+parse () {
+ cat $1 | sed 's/__HBH_ETE__/'$HBH_ETE'/g' | sed 's/__SID_SUFFIX__/'$SID_SUFFIX'/' \
+ | sed 's/__MSISDN__/'$MSISDN'/' | sed 's/__NTPTIMESTAMP__/'$NTP'/' \
+ | sed 's/__SID_DI__/'$SID_DI'/' | sed 's/__SID_HIGH__/'$SID_HIGH'/' | sed 's/__SID_LOW__/'$SI_LOW'/'
+}
+
+
+[[ "$SEQN" = "" ]] && salir "Use: $0 <sequence number: 1..N>"
+check_template data-initial.msk
+check_template data-update1.msk
+check_template data-update2.msk
+check_template data-termination.msk
+
+# Session-Id: '<DiameterIdentity>;<high 32 bits>;<low 32 bits>[;<optional value>="">]'
+# <avp name="Session-Id" data="module-2.PTS2-BOG.sandvine.com;1287115741;0;49"/>
+# We will sequence the otional value with __SID_SUFFIX__, low and high will be constant.
+
+# Sequence values at templates:
+# __HBH_ETE__: 1, 3, 5, etc. (hop-by-hop and end-to-end)
+# __SID_SUFFIX__: It could be MSISDN, but we put OFFSET (0, 1, 2, 3, etc.). It's the Session-Id optional part.
+# __MSISDN__: 50583211675, 50583211676, 50583211677, etc. Used for User-Name and Subscription-Id-Data
+# __NTPTIMESTAMP__: Four values for initial, update1, update2 and termination: 3548171033, 3548171136 (103+), 3548171136(idem), 3548171524(388+)
+# This initial time (aproximately 8 Jun 2012 at 19:00).
+CUARTO=$((OFFSET/4))
+HBH_ETE=$((1 + 2*OFFSET))
+SID_SUFFIX=$CUARTO
+# Example if you want to fix to two sockets (-sessionIdPartForClientSocketIdSelection must be 'optional'): SID_SUFFIX=$((CUARTO%2))
+MSISDN=$((50583211675+CUARTO))
+NTP=$((3548171033+CUARTO))
+
+# Helpers to guide derivery (fixed at the moment)
+# __SID_DI__: Session-Id diameter identity
+# __SID_HIGH__: Session-Id high part
+# __SID_LOW__: Session-Id low part
+SID_DI=module-2.PTS2-BOG.sandvine.com
+SID_HIGH=1287115741
+SI_LOW=0
+
+case $CAT in
+ 1) parse data-initial.msk
+ ;;
+ 2) NTP=$((NTP+103))
+ parse data-update1.msk
+ ;;
+ 3) NTP=$((NTP+103))
+ parse data-update2.msk
+ ;;
+ 4) NTP=$((NTP+491))
+ parse data-termination.msk
+ ;;
+esac
+
--- /dev/null
+#!/bin/bash
+> curl_log.txt
+TRACE="--trace-ascii curl_log.txt"
+SERVER=`cat .httpServer`
+
+use () {
+
+ echo "Use: $0 <hex_file>"
+ echo
+ echo "Creates '<hex_file>.xml' with decoded result."
+ echo
+ exit
+}
+
+echo
+[[ "$1" = "" ]] && use
+[[ ! -f "$1" ]] && { echo "ERROR: file '$1' not found" ; echo; echo; exit ; }
+echo
+operation="decode|$1|${1}.xml"
+curl -m 1 --data "$operation" $TRACE ${SERVER}
+
--- /dev/null
+#!/bin/bash
+> curl_log.txt
+TRACE="--trace-ascii curl_log.txt"
+SERVER=`cat .httpServer`
+
+use () {
+
+ echo "Use: $0 <integer>"
+ echo
+ echo "Updates the maximum number of accepted connections over diameter server socket."
+ echo
+ exit
+}
+
+echo
+[[ "$1" = "" ]] && use
+echo
+operation="diameterServerSessions|$1"
+curl -m 1 --data "$operation" $TRACE ${SERVER}
+
--- /dev/null
+#!/bin/bash
+> curl_log.txt
+TRACE="--trace-ascii curl_log.txt"
+SERVER=`cat .httpServer`
+curl -m 1 --data "help" $TRACE ${SERVER}
+
--- /dev/null
+#!/bin/bash
+> curl_log.txt
+TRACE="--trace-ascii curl_log.txt"
+SERVER=`cat .httpServer`
+
+use () {
+
+ echo "Use: $0 <xml_file>"
+ echo
+ echo "Load xml file and show on stdout again."
+ echo "It is useful to test xml loader and xml viewer, but also for show aliases and,"
+ echo "if '-ignoreFlags' commandline option is missing, for flag coherence checking."
+ echo
+ exit
+}
+
+echo
+[[ "$1" = "" ]] && use
+[[ ! -f "$1" ]] && { echo "ERROR: file '$1' not found" ; echo; echo; exit ; }
+echo
+operation="loadxml|$1"
+curl -m 1 --data "$operation" $TRACE ${SERVER}
+
--- /dev/null
+#!/bin/bash
+
+# Remove logs:
+rm *.log* *.csv 2>/dev/null
+
+# Server sockets:
+httpServer_dflt=`cat .httpServer 2>/dev/null`
+diameterServer_dflt=`cat .diameterServer 2>/dev/null`
+diameterServerSessions_dflt=`cat .diameterServerSessions 2>/dev/null`
+
+# Client sockets:
+entity_dflt=`cat .entity 2>/dev/null`
+entityServerSessions_dflt=`cat .entityServerSessions 2>/dev/null`
+
+# Stack:
+dictionary_dflt=`cat .dictionary 2>/dev/null`
+
+echo
+echo
+# If all have values:
+if [ "$httpServer_dflt" != "" -a "$diameterServer_dflt" != "" -a "$diameterServerSessions_dflt" != "" -a \
+ "$entity_dflt" != "" -a "$entityServerSessions_dflt" != "" -a \
+ "$dictionary_dflt" != "" ]
+then
+ echo "Do you wish to answer wizard commandline configuration ? (y/n) [n]:"
+ read wizard
+ [ "$wizard" = "" ] && wizard=n
+ [ "$wizard" = "n" ] && exit
+fi
+
+# DEFAULTS
+[ "$httpServer_dflt" = "" ] && httpServer_dflt="localhost:9000"
+[ "$diameterServer_dflt" = "" ] && diameterServer_dflt="localhost:3868"
+[ "$diameterServerSessions_dflt" = "" ] && diameterServerSessions_dflt=1
+[ "$entity_dflt" = "" ] && entity_dflt="localhost:4000,localhost:4001"
+[ "$entityServerSessions_dflt" = "" ] && entityServerSessions_dflt=0
+[ "$dictionary_dflt" = "" ] && dictionary_dflt=dictionary.xml
+
+
+# Wizard
+echo "HTTP Management interface address (using i.e. curl tool) as <ip|hostname>:<port> socket literal [$httpServer_dflt]:"
+read httpServer
+[ "$httpServer" = "" ] && httpServer=$httpServer_dflt
+
+echo "Diameter dictionary: you could use '/opt/bin/anna/example_diameter_stackManagement' tool in order to build"
+echo " autonomous dictionaries for any kind of application. The key is to concatenate xml contents (ietf, 3gpp,"
+echo " vendor-specific, etc.). See 'example/diameter/stackManagement/self_ruling_setups.sh' for this."
+echo
+echo "This launcher can also join them providing a comma-separated list (dictionaries available on ./stack)."
+echo "By default, a QoS Application setup is suggested. Input the desired configuration instead, or press ENTER:"
+echo
+echo " [$dictionary_dflt]:"
+read dictionary
+[ "$dictionary" = "" ] && dictionary=$dictionary_dflt
+
+# As server:
+echo "Diameter own server available connections (0: diameter server disabled) [$diameterServerSessions_dflt]:"
+read diameterServerSessions
+[ "$diameterServerSessions" = "" ] && diameterServerSessions=$diameterServerSessions_dflt
+
+diameterServer=
+if test "$diameterServerSessions" != "0"
+then
+ echo "Diameter own server address as <ip|hostname>:<port> socket literal [$diameterServer_dflt]:"
+ read diameterServer
+fi
+[ "$diameterServer" = "" ] && diameterServer=$diameterServer_dflt
+
+# As client:
+echo "Diameter entity server sessions (0: diameter entity disabled) [$entityServerSessions_dflt]:"
+read entityServerSessions
+[ "$entityServerSessions" = "" ] && entityServerSessions=$entityServerSessions_dflt
+
+entity=
+if test "$entityServerSessions" != "0"
+then
+ echo "Target diameter entity (pipe-separated <ip|hostname>:<port> socket literal list) ["$entity_dflt"]:"
+ read entity
+fi
+[ "$entity" = "" ] && entity="$entity_dflt"
+
+# Configure:
+echo $httpServer > .httpServer
+echo $dictionary > .dictionary
+echo $diameterServer > .diameterServer
+echo $diameterServerSessions > .diameterServerSessions
+echo $entity > .entity
+echo $entityServerSessions > .entityServerSessions
+
+echo
+echo
+
--- /dev/null
+#!/bin/bash
+> curl_log.txt
+TRACE="--trace-ascii curl_log.txt"
+SERVER=`cat .httpServer`
+
+use () {
+
+ echo "Use: $0 <xml_file> [2c]"
+ echo
+ echo "Sends 'xml_file' to the diameter server or to the client when '2c' parameter is provided."
+ echo
+ exit
+}
+
+echo
+[[ "$1" = "" ]] && use
+[[ ! -f "$1" ]] && { echo "ERROR: file '$1' not found" ; echo; echo; exit ; }
+echo
+operation="sendxml|$1"
+[[ "$2" = "2c" ]] && operation="sendxml2c|$1"
+
+curl -m 1 --data "$operation" $TRACE ${SERVER}
+
--- /dev/null
+<message version="1" name="Credit-Control-Request" p-bit="yes" application-id="4" hop-by-hop-id="__HBH_ETE__" end-by-end-id="__HBH_ETE__">
+ <avp name="Session-Id" data="gbg.acision.com;421411;__SID_LOW__"/>
+ <avp name="Origin-Host" data="gbg.acision.com"/>
+ <avp name="Origin-Realm" data="SMSC.orig.OCS2.o2online.de"/>
+ <avp name="Destination-Realm" data="SMSC.dest.OCS1.o2online.de"/>
+ <avp name="Auth-Application-Id" data="4"/>
+ <avp name="Service-Context-Id" data="8.6.0.07.262.8.32274@3gpp.org"/>
+ <avp name="CC-Request-Type" data="4" alias="EVENT_REQUEST"/>
+ <avp name="CC-Request-Number" data="1"/>
+ <avp name="Destination-Host" data="OCS1"/>
+ <avp name="Event-Timestamp" data="1"/>
+ <avp name="Subscription-Id">
+ <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
+ <avp name="Subscription-Id-Data" data="__MSISDN__"/>
+ </avp>
+ <avp name="Requested-Action" data="0" alias="DIRECT_DEBITING"/>
+ <avp name="Multiple-Services-Indicator" data="0" alias="MULTIPLE_SERVICES_NOT_SUPPORTED"/>
+ <avp name="Multiple-Services-Credit-Control">
+ <avp name="Requested-Service-Unit">
+ <avp name="CC-Service-Specific-Units" data="1"/>
+ </avp>
+ <avp name="Service-Identifier" data="1"/>
+ </avp>
+ <avp name="Service-Information">
+ <avp name="MMS-Information">
+ <avp name="Originator-Address">
+ <avp name="Address-Type" data="1" alias="MSISDN"/>
+ <avp name="Address-Data" data="__MSISDN__"/>
+ <avp name="Address-Domain">
+ <avp name="3GPP-IMSI-MCC-MNC" data="26207"/>
+ </avp>
+ </avp>
+ <avp name="Originator-Address">
+ <avp name="Address-Type" data="6" alias="Other"/>
+ <avp name="Address-Data" data="__IMSI__"/>
+ </avp>
+ <avp name="Submission-Time" data="3486294858"/>
+ <avp name="Message-Size" data="4"/>
+ </avp>
+ <avp name="SMS-Information">
+ <avp name="SMS-Node" data="3" alias="SMS-SC"/>
+ <avp name="Client-Address" data="8|541760000405"/>
+ <avp name="Originator-SCCP-Address" data="8|541760000005"/>
+ <avp name="Originator-Received-Address">
+ <avp name="Address-Type" data="1" alias="MSISDN"/>
+ <avp name="Address-Data" data="__MSISDN__"/>
+ <avp name="Address-Domain">
+ <avp name="3GPP-IMSI-MCC-MNC" data="26207"/>
+ </avp>
+ </avp>
+ <avp name="Recipient-Info">
+ <avp name="Destination-Interface">
+ <avp name="Interface-Id" data="5417607020601"/>
+ <avp name="Interface-Type" data="2" alias="MOBILE_TERMINATING"/>
+ </avp>
+ <avp name="Recipient-Address">
+ <avp name="Address-Type" data="1" alias="MSISDN"/>
+ <avp name="Address-Data" data="5417607020601"/>
+ <avp name="Address-Domain">
+ <avp name="3GPP-IMSI-MCC-MNC" data="26207"/>
+ </avp>
+ </avp>
+ <avp name="Recipient-Address">
+ <avp name="Address-Type" data="6" alias="Other"/>
+ <avp name="Address-Data" data="262074900005771"/>
+ </avp>
+ <avp name="Recipient-Received-Address">
+ <avp name="Address-Type" data="1" alias="MSISDN"/>
+ <avp name="Address-Data" data="5417607020601"/>
+ <avp name="Address-Domain">
+ <avp name="3GPP-IMSI-MCC-MNC" data="26207"/>
+ </avp>
+ </avp>
+ <avp name="Recipient-SCCP-Address" data="8|541760000005"/>
+ </avp>
+ <avp name="SMSC-Address" data="8|541760000405"/>
+ <avp name="Data-Coding-Scheme" data="0"/>
+ <avp name="SM-Message-Type" data="0" alias="SUBMISSION"/>
+ <avp name="Originator-Interface">
+ <avp name="Interface-Id" data="262074900005771"/>
+ <avp name="Interface-Type" data="1" alias="MOBILE_ORIGINATING"/>
+ </avp>
+ <avp name="Number-Of-Messages-Sent" data="1"/>
+ </avp>
+ </avp>
+<!--
+ El Correlation Id no se usa en el Sertamsjt
+ <avp name="CC-Correlation-Id" data="gbg.acision.com;421411;__SID_LOW__"/>
+-->
+</message>
--- /dev/null
+#!/bin/bash
+
+# Generates SMS burst sequence for provided order number (1: first, 2: second, etc.)
+SEQN=$1
+
+salir () {
+ echo
+ echo $1
+ echo
+ exit
+}
+
+[[ "$SEQN" = "" ]] && salir "Use: $0 <sequence number: 1..N>"
+[[ ! -f sms.msk ]] && salir "Template file (sms.msk) not found!"
+
+# Sequence values at template sms.msk:
+# __HBH_ETE__: 1, 3, 5, etc. (hop-by-hop and end-to-end)
+# __SID_LOW__: 1000, 1001, 1002, etc. (Session-Id sequence append)
+# __MSISDN__: 5555100000, 5555100001, 5555100002, etc. (First and Third Address-Data)
+# __IMSI__: 262075555100000, 262075555100001, 262075555100002, etc. (Second Address-Data)
+
+OFFSET=$((SEQN-1))
+
+HBH_ETE=$((1 + 2*OFFSET))
+SID_LOW=$((1000+OFFSET))
+MSISDN=$((5555100000+OFFSET))
+IMSI=$((262075555100000+OFFSET))
+
+cat sms.msk | sed 's/__HBH_ETE__/'$HBH_ETE'/g' | sed 's/__SID_LOW__/'$SID_LOW'/' \
+ | sed 's/__MSISDN__/'$MSISDN'/' | sed 's/__IMSI__/'$IMSI'/'
--- /dev/null
+ABOUT CONTENT
+-------------
+Template for xml messages (message.dtd) and dictionaries (dictionary.dtd) are informative, not
+actually required by process. They are located at './DTDs'. Stacks are available at './stacks'.
+There are also some stuff (hex/xml examples, etc.) which could be useful.
+
+Firstly you have to configure this directory in order to choose the type of launcher which will
+be preconfigured for your basic needs: client, server, balancer (proxy) and dummy process (this
+last is used for code/encode and does not launch any communication interface).
+
+If you are going to launch different processes, we recommend to clone this whole directory into
+another one (call it 'ADL-client', 'ADL-server_2', 'Diameter_proxy', or whatever you want), and
+then configure it again.
+
+Execute './configure.sh' and follow the intructions. You can call this several times, but the
+last configuration will be the one which prevails.
+
+Additional helpers/scripts could be found at './resources' directory.
+
+STARTING THE PROCESS
+--------------------
+After configuring the ADL execution context, a new script has been created: 'run.sh'.
+You can manually edit such script adding parameters as '-trace debug' to get complete traces,
+or adapt the communication endpoints for your environment.
+
+Launch the executable process without arguments to see a complete command-line help.
+Don't be scared. There are plenty of possibilities but the 'run.sh' script has been prepared
+for the type of launcher you wanted.
+
+OPERATION
+---------
+Management interface for lite version is based on SIGUSR2 signal caugh. Use './operation.sh'
+script to send any operation to the process. Ask for help with that script to see all the
+operations supported.
+
--- /dev/null
+#!/bin/bash
+
+#############
+# VARIABLES #
+#############
+
+# Diameter dictionary:
+STD_DICTIONARY=stacks/avps_etsi.xml,stacks/avps_ietf.xml,stacks/avps_tgpp.xml,stacks/commands_baseProtocol.xml
+APP_DICTIONARY=stacks/commands_qosControl.xml
+DICTIONARY=$STD_DICTIONARY,$APP_DICTIONARY
+# Perhaps the stack is not fully defined:
+#KINDNESS=-ignoreErrors
+# But we prefer stack to generate Failed-AVP automatically:
+KINDNESS=
+
+# Communication endpoints:
+LOCAL_STANDARD_ENDPOINT=localhost:3868
+EXAMPLE_ENTITY_4_BALANCER=192.168.12.11:3868,192.168.12.21:3868
+CONNS=10
+
+# General
+EXE_BN=ADL-launcher
+
+# Tracing:
+TRACING="-cntDir counters"
+# need detailed traces ?:
+#TRACING="$TRACING -trace debug"
+
+#############
+# FUNCTIONS #
+#############
+
+_exit () {
+ echo
+ echo $1
+ echo
+ exit 1
+}
+
+# $1: process name
+createRunScript () {
+
+ cat << EOF > run.sh
+#!/bin/bash
+cd \`dirname \$0\`
+STARTED=\`pgrep $1 2>/dev/null\`
+[ \$? -eq 0 ] && { echo "Already started!"; echo "\$STARTED" ; exit 1 ; }
+0> launcher.traces
+rm -f counters/*
+# Execution line:
+./$@ &
+echo \$! > .pid
+EOF
+
+ chmod a+x run.sh
+}
+
+# $1: input option (c, s, b, d)
+# Retuns the type of launcher logical name for the input option
+get_tol () {
+ [ "$1" = "c" ] && echo client
+ [ "$1" = "s" ] && echo server
+ [ "$1" = "b" ] && echo balancer
+ [ "$1" = "d" ] && echo dummy
+}
+
+#############
+# EXECUTION #
+#############
+cd `dirname $0`
+SCR_DIR=`pwd`
+echo
+echo
+echo "Configure a (c)lient, (s)erver, (b)alancer or (d)ummy [c]:"
+read option
+[ "$option" = "" ] && option=c
+tol=$(get_tol $option)
+[ "$tol" = "" ] && _exit "Option '$option' not implemented !!"
+
+# Run script:
+EXE_LINK=ADL-$tol
+ln -sf $EXE_BN $EXE_LINK
+
+case $tol in
+
+ client)
+ ENTITY=$LOCAL_STANDARD_ENDPOINT
+ createRunScript $EXE_LINK -dictionary $DICTIONARY -entity $ENTITY -entityServerSessions $CONNS -diameterServerSessions 0 $KINDNESS $TRACING &
+ ;;
+
+ server)
+ SERVER=$LOCAL_STANDARD_ENDPOINT
+ createRunScript $EXE_LINK -dictionary $DICTIONARY -diameterServer $SERVER -diameterServerSessions $CONNS -entityServerSessions 0 $KINDNESS $TRACING &
+ ;;
+
+ balancer)
+ SERVER=$LOCAL_STANDARD_ENDPOINT
+ ENTITY=$EXAMPLE_ENTITY_4_BALANCER
+ createRunScript $EXE_LINK -dictionary $DICTIONARY -entity $ENTITY -entityServerSessions $CONNS -diameterServer $SERVER -diameterServerSessions $CONNS -balance $KINDNESS $TRACING &
+ ;;
+
+ dummy)
+ createRunScript $EXE_LINK -dictionary $DICTIONARY -entityServerSessions 0 -diameterServerSessions 0 $KINDNESS $TRACING &
+ ;;
+
+esac
+
+echo "Created 'run.sh' script !"
+echo
--- /dev/null
+01000150c000010901000014000000000000000000000107400000246f6373333b313333323737343433303b313b31333332373734343330000001024000000c01000014000001084000000c4f435333000001284000000c4f4353330000011b4000000c4f435333000001254000000c4f435333000001f8c000000f000028af3132320000000205c000006c000028af00000206c0000010000028af00000000000001f8c000000f000028af3132320000000204c0000010000028af0000007f00000203c0000010000028af00000085000001ffc0000010000028af00000002000001ca80000010000032db000000000000020fc0000010000028af00000000000001bb40000021000001c24000000c00000000000001bc4000001136323630333730393900000000000008400000133139322e3136382e302e31000000001e400000145741502e4d4f564953544152
--- /dev/null
+01000150c000010901000014000000000000000000000107400000246f6373333b313333323737343433303b313b31333332373734343330000001024000000c01000014000001084000000c4f435333000001284000000c4f4353330000011b4000000c4f435333000001254000000c4f435333000001f8c000000f000028af3132320000000205c000006c000028af00000206c0000010000028af00000000000001f8c000000f000028af3132320000000204c0000010000028af0000007f00000203c0000010000028af00000085000001ffc0000010000028af00000002000001ca80000010000032db000000000000020fc0000010000028af00000000000001bb40000028000001c24000000c00000000000001bc4000001136323630333730393900000000000008400000133139322e3136382e302e31000000001e400000145741502e4d4f564953544152
--- /dev/null
+0100017cc000010901000014000000000000000000000107400000246f6373333b313333323737343433303b313b31333332373734343330000001024000000c01000014000001084000000c4f435333000001284000000c4f4353330000011b4000000c4f435333000001254000000c4f435333000001f8c000000f000028af3132320000000205c0000098000028af00000206c0000010000028af0000000000000207c000002c000028af000001fdc0000010000028af00000037000001ffc000000a000028af00000000000001f8c000000f000028af3132320000000204c0000010000028af0000007f00000203c0000010000028af00000085000001ffc0000010000028af00000002000001ca80000010000032db000000000000020fc0000010000028af00000000000001bb40000028000001c24000000c00000000000001bc4000001136323630333730393900000000000008000000133139322e3136382e302e31000000001e000000145741502e4d4f564953544152
--- /dev/null
+0100017cc000010901000014000000000000000000000107400000246f6373333b313333323737343433303b313b31333332373734343330000001024000000c01000014000001084000000c4f435333000001284000000c4f4353330000011b4000000c4f435333000001254000000c4f435333000001f8c000000f000028af3132320000000205c0000098000028af00000206c0000010000028af0000000000000207c000002c000028af000001fdc0000010000028af00000037000001ffc0000010000028af00000010000001f8c000000f000028af3132320000000204c0000010000028af0000007f00000203c0000010000028af00000085000001ffc0000010000028af00000002000001ca80000010000032db000000000000020fc0000010000028af00000000000001bb40000028000001c24000000c00000000000001bc4000001136323630333730393900000000000008000000133139322e3136382e302e31000000001e000000145741502e4d4f564953544152
--- /dev/null
+Bad messages:
+
+aar-bad.hex: comes from ../xml_examples/aar.xml
+ Consists in a deliberated bad length encoded on grouped Subscription-Id length field (not multiple of 4).
+
+aar2-bad.hex: comes from ../xml_examples/aar2.xml
+ Consists in a deliberated bad length encoded on enumerated Flow-Status avp 2-level nested inside Media-Component-Description:
+ -> Media-Component-Description (grouped)
+ -> Media-Sub-Component (grouped)
+ -> Flow-Status (enumerated)
+
+aar3-bad.hex: comes from ../xml_examples/aar2.xml
+ Consists in a deliberated bad value (16) encoded on enumerated Flow-Status avp (range 0-15) 2-level nested inside Media-Component-Description:
+ -> Media-Component-Description (grouped)
+ -> Media-Sub-Component (grouped)
+ -> Flow-Status (enumerated)
--- /dev/null
+0100018c4000011001000016ff7f245e9b81ce71000001074000003f63302d31302d37302d3233382d37342d7735703176657067312e766570632e6572696373736f6e2e73653b313430323932373534343b33000000010c4000000c000007d10000010840000019657063322e6570637265616c6d2e636f6d00000000000128400000146570637265616c6d2e636f6d000001026000000c01000016000001a06000000c000000010000019f6000000c00000000000003f8c000002c000028af00000410c0000010000028af004e200000000411c0000010000028af0007d00000000419c0000058000028af00000404c0000010000028af000000060000040ac000003c000028af00000416c0000010000028af000000030000041780000010000028af000000010000041880000010000028af000000000000027480000038000028af0000010a4000000c000028af0000027580000010000028af000000010000027680000010000028af00000003000003ffc0000010000028af00000002000001164000000c00000005
--- /dev/null
+010002e8c000011001000016ff7f245e9b81ce71000001074000003f63302d31302d37302d3233382d37342d7735703176657067312e766570632e6572696373736f6e2e73653b313430323932373534343b3300000001026000000c01000016000001084000003263302d31302d37302d3233382d37342d7735703176657067312e766570632e6572696373736f6e2e736500000000012840000018766570632e6572696373736f6e2e73650000011b600000146570637265616c6d2e636f6d000001a06000000c000000010000019f6000000c0000000000000017c000000e000028af80010000000001166000000c00000000000001bb60000028000001c26000000c00000000000001bc60000013343637303139343034313800000000086000000c0a46ee6200000403c0000010000028af0000000500000015e000000d000028af060000000000040880000010000028af000003ec000001ca6000002c000001cb2000000c00000000000001cc2000001833353734373330343030363632383030000003f8c000002c000028af0000041080000010000028af08f0d1800000041180000010000028af02faf0800000041980000058000028af00000404c0000010000028af000000090000040ac000003c000028af0000041680000010000028af000000020000041780000010000028af000000010000041880000010000028af0000000000000012e0000011000028af32343039390000000000041a80000012000028af00010a46ee3a000000000016c0000019000028af8242f099006742f0990186a4010000000000001e6000000d7665706731000000000003e8c0000010000028af0000000000000400c0000010000028af00000001000001f5c0000012000028af00010a46ee3a0000000003fec0000020000028af000001f7c0000013000028af34383030303438000000027480000038000028af0000010a4000000c000028af0000027580000010000028af000000010000027680000010000028af00000003
--- /dev/null
+#!/bin/bash
+
+#############
+# FUNCTIONS #
+#############
+_exit () {
+ echo
+ echo -e $1
+ echo
+ exit 1
+}
+
+#############
+# EXECUTION #
+#############
+cd `dirname $0`
+echo
+# Get the PID:
+[ ! -f .pid ] && _exit "Can't found '`pwd`/.pid'.\nTry to pgrep your process name and dump pid to that file."
+PID=`cat .pid`
+
+# Send operation:
+[ "$1" = "" ] && _exit "Use: $0 <operation string>; i.e.: $0 help"
+echo $1 > sigusr2.tasks.input
+kill -s SIGUSR2 $PID
+
+sleep 1
+echo
+echo
+echo "You could see results on '`pwd`/sigusr2.tasks.output' file."
+echo
+echo
+
--- /dev/null
+<message version="1" name="AA-Request" p-bit="yes" application-id="16777236" hop-by-hop-id="0" end-by-end-id="0">
+ <avp name="Session-Id" data="ocs3;1332774430;1;1332774430"/>
+ <avp name="Auth-Application-Id" data="16777236"/>
+ <avp name="Origin-Host" data="OCS3"/>
+ <avp name="Origin-Realm" data="OCS3"/>
+ <avp name="Destination-Realm" data="OCS3"/>
+ <avp name="Destination-Host" data="OCS3"/>
+ <avp name="AF-Application-Identifier" hex-data="313232"/>
+ <avp name="Media-Component-Description">
+ <avp name="Media-Component-Number" data="0"/>
+ <avp name="AF-Application-Identifier" hex-data="313232"/>
+ <avp name="Max-Requested-Bandwidth-UL" data="127"/>
+ <avp name="Max-Requested-Bandwidth-DL" data="133"/>
+ <avp name="Flow-Status" data="2" alias="ENABLED"/>
+ <avp name="Reservation-Priority" data="0" alias="DEFAULT"/>
+ </avp>
+ <avp name="Service-Info-Status" data="0" alias="FINAL_SERVICE_INFORMATION"/>
+ <avp name="Subscription-Id">
+ <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
+ <avp name="Subscription-Id-Data" data="626037099"/>
+ </avp>
+ <avp name="Framed-IP-Address" hex-data="3139322e3136382e302e31"/>
+ <avp name="Called-Station-Id" data="WAP.MOVISTAR"/>
+</message>
--- /dev/null
+<message version="1" name="AA-Request" p-bit="yes" application-id="16777236" hop-by-hop-id="0" end-by-end-id="0">
+ <avp name="Session-Id" data="ocs3;1332774430;1;1332774430"/>
+ <avp name="Auth-Application-Id" data="16777236"/>
+ <avp name="Origin-Host" data="OCS3"/>
+ <avp name="Origin-Realm" data="OCS3"/>
+ <avp name="Destination-Realm" data="OCS3"/>
+ <avp name="Destination-Host" data="OCS3"/>
+ <avp name="AF-Application-Identifier" hex-data="313232"/>
+ <avp name="Media-Component-Description">
+ <avp name="Media-Component-Number" data="0"/>
+ <avp name="Media-Sub-Component">
+ <avp name="Flow-Number" data="55"/>
+ <avp name="Flow-Status" data="0" alias="ENABLED-UPLINK"/>
+ </avp>
+ <avp name="AF-Application-Identifier" hex-data="313232"/>
+ <avp name="Max-Requested-Bandwidth-UL" data="127"/>
+ <avp name="Max-Requested-Bandwidth-DL" data="133"/>
+ <avp name="Flow-Status" data="2" alias="ENABLED"/>
+ <avp name="Reservation-Priority" data="0" alias="DEFAULT"/>
+ </avp>
+ <avp name="Service-Info-Status" data="0" alias="FINAL_SERVICE_INFORMATION"/>
+ <avp name="Subscription-Id">
+ <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
+ <avp name="Subscription-Id-Data" data="626037099"/>
+ </avp>
+ <avp name="Framed-IP-Address" hex-data="3139322e3136382e302e31"/>
+ <avp name="Called-Station-Id" data="WAP.MOVISTAR"/>
+</message>
--- /dev/null
+<message version="1" name="Credit-Control-Request" p-bit="yes" application-id="4" hop-by-hop-id="1" end-by-end-id="1">
+ <avp name="Session-Id" data="module-2.PTS2-BOG.sandvine.com;1287115741;0;0"/>
+ <avp name="Origin-Host" data="module-2.PTS2-BOG.sandvine.com"/>
+ <avp name="Origin-Realm" data="sandvine.com"/>
+ <avp name="Destination-Realm" data="telefonica.com.co"/>
+ <avp name="Auth-Application-Id" data="4"/>
+ <avp name="Service-Context-Id" data="770.32251@3gpp.org"/>
+ <avp name="CC-Request-Type" data="1" alias="INITIAL_REQUEST"/>
+ <avp name="CC-Request-Number" data="0"/>
+ <avp name="User-Name" data="50583211675"/>
+ <avp name="Origin-State-Id" data="1339077627"/>
+ <avp name="Event-Timestamp" data="3548171033"/>
+ <avp name="Subscription-Id">
+ <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
+ <avp name="Subscription-Id-Data" data="50583211675"/>
+ </avp>
+ <avp name="Multiple-Services-Indicator" data="1" alias="MULTIPLE_SERVICES_SUPPORTED"/>
+ <avp name="User-Equipment-Info">
+ <avp name="User-Equipment-Info-Type" data="0" alias="IMEISV"/>
+ <avp name="User-Equipment-Info-Value" hex-data="33353430343630343130363438333030"/>
+ </avp>
+ <avp name="Service-Information">
+ <avp name="PS-Information">
+ <avp name="3GPP-Charging-Id" data="29"/>
+ <avp name="3GPP-PDP-Type" data="0" alias="IPV4"/>
+ <avp name="PDP-Address" data="10.193.49.133"/>
+ <avp name="3GPP-GPRS-Neg-QoS-Profile" data="05-1b921f7196fefe74fbfefe00"/>
+ <avp name="SGSN-Address" data="190.98.183.240"/>
+ <avp name="GGSN-Address" data="190.98.183.243"/>
+ <avp name="CG-Address" data="10.193.249.1"/>
+ <avp name="3GPP-IMSI-MCC-MNC" data="71204"/>
+ <avp name="3GPP-GGSN-MCC-MNC" data="71204"/>
+ <avp name="3GPP-NSAPI" data="5"/>
+ <avp name="Called-Station-Id" data="internet.movistar.ni"/>
+ <avp name="3GPP-Selection-Mode" data="0"/>
+ <avp name="3GPP-Charging-Characteristics" data="0800"/>
+ <avp name="3GPP-SGSN-MCC-MNC" data="33403"/>
+ <avp name="3GPP-MS-TimeZone" hex-data="4a00"/>
+ <avp name="3GPP-User-Location-Info" hex-data="0117f240a4780218"/>
+ <avp name="3GPP-Rat-Type" hex-data="01"/>
+ <avp name="PDP-Context-Type" data="0"/>
+ </avp>
+ </avp>
+</message>
--- /dev/null
+ABOUT CONTENT
+-------------
+Template for xml messages (message.dtd) and dictionaries (dictionary.dtd) are informative, not
+actually required by process. They are located at './DTDs'. Stacks are available at './stacks'.
+There are also some stuff (hex/xml examples, etc.) which could be useful.
+
+The directory 'tests' contains resources to create FT test cases. The script 'common.sh' implement
+a basic scheduler to launch a request to the server, waits for incoming activity, retrieve the
+answer received and match such message with certain criteria. Execute 'case_1.sh' as example.
+
+An advanced FT test framework involves the use of the ANNA::diameter API in an ad-hoc diameter
+client executable (for example we could define an incoming handler in different libraries which
+represent different test cases, linking them to a common simple diameter client agent). But with
+this simple scripts we could do something valid to start with.
+
+Additional helpers/scripts could be found at './resources' directory.
+
+STARTING THE PROCESS
+--------------------
+Launch the executable process without arguments to see a complete command-line help.
+Don't be scared. There are plenty of possibilities but the 'run.sh' script has been prepared
+for the type of launcher you wanted.
+
+OPERATION
+---------
+Management interface for this version is based on SIGUSR2 signal caugh. Use './operation.sh'
+script to send any operation to the process. Ask for help with that script to see all the
+operations supported.
+
--- /dev/null
+-dictionary `grep -v ^# .dictionary`
+-entity `grep -v ^# .entity`
+-entityServerSessions `grep -v ^# .entityServerSessions`
+-splitLog
--- /dev/null
+../basic/hex_examples
\ No newline at end of file
--- /dev/null
+../basic/operation.sh
\ No newline at end of file
--- /dev/null
+#!/bin/bash
+
+# Remove logs:
+rm *.log* *.csv 2>/dev/null
+
+# Client sockets:
+entity_dflt=`cat .entity 2>/dev/null`
+entityServerSessions_dflt=`cat .entityServerSessions 2>/dev/null`
+
+# Stack:
+dictionary_dflt=`cat .dictionary 2>/dev/null`
+
+echo
+echo
+# If all have values:
+if [ "$entity_dflt" != "" -a "$entityServerSessions_dflt" != "" -a "$dictionary_dflt" != "" ]
+then
+ echo "Do you wish to answer wizard commandline configuration ? (y/n) [n]:"
+ read wizard
+ [ "$wizard" = "" ] && wizard=n
+ [ "$wizard" = "n" ] && exit
+fi
+
+# DEFAULTS
+#[ "$entity_dflt" = "" ] && entity_dflt="192.168.12.11:3868,192.168.12.21:3868"
+[ "$entity_dflt" = "" ] && entity_dflt="localhost:3868"
+[ "$entityServerSessions_dflt" = "" ] && entityServerSessions_dflt=10
+[ "$dictionary_dflt" = "" ] && dictionary_dflt=dictionary.xml
+
+
+# Wizard
+echo "Diameter dictionary: you could use '/opt/bin/anna/example_diameter_stackManagement' tool in order to build"
+echo " autonomous dictionaries for any kind of application. The key is to concatenate xml contents (ietf, 3gpp,"
+echo " vendor-specific, etc.). See 'example/diameter/stackManagement/self_ruling_setups.sh' for this."
+echo
+echo "This launcher can also join them providing a comma-separated list (dictionaries available on ./stack)."
+echo "By default, a QoS Application setup is suggested. Input the desired configuration instead, or press ENTER:"
+echo
+echo " [$dictionary_dflt]:"
+read dictionary
+[ "$dictionary" = "" ] && dictionary=$dictionary_dflt
+
+# As client:
+echo "Diameter entity server sessions (0: diameter entity disabled) [$entityServerSessions_dflt]:"
+read entityServerSessions
+[ "$entityServerSessions" = "" ] && entityServerSessions=$entityServerSessions_dflt
+
+entity=
+if test "$entityServerSessions" != "0"
+then
+ echo "Target diameter entity (pipe-separated <ip|hostname>:<port> socket literal list) ["$entity_dflt"]:"
+ read entity
+fi
+[ "$entity" = "" ] && entity="$entity_dflt"
+
+# Configure:
+echo $dictionary > .dictionary
+echo $entity > .entity
+echo $entityServerSessions > .entityServerSessions
+
+echo
+echo
+
--- /dev/null
+#!/bin/bash
+
+# In this test we will send a incorrect message (AAR) to the server peer:
+# Warning | source/diameter/codec/Message.cpp (387) | Internal Avp decoding error (avp code = 443): Avp format error, the avp length is incorrect (must be multiple of 4 on grouped type)
+#
+# The server shall answer with the FailedAVP and we will check this to validate the test.
+
+#############
+# VARIABLES #
+#############
+# Paths from the point of view of ADL executable:
+REQ1_HEX=./hex_examples/aar-bad.hex
+
+#############
+# FUNCTIONS #
+#############
+
+
+#############
+# EXECUTION #
+#############
+
+# Goto working directory
+cd `dirname $0`
+
+# Source utils:
+source common.sh
+
+# Clean traffic traces:
+rm -f ../../launcher.log*
+
+# Send incorrect AAR:
+send_hex $REQ1_HEX &
+
+# Monitor activity:
+monitor_4_message ../../launcher.log.recvfe 10
+
+# Check if message was received:
+[ $? -ne 0 ] && test_failed "Missing answer from the server"
+
+# Check launcher.log.recvfe:
+check_pattern "<avp name=\"Result-Code\" data=\"5004\" alias=\"DIAMETER_INVALID_AVP_VALUE\"/>" ../../launcher.log.recvfe
+check_pattern "<avp name=\"Failed-AVP\">( *)<avp name=\"Subscription-Id\"" ../../launcher.log.recvfe
+
+# Test OK
+test_ok "Received answer to bad-aar message indicating Failed-AVP as Subscription-Id"
+
--- /dev/null
+#!/bin/bash
+
+#############
+# FUNCTIONS #
+#############
+
+_exit () {
+ echo
+ echo $1
+ echo
+ exit 1
+}
+
+sigint_handler() {
+ _exit "Script interrupted. Cleanup & exit ..."
+}
+
+# $1: hex formatted file to send to the server
+send_xml () {
+ ../../operation.sh "sendxml|$1"
+}
+
+send_hex () {
+ sleep 1
+ ../../operation.sh "sendhex|$1"
+}
+
+# $1: pattern; $2: file
+check_pattern () {
+ echo "Matching pattern '$1' ..."
+ cat $2 | tr '\n' ' ' | egrep "$1" >/dev/null
+ res=${PIPESTATUS[2]}
+ [ $? -ne 0 ] && _exit "Test failed: miss pattern !!"
+}
+
+test_ok () {
+ echo
+ echo $1
+ echo "Test OK !"
+ echo
+ exit 0
+}
+
+test_failed () {
+ echo
+ echo $1
+ echo "Test FAILED !"
+ echo
+ exit 1
+}
+
+
+# $1: traffic log to monitor
+# $2: timeout (request expiration) in seconds
+# Result: cats the message when completed
+monitor_4_message () {
+ 0>$1
+ rm -f .msg_received
+
+ [ -z "$2" ] && _exit "ERROR: must provide '$FUNCNAME' timeout (second argument)"
+ sleep $2 &
+ local timerPid=$!
+
+ # Monitor for incoming message:
+ tail -n0 -F --pid=$timerPid $1 | while read line
+ do
+ if echo $line | grep "^</message>" >/dev/null; then
+ echo "Message received"
+ # stop the timer
+ kill -13 $timerPid
+ touch .msg_received
+ fi
+ done
+
+ if [ ! -f .msg_received ]; then
+ echo "Timeout expired"
+ return 1
+ fi
+
+ return 0
+}
+
+#############
+# EXECUTION #
+#############
+
+# Trap sigint signal:
+trap sigint_handler SIGINT
+
--- /dev/null
+../../../../hex_examples/aar-bad.hex
\ No newline at end of file
--- /dev/null
+../../../../hex_examples/aar2-bad.hex
\ No newline at end of file
--- /dev/null
+../../../../hex_examples/aar3-bad.hex
\ No newline at end of file
--- /dev/null
+# Bad length encoded on grouped Subscription-Id length field (not multiple of 4).
+
+# Send malformed AAR to the server:
+SENDHEX2E aar-bad.hex
+
+# Wait for message:
+WAIT4MESSAGE
+
+# Check Failed-AVP & Subscription-Id within:
+CHECKPATTERN <avp name="Result-Code" data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
+CHECKPATTERN <avp name="Failed-AVP">( *)<avp name="Subscription-Id"
--- /dev/null
+# Bad length encoded on enumerated Flow-Status avp 2-level nested (Media-Component-Description -> Media-Sub-Component -> Flow-Status)
+
+# Send malformed AAR to the server:
+SENDHEX2E aar2-bad.hex
+
+# Wait for message:
+WAIT4MESSAGE
+
+# Check Failed-AVP & Subscription-Id within:
+CHECKPATTERN <avp name="Result-Code" data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
+CHECKPATTERN <avp name="Failed-AVP">( *)<avp name="Media-Component-Description"
+
+# TODO: check that the complete hierarchy to Flow-Status (the real bad avp)
--- /dev/null
+# Bad value (15) encoded on enumerated Flow-Status avp (range 0-15) 2-level nested (Media-Component-Description -> Media-Sub-Component -> Flow-Status)
+
+# Send malformed AAR to the server:
+SENDHEX2E aar3-bad.hex
+
+# Wait for message:
+WAIT4MESSAGE
+
+# Check Failed-AVP & Subscription-Id within:
+CHECKPATTERN <avp name="Result-Code" data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
+CHECKPATTERN <avp name="Failed-AVP">( *)<avp name="Media-Component-Description">( *)<avp name="Media-Sub-Component">( *)<avp name="Flow-Status" data="0" alias="ENABLED-UPLINK"/>
--- /dev/null
+#!/bin/bash
+
+#############
+# VARIABLES #
+#############
+SCR_DIR=`dirname $0`
+tmpdir=$(mktemp -d)
+SCR_BN=`basename $0`
+OPER_SCR=../../operation.sh
+RESULT_LOG=result.log
+RECV_LOG=../../launcher.log.recvfe
+
+#############
+# FUNCTIONS #
+#############
+
+sigint_handler () {
+ _exit "Script interrupted. Cleanup and exit ..."
+}
+
+# $1: message; $2: optional rc (1 by default)
+_exit () {
+ rc=1
+ [ -n "$2" ] && rc=$2
+ echo
+ echo -e $1
+ echo
+ rm -rf $tmpdir
+ exit $rc
+}
+
+# $1: hex formatted file to send to the server
+operation_sendxml2e () {
+ sleep 0.5
+ $OPER_SCR "sendxml2e|$1"
+ return $?
+}
+
+# $1: hex formatted file to send to the server
+operation_sendhex2e () {
+ sleep 0.5
+ $OPER_SCR "sendhex2e|$1"
+ return $?
+}
+
+# $1: file to monitor
+# $2: timeout (request expiration) in seconds
+# Result: cats the message when completed
+wait4message () {
+ 0>$1
+ rm -f .msg_received
+
+ [ -z "$2" ] && _exit "ERROR: must provide '$FUNCNAME' timeout (second argument)"
+ sleep $2 &
+ local timerPid=$!
+
+ # Monitor for incoming message:
+ tail -n0 -F --pid=$timerPid $1 | while read line
+ do
+ if echo $line | grep "^</message>" >/dev/null; then
+ echo "Message received:"
+ echo
+ cat $1
+ # stop the timer
+ kill -13 $timerPid
+ touch .msg_received
+ fi
+ done
+
+ if [ ! -f .msg_received ]; then
+ echo "Timeout expired"
+ return 1
+ fi
+
+ return 0
+}
+
+# xml content is serialized (removing CR's) to ease the pattern matching:
+# $1: pattern; $2: file
+check_pattern () {
+ echo -n "Matching pattern '$1' in file '$2' ... "
+ cat $2 | tr '\n' ' ' | egrep "$1" >/dev/null
+ [ $? -ne 0 ] && { echo "ERROR" ; test_failed ; return 1 ; }
+ echo "OK"
+ return 0
+}
+
+# $1: pattern file; $2: file
+check_pattern_file () {
+ echo -n "Matching whole file '$1' in file '$2' ... "
+ grep -f $1 $2 >/dev/null
+ [ $? -ne 0 ] && { echo "ERROR" ; test_failed ; return 1 ; }
+ echo "OK"
+ return 0
+}
+
+# Tests result:
+test_ok () {
+ echo "Verdict: $TC Ok" | tee -a $RESULT_LOG
+}
+
+test_failed () {
+ echo "Verdict: $TC Failed" | tee -a $RESULT_LOG
+}
+
+process_tc () {
+ local tc_dn=`dirname $TC`
+
+ echo
+ echo "***** Executing '$TC' ..."
+
+ grep -v ^# $TC > $tmpdir/tc
+ while read -r line
+ do
+ oper=$(echo $line | awk '{ print $1 }')
+ param1="$(echo $line | cut -d' ' -f2-)"
+
+ case $oper in
+ SENDXML2E)
+ operation_sendxml2e $tc_dn/$param1 &
+ [ $? -ne 0 ] && return 1
+ ;;
+
+ SENDHEX2E)
+ operation_sendhex2e $tc_dn/$param1 &
+ [ $? -ne 0 ] && return 1
+ ;;
+
+ WAIT4MESSAGE)
+ wait4message $RECV_LOG 5
+ [ $? -ne 0 ] && return 1
+ ;;
+
+ CHECKPATTERN)
+ check_pattern "$param1" $RECV_LOG
+ [ $? -ne 0 ] && return 1
+ ;;
+
+ CHECKPATTERNFILE)
+ check_pattern_file "$param1" $RECV_LOG
+ [ $? -ne 0 ] && return 1
+ ;;
+
+ esac
+
+ done < $tmpdir/tc
+
+ return 0
+}
+
+
+#############
+# EXECUTION #
+#############
+
+# Trap sigint:
+trap sigint_handler SIGINT
+
+# Working directory is script dirname:
+cd $SCR_DIR
+
+# Intro:
+echo
+echo "------------------"
+echo "Test cases manager"
+echo "------------------"
+# Mandatory parameter:
+[ -z "$1" ] && _exit "Usage: $SCR_BN <test cases parent directory (or .tc file)>"
+[ ! -f "$1" -a ! -d "$1" ] && _exit "Invalid file or directory '$1' !!"
+
+# Gather .tc files to be processed:
+[ ! -f $1 ] && echo -e "\nGathering list of test cases from '`readlink -f $1`' ..."
+echo
+find $1 -name *.tc | xargs -L1 readlink -f | tee -a $tmpdir/tc_list
+echo
+echo
+
+echo "Start processing test cases:"
+echo "----------------------------"
+# Process test cases:
+0> $RESULT_LOG
+for TC in `cat $tmpdir/tc_list`
+do
+ process_tc
+ if [ $? -eq 0 ]; then
+ test_ok
+ else
+ test_failed
+ cat $RECV_LOG
+ fi
+done
+
+_exit "Done !" 0
+
--- /dev/null
+../basic/xml_examples
\ No newline at end of file
if(infile.is_open()) {
infile >> buffer;
std::string hexString(buffer, strlen(buffer));
+ // Allow colon separator in hex string: we have to remove them before processing with 'fromHexString':
+ hexString.erase(std::remove(hexString.begin(), hexString.end(), ':'), hexString.end());
+ LOGDEBUG(
+ std::string msg = "Hex string (remove colons if exists): ";
+ msg += hexString;
+ anna::Logger::debug(msg, ANNA_FILE_LOCATION);
+ );
+
anna::functions::fromHexString(hexString, db);
// Close file
infile.close();
+++ /dev/null
-<message version="1" code="265" flags="0" application-id="0" hop-by-hop-id="1" end-by-end-id="2">
- <avp name="Session-Id" data="ocs3;1332909618;0;1332909618"/>
- <avp name="Auth-Application-Id" data="16777236"/>
- <avp name="Origin-Host" data="OCS3"/>
- <avp name="Origin-Realm" data="OCS3"/>
-</message>
-
+++ /dev/null
-Encode 1.xml to 2.hex|code|1.xml|2.hex
-Decode 2.hex to 3.xml (we will diff 1.xml and 3.xml)|decode|2.hex|3.xml
+++ /dev/null
-
-ABOUT CONTENT
--------------
-Stacks available at './stacks'.
-The launcher uses the configuration given by '.dictionary' which points to a specification list.
-Available different setups by mean files named as '.dictionary__<stack description>'.
-
-Template for xml messages (message.dtd) and dictionaries (dictionary.dtd) are informative, not
-actually required by process. Located at './DTDs'.
-
-STARTING THE PROCESS
---------------------
-Start with 'run.sh'. You could manually edit such script adding parameters as '-trace debug' to
-get complete 'launcher.traces'. Execute 'ADL-launcher' without arguments to see a complete
-command-line help.
-
-DEPLOYED SCRIPTS
-----------------
-You could get help about installed resources by mean 'help.sh', which launch a help request to
-the started ADL-launcher process http interface. All the implemented http operations could be
-launched through a script to make easy use. The http client 'curl' is used by default due to
-its presence on common linux distributions.
-
+++ /dev/null
-#!/bin/bash
-> curl_log.txt
-TRACE="--trace-ascii curl_log.txt"
-SERVER=`cat .httpServer`
-
-echo
-echo
-echo "Use: $0 [xml_file] [2e]"
-echo
-echo "Programm 'xml_file' answer to the diameter client or to the server (entity) when"
-echo "'2e' parameter is provided. If missing xml file, current programmed answers will"
-echo "be shown: '$0' (answers to client), '$0 2e' (answers to server)."
-echo
-if test "$1" != ""
-then
- if test "$1" = "2e"
- then
- operation="answerxml2e"
- else
- [[ ! -f "$1" ]] && { echo "ERROR: file '$1' not found" ; echo; echo; exit ; }
- operation="answerxml|$1"
- [[ "$2" = "2e" ]] && operation="answerxml2e|$1"
- fi
-else
- operation="answerxml"
-fi
-echo
-curl -m 1 --data "$operation" $TRACE ${SERVER}
-
+++ /dev/null
--httpServer `grep -v ^# .httpServer`
--dictionary `grep -v ^# .dictionary`
--diameterServer `grep -v ^# .diameterServer`
--diameterServerSessions `grep -v ^# .diameterServerSessions`
--entity `grep -v ^# .entity`
--entityServerSessions `grep -v ^# .entityServerSessions`
+++ /dev/null
-#!/bin/bash
-> curl_log.txt
-TRACE="--trace-ascii curl_log.txt"
-SERVER=`cat .httpServer`
-
-use () {
-
- echo "Use: $0 <test file> [time between operations: 0 second by default]"
- echo
- echo " Batch launcher script"
- echo " ---------------------"
- echo
- echo " Test file must contain a operations with this syntax: <description>|<operation>|<arg1>|..."
- echo " Three operations: code, decode and sendxml:"
- echo
- echo " code|<source>|<target> i.e.: code|1.xml|2.hex"
- echo " decode|<source>|<target> i.e.: decode|2.hex|1.xml-bis"
- echo " sendxml|<source> i.e.: sendxml|1.xml"
- echo
- echo " Test file example:"
- echo
- echo " $0 1xml-23.txt"
- echo
- echo " where 1xml-23.txt contains:"
- echo " Encode 1.xml to 2.hex|code|1.xml|2.hex"
- echo " Decode 2.hex to 3.xml (we will diff 1.xml and 3.xml)|decode|2.hex|3.xml"
- echo
- echo
- echo " Test file could contain any number of operations and could include comments (will be ignored)."
- echo
- exit
-}
-
-echo
-echo
-[[ "$1" = "" ]] && use
-LAPSE=${2:-0}
-echo
-echo "Test '$1' is going to be launched:"
-echo
-cat $1
-echo
-echo "Pulse ENTER para lanzar, CTRL+C para abortar..."
-read dummy
-
-while read -r line
-do
- comment=$(echo $line | grep "^#")
- ok=
- [[ "$comment" = "" ]] && { [[ "$line" != "" ]] && ok=s ; }
- if test "$ok" = "s"
- then
- echo "Launching $(echo $line | cut -d'|' -f1) ..."
- sleep $LAPSE
- operation=$(echo $line | cut -d'|' -f2-)
- curl -m 1 --data "$operation" $TRACE ${SERVER}
- fi
-
-done < $1
-
+++ /dev/null
-#!/bin/bash
-> curl_log.txt
-TRACE="--trace-ascii curl_log.txt"
-SERVER=`cat .httpServer`
-burstMargin__dflt=1
-
-salir () {
- echo
- echo $1
- echo
- exit
-}
-
-calc () { echo "$1" | bc -l ; }
-
-entero () {
- limpio=$(calc "scale=0;${1}/1")
- [[ $limpio != $1 ]] && salir "Invalid value '$1'. Must be integer"
-}
-
-uso () {
-
- echo "Load tests configuration script"
- echo
- echo "Use: $0 <action: clear | load | start | push | pop | stop | resume | repeat | send | goto | look> [action parameters]"
- echo
- echo " clear:"
- echo " Clears all loaded burst messages."
- echo
- echo " load <amount> <traffic type: mms | sms | voice | data | content>:"
- echo " Loads 'amount' messages for the provided traffic type. For example:"
- echo " $0 load 2000 sms"
- echo
- echo " start [initial launch: default $burstMargin__dflt]:"
- echo " Starts the message sending from the begining of the burst list loaded,"
- echo " with a certain initial load. For example:"
- echo " $0 start 200"
- echo
- echo " push [amount: default $burstMargin__dflt]:"
- echo " Launch 'amount' messages as initial load does (non-asynchronous mode)."
- echo " It works even if burst launch is stopped. Useful to achieve congestion"
- echo " conditions. For example:"
- echo " $0 push 300"
- echo
- echo " pop [amount: default $burstMargin__dflt]:"
- echo " Skip send burst messages in order to reduce over-the-air requests."
- echo
- echo " stop:"
- echo " Stops the burst cycle at the current position. It could affect sessions"
- echo " on the air (i.e. data contexts). Totally safe for IEC scenaries as SMS."
- echo
- echo " resume:"
- echo " Resume an stopped burst launch from the same point (start will reset"
- echo " the work pointer to the first burst list position). This is equivalent"
- echo " to one-message-push operation."
- echo
- echo " repeat [[yes] | no]:"
- echo " Restarts the burst launch cycle when finished."
- echo
- echo " send [amount: default 1]:"
- echo " send messages from burst list. The main difference with start/push operations"
- echo " is that burst won't be awaken. Externally we could control sending time (no"
- echo " request will be sent for answers). When reach the last position, starts again."
- echo
- echo " sendXS <requests per second> [amount: default -1 (no limit)]:"
- echo " send messages from burst list with the TPS provided. User could hot change"
- echo " speed by mean 'echo <TPS> > .tps' at another shell. You can stop the load"
- echo " removing that hidden file or using CTRL+C from the shell where you launched"
- echo " the burst command. Real tps is dumped on '.real_tps' file during testing."
- echo " You could limit the amount of messages sent by mean the second parameter."
- echo " No limit is established by default (-1 or negative value)."
- echo
- echo " goto <order>:"
- echo " Updates current burst pointer position."
- echo
- echo " look <order>:"
- echo " Show programmed burst message for order provided."
- echo
- echo
- salir
-}
-
-_curl () {
- curl -m 5 --data "$1" $TRACE ${SERVER}
-}
-
-echo
-echo
-[[ "$1" = "" ]] && uso
-case $1 in
- clear) _curl "burst|clear"
- ;;
- load) [[ "$3" = "" ]] && uso
- [[ ! -f "${3}.sh" ]] && salir "Burst generation file '${3}.sh' not found!"
- entero $2
- if test "$3" = "data"
- then
- count=$2
- RESTO=$((count%4))
- [[ "$RESTO" != "0" ]] && salir "Data context should load a multiple of 4 (messages generated by data.sh)"
- fi
- count=1
- while test "$count" -le "$2"
- do
- ${3}.sh $count > .${3}.xml
- echo -n "Loading message ${count}; "
- _curl "burst|load|.${3}.xml"
- count=$((count+1))
- done
- ;;
- start) load=$burstMargin__dflt
- [[ "$2" != "" ]] && load=$2
- entero $load
- _curl "burst|start|$load"
- ;;
- pop) release=$burstMargin__dflt
- [[ "$2" != "" ]] && release=$2
- entero $release
- _curl "burst|pop|$release"
- ;;
- push) [[ "$2" = "" ]] && uso
- entero $2
- _curl "burst|push|$2"
- ;;
- stop) _curl "burst|stop"
- ;;
- resume) _curl "burst|push|1"
- ;;
- repeat) repeat=yes
- [[ "$2" != "" ]] && repeat=$2
- _curl "burst|repeat|$repeat"
- ;;
- send) amount=1
- [[ "$2" != "" ]] && amount=$2
- entero $amount
- _curl "burst|send|$amount"
- ;;
- sendXS) [[ "$2" = "" ]] && uso
- limit=$3
- [[ "$limit" = "" ]] && limit=-1
- entero $2
- entero $limit
- TPS=0
- count=0
- amount=1
- echo $2 > .tps
- while test -f .tps
- do
- [[ "$count" = "$limit" ]] && break
- BEFORE_ns=`date +%s%N`
- READ_TPS=`cat .tps`
- # Hot change could make .tps still unavailable:
- [[ "$READ_TPS" = "" ]] && READ_TPS=$TPS
- # Volvemos a calcular medias (REAL_TPS) cada 10 segundos o cuando cambia el TPS en caliente:
- [[ "$READ_TPS" != "$TPS" ]] && { BEGIN_ns=$BEFORE_ns ; count=0 ; }
- [[ $count = $((10*TPS)) ]] && { BEGIN_ns=$BEFORE_ns ; count=0 ; }
- TPS=$READ_TPS
- [[ "$TPS" = "0" ]] && salir "Test stopped due to 0-tps value read"
- # Background:
- _curl "burst|send|$amount" &
- count=$((count+amount))
- AFTER_ns=`date +%s%N`
- # Real tps:
- REAL_TPS=$(calc "1000000000 * $count / ($AFTER_ns - $BEGIN_ns)")
- echo $REAL_TPS > .real_tps
-
- COEF=1
- [[ $(calc "$TPS > $REAL_TPS") = "1" ]] && COEF=$(calc "$REAL_TPS / $TPS")
- K=$(calc "$COEF ^ 10")
- amount=$(calc "scale=0;1/$K")
- usleep $(calc "$K * 1000000/$TPS")
- done
- ;;
- goto) [[ "$2" = "" ]] && uso
- entero $2
- _curl "burst|goto|$2"
- ;;
- look) [[ "$2" = "" ]] && uso
- entero $2
- _curl "burst|look|$2"
- ;;
- *) uso
-esac
-
+++ /dev/null
-#!/bin/bash
-> curl_log.txt
-TRACE="--trace-ascii curl_log.txt"
-SERVER=`cat .httpServer`
-ENTITY=`cat .entity 2>/dev/null`
-# If missing following, 1 is assigned (ENTITY_SS_1 is ENTITY_SS - 1)
-ENTITY_SS=`cat .entityServerSessions 2>/dev/null`
-[[ "$ENTITY_SS" = "" ]] && ENTITY_SS=1
-TARGET=$2
-
-use () {
- echo
- echo
- echo "Use: $0 <hide|show|hidden|shown> \"[<address>:<port>]|[socket id]\""
- echo
- echo "Hides/shows/query hidden state/query shown state, the socket/s provided."
- echo "If missing server (first parameter) all applications sockets will be affected by action."
- echo "If missing socket (second parameter) for specific server, all its sockets will be affected by action."
- echo
- exit
-}
-
-states () {
- echo
- echo "Select option to switch (0 = quit):"
- echo
- option=1
- for i in `echo $ENTITY | sed 's/,/ /g'`
- do
- for j in `seq 0 $ENTITY_SS_1`
- do
- TARGET="${i}|${j}"
- RES=$(curl -m 1 --data "shown|$TARGET" ${SERVER} 2>&1 | tail -1 | grep "true$")
- res=hidden
- [[ "$RES" != "" ]] && res=shown
- echo "${option}. $TARGET ($res)"
- action=show
- [[ "$RES" != "" ]] && action=hide
- echo "curl -m 1 --data \"$action|$TARGET\" ${SERVER}" > .switch_${option}
- chmod a+x .switch_${option}
- option=$((option+1))
- done
- done
- echo
-}
-
-if test "$ENTITY" != ""
-then
- ENTITY_SS_1=$((ENTITY_SS-1))
- while true
- do
- states
- read option
- [[ "$option" = "0" ]] && break
- .switch_${option}
- done
- echo
- echo "Exiting"
- rm .switch_*
- exit
-else
- [[ "$1" = "" ]] && use
-fi
-
-echo
-echo
-operation="$1|$TARGET"
-[[ "$TARGET" = "" ]] && operation="$1"
-curl -m 1 --data "$operation" $TRACE ${SERVER}
-
+++ /dev/null
-#!/bin/bash
-> curl_log.txt
-TRACE="--trace-ascii curl_log.txt"
-SERVER=`cat .httpServer`
-
-use () {
-
- echo "Use: $0 <xml_file>"
- echo
- echo "Creates '<xml_file>.hex' with encoded result."
- echo
- exit
-}
-
-echo
-[[ "$1" = "" ]] && use
-[[ ! -f "$1" ]] && { echo "ERROR: file '$1' not found" ; echo; echo; exit ; }
-echo
-operation="code|$1|${1}.hex"
-curl -m 1 --data "$operation" $TRACE ${SERVER}
-
+++ /dev/null
-#!/bin/bash
-> curl_log.txt
-TRACE="--trace-ascii curl_log.txt"
-SERVER=`cat .httpServer`
-curl -m 1 --data "collect" $TRACE ${SERVER}
-
+++ /dev/null
-<message version="1" name="Credit-Control-Request" p-bit="yes" application-id="4" hop-by-hop-id="__HBH_ETE__" end-by-end-id="__HBH_ETE__">
- <avp name="Session-Id" data="__SID_DI__;__SID_HIGH__;__SID_LOW__;__SID_SUFFIX__"/>
- <avp name="Origin-Host" data="__SID_DI__"/>
- <avp name="Origin-Realm" data="sandvine.com"/>
- <avp name="Destination-Realm" data="telefonica.com.co"/>
- <avp name="Auth-Application-Id" data="4"/>
- <avp name="Service-Context-Id" data="770.32251@3gpp.org"/>
- <avp name="CC-Request-Type" data="1" alias="INITIAL_REQUEST"/>
- <avp name="CC-Request-Number" data="0"/>
- <avp name="User-Name" data="__MSISDN__"/>
- <avp name="Origin-State-Id" data="1339077627"/>
- <avp name="Event-Timestamp" data="__NTPTIMESTAMP__"/>
- <avp name="Subscription-Id">
- <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
- <avp name="Subscription-Id-Data" data="__MSISDN__"/>
- </avp>
- <avp name="Multiple-Services-Indicator" data="1" alias="MULTIPLE_SERVICES_SUPPORTED"/>
- <avp name="User-Equipment-Info">
- <avp name="User-Equipment-Info-Type" data="0" alias="IMEISV"/>
- <avp name="User-Equipment-Info-Value" hex-data="33353430343630343130363438333030"/>
- </avp>
- <avp name="Service-Information">
- <avp name="PS-Information">
- <avp name="3GPP-Charging-Id" data="29"/>
- <avp name="3GPP-PDP-Type" data="0" alias="IPV4"/>
- <avp name="PDP-Address" data="10.193.49.133"/>
- <avp name="3GPP-GPRS-Neg-QoS-Profile" data="05-1b921f7196fefe74fbfefe00"/>
- <avp name="SGSN-Address" data="190.98.183.240"/>
- <avp name="GGSN-Address" data="190.98.183.243"/>
- <avp name="CG-Address" data="10.193.249.1"/>
- <avp name="3GPP-IMSI-MCC-MNC" data="71204"/>
- <avp name="3GPP-GGSN-MCC-MNC" data="71204"/>
- <avp name="3GPP-NSAPI" data="5"/>
- <avp name="Called-Station-Id" data="internet.movistar.ni"/>
- <avp name="3GPP-Selection-Mode" data="0"/>
- <avp name="3GPP-Charging-Characteristics" data="0800"/>
- <avp name="3GPP-SGSN-MCC-MNC" data="33403"/>
- <avp name="3GPP-MS-TimeZone" hex-data="4a00"/>
- <avp name="3GPP-User-Location-Info" hex-data="0117f240a4780218"/>
- <avp name="3GPP-Rat-Type" hex-data="01"/>
- <avp name="PDP-Context-Type" data="0"/>
- </avp>
- </avp>
-</message>
+++ /dev/null
-<message version="1" name="Credit-Control-Request" p-bit="yes" application-id="4" hop-by-hop-id="__HBH_ETE__" end-by-end-id="__HBH_ETE__">
- <avp name="Session-Id" data="__SID_DI__;__SID_HIGH__;__SID_LOW__;__SID_SUFFIX__"/>
- <avp name="Origin-Host" data="__SID_DI__"/>
- <avp name="Origin-Realm" data="sandvine.com"/>
- <avp name="Destination-Realm" data="telefonica.com.co"/>
- <avp name="Auth-Application-Id" data="4"/>
- <avp name="Service-Context-Id" data="770.32251@3gpp.org"/>
- <avp name="CC-Request-Type" data="3" alias="TERMINATION_REQUEST"/>
- <avp name="CC-Request-Number" data="3"/>
- <avp name="Destination-Host" data="mqmty1besdp1.movistar.pa"/>
- <avp name="User-Name" data="__MSISDN__"/>
- <avp name="Origin-State-Id" data="1339077627"/>
- <avp name="Event-Timestamp" data="__NTPTIMESTAMP__"/>
- <avp name="Subscription-Id">
- <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
- <avp name="Subscription-Id-Data" data="__MSISDN__"/>
- </avp>
- <avp name="Termination-Cause" data="1" alias="DIAMETER_LOGOUT"/>
- <avp name="Multiple-Services-Indicator" data="1" alias="MULTIPLE_SERVICES_SUPPORTED"/>
- <avp name="Multiple-Services-Credit-Control">
- <avp name="Used-Service-Unit">
- <avp name="CC-Total-Octets" data="524288"/>
- <avp name="CC-Input-Octets" data="424288"/>
- <avp name="CC-Output-Octets" data="100000"/>
- <avp name="Reporting-Reason" data="2" alias="FINAL"/>
- </avp>
- <avp name="Rating-Group" data="99"/>
- </avp>
- <avp name="User-Equipment-Info">
- <avp name="User-Equipment-Info-Type" data="0" alias="IMEISV"/>
- <avp name="User-Equipment-Info-Value" hex-data="33353430343630343130363438333030"/>
- </avp>
- <avp name="Service-Information">
- <avp name="PS-Information">
- <avp name="3GPP-Charging-Id" data="29"/>
- <avp name="3GPP-PDP-Type" data="0" alias="IPV4"/>
- <avp name="PDP-Address" data="10.193.49.133"/>
- <avp name="3GPP-GPRS-Neg-QoS-Profile" data="05-1b921f7196fefe74fbfefe00"/>
- <avp name="SGSN-Address" data="190.98.183.240"/>
- <avp name="GGSN-Address" data="190.98.183.243"/>
- <avp name="CG-Address" data="10.193.249.1"/>
- <avp name="3GPP-IMSI-MCC-MNC" data="71204"/>
- <avp name="3GPP-GGSN-MCC-MNC" data="71204"/>
- <avp name="3GPP-NSAPI" data="5"/>
- <avp name="Called-Station-Id" data="internet.movistar.ni"/>
- <avp name="3GPP-Session-Stop-Indicator" hex-data="ff"/>
- <avp name="3GPP-Selection-Mode" data="0"/>
- <avp name="3GPP-Charging-Characteristics" data="0800"/>
- <avp name="3GPP-SGSN-MCC-MNC" data="33403"/>
- <avp name="3GPP-MS-TimeZone" hex-data="4a00"/>
- <avp name="3GPP-User-Location-Info" hex-data="0117f240a4780218"/>
- <avp name="3GPP-Rat-Type" hex-data="01"/>
- </avp>
- </avp>
-</message>
+++ /dev/null
-<message version="1" name="Credit-Control-Request" p-bit="yes" application-id="4" hop-by-hop-id="__HBH_ETE__" end-by-end-id="__HBH_ETE__">
- <avp name="Session-Id" data="__SID_DI__;__SID_HIGH__;__SID_LOW__;__SID_SUFFIX__"/>
- <avp name="Origin-Host" data="__SID_DI__"/>
- <avp name="Origin-Realm" data="sandvine.com"/>
- <avp name="Destination-Realm" data="telefonica.com.co"/>
- <avp name="Auth-Application-Id" data="4"/>
- <avp name="Service-Context-Id" data="770.32251@3gpp.org"/>
- <avp name="CC-Request-Type" data="2" alias="UPDATE_REQUEST"/>
- <avp name="CC-Request-Number" data="1"/>
- <avp name="Destination-Host" data="mqmty1besdp1.movistar.pa"/>
- <avp name="Origin-State-Id" data="1339077627"/>
- <avp name="Event-Timestamp" data="__NTPTIMESTAMP__"/>
- <avp name="Subscription-Id">
- <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
- <avp name="Subscription-Id-Data" data="__MSISDN__"/>
- </avp>
- <avp name="Multiple-Services-Indicator" data="1" alias="MULTIPLE_SERVICES_SUPPORTED"/>
- <avp name="Multiple-Services-Credit-Control">
- <avp name="Requested-Service-Unit"/>
- <avp name="Rating-Group" data="99"/>
- </avp>
- <avp name="User-Equipment-Info">
- <avp name="User-Equipment-Info-Type" data="0" alias="IMEISV"/>
- <avp name="User-Equipment-Info-Value" hex-data="33353430343630343130363438333030"/>
- </avp>
- <avp name="Service-Information">
- <avp name="PS-Information">
- <avp name="3GPP-Charging-Id" data="29"/>
- <avp name="3GPP-PDP-Type" data="0" alias="IPV4"/>
- <avp name="PDP-Address" data="10.193.49.133"/>
- <avp name="3GPP-GPRS-Neg-QoS-Profile" data="05-1b921f7196fefe74fbfefe00"/>
- <avp name="SGSN-Address" data="190.98.183.240"/>
- <avp name="GGSN-Address" data="190.98.183.243"/>
- <avp name="CG-Address" data="10.193.249.1"/>
- <avp name="3GPP-IMSI-MCC-MNC" data="71204"/>
- <avp name="3GPP-GGSN-MCC-MNC" data="71204"/>
- <avp name="3GPP-NSAPI" data="5"/>
- <avp name="Called-Station-Id" data="internet.movistar.ni"/>
- <avp name="3GPP-Selection-Mode" data="0"/>
- <avp name="3GPP-Charging-Characteristics" data="0800"/>
- <avp name="3GPP-SGSN-MCC-MNC" data="33403"/>
- <avp name="3GPP-MS-TimeZone" hex-data="4a00"/>
- <avp name="3GPP-User-Location-Info" hex-data="0117f240a4780218"/>
- <avp name="3GPP-Rat-Type" hex-data="01"/>
- </avp>
- </avp>
-</message>
+++ /dev/null
-<message version="1" name="Credit-Control-Request" p-bit="yes" application-id="4" hop-by-hop-id="__HBH_ETE__" end-by-end-id="__HBH_ETE__">
- <avp name="Session-Id" data="__SID_DI__;__SID_HIGH__;__SID_LOW__;__SID_SUFFIX__"/>
- <avp name="Origin-Host" data="__SID_DI__"/>
- <avp name="Origin-Realm" data="sandvine.com"/>
- <avp name="Destination-Realm" data="telefonica.com.co"/>
- <avp name="Auth-Application-Id" data="4"/>
- <avp name="Service-Context-Id" data="770.32251@3gpp.org"/>
- <avp name="CC-Request-Type" data="2" alias="UPDATE_REQUEST"/>
- <avp name="CC-Request-Number" data="2"/>
- <avp name="Destination-Host" data="mqmty1besdp1.movistar.pa"/>
- <avp name="User-Name" data="__MSISDN__"/>
- <avp name="Origin-State-Id" data="1339077627"/>
- <avp name="Event-Timestamp" data="__NTPTIMESTAMP__"/>
- <avp name="Subscription-Id">
- <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
- <avp name="Subscription-Id-Data" data="__MSISDN__"/>
- </avp>
- <avp name="Multiple-Services-Indicator" data="1" alias="MULTIPLE_SERVICES_SUPPORTED"/>
- <avp name="Multiple-Services-Credit-Control">
- <avp name="Requested-Service-Unit"/>
- <avp name="Used-Service-Unit">
- <avp name="CC-Total-Octets" data="524288"/>
- <avp name="CC-Input-Octets" data="224288"/>
- <avp name="CC-Output-Octets" data="300000"/>
- </avp>
- <avp name="Rating-Group" data="99"/>
- </avp>
- <avp name="User-Equipment-Info">
- <avp name="User-Equipment-Info-Type" data="0" alias="IMEISV"/>
- <avp name="User-Equipment-Info-Value" hex-data="33353430343630343130363438333030"/>
- </avp>
- <avp name="Service-Information">
- <avp name="PS-Information">
- <avp name="3GPP-Charging-Id" data="29"/>
- <avp name="3GPP-PDP-Type" data="0" alias="IPV4"/>
- <avp name="PDP-Address" data="10.193.49.133"/>
- <avp name="3GPP-GPRS-Neg-QoS-Profile" data="05-1b921f7196fefe74fbfefe00"/>
- <avp name="SGSN-Address" data="190.98.183.240"/>
- <avp name="GGSN-Address" data="190.98.183.243"/>
- <avp name="CG-Address" data="10.193.249.1"/>
- <avp name="3GPP-IMSI-MCC-MNC" data="71204"/>
- <avp name="3GPP-GGSN-MCC-MNC" data="71204"/>
- <avp name="3GPP-NSAPI" data="5"/>
- <avp name="Called-Station-Id" data="internet.movistar.ni"/>
- <avp name="3GPP-Selection-Mode" data="0"/>
- <avp name="3GPP-Charging-Characteristics" data="0800"/>
- <avp name="3GPP-SGSN-MCC-MNC" data="33403"/>
- <avp name="3GPP-MS-TimeZone" hex-data="4a00"/>
- <avp name="3GPP-User-Location-Info" hex-data="0117f240a4780218"/>
- <avp name="3GPP-Rat-Type" hex-data="01"/>
- </avp>
- </avp>
-</message>
+++ /dev/null
-#!/bin/bash
-
-# Generates DATA burst sequence for provided order number (1: first, 2: second, etc.)
-# We will generate a simple scenario with initial, two updates and termination, that is to say: four messages:
-# 1,2,3,4 5,6,7,8 9,10,11,12 etc.
-#
-# Category = ((Number-1) % 4) + 1 = 1 for initial, 2 for first update, 3 for second update and 4 for termination
-SEQN=$1
-OFFSET=$((SEQN-1))
-CAT=$((OFFSET%4 + 1))
-
-salir () {
- echo
- echo $1
- echo
- exit
-}
-
-check_template () {
- [[ ! -f $1 ]] && salir "Template file ($1) not found!"
-}
-
-parse () {
- cat $1 | sed 's/__HBH_ETE__/'$HBH_ETE'/g' | sed 's/__SID_SUFFIX__/'$SID_SUFFIX'/' \
- | sed 's/__MSISDN__/'$MSISDN'/' | sed 's/__NTPTIMESTAMP__/'$NTP'/' \
- | sed 's/__SID_DI__/'$SID_DI'/' | sed 's/__SID_HIGH__/'$SID_HIGH'/' | sed 's/__SID_LOW__/'$SI_LOW'/'
-}
-
-
-[[ "$SEQN" = "" ]] && salir "Use: $0 <sequence number: 1..N>"
-check_template data-initial.msk
-check_template data-update1.msk
-check_template data-update2.msk
-check_template data-termination.msk
-
-# Session-Id: '<DiameterIdentity>;<high 32 bits>;<low 32 bits>[;<optional value>="">]'
-# <avp name="Session-Id" data="module-2.PTS2-BOG.sandvine.com;1287115741;0;49"/>
-# We will sequence the otional value with __SID_SUFFIX__, low and high will be constant.
-
-# Sequence values at templates:
-# __HBH_ETE__: 1, 3, 5, etc. (hop-by-hop and end-to-end)
-# __SID_SUFFIX__: It could be MSISDN, but we put OFFSET (0, 1, 2, 3, etc.). It's the Session-Id optional part.
-# __MSISDN__: 50583211675, 50583211676, 50583211677, etc. Used for User-Name and Subscription-Id-Data
-# __NTPTIMESTAMP__: Four values for initial, update1, update2 and termination: 3548171033, 3548171136 (103+), 3548171136(idem), 3548171524(388+)
-# This initial time (aproximately 8 Jun 2012 at 19:00).
-CUARTO=$((OFFSET/4))
-HBH_ETE=$((1 + 2*OFFSET))
-SID_SUFFIX=$CUARTO
-# Example if you want to fix to two sockets (-sessionIdPartForClientSocketIdSelection must be 'optional'): SID_SUFFIX=$((CUARTO%2))
-MSISDN=$((50583211675+CUARTO))
-NTP=$((3548171033+CUARTO))
-
-# Helpers to guide derivery (fixed at the moment)
-# __SID_DI__: Session-Id diameter identity
-# __SID_HIGH__: Session-Id high part
-# __SID_LOW__: Session-Id low part
-SID_DI=module-2.PTS2-BOG.sandvine.com
-SID_HIGH=1287115741
-SI_LOW=0
-
-case $CAT in
- 1) parse data-initial.msk
- ;;
- 2) NTP=$((NTP+103))
- parse data-update1.msk
- ;;
- 3) NTP=$((NTP+103))
- parse data-update2.msk
- ;;
- 4) NTP=$((NTP+491))
- parse data-termination.msk
- ;;
-esac
-
+++ /dev/null
-#!/bin/bash
-> curl_log.txt
-TRACE="--trace-ascii curl_log.txt"
-SERVER=`cat .httpServer`
-
-use () {
-
- echo "Use: $0 <hex_file>"
- echo
- echo "Creates '<hex_file>.xml' with decoded result."
- echo
- exit
-}
-
-echo
-[[ "$1" = "" ]] && use
-[[ ! -f "$1" ]] && { echo "ERROR: file '$1' not found" ; echo; echo; exit ; }
-echo
-operation="decode|$1|${1}.xml"
-curl -m 1 --data "$operation" $TRACE ${SERVER}
-
+++ /dev/null
-#!/bin/bash
-> curl_log.txt
-TRACE="--trace-ascii curl_log.txt"
-SERVER=`cat .httpServer`
-
-use () {
-
- echo "Use: $0 <integer>"
- echo
- echo "Updates the maximum number of accepted connections over diameter server socket."
- echo
- exit
-}
-
-echo
-[[ "$1" = "" ]] && use
-echo
-operation="diameterServerSessions|$1"
-curl -m 1 --data "$operation" $TRACE ${SERVER}
-
+++ /dev/null
-#!/bin/bash
-> curl_log.txt
-TRACE="--trace-ascii curl_log.txt"
-SERVER=`cat .httpServer`
-curl -m 1 --data "help" $TRACE ${SERVER}
-
+++ /dev/null
-#!/bin/bash
-> curl_log.txt
-TRACE="--trace-ascii curl_log.txt"
-SERVER=`cat .httpServer`
-
-use () {
-
- echo "Use: $0 <xml_file>"
- echo
- echo "Load xml file and show on stdout again."
- echo "It is useful to test xml loader and xml viewer, but also for show aliases and,"
- echo "if '-ignoreFlags' commandline option is missing, for flag coherence checking."
- echo
- exit
-}
-
-echo
-[[ "$1" = "" ]] && use
-[[ ! -f "$1" ]] && { echo "ERROR: file '$1' not found" ; echo; echo; exit ; }
-echo
-operation="loadxml|$1"
-curl -m 1 --data "$operation" $TRACE ${SERVER}
-
+++ /dev/null
-#!/bin/bash
-
-# Remove logs:
-rm *.log* *.csv 2>/dev/null
-
-# Server sockets:
-httpServer_dflt=`cat .httpServer 2>/dev/null`
-diameterServer_dflt=`cat .diameterServer 2>/dev/null`
-diameterServerSessions_dflt=`cat .diameterServerSessions 2>/dev/null`
-
-# Client sockets:
-entity_dflt=`cat .entity 2>/dev/null`
-entityServerSessions_dflt=`cat .entityServerSessions 2>/dev/null`
-
-# Stack:
-dictionary_dflt=`cat .dictionary 2>/dev/null`
-
-echo
-echo
-# If all have values:
-if [ "$httpServer_dflt" != "" -a "$diameterServer_dflt" != "" -a "$diameterServerSessions_dflt" != "" -a \
- "$entity_dflt" != "" -a "$entityServerSessions_dflt" != "" -a \
- "$dictionary_dflt" != "" ]
-then
- echo "Do you wish to answer wizard commandline configuration ? (y/n) [n]:"
- read wizard
- [ "$wizard" = "" ] && wizard=n
- [ "$wizard" = "n" ] && exit
-fi
-
-# DEFAULTS
-[ "$httpServer_dflt" = "" ] && httpServer_dflt="localhost:9000"
-[ "$diameterServer_dflt" = "" ] && diameterServer_dflt="localhost:3868"
-[ "$diameterServerSessions_dflt" = "" ] && diameterServerSessions_dflt=1
-[ "$entity_dflt" = "" ] && entity_dflt="localhost:4000,localhost:4001"
-[ "$entityServerSessions_dflt" = "" ] && entityServerSessions_dflt=0
-[ "$dictionary_dflt" = "" ] && dictionary_dflt=dictionary.xml
-
-
-# Wizard
-echo "HTTP Management interface address (using i.e. curl tool) as <ip|hostname>:<port> socket literal [$httpServer_dflt]:"
-read httpServer
-[ "$httpServer" = "" ] && httpServer=$httpServer_dflt
-
-echo "Diameter dictionary: you could use '/opt/bin/anna/example_diameter_stackManagement' tool in order to build"
-echo " autonomous dictionaries for any kind of application. The key is to concatenate xml contents (ietf, 3gpp,"
-echo " vendor-specific, etc.). See 'example/diameter/stackManagement/self_ruling_setups.sh' for this."
-echo
-echo "This launcher can also join them providing a comma-separated list (dictionaries available on ./stack)."
-echo "By default, a QoS Application setup is suggested. Input the desired configuration instead, or press ENTER:"
-echo
-echo " [$dictionary_dflt]:"
-read dictionary
-[ "$dictionary" = "" ] && dictionary=$dictionary_dflt
-
-# As server:
-echo "Diameter own server available connections (0: diameter server disabled) [$diameterServerSessions_dflt]:"
-read diameterServerSessions
-[ "$diameterServerSessions" = "" ] && diameterServerSessions=$diameterServerSessions_dflt
-
-diameterServer=
-if test "$diameterServerSessions" != "0"
-then
- echo "Diameter own server address as <ip|hostname>:<port> socket literal [$diameterServer_dflt]:"
- read diameterServer
-fi
-[ "$diameterServer" = "" ] && diameterServer=$diameterServer_dflt
-
-# As client:
-echo "Diameter entity server sessions (0: diameter entity disabled) [$entityServerSessions_dflt]:"
-read entityServerSessions
-[ "$entityServerSessions" = "" ] && entityServerSessions=$entityServerSessions_dflt
-
-entity=
-if test "$entityServerSessions" != "0"
-then
- echo "Target diameter entity (pipe-separated <ip|hostname>:<port> socket literal list) ["$entity_dflt"]:"
- read entity
-fi
-[ "$entity" = "" ] && entity="$entity_dflt"
-
-# Configure:
-echo $httpServer > .httpServer
-echo $dictionary > .dictionary
-echo $diameterServer > .diameterServer
-echo $diameterServerSessions > .diameterServerSessions
-echo $entity > .entity
-echo $entityServerSessions > .entityServerSessions
-
-echo
-echo
-
+++ /dev/null
-#!/bin/bash
-> curl_log.txt
-TRACE="--trace-ascii curl_log.txt"
-SERVER=`cat .httpServer`
-
-use () {
-
- echo "Use: $0 <xml_file> [2c]"
- echo
- echo "Sends 'xml_file' to the diameter server or to the client when '2c' parameter is provided."
- echo
- exit
-}
-
-echo
-[[ "$1" = "" ]] && use
-[[ ! -f "$1" ]] && { echo "ERROR: file '$1' not found" ; echo; echo; exit ; }
-echo
-operation="sendxml|$1"
-[[ "$2" = "2c" ]] && operation="sendxml2c|$1"
-
-curl -m 1 --data "$operation" $TRACE ${SERVER}
-
+++ /dev/null
-<message version="1" name="Credit-Control-Request" p-bit="yes" application-id="4" hop-by-hop-id="__HBH_ETE__" end-by-end-id="__HBH_ETE__">
- <avp name="Session-Id" data="gbg.acision.com;421411;__SID_LOW__"/>
- <avp name="Origin-Host" data="gbg.acision.com"/>
- <avp name="Origin-Realm" data="SMSC.orig.OCS2.o2online.de"/>
- <avp name="Destination-Realm" data="SMSC.dest.OCS1.o2online.de"/>
- <avp name="Auth-Application-Id" data="4"/>
- <avp name="Service-Context-Id" data="8.6.0.07.262.8.32274@3gpp.org"/>
- <avp name="CC-Request-Type" data="4" alias="EVENT_REQUEST"/>
- <avp name="CC-Request-Number" data="1"/>
- <avp name="Destination-Host" data="OCS1"/>
- <avp name="Event-Timestamp" data="1"/>
- <avp name="Subscription-Id">
- <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
- <avp name="Subscription-Id-Data" data="__MSISDN__"/>
- </avp>
- <avp name="Requested-Action" data="0" alias="DIRECT_DEBITING"/>
- <avp name="Multiple-Services-Indicator" data="0" alias="MULTIPLE_SERVICES_NOT_SUPPORTED"/>
- <avp name="Multiple-Services-Credit-Control">
- <avp name="Requested-Service-Unit">
- <avp name="CC-Service-Specific-Units" data="1"/>
- </avp>
- <avp name="Service-Identifier" data="1"/>
- </avp>
- <avp name="Service-Information">
- <avp name="MMS-Information">
- <avp name="Originator-Address">
- <avp name="Address-Type" data="1" alias="MSISDN"/>
- <avp name="Address-Data" data="__MSISDN__"/>
- <avp name="Address-Domain">
- <avp name="3GPP-IMSI-MCC-MNC" data="26207"/>
- </avp>
- </avp>
- <avp name="Originator-Address">
- <avp name="Address-Type" data="6" alias="Other"/>
- <avp name="Address-Data" data="__IMSI__"/>
- </avp>
- <avp name="Submission-Time" data="3486294858"/>
- <avp name="Message-Size" data="4"/>
- </avp>
- <avp name="SMS-Information">
- <avp name="SMS-Node" data="3" alias="SMS-SC"/>
- <avp name="Client-Address" data="8|541760000405"/>
- <avp name="Originator-SCCP-Address" data="8|541760000005"/>
- <avp name="Originator-Received-Address">
- <avp name="Address-Type" data="1" alias="MSISDN"/>
- <avp name="Address-Data" data="__MSISDN__"/>
- <avp name="Address-Domain">
- <avp name="3GPP-IMSI-MCC-MNC" data="26207"/>
- </avp>
- </avp>
- <avp name="Recipient-Info">
- <avp name="Destination-Interface">
- <avp name="Interface-Id" data="5417607020601"/>
- <avp name="Interface-Type" data="2" alias="MOBILE_TERMINATING"/>
- </avp>
- <avp name="Recipient-Address">
- <avp name="Address-Type" data="1" alias="MSISDN"/>
- <avp name="Address-Data" data="5417607020601"/>
- <avp name="Address-Domain">
- <avp name="3GPP-IMSI-MCC-MNC" data="26207"/>
- </avp>
- </avp>
- <avp name="Recipient-Address">
- <avp name="Address-Type" data="6" alias="Other"/>
- <avp name="Address-Data" data="262074900005771"/>
- </avp>
- <avp name="Recipient-Received-Address">
- <avp name="Address-Type" data="1" alias="MSISDN"/>
- <avp name="Address-Data" data="5417607020601"/>
- <avp name="Address-Domain">
- <avp name="3GPP-IMSI-MCC-MNC" data="26207"/>
- </avp>
- </avp>
- <avp name="Recipient-SCCP-Address" data="8|541760000005"/>
- </avp>
- <avp name="SMSC-Address" data="8|541760000405"/>
- <avp name="Data-Coding-Scheme" data="0"/>
- <avp name="SM-Message-Type" data="0" alias="SUBMISSION"/>
- <avp name="Originator-Interface">
- <avp name="Interface-Id" data="262074900005771"/>
- <avp name="Interface-Type" data="1" alias="MOBILE_ORIGINATING"/>
- </avp>
- <avp name="Number-Of-Messages-Sent" data="1"/>
- </avp>
- </avp>
-<!--
- El Correlation Id no se usa en el Sertamsjt
- <avp name="CC-Correlation-Id" data="gbg.acision.com;421411;__SID_LOW__"/>
--->
-</message>
+++ /dev/null
-#!/bin/bash
-
-# Generates SMS burst sequence for provided order number (1: first, 2: second, etc.)
-SEQN=$1
-
-salir () {
- echo
- echo $1
- echo
- exit
-}
-
-[[ "$SEQN" = "" ]] && salir "Use: $0 <sequence number: 1..N>"
-[[ ! -f sms.msk ]] && salir "Template file (sms.msk) not found!"
-
-# Sequence values at template sms.msk:
-# __HBH_ETE__: 1, 3, 5, etc. (hop-by-hop and end-to-end)
-# __SID_LOW__: 1000, 1001, 1002, etc. (Session-Id sequence append)
-# __MSISDN__: 5555100000, 5555100001, 5555100002, etc. (First and Third Address-Data)
-# __IMSI__: 262075555100000, 262075555100001, 262075555100002, etc. (Second Address-Data)
-
-OFFSET=$((SEQN-1))
-
-HBH_ETE=$((1 + 2*OFFSET))
-SID_LOW=$((1000+OFFSET))
-MSISDN=$((5555100000+OFFSET))
-IMSI=$((262075555100000+OFFSET))
-
-cat sms.msk | sed 's/__HBH_ETE__/'$HBH_ETE'/g' | sed 's/__SID_LOW__/'$SID_LOW'/' \
- | sed 's/__MSISDN__/'$MSISDN'/' | sed 's/__IMSI__/'$IMSI'/'
+++ /dev/null
-ABOUT CONTENT
--------------
-Template for xml messages (message.dtd) and dictionaries (dictionary.dtd) are informative, not
-actually required by process. They are located at './DTDs'. Stacks are available at './stacks'.
-There are also some stuff (hex/xml examples, etc.) which could be useful.
-
-Firstly you have to configure this directory in order to choose the type of launcher which will
-be preconfigured for your basic needs: client, server, balancer (proxy) and dummy process (this
-last is used for code/encode and does not launch any communication interface).
-
-If you are going to launch different processes, we recommend to clone this whole directory into
-another one (call it 'ADL-client', 'ADL-server_2', 'Diameter_proxy', or whatever you want), and
-then configure it again.
-
-Execute './configure.sh' and follow the intructions. You can call this several times, but the
-last configuration will be the one which prevails.
-
-STARTING THE PROCESS
---------------------
-After configuring the ADL execution context, a new script has been created: 'run.sh'.
-You can manually edit such script adding parameters as '-trace debug' to get complete traces,
-or adapt the communication endpoints for your environment.
-
-Launch the executable process without arguments to see a complete command-line help.
-Don't be scared. There are plenty of possibilities but the 'run.sh' script has been prepared
-for the type of launcher you wanted.
-
-OPERATION
----------
-Management interface for lite version is based on SIGUSR2 signal caugh. Use './operation.sh'
-script to send any operation to the process. Ask for help with that script to see all the
-operations supported.
-
+++ /dev/null
-#!/bin/bash
-
-#############
-# VARIABLES #
-#############
-
-# Diameter dictionary:
-STD_DICTIONARY=stacks/avps_etsi.xml,stacks/avps_ietf.xml,stacks/avps_tgpp.xml,stacks/commands_baseProtocol.xml
-APP_DICTIONARY=stacks/commands_qosControl.xml
-DICTIONARY=$STD_DICTIONARY,$APP_DICTIONARY
-# Perhaps the stack is not fully defined:
-#KINDNESS=-ignoreErrors
-# But we prefer stack to generate Failed-AVP automatically:
-KINDNESS=
-
-# Communication endpoints:
-LOCAL_STANDARD_ENDPOINT=localhost:3868
-EXAMPLE_ENTITY_4_BALANCER=192.168.12.11:3868,192.168.12.21:3868
-CONNS=10
-
-# General
-EXE_BN=ADL-launcher
-
-# Tracing:
-TRACING="-cntDir counters"
-# need detailed traces ?:
-#TRACING="$TRACING -trace debug"
-
-#############
-# FUNCTIONS #
-#############
-
-_exit () {
- echo
- echo $1
- echo
- exit 1
-}
-
-# $1: process name
-createRunScript () {
-
- cat << EOF > run.sh
-#!/bin/bash
-cd \`dirname \$0\`
-STARTED=\`pgrep $1 2>/dev/null\`
-[ \$? -eq 0 ] && { echo "Already started!"; echo "\$STARTED" ; exit 1 ; }
-0> launcher.traces
-rm -f counters/*
-# Execution line:
-./$@ &
-echo \$! > .pid
-EOF
-
- chmod a+x run.sh
-}
-
-# $1: input option (c, s, b, d)
-# Retuns the type of launcher logical name for the input option
-get_tol () {
- [ "$1" = "c" ] && echo client
- [ "$1" = "s" ] && echo server
- [ "$1" = "b" ] && echo balancer
- [ "$1" = "d" ] && echo dummy
-}
-
-#############
-# EXECUTION #
-#############
-cd `dirname $0`
-SCR_DIR=`pwd`
-echo
-echo
-echo "Configure a (c)lient, (s)erver, (b)alancer or (d)ummy [c]:"
-read option
-[ "$option" = "" ] && option=c
-tol=$(get_tol $option)
-[ "$tol" = "" ] && _exit "Option '$option' not implemented !!"
-
-# Run script:
-EXE_LINK=ADL-$tol
-ln -sf $EXE_BN $EXE_LINK
-
-case $tol in
-
- client)
- ENTITY=$LOCAL_STANDARD_ENDPOINT
- createRunScript $EXE_LINK -dictionary $DICTIONARY -entity $ENTITY -entityServerSessions $CONNS -diameterServerSessions 0 $KINDNESS $TRACING &
- ;;
-
- server)
- SERVER=$LOCAL_STANDARD_ENDPOINT
- createRunScript $EXE_LINK -dictionary $DICTIONARY -diameterServer $SERVER -diameterServerSessions $CONNS -entityServerSessions 0 $KINDNESS $TRACING &
- ;;
-
- balancer)
- SERVER=$LOCAL_STANDARD_ENDPOINT
- ENTITY=$EXAMPLE_ENTITY_4_BALANCER
- createRunScript $EXE_LINK -dictionary $DICTIONARY -entity $ENTITY -entityServerSessions $CONNS -diameterServer $SERVER -diameterServerSessions $CONNS -balance $KINDNESS $TRACING &
- ;;
-
- dummy)
- createRunScript $EXE_LINK -dictionary $DICTIONARY -entityServerSessions 0 -diameterServerSessions 0 $KINDNESS $TRACING &
- ;;
-
-esac
-
-echo "Created 'run.sh' script !"
-echo
+++ /dev/null
-01000150c000010901000014000000000000000000000107400000246f6373333b313333323737343433303b313b31333332373734343330000001024000000c01000014000001084000000c4f435333000001284000000c4f4353330000011b4000000c4f435333000001254000000c4f435333000001f8c000000f000028af3132320000000205c000006c000028af00000206c0000010000028af00000000000001f8c000000f000028af3132320000000204c0000010000028af0000007f00000203c0000010000028af00000085000001ffc0000010000028af00000002000001ca80000010000032db000000000000020fc0000010000028af00000000000001bb40000021000001c24000000c00000000000001bc4000001136323630333730393900000000000008400000133139322e3136382e302e31000000001e400000145741502e4d4f564953544152
+++ /dev/null
-01000150c000010901000014000000000000000000000107400000246f6373333b313333323737343433303b313b31333332373734343330000001024000000c01000014000001084000000c4f435333000001284000000c4f4353330000011b4000000c4f435333000001254000000c4f435333000001f8c000000f000028af3132320000000205c000006c000028af00000206c0000010000028af00000000000001f8c000000f000028af3132320000000204c0000010000028af0000007f00000203c0000010000028af00000085000001ffc0000010000028af00000002000001ca80000010000032db000000000000020fc0000010000028af00000000000001bb40000028000001c24000000c00000000000001bc4000001136323630333730393900000000000008400000133139322e3136382e302e31000000001e400000145741502e4d4f564953544152
+++ /dev/null
-0100017cc000010901000014000000000000000000000107400000246f6373333b313333323737343433303b313b31333332373734343330000001024000000c01000014000001084000000c4f435333000001284000000c4f4353330000011b4000000c4f435333000001254000000c4f435333000001f8c000000f000028af3132320000000205c0000098000028af00000206c0000010000028af0000000000000207c000002c000028af000001fdc0000010000028af00000037000001ffc000000a000028af00000000000001f8c000000f000028af3132320000000204c0000010000028af0000007f00000203c0000010000028af00000085000001ffc0000010000028af00000002000001ca80000010000032db000000000000020fc0000010000028af00000000000001bb40000028000001c24000000c00000000000001bc4000001136323630333730393900000000000008000000133139322e3136382e302e31000000001e000000145741502e4d4f564953544152
+++ /dev/null
-0100017cc000010901000014000000000000000000000107400000246f6373333b313333323737343433303b313b31333332373734343330000001024000000c01000014000001084000000c4f435333000001284000000c4f4353330000011b4000000c4f435333000001254000000c4f435333000001f8c000000f000028af3132320000000205c0000098000028af00000206c0000010000028af0000000000000207c000002c000028af000001fdc0000010000028af00000037000001ffc0000010000028af00000010000001f8c000000f000028af3132320000000204c0000010000028af0000007f00000203c0000010000028af00000085000001ffc0000010000028af00000002000001ca80000010000032db000000000000020fc0000010000028af00000000000001bb40000028000001c24000000c00000000000001bc4000001136323630333730393900000000000008000000133139322e3136382e302e31000000001e000000145741502e4d4f564953544152
+++ /dev/null
-Bad messages:
-
-aar-bad.hex: comes from ../xml_examples/aar.xml
- Consists in a deliberated bad length encoded on grouped Subscription-Id length field (not multiple of 4).
-
-aar2-bad.hex: comes from ../xml_examples/aar2.xml
- Consists in a deliberated bad length encoded on enumerated Flow-Status avp 2-level nested inside Media-Component-Description:
- -> Media-Component-Description (grouped)
- -> Media-Sub-Component (grouped)
- -> Flow-Status (enumerated)
-
-aar3-bad.hex: comes from ../xml_examples/aar2.xml
- Consists in a deliberated bad value (16) encoded on enumerated Flow-Status avp (range 0-15) 2-level nested inside Media-Component-Description:
- -> Media-Component-Description (grouped)
- -> Media-Sub-Component (grouped)
- -> Flow-Status (enumerated)
+++ /dev/null
-0100018c4000011001000016ff7f245e9b81ce71000001074000003f63302d31302d37302d3233382d37342d7735703176657067312e766570632e6572696373736f6e2e73653b313430323932373534343b33000000010c4000000c000007d10000010840000019657063322e6570637265616c6d2e636f6d00000000000128400000146570637265616c6d2e636f6d000001026000000c01000016000001a06000000c000000010000019f6000000c00000000000003f8c000002c000028af00000410c0000010000028af004e200000000411c0000010000028af0007d00000000419c0000058000028af00000404c0000010000028af000000060000040ac000003c000028af00000416c0000010000028af000000030000041780000010000028af000000010000041880000010000028af000000000000027480000038000028af0000010a4000000c000028af0000027580000010000028af000000010000027680000010000028af00000003000003ffc0000010000028af00000002000001164000000c00000005
+++ /dev/null
-010002e8c000011001000016ff7f245e9b81ce71000001074000003f63302d31302d37302d3233382d37342d7735703176657067312e766570632e6572696373736f6e2e73653b313430323932373534343b3300000001026000000c01000016000001084000003263302d31302d37302d3233382d37342d7735703176657067312e766570632e6572696373736f6e2e736500000000012840000018766570632e6572696373736f6e2e73650000011b600000146570637265616c6d2e636f6d000001a06000000c000000010000019f6000000c0000000000000017c000000e000028af80010000000001166000000c00000000000001bb60000028000001c26000000c00000000000001bc60000013343637303139343034313800000000086000000c0a46ee6200000403c0000010000028af0000000500000015e000000d000028af060000000000040880000010000028af000003ec000001ca6000002c000001cb2000000c00000000000001cc2000001833353734373330343030363632383030000003f8c000002c000028af0000041080000010000028af08f0d1800000041180000010000028af02faf0800000041980000058000028af00000404c0000010000028af000000090000040ac000003c000028af0000041680000010000028af000000020000041780000010000028af000000010000041880000010000028af0000000000000012e0000011000028af32343039390000000000041a80000012000028af00010a46ee3a000000000016c0000019000028af8242f099006742f0990186a4010000000000001e6000000d7665706731000000000003e8c0000010000028af0000000000000400c0000010000028af00000001000001f5c0000012000028af00010a46ee3a0000000003fec0000020000028af000001f7c0000013000028af34383030303438000000027480000038000028af0000010a4000000c000028af0000027580000010000028af000000010000027680000010000028af00000003
+++ /dev/null
-#!/bin/bash
-
-#############
-# FUNCTIONS #
-#############
-_exit () {
- echo
- echo -e $1
- echo
- exit 1
-}
-
-#############
-# EXECUTION #
-#############
-cd `dirname $0`
-echo
-# Get the PID:
-[ ! -f .pid ] && _exit "Can't found '`pwd`/.pid'.\nTry to pgrep your process name and dump pid to that file."
-PID=`cat .pid`
-
-# Send operation:
-[ "$1" = "" ] && _exit "Use: $0 <operation string>; i.e.: $0 help"
-echo $1 > sigusr2.tasks.input
-kill -s SIGUSR2 $PID
-
-sleep 1
-echo
-echo
-echo "You could see results on '`pwd`/sigusr2.tasks.output' file."
-echo
-echo
-
+++ /dev/null
-<message version="1" name="AA-Request" p-bit="yes" application-id="16777236" hop-by-hop-id="0" end-by-end-id="0">
- <avp name="Session-Id" data="ocs3;1332774430;1;1332774430"/>
- <avp name="Auth-Application-Id" data="16777236"/>
- <avp name="Origin-Host" data="OCS3"/>
- <avp name="Origin-Realm" data="OCS3"/>
- <avp name="Destination-Realm" data="OCS3"/>
- <avp name="Destination-Host" data="OCS3"/>
- <avp name="AF-Application-Identifier" hex-data="313232"/>
- <avp name="Media-Component-Description">
- <avp name="Media-Component-Number" data="0"/>
- <avp name="AF-Application-Identifier" hex-data="313232"/>
- <avp name="Max-Requested-Bandwidth-UL" data="127"/>
- <avp name="Max-Requested-Bandwidth-DL" data="133"/>
- <avp name="Flow-Status" data="2" alias="ENABLED"/>
- <avp name="Reservation-Priority" data="0" alias="DEFAULT"/>
- </avp>
- <avp name="Service-Info-Status" data="0" alias="FINAL_SERVICE_INFORMATION"/>
- <avp name="Subscription-Id">
- <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
- <avp name="Subscription-Id-Data" data="626037099"/>
- </avp>
- <avp name="Framed-IP-Address" hex-data="3139322e3136382e302e31"/>
- <avp name="Called-Station-Id" data="WAP.MOVISTAR"/>
-</message>
+++ /dev/null
-<message version="1" name="AA-Request" p-bit="yes" application-id="16777236" hop-by-hop-id="0" end-by-end-id="0">
- <avp name="Session-Id" data="ocs3;1332774430;1;1332774430"/>
- <avp name="Auth-Application-Id" data="16777236"/>
- <avp name="Origin-Host" data="OCS3"/>
- <avp name="Origin-Realm" data="OCS3"/>
- <avp name="Destination-Realm" data="OCS3"/>
- <avp name="Destination-Host" data="OCS3"/>
- <avp name="AF-Application-Identifier" hex-data="313232"/>
- <avp name="Media-Component-Description">
- <avp name="Media-Component-Number" data="0"/>
- <avp name="Media-Sub-Component">
- <avp name="Flow-Number" data="55"/>
- <avp name="Flow-Status" data="0" alias="ENABLED-UPLINK"/>
- </avp>
- <avp name="AF-Application-Identifier" hex-data="313232"/>
- <avp name="Max-Requested-Bandwidth-UL" data="127"/>
- <avp name="Max-Requested-Bandwidth-DL" data="133"/>
- <avp name="Flow-Status" data="2" alias="ENABLED"/>
- <avp name="Reservation-Priority" data="0" alias="DEFAULT"/>
- </avp>
- <avp name="Service-Info-Status" data="0" alias="FINAL_SERVICE_INFORMATION"/>
- <avp name="Subscription-Id">
- <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
- <avp name="Subscription-Id-Data" data="626037099"/>
- </avp>
- <avp name="Framed-IP-Address" hex-data="3139322e3136382e302e31"/>
- <avp name="Called-Station-Id" data="WAP.MOVISTAR"/>
-</message>
+++ /dev/null
-<message version="1" name="Credit-Control-Request" p-bit="yes" application-id="4" hop-by-hop-id="1" end-by-end-id="1">
- <avp name="Session-Id" data="module-2.PTS2-BOG.sandvine.com;1287115741;0;0"/>
- <avp name="Origin-Host" data="module-2.PTS2-BOG.sandvine.com"/>
- <avp name="Origin-Realm" data="sandvine.com"/>
- <avp name="Destination-Realm" data="telefonica.com.co"/>
- <avp name="Auth-Application-Id" data="4"/>
- <avp name="Service-Context-Id" data="770.32251@3gpp.org"/>
- <avp name="CC-Request-Type" data="1" alias="INITIAL_REQUEST"/>
- <avp name="CC-Request-Number" data="0"/>
- <avp name="User-Name" data="50583211675"/>
- <avp name="Origin-State-Id" data="1339077627"/>
- <avp name="Event-Timestamp" data="3548171033"/>
- <avp name="Subscription-Id">
- <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
- <avp name="Subscription-Id-Data" data="50583211675"/>
- </avp>
- <avp name="Multiple-Services-Indicator" data="1" alias="MULTIPLE_SERVICES_SUPPORTED"/>
- <avp name="User-Equipment-Info">
- <avp name="User-Equipment-Info-Type" data="0" alias="IMEISV"/>
- <avp name="User-Equipment-Info-Value" hex-data="33353430343630343130363438333030"/>
- </avp>
- <avp name="Service-Information">
- <avp name="PS-Information">
- <avp name="3GPP-Charging-Id" data="29"/>
- <avp name="3GPP-PDP-Type" data="0" alias="IPV4"/>
- <avp name="PDP-Address" data="10.193.49.133"/>
- <avp name="3GPP-GPRS-Neg-QoS-Profile" data="05-1b921f7196fefe74fbfefe00"/>
- <avp name="SGSN-Address" data="190.98.183.240"/>
- <avp name="GGSN-Address" data="190.98.183.243"/>
- <avp name="CG-Address" data="10.193.249.1"/>
- <avp name="3GPP-IMSI-MCC-MNC" data="71204"/>
- <avp name="3GPP-GGSN-MCC-MNC" data="71204"/>
- <avp name="3GPP-NSAPI" data="5"/>
- <avp name="Called-Station-Id" data="internet.movistar.ni"/>
- <avp name="3GPP-Selection-Mode" data="0"/>
- <avp name="3GPP-Charging-Characteristics" data="0800"/>
- <avp name="3GPP-SGSN-MCC-MNC" data="33403"/>
- <avp name="3GPP-MS-TimeZone" hex-data="4a00"/>
- <avp name="3GPP-User-Location-Info" hex-data="0117f240a4780218"/>
- <avp name="3GPP-Rat-Type" hex-data="01"/>
- <avp name="PDP-Context-Type" data="0"/>
- </avp>
- </avp>
-</message>
+++ /dev/null
-ABOUT CONTENT
--------------
-Template for xml messages (message.dtd) and dictionaries (dictionary.dtd) are informative, not
-actually required by process. They are located at './DTDs'. Stacks are available at './stacks'.
-There are also some stuff (hex/xml examples, etc.) which could be useful.
-
-The directory 'tests' contains resources to create FT test cases. The script 'common.sh' implement
-a basic scheduler to launch a request to the server, waits for incoming activity, retrieve the
-answer received and match such message with certain criteria. Execute 'case_1.sh' as example.
-
-An advanced FT test framework involves the use of the ANNA::diameter API in an ad-hoc diameter
-client executable (for example we could define an incoming handler in different libraries which
-represent different test cases, linking them to a common simple diameter client agent). But with
-this simple scripts we could do something valid to start with.
-
-STARTING THE PROCESS
---------------------
-Launch the executable process without arguments to see a complete command-line help.
-Don't be scared. There are plenty of possibilities but the 'run.sh' script has been prepared
-for the type of launcher you wanted.
-
-OPERATION
----------
-Management interface for this version is based on SIGUSR2 signal caugh. Use './operation.sh'
-script to send any operation to the process. Ask for help with that script to see all the
-operations supported.
-
+++ /dev/null
--dictionary `grep -v ^# .dictionary`
--entity `grep -v ^# .entity`
--entityServerSessions `grep -v ^# .entityServerSessions`
--splitLog
+++ /dev/null
-../basic/hex_examples
\ No newline at end of file
+++ /dev/null
-../basic/operation.sh
\ No newline at end of file
+++ /dev/null
-#!/bin/bash
-
-# Remove logs:
-rm *.log* *.csv 2>/dev/null
-
-# Client sockets:
-entity_dflt=`cat .entity 2>/dev/null`
-entityServerSessions_dflt=`cat .entityServerSessions 2>/dev/null`
-
-# Stack:
-dictionary_dflt=`cat .dictionary 2>/dev/null`
-
-echo
-echo
-# If all have values:
-if [ "$entity_dflt" != "" -a "$entityServerSessions_dflt" != "" -a "$dictionary_dflt" != "" ]
-then
- echo "Do you wish to answer wizard commandline configuration ? (y/n) [n]:"
- read wizard
- [ "$wizard" = "" ] && wizard=n
- [ "$wizard" = "n" ] && exit
-fi
-
-# DEFAULTS
-#[ "$entity_dflt" = "" ] && entity_dflt="192.168.12.11:3868,192.168.12.21:3868"
-[ "$entity_dflt" = "" ] && entity_dflt="localhost:3868"
-[ "$entityServerSessions_dflt" = "" ] && entityServerSessions_dflt=10
-[ "$dictionary_dflt" = "" ] && dictionary_dflt=dictionary.xml
-
-
-# Wizard
-echo "Diameter dictionary: you could use '/opt/bin/anna/example_diameter_stackManagement' tool in order to build"
-echo " autonomous dictionaries for any kind of application. The key is to concatenate xml contents (ietf, 3gpp,"
-echo " vendor-specific, etc.). See 'example/diameter/stackManagement/self_ruling_setups.sh' for this."
-echo
-echo "This launcher can also join them providing a comma-separated list (dictionaries available on ./stack)."
-echo "By default, a QoS Application setup is suggested. Input the desired configuration instead, or press ENTER:"
-echo
-echo " [$dictionary_dflt]:"
-read dictionary
-[ "$dictionary" = "" ] && dictionary=$dictionary_dflt
-
-# As client:
-echo "Diameter entity server sessions (0: diameter entity disabled) [$entityServerSessions_dflt]:"
-read entityServerSessions
-[ "$entityServerSessions" = "" ] && entityServerSessions=$entityServerSessions_dflt
-
-entity=
-if test "$entityServerSessions" != "0"
-then
- echo "Target diameter entity (pipe-separated <ip|hostname>:<port> socket literal list) ["$entity_dflt"]:"
- read entity
-fi
-[ "$entity" = "" ] && entity="$entity_dflt"
-
-# Configure:
-echo $dictionary > .dictionary
-echo $entity > .entity
-echo $entityServerSessions > .entityServerSessions
-
-echo
-echo
-
+++ /dev/null
-#!/bin/bash
-
-# In this test we will send a incorrect message (AAR) to the server peer:
-# Warning | source/diameter/codec/Message.cpp (387) | Internal Avp decoding error (avp code = 443): Avp format error, the avp length is incorrect (must be multiple of 4 on grouped type)
-#
-# The server shall answer with the FailedAVP and we will check this to validate the test.
-
-#############
-# VARIABLES #
-#############
-# Paths from the point of view of ADL executable:
-REQ1_HEX=./hex_examples/aar-bad.hex
-
-#############
-# FUNCTIONS #
-#############
-
-
-#############
-# EXECUTION #
-#############
-
-# Goto working directory
-cd `dirname $0`
-
-# Source utils:
-source common.sh
-
-# Clean traffic traces:
-rm -f ../../launcher.log*
-
-# Send incorrect AAR:
-send_hex $REQ1_HEX &
-
-# Monitor activity:
-monitor_4_message ../../launcher.log.recvfe 10
-
-# Check if message was received:
-[ $? -ne 0 ] && test_failed "Missing answer from the server"
-
-# Check launcher.log.recvfe:
-check_pattern "<avp name=\"Result-Code\" data=\"5004\" alias=\"DIAMETER_INVALID_AVP_VALUE\"/>" ../../launcher.log.recvfe
-check_pattern "<avp name=\"Failed-AVP\">( *)<avp name=\"Subscription-Id\"" ../../launcher.log.recvfe
-
-# Test OK
-test_ok "Received answer to bad-aar message indicating Failed-AVP as Subscription-Id"
-
+++ /dev/null
-#!/bin/bash
-
-#############
-# FUNCTIONS #
-#############
-
-_exit () {
- echo
- echo $1
- echo
- exit 1
-}
-
-sigint_handler() {
- _exit "Script interrupted. Cleanup & exit ..."
-}
-
-# $1: hex formatted file to send to the server
-send_xml () {
- ../../operation.sh "sendxml|$1"
-}
-
-send_hex () {
- sleep 1
- ../../operation.sh "sendhex|$1"
-}
-
-# $1: pattern; $2: file
-check_pattern () {
- echo "Matching pattern '$1' ..."
- cat $2 | tr '\n' ' ' | egrep "$1" >/dev/null
- res=${PIPESTATUS[2]}
- [ $? -ne 0 ] && _exit "Test failed: miss pattern !!"
-}
-
-test_ok () {
- echo
- echo $1
- echo "Test OK !"
- echo
- exit 0
-}
-
-test_failed () {
- echo
- echo $1
- echo "Test FAILED !"
- echo
- exit 1
-}
-
-
-# $1: traffic log to monitor
-# $2: timeout (request expiration) in seconds
-# Result: cats the message when completed
-monitor_4_message () {
- 0>$1
- rm -f .msg_received
-
- [ -z "$2" ] && _exit "ERROR: must provide '$FUNCNAME' timeout (second argument)"
- sleep $2 &
- local timerPid=$!
-
- # Monitor for incoming message:
- tail -n0 -F --pid=$timerPid $1 | while read line
- do
- if echo $line | grep "^</message>" >/dev/null; then
- echo "Message received"
- # stop the timer
- kill -13 $timerPid
- touch .msg_received
- fi
- done
-
- if [ ! -f .msg_received ]; then
- echo "Timeout expired"
- return 1
- fi
-
- return 0
-}
-
-#############
-# EXECUTION #
-#############
-
-# Trap sigint signal:
-trap sigint_handler SIGINT
-
+++ /dev/null
-../../../../hex_examples/aar-bad.hex
\ No newline at end of file
+++ /dev/null
-../../../../hex_examples/aar2-bad.hex
\ No newline at end of file
+++ /dev/null
-../../../../hex_examples/aar3-bad.hex
\ No newline at end of file
+++ /dev/null
-# Bad length encoded on grouped Subscription-Id length field (not multiple of 4).
-
-# Send malformed AAR to the server:
-SENDHEX2E aar-bad.hex
-
-# Wait for message:
-WAIT4MESSAGE
-
-# Check Failed-AVP & Subscription-Id within:
-CHECKPATTERN <avp name="Result-Code" data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
-CHECKPATTERN <avp name="Failed-AVP">( *)<avp name="Subscription-Id"
+++ /dev/null
-# Bad length encoded on enumerated Flow-Status avp 2-level nested (Media-Component-Description -> Media-Sub-Component -> Flow-Status)
-
-# Send malformed AAR to the server:
-SENDHEX2E aar2-bad.hex
-
-# Wait for message:
-WAIT4MESSAGE
-
-# Check Failed-AVP & Subscription-Id within:
-CHECKPATTERN <avp name="Result-Code" data="5014" alias="DIAMETER_INVALID_AVP_LENGTH"/>
-CHECKPATTERN <avp name="Failed-AVP">( *)<avp name="Media-Component-Description"
-
-# TODO: check that the complete hierarchy to Flow-Status (the real bad avp)
+++ /dev/null
-# Bad value (15) encoded on enumerated Flow-Status avp (range 0-15) 2-level nested (Media-Component-Description -> Media-Sub-Component -> Flow-Status)
-
-# Send malformed AAR to the server:
-SENDHEX2E aar3-bad.hex
-
-# Wait for message:
-WAIT4MESSAGE
-
-# Check Failed-AVP & Subscription-Id within:
-CHECKPATTERN <avp name="Result-Code" data="5004" alias="DIAMETER_INVALID_AVP_VALUE"/>
-CHECKPATTERN <avp name="Failed-AVP">( *)<avp name="Media-Component-Description">( *)<avp name="Media-Sub-Component">( *)<avp name="Flow-Status" data="0" alias="ENABLED-UPLINK"/>
+++ /dev/null
-#!/bin/bash
-
-#############
-# VARIABLES #
-#############
-SCR_DIR=`dirname $0`
-tmpdir=$(mktemp -d)
-SCR_BN=`basename $0`
-OPER_SCR=../../operation.sh
-RESULT_LOG=result.log
-RECV_LOG=../../launcher.log.recvfe
-
-#############
-# FUNCTIONS #
-#############
-
-sigint_handler () {
- _exit "Script interrupted. Cleanup and exit ..."
-}
-
-# $1: message; $2: optional rc (1 by default)
-_exit () {
- rc=1
- [ -n "$2" ] && rc=$2
- echo
- echo -e $1
- echo
- rm -rf $tmpdir
- exit $rc
-}
-
-# $1: hex formatted file to send to the server
-operation_sendxml2e () {
- sleep 0.5
- $OPER_SCR "sendxml2e|$1"
- return $?
-}
-
-# $1: hex formatted file to send to the server
-operation_sendhex2e () {
- sleep 0.5
- $OPER_SCR "sendhex2e|$1"
- return $?
-}
-
-# $1: file to monitor
-# $2: timeout (request expiration) in seconds
-# Result: cats the message when completed
-wait4message () {
- 0>$1
- rm -f .msg_received
-
- [ -z "$2" ] && _exit "ERROR: must provide '$FUNCNAME' timeout (second argument)"
- sleep $2 &
- local timerPid=$!
-
- # Monitor for incoming message:
- tail -n0 -F --pid=$timerPid $1 | while read line
- do
- if echo $line | grep "^</message>" >/dev/null; then
- echo "Message received:"
- echo
- cat $1
- # stop the timer
- kill -13 $timerPid
- touch .msg_received
- fi
- done
-
- if [ ! -f .msg_received ]; then
- echo "Timeout expired"
- return 1
- fi
-
- return 0
-}
-
-# xml content is serialized (removing CR's) to ease the pattern matching:
-# $1: pattern; $2: file
-check_pattern () {
- echo -n "Matching pattern '$1' in file '$2' ... "
- cat $2 | tr '\n' ' ' | egrep "$1" >/dev/null
- [ $? -ne 0 ] && { echo "ERROR" ; test_failed ; return 1 ; }
- echo "OK"
- return 0
-}
-
-# $1: pattern file; $2: file
-check_pattern_file () {
- echo -n "Matching whole file '$1' in file '$2' ... "
- grep -f $1 $2 >/dev/null
- [ $? -ne 0 ] && { echo "ERROR" ; test_failed ; return 1 ; }
- echo "OK"
- return 0
-}
-
-# Tests result:
-test_ok () {
- echo "Verdict: $TC Ok" | tee -a $RESULT_LOG
-}
-
-test_failed () {
- echo "Verdict: $TC Failed" | tee -a $RESULT_LOG
-}
-
-process_tc () {
- local tc_dn=`dirname $TC`
-
- echo
- echo "***** Executing '$TC' ..."
-
- grep -v ^# $TC > $tmpdir/tc
- while read -r line
- do
- oper=$(echo $line | awk '{ print $1 }')
- param1="$(echo $line | cut -d' ' -f2-)"
-
- case $oper in
- SENDXML2E)
- operation_sendxml2e $tc_dn/$param1 &
- [ $? -ne 0 ] && return 1
- ;;
-
- SENDHEX2E)
- operation_sendhex2e $tc_dn/$param1 &
- [ $? -ne 0 ] && return 1
- ;;
-
- WAIT4MESSAGE)
- wait4message $RECV_LOG 5
- [ $? -ne 0 ] && return 1
- ;;
-
- CHECKPATTERN)
- check_pattern "$param1" $RECV_LOG
- [ $? -ne 0 ] && return 1
- ;;
-
- CHECKPATTERNFILE)
- check_pattern_file "$param1" $RECV_LOG
- [ $? -ne 0 ] && return 1
- ;;
-
- esac
-
- done < $tmpdir/tc
-
- return 0
-}
-
-
-#############
-# EXECUTION #
-#############
-
-# Trap sigint:
-trap sigint_handler SIGINT
-
-# Working directory is script dirname:
-cd $SCR_DIR
-
-# Intro:
-echo
-echo "------------------"
-echo "Test cases manager"
-echo "------------------"
-# Mandatory parameter:
-[ -z "$1" ] && _exit "Usage: $SCR_BN <test cases parent directory (or .tc file)>"
-[ ! -f "$1" -a ! -d "$1" ] && _exit "Invalid file or directory '$1' !!"
-
-# Gather .tc files to be processed:
-[ ! -f $1 ] && echo -e "\nGathering list of test cases from '`readlink -f $1`' ..."
-echo
-find $1 -name *.tc | xargs -L1 readlink -f | tee -a $tmpdir/tc_list
-echo
-echo
-
-echo "Start processing test cases:"
-echo "----------------------------"
-# Process test cases:
-0> $RESULT_LOG
-for TC in `cat $tmpdir/tc_list`
-do
- process_tc
- if [ $? -eq 0 ]; then
- test_ok
- else
- test_failed
- cat $RECV_LOG
- fi
-done
-
-_exit "Done !" 0
-
+++ /dev/null
-../basic/xml_examples
\ No newline at end of file
--- /dev/null
+#!/bin/bash
+
+#############
+# VARIABLES #
+#############
+tmpdir=$(mktemp -d)
+
+#############
+# FUNCTIONS #
+#############
+
+usage () {
+ echo "Usage: $0 <pcap_file> [results_dir]"
+ echo
+ echo " pcap_file: pcap formatted file to be processed."
+ echo " results_dir: directory where results are stored."
+ echo " By default, pcap file dirname is used."
+ echo
+ echo " The utility, dumps the extracted hexadecimal content"
+ echo " and useful information as timestamps, source and"
+ echo " destination:"
+ echo " <results_dir>/<frame sequence>.hex"
+ echo " <results_dir>/<frame sequence>.metadata"
+ echo
+ _exit
+}
+
+_exit () {
+ echo
+ echo -e $1
+ echo
+
+ # Cleanup
+ #rm -rf $tmpdir
+
+ rc=1
+ [ -n "$2" ] && rc=$2
+ exit $rc
+}
+
+# $1: string; $2: substring
+get_str_pos() {
+ local result=-1
+ local str=$1
+ local substr="${1%%$2*}"
+ local pos=${#substr}
+ local size=${#str}
+ [ $size -ne $pos ] && result=$pos
+ echo $result
+}
+
+#############
+# EXECUTION #
+#############
+
+echo
+echo "============================================"
+echo "Diameter buffer extractor from PCAP raw file"
+echo "============================================"
+echo
+
+# Usage:
+[ "$1" = "" ] && usage
+
+# Pcap file:
+PCAP_FILE=$1
+[ ! -f $PCAP_FILE ] && _exit "Cannot found provided pcap file '$1' !!"
+
+# Optional result dir:
+RESULTS_DIR=`dirname $PCAP_FILE`
+[ "$2" != "" ] && RESULTS_DIR=$2
+[ ! -d $RESULTS_DIR ] && _exit "The results directory '$RESULTS_DIR' must exists !!"
+
+# Get the frames with diameter content (take care about '-2' two-pass option and don't add it, because we need to get reassembled parts in their corresponding frames):
+# Fields needed (we won't need diameter.hopbyhopid & diameter.endtoendid to verify diameter message as hint patterns; length management will be enough):
+FIELDS="-e frame.number -e frame.time_epoch -e ip.src_host -e ip.dst_host -e tcp.len -e diameter.length -e frame.protocols -e tcp.segment"
+tshark -E separator="|" -r $PCAP_FILE -N mntC -Tfields $FIELDS 2>/dev/null | grep -i diameter > $tmpdir/diameter_frames
+# Example output:
+# /length\
+# frame timestamp src dst TCP DIAM protocol segments
+# 1|1427215933.697904000|gt_traf|vcbavipt|432|432|eth:ip:tcp:diameter:diameter:diameter3gpp|
+# 3|1427215934.449523000|vcbavipt|gt_traf|292|292|eth:ip:tcp:diameter:diameter:diameter3gpp|
+# 5|1427215934.456160000|gt_traf|vcbavipt|1400||eth:ip:tcp:diameter|
+# 6|1427215934.456204000|gt_traf|vcbavipt|572|1972|eth:ip:tcp:diameter:diameter:diameter3gpp|5,6
+# 8|1427215935.123559000|vcbavipt|gt_traf|248|248|eth:ip:tcp:diameter:diameter:diameter3gpp|
+all_frames=( $(cat $tmpdir/diameter_frames | cut -d\| -f1) )
+needs_join=( $(cat $tmpdir/diameter_frames | cut -d\| -f8) )
+main_frames=( $(cat $tmpdir/diameter_frames | awk -F\| '{ if ($6 != "") print $1 }') )
+
+# Reassemble procedure (using frame 1 as example):
+# (for non segmented frames, it is enough with tcp or diameter length within the frame content itself)
+# 1) Get the TCP length: 432 bytes. 432*2 = 864 characters per byte in hexadecimal string format
+# 2) Get the frame length: `wc -c $tmpdir/block.$frame` => 997
+# 3) Get 864 from the tail: `cat $tmpdir/block.$frame | cut -c133
+
+# Dump the hex blocks for all the diameter frames:
+cat $PCAP_FILE | rawshark -s -r - -d proto:diameter -F data 2>/dev/null > $tmpdir/all_hex_data
+for frame in ${all_frames[@]}; do
+ grep "^$frame " $tmpdir/all_hex_data | cut -d\" -f2 | sed 's/://g' > $tmpdir/block.$frame
+ frame_info=$(grep "^${frame}|" $tmpdir/diameter_frames)
+
+ # Get the diameter part:
+ tcp_len=$(echo $frame_info | cut -d\| -f5)
+ frm_len=$(wc -c $tmpdir/block.$frame | awk '{ print $1 }')
+ cut_len=$((frm_len-2*tcp_len))
+ cat $tmpdir/block.$frame | cut -c${cut_len}- > $RESULTS_DIR/$frame.hex
+ echo -n "Created $RESULTS_DIR/$frame.hex"
+
+ # Metadata:
+ ts=$(echo $frame_info | cut -d\| -f2)
+ date=$(date -d @$ts)
+ src=$(echo $frame_info | cut -d\| -f3)
+ dst=$(echo $frame_info | cut -d\| -f4)
+ echo -e "timestamp=$ts\ndate=$date\nsrc=$src\ndst=$dst" > $RESULTS_DIR/$frame.metadata
+ echo " and $RESULTS_DIR/$frame.metadata"
+done
+
+# Join frames which need to be reassembled:
+for group in ${needs_join[@]}; do
+ echo "Grouping frames $group ..."
+ group_array=( $(echo $group | sed 's/,/ /g') )
+ for frame in ${group_array[@]}; do
+ cat $RESULTS_DIR/$frame.hex >> $tmpdir/diam.$group
+ done
+ cat $tmpdir/diam.$group | tr -d '\n' > $RESULTS_DIR/$frame.hex
+done
+
+# Delete superfluous metadata:
+echo "Deleting superfluous metadata ..."
+segments=( $(cat $tmpdir/diameter_frames | awk -F\| '{ if ($6 == "") print $1 }') )
+for s in ${segments[@]}; do rm $RESULTS_DIR/$s.metadata; done
+
+
+_exit "Done!" 0
+