VxWorks网络协议栈初始化流程
2013-03-26
标签: VxWorks

在网络初始化时加载END和subEND,并在其中初始化IP协议栈,在TMS初始化时绑定IP到SubEND,单播路由协议初始化在TMS初始化中,根据MIB配置确定初始化哪个单播路由协议,RIP初始化可以在网络初始化时,OSPF初始化在TMS初始化中根据TMSMIB配置确定,END的IP地址在网络初始化时设置,SwEND的IP地址在网管配置时设置。

一、在configAll.H中定义了所有定置系统配置的宏

《INCLUDED SOFTWARE FACILITIES》:定义了基本组件;

《EXCLUDED FACILITIES》:定义了扩充组件,缺省不包括;

《KERNEL SOFTWARE CONFIGURATION》:内核运行的基本参数定义,包括文件个数、任务个数等等;

《"GENERIC" BOARD CONFIGURATION》:板通用属性定义;

《"MISCELLANEOUS" CONSTANTS》:共享的信号量以及相关对象个数定义;

《INCLUDED NETWORK FACILITIES》:包括的网络协议组件定义;

《EXCLUDED NETWORK FACILITIES》:未包括的网络协议组件定义;

二、在bootConfig.C中的流程

usrInit()的流程,该例程被rom—start()中的boot代码调用。

调用intVecBaseSet ((FUNCPTR *) VEC_BASE_ADRS)设置中断向量;

调用excVecInit ()设置异常向量;

调用sysHwInit ()初始化硬件;

调用usrKernelInit ()配置VXWORK内核;

