ItsRSUsSimulator_Functions.ttcn 121 KB
Newer Older
YannGarcia's avatar
YannGarcia committed
          // Send UtGnEventInd
          log("f_processBeacon: v_payload=", v_payload);
          v_utGnEventInd.rawPayload := v_payload;
          cfPort.send(v_utGnEventInd);
        }
    }

garciay's avatar
garciay committed
    function f_processCam(
YannGarcia's avatar
YannGarcia committed
                          in GeoNetworkingPdu p_geoNetworkingPdu
garciay's avatar
garciay committed
    ) runs on ItsRSUsSimulator {
        var bitstring v_enc_msg;
YannGarcia's avatar
YannGarcia committed
        log("f_processCam: CAM=", p_geoNetworkingPdu.gnPacket.packet.payload);
garciay's avatar
garciay committed
        if (PICS_SEND_CAM_INDICATION) {
          var UtCamEventInd v_utCamEventInd;
          var integer v_result;
          // Extract CAM message
          var octetstring v_payload := p_geoNetworkingPdu.gnPacket.packet.payload;
          // Remove BTP layer
          v_payload := substr(v_payload, 4, lengthof(v_payload) - 4);
YannGarcia's avatar
YannGarcia committed
          // Send UtCamEventInd
          log("f_processCam: v_payload=", v_payload);
garciay's avatar
garciay committed
          v_enc_msg := oct2bit(v_payload);
          if (decvalue(v_enc_msg, v_utCamEventInd.camMsg) == 0) {
            cfPort.send(v_utCamEventInd);
          }
        }
    }
YannGarcia's avatar
YannGarcia committed

    function f_processDenm(
                           in GeoNetworkingPdu p_geoNetworkingPdu
    ) runs on ItsRSUsSimulator {
        var bitstring v_enc_msg;
        log("f_processDenm: DENM=", p_geoNetworkingPdu.gnPacket.packet.payload);
        if (PICS_SEND_DENM_INDICATION) {
          var UtDenmEventInd v_utDenmEventInd;
          var integer v_result;
          // Extract DENM message
          var octetstring v_payload := p_geoNetworkingPdu.gnPacket.packet.payload;
          // Remove BTP layer
          v_payload := substr(v_payload, 4, lengthof(v_payload) - 4);
          // Send UtDenmEventInd
          log("f_processDenm: v_payload=", v_payload);
          v_enc_msg := oct2bit(v_payload);
          if (decvalue(v_enc_msg, v_utDenmEventInd.denMsg) == 0) {
            cfPort.send(v_utDenmEventInd);
          }
        }
    }

Yann Garcia's avatar
Yann Garcia committed
    function f_processIvim(
                           in GeoNetworkingPdu p_geoNetworkingPdu
    ) runs on ItsRSUsSimulator {
        var bitstring v_enc_msg;
        log("f_processIvim: IVIM=", p_geoNetworkingPdu.gnPacket.packet.payload);
        if (PICS_SEND_IVIM_INDICATION) {
          var UtIvimEventInd v_utIvimEventInd;
          var integer v_result;
          // Extract IVIM message
          var octetstring v_payload := p_geoNetworkingPdu.gnPacket.packet.payload;
          // Remove BTP layer
          v_payload := substr(v_payload, 4, lengthof(v_payload) - 4);
          // Send UtIvimEventInd
          log("f_processIvim: v_payload=", v_payload);
          v_enc_msg := oct2bit(v_payload);
          if (decvalue(v_enc_msg, v_utIvimEventInd.iviMsg) == 0) {
            cfPort.send(v_utIvimEventInd);
          }
        }
    }

    function f_processMapem(
                           in GeoNetworkingPdu p_geoNetworkingPdu
    ) runs on ItsRSUsSimulator {
        var bitstring v_enc_msg;
        log("f_processMapem: MAPEM=", p_geoNetworkingPdu.gnPacket.packet.payload);
        if (PICS_SEND_MAPEM_INDICATION) {
          var UtMapemEventInd v_utMapemEventInd;
          var integer v_result;
          // Extract MAPEM message
          var octetstring v_payload := p_geoNetworkingPdu.gnPacket.packet.payload;
          // Remove BTP layer
          v_payload := substr(v_payload, 4, lengthof(v_payload) - 4);
          // Send UtMapemEventInd
          log("f_processMapem: v_payload=", v_payload);
          v_enc_msg := oct2bit(v_payload);
          if (decvalue(v_enc_msg, v_utMapemEventInd.mapeMsg) == 0) {
            cfPort.send(v_utMapemEventInd);
          }
        }
    }

    function f_processSpatem(
                           in GeoNetworkingPdu p_geoNetworkingPdu
    ) runs on ItsRSUsSimulator {
        var bitstring v_enc_msg;
        log("f_processSpatem: SPATEM=", p_geoNetworkingPdu.gnPacket.packet.payload);
        if (PICS_SEND_SPATEM_INDICATION) {
          var UtSpatemEventInd v_utSpatemEventInd;
          var integer v_result;
          // Extract SPATEM message
          var octetstring v_payload := p_geoNetworkingPdu.gnPacket.packet.payload;
          // Remove BTP layer
          v_payload := substr(v_payload, 4, lengthof(v_payload) - 4);
          // Send UtSpatemEventInd
          log("f_processSpatem: v_payload=", v_payload);
          v_enc_msg := oct2bit(v_payload);
          if (decvalue(v_enc_msg, v_utSpatemEventInd.spateMsg) == 0) {
            cfPort.send(v_utSpatemEventInd);
          }
        }
    }

garciay's avatar
garciay committed
    function f_processSrem(
                           in GeoNetworkingPdu p_geoNetworkingPdu
    ) runs on ItsRSUsSimulator {
Yann Garcia's avatar
Yann Garcia committed
        var bitstring v_enc_msg;
        log("SREM=", p_geoNetworkingPdu);
Yann Garcia's avatar
Yann Garcia committed
        /*if (ispresent(p_geoNetworkingPdu.gnPacket.packet.payload)) {
            if (ispresent(p_geoNetworkingPdu.gnPacket.packet.payload.decodedPayload.btpPacket.payload.decodedPayload)) {
                if (ischosen(p_geoNetworkingPdu.gnPacket.packet.payload.decodedPayload.btpPacket.payload.decodedPayload.sremPacket)) {
                    var SignalRequestMessage v_signalRequestMessage := p_geoNetworkingPdu.gnPacket.packet.payload.decodedPayload.btpPacket.payload.decodedPayload.sremPacket.srm;
                    var template (value) GnRawPayload v_payload;
                    
                    log(v_signalRequestMessage);
                    // Build response
                    // TODO v_ssem.ssm.status
                    v_payload := valueof(
                        f_adaptPayload(
                            bit2oct(
                                encvalue(
                                    valueof(
                                        m_ssem(
                                            v_signalRequestMessage
                            )))),
                            PICS_SSEM_BTP_DESTINATION_PORT,
                            PICS_SSEM_BTP_SOURCE_PORT
                        )
                    );
                    // Send SSEM 
                    f_send(v_payload, PICS_SSEM_ITS_AID);
                } // else, ignore message
            } // else, ignore message
Yann Garcia's avatar
Yann Garcia committed
        }*/ // else, ignore message
Yann Garcia's avatar
Yann Garcia committed
        if (PICS_SEND_SREM_INDICATION) {
          var UtSremEventInd v_utSremEventInd;
          var integer v_result;
          // Extract SREM message
          var octetstring v_payload := p_geoNetworkingPdu.gnPacket.packet.payload;
          // Remove BTP layer
          v_payload := substr(v_payload, 4, lengthof(v_payload) - 4);
          // Send UtSremEventInd
          log("f_processSrem: v_payload=", v_payload);
          v_enc_msg := oct2bit(v_payload);
          if (decvalue(v_enc_msg, v_utSremEventInd.sreMsg) == 0) {
            cfPort.send(v_utSremEventInd);
          }
        } // else, ignore message
    } // End of function f_processSrem
Yann Garcia's avatar
Yann Garcia committed
    function f_processSsem(
                           in GeoNetworkingPdu p_geoNetworkingPdu
    ) runs on ItsRSUsSimulator {
        var bitstring v_enc_msg;
        log("f_processSsem: SSEM=", p_geoNetworkingPdu.gnPacket.packet.payload);
        if (PICS_SEND_SSEM_INDICATION) {
          var UtSsemEventInd v_utSsemEventInd;
          var integer v_result;
          // Extract SSEM message
          var octetstring v_payload := p_geoNetworkingPdu.gnPacket.packet.payload;
          // Remove BTP layer
          v_payload := substr(v_payload, 4, lengthof(v_payload) - 4);
          // Send UtSsemEventInd
          log("f_processSsem: v_payload=", v_payload);
          v_enc_msg := oct2bit(v_payload);
          if (decvalue(v_enc_msg, v_utSsemEventInd.sseMsg) == 0) {
            cfPort.send(v_utSsemEventInd);
          }
        } // else, ignore message
    } // End of function f_processSsem
    
    function f_processRtcmem(
                           in GeoNetworkingPdu p_geoNetworkingPdu
    ) runs on ItsRSUsSimulator {
        var bitstring v_enc_msg;
        log("f_processRtcmem: RTCMEM=", p_geoNetworkingPdu.gnPacket.packet.payload);
        if (PICS_SEND_RTCMEM_INDICATION) {
          var UtRtcmemEventInd v_utRtcmemEventInd;
          var integer v_result;
          // Extract RTCMEM message
          var octetstring v_payload := p_geoNetworkingPdu.gnPacket.packet.payload;
          // Remove BTP layer
          v_payload := substr(v_payload, 4, lengthof(v_payload) - 4);
          // Send UtRtcmemEventInd
          log("f_processRtcmem: v_payload=", v_payload);
          v_enc_msg := oct2bit(v_payload);
          if (decvalue(v_enc_msg, v_utRtcmemEventInd.rtcmemMsg) == 0) {
            cfPort.send(v_utRtcmemEventInd);
          }
        }
    }

garciay's avatar
garciay committed
    function f_incLocalSeqNumber() runs on ItsRSUsSimulator return UInt16 {
        vc_localSeqNumber := (vc_localSeqNumber + 1) mod 65536;
        return vc_localSeqNumber;
    }
    
garciay's avatar
garciay committed
    function f_incMsgIssueRevision() runs on ItsRSUsSimulator return MsgCount {
        vc_msgIssueRevision := (vc_msgIssueRevision + 1) mod 128; // See MsgCount declaration
        return vc_msgIssueRevision;
    }
    
    function f_getMsgIssueRevision() runs on ItsRSUsSimulator return MsgCount {
        return vc_msgIssueRevision;
    }
    
    function f_incDenmSequenceNumber() runs on ItsRSUsSimulator return SequenceNumber {
        vc_sequenceNumber := (vc_sequenceNumber + 1) mod 65536; // See SequenceNumber declaration
        return vc_sequenceNumber;
    }
    
