initial commit

This commit is contained in:
Nanosonde 2020-05-27 20:36:41 +02:00
parent cc1fc7d5fb
commit 281fe4ab02
7 changed files with 216 additions and 18 deletions

View File

@ -75,7 +75,9 @@ add_executable(knx-linux
../../src/knx/rf_medium_object.h ../../src/knx/rf_medium_object.h
../../src/knx/rf_physical_layer.cpp ../../src/knx/rf_physical_layer.cpp
../../src/knx/rf_physical_layer.h ../../src/knx/rf_physical_layer.h
../../src/knx/table_object.cpp ../../src/knx/secure_application_layer.cpp
../../src/knx/secure_application_layer.h
../../src/knx/table_object.cpp
../../src/knx/table_object.h ../../src/knx/table_object.h
../../src/knx/tpdu.cpp ../../src/knx/tpdu.cpp
../../src/knx/tpdu.h ../../src/knx/tpdu.h

View File

@ -267,7 +267,7 @@ void ApplicationLayer::groupValueReadRequest(AckType ack, uint16_t asap, Priorit
uint16_t tsap = (uint16_t)value; uint16_t tsap = (uint16_t)value;
// first to bus then to itself // first to bus then to itself
_transportLayer->dataGroupRequest(ack, hopType, priority, tsap, apdu); dataGroupRequest(ack, hopType, priority, tsap, apdu);
dataGroupIndication(hopType, priority, tsap, apdu); dataGroupIndication(hopType, priority, tsap, apdu);
} }
@ -290,7 +290,7 @@ void ApplicationLayer::individualAddressWriteRequest(AckType ack, HopCountType h
apdu.type(IndividualAddressWrite); apdu.type(IndividualAddressWrite);
uint8_t* apduData = apdu.data(); uint8_t* apduData = apdu.data();
pushWord(newaddress, apduData + 1); pushWord(newaddress, apduData + 1);
_transportLayer->dataBroadcastRequest(ack, hopType, SystemPriority, apdu); dataBroadcastRequest(ack, hopType, SystemPriority, apdu);
} }
void ApplicationLayer::individualAddressReadRequest(AckType ack, HopCountType hopType) void ApplicationLayer::individualAddressReadRequest(AckType ack, HopCountType hopType)
@ -298,7 +298,7 @@ void ApplicationLayer::individualAddressReadRequest(AckType ack, HopCountType ho
CemiFrame frame(1); CemiFrame frame(1);
APDU& apdu = frame.apdu(); APDU& apdu = frame.apdu();
apdu.type(IndividualAddressRead); apdu.type(IndividualAddressRead);
_transportLayer->dataBroadcastRequest(ack, hopType, SystemPriority, apdu); dataBroadcastRequest(ack, hopType, SystemPriority, apdu);
} }
void ApplicationLayer::individualAddressReadResponse(AckType ack, HopCountType hopType) void ApplicationLayer::individualAddressReadResponse(AckType ack, HopCountType hopType)
@ -306,7 +306,7 @@ void ApplicationLayer::individualAddressReadResponse(AckType ack, HopCountType h
CemiFrame frame(1); CemiFrame frame(1);
APDU& apdu = frame.apdu(); APDU& apdu = frame.apdu();
apdu.type(IndividualAddressResponse); apdu.type(IndividualAddressResponse);
_transportLayer->dataBroadcastRequest(ack, hopType, SystemPriority, apdu); dataBroadcastRequest(ack, hopType, SystemPriority, apdu);
} }
void ApplicationLayer::individualAddressSerialNumberReadRequest(AckType ack, HopCountType hopType, uint8_t * serialNumber) void ApplicationLayer::individualAddressSerialNumberReadRequest(AckType ack, HopCountType hopType, uint8_t * serialNumber)
@ -316,7 +316,7 @@ void ApplicationLayer::individualAddressSerialNumberReadRequest(AckType ack, Hop
apdu.type(IndividualAddressSerialNumberRead); apdu.type(IndividualAddressSerialNumberRead);
uint8_t* data = apdu.data() + 1; uint8_t* data = apdu.data() + 1;
memcpy(data, serialNumber, 6); memcpy(data, serialNumber, 6);
_transportLayer->dataBroadcastRequest(ack, hopType, SystemPriority, apdu); dataBroadcastRequest(ack, hopType, SystemPriority, apdu);
} }
void ApplicationLayer::individualAddressSerialNumberReadResponse(AckType ack, HopCountType hopType, void ApplicationLayer::individualAddressSerialNumberReadResponse(AckType ack, HopCountType hopType,
@ -329,7 +329,7 @@ void ApplicationLayer::individualAddressSerialNumberReadResponse(AckType ack, Ho
memcpy(data, serialNumber, 6); memcpy(data, serialNumber, 6);
data += 6; data += 6;
pushWord(domainAddress, data); pushWord(domainAddress, data);
_transportLayer->dataBroadcastRequest(ack, hopType, SystemPriority, apdu); dataBroadcastRequest(ack, hopType, SystemPriority, apdu);
} }
void ApplicationLayer::individualAddressSerialNumberWriteRequest(AckType ack, HopCountType hopType, uint8_t * serialNumber, void ApplicationLayer::individualAddressSerialNumberWriteRequest(AckType ack, HopCountType hopType, uint8_t * serialNumber,
@ -342,7 +342,7 @@ void ApplicationLayer::individualAddressSerialNumberWriteRequest(AckType ack, Ho
memcpy(data, serialNumber, 6); memcpy(data, serialNumber, 6);
data += 6; data += 6;
pushWord(newaddress, data); pushWord(newaddress, data);
_transportLayer->dataBroadcastRequest(ack, hopType, SystemPriority, apdu); dataBroadcastRequest(ack, hopType, SystemPriority, apdu);
} }
void ApplicationLayer::deviceDescriptorReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, void ApplicationLayer::deviceDescriptorReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap,
@ -423,7 +423,7 @@ void ApplicationLayer::systemNetworkParameterReadResponse(Priority priority, Hop
//apdu.printPDU(); //apdu.printPDU();
_transportLayer->dataSystemBroadcastRequest(AckDontCare, hopType, SystemPriority, apdu); dataSystemBroadcastRequest(AckDontCare, hopType, SystemPriority, apdu);
} }
//TODO: ApplicationLayer::domainAddressSerialNumberWriteRequest() //TODO: ApplicationLayer::domainAddressSerialNumberWriteRequest()
@ -442,7 +442,7 @@ void ApplicationLayer::domainAddressSerialNumberReadResponse(Priority priority,
//apdu.printPDU(); //apdu.printPDU();
_transportLayer->dataSystemBroadcastRequest(AckDontCare, hopType, SystemPriority, apdu); dataSystemBroadcastRequest(AckDontCare, hopType, SystemPriority, apdu);
} }
//TODO: ApplicationLayer::IndividualAddressSerialNumberWriteRequest() //TODO: ApplicationLayer::IndividualAddressSerialNumberWriteRequest()
@ -461,7 +461,7 @@ void ApplicationLayer::IndividualAddressSerialNumberReadResponse(Priority priori
//apdu.printPDU(); //apdu.printPDU();
_transportLayer->dataBroadcastRequest(AckDontCare, hopType, SystemPriority, apdu); dataBroadcastRequest(AckDontCare, hopType, SystemPriority, apdu);
} }
void ApplicationLayer::propertyValueReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, void ApplicationLayer::propertyValueReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap,
@ -652,9 +652,9 @@ void ApplicationLayer::propertyDataSend(ApduType type, AckType ack, Priority pri
memcpy(apduData, data, length); memcpy(apduData, data, length);
if (asap == _connectedTsap) if (asap == _connectedTsap)
_transportLayer->dataConnectedRequest(asap, priority, apdu); dataConnectedRequest(asap, priority, apdu);
else else
_transportLayer->dataIndividualRequest(ack, hopType, priority, asap, apdu); dataIndividualRequest(ack, hopType, priority, asap, apdu);
} }
void ApplicationLayer::groupValueSend(ApduType type, AckType ack, uint16_t asap, Priority priority, HopCountType hopType, void ApplicationLayer::groupValueSend(ApduType type, AckType ack, uint16_t asap, Priority priority, HopCountType hopType,
@ -676,7 +676,7 @@ void ApplicationLayer::groupValueSend(ApduType type, AckType ack, uint16_t asap,
} }
// no need to check if there is a tsap. This is a response, so the read got trough // no need to check if there is a tsap. This is a response, so the read got trough
uint16_t tsap = (uint16_t)_assocTable.translateAsap(asap); uint16_t tsap = (uint16_t)_assocTable.translateAsap(asap);
_transportLayer->dataGroupRequest(ack, hopType, priority, tsap, apdu); dataGroupRequest(ack, hopType, priority, tsap, apdu);
dataGroupIndication(hopType, priority, tsap, apdu); dataGroupIndication(hopType, priority, tsap, apdu);
} }
@ -911,12 +911,34 @@ void ApplicationLayer::individualConfirm(AckType ack, HopCountType hopType, Prio
void ApplicationLayer::individualSend(AckType ack, HopCountType hopType, Priority priority, uint16_t asap, APDU& apdu) void ApplicationLayer::individualSend(AckType ack, HopCountType hopType, Priority priority, uint16_t asap, APDU& apdu)
{ {
if (asap == _connectedTsap) if (asap == _connectedTsap)
_transportLayer->dataConnectedRequest(asap, priority, apdu); dataConnectedRequest(asap, priority, apdu);
else else
_transportLayer->dataIndividualRequest(ack, hopType, priority, asap, apdu); dataIndividualRequest(ack, hopType, priority, asap, apdu);
} }
bool ApplicationLayer::isConnected() bool ApplicationLayer::isConnected()
{ {
return (_connectedTsap >= 0); return (_connectedTsap >= 0);
} }
void ApplicationLayer::dataGroupRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu)
{
_transportLayer->dataGroupRequest(ack, hopType, priority, tsap, apdu);
}
void ApplicationLayer::dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU& apdu)
{
_transportLayer->dataBroadcastRequest(ack, hopType, SystemPriority, apdu);
}
void ApplicationLayer::dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU& apdu)
{
_transportLayer->dataSystemBroadcastRequest(AckDontCare, hopType, SystemPriority, apdu);
}
void ApplicationLayer::dataIndividualRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t destination, APDU& apdu)
{
_transportLayer->dataIndividualRequest(ack, hopType, priority, destination, apdu);
}
void ApplicationLayer::dataConnectedRequest(uint16_t tsap, Priority priority, APDU& apdu)
{
// apdu must be valid until it was confirmed
_transportLayer->dataConnectedRequest(tsap, priority, apdu);
}

View File

@ -139,6 +139,14 @@ class ApplicationLayer
uint8_t* knxSerialNumber); uint8_t* knxSerialNumber);
#pragma endregion #pragma endregion
protected:
// to transport layer
virtual void dataGroupRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu);
virtual void dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU& apdu);
virtual void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU& apdu);
virtual void dataIndividualRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t destination, APDU& apdu);
virtual void dataConnectedRequest(uint16_t tsap, Priority priority, APDU& apdu); // apdu must be valid until it was confirmed
private: private:
void propertyDataSend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, void propertyDataSend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap,
uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data,

View File

@ -8,6 +8,7 @@
#include "group_object_table_object.h" #include "group_object_table_object.h"
#include "application_program_object.h" #include "application_program_object.h"
#include "application_layer.h" #include "application_layer.h"
#include "secure_application_layer.h"
#include "transport_layer.h" #include "transport_layer.h"
#include "network_layer.h" #include "network_layer.h"
#include "data_link_layer.h" #include "data_link_layer.h"
@ -91,10 +92,14 @@ class BauSystemB : protected BusAccessUnit
GroupObjectTableObject _groupObjTable; GroupObjectTableObject _groupObjTable;
ApplicationProgramObject _appProgram; ApplicationProgramObject _appProgram;
Platform& _platform; Platform& _platform;
#ifdef USE_DATASECURE
SecureApplicationLayer _appLayer;
#else
ApplicationLayer _appLayer; ApplicationLayer _appLayer;
#endif
TransportLayer _transLayer; TransportLayer _transLayer;
NetworkLayer _netLayer; NetworkLayer _netLayer;
bool _configured = true; bool _configured = true;
RestartState _restartState = Idle; RestartState _restartState = Idle;
uint32_t _restartDelay = 0; uint32_t _restartDelay = 0;
}; };

