void _CalcIpv6Addr(UCHAR *pucIpv6Addr, IPV6_POOL_S *pIpv6Pool, ULONG ulIndex)
{
DWORD ulTmp = 0;
DWORD ulFirst = 0;
DWORD ulLast = 0;
memcpy(pucIpv6Addr, pIpv6Pool->ucaFirstIpv6, 16);
memcpy(&ulFirst, pucIpv6Addr + (pIpv6Pool->ucModBit - 1) / 16 * 2 - 2, 4);
ulFirst = htonl(ulFirst);
ulTmp = (pIpv6Pool->ucStep
* pow2(2, (pIpv6Pool->ucModBit - 1) / 16 * 16 + 16 - pIpv6Pool->ucModBit)
* ulIndex);
ulLast = htonl(ulFirst + ulTmp);
memcpy(pucIpv6Addr + (pIpv6Pool->ucModBit - 1) / 16 * 2 - 2, &ulLast, 4);
}
ULONG CalcGroupIp(IP_POOL_S *pGroupPool, ULONG ulGroupIndex)
{
ULONG ulStep = pGroupPool->ucStep * (ULONG)(pow2(2, (32 - pGroupPool->ucModBit)));
ULONG ulGroupIp = pGroupPool->ulFirstIp + ulStep * ulGroupIndex;
return ulGroupIp;
}
ULONG pow2(ULONG ulArg1, ULONG ulAgr2)
{
ULONG ulVal = 1;
ULONG i;
for (i = 0; i < ulAgr2; i++)
{
ulVal = ulVal * ulArg1;
}
return ulVal;
}