Internet , TCP/IP met de Atom , deel 4                    door Kees van Oss.

Inleiding:

Inleiding:

In de vorige artikelen heb ik beschreven hoe je een seriële verbinding met de PC kunt maken en hoe het PPP protocol werkt. In dit artikel wil ik verder ingaan op hoe je een ethernet verbinding met de PC (of netwerk) maakt. Verder heb ik geëxperimenteerd om de Atom als webserver te laten functioneren en zal mijn bevindingen bewoorden.

Ethernet kaart:

Om een ethernet verbinding te maken heb je hardware nodig. Ik heb een PC ethernet kaart gebruikt met daarop een Realtek 8019AS chip. Deze ene chip bevat alle hard- en software om ethernet verbindingen tot stand te brengen inclusief een 16 kB RAM buffer voor packets. Ook is er een 64x16 bits EEPROM op geplaatst waarin het MAC adres (unieke code voor de ethernet kaart) en andere settings opgeslagen zijn.
De kaart is een 16-bits uitvoering maar omdat hij in een 8-bits slot zit, wordt hij automatisch omgeschakeld naar 8-bits en is dan prima te gebruiken voor de Atom.

Hardware:

Wat is er hardwarematig nodig om een ethernet verbinding met een PC te verkrijgen? Er zijn 2 mogelijkheden om de Atom met een PC te verbinden, nl:

1.)

Cross-link kabel
Met een cross-link kabel is het mogelijk om een 1 op 1 verbinding met een PC te maken. Beide computers kunnen dan net als in een normaal netwerk aangeroepen worden. Wanneer de PC als router ingesteld is en aangesloten zit op een netwerk, dan kan men via de PC ook het netwerk op. Het is echter eenvoudiger om dan via een UTP kabel en een hub of switch het netwerk op te kunnen.

 
2.)

UTP kabel
Om in een netwerk te kunnen werken, moet je met een normale UTP kabel op een hub of switch aangesloten worden. Je bent dan ook voor anderen aanroepbaar. Indien er een router in het netwerk zit, dan ben je ook vanaf een ander netwerk (afhankelijk van de instellingen van de router) aanroepbaar en andersom. Het is op deze manier ook mogelijk om het internet op te kunnen, dit moet dan via de zogenaamde Gateway (PC welke op internet zit).

 

Software:

Softwarematig is er een driver nodig om de ethernet kaart aan te sturen en een of meerdere protocollen om met andere computers te communiceren (meestal TCP/IP). Het blokschema ziet er als volgt uit:

In tegenstelling tot het PPP protocol en de seriële verbinding, ben je met ethernet meteen aanwezig in het netwerk vanaf het moment dat de hardware kabels ingeprikt worden. Je hoeft dus niet eerst in te loggen.

MAC adres:

In het netwerk zijn de computers niet, zoals bij PPP, met hun IP adres aanroepbaar maar met hun MAC adres. Dit is een 6-bytes uniek adres voor een ethernet kaart. De ethernet kaart ontvangt alle packets welke over het netwerk gestuurd worden maar filtert alleen die packets eruit welke voor jouw MAC adres of voor iedereen (Broadcast) bedoeld zijn en plaatst deze in de buffer. Het enigste wat je moet doen is kijken of er een packet binnengekomen is en als dit zo is deze vanuit het ethernet kaart buffer geheugen inlezen naar het Atom geheugen. Daarna kan de packet afgehandel worden door het protocol waarvoor het bedoeld is.

Net zoals een PPP packet heeft ook een ethernet packet een header, deze ziet er als volgt uit:

Destination
MAC adres
(6 bytes):

MAC adres van de ethernetkaart waarvoor het packet bestemd is. Wanneer het packet voor ieder gebruiker in het netwerk bestemd is, is het MAC adres FF.FF.FF.FF.FF.FF (Broadcast)

Source
MAC adres
(6 bytes):

MAC adres van de ethernetkaart waarvan het packet gestuurd is

