From 2a7981f8ca0fc6660146885b75f7a663fe221119 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Sat, 25 Apr 2020 18:37:48 +0200 Subject: [PATCH] Add ipv6cp-accept-remote option Signed-off-by: Samuel Thibault Fixes #76 --- pppd/ipv6cp.c | 7 ++++++- pppd/ipv6cp.h | 3 ++- pppd/pppd.8 | 5 +++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pppd/ipv6cp.c b/pppd/ipv6cp.c index 47e3422..5857336 100644 --- a/pppd/ipv6cp.c +++ b/pppd/ipv6cp.c @@ -245,6 +245,8 @@ static option_t ipv6cp_option_list[] = { { "ipv6cp-accept-local", o_bool, &ipv6cp_allowoptions[0].accept_local, "Accept peer's interface identifier for us", 1 }, + { "ipv6cp-accept-remote", o_bool, &ipv6cp_allowoptions[0].accept_remote, + "Accept peer's interface identifier for itself", 1 }, { "defaultroute6", o_bool, &ipv6cp_wantoptions[0].default_route, "Add default IPv6 route", OPT_ENABLE|1, &ipv6cp_allowoptions[0].default_route }, @@ -444,6 +446,7 @@ ipv6cp_init(unit) memset(ao, 0, sizeof(*ao)); wo->accept_local = 0; + wo->accept_remote = 0; wo->neg_ifaceid = 1; ao->neg_ifaceid = 1; @@ -547,6 +550,8 @@ ipv6cp_resetci(f) wo->accept_local = 1; eui64_magic_nz(wo->ourid); } + if (!wo->opt_remote) + wo->accept_remote = 1; *go = *wo; eui64_zero(go->hisid); /* last proposed interface identifier */ @@ -974,7 +979,7 @@ ipv6cp_reqci(f, inp, len, reject_if_disagree) orc = CONFREJ; /* Reject CI */ break; } - if (!eui64_iszero(wo->hisid) && + if (!eui64_iszero(wo->hisid) && !wo->accept_remote && !eui64_equals(ifaceid, wo->hisid) && eui64_iszero(go->hisid)) { diff --git a/pppd/ipv6cp.h b/pppd/ipv6cp.h index 25235d2..3eb7b2a 100644 --- a/pppd/ipv6cp.h +++ b/pppd/ipv6cp.h @@ -151,7 +151,8 @@ typedef struct ipv6cp_options { int neg_ifaceid; /* Negotiate interface identifier? */ int req_ifaceid; /* Ask peer to send interface identifier? */ int default_route; /* Assign default route through interface? */ - int accept_local; /* accept peer's value for iface id? */ + int accept_local; /* accept peer's value for our iface id? */ + int accept_remote; /* accept peer's value for his iface id? */ int opt_local; /* ourtoken set by option */ int opt_remote; /* histoken set by option */ int use_ip; /* use IP as interface identifier */ diff --git a/pppd/pppd.8 b/pppd/pppd.8 index 540d62a..53b1c12 100644 --- a/pppd/pppd.8 +++ b/pppd/pppd.8 @@ -470,6 +470,11 @@ With this option, pppd will accept the peer's idea of our local IPv6 interface identifier, even if the local IPv6 interface identifier was specified in an option. .TP +.B ipv6cp\-accept\-remote +With this option, pppd will accept the peer's idea of its (remote) +IPv6 interface identifier, even if the remote IPv6 interface +identifier was specified in an option. +.TP .B ipv6cp\-max\-configure \fIn Set the maximum number of IPv6CP configure-request transmissions to \fIn\fR (default 10). -- 2.39.2