diff options
17 files changed, 326 insertions, 36 deletions
diff --git a/recipes-core/multitech/config/chat_wrapper b/recipes-core/multitech/config/chat_wrapper new file mode 100755 index 0000000..9db3188 --- /dev/null +++ b/recipes-core/multitech/config/chat_wrapper @@ -0,0 +1,129 @@ +#!/bin/bash + +# Rules for chat scripts +# No comments allowed at the end of AT+CGDCONT in chat script +# The last AT+CGDCONT= must use the same context as the dialer. +# If desired, The AT+CGDCONT may be prefixed by #MT[[:space:]]+ +# Example: +#MT AT+CGDCONT="IPV6","data","192.168.2.1",0,1,"EXTRA" +# +# If you do not use a comment, the entire AT+CGDCONT command +# must be surrounded by apostrophes. This command will be executed +# twice, once in the chat wrapper, and a 2nd time in the chat +# itself. +# +# The space after "#MT" may be any number including tabs. +# If #MT AT+CGDCONT= is found, only the last one is chosen. +# Any uncommented AT+CGDCONT= is then ignored. +# If there are not #MT AT+CGDCONT= lines, then any line without +# a comment chararacter before AT+CGDONT= is accepted, but only the +# last one in the file. + +NAME=chat_wrapper +CONFIG=/etc/default/${NAME} +function finish +{ + ${LOG} "Launch:" "$@" + exec "$@" + # NOTREACHED +} + +[[ -f $CONFIG ]] || exit 1 + +. ${CONFIG} + +: ${REGWAITTIME:=300} +: ${FINALWAIT:=5} + +: ${LOG:="/usr/bin/logger -t ${NAME} -p daemon.notice"} + +${LOG} Timeout is $REGWAITTIME, execute "$@" +((i=$#)) +chatscript="${!i}" +${LOG} Parsing chat script "$chatscript" + +# CONTEXT is last context string in chat script +CONTEXT=$(egrep "^#MT[[:space:]]+(AT\+CGDCONT=.*)" ${chatscript} | tail -1) +if ((${#CONTEXT} == 0)) ; then + CONTEXT=$(egrep "^[^#]+AT\+CGDCONT=" ${chatscript} | tail -1) + [[ $CONTEXT =~ \'(AT\+CGDCONT=([0-9]+)[^$\']+) ]] +else + [[ $CONTEXT =~ (AT\+CGDCONT=([0-9]+).*)$ ]] +fi + +# CONTEXTNUM is the context number that is configured in the dialer. +CONTEXT="${BASH_REMATCH[1]}" +if ((${#CONTEXT} == 0)) ; then + ${LOG} No context specifiction in the chat script + finish "$@" + # NOTREACHED +fi +((CONTEXTNUM=${BASH_REMATCH[2]})) + + +${LOG} "Using Context ${CONTEXTNUM} based on chat script: ${CONTEXT}" + +# At this point if there is no context number, we can skip everything else. + +# Get Modem's context settings +MCONTEXT=$(/usr/bin/radio-cmd -t10 'AT+CGDCONT?' 2>&1 | tr -d '\r') +[[ $MCONTEXT =~ \+CGDCONT:[[:space:]]+${CONTEXTNUM},\"([^\"]*)\",\"([^\"]*)\",\"([^\"]*)\",([0-9]+),([0-9]+)([^$'\n']*) ]] + +MPDP="${BASH_REMATCH[1]}" +MAPN="${BASH_REMATCH[2]}" +MADDR="${BASH_REMATCH[3]}" +MDCOMP="${BASH_REMATCH[4]}" +MHCOMP="${BASH_REMATCH[5]}" +MFULLBOAT="${BASH_REMATCH[6]}" + +[[ $CONTEXT =~ AT\+CGDCONT=${CONTEXTNUM},\"([^\"]*)\",\"([^\"]*)\"(,\"([^\"]*)\"(,([0-9]+)(,([0-9]+)(,[^\']*))*)*)* ]] +PDP="${BASH_REMATCH[1]}" +APN="${BASH_REMATCH[2]}" +ADDR="${BASH_REMATCH[4]}" # Optional +DCOMP="${BASH_REMATCH[6]}" # Optional +HCOMP="${BASH_REMATCH[8]}" # Optional +FULLBOAT="${BASH_REMATCH[9]}" # Optional + +if ((${#DCOMP} == 0)) ; then + ((DCOMP=0)) # Default +fi +if ((${#HCOMP} == 0)) ; then + ((HCOMP=0)) # Default +fi + +# Only update context on a mismatch between chat and modem. +if [[ $MPDP != $PDP ]] || [[ $MAPN != $APN ]] || \ + [[ $MADDR != $ADDR ]] || ((MDCOMP != DCOMP)) || \ + ((MHCOMP != HCOMP)) || \ + [[ $MFULLBOAT != $FULLBOAT ]] ; then + ${LOG} "Modem context $MPDP,$MAPN,$MADDR,$MDCOMP,$HCOMP does not match chat script" + ${LOG} "$MCONTEXT" + ${LOG} "Dropping registration with carrier to set context" + # Need to deregister + /usr/bin/radio-cmd -t10 'AT+COPS=2' + /usr/bin/radio-cmd -t10 "AT+CGDCONT=${CONTEXTNUM},\"${PDP}\",\"${APN}\",\"${ADDR}\",$DCOMP,${HCOMP}${FULLBOAT}" + /usr/bin/radio-cmd -t10 'AT+COPS=0' + ${LOG} "New context is set. Wait up to $REGWAITTIME seconds to register" + # Wait for registration + uptime=$(cat /proc/uptime) + [[ $uptime =~ ^([^\.]*) ]] + t0=${BASH_REMATCH[1]} + while ! [[ $(/usr/bin/radio-query --netreg) =~ ^REGISTERED$ ]] ; do + sleep 5 + uptime=$(cat /proc/uptime) + [[ $uptime =~ ^([^\.]*) ]] + t1=${BASH_REMATCH[1]} + if ((t1-t0 > REGWAITTIME)) ; then + ${LOG} "$((t1-t0)) seconds has expired" + fi + done + uptime=$(cat /proc/uptime) + [[ $uptime =~ ^([^\.]*) ]] + t1=${BASH_REMATCH[1]} + ${LOG} "Re-registered in $((t1-t0)) seconds -- wait 5 more seconds" + sleep $FINALWAIT +else + ${LOG} "Context $CONTEXTNUM matches and nothing to do." +fi +finish "$@" +# NOTREACHED diff --git a/recipes-core/multitech/config/chat_wrapper.default b/recipes-core/multitech/config/chat_wrapper.default new file mode 100644 index 0000000..941c008 --- /dev/null +++ b/recipes-core/multitech/config/chat_wrapper.default @@ -0,0 +1,12 @@ +# The maximum time to wait for registration +# when changing the modem context parameters. +# This is ignored if the context is +# already set correctly in the modem. +REGWAITTIME=300 + +# The time to wait after registration +# when setting the context +# before attempting a PPP connection. +# This is ignored if the context is +# already set correctly in the modem. +FINALWAIT=5 diff --git a/recipes-core/multitech/config/ppp/peers/gsm b/recipes-core/multitech/config/ppp/peers/gsm index d23957e..c456764 100644 --- a/recipes-core/multitech/config/ppp/peers/gsm +++ b/recipes-core/multitech/config/ppp/peers/gsm @@ -8,4 +8,4 @@ ipcp-restart 10 noauth crtscts novj -connect '/usr/sbin/chat -v -t 90 -f /etc/ppp/peers/gsm_chat' +connect '/usr/libexec/chat_wrapper /usr/sbin/chat -v -t 90 -f /etc/ppp/peers/gsm_chat' diff --git a/recipes-core/multitech/config/ppp/peers/gsm_chat b/recipes-core/multitech/config/ppp/peers/gsm_chat index 5e18e05..a92c938 100644 --- a/recipes-core/multitech/config/ppp/peers/gsm_chat +++ b/recipes-core/multitech/config/ppp/peers/gsm_chat @@ -12,11 +12,32 @@ OK 'ATZ' OK 'AT+CSQ' # ---------------------------------- # Set the APN for your provider here +# Note that a comment starting with +# #MT AT+CGDCONT= +# will be interpretted by +# /usr/libexec/chat_wrapper +# as the intended context +# setting. Make the context number +# (after the =) match the +# dialer number context. +# If the context changes, chat_wrapper +# handles disconnecting the modem +# from the network during the update, +# which is required +# by some modem firmware. +# The chat script will be executed +# after the chat_wrapper script +# re-registers the modem. +# The context will only be set if the +# modem settings do not match the +# settings here. +# Lines starting with # MT are ignored. # ---------------------------------- -#OK 'AT+CGDCONT=1,"IP","proxy"' -#OK 'AT+CGDCONT=1,"IP","ISP.CINGULAR"' -#OK 'AT+CGDCONT=1,"IP","internet2.voicestream.com"' -OK 'AT+CGDCONT=1,"IP","internet"' +# MT AT+CGDCONT=1,"IP","proxy" +# MT AT+CGDCONT=1,"IP","ISP.CINGULAR" +# MT AT+CGDCONT=1,"IP","internet2.voicestream.com" +#MT AT+CGDCONT=1,"IP","internet" +OK 'AT+CGDCONT?' SAY "Dialing...\n" #OK 'ATD*99#' OK 'ATD*99***1#' diff --git a/recipes-core/multitech/config/ppp/peers/l4e1 b/recipes-core/multitech/config/ppp/peers/l4e1 index d6359cd..2996e6e 100644 --- a/recipes-core/multitech/config/ppp/peers/l4e1 +++ b/recipes-core/multitech/config/ppp/peers/l4e1 @@ -8,4 +8,4 @@ ipcp-restart 10 noauth crtscts novj -connect '/usr/sbin/chat -v -t 90 -f /etc/ppp/peers/l4e1_chat' +connect '/usr/libexec/chat_wrapper /usr/sbin/chat -v -t 90 -f /etc/ppp/peers/l4e1_chat' diff --git a/recipes-core/multitech/config/ppp/peers/l4e1_chat b/recipes-core/multitech/config/ppp/peers/l4e1_chat index 3a297ed..6b6be44 100644 --- a/recipes-core/multitech/config/ppp/peers/l4e1_chat +++ b/recipes-core/multitech/config/ppp/peers/l4e1_chat @@ -12,10 +12,28 @@ OK 'ATZ' OK 'AT+CSQ' # ---------------------------------- # Set the APN for your provider here +# Note that a comment starting with +# #MT AT+CGDCONT= +# will be interpretted by +# /usr/libexec/chat_wrapper +# as the intended context +# setting. Make the context number +# (after the =) match the +# dialer number context. +# If the context changes, chat_wrapper +# handles disconnecting the modem +# from the network during the update, +# which is required +# by some modem firmware. +# The chat script will be executed +# after the chat_wrapper script +# re-registers the modem. +# The context will only be set if the +# modem settings do not match the +# settings here. +# Lines starting with # MT are ignored. # ---------------------------------- -OK 'AT+COPS=2' -OK 'AT+CGDCONT=1,"IP","internet"' -OK 'AT+COPS=0' +#MT AT+CGDCONT=1,"IP","internet" OK 'AT+CGDCONT?' SAY "Dialing...\n" OK 'ATD*99***1#' diff --git a/recipes-core/multitech/config/ppp/peers/l4n1 b/recipes-core/multitech/config/ppp/peers/l4n1 index c0b4beb..2e0b501 100644 --- a/recipes-core/multitech/config/ppp/peers/l4n1 +++ b/recipes-core/multitech/config/ppp/peers/l4n1 @@ -8,4 +8,4 @@ ipcp-restart 10 noauth crtscts novj -connect '/usr/sbin/chat -v -t 90 -f /etc/ppp/peers/l4n1_chat' +connect '/usr/libexec/chat_wrapper /usr/sbin/chat -v -t 90 -f /etc/ppp/peers/l4n1_chat' diff --git a/recipes-core/multitech/config/ppp/peers/l4n1_chat_non_vz b/recipes-core/multitech/config/ppp/peers/l4n1_chat_non_vz index ea5907e..64a05be 100644 --- a/recipes-core/multitech/config/ppp/peers/l4n1_chat_non_vz +++ b/recipes-core/multitech/config/ppp/peers/l4n1_chat_non_vz @@ -31,15 +31,34 @@ ABORT 'BUSY' '' 'AT' OK 'ATZ' OK 'AT+CSQ' -#------------------------------------------- -# Set the non-Verizon APN on the next line -#------------------------------------------- -#OK 'AT+CGDCONT=3,"IP","proxy"' -#OK 'AT+CGDCONT=3,"IP","ISP.CINGULAR"' -#OK 'AT+CGDCONT=3,"IP","internet2.voicestream.com"' -OK 'AT+COPS=2' -OK 'AT+CGDCONT=3,"IP","phone"' -OK 'AT+COPS=0' +# ---------------------------------- +# Set the APN for your provider here +# Note that a comment starting with +# #MT AT+CGDCONT= +# will be interpretted by +# /usr/libexec/chat_wrapper +# as the intended context +# setting. Make the context number +# (after the =) match the +# dialer number context. +# If the context changes, chat_wrapper +# handles disconnecting the modem +# from the network during the update, +# which is required +# by some modem firmware. +# The chat script will be executed +# after the chat_wrapper script +# re-registers the modem. +# The context will only be set if the +# modem settings do not match the +# settings here. +# Lines starting with # MT are ignored. +# ---------------------------------- +# MT AT+CGDCONT=3,"IP","proxy" +# MT AT+CGDCONT=3,"IP","ISP.CINGULAR" +# MT AT+CGDCONT=3,"IP","internet2.voicestream.com" +#MT AT+CGDCONT=3,"IP","phone" +OK 'AT+CGDCONT?' SAY "Dialing...\n" OK 'ATD*99***3#' SAY "Waiting for CONNECT...\n" diff --git a/recipes-core/multitech/config/ppp/peers/lap3 b/recipes-core/multitech/config/ppp/peers/lap3 index bac08a1..9b56aae 100644 --- a/recipes-core/multitech/config/ppp/peers/lap3 +++ b/recipes-core/multitech/config/ppp/peers/lap3 @@ -8,4 +8,4 @@ ipcp-restart 10 noauth crtscts novj -connect '/usr/sbin/chat -v -t 90 -f /etc/ppp/peers/lap3_chat' +connect '/usr/libexec/chat_wrapper /usr/sbin/chat -v -t 90 -f /etc/ppp/peers/lap3_chat' diff --git a/recipes-core/multitech/config/ppp/peers/lap3_chat b/recipes-core/multitech/config/ppp/peers/lap3_chat index bc5ebcf..92a5e54 100644 --- a/recipes-core/multitech/config/ppp/peers/lap3_chat +++ b/recipes-core/multitech/config/ppp/peers/lap3_chat @@ -1,4 +1,4 @@ -SAY "LSP3 chat\n" +SAY "LAP3 chat\n" ECHO OFF ABORT 'NO DIAL TONE' ABORT 'NO DIALTONE' @@ -10,6 +10,30 @@ ABORT 'BUSY' '' 'AT' OK 'ATZ' OK 'AT+CSQ' +# ---------------------------------- +# Set the APN for your provider here +# Note that a comment starting with +# #MT AT+CGDCONT= +# will be interpretted by +# /usr/libexec/chat_wrapper +# as the intended context +# setting. Make the context number +# (after the =) match the +# dialer number context. +# If the context changes, chat_wrapper +# handles disconnecting the modem +# from the network during the update, +# which is required +# by some modem firmware. +# The chat script will be executed +# after the chat_wrapper script +# re-registers the modem. +# The context will only be set if the +# modem settings do not match the +# settings here. +# Lines starting with # MT are ignored. +# ---------------------------------- +#MT AT+CGDCONT=1,"IP","internet" OK 'AT+CGDCONT?' SAY "Dialing...\n" OK 'ATD*99***1#' diff --git a/recipes-core/multitech/config/ppp/peers/leu1 b/recipes-core/multitech/config/ppp/peers/leu1 index 993b33a..2e247b3 100644 --- a/recipes-core/multitech/config/ppp/peers/leu1 +++ b/recipes-core/multitech/config/ppp/peers/leu1 @@ -8,4 +8,4 @@ ipcp-restart 10 noauth crtscts novj -connect '/usr/sbin/chat -v -t 90 -f /etc/ppp/peers/leu1_chat' +connect '/usr/libexec/chat_wrapper /usr/sbin/chat -v -t 90 -f /etc/ppp/peers/leu1_chat' diff --git a/recipes-core/multitech/config/ppp/peers/leu1_chat b/recipes-core/multitech/config/ppp/peers/leu1_chat index 23faf0e..817f75d 100644 --- a/recipes-core/multitech/config/ppp/peers/leu1_chat +++ b/recipes-core/multitech/config/ppp/peers/leu1_chat @@ -12,8 +12,29 @@ OK 'ATZ' OK 'AT+CSQ' # ---------------------------------- # Set the APN for your provider here +# Note that a comment starting with +# #MT AT+CGDCONT= +# will be interpretted by +# /usr/libexec/chat_wrapper +# as the intended context +# setting. Make the context number +# (after the =) match the +# dialer number context. +# If the context changes, chat_wrapper +# handles disconnecting the modem +# from the network during the update, +# which is required +# by some modem firmware. +# The chat script will be executed +# after the chat_wrapper script +# re-registers the modem. +# The context will only be set if the +# modem settings do not match the +# settings here. +# Lines starting with # MT are ignored. # ---------------------------------- -OK 'AT+CGDCONT=1,"IP","internet"' +#MT AT+CGDCONT=1,"IP","internet" +OK 'AT+CGDCONT?' SAY "Dialing...\n" OK 'ATD*99***1#' SAY "Waiting for CONNECT...\n" diff --git a/recipes-core/multitech/config/ppp/peers/lna3 b/recipes-core/multitech/config/ppp/peers/lna3 index bd84569..022e4fc 100644 --- a/recipes-core/multitech/config/ppp/peers/lna3 +++ b/recipes-core/multitech/config/ppp/peers/lna3 @@ -8,4 +8,4 @@ ipcp-restart 10 noauth crtscts novj -connect '/usr/sbin/chat -v -t 90 -f /etc/ppp/peers/lna3_chat' +connect '/usr/libexec/chat_wrapper /usr/sbin/chat -v -t 90 -f /etc/ppp/peers/lna3_chat' diff --git a/recipes-core/multitech/config/ppp/peers/lna3_chat_non_vz b/recipes-core/multitech/config/ppp/peers/lna3_chat_non_vz index 033efde..33fd377 100644 --- a/recipes-core/multitech/config/ppp/peers/lna3_chat_non_vz +++ b/recipes-core/multitech/config/ppp/peers/lna3_chat_non_vz @@ -31,14 +31,34 @@ ABORT 'BUSY' '' 'AT' OK 'ATZ' OK 'AT+CSQ' -#------------------------------------------- -# Set the non-Verizon APN on the next line -#------------------------------------------- -#OK 'AT+CGDCONT=3,"IP","proxy"' -#OK 'AT+CGDCONT=3,"IP","ISP.CINGULAR"' -#OK 'AT+CGDCONT=3,"IP","internet2.voicestream.com"' -OK 'AT+COPS=2' -OK 'AT+CGDCONT=3,"IP","phone"' +# ---------------------------------- +# Set the APN for your provider here +# Note that a comment starting with +# #MT AT+CGDCONT= +# will be interpretted by +# /usr/libexec/chat_wrapper +# as the intended context +# setting. Make the context number +# (after the =) match the +# dialer number context. +# If the context changes, chat_wrapper +# handles disconnecting the modem +# from the network during the update, +# which is required +# by some modem firmware. +# The chat script will be executed +# after the chat_wrapper script +# re-registers the modem. +# The context will only be set if the +# modem settings do not match the +# settings here. +# Lines starting with # MT are ignored. +# ---------------------------------- +# MT AT+CGDCONT=3,"IP","proxy" +# MT AT+CGDCONT=3,"IP","ISP.CINGULAR" +# MT AT+CGDCONT=3,"IP","internet2.voicestream.com" +#MT AT+CGDCONT=3,"IP","phone" +OK 'AT+CGDCONT?' OK 'AT+COPS=0' SAY "Dialing...\n" OK 'ATD*99***3#' diff --git a/recipes-core/multitech/config/ppp/peers/lsp3 b/recipes-core/multitech/config/ppp/peers/lsp3 index 072477b..4a3da2f 100644 --- a/recipes-core/multitech/config/ppp/peers/lsp3 +++ b/recipes-core/multitech/config/ppp/peers/lsp3 @@ -8,4 +8,4 @@ ipcp-restart 10 noauth crtscts novj -connect '/usr/sbin/chat -v -t 90 -f /etc/ppp/peers/lsp3_chat' +connect '/usr/libexec/chat_wrapper /usr/sbin/chat -v -t 90 -f /etc/ppp/peers/lsp3_chat' diff --git a/recipes-core/multitech/config/ppp/peers/lsp3_chat b/recipes-core/multitech/config/ppp/peers/lsp3_chat index 347c3b8..529a260 100644 --- a/recipes-core/multitech/config/ppp/peers/lsp3_chat +++ b/recipes-core/multitech/config/ppp/peers/lsp3_chat @@ -12,10 +12,28 @@ OK 'ATZ' OK 'AT+CSQ' # ---------------------------------- # Set the APN for your provider here +# Note that a comment starting with +# #MT AT+CGDCONT= +# will be interpretted by +# /usr/libexec/chat_wrapper +# as the intended context +# setting. Make the context number +# (after the =) match the +# dialer number context. +# If the context changes, chat_wrapper +# handles disconnecting the modem +# from the network during the update, +# which is required +# by some modem firmware. +# The chat script will be executed +# after the chat_wrapper script +# re-registers the modem. +# The context will only be set if the +# modem settings do not match the +# settings here. +# Lines starting with # MT are ignored. # ---------------------------------- -OK 'AT+COPS=2' -OK 'AT+CGDCONT=1,"IP","internet"' -OK 'AT+COPS=0' +#MT AT+CGDCONT=1,"IP","internet" OK 'AT+CGDCONT?' SAY "Dialing...\n" OK 'ATD*99***2#' diff --git a/recipes-core/multitech/config_2.2.bb b/recipes-core/multitech/config_2.3.bb index da51cc9..816aab2 100644 --- a/recipes-core/multitech/config_2.2.bb +++ b/recipes-core/multitech/config_2.3.bb @@ -18,6 +18,8 @@ SRC_URI = "\ file://ppp \ file://config.init \ file://config-mths \ + file://chat_wrapper \ + file://chat_wrapper.default \ " RDEPENDS_${PN}-mths += "${PN}" @@ -48,6 +50,12 @@ fakeroot do_install () { # mths adjustments tar -C ${CONFIGFILES_MTHS} -czf defaults-mths.tar.gz . install -m 0644 ${WORKDIR}/defaults-mths.tar.gz ${D}${sysconfdir}/defaults-mths.tar.gz + + install -d ${D}${sysconfdir}/defaults + install -d ${D}${libexecdir}/ppp + install -m 0755 ${WORKDIR}/chat_wrapper ${D}${libexecdir}/ppp/chat_wrapper + install -m 0644 ${WORKDIR}/chat_wrapper.default ${D}${sysconfdir}/defaults + } FILES_${PN} = "${sysconfdir}/defaults.tar.gz ${sysconfdir}/default_pass" |