Type(2 bytes):Soort packet, bv $0800 (IP) of $0806 (ARP)

ARP:

ARP (Address Resolution Protocol) is een specifiek ethernet protocol. De applicaties roepen andere computers aan met hun IP adres. De netwerk kaarten communiceren met elkaar dmv hun MAC adres. Om te weten welke computer welk IP adres en bijbehorend MAC adres heeft, is het ARP protocol van belang. Dit protocol houdt een tabel bij met IP adressen en bijbehorende MAC adressen en een timer per adres. Indien er een bepaalde tijd geen actie geweest is met een MAC-adres dan verdwijnt deze uit de ARP tabel. In DOS is deze tabel zichtbaar te maken dmv het ARP -A commando. ARP kent 2 functies, nl een Request en Reply. De opbouw van een ARP packet is als volgt:

Request:
Wanneer een PC met de Atom wil communiceren maar het MAC adres van de Atom niet weet, zal deze PC een Broadcast ARP Request doen. In zo'n ARP-Request packet staat volgende informatie:

Hardware type(2 bytes):Voor ethernet verbindingen is dit 1
Protocol(2 bytes):Is gelijk aan het Type veld in de ethernet header
Hardware veldlengte(1 bytes):Normaal gesproken is dit 2
Protocol veldlengte(1 bytes):Normaal gesproken is dit 2
Operation code(2 bytes):Voor een ARP Request is dit 0001
Destination
MAC adres
(6 bytes):MAC adres Atom, maar omdat deze niet bekent is bij de aanvrager maakt het niet uit wat hier staat, bv. 00.00.00.00.00.00
Destination
IP adres
(4 bytes):IP adres van de Atom
Source
MAC adres
(6 bytes):MAC adres van de aanvrager
Source
IP adres
(4 bytes):IP adres van de aanvrager

Reply:
Wanneer de Atom zo'n ARP Request ontvangt zal deze een ARP reply teruggeven. In deze ARP Reply is het MAC adres van de Atom ingevuld en de source- en destination velden verwisseld. Een ARP Reply voor bovenstaande ARP Request ziet er dus als volgt uit:

Hardware type(2 bytes):Voor ethernet verbindingen is dit 1
Protocol(2 bytes):Is gelijk aan het Type veld in de ethernet header
Hardware veldlengte)(1 bytes):Normaal gesproken is dit 2
Protocol veldlengte(1 bytes):Normaal gesproken is dit 2
Operation code(2 bytes):Voor een ARP Request is dit 0002
Destination MAC adres(6 bytes):MAC adres van de aanvrager van de ARP Request
Destination IP adres(4 bytes):IP adres van de aanvrager van de ARP Request
Source MAC adres)(6 bytes):MAC adres van de Atom
Source IP adres(4 bytes):IP adres van de Atom

TCP:

TCP (Transport Control Protocol) is een protocol wat eerst een 1 op 1 verbinding met de aanvrager maakt voordat er data verstuurd wordt. Elk TCP packet bevat een Acknowledge en een Sequence veld wat een soort controle velden zijn om te kijken of data goed verzonden is en of dat de aanvraag voor een volgende blok data klopt.

Het tot stand brengen van een TCP verbinding verloopt volgens onderstaand schema:

Als de verbinding eenmaal tot stand is gebracht kan het versturen van data beginnen. Dit ziet er dan als volgt uit:
(Met Data wordt de lengte van de data bedoeld)

Wanneer er een TCP verbinding verbroken moet worden, zal dit aangevraagd moeten worden. Deze beëindigingsaanvraag verloopt als volgt:

Webserver applicatie:

Als test heb ik een basic webserver programma van Ben Zijlstra omgeschreven naar assembler en aangepast voor de Atom. In dit programma zitten de volgende modules:

Ethernet driver ,

deze module verzorgt het verzenden, ontvangen en afhandelen van buffer overflows van de ethernet kaart.

TCP/IP stack ,