调用kernelInit ((FUNCPTR) usrRoot, ROOT_STACK_SIZE,启动usrRoot();

usrRoot()有多个,一个在bootConfig。C中,一个在usrConfig。C中。

三、bootConfig.C中的usrRoot()流程(是BOOTROM用的)

调用 memInit (pMemPoolStart, memPoolSize);/* XXX select between memPartLibInit */初始化内存;

调用 sysClkConnect ((FUNCPTR) usrClock, 0);/* connect clock interrupt routine */

sysClkRateSet (60); /* set system clock rate */

sysClkEnable (); /* start it */

初始化系统时钟;

调用 iosInit (NUM_DRIVERS, NUM_FILES, "/null");初始化文件系统;

根据配置的串口和控制台口个数,初始化串口;

调用 wdbConfig(); /* configure and initialize the WDB agent */初始化WDB;

调用 pipeDrv (); /* install pipe driver */

excInit (); /* init exception handling */

excHookAdd ((FUNCPTR) bootExcHandler); /* install exc handler */

logInit (consoleFd, 5); /* initialize logging */

初始化相关功能模块;

调用 hashLibInit (); /* hashLib used by dosFS */初始化DOS文件系统;

根据配置选择

bootAoutInit (); /* use a.out format */

#else /* coff or ecoff */

#if defined(INCLUDE_ECOFF)

bootEcoffInit (); /* use ecoff format */

#else /* coff */

#if defined(INCLUDE_COFF)

bootCoffInit (); /* use coff format */

#else /* coff */

#if defined(INCLUDE_ELF)

bootElfInit (); /* use elf format */

之上的其一初始化;

调用 if (muxLibInit() == ERROR)初始化MUX;

根据END个数加载END;

调用bootCmdLoop创建"tBoot"任务,启动下一步初始化;

四、bootCmdLoop()流程

调用key = autoboot (timeout);启动初始化;

五、autoboot()流程

调用 if (bootLoad (BOOT_LINE_ADRS, &entry) == OK)

go (entry); /* ... and never return */

从FLASH中读出BOOTLINE配置的启动文件,并运行该启动文件。

三、usrConfig.C中的usrRoot流程(是版本启动用的)

usrRoot()流程

usrRoot()是VXWORKS进入多任务环境下创建的第一个任务,用来初始化各种系统参数,并启动其它任务。

入口参数: char * pMemPoolStart, /* start of system memory partition */

unsigned memPoolSize /* initial size of mem pool */

调用 memInit (pMemPoolStart, memPoolSize); /* initialize memory pool */

或memPartLibInit (pMemPoolStart, memPoolSize);/* initialize memory pool */

初始化系统内存池;

调用memShowInit ()初始化内存显示例程;

调用usrMmuInit ()初始化MMU单元;

调用 sysClkConnect ((FUNCPTR) usrClock, 0); /* connect clock ISR */

sysClkRateSet (60); /* set system clock rate */

sysClkEnable (); /* start it */

初始化系统时钟;

初始化_func_selWakeupListInit;

调用 iosInit (NUM_DRIVERS, NUM_FILES, "/null");初始化I/O系统;

安装控制台驱动,创建控制台设备,设置BAND率;

初始化PC控制台设备;

调用 ioGlobalStdSet (STD_IN, consoleFd);

ioGlobalStdSet (STD_OUT, consoleFd);

ioGlobalStdSet (STD_ERR, consoleFd);

将标准输入、输出、错误输出定向到控制台设备上;

调用hashLibInit (); /* initialize hash table package */

symLibInit (); /* initialize symbol table package */

symShowInit (); /* initialize symbol table show */

初始化系统符号表;

调用excInit ()初始化异常处理;

调用logInit (consoleFd, MAX_LOG_MSGS)初始化登录;

调用sigInit ()初始化信号量库;

调用dbgInit ()初始化调试库;

调用pipeDrv ()初始化管道;

stdioInit (); /* initialize standard I/O library */

stdioShowInit ();

初始化标准I/O;

调用sigqueueInit (NUM_SIGNAL_QUEUES); /* initialize queued signals */

semPxLibInit ();

semPxShowInit ();

mqPxLibInit (MQ_HASH_SIZE);

mqPxShowInit ();

aioPxLibInit (MAX_LIO_CALLS);

aioSysInit(MAX_AIO_SYS_TASKS, AIO_TASK_PRIORITY, AIO_TASK_STACK_SIZE);

初始化POSIX;

调用 hashLibInit (); /* initialize hash table package */

dosFsInit (NUM_DOSFS_FILES); /* init dosFs filesystem */

初始化DOS文件系统;

调用 rawFsInit (NUM_RAWFS_FILES); /* init rawFs filesystem */ 初始化原始文件系统;

调用rt11FsInit (NUM_RT11FS_FILES)初始化RT11文件系统;

调用ramDrv ()初始内存虚拟盘;

初始化SCSI;

调用fdDrv (FD_INT_VEC, FD_INT_LVL)初始化软驱;

调用ideDrv (IDE_INT_VEC, IDE_INT_LVL, IDE_CONFIG)初始化IDE盘;

初始化硬盘驱动;

初始化LPT;

调用 pcmciaShowInit (); /* install PCMCIA show routines */

pcmciaInit (); /* init PCMCIA Lib */

初始化PCMCIA;

调用tffsDrv ()初始化TFFS;

调用fioLibInit ()初始化格式化I/O;

调用floatInit ()初始化浮点设备;

调用mathSoftInit ()初始化软浮点设备;

调用mathHardInit ()初始化硬浮点设备;

调用spyLibInit ()初始化CPU监视工具;

调用timexInit ()初始化函数定时工具;

调用envLibInit (ENV_VAR_USE_HOOKS)初始化环境变量;

初始化NTPASSFS;

调用moduleLibInit ()初始化模块管理器;

调用symSyncLibInit ()同步目标机与主机的符号表;

调用sysFFSMount ();初始化文件系统;

调用

usrBootLineInit (sysStartType); /* crack the bootline */

usrNetInit (BOOT_LINE_ADRS); /* initialize network support */

初始化网络通讯协议;

初始化PASSFS;

初始化DOS_DISK;

调用usrSmObjInit (BOOT_LINE_ADRS)初始化共享内存对象;

初始化WindMP;

写保护文本段和向量表;

调用selectInit ()初始化SELECT;

调用sysSymTbl = symTblCreate (SYM_TBL_HASH_SIZE_LOG2, TRUE, memSysPartId)创建系统符号表;

调用sysSymTbl = symTblCreate (SYM_TBL_HASH_SIZE_LOG2, TRUE, memSysPartId);

netLoadSymTbl ()

创建网络符号表;

初始化C++库;

初始化Wind Web服务器;

调用httpd ()初始化HTTP;

调用rBuffLibInit();

rBuffShowInit (); /* install rBuff show routine */

初始化RBUFF;

调用windviewConfig ()初始化WINDVIEW;

调用wdbConfig();初始化调试接口;

打印SHELL界面;

初始化交互界面,提示用户输入信息,口令验证;

调用usrUglInit ()初始化UGL;

调用javaConfig ()初始化JAVA;

调用usrHtmlInit ()初始化HTML;

调用USER_APPL_INIT初始化用户应用程序;TmsAppInit()

四、网络协议栈初始化流程

在usrnetwork.C中:

在usrRoot()中调用

usrNetInit

(

char *bootString /* boot parameter string */

)

初始化网络协议栈

将BOOTLINE中的初始化字串写入初始化结构变量中,没有的赋缺省值。

初始化CPU号,以利用VME通讯;

初始化插口层、BSD插口和路由插口;

调用hostTblInit ()初始化主机表;(在hostlib。C中,该表用于DNS)

调用usrNetProtoInit ()初始化各种协议,包括IP、RIP、IP过滤、UDP、TCP、ICMP、IGMP、多播路由、OSPF;

调用netLibInit ()初始化网络库,包括创建网络任务环、创建网络处理任务、初始化缓冲区、接口初始化、

添加INTE域、INTE域初始化、路由表初始化、增强路由初始化、多播HASH表初始化、网络类型初始化;

调用muxLibInit()初始化MUX;

调用muxAddrResFuncAdd (M2_ifType_ethernet_csmacd, 0x800, ipEtherResolvRtn)初始化

以太网的IP地址解析;

调用muxAddrResFuncAdd (M2_ifType_atm, 0x800, ipAtmResolvRtn)初始化ATM的IP地址解析;

调用muxAddrResFuncAdd (M2_ifType_ppp, 0x800, ipPppResolvRtn)初始化POS的IP地址解析;

(此处初始化了所有外部链路类型的IP地址解析函数,形成函数链表,在IP绑定时,

根据END接口类型和协议类型,获取地址解析函数,就可以完成地址解析了)

读endDevTbl,调用muxDevLoad()加载END并调用muxDevStart()启动END;

初始化PPP;

初始化DHCP,如果定义了Relay且未定义Server,则初始化Relay,初始化Client;

初始化UL接口;

设置加载启动接口,从PPP、SLIP和BACKPLANE中挑选其一,如果没有则查其它选项定义了其它设备,

则从其它设备加载;根据其它设备的不同属性,

添加接口,设置IP地址;

若从磁盘启动则初始化必要的END:

{

调用pEnd = endFindByName(params.other, params.unitNum);获取一个other中的END;

调用(ipAttach(params.unitNum, params.other) != OK)绑定IP协议栈到该END上;

设置attached = TRUE;

如果!attached,调用usrNetIfAttach (params.other, params.unitNum,params.ead) != OK)则

初始化BSD类型的接口;

调用usrNetIfConfig (params.bootDev, params.unitNum, params.ead,

params.targetName,

netmask) !=OK)配置IP地址

}

