mirror of
https://github.com/thelsing/knx.git
synced 2025-06-22 01:16:47 +02:00
Extend restart and masterreset for factory reset
This commit is contained in:
parent
4b52f241ec
commit
604c1d6bdb
@ -243,6 +243,15 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
printf("main() start.\n");
|
printf("main() start.\n");
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
{
|
||||||
|
EraseCode eraseCode = (EraseCode) atoi(argv[2]);
|
||||||
|
|
||||||
|
print("Performing factory reset with erase code: ");
|
||||||
|
println(eraseCode, HEX);
|
||||||
|
knx.masterReset(eraseCode, 0);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t inPlain[] { 0x00, 0xFA, 0x01, 0x02, 0x03, 0x04, // KNX Serial
|
uint8_t inPlain[] { 0x00, 0xFA, 0x01, 0x02, 0x03, 0x04, // KNX Serial
|
||||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; // Key
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; // Key
|
||||||
uint8_t* outEncoded = NULL;
|
uint8_t* outEncoded = NULL;
|
||||||
|
@ -803,10 +803,19 @@ void ApplicationLayer::individualIndication(HopCountType hopType, Priority prior
|
|||||||
_bau.deviceDescriptorReadAppLayerConfirm(priority, hopType, tsap, secCtrl, *data & 0x3f, data + 1);
|
_bau.deviceDescriptorReadAppLayerConfirm(priority, hopType, tsap, secCtrl, *data & 0x3f, data + 1);
|
||||||
break;
|
break;
|
||||||
case Restart:
|
case Restart:
|
||||||
// TODO: handle erase code for factory reset (setting FDSK again as toolkey, etc.)
|
{
|
||||||
if ((*data & 0x3f) == 0)
|
// handle erase code for factory reset (setting FDSK again as toolkey, etc.)
|
||||||
_bau.restartRequestIndication(priority, hopType, tsap, secCtrl);
|
RestartType restartType = (RestartType) (*data & 0x3f);
|
||||||
|
EraseCode eraseCode = EraseCode::Void;
|
||||||
|
uint8_t channel = 0;
|
||||||
|
if (restartType == RestartType::MasterReset)
|
||||||
|
{
|
||||||
|
eraseCode = (EraseCode) (*data + 1);
|
||||||
|
channel = *data + 2;
|
||||||
|
}
|
||||||
|
_bau.restartRequestIndication(priority, hopType, tsap, secCtrl, restartType, eraseCode, channel);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case PropertyValueRead:
|
case PropertyValueRead:
|
||||||
{
|
{
|
||||||
uint16_t startIndex;
|
uint16_t startIndex;
|
||||||
|
@ -94,7 +94,7 @@ void BusAccessUnit::restartRequestLocalConfirm(AckType ack, Priority priority, H
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void BusAccessUnit::restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl)
|
void BusAccessUnit::restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, RestartType restartType, EraseCode eraseCode, uint8_t channel)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ class BusAccessUnit
|
|||||||
virtual void deviceDescriptorReadAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl,
|
virtual void deviceDescriptorReadAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl,
|
||||||
uint8_t descriptortype, uint8_t* deviceDescriptor);
|
uint8_t descriptortype, uint8_t* deviceDescriptor);
|
||||||
virtual void restartRequestLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, bool status);
|
virtual void restartRequestLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, bool status);
|
||||||
virtual void restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl);
|
virtual void restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, RestartType restartType, EraseCode eraseCode, uint8_t channel);
|
||||||
virtual void propertyValueReadLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl,
|
virtual void propertyValueReadLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl,
|
||||||
uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, bool status);
|
uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, bool status);
|
||||||
virtual void propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex,
|
virtual void propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex,
|
||||||
|
@ -158,6 +158,36 @@ bool BauSystemB::configured()
|
|||||||
return _configured;
|
return _configured;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BauSystemB::masterReset(EraseCode eraseCode, uint8_t channel)
|
||||||
|
{
|
||||||
|
switch (eraseCode)
|
||||||
|
{
|
||||||
|
case EraseCode::ConfimrmedRestart:
|
||||||
|
{
|
||||||
|
println("Confirmed restart requested.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EraseCode::FactoryReset:
|
||||||
|
case EraseCode::FactoryResetWithoutIA:
|
||||||
|
{
|
||||||
|
#ifdef USE_DATASECURE
|
||||||
|
print("Factory reset requested. type: ");
|
||||||
|
println(eraseCode == EraseCode::FactoryReset ? "FactoryReset with IA" : "FactoryReset without IA");
|
||||||
|
// If erase code is FactoryReset or FactoryResetWithoutIA, set FDSK as toolkey again
|
||||||
|
// and disable security mode
|
||||||
|
_secIfObj.factoryReset();
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
print("Unhandled erase code: ");
|
||||||
|
println(eraseCode, HEX);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void BauSystemB::deviceDescriptorReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t descriptorType)
|
void BauSystemB::deviceDescriptorReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t descriptorType)
|
||||||
{
|
{
|
||||||
if (descriptorType != 0)
|
if (descriptorType != 0)
|
||||||
@ -184,12 +214,22 @@ void BauSystemB::memoryReadIndication(Priority priority, HopCountType hopType, u
|
|||||||
_memory.toAbsolute(memoryAddress));
|
_memory.toAbsolute(memoryAddress));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BauSystemB::restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl)
|
void BauSystemB::restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, RestartType restartType, EraseCode eraseCode, uint8_t channel)
|
||||||
{
|
{
|
||||||
#ifdef USE_DATASECURE
|
if (restartType == RestartType::BasicRestart)
|
||||||
// If erase code is FactoryReset, set FDSK as toolkey again
|
{
|
||||||
//_secIfObj.factoryReset();
|
println("Basic restart requested");
|
||||||
#endif
|
}
|
||||||
|
else if (restartType == RestartType::MasterReset)
|
||||||
|
{
|
||||||
|
masterReset(eraseCode, channel);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
println("Unhandled restart type");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Flush the EEPROM before resetting
|
// Flush the EEPROM before resetting
|
||||||
_memory.writeMemory();
|
_memory.writeMemory();
|
||||||
_platform.restart();
|
_platform.restart();
|
||||||
|
@ -32,6 +32,7 @@ class BauSystemB : protected BusAccessUnit
|
|||||||
void writeMemory();
|
void writeMemory();
|
||||||
void addSaveRestore(SaveRestore* obj);
|
void addSaveRestore(SaveRestore* obj);
|
||||||
bool restartRequest(uint16_t asap, const SecurityControl &secCtrl);
|
bool restartRequest(uint16_t asap, const SecurityControl &secCtrl);
|
||||||
|
void masterReset(EraseCode eraseCode, uint8_t channel);
|
||||||
|
|
||||||
void propertyValueRead(ObjectType objectType, uint8_t objectInstance, uint8_t propertyId,
|
void propertyValueRead(ObjectType objectType, uint8_t objectInstance, uint8_t propertyId,
|
||||||
uint8_t& numberOfElements, uint16_t startIndex,
|
uint8_t& numberOfElements, uint16_t startIndex,
|
||||||
@ -47,7 +48,7 @@ class BauSystemB : protected BusAccessUnit
|
|||||||
void memoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number,
|
void memoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number,
|
||||||
uint16_t memoryAddress) override;
|
uint16_t memoryAddress) override;
|
||||||
void deviceDescriptorReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t descriptorType) override;
|
void deviceDescriptorReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t descriptorType) override;
|
||||||
void restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl) override;
|
void restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, RestartType restartType, EraseCode eraseCode, uint8_t channel) override;
|
||||||
void authorizeIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint32_t key) override;
|
void authorizeIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint32_t key) override;
|
||||||
void userMemoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress) override;
|
void userMemoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress) override;
|
||||||
void userMemoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number,
|
void userMemoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number,
|
||||||
|
@ -183,7 +183,7 @@ enum ApduType
|
|||||||
SecureService = 0x3F1
|
SecureService = 0x3F1
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class DataSecurity
|
enum DataSecurity
|
||||||
{
|
{
|
||||||
none,
|
none,
|
||||||
auth,
|
auth,
|
||||||
@ -196,3 +196,20 @@ struct SecurityControl
|
|||||||
DataSecurity dataSecurity;
|
DataSecurity dataSecurity;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum RestartType
|
||||||
|
{
|
||||||
|
BasicRestart = 0x0,
|
||||||
|
MasterReset = 0x1
|
||||||
|
};
|
||||||
|
|
||||||
|
enum EraseCode
|
||||||
|
{
|
||||||
|
Void = 0x00,
|
||||||
|
ConfimrmedRestart = 0x01,
|
||||||
|
FactoryReset = 0x02,
|
||||||
|
ResetIA = 0x03,
|
||||||
|
ResetAP = 0x04,
|
||||||
|
ResetParam = 0x05,
|
||||||
|
ResetLinks = 0x06,
|
||||||
|
FactoryResetWithoutIA = 0x07
|
||||||
|
};
|
||||||
|
@ -188,6 +188,7 @@ bool SecurityInterfaceObject::isLoaded()
|
|||||||
|
|
||||||
void SecurityInterfaceObject::factoryReset()
|
void SecurityInterfaceObject::factoryReset()
|
||||||
{
|
{
|
||||||
|
_secAppLayer->setSecurityMode(false);
|
||||||
property(PID_TOOL_KEY)->write(1, 1, _fdsk);
|
property(PID_TOOL_KEY)->write(1, 1, _fdsk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,6 +93,11 @@ template <class P, class B> class KnxFacade : private SaveRestore
|
|||||||
return _bau.configured();
|
return _bau.configured();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void masterReset(EraseCode erasecode, uint8_t channel)
|
||||||
|
{
|
||||||
|
_bau.masterReset(erasecode, channel);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns HIGH if led is active on HIGH, LOW otherwise
|
* returns HIGH if led is active on HIGH, LOW otherwise
|
||||||
*/
|
*/
|
||||||
@ -352,4 +357,4 @@ template <class P, class B> class KnxFacade : private SaveRestore
|
|||||||
extern KnxFacade<Stm32Platform, Bau07B0> knx;
|
extern KnxFacade<Stm32Platform, Bau07B0> knx;
|
||||||
#elif __linux__
|
#elif __linux__
|
||||||
// no predefined global instance
|
// no predefined global instance
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user