Skip to content

Commit 1aaed45

Browse files
committed
added the protocol section
1 parent 8003f60 commit 1aaed45

7 files changed

+74
-4
lines changed

Barbu Paul - Gheorghe.tex

+71-4
Original file line numberDiff line numberDiff line change
@@ -851,14 +851,81 @@ \section{Utilitarul Flasher}
851851
\begin{enumerate}
852852
\item Aplicația a fost încărcată cu succes, caz în care acest lucru va fi raportat de Flasher cu următorul mesaj: \textit{ Successfully flashed firmware file app.fw} și bootloader-ul va porni aplicația, iar pe dispozitiv se vor vedea efectele rulării ei.
853853
\item Dacă Flasher-ul pare că s-a blocat și nu funcționează este posibil ca portul serial indicat prin parametrul \texttt{-p} să fie greșit, iar aplicația trebuie repornită cu portul corect.
854-
\item Bootloader-ul, de la apăsarea butonului, așteaptă 20 de secunde începerea transferului, dacă acest timp se scurge și pe microcontroller există o aplicație existentă, ea va fi rulată, iar procesul trebuie repornit.
854+
\item Bootloader-ul, de la apăsarea butonului, așteaptă 25 de secunde începerea transferului, dacă acest timp se scurge și pe microcontroller există o aplicație existentă, ea va fi rulată, iar procesul trebuie repornit.
855855
\item Procesul a eșuat, posibil pentru că aplicația a fost modificată și tag-ul de autentificare nu se potrivește cu cel corect. Flasher-ul va raporta acest caz prin mesajul: \textit{*ERR* Failed to flash firmware file app.fw}, iar procesul trebuie repornit. Dacă situația se repetă există posibilitatea ca fișierul firmware să fi fost modificat în timpul descărcării de la dezvoltator și o re-descărcare poate rezolva problema. De asemenea acest scenariu poate fi cauzat de criptarea aplicației cu o cheie de criptare greșită, caz în care trebuie contactat dezvoltatorul aplicației.
856856
\end{enumerate}
857857

