\chapter{Simulace sběrnice AFDX}
\label{chap:simulace}
Simulace přenosu pomocí sběrnice \zk{zkAFDX} je naprogramována v prostředí Simulink při využití toolboxu SimEvents. Tento nástroj umožňuje vytváření, přenos, kontrolu a řízení datových jednotek -- entit. Těmito jsou simulovány ethernetové rámce dle specifikace ARINC 664\cite{afdx}.

\zk{zkAFDX} rámce mají datovou strukturu podobnou běžnému ethernetovému rámci, doplněnou o speciální části (pole sériového čísla). Navíc jsou pozměněny zdrojové a cílové MAC adresy (viz \ref{chap:sbernice}).

\section{Výpočet CRC}
\zk{zkCRC} je vypočteno dle specifikace IEEE 802.3. Je uloženo do v 32 bitech, které jsou připojeny na konec \zk{zkAFDX} rámce.

CRC je možno vypočítat pro libovolně dlouhou sekvenci příchozích bitů zprávy tak, že jsou postupně vyčítány jednotlivé bity zprávy, které se exklusivně sčítají\footnote{XOR, exclusive or, $\oplus$} s bitovou maskou dle specifikace (zde v hexadecimální podobě: 0xEDB88320). Po zpracování všech bitů zprávy je výsledek takovýchto součtů roven CRC dané zprávy a je připojen na její konec.

Prostředí Simulink nabízí již předpřipravené bloky pro výpočet a kontrolu CRC, avšak v simulaci nebyly využity. Jejich vstupem musí být sekvence jednotlivých bitů zprávy uložených v jediném vektoru, jehož vytvoření je poměrně časově náročné z důvodů konverze parametrů uložených v jednotlivých entitách (jsou uloženy jako proměnné typu double).

Proto byla pro výpočet CRC vytvořena samostatná funkce, která v příchozí entitě nastaví poslední 4 byty na hodnotu kontrolního součtu. Tato funkce byla nejprve implementována pomocí rozdělení příchozí zprávy na jednotlivé bity, avšak tento přístup byl časově náročný, protože bylo nutné znovu používat konverze příchozích entit na vektor jednotlivých bitů. Časová náročnost vyplývá z nutnosti vytvoření rozsáhlého jednorozměrného vektoru, který je poté naplněn jednotlivými bity. Tyto bity musí být získány postupným bitovým posunem jednotlivých příchozích parametrů (převedených na typ uint8) a jejich násobení s bitovou maskou. Takovýto přístup je časově náročný a zbytečně složitý na implementaci.

Z výše uvedených důvodů bylo přistoupeno k implementaci výpočtu CRC po jednotlivých bytech, což výrazně urychlí výpočet CRC. Tento postup spočívá v nalezení odezvy všech možných hodnot vstupních bytů s binární maskou zvolenou pro daný typ CRC. Tyto odezvy jsou pak uloženy do tabulky (pro byty velikosti 8 bitů má tabulka 256 hodnot). Tuto tabulku je potřeba vypočítat pouze jednou (například před spuštěním simulace) a při výpočtu CRC z ní pouze vyčítat hodnoty.

Samotný výpočet CRC pro příchozí byty spočívá v nalezení příslušné hodnoty ze CRC tabulky a exkluzivním součtu s dočasnou hodnotou vypočteného CRC (na začátku inicializována na nejvyšší možnou hodnotou -- obsahuje pouze binární \uv{1}).

Zapouzdřená funkce pro výpočet CRC z příchozích bytů má následující kód:
\begin{verbatim}
function y = fcn(u, crcTable)

temp = uint8(u);
pocetBytu = size(temp,1);

crc = uint32(4294967295); %0xFFFFFFFF
for i = 1:pocetBytu
    index = uint8(bitxor(uint8(bitand(crc, 255)), temp(i)));
    crc = uint32(bitxor(bitshift(crc,-8), crcTable(index+1)));
end
y = uint8(zeros(4,1, 'uint8'));
y = typecast(bitcmp(crc),'uint8')';

end
\end{verbatim}
Po zpracování všech bytů zprávy je vypočítán jednotkový doplněk\footnote{funkce bitcmp() v Matlabu} z vypočteného CRC, který je následně použit k dalšímu zpracování (připojení na konec rámce).

CRC je počítáno ze všech polí \zk{zkAFDX} rámce, kromě preambule. Protože je zdrojová MAC adresa pro obě linky (A a B) \zk{zkAFDX} sítě rozdílná, bude se také lišit CRC v jednotlivých tocích dat v těchto linkách (pro odpovídající si rámce se stejnými daty, VL i pořadovým číslem).

