module TestCodec_GeoNetworking { // LibCommon import from LibCommon_BasicTypesAndValues all; import from LibCommon_DataStrings all; // LibIts // import from ITS_Container language "ASN.1:1997" all; // import from CAM_PDU_Descriptions language "ASN.1:1997"all; // import from DENM_PDU_Descriptions language "ASN.1:1997" all; // LibItsCommon // import from LibItsCommon_TypesAndValues all; // import from LibItsCommon_Functions all; // LibItsExternal import from LibItsExternal_TypesAndValues all; // // LibItsCam // import from LibItsCam_TypesAndValues all; // import from LibItsCam_TestSystem all; // import from LibItsCam_Templates { // template m_camReq; // group camTemplateFunctions // }; // // // LibItsDenm // import from LibItsDenm_Templates all; // import from LibItsDenm_TestSystem all; // // // LibItsSecurity // import from LibItsSecurity_TypesAndValues all; // import from LibItsSecurity_Templates all; // import from LibItsSecurity_Functions all; // import from LibItsSecurity_Pixits all; // LibItsBtp import from LibItsBtp_TypesAndValues all; import from LibItsBtp_Templates all; // LibItsGeoNetworking import from LibItsGeoNetworking_TypesAndValues all; import from LibItsGeoNetworking_Templates all; import from LibItsGeoNetworking_Functions all; import from LibItsGeoNetworking_TestSystem all; import from LibItsGeoNetworking_Pixits all; import from LibItsGeoNetworking_Pics all; import from LibItsGeoNetworking_EncdecDeclarations all; // TestCodec import from TestCodec_TestAndSystem all; group LibItsGeoNetworking_testCases { group LibItsGeoNetworking_DummyTemplates { /** * @desc Dummy template for GN_Address */ template (value) GN_Address m_dummyGnAddrIut := { typeOfAddress := e_manual, stationType := e_roadSideUnit, stationCountryCode := 33, mid := 'a4fedecabeef'O } /** * @desc Dummy template for long position vector */ template (value) LongPosVector m_dummyLongPosVectorIut := { gnAddr := m_dummyGnAddrIut, timestamp_ := 123456, latitude := 4856, longitude := 675, pai := '1'B, speed := 55, heading := 9876 } template (value) GN_Address m_dummyGnAddrNodeA := { typeOfAddress := e_manual, stationType := e_pedestrian, stationCountryCode := 49, mid := 'a4fdea5ea5ed'O } template (value) GN_Address m_dummyGnAddrNodeB := { typeOfAddress := e_manual, stationType := e_specialVehicle, stationCountryCode := 50, mid := 'a40102030405'O } template (value) GN_Address m_dummyGnAddrNodeC := { typeOfAddress := e_manual, stationType := e_moped, stationCountryCode := 42, mid := 'deadbabebeef'O } template (value) LongPosVector m_dummyLongPosVectorNodeA := { gnAddr := m_dummyGnAddrNodeA, timestamp_ := 875, latitude := 265, longitude := 789, pai := '0'B, speed := 80, heading := 548 } template (value) LongPosVector m_dummyLongPosVectorNodeB := { gnAddr := m_dummyGnAddrNodeB, timestamp_ := 4585, latitude := 126, longitude := 123, pai := '0'B, speed := 45, heading := 125 } template (value) LongPosVector m_dummyLongPosVectorNodeC := { gnAddr := m_dummyGnAddrNodeC, timestamp_ := 23644, latitude := 23754, longitude := 49645, pai := '0'B, speed := 110, heading := 23 } template (value) ShortPosVector m_dummyShortPosVectorNodeC := { gnAddr := m_dummyGnAddrNodeC, timestamp_ := 23644, latitude := 23754, longitude := 49645 } template (value) Area m_dummyArea1 := { geoAreaPosLatitude := 298376, geoAreaPosLongitude := 32745, distanceA := 1234, distanceB := 5678, angle := 9123 } template (value) Area m_dummyArea2 := { geoAreaPosLatitude := 873548, geoAreaPosLongitude := 2837, distanceA := 8765, distanceB := 4321, angle := 4567 } template (value) GeoBroadcastArea m_dummyGeoBroadcastArea1 := { geoBroadcastSubType := e_geoBroadcastRect, geoBroadcastArea := m_dummyArea1 } template (value) GeoBroadcastArea m_dummyGeoBroadcastArea2 := { geoBroadcastSubType := e_geoBroadcastElip, geoBroadcastArea := m_dummyArea2 } template (value) GeoAnycastArea m_dummyGeoAnycastArea1 := { geoAnycastSubType := e_geoAnycastCircle, geoAnycastArea := m_dummyArea1 } template (value) GeoAnycastArea m_dummyGeoAnycastArea2 := { geoAnycastSubType := e_geoAnycastRect, geoAnycastArea := m_dummyArea2 } template (value) GnNonSecuredPacket m_geoNwBeaconPacket_payload( in template (value) LongPosVector p_sourceLongPosVec, in template (value) GnRawPayload p_payload ) modifies m_geoNwBeaconPacket := { payload := p_payload } /** * @desc Send template for GeoUnicast header * @param p_sourceLongPosVec Long position vector of source * @param p_destinationLongPosVec Long position vector of destination * @param p_senderLongPosVec Long position vector of sender * @param p_seqNumber Sequence number of GeoUnicast packet */ template (value) ExtendedHeader m_geoUnicastHeaderGeoNetworking( in template (value) LongPosVector p_sourceLongPosVec, in template (value) ShortPosVector p_dstPosVector, in template (value) UInt16 p_seqNumber ) := { geoUnicastHeader := { seqNumber := p_seqNumber, reserved := c_uInt8Zero, srcPosVector := p_sourceLongPosVec, dstPosVector := p_dstPosVector } } template (value) GeoNetworkingInd m_geoNwInd_withLinkLayerDestination( in template (value) GeoNetworkingPdu p_geoNwMsg, in template (value) MacAddress p_llDestinationAdress := 'FFFFFFFFFFFF'O, in template (value) Bit256 p_ssp := int2bit(0, 256), in template (value) UInt32 p_its_aid := 0 ) := { msgIn := p_geoNwMsg, macDestinationAddress := p_llDestinationAdress, ssp := p_ssp, its_aid := p_its_aid } } // End of group LibItsGeoNetworking_DummyTemplates group testGeoNetMessages { /** * @desc validate GeoNetworkingReq/Anycast * @verdict Pass on success, Fail otherwise */ testcase tc_GeoNetReq_AnycastPacket() runs on TCType system TCType { var GeoNetworkingReq v_gnReq; var octetstring v_buffer := '01002B0A00308000000F0A0004D200008431A4FDEA5EA5ED0000036B00000109000003150050022400048D8800007FE904D2162E23A3000044454641554C545F5041594C4F4144FFFFFFFFFFFFA0A0A0A0'O; // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump if (PX_GN_UPPER_LAYER != e_any) { log("PX_GN_UPPER_LAYER shall be set to e_any"); stop; } v_gnReq := valueof(m_geoNwReq_linkLayerBroadcast( m_geoNwPdu( m_geoNwAnycastPacket( m_dummyLongPosVectorNodeA, 1234, m_dummyGeoAnycastArea1 )), oct2int('A0A0A0A0'O) )); TestGeoNetworkingReq( v_gnReq, false); v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15; TestDecodeGeoNetworkingReq( v_gnReq, v_buffer ); } /** * @desc validate GeoNetworkingInd/Anycast * @verdict Pass on success, Fail otherwise */ testcase tc_GeoNetInd_AnycastPacket() runs on TCType system TCType { var template (value) GeoNetworkingInd v_gnInd; var octetstring v_buffer := '01002B0A00308000000F0A0004D200008431A4FDEA5EA5ED0000036B00000109000003150050022400048D8800007FE904D2162E23A3000044454641554C545F5041594C4F4144FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A0A0A0A0'O; // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump if (PX_GN_UPPER_LAYER != e_any) { log("PX_GN_UPPER_LAYER shall be set to e_any"); stop; } v_gnInd := valueof(m_geoNwInd_withLinkLayerDestination( m_geoNwPdu( m_geoNwAnycastPacket( m_dummyLongPosVectorNodeA, 1234, m_dummyGeoAnycastArea1 )), -, -, oct2int('A0A0A0A0'O) )); TestGeoNetworkingInd( v_gnInd, false); v_gnInd.msgIn.gnPacket.packet.commonHeader.plLength := 15; TestDecodeGeoNetworkingInd( mw_geoNwInd_withLinkLayerDestination( valueof(v_gnInd.msgIn), ? ), v_buffer ); } /** * @desc validate GeoNetworkingReq/Broadcast * @verdict Pass on success, Fail otherwise */ testcase tc_GeoNetReq_BroadcastPacket() runs on TCType system TCType { var GeoNetworkingReq v_gnReq; var octetstring v_buffer := '01002B0A00418000000F0A000D800000A832A40102030405000011E90000007E0000007B002D007D00048D8800007FE904D2162E23A3000044454641554C545F5041594C4F4144FFFFFFFFFFFFA0A0A0A0'O; // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump if (PX_GN_UPPER_LAYER != e_any) { log("PX_GN_UPPER_LAYER shall be set to e_any"); stop; } v_gnReq := valueof(m_geoNwReq_linkLayerBroadcast( m_geoNwPdu( m_geoNwBroadcastPacket( m_dummyLongPosVectorNodeB, 3456, m_dummyGeoBroadcastArea1 )), oct2int('A0A0A0A0'O) )); TestGeoNetworkingReq( v_gnReq, false); v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15; TestDecodeGeoNetworkingReq( v_gnReq, v_buffer ); } /** * @desc validate GeoNetworkingInd/Broadcast * @verdict Pass on success, Fail otherwise */ testcase tc_GeoNetInd_BroadcastPacket() runs on TCType system TCType { var GeoNetworkingInd v_gnInd; var octetstring v_buffer := '01002B0A00418000000F0A000D800000A832A40102030405000011E90000007E0000007B002D007D00048D8800007FE904D2162E23A3000044454641554C545F5041594C4F4144FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A0A0A0A0'O; // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump if (PX_GN_UPPER_LAYER != e_any) { log("PX_GN_UPPER_LAYER shall be set to e_any"); stop; } v_gnInd := valueof(m_geoNwInd_withLinkLayerDestination( m_geoNwPdu( m_geoNwBroadcastPacket( m_dummyLongPosVectorNodeB, 3456, m_dummyGeoBroadcastArea1 )), -, -, oct2int('A0A0A0A0'O) )); TestGeoNetworkingInd( v_gnInd, false); v_gnInd.msgIn.gnPacket.packet.commonHeader.plLength := 15; TestDecodeGeoNetworkingInd( v_gnInd, v_buffer ); } /** * @desc validate GeoNetworkingReq/Unicast * @verdict Pass on success, Fail otherwise */ testcase tc_GeoNetReq_UnicastPacket() runs on TCType system TCType { var GeoNetworkingReq v_gnReq; var octetstring v_buffer := '01002B0A00208000000F0A0010E100008C2ADEADBABEBEEF00005C5C00005CCA0000C1ED006E00178C2ADEADBABEBEEF00005C5C00005CCA0000C1ED44454641554C545F5041594C4F4144FFFFFFFFFFFFA0A0A0A0'O; // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump if (PX_GN_UPPER_LAYER != e_any) { log("PX_GN_UPPER_LAYER shall be set to e_any"); stop; } v_gnReq := valueof(m_geoNwReq_linkLayerBroadcast( m_geoNwPdu( m_geoNwUnicastPacket( m_dummyLongPosVectorNodeC, m_dummyShortPosVectorNodeC, 4321 )), oct2int('A0A0A0A0'O) )); TestGeoNetworkingReq( v_gnReq, false); v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15; TestDecodeGeoNetworkingReq( v_gnReq, v_buffer ); } /** * @desc validate GeoNetworkingInd/Unicast * @verdict Pass on success, Fail otherwise */ testcase tc_GeoNetInd_UnicastPacket() runs on TCType system TCType { var GeoNetworkingInd v_gnInd; var octetstring v_buffer := '01002B0A00208000000F0A0010E100008C2ADEADBABEBEEF00005C5C00005CCA0000C1ED006E00178C2ADEADBABEBEEF00005C5C00005CCA0000C1ED44454641554C545F5041594C4F4144FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A0A0A0A0'O; // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump if (PX_GN_UPPER_LAYER != e_any) { log("PX_GN_UPPER_LAYER shall be set to e_any"); stop; } v_gnInd := valueof(m_geoNwInd_withLinkLayerDestination( m_geoNwPdu( m_geoNwUnicastPacket( m_dummyLongPosVectorNodeC, m_dummyShortPosVectorNodeC, 4321 )), -, -, oct2int('A0A0A0A0'O) )); TestGeoNetworkingInd( v_gnInd, false); v_gnInd.msgIn.gnPacket.packet.commonHeader.plLength := 15; TestDecodeGeoNetworkingInd( v_gnInd, v_buffer ); } /** * @desc validate GeoNetworkingReq/Beacon * @verdict Pass on success, Fail otherwise */ testcase tc_GeoNetReq_BeaconPacket() runs on TCType system TCType { var GeoNetworkingReq v_gnReq; var octetstring v_buffer := '01002B0A0010800000040100A832A40102030405000011E90000007E0000007B002D007D464B1442FFFFFFFFFFFF00000000'O; // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump if (PX_GN_UPPER_LAYER != e_any) { log("PX_GN_UPPER_LAYER shall be set to e_any"); stop; } v_gnReq := valueof(m_geoNwReq_linkLayerBroadcast( m_geoNwPdu( m_geoNwBeaconPacket_payload( m_dummyLongPosVectorNodeB, '464b1442'O )))); TestGeoNetworkingReq( v_gnReq, false); v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 4; TestDecodeGeoNetworkingReq( v_gnReq, v_buffer ); } /** * @desc validate GeoNetworkingInd/Beacon * @verdict Pass on success, Fail otherwise */ testcase tc_GeoNetInd_BeaconPacket() runs on TCType system TCType { var GeoNetworkingInd v_gnInd; var octetstring v_buffer := '01002B0A0010800000040100A832A40102030405000011E90000007E0000007B002D007D464B1442FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A0A0A0A0'O; // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump if (PX_GN_UPPER_LAYER != e_any) { log("PX_GN_UPPER_LAYER shall be set to e_any"); stop; } v_gnInd := valueof(m_geoNwInd_withLinkLayerDestination( m_geoNwPdu( m_geoNwBeaconPacket_payload( m_dummyLongPosVectorNodeB, '464b1442'O )), -, -, oct2int('A0A0A0A0'O) )); TestGeoNetworkingInd( v_gnInd, false); v_gnInd.msgIn.gnPacket.packet.commonHeader.plLength := 4; TestDecodeGeoNetworkingInd( v_gnInd, v_buffer ); } /** * @desc validate GeoNetworkingReq/LsRequest * @verdict Pass on success, Fail otherwise */ testcase tc_GeoNetReq_LsRequestPacket() runs on TCType system TCType { var GeoNetworkingReq v_gnReq; var octetstring v_buffer := '01002B0A0060800000000A0030390000BC21A4FEDECABEEF0001E240000012F8000002A380372694BC21A4FEDECABEEFFFFFFFFFFFFF00000000'O; // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump if (PX_GN_UPPER_LAYER != e_any) { log("PX_GN_UPPER_LAYER shall be set to e_any"); stop; } v_gnReq := valueof( m_geoNwReq_linkLayerBroadcast( m_geoNwPdu( m_geoNwLsRequestPacket( m_dummyLongPosVectorIut, 12345, m_dummyGnAddrIut )))); TestGeoNetworkingReq( v_gnReq, false); v_gnReq.msgOut.gnPacket.packet.payload := omit TestDecodeGeoNetworkingReq( v_gnReq, v_buffer ); } /** * @desc validate GeoNetworkingReq/LsReply * @verdict Pass on success, Fail otherwise */ testcase tc_GeoNetReq_LsReplyPacket() runs on TCType system TCType { var GeoNetworkingReq v_gnReq; var octetstring v_buffer := '01002B0A0061800000000A0030390000BC21A4FEDECABEEF0001E240000012F8000002A3803726948431A4FDEA5EA5ED0000036B0000010900000315FFFFFFFFFFFF00000000'O; // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump if (PX_GN_UPPER_LAYER != e_any) { log("PX_GN_UPPER_LAYER shall be set to e_any"); stop; } v_gnReq := valueof( m_geoNwReq_linkLayerBroadcast( m_geoNwPdu( m_geoNwLsReplyPacket( m_dummyLongPosVectorIut, f_longPosVector2ShortPosVector(valueof(m_dummyLongPosVectorNodeA)), 12345 )))); TestGeoNetworkingReq( v_gnReq, false); v_gnReq.msgOut.gnPacket.packet.payload := omit TestDecodeGeoNetworkingReq( v_gnReq, v_buffer ); } } // End of group testGeoNetMessages group testGeoNetPort { /** * @desc Receive template for GeoNetworking DENM Packet * @param p_destinationShortPosVec Short position vector of destination * @param p_seqNumber Sequence number of GeoUnicast packet * @param p_nextHeader Id of next header */ template (present) GnNonSecuredPacket mw_geoNwTsbPacketWithNextHeader_cam( in template (present) LongPosVector p_sourceLongPosVec := ?, in template (present) UInt8 p_hopLimit := ?, in template (value) NextHeader p_nextHeader ) modifies mw_geoNwShbPacket := { commonHeader := mw_commonHeaderWithHopLimit( p_nextHeader, m_shbHeaderType, p_hopLimit ), payload := ? } // End of template mw_geoNwTsbPacketWithNextHeader_cam /** * @desc validate GeoNetworkingReq/Broadcast * @verdict Pass on success, Fail otherwise */ testcase tc_GeoNet_Port() runs on ItsGeoNetworking system ItsGeoNetworkingSystem { var GeoNetworkingReq v_gnReq; var ExtendedHeader v_header; var boolean v_got_it := false; var GeoNetworkingInd v_msg; if (PX_GN_UPPER_LAYER != e_any) { log("PX_GN_UPPER_LAYER shall be set to e_any"); stop; } map(self:geoNetworkingPort, system:geoNetworkingPort); v_gnReq := valueof(m_geoNwReq_linkLayerBroadcast( m_geoNwPdu( m_geoNwBroadcastPacket( m_dummyLongPosVectorNodeB, 3456, m_dummyGeoBroadcastArea1 )))); geoNetworkingPort.send(v_gnReq); tc_ac.start; alt { [] geoNetworkingPort.receive( mw_geoNwInd( mw_geoNwPdu( mw_geoNwTsbPacketWithNextHeader_cam( -, -, e_btpB )))) { if (v_got_it == false) { v_got_it := true; setverdict(pass); } repeat; } [] geoNetworkingPort.receive( mw_geoNwInd( mw_geoNwPdu( mw_geoNwLsRequestPacket( ?, ? )))) -> value v_msg { log("Receive LsRequest: ", v_msg.msgIn); // Send LsReply f_sendGeoNetMessage( m_geoNwReq_linkLayerBroadcast( m_geoNwPdu( m_geoNwLsReplyPacket( m_dummyLongPosVectorNodeA, f_longPosVector2ShortPosVector( valueof(v_msg.msgIn.gnPacket.packet.extendedHeader.lsRequestHeader.srcPosVector) ), vc_localSeqNumber )))); repeat; } [] geoNetworkingPort.receive( mw_geoNwInd( mw_geoNwPdu( mw_geoNwBeaconPacket(?) ) )) -> value v_msg { log("Receive beacon: ", v_msg.msgIn); repeat; } [] geoNetworkingPort.receive( mw_geoNwInd( ? )) -> value v_msg { setverdict(fail); } [] tc_ac.timeout { if (v_got_it == false) { setverdict(inconc, "Expected message not received1"); } } } unmap(self:geoNetworkingPort, system:geoNetworkingPort); } } // End of group testGeoNetPort } // End of group LibItsGeoNetworking_testCases group encdec_functions { function TestGeoNetworkingReq( in template (value) GeoNetworkingReq p_geoNetworkingReq, in boolean p_decode := true, in template (omit) bitstring p_expEncMsg := omit ) runs on TCType { var bitstring v_encMsg; var template (omit) TestRecord v_tr := { bs := p_expEncMsg }; var GeoNetworkingReq v_decMsg; var integer v_res := 0; // Encode template log("Encode template ", valueof(p_geoNetworkingReq)); v_encMsg := encvalue(p_geoNetworkingReq); log("Encoded message: ", bit2oct(v_encMsg)); // Check result if (not isbound(v_encMsg)) { setverdict(fail, "Encoding failed!"); stop; } if (ispresent(v_tr.bs)) { if (not match(v_encMsg, p_expEncMsg)) { log("Expected message: ", bit2oct(valueof(p_expEncMsg))); setverdict(fail, "Encoding failed, not the expected result!"); stop; } } setverdict(pass, "Encoding passed."); // Check decoding if (p_decode == true) { v_res := decvalue(v_encMsg, v_decMsg); log("Decoded message: ", v_decMsg); select (v_res) { case (0) { if(match(v_decMsg, p_geoNetworkingReq)) { setverdict(pass); } else { setverdict(fail); } } case (1) { setverdict(fail, "Decoding failed."); } case (2) { setverdict(fail, "Not enough bits."); } } } } // End of function TestGeoNetworkingReq function TestDecodeGeoNetworkingReq( in template GeoNetworkingReq p_geoNetworkingReq, in template (present) octetstring p_expEncMsg ) runs on TCType { var GeoNetworkingReq v_decMsg; var bitstring v_encMsg := oct2bit(valueof(p_expEncMsg)); var integer v_res := 0; v_res := decvalue(v_encMsg, v_decMsg); select (v_res) { case (0) { log("v_decMsg : ", v_decMsg); if(match(valueof(v_decMsg), p_geoNetworkingReq)) { setverdict(pass); } else { setverdict(fail); } } case (1) { setverdict(fail, "Decoding failed."); } case (2) { setverdict(fail, "Not enough bits."); } } // End of 'select' statement }// End of function TestDecodeGeoNetworkingReq function TestGeoNetworkingInd( in template (value) GeoNetworkingInd p_geoNetworkingInd, in boolean p_decode := true, in template (omit) bitstring p_expEncMsg := omit ) runs on TCType { var bitstring v_encMsg; var template (omit) TestRecord v_tr := { bs := p_expEncMsg }; var GeoNetworkingInd v_decMsg; var integer v_res := 0; // Encode template log("Encode template ", valueof(p_geoNetworkingInd)); v_encMsg := encvalue(p_geoNetworkingInd); log("Encoded message: ", bit2oct(v_encMsg)); // Check result if (not isbound(v_encMsg)) { setverdict(fail, "Encoding failed!"); stop; } if (ispresent(v_tr.bs)) { if (not match(v_encMsg, p_expEncMsg)) { log("Expected message: ", bit2oct(valueof(p_expEncMsg))); setverdict(fail, "Encoding failed, not the expected result!"); stop; } } setverdict(pass, "Encoding passed."); // Check decoding if (p_decode == true) { v_res := decvalue(v_encMsg, v_decMsg); log("Decoded message: ", v_decMsg); select (v_res) { case (0) { if(match(v_decMsg, p_geoNetworkingInd)) { setverdict(pass); } else { setverdict(fail); } } case (1) { setverdict(fail, "Decoding failed."); } case (2) { setverdict(fail, "Not enough bits."); } } } } // End of function TestGeoNetworkingInd function TestDecodeGeoNetworkingInd( in template GeoNetworkingInd p_geoNetworkingInd, in template (present) octetstring p_expEncMsg ) runs on TCType { var GeoNetworkingInd v_decMsg; var bitstring v_encMsg := oct2bit(valueof(p_expEncMsg)); var integer v_res := 0; v_res := decvalue(v_encMsg, v_decMsg); select (v_res) { case (0) { log("v_decMsg: ", v_decMsg); if(match(valueof(v_decMsg), p_geoNetworkingInd)) { setverdict(pass); } else { setverdict(fail); } } case (1) { setverdict(fail, "Decoding failed."); } case (2) { setverdict(fail, "Not enough bits."); } } // End of 'select' statement }// End of function TestDecodeGeoNetworkingReq } // End of group encdec_functions } // End of module