Forum: PC-Programmierung link Status vom ethernet Interface festellen


von Marco H. (damarco)


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 ...

von devzero (Gast)


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...

von Thomas W. (goaty)


Lesenswert?

Vielleicht per system call:

system("ethtool eth0");

alternativ
system("ip link");

: Bearbeitet durch User
von Marco H. (damarco)


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
von Marco H. (damarco)


Lesenswert?

geht sogar noch besser ;)

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

von Rolf M. (rmagnus)


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:
1
oid read_msg(int fd)

hier muss natürlich ein v vor das oid.

von Marco H. (damarco)


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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.