Sourcecode Fortschritt
-
version = "0.0.2.124 - Rev: 962"
Ausgaben bei networking etwas vereinfacht.
-
version = "0.0.2.125 - Rev: 963"
Kleine Veränderungen in networking Ausgabe
-
Version 0.0.2.126:
- netutils.c/h gebildet. Enthält ntohl (u.ä.) sowie checksum-Funktionen
- Syscall-Aufruf verwendet festgelegte Register (vermeidet Fehler mit -fomit-frame-pointer)
- Code wird nun mit -fomit-frame-pointer gebaut
- Kleinigkeiten
-
Version 0.0.2.127:
- IPs und MACs jetzt mit memcmp verglichen
- IP_address und MAC_address in IP und MAC umbenannt
-
version = "0.0.2.128 - Rev: 966" (versehentlich zu hoch gedreht in ckernel.c)
PrettyOS goes to INTERNET via routing (FIRST TEST)
if(retchar == 'w') // Create & Bind connection { connection = tcp_createConnection(); // 94.142.241.111 auf Port 23 uint8_t destIP[4] ={94,142,241,111}; memcpy(connection->remoteSocket.IP, destIP, 4); connection->remoteSocket.port = 23; uint8_t sourceIP[4] ={IP_1,IP_2,IP_3,IP_4}; //HACK memcpy(connection->localSocket.IP, sourceIP, 4); network_adapter_t* adapter = network_getAdapter(sourceIP); printf("network adapter: %Xh\n", adapter); // check connection->adapter = adapter; if(adapter) { tcp_connect(connection); } return 0; }
Da wird die Starwars Story erzählt von einem sehr geschwätzigen telnet server (IP: 94.142.241.111). Vielen Dank an Cuervo für diesen Bomben-Tipp!
Foto: http://www.henkessoft.de/OS_Dev/Bilder/rev.966_INTERNET.PNG
Wer dies nachstellen möchte, benötigt eine rtl8139 Netzwerkkarte, und bitte die router-mac (erhält man oft mit arp -a aus dem arp-cache) und die IP/RIP (gleich), die man von DHCP erhält, in network.h eintragen. Das muss alles noch automatisiert werden.
Start ist z.Z. mit strg+w
HTTP geht noch nicht (fehlt noch die ACH-Number aus dem SYN-ACK des handshake), kommt demnächst wenn der TCB in connection gefüttert wird.
-
-
version = "0.0.2.129 - Rev: 967"
- Zuerst Senden (also erstes ACK nach handshake) auf www.henkessoft.de port 80 (HTTP)
- bei TIME_WAIT wird connection zerstört, damit man diese mit strg+w neu aufbauen kann.Anwendung:
strg+w (verb. aufbauen),
strg+x (Daten werden geschickt: "GET / HTTP/1.0\r\nHost: www.henkessoft.de\r\n\r\n")(Die Homepage rast durch)
Foto: http://www.henkessoft.de/OS_Dev/Bilder/rev.967_INTERNET_HTTP.PNG
-
version = "0.0.2.130 - Rev: 968"
- srand, rand eingebaut für Erzeugung von ISS in tcp.c
- Extra eine eigene Übungsseite gebaut: http://www.henkessoft.de/OS_Dev/PrettyOS.htmif(retchar == 'w') // Create & Bind connection { connection = tcp_createConnection(); // uint8_t destIP[4] ={94,142,241,111}; // 94.142.241.111 at Port 23, starwars story uint8_t destIP[4] = {82,100,220,68}; // www.henkessoft.de Port 80 memcpy(connection->remoteSocket.IP, destIP, 4); connection->remoteSocket.port = 80; uint8_t sourceIP[4] ={IP_1,IP_2,IP_3,IP_4}; //HACK memcpy(connection->localSocket.IP, sourceIP, 4); network_adapter_t* adapter = network_getAdapter(sourceIP); printf("network adapter: %Xh\n", adapter); // check connection->adapter = adapter; if(adapter) { tcp_connect(connection); } return 0; } if(retchar == 'x') // send data to the connection { tcp_send(connection, "GET /OS_Dev/PrettyOS.htm HTTP/1.1\r\nHost: www.henkessoft.de\r\nConnection: close\r\n\r\n", strlen("GET /OS_Dev/PrettyOS.htm HTTP/1.1\r\nHost: www.henkessoft.de\r\nConnection: close\r\n\r\n"), ACK_FLAG, connection->tcb.SND_NXT, connection->tcb.SND_UNA); return 0; }
Klappt gut!
HTTP hat natürlich im eigentlichen Kernel nichts verloren. Dies hier in keyboard ist sozusagen ein "Steckbrett".
-
version = "0.0.2.131 - Rev: 969"
- Gateway IP aus DHCP ACK gezogen und bei adpater->... eingehängt.
-
version = "0.0.2.132 - Rev: 970"
- Subnet Mask aus DHCP ACK gezogen und bei adpater->... eingehängt.
-
version = "0.0.2.132 - Rev: 970" <--- Simulation mit qemu:
qemu gestartet mit TAP1/TAP2 unter Windows XP.Foto: http://www.henkessoft.de/OS_Dev/Bilder/rev.970_INTERNET_HTTP.PNG
strg+w baut die connection via router zum Internet auf Port 80 (HTTP) auf, strg+x fordert Daten mittels GET ... an.
DHCP läuft hierbei nicht sauber zum Ende durch (bleibt bei OFFER hängen, wobwi REQUEST gesendet wird, man muss mit TAP1 Aktivierung/Deaktivierung toggeln). Daher sind die HACKs wichtig.
So wie es aussieht, kann man TCP/IP damit trotz des DHCP-Problems testen.
qemu batch datei:
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
Die Emulation mit qemu funktioniert auch mit dem pcnet-Treiber.
pcnet anstelle rtl8139Noch besser: Da qemu und der HOST zusammen NAT spielen, werden die PrettyOS-Pakete unter der IP des HOST verschickt, sodass man in wireshark jedes Paket sieht: http://www.henkessoft.de/OS_Dev/Bilder/rev.970_INTERNET_HTTP_WIRESHARK.PNG
PrOS = PrettyOS, web = Website
Send Recv flags seq# ack# nextseq# window --------------------------------------------------------------------------- PrOS web SYN 0 - 65535 web PrOS SYN ACK 0 1 65535 PrOS web ACK 1 1 65535 PrOS web PSH ACK 1 1 82 65535 GET /OS_Dev/... web PrOS ACK 1 82 248 65535 1. Teil Header web PrOS ACK 248 82 755 65535 OK 2. Teil <!DOCTYPE ... PrOS web ACK 82 755 64781 web PrOS FIN ACK 755 82 65535 PrOS web ACK 82 756 64781
Anmerkung: beim ersten Datenpaket vom Webserver steht: TCP segment of a reassembled PDU
HTTP Protokollschicht:
GET /OS_Dev/PrettyOS.htm HTTP/1.1 Host: www.henkessoft.de Connection: close HTTP/1.1 200 OK Date: Mon, 20 Jun 2011 19:45:22 GMT Server: Apache/2.2.17 Last-Modified: Sun, 19 Jun 2011 16:32:48 GMT ETag: "1e07e25-1fb-4a6132b4e8c00" Accept-Ranges: bytes Content-Length: 507 Connection: close Content-Type: text/html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html;charset=ISO-8859-15" http-equiv="Content-Type"> <title>PrettyOS</title> </head> <body> <h1>Hallo, hier spricht PrettyOS. </h1> <h1>Ich wurde in C und Assembler erstellt. </h1> <h1>Es gibt eine Community, die mich hingebungsvoll pflegt und weiter entwickelt.<br> </h1> <h1><a href="http://www.c-plusplus.net/forum/f62">http://www.c-plusplus.net/forumf62</a></h1> <br> </body> </html>
-
version = "0.0.2.133 - Rev: 971"
- tcp etwas überarbeitet: mehr Ausgaben über connection (addr) und port
- bei strg+b und strg+w (gemischt) geht noch einiges durcheinander!
-
version = "0.0.2.134 - Rev: 972"
- strg+c: listet alle connections auf
- tcp kleine änderungen
-
Version 0.0.2.135:
- Keyboard-Treiber komplett neu geschrieben
-- Alle Tasten der Tastatur werden nun unterstützt (z.B. war früher der Num-Block unbenutzbar)
-- Bessere Unterstützung für US-International-Layout (fast vollständig)
-- Änderungen bei der Bedienung: Screenshots werden mit Print im Speicher angelegt. Drückt man unmittelbar danach f oder u, wird er auf Floppy bzw. USB-Stick gespeichert.
- Bessere ASCII -> CP437-Übersetzung: Mehr Zeichen darstellbar.
- Event-System
- getCursor nimmt nun position_t* (in den die Position geschrieben wird) und gibt void zurück. (Führte vorher zu #PF bei Verwendung als Syscall)
- Bugfix in list_Delete (führte ggf. zur Zerstörung der Listen)
- Keysound etwas verbessert: Tonhöhe hängt von gedrückter Taste ab, ESC beendet das Programm.Bekannte Probleme:
- Jedes zweite %-Zeichen wird von der Shell (genauer: printLine/kprintf) verschluckt (Problem existiert schon länger, ist erst jetzt aufgefallen)
- Unter Qemu 0.14.1 und 0.14.0 senden E0-Tasten kein 0xE0. Sie funktionieren daher nicht.
-
Version 0.0.2.135 - Rev: 974:
- events.h/c nachgeliefert
- Bugfix: Rebuild der Userprogramme geht wieder
-
Version 0.0.2.136 - Rev: 975
Experimenteller Zwischenstand mit arp_sendRequest und dem Versuch das Gateway einzutragen, klappt leider nicht (s. wireshark). Ursache unklar.
-
Version 0.0.2.137
- Berücksichtigung des Subnets beim Senden von Paketen. Problem: ARP-Requests funktionieren nicht
- Events mit mutex geschützt
- Für Tests die Funktion network_getFirstAdapter bereitgestellt
- Kleinigkeiten
-
version = "0.0.2.138 - Rev: 977"
- arp_sendRequest korrigiert
- arp_waitForReply geändert
-
version = "0.0.2.139 - Rev: 978"
- arp_sendRequest eingebaut in DHCP ACK options
- qemu HACK dort eingebaut
aber es läuft noch nicht rund, qemu gar nicht mit TCP wegen der nun fehlenden MAC-Adresse des gateways des externen routers, an den qemu/TAP nicht ran kommt. Da muss wohl ein MAC-HACK her wie vorher.In findConnection (tcp.c) ist auch noch ein blöder HACK für passive open im ersten recveive schritt.
-
version = "0.0.2.140 - Rev: 979"
- QEMU_HACK (in network.h zusammen mit externer router MAC definiert) eingebaut in ipv4.c beim Senden
- tcpConnection_t* findConnectionID(uint32_t ID) neu eingeführt (zur Brückung strg+w und strg+x)
- QEMU HACK aus DHCP entfernt
- strg c listet nun incl. ID und Adresse auf