UBOOL8 cmsNet_areIp6AddrEqual(const char *ip6Addr1, const char *ip6Addr2) { char address1[CMS_IPADDR_LENGTH]; char address2[CMS_IPADDR_LENGTH]; UINT32 plen1 = 0; UINT32 plen2 = 0; struct in6_addr in6Addr1, in6Addr2; CmsRet ret; if (IS_EMPTY_STRING(ip6Addr1) && IS_EMPTY_STRING(ip6Addr2)) { return TRUE; } if (ip6Addr1 == NULL || ip6Addr2 == NULL) { return FALSE; } if ((ret = cmsUtl_parsePrefixAddress(ip6Addr1, address1, &plen1)) != CMSRET_SUCCESS) { cmsLog_error("cmsUtl_parsePrefixAddress returns error. ret=%d", ret); return FALSE; } if ((ret = cmsUtl_parsePrefixAddress(ip6Addr2, address2, &plen2)) != CMSRET_SUCCESS) { cmsLog_error("cmsUtl_parsePrefixAddress returns error. ret=%d", ret); return FALSE; } if (inet_pton(AF_INET6, address1, &in6Addr1) <= 0) { cmsLog_error("Invalid address1=%s", address1); return FALSE; } if (inet_pton(AF_INET6, address2, &in6Addr2) <= 0) { cmsLog_error("Invalid address2=%s", address2); return FALSE; } return ((memcmp(&in6Addr1, &in6Addr2, sizeof(struct in6_addr)) == 0) && (plen1 == plen2)); } /* cmsNet_areIp6AddrEqual() */
UBOOL8 cmsNet_isHostInSameSubnet(const char *addrHost, const char *addrPrefix) { char address[INET6_ADDRSTRLEN]; char prefix1[INET6_ADDRSTRLEN]; char prefix2[INET6_ADDRSTRLEN]; UINT32 plen = 0; CmsRet ret; *address = '\0'; *prefix1 = '\0'; *prefix2 = '\0'; if (IS_EMPTY_STRING(addrHost) && IS_EMPTY_STRING(addrPrefix)) { return TRUE; } if (addrHost == NULL || addrPrefix == NULL) { return FALSE; } if (strchr(addrHost, '/') != NULL) { cmsLog_error("Invalid host address %s", addrHost); return FALSE; } if (strchr(addrPrefix, '/') == NULL) { cmsLog_error("Invalid address prefix %s", addrPrefix); return FALSE; } if ((ret = cmsUtl_parsePrefixAddress(addrPrefix, address, &plen)) != CMSRET_SUCCESS) { cmsLog_error("cmsUtl_parsePrefixAddress returns error. ret=%d", ret); return FALSE; } if ((ret = cmsUtl_getAddrPrefix(addrHost, plen, prefix1)) != CMSRET_SUCCESS) { cmsLog_error("cmsUtl_getAddrPrefix returns error. ret=%d", ret); return FALSE; } if ((ret = cmsUtl_getAddrPrefix(address, plen, prefix2)) != CMSRET_SUCCESS) { cmsLog_error("cmsUtl_getAddrPrefix returns error. ret=%d", ret); return FALSE; } return (cmsNet_areIp6AddrEqual(prefix1, prefix2)); } /* cmsNet_isHostInSameSubnet() */
UBOOL8 cmsUtl_isValidIpAddress(SINT32 af, const char* address) { #ifdef DMP_X_BROADCOM_COM_IPV6_1 /* aka SUPPORT_IPV6 */ if (af == AF_INET6) { struct in6_addr in6Addr; UINT32 plen; char addr[BUFLEN_40]; if (cmsUtl_parsePrefixAddress(address, addr, &plen) != CMSRET_SUCCESS) { cmsLog_error("Invalid ipv6 address=%s", address); return FALSE; } if (inet_pton(AF_INET6, addr, &in6Addr) <= 0) { cmsLog_error("Invalid ipv6 address=%s", address); return FALSE; } if ( in6Addr.s6_addr32[0] == 0 && in6Addr.s6_addr32[1] == 0 && in6Addr.s6_addr32[2] == 0 && (in6Addr.s6_addr32[3] == 0 || in6Addr.s6_addr32[3] == 1)) { cmsLog_error("Unspecified or loopback ipv6 address=%s", address); return FALSE; } return TRUE; } else #endif { if (af == AF_INET) { return cmsUtl_isValidIpv4Address(address); } else { return FALSE; } } } /* End of cmsUtl_isValidIpAddress() */
/* * copy at most DHCP_VENDOR_ID_LEN bytes. Since each chunk in the linear * buffer is DHCP_VENDOR_ID_LEN+1 bytes long and initialized to 0, * we are guaranteed that each vendor id is null terminated. */ strncpy(vendorId, ptr, DHCP_VENDOR_ID_LEN); count++; ptr = strtok_r(NULL, ",", &savePtr); } cmsMem_free(copy); return vendorIds; } ConnectionModeType cmsUtl_connectionModeStrToNum(const char *connModeStr) { ConnectionModeType connMode = CMS_CONNECTION_MODE_DEFAULT; if (connModeStr == NULL) { cmsLog_error("connModeStr is NULL"); return connMode; } if (cmsUtl_strcmp(connModeStr, MDMVS_VLANMUXMODE) == 0) { connMode = CMS_CONNECTION_MODE_VLANMUX; } else if (cmsUtl_strcmp(connModeStr, MDMVS_MULTIPLESERVICEMODE) == 0) { connMode = CMS_CONNECTION_MODE_MSC; } return connMode; } #ifdef DMP_X_BROADCOM_COM_IPV6_1 /* aka SUPPORT_IPV6 */ CmsRet cmsUtl_standardizeIp6Addr(const char *address, char *stdAddr) { struct in6_addr in6Addr; UINT32 plen; char addr[BUFLEN_40]; if (address == NULL || stdAddr == NULL) { return CMSRET_INVALID_ARGUMENTS; } if (cmsUtl_parsePrefixAddress(address, addr, &plen) != CMSRET_SUCCESS) { cmsLog_error("Invalid ipv6 address=%s", address); return CMSRET_INVALID_ARGUMENTS; } if (inet_pton(AF_INET6, addr, &in6Addr) <= 0) { cmsLog_error("Invalid ipv6 address=%s", address); return CMSRET_INVALID_ARGUMENTS; } inet_ntop(AF_INET6, &in6Addr, stdAddr, BUFLEN_40); if (strchr(address, '/') != NULL) { char prefix[BUFLEN_8]; sprintf(prefix, "/%d", plen); strcat(stdAddr, prefix); } return CMSRET_SUCCESS; } /* End of cmsUtl_standardizeIp6Addr() */
CmsRet cmsNet_subnetIp6SitePrefix(const char *sp, UINT8 subnetId, UINT32 snPlen, char *snPrefix) { char prefix[CMS_IPADDR_LENGTH]; char address[CMS_IPADDR_LENGTH]; UINT32 plen; struct in6_addr in6Addr; CmsRet ret; if (snPrefix == NULL) { cmsLog_error("snPrefix is NULL."); return CMSRET_INVALID_ARGUMENTS; } *snPrefix = '\0'; if (IS_EMPTY_STRING(sp)) { cmsLog_error("sp is empty. do nothing."); return CMSRET_SUCCESS; } //<< [CTFN-IPV6-001] Sheng-Bo: Support IPv6 prefix length up to 64 and IPv6 prefix length relay, 2011/05/05 #if 0 /* set a limitation to subnet prefix length to be at 8 bit boundary */ if (snPlen % 8) { cmsLog_error("snPlen is not at 8 bit boundary. snPlen=%d", snPlen); return CMSRET_INVALID_ARGUMENTS; } #endif //>> [CTFN-IPV6-001] End if ((ret = cmsUtl_parsePrefixAddress(sp, address, &plen)) != CMSRET_SUCCESS) { cmsLog_error("cmsUtl_parsePrefixAddress returns error. ret=%d", ret); return CMSRET_INVALID_ARGUMENTS; } //<< [CTFN-IPV6-001] Sheng-Bo: Support IPv6 prefix length up to 64 and IPv6 prefix length relay, 2011/05/05 printf("@@@ plen=%d snPlen=%d subnetId=%d address=%s\n", plen, snPlen, subnetId, address);//jojopo fflush(stdout); #if 0 if ((snPlen < plen) || (subnetId >= (1<<(snPlen-plen)))) { cmsLog_error("plen=%d snPlen=%d subnetId=%d", plen, snPlen, subnetId); return CMSRET_INVALID_ARGUMENTS; } #endif //>> [CTFN-IPV6-001] End if ((ret = cmsUtl_getAddrPrefix(address, plen, prefix)) != CMSRET_SUCCESS) { cmsLog_error("cmsUtl_getAddrPrefix returns error. ret=%d", ret); return ret; } if (inet_pton(AF_INET6, prefix, &in6Addr) <= 0) { cmsLog_error("inet_pton returns error"); return CMSRET_INVALID_ARGUMENTS; } /* subnet the site prefix */ in6Addr.s6_addr[(snPlen-1)/8] |= subnetId; if (inet_ntop(AF_INET6, &in6Addr, snPrefix, CMS_IPADDR_LENGTH) == NULL) { cmsLog_error("inet_ntop returns error"); return CMSRET_INTERNAL_ERROR; } return CMSRET_SUCCESS; } /* cmsNet_subnetIp6SitePrefix() */