On Wed, Dec 14, 2022 at 8:55 AM Nicolas Cavallari
<[email protected]> wrote:
>
> On 14/12/2022 00:47, Denys Vlasenko wrote:
> > On Tue, Dec 13, 2022 at 4:58 PM John Lemonovich
> > <[email protected]> wrote:
> >>
> >> Thanks for the replies. Yes David, it's also my understanding per the
> >> spec, that the client's link-local address must be included for the
> >> solicit message.
> >
> > Where does it say that in https://www.rfc-editor.org/rfc/rfc3315 ?
>
> 1.1. Protocols and Addressing
>
> Clients and servers exchange DHCP messages using UDP [15]. The
> client uses a link-local address or addresses determined through
> other mechanisms for transmitting and receiving DHCP messages.
>
> Also, RFC 3315 is obsoleted by RFC 8415, but the wording is the same in
> section 5.
Looking at the code.
d6_send_raw_packet_from_client_data_ifindex() fills in
source address like this:
d6_send_raw_packet_from_client_data_ifindex(
packet, (end - (uint8_t*) packet),
/*src*/ &client6_data.ll_ip6, CLIENT_PORT6,
... &client6_data.ll_ip6 is passed as "src_ipv6" parameter into it, and...
if (src_ipv6)
packet.ip6.ip6_src = *src_ipv6; /* struct copy */
it is used as above.
client6_data.ll_ip6 is populated by periodic calls to
d6_read_interface(...&client6_data.ll_ip6,...)
which looks at all addresses and should be finding
our link-local address, if it exists:
int FAST_FUNC d6_read_interface(
const char *interface,
int *ifindex,
struct in6_addr *nip6,
uint8_t *mac)
...
getifaddrs(&ifap);
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
struct sockaddr_in6 *sip6;
if (!ifa->ifa_addr || (strcmp(ifa->ifa_name, interface) != 0))
continue;
...
sip6 = (void*)(ifa->ifa_addr);
if (ifa->ifa_addr->sa_family == AF_INET6
&& IN6_IS_ADDR_LINKLOCAL(&sip6->sin6_addr)
) {
*nip6 = sip6->sin6_addr; /* struct copy */
log1(
"IPv6
%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",
nip6->s6_addr[0], nip6->s6_addr[1],
nip6->s6_addr[2], nip6->s6_addr[3],
nip6->s6_addr[4], nip6->s6_addr[5],
nip6->s6_addr[6], nip6->s6_addr[7],
nip6->s6_addr[8], nip6->s6_addr[9],
nip6->s6_addr[10], nip6->s6_addr[11],
nip6->s6_addr[12], nip6->s6_addr[13],
nip6->s6_addr[14], nip6->s6_addr[15]
);
retval &= (3 - (1<<1));
}
Do you reach this code? You can know it if you
enabled logging at least to level 1 (udhcpc6 -v) and you see
"IPv6 xx:xx:xx:...:xx" message.
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox