Page suivante
Page précédente
Table des matières
Nous avons implémenté une machine virtuelle simple au sein du
noyau. Celle-ci opère sur un paquet TCP en entrée et gère un état
interne. Son état est composé de :
- Un pointeur d'instruction dans le code.
- Un buffer de stockage d'options TCP.
- Plusieurs "registres" :
flags, mss, wscale, win,
ack et df
correspondants aux champs TCP du même nom pour un éventuel paquet
de réponse.
Le code executé par la machine virtuelle est composé d'instructions sur
32 bits (en ordre de la machine) regroupant un mnémonique (sur 8 bits),
une option (sur 4 bits) et un opérande (sur 20 bits), comme visible
ci après.
0 7 8 11 12 31
+---------------+--------+---------------------------------------+
| Mnemonic | Option | Operand |
+---------------+--------+---------------------------------------+
TEST
Code : 01
Effectue un test sur l'objet défini par l'option. Si le test est vrai,
le pointeur d'instruction passe de l'instruction i à l'instruction
i+2. Si le test est faux, l'exécution se continue à l'instruction
i+1.
Les options des tests sont les suivantes :
- TCP Option (0)
: Vrai si l'option TCP dont le
code est passé en opérande est défini dans le paquet initial.
- Any TCP Flags (1)
: Vrai si un des flags TCP
passés en opérande est activé dans les flags TCP du paquet initial.
- All TCP Flags (2)
: Vrai si tous les flags TCP
passés en opérande sont activés dans les flags TCP du paquet initial.
- Ack (3)
: Vrai si la valeur de l'acquittement
du paquet initial vaut l'opérande.
- Listen (4)
: Vrai si le port destination du
paquet initial est ouvert sur la machine locale.
JMP
Code : 02
Continue l'exécution à l'instruction dont le numéro est
l'opérande.
PUT
Code : 03
Insère une option TCP dans le buffer d'options TCP. L'option TCP insérée est
l'opérande, sa source est déterminée par l'option de
l'instruction.
Les options sont les suivantes :
- Copy (0)
: L'option insérée est copiée à partir du
paquet initial si elle y est définie.
- Insert (1)
: L'option insérée est copiée à partir
des registres de la machine virtuelle. Uniquement valable pour les
options mss, wscale and timestamp.
SET
Code : 04
Définit la valeur d'un registre de la machine virtuelle. Le registre
concerné et le type d'affectation sont déterminés par l'option. La
valeur utilisée est l'opérande.
Les options acceptées sont les suivantes :
- flags (0)
: Définit le registre flags à la
valeur de l'opérande.
- ack (1)
: Définit le registre ack
(acquittement) à la valeur de l'opérande.
- df (2)
: Définit le registre df (bit "Don't
Fragment" de l'entête IP) à la valeur de l'opérande.
- win (3)
: Définit le registre win (taille de
fenêtre) à la valeur de l'opérande.
- mss (4)
: Définit le registre mss (taille de
segment TCP maximale) à la valeur de l'opérande.
- wscale (5)
: Définit le registre wscale (mise
à l'échelle de la fenêtre) à la valeur de l'opérande.
- timestamp (6)
: Définit le registre timestamp (valeur locale du
timestamp) à la valeur de l'opérande.
- relative ack (9)
: Définit le registre ack
(acquittement) à la valeur de l'opérande ajoutée au numéro de séquence
du paquet initial.
- relative df (10)
: Définit le registre df (bit "Don't
Fragment" de l'entête IP) à la valeur de l'opérande ajoutée à celle
de la valeur de ce champ dans le paquet initial.
- relative win (11)
: Définit le registre win (taille de
fenêtre) à la valeur de l'opérande ajoutée à la taille de fenêtre du
paquet initial.
- relative mss (12)
: Définit le registre mss (taille de
segment TCP maximale) à la valeur de l'opérande ajoutée à la valeur
mss du paquet initial (si définie).
- relative wscale (13)
: Définit le registre wscale (mise
à l'échelle de la fenêtre) à la valeur de l'opérande ajoutée à la
valeur wscale du paquet initial (si définie).
- relative timestamp (14)
: Définit le registre timestamp (valeur locale du
timestamp) à la valeur de l'opérande ajoutée à la valeur courante
utilisable pour le timestamp.
RET
Code : 05
Termine l'exécution du programme en retournant l'opérande.
Les opérandes acceptés sont les suivants :
- Accept (1)
: Termine l'exécution et demande
l'acceptation du paquet pour continuer son traitement.
- Drop (2)
: Termine l'exécution et demande
l'abandon du paquet.
- Reply (3)
: Termine l'exécution et demande
l'envoi d'une réponse basée sur l'état de la machine virtuelle.
Pour les différentes instructions acceptant des options TCP, les
options suivantes sont reconnues :
- eol (0)
- nop (1)
- mss (2)
- wscale (3)
- sackOK (4)
- sack (5)
- echo (6)
- echoreply (7)
- timestamp (8)
- pocOK (9)
- pocSP (10)
- CC (11)
- CC.NEW (12)
- CC.ECHO (13)
- acreq (14)
- acdata (15)
Page suivante
Page précédente
Table des matières