gluon/patches/packages/openwrt/0001-radvd-update-to-1.9.8-and-add-patch-to-fix-race-condition.patch

188 lines
5.2 KiB
Diff
Raw Normal View History

2014-01-11 23:45:27 +00:00
From: Matthias Schiffer <mschiffer@universe-factory.net>
Date: Sun, 12 Jan 2014 00:42:43 +0100
Subject: radvd: update to 1.9.8 and add patch to fix race condition
diff --git a/ipv6/radvd/Makefile b/ipv6/radvd/Makefile
index 571d9de..b14c02b 100644
--- a/ipv6/radvd/Makefile
+++ b/ipv6/radvd/Makefile
@@ -8,13 +8,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=radvd
-PKG_VERSION:=1.9.1
-PKG_RELEASE:=2
+PKG_VERSION:=1.9.8
+PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://v6web.litech.org/radvd/dist \
http://download.sourcemage.org/mirror
-PKG_MD5SUM:=e807ad7e9a76d46b6133df391385cd31
+PKG_MD5SUM:=7a96a38252c3964ee18bbc1fdeae25fa
PKG_INSTALL:=1
diff --git a/ipv6/radvd/patches/100-silent-netlink-config-reload.patch b/ipv6/radvd/patches/100-silent-netlink-config-reload.patch
index 049d654..313b8cb 100644
--- a/ipv6/radvd/patches/100-silent-netlink-config-reload.patch
+++ b/ipv6/radvd/patches/100-silent-netlink-config-reload.patch
@@ -1,26 +1,26 @@
--- a/netlink.c
+++ b/netlink.c
-@@ -67,7 +67,7 @@ void process_netlink_msg(int sock)
- else {
- dlog(LOG_DEBUG, 3, "%s, ifindex %d, flags is *NOT* running", ifname, ifinfo->ifi_index);
- }
-- reload_config();
-+ reload_config(LOG_DEBUG);
- }
- }
-
+@@ -75,7 +75,7 @@ void process_netlink_msg(int sock)
+ dlog(LOG_DEBUG, 3, "%s, ifindex %d, flags is *NOT* running", ifname, ifinfo->ifi_index);
+ }
+ if (!reloaded) {
+- reload_config();
++ reload_config(LOG_DEBUG);
+ reloaded = 1;
+ }
+ }
--- a/radvd.c
+++ b/radvd.c
@@ -443,7 +443,7 @@ void main_loop(void)
- if (sighup_received)
- {
+
+ if (sighup_received) {
dlog(LOG_INFO, 3, "sig hup received.\n");
- reload_config();
+ reload_config(LOG_INFO);
sighup_received = 0;
}
-@@ -552,11 +552,11 @@ stop_adverts(void)
+@@ -545,11 +545,11 @@ void stop_adverts(void)
}
}
@@ -32,9 +32,9 @@
- flog(LOG_INFO, "attempting to reread config file");
+ flog(loglevel, "attempting to reread config file");
- iface=IfaceList;
- while(iface)
-@@ -626,7 +626,7 @@ void reload_config(void)
+ iface = IfaceList;
+ while (iface) {
+@@ -614,7 +614,7 @@ void reload_config(void)
config_interface();
kickoff_adverts();
@@ -42,10 +42,10 @@
+ flog(loglevel, "resuming normal operation");
}
- void
+ void sighup_handler(int sig)
--- a/radvd.h
+++ b/radvd.h
-@@ -185,7 +185,7 @@ int yylex(void);
+@@ -186,7 +186,7 @@ int yylex(void);
/* radvd.c */
int check_ip6_forwarding(void);
@@ -56,7 +56,7 @@
/* timer.c */
--- a/send.c
+++ b/send.c
-@@ -154,7 +154,7 @@ send_ra(struct Interface *iface, struct
+@@ -143,7 +143,7 @@ int send_ra(struct Interface *iface, str
* reload_config() will kick off new timers anyway. This avoids
* timer list corruption.
*/
diff --git a/ipv6/radvd/patches/200-handle-setup_linklocal_addr-failure.patch b/ipv6/radvd/patches/200-handle-setup_linklocal_addr-failure.patch
new file mode 100644
index 0000000..3f22f76
--- /dev/null
+++ b/ipv6/radvd/patches/200-handle-setup_linklocal_addr-failure.patch
@@ -0,0 +1,78 @@
+diff --git a/device-linux.c b/device-linux.c
+index bbf508d..054937e 100644
+--- a/device-linux.c
++++ b/device-linux.c
+@@ -141,7 +141,13 @@ int setup_linklocal_addr(struct Interface *iface)
+ }
+ }
+
+- flog(LOG_ERR, "no linklocal address configured for %s", iface->Name);
++ if (iface->IgnoreIfMissing)
++ dlog(LOG_DEBUG, 4, "no linklocal address configured for %s", iface->Name);
++ else
++ flog(LOG_ERR, "no linklocal address configured for %s", iface->Name);
++
++ iface->if_index = 0;
++
+ fclose(fp);
+ return (-1);
+ }
+diff --git a/gram.y b/gram.y
+index 9b453a1..3239848 100644
+--- a/gram.y
++++ b/gram.y
+@@ -176,19 +176,33 @@ ifacedef : ifacehead '{' ifaceparams '}' ';'
+ flog(LOG_ERR, "interface %s does not exist", iface->Name);
+ ABORT;
+ }
++
++ iface->HasFailed = 1;
+ }
+- if (update_device_info(iface) < 0)
++ if (update_device_info(iface) < 0) {
+ if (!iface->IgnoreIfMissing)
+- ABORT;
+- if (check_iface(iface) < 0)
++ ABORT;
++
++ iface->HasFailed = 1;
++ }
++ if (check_iface(iface) < 0) {
+ if (!iface->IgnoreIfMissing)
+- ABORT;
+- if (setup_linklocal_addr(iface) < 0)
++ ABORT;
++
++ iface->HasFailed = 1;
++ }
++ if (setup_linklocal_addr(iface) < 0) {
+ if (!iface->IgnoreIfMissing)
+- ABORT;
+- if (setup_allrouters_membership(iface) < 0)
++ ABORT;
++
++ iface->HasFailed = 1;
++ }
++ if (setup_allrouters_membership(iface) < 0) {
+ if (!iface->IgnoreIfMissing)
+- ABORT;
++ ABORT;
++
++ iface->HasFailed = 1;
++ }
+
+ dlog(LOG_DEBUG, 4, "interface definition for %s is ok", iface->Name);
+
+diff --git a/send.c b/send.c
+index 0d7ed5b..d6a3da2 100644
+--- a/send.c
++++ b/send.c
+@@ -124,7 +124,7 @@ int send_ra(struct Interface *iface, struct in6_addr *dest)
+ update_device_info(iface);
+
+ /* First we need to check that the interface hasn't been removed or deactivated */
+- if (check_device(iface) < 0) {
++ if (check_device(iface) < 0 || (iface->if_index == 0 && setup_linklocal_addr(iface) < 0)) {
+ if (iface->IgnoreIfMissing) /* a bit more quiet warning message.. */
+ dlog(LOG_DEBUG, 4, "interface %s does not exist, ignoring the interface", iface->Name);
+ else {