32.3 C
Colombia
lunes, julio 7, 2025

MACOS: la asignación de direcciones IPv6 en el error de la memoria de los lanzamientos EN0 no puede asignar la memoria después de múltiples adiciones


Estaba ejecutando un servicio que asignaba una IPv6 de la dirección native (ULA) a mi en0 interfaz. Inicialmente, pude agregar múltiples direcciones IPv6 sin ningún problema. Sin embargo, después de agregar 18 direcciones IPv6, encontré el siguiente error:

ifconfig: ioctl (SIOCAIFADDR): Can't allocate reminiscence

Incluso cuando traté manualmente de asignar otra dirección IPv6 usando:

sudo ifconfig en0 inet6 fc00:45bd::81aa:15c6 prefixlen 64 alias

Continué recibiendo el mismo error. Este error persistió hasta que eliminé algunas de las direcciones IPv6 asignadas previamente. Esencialmente, la 17ª dirección IPv6 se agregó sin ningún problema, pero el error comenzó a aparecer al intentar agregar la 18.

Al principio, sospeché que la detección de direcciones duplicadas (DAD) podría estar causando el problema. Revisé la configuración de mi papá cuando ya se asignaron 18 direcciones IPv6 usando:

sysctl -a | grep dad

Los valores iniciales fueron:

web.inet6.ip6.dad_count: 1
web.inet6.ip6.dad_enhanced: 1
web.inet6.ip6.nd6_dad_nonce_max_count: 3
web.inet6.icmp6.nd6_optimistic_dad: 63

Para investigar más a fondo, ejecuté el siguiente comando:

/usr/bin/sudo ifconfig en0 inet6 add fc00:2703::53eb:6d0a; whereas sleep 0.001; do ifconfig en0 | grep net6 | cat -n | grep fc00:2703::53eb:6d0a; carried out

Inicialmente, regresó:

ifconfig: ioctl (SIOCAIFADDR): Can't allocate reminiscence
  1302      inet6 fc00:2703::53eb:6d0a prefixlen 64 tentative 
  1302      inet6 fc00:2703::53eb:6d0a prefixlen 64 tentative 
.....
  1302      inet6 fc00:2703::53eb:6d0a prefixlen 64 tentative 
  1302      inet6 fc00:2703::53eb:6d0a prefixlen 64 
  1302      inet6 fc00:2703::53eb:6d0a prefixlen 64 
.....
  1302      inet6 fc00:2703::53eb:6d0a prefixlen 64 
  1302      inet6 fc00:2703::53eb:6d0a prefixlen 64 

Después de un tiempo, la dirección se asignó completamente sin el estado “tentativo”.

Luego discapacé a papá configurando:

web.inet6.ip6.dad_count: 0
web.inet6.ip6.dad_enhanced: 0
web.inet6.ip6.nd6_dad_nonce_max_count: 0
web.inet6.icmp6.nd6_optimistic_dad: 0

A pesar de deshabilitar a papá, todavía me encontré con el error de “no puedo asignar memoria” al intentar agregar otra dirección IPv6:

/usr/bin/sudo ifconfig en0 inet6 add fc00:3940::7013:336d; whereas sleep 0.001; do ifconfig en0 | grep net6 | cat -n | grep fc00:3940::7013:336d; carried out

La salida fue:

ifconfig: ioctl (SIOCAIFADDR): Can't allocate reminiscence
  1303      inet6 fc00:3940::7013:336d prefixlen 64 
  1303      inet6 fc00:3940::7013:336d prefixlen 64 
....
  1303      inet6 fc00:3940::7013:336d prefixlen 64 

La dirección se enumeró en la configuración de la interfaz, pero aún así resultó en el mismo error.

Para probar aún más este comportamiento, ejecuté el siguiente programa mínimo de Go que intenta agregar múltiples direcciones IPv6 a mi en0 interfaz:

bundle important

import (
    "crypto/sha256"
    "fmt"
    "math/massive"
    "math/rand"
    "web/netip"
    "os/exec"
)

func important() {
    i := 0
    for {
        i++
        //command := exec.Command("sudo", "ifconfig", "en0", "inet6", GenerateIPv6Address().String(), "prefixlen", "64", "alias")
        command := exec.Command("sudo", "ifconfig", "en0", "inet6", "add", GenerateIPv6Address().String())
        out, err := command.CombinedOutput()

        if err != nil {
            fmt.Println("u001B[33m", i, command.String(), "u001B[0m")
            fmt.Println(fmt.Errorf(err.Error()))
            fmt.Println("u001B[31m" + string(out) + "u001B[0m")
            break
        } else {
            fmt.Println("u001B[32m", i, command.String()+"u001B[0m")
            fmt.Println(string(out))
        }
    }
}

func GenerateIPv6Address() netip.Addr {
    seedBytes := make([]byte, 8)
    _, err := rand.Learn(seedBytes)
    if err != nil {
        return netip.Addr{}
    }

    hash := sha256.Sum256(seedBytes)
    seedValue := new(massive.Int).SetBytes(hash[:8])

    randInt := seedValue.Uint64()
    group2 := randInt % 65534
    group3 := (randInt >> 16) % 65534
    group4 := (randInt >> 32) % 65534

    ipStr := fmt.Sprintf("fc00:%x::%x:%x", group2, group3, group4)

    if ip, err := netip.ParseAddr(ipStr); err == nil {
        return ip
    }

    return netip.Addr{}
}

Estoy tratando de entender qué podría estar causando este problema y si hay un límite en el número de direcciones IPv6 que se pueden asignar a mi en0 interfaz.

¿Podría esto deberse a un núcleo interno o límite del sistema en el número de direcciones IPv6 por interfaz?

¿Hay alguna forma de aumentar este límite, o está codificado dentro de MacOS?

¿Hay registros o herramientas de diagnóstico que puedan proporcionar más información sobre por qué el sistema se niega a asignar más direcciones?

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles