Linux LAPB 模块接口¶
版本 1.3
Jonathan Naylor 29.12.96
修改(Henner Eisen,2000-10-29):data_indication() 的 int 返回值
LAPB 模块将是一个单独编译的模块,供任何需要 LAPB 服务的 Linux 操作系统部分使用。本文档定义了此模块的接口以及它提供的服务。此上下文中的“模块”一词并不意味着 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 模块调用的。原因指示发生了什么。在所有情况下,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 标头的第一个字节。