View File

@ -19,3 +19,5 @@
#ifdef USE_USB #ifdef USE_USB
#define USE_CEMI_SERVER #define USE_CEMI_SERVER
#endif #endif
#define USE_DATASECURE

View File

@ -0,0 +1,106 @@
#include "secure_application_layer.h"
#include "transport_layer.h"
#include "cemi_frame.h"
#include "association_table_object.h"
#include "apdu.h"
#include "bau.h"
#include "string.h"
#include "bits.h"
#include <stdio.h>
SecureApplicationLayer::SecureApplicationLayer(AssociationTableObject& assocTable, BusAccessUnit& bau):
ApplicationLayer(assocTable, bau)
{
}
void SecureApplicationLayer::dataGroupIndication(HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu)
{
ApplicationLayer::dataGroupIndication(hopType, priority, tsap, apdu);
}
void SecureApplicationLayer::dataGroupConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, bool status)
{
ApplicationLayer::dataGroupConfirm(ack, hopType, priority, tsap, apdu, status);
}
void SecureApplicationLayer::dataBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU& apdu)
{
ApplicationLayer::dataBroadcastIndication(hopType, priority, source, apdu);
}
void SecureApplicationLayer::dataBroadcastConfirm(AckType ack, HopCountType hopType, Priority priority, APDU& apdu, bool status)
{
ApplicationLayer::dataBroadcastConfirm(ack, hopType, priority, apdu, status);
}
void SecureApplicationLayer::dataSystemBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU& apdu)
{
ApplicationLayer::dataSystemBroadcastIndication(hopType, priority, source, apdu);
}
void SecureApplicationLayer::dataSystemBroadcastConfirm(HopCountType hopType, Priority priority, APDU& apdu, bool status)
{
ApplicationLayer::dataSystemBroadcastConfirm(hopType, priority, apdu, status);
}
void SecureApplicationLayer::dataIndividualIndication(HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu)
{
ApplicationLayer::dataIndividualIndication(hopType, priority, tsap, apdu);
}
void SecureApplicationLayer::dataIndividualConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, bool status)
{
ApplicationLayer::dataIndividualConfirm(ack, hopType, priority, tsap, apdu, status);
}
void SecureApplicationLayer::connectIndication(uint16_t tsap)
{
ApplicationLayer::connectIndication(tsap);
}
void SecureApplicationLayer::connectConfirm(uint16_t destination, uint16_t tsap, bool status)
{
ApplicationLayer::connectConfirm(destination, tsap, status);
}
void SecureApplicationLayer::disconnectIndication(uint16_t tsap)
{
ApplicationLayer::disconnectIndication(tsap);
}
void SecureApplicationLayer::disconnectConfirm(Priority priority, uint16_t tsap, bool status)
{
ApplicationLayer::disconnectConfirm(priority, tsap, status);
}
void SecureApplicationLayer::dataConnectedIndication(Priority priority, uint16_t tsap, APDU& apdu)
{
ApplicationLayer::dataConnectedIndication(priority, tsap, apdu);
}
void SecureApplicationLayer::dataConnectedConfirm(uint16_t tsap)
{
ApplicationLayer::dataConnectedConfirm(tsap);
}
void SecureApplicationLayer::dataGroupRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu)
{
ApplicationLayer::dataGroupRequest(ack, hopType, priority, tsap, apdu);
}
void SecureApplicationLayer::dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU& apdu)
{
ApplicationLayer::dataBroadcastRequest(ack, hopType, SystemPriority, apdu);
}
void SecureApplicationLayer::dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU& apdu)
{
ApplicationLayer::dataSystemBroadcastRequest(AckDontCare, hopType, SystemPriority, apdu);
}
void SecureApplicationLayer::dataIndividualRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t destination, APDU& apdu)
{
ApplicationLayer::dataIndividualRequest(ack, hopType, priority, destination, apdu);
}
void SecureApplicationLayer::dataConnectedRequest(uint16_t tsap, Priority priority, APDU& apdu)
{
// apdu must be valid until it was confirmed
ApplicationLayer::dataConnectedRequest(tsap, priority, apdu);
}

