diff options
-rw-r--r-- | docs/examples/mobile | 37 | ||||
-rw-r--r-- | src/lib/connections/ppp | 148 |
2 files changed, 185 insertions, 0 deletions
diff --git a/docs/examples/mobile b/docs/examples/mobile new file mode 100644 index 0000000..e78c595 --- /dev/null +++ b/docs/examples/mobile @@ -0,0 +1,37 @@ +Description='Example PPP mobile connection' +Interface=ppp0 +Connection=mobile +Peer=mobile-broadband +IdleTimeout=30 + +# Debug pppd / chat output (separately from netctl) +#PPPDebug=true + +# The device will usually be /dev/ttyUSB* (default: ttyUSB0 +Device=ttyUSB0 + +# Use default route provided by the peer (default: true) +#DefaultRoute=true +# Use DNS provided by the peer (default: true) +#UsePeerDNS=true + +# Always keep a connection established +ConnectionMode='persist' +# Establish connection on demand +#ConnectionMode='demand' +#IdleTimeout=300 + +# The user and password are not always required +#User='example@yourprovider.com' +#Password='very secret' + +# The access point name you are connecting to +AccessPointName=apn + +# If your device has a PIN code, set it here. Defaults to None +#Pin=None + +# Mode can be one of 3Gpref, 3Gonly, GPRSpref, GPRSonly, None +# These only work for Huawei USB modems; all other devices should use None +Mode=3Gpref + diff --git a/src/lib/connections/ppp b/src/lib/connections/ppp new file mode 100644 index 0000000..54bedba --- /dev/null +++ b/src/lib/connections/ppp @@ -0,0 +1,148 @@ +# Contributed by Robbie Smith <zoqaeski@gmail.com> +# Based on Thomas Bächler’s <thomas@archlinux.org> pppoe script +# Also see <https://wiki.archlinux.org/index.php/3G_and_GPRS_modems_with_pppd> for more information. + +: ${PPPD:=pppd} + +_quotestring() { + echo "\"${1/\"/\\\"}\"" +} + +mobile_up() { + local cfg + local chat + + mkdir -p "$STATE_DIR/mobile.${Interface}.${Profile}/" + chmod 700 "$STATE_DIR/mobile.${Interface}.${Profile}/" + cfg="$STATE_DIR/mobile.${Interface}.${Profile}/options" + chat="$STATE_DIR/mobile.${Interface}.${Profile}/modem.chat" + : > "${cfg}" + chmod 600 "${cfg}" + + echo "linkname $(_quotestring "${Profile}")" >> "${cfg}" + + # Set device + if [ -n "${Device}" ]; then + echo "${Device}" >> "${cfg}" + else + echo "ttyUSB0" >> "${cfg}" + fi + + echo "921600" >> "${cfg}" + echo "lock" >> "${cfg}" + echo "crtscts" >> "${cfg}" + echo "modem" >> "${cfg}" + echo "passive" >> "${cfg}" + echo "novj" >> "${cfg}" + echo "holdoff 10" >> "${cfg}" + echo "maxfail 5" >> "${cfg}" + + # Debug pppd output separately from netcfg + if is_yes "${PPPDebug:-yes}"; then + echo "debug" >> "${cfg}" + fi + + # Sets up route + if is_yes "${DefaultRoute:-yes}"; then + echo "defaultroute" >> "${cfg}" + else + echo "nodefaultroute" >> "${cfg}" + fi + if is_yes "${UsePeerDNS:-yes}"; then + echo "usepeerdns" >> "${cfg}" + fi + + # Writes username and password + echo "noauth" >> "${cfg}" + echo "hide-password" >> ${cfg} + [[ -n ${User} ]] && echo "user $(_quotestring "${User}")" >> "${cfg}" + [[ -n ${Password} ]] && echo "password $(_quotestring "${Password}")" >> "${cfg}" + + # Now that we’ve got the ppp configuration set up, write the chat script + echo "ECHO ON" >> "${chat}" + echo "ABORT 'BUSY'" >> "${chat}" + echo "ABORT 'NO CARRIER'" >> "${chat}" + echo "ABORT 'VOICE'" >> "${chat}" + echo "ABORT 'NO DIALTONE'" >> "${chat}" + echo "ABORT 'NO DIAL TONE'" >> "${chat}" + echo "ABORT 'NO ANSWER'" >> "${chat}" + echo "ABORT 'DELAYED'" >> "${chat}" + echo "ABORT '\nRINGING\r\n\r\nRINGING\r'" >> "${chat}" + echo "REPORT CONNECT" >> "${chat}" + echo "TIMEOUT 6" >> "${chat}" + echo "'' 'ATQ0'" >> "${chat}" + echo "'OK-AT-OK' 'ATZ'" >> "${chat}" + echo "TIMEOUT 3" >> "${chat}" + + #echo "'OK' @/etc/ppp/chatscripts/pin" >> "${chat}" + if [ -n "${Pin}" ]; then + echo "'OK' 'AT+CPIN=${Pin}'" >> "${chat}" + else + echo "'OK' 'AT'" >> "${chat}" + fi + + echo "'OK\d-AT-OK' 'ATI'" >> "${chat}" + echo "'OK' 'ATZ'" >> "${chat}" + echo "'OK' 'ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0'" >> "${chat}" + + # Mode can be one of 3Gpref, 3Gonly, GPRSpref, GPRSonly, None + # Only works for Huawei modems + #echo "'OK' @/etc/ppp/chatscripts/mode" >> "${chat}" + case "${Mode}" in + 3Gonly) + echo "'OK' 'AT\^SYSCFG=14,2,3fffffff,0,1'" >> "${chat}" + ;; + 3Gpref) + echo "'OK' 'AT\^SYSCFG=2,2,3fffffff,0,1'" >> "${chat}" + ;; + GPRSonly) + echo "'OK' 'AT\^SYSCFG=13,1,3fffffff,0,0'" >> "${chat}" + ;; + GPRSpref) + echo "'OK' 'AT\^SYSCFG=2,1,3fffffff,0,0'" >> "${chat}" + ;; + *) + echo "'OK' 'AT'" >> "${chat}" + ;; + esac + + # Set up Access Point Name + echo "'OK-AT-OK' AT+CGDCONT=1,\"IP\",\"${AccessPointName}\"" >> "${chat}" + + echo "'OK' 'ATDT*99#'" >> "${chat}" + echo "TIMEOUT 30" >> "${chat}" + echo "CONNECT ''" >> "${chat}" + + # Add the chat script line to the configuration + echo "connect \"/usr/sbin/chat -v -t15 -f ${chat}\"" >> "${cfg}" + + ip link set dev "${Interface}" up + #$PPPD call "$Peer" updetach child-timeout "$PPPTimeout" linkname "$Peer" + $PPPD file "${cfg}" + + if [[ $? -ne 0 ]]; then + rmdir "$STATE_DIR/mobile.${Interface}.${Profile}/" + report_error "Couldn't make pppd connection." + return 1 + fi +} + +mobile_down() { + local cfg + local chat + cfg="$STATE_DIR/mobile.${Interface}.${Profile}/options" + chat="$STATE_DIR/mobile.${Interface}.${Profile}/modem.chat" + PIDFILE="/var/run/mobile-${Profile}.pid" + + if [[ -e $PIDFILE ]]; then + read PID < "$PIDFILE" + [[ "$PID" ]] && kill "$PID" + fi + + rm "${cfg}" + rm "${chat}" + rmdir "$STATE_DIR/mobile.${Interface}.${Profile}/" +} + + +# vim: ft=sh ts=4 et sw=4: |