如何在 Linux Kernel 下偵測網路的連線狀態?

借用一下參考資料的標題。

今天如果想要在 Linux Kernel 內得知實體網路的 Link Status,只需要去

/sys/class/net/

然後直接去 cat 這兩個 node,以 eth0 來當範例。

這是網路線有插入的狀況:
eth0/carrier:1
eth0/operstate:unknown

這是網路線拔除的狀況:
eth0/carrier:0
eth0/operstate:down

當再次插入時,原本的 carrier 會從 unknown 變成 1:
eth0/operstate:up
eth0/carrier:1

不然直接去 grep eth0/ 底下的東西也可以:
grep "" eth0/* 


很遺憾的是,在 user level 內支援的 inotify,在 kernel level 是不能用的,
所以要借助 socket 的力量,直接在 ethernet driver 內使用 sock_create_kern 來 create socket,
然後透過 connect 與 sock_sendmsg 將要傳的資料填寫在 buf 內就好。(如果要傳 struct 就 &struct)



參考資料:
http://stackoverflow.com/questions/808560/how-to-detect-the-physical-connected-state-of-a-network-cable-connector
http://stackoverflow.com/questions/10340145/get-event-for-nic-ethernet-card-link-status-on-linux










留言

這個網誌中的熱門文章

How to use ebtables: ebtable 的小筆記

解決 VirtualBox 無法開啟 NS_ERROR_FAILURE (0x80004005)