X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;ds=sidebyside;f=package%2Fppp%2Ffiles%2Fppp.sh;h=7e9b8dd8562a564ff4e8ec568a1c7ddac6764ca0;hb=eecf5b17520f6b3b6ffb45ac7dca298d93b27501;hp=46a66c969cfb34f952414ed62bfecee951b631d6;hpb=2d6dd9f18a11ea7ca97ac44527632269ecff913d;p=openwrt.git diff --git a/package/ppp/files/ppp.sh b/package/ppp/files/ppp.sh old mode 100644 new mode 100755 index 46a66c969c..7e9b8dd856 --- a/package/ppp/files/ppp.sh +++ b/package/ppp/files/ppp.sh @@ -1,141 +1,222 @@ -stop_interface_ppp() { - local cfg="$1" - - local proto - config_get proto "$cfg" proto - - local link="$proto-$cfg" - [ -f "/var/run/ppp-${link}.pid" ] && { - local pid="$(head -n1 /var/run/ppp-${link}.pid 2>/dev/null)" - local try=0 - grep -qs pppd "/proc/$pid/cmdline" && kill -TERM $pid && \ - while grep -qs pppd "/proc/$pid/cmdline" && [ $((try++)) -lt 5 ]; do sleep 1; done - grep -qs pppd "/proc/$pid/cmdline" && kill -KILL $pid && \ - while grep -qs pppd "/proc/$pid/cmdline"; do sleep 1; done - rm -f "/var/run/ppp-${link}.pid" - } +#!/bin/sh - remove_dns "$cfg" +[ -x /usr/sbin/pppd ] || exit 0 - local lock="/var/lock/ppp-$link" - [ -f "$lock" ] && lock -u "$lock" +[ -n "$INCLUDE_ONLY" ] || { + . /lib/functions.sh + . ../netifd-proto.sh + init_proto "$@" } -start_pppd() { - local cfg="$1"; shift +ppp_generic_init_config() { + proto_config_add_string "username" + proto_config_add_string "password" + proto_config_add_string "keepalive" + proto_config_add_int "demand" + proto_config_add_string "pppd_options" + proto_config_add_string "connect" + proto_config_add_string "disconnect" + proto_config_add_boolean "defaultroute" + proto_config_add_boolean "peerdns" + proto_config_add_boolean "ipv6" + proto_config_add_boolean "authfail" + proto_config_add_int "mtu" +} - local proto - config_get proto "$cfg" proto +ppp_generic_setup() { + local config="$1"; shift + + json_get_vars ipv6 peerdns defaultroute demand keepalive username password pppd_options + [ "$ipv6" = 1 ] || ipv6="" + [ "$peerdns" = 0 ] && peerdns="" || peerdns="1" + if [ "$defaultroute" = 1 ]; then + defaultroute="defaultroute replacedefaultroute"; + else + defaultroute="nodefaultroute" + fi + if [ "${demand:-0}" -gt 0 ]; then + demand="precompiled-active-filter /etc/ppp/filter demand idle $demand" + else + demand="persist" + fi + + [ -n "$mtu" ] || json_get_var mtu mtu - # unique link identifier - local link="${proto:-ppp}-$cfg" + local interval="${keepalive##*[, ]}" + [ "$interval" != "$keepalive" ] || interval=5 + [ -n "$connect" ] || json_get_var connect connect + [ -n "$disconnect" ] || json_get_var disconnect disconnect - # make sure only one pppd process is started - lock "/var/lock/ppp-${link}" - local pid="$(head -n1 /var/run/ppp-${link}.pid 2>/dev/null)" - [ -d "/proc/$pid" ] && grep pppd "/proc/$pid/cmdline" 2>/dev/null >/dev/null && { - lock -u "/var/lock/ppp-${link}" - return 0 - } + proto_run_command "$config" /usr/sbin/pppd \ + nodetach ipparam "$config" \ + ifname "${proto:-ppp}-$config" \ + ${keepalive:+lcp-echo-interval $interval lcp-echo-failure ${keepalive%%[, ]*}} \ + ${ipv6:++ipv6} $defaultroute \ + ${peerdns:+usepeerdns} \ + $demand maxfail 1 \ + ${username:+user "$username" password "$password"} \ + ${connect:+connect "$connect"} \ + ${disconnect:+disconnect "$disconnect"} \ + ip-up-script /lib/netifd/ppp-up \ + ipv6-up-script /lib/netifd/ppp-up \ + ip-down-script /lib/netifd/ppp-down \ + ipv6-down-script /lib/netifd/ppp-down \ + ${mtu:+mtu $mtu mru $mtu} \ + $pppd_options "$@" +} - # Workaround: sometimes hotplug2 doesn't deliver the hotplug event for creating - # /dev/ppp fast enough to be used here - [ -e /dev/ppp ] || mknod /dev/ppp c 108 0 +ppp_generic_teardown() { + local interface="$1" + + case "$ERROR" in + 11|19) + proto_notify_error "$interface" AUTH_FAILED + json_get_var authfail authfail + if [ "${authfail:-0}" -gt 0 ]; then + proto_block_restart "$interface" + fi + ;; + 2) + proto_notify_error "$interface" INVALID_OPTIONS + proto_block_restart "$interface" + ;; + esac + proto_kill_command "$interface" +} - local device - config_get device "$cfg" device +# PPP on serial device - local username - config_get username "$cfg" username +proto_ppp_init_config() { + proto_config_add_string "device" + ppp_generic_init_config + no_device=1 + available=1 +} - local password - config_get password "$cfg" password +proto_ppp_setup() { + local config="$1" - local keepalive - config_get keepalive "$cfg" keepalive + json_get_var device device + ppp_generic_setup "$config" "$device" +} - local connect - config_get connect "$cfg" connect +proto_ppp_teardown() { + ppp_generic_teardown "$@" +} - local disconnect - config_get disconnect "$cfg" disconnect +proto_pppoe_init_config() { + ppp_generic_init_config + proto_config_add_string "ac" + proto_config_add_string "service" +} - local pppd_options - config_get pppd_options "$cfg" pppd_options +proto_pppoe_setup() { + local config="$1" + local iface="$2" - local defaultroute - config_get_bool defaultroute "$cfg" defaultroute 1 - [ "$defaultroute" -eq 1 ] && \ - defaultroute="defaultroute replacedefaultroute" || defaultroute="nodefaultroute" + for module in slhc ppp_generic pppox pppoe; do + /sbin/insmod $module 2>&- >&- + done - local interval="${keepalive##*[, ]}" - [ "$interval" != "$keepalive" ] || interval=5 + json_get_var mtu mtu + mtu="${mtu:-1492}" - local dns - config_get dns "$config" dns + json_get_var ac ac + json_get_var service service - local has_dns=0 - local peer_default=1 - [ -n "$dns" ] && { - has_dns=1 - peer_default=0 - } + ppp_generic_setup "$config" \ + plugin rp-pppoe.so \ + ${ac:+rp_pppoe_ac "$ac"} \ + ${service:+rp_pppoe_service "$service"} \ + "nic-$iface" +} - local peerdns - config_get_bool peerdns "$cfg" peerdns $peer_default +proto_pppoe_teardown() { + ppp_generic_teardown "$@" +} - [ "$peerdns" -eq 1 ] && { - peerdns="usepeerdns" - } || { - peerdns="" - add_dns "$cfg" $dns - } +proto_pppoa_init_config() { + ppp_generic_init_config + proto_config_add_int "atmdev" + proto_config_add_int "vci" + proto_config_add_int "vpi" + proto_config_add_string "encaps" + no_device=1 + available=1 +} - local demand - config_get demand "$cfg" demand 0 +proto_pppoa_setup() { + local config="$1" + local iface="$2" - local demandargs - [ "$demand" -gt 0 ] && { - demandargs="precompiled-active-filter /etc/ppp/filter demand idle $demand" - [ "$has_dns" -eq 0 ] && add_dns "$cfg" 1.1.1.1 - } || { - demandargs="persist" - } + for module in slhc ppp_generic pppox pppoatm; do + /sbin/insmod $module 2>&- >&- + done - local ipv6 - config_get_bool ipv6 "$cfg" ipv6 0 - [ "$ipv6" -eq 1 ] && ipv6="+ipv6" || ipv6="" + json_get_vars atmdev vci vpi encaps - start-stop-daemon -S -b -x /usr/sbin/pppd -m -p /var/run/ppp-$link.pid -- "$@" \ - ${keepalive:+lcp-echo-interval $interval lcp-echo-failure ${keepalive%%[, ]*}} \ - $demandargs \ - $peerdns \ - $defaultroute \ - ${username:+user "$username" password "$password"} \ - ipparam "$cfg" \ - ifname "$link" \ - ${connect:+connect "$connect"} \ - ${disconnect:+disconnect "$disconnect"} \ - ${ipv6} \ - ${pppd_options} \ - nodetach + case "$encaps" in + 1|vc) encaps="vc-encaps" ;; + *) encaps="llc-encaps" ;; + esac - lock -u "/var/lock/ppp-${link}" + ppp_generic_setup "$config" \ + plugin pppoatm.so \ + ${atmdev:+$atmdev.}${vpi:-8}.${vci:-35} \ + ${encaps} } -setup_interface_ppp() { - local iface="$1" - local config="$2" +proto_pppoa_teardown() { + ppp_generic_teardown "$@" +} + +proto_pptp_init_config() { + ppp_generic_init_config + proto_config_add_string "server" + available=1 + no_device=1 +} - local device - config_get device "$config" device +proto_pptp_setup() { + local config="$1" + local iface="$2" - local mtu - config_get mtu "$config" mtu + local ip serv_addr server + json_get_var server server && { + for ip in $(resolveip -t 5 "$server"); do + ( proto_add_host_dependency "$config" "$ip" ) + serv_addr=1 + done + } + [ -n "$serv_addr" ] || { + echo "Could not resolve server address" + sleep 5 + proto_setup_failed "$config" + exit 1 + } + + local load + for module in slhc ppp_generic ppp_async ppp_mppe ip_gre gre pptp; do + grep -q "$module" /proc/modules && continue + /sbin/insmod $module 2>&- >&- + load=1 + done + [ "$load" = "1" ] && sleep 1 + + ppp_generic_setup "$config" \ + plugin pptp.so \ + pptp_server $server \ + file /etc/ppp/options.pptp +} + +proto_pptp_teardown() { + ppp_generic_teardown "$@" +} - mtu=${mtu:-1492} - start_pppd "$config" \ - mtu $mtu mru $mtu \ - "$device" +[ -n "$INCLUDE_ONLY" ] || { + add_protocol ppp + [ -f /usr/lib/pppd/*/rp-pppoe.so ] && add_protocol pppoe + [ -f /usr/lib/pppd/*/pppoatm.so ] && add_protocol pppoa + [ -f /usr/lib/pppd/*/pptp.so ] && add_protocol pptp }