+ if (!ipv6cp_protent.enabled_flag)
+ return;
+
+ /*
+ * Persistent link-local id is only used when user has not explicitly
+ * configure/hard-code the id
+ */
+ if ((wo->use_persistent) && (!wo->opt_local)) {
+
+ /*
+ * On systems where there are no Ethernet interfaces used, there
+ * may be other ways to obtain a persistent id. Right now, it
+ * will fall back to using magic [see eui64_magic] below when
+ * an EUI-48 from MAC address can't be obtained. Other possibilities
+ * include obtaining EEPROM serial numbers, or some other unique
+ * yet persistent number. On Sparc platforms, this is possible,
+ * but too bad there's no standards yet for x86 machines.
+ */
+ if (ether_to_eui64(&wo->ourid)) {
+ wo->opt_local = 1;
+ }
+ }
+
+ if (!wo->opt_remote && wo->use_remotenumber && *remote_number) {
+ /* remote number can be either MAC address, IPv4 address, IPv6 address or telephone number */
+ struct in_addr addr;
+ struct in6_addr addr6;
+ unsigned long long tel;
+ unsigned char mac[6];
+ const char *str;
+ char *endptr;
+ if (sscanf(remote_number, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
+ &mac[0], &mac[1], &mac[2],
+ &mac[3], &mac[4], &mac[5]) == 6) {
+ eui48_to_eui64(&wo->hisid, mac);
+ } else if (inet_pton(AF_INET, remote_number, &addr) == 1) {
+ eui64_setlo32(wo->hisid, ntohl(addr.s_addr));
+ } else if (inet_pton(AF_INET6, remote_number, &addr6) == 1) {
+ /* use low 64 bits of IPv6 address for interface identifier */
+ wo->hisid.e8[0] = addr6.s6_addr[8];
+ wo->hisid.e8[1] = addr6.s6_addr[9];
+ wo->hisid.e8[2] = addr6.s6_addr[10];
+ wo->hisid.e8[3] = addr6.s6_addr[11];
+ wo->hisid.e8[4] = addr6.s6_addr[12];
+ wo->hisid.e8[5] = addr6.s6_addr[13];
+ wo->hisid.e8[6] = addr6.s6_addr[14];
+ wo->hisid.e8[7] = addr6.s6_addr[15];
+ } else {
+ str = remote_number;
+ /* telephone number may start with leading '+' sign, so skip it */
+ if (str[0] == '+')
+ str++;
+ errno = 0;
+ tel = strtoull(str, &endptr, 10);
+ if (!errno && *str && !*endptr && tel) {
+ wo->hisid.e32[0] = htonl(tel >> 32);
+ wo->hisid.e32[1] = htonl(tel & 0xFFFFFFFF);
+ }
+ }
+ if (!eui64_iszero(wo->hisid))
+ wo->opt_remote = 1;
+ }
+