VxWorks網路協議棧初始化流程

admin @ 2014-03-25 , reply:0

    在網路初始化時載入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;初始化介面啟動函數;
如果出錯,則進行出錯的善後處理。




[admin via 研發互助社區 ] VxWorks網路協議棧初始化流程已經有1359次圍觀

http://cocdig.com/docs/show-post-42365.html