# HG changeset patch # User gthomas # Date 1027695998 0 # Node ID d364b93024e5ba12a2ad7099453d616b98e74418 # Parent 8ec2d05eea5d4decaaf90a006e8bed057daf6d20 From Red Hat - fix problem with IPv6 when using DHCP. diff --git a/packages/net/common/current/ChangeLog b/packages/net/common/current/ChangeLog --- a/packages/net/common/current/ChangeLog +++ b/packages/net/common/current/ChangeLog @@ -1,3 +1,12 @@ +2002-07-26 Gary Thomas +2002-07-26 Ken Cox + + * src/dhcp_prot.c: The IPv6 link local address would not be + recognized if configured to use dhcp. When dhcp reconfigures + the interface after obtaining it's info, it needs to delete + the IPv6 link local address (as well as the IPv4) address before + reconfiguring. + 2002-07-10 Gary Thomas * src/inet_addr.c: diff --git a/packages/net/common/current/src/dhcp_prot.c b/packages/net/common/current/src/dhcp_prot.c --- a/packages/net/common/current/src/dhcp_prot.c +++ b/packages/net/common/current/src/dhcp_prot.c @@ -42,6 +42,11 @@ #include +#ifdef INET6 +#include +#include +#endif + // ------------------------------------------------------------------------ // Returns a pointer to the end of dhcp message (or NULL if invalid) // meaning the address of the byte *after* the TAG_END token in the vendor @@ -1272,6 +1277,30 @@ do_dhcp_down_net(const char *intf, struc perror("SIOCDIFADDR1"); } +#ifdef INET6 + { + int s6; + + s6 = socket(AF_INET6, SOCK_DGRAM, 0); + if (s6 < 0) { + perror("socket AF_INET6"); + return false; + } + // Now delete the ipv6 addr + strcpy(ifr.ifr_name, intf); + if (ioctl(s6, SIOCGLIFADDR, &ifr)) { + perror("SIOCGIFADDR_IN6 1"); + return false; + } + + strcpy(ifr.ifr_name, intf); + if (ioctl(s6, SIOCDLIFADDR, &ifr)) { /* delete IF addr */ + perror("SIOCDIFADDR_IN61"); + } + close(s6); + } +#endif /* IP6 */ + // Shut down interface so it can be reinitialized ifr.ifr_flags &= ~(IFF_UP | IFF_RUNNING); if (ioctl(s, SIOCSIFFLAGS, &ifr)) { /* set ifnet flags */