garciay's avatar
garciay committed
    function f_getDenmSequenceNumber() runs on ItsRSUsSimulator return SequenceNumber {
garciay's avatar
garciay committed
        return vc_sequenceNumber;
garciay's avatar
garciay committed
    function f_payload_template(
YannGarcia's avatar
YannGarcia committed
                                in integer p_dest_port,
garciay's avatar
garciay committed
                                in integer p_src_port
    ) return template (present) octetstring {
YannGarcia's avatar
YannGarcia committed
      //log(">>> f_payload_template: ", p_dest_port, " - ", p_src_port);
      var template (value) Oct2 v_t1 := int2oct(p_dest_port, 2);
      var template (value) Oct2 v_t2 := int2oct(p_src_port, 2);
      var template (present) octetstring v_t3 := ? /*? length (5 .. 65535)*/;
Yann Garcia's avatar
Yann Garcia committed
      var template (present) octetstring v_out := valueof(v_t1) & valueof(v_t2) & v_t3;
YannGarcia's avatar
YannGarcia committed
      //log("<<< f_payload_template: v_out=", v_out);
      return v_out
garciay's avatar
garciay committed
    }
    altstep a_process_cf_ut_command() runs on ItsRSUsSimulator {
garciay's avatar
garciay committed
      var UtGnInitialize v_utGnInitialize;
YannGarcia's avatar
YannGarcia committed
      var UtCamInitialize v_utCamInitialize;
      var UtDenmInitialize v_utDenmInitialize;
      var UtIvimInitialize v_utIvimInitialize;
      var UtMapemSpatemInitialize v_utMapemSpatemInitialize;
Yann Garcia's avatar
Yann Garcia committed
      var UtMapemSpatemTrigger v_utMapemSpatemTrigger;
      var UtSremInitialize v_utSremInitialize;
      var UtRtcmemInitialize v_utRtcmemInitialize;
      var UtPkiInitialize v_utPkiInitialize;
garciay's avatar
garciay committed
      var UtGnTrigger v_utGnTrigger;
garciay's avatar
garciay committed
      var UtCamTrigger v_utCamTrigger;
YannGarcia's avatar
YannGarcia committed
      var UtDenmTrigger v_utDenmTrigger;
Yann Garcia's avatar
Yann Garcia committed
      var UtIvimTrigger v_utIvimTrigger;
      var UtSremTrigger v_utSremTrigger;
Yann Garcia's avatar
Yann Garcia committed
      var UtRtcmemTrigger v_utRtcmemTrigger;
      var UtDenmUpdate v_utDenmUpdate;
Yann Garcia's avatar
Yann Garcia committed
      var UtIvimUpdate v_utIvimUpdate;
      var UtSremUpdate v_utSremUpdate;
Yann Garcia's avatar
Yann Garcia committed
      var UtRtcmemUpdate v_utRtcmemUpdate;
      var UtDenmTermination v_utDenmTermination;
Yann Garcia's avatar
Yann Garcia committed
      var UtIvimTermination v_utIvimTermination;
      var UtSremCancelation v_utSremCancelation;
Yann Garcia's avatar
Yann Garcia committed
      var UtRtcmemTermination v_utRtcmemTermination;
      var UtPkiTrigger v_utPkiTrigger;
garciay's avatar
garciay committed
        [] cfPort.receive(UtGnInitialize:?) -> value v_utGnInitialize {
YannGarcia's avatar
YannGarcia committed
          var GeoNetworkingPdu v_geoNwPdu;

YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utGnInitialize = ", v_utGnInitialize);
YannGarcia's avatar
YannGarcia committed
          v_geoNwPdu :=valueof(
                               m_geoNwPdu(
                                          m_geoNwBeaconPacket(
                                                              vc_longPosVectorRsu
                                                              ),
                                          m_defaultLifetime,
                                          1
                                          )
                               );
          v_geoNwPdu.gnPacket.packet.commonHeader.flags := f_isMobile();
          vc_rsuMessagesValueList[vc_rsu_id].beacon := v_geoNwPdu;
garciay's avatar
garciay committed
          cfPort.send(UtGnResults: { utGnInitializeResult := true } );
          repeat;
        }
garciay's avatar
garciay committed
        [] cfPort.receive(UtGnTrigger:?) -> value v_utGnTrigger {
YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utGnTrigger = ", v_utGnTrigger);
garciay's avatar
garciay committed
          if (ischosen(v_utGnTrigger.geoUnicast)) {
            var GnNonSecuredPacket v_geoNwUnicastPacket := valueof(
                                                                   m_geoNwUnicastPacket_with_payload(
                                                                                                     vc_longPosVectorRsu,
                                                                                                     f_getIutShortPosVector(),
                                                                                                     f_incLocalSeqNumber(),
                                                                                                     c_defaultHopLimit,
                                                                                                     v_utGnTrigger.geoUnicast.trafficClass,
                                                                                                     v_utGnTrigger.geoUnicast.payload
YannGarcia's avatar
YannGarcia committed
                                                                                                     ));
garciay's avatar
garciay committed
            var GeoNetworkingPdu v_geoNwPdu := valueof(
                                                       m_geoNwPdu(
                                                                  v_geoNwUnicastPacket,
YannGarcia's avatar
YannGarcia committed
                                                                  m_lifetimeBase1s(v_utGnTrigger.geoUnicast.lifetime / 1000),
garciay's avatar
garciay committed
                                                                  c_defaultHopLimit
garciay's avatar
garciay committed
            v_geoNwPdu.gnPacket.packet.commonHeader.nextHeader := e_any;
YannGarcia's avatar
YannGarcia committed
            v_geoNwPdu.gnPacket.packet.commonHeader.flags := f_isMobile();
garciay's avatar
garciay committed
            v_geoNwPdu.gnPacket.packet.extendedHeader.geoUnicastHeader.dstPosVector.gnAddr := v_utGnTrigger.geoUnicast.gnAddress;
YannGarcia's avatar
YannGarcia committed
            vc_rsuMessagesValueList[vc_rsu_id].beacon := v_geoNwPdu;
            cfPort.send(UtGnResults: { utGnTriggerResult := true } );
garciay's avatar
garciay committed
          } else if (ischosen(v_utGnTrigger.geoBroadcast)) {
            var GeoBroadcastArea v_broadcastArea;
            var GnNonSecuredPacket v_geoNwBroadcastPacket;
            var GeoNetworkingPdu v_geoNwPdu;

            if (v_utGnTrigger.geoBroadcast.shape == e_geoCircle) {
              v_broadcastArea.geoBroadcastSubType := e_geoBroadcastCircle;
            } else if (v_utGnTrigger.geoBroadcast.shape == e_geoRect) {
              v_broadcastArea.geoBroadcastSubType := e_geoBroadcastRect;
            } else if (v_utGnTrigger.geoBroadcast.shape == e_geoElip) {
              v_broadcastArea.geoBroadcastSubType := e_geoBroadcastElip;
            } else {
              v_broadcastArea.geoBroadcastSubType := e_reserved;
            }
            v_broadcastArea.geoBroadcastArea := v_utGnTrigger.geoBroadcast.area;
            v_geoNwBroadcastPacket := valueof(
                                              m_geoNwBroadcastPacket_payload(
                                                                             vc_longPosVectorRsu,
                                                                             f_incLocalSeqNumber(),
                                                                             v_broadcastArea,
                                                                             c_defaultHopLimit,
                                                                             v_utGnTrigger.geoBroadcast.trafficClass,
                                                                             v_utGnTrigger.geoBroadcast.payload
                                                                             ));
YannGarcia's avatar
YannGarcia committed
            v_geoNwBroadcastPacket.commonHeader.flags := f_isMobile();
garciay's avatar
garciay committed
            v_geoNwPdu := valueof(
                                  m_geoNwPdu(
                                             v_geoNwBroadcastPacket,
YannGarcia's avatar
YannGarcia committed
                                             m_lifetimeBase1s(v_utGnTrigger.geoBroadcast.lifetime / 1000),
                                             c_defaultHopLimit
                                             ));
            v_geoNwPdu.gnPacket.packet.commonHeader.nextHeader := e_any;
            v_geoNwPdu.gnPacket.packet.commonHeader.flags := f_isMobile();
            vc_rsuMessagesValueList[vc_rsu_id].beacon := v_geoNwPdu;
            cfPort.send(UtGnResults: { utGnTriggerResult := true } );
          } else if (ischosen(v_utGnTrigger.geoAnycast)) {
            var GeoAnycastArea v_anycastArea;
            var GnNonSecuredPacket v_geoNwAnycastPacket;
            var GeoNetworkingPdu v_geoNwPdu;

            if (v_utGnTrigger.geoAnycast.shape == e_geoCircle) {
              v_anycastArea.geoAnycastSubType := e_geoAnycastCircle;
            } else if (v_utGnTrigger.geoAnycast.shape == e_geoRect) {
              v_anycastArea.geoAnycastSubType := e_geoAnycastRect;
            } else if (v_utGnTrigger.geoAnycast.shape == e_geoElip) {
              v_anycastArea.geoAnycastSubType := e_geoAnycastElip;
            } else {
              v_anycastArea.geoAnycastSubType := e_reserved;
            }
            v_anycastArea.geoAnycastArea := v_utGnTrigger.geoAnycast.area;
            v_geoNwAnycastPacket := valueof(
                                            m_geoNwAnycastPacket_payload(
                                                                         vc_longPosVectorRsu,
                                                                         f_incLocalSeqNumber(),
                                                                         v_anycastArea,
                                                                         c_defaultHopLimit,
                                                                         v_utGnTrigger.geoAnycast.trafficClass,
                                                                         v_utGnTrigger.geoAnycast.payload
                                                                         ));
            v_geoNwPdu := valueof(
                                  m_geoNwPdu(
                                             v_geoNwAnycastPacket,
                                             m_lifetimeBase1s(v_utGnTrigger.geoAnycast.lifetime / 1000),
garciay's avatar
garciay committed
                                             c_defaultHopLimit
                                             ));
YannGarcia's avatar
YannGarcia committed
            v_geoNwPdu.gnPacket.packet.commonHeader.flags := f_isMobile();
            v_geoNwPdu.gnPacket.packet.commonHeader.nextHeader := e_any;
            vc_rsuMessagesValueList[vc_rsu_id].beacon := v_geoNwPdu;
            cfPort.send(UtGnResults: { utGnTriggerResult := true } );
          } else if (ischosen(v_utGnTrigger.shb)) {
            var GnNonSecuredPacket v_geoShbPacket;
            var GeoNetworkingPdu v_geoNwPdu;

            v_geoShbPacket :=  valueof(
                                       m_geoNwShbPacket_payload(
                                                                vc_longPosVectorRsu,
                                                                v_utGnTrigger.shb.payload
                                                                ));
            v_geoShbPacket.commonHeader.maxHopLimit := 1;
            v_geoShbPacket.commonHeader.trafficClass.scf := v_utGnTrigger.shb.trafficClass.scf;
            v_geoShbPacket.commonHeader.trafficClass.channelOffload := v_utGnTrigger.shb.trafficClass.channelOffload;
            v_geoShbPacket.commonHeader.trafficClass.tcId := v_utGnTrigger.shb.trafficClass.tcId;
            v_geoNwPdu := valueof(
                                  m_geoNwPdu(
                                             v_geoShbPacket,
                                             m_defaultLifetime,
                                             1
                                             ));
            v_geoNwPdu.gnPacket.packet.commonHeader.flags := f_isMobile();
            v_geoNwPdu.gnPacket.packet.commonHeader.nextHeader := e_any;
            vc_rsuMessagesValueList[vc_rsu_id].beacon := v_geoNwPdu;
            cfPort.send(UtGnResults: { utGnTriggerResult := true } );
          } else if (ischosen(v_utGnTrigger.tsb)) {
            var GnNonSecuredPacket v_geoTsbPacket;
            var GeoNetworkingPdu v_geoNwPdu;

            v_geoTsbPacket :=  valueof(
                                       m_geoNwTsbPacket_payload(
                                                                f_incLocalSeqNumber(),
                                                                vc_longPosVectorRsu,
                                                                -,
                                                                -,
                                                                v_utGnTrigger.tsb.payload
                                                                ));
            v_geoTsbPacket.commonHeader.trafficClass.scf := v_utGnTrigger.tsb.trafficClass.scf;
            v_geoTsbPacket.commonHeader.trafficClass.channelOffload := v_utGnTrigger.tsb.trafficClass.channelOffload;
            v_geoTsbPacket.commonHeader.trafficClass.tcId := v_utGnTrigger.tsb.trafficClass.tcId;
            v_geoNwPdu := valueof(
                                  m_geoNwPdu(
                                             v_geoTsbPacket,
                                             m_defaultLifetime,
                                             c_defaultHopLimit
                                             ));
            v_geoNwPdu.gnPacket.packet.commonHeader.nextHeader := e_any;
            v_geoNwPdu.gnPacket.packet.commonHeader.flags := f_isMobile();
            vc_rsuMessagesValueList[vc_rsu_id].beacon := v_geoNwPdu;
            cfPort.send(UtGnResults: { utGnTriggerResult := true } );
          } else {
            cfPort.send(UtGnResults: { utGnTriggerResult := false } );
garciay's avatar
garciay committed
          }
          repeat;
        }
YannGarcia's avatar
YannGarcia committed
        [vc_cam == true] cfPort.receive(UtCamInitialize:?) -> value v_utCamInitialize {
YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utCamInitialize = ", v_utCamInitialize);
          if (oct2int(v_utCamInitialize.hashedId8) != 0) {
            var charstring v_certificate_id;
            var EtsiTs103097Certificate v_certificate;
            log("a_process_cf_ut_command: Looking for certificate ", v_utCamInitialize.hashedId8);
            f_getCertificateFromDigest(v_utCamInitialize.hashedId8, v_certificate, v_certificate_id);
            log("a_process_cf_ut_command (pki): Change certificate to ", v_certificate_id);
            f_acTriggerSecEvent(m_acEnableSecurity(v_certificate_id));
          }
YannGarcia's avatar
YannGarcia committed
          vc_cam_timer_value := 1.0; // Reset CAM timer
          vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.curvature.curvatureValue := 0;
YannGarcia's avatar
YannGarcia committed
          vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.heading.headingValue := 0;
          vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.lowFrequencyContainer.basicVehicleContainerLowFrequency.vehicleRole := default_;
          vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.specialVehicleContainer := omit;
          cfPort.send(UtCamResults: { utCamInitializeResult := true } );
          repeat;
YannGarcia's avatar
YannGarcia committed
        [vc_cam == true] cfPort.receive(UtCamTrigger: { changeSpeed := ? }) -> value v_utCamTrigger {
YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utCamTrigger = ", v_utCamTrigger);
          cfPort.send(UtCamResults: { utCamTriggerResult := true } );
garciay's avatar
garciay committed
          vc_cam_timer_value := vc_cam_timer_value / 2.0;
          repeat;
        }
        [vc_cam == true] cfPort.receive(UtCamTrigger: { changeCurvature := ? }) -> value v_utCamTrigger {
YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utCamTrigger = ", v_utCamTrigger);
YannGarcia's avatar
YannGarcia committed
          if (ischosen(vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency)) {
garciay's avatar
garciay committed
            cfPort.send(UtCamResults: { utCamTriggerResult := true } );
            vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.curvature.curvatureValue := v_utCamTrigger.changeCurvature;
          } else {
            cfPort.send(UtCamResults: { utCamTriggerResult := false } );
          }
garciay's avatar
garciay committed
        [vc_cam == true] cfPort.receive(UtCamTrigger: { changeHeading := ? }) -> value v_utCamTrigger {
YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utCamTrigger = ", v_utCamTrigger);
YannGarcia's avatar
YannGarcia committed
          if (ischosen(vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency)) {
garciay's avatar
garciay committed
            cfPort.send(UtCamResults: { utCamTriggerResult := true } );
garciay's avatar
garciay committed
            vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.heading.headingValue := valueof(vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.heading.headingValue) + v_utCamTrigger.changeHeading;
garciay's avatar
garciay committed
          } else {
            cfPort.send(UtCamResults: { utCamTriggerResult := false } );
          }
          repeat;
        }
YannGarcia's avatar
YannGarcia committed
        [vc_cam == true] cfPort.receive(UtCamTrigger: { setVehicleRole := ? }) -> value v_utCamTrigger {
YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utCamTrigger = ", v_utCamTrigger);
YannGarcia's avatar
YannGarcia committed
          vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.lowFrequencyContainer.basicVehicleContainerLowFrequency.vehicleRole := v_utCamTrigger.setVehicleRole;
          vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.specialVehicleContainer := { publicTransportContainer := { embarkationStatus := true, ptActivation := omit } };
garciay's avatar
garciay committed
          cfPort.send(UtCamResults: { utCamTriggerResult := true } );
          repeat;
YannGarcia's avatar
YannGarcia committed
        }
        [] cfPort.receive(UtDenmInitialize:?) -> value v_utDenmInitialize {
YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utDenmInitialize = ", v_utDenmInitialize);
YannGarcia's avatar
YannGarcia committed
          vc_rsuMessagesValueList[vc_rsu_id].denms := {};
          vc_denmEventCounter := 0;
          vc_denm := true;
          cfPort.send(UtDenmResults: { utDenmInitializeResult := true } );
          repeat;
YannGarcia's avatar
YannGarcia committed
        [vc_denm == true] cfPort.receive(UtDenmTrigger:?) -> value v_utDenmTrigger {
          var template (value) DenmParmContainers v_denmParmContainers;
          var DenmEventsParmsPerZone v_denmEventsParmsPerZone := PICS_DENM_EVENTS_RSU_UC1[vc_rsu_id][PX_ETSI_ZONE_ID - 1];
          var integer seq_number := f_incDenmSequenceNumber();

YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utDenmTrigger: ", v_utDenmTrigger);
YannGarcia's avatar
YannGarcia committed
          v_denmParmContainers := m_denmParmContainers(
                                                       PICS_RSU_PARAMS[vc_rsu_id].stationID,
                                                       seq_number,
                                                       v_utDenmTrigger.repetitionInterval,
                                                       v_denmEventsParmsPerZone[0].eventPosition,
                                                       v_utDenmTrigger.situation.eventType.causeCode,
                                                       v_denmEventsParmsPerZone[0].eventHistory,
                                                       v_denmEventsParmsPerZone[0].traces,
                                                       v_utDenmTrigger.validityDuration,
                                                       v_utDenmTrigger.relevanceDistance,
                                                       v_utDenmTrigger.relevanceTrafficDirection
                                                       );
          v_denmParmContainers.managementContainer.detectionTime := v_utDenmTrigger.detectionTime;
          vc_rsuMessagesValueList[vc_rsu_id].denms[lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms)] := valueof(
                                                                                                                  m_denmPdu_rsu(
                                                                                                                                PICS_RSU_PARAMS[vc_rsu_id].stationID,
                                                                                                                                m_denm(
                                                                                                                                       v_denmParmContainers.managementContainer,
                                                                                                                                       v_denmParmContainers.situationContainer,
                                                                                                                                       v_denmParmContainers.locationContainer
                                                                                                                                       )));
YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: utDenmTrigger: denm=[" & int2char(lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms) - 1) & "]=", vc_rsuMessagesValueList[vc_rsu_id].denms[lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms) - 1]);
YannGarcia's avatar
YannGarcia committed
          //denm={ { header := { protocolVersion := 2, messageID := 1, stationID := 1111101 }, denm := { management := { actionID := { originatingStationID := 1111101, sequenceNumber := 1 }, detectionTime := 510819417810, referenceTime := 510819420809, termination := omit, eventPosition := { latitude := 367467556, longitude := -45552381, positionConfidenceEllipse := { semiMajorConfidence := 100, semiMinorConfidence := 100, semiMajorOrientation := 0 }, altitude := { altitudeValue := 0, altitudeConfidence := alt_000_01 (0) } }, relevanceDistance := lessThan50m (0), relevanceTrafficDirection := upstreamTraffic (1), validityDuration := 2, transmissionInterval := omit, stationType := 15 }, situation := { informationQuality := 0, eventType := { causeCode := 91, subCauseCode := 0 }, linkedCause := omit, eventHistory := { { eventPosition := { deltaLatitude := 135, deltaLongitude := -147, deltaAltitude := 0 }, eventDeltaTime := omit, informationQuality := 0 }, { eventPosition := { deltaLatitude := -68, deltaLongitude := 74, deltaAltitude := 0 }, eventDeltaTime := omit, informationQuality := 0 } } }, location := { eventSpeed := omit, eventPositionHeading := omit, traces := { { { pathPosition := { deltaLatitude := -1086, deltaLongitude := 2551, deltaAltitude := 0 }, pathDeltaTime := omit }, { pathPosition := { deltaLatitude := -450, deltaLongitude := 1010, deltaAltitude := 0 }, pathDeltaTime := omit }, { pathPosition := { deltaLatitude := -460, deltaLongitude := 1000, deltaAltitude := 0 }, pathDeltaTime := omit }, { pathPosition := { deltaLatitude := -440, deltaLongitude := 1000, deltaAltitude := 0 }, pathDeltaTime := omit }, { pathPosition := { deltaLatitude := -440, deltaLongitude := 990, deltaAltitude := 0 }, pathDeltaTime := omit } } }, roadType := omit }, alacarte := omit } } }
          if (lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms) == 1) {
            tc_denm.start;
          }
          cfPort.send(UtDenmResults: { utDenmTriggerResult := { result := true, actionId := vc_rsuMessagesValueList[vc_rsu_id].denms[lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms) - 1].denm.management.actionID } } );
          repeat;
        }
        [vc_denm == true] cfPort.receive(UtDenmUpdate:?) -> value v_utDenmUpdate {
          var integer v_i := 0;
          var boolean v_found := false;

YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utDenmUpdate = ", v_utDenmUpdate);
YannGarcia's avatar
YannGarcia committed
          for (v_i := 0; v_i < lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms); v_i := v_i + 1) {
            if (v_utDenmUpdate.actionId.sequenceNumber == valueof(vc_rsuMessagesValueList[vc_rsu_id].denms[v_i].denm.management.actionID.sequenceNumber)) {
              v_found := true;
              break;
            }
          } // End of 'for' statement
          if (v_found == true) {
            vc_rsuMessagesValueList[vc_rsu_id].denms[v_i].denm.management.detectionTime := v_utDenmUpdate.detectionTime;
            if (ispresent(v_utDenmUpdate.validityDuration)) {
              vc_rsuMessagesValueList[vc_rsu_id].denms[v_i].denm.management.validityDuration := v_utDenmUpdate.validityDuration;
            }
            if (ispresent(v_utDenmUpdate.situation)) {
              vc_rsuMessagesValueList[vc_rsu_id].denms[v_i].denm.situation := v_utDenmUpdate.situation;
            }
            if (ispresent(v_utDenmUpdate.relevanceDistance)) {
              vc_rsuMessagesValueList[vc_rsu_id].denms[v_i].denm.management.relevanceDistance := v_utDenmUpdate.relevanceDistance;
            }
            if (ispresent(v_utDenmUpdate.relevanceTrafficDirection)) {
              vc_rsuMessagesValueList[vc_rsu_id].denms[v_i].denm.management.relevanceTrafficDirection := v_utDenmUpdate.relevanceTrafficDirection;
            }
            if (ispresent(v_utDenmUpdate.transmissionInterval)) {
              vc_rsuMessagesValueList[vc_rsu_id].denms[v_i].denm.management.transmissionInterval := v_utDenmUpdate.transmissionInterval;
            }
            if (ispresent(v_utDenmUpdate.transmissionInterval)) {
              vc_rsuMessagesValueList[vc_rsu_id].denms[v_i].denm.management.transmissionInterval := v_utDenmUpdate.transmissionInterval;
            }
            if (ispresent(v_utDenmUpdate.alacarte)) {
              vc_rsuMessagesValueList[vc_rsu_id].denms[v_i].denm.alacarte := v_utDenmUpdate.alacarte;
            }
          }
          cfPort.send(UtDenmResults: { utDenmUpdateResult := { result := true, actionId := vc_rsuMessagesValueList[vc_rsu_id].denms[v_i].denm.management.actionID } } );
          repeat;
        }
        [vc_denm == true] cfPort.receive(UtDenmTermination:?) -> value v_utDenmTermination {
          var integer v_i := 0;
          var boolean v_found := false;

YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utDenmTermination: ", v_utDenmTermination);
YannGarcia's avatar
YannGarcia committed
          for (v_i := 0; v_i < lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms); v_i := v_i + 1) {
            if (v_utDenmTermination.actionId.sequenceNumber == valueof(vc_rsuMessagesValueList[vc_rsu_id].denms[v_i].denm.management.actionID.sequenceNumber)) {
              v_found := true;
              break;
            }
          } // End of 'for' statement
          if (v_found == true) {
YannGarcia's avatar
YannGarcia committed
            log("a_process_cf_ut_command: v_utDenmTermination: v_i=", v_i);
            log("a_process_cf_ut_command: v_utDenmTermination: l=", lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms));
YannGarcia's avatar
YannGarcia committed
            if (lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms) > 1) { //Shift elements
              for (var integer v_j := v_i + 1; v_i < lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms); v_i := v_i + 1) {
                vc_rsuMessagesValueList[vc_rsu_id].denms[v_i] := vc_rsuMessagesValueList[vc_rsu_id].denms[v_j];
              v_j := v_j + 1;
              } // End of 'for' statement
              vc_rsuMessagesValueList[vc_rsu_id].denms[lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms) - 1] := {}
            } else {
              vc_rsuMessagesValueList[vc_rsu_id].denms := {};
              vc_denmEventCounter := 0;
            }
            log("v_utDenmTermination: New l=", lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms));
            if (lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms) == 0) {
              tc_denm.stop;
              f_sleep(1.0);
              vc_denm := false;
            }
            cfPort.send(UtDenmResults: { utDenmTerminationResult := true } );
          }
          repeat;
        }
