X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=blobdiff_plain;f=package%2Fppp%2Ffiles%2Fppp.sh;h=5f549bf6e1d025a6eaad9cc6e70f5db3c9708948;hp=23fcb89ffd0b45c4e625f32a02a20da8c9215394;hb=17b8c9d23b81dafacd7c7ec1d185201996199141;hpb=2addae7f4ec4d553e257e4e38c00e5d8133bfe8f diff --git a/package/ppp/files/ppp.sh b/package/ppp/files/ppp.sh old mode 100644 new mode 100755 index 23fcb89ffd..5f549bf6e1 --- a/package/ppp/files/ppp.sh +++ b/package/ppp/files/ppp.sh @@ -1,99 +1,183 @@ -scan_ppp() { - config_get ifname "$1" ifname - pppdev="${pppdev:-0}" - config_get unit "$1" unit - [ -z "$unit" ] && { - unit="$pppdev" - if [ "${ifname%%[0-9]*}" = ppp ]; then - unit="${ifname##ppp}" - [ "$pppdev" -le "$unit" ] && pppdev="$(($unit + 1))" - else - pppdev="$(($pppdev + 1))" - fi - config_set "$1" ifname "ppp$unit" - config_set "$1" unit "$unit" - } +#!/bin/sh + +[ -x /usr/sbin/pppd ] || exit 0 + +[ -n "$INCLUDE_ONLY" ] || { + . /etc/functions.sh + . ../netifd-proto.sh + init_proto "$@" } -start_pppd() { - local cfg="$1"; shift - local ifname - - # make sure the network state references the correct ifname - scan_ppp "$cfg" - config_get ifname "$cfg" ifname - set_interface_ifname "$cfg" "$ifname" - - # make sure only one pppd process is started - lock "/var/lock/ppp-${cfg}" - local pid="$(head -n1 /var/run/ppp-${cfg}.pid 2>/dev/null)" - [ -d "/proc/$pid" ] && grep pppd "/proc/$pid/cmdline" 2>/dev/null >/dev/null && { - lock -u "/var/lock/ppp-${cfg}" - return 0 - } - - # 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 - - config_get device "$cfg" device - config_get unit "$cfg" unit - config_get username "$cfg" username - config_get password "$cfg" password - config_get keepalive "$cfg" keepalive - - config_get connect "$cfg" connect - config_get disconnect "$cfg" disconnect - config_get pppd_options "$cfg" pppd_options - config_get_bool defaultroute "$cfg" defaultroute 1 - [ "$defaultroute" -eq 1 ] && defaultroute="defaultroute replacedefaultroute" || defaultroute="" - - interval="${keepalive##*[, ]}" - [ "$interval" != "$keepalive" ] || interval=5 +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_int "mtu" +} + +ppp_generic_setup() { + local config="$1"; shift + + json_get_var ipv6 ipv6 + [ "$ipv6" = 1 ] || ipv6="" + + json_get_var peerdns peerdns + [ "$peerdns" = 0 ] && peerdns="" || peerdns="1" + + json_get_var defaultroute defaultroute + if [ "$defaultroute" = 1 ]; then + defaultroute="defaultroute replacedefaultroute"; + else + defaultroute="nodefaultroute" + fi + + json_get_var demand demand + 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 - config_get_bool peerdns "$cfg" peerdns 1 - [ "$peerdns" -eq 1 ] && peerdns="usepeerdns" || { - peerdns="" - config_get dns "$config" dns - for dns in $dns; do - grep -q "$dns" /tmp/resolv.conf.auto 2>/dev/null || \ - echo "nameserver $dns" >> /tmp/resolv.conf.auto - done - } + json_get_var keepalive keepalive + local interval="${keepalive##*[, ]}" + [ "$interval" != "$keepalive" ] || interval=5 - config_get demand "$cfg" demand - [ -n "$demand" ] && echo "nameserver 1.1.1.1" > /tmp/resolv.conf.auto + json_get_var username username + json_get_var password password - config_get_bool ipv6 "$cfg" ipv6 0 - [ "$ipv6" -eq 1 ] && ipv6="+ipv6" || ipv6="" + [ -n "$connect" ] || json_get_var connect connect + [ -n "$disconnect" ] || json_get_var disconnect disconnect + json_get_var pppd_options pppd_options - /usr/sbin/pppd "$@" \ + proto_run_command "$config" /usr/sbin/pppd \ + nodetach ipparam "$config" \ + ifname "${proto:-ppp}-$config" \ ${keepalive:+lcp-echo-interval $interval lcp-echo-failure ${keepalive%%[, ]*}} \ - ${demand:+precompiled-active-filter /etc/ppp/filter demand idle }${demand:-persist} \ - $peerdns \ - $defaultroute \ + ${ipv6:++ipv6} $defaultroute \ + ${peerdns:+usepeerdns} \ + $demand maxfail 1 \ ${username:+user "$username" password "$password"} \ - unit "$unit" \ - linkname "$cfg" \ - ipparam "$cfg" \ ${connect:+connect "$connect"} \ ${disconnect:+disconnect "$disconnect"} \ - ${ipv6} \ - ${pppd_options} + 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 "$@" +} + +ppp_generic_teardown() { + local interface="$1" + + case "$ERROR" in + 11|19) + proto_notify_error "$interface" AUTH_FAILED + proto_block_restart "$interface" + ;; + esac + proto_kill_command "$interface" +} - lock -u "/var/lock/ppp-${cfg}" +# PPP on serial device + +proto_ppp_init_config() { + proto_config_add_string "device" + ppp_generic_init_config + no_device=1 + available=1 } -setup_interface_ppp() { - local iface="$1" - local config="$2" +proto_ppp_setup() { + local config="$1" + + json_get_var device device + ppp_generic_setup "$config" "$device" +} + +proto_ppp_teardown() { + ppp_generic_teardown "$@" +} - config_get device "$config" device +proto_pppoe_init_config() { + ppp_generic_init_config + proto_config_add_string "ac" + proto_config_add_string "service" +} + +proto_pppoe_setup() { + local config="$1" + local iface="$2" + + for module in slhc ppp_generic pppox pppoe; do + /sbin/insmod $module 2>&- >&- + done + + json_get_var mtu mtu + mtu="${mtu:-1492}" + + json_get_var ac ac + json_get_var service service + + ppp_generic_setup "$config" \ + plugin rp-pppoe.so \ + ${ac:+rp_pppoe_ac "$ac"} \ + ${service:+rp_pppoe_service "$service"} \ + "nic-$iface" +} + +proto_pppoe_teardown() { + ppp_generic_teardown "$@" +} + +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" +} + +proto_pppoa_setup() { + local config="$1" + local iface="$2" + + for module in slhc ppp_generic pppox pppoatm; do + /sbin/insmod $module 2>&- >&- + done + + json_get_var atmdev atmdev + json_get_var vci vci + json_get_var vpi vpi + + json_get_var encaps encaps + case "$encaps" in + 1|vc) encaps="vc-encaps" ;; + *) encaps="llc-encaps" ;; + esac + + ppp_generic_setup "$config" \ + plugin pppoatm.so \ + ${atmdev:+$atmdev.}${vpi:-8}.${vci:-35} \ + ${encaps} +} + +proto_pppoa_teardown() { + ppp_generic_teardown "$@" +} - config_get mtu "$config" mtu - 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 }