From 3b43646a08928e54ba16b1b7791de83b79260072 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Fri, 28 Dec 2012 11:55:45 +0000 Subject: [PATCH] Use /proc/sys/net/ipv6/conf//mtu for RA advertised MTU. --- src/radv.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/radv.c b/src/radv.c index 668d56f..648568a 100644 --- a/src/radv.c +++ b/src/radv.c @@ -193,7 +193,10 @@ static void send_ra(time_t now, int iface, char *iface_name, struct in6_addr *de struct dhcp_netid iface_id; struct dhcp_opt *opt_cfg; int done_dns = 0; - +#ifdef HAVE_LINUX_NETWORK + FILE *f; +#endif + save_counter(0); ra = expand(sizeof(struct ra_packet)); @@ -230,14 +233,23 @@ static void send_ra(time_t now, int iface, char *iface_name, struct in6_addr *de return; strncpy(ifr.ifr_name, iface_name, IF_NAMESIZE); - - if (ioctl(daemon->icmp6fd, SIOCGIFMTU, &ifr) != -1) + +#ifdef HAVE_LINUX_NETWORK + /* Note that IPv6 MTU is not necessarilly the same as the IPv4 MTU + available from SIOCGIFMTU */ + sprintf(daemon->namebuff, "/proc/sys/net/ipv6/conf/%s/mtu", iface_name); + if ((f = fopen(daemon->namebuff, "r"))) { - put_opt6_char(ICMP6_OPT_MTU); - put_opt6_char(1); - put_opt6_short(0); - put_opt6_long(ifr.ifr_mtu); + if (fgets(daemon->namebuff, MAXDNAME, f)) + { + put_opt6_char(ICMP6_OPT_MTU); + put_opt6_char(1); + put_opt6_short(0); + put_opt6_long(atoi(daemon->namebuff)); + } + fclose(f); } +#endif iface_enumerate(AF_LOCAL, &iface, add_lla);