[radvd-devel-l] [PATCH 2/2] RADVD: Setup Inteface Variables
YOSHIFUJI Hideaki / 吉藤英明
yoshfuji at linux-ipv6.org
Thu Dec 22 11:36:35 EST 2005
Hello.
Set up our own interface variables (LinkMTU, CurrentHopLimit,
BaseReachableTime and RetransTimer) as well.
This is required to pass the IPv6 Ready Logo Phase-2
IPv6 Core Protocols Self Test.
Related Test: Phase-2 Router ND #109
Index: device-bsd44.c
===================================================================
RCS file: /work/cvsroot/radvd/device-bsd44.c,v
retrieving revision 1.18
diff -u -r1.18 device-bsd44.c
--- device-bsd44.c 1 Dec 2005 06:32:23 -0000 1.18
+++ device-bsd44.c 22 Dec 2005 13:37:59 -0000
@@ -255,3 +255,34 @@
return 0;
}
+
+int
+set_interface_linkmtu(const char *iface, uint32_t mtu)
+{
+ dlog(LOG_DEBUG, 4, "cannot set LinkMTU (%u) for %s",
+ (unsigned int)mtu, iface");
+ return -1;
+}
+
+int
+set_interface_curhlim(const char *iface, uint8_t hlim)
+{
+ dlog(LOG_DEBUG, 4, "cannot set CurHopLimit (%u) for %s",
+ (unsigned int)hlim, iface");
+ return -1;
+}
+
+set_interface_reachtime(const char *iface, uint32_t rtime)
+{
+ dlog(LOG_DEBUG, 4, "cannot set BaseReachableTime (%u) for %s",
+ (unsigned int)rtime, iface");
+ return -1;
+}
+
+set_interface_retranstimer(const char *iface, uint32_t rettimer)
+{
+ dlog(LOG_DEBUG, 4, "cannot set RetransTimer (%u) for %s",
+ (unsigned int)rettimer, iface");
+ return -1;
+}
+
Index: device-linux.c
===================================================================
RCS file: /work/cvsroot/radvd/device-linux.c,v
retrieving revision 1.16
diff -u -r1.16 device-linux.c
--- device-linux.c 28 Oct 2005 14:29:49 -0000 1.16
+++ device-linux.c 22 Dec 2005 13:38:00 -0000
@@ -258,3 +258,74 @@
return 0;
}
+
+static int
+set_interface_var(const char *iface,
+ const char *var, const char *name,
+ uint32_t val)
+{
+ FILE *fp;
+ char spath[64+IF_NAMESIZE];
+ sprintf(spath, var, iface);
+
+ fp = fopen(spath, "w");
+ if (!fp) {
+ if (name)
+ flog(LOG_ERR, "failed to set %s (%u) for %s",
+ name, (unsigned int)val, iface);
+ return -1;
+ }
+ fprintf(fp, "%u", (unsigned int)val);
+ fclose(fp);
+
+ return 0;
+}
+
+int
+set_interface_linkmtu(const char *iface, uint32_t mtu)
+{
+ return set_interface_var(iface,
+ PROC_SYS_IP6_LINKMTU, "LinkMTU",
+ mtu);
+}
+
+int
+set_interface_curhlim(const char *iface, uint8_t hlim)
+{
+ return set_interface_var(iface,
+ PROC_SYS_IP6_CURHLIM, "CurHopLimit",
+ hlim);
+}
+
+int
+set_interface_reachtime(const char *iface, uint32_t rtime)
+{
+ int ret;
+ ret = set_interface_var(iface,
+ PROC_SYS_IP6_BASEREACHTIME_MS,
+ NULL,
+ rtime);
+ if (ret)
+ ret = set_interface_var(iface,
+ PROC_SYS_IP6_BASEREACHTIME,
+ "BaseReachableTimer",
+ rtime / 1000);
+ return ret;
+}
+
+int
+set_interface_retranstimer(const char *iface, uint32_t rettimer)
+{
+ int ret;
+ ret = set_interface_var(iface,
+ PROC_SYS_IP6_RETRANSTIMER_MS,
+ NULL,
+ rettimer);
+ if (ret)
+ ret = set_interface_var(iface,
+ PROC_SYS_IP6_RETRANSTIMER,
+ "RetransTimer",
+ rettimer / 1000);
+ return ret;
+}
+
Index: pathnames.h
===================================================================
RCS file: /work/cvsroot/radvd/pathnames.h,v
retrieving revision 1.6
diff -u -r1.6 pathnames.h
--- pathnames.h 18 Oct 2005 19:17:29 -0000 1.6
+++ pathnames.h 22 Dec 2005 13:38:00 -0000
@@ -35,6 +35,12 @@
#ifdef __linux__
#define SYSCTL_IP6_FORWARDING CTL_NET, NET_IPV6, NET_IPV6_CONF, NET_PROTO_CONF_ALL, NET_IPV6_FORWARDING
#define PROC_SYS_IP6_FORWARDING "/proc/sys/net/ipv6/conf/all/forwarding"
+#define PROC_SYS_IP6_LINKMTU "/proc/sys/net/ipv6/conf/%s/mtu"
+#define PROC_SYS_IP6_CURHLIM "/proc/sys/net/ipv6/conf/%s/hop_limit"
+#define PROC_SYS_IP6_BASEREACHTIME_MS "/proc/sys/net/ipv6/neigh/%s/base_reachable_time_ms"
+#define PROC_SYS_IP6_BASEREACHTIME "/proc/sys/net/ipv6/neigh/%s/base_reachable_time"
+#define PROC_SYS_IP6_RETRANSTIMER_MS "/proc/sys/net/ipv6/neigh/%s/retrans_time_ms"
+#define PROC_SYS_IP6_RETRANSTIMER "/proc/sys/net/ipv6/neigh/%s/retrans_time"
#else /* BSD */
#define SYSCTL_IP6_FORWARDING CTL_NET, PF_INET6, IPPROTO_IPV6, IPV6CTL_FORWARDING
#endif
Index: radvd.c
===================================================================
RCS file: /work/cvsroot/radvd/radvd.c,v
retrieving revision 1.23
diff -u -r1.23 radvd.c
--- radvd.c 18 Oct 2005 19:17:29 -0000 1.23
+++ radvd.c 22 Dec 2005 13:38:00 -0000
@@ -55,6 +55,7 @@
void sigterm_handler(int sig);
void sigint_handler(int sig);
void timer_handler(void *data);
+void config_interface(void);
void kickoff_adverts(void);
void stop_adverts(void);
void reload_config(void);
@@ -258,6 +259,7 @@
close(fd);
+ config_interface();
kickoff_adverts();
/* enter loop */
@@ -304,6 +306,23 @@
}
void
+config_interface(void)
+{
+ struct Interface *iface;
+ for(iface=IfaceList; iface; iface=iface->next)
+ {
+ if (iface->AdvLinkMTU)
+ set_interface_linkmtu(iface->Name, iface->AdvLinkMTU);
+ if (iface->AdvCurHopLimit)
+ set_interface_curhlim(iface->Name, iface->AdvCurHopLimit);
+ if (iface->AdvReachableTime)
+ set_interface_reachtime(iface->Name, iface->AdvReachableTime);
+ if (iface->AdvRetransTimer)
+ set_interface_retranstimer(iface->Name, iface->AdvRetransTimer);
+ }
+}
+
+void
kickoff_adverts(void)
{
struct Interface *iface;
@@ -406,6 +425,7 @@
if (readin_config(conf_file) < 0)
exit(1);
+ config_interface();
kickoff_adverts();
flog(LOG_INFO, "resuming normal operation");
More information about the radvd-devel-l
mailing list