3 onps棧移植說明——添加網卡( 四 )

參照上述偽代碼 , 依據目標系統具體情況編寫相應功能代碼即可 。注意,上述代碼能夠正常工作的關鍵是目標系統的串口驅動必須能夠正常工作且健壯、可靠 。因為tty層封裝的其實就是操作ppp撥號終端的串口驅動代碼,tty只是做了一層簡單封裝罷了 。os_adapter.c文件中關于ppp部分還有如下幾項定義需要根據你的實際目標環境進行配置:
#if SUPPORT_PPP//* 連接ppp撥號終端的串口名稱,有幾個模塊 , 就指定幾個,其存儲的單元索引應等于os_open_tty()返回的對應串口的tty句柄值const CHAR *or_pszaTTY[PPP_NETLINK_NUM] = { …… /* 如"串口1", "串口2"等 */ }; //* 指定ppp撥號的apn、用戶和密碼 , 系統支持幾路ppp , 就需要指定幾組撥號信息//* ST_DIAL_AUTH_INFO結構體保存這幾個信息,該結構體的詳細內容參見協議棧源碼ppp/ppp.h文件//* 這里設置的apn等撥號認證信息會替代前面說過的APN_DEFAULT、AUTH_USER_DEFAULT、AUTH_PASSWORD_DEFAULT等缺省設置const ST_DIAL_AUTH_INFO or_staDialAuth[PPP_NETLINK_NUM] = {{ "4gnet", "card", "any_char" },//* 注意ppp賬戶和密碼盡量控制在20個字節以內,太長需要需要修改chap.c//* 中send_response()函數的szData數組容量及pap.c中pap_send_auth_request()函數的//* ubaPacket數組的容量,確保其能夠封裝一個完整的響應報文/* 系統存在幾路ppp鏈路 , 就在這里添加幾路撥號認證信息 */}; //* ppp鏈路協商的初始協商配置信息,協商成功后這里保存最終的協商結果,ST_PPPNEGORESULT結構體的詳細說明參見下文ST_PPPNEGORESULT o_staNegoResult[PPP_NETLINK_NUM] = {{{ 0, PPP_MRU, ACCM_INIT,{ PPP_CHAP, 0x05 /* CHAP協議,0-4未使用,0x05代表采用MD5算法 */ }, TRUE, TRUE, FALSE, FALSE },{ IP_ADDR_INIT, DNS_ADDR_INIT, DNS_ADDR_INIT, IP_ADDR_INIT, MASK_INIT }, 0},/* 系統存在幾路ppp鏈路,就在這里添加幾路的協商初始值,如果不確定,可以將上面預定義的初始值直接復制過來即可 */};#endif上面給出的代碼做了幾件事情:1)指定tty設備連接的串口名稱;2)指定撥號認證信息:apn、用戶和密碼;3)指定ppp鏈路協商初始值;
總之 , 你的目標系統連接了幾個撥號終端,這幾件事情就要針對特定的終端分別做一遍,單獨指定 。這里需要重點說明的是ppp鏈路協商配置信息 。這些信息由ST_PPPNEGORESULT結構體保存(參見negotiation_storage.h文件):
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主處理線程添加到這個數組中即可 。偽代碼實現如下:

推薦閱讀