[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    Re: udhcpc6 kernel listen mode is broken
From:       Danomi Manchego <danomimanchego123 () gmail ! com>
Date:       2022-08-05 23:15:57
Message-ID: CANxTyt55YcF--0j6beDwD8qm8NaGxTAWxeSu=kqSvD7h0nLjxg () mail ! gmail ! com
[Download RAW message or body]

Yes, these changes work - they match what I patched locally.  Thanks
for getting back to this.

On Tue, Aug 2, 2022 at 9:35 AM Denys Vlasenko <vda.linux@googlemail.com> wrote:
>
> Fixed, thank you. Can you try current git?
>
> On Sat, Jun 4, 2022 at 2:58 AM Danomi Manchego
> <danomimanchego123@gmail.com> wrote:
> >
> > Sorry all, I did not realize that there was a function called
> > d6_listen_socket() in d6_socket.c - so no new function is needed to
> > fix DHCPv6 Renew reply processing.  The correct message ID is needed
> > and use of d6_listen_socket() rather than udhcp_listen_socket().
> >
> > Regards,
> > Danomi -
> >
> > On Tue, May 10, 2022 at 9:34 PM Danomi Manchego
> > <danomimanchego123@gmail.com> wrote:
> > >
> > > Hello,
> > >
> > > On April 1, I sent "udhcpc6 renew message copy/paste error" email
> > > about udhcpc6 sends the wrong message ID for Renew message due to
> > > copy/paste error from IPv4 dhcpc.c.  (Was DHCPREQUEST, should be
> > > D6_MSG_RENEW.)  After fixing that, I found that the Renew is sent
> > > correctly, and the DHCPv6 server replies, but udhcpc6 fails to get the
> > > reply.  Because there is no reply, the lease does not get extended by
> > > Renew.  I found that the issue is that the udhcp_listen_socket() in
> > > socket.c (used for kernel listen mode in d6_dhcpc.c) is somewhat
> > > hard-coded for IPv4.  I was able to get kernel listen mode to work by
> > > adding a new function like this to socket.c and using it in d6_dhcp.c.
> > > My udhcp6_listen_socket() differs from udhcp_listen_socket() as
> > > follows:
> > >
> > > * Use PF_INET6 instead of PF_INET.
> > >
> > > * Set IPPROTO_IPV6 / IPV6_V6ONLY socket option rather than broadcast option.
> > >
> > > * Use `struct sockaddr_in6` instead of `struct sockaddr_in`.
> > >
> > > * Use AF_INET6 instead of AF_INET.
> > >
> > > (Maybe SOCK_CLOEXEC should also be set in *both* functions when
> > > calling xsocket since udhcpc/udhcpc6 invoke external udhcpc.script,
> > > but I did not try it.)
> > >
> > > My function is pasted below.
> > >
> > > int FAST_FUNC udhcp6_listen_socket(/*uint32_t ip,*/ int port, const char *inf)
> > > {
> > >     int fd;
> > >     struct sockaddr_in6 addr;
> > >     char *colon;
> > >
> > >     log2("opening listen socket on *:%d %s", port, inf);
> > >     fd = xsocket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
> > >
> > >     setsockopt_reuseaddr(fd);
> > >
> > >     if (setsockopt_1(fd, IPPROTO_IPV6, IPV6_V6ONLY) < 0)
> > >         bb_simple_perror_msg_and_die("IPPROTO_IPV6");
> > >
> > >     /* SO_BINDTODEVICE doesn't work on ethernet aliases (ethN:M) */
> > >     colon = strrchr(inf, ':');
> > >     if (colon)
> > >         *colon = '\0';
> > >
> > >     if (setsockopt_bindtodevice(fd, inf))
> > >         xfunc_die(); /* warning is already printed */
> > >
> > >     if (colon)
> > >         *colon = ':';
> > >
> > >     memset(&addr, 0, sizeof(addr));
> > >     addr.sin6_family = AF_INET6;
> > >     addr.sin6_port = htons(port);
> > >     /* addr.sin_addr.s_addr = ip; - all-zeros is INADDR_ANY */
> > >     xbind(fd, (struct sockaddr *)&addr, sizeof(addr));
> > >
> > >     return fd;
> > > }
> > >
> > > Regards,
> > > Danomi -
> > _______________________________________________
> > busybox mailing list
> > busybox@busybox.net
> > http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic