aboutsummaryrefslogtreecommitdiffstats
path: root/package/network
diff options
context:
space:
mode:
authorSteven Barth <cyrus@openwrt.org>2015-06-12 07:37:53 +0000
committerSteven Barth <cyrus@openwrt.org>2015-06-12 07:37:53 +0000
commit48a95eff38ceaa13d497617ebd5e2201dd16ee77 (patch)
tree3c4e5b345df07057e42dfb4ee0d76a9084b69a74 /package/network
parent085a75aec22de6d81f413877c8ca96d45e27abb3 (diff)
downloadupstream-48a95eff38ceaa13d497617ebd5e2201dd16ee77.tar.gz
upstream-48a95eff38ceaa13d497617ebd5e2201dd16ee77.tar.bz2
upstream-48a95eff38ceaa13d497617ebd5e2201dd16ee77.zip
ppp : Unnumbered support
Adds PPP unnumbered support via the parameter unnumbered which points to a logical OpenWRT interface. The PPP proto shell handler will "borrow" an IP address from the unnumbered interface (if multiple IP addresses are present the longest prefix different from 32 will be "borrowed") for which a host interface dependency will be created. Due to the host interface dependency the PPP unnumbered interface will only "borrow" an IP address from an interface which is up. The borrowed IP address will be shared as local IP address by the PPP daemon and no other local IP will be accepted from the peer in the IPCP negotiation. A typical use case is the usage of a public IP subnet on the Lan interface which will be shared by the PPP interface as local IP address. Signed-off-by: Hans Dedecker <dedeckeh@gmail.com> SVN-Revision: 45948
Diffstat (limited to 'package/network')
-rwxr-xr-xpackage/network/services/ppp/files/ppp.sh40
1 files changed, 39 insertions, 1 deletions
diff --git a/package/network/services/ppp/files/ppp.sh b/package/network/services/ppp/files/ppp.sh
index 1a72a1e272..a6389a8b93 100755
--- a/package/network/services/ppp/files/ppp.sh
+++ b/package/network/services/ppp/files/ppp.sh
@@ -4,10 +4,35 @@
[ -n "$INCLUDE_ONLY" ] || {
. /lib/functions.sh
+ . /lib/functions/network.sh
. ../netifd-proto.sh
init_proto "$@"
}
+ppp_select_ipaddr()
+{
+ local subnets=$1
+ local res
+ local res_mask
+
+ for subnet in $subnets; do
+ local addr="${subnet%%/*}"
+ local mask="${subnet#*/}"
+
+ if [ -n "$res_mask" -a "$mask" != 32 ]; then
+ [ "$mask" -gt "$res_mask" ] || [ "$res_mask" = 32 ] && {
+ res="$addr"
+ res_mask="$mask"
+ }
+ elif [ -z "$res_mask" ]; then
+ res="$addr"
+ res_mask="$mask"
+ fi
+ done
+
+ echo "$res"
+}
+
ppp_exitcode_tostring()
{
local errorcode=$1
@@ -53,12 +78,14 @@ ppp_generic_init_config() {
proto_config_add_boolean authfail
proto_config_add_int mtu
proto_config_add_string pppname
+ proto_config_add_string unnumbered
}
ppp_generic_setup() {
local config="$1"; shift
+ local localip
- json_get_vars ipv6 demand keepalive keepalive_adaptive username password pppd_options pppname
+ json_get_vars ipv6 demand keepalive keepalive_adaptive username password pppd_options pppname unnumbered
if [ "$ipv6" = 0 ]; then
ipv6=""
elif [ -z "$ipv6" -o "$ipv6" = auto ]; then
@@ -73,6 +100,16 @@ ppp_generic_setup() {
fi
[ -n "$mtu" ] || json_get_var mtu mtu
[ -n "$pppname" ] || pppname="${proto:-ppp}-$config"
+ [ -n "$unnumbered" ] && {
+ local subnets
+ ( proto_add_host_dependency "$config" "" "$unnumbered" )
+ network_get_subnets subnets "$unnumbered"
+ localip=$(ppp_select_ipaddr "$subnets")
+ [ -n "$localip" ] || {
+ proto_block_restart "$config"
+ return
+ }
+ }
local lcp_failure="${keepalive%%[, ]*}"
local lcp_interval="${keepalive##*[, ]}"
@@ -86,6 +123,7 @@ ppp_generic_setup() {
proto_run_command "$config" /usr/sbin/pppd \
nodetach ipparam "$config" \
ifname "$pppname" \
+ ${localip:+$localip:} \
${lcp_failure:+lcp-echo-interval $lcp_interval lcp-echo-failure $lcp_failure $lcp_adaptive} \
${ipv6:++ipv6} \
nodefaultroute \