BOOTP (Deutsch)

From Ethersex_Wiki
Jump to: navigation, search
BOOTP
Status
In Development
menuconfig Protocols->BOOTP
Pinning no
Ecmd no
Code https://github.com/ethersex/ethersex/tree/master/protocols/bootp


Warum BOOTP?

Jeder kennt das Problem, wenn man eine Firmware erstellt hat, muss sie irgendwie in die Hardware kommen. Der gängige Weg, man flasht die Hardware mit einem Programmieradapter über SPI oder JTAG (ATMEL). In der Firmware muss die MAC- Adresse und die IP-Adresse für die Hardware (µC) einkompiliert sein. Sie ist damit erstmals fix und kann nur nachträglich über das ECMD-Kommandos ip geändert werden. Schön wäre es, wenn man sich um die IP-Adresse nicht kümmern müsste und sie selbständig zum Bootzeitpunkt geladen wird. Und noch schöner wäre es, wenn der µC sich auch gleich die aktuelle Firmware selbst laden und flashen würde. Genau dies macht jetzt BOOTP.

BOOTP Startsequenz

BOOTP ist der Vorläufer von DHCP mit dem einem Netzwerkgerät wie z.B. unserem µC eine IP-Adresse zugeordnet werden kann. Falls das Netzwerkgerät nicht über einen eigenen Festspeicher verfügt, kann auch die Firmware oder das Betriebssystem auf Anfrage des Netzwerkgerätes übertragen werden. Damit BOOTP funktioniert, muss ein Minimalprogramm mit dem BOOTP-Client auf dem Netzwerkgerät als Bootloader gespeicher sein. Bei einem PC liegt dieses Programm in der Netzwerkkarte. Auf unserem µC muss der Ethernet Bootloader geflasht sein. Dieser enthält eine eindeutige MAC-Adresse für das Netzwerkgerät, damit es adressiert werden kann.

Zum Bootzeitpunkt verfügt der µC nur über die MAC-Adresse. Er stellt also als erstes eine Broadcast-Anfrage an alle Netzwerkteilnehmer mit der Bitte ihm eine IP-Adresse zu geben. Gibt es im Netzwerk einen anderen Rechner, der einen BOOTP- oder DHCP-Server enthält, so antwortet dieser Server und gibt ihm, sofern erlaubt, eine IP-Adresse, die Netmask und das Gateway. Ab nun an kann der µC unter dieser Adresse erreicht werden. Als nächstes fragt der µC den BOOTP-Server nach einer aktuellen Firmware. Dieser teilt ihm den Server und den Port mit, von dem die Firmware per TFTP geladen werden kann.

Mit dieser Art des bootens, kann sehr elegant der µC geflasht und gleichzeitig eine IP-Adresse zugeordnet werden. Das eigentliche flashen der Firmware macht der µC damit selbständig. Mit dem Ethernet Bootloader und BOOTP ist es möglich, beliebige Firmware zu laden ohne ein Programmieradapter zu benutzen. Es muss lediglich die aktuelle Firmware auf dem BOOTP-Server hinterlegt sein und einmal der µC neu gestartet werden und schon flasht er sich selbständig ohne weiteres zutun nur über das Netzwerk. Diese Art des "flashens" geht schneller als mit einem Programmieradapter. In gut 10s ist die Firmware (ca. 50kB) geladen, geflasht und gestartet.

Voraussetzungen

Damit BOOTP benutzt werden kann müssen bestimmte Voraussetzungen erfüllt sein:

  • Nur mit einem ATMEGA644 oder größer läßt sich der 8KB Ethernet Bootloader flashen
  • Der Bootloader mit BOOTP belegt die letzten 8KB ab Adresse xE000 des Programmspeichers, die nicht mehr genutzt werden können
  • Die Programmgröße (Firmware) ist auf 56 KB beschränkt
  • Die Securebits sollten gesetzt sein, damit der Bootloader sich nicht selbst überschreiben kann
  • Es muss ein BOOTP- und TFTP- Server wie z.B. HahneDHCP o.ä. im Netzwerk erreichbar sein
  • Die Firmware muss als ethersex.bin auf dem TFTP-Server hinterlegt sein
  • In der Firmware muss die selbe MAC-Adresse verwendet werden wie im Bootloader von BOOTP

