sysctl 函數

sysctl 函數
2007-02-12 11:24

sysctl操作

我們對於路由套接口的主要興趣點在於使用sysctl函數檢查路由表和接口清單。

使用該函數檢查路由表清單不需要超級用戶權限。

 

#include<sys/param.h>

#include<sys/sysctl.h>

int  sysctl( int *name, u_int namelen, void *oldp, size_t *oldenp, void *newp, size_t newlen );

返回0:成功   -1:失敗

 

name參數是指定名字的一個整數數組,namelen參數指定了該數組中的元素數目。該數組

中的第一個元素指定本請求定向到內核的哪個子系統。第二個及其後元素依次細化指定該系

統的某個部分。

爲了獲取某個值,oldp參數指向一個供內核存放該值的緩衝區。oldlenp則是一個值-結果參

數:函數被調用時,oldlenp指向的值指定該緩衝區的大小;函數返回時,該值給出內核存

放在該緩衝區中的數據量。如果這個緩衝不夠大,函數就返回ENOMEM錯誤。作爲特例,

Oldp可以是一個空指針,而oldlenp卻是一個非空指針,內核確定這樣的調用應該返回的數據量,並通過oldlenp返回這個大小。

爲了設置某個新值,newp參數指向一個大小爲newlen參數值的緩衝區。如果不準備指定一

個新值,那麼newp應爲一個空指針,newlen因爲0.

sysctlman手冊詳細敘述了該函數可以獲取的各種系統消息,有文件系統,虛擬內存,內

核限制,硬件等各個方面的信息。我們感興趣的是網絡子系統,通過把name數組的第一個

元素設置成CTL_NET來指定。(CTL_XXX常值在<sys/sysctl.h>中定義),第二個元素可以:

 

       AF_INET:  獲取或者設置影響網際協議的變量。下一級爲使用某個IPPROTO_XXX

值指定的具體協議。

       AF_LINK:      獲取或設置鏈路層信息,例如:PPP接口的數目。

       AF_ROUTE:  返回路由表或接口清單的信息。

       AF_UNSPEC:  獲取或設置一些套接口層變量,例如套接口發送或接收緩衝區的最大大

 

name數組的第二個元素爲AF_ROUTE時,第三個元素(協議號)總是爲0,第四個元素

是一個地址族,第五個和第六個指定做什麼,如下表所示:

name[]

返回IPv4路由表

返回IPv4 ARP高速緩存

返回IPv6路由表

返回接口清單

0

1

2

3

4

5

CTL_NET

AF_ROUTE

0

AF_INET

NET_RT_DUMP

0

CTL_NET

AF_ROUTE

0

AF_INET

NET_RT_FLAGS

RTF_LLINFO

CTL_NET

AF_ROUTE

0

AF_INET6

NET_RT_DUMP

0

CTL_NET

AF_ROUTE

0

0

NET_RT_IFLIST

0

 

路由域支持三種操作,由name[4]指定。(NET_RT_xxx常值在<sys/socket.h>中定義),這三種操作返回的信息通過sysctl調用中的oldp指針返回。Oldp指向的緩衝區中含有可變數目的RTM_xxx消息。

 

1           NET_RT_DUMP返回由name[3]指定的地址族的路由表。如果所指定的地址族爲0

那麼返回所有地址族的路由表。

路由表作爲可變數目的RTM_GET消息返回,每個消息後跟最多4個套接口地址結構:

本路由表項目的地址,網關,網絡掩碼和克隆掩碼。相比直接讀寫路由套接口操作,sysctl

操作所有改動僅僅體現在內核通過後者返回一個或者多個RTM_GET消息。

 

2           NET_RT_FLAGS返回由name[3]指定的地址族的路由表,但是僅僅限於那些所帶

標誌(若干個RTF_XXX常值的邏輯或)與由name[5]指定的標誌匹配的路由表項。路由表中所有ARP高速緩存均設置了RTF_LLINFO標誌位。這種操作的信息返回格式和上一

種操作的一致。

 

3           NET_RT_IFLIST返回所有已配置接口的信息。如果name[5]不爲0,它就是某個接口

的索引,於是僅僅返回該接口的信息。已賦予每個接口的所有地址也同時返回。不過如

name[3]不爲0,那麼僅限於返回指定地址族的地址。

每個接口的返回消息包括一個RTM_IFINFO消息和後跟的多個或零個或多個

RTM_NEWADDR消息。其中每個RTM_NEWADDR消息對應已賦予該接口的一個地址。

接在RTM_IFINFO消息頭部之後的是一個數據鏈路層套接口地址結構,接在每個

RTM_NEWADDR消息頭部之後的這是最多三個套接口地址結構:接口地址,網絡掩碼和

if_msghdr{}

ifm_type= RTM_IFINFO

數據鏈路套接口地址結構

Ifa_msghdr{}

Ifam_type =

RTM_NEWADDR

網絡掩碼套接口地址定義

單播套接口地址結構

廣播地址套接口地址結構

廣播地址。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章