static bool modifyAddress(JNIEnv *env, jobject thiz, jstring jName, jstring jAddress, jint jPrefixLength, bool add) { int error = SYSTEM_ERROR; const char *name = jName ? env->GetStringUTFChars(jName, NULL) : NULL; const char *address = jAddress ? env->GetStringUTFChars(jAddress, NULL) : NULL; if (!name) { jniThrowNullPointerException(env, "name"); } else if (!address) { jniThrowNullPointerException(env, "address"); } else { if (add) { if (error = ifc_add_address(name, address, jPrefixLength)) { ALOGE("Cannot add address %s/%d on interface %s (%s)", address, jPrefixLength, name, strerror(-error)); } } else { if (error = ifc_del_address(name, address, jPrefixLength)) { ALOGE("Cannot del address %s/%d on interface %s (%s)", address, jPrefixLength, name, strerror(-error)); } } } if (name) { env->ReleaseStringUTFChars(jName, name); } if (address) { env->ReleaseStringUTFChars(jAddress, address); } return !error; }
/* * Clears IPv6 addresses on the specified interface. */ int ifc_clear_ipv6_addresses(const char *name) { char rawaddrstr[INET6_ADDRSTRLEN], addrstr[INET6_ADDRSTRLEN]; unsigned int prefixlen; int lasterror = 0, i, j, ret; char ifname[64]; // Currently, IFNAMSIZ = 16. FILE *f = fopen("/proc/net/if_inet6", "r"); if (!f) { return -errno; } // Format: // 20010db8000a0001fc446aa4b5b347ed 03 40 00 01 wlan0 while (fscanf(f, "%32s %*02x %02x %*02x %*02x %63s\n", rawaddrstr, &prefixlen, ifname) == 3) { // Is this the interface we're looking for? if (strcmp(name, ifname)) { continue; } // Put the colons back into the address. for (i = 0, j = 0; i < 32; i++, j++) { addrstr[j] = rawaddrstr[i]; if (i % 4 == 3) { addrstr[++j] = ':'; } } addrstr[j - 1] = '\0'; // Don't delete the link-local address as well, or it will disable IPv6 // on the interface. if (strncmp(addrstr, "fe80:", 5) == 0) { continue; } ret = ifc_del_address(ifname, addrstr, prefixlen); if (ret) { ALOGE("Deleting address %s/%d on %s: %s", addrstr, prefixlen, ifname, strerror(-ret)); lasterror = ret; } } fclose(f); ALOGD("ifc_clear_ipv6_addresses return %d", lasterror); return lasterror; }