Konfiguration in menuconfig

Als Basis kann in nenuconfig die Option "Bootloader BOOTP" gewählt werden. Es ist zu beachten, dass keine spezifischen Einstellungen außer CPU-Typ und MCU frequency für die jeweilige Hardware im Bootloader durchgeführt werden. Die hardwarespezifischen Einstellungen werden in der Firmware vorgenommen.

Folgende Optionen sollten in menuconfig aktiviert sein:


│ │   Load a Default Configuration  --->
│ │      (*) Ethernet Bootloader
│ │   General Setup  --->
│ │      (ATmega644) Target MCU
│ │      (20000000) MCU frequency                      // 16000000 für AVR-NET-IO
│ │      [*] Build a bootloader
│ │      [*] Teensy build
│ │   Network  --->
│ │      Hostname: "ethersex"                          // Hostname ändern
│ │      [*] Ethernet (ENC28J60) support  --->
│ │          MAC address: "00:11:22:33:44:55"          // MAC ändern mit "Randomize MAC address"
│ │             Randomize MAC address                               
│ │      [*] UDP support
│ │      [*] UDP broadcast support
│ │      [*] BOOTP (DHCP-like) support
│ │   Applications  --->
│ │      [*] TFTP support


Wichtig! Die MAC-Adresse muss gesetzt sein. Die selbe MAC-Adresse muss in der Firmware später auch benutzt werden.

Hier ist eine Konfigurationsdatei für das Pollin AVR-NET-IO mit Addon (MAC: AC:DE:48:CE:23:C8 ):

Damit man nun nicht jedes mal die MAC-Adresse neu einkompilieren muss, kann man sie auch händisch mit einem Texteditor in ethersex.hex ändern.

:10E000003EC0000066C0000064C0000062C00000A6
:10E0100060C000005EC000005CC000005AC000008C
:10E0200058C0000056C0000054C0000052C000009C
:10E0300050C0000014C100004CC000004AC00000E5
:10E0400048C0000046C0000044C0000042C00000BC
:10E0500040C000003EC000003CC000003AC00000CC
:10E0600038C0000036C0000034C0000032C00000DC
:10E07000"ACDE48CE23C8"006F63746574000014BE24
:10E0800088E10FB6F89480936000109260000FBE94
:10E0900010926E0010926F001092700011241FBE3B
:10E0A000CFEFD0E1DEBFCDBF11E0A0E0B1E0E8EE00

Flashen des Bootloaders

Nach der Konfiguration mit menuconfig den Bootloader mit make clean und make compilieren und mit einem Programmieradapter die Datei ethersex.hex flashen. Wenn eine alte Vorlage benutzt wird, muss ggf. die MAC-Adresse noch einmal geändert werden.

Damit der Bootloader nicht durch die Firmware überschrieben wird, müssen die Lock-Bits folgendermaßen gesetzt sein:

Für ATmega644:

avrdude -p m644 -c ponyser -P /dev/ttyS0 -U lock:w:0x0F:m

oder in Ponyprog:

  • (x) BootLock02
  • (x) BootLock01
  • (x) Lock2
  • (x) Lock1

Achtung! Sollte der Bootloader neu geflasht werden, so müssen die Lock-Bits nach dem flashen immer wieder neu gesetzt werden.

Wer keine Lust hat den Ethernet-Bootloader zu kompilieren, kann hier für das AVR-NET-IO mit Addon die Datei ethersex.hex verwenden.

BOOTP-Server konfigurieren (Windows)

Als BOOTP-Server verwende ich unter Windows hahneWin DHCP Server. Als Beispielkonfiguration ist bei mir folgendes eingestellt:

  • Kein DHCP sondern nur BOOTP aktiviert (zur Problemvermeidung bei bestehendem DHCP-Server)
  • 192.168.0.0 Netzwerk für BOOTP
  • 192.168.0.1 Rechner mit hahneWin DHCP Server und TFTP auf Port 69
  • statische Adressvergabe über MAC-Adressen fest zugewiesen
  • 192.168.0.88 AVR-NET-IO mit MAC AC:DE:48:CE:23:C8
  • 255.255.255.0 Netmask
  • 192.168.0.251 Gateway
  • 192.168.0.251 DNS-Server
  • hahneWin DHCP Server

Alle weiteren Einstellungen zum hahneWin DHCP Server können den nachfolgenden Links entnommen werden:

Grundsätzlich werden als erstes unter Optionen->Einstellungen die Grundeinstellungen vorgenommen.

  • Einstellungen Allgemein
  • Einstellungen Schnittstellen
  • Einstellungen DHCP
  • Einstellungen TFTP
  • Einstellungen TFTP Optionen

Im zweiten Schritt werden unter Optionen->Konfigurationsprofile verwalten das betreffende Netzwerk ausgewählt und mit Bearbeiten angepaßt. Im meinem Beispiel wurde der Profilname durch Ethersex ersetzt. Vorher stand dort If-2_0.1.

  • Konfigurationsprofile
  • Basiskonfiguration
  • DNS
  • Boot

Als letztes wird dann noch ein neuer statischer Eintrag über den Schaltknopf Hinzufügen für den µC erstellt.

  • Statische Einträge

Alle nicht aufgeführten Seiten enthalten die Standardeinstellungen und müssen nicht weiter modifiziert werden. So, nun sollte der BOOTP-Server laufen. Den Server kann man unter Datei->Server starten/beenden in den jeweiligen Zustand setzen.

Hahne BOOTP-Server verwenden

Wird jetzt der µC gebootet, so bezieht er seine Netzwerkeinstellungen vom BOOTP-Server, läd danach die Firmware und startet diese. Im Logfile des BOOTP-Server können die Aktivitäten verfolgt werden. Sobald dem µC eine IP-Adresse vergeben wurde erscheint ein grünes Häkchen vor der MAC-Adresse in der Hauptansicht.

Folgende Bedingungen müssen beachtet werden:

  • hat der µC noch keine Firmware geladen, so wird diese per TFTP im BOOTP-Prozess geladen und geflasht
  • ist schon eine Firmware im µC geflasht, so werden nur die Netzwerkparameter nach einem Reboot oder Power on/off geladen und die vorhandene Firmware gestartet
  • um die Firmware erleut zu laden, muss mit dem ECMD Kommando wdreset oder bootloader der µC "resettet" werden

BOOTP-Server konfigurieren (Linux)

Als BOOTP-Server verwende ich unter Linux dhcpd3. Als Beispielkonfiguration ist bei mir folgendes eingestellt:

  • Kein DHCP sondern nur BOOTP aktiviert (zur Problemvermeidung bei bestehendem DHCP-Server)
  • 192.168.30.0 Netzwerk für BOOTP
  • 192.168.30.134 Rechner mit DHCPD3 Server und TFTP auf Port 69
  • statische Adressvergabe über MAC-Adressen fest zugewiesen
  • 192.168.30.10 AVR-NET-IO mit MAC AC:DE:48:CE:23:C8
  • 255.255.255.0 Netmask
  • 192.168.30.1 Gateway
  • 192.168.30.1 DNS-Server

Die folgende Konfiguration verfügt nicht über eine dynamische IP-Range. Dies bedeutet, dass diese Konfiguration nicht mit einem bereits vorhanden DHCP Server ins Gehege kommt. Dem ethersex wird zum Starten eine feste IP zugewiesen. Der Ablauf:

  1. DHCP Server und TFTP Server müssen gestartet sein
  2. Dann das AVR Net-IO in die Steckdose
  3. Ethersex fragt mit seiner Netzwerkadresse ac:de:48:ce:23:c8 per bootp nach einer IP-Adresse
  4. Der DHCP Server schaut in seiner Liste nach ac:de:48:ce:23:c8, findet diese und die IP 192.168.30.10 zusammen mit der TFTP Server IP 192.168.30.134 und dem Dateinamen ethersex.bin zurück an Ethersex
  5. Ethersex kann nun eine IP Verbindung zum TFTP Server 192.168.30.134 aufbauen und lädt die Datei ethersex.bin
  6. Anschlißend startet Ethersex mit der ethersex.bin

DHCP-Server konfigurieren

sudo apt-get install dhcp3-server

Anschließend muss die Konfigurationsdatei /etc/dhcp3/dhcpd.conf, wie folgt bearbeitet werden. Die IP Adressen musst Du an Deine Gegebenheiten anpassen.

default-lease-time 86400;
max-lease-time 2592000;
authoritative;

subnet 192.168.30.0 netmask 255.255.255.0 {
        option subnet-mask 255.255.255.0; # subnet maske
        option routers 192.168.30.1; # Gateway
        option domain-name-servers 192.168.30.1; # DNS Server
        ddns-update-style none; # Neue Clients werden dem DNS Server nicht mitgeteilt

        next-server 192.168.30.134; # TFTP Server

        host netio {
                hardware ethernet ac:de:48:ce:23:c8; # mac adresse des pollin net io
                fixed-address 192.168.30.10; # Eine freie IP-Adresse im lokalen Netz
                filename "ethersex.bin"; # bootfile (Achtung das ethersex.bin file nehmen!)
        }
}

Anschließend kann der DHCP Server gestartet/neu gestartet werden:

sudo /etc/init.d/dhcp3-server restart

TFTP Server konfigurieren

Die Konfiguration des TFTP Servers ist ziemlich einfach. Dieser muss nur installiert und gestartet werden:

sudo apt-get install tftpd-hpa

Die vom Makefile generierte ethersex.bin Datei muss dann nur noch nach /var/lib/tftpboot kopiert werden.

Den TFTP Server startetn/neu starten

sudo /etc/init.d/tftpd-hpa restart

Bekannte Probleme

Ist im µC bereits eine Firmware geflasht, so sollten durch den BOOTP-Mechanismus die Netzwerkparameter wie IP, Gateway, DNS und Gateway bezogen werden. Laut Logfile vom haneWin DHCP Server erfolgt dies auch. Danach sollte dann die Firmware mit genau diesen Netzwerkparametern gestartet werden. Dies geschiet aber nicht, da vermutlich die Netzwerkparameter nicht an die Firmware weitergereicht werden. Es werden die alten Netzwerkparameter geladen trotz der Einstellung in menuconfig, dass BOOTP verwendet werden soll.

Man erkennt mit dem Kommando arp -a in der Windows-Konsole, dass nach dem Booten die neuen Netzwerkparameter mit der IP vom BOOTP-Server vergeben wurden. Im zweiten Schritt, wenn der µC die Firmware läd, jedoch die alte letzte IP-Adresse benutzt.

Daher muss man mit arp -d die ARP-Tabelle löschen und sich unter der alten IP in den µC mit telnet (siehe ECMD_Protocols_(Deutsch)) einloggen und mit den Befehlen ip, netmask, gw, dns server manuell auf die neuen Werte setzen. Alternativ kann man den µC zwingen die neue Firmware zu laden, die dann aber intern die gleichen Netzwerkparameter wie der BOOTP-Server haben muss.

Schade eigentlich, so hätte man sehr elegant mit dem BOOTP-Server die Netzwerkparameter zur Bootzeit vergeben können. Ich habe gerade noch einmal in den Quellen nachgesehen, dort werden die Netzwerkparameter von BOOTP nur im EEPROM des µC gespeichert, wenn Write BOOTP data to EEPROM in menuconfig ausgewählt ist. Damit lassen sich die Netzwerkparameter zwischenspeichern und stehen nach dem Start der Firmware als Default zur Verfügung. Per Default wird diese Option nicht geladen. Das Problem sollte sich damit beheben lassen. Das habe ich aber bisher noch nicht getestet. Wenn dem so ist, sollte die Default-Konfiguration des Ethernet Bootloader entsprechend angepasst werden.

Ist die zu ladende Firmware größer als 56kB, so wird die Firmware nicht richtig geflasht, da ab xE000 der Ethernet-Bootloader den Bereich mit gesetzten Secure-Bits blockiert.

Nützliche Links