Commit 005c46d6 authored by David Flamand's avatar David Flamand Committed by Simon Kelley

Add mtu facility to --ra-param.

parent 503c6091
...@@ -85,6 +85,9 @@ version 2.77 ...@@ -85,6 +85,9 @@ version 2.77
Add --dhcp-reply-delay option. Thanks to Floris Bos Add --dhcp-reply-delay option. Thanks to Floris Bos
for the patch. for the patch.
Add mtu setting facility to --ra-param. Thanks to David
Flamand for the patch.
version 2.76 version 2.76
......
...@@ -1776,7 +1776,7 @@ the relevant link-local address of the machine running dnsmasq is sent ...@@ -1776,7 +1776,7 @@ the relevant link-local address of the machine running dnsmasq is sent
as recursive DNS server. If provided, the DHCPv6 options dns-server and as recursive DNS server. If provided, the DHCPv6 options dns-server and
domain-search are used for the DNS server (RDNSS) and the domain search list (DNSSL). domain-search are used for the DNS server (RDNSS) and the domain search list (DNSSL).
.TP .TP
.B --ra-param=<interface>,[high|low],[[<ra-interval>],<router lifetime>] .B --ra-param=<interface>,[mtu:<integer>|off,][high,|low,]<ra-interval>[,<router lifetime>]
Set non-default values for router advertisements sent via an Set non-default values for router advertisements sent via an
interface. The priority field for the router may be altered from the interface. The priority field for the router may be altered from the
default of medium with eg default of medium with eg
...@@ -1786,8 +1786,8 @@ The interval between router advertisements may be set (in seconds) with ...@@ -1786,8 +1786,8 @@ The interval between router advertisements may be set (in seconds) with
The lifetime of the route may be changed or set to zero, which allows The lifetime of the route may be changed or set to zero, which allows
a router to advertise prefixes but not a route via itself. a router to advertise prefixes but not a route via itself.
.B --ra-parm=eth0,0,0 .B --ra-parm=eth0,0,0
(A value of zero for the interval means the default value.) All three parameters may be set at once. (A value of zero for the interval means the default value.) All four parameters may be set at once.
.B --ra-param=low,60,1200 .B --ra-param=eth0,mtu:1280,low,60,1200
The interface field may include a wildcard. The interface field may include a wildcard.
.TP .TP
.B --dhcp-reply-delay=[tag:<tag>,]<integer> .B --dhcp-reply-delay=[tag:<tag>,]<integer>
......
...@@ -1756,20 +1756,20 @@ dnsmasq est spécifiée comme DNS récursif. Si elles sont fournies, les ...@@ -1756,20 +1756,20 @@ dnsmasq est spécifiée comme DNS récursif. Si elles sont fournies, les
options dns-server et domain-search sont utilisées respectivement pour RDNSS et options dns-server et domain-search sont utilisées respectivement pour RDNSS et
DNSSL. DNSSL.
.TP .TP
.B --ra-param=<interface>,[high|low],[[<intervalle d'annonce routeur>],<durée de vie route>] .B --ra-param=<interface>,[mtu:<valeur>|off,][high,|low,]<intervalle d'annonce routeur>[,<durée de vie route>]
Configure pour une interface donnée des valeurs pour les annonces routeurs Configure pour une interface donnée des valeurs pour les annonces routeurs
différentes des valeurs par défaut. La valeur par défaut du champ priorité différentes des valeurs par défaut. La valeur par défaut du champ priorité
pour le routeur peut-être changée de "medium" (moyen) à "high" (haute) ou pour le routeur peut-être changée de "medium" (moyen) à "high" (haute) ou
"low" (basse). Par exemple : "low" (basse). Par exemple :
.B --ra-param=eth0,high. .B --ra-param=eth0,high,0.
Un intervalle (en secondes) entre les annonces routeur peut-être fourni par : Un intervalle (en secondes) entre les annonces routeur peut-être fourni par :
.B --ra-param=eth0,60. .B --ra-param=eth0,60.
La durée de vie de la route peut-être changée ou mise à zéro, auquel cas La durée de vie de la route peut-être changée ou mise à zéro, auquel cas
le routeur peut annoncer les préfixes mais pas de route : le routeur peut annoncer les préfixes mais pas de route :
.B --ra-parm=eth0,0,0 .B --ra-parm=eth0,0,0
(une valeur de zéro pour l'intervalle signifie qu'il garde la valeur par défaut). (une valeur de zéro pour l'intervalle signifie qu'il garde la valeur par défaut).
Ces trois paramètres peuvent-être configurés en une fois : Ces quatre paramètres peuvent-être configurés en une fois :
.B --ra-param=low,60,1200 .B --ra-param=eth0,mtu:1280,low,60,1200
La valeur pour l'interface peut inclure un caractère joker. La valeur pour l'interface peut inclure un caractère joker.
.TP .TP
.B --enable-tftp[=<interface>[,<interface>]] .B --enable-tftp[=<interface>[,<interface>]]
......
...@@ -839,7 +839,7 @@ struct prefix_class { ...@@ -839,7 +839,7 @@ struct prefix_class {
struct ra_interface { struct ra_interface {
char *name; char *name;
int interval, lifetime, prio; int interval, lifetime, prio, mtu;
struct ra_interface *next; struct ra_interface *next;
}; };
......
...@@ -488,7 +488,7 @@ static struct { ...@@ -488,7 +488,7 @@ static struct {
#ifdef OPTION6_PREFIX_CLASS #ifdef OPTION6_PREFIX_CLASS
{ LOPT_PREF_CLSS, ARG_DUP, "set:tag,<class>", gettext_noop("Specify DHCPv6 prefix class"), NULL }, { LOPT_PREF_CLSS, ARG_DUP, "set:tag,<class>", gettext_noop("Specify DHCPv6 prefix class"), NULL },
#endif #endif
{ LOPT_RA_PARAM, ARG_DUP, "<iface>,[<prio>,]<intval>[,<lifetime>]", gettext_noop("Set priority, resend-interval and router-lifetime"), NULL }, { LOPT_RA_PARAM, ARG_DUP, "<iface>,[mtu:<value>|off,][<prio>,]<intval>[,<lifetime>]", gettext_noop("Set MTU, priority, resend-interval and router-lifetime"), NULL },
{ LOPT_QUIET_DHCP, OPT_QUIET_DHCP, NULL, gettext_noop("Do not log routine DHCP."), NULL }, { LOPT_QUIET_DHCP, OPT_QUIET_DHCP, NULL, gettext_noop("Do not log routine DHCP."), NULL },
{ LOPT_QUIET_DHCP6, OPT_QUIET_DHCP6, NULL, gettext_noop("Do not log routine DHCPv6."), NULL }, { LOPT_QUIET_DHCP6, OPT_QUIET_DHCP6, NULL, gettext_noop("Do not log routine DHCPv6."), NULL },
{ LOPT_QUIET_RA, OPT_QUIET_RA, NULL, gettext_noop("Do not log RA."), NULL }, { LOPT_QUIET_RA, OPT_QUIET_RA, NULL, gettext_noop("Do not log RA."), NULL },
...@@ -3706,7 +3706,18 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma ...@@ -3706,7 +3706,18 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
struct ra_interface *new = opt_malloc(sizeof(struct ra_interface)); struct ra_interface *new = opt_malloc(sizeof(struct ra_interface));
new->lifetime = -1; new->lifetime = -1;
new->prio = 0; new->prio = 0;
new->mtu = 0;
new->name = opt_string_alloc(arg); new->name = opt_string_alloc(arg);
if (strcasestr(comma, "mtu:") == comma)
{
arg = comma + 4;
if (!(comma = split(comma)))
goto err;
if (!strcasecmp(arg, "off"))
new->mtu = -1;
else if (!atoi_check(arg, &new->mtu) || new->mtu < 1280)
goto err;
}
if (strcasestr(comma, "high") == comma || strcasestr(comma, "low") == comma) if (strcasestr(comma, "high") == comma || strcasestr(comma, "low") == comma)
{ {
if (*comma == 'l' || *comma == 'L') if (*comma == 'l' || *comma == 'L')
...@@ -3718,6 +3729,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma ...@@ -3718,6 +3729,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
arg = split(comma); arg = split(comma);
if (!atoi_check(comma, &new->interval) || if (!atoi_check(comma, &new->interval) ||
(arg && !atoi_check(arg, &new->lifetime))) (arg && !atoi_check(arg, &new->lifetime)))
err:
ret_err(_("bad RA-params")); ret_err(_("bad RA-params"));
new->next = daemon->ra_interfaces; new->next = daemon->ra_interfaces;
......
...@@ -243,7 +243,7 @@ static void send_ra_alias(time_t now, int iface, char *iface_name, struct in6_ad ...@@ -243,7 +243,7 @@ static void send_ra_alias(time_t now, int iface, char *iface_name, struct in6_ad
struct dhcp_netid iface_id; struct dhcp_netid iface_id;
struct dhcp_opt *opt_cfg; struct dhcp_opt *opt_cfg;
struct ra_interface *ra_param = find_iface_param(iface_name); struct ra_interface *ra_param = find_iface_param(iface_name);
int done_dns = 0, old_prefix = 0; int done_dns = 0, old_prefix = 0, mtu = 0;
unsigned int min_pref_time; unsigned int min_pref_time;
#ifdef HAVE_LINUX_NETWORK #ifdef HAVE_LINUX_NETWORK
FILE *f; FILE *f;
...@@ -399,22 +399,31 @@ static void send_ra_alias(time_t now, int iface, char *iface_name, struct in6_ad ...@@ -399,22 +399,31 @@ static void send_ra_alias(time_t now, int iface, char *iface_name, struct in6_ad
put_opt6_long(1000 * calc_interval(find_iface_param(iface_name))); put_opt6_long(1000 * calc_interval(find_iface_param(iface_name)));
} }
/* Set the MTU from ra_param if any, an MTU of 0 mean automatic for linux, */
/* an MTU of -1 prevents the option from being sent. */
if (ra_param)
mtu = ra_param->mtu;
#ifdef HAVE_LINUX_NETWORK #ifdef HAVE_LINUX_NETWORK
/* Note that IPv6 MTU is not neccessarily the same as the IPv4 MTU /* Note that IPv6 MTU is not neccessarily the same as the IPv4 MTU
available from SIOCGIFMTU */ available from SIOCGIFMTU */
sprintf(daemon->namebuff, "/proc/sys/net/ipv6/conf/%s/mtu", iface_name); if (mtu == 0)
if ((f = fopen(daemon->namebuff, "r")))
{ {
if (fgets(daemon->namebuff, MAXDNAME, f)) 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); if (fgets(daemon->namebuff, MAXDNAME, f))
put_opt6_short(0); mtu = atoi(daemon->namebuff);
put_opt6_long(atoi(daemon->namebuff)); fclose(f);
} }
fclose(f);
} }
#endif #endif
if (mtu > 0)
{
put_opt6_char(ICMP6_OPT_MTU);
put_opt6_char(1);
put_opt6_short(0);
put_opt6_long(mtu);
}
iface_enumerate(AF_LOCAL, &send_iface, add_lla); iface_enumerate(AF_LOCAL, &send_iface, add_lla);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment