Linux LAPB 模組介面¶
版本 1.3
Jonathan Naylor 29.12.96
已更改 (Henner Eisen, 2000-10-29): data_indication() 的 int 返回值
LAPB 模組將是一個單獨編譯的模組,供 Linux 作業系統中需要 LAPB 服務的任何部分使用。 本文件定義了此模組的介面以及提供的服務。 此上下文中的術語“模組”並不意味著 LAPB 模組是一個可單獨載入的模組,儘管它可能是。 術語“模組”在其更標準含義中使用。
LAPB 模組的介面包括到該模組的函式、來自該模組的回撥(用於指示重要的狀態更改)以及用於獲取和設定有關該模組的資訊的結構。
結構¶
可能最重要的結構是用於儲存接收和傳輸資料的 skbuff 結構,但這超出了本文件的範圍。
兩個 LAPB 特定的結構是 LAPB 初始化結構和 LAPB 引數結構。 這些將在標準標頭檔案 <linux/lapb.h> 中定義。 標頭檔案 <net/lapb.h> 是 LAPB 模組的內部檔案,不供使用。
LAPB 初始化結構¶
此結構僅在呼叫 lapb_register 時使用一次(見下文)。 它包含有關需要 LAPB 模組服務的裝置驅動程式的資訊
struct lapb_register_struct {
void (*connect_confirmation)(int token, int reason);
void (*connect_indication)(int token, int reason);
void (*disconnect_confirmation)(int token, int reason);
void (*disconnect_indication)(int token, int reason);
int (*data_indication)(int token, struct sk_buff *skb);
void (*data_transmit)(int token, struct sk_buff *skb);
};
此結構的每個成員都對應於裝置驅動程式中的一個函式,該函式在 LAPB 模組中發生特定事件時呼叫。 這些將在下面詳細描述。 如果不需要回調 (!!),則可以替換為 NULL。
LAPB 引數結構¶
此結構與 lapb_getparms 和 lapb_setparms 函式一起使用(見下文)。 它們用於允許裝置驅動程式獲取和設定給定連線的 LAPB 實現的操作引數
struct lapb_parms_struct {
unsigned int t1;
unsigned int t1timer;
unsigned int t2;
unsigned int t2timer;
unsigned int n2;
unsigned int n2count;
unsigned int window;
unsigned int state;
unsigned int mode;
};
T1 和 T2 是協議定時引數,單位為 100 毫秒。 N2 是宣告鏈路失敗之前鏈路上的最大嘗試次數。 視窗大小是允許遠端端未確認的最大未完成資料包數量,對於標準 LAPB 鏈路,視窗的值在 1 到 7 之間,對於擴充套件 LAPB 鏈路,視窗的值在 1 到 127 之間。
mode 變數是一個位域,用於設定(目前)三個值。 位域具有以下含義
位 |
含義 |
|---|---|
0 |
LAPB 操作 (0=LAPB_STANDARD 1=LAPB_EXTENDED)。 |
1 |
[SM]LP 操作 (0=LAPB_SLP 1=LAPB=MLP)。 |
2 |
DTE/DCE 操作 (0=LAPB_DTE 1=LAPB_DCE) |
3-31 |
保留,必須為 0。 |
擴充套件 LAPB 操作表示使用擴充套件序列號,因此視窗大小更大,預設值為標準 LAPB 操作。 MLP 操作與 SLP 操作相同,只是 LAPB 使用的地址不同,以指示操作模式,預設值為單鏈路規程。 DCE 和 DTE 操作之間的區別在於 (i) 用於命令和響應的地址,以及 (ii) 當 DCE 未連線時,它每 T1 傳送 DM 而不設定輪詢。 大寫常量名稱將在公共 LAPB 標頭檔案中定義。
函式¶
LAPB 模組提供了許多函式入口點。
int lapb_register(void *token, struct lapb_register_struct);
必須先呼叫此函式,然後才能使用 LAPB 模組。 如果呼叫成功,則返回 LAPB_OK。 令牌必須是裝置驅動程式生成的唯一識別符號,以便唯一標識 LAPB 鏈路的例項。 它由 LAPB 模組在所有回撥中返回,並由裝置驅動程式在對 LAPB 模組的所有呼叫中使用。 對於單個裝置驅動程式中的多個 LAPB 鏈路,必須多次呼叫 lapb_register。 上面給出了 lapb_register_struct 的格式。 返回值是
LAPB_OK |
LAPB 註冊成功。 |
LAPB_BADTOKEN |
令牌已註冊。 |
LAPB_NOMEM |
記憶體不足 |
int lapb_unregister(void *token);
這會釋放與 LAPB 鏈路關聯的所有資源。 任何當前的 LAPB 鏈路都將被放棄,而不會傳遞進一步的訊息。 在此呼叫之後,令牌的值對於對 LAPB 函式的任何呼叫都不再有效。 有效的返回值是
LAPB_OK |
LAPB 登出成功。 |
LAPB_BADTOKEN |
無效/未知的 LAPB 令牌。 |
int lapb_getparms(void *token, struct lapb_parms_struct *parms);
這允許裝置驅動程式獲取當前 LAPB 變數的值,上面描述了 lapb_parms_struct。 有效的返回值是
LAPB_OK |
LAPB getparms 成功。 |
LAPB_BADTOKEN |
無效/未知的 LAPB 令牌。 |
int lapb_setparms(void *token, struct lapb_parms_struct *parms);
這允許裝置驅動程式設定當前 LAPB 變數的值,上面描述了 lapb_parms_struct。 t1timer、t2timer 和 n2count 的值將被忽略,同樣,連線時更改模式位也將被忽略。 錯誤意味著沒有更改任何值。 有效的返回值是
LAPB_OK |
LAPB getparms 成功。 |
LAPB_BADTOKEN |
無效/未知的 LAPB 令牌。 |
LAPB_INVALUE |
其中一個值超出其允許範圍。 |
int lapb_connect_request(void *token);
使用當前引數設定啟動連線。 有效的返回值是
LAPB_OK |
LAPB 正在開始連線。 |
LAPB_BADTOKEN |
無效/未知的 LAPB 令牌。 |
LAPB_CONNECTED |
LAPB 模組已連線。 |
int lapb_disconnect_request(void *token);
啟動斷開連線。 有效的返回值是
LAPB_OK |
LAPB 正在開始斷開連線。 |
LAPB_BADTOKEN |
無效/未知的 LAPB 令牌。 |
LAPB_NOTCONNECTED |
LAPB 模組未連線。 |
int lapb_data_request(void *token, struct sk_buff *skb);
將資料與 LAPB 模組排隊,以便透過鏈路傳輸。 如果呼叫成功,則 skbuff 由 LAPB 模組擁有,裝置驅動程式不得再次使用它。 有效的返回值是
LAPB_OK |
LAPB 已接受資料。 |
LAPB_BADTOKEN |
無效/未知的 LAPB 令牌。 |
LAPB_NOTCONNECTED |
LAPB 模組未連線。 |
int lapb_data_received(void *token, struct sk_buff *skb);
將已從裝置接收的資料與 LAPB 模組排隊。 期望傳遞給 LAPB 模組的資料的 skb->data 指向 LAPB 資料的開頭。 如果呼叫成功,則 skbuff 由 LAPB 模組擁有,裝置驅動程式不得再次使用它。 有效的返回值是
LAPB_OK |
LAPB 已接受資料。 |
LAPB_BADTOKEN |
無效/未知的 LAPB 令牌。 |
回撥¶
這些回撥是裝置驅動程式提供的函式,供 LAPB 模組在發生事件時呼叫。 它們使用 lapb_register(見上文)在結構 lapb_register_struct(見上文)中向 LAPB 模組註冊。
void (*connect_confirmation)(void *token, int reason);
這是在呼叫 lapb_connect_request(見上文)請求連線後,LAPB 模組建立連線時呼叫的。 原因始終是 LAPB_OK。
void (*connect_indication)(void *token, int reason);
這是由遠端系統建立鏈路時由 LAPB 模組呼叫的。 reason 的值始終為 LAPB_OK。
void (*disconnect_confirmation)(void *token, int reason);
這是在裝置驅動程式呼叫 lapb_disconnect_request(見上文)後發生事件時由 LAPB 模組呼叫的。 reason 指示發生了什麼。 在所有情況下,LAPB 鏈路都可以被視為已終止。 reason 的值是
LAPB_OK |
LAPB 鏈路已正常終止。 |
LAPB_NOTCONNECTED |
遠端系統未連線。 |
LAPB_TIMEDOUT |
在 N2 次嘗試中未收到來自遠端系統的響應。 |
void (*disconnect_indication)(void *token, int reason);
這是由遠端系統終止鏈路或發生另一個事件終止鏈路時由 LAPB 模組呼叫的。 如果遠端系統拒絕了請求,則可以返回此響應以響應 lapb_connect_request(見上文)。 reason 的值是
LAPB_OK |
LAPB 鏈路已由遠端系統正常終止。 |
LAPB_REFUSED |
遠端系統拒絕了連線請求。 |
LAPB_NOTCONNECTED |
遠端系統未連線。 |
LAPB_TIMEDOUT |
在 N2 次嘗試中未收到來自遠端系統的響應。 |
int (*data_indication)(void *token, struct sk_buff *skb);
這是在從遠端系統接收到應傳遞到協議棧中下一層的資料時由 LAPB 模組呼叫的。 skbuff 成為裝置驅動程式的屬性,LAPB 模組將不再對其執行任何操作。 skb->data 指標將指向 LAPB 標頭後的第一個資料位元組。
如果且僅當幀在可以傳遞到上層之前被丟棄,則此方法應返回 NET_RX_DROP(如標頭檔案 include/linux/netdevice.h 中定義的那樣)。
void (*data_transmit)(void *token, struct sk_buff *skb);
這是在裝置驅動程式要將資料傳輸到遠端系統時由 LAPB 模組呼叫的。 skbuff 成為裝置驅動程式的屬性,LAPB 模組將不再對其執行任何操作。 skb->data 指標將指向 LAPB 標頭的第一個位元組。