858858
\section{Protocolul de comunicație serială}
859-
TODO: relativ simplu, transmite doar un fisier nu si chei de criptare
860-
TODO: protocolul folosit de bootloader-flasher (diagrame de mesaje)
861-
TODO: vezi emailuri + notitele din caiet
859+
860+
Pentru ca Flasher-ul să poată trimite fișierul firmware spre bootloader, trebuie să implementăm un protocol special de comunicație. Evident acest protocol va fi folosit atât de bootloader cât și de Flasher. Protocolul va fi definit prin structura unui pachet și mecanismele care fac posibilă înțelegerea semnificației acestor pachete.
861+
862+
Așadar structura unui pachet trimis între Flasher și bootloader este definită în tabelul \ref{protoStruct}.
863+
864+
\begin{table}[h]
865+
\begin{tabular}{ | c | c | c | c | }
866+
\hline
867+
\textbf{Zonă} & \textbf{Adresă} & \textbf{Descriere} & \textbf{Mărime (octeți)} \\ \hline
868+
\multirow{4}{*}{Antet} & \texttt{0x00} & ID (fixat la 0xA5A5) & 2 \\ \cline{2-4}
869+
& \texttt{0x02} & Tip pachet & 1 \\ \cline{2-4}
870+
& \texttt{0x03} & Lungime & 1 \\ \hline
871+
Date & \texttt{0x04} & Conținut pachet & variabil \\ \hline
872+
CRC & - & Cod polinomial & 2 \\ \hline
873+
\end{tabular}
874+
\centering
875+
\caption{Structura unui pachet al protocolului de comunicație}
876+
\label{protoStruct}
877+
\end{table}
878+
879+
Observăm în acest tabel faptul că pachetul începe cu un identificator care nu se modifică pe parcursul transmisiei, motivul pentru care am ales acest identificator, este că are biții foarte variați (\texttt{1010 0101 1010 0101}), modificarea unuia singur datorită interferențelor duce la modificarea valorii acestui câmp și deci la invalidarea pachetului. Valoarea aceasta a fost aleasă similar cu valoarea semnăturii unui disc bootabil, motivele fiind similare: dacă acești biți sunt modificați există șanse mari ca și restul biților să fie corupți.
880+
881+
Următorul câmp indică tipul pachetului, care poate fi de 4 tipuri:
882+
\begin{enumerate}
883+
\item \textbf{FIRST\_PACKET}: Primul pachet. Trimis de la Flasher spre bootloader. După acest tip de pachet va urma în mod sigur (cu excepția cazului de eroare) un pachet de tipul \texttt{NEXT\_PACKET}.
884+
\item \textbf{NEXT\_PACKET}: Reprezintă un pachet intermediar, nici primul, nici ultimul. Aceste pachete variază la număr în funcție de mărimea aplicației utilizator.
885+
\item \textbf{LAST\_PACKET}: Ultimul pachet. Trimis de la Flasher spre bootloader. Acest tip de pachet urmează cel mai frecvent după \texttt{NEXT\_PACKET} și este cu siguranță ultimul pachet pe care bootloader-ul îl va primi de la Flasher.
886+
\item \textbf{STATUS\_PACKET}: Singurul pachet pe care bootloader-ul îl poate trimite. Acesta reprezintă statusul transmisiunii fișierului firmware până la un moment dat.
887+
\end{enumerate}
888+
889+
Câmpul de lungime al pachetului indică numărul de octeți din partea de date a acestuia. Deși lungimea poate varia între 1 octet și 255 de octeți ea este limitată în mod artificial între 1 octet și 240 de octeți. Motivul acestei limitări a fost expus și în motivarea câmpului de padding în cadrul fișierului \texttt{.fw}. Din punct de vedere practic, algoritmul AES, folosit în modul flux, trebuie să primească doar date cu lungimi multiplu de 16 octeți. Se observă ușor că \(240 \% 16 = 0\) și că 240 este cel mai mare multiplu de 16, mai mic decât 255. Această limitare impune o simplificare a bootloader-ului, în sensul în care acesta poate decripta în mod direct orice pachet, el respectând cerințele algoritmului AES. În caz contrar ar fi fost necesar un buffer suplimentar unde am fi acumulat date până când lungimea lor ar fi satisfăcut cerințele algoritmului de decriptare: lungimea să fie multiplu de 16.
890+
În general pachetele vor transporta lungimea maximă de date criptate pentru a nu irosi putere de procesare și timp de transmisie. Un caz special este primul pachet (\texttt{FIRST\_PACKET}), care nu conține doar date criptate (aplicația utilizator), ci și un antet (conform formatului firmware-ului). Din fericire, am provăzut acest antet cu un câmp de padding, care îl face să ocupe o dimensiune multiplă de 16, iar datele criptate din restul pachetului să își păstreze și ele această dimensiune.
891+
892+
Excepție de la regula aceasta o face ultimul pachet, care nu este necesar să aibă o lungime anume. Algoritmul AES în modul flux permițând ca ultimul calup de date procesat să nu mai respecte cerința impusă șiruri de date anterioare. De asemenea, tot excepție de la regulă fac și toate pachetele de tip \texttt{STATUS\_PACKET}. Aceste pachete transportând în zona lor de date un singur octet care indică starea transmisiei la un moment dat.
893+
894+
Posibilele stări sunt:
895+
\begin{itemize}
896+
\item \textbf{STATUS\_ACK}: Acknowledge. Indică primirea unui pachet și decriptarea cu succes a datelor transportate de acesta. Acest status este trimis după fiecare pachet.
897+
\item \textbf{STATUS\_ERROR}: Indică o eroare fatală în sistem și cere oprirea transmisiei. În urma trimiterii acestui status, transmisia este oprită.
898+
\item \textbf{STATUS\_RETRY}: Indică faptul că un pachet nu a fost primit la timp sau că un cod polinomial nu poate fi verificat cu succes. Protocolul implementează un mecanism de timeout, acesta așteaptă câte cinci secunde sosirea unui pachet, iar dacă acesta nu sosește trimite de până la 4 ori \texttt{STATUS\_RETRY}. Așadar timeout-ul maxim este de 25 de secunde. Tot acest status este trimis dacă integritatea unui pachet nu poate fi validată de codul polinomial atașat la finalul acestuia. În general Flasher-ul va retrimite pachetul în cauză în urma procesării unui pachet de tip \texttt{STATUS\_PACKET} cu conținutul \texttt{STATUS\_RETRY}.
899+
\item \textbf{STATUS\_SUCCESS}: Acest status reprezintă finalizarea cu succes a transmisiei firmware-ului. Acest status se trimite doar după validarea (prin tag-ul de autentificare) și scrierea aplicației în memoria flash. Imediat după trimiterea acestui status, bootloader-ul va continua execuția prin predarea controlului aplicației tocmai primită.
900+
\end{itemize}
901+
902+
La finalul pachetului, în urma conținutului acestuia este atașat un cod polinomial pe doi octeți. Așa cum a fost prezentat la capitolul teoretic acest cod ne permite să verificăm integritatea datelor transportate de pachet. În cazul constatării interferențelor pachetul este ignorat, iar bootloader-ul va cere retransmisia acestuia printr-un pachet de tip \texttt{STATUS\_PACKET} cu conținutul \texttt{STATUS\_RETRY}.
903+
904+
Este important să precizăm ca Flasher-ul, în urma transmisiei unui pachet de tipurile \texttt{FIRST\_PACKET}, \texttt{NEXT\_PACKET} sau \texttt{LAST\_PACKET}, așteaptă un pachet de tip \texttt{STATUS\_PACKET} înapoi și doar după ce primește un astfel de pachet cu statusul \texttt{STATUS\_ACK} sau \texttt{STATUS\_RETRY} continuă trimiterea.
905+
906+
Ilustrativ, am folosit o diagrama a secvențelor (figura \ref{protocol-msd}) de mesaje pentru a arăta simplitatea protocolului. Aceasta simplitate are ca efect un cod simplu și mic ca dimensiune, atât pentru Flasher, dar și mai important: pentru bootloader.
907+
\begin{figure}[h]
908+
\centering
909+
\includegraphics[width=1\textwidth]{protocol}
910+
\caption{Diagrama de mesaje a protocolului}
911+
\label{protocol-msd}
912+
\end{figure}
913+
914+
Figura \ref{protocol-msd} prezintă cazul optimist, când toate pachetele sosesc corect din prima încercare, în figură nefiind prezentate pachetele de status: \texttt{STATUS\_RETRY}, \texttt{STATUS\_ERROR}. Aceste două tipuri de pachete sunt prezentate în figura \ref{protocol-msd-timeout}.
915+
916+
\begin{figure}[h]
917+
\centering
918+
\includegraphics[width=1\textwidth]{protocol-timeout}
919+
\caption{Diagrama de mesaje a protocolului în cazul de timeout}
920+
\label{protocol-msd-timeout}
921+
\end{figure}
922+
923+
În această figură este reprezentat cazul de timeout al protocolului. În această situație Flasher-ul trimite un pachet care nu ajunge la bootloader, iar acesta încearcă recuperarea sa fără succes. Se observă faptul că după patru pachete de status cu statusul \texttt{STATUS\_RETRY}, se declară eroare la transmisiune prin \texttt{STATUS\_ERROR}. În acest caz utilizatorul ar trebui să repornească procesul ...
924+
925+
TODO: spune cum poate fi flasher-ul acum (timout sau sa primeasca raspounsulile)
926+
927+
TODO: relativ simplu (nu continua pana nu rezolva cu un pachet), transmite doar un fisier nu si chei de criptare
928+
TODO: robust, permite timeout-uri si re-trimiteri
862929

863930
\section{Arhitectura și codul bootloader-ului}
864931
TODO: arhitectura bootloader-ului UML + cod

memory_map(2).xml

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:51.0) Gecko/20100101 Firefox/51.0" version="6.1.0.3" editor="www.draw.io" type="device"><diagram name="Page-1">7Zlfb5swEMA/De/GDv8ek7TdpKnSpDzs2QMHrBqMHKdJ9ulngyGASYM6MrVq8hDhO3zG97uzz+CgdX78JnCZPfOEMAeC5OigBwfCIALqXwtOtcCP/FqQCprUIvcs2NA/xAhNv3RPE7Lr3Sg5Z5KWfWHMi4LEsifDQvBD/7YtZ/1RS5wSS7CJMbOlv2gis1oaQv8s/05omjUju35Ua37j+CUVfF+Y8RyIttWvVue4sWUmustwwg8dEXp00FpwLuur/LgmTLu2cVvd7+mCtn1uQQo5pQOsO7xitifNE1fPJU+NL6rZEH2/66DVIaOSbEoca+1BwVeyTObMqNv5VA0p+EvrQNhK1pxxURlHkR8g7CvNljLWkRM38Uig5KnACVWT6eiMQ8+6BypUEFBeKP2O7/Voq5ThnQ4CoK5jntPYXJv5EiHJ8aLP3JaECnDCcyLFSd1iOsDQwDs19E37cA6VFnDWCZO2Izbhmba2z4jUhaE0Tiy8TowUyVIngWoVvCB9Qkr5RLX1yh02ogTvspZ2bZokVrZc9VXHF96IKxqZIAxL+to3P+YeM8JPTtXAl1H4Aw+rcBAxMb26eTAw5IErhiQWKZGWoYpWO+1JAJto6RBcqXxnHCdEWCxVmMpBivVyyADupo8RYUZTnRGxQqUMo5UOeqrWuKVR5DRJ9DCjOd0mso6SLS/kxjxT264XbY1mjqRCntcHgOykCsZyaoaUcl2LyFqNofcvojcZQUuFn3xgNvOygNGARWCzcKNbwbC3pGXJlG+cdehEK/p1McD/igFZGMDRBQAsQbNUfiQE7htbfgeNu9A73Ei5MAMuN1r0syaycYVohJY3A63FBVrhp6c1C5nB5u7ZZG6WR4FFxuKh/FLqy3gv2Gkl1BGCyOuldr8un+Rbq/wG1W+0Dnyr8B4yElxik1BuOFOV7YHBJtTEeLfKHoG2QDNAm1Bk36FNgea7k6ChcAZokQUN6faP1ZdfAD04wNK8yLhySptjAYT2cSe8UxmlMlLf3YyKfeS5r3CToPnDbQlOWuFgMMMS10DqUFNPC57vueSFg7PSwt54bpZL9lHJ4vFPr+Rqa5/nLRwEA6++9y2cZWi+t3Dw0okJ3E9MIycmYBcMM52YVPP8uaMGef6khB7/Ag==</diagram></mxfile>

memory_map.png

16.6 KB
Loading

protocol-timeout.png

18.8 KB
Loading

protocol-timeout.xml

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:51.0) Gecko/20100101 Firefox/51.0" version="6.1.2" editor="www.draw.io" type="device"><diagram name="Page-1">7Vpbk6I4FP41PHaXJIj6qLbObu2tS53amaepCBFTHYkF6W57f/0mEBCItICxZ7tWHzScwCGc7zuXHLTgdHf4EqH99g/mY2qBnn+w4IMFwGDUE99S8JYK3JGbCoKI+KnIPgqW5B+shOq64Jn4OC6dyBmjnOzLQo+FIfZ4SYaiiL2WT9swWr7rHgVYEyw9RHXp38Tn21Q6BO5R/gsmwTa7s+2O0pk18p6CiD2H6n4WgJvkk07vUKZLPWi8RT57LYjgzILTiDGejnaHKabStJnZ0uvmNbP5uiMc8iYXqGW/IPqsHn1OUbzFkVoef8tMIla6l8Mosfdky3dUHNli+LolHC/3yJPTr4IPQoYoCUJx6Il1CGVwkj+ovCIQ95AI9cTYYzviqXHMI/aEp4yyKLkpHII1dN18JsNCmGmyYSFXxLEdeUwoLVzp9/HQl/IgQj4RqyjMKUTgRLeWMuALjjg+FETKel8w22EevYlTstkMScV021HHr0fe2K6SbQucyWRIUTXIVR/hEgOFWA3cPQ2+FrhVLIaTT2eoesmnEVQmzD4qmz03Z8Hs4ITVoRGz2+fNjn0RUNRhyEJcNr0vfcxXBzj0xzJmHc+8wIQxe448XHJujqIA8zJj5PLetXOEKeLkpRwPLzEacBoYjVIR4XFNTCnYzzhFq1FCAXEmyOQKUbxP09CGHCSuJigOKwzvN2M4MEDwLM8VsCLhC/PE4wipNYXWeBaKESUhQRZwqYwsa5Ez3ECOfJyk5h0SWXDqWEPY0jsKDsH2OFxtiUglE2k5IlL0WKWWNeOc7dLTM4xAI+eJBa9IGKyYYNXDXXpRKpoonQ934H0GUbTGdJIn+wptxIrmRFo34SE+EP4tezQx/i7l9/33WFJxz7Jbp550gcuqSx8ZEbfN+ebWRNRMQ7oEdVGxpKjoqQ3NmaI0HmmKElLmj9OMpwONpxNROlGG/P9KBTNyBxDVVDCV/GuLmmVwgq5XrmAghD+vggHD/2sF4/TKZs/j/Zn47tgmzK7X/WYrmPfj41VMXwqRA730yaj28aUPbFCmf2prN7XsoaTiwnyVO0LWYxhcLc9AveAXOSIpbeK0JtrLr/UzZ+Hnq3XMVTqxMDnX9jJCVjhHoYIjIgDA0TJdTP5AaZGhz7otyiXjpVF/UBOr29ZGDjijyCBnb/utdgm5P6jUreDjNlxQ33DNf10sVz8ex9PfZqvuMWVNmffUMqgcfdq+LEdc2y2BXd1pjDq6Ze+MIoNuqW9Zlqvx6uvyh0D6hnMjeGCvY/itEkZTZBBnfWPz5+zbzaFbOTR0uubZKmOqigwCrW+lbg7d1qEHdjecNcJUFZnD2dE3cUYcWk22x/jCDdxH+7LWt2iKce67dYoMYgzrfHkxWy2+37y5kTf3XUPerCkyiHS/DunZYvHX4oZ0I6Tdrj5dRVpTZA7pvu7TLdE19LJWe6dzpqtm905jaLSJBqqI9psBcV5RdVtcQ40uiDbobGTvDMgu+adPEc6qV3LZGsulv8t21yOLCSes5LM1fbDiy5jkZuOsNXGyT6HW87DlXP6VaSztAOaeHzr3xGPhhoQ+ju49cUcw9xFH4kfKY/ErwczGUBrQHQDouneHOxsM7/eyS3aFFx/lBsw8+TTv31inezAnuF/P86FbJpaj4C+2ZdRmq9SWGdb7QtO2TF9vy9yY9pOZVjTDFegGs1dj2Y5iNNTp5pygm2OAbrVbyU9Tfp5PctcvP7s257Xy83rNeVffTN6Qbo+0qT6gpsgg0vqrwxvSrZF2qu92uyKtKeqMtDg8/k07Pf34V3g4+xc=</diagram></mxfile>

protocol.png

17.9 KB
Loading

protocol.xml

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:51.0) Gecko/20100101 Firefox/51.0" version="6.1.2" editor="www.draw.io" type="device"><diagram name="Page-1">7VrRkqI4FP0aH7tLEkD7UW2d3drZra7VqZ19mooQMdVILIitvV+/CSQIibSgcWanVh+6wwUu4Z5zbm4SenCyOXxK0Xb9Ow1x3AP98NCDzz0AhgOf/xWG98Lguv3CEKUkLEzO0TAn/2BpVJftSIiz2oWM0piRbd0Y0CTBAavZUJrSff2yFY3rT92iCBuGeYBi0/oXCdlavhbwj/ZfMInW6smO/1ScWaLgNUrpLpHP6wG4yn/F6Q1SvuSLZmsU0n3FBKc9OEkpZUVrc5jgWIRWha24b9Zwtux3ihPW5gbZ7TcU7+Srz2KUrXEqu8feVUh4T7eimebxHq/ZJuZHDm/u14Th+RYF4vSe84HbUEyihB8GvB/cGRyXLyruiPgzBEJ93g7ohgSynbGUvuIJjWmaPxQOwRL6fnlGYcHDNF7RhEniOK44JnFcuTP08DAU9ihFIeG9qJyTiMCxGS0ZwDecMnyomGT0PmG6wSx955eoswpJyXRHMX1/5I3jS9u6whllQ5KqUen6CBdvSMQa4O4b8HXATYsYzn8XQ9XPf62gshH2p3rYy3BWwg5ORB1aCbtzPuw45AlFHiY0wfXQh0JjoTzASTgSOet45RUhzOguDXBN3AylEWZ1xojufRjnFMeIkbd6PrwmaMBtEbQ45hkeN+SUSvysU1TPEhKIM0mmdIiybTEMrchB4GqD4lBjuNeO4cACwdU4V8GKJG804K/Drb0J7I2mCW/FJCGoB/xYZJYlHzP8SLRCnA/NG8RHwYnbG8KO6qgIgm5xslgTPpSMReQIH6JHcmhZUsboprhcYQRaiSfjvCJJtKCcVc8PxU2FaSx9Pj+AjxkUoyWOx+Vgr9GG92hGRHRzHuIDYV/Vq/H238L+6H3EEk2edVkXSrpCsvLWF0r4Y0u++Q0ZVXkouiBvqpYUmp/G1KwcFfnIcJSTsnyddjwdGDwd89Ippij8r1QwT/4AooYKRht/HV6zDE7Q9cYVDITwx1UwYPh/rWDcfj3sZb4/k99dx0bYzbrfbgXzcX68SehrKXJglj6Kat+/9IEtyvSfOtptI3uoubhyvCqFIAXkD242zkCz4OdjRF7aZEVNtBV/ljtGk5+v1rFX6WQ85MyYy3Bb5RqJCk4JBwCn86Iz5QsVRYZ51u9QLlkvjbxBQ67uWhu54Iwji5y9z7e6DcjeQKtbwfebcEFzwjX79c/54tvLaPLbdHF5TlnGNHjtmFSOmnauGyNuLUvg6DONpwtl2T/jyKIszSnLfDFafJl/40jfcW4FD+xfmH51whiOLOJsTmz+mH69C7qToKF76TirM0Z3ZBFocyp1F3RXQQ+cy3A2CKM7soeza07i7oLuKmh3aEnQhiOLQJuTvbugOwracywJ2nBkEWdg4Gyiayy1NC3KiIMXxPicNcktoO/+mIWZs1BXpjPeiemMsl3JCKgL1rtQ+bojeEPlw7vyr1b+0JbydUcWcTaXRj6P7pPtbkO5d6mgDcbojiwC7TUJev5lMpnO53esW0Hk63tOl4racGQPa89M3h3RtfRRjrF3f2b3xOmfxtDqZgnQEW0puvOO9OXPBmpcgmiLFWy1N0w2+RedVTh1VTKxBVJaP4vK7IVmhBFa02xDyVbddM8fNlJL0CfXo2V/nteMiU9WRyIOYBaEiftIApqsSBLi9DHgTwSzEDHE/wl7xv8LMFUbigD6AwB9/+Hw4IDh41bshtxgg7u+0D7Lf+3X6SVQ+lr7Ce4383zo14mlRunq8rtcVKstvw+btdCw/M4Pj1/YFsQ8fsUMp/8C</diagram></mxfile>

0 commit comments

Comments
 (0)