从Cfgdemo项目来分析协议栈的启动_第1页
从Cfgdemo项目来分析协议栈的启动_第2页
从Cfgdemo项目来分析协议栈的启动_第3页
从Cfgdemo项目来分析协议栈的启动_第4页
从Cfgdemo项目来分析协议栈的启动_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、从Cfgdemo项目来分析协议栈的启动项目中静态创建的任务有两个:一个是空闲任务,一个是StackTest任务,main函数是空的。任务StackTest的优先级(5)比空闲任务高。整个程序的初始化部分执行完之后,就会执行StackTest任务,从而执行StackTest()函数。StackkTesst()函函数首先先调用了了NC_SysstemmOpeen()函函数,来来完成协协议栈系系统的初初始化工工作。必必须注意意的是:在使用用协议栈栈之前必必须最先先调用该该函数。接接下来调调用函数数CfggNeww()来来创建一一个配置置(Coonfiigurratiion)并并获得该该配置的的句柄,

2、接接下来的的工作就就是在配配置中增增添配置置项(CConffiguurattionn Enntryy),增增添配置置选项是是通过调调用CffgAdddEnntryy()函函数实现现的。该该项目中中首先增增添的配配置项为为Hosst nnamee:从CFGDDEMOO项目来来分析协协议栈的的启动接着增添的的配置项项为Teelneet服务务,那么么协议栈栈系统在在启动之之后会启启动Teelneet服务务(创建建了一个个名为ttelnnetdd的任务务):接着通过过调用eefs_creeateefille()创创建5个个文件,其其名字分分别为:inddex.htmml、ttibuug.ggif、cc

3、fgsstarrt.ccgi、ccfgppasss.cggi ccfgddonee.cggi;这这5个文文件中,前前两个文文件的数数据分别别存放在在数组DDEFAAULTT、TTIBUUG中,而而后三个个文件实实际是ccgi程程序,这这三个ccgi程程序分别别完成来来之客户户端的命命令请求求:Viiew connfigguraatioon、CChannge passswoord、SSubmmit connfigguraatioon,与与之同时时,它们们动态修修改并发发送了两两个网页页并COONFIIG、UUSERRMSGG。接着增增添的配配置项为为HTTTP服务务,那么么协议栈栈启动之之后会启

4、启动Htttp服服务(创创建一个个名为hhttpp seerveer的任任务) 接着着的增添添的配置置项为CCFGIITEMM_OSS_DBBGPRRINTTLEVVEL,来来选择打打印的信信息内容容:接下来调用用函数CCfgSSavee()来来获取配配置的大大小并讲讲配置数数据存入入一个缓缓存中去去,并释释放配置置。 接下来来调用函函数NeetBooot()来来启动协协议栈。这这个函数数是NDDK的用用户自己己写的一一个函数数,在这这个函数数中,调调用了协协议栈启启动函数数NC_NettStaart(),这这个函数数属于NNetwworkk Coontrrol APII,该函函数的源源代码可

5、可以在tiNDKKsrrcnnetcctrllneetcttrl.c中找找到。其其函数接接口如下下:NetBooot()在在调用NNC_NNetSStarrt()之之前调用用CfggNeww()来来创建一一个新的的空的配配置,然然后再调调用CffgLooad()来来把之前前存入缓缓冲区中中的配置置好的配配置数据据载入新新的配置置中去,并并把它作作为参数数传入NNC_NNetSStarrt()中中去,接接着就调调用NCC_NeetSttartt()启启动协议议栈。 NC_NettStaart()函函数首先先调用了了4个硬硬件抽象象层(HHAL)的的四个初初始化函函数,由由它们来来完成底底层硬件件

6、的初始始化(具具体细节节过程等等待进一一步研究究):接着该函数数调用CCfgSSetDDefaaultt()把把传入NNC_NNetSStarrt()函函数中构构建好的的配置设设置为默默认配置置。由于于编程方方法上的的需要,协协议栈就就使用配配置是统统一为一一个配置置句柄指指向的配配置。这这样CffgSeetDeefauult()的的本质就就是把该该配置句句柄指向向传入NNC_NNetSStarrt()函函数中构构建好的的配置。 接着把把传入NNC_NNetSStarrt()函函数的三三个函数数指针赋赋值给三三个全局局变量,以以方便后后面适当当的时候候调用:接着调用协协议栈的的核心AAPI函函

7、数ExxecOOpenn()来来初始化化协议栈栈的exxecuutivve(自自己意会会这个概概念)。 接着动动态创建建一个名名为CoonfiigBooot的的任务,其其优先级级为155(最高高),其其执行的的函数是是NS_BoootTaask()。由由于DSSP/BBIOSS是占先先式实时时OS,所所以一旦旦任务高高优先级级的任务务创建,OOS内核核的调度度模块就就会自动动切换到到高优先先级的任任务执行行。很显显然,接接下来执执行的是是函数NNS_BBoottTassk()。这这个函数数的源码码在ttiNNDKsrccneetcttrl neetsrrv.cc中可以以找到。NS_BoootT

