From 16cc9a0d892e5f972cc595c328633165be13e87a Mon Sep 17 00:00:00 2001 From: lemmi Date: Sat, 24 Jun 2023 07:39:24 +0200 Subject: [PATCH] dhcpcd: fix dhcpv6-pd for pppoe --- ...-Improve-learning-IPv6-address-flags.patch | 62 +++++++++++++++++++ srcpkgs/dhcpcd/template | 2 +- 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 srcpkgs/dhcpcd/patches/Linux-Improve-learning-IPv6-address-flags.patch diff --git a/srcpkgs/dhcpcd/patches/Linux-Improve-learning-IPv6-address-flags.patch b/srcpkgs/dhcpcd/patches/Linux-Improve-learning-IPv6-address-flags.patch new file mode 100644 index 000000000000..5fceb5e4f3d5 --- /dev/null +++ b/srcpkgs/dhcpcd/patches/Linux-Improve-learning-IPv6-address-flags.patch @@ -0,0 +1,62 @@ +From 45e441ada6d3ea4355d623cf12d9a559a5c2afde Mon Sep 17 00:00:00 2001 +From: Roy Marples +Date: Tue, 23 May 2023 22:14:57 +0100 +Subject: [PATCH] Linux: Improve learning IPv6 address flags + +Rather than matching addresses during netlink message processing, +extract the local, address and flag parts. +Once done, then match local and address to the address we are +looking for and if equal apply the flags. + +Fixes #201 and maybe #149. +--- + src/if-linux.c | 24 +++++++++++++++++------- + 1 file changed, 17 insertions(+), 7 deletions(-) + +diff --git a/src/if-linux.c b/src/if-linux.c +index f2f609ed..212ed5df 100644 +--- a/src/if-linux.c ++++ b/src/if-linux.c +@@ -1996,7 +1996,8 @@ _if_addrflags6(__unused struct dhcpcd_ctx *ctx, + size_t len; + struct rtattr *rta; + struct ifaddrmsg *ifa; +- bool matches_addr = false; ++ struct in6_addr *local = NULL, *address = NULL; ++ uint32_t *flags = NULL; + + ifa = NLMSG_DATA(nlm); + if (ifa->ifa_index != ia->ifa_ifindex || ifa->ifa_family != AF_INET6) +@@ -2007,17 +2008,26 @@ _if_addrflags6(__unused struct dhcpcd_ctx *ctx, + for (; RTA_OK(rta, len); rta = RTA_NEXT(rta, len)) { + switch (rta->rta_type) { + case IFA_ADDRESS: +- if (IN6_ARE_ADDR_EQUAL(&ia->ifa_addr, (struct in6_addr *)RTA_DATA(rta))) +- ia->ifa_found = matches_addr = true; +- else +- matches_addr = false; ++ address = (struct in6_addr *)RTA_DATA(rta); ++ break; ++ case IFA_LOCAL: ++ local = (struct in6_addr *)RTA_DATA(rta); + break; + case IFA_FLAGS: +- if (matches_addr) +- memcpy(&ia->ifa_flags, RTA_DATA(rta), sizeof(ia->ifa_flags)); ++ flags = (uint32_t *)RTA_DATA(rta); + break; + } + } ++ ++ if (local) { ++ if (IN6_ARE_ADDR_EQUAL(&ia->ifa_addr, local)) ++ ia->ifa_found = true; ++ } else if (address) { ++ if (IN6_ARE_ADDR_EQUAL(&ia->ifa_addr, address)) ++ ia->ifa_found = true; ++ } ++ if (flags && ia->ifa_found) ++ memcpy(&ia->ifa_flags, flags, sizeof(ia->ifa_flags)); + return 0; + } + diff --git a/srcpkgs/dhcpcd/template b/srcpkgs/dhcpcd/template index b30bb7c24af4..09a30b9a3c8a 100644 --- a/srcpkgs/dhcpcd/template +++ b/srcpkgs/dhcpcd/template @@ -1,7 +1,7 @@ # Template file for 'dhcpcd' pkgname=dhcpcd version=10.0.1 -revision=1 +revision=2 build_style=configure make_check_target=test configure_args="