如果从以太网启动,则:

{

调用pEnd = endFindByName(params.other, params.unitNum);获取一个other中的END;

调用(ipAttach(params.unitNum, params.other) != OK)绑定IP协议栈到该END上;

设置attached = TRUE;

如果!attached,调用usrNetIfAttach (params.other, params.unitNum,params.ead) != OK)

则初始化BSD类型的接口;

调用usrNetIfConfig (params.bootDev, params.unitNum, params.ead,

params.targetName,

netmask) !=OK)配置IP地址;

}

如果不从BACKPLANE启动,则设置此BACKPLANE为第二接口:

{

调用usrNetIfAttach (bpDev, params.unitNum, params.bad);

(void) usrNetIfConfig (bpDev, params.unitNum, params.bad,

(char *) NULL, netmask);

配置BACKPLANE;

}

如果params.targetName[0]目标主机名不为空,则调用:

usrNetIfAttach ("lo", 0, "127.0.0.1");

usrNetIfConfig ("lo", 0, "127.0.0.1", "localhost", 0);

添加环回接口;

若从BACKPLANE启动,则更改DHCP Client属性;

初始化ARP代理服务器;

初始化DHCPClient,并设置IP地址到BOOTLINE中;

如果定义了网关地址,则设置路由;

调用hostAdd (params.hostName, params.had);将HOST加入到主机表;