8、Taskk()函函数首先先调用CCfgSSetSServvicee()来来Sett Seerviice CalllBaack Funntioons forr Evveryy Coonfiigurratiion Tagg,其意意思是为为每个CConffiguurattionn Taag设置置一个回回调函数数,其目目的是为为了在修修改完配配置之后后能及时时更新协协议栈系系统,也也就是使使协议栈栈系统随随着配置置的改变变而实时时地改变变。 回调函函数的接接口定义义如下:在NDK的的协议栈栈中,CConffiguurattionn Taag共有有如下88个:其中需要配配置回调调函数的的有如下下几个:C

9、FGGTAGG_OSS、CFFGTAAG_IIP、CCFGTTAG_SERRVICCE、CCFGTTAG_IPNNET、CCFGTTAG_ROUUTE,它它们的回回调函数数分别为为:SPPConnfigg()、SSPCoonfiig()、SSPSeerviice()、SSPIppNett()、SSPRooutee(),这这些回调调函数的的实现源源代码都都在ttiNNDKsrccneetcttrl neetsrrv.cc可以找找到。下面分析以以下SPPConnfigg()函函数是怎怎样实现现实时更更新系统统的:SSPCoonfiig()函函数是作作为CFFGTAAG_OOS、CCFGTTAG_I

10、P的的回调函函数的,所所以它必必须负责责处理增增添CFFGTAAG_OOS、CCFGTTAG_IP两两种类型型的Coonfiigurratiion Enttry时时的系统统实时更更新工作作。系统统在调CCfgAAddEEntrry函数数来增添添一个CCFGTTAG_OS、CCFGTTAG_IP类类型的配配置项后后(注意意:CffgAdddEnntryy只把配配置数据据添加到到配置中中去),会会调用与与该种配配置类型型捆绑的的的回调调函数SSPCoonfiig(CCfgSSetSServvicee函数来来完成捆捆绑工作作的),SSPCoonfiig函数数调用CCfgEEntrryInnfo来来获

11、取该该配置项项的数据据缓冲区区的指针针并存放放在变量量pi中,接接着更具具Connfigguraatioon TTag的的类型来来获取具具体需要要修改的的系统配配置参数数结构体体;CFFGTAAG_OOS OSEENVCCFG _osscfgg、osscfggcoppy / CCFGTTAG_IP IPPCONNFIGG _iipcffg、iipcffgcoopy,这这两个都都是全局局变量,它它们的数数据结构构类型如如下:/ Coonfiigurratiion Strructtureetypeddef strructt _iipcoonfiig uinnt IIcmppDoRRediirecc

12、t; / Upddatee RttTabble on ICMMP rrediirecct (1=YYes) uinnt IIcmppTtll; / TTTL ffor ICMMP mmesssagees RRFC117000 saays 64 uinnt IIcmppTtllEchho;TTL ffor ICMMP eechoo RFFC17700 sayys 664 uinnt IIpInndexx; / IPP Sttartt Inndexx uinnt IIpFoorwaardiing; / IPP Foorwaardiing (1 = EEnabbledd) uinnt IIpNaat

13、Ennablle; / IPP NAAT EEnabble (1 = YYes) uinnt IIpFiilteerEnnablle; / IP Fillterringg Ennablle (1 = Yees) uinnt IIpReeasmmMaxxTimme; / Maxx reeasssembbly timme iin ssecoondssuint IpRReassmMaaxSiize; / Maax rreasssemmblyy paackeet ssizee uinnt IIpDiireccteddBCaast; / Loook ffor dirrectted BCaast IP a

14、dddresssess uinnt TTcpRReassmMaaxPkkt; / Maxx reeasmm pkkts helld bby TTCP socckett uinnt RRtcEEnabbleDDebuug; / Enaablee Rooutee Coontrrol Messsagges (1=On) uinnt RRtcAAdvTTimee; / Tiime in secc too seend RtAAdv (0=donnt)&nbssp; uinnt RRtcAAdvLLifee; / Liitettimee off rooutee inn RttAdvv intt RRtcA

15、AdvPPreff; / Prrefeerennce Levvel (siigneed) in RtAAdv uinnt RRtArrpDoownTTimee; / TTimee 5 faiiledd ARRPs keeep RRt ddownn (ssec) uinnt RRtKeeepaalivveTiime; / VALLIDAATEDD rooutee tiimeoout (seec) uinnt RRtClloneeTimmeouut; / INIITIAAL rroutte ttimeeoutt (ssec) uinnt RRtDeefauultMMTU; / Deefauult

16、MTUU foor iinteernaal rrouttes uinnt SSockkTtllDeffaullt; / Deffaullt PPackket TTLL uinnt SSockkTossDeffaullt; / Deffaullt PPackket TOSS intt SSockkMaxxConnnecct; / MMax Socckett Coonneectiionss uinnt SSockkTimmeCoonneect; / Maxx tiime to connnecct (secc) uinnt SSockkTimmeIoo; / Deefauult Socckett I

