Sourcecode Fortschritt


  • Mod

    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.


  • Mod

    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


  • Mod

    version = "0.0.2.95 - Rev: 934"

    SIP ersatzlos gestrichen

    Problem: Zusammenhang netzwork adapter und IP geht verloren


  • Mod

    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];
        }
    }
    

  • Mod

    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


  • Mod

    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 options

    Fotos (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.


  • Mod

    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.


  • Mod

    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)


  • Mod

    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


  • Mod

    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"?)]
    

  • Mod

    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.


  • Mod

    version = "0.0.2.106 - Rev: 945"

    - TCP-Checksum noch nicht korrekt
    - internetChecksum (Fkt. wird bereits bei ip und icmp eingesetzt) mit verwendet


  • Mod

    version = "0.0.2.107 - Rev: 946"

    - tcp checksum noch nicht korrekt, aber schon nahe dran ^^


  • Mod

    version = "0.0.2.108 - Rev: 947"

    - tcp checksum noch falsch
    - pseudoheader byteweise aufgebaut für besseren Überblick

    uint16_t udptcpCalculateChecksum(void* p, uint16_t length, uint8_t srcIP[4], uint8_t destIP[4], uint16_t protocol)
    {
        uint32_t pseudoHeaderChecksum = 0;
        uint8_t  header[12]; // Pseudo header
        uint8_t* data = header;
        uint8_t  count = 12; // pseudo header contains 12 byte
    
        for (uint8_t i=0; i<4; i++)
        {
            header[i] = srcIP[i];
        }
        for (uint8_t i=4; i<8; i++)
        {
            header[i] = destIP[i-4];
        }
    
        header[8]  = 0;
        header[9]  = protocol;
        header[10] = length & 0xFF;
        header[11] = (length >> 8) & 0xFF;
    
        while (count > 1)
        {
            // pseudo header contains 6 WORD
            pseudoHeaderChecksum += (data[0] << 8) | data[1]; // Big Endian
            data   += 2;
            count  -= 2;
        }
    
        return internetChecksum(p, length, pseudoHeaderChecksum); // util.c
    }
    
    // compute internet checksum for "count" bytes beginning at location "addr"
    uint16_t internetChecksum(void* addr, size_t count, uint32_t pseudoHeaderChecksum)
    {
        uint32_t sum  = pseudoHeaderChecksum;
        uint8_t* data = addr;
    
        while (count > 1) // inner loop
        {
            sum   += (data[0] << 8) | data[1]; // Big Endian
            data  += 2;
            count -= 2;
        }
    
        if (count > 0) // add left-over byte, if any
        {
            sum += data[0] << 8;
        }
    
        while (sum >> 16) // fold 32-bit sum to 16 bits
        {
            sum = (sum & 0xFFFF) + (sum >> 16);
        }
    
        return ~sum & 0xFFFF;
    }
    
    void tcpSend(network_adapter_t* adapter, void* data, uint32_t length, uint16_t srcPort, uint8_t srcIP[4], uint16_t destPort, uint8_t destIP[4], tcpFlags flags, uint32_t seqNumber, uint32_t ackNumber)
    {
    //...
        packet->checksum = 0; // for checksum calculation
        packet->checksum = htons(udptcpCalculateChecksum((void*)packet, length + sizeof(tcpPacket_t), srcIP, destIP, 6));
    
        ipv4_send(adapter, packet, length + sizeof(tcpPacket_t), destIP, 6);
    //...
    }
    

    Wenn man header[8] ... [11] dreht, wird die differenz kleiner.

    Hier ein Hexpaket:

    0013d41127a50010a70f0a0c0800450000280000400080067707c0a80161c0a8011700170607000000001cb30fc95012fffff3750000000000000000
    Checksum: 0xf375 [incorrect, should be 0xf96f (maybe caused by "TCP checksum offload"?)]

    Hex-Code:
    IP-Paket: 450000280000400080067707c0a80161c0a80117
    TCP-Paket: 00170607000000001cb30fc95012fffff3750000

    Internet Protocol Version 4, Src: 192.168.1.97 (192.168.1.97), Dst: 192.168.1.23 (192.168.1.23)

    Transmission Control Protocol, Src Port: telnet (23), Dst Port: simba-cs (1543), Seq: 0, Ack: 1, Len: 0
    (Len ist hier die Datenlänge)

    chat:
    <ehenkes>TCP-Paket: 00170607000000001cb30fc95012fffff3750000
    <ehenkes>Src: 192.168.1.97 (192.168.1.97), Dst: 192.168.1.23 (192.168.1.23)
    <ehenkes>raus kommen muss: 0xf96f
    <ehenkes>daten gibts keine, reiner header
    <ehenkes>udptcpCalculateChecksum(void* p, uint16_t length, uint8_t srcIP[4], uint8_t destIP[4], uint16_t protocol)
    <ehenkes>p zeigt auf den tcp-header
    <ehenkes>length = sizeof(tcp_header)
    <ehenkes>IPs sind klar
    <ehenkes>MrX: gut so?
    <MrX>ja
    <ehenkes>Header length: 20 bytes
    <ehenkes>des TCP headers
    

    Weitere Pakete: (IPs gleich)

    <ehenkes>0017062800000000c56a32495012ffff007827a5    Checksum: 0x0078 [incorrect, should be 0x0672 (maybe caused by "TCP checksum offload"?)]
    
    <ehenkes>0017062900000000591dc44a5012fffffc630604  Checksum: 0xfc63 [incorrect, should be 0x025e (maybe caused by "TCP checksum offload"?)]
    

    erzeugt mit:

    header[11]  = 0;
        header[10]  = protocol;
        header[9]   = length & 0xFF;
        header[8]   = (length >> 8) & 0xFF;
    

    Nach Simulation:
    <MrX>Übrigens weiß ich, wie Du deine Variante lauffähig kriegst.

    header[8]  = 0;
    header[9]  = protocol;
    header[11] = length & 0xFF;
    header[10] = (length >> 8) & 0xFF;
    

Anmelden zum Antworten