Sourcecode Fortschritt


  • Mod

    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


  • Mod

    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. 😉



  • So, Star Wars läuft auch bei mir.

    Video:
    http://www.youtube.com/watch?v=CI2-yyE_EJ0

    Cuervo


  • Mod

    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 🙂


  • Mod

    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.htm

    if(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".


  • Mod

    version = "0.0.2.131 - Rev: 969"

    - Gateway IP aus DHCP ACK gezogen und bei adpater->... eingehängt.


  • Mod

    version = "0.0.2.132 - Rev: 970"

    - Subnet Mask aus DHCP ACK gezogen und bei adpater->... eingehängt.


  • Mod

    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 rtl8139

    Noch 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>
    

  • Mod

    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!


  • Mod

    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


  • Mod

    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


  • Mod

    version = "0.0.2.138 - Rev: 977"

    - arp_sendRequest korrigiert
    - arp_waitForReply geändert


  • Mod

    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.


  • Mod

    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


  • Mod

    version = "0.0.2.141 - Rev: 980"

    Fehler behoben in tcp.c bezüglich Übergabe des Ports an findConnection(...)

    Es gibt nun drei Versionen:
    - tcpConnection_t* findConnectionID(uint32_t ID)
    - tcpConnection_t* findConnectionListen(network_adapter_t* adapter)
    - tcpConnection_t* findConnection(uint8_t IP[4], uint16_t port, network_adapter_t* adapter)

    Es wird nun jeweils die qemu-Version von mir ins Repo gestellt. Bitte daran denken, die router-MACs in network.h anzupassen (qemu HACK). Man erhält diese mittels arp -a, evtl. vorher den router pingen, wenn er noch nicht im arp cache steht. 🙂

    Die Zuordnung der empfangenen Pakete zu den connections sollte nun recht gut klappen.

    Probleme:
    - strg c (connection list) ohne \n am Ende
    - telnet daten empfang macht probleme (ACK passt nicht?? Funktionierte aber schon gut)


Anmelden zum Antworten