deze module verzorgt het aanroepen van het juiste protocol waarvoor het packet bedoeld is en het tot stand brengen van een TCP verbinding met poort 80 van de aanvrager.

HTTP handler ,

deze module verzorgt het versturen van een HTML pagina.

Het programma bevat het minimale om een TCP verbinding voor HTTP tot stand te brengen. Het is echter een goed voorbeeld van hoe een webserver zou moeten werken. Meer informatie over het programma is te vinden op:

http://members.home.nl/bzijlstra/software/examples/basex.htm onder het hoofdstuk 'Embedded UDP/Telnet/Webserver'

Wanneer ik de Atom webserver via Explorer oproep op IP adres 192.168.0.10 dan is onderstaand beeld het resultaat:

Hoe verder:

Het TCP principe is nu duidelijk en moet in een dusdanige vorm gegoten worden dat het toepasbaar wordt voor de Atom. Enerzijds zou het mooi zijn om als aanvulling op COS (Cassete Operating System) en DOS (Disk Operating Sytem), NOS (Network Operating System) te introduceren waarin de standaard Load, Save, en Random Access file benadering werkt, maar anderzijds heeft een UIP project of Contiki ook wel iets om verder uit te werken. UIP is een TCP/IP stack waarin ethernet, ARP, TCP en IP verwerkt is en Contiki is een operating system met al dan niet grafische interface inclusief Web-browser, Web-server en Telnet server. Kijk maar eens op de volgende sites: UIP (http://dunkels.com/adam/uip/) en Contiki (www.dunkels.com/adam/contiki/).

NOS:
NOS moet, net als COS en DOS de SAVE, LOAD, BGET, BPUT, FIND en SHUT systeem vectoren aanpassen zodat deze met TCP/IP kunnen werken. Er moet dan wel een driver voor communicatie geladen worden, bv. PPP voor seriële of NET voor ethernet communicatie.
Verder moet er een applicatie geladen worden om de Atom bv als webserver of als Telnet terminal te laten functioneren.

UIP:
UIP is een TCP/IP stack welke ergens in het geheugen geladen kan worden of in ROM geplaatst kan worden. De applicaties kunnen dan gebruik maken van de functies welke UIP biedt om bv als webbrowser, webserver of als Telnet server te functioneren. UIP op zich is ca. 4 kB groot en de vraag is dan of er ruimte over is om commando's te definiëren waardoor UIP vanuit Basic aanroepbaar wordt. Je kunt in assembler natuurlijk altijd de juiste ROM voorschakelen en dan de UIP routines aanlinken.

CONTIKI:
Dit is een project op zich. Contiki bevat namelijk een multitasking operating system met grafische interface. Indien er geen grafische mogelijkheden zijn kan Contiki ook met text interface gebruikt worden. Verder zijn er al allerlei applicaties voor Contiki geschreven en hoeven dus niet meer opnieuw bedacht te worden.

Er is echter een probleem (of lees het als uitdaging ;-)): UIP en Contiki, met al zijn applicaties, zijn in C geschreven en met de CC65 compiler gecompileerd. Nu zijn er al diverse ports voor CC65 zoals de C64, Apple2 en de Atari maar nog niet voor de Atom. Ik ben op het moment bezig om CC65 ook naar de Atom te porten waardoor het mogelijk wordt om C programma's te compileren voor de Atom. Alles is nog in een experimentele fase omdat ik eerst uit moet zoeken hoe C en de CC65 compiler werken. Het compileren van standaard C-functies en Atom hardware afhankelijke routines naar een bibliotheek lukt maar om er een C programma met de Atom bibliotheek naar bruikbare 6502 code te compileren lukt nog niet. Er komt 6502 code uit maar de aanroep van de functies zijn nog niet juist. Hier wordt nog aan gewerkt.
Kijk maar eens op de site van CC65 om te zien hoe deze compiler werkt en voor welke systemen CC65 (http://www.cc65.org/) te gebruiken is,

Tot zo ver weer mijn vorderingen en experimenten aan het Atomaire front.

Groeten
Kees van Oss