correct P25 response PDU generation;

pull/1/head
Bryan Biedenkapp 5 years ago
parent cfe4c99478
commit d672f8827f

@ -150,12 +150,6 @@ bool DataPacket::process(uint8_t* data, uint32_t len)
return false;
}
/*
if (m_rfDataHeader.getAckNeeded()) {
writeRF_PDU_Ack_Response(PDU_ACK_CLASS_ACK, PDU_ACK_TYPE_ACK, m_rfDataHeader.getLLId());
}
*/
writeNetworkRF(P25_DT_DATA_HEADER, buffer, P25_PDU_FEC_LENGTH_BYTES);
}
@ -274,12 +268,13 @@ bool DataPacket::process(uint8_t* data, uint32_t len)
if (!hasLLIdFNEReg(llId)) {
// update dynamic FNE registration table entry
m_fneRegTable[llId] = ipAddr;
}
if (m_verbose) {
LogMessage(LOG_RF, P25_PDU_STR ", PDU_REG_TYPE_RSP_ACCPT (Registration Response Accept), llId = %u, ipAddr = %u", llId, ipAddr);
}
writeRF_PDU_Reg_Response(PDU_REG_TYPE_RSP_ACCPT, llId, ipAddr);
if (m_verbose) {
LogMessage(LOG_RF, P25_PDU_STR ", PDU_REG_TYPE_RSP_ACCPT (Registration Response Accept), llId = %u, ipAddr = %u", llId, ipAddr);
}
writeRF_PDU_Reg_Response(PDU_REG_TYPE_RSP_ACCPT, llId, ipAddr);
}
}
break;
@ -697,7 +692,13 @@ void DataPacket::writeRF_PDU_Reg_Response(uint8_t regType, uint32_t llId, ulong6
rspHeader.setClass(PDU_ACK_CLASS_ACK);
rspHeader.setType(PDU_ACK_TYPE_ACK);
rspHeader.setLLId(llId);
rspHeader.setSrcLLId(P25_WUID_FNE);
if (m_rfDataHeader.getSAP() == PDU_SAP_EXT_ADDR) {
rspHeader.setSrcLLId(P25_WUID_FNE);
rspHeader.setExtended(true);
}
else {
rspHeader.setExtended(false);
}
rspHeader.setBlocksToFollow(1U);
// Generate the PDU header and 1/2 rate Trellis
@ -706,7 +707,7 @@ void DataPacket::writeRF_PDU_Reg_Response(uint8_t regType, uint32_t llId, ulong6
offset += P25_PDU_FEC_LENGTH_BITS;
// build registration response data
::memset(buffer, 0x00U, P25_PDU_CONFIRMED_LENGTH_BYTES + 2U);
::memset(buffer, 0x00U, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES);
buffer[0U] = (regType << 4); // Registration Type & Options
buffer[1U] = (llId >> 16) & 0xFFU; // Logical Link ID
@ -719,10 +720,11 @@ void DataPacket::writeRF_PDU_Reg_Response(uint8_t regType, uint32_t llId, ulong6
buffer[11U] = (ipAddr >> 0) & 0xFFU;
}
edac::CRC::addCRC32(buffer, P25_PDU_CONFIRMED_LENGTH_BYTES);
edac::CRC::addCRC32(buffer, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES);
// Generate the PDU data
m_rfData[0].setFormat(PDU_FMT_RSP);
m_rfData[0].setConfirmed(true);
m_rfData[0].setSerialNo(0U);
m_rfData[0].setData(buffer);

@ -159,7 +159,7 @@ void DataBlock::encode(uint8_t* data)
assert(data != NULL);
assert(m_data != NULL);
if (m_fmt == PDU_FMT_CONFIRMED) {
if ((m_fmt == PDU_FMT_CONFIRMED) || (m_fmt == PDU_FMT_RSP && m_confirmed)) {
uint8_t buffer[P25_PDU_CONFIRMED_LENGTH_BYTES];
::memset(buffer, 0x00U, P25_PDU_CONFIRMED_LENGTH_BYTES);
@ -187,7 +187,7 @@ void DataBlock::encode(uint8_t* data)
m_trellis.encode34(buffer, data);
}
else if ((m_fmt == PDU_FMT_UNCONFIRMED) || (m_fmt == PDU_FMT_RSP)) {
else if ((m_fmt == PDU_FMT_UNCONFIRMED) || (m_fmt == PDU_FMT_RSP && !m_confirmed)) {
uint8_t buffer[P25_PDU_UNCONFIRMED_LENGTH_BYTES];
::memset(buffer, 0x00U, P25_PDU_UNCONFIRMED_LENGTH_BYTES);
@ -237,10 +237,10 @@ void DataBlock::setData(const uint8_t* buffer)
assert(buffer != NULL);
assert(m_data != NULL);
if (m_fmt == PDU_FMT_CONFIRMED) {
if ((m_fmt == PDU_FMT_CONFIRMED) || (m_fmt == PDU_FMT_RSP && m_confirmed)) {
::memcpy(m_data, buffer, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES);
}
else if ((m_fmt == PDU_FMT_UNCONFIRMED) || (m_fmt == PDU_FMT_RSP)) {
else if ((m_fmt == PDU_FMT_UNCONFIRMED) || (m_fmt == PDU_FMT_RSP && !m_confirmed)) {
::memcpy(m_data, buffer, P25_PDU_UNCONFIRMED_LENGTH_BYTES);
}
else {
@ -255,11 +255,11 @@ uint32_t DataBlock::getData(uint8_t* buffer) const
assert(buffer != NULL);
assert(m_data != NULL);
if (m_fmt == PDU_FMT_CONFIRMED) {
if ((m_fmt == PDU_FMT_CONFIRMED) || (m_fmt == PDU_FMT_RSP && m_confirmed)) {
::memcpy(buffer, m_data, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES);
return P25_PDU_CONFIRMED_DATA_LENGTH_BYTES;
}
else if ((m_fmt == PDU_FMT_UNCONFIRMED) || (m_fmt == PDU_FMT_RSP)) {
else if ((m_fmt == PDU_FMT_UNCONFIRMED) || (m_fmt == PDU_FMT_RSP && !m_confirmed)) {
::memcpy(buffer, m_data, P25_PDU_UNCONFIRMED_LENGTH_BYTES);
return P25_PDU_UNCONFIRMED_LENGTH_BYTES;
}

Loading…
Cancel
Save

Powered by TurnKey Linux.