View File

@ -0,0 +1,53 @@
#pragma once
#include "application_layer.h"
#include <stdint.h>
#include "knx_types.h"
#include "apdu.h"
class AssociationTableObject;
class BusAccessUnit;
/**
* This is an implementation of the application layer as specified in @cite knx:3/5/1.
* It provides methods for the BusAccessUnit to do different things and translates this
* call to an APDU and calls the correct method of the TransportLayer.
* It also takes calls from TransportLayer, decodes the submitted APDU and calls the coresponding
* methods of the BusAccessUnit class.
*/
class SecureApplicationLayer : public ApplicationLayer
{
public:
/**
* The constructor.
* @param assocTable The AssociationTable is used to translate between asap (i.e. group objects) and group addresses.
* @param bau methods are called here depending of the content of the APDU
*/
SecureApplicationLayer(AssociationTableObject& assocTable, BusAccessUnit& bau);
// from transport layer
void dataGroupIndication(HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu);
void dataGroupConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap,
APDU& apdu, bool status);
void dataBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU& apdu);
void dataBroadcastConfirm(AckType ack, HopCountType hopType, Priority priority, APDU& apdu, bool status);
void dataSystemBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU& apdu);
void dataSystemBroadcastConfirm(HopCountType hopType, Priority priority, APDU& apdu, bool status);
void dataIndividualIndication(HopCountType hopType, Priority priority, uint16_t source, APDU& apdu);
void dataIndividualConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, bool status);
void connectIndication(uint16_t tsap);
void connectConfirm(uint16_t destination, uint16_t tsap, bool status);
void disconnectIndication(uint16_t tsap);
void disconnectConfirm(Priority priority, uint16_t tsap, bool status);
void dataConnectedIndication(Priority priority, uint16_t tsap, APDU& apdu);
void dataConnectedConfirm(uint16_t tsap);
protected:
// to transport layer
virtual void dataGroupRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu);
virtual void dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU& apdu);
virtual void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU& apdu);
virtual void dataIndividualRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t destination, APDU& apdu);
virtual void dataConnectedRequest(uint16_t tsap, Priority priority, APDU& apdu); // apdu must be valid until it was confirmed
private:
};