版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Linux絡(luò)接口卡(NIC)驅(qū)LinuxNICdriver數(shù)據(jù)接口與socket接口體NICdriverNIC數(shù)據(jù)結(jié)構(gòu)sk_buff與structsk_buff{union{structstructsk_buff*next;structsk_buff*prev;ktime_tstamp;structrb_nodestruct structnet_device unsignedintlen;unsignedintu16u16u32priority;Dma__tdma_;Sk_buff_data_ttail;Sk_buff_data_tend;unsignedchar*head;unsignedchar*data;unsignedinttruesize;Atomic_tusers;NextprevSk:socket關(guān)聯(lián)packetTstamp包到達(dá)與擱置的時(shí)間Rbnode:Dev:代表數(shù)據(jù)操作的deviceLen:packet的總數(shù)量Mac_lenmacheader的長度Csum:packet’schecksumPriority代表packetQosHead指向socketbuffer的headEnd:socketbuffer的endStructnet_device就是一個(gè)美麗的錯(cuò)誤,夾雜了協(xié)議與IOStruct當(dāng)ifconfigeth0upNdo_openndo_validate_addr被調(diào)用當(dāng)ifconfigeth0down,Ndo_stop被調(diào)用當(dāng)MTU被改變的時(shí)候,ndo_change_mtu被調(diào)用當(dāng)mac被改變的時(shí)候,ndo_set_mac_addressNetif_start_queue開始傳輸,放在ndo_openNetif_stop_queue停止傳輸,放在ndo_stop在ndo_open更新網(wǎng)絡(luò)接口的mac請(qǐng)求資源,IOmemoryDMAchannelMapIRQ調(diào)用net_if_start_queue,讓內(nèi)核知道driver在probe分配一個(gè)networkdevice初始化bus請(qǐng)求與映射資源(IOmemoryDMAchannel填充netdevif_portirq,netdev_ops調(diào)用sha512./certs/signing_key.pem./certs/signing_key.x509#include#include#include<linux/netdevice.h>#include<linux/etherdevice.h>#includeMODULE_DESCRIPTION("Kernelmodulefornic");#define#definestructnic_privunsignedchar*tx_buf;unsignedinttx_len;u32msg_enable;staticstructnet_devicestaticvoiddump(unsignedchar*buffer)unsignedchar*p,sbuf[2*(sizeof(structethhdr)+intp=for(i=0;i<sizeof(structethhdr);i++)p+=sprintf(p,"%02X",}printk("eth%s\n",p=for(i=0;i<sizeof(structiphdr);i++)p+=sprintf(p,"%02X",buffer[sizeof(structethhdr)+}printk("iph%s\n",p=for(i=0;i<4;i++)p+=sprintf(p,"%02X",buffer[sizeof(structethhdr)+sizeof(structiphdr)+i]);}printk("payload%s\n",}staticvoidnic_rx(structnet_device*dev,intlen,unsignedchar{structsk_buffstructnic_priv*priv=netif_info(priv,hw,dev,"%s(#%d),func,LINE,skb=dev_alloc_skb(len+2);if(!skb){netif_err(priv,rx_err,"%s(#%d),rx:lowonmem-packetfunc,LINEreturn;}skb_reserve(skb,2);memcpy(skb_put(skb,len),buf,len);skb->dev=skb->protocol=eth_type_trans(skb,dev);skb->ip_summed=CHECKSUM_UNNECESSARY;dev->stats.rx_packets++;dev->stats.rx_bytes+=len;}staticintnic_open(structnet_device*dev)structnic_priv*priv=netdev_priv(dev);netif_info(priv,ifup,dev,"%s(#%d),priv:%p\n",func,LINE,priv->tx_buf=kmalloc(MAX_ETH_FRAME_SIZE,GFP_KERNEL);if(priv->tx_buf==NULL){netif_info(priv,ifup,dev,"%s(#%d),cannotalloctxfunc,return-ENOMEM;}
LINEreturn0;}staticintnic_stop(structnet_device*dev)structnic_priv*priv=netdev_priv(dev);netif_info(priv,ifdown,dev,"%s(#%d),priv:%p\n",func,LINE,if(priv->tx_buf) }return}staticvoidnic_hw_xmit(structnet_device*dev)structnic_priv*priv=netdev_priv(dev);structiphdr*iph;u32*saddr,*daddr;structin_device*in_dev;structin_ifaddrif(priv->tx_len<sizeof(structethhdr)+sizeof(structiphdr)){netif_info(priv,hw,dev,"%s(#%d),tooshort\n",func,LINEreturn}iph=(structiphdr*)(priv->tx_buf+sizeof(structethhdr));saddr=&iph->saddr;daddr=&iph-netif_info(priv,hw,dev,"%s(#%d),orig,src:%pI4,dst:%pI4,func,LINE,saddr,daddr,priv-in_dev=nic_dev[(dev==nic_dev[0]?1:0)]->ip_ptr;if(in_dev){//if_info=in_dev-for(if_info=in_dev->ifa_list;if_info;if_info=if_info->ifa_next){*saddr=*daddr=if_info->ifa_address;netif_info(priv,hw,dev,"%s(#%d),new,src:%pI4,}
func
LINE,saddr,if(!if_info)dev->stats.tx_droppednetif_info(priv,hw,dev,"%s(#%d),dropreturn}}
func
LINEiph->check=iph->check=ip_fast_csum((unsignedchar*)iph,iph-dev->stats.tx_packetsdev->stats.tx_bytes+=priv-nic_rx(nic_dev[(dev==nic_dev[0]?1:0)],priv->tx_len,}staticnetdev_tx_tnic_start_xmit(structsk_buff*skb,structnet_device*dev){structnic_priv*priv=netif_info(priv,drv,dev,"%s(#%d),orig,src:%pI4,func,LINE,&(ip_hdr(skb)->saddr),priv->tx_len=skb-if(likely(priv->tx_len<MAX_ETH_FRAME_SIZE)){if(priv->tx_len<ETH_ZLEN){memset(priv->tx_buf,0,ETH_ZLEN);priv->tx_len=ETH_ZLEN;}skb_copy_and_csum_dev(skb,priv->tx_buf); }else dev->stats.tx_dropped++;return}return}staticintnic_validate_addr(structnet_device*dev){structnic_priv*priv=netdev_priv(dev);netif_info(priv,drv,dev,"%s(#%d),priv:%p\n",func,LINE,return}staticintnic_change_mtu(structnet_device*dev,intnew_mtu){structnic_priv*priv=netdev_priv(dev);netif_info(priv,drv,dev,"%s(#%d),func,LINE,returneth_change_mtu(dev,}staticintnic_set_mac_addr(structnet_device*dev,void*addr)structnic_priv*priv=netdev_priv(dev);netif_info(priv,drv,dev,"%s(#%d),priv:%p\n",func,LINE,returneth_mac_addr(dev,}staticintnic_header_create(structsk_buff*skb,structunsignedshorttype,constvoid*daddr,constvoid*saddr,unsignedintlen){structnic_priv*priv=structethhdr*eth=(structethhdr*)skb_push(skb,ETH_HLEN);structnet_device*dst_netdev;netif_info(priv,drv,dev,func,LINEdst_netdev=nic_dev[(dev==nic_dev[0]?1:0)];eth->h_proto=htons(type);memcpy(eth->h_source,saddr?saddr:dev->dev_addr,memcpy(eth->h_dest,dst_netdev->dev_addr,dst_netdev-returndev-}staticconststructheader_opsnic_header_ops=.create=staticconststructnet_device_opsnic_netdev_ops=.ndo_open=.ndo_stop=.ndo_validate_addr=.ndo_start_xmit=.ndo_change_mtu=.ndo_set_mac_address=staticstructnet_device*nic_alloc_netdev(void)structnet_device*netdev=alloc_etherdev(sizeof(structif(!netdev)pr_err("%s(#%d):allocdevfailed",returnNULL;}
func
LINEnetdev->netdev_ops=&nic_netdev_ops;netdev->flags|=IFF_NOARP;netdev->features|=NETIF_F_HW_CSUM;netdev->header_ops=&nic_header_ops;return}staticintinitnic_init(void)intret=structnic_privpr_info("%s(#%d):install
func
LINEnic_dev[0]=nic_alloc_netdev();if(!nic_dev[0]){printk("%s(#%d):allocnetdev[0]LINEreturn-
func}nic_dev[1]=nic_alloc_netdev();if(!nic_dev[1]){printk("%s(#%d):allocnetdev[1]LINEgoto
func}ret=register_netdev(nic_dev[0]);if(ret){printk("%s(#%d):regnetdriverfailed.ret:LINE,goto
func}ret=register_netdev(nic_dev[1]);if(ret){printk("%s(#%d):regnetdriverfailed.LINE,goto
func}priv=netdev_pri
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 一的變調(diào)練習(xí)題
- 二零二五年度重型吊車安全責(zé)任及運(yùn)輸合同3篇
- 壓瘡的預(yù)防及護(hù)理課件
- 射箭游戲-數(shù)學(xué)
- 2024年浙江宇翔職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- 2024年濟(jì)源職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- 《科幻小說賞析與寫作》 課件 -第三章 “太空歌劇”的探索與開拓-《2001太空漫游》
- 2024年河南工業(yè)貿(mào)易職業(yè)學(xué)院高職單招職業(yè)技能測驗(yàn)歷年參考題庫(頻考版)含答案解析
- 二零二五年租賃權(quán)轉(zhuǎn)讓及配套設(shè)備協(xié)議范本3篇
- 2024年滄州職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
- 2025年中國AI AGENT(人工智能體)行業(yè)市場動(dòng)態(tài)分析、發(fā)展方向及投資前景分析報(bào)告
- 家居建材行業(yè)綠色材料應(yīng)用及節(jié)能設(shè)計(jì)方
- 農(nóng)副產(chǎn)品安全培訓(xùn)
- 2024年中國玩具工程車市場調(diào)查研究報(bào)告
- 2025-2030年中國電動(dòng)三輪車市場發(fā)展現(xiàn)狀及前景趨勢分析報(bào)告
- TCABEE 063-2024 建筑光儲(chǔ)直柔系統(tǒng)變換器 通 用技術(shù)要求
- 【9化期末】合肥市廬陽區(qū)2023-2024學(xué)年九年級(jí)上學(xué)期期末化學(xué)試題
- 高一下學(xué)期生物人教版必修二:3.4 基因通常是有遺傳效應(yīng)的DNA片段課件
- 下屬企業(yè)考核報(bào)告范文
- 修車補(bǔ)胎合同范例
- 2024年基金應(yīng)知應(yīng)會(huì)考試試題
評(píng)論
0/150
提交評(píng)論