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