设置与其它VXWORKS通讯的名字和联系

创建远程文件访问设备;

初始化ZBUF插口;(目前没有使用)

初始化tcpTraceInit()跟踪调试接口;

调用rlogInit (),启动远程登录;

调用telnetInit (),启动TELNET;

调用rpcInit (),启动RPC;

调用ftpdInit((FUNCPTR) loginUserVerify, 0),启动FTP;

调用tftpdInit (0, 0, 0, FALSE, 0),启动TFTP Server;

初始化NFS;

初始化DHCP Server或Relay;

调用sntpcInit (SNTP_PORT),初始化SNTP;

调用pingLibInit(),初始化PING;

调用usrSnmpdInit (),初始化SNMP Agent;

调用 ripLibInit(RIP_SUPPLIER, RIP_GATEWAY, RIP_MULTICAST, RIP_VERSION,

RIP_TIMER_RATE, RIP_SUPPLY_INTERVAL, RIP_EXPIRE_TIME,

RIP_GARBAGE_TIME);初始化RIP;

调用usrResolvInit ()初始化DNS;

五、configTms.H定义

在configTms.H中:

定义:

#define BOARD_NAME "Broadcom"

#define HOST_NAME_DEFAULT "TMS_HOST"

#define TARGET_NAME_DEFAULT "WRN-Broadcom"

#define HOST_USER_DEFAULT "TMS_User"

#define HOST_PASSWORD_DEFAULT ""

#define SCRIPT_DEFAULT ""

#define OTHER_DEFAULT ""

#define PRODUCT_NAME "TMS BCM5600 Switch Product"

等初始化BOOTLINE缺省名。

此外还定义了

TMS相关的实现宏。

六、在sysSwitch.C中

TMSAppInit()流程:

调用sysClkRateSet( SYSTEM_CLK_RATE )设置时钟速率;

调用 sysNvmCreate();初始化NVM,需要一段时间;

调用portMapInit()初始化端口映射;

调用portMapIfStructInit()初始化端口、接口映射;

调用TASK_START( NVM_APPNAME, nvmInit, &nvmData, NULL, "high", (8 * 1024) ); 创建NVM数据维护任务;

调用 appManagerClr( APP_MANAGER_IDB );

MODULE_START(IDB_APPNAME,idbInit,NUM_OF_OBJECTS, UM_OF_MODULES );

appManagerSet( APP_MANAGER_IDB );

初始化IDB+模块;

读取NVM更新系统的MAC地址;

调用muxIterateByName( SW_DEVICE_NAME, updateEndDevices, SW_DEVICE_NAME );

muxIterateByName( AG_DEVICE_NAME, updateEndDevices, AG_DEVICE_NAME );

muxIterateByName( AP_DEVICE_NAME, updateEndDevices, AP_DEVICE_NAME );

muxIterateByName( HW_DEVICE_NAME, updateEndDevices, HW_DEVICE_NAME );

更新END的MAC地址;

调用muxIterateByName( SW_DEVICE_NAME, swIpAttach, NULL )添加相应的网络接口;

初始化虚拟I/O消息服务;

初始化LOGO-TO-NULL;

如果环回接口未初始化,则初始化环回接口;

如果禁止IP路由,则调用m2IpGroupInfoSet( varToSet, &ipVars )设置协议栈全局变量;

调用sysMib2Init();初始化MIB;

调用 envoyTMSInit ();初始化SNMP;

调用 MODULE_START( SWAPI_APPNAME, bcmSwapiInit, 0, 0 );

MODULE_START( RFC1213_APPNAME, rfc1213Init, 0, 0 );

MODULE_START( RFC1907_APPNAME, rfc1907Init, 0, 0 );

MODULE_START( RFC1493_APPNAME, rfc1493Init, 0, 0 );

MODULE_START( RFC2233_APPNAME, rfc2233Init, 0, 0 );

MODULE_START( RFC2665_APPNAME, rfc2665Init, 0, 0 );

设置基本MIB;

调用MODULE_START( RFC2571_APPNAME, rfc2571Init, 0, 0 );

MODULE_START( RFC2572_APPNAME, rfc2572Init, 0, 0 );

MODULE_START( RFC2573T_APPNAME, rfc2573tInit, 0, 0 );

MODULE_START( RFC2573N_APPNAME, rfc2573nInit, 0, 0 );

MODULE_START( RFC2574_APPNAME, rfc2574Init, 0, 0 );

MODULE_START( RFC2575_APPNAME, rfc2575Init, 0, 0 );

设置SNMP MIB;

调用 MODULE_START( STPMIB_APPNAME, stpMibInit, 0, 0 );

MODULE_START( GARPMIB_APPNAME, garpMibInit, 0, 0 );

MODULE_START( RFC2674Q_APPNAME, rfc2674qInit, 0, 0 );

MODULE_START( RFC2674P_APPNAME, rfc2674pInit, 0, 0 );

TASK_START( STP_APPNAME, stpInit, 0, 0, "high", (6 * 1024) );

appManagerSet( APP_MANAGER_STP | APP_MANAGER_STPFWD );

TASK_START( GARP_APPNAME, garpInit,

NUM_SUPPORTED_VLANS, 0, "", (5 * 1024) );

layer2Inits = (APP_MANAGER_IDB |

APP_MANAGER_NVM |

APP_MANAGER_STP |

APP_MANAGER_GARP |

APP_MANAGER_GARP_NVM_DONE |

APP_MANAGER_DRIVER);

appManagerWait( layer2Inits, APP_MANAGER_WAIT_FOREVER );

初始化GARP、STP;

调用 MODULE_START( TMSL3_APPNAME, tmsL3MibInit, 0, 0 );初始化L3MIB

调用 inCanForwardHook = sysCanForward;

inCanForwardRIPHook = sysCanForwardRIP;

初始化钩子函数,用以禁止带外数据转发或禁止某个IP地址转发;

调用TMSRoutingProtoInit( )初始化路由协议;

调用MODULE_START( TMSMIB_APPNAME, tmsMibInit, 0, 0 )初始化TMSMIB;

调用TASK_START( IPINIT_APPNAME,

tmsIpInit, SW_DEVICE_NAME, SW_DEVICE_UNIT, "high", (30 * 1024) )

初始化IP地址;

调用 TASK_START( IPINIT_APPNAME,

tmsIpInit, SW_DEVICE_NAME, SW_DEVICE_UNIT, "high", (30 * 1024) );

设置SW0的IP地址;

调用TASK_START( SNMP_APPNAME, snmpInit, 0, 0, "medium", (24 * 1024) )启动SNMP任务;

调用TASK_START( RMON_APPNAME, rmonInit, 0, 0, "medium", (64 * 1024) )创建RMON任务;

调用TASK_START( SW2AGBIND_APPNAME, sw2AgBindInit, 0, 0, "medium", (8 * 1024) )创建AG绑定任务;

调用TASK_START( IGMPSNOOP_APPNAME, igmpSnoopInit, 0, 0, "medium", (8 * 1024) );

igmpSnoopEnable( TRUE )

创建IGMPSNOOPING;

调用TASK_START( PORT_POLL_APPNAME, pollPortInit, 0, 0, "lowest", (6 * 1024) )

TASK_START( PORT_STAT_APPNAME, portStatisticsInit,0, 0, "high", (4 * 1024) )

创建端口统计任务;

调用TASK_START( LINK_TRAP_APPNAME, linkUpDownTrapsInit,0, 0, "medium", (4 * 1024) )

创建LINK TRAP任务;

调用wdbConfig()配置WDB;

检查启动结果,打印启动信息;

调用TASK_START( WEB_APPNAME, webInit, 0, 0, "low", (8 * 1024) );启动WEB;

调用MODULE_START( HTTPINIT_APPNAME, tmsHttpInit, 0, 0 )启动HTTP;

调用LED显示;

七、网络协议缓冲区初始化mbinit (void)流程

调用netBufLibInit ()初始化信号量;

调用 if (_netStackPoolInit (_pNetDpool, &mClBlkConfig, &clDescTbl [0],

clDescTblNumEnt) != OK)

if (_netStackPoolInit (_pNetSysPool, &sysMclBlkConfig, &sysClDescTbl [0],

sysClDescTblNumEnt) != OK)

初始化两个缓冲;

