Le serveur DHCPv6 par défaut semble capable de transférer des données par TCP.
./dhcpv6-ia.c:118: return (a->managed_size || a->length > prefix_length);
./dhcpv6-ia.c:206: if (a->managed_sock.fd.registered) {
./dhcpv6-ia.c:207: ustream_free(&a->managed_sock.stream);
./dhcpv6-ia.c:208: close(a->managed_sock.fd.fd);
./dhcpv6-ia.c:217: free(a->managed);
./dhcpv6-ia.c:223: struct odhcpd_ipaddr *addrs = (c->managed) ? c->managed : iface->addr6;
./dhcpv6-ia.c:224: size_t addrlen = (c->managed) ? (size_t)c->managed_size : iface->addr6_len;
./dhcpv6-ia.c:230: int prefix = c->managed ? addrs.prefix : c->length;
./dhcpv6-ia.c:388: if (!(ctxt.c->flags & OAF_BOUND) || ctxt.c->managed_size < 0)
./dhcpv6-ia.c:488: if (!(ctxt.c->flags & OAF_BOUND) || ctxt.c->managed_size < 0)
./dhcpv6-ia.c:606: netlink_setup_route(&prefix, (a->managed_size) ? addrs.prefix : a->length,
./dhcpv6-ia.c:614: struct odhcpd_ipaddr *addrs = (a->managed) ? a->managed : iface->addr6;
./dhcpv6-ia.c:615: ssize_t addrlen = (a->managed) ? a->managed_size : (ssize_t)iface->addr6_len;
./dhcpv6-ia.c:645:static void managed_handle_pd_data(struct ustream *s, _unused int bytes_new)
./dhcpv6-ia.c:648: struct dhcp_assignment *c = container_of(fd, struct dhcp_assignment, managed_sock);
./dhcpv6-ia.c:650: bool first = c->managed_size < 0;
./dhcpv6-ia.c:663: c->managed_size = 0;
./dhcpv6-ia.c:672: n = realloc(c->managed, (c->managed_size + 1) * sizeof(*c->managed));
./dhcpv6-ia.c:675: c->managed = n;
./dhcpv6-ia.c:676: n = &c->managed[c->managed_size];
./dhcpv6-ia.c:705: ++c->managed_size;
./dhcpv6-ia.c:711: if (first && c->managed_size == 0)
./dhcpv6-ia.c:719:static void managed_handle_pd_done(struct ustream *s)
./dhcpv6-ia.c:722: struct dhcp_assignment *c = container_of(fd, struct dhcp_assignment, managed_sock);
./dhcpv6-ia.c:726: c->managed_size = 0;
./dhcpv6-ia.c:744: assign->managed_sock.stream.notify_read = managed_handle_pd_data;
./dhcpv6-ia.c:745: assign->managed_sock.stream.notify_state = managed_handle_pd_done;
./dhcpv6-ia.c:746: ustream_fd_init(&assign->managed_sock, fd);
./dhcpv6-ia.c:747: ustream_printf(&assign->managed_sock.stream, "%s,%x\n::/%d,0,0\n\n",
./dhcpv6-ia.c:749: ustream_write_pending(&assign->managed_sock.stream);
./dhcpv6-ia.c:750: assign->managed_size = -1;
./dhcpv6-ia.c:762: managed_handle_pd_data(&assign->managed_sock.stream, 0);
./dhcpv6-ia.c:764: if (fcntl(fd, F_GETFL) >= 0 && assign->managed_size > 0)
./dhcpv6-ia.c:924: c->managed_size)
./dhcpv6-ia.c:1054: struct odhcpd_ipaddr *addrs = (a->managed) ? a->managed : iface->addr6;
./dhcpv6-ia.c:1055: size_t addrlen = (a->managed) ? (size_t)a->managed_size : iface->addr6_len;
./dhcpv6-ia.c:1097: .prefix = (a->managed_size) ? addrs.prefix : a->length,
./dhcpv6-ia.c:1178: struct odhcpd_ipaddr *addrs = (a->managed) ? a->managed : iface->addr6;
./dhcpv6-ia.c:1179: size_t addrlen = (a->managed) ? (size_t)a->managed_size : iface->addr6_len;
./dhcpv6-ia.c:1199: ia_p->prefix == ((a->managed) ? addrs.prefix : a->length))
./dhcpv6-ia.c:1333: struct odhcpd_ipaddr *addrs = (a && a->managed) ? a->managed : iface->addr6;
./dhcpv6-ia.c:1334: size_t addrlen = (a && a->managed) ? (size_t)a->managed_size : iface->addr6_len;
./dhcpv6-ia.c:1511: if (a && a->managed_size < 0)
./dhcpv6-ia.c:1548: !a->managed_size && ++a->length <= 64);
./dhcpv6-ia.c:1565: if (a->managed_size && !assigned)
./dhcpv6-ia.c:1639: } else if (!assigned && a && a->managed_size == 0) {
./config.c:221: { .name = "managed-config", .flag = ND_RA_FLAG_MANAGED },
./odhcpd.h:230: struct odhcpd_ipaddr *managed;
./odhcpd.h:231: ssize_t managed_size;
./odhcpd.h:232: struct ustream_fd managed_sock;
C'est apparemment pour que le serveur reçoive des informations sur les préfixes et addresses. On trouve une mention obscure aux adresses transports dans le
RFC 8415.
Cela fait référence à des extensions DHCPv6. Pas le temps de lire tous les RFC.
Si quelqu'un pouvait éclairer ma petite lanterne... ?