如何在 Linux Kernel 下偵測網路的連線狀態?
借用一下參考資料的標題。
今天如果想要在 Linux Kernel 內得知實體網路的 Link Status,只需要去
然後直接去 cat 這兩個 node,以 eth0 來當範例。
這是網路線有插入的狀況:
這是網路線拔除的狀況:
當再次插入時,原本的 carrier 會從 unknown 變成 1:
不然直接去 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
今天如果想要在 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
留言
張貼留言