在网络初始化时加载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;初始化接口启动函数; 如果出错,则进行出错的善后处理。
|