Implementace výpočtu CRC po bytech je přepracována pro Matlab z kódu pro jazyk C \cite{crcweb}.
\section{Přepínač}
Hlavní funkcí \zk{zkAFDX} přepínače je přepínání příchozích rámců ze vstupních portů na výstupní porty. Přepínač ze vstupních rámců přečte cílovou MAC adresu, ve které je uloženo číslo VL. Dle tohoto čísla pak posílá rámce na jeden nebo více výstupních portů. Přepínač také může poslat rámec zpět ke koncovému uzlu, který jej poslal (koncový uzel tak může testovat funkčnost linky).

Nastavení, které rámce posílat na jaké výstupní porty by v reálném systému bylo uloženo v konfiguračním souboru. Tento je možné nahrát do přepínače speciálním protokolem\footnote{ARINC 615A-3}. Kvůli zjednodušení je toto v simulaci nastaveno přímo uspořádáním funkčních bloků a jejich propojením. Pokud je tedy potřeba změna konfigurace, je nutné změnit propojení bloků.
\begin{figure}[htbp]
	\centering
  \includegraphics[width=15cm]{obrazky/switching.png}
  \caption{Realizace přepínání rámců v prostředí SimEvents.}
  \label{fig:switching}
\end{figure}

Na obr. \ref{fig:switching} je zobrazena realizace přepínání rámců v prostředí SimEvents. Nejprve je z příchozího rámce přečtena cílová MAC adresa pomocí bloku Get Attribute. Ta je v rámci reprezentována proměnnou typu double a je nutné ji pro správné zpracování překonvertovat na typ uint8. V bloku vlid\_mac je z adresy separováno číslo VL, které je následně použito pro přepnutí rámce na výstup. Rámec je nutné při zpracování MAC adresy zpozdit. Bez tohoto zpoždění dochází v systému k nesprávnému přepnutí nebo dojde k chybě posílání rámců -- následující bloky za přepínačem se zablokují, protože příchozí rámce nejsou správně synchronizovány.
\section{Koncový systém}
Koncový systém na sběrnici \zk{zkAFDX} plní jeden hlavní úkol -- přijímají data z vyšších vrstev systému a vytvářejí rámce pro přenos v síti. Tyto rámce jsou přiděleny do jednotlivých VL a poslány po duplicitních linkách sběrnice.

Pokud je nějaký koncový systém i příjemcem některé z VL, pak tyto příchozí rámce zpracovává a předává vyšším vrstvám, pokud nejsou poškozené.

V simulaci jsou pro zjednodušení vytvářeny rámce z náhodných dat přímo v koncovém systému. Velikost těchto dat je možné zadat před spuštěním simulace (počet bytů).

Model simulace obsahuje bloky pro vytváření toků dat jednotlivých VL, kdy každý takový blok vytváří dva toky dat pro linku A a linku B \zk{zkAFDX} sítě. Tyto datové toky jednotlivých VL jsou pak spojeny do jednoho toku dat pro každou linku \zk{zkAFDX} sítě. Avšak před jejich spojením musí být jednotlivé toky dat VL navzájem zpožděny, aby nedocházelo ke kolizím. Tímto je simulována funkce plánovače, který rámce jednotlivých VL předává k výstupu dle určitého klíče. Při použití rozdílných zpoždění pro každou VL je simulováno round-robin vybírání rámců (rámce nejsou vybírány dle žádné priority).

V přijímací části koncového systému jsou umístěny bloky pro výpočet kontrolního CRC a blok porovnávacího monitoru (Comparison monitor). Tento porovnává obě vypočtená CRC a pokud se neshodují, nastaví u přijatého rámce atribut informující o této neshodě. Dále tento monitor srovnává přijatá data v rámcích z obou linek. Pokud jsou data rozdílná (tato neshoda se nemusí v některých případech projevit v rozdílném CRC), je u obou rámců toto poznačeno.

Dále již mohou být rámce využity k dalšímu zpracování. V simulaci jsou příchozí rámce uloženy do matice pro zpracování v Matlabu.
\section{Zhodnocení simulace}
Implementovaná simulace sběrnice slouží jako základ pro bezpečnostní analýzu, kde jsou do simulace vloženy bloky způsobující základní chyby. Tyto pak slouží k ověření správné odezvy systému na tyto chyby.

Dále simulace může sloužit pro názorné objasnění principů fungování sběrnice \zk{zkAFDX}. Toto je důležité pro počáteční fázi implementace reálné sběrnice. V reálném systému budou jednotlivé funkce sběrnice implementovány odlišnými způsoby, princip fungování je však zachován.
%