Sourcecode Fortschritt
-
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
-
version = "0.0.2.107 - Rev: 946"
- tcp checksum noch nicht korrekt, aber schon nahe dran ^^
-
version = "0.0.2.108 - Rev: 947"
- tcp checksum noch falsch
- pseudoheader byteweise aufgebaut für besseren Überblickuint16_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: 00170607000000001cb30fc95012fffff3750000Internet 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;