免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

3 onps棧移植說明——添加網(wǎng)卡

4. 添加網(wǎng)卡移植的最后一步就是編寫網(wǎng)卡驅(qū)動然后將網(wǎng)卡添加到協(xié)議棧 。網(wǎng)卡驅(qū)動其本質(zhì)上完成的是數(shù)據(jù)鏈路層的工作,在整個通訊鏈路上處于通訊樞紐位置,通訊報文的發(fā)送和接收均由其實際完成 。針對網(wǎng)卡部分的移植工作共三步:
1)編寫網(wǎng)卡驅(qū)動;
2)注冊網(wǎng)卡到協(xié)議棧;
3)對接網(wǎng)卡數(shù)據(jù)收發(fā)接口;
協(xié)議棧目前支持兩種網(wǎng)卡類型:ethernet和ppp 。兩種網(wǎng)卡的移植工作雖然步驟一樣,但具體移植細節(jié)還是有很大區(qū)別的,需要分開單獨進行 。
4.1 ethernet網(wǎng)卡從移植的角度看,ethernet網(wǎng)卡驅(qū)動要提供三個接口函數(shù)并完成與協(xié)議棧的對接:
1)網(wǎng)卡初始化函數(shù),完成網(wǎng)卡初始及啟動工作,并將其添加到協(xié)議棧;
2)網(wǎng)卡發(fā)送函數(shù),發(fā)送上層協(xié)議傳遞的通訊報文到對端;
3)網(wǎng)卡接收函數(shù),接收到達的通訊報文并傳遞給上層協(xié)議;
對于網(wǎng)卡初始化函數(shù),其要做的工作用一句話總結(jié)就是:參照網(wǎng)卡數(shù)據(jù)手冊對其進行配置,然后將其注冊到協(xié)議棧:
#define DHCP_REQ_ADDR_EN 1 //* dhcp請求ip地址使能宏static PST_NETIF l_pstNetifEth = NULL; //* 協(xié)議棧返回的netif結(jié)構(gòu)int ethernet_init(void){/* 進行初始配置,比如引腳配置、使能時鐘、相關(guān)工作參數(shù)配置等工作 *///* 在這里添加能夠完成上述工作的相關(guān)代碼,請參照目標網(wǎng)卡的技術(shù)手冊編寫…………/* 到這里網(wǎng)卡配置工作完成,但還未啟動 *///* 添加網(wǎng)卡到協(xié)議棧,一定要注意啟動以太網(wǎng)卡之前一定要先將其添加到協(xié)議棧EN_ONPSERR enErr;ST_IPV4 stIPv4;#if !DHCP_REQ_ADDR_EN//* 分配一個靜態(tài)地址,請根據(jù)自己的具體網(wǎng)絡(luò)情形設(shè)置地址stIPv4.unAddr = inet_addr_small("192.168.0.4");stIPv4.unSubnetMask = inet_addr_small("255.255.255.0");stIPv4.unGateway = inet_addr_small("192.168.0.1");stIPv4.unPrimaryDNS = inet_addr_small("1.2.4.8");stIPv4.unSecondaryDNS = inet_addr_small("8.8.8.8");stIPv4.unBroadcast = inet_addr_small("192.168.0.255");#else//* 地址清零,為dhcp客戶端申請動態(tài)地址做好準備memset(&stIPv4, 0, sizeof(stIPv4));#endif//* 注冊網(wǎng)卡,也就是將網(wǎng)卡添加到協(xié)議棧l_pstNetifEth = ethernet_add(……);if(!l_pstNetifEth){#if SUPPORT_PRINTFprintf("ethernet_add() failed, %s\r\n", onps_error(enErr));#endifreturn -1;}//* 啟動網(wǎng)卡,開始工作,在這里添加與目標網(wǎng)卡啟動相關(guān)的代碼……#if DHCP_REQ_ADDR_EN//* 啟動一個dhcp客戶端,從dhcp服務(wù)器申請一個動態(tài)地址if(dhcp_req_addr(l_pstNetifEth, &enErr)){#if SUPPORT_PRINTFprintf("dhcp request ip address successfully.\r\n");#endif}else{#if SUPPORT_PRINTFprintf("dhcp request ip address failed, %s\r\n", onps_error(enErr));#endif}#endifreturn 0;}上面給出的樣例代碼中,省略的部分是與目標系統(tǒng)相關(guān)的網(wǎng)卡初始配置代碼,其余則是與協(xié)議棧有關(guān)的網(wǎng)卡注冊代碼 。這部分代碼主要是完成了兩塊工作:一,注冊網(wǎng)卡到協(xié)議棧;二,指定或申請一個靜態(tài)/動態(tài)地址 。注冊網(wǎng)卡的工作是由協(xié)議棧提供的ethernet_add()函數(shù)完成的,其詳細說明如下:
//* 注冊ethernet網(wǎng)卡到協(xié)議棧,只有如此協(xié)議棧才能正常使用該網(wǎng)卡進行數(shù)據(jù)通訊 。//*pszIfName:網(wǎng)卡名稱//*ubaMacAddr:網(wǎng)卡mac地址//*pstIPv4:指向ST_IPV4結(jié)構(gòu)體的指針(include/netif/netif.h),這個結(jié)構(gòu)體保存用戶指定的ip地址、網(wǎng)關(guān)、dns、子網(wǎng)掩碼等配置信息//*//*pfunEmacSend:函數(shù)指針,指向發(fā)送函數(shù),函數(shù)原型為INT(* PFUN_EMAC_SEND)(SHORT sBufListHead, UCHAR *pubErr),這個指針指向的其實//*就是網(wǎng)卡發(fā)送函數(shù)//*//* pfunStartTHEmacRecv:函數(shù)指針,協(xié)議棧使用該函數(shù)啟動網(wǎng)卡接收線程,該線程為協(xié)議棧內(nèi)部工作線程,用戶移植時只需提供啟動該線程的接口函數(shù)即可//*//*ppstNetif:二維指針,協(xié)議棧成功注冊網(wǎng)卡后ethernet_add()函數(shù)會返回一個PST_NETIF指針給調(diào)用者,這個參數(shù)指向這個指針,其最終會被//*協(xié)議棧通過pvParam參數(shù)傳遞給pfunStartTHEmacRecv指向的函數(shù)//*//*penErr:如果注冊失敗,ethernet_add()函數(shù)會返回一個錯誤碼,這個參數(shù)用于接收這個錯誤碼//*//* 注冊成功,返回一個PST_NETIF類型的指針,后續(xù)的報文收發(fā)均用到這個指針;注冊失敗則返回NULL 。具體錯誤信息參見penErr參數(shù)攜帶的錯誤碼 。PST_NETIF ethernet_add(const CHAR *pszIfName, const UCHAR ubaMacAddr[ETH_MAC_ADDR_LEN], PST_IPV4 pstIPv4, PFUN_EMAC_SEND pfunEmacSend,void (*pfunStartTHEmacRecv)(void *pvParam), PST_NETIF *ppstNetif, EN_ONPSERR *penErr);

經(jīng)驗總結(jié)擴展閱讀