資源描述:
《Linux Tcpip協(xié)議棧筆記》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、LinuxTCP/IP協(xié)議棧筆記(一)網(wǎng)卡驅(qū)動(dòng)和隊(duì)列層中的數(shù)據(jù)包接收tcp/ip2008-05-1612:05:00閱讀1評(píng)論0字號(hào):大中小數(shù)據(jù)包的接收作者:kendohttp://www.skynet.org.cn/viewthread.php?tid=14&extra=page%3D1Kernel:2.6.12一、從網(wǎng)卡說(shuō)起這并非是一個(gè)網(wǎng)卡驅(qū)動(dòng)分析的專門文檔,只是對(duì)網(wǎng)卡處理數(shù)據(jù)包的流程進(jìn)行一個(gè)重點(diǎn)的分析。這里以Intel的e100驅(qū)動(dòng)為例進(jìn)行分析。大多數(shù)網(wǎng)卡都是一個(gè)PCI設(shè)備,PCI設(shè)備都包含了一個(gè)標(biāo)準(zhǔn)的
2、配置寄存器,寄存器中,包含了PCI設(shè)備的廠商ID、設(shè)備ID等等信息,驅(qū)動(dòng)程序使用來(lái)描述這些寄存器的標(biāo)識(shí)符。如下:[Copytoclipboard][-]CODE:structpci_device_id{????__u32vendor,device;????????/*VendoranddeviceIDorPCI_ANY_ID*/????__u32subvendor,subdevice;????/*SubsystemID'sorPCI_ANY_ID*/????__u32class,class_mask;????
3、/*(class,subclass,prog-if)triplet*/????kernel_ulong_tdriver_data;????/*Dataprivatetothedriver*/};這樣,在驅(qū)動(dòng)程序中,常常就可以看到定義一個(gè)structpci_device_id類型的數(shù)組,告訴內(nèi)核支持不同類型的PCI設(shè)備的列表,以e100驅(qū)動(dòng)為例:#defineINTEL_8255X_ETHERNET_DEVICE(device_id,ich){????PCI_VENDOR_ID_INTEL,device_id
4、,PCI_ANY_ID,PCI_ANY_ID,????PCI_CLASS_NETWORK_ETHERNET<<8,0xFFFF00,ich}????staticstructpci_device_ide100_id_table[]={????INTEL_8255X_ETHERNET_DEVICE(0x1029,0),????INTEL_8255X_ETHERNET_DEVICE(0x1030,0),????INTEL_8255X_ETHERNET_DEVICE(0x1031,3),……/*略過(guò)一大堆支持的設(shè)備
5、*/????{0,}};在內(nèi)核中,一個(gè)PCI設(shè)備,使用structpci_driver結(jié)構(gòu)來(lái)描述,structpci_driver{????structlist_headnode;????char*name;????structmodule*owner;????conststructpci_device_id*id_table;????/*mustbenon-NULLforprobetobecalled*/????int??(*probe)??(structpci_dev*dev,conststructpci
6、_device_id*id);????/*Newdeviceinserted*/????void(*remove)(structpci_dev*dev);????/*Deviceremoved(NULLifnotahot-plugcapabledriver)*/????int??(*suspend)(structpci_dev*dev,pm_message_tstate);????/*Devicesuspended*/????int??(*resume)(structpci_dev*dev);????????
7、????????/*Devicewokenup*/????int??(*enable_wake)(structpci_dev*dev,pci_power_tstate,intenable);??/*Enablewakeevent*/????void(*shutdown)(structpci_dev*dev);????structdevice_driver????driver;????structpci_dynidsdynids;};因?yàn)樵谙到y(tǒng)引導(dǎo)的時(shí)候,PCI設(shè)備已經(jīng)被識(shí)別,當(dāng)內(nèi)核發(fā)現(xiàn)一個(gè)已經(jīng)檢測(cè)到的設(shè)備同驅(qū)
8、動(dòng)注冊(cè)的id_table中的信息相匹配時(shí),它就會(huì)觸發(fā)驅(qū)動(dòng)的probe函數(shù),以e100為例:/**定義一個(gè)名為e100_driver的PCI設(shè)備*1、設(shè)備的探測(cè)函數(shù)為e100_probe;*2、設(shè)備的id_table表為e100_id_table*/staticstructpci_drivere100_driver={????.name=??????DRV_NAME,????.id_table=???