17、OO tiimeoout (seec) intt SSockkBuffMaxx; &nnbsp; / AAbsoolutte mmax Socckett buuffeer ssizee intt SSockkBuffMinnTx; / Miin Tx sspacce ffor abble to wriite intt SSockkBuffMinnRx; / Miin RRx ddataa foor ablle tto rreadd uinnt PPipeeTimmeIoo; / Deefauult Pippe IIO ttimeeoutt (ssec) intt PPipeeBuffSizze

18、; / Piipe intternnal buffferr siize intt PPipeeBuffMinnTx;/ Miin TTx sspacce ffor abble to wriite intt PPipeeBuffMinnRx; / Miin RRx ddataa foor ablle tto rreadd IIPCOONFIIG; 大家应应该注意意到所有有的成员员都是332位的的数据类类型,所所以这里里的pii和pDDst指指针都定定义为指指向322位类型型数据的的指针。在在做完必必要性的的检测之之后,就就会把ppi指向向数据缓缓冲中的的数据直直接拷贝贝到pDDst+Iteem指

19、向向的数据据缓冲中中去。两两个细节节性的问问题:1)为什么么只拷一一个322位?因因为这两两种类型型的Coonfiigurratiion的的Connfigguraatioon EEntrry都是是32位位类型的的数据。22)为什什么Ittem要要事先减减一?因因为Taag = CFFGTAAG_OOS / CFFGTAAG_IIP, Iteem的值值都是从从1开始始的。这样系统的的配置就就被修改改了,后后面程序序的执行行就会根根据新的的配置去去操作。这这里只分分析了AAddEEntrry的过过程,RRemooveEEntrry的过过程基本本上差不不多,不不同的是是用系统统默认配配置的值值去覆盖

20、盖系统配配置。 /-/ SPPConnfigg() - CCFGTTAG_IP andd CFFGTAAG_OOS SServvicee Prroviiderr/-statiic iint SPCConffig(HANNDLEE hCCfg, uiint Tagg, uuintt Ittem, uiint Op, HAANDLLE hhCfggEnttry) uuintt *ppi,*pdsst,*pdeef; (vooid)hCffg; / GGet thee innforrmattionn iif( CfggEnttryIInfoo( hhCfggEnttry, 0, (UUINTT8 *

21、)(&pii) ) CCFGIITEMM_IPP_MAAX ) reeturrn( -1 ); pdsst = (uuintt *)&_iipcffg; ppdeff = (uiint *)&ipccfgccopyy; elsse iif( Tagg = CFFGTAAG_OOS ) / Bouund thee vaaluee off Ittem if( Ittem CCFGIITEMM_OSS_MAAX ) reeturrn( -1 ); pdsst = (uuintt *)&_ooscffg; pdeef = (uuintt *)&osscfggcoppy; ellse retturnn(

22、 -1 ); / VVeriify Iteem iif( !Ittem ) retturnn( -1 ); IItemm - -; / IIf tthiss iss ann aadd, aadd thee enntryy iif( Op = CFGGOP_ADDD ) *(ppdstt+Ittem) = *pii; / Ellse if reemovve, reestoore thee deefauult elsse iif( Op = CFGGOP_REMMOVEE ) *(ppdstt+Ittem) = *(ppdeff+Ittem); / RRetuurn succcesss rretu

23、urn(1); 到这里大大家可能能觉察到到一个问问题:我我们的CCfgAAddEEntrry函数数在SttackkTesst任务务的开始始就被调调用,而而我们的的回调函函数是在在后来才才安装上上去的,那那么这些些添加的的配置项项是不是是没有被被更新到到系统配配置中去去呢?没没错,的的确没有有!那我我们怎么么办呢?由于一一开始我我们添加加了多个个配置项项,那么么这些配配置项更更新到系系统应该该有一个个先后顺顺序(可可能它们们之间有有什么依依赖关系系吧),因因此,首首先要调调用函数数CfggSettExeecutteOrrderr()来来设置,需需要注意意的是这这个函数数不仅设设定配置置项更新新到

24、系统统配置中中的顺序序,同时时也设定定了这些些配置项项从系统统配置中中删除的的顺序。做做好这些些准备工工作之后后,调用用CfggExeecutte()(其其中fEExeccutee参数值值为1)来使使配置项项可以更更新到系系统配置置中去,同同也使能能以后添添加的配配置项也也能实时时更新到到系统配配置中去去。注意意:这个个函数必必须调用用,否则则你用CCfgAAddEEntrry函数数添加的的配置项项都不能能更新到到系统配配置中去去,即使使你在安安装好回回调函数数后调用用CfggAdddEnttry也也不能。至至此,TTCP/IP协协议栈系系统已经经启动,应应用程序序可以调调用协议议栈的APII函数来来实现网网络通信信等应用用。 接着调用函函数NCC_BoootCCompplette(),该该函数除除了设置置相应的的标志外外,主要要是来执执行一个个用户程程序。大大家应该该还记得得NC_NettStaart函函数的接接口吧,它它有三个个函数指指针作为为参数传传入,其其中第一一个就在在NC_BoootCoomplletee()中中调用:*NeetSttartt,该函函数指针针所指向向的函数数是由用用户来实实现,从从而向用用户提供供一个机机会,由由用户自自己决定定协议栈栈启动之之后做什什么

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论