mikrocontroller.net

Forum: PC-Programmierung link Status vom ethernet Interface festellen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Marco H. (damarco)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat jemand eine Idee wie man den Link Status vom Ethernet unter Linux 
mit C Festellen kann ?

Gibt es einen ioctl() Aufruf hierzu ? Aus der Shell heraus ist das kein 
Problem...

Ich habe zwar schon ein paar Ansätze gefunden aber keine wirklich 
brauchbaren ...

Autor: devzero (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ioctl weiss ich nicht, aber schau mal hier:
https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-class-net

What:    /sys/class/net/<iface>/operstate

Allerdings glaube ich, dass laengst nicht alle Treiber dies 
implementieren...

Autor: Thomas W. (goaty)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht per system call:

system("ethtool eth0");

alternativ
system("ip link");

: Bearbeitet durch User
Autor: Marco H. (damarco)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
per syscall wäre auch eine Lösung. Das sollte doch jeder Treiber zur 
Verfügung stellen ?? Ist doch einfach die PHY zu fragen ob ein Träger 
vorhanden ist oder nicht.

Ich würde den Zustand gerne Festellen um sofort im Netzwerk nach Geräten 
zu suchen. Es muss nicht einmal ein Signal erzeugt werden, ich kann das 
z.Bsp alle 5 sec etc prüfen. Link up oder down..

ewt. sollte ich mal in den Code von ifconfig schauen :)

/sys/class/net/<iface>/carrier ginge auch aber bei 
/sys/class/net/<iface>/operstate kommt wenigstens "unknown" oder 
"notpresent"

: Bearbeitet durch User
Autor: Marco H. (damarco)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht sogar noch besser ;)

/sys/class/net/<iface>/carrier_changes man teste dies und ließt dann die 
daten neu aus :)

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco H. schrieb:
> Ich würde den Zustand gerne Festellen um sofort im Netzwerk nach Geräten
> zu suchen.

Bei debian-basierten Distros sollte es reichen, das Skript, das das tut 
in /etc/network/if-up.d zu legen. Der Name des Netzwerk-Interfaces steht 
dann in der Umgebungsvariable $IFACE.

Auf 
https://stackoverflow.com/questions/26672414/inotify-add-watch-fails-on-sys-class-net-eth0-operstate#26674239 
findet man ein Beispielprogramm in C, das die Erkennung über netlink 
macht.
Ist allerdings ein kleiner Fehler drin:
oid read_msg(int fd)

hier muss natürlich ein v vor das oid.

Autor: Marco H. (damarco)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke damit habe ich mich schon beschäftigt. So wirklich gut ist die 
sache nicht Dokumentiert :(. Aber ich habe eine Anleitung gefunden die 
den Sachverhalt besser erklärt.

http://olegkutkov.me/2018/02/14/monitoring-linux-networking-state-using-netlink/

oder https://www.infradead.org/~tgr/libnl/doc/core.html#_introduction

Ich habe das Problem erst mal so gelöst indem ich das SYS Filesystem 
auslese.

Gehört zwar weniger hier her, aber der Erfolg ist auch abhängig vom 
Driver. Auf einen RPI4 ließ sich das Network Interface nicht mal in den 
RAW Mode versetzen. Es ignorierte einfach den Mode.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.