Yann Garcia's avatar
Yann Garcia committed
        [] cfPort.receive(UtIvimInitialize:?) -> value v_utIvimInitialize {
          log("a_process_cf_ut_command: v_utIvimInitialize = ", v_utIvimInitialize);
          if (oct2int(v_utIvimInitialize.hashedId8) != 0) {
            var charstring v_certificate_id;
            var EtsiTs103097Certificate v_certificate;
Yann Garcia's avatar
Yann Garcia committed
            log("a_process_cf_ut_command: Looking for certificate ", v_utIvimInitialize.hashedId8);
            f_getCertificateFromDigest(v_utIvimInitialize.hashedId8, v_certificate, v_certificate_id);
            log("a_process_cf_ut_command (pki): Change certificate to ", v_certificate_id);
            f_acTriggerSecEvent(m_acEnableSecurity(v_certificate_id));
          }
Yann Garcia's avatar
Yann Garcia committed
          if (vc_ivim == false) {
            vc_rsuMessagesValueList[vc_rsu_id].ivim := m_ivimParm(
                                                                  PICS_RSU_PARAMS[vc_rsu_id].stationID,
                                                                  m_ivimStructure(
                                                                                  m_iviManagementContainer(
                                                                                                           PICS_IVIM_PARMS_RSUs[vc_rsu_id].provider,
                                                                                                           PICS_IVIM_PARMS_RSUs[vc_rsu_id].iviIdentificationNumber,
                                                                                                           0//IviStatus_new_
                                                                                                           ),
                                                                                  PICS_IVIM_PARMS_RSUs[vc_rsu_id].iviContainers
                                                                                  ));
            // Update ivi status
            vc_rsuMessagesValueList[vc_rsu_id].ivim.ivi.mandatory.validFrom := f_getCurrentTime();
            vc_rsuMessagesValueList[vc_rsu_id].ivim.ivi.mandatory.validTo := valueof(vc_rsuMessagesValueList[vc_rsu_id].ivim.ivi.mandatory.validFrom) + 43200000; // 12hours
          }
Yann Garcia's avatar
Yann Garcia committed
          vc_ivim := true;
          cfPort.send(UtIvimResults: { utIvimInitializeResult := true } );
          repeat;
        }
