LinuxCNC Documentation

SYNOPSIS

loadrt hm2_eth [config="str[,str…​]"] [board_ip=ip[,ip…​] ] [board_mac=mac[,mac…​] ] [firewall=auto|iptables|nft|none]

config [Voreinstellung: ""]

HostMot2-Konfigurationsstrings, beschrieben in der hostmot2(9) Manpage.

board_ip [default: ""]

Die IP-Adresse der Karte(n), getrennt durch Kommata. Im Auslieferungszustand lautet die Adresse der Karte 192.168.1.121.

firewall [default: auto]

Selects the firewall backend used to isolate the dedicated interface. By default hm2_eth installs the rules itself; rtapi_app raises cap_net_admin into its ambient capability set at startup so the calls succeed under both setuid-root and rootless (file-cap) installs. If the cap is not held (or no backend binary is present) the probe fails and rule installation is skipped with a warning; in that case configure the rules manually using the recipe in the NOTES section below. Accepted values:

auto

Use iptables when it is usable, otherwise fall back to nft. This preserves historical behaviour on iptables systems and works out of the box on nftables-only systems that have no iptables binary.

iptables

Force the legacy iptables / ip6tables backend.

nft

Force the nftables backend. Rules live in a dedicated inet table named hm2_eth, so flushing or removing them never touches your other firewall rules.

none

Disable all firewall interaction; manage the firewall externally (firewalld, systemd units, your own ruleset).

BESCHREIBUNG

hm2_eth ist ein Gerätetreiber, der die Ethernet-basierten Anything I/O-Karten von Mesa (mit der HostMot2-Firmware) mit der LinuxCNC-HAL verbindet. Die unterstützten Karten sind: 7I76E, 7I80DB, 7I80HD, 7I92, 7I93, 7I94, 7I95, 7I96, 7I96S, 7I97, 7I98. Er unterstützt auch Karten mit der litehm2-Firmware (https://github.com/sensille/litehm2). Die Firmware der Karte muss mit dem Programm mesaflash(1) auf die Karte geladen werden.

hm2_eth ist nur verfügbar, wenn LinuxCNC mit "uspace" Echtzeit konfiguriert ist.

SCHNITTSTELLENKONFIGURATION

hm2_eth sollte an einer dedizierten Netzwerkschnittstelle verwendet werden, mit nur einem Kabel zwischen dem PC und der Karte. Drahtlose und USB-Netzwerkschnittstellen sind nicht geeignet.

Diese Anleitung geht davon aus, dass Ihre dedizierte Netzwerkschnittstelle "eth1" ist, dass 192.168.1/24 ein unbenutztes privates Netzwerk ist, dass das hostmot2-Board die Standardadresse 192.168.1.121 verwendet, dass Sie Debian 7 oder ein ähnliches Betriebssystem benutzen und dass Sie ansonsten keine iptables verwenden. Wenn einer dieser Punkte nicht zutrifft, müssen Sie die Anweisungen entsprechend ändern. Nachdem Sie alle Anweisungen befolgt haben, starten Sie neu, damit die Änderungen wirksam werden.

Es ist besonders wichtig zu überprüfen, dass das Netzwerk 192.168.1/24 nicht bereits das von Ihrem Internet-Router verwendete private Netzwerk ist, da dies ein häufig verwendeter Wert ist. Wenn Sie ein anderes Netzwerk verwenden, müssen Sie auch die hostmot2-Karte neu konfigurieren, um eine IP-Adresse in diesem Netzwerk zu verwenden, indem Sie das Dienstprogramm mesaflash(1) verwenden und die Jumpereinstellungen ändern. In der Regel wird man eines der Netze aus dem Privaten IPv4-Adressraum wählen. Eine gängige Alternative ist die PC-Adresse 10.10.10.1, die Hostmot2-Adresse 10.10.10.10.

Die Verwendung der dedizierten Ethernet-Schnittstelle, während LinuxCNC läuft, kann zu einer Verletzung der Echtzeit-Garantien führen. hm2_eth wird die meisten zufälligen Ursachen für Störungen automatisch entschärfen.

Netzwerk mit statischer Adresse konfigurieren

Fügen Sie diese Zeilen in die Datei /etc/network/interfaces ein, um die Ethernet Schnittstelle eth1 mit einer statischen Adresse zu konfigurieren:

auto eth1
iface eth1 inet static
    address 192.168.1.1
    hardware-irq-coalesce-rx-usecs 0

PAKETVERLUST

Obwohl Ethernet ziemlich resistent gegen elektrisches Rauschen ist, werden viele Systeme keinen 100% perfekten Paketempfang haben. Der hm2_eth-Treiber hat eine begrenzte Fähigkeit, mit verlorenen Paketen umzugehen. Paketverluste werden erkannt, indem bei jeder Anfrage eine erwartete Anzahl von Lese- oder Schreibpaketen übertragen wird und der Wert bei jeder Leseantwort überprüft wird. Wenn ein verlorenes Paket erkannt wird, dann wird der packet-error-Pin in diesem Zyklus aktiviert, der packet-error-level-Pin wird erhöht, und wenn er einen Schwellenwert erreicht, wird ein permanenter Low-Level-I/O-Fehler signalisiert.

Allerdings wissen nicht alle hm2-Sonderfunktionen, wie sie sich von verlorenen Paketen erholen können. Zum Beispiel verwaltet die Encoder-Spezialfunktion die Indexfunktion nicht richtig, wenn Pakete verloren gehen. Der Autor ist der Meinung, dass dies zu seltenen Fehlern beim Home-to-Index führen kann, die schwerwiegende Folgen haben können.

Andererseits laufen Pid-Stepper-Systeme über längere Zeiträume mit Paketverlusten in der Größenordnung von 0,01 % ordnungsgemäß, solange der Schleppfehler so hoch ist, dass ein veraltetes Positionsfeedback keinen Schleppfehler auslöst. Eine Änderung der HAL-Konfiguration, so dass während eines vorübergehenden Paketverlusts der Pid- und Bewegungsrückführungswert gleich dem Befehlswert ist und nicht der veraltete Rückführungswert, scheint die Abstimmung zu verbessern. Dies kann mit einer mux2(9)-Komponente für jedes Rückmeldesignal erreicht werden, wobei packet-error als mux2 sel-Eingang verwendet wird.

PINS

Zusätzlich zu den in hostmot2(9) dokumentierten Pins werden mit hm2_eth(9) die folgenden weiteren Pins erzeugt:

hm2_<BoardType>.<BoardNum>.packet-error (bit, out)

Dieser Pin ist TRUE, wenn im letzten Zyklus ein Lese- oder Schreibfehler festgestellt wurde, und FALSE zu anderen Zeiten.

hm2_<BoardType>.<BoardNum>.packet-error-level (s32, out)

Dieser Pin zeigt den aktuellen Fehlerpegel an, wobei höhere Zahlen eine größere Anzahl von kürzlich erkannten Fehlern anzeigen. Der Fehlerpegel liegt immer im Bereich von 0 bis einschließlich packet-error-limit.

hm2_<BoardType>.<BoardNum>.packet-error-exceeded (bit, out)

Dieser Pin ist TRUE, wenn der aktuelle Fehlerpegel gleich dem Maximum ist, und FALSE zu anderen Zeiten.

PARAMETER

Zusätzlich zu den in hostmot2(9) dokumentierten Parametern erzeugt hm2_eth(9) die folgenden weitere Parameter:

hm2_<BoardType>.<BoardNum>.packet-error-decrement (s32, rw)

Der Betrag, der von packet-error-level in einem Zyklus ohne erkannte Lese- oder Schreibfehler abgezogen wird, ohne unter Null zu gehen.

hm2_<BoardTyp>.<BoardNum>.packet-error-increment (s32, rw)

Der Betrag, der zu packet-error-level in einem Zyklus ohne erkannte Lese- oder Schreibfehler hinzugefügt wird, ohne dass der packet-error-limit (Paketfehlergrenze) überschritten wird.

hm2_<BoardType>.<BoardNum>.packet-error-limit (s32, rw)

Der Pegel, bei dem ein erkannter Lese- oder Schreibfehler als permanenter Fehler behandelt wird. Wenn diese Fehlerstufe erreicht wird, dann wird der io-error-Pin der Karte TRUE und der Zustand muss manuell zurückgesetzt werden.

hm2_<BoardType>.<BoardNum>.packet-read-timeout (s32, rw)

Die Zeitspanne, die vergehen muss, bevor eine Leseanforderung abbricht. Ist der Wert kleiner oder gleich 0, wird er als 80% der Thread-Periode interpretiert. Ist der Wert kleiner als 100, wird er als Prozentsatz der Thread-Periode interpretiert. Andernfalls wird er als eine Zeit in Nanosekunden interpretiert. In jedem Fall ist der Timeout nie kleiner als 100 Mikrosekunden.

Wird dieser Wert zu niedrig eingestellt, kann es zu Lesefehlern kommen. Ein zu hoher Wert kann zu Echtzeitverzögerungsfehlern führen.

ANMERKUNGEN

hm2_eth installs firewall rules to control the network interface while HAL is running. Two backends are supported and chosen with the firewall parameter (see above): legacy iptables and nftables.

With the iptables backend, hm2_eth uses a chain called "hm2-eth-rules-output". That technology is common to control network access to (INPUT chain), through (FORWARD chain) or from (OUTPUT chain) your computer. The chain is created if it does not exist, and a jump to it is inserted at the beginning of the OUTPUT chain if it is not there already. If you have an existing iptables setup, you can insert a direct jump from OUTPUT to hm2-eth-rules-output in an order appropriate to your local network.

With the nftables backend, hm2_eth uses a dedicated inet table named "hm2_eth" with an output-hook chain. Because the table is private, flushing or deleting it never affects your other nftables rules.

At (normal) exit, hm2_eth will remove the rules. After a crash, you can manually clear the iptables rules with sudo iptables -F hm2-eth-rules-output (or, for nftables, with sudo nft delete table inet hm2_eth); the rules are also removed by a reboot.

Manual iptables configuration

When LinuxCNC is installed without cap_net_admin on rtapi_app (typically because sudo make setcap was not run after the build), hm2_eth cannot install its rules and prints a warning. Set up the chain manually as root. Adjust the IP addresses, UDP destination port, and interface name to match your install:

HOST_IP=192.168.1.1
BOARD_IP=192.168.1.121
BOARD_DPORT=27181
IFACE=eth1

iptables -N hm2-eth-rules-output
iptables -I OUTPUT 1 -j hm2-eth-rules-output
iptables -A hm2-eth-rules-output \
    -p udp -m udp -d $BOARD_IP --dport $BOARD_DPORT \
    -s $HOST_IP -j ACCEPT
iptables -A hm2-eth-rules-output -o $IFACE -p icmp -j DROP
iptables -A hm2-eth-rules-output -o $IFACE \
    -j REJECT --reject-with icmp-admin-prohibited
ip6tables -N hm2-eth-rules-output
ip6tables -I OUTPUT 1 -j hm2-eth-rules-output
ip6tables -A hm2-eth-rules-output -o $IFACE -j DROP

For full IPv6 quiescence (no router solicitations or neighbor discovery on the dedicated interface), additionally add this line to /etc/sysctl.d/99-hm2-eth.conf and reboot:

net.ipv6.conf.IFACE.disable_ipv6 = 1

(The default ip6tables rule above only drops outbound IPv6; the kernel still generates the packets.) Tear down the runtime rules with:

iptables -F hm2-eth-rules-output
iptables -D OUTPUT -j hm2-eth-rules-output
iptables -X hm2-eth-rules-output
ip6tables -F hm2-eth-rules-output
ip6tables -D OUTPUT -j hm2-eth-rules-output
ip6tables -X hm2-eth-rules-output

Manual nftables configuration

On nftables-only systems (no iptables binary), set the rules up as root with nft. The inet family covers IPv4 and IPv6 in one chain. Adjust the addresses, UDP destination port, and interface name:

HOST_IP=192.168.1.1
BOARD_IP=192.168.1.121
BOARD_DPORT=27181
IFACE=eth1

nft add table inet hm2_eth
nft add chain inet hm2_eth output \
    '{ type filter hook output priority 0; policy accept; }'
nft add rule inet hm2_eth output \
    ip saddr $HOST_IP ip daddr $BOARD_IP udp dport $BOARD_DPORT accept
nft add rule inet hm2_eth output oifname $IFACE ip protocol icmp drop
nft add rule inet hm2_eth output oifname $IFACE \
    reject with icmp type admin-prohibited
nft add rule inet hm2_eth output oifname $IFACE ip6 version 6 drop

Tear the rules down by deleting the whole private table:

nft delete table inet hm2_eth

"hardware-irq-coalesce-rx-usecs" verringert auf den meisten Systemen die Wartezeit auf den Empfang eines Pakets, aber zumindest auf einigen Marvel-Chipsatz-NICs ist es schädlich. Wenn die Zeile die Systemleistung nicht verbessert, sollten Sie sie entfernen. Es ist ein Neustart erforderlich, damit der Wert wieder auf den Standardwert beim Einschalten zurückgesetzt wird. Dazu muss das Paket ethtool installiert sein.

BUGS

Einige hostmot2-Funktionen wie z.B. uart sind so kodiert, dass sie bei Verwendung von hm2_eth zusätzliche Latenzzeiten verursachen.

Auf dem 7i92 heißen die HAL-Pins für die LEDs CR01..CR04, aber die Silkscreens sind CR3..CR6. Je nach FPGA-Firmware können die LEDs anfänglich unter der Kontrolle der Ethernet-Engine stehen. Dies kann bis zum Einschalten des Geräts geändert werden mit

elbpcom 01D914000000

Je nach Firmware-Version kann dieser Treiber dazu führen, dass die Hardware-Fehler-LED aufleuchtet, obwohl der Treiber und die Hardware normal funktionieren. Berichten zufolge wird dies in zukünftigen Bitfile-Updates von Mesa behoben werden.

SIEHE AUCH

hostmot2(9), elbpcom(1)

LIZENZ

GPL