diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 0a0118581e895380d29eae2fe93964ab173176f3..534c4e090764d477c0c35202850d236749f873b8 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -301,184 +301,6 @@ install_nas_tools() { fi } -################################################# -# 3. Network interfaces utilities -################################################ - -cidr2mask(){ - local i mask="" - local full_octets=$(($1/8)) - local partial_octet=$(($1%8)) - - for ((i=0;i<4;i+=1)); do - if [ $i -lt $full_octets ]; then - mask+=255 - elif [ $i -eq $full_octets ]; then - mask+=$((256 - 2**(8-$partial_octet))) - else - mask+=0 - fi - test $i -lt 3 && mask+=. - done - - echo $mask -} - -# example: netcalc 192.168.12.100 255.255.255.0 -netcalc(){ - local IFS='.' ip i - local -a oct msk - - read -ra oct <<<"$1" - read -ra msk <<<"$2" - - for i in ${!oct[@]}; do - ip+=( "$(( oct[i] & msk[i] ))" ) - done - - echo "${ip[*]}" -} - -# example: -bcastcalc(){ - local IFS='.' ip i - local -a oct msk - - read -ra oct <<<"$1" - read -ra msk <<<"$2" - - for i in ${!oct[@]}; do - ip+=( "$(( oct[i] + ( 255 - ( oct[i] | msk[i] ) ) ))" ) - done - echo "${ip[*]}" -} - - -is_real_interface(){ - my_bool=1 - for var in "$@" - do - if [ "a$var" == "a" ]; then - return 0 - fi - if [ "a$var" == "anone" ]; then - return 0 - fi - IF=`cat /etc/udev/rules.d/70-persistent-net.rules | grep $var | sed 's/^.*NAME=//' | tr -d '"'` - if [ "$IF" == "$var" ]; then - if [ "a${var:0:3}" != "aeth" ]; then - if [ "a${var:0:4}" != "awlan" ]; then - if [ "a${var:0:4}" != "awifi" ]; then - my_bool=0; - fi - fi - fi - fi - done - return $my_bool -} - -is_virtual_interface(){ - my_bool=1 - for var in "$@" - do - if [ "a$var" == "a" ]; then - return 0 - fi - if [ "a$var" == "anone" ]; then - return 0 - fi - num=`expr index "$var" :` - - if [ $num -eq 0 ]; then - my_bool=0; - fi - done - return $my_bool -} - -# arg1 = interface name -# arg2 = ipv4 addr cidr -set_interface_up(){ - interface=$1 - address=${2%/*} #part before '/' - cidr_netmask=${2#*/} # part after '/' - - if [ "a${interface:0:4}" == "anone" ]; then - return; - fi - echo "ifconfig $interface up" - $SUDO ifconfig $interface up - sync - netmask=`cidr2mask $cidr_netmask` - broadcast=`bcastcalc $address $netmask` - echo "ip -4 addr add $address/$cidr_netmask broadcast $broadcast dev $interface" - $SUDO ip -4 addr add $address/$cidr_netmask broadcast $broadcast dev $interface - sync -} - -# arg1 = interface name -# arg2 = ipv4 addr cidr -set_virtual_interface_up(){ - interface=$1 - address=${2%/*} #part before '/' - cidr_netmask=${2#*/} # part after '/' - - if [ "a${interface:0:4}" == "anone" ]; then - return; - fi - $SUDO ifconfig $interface down > /dev/null 2>&1 - sync - echo "ifconfig $interface $address up" - $SUDO ifconfig $interface $address up - sync -} - -#arg1 is interface name -#arg2 is IP address (CIDR) -set_network_interface(){ - local interface_name=$1 - local ip_cidr=$2 - - is_virtual_interface $interface_name - if [ $? -eq 1 ]; then - echo "$interface_name is virtual interface" - set_virtual_interface_up $interface_name $ip_cidr - else - is_real_interface $interface_name - if [ $? -eq 1 ]; then - echo "$interface_name is real interface" - set_interface_up $interface_name $ip_cidr - else - echo_warning "$interface_name not handled, not configuring it" - return - fi - fi -} - -# arg1 is a 'libconfig-like' config file -set_epc_network_interfaces(){ - value="`cat $1 | cut -d "#" -f1 | grep 'ADDRESS\|INTERFACE' | tr -d " " | grep "="`" - eval $value - - # check all var names are correct - list_var_name="\ - ENB_INTERFACE_NAME_FOR_S1_MME ENB_IPV4_ADDRESS_FOR_S1_MME \ - ENB_INTERFACE_NAME_FOR_S1U ENB_IPV4_ADDRESS_FOR_S1U " - for var_name in $list_var_name - do - if [ -n "$${var_name}" ]; then - echo_success "Found ${var_name} = ${!var_name}" - else - echo_fatal "${var_name} does does not exist in your config file $1" - fi - done - - # configure interfaces - set_network_interface $ENB_INTERFACE_NAME_FOR_S1_MME $ENB_IPV4_ADDRESS_FOR_S1_MME - set_network_interface $ENB_INTERFACE_NAME_FOR_S1U $ENB_IPV4_ADDRESS_FOR_S1U -} - ################################ diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index 238ba0ff11c470f2d2ecbd635ea0daf9a0b3c935..69e707dcf9a2248717d7a9e0c8c35e12c6fb5119 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -142,7 +142,7 @@ int strip_extension(char *in_filename) if (NULL != in_filename) { /* Check chars starting at end of string to find last '.' */ - for (ssize_t i = strlen(in_filename); i > (name_min_len + max_ext_len); i--) { + for (ssize_t i = strlen(in_filename); i >= name_min_len; i--) { if (in_filename[i] == '.') { in_filename[i] = '\0'; return i; @@ -662,7 +662,7 @@ config_parse_opt_line ( fprintf(stderr, "Error: eNB config file name %s is not found in dir %s\n", enb_config_file_name, g_test_dir); } enb_config_init(enb_config_file_name); - enb_config_display(); + //enb_config_display(); if (NULL == pdml_in_file_name) { fprintf(stderr, "Error: please provide the PDML file name that should be in %s\n", g_test_dir); diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index a801d2cf236335ff634abceee1e699194adc6466..21aca820c280ddd7f9a1ce93f8769cdda280a720 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -69,6 +69,7 @@ #define GS_IS_DIR 2 //------------------------------------------------------------------------------ Enb_properties_array_t g_enb_properties; +int g_max_speed = 0; //------------------------------------------------------------------------------ extern et_scenario_t *g_scenario; extern int xmlLoadExtDtdDefaultValue; @@ -118,7 +119,7 @@ int et_strip_extension(char *in_filename) if (NULL != in_filename) { /* Check chars starting at end of string to find last '.' */ - for (ssize_t i = strlen(in_filename); i > (name_min_len + max_ext_len); i--) { + for (ssize_t i = strlen(in_filename); i > name_min_len; i--) { if (in_filename[i] == '.') { in_filename[i] = '\0'; return i; @@ -833,6 +834,7 @@ et_config_parse_opt_line ( LONG_OPTION_START = 0x100, /* Start after regular single char options */ LONG_OPTION_ENB_CONF_FILE, LONG_OPTION_SCENARIO_FILE, + LONG_OPTION_MAX_SPEED, LONG_OPTION_TEST_DIR, LONG_OPTION_HELP, LONG_OPTION_VERSION @@ -841,6 +843,7 @@ et_config_parse_opt_line ( static struct option long_options[] = { {"enb-conf-file", required_argument, 0, LONG_OPTION_ENB_CONF_FILE}, {"scenario ", required_argument, 0, LONG_OPTION_SCENARIO_FILE}, + {"max-speed ", no_argument, 0, LONG_OPTION_MAX_SPEED}, {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, {"help", no_argument, 0, LONG_OPTION_HELP}, {"version", no_argument, 0, LONG_OPTION_VERSION}, @@ -850,7 +853,7 @@ et_config_parse_opt_line ( /* * Parsing command line */ - while ((option = getopt_long (argc, argv, "vhc:s:d:", long_options, NULL)) != -1) { + while ((option = getopt_long (argc, argv, "vhmc:s:d:", long_options, NULL)) != -1) { switch (option) { case LONG_OPTION_ENB_CONF_FILE: case 'c': @@ -882,6 +885,11 @@ et_config_parse_opt_line ( } break; + case LONG_OPTION_MAX_SPEED: + case 'm': + g_max_speed = 1; + break; + case LONG_OPTION_VERSION: case 'v': printf("Version %s\n", PACKAGE_VERSION); diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 4ac46e84b548978b282016cf70b2f3641c9cdf8e..0391ac5c472382a4a3ca6f1884a4011b2bd13b91 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -40,6 +40,7 @@ # include <time.h> # include <stdint.h> # include <libxml/tree.h> +# include <libxml/xpath.h> # include <netinet/in.h> #include "S1AP-PDU.h" @@ -460,6 +461,9 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node); et_scenario_t* et_generate_scenario(const char * const et_scenario_filename ); //------------------------- asn_comp_rval_t * et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints); +void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, const S1ap_MME_UE_S1AP_ID_t new_id); +void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xmlNodeSetPtr nodes, const S1ap_MME_UE_S1AP_ID_t new_id); +int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_S1AP_ID_t old_id, const S1ap_MME_UE_S1AP_ID_t new_id); //------------------------- asn_comp_rval_t * et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints); asn_comp_rval_t * et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints); diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index b76d2240f58757e1ce1de9dbcaddd137099a3fd1..a8f7e7331f1ba8a1d14f6db122623b688c967b19 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -46,6 +46,8 @@ #include "play_scenario_s1ap_eNB_defs.h" #include "timer.h" +//------------------------------------------------------------------------------ +extern int g_max_speed; //------------------------------------------------------------------------------ et_scenario_t *g_scenario = NULL; pthread_mutex_t g_fsm_lock = PTHREAD_MUTEX_INITIALIZER; @@ -86,13 +88,13 @@ int timeval_subtract (struct timeval * const result, struct timeval * const a, s //------------------------------------------------------------------------------ void et_scenario_wait_rx_packet(et_packet_t * const packet) { + packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING; + g_fsm_state = ET_FSM_STATE_WAITING_RX_EVENT; if (timer_setup (ET_FSM_STATE_WAITING_RX_EVENT_DELAY_SEC, 0, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, - NULL, &packet->timer_id) < 0) { + packet, &packet->timer_id) < 0) { AssertFatal(0, " Can not start waiting RX event timer\n"); } LOG_D(ENB_APP, "Waiting RX packet num %d\n", packet->packet_number); - g_fsm_state = ET_FSM_STATE_WAITING_RX_EVENT; - packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING; } //------------------------------------------------------------------------------ void et_scenario_schedule_tx_packet(et_packet_t * const packet) @@ -133,14 +135,19 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) we_are_too_early = timeval_subtract(&offset,&offset_last_rx_packet,&packet->time_relative_to_last_received_packet); LOG_D(ENB_APP, "we_are_too_early=%d, offset=%ld.%06d\n", we_are_too_early, offset.tv_sec, offset.tv_usec); } - if (we_are_too_early > 0) { + if ((0 < we_are_too_early) && (0 == g_max_speed)){ // set timer + if (offset.tv_sec < 0) offset.tv_sec = -offset.tv_sec; + if (offset.tv_usec < 0) { + offset.tv_usec = offset.tv_usec + 1000000; + offset.tv_sec -= 1; + } + LOG_D(ENB_APP, "Send packet num %u original frame number %u in %ld.%06d sec\n", packet->packet_number, packet->original_frame_number, offset.tv_sec, offset.tv_usec); packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_SENDING; - if (timer_setup (offset.tv_sec, offset.tv_usec, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, - NULL, &packet->timer_id) < 0) { + if (timer_setup (offset.tv_sec, offset.tv_usec, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT,packet, &packet->timer_id) < 0) { AssertFatal(0, " Can not start TX event timer\n"); } // Done g_fsm_state = ET_FSM_STATE_WAITING_TX_EVENT; diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index b9d24f366c0d2237cc7a42efaaf1932c357ca08f..4004dd507499e9ed3884010c45c481f2b9765cbc 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -359,7 +359,7 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { afloat = atof((const char*)xml_char); xmlFree(xml_char); packet->time_relative_to_first_packet.tv_sec = (int)afloat; - packet->time_relative_to_first_packet.tv_usec = (int)((afloat - packet->time_relative_to_first_packet.tv_sec)*1000000); + packet->time_relative_to_first_packet.tv_usec = (int)((afloat - packet->time_relative_to_first_packet.tv_sec)*1000000.0); if (first_packet > 0) { initial_time = packet->time_relative_to_first_packet; @@ -381,6 +381,13 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { &packet->time_relative_to_last_sent_packet); relative_last_sent_packet = packet->time_relative_to_first_packet; } + if (first_received_packet > 0) { + packet->time_relative_to_last_received_packet.tv_sec = 0; + packet->time_relative_to_last_received_packet.tv_usec = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, + &packet->time_relative_to_last_received_packet); + } } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { if (first_received_packet > 0) { relative_last_received_packet.tv_sec = packet->time_relative_to_first_packet.tv_sec; @@ -393,6 +400,13 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { &packet->time_relative_to_last_received_packet); relative_last_received_packet = packet->time_relative_to_first_packet; } + if (first_sent_packet > 0) { + packet->time_relative_to_last_sent_packet.tv_sec = 0; + packet->time_relative_to_last_sent_packet.tv_usec = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, + &packet->time_relative_to_last_sent_packet); + } } } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.number"))) { diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index f5afebd7868d86431785b9631cd17887234045ef..6a39397f19acde6b321cfacccba483a7c07c97e5 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -682,6 +682,11 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec; return et_scenario_set_packet_received(packet); } + } else if (strcmp(comp_results->name, "S1ap-TransportLayerAddress") == 0) { + S1AP_WARN("Some work needed there for %s, TODO in generic_scenario.xsl, add epc conf file in the process\n",comp_results->name); + packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec; + packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec; + return et_scenario_set_packet_received(packet); } else { AssertFatal(0,"Some work needed there"); } @@ -1109,18 +1114,22 @@ void *et_s1ap_eNB_task(void *arg) { et_packet_t * packet = (et_packet_t*)TIMER_HAS_EXPIRED (received_msg).arg; et_event_t event; - if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING) { - memset((void*)&event, 0, sizeof(event)); - event.code = ET_EVENT_RX_PACKET_TIME_OUT; - event.u.rx_packet_time_out = packet; - et_scenario_fsm_notify_event(event); - } else if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_SENDING) { - memset((void*)&event, 0, sizeof(event)); - event.code = ET_EVENT_TX_TIMED_PACKET; - event.u.tx_timed_packet = packet; - et_scenario_fsm_notify_event(event); - } else if ((packet->status != ET_PACKET_STATUS_SENT) && ((packet->status != ET_PACKET_STATUS_RECEIVED))) { - AssertFatal (0, "Bad status %d of packet timed out!\n", packet->status); + if (NULL != packet) { + if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING) { + memset((void*)&event, 0, sizeof(event)); + event.code = ET_EVENT_RX_PACKET_TIME_OUT; + event.u.rx_packet_time_out = packet; + et_scenario_fsm_notify_event(event); + } else if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_SENDING) { + memset((void*)&event, 0, sizeof(event)); + event.code = ET_EVENT_TX_TIMED_PACKET; + event.u.tx_timed_packet = packet; + et_scenario_fsm_notify_event(event); + } else if ((packet->status != ET_PACKET_STATUS_SENT) && ((packet->status != ET_PACKET_STATUS_RECEIVED))) { + AssertFatal (0, "Bad status %d of packet timed out!\n", packet->status); + } + } else { + LOG_W(S1AP, " Received TIMER_HAS_EXPIRED: timer_id %d, no packet attached to timer\n", TIMER_HAS_EXPIRED(received_msg).timer_id); } } if (TIMER_HAS_EXPIRED (received_msg).timer_id == g_scenario->enb_register_retry_timer_id) { diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 87ffe29e322b1758b69828de72e3a9f5dee78e69..31d784b2bdc4c62fb536782350aed65cb8f17280 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -38,8 +38,10 @@ #include <stdio.h> #include <stdlib.h> #include <stdint.h> +#include <stdarg.h> #include <unistd.h> #include <crypt.h> +#include <errno.h> #include <libxml/tree.h> #include <libxml/parser.h> #include <libxml/xpath.h> @@ -457,7 +459,7 @@ asn_comp_rval_t * et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_messag } -static void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, xmlChar *new_id_hex, xmlChar *new_id_dec, xmlChar *showname) +void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, const S1ap_MME_UE_S1AP_ID_t new_id) { xmlNode *cur_node = NULL; xmlAttrPtr attr = NULL; @@ -485,19 +487,47 @@ static void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *no xmlFree(xml_char); xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size"); if (NULL != xml_char) { + const xmlChar value_d[32]; + const xmlChar value_h[20]; + const xmlChar showname[64]; + int ret = 0; + int pos2 = 0; + char val = NULL; + char hex[3] = {0,0,0};; + size = strtoul((const char *)xml_char, NULL, 0); xmlFree(xml_char); // second: try to set value (always hex) - attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"value", new_id_hex); - attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"show", new_id_dec); + ret = snprintf((char *)value_d, 32, "%ld", new_id); + AssertFatal((ret < 0) || (ret > 32), "Could not convert int to dec str"); + ret = snprintf((char *)value_h, 20, "C0%08X", new_id); + AssertFatal((ret < 0) || (ret > 20), "Could not convert int to hex str"); + ret = snprintf((char *)showname, 64, "MME-UE-S1AP-ID: %d", new_id); + AssertFatal((ret < 0) || (ret > 64), "Could not convert int to dec str"); + + attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"value", value_h); + attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"show", value_d); attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"showname", showname); //TODO update s1ap->binary_stream @pos with new_id_hex, size + AssertFatal((pos+size) < s1ap->binary_stream_allocated_size, "Rewrite of mme_ue_s1ap_id out of bounds of binary_stream"); + //avoid endianess issues + do { + hex[0] = value_h[pos2++]; + hex[1] = value_h[pos2++]; + hex[2] = 0; + val = (unsigned char)strtoul(hex, NULL, 16); + AssertFatal(errno != 0, "Conversion of hexstring %s failed", hex); + s1ap->binary_stream[pos++] = val; + } while (pos2 < (2*5)); + // update ASN1 + et_decode_s1ap(s1ap); + S1AP_DEBUG("Updated ASN1 for %s\n", showname); } } } } if (0 < go_deeper_in_tree) { - update_xpath_node_mme_ue_s1ap_id(s1ap, cur_node->children, new_id_hex, new_id_dec, showname); + update_xpath_node_mme_ue_s1ap_id(s1ap, cur_node->children, new_id); } } } @@ -510,24 +540,14 @@ static void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *no * Prints the @nodes content to @output. * From http://www.xmlsoft.org/examples/#xpath2.c */ -static void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xmlNodeSetPtr nodes, const S1ap_MME_UE_S1AP_ID_t new_id) +void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xmlNodeSetPtr nodes, const S1ap_MME_UE_S1AP_ID_t new_id) { int size = 0; int i = 0; - int ret = 0; - const xmlChar value_d[32]; - const xmlChar value_h[20]; - const xmlChar showname[64]; xmlNode *s1ap_node = NULL; size = (nodes) ? nodes->nodeNr : 0; - ret = snprintf((char *)value_d, 32, "%ld", new_id); - AssertFatal((ret < 0) || (ret > 32), "Could not convert int to dec str"); - ret = snprintf((char *)value_h, 20, "C0%X", new_id); - AssertFatal((ret < 0) || (ret > 20), "Could not convert int to hex str"); - ret = snprintf((char *)showname, 64, "MME-UE-S1AP-ID: %d", new_id); - AssertFatal((ret < 0) || (ret > 64), "Could not convert int to dec str"); /* * NOTE: the nodes are processed in reverse order, i.e. reverse document * order because xmlNodeSetContent can actually free up descendant @@ -539,7 +559,7 @@ static void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xm for(i = size - 1; i >= 0; i--) { s1ap_node = nodes->nodeTab[i]; AssertFatal(NULL != s1ap_node, "One element of resultset of XPATH expression is NULL\n"); - update_xpath_node_mme_ue_s1ap_id(s1ap_payload, s1ap_node, value_d, value_h, showname); + update_xpath_node_mme_ue_s1ap_id(s1ap_payload, s1ap_node, new_id); /* * All the elements returned by an XPath query are pointers to * elements from the tree *except* namespace nodes where the XPath @@ -574,7 +594,7 @@ int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_ xmlXPathObjectPtr xpath_obj = NULL; ret = snprintf(xpath_expression, ET_XPATH_EXPRESSION_MAX_LENGTH, "//field[@name=\"s1ap.MME_UE_S1AP_ID\"][@show=\"%d\"]", old_id); - AssertFatal((ret < 0) || (ret > ET_XPATH_EXPRESSION_MAX_LENGTH), "Could not build XPATH expression"); + AssertFatal((ret > 0) && (ret < ET_XPATH_EXPRESSION_MAX_LENGTH), "Could not build XPATH expression err=%d", ret); doc = packet->sctp_hdr.u.data_hdr.payload.doc; diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c index 181009c2c9d651d3010f6364a858e574bbde756c..5d5489089b82e7c052123e68c2e8c4b4921902f5 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c +++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c @@ -69,15 +69,16 @@ asn_comp_rval_t * et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_da S1AP_WARN("No Matching SCTP stream %u %u\n", sctp1->stream, sctp2->stream); } } - if (sctp1->ssn != sctp2->ssn) { - if (constraints & ET_BIT_MASK_MATCH_SCTP_SSN) { - rv = calloc(1, sizeof(asn_comp_rval_t)); - rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_SSN; - return rv; - } else { - S1AP_WARN("No Matching SCTP STREAM SN %u %u\n", sctp1->ssn, sctp2->ssn); - } - } + // We do not have SSN from lower layers +// if (sctp1->ssn != sctp2->ssn) { +// if (constraints & ET_BIT_MASK_MATCH_SCTP_SSN) { +// rv = calloc(1, sizeof(asn_comp_rval_t)); +// rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_SSN; +// return rv; +// } else { +// S1AP_WARN("No Matching SCTP STREAM SN %u %u\n", sctp1->ssn, sctp2->ssn); +// } +// } return et_s1ap_is_matching(&sctp1->payload, &sctp2->payload, constraints); }