Yann Garcia's avatar
Yann Garcia committed
        [vc_ivim == true] cfPort.receive(UtIvimTrigger:?) -> value v_utIvimTrigger {
          log("a_process_cf_ut_command: v_utIvimTrigger: ", v_utIvimTrigger);
Yann Garcia's avatar
Yann Garcia committed
          vc_rsuMessagesValueList[vc_rsu_id].ivim.ivi.mandatory.iviIdentificationNumber := 10;
          if (ispresent(v_utIvimTrigger.validTo)) {
            vc_rsuMessagesValueList[vc_rsu_id].ivim.ivi.mandatory.validTo := v_utIvimTrigger.validTo;
          }
          if (ispresent(v_utIvimTrigger.validFrom)) {
            vc_rsuMessagesValueList[vc_rsu_id].ivim.ivi.mandatory.validFrom := v_utIvimTrigger.validFrom;
          }
Yann Garcia's avatar
Yann Garcia committed
          cfPort.send(UtIvimResults: { utIvimTriggerResult := { result:= true, iviIdentificationNumber := 10 } } );
          tc_ivim.start;
          repeat;
        }
        [vc_ivim == true] cfPort.receive(UtIvimUpdate:?) -> value v_utIvimUpdate {
Yann Garcia's avatar
Yann Garcia committed
          if (ispresent(v_utIvimUpdate.validTo)) {
            vc_rsuMessagesValueList[vc_rsu_id].ivim.ivi.mandatory.validTo := v_utIvimUpdate.validTo;
          }
          if (ispresent(v_utIvimUpdate.validFrom)) {
            vc_rsuMessagesValueList[vc_rsu_id].ivim.ivi.mandatory.validFrom := v_utIvimUpdate.validFrom;
          }
Yann Garcia's avatar
Yann Garcia committed
          cfPort.send(UtIvimResults: { utIvimUpdateResult := { result:= true, iviIdentificationNumber := 10 } } );
          repeat;
        }
        [vc_ivim == true] cfPort.receive(UtIvimTermination:?) -> value v_utIvimTermination {
          log("a_process_cf_ut_command: v_utIvimTermination: ", v_utIvimTermination);
          tc_ivim.stop;
          vc_ivim := false;
          cfPort.send(UtIvimResults: { utIvimTerminationResult := true } );
          repeat;
        }
Yann Garcia's avatar
Yann Garcia committed
        [vc_mapem] cfPort.receive(UtMapemSpatemInitialize:?) -> value v_utMapemSpatemInitialize {
          log("a_process_cf_ut_command: v_utMapemSpatemInitialize = ", v_utMapemSpatemInitialize);
          if (oct2int(v_utMapemSpatemInitialize.hashedId8) != 0) {
            var charstring v_certificate_id;
            var EtsiTs103097Certificate v_certificate;
            log("a_process_cf_ut_command: Looking for certificate ", v_utMapemSpatemInitialize.hashedId8);
            f_getCertificateFromDigest(v_utMapemSpatemInitialize.hashedId8, v_certificate, v_certificate_id);
            log("a_process_cf_ut_command (pki): Change certificate to ", v_certificate_id);
            f_acTriggerSecEvent(m_acEnableSecurity(v_certificate_id));
          }
          cfPort.send(UtMapemSpatemResults: { utMapemSpatemInitializeResult := true } );
          repeat;
        }
        [vc_mapem == true] cfPort.receive(UtMapemSpatemTrigger:?) -> value v_utMapemSpatemTrigger {
          log("a_process_cf_ut_command: v_utMapemSpatemTrigger: ", v_utMapemSpatemTrigger);
          // TODO
          cfPort.send(UtMapemSpatemResults: { utMapemSpatemTriggerResult := true } );
          tc_mapem.start;
          repeat;
        }
Yann Garcia's avatar
Yann Garcia committed
        [] cfPort.receive(UtRtcmemInitialize:?) -> value v_utRtcmemInitialize {
Yann Garcia's avatar
Yann Garcia committed
          log("a_process_cf_ut_command: v_utRtcmemInitialize = ", v_utRtcmemInitialize);
          if (oct2int(v_utRtcmemInitialize.hashedId8) != 0) {
            var charstring v_certificate_id;
            var EtsiTs103097Certificate v_certificate;
Yann Garcia's avatar
Yann Garcia committed
            log("a_process_cf_ut_command: Looking for certificate ", v_utRtcmemInitialize.hashedId8);
            f_getCertificateFromDigest(v_utRtcmemInitialize.hashedId8, v_certificate, v_certificate_id);
Yann Garcia's avatar
Yann Garcia committed
            log("a_process_cf_ut_command (pki): Change certificate to ", v_certificate_id);
            f_acTriggerSecEvent(m_acEnableSecurity(v_certificate_id));
          }
Yann Garcia's avatar
Yann Garcia committed
          vc_rsuMessagesValueList[vc_rsu_id].rtcmem := valueof(
                                                               m_rtcmemPdu(
                                                                           m_defaultRtcmem(
                                                                                           123,
                                                                                           -,
                                                                                           { '00000000'O, '01010101'O }
                                                               )));
          vc_rtcmem := true;
Yann Garcia's avatar
Yann Garcia committed
          cfPort.send(UtRtcmemResults: { utRtcmemInitializeResult := true } );
          repeat;
        }
        [vc_rtcmem == true] cfPort.receive(UtRtcmemTrigger:?) -> value v_utRtcmemTrigger {
          log("a_process_cf_ut_command: v_utRtcmemTrigger: ", v_utRtcmemTrigger);
Yann Garcia's avatar
Yann Garcia committed
          vc_rsuMessagesValueList[vc_rsu_id].rtcmem.rtcmc.msgCnt := v_utRtcmemTrigger.msgCnt;
          vc_rsuMessagesValueList[vc_rsu_id].rtcmem.rtcmc.rev := v_utRtcmemTrigger.rev;
          vc_rsuMessagesValueList[vc_rsu_id].rtcmem.rtcmc.msgs := v_utRtcmemTrigger.msgs;
          // TODO Add optional part
Yann Garcia's avatar
Yann Garcia committed
          cfPort.send(UtRtcmemResults: { utRtcmemTriggerResult := true } );
Yann Garcia's avatar
Yann Garcia committed
          tc_rtcmem.start;
Yann Garcia's avatar
Yann Garcia committed
          repeat;
        }
        [vc_rtcmem == true] cfPort.receive(UtRtcmemUpdate:?) -> value v_utRtcmemUpdate {
Yann Garcia's avatar
Yann Garcia committed
          vc_rsuMessagesValueList[vc_rsu_id].rtcmem.rtcmc.msgs := v_utRtcmemUpdate.msgs;
Yann Garcia's avatar
Yann Garcia committed
          cfPort.send(UtRtcmemResults: { utRtcmemUpdateResult := true } );
          repeat;
        }
        [vc_rtcmem == true] cfPort.receive(UtRtcmemTermination:?) -> value v_utRtcmemTermination {
          log("a_process_cf_ut_command: v_utRtcmemTermination: ", v_utRtcmemTermination);
Yann Garcia's avatar
Yann Garcia committed
          tc_rtcmem.stop;
          vc_rtcmem := false;
Yann Garcia's avatar
Yann Garcia committed
          cfPort.send(UtRtcmemResults: { utRtcmemTerminationResult := true } );
          repeat;
        }
Yann Garcia's avatar
Yann Garcia committed
        [] cfPort.receive(UtSremInitialize:?) -> value v_utSremInitialize {
          log("a_process_cf_ut_command: v_utSremInitialize = ", v_utSremInitialize);
          if (oct2int(v_utSremInitialize.hashedId8) != 0) {
            var charstring v_certificate_id;
            var EtsiTs103097Certificate v_certificate;
Yann Garcia's avatar
Yann Garcia committed
            log("a_process_cf_ut_command: Looking for certificate ", v_utSremInitialize.hashedId8);
            f_getCertificateFromDigest(v_utSremInitialize.hashedId8, v_certificate, v_certificate_id);
            log("a_process_cf_ut_command (pki): Change certificate to ", v_certificate_id);
            f_acTriggerSecEvent(m_acEnableSecurity(v_certificate_id));
          }
Yann Garcia's avatar
Yann Garcia committed
          vc_rsuMessagesValueList[vc_rsu_id].srem := valueof(
                                                             m_sremPdu(
                                                                       m_srem(
                                                                              m_requestorDescription(
                                                                                                     m_vehicleID(
                                                                                                                 f_getIutStationId()
                                                                                                                 ),
                                                                                       m_requestorType(
                                                                                                       basicVehicle
                                                                                                       )
                                                                                       ),
                                                                              {
                                                                                m_signalRequestPackage(
                                                                                                       m_signalRequest(
                                                                                                                       LibItsSremSsem_Templates.m_intersectionReferenceID(
                                                                                                                                                                          PX_INTERSECTION_ID
                                                                                                                                                 ),
                                                                                                                       PX_REQUEST_ID,
                                                                                                                       priorityRequest,
                                                                                                                       { lane := 1 }
                                                                                                                       )
                                                                                                       )
                                                                                }
                                                                              )
                                                                       )
                                                             );
Yann Garcia's avatar
Yann Garcia committed
          vc_srem := true;
          cfPort.send(UtSremResults: { utSremInitializeResult := true } );
          repeat;
        }
        [vc_srem == true] cfPort.receive(UtSremTrigger:?) -> value v_utSremTrigger {
          log("a_process_cf_ut_command: v_utSremTrigger: ", v_utSremTrigger);
Yann Garcia's avatar
Yann Garcia committed
          // TODO Update message
Yann Garcia's avatar
Yann Garcia committed
          tc_srem.start;
          cfPort.send(UtSremResults: { utSremTriggerResult := true } );
          repeat;
        }
        [vc_srem == true] cfPort.receive(UtSremUpdate:?) -> value v_utSremUpdate {
Yann Garcia's avatar
Yann Garcia committed
          // TODO Update message
          cfPort.send(UtSremResults: { utSremUpdateResult := true } );
          repeat;
        }
        [vc_srem == true] cfPort.receive(UtSremCancelation:?) -> value v_utSremCancelation {
          log("a_process_cf_ut_command: v_utSremCancelation: ", v_utSremCancelation);
Yann Garcia's avatar
Yann Garcia committed
          tc_srem.stop;
          cfPort.send(UtSremResults: { utSremCancelationResult := true } );
          repeat;
        }
        [vc_pki == true] cfPort.receive(UtPkiInitialize:?) -> value v_utPkiInitialize {
YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utPkiInitialize = ", v_utPkiInitialize);
          if (oct2int(v_utPkiInitialize.hashedId8) != 0) {
            var charstring v_certificate_id;
            var EtsiTs103097Certificate v_certificate;
YannGarcia's avatar
YannGarcia committed
            log("a_process_cf_ut_command: Looking for certificate ", v_utPkiInitialize.hashedId8);
            f_getCertificateFromDigest(v_utPkiInitialize.hashedId8, v_certificate, v_certificate_id);
            log("a_process_cf_ut_command (pki): Change certificate to ", v_certificate_id);
            f_acTriggerSecEvent(m_acEnableSecurity(v_certificate_id));
            vc_security_state := 0; // 0: initial
            vc_reenrolment := false;
            vc_ec_counter := 0;
            vc_ec_certificates := {};
            vc_at_counter := 0;
            vc_at_certificates := {};
            tc_cam.stop;
YannGarcia's avatar
YannGarcia committed
          }
          cfPort.send(UtPkiResults: { utPkiInitializeResult := true } );
          repeat;
        }
        [vc_pki == true] cfPort.receive(UtPkiTrigger: { triggerEnrolmentRequest := ? }) -> value v_utPkiTrigger {
          var ItsPkiHttpRsuSimulator v_pki;
          var EcData v_ec_data;
YannGarcia's avatar
YannGarcia committed
          log("a_process_cf_ut_command: v_utPkiTrigger=", v_utPkiTrigger);
          cfPort.send(UtPkiResults: { utPkiTriggerResult := true } );
          v_pki := ItsPkiHttpRsuSimulator.create("TriggeredEc") alive;
          connect(v_pki:resultPort, self:resultPort);
          v_pki.start(f_trigger_enrolment_request_await_response());
          tc_wait.start;
          alt {
            [] resultPort.receive(EcData:?) -> value v_ec_data {
              tc_wait.stop;
              vc_ec_certificates[vc_ec_counter] := v_ec_data;
              vc_ec_counter := vc_ec_counter + 1;
              vc_reenrolment := true;
              vc_security_state := 1; // 1:enrolled
YannGarcia's avatar
YannGarcia committed
              setverdict(pass);
            }
            [] tc_wait.timeout {
              log("a_process_cf_ut_command: Failed to retrieve EcData");
              vc_reenrolment := false;
              vc_security_state := 0; // 0: initial
            }
          } // End of 'alt' statement
          disconnect(v_pki:resultPort, self:resultPort);
          v_pki.done;
          v_pki.kill;
        [vc_pki == true] cfPort.receive(UtPkiTrigger: { triggerAuthorizationRequest := ? }) -> value v_utPkiTrigger {
          var ItsPkiHttpRsuSimulator v_pki;
          var AtData v_at_data;
          
          cfPort.send(UtPkiResults: { utPkiTriggerResult := true } );
          v_pki := ItsPkiHttpRsuSimulator.create("TriggeredAt") alive;
          connect(v_pki:resultPort, self:resultPort);
          v_pki.start(f_trigger_authorization_request_await_response(
                                                                     vc_ec_counter,
                                                                     vc_ec_certificates
          tc_wait.start;
          alt {
            [] resultPort.receive(AtData:?) -> value v_at_data {
              tc_wait.stop;
              vc_at_certificates[vc_at_counter] := v_at_data;
              vc_at_counter := vc_at_counter + 1;
              vc_security_state := 2; // 2: authorization
YannGarcia's avatar
YannGarcia committed
              setverdict(pass);
            }
            [] tc_wait.timeout {
              log("a_process_cf_ut_command: Failed to retrieve AtData");
              vc_security_state := 1; // 1: enrolled
            }
          } // End of 'alt' statement
          disconnect(v_pki:resultPort, self:resultPort);
          v_pki.done;
          v_pki.kill;
          if (vc_security_state == 2) {
Yann Garcia's avatar
Yann Garcia committed
            var octetstring v_cert := bit2oct(encvalue(vc_at_certificates[0].certificate));
YannGarcia's avatar
YannGarcia committed
            var Oct32 v_wholeHash := f_hashWithSha256(v_cert);
            var HashedId8 v_hashedId8_sha256 := f_hashedId8FromSha256(v_wholeHash);
            var charstring v_cert_id;
            var HashedId8 v_hashedId8;
            var HashedId8 v_issuer;
            var octetstring v_public_key_x := ''O;
            var octetstring v_public_key_y := ''O;
            var octetstring v_public_key_compressed;
            var integer v_verify_compressed_mode;
            var template (omit) octetstring v_public_enc_key_x := omit;
            var template (omit) octetstring v_public_enc_key_y := omit;
            var template (omit) octetstring v_public_enc_compressed_key := omit;
            var template (omit) integer v_public_enc_key_compressed_mode := omit;

            log("a_process_cf_ut_command: triggerAuthorizationRequest: vc_at_counter=", vc_at_counter);
            log("a_process_cf_ut_command: triggerAuthorizationRequest: vc_at_certificates=", vc_at_certificates);
YannGarcia's avatar
YannGarcia committed

            // Prepare to store the new certificate
            if (ischosen(vc_at_certificates[0].certificate.issuer.sha256AndDigest)) {
              v_hashedId8 := v_hashedId8_sha256;
              v_issuer := vc_at_certificates[0].certificate.issuer.sha256AndDigest;
            } else if (ischosen(vc_at_certificates[0].certificate.issuer.sha384AndDigest)) {
              v_hashedId8 := f_hashedId8FromSha384(f_hashWithSha384(v_cert));
              v_issuer := vc_at_certificates[0].certificate.issuer.sha384AndDigest;
            } else {
              log("a_process_cf_ut_command: Wrong certificate format, self_ not expected as issuer, back to initial");
              vc_security_state := 0; // 0: initial
              vc_reenrolment := false;
              vc_ec_counter := 0;
              vc_ec_certificates := {};
              vc_at_counter := 0;
              vc_at_certificates := {};
              repeat;
            }
            v_cert_id := hex2str(oct2hex(v_hashedId8));
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_cert_id               =", v_cert_id);
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_cert                  =", v_cert);
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_wholeHash             =", v_wholeHash);
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_hashedId8_sha256      =", v_hashedId8_sha256);
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_hashedId8             =", v_hashedId8);
            // Extract verification keys
            if (ischosen(vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256)) {
              if (ischosen(vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_0)) {
                v_public_key_compressed := vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_0;
                v_verify_compressed_mode := 0;
              } else if (ischosen(vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_1)) {
                v_public_key_compressed := vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_1;
                v_verify_compressed_mode := 1;
              } else { // TODO
              }
              if (lengthof(v_public_key_x) == 0) {
                v_public_key_x := v_public_key_compressed; // Key X-Coordinate
                fx_get_uncompressed_key_nistp256(vc_at_certificates[0].private_key, v_public_key_compressed, v_verify_compressed_mode, v_public_key_y); // Key Y-Coordinate
              }
            } else if (ischosen(vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1)) {
              if (ischosen(vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_0)) {
                v_public_key_compressed := vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_0;
                v_verify_compressed_mode := 0;
              } else if (ischosen(vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_1)) {
                v_public_key_compressed := vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_1;
                v_verify_compressed_mode := 1;
              } else { // TODO
              }
              if (lengthof(v_public_key_x) == 0) {
                v_public_key_x := v_public_key_compressed; // Key X-Coordinate
                fx_get_uncompressed_key_brainpoolp256r1(vc_at_certificates[0].private_key, v_public_key_compressed, v_verify_compressed_mode, v_public_key_y); // Key Y-Coordinate
              }
            } else if (ischosen(vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP384r1)) {
              if (ischosen(vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP384r1.compressed_y_0)) {
                v_public_key_compressed := vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP384r1.compressed_y_0;
                v_verify_compressed_mode := 0;
              } else if (ischosen(vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP384r1.compressed_y_1)) {
                v_public_key_compressed := vc_at_certificates[0].certificate.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP384r1.compressed_y_1;
                v_verify_compressed_mode := 1;
              } else { // TODO
              }
              if (lengthof(v_public_key_x) == 0) {
                v_public_key_x := v_public_key_compressed; // Key X-Coordinate
                fx_get_uncompressed_key_brainpoolp384r1(vc_at_certificates[0].private_key, v_public_key_compressed, v_verify_compressed_mode, v_public_key_y); // Key Y-Coordinate
              }
            } else {
              log("a_process_cf_ut_command: Wrong certificate format, invalid verification key, back to initial");
              vc_security_state := 0; // 0: initial
              vc_reenrolment := false;
              vc_ec_counter := 0;
              vc_ec_certificates := {};
              vc_at_counter := 0;
              vc_at_certificates := {};
              repeat;
            }
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_public_key_x          =", v_public_key_x);
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_public_key_y          =", v_public_key_y);
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_public_key_compressed =", v_public_key_compressed);
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_verify_compressed_mode=", v_verify_compressed_mode);
            // Extract encryption key
            if (ispresent(vc_at_certificates[0].certificate.toBeSigned.encryptionKey)) {
              if (ischosen(vc_at_certificates[0].certificate.toBeSigned.encryptionKey.publicKey.eciesNistP256)) {
                if (ischosen(vc_at_certificates[0].certificate.toBeSigned.encryptionKey.publicKey.eciesNistP256.compressed_y_0)) {
                  v_public_enc_compressed_key := vc_at_certificates[0].certificate.toBeSigned.encryptionKey.publicKey.eciesNistP256.compressed_y_0;
                  v_public_enc_key_compressed_mode := 0;
                } else if (ischosen(vc_at_certificates[0].certificate.toBeSigned.encryptionKey.publicKey.eciesNistP256.compressed_y_1)) {
                  v_public_enc_compressed_key := vc_at_certificates[0].certificate.toBeSigned.encryptionKey.publicKey.eciesNistP256.compressed_y_1;
                  v_public_enc_key_compressed_mode := 1;
                } else { // TODO
                }
                if (not(ispresent(v_public_enc_key_x))) {
                  var octetstring v_key;
                  v_public_enc_key_x := v_public_enc_compressed_key; // Key X-Coordinate
                  fx_get_uncompressed_key_nistp256(vc_at_certificates[0].private_enc_key, valueof(v_public_enc_compressed_key), valueof(v_public_enc_key_compressed_mode), v_key); // Key Y-Coordinate
                  v_public_enc_key_y := v_key;
                }
              } else if (ischosen(vc_at_certificates[0].certificate.toBeSigned.encryptionKey.publicKey.eciesBrainpoolP256r1)) {
                if (ischosen(vc_at_certificates[0].certificate.toBeSigned.encryptionKey.publicKey.eciesBrainpoolP256r1.compressed_y_0)) {
                  v_public_enc_compressed_key := vc_at_certificates[0].certificate.toBeSigned.encryptionKey.publicKey.eciesBrainpoolP256r1.compressed_y_0;
                  v_public_enc_key_compressed_mode := 0;
                } else if (ischosen(vc_at_certificates[0].certificate.toBeSigned.encryptionKey.publicKey.eciesBrainpoolP256r1.compressed_y_1)) {
                  v_public_enc_compressed_key := vc_at_certificates[0].certificate.toBeSigned.encryptionKey.publicKey.eciesBrainpoolP256r1.compressed_y_1;
                  v_public_enc_key_compressed_mode := 1;
                } else { // TODO
                }
                if (not(ispresent(v_public_enc_key_x))) {
                  var octetstring v_key;
                  v_public_enc_key_x := v_public_enc_compressed_key; // Key X-Coordinate
                  fx_get_uncompressed_key_brainpoolp256r1(vc_at_certificates[0].private_enc_key, valueof(v_public_enc_compressed_key), valueof(v_public_enc_key_compressed_mode), v_key); // Key Y-Coordinate
                  v_public_enc_key_y := v_key;
                }
              } else {
                log("a_process_cf_ut_command: Wrong certificate format, invalid verification key, back to initial");
                vc_security_state := 0; // 0: initial
                vc_reenrolment := false;
                vc_ec_counter := 0;
                vc_ec_certificates := {};
                vc_at_counter := 0;
                vc_at_certificates := {};
                repeat;
              }
            }
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_public_enc_key_x              =", v_public_enc_key_x);
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_public_enc_key_y              =", v_public_enc_key_y);
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_public_enc_compressed_key     =", v_public_enc_compressed_key);
            log("a_process_cf_ut_command: Prepare to store new AT certificate: v_public_enc_key_compressed_mode=", v_public_enc_key_compressed_mode);
            // Store the certificate
            log("a_process_cf_ut_command: Store new AT certificate");
            if (fx_store_certificate(v_cert_id, v_cert, vc_at_certificates[0].private_key, v_public_key_x, v_public_key_y, v_public_key_compressed, v_verify_compressed_mode, v_wholeHash, v_hashedId8_sha256, v_hashedId8, v_issuer, vc_at_certificates[0].private_enc_key, v_public_enc_key_x, v_public_enc_key_y, v_public_enc_compressed_key, v_public_enc_key_compressed_mode) == false) {
              log("a_process_cf_ut_command: Failed to store certificate, back to initial");
              vc_security_state := 0; // 0: initial