ONLY ONE BLOB IS ALLOWED OPEN AT A TIME
To avoid excessive complications, there is a restriction that only one blob within the firmware handler can be open at a time.
The system starts in the notYetStarted
state.
At each state, each method has a specific effect, depending on a variety of details, and sometimes the behavior is consistent regardless of overall state.
Opening the active image or hash always fails:
open(/flash/active/image)
returns false -- file cannot be opened.open(/flash/active/hash)
returns false -- file cannot be opened.
The two files are only present once their corresponding blob has been opened.
You can only open one file at a time, and some of the states exist only when a file is open.
State | fileOpen() |
---|---|
notYetStarted |
false |
uploadInProgress |
true |
verificationPending |
false |
verificationStarted |
true |
verificationCompleted |
true |
updatePending |
false |
updateStarted |
true |
updatedCompleted |
true |
The starting state.
open(/flash/image)
open(/flash/tarball)
open(/flash/hash)
open(/flash/verify)
open(/flash/update)
The BMC is expecting to receive bytes.
-
open(/flash/*)
returns false becausefileOpen() == true
-
close(/flash/*)
triggersstate -> verificationPending
-
commit(/flash/*)
returns false
The BMC is ready for verification or more bytes.
-
open(/flash/image)
triggersstate -> uploadInProgress
-
open(/flash/tarball)
triggersstate -> uploadInProgress
-
open(/flash/hash)
triggersstate -> uploadInProgress
-
open(/flash/verify)
-
open(/flash/update)
-
commit(/flash/verify)
state -> verificationStarted
The verification process has started, no more writes allowed.
-
open(/flash/*)
returns false becausestate == verificationStarted
-
close(/flash/verify)
state -> verificationCompleted
The verification process has completed.
open(/flash/image)
open(/flash/tarball)
open(/flash/hash)
open(/flash/verify)
open(/flash/update)
The update process is pending.
The update process has started.
open(/flash/*)
r eturns false becausefileOpen() == true
The update has completed (optional state to reach)
If verification fails, the state still transitions to verificationCompleted
and similarly, if the update fails the state still transitions to
updateCompleted
. It is up to the host-tool to check the result of the process
by running the stat()
command on their open session (either their session with
the verifyBlobId
or the updateBlobId
.
Action | Before | After |
---|---|---|
1. getBlobList() |
NYS | NYS |
2. stat(/flash/image) |
NYS | NYS |
3. open(/flash/image) |
NYS | UIP |
4. write(...) |
UIP | UIP |
5. close(/flash/image) |
UIP | VP |
6. open(/flash/hash) |
VP | UIP |
7. write(...) |
UIP | UIP |
8. close(/flash/hash) |
UIP | VP |
9. open(/flash/verify) |
VP | VP |
10. commit(...) |
VP | VS |
11. sessionStat(...) |
VS | VS (if !completed) |
11. sessionStat(...) |
VS | VC (if completed) |
12. close(/flash/verify) |
VC | UP |
13. open(/flash/update) |
UP | UP |
14. commit(...) |
UP | US |
15. sessionStat(...) |
US | US (if !completed) |
15. sessionStat(...) |
US | UC (if completed) |
16. close(/flash/update) |
UC | NYS |