⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rasamm.c

📁 这是全套的PPP协议的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/********************************************************************************** RAS_getAddrPoolexptDrv** Utility function that retrieves the drv exported to the protocol stack.** RETURNS: the driver or NULL on ERROR**/void *RAS_getAddrPoolexptDrv(UINT32 poolId, int doprintf){     RASAMM_IOCTL_ARG arg;     arg.poolId = --poolId;     if (RAS_Ioctl(RASIOCGETEXPTDDRIVER, &arg) == ERROR)         {         printf ("RAS_UTILS_ERROR: (RAS_getAddrPoolexptDrv) --> %x\n",                errnoGet());          return (0);         }     if (doprintf)        printf  ("Address Pool #%d Export Driver PMP: 0x%x\n",                  poolId, (UINT32)arg.info.exportedDrv);     return (arg.info.exportedDrv);}/********************************************************************************** RAS_setAddrPoolexptDrv** Utility function that sets the exported drv field.** RETURNS: OK or ERROR**/STATUS RAS_setAddrPoolexptDrv(UINT32 poolId, void *drv, int doprintf){     RASAMM_IOCTL_ARG arg;     arg.poolId = --poolId;     arg.info.exportedDrv = drv;     if (RAS_Ioctl(RASIOCSETEXPTDDRIVER, &arg) == ERROR)         {         printf ("RAS_UTILS_ERROR: (RAS_setAddrPoolexptDrv) --> %x\n",                errnoGet()); 	 	 return (ERROR);         }     if (doprintf)         printf ("Address Pool #%d Export Driver PMP: 0x%x\n",                poolId, (UINT32)arg.info.exportedDrv);     return (OK);}/********************************************************************************** RAS_getAddrPoolNumDrvs** Utility function for retrieving the number of multiplexed drivers in the* address pool.** RETURNS: none 0 value or 0 on ERROR**/UINT32 RAS_getAddrPoolNumDrvs(UINT32 poolId, int doprintf){     RASAMM_IOCTL_ARG arg;     arg.poolId = --poolId;     if (RAS_Ioctl(RASIOCGETNUMDRIVERS, &arg) == ERROR)         {         printf ("RAS_UTILS_ERROR: (RAS_getAddrPoolNumDrvs) --> %x\n",                errnoGet()); 	 	 return (0);         }     if (doprintf)         printf ("Address Pool #%d contains %d drivers\n",                 poolId, arg.info.numDrvs);     return (arg.info.numDrvs);}/********************************************************************************** RAS_getAddrPool1stDrv** Utility function for retrieving the 1st multiplexed driver in the list.** RETURNS: 1st driver or NULL on ERROR* */void *RAS_getAddrPool1stDrv(UINT32 poolId, UINT32 *srcipAddr, UINT32 *dstipAddr, int doprintf){     ADDR_POOL_ENTRY *apptr;     RAS_PMP_MUX_ENTRY *muxptr=NULL;     void *drv=NULL;     register UINT32 i;     semTake(rasapLock, WAIT_FOREVER);     poolId--;     apptr = rasAddrPools;     /* pool id validation: pools are sorted in ascending order */     while (apptr && (poolId > apptr->poolId))         apptr = apptr->next;     if (!apptr ||          (apptr->allocated == apptr->poolSz) ||         (apptr->poolId != poolId))     {         errnoSet(ERASAMMINVALIDPARM);         semGive(rasapLock);         return (NULL);     }     if ((!apptr->supportPMP) || (!apptr->lkupTbl))     {         errnoSet(ERASAMMNOPMPLKUPTBL);         semGive(rasapLock);         return (NULL);     }     for (i=0; i < apptr->lkupTblSz; i++)     {         muxptr = apptr->lkupTbl[i];         if (muxptr)         {             *srcipAddr = muxptr->srcipAddr;             *dstipAddr = muxptr->dstipAddr;             drv = muxptr->drv;             break;         }     }     if (doprintf)         printf ("Address Pool #%d Export Driver PMP: 0x%x\n",                 poolId, (UINT32)muxptr);     semGive(rasapLock);     return (drv);}/********************************************************************************** RAS_printAddrPoolInfo** Utility function prints out all of the relevant information on an address pool.* * RETURNS: non-zero integer on success and 0 on failure.**/void RAS_printAddrPoolInfo(UINT32 poolId){     int doprintf=1;     UINT32 firstIp;     UINT32 poolSz, numIpAddrs;     RASAMM_IOCTL_ARG arg;     FAST UINT32 i;     struct in_addr ipaddr;     char ipString [INET_ADDR_LEN];     printf ("\n");     if (!(RAS_getAddrPoolPrefix(poolId, doprintf)))         return;     if (!(RAS_getAddrPoolRouterId(poolId, doprintf)))         return;     firstIp = RAS_getAddrPoolFirstIp(poolId, doprintf);     if (!firstIp)         return;     poolSz = RAS_getAddrPoolSize(poolId, doprintf);     if (!poolSz)         return;     numIpAddrs = RAS_getAddrPoolNumFreeAddrs(poolId, doprintf);     if (poolSz == numIpAddrs)         printf ("All addresses are available in this address pool.\n");     arg.poolId = poolId-1;     arg.info.freeAddrs = (UINT32 *)malloc(numIpAddrs * 4);     if (!arg.info.freeAddrs)         {         printf ("can not allocate memory for retrieving IP addresses!\n");         return;         }     if (RAS_Ioctl(RASIOCGETGETFREEADDRS, &arg) == ERROR)         {         printf ("RAS_UTILS_ERROR: (RASIOCGETGETFREEADDRS) --> %x\n",                errnoGet());          return;         }     for (i=0; i < numIpAddrs; i++)         {         ipaddr.s_addr = htonl(arg.info.freeAddrs[i]+firstIp);         inet_ntoa_b (ipaddr, ipString);         printf ("\t\tIP: %s\n", ipString);         }     free(arg.info.freeAddrs);}/********************************************************************************** ras_pmpUpdateLkupTbl** This function is called to insert a multiplexed driver into or removing it from* an address pool.** RETURNS: OK or ERROR**/LOCAL STATUS ras_pmpUpdateLkupTbl(UINT32 poolId, UINT32 srcipAddr, UINT32 dstipAddr,                                   UINT doInsert, void *drv){     ADDR_POOL_ENTRY *apptr;     RAS_PMP_MUX_ENTRY **muxptr, *nptr;     semTake(rasapLock, WAIT_FOREVER);     poolId--;     apptr = rasAddrPools;     /* pool id validation: pools are sorted in ascending order */     while (apptr && (poolId > apptr->poolId))         apptr = apptr->next;     if (!apptr ||          (apptr->allocated == apptr->poolSz) ||         (apptr->poolId != poolId))     {         errnoSet(ERASAMMINVALIDPARM);         semGive(rasapLock);         return (ERROR);     }     if ((!apptr->supportPMP) || (!apptr->lkupTbl))     {         errnoSet(ERASAMMNOPMPLKUPTBL);         semGive(rasapLock);         return (ERROR);     }     /*      * insert into the lookup table      */     muxptr = &(apptr->lkupTbl[(dstipAddr % apptr->lkupTblSz)]);     if (doInsert)     {         nptr = (RAS_PMP_MUX_ENTRY *)malloc(sizeof(*nptr));         if (!nptr)         {             errnoSet(ERASAMMNOMEMORY);             semGive(rasapLock);             return (ERROR);         }         if (apptr->exportedDrv == NULL)             apptr->exportedDrv = drv;         nptr->next = NULL;         nptr->srcipAddr = srcipAddr;         nptr->dstipAddr = dstipAddr;         nptr->drv = drv;         while (*muxptr)             muxptr = &((*muxptr)->next);         *muxptr = nptr;         apptr->numDrvs++;     }     /*      * delete from the lookup table      */     else     {         while (*muxptr)         {             if ((*muxptr)->dstipAddr == dstipAddr)                 break;             muxptr = &((*muxptr)->next);         }          if (!(*muxptr))         {             errnoSet(ERASAMMINVALIDPARM);             semGive(rasapLock);             return (ERROR);         }         nptr = *muxptr;         *muxptr = nptr->next;         if (nptr->drv == apptr->exportedDrv)             apptr->exportedDrv = NULL;         free(nptr);            apptr->numDrvs--;     }     semGive(rasapLock);     return (OK);}/********************************************************************************** RAS_pmpInsertDriver** Insert a multiplexed driver into an address pool.** RETURNS: OK or ERROR*/STATUS RAS_pmpInsertDriver(UINT32 poolId, UINT32 srcipAddr, UINT32 dstipAddr, void *drv){     return (ras_pmpUpdateLkupTbl(poolId, srcipAddr, dstipAddr, 1, drv));}/********************************************************************************** RAS_pmpRemoveDriver** Remove a multiplexed driver from an address pool.** RETURNS: OK or ERROR**/STATUS RAS_pmpRemoveDriver(UINT32 poolId, UINT32 dstipAddr){     return (ras_pmpUpdateLkupTbl(poolId, 0, dstipAddr, 0, NULL));}/********************************************************************************** RAS_pmpGetDriver** Utility function used to obtain the multiplexed driver associated with a* particular host.* * RETURNS: the driver or NULL on error**/void *RAS_pmpGetDriver(UINT32 poolId, UINT32 dstipAddr){     ADDR_POOL_ENTRY *apptr;     RAS_PMP_MUX_ENTRY *nptr;     semTake(rasapLock, WAIT_FOREVER);     poolId--;     apptr = rasAddrPools;     /* pool id validation: pools are sorted in ascending order */     while (apptr && (poolId > apptr->poolId))         apptr = apptr->next;     if (!apptr ||          (apptr->allocated == apptr->poolSz) ||         (apptr->poolId != poolId))     {         errnoSet(ERASAMMINVALIDPARM);         semGive(rasapLock);         return (NULL);     }     if ((!apptr->supportPMP) || (!apptr->lkupTbl))     {         errnoSet(ERASAMMNOPMPLKUPTBL);         semGive(rasapLock);         return (NULL);     }     nptr = apptr->lkupTbl[(dstipAddr % apptr->lkupTblSz)];     while (nptr)     {         if (nptr->dstipAddr == dstipAddr)             break;         nptr = nptr->next;     }     semGive(rasapLock);     if (nptr)         return (nptr->drv);     return (NULL);}/********************************************************************************** RAS_pmpAddrPoolDrvsInit** Utility function used to reinitialize all of the multiplexed drivers when* the exported on is modified.* * RETURNS: OK or ERROR**/STATUS RAS_pmpAddrPoolDrvsInit(UINT32 poolId, void (*callback)(void *, void*)){     ADDR_POOL_ENTRY *apptr;     RAS_PMP_MUX_ENTRY *muxptr=NULL;     void *exportedDrv=NULL;     register UINT32 i;     semTake(rasapLock, WAIT_FOREVER);     poolId--;     apptr = rasAddrPools;     /* pool id validation: pools are sorted in ascending order */     while (apptr && (poolId > apptr->poolId))         apptr = apptr->next;     if (!apptr ||          (apptr->allocated == apptr->poolSz) ||         (apptr->poolId != poolId))     {         errnoSet(ERASAMMINVALIDPARM);         semGive(rasapLock);         return (ERROR);     }     if ((!apptr->supportPMP) || (!apptr->lkupTbl))     {         errnoSet(ERASAMMNOPMPLKUPTBL);         semGive(rasapLock);         return (ERROR);     }     exportedDrv = apptr->exportedDrv;     if (!exportedDrv)     {         errnoSet(ERASAMMINVALIDPARM);         semGive(rasapLock);         return (ERROR);     }     for (i=0; i < apptr->lkupTblSz; i++)     {         muxptr = apptr->lkupTbl[i];         while (muxptr)         {             callback(exportedDrv, muxptr->drv);             muxptr = muxptr->next;         }     }     semGive(rasapLock);     return (OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -