typedef struct _ST_PPPNEGORESULT_ {struct {UINT unMagicNum; //* 幻数(魔术字)USHORT usMRU;//* 最大接收单元,缺省值由PPP_MRU宏指定,一般为1500字节UINT unACCM;//* ACCM,异步控制字符映射,指定哪些字符需要转义,如果不确定,建议采用ACCM_INIT宏指定的缺省值struct { //* 保存认证信息的结构体USHORT usType;//* 指定认证类型:chap或pap,缺省chap认证UCHAR ubaData[16]; //* 认证报文携带的数据,不同的协议携带的数据类型不同,一般情况下采用协议栈的缺省值即可} stAuth;BOOL blIsProtoComp;//* 是否采用协议域压缩(本地设置项,代表协议栈一侧,协商结果不影响该字段)BOOL blIsAddrCtlComp;//* 是否采用地址及控制域压缩(本地设置项,代表协议栈一侧,协商结果不影响该字段)BOOL blIsNegoValOfProtoComp;//* 协议域是否压缩的协商结果值(远端设置项,代表对端是否支持该配置,协商结果影响该字段)BOOL blIsNegoValOfAddrCtlComp; //* 地址及控制域是否压缩的协商结果值(远端设置项,同上)} stLCP;//* 存储ppp链路的初始及协商成功后的地址信息struct {UINT unAddr;//* ip地址,初始值由协议栈提供的IP_ADDR_INIT宏指定,不要擅自修改UINT unPrimaryDNS;//* 主dns服务器地址,初始值由协议栈提供的DNS_ADDR_INIT宏指定,不要擅自修改UINT unSecondaryDNS;//* 次dns服务器地址,初始值由协议栈提供的DNS_ADDR_INIT宏指定,不要擅自修改UINT unPointToPointAddr; //* 点对点地址,初始值由协议栈提供的IP_ADDR_INIT宏指定,不要擅自修改UINT unSubnetMask;//* 子网掩码} stIPCP;UCHAR ubIdentifier;//* 标识域,从0开始自增,唯一的标识一个ppp报文,用于确定应答报文UINT unLastRcvedSecs; //* 最近一次收到对端报文时的秒数,其用于ppp链路故障探测,无需关心,协议栈底层使用} ST_PPPNEGORESULT, *PST_PPPNEGORESULT;
基本上,要调整的地方几乎没有,我们直接采用缺省值即可 。
移植工作的最后一步就是把ppp网卡的主处理线程thread_ppp_handler()添加到os适配层的工作线程列表中 。也就是前面讲解os适配层移植工作时提到的lr_stcbaPStackThread数组 。这个数组保存了协议栈内部工作线程列表,我们先前已经添加了one-shot定时器工作线程thread_one_shot_timer_count() 。我们再把ppp主处理线程添加到这个数组中即可 。伪代码实现如下:
//* 协议栈内部工作线程列表const static STCB_PSTACKTHREAD lr_stcbaPStackThread[] = { { thread_one_shot_timer_count, NULL},#if SUPPORT_PPP //* 在此按照顺序建立ppp工作线程,入口函数为thread_ppp_handler(),线程入口参数为os_open_tty()返回的tty句柄值 //* 其直接强行进行数据类型转换即可,即作为线程入口参数时直接以如下形式传递: //* (void *)句柄值 //* 不要传递参数地址,即(void *)&句柄,这种方式是错误的#endif};
ppp主处理线程将在协议栈加载时由os适配层函数os_thread_onpstack_start()启动 。在这里只需把其添加到工作线程列表中即可,剩下的交由协议栈自动处理 。在这里需要特别说明的是主处理线程的入口参数为tty句柄 。其值应直接传递给线程,不能传递句柄地址(参见上面的伪代码注释) 。比如实际移植到目标系统时如果系统只存在一路ppp,os_open_tty()返回的tty句柄值为0,那么添加到工作线程列表中的ppp主处理线程入口参数的值应为“(void *)0” 。不用关心前面的“(void *)”,这段数据类型强制转换代码只是为了避免编译器报错 。ppp链路建立成功后,协议栈会以“ppp+tty句柄”的方式命名该链路,命名时的tty句柄值就是通过这个启动参数获得的,所以这个值一定要配置正确 。对于单路ppp,由于tty句柄值为0,所以ppp链路的名称为“ppp0” 。
至此,ppp网卡相关的移植工作完成 。
经验总结扩展阅读
- 2 onps栈移植说明——编译器及os适配层移植
- 1 onps栈移植说明——onps栈的配置及裁剪
- 亲爱的客栈杨紫乔欣是哪期?
- <一>从指令角度了解函数堆栈调用过程
- stm32h750移植lvgl
- 3 Python全栈工程师之从网页搭建入门到Flask全栈项目实战 - 入门Flask微框架
- 都卷Java,你看看你得学多少技术栈才能工作!
- flutter系列之:flutter中可以建索引的栈布局IndexedStack
- 官栈花胶多久吃一次 官栈即食花胶要加热吗
- 官栈即食花胶是不是真的 官栈即食花胶有激素吗