Sourcecode Fortschritt
-
version = "0.0.2.89 - Rev: 928"
DHCP OFFER mit qemu (Windows, TAP) erreicht:
http://www.henkessoft.de/OS_Dev/Bilder/rev928_DHCP_OFFER.PNGqemu batch: qemu.exe -fda FloppyImage.img -soundhw pcspk -net nic,model=rtl8139,addr=1A,macaddr=00:12:12:12:12:12 -net tap,ifname=TAP2 -net user -localtime
Wichtiger Hinweis zum Testen:
Es gibt noch irgendwie Blockaden unter Windows bei TAP. Diese kann man umgehen, indem man andere virtuelle Netzwerkadapter (z.B. anderes TAP, VBox oder VMware Adapter) aktiviert oder deaktiviert. Hierdurch "lösen" sich die aufgestauten DHCP_OFFER-Pakete des qemuservers und sie "purzeln" mehrfach auf den Bildschirm.Man kann das OFFER nicht via wireshark (neueste Vers. 1.6.0) empfangen.
-
version = "0.0.2.90 - Rev: 929"
Startet nur mit DHCP_REQUEST hoch ohne DHCP_DISCOVER (ergibt DHCP_ACK bei qemu)
DHCP_REQUEST_and_DHCP_ACK: http://www.henkessoft.de/OS_Dev/Bilder/DHCP_REQUEST_and_DHCP_ACK.PNG
Die angezeigte lease time 0 1 81 128 (big endian) ist 86400 sec = 24 * 3600 sec = 1 Tag
Eingebaute Befehle:
strg+n = DHCP_DISCOVER
strg+i = DHCP_INFORM
strg+r = DHCP_REQUESTMit einer Änderung (weg von qemu) zum Test-PC und in network.c:
// Try to get an IP by DHCP
DHCP_Discover(adapter);
delay(1000000);
DHCP_Request(adapter);erhält man in wireshark: http://www.henkessoft.de/OS_Dev/Bilder/rev929a_DHCP_REQUEST_DHCP_NAK.PNG
PrettyOS zeigt das NAK:
PrettyOS [Version 0.0.2.90 - Rev: 929] -------------------------------------------------------------------------------- MAC Receiver: FFh FFh FFh FFh FFh FFh MAC Transmitter: 00h 22h CFh 36h 9Dh 1Ch Ethernet: type 2, Type: 08h 00h Ethernet 2. Ethernet type: IP. IP version: 4, IP Header Length: 20 byte UDP. UDP Header information: +--------------+----------------+ | 67 | 68 | (source port, destination port) +-------------------------------+ | 556 | 2ED4h | (length, checksum) +-------------------------------+ UDP BOOTP/DHCP Client op: 2 htype: 1 hlen: 6 hops: 0 xid: 0AFFE002h secs: 0 flags: 0000h cIP: 0.0.0.0 yIP: 0.0.0.0 sIP: 0.0.0.0 gIP: 0.0.0.0 MAC: 00h-30h-84h-2Bh-F2h-55h MAGIC OK Message Type: 6 Server IP: 192 168 1 1 END OF OPTIONS
Request mit XID: 0AFFE002 erhält ein DHCP_NAK:
1 = DHCP Discover message (DHCPDiscover).
2 = DHCP Offer message (DHCPOffer).
3 = DHCP Request message (DHCPRequest).
4 = DHCP Decline message (DHCPDecline).
5 = DHCP Acknowledgment message (DHCPAck).
6 = DHCP Negative Acknowledgment message (DHCPNak).
7 = DHCP Release message (DHCPRelease).
8 = DHCP Informational message (DHCPInform).
Dies ist in diesem Fall klar, da diese MAC bereits unter einer anderen IP im DHCP lease des Servers eingetragen ist.
Nun haben wir bereits mit Message Type 1, 2, 3, 5, 6, 8 experimentiert. Fehlt nur noch DHCPRelease und DHCPDecline.
Nun sollte ein Ablauf etwa wie hier aufgebaut werden: http://www.tcpipguide.com/free/diagrams/dhcpfsm.png
-
version = "0.0.2.91 - Rev: 930"
DHCP_State eingebaut:
network.c:
// Try to get an IP by DHCP adapter->DHCP_State = START; DHCP_Discover(adapter);
dhcp.c:
DHCP_AnalyzeOptions(adapter, dhcp->options); if(adapter->DHCP_State == OFFER) { printf("\n >>> PrettyOS got a DHCP OFFER. <<<"); DHCP_Request(adapter); } if(adapter->DHCP_State == ACK) { printf("\n >>> PrettyOS got a DHCP ACK. <<<"); useDHCP_IP(adapter, dhcp); } if(adapter->DHCP_State == NAK) { printf("\n >>> DHCP was not successful (NAK). <<<"); }
static void useDHCP_IP(network_adapter_t* adapter, dhcp_t* dhcp) { for(uint8_t i = 0; i < 4; i++) adapter->IP_address[i] = dhcp->yiaddr[i]; }
Discover - Offer - Request - ACK (Erfolgreicher Hardwaretest mit Testrechner)
In der DHCP-Lease-Übersicht des Router/DHCP-Servers wurde der Testrechner mit seiner Wunsch-IP hinzugefügt. Wireshark auf einem Rechner im LAN zeigt leider nur die Anfragen von PrettyOS, aber nicht die Antworten des DHCP-Servers.
Damit ist DHCP in grundlegender Form nun in PrettyOS implementiert.
Mit Qemu/TAP ist das Aufzeigen der ganzen Kette unter Windows bisher nicht gelungen.
PS: In keyboard.c wurde DHCP_Discover(...) und DHCP_Request(...) entfernt. strg+n sendet wie zuvor ein UDP-Paket mit aufgesetztem Freitext für UDP-Experimente. strg+i sendet DHCP_Inform.
-
version = "0.0.2.92 - Rev: 931"
- DHCP Release ergänzt, z.Z. strg+f (gibt bei meinem Router allerdings noch nicht frei)
- Lease Time Daten auch in Std. angezeigt
-
Version 0.0.2.93:
- Initialisierungsreihenfolge verbessert: U.a. wird Video früher installiert (-> je eher, desto besser. Ermöglicht frühere Debugausgaben).
- printf unterstützt nun %M und %I für die Ausgabe von IP und MAC Adressen. Angewendet im Netzwerkcode
- Strg+A resultiert nicht mehr in #PF, wenn keine Netzwerkkarte vorhanden ist
- Code aufgeräumt
-
Version 0.0.2.94:
- Analyse der DHCP-Option-Bytes vereinfacht
- c/s/vs/v/printf geben nun Anzahl geschriebener Zeichen zurück
- i2Hex (und damit auch c/s/vs/v/printf) gibt kein h mehr am Ende hexadezimaler Zahlen aus
- Ausgabe der ARP-Tabelle verbessert
-
version = "0.0.2.95 - Rev: 934"
SIP ersatzlos gestrichen
Problem: Zusammenhang netzwork adapter und IP geht verloren
-
version = "0.0.2.96 - Rev: 935"
Fehler bei ACK auf DHCP_Inform korrigiert. Your IP (dhcp->yiaddr) wird nur übernommen, wenn ungleich 0.0.0.0:
static void useDHCP_IP(network_adapter_t* adapter, dhcp_t* dhcp) { if (dhcp->yiaddr[0] || dhcp->yiaddr[1] || dhcp->yiaddr[2] || dhcp->yiaddr[3]) { for(uint8_t i = 0; i < 4; i++) adapter->IP_address[i] = dhcp->yiaddr[i]; } }
-
version = "0.0.2.97 - Rev: 936"
Endlich habe ich einen Trick gefunden, wie man auch die Antworten des DHCP-Servers in wireshark von einem anderen PC im LAN beobachten kann. Man muss bei den Anfragen die Forderung stellen, dass die Antwort an alle (BROADCAST) gesendet wird.
Beweis-Foto: http://www.henkessoft.de/OS_Dev/Bilder/rev936.PNG
Nachdem dieser Ablauf nun eindeutig demonstriert werden konnte, bitte ich um Reproduktion auch an anderer Stelle.
-
Version 0.0.2.98:
- Unterstützung von Parametern beim Programmstart
- Hello-Userprogramm zeigt übergebene Parameter an
- Verbessertes makefile für other_userprogs
-
Tests von Cuervo mit der vorhergehenden Vesrion:
- DHCP_Release funktioniert. Wenn der DHCP-Server will, wird es als abgelaufen angezeigt
- Wir müssen das Angebot aus OFFER verwenden für REQUEST anstelle der konstanten RIP (das kann der Server anders sehen ^^) aus network.h
- HOST NAME angeben bei den optionsFotos (Cuervo): http://prettyos.fanofblitzbasic.de/PrettyNWPics.zip
MrX: deine Version produziert einen #PF F000EF6F eip: 115391
ckernel.c: shell auskommentiert, "executeFile("1:/ttt.ELF", 0, 0); // TEST" eingefügt, klappt bestens. Bitte in Ordnung bringen.
-
version = "0.0.2.99 - Rev: 938"
shell auskommentiert, ttt wird testweise ausgeführt.
Netzwerk: Hostname "PrettyOS" eingeführt bei DHCP, DHCP_Request übernimmt IP aus DHCP_Offer.
-
Version 0.0.2.100:
- cpu.c: Es wird überprüft, ob cpuid unterstützt wird; Funktionen zum Lesen und Schreiben des MSR implementiert
- memory.txt geupdated und erweitert
- Bugfix/Hack: Shell nimmt nun argv/argc-Parameter beim Start
- Projektmappen: Verbesserte Intellisense-Kompatibilität durch Dummy-Header VCcompatibility.h und verbesserte Includepfad-Einstellungen
-
Version 0.0.2.101:
- Neuer Bugfix-Versuch. argc/argv nun via user stack übergeben.
-
Bitte darauf achten, dass bei den cross-tools die enthaltenen binutils, darunter auch ld.exe nicht mehr zu einem lauffähigen produkt führen (#PF).
MrX wird demnächst ein neues bundle für die crosstools hochladen.
http://kloke-witten.dyndns.org/~philipp/bin.zip <--- wenn es eilt
-
Version 0.0.2.102:
- Parameterübergabe wieder über eax/ecx
- Fehlerbehandlung im Floppytreiber verbessert
- Konsolen überarbeitet (Stabilität, Code vereinfacht)
-
version = "0.0.2.103 - Rev: 942"
TCP weiter ausgebaut:
- Senden klappt
- Checksum (UDP, TCP) bewirkt #PF
- 3-way-handshake: SYN kann bereits mit SYN ACK beantwortet werden
-
version = "0.0.2.105 - Rev: 944" (beim nächsten Mal bitte stehen lassen, wurde offenbar eine übersprungen)
checksum für UDP: 0 (wegen DHCP)
checksum für TCP: aktiviert, wireshark validiert diese aber als "incorrect"Checksum: 0x7754 [incorrect, should be 0xba47 (maybe caused by "TCP checksum offload"?)]
-
version = "0.0.2.105 - Rev: 944"
Parameter "protocol" ergänzt:
uint16_t udptcpCalculateChecksum(void* p, size_t length, uint8_t sourceIp[4], uint8_t destinationIp[4], uint16_t protocol)Checksum falsch.
-
version = "0.0.2.106 - Rev: 945"
- TCP-Checksum noch nicht korrekt
- internetChecksum (Fkt. wird bereits bei ip und icmp eingesetzt) mit verwendet