在_netStackPoolInit()中调用

if ((pMclConfig->memArea = (char *) malloc (pMclConfig->memSize))

== NULL)

为Mbuf分配空间;

调用 if ((pClDesc->memArea = (char *)malloc (pClDesc->memSize)) == NULL)为mclk分配空间;

调用netPoolInit (pNetPool, pMclConfig, pClDescTbl, clTblNumEnt, NULL)初始化缓冲池参数;

在netPoolInit()中调用

pNetPool->pFuncTbl = _pNetPoolFuncTbl; /* default func table */

return (poolInit (pNetPool, pMclBlkConfig, pClDescTbl, clDescTblNumEnt));

初始化NETPOOL操作函数指针,用poolInit()初始化缓冲池的相关参数;

八、在usrNetwork.C中定义有网络转发使用的缓冲区和系统内核使用的缓冲区:

/* network buffers configuration */

/*

* mBlk, clBlk configuration table for network stack data pool.

* Only used for data transfer in the network stack.

*/

M_CL_CONFIG mClBlkConfig =

{

/*

no. mBlks no. clBlks memArea memSize

----------- ---------- ------- -------

*/

NUM_NET_MBLKS, NUM_CL_BLKS, NULL, 0

};

/*

* network stack data cluster pool configuration table

* Only used for data transfer in the network stack.

*/

CL_DESC clDescTbl [] =

{

/*

clusterSize num memArea memSize

----------- ---- ------- -------

*/

{64, NUM_64, NULL, 0},

{128, NUM_128, NULL, 0},

{256, NUM_256, NULL, 0},

{512, NUM_512, NULL, 0},

{1024, NUM_1024, NULL, 0},

{2048, NUM_2048, NULL, 0}

};

int clDescTblNumEnt = (NELEMENTS(clDescTbl));

/*

* mBlk, clBlk configuration table for network stack system pool.

* Used for network stack system structures such as routes, sockets,

* protocol control blocks, interface addresses, mulitcast addresses,

* and multicast routing entries.

*/

M_CL_CONFIG sysMclBlkConfig =

{

/*

no. mBlks no. clBlks memArea memSize

----------- ---------- ------- -------

*/

NUM_SYS_MBLKS, NUM_SYS_CL_BLKS, NULL, 0

};

/*

* network stack system cluster pool configuration table

* Used for network stack system structures such as routes, sockets,

* protocol control blocks, interface addresses, mulitcast addresses,

* and multicast routing entries.

*/

CL_DESC sysClDescTbl [] =

{

/*

clusterSize num memArea memSize

----------- ---- ------- -------

*/

{64, NUM_SYS_64, NULL, 0},

{128, NUM_SYS_128, NULL, 0},

{256, NUM_SYS_256, NULL, 0},

{512, NUM_SYS_512, NULL, 0},

};

int sysClDescTblNumEnt = (NELEMENTS(sysClDescTbl));

以上的常数定义在netBufLib.H中;

在目前的定义中:

系统内核的缓冲区有512个Mbuf,有256个Mclk;

网络协议的缓冲区有400个Mbuf,有330个Mclk;

在mbuf.H将mbuf重定义为mBlk;

#define mbuf mBlk

在mblk中实现了原来mbuf的定义;

八、IP协议栈初始化usrNetProtoInit ()流程

调用ipLibInit (&ipCfgParams)初始化IP ;

调用rawIpLibInit ()初始化原始IP;

调用rawLibInit ()初始化原始IP库;

调用ipFilterLibInit ()初始化IP过滤;

调用udpLibInit (&udpCfgParams)初始化UDP库;

调用udpShowInit ()初始化UDP显示;

调用tcpLibInit (&tcpCfgParams)初始化TCP库;

调用tcpShowInit ()初始化TCP显示;

调用icmpLibInit (&icmpCfgParams);初始化ICMP;

调用icmpShowInit ()初始化ICMP显示;

调用igmpLibInit ();初始化IGMP;

调用igmpShowInit ();初始化IGMP显示;

调用mCastRouteLibInit ();初始化MCAST;

调用ospfLibInit ();初始化OSPF;

调用 ospfRegisterProtocol ();初始化OSPF注册;

netLibInit()流程:

