Sourcecode Fortschritt
-
version = "0.0.2.57 - Rev: 897"
tcp.h/tcp.c erkennung / zerlegung überarbeitet
Ports stimmen, Rest leider noch falsch
-
version = "0.0.2.58 - Rev: 898"
tcp.h und tcp.c weiter verbessert
6 Flags (nun uint8_t anstelle bool) werden noch nicht richtig angezeigt
(Tests mit telnet und wireshark)Wichtiger Hinweis:
Mit dem qemu-EHCI (Vers. 0.11.5) klappt der ARP reply nur sporadisch (man kann es mit arp -s 10.0.2.15 00-12-12-12-12-12 statisch eintragen).
Bei qemu 14.1 klappt der ARP reply auf Anhieb.
http://qemu-buch.de/d/QEMU_unter_Microsoft_Windows#QEMU_unter_.C3.A4lteren_Microsoft_Windows-Versionen
-
version = "0.0.2.59 - Rev: 899"
TCP Debug nun ok
http://tools.ietf.org/html/rfc793#page-15 (TCP header)
-
version = "0.0.2.60 - Rev: 900"
Schalter _NETWORK_DATA_ in os.h eingeführt, um die Ausgaben etwas übersichtlicher zu machen. Die einzelnen Bytes - und ihre Bedeutung - kann man besser in wireshark analysieren.
-
Version 0.0.2.61:
- Verbesserungen am RTL8168-Treiber
- Verbesserungen an UDP-Funktionsprototypen
- Kleinigkeiten
-
version = "0.0.2.62 - Rev: 902"
Sende-Funktion in UDP aktualisiert:
void UDPSend(struct network_adapter* adapter, void* data, uint32_t length);
Noch nicht getestet.
-
Version 0.0.2.63:
- Großer Netzwerkprotokollumbau
-
Dickes Lob an MrX!
-
Version 0.0.2.64:
- ELF-Loader setzt nun R/W-Privilegien bei der Speicherallokation
- Konsolen unterstützen nun SCROLL_BEGIN
- Anpassungen an arp wegen Netzwerkumbau in 0.0.2.63
- Kleinigkeiten
-
Version 0.0.2.65:
- Ausgaben des RTL8139-Handlers hinter Makro verborgen
- Analyse der Netzwerkpakete in Kernel-Idle-Schleife verlegt
- Erkennung des Adressaten einer Nachricht (MAC, IP) -> TODO: Warum funktioniert das bei ICMP nicht zuverlässig?
-
Version = "0.0.2.66 - Rev: 906";
Netzwerk Interface überarbeitet
udpSend eingebaut
-
Version = "0.0.2.67 - Rev: 907";
(von cefour eingespielt)
PING PONG über router läuft nicht mehr.
23:39:08.264789 192.168.10.103 192.168.10.97 ICMP Echo (ping) request
23:39:08.273097 UnexTech_0f:0a:0c Broadcast ARP Gratuitous ARP for 192.168.10.97 (Request)"pingender Rechner schickt an den Router, und Router tauscht mac-addresse im Paket gegen seine eigene aus" (cefour)
Hat bisher nur geklappt, weil wir die MAC-Adresse geliefert haben.
-
version = "0.0.2.68 - Rev: 908"
- Formatierungen
- Ver./Rev. korrigiert
- IP 192.168.10.97 (für Hardware-Test)
- Frequenz auf 250 Hz eingestellt wie bei Linux 2.6.13
http://de.wikipedia.org/wiki/Linux_(Kernel)#Neuerungen_im_Kernel_2.6Routing-Tabelle fehlt noch
http://de.wikipedia.org/wiki/RoutingtabelleBeispiel: Aufruf mit netstat -r
Routingtabelle =========================================================================== Schnittstellenliste 0x1 ........................... MS TCP Loopback interface 0x2 ...00 13 d4 11 27 a5 ...... Intel(R) PRO/1000 PM Network Connection - Paketplaner-Miniport =========================================================================== =========================================================================== Aktive Routen: Netzwerkziel Netzwerkmaske Gateway Schnittstelle Anzahl 0.0.0.0 0.0.0.0 192.168.10.1 192.168.10.103 20 127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1 192.168.10.0 255.255.255.0 192.168.10.103 192.168.10.103 20 192.168.10.103 255.255.255.255 127.0.0.1 127.0.0.1 20 192.168.10.255 255.255.255.255 192.168.10.103 192.168.10.103 20 224.0.0.0 240.0.0.0 192.168.10.103 192.168.10.103 20 255.255.255.255 255.255.255.255 192.168.10.103 192.168.10.103 1 Standardgateway: 192.168.10.1 =========================================================================== Ständige Routen: Keine
Anzahl = Metrik
-
"0.0.2.69 - Rev: 909"
Arp Tabelle, finden eines Eintags war Fehlerhaft.
Wurde durch Integer vergleich anstatt string vergleich behoben
-
Version 0.0.2.70:
- strncmp durch memcmp ausgetauscht im Netzwerkcode
- Userlib: Weitere Funktionen implementiert
- Bugfix: strncmp repariert
-
version = "0.0.2.71 - Rev: ..." (nicht committed)
- UDPSend korrigiert (src- und destPort mit htons gedreht)
- Funktion ergänzt in network.c: network_adapter_t* network_getAdapter(uint8_t IP[4]);
- In keyboard.c die Erzeugung eines Netzwerkpakets per Tastendruck strg+n für Experimente ergänzt:if(retchar == 'n') // If you want to test something in networking { uint8_t sourceIP_address[4] ={192,168,10,97}; uint8_t destIP_address[4] ={192,168,10,103}; network_adapter_t* adapter = network_getAdapter(sourceIP_address); printf("network adapter: %X\n", adapter); // check uint16_t srcPort = 40; // unassigend uint16_t destPort = 40; if (adapter) { UDPSend(adapter, "PrettyOS says hello", strlen("PrettyOS says hello"), srcPort, adapter->IP_address, destPort, destIP_address); } return 0; }
Kontrolle mittels wireshark: http://www.henkessoft.de/OS_Dev/Bilder/rev911_UDPsend_TEST.PNG
-
version = "0.0.2.72 - Rev: 911" (ACHTUNG: in ckernel.c versehentlich 912)
- Weiterer Fehler in UDPSend behoben (Länge)
void UDPSend(network_adapter_t* adapter, void* data, uint32_t length, uint16_t srcPort, uint8_t srcIP[4], uint16_t destPort, uint8_t destIP[4]) { udpPacket_t* packet = (udpPacket_t*)((uintptr_t)data -sizeof(udpPacket_t)); packet->sourcePort = htons(srcPort); packet->destPort = htons(destPort); packet->length = htons(length + sizeof(udpPacket_t)); packet->checksum = packet->checksum = udpCalculateChecksum(packet, length + sizeof(udpPacket_t), srcIP, destIP); ipv4_send(adapter,packet,length + sizeof(udpPacket_t),destIP,17); }
Foto des Wireshark-Pakets: http://www.henkessoft.de/OS_Dev/Bilder/rev912_UDPsend_TEST.PNG
PS: Man muss zuvor PrettyOS pingen, damit die IP/MAC Kombination der destIP in der arp table unseres OS steht.
Nachdem UDPSend funktioniert, kann man sich an DHCPDiscover heran wagen.
An htons denken!
-
Version 0.0.2.73:
- UDPSend repariert. (Gefährliches Spiel mit Pointern entfernt)
- Ansatz für DHCP_Discover
- 255.255.255.255 statisch in ARP-Tabellen eingetragen
-
version = "0.0.2.74 - Rev: 913"
Meilenstein: Erfolgreicher DHCP Discover
Thanks to: MrX, cefourFoto (wireshark): http://www.henkessoft.de/OS_Dev/Bilder/DHCPDiscover.PNG
// options packet.options[0] = 99; // MAGIC packet.options[1] = 130; // MAGIC packet.options[2] = 83; // MAGIC packet.options[3] = 99; // MAGIC packet.options[4] = 53; // DHCP message type packet.options[5] = 1; // Length packet.options[6] = 1; // data: DHCP Discover packet.options[7] = 255; // end
Options: code/tag, length, data
http://www.networksorcery.com/enp/protocol/bootp/options.htm
-
Ergänzende Versuche, die jedoch nicht zu DHCP OFFER führten:
- DHCP Options:
// options packet.options[0] = 99; // MAGIC packet.options[1] = 130; // MAGIC packet.options[2] = 83; // MAGIC packet.options[3] = 99; // MAGIC packet.options[4] = 53; // MESSAGE TYPE packet.options[5] = 1; // Length packet.options[6] = 1; // (data) packet.options[7] = 55; // packet.options[8] = 6; // Length packet.options[9] = 1; // SUBNET MASK packet.options[10] = 3; // ROUTERS packet.options[11] = 6; // DOMAIN NAME SERVER packet.options[12] = 15; // DOMAIN NAME packet.options[13] = 28; // BROADCAST ADDRESS packet.options[14] = 42; // Network Time Protocol (NTP) SERVERS packet.options[15] = 57; // MAX MESSAGE SIZE packet.options[16] = 2; // Length packet.options[17] = 2; // (data) packet.options[18] = 64; // (data) packet.options[19] = 255; // end
- Next Server IP eingetragen:
for(uint8_t i = 0; i < 4; i++) { packet.ciaddr[i] = 0; packet.yiaddr[i] = 0; // packet.siaddr[i] = 0; packet.giaddr[i] = 0; } // next server IP packet.siaddr[0] = 192; packet.siaddr[1] = 168; packet.siaddr[2] = 10; packet.siaddr[3] = 1;
Die Versuche wurden analog mit qemu ausgeführt.
Auch ein Versuch mit
#define IP_1 0 #define IP_2 0 #define IP_3 0 #define IP_4 0
zu starten führt bei realer Hardware zu nichts.
Leider kein Erfolg bezüglich DHCP Offer.
------------------------------------------------------
Hier ein erfolgreicher DHCP-Vorgang eines anderen Rechners:
http://www.henkessoft.de/OS_Dev/Bilder/DHCPDiscover01a.PNG (Abfolge, zeitlich seltsam)
http://www.henkessoft.de/OS_Dev/Bilder/DHCPDiscover01.PNG (DHCP Discover)
http://www.henkessoft.de/OS_Dev/Bilder/DHCPDiscover01b.PNG (Options)