diff --git a/src/core/libs/osnma_msg_receiver.cc b/src/core/libs/osnma_msg_receiver.cc index 42a89c957..dfc067796 100644 --- a/src/core/libs/osnma_msg_receiver.cc +++ b/src/core/libs/osnma_msg_receiver.cc @@ -453,9 +453,9 @@ void osnma_msg_receiver::process_dsm_message(const std::vector& dsm_msg d_kroot_verified = d_crypto->verify_signature(message, d_osnma_data.d_dsm_kroot_message.ds); if (d_kroot_verified) { - LOG(INFO) << "Galileo OSNMA: KROOT authentication successful !" << std::endl; - LOG(INFO) << "Galileo OSNMA: KROOT authentication successful !" << std::endl; - LOG(INFO) << "Galileo OSNMA: NMA Status is " << d_dsm_reader->get_nmas_status(d_osnma_data.d_nma_header.nmas) << ", " + LOG(WARNING) << "Galileo OSNMA: KROOT authentication successful !" << std::endl; + LOG(WARNING) << "Galileo OSNMA: KROOT authentication successful !" << std::endl; + LOG(WARNING) << "Galileo OSNMA: NMA Status is " << d_dsm_reader->get_nmas_status(d_osnma_data.d_nma_header.nmas) << ", " << "Chain in force is " << static_cast(d_osnma_data.d_nma_header.cid) << ", " << "Chain and Public Key Status is " << d_dsm_reader->get_cpks_status(d_osnma_data.d_nma_header.cpks) << std::endl; } @@ -860,12 +860,15 @@ void osnma_msg_receiver::process_mack_message() LOG(WARNING) << "But it will be processed for debugging purposes."; } // verify tesla key and add it to the container of verified keys if successful - // TODO not verify tesla key for each satellite if already verified. - bool retV = verify_tesla_key(d_osnma_data.d_mack_message.key, d_osnma_data.d_nav_data.TOW_sf0); - if(retV){ - d_tesla_keys.insert(std::pair(d_osnma_data.d_nav_data.TOW_sf0, d_osnma_data.d_mack_message.key)); + if (d_tesla_keys.find(d_osnma_data.d_nav_data.TOW_sf0) == d_tesla_keys.end()) // check if already available => no need to verify + { + bool retV = verify_tesla_key(d_osnma_data.d_mack_message.key, d_osnma_data.d_nav_data.TOW_sf0); + if(retV){ + d_tesla_keys.insert(std::pair(d_osnma_data.d_nav_data.TOW_sf0, d_osnma_data.d_mack_message.key)); + } } + // MACSEQ - verify current macks, then add current retrieved mack to the end. auto mack = d_macks_awaiting_MACSEQ_verification.begin(); while (mack != d_macks_awaiting_MACSEQ_verification.end()){ @@ -925,7 +928,7 @@ void osnma_msg_receiver::process_mack_message() else { it.second.status = Tag::FAIL; - LOG(ERROR) << "Galileo OSNMA: Tag verification failure for tag Id= " + LOG(ERROR) << "Galileo OSNMA: Tag verification :: FAILURE for tag Id= " << it.second.tag_id << ", TOW=" << it.second.TOW @@ -937,7 +940,7 @@ void osnma_msg_receiver::process_mack_message() } } else { - LOG(INFO) << "Galileo OSNMA: Tag verification skipped for Tag Id= " + LOG(WARNING) << "Galileo OSNMA: Tag verification :: SKIPPED for Tag Id= " << it.second.tag_id << ", TOW=" << it.second.TOW @@ -1080,7 +1083,7 @@ std::vector osnma_msg_receiver::build_message(const Tag& tag) m.push_back(two_bits_nmas); // convert std::string to vector - std::string ephemeris_iono_vector_2 = d_satellite_nav_data[tag.PRNa][tag.TOW - 30].ephemeris_iono_vector_2; + std::string ephemeris_iono_vector_2 = d_satellite_nav_data[tag.PRN_d][tag.TOW - 30].ephemeris_iono_vector_2; std::vector ephemeris_iono_vector_2_bytes = d_helper->bytes(ephemeris_iono_vector_2); // Convert and add ephemeris_iono_vector_2 into the vector @@ -1210,10 +1213,16 @@ void osnma_msg_receiver::remove_verified_tags() */ void osnma_msg_receiver::control_tags_awaiting_verify_size() { - while(d_tags_awaiting_verify.size() > 60) + while(d_tags_awaiting_verify.size() > 500) { - LOG(WARNING) << "Galileo OSNMA: delete tag due to exceeding buffer size. "; - d_tags_awaiting_verify.erase(d_tags_awaiting_verify.begin()); + auto it = d_tags_awaiting_verify.begin(); + LOG(WARNING) << "Galileo OSNMA: Tag verification :: DELETED tag due to exceeding buffer size. " + << "Tag Id= " << it->second.tag_id + << ", TOW=" << it->first + << ", ADKD=" << static_cast(it->second.ADKD) + << ", from satellite " << it->second.PRNa + << std::endl; + d_tags_awaiting_verify.erase(it); } } @@ -1328,12 +1337,12 @@ bool osnma_msg_receiver::verify_macseq(const MACK_message& mack) } bool osnma_msg_receiver::tag_has_nav_data_available(Tag& t) { - auto prn_it = d_satellite_nav_data.find(t.PRNa); + auto prn_it = d_satellite_nav_data.find(t.PRN_d); if (prn_it != d_satellite_nav_data.end()) { // PRN was found, check if TOW exists in inner map LOG(INFO) << "Galileo OSNMA: hasData = true " << std::endl; std::map& tow_map = prn_it->second; - auto tow_it = tow_map.find(t.TOW-30); // TODO check ADKD to decide + auto tow_it = tow_map.find(t.TOW - 30); if (tow_it != tow_map.end()) { return true; } else { diff --git a/src/tests/unit-tests/signal-processing-blocks/osnma/osnma_msg_receiver_test.cc b/src/tests/unit-tests/signal-processing-blocks/osnma/osnma_msg_receiver_test.cc index 4ba431e75..2c6eca790 100644 --- a/src/tests/unit-tests/signal-processing-blocks/osnma/osnma_msg_receiver_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/osnma/osnma_msg_receiver_test.cc @@ -113,7 +113,7 @@ TEST_F(OsnmaMsgReceiverTest, OsnmaTestVectorsSimulation) // Act while (end_of_hex_stream == false){ // loop over all bytes of data. Note all TestVectors have same amount of data. for(const TestVector& tv : testVectors) { // loop over all SVs, extract a subframe - std::cout << "OsnmaTestVectorsSimulation: SVID "<< tv.svId << std::endl; + std::cout << "OsnmaTestVectorsSimulation: SVID (PRN_a) "<< tv.svId << std::endl; auto osnmaMsg_sptr = std::make_shared(); std::array hkroot{}; std::array mack{}; @@ -191,7 +191,7 @@ TEST_F(OsnmaMsgReceiverTest, OsnmaTestVectorsSimulation) osnmaMsg_sptr->TOW_sf0 = d_GST_SIS & 0x000FFFFF; osnmaMsg_sptr->WN_sf0 = (d_GST_SIS & 0xFFF00000) >> 20 ; - osnmaMsg_sptr->PRN = tv.svId; + osnmaMsg_sptr->PRN = tv.svId; // PRNa bool allWordsReceived = true; for (int i = 1; i <= 5; ++i) @@ -216,7 +216,7 @@ TEST_F(OsnmaMsgReceiverTest, OsnmaTestVectorsSimulation) // TODO words 6 and 10 for TimingData }; - // Iterate over the extraction parameters + // Fill NavData bits -- Iterate over the extraction parameters for (const auto& param : extractionParams) { uint8_t wordKey = param.first; uint8_t start = param.second.first;