调用 if ((netJobRing = rngCreate (JOB_RING_SIZE)) == (RING_ID) NULL)

panic ("netLibInit: couldn't create job ring\n");

初始化任务环;

调用 if (rebootHookAdd ((FUNCPTR) ifreset) == ERROR)

logMsg ("netLibInit: unable to add reset hook\n", 0, 0, 0, 0, 0, 0);

初始化复位钩子;

调用 semBInit (netTaskSemId, SEM_Q_PRIORITY, SEM_EMPTY);初始化信号量;

调用 splSemInit ();初始化信号量;

调用 mbinit ();初始化网络缓冲区;

调用 ifinit ();初始化接口;

调用addDomain (&inetdomain);添加域;

调用domaininit ()初始化域;

调用route_init ()初始化路由表;

调用routeIntInit ()初始化增强路由表;

调用mcastHashInit ();初始化多播HASH;

调用netTypeInit ()初始化网络类型;

调用 netTaskId = taskSpawn ("tNetTask", netTaskPriority,

netTaskOptions, netTaskStackSize,

(FUNCPTR) netTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

创建网络任务netTask;

netTask()网络任务流程

调用 semTake (netTaskSemId, WAIT_FOREVER);获取信号量;

调用rngIsEmpty (netJobRing)检查网络事件环是否有任务,如果有事件

则调用rngBufGet (netJobRing, (char *) &jobNode,sizeof (jobNode)) != sizeof (jobNode))获取事件,

并执行;

判断_netIsrMask中断字,确定是IP包到、还是ARP包到;

如果是IP包到,则调用ipintr ();处理IP包后清除_netIsrMask中断字;

如果是ARP包到,则调用arpintr ()处理ARP包后清除_netIsrMask中断字;

schednetisr()软中断流程:

获取软中断类型;

设置_netIsrMask软中断字;

调用semGive (netTaskSemId)激活网络处理任务。

TMSAppinit中调用muxIterateByName( SW_DEVICE_NAME, swIpAttach, NULL )添加相应的网络接口;

rc = ipAttach( unit0, EM_DEVICE_NAME );初始化外部网络接口

swIpAttach()的流程如下:

调用rc = ipAttach( unit, SW_DEVICE_NAME );初始化网络接口

ipAttach()流程:

调用 if (endFindByName (pDevice, unit) == NULL)确定是否有该END;

在ipDrvCtrl[]中获取一个空的空间放置IP驱动属性;

调用if((pDrvCtrl->tkFlag = muxTkDrvCheck(pDevice)) == TRUE)确定是否是NPT类型的END,

如果是则以后绑定用TK;

调用if((pDrvCtrl->pIpCookie = muxTkBind(pDevice, unit, ipTkReceiveRtn,绑定IP协议栈;

调用 bzero(pDrvCtrl->drvName,8);

strncpy(pDrvCtrl->drvName, pDevice,sizeof(pDrvCtrl->drvName)-1);

设置ipDrvCtrl[]域中成员名;

调用pIfp = (struct ifnet *) &pDrvCtrl->idr;获取ifNet;

设置ifNet;

调用muxIoctl(pDrvCtrl->pIpCookie, EIOCGFLAGS, (caddr_t)&flags)获取底层硬件标志;

调用muxIoctl(pDrvCtrl->pIpCookie, EIOCGMIB2233,(caddr_t)&pM2ID) == ERROR)获取底层硬件MIB变量;

设置ifnet;

确定接口类型,如果广播类型的接口,则设置接口广播标志;

调用if((pDrvCtrl->pArpCookie = muxTkBind(pDevice, unit,ipTkReceiveRtn,绑定ARP协议;

调用if (muxIoctl (pDrvCtrl->pIpCookie, EIOCGHDRLEN,

(caddr_t)&ifHdrLen)!= OK)获取底层硬件地址长度;

设置ifnet硬件地址长度;

设置ifnet的接口操作函数例程;

调用pIfp->if_resolve = muxAddrResFuncGet(pIfp->if_type, 0x800)获取该接口类型的地址解析函数;

调用if_attach (pIfp);将ifnet加入接口链表中;

调用pIfp->if_start = (FUNCPTR) ipTxStartup;初始化接口启动函数;

如果出错,则进行出错的善后处理。

可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号