2010年7月28日水曜日

Fonera 2202でWillcom/Emobile接続 その3  PPP設定

 

PPP設定の各ファイルについて記載します。

1. /etc/config/network

/etc/config/network - 下記のPPP設定をファイルの最後に追加します。device, speed, username, password, connectcmdは、hotplug in処理の際に該当するUSB modemの設定情報から書き換えられます。

config 'interface' 'ppp'
    option 'ifname' 'wan'
    option 'proto' 'ppp'
    option 'mtu' '1500'
    option 'linkname' 'wan'
    option 'ipparam' 'wan'
    option 'device' '/dev/ttyUSB0' 
    option 'speed' '921600'
    option 'username' 'em'
    option 'password' 'em'
    option 'connectcmd' '/tmp/chat_dialer -s -v -T*99#'

    option 'attached' '0'

config ‘interface’ ‘ppp’: PPP接続用のセクションです。

ifname: pppdに渡すparameterとなります。今回は’wan’固定となります。

proto: Protocol指定となります。今回は’ppp’固定となります。

mtu: 1500固定です。

linkname: pppdに渡すlink nameです。今回は’wan’固定となります。

ipparam: ‘wan’固定となります。

device: ppp通信用のdevice file nameとなります。D02HW, H12HWを接続すると制御用ポートの /dev/ttyUSB1 も作成されます。3GUMTSでは /dev/ttyUSB1も利用しますが、ppp dialup接続では /dev/ttyUSB0 のみの利用となります。

speed: 回線のinterface速度です。USB dialup modemのhotplug in処理中にttyusbから、コピーされます。

username: ppp接続アカウント名です。Emobileの場合には固定の’em’となります。Willcomの場合には、個別のアカウントとなります。USB dialup modemのhotplug in処理中にttyusbから、コピーされます。

password: ppp接続パスワードです。Emobileの場合には固定の’em’となります。Willcomの場合には、個別のアカウントとなります。USB dialup modemのhotplug in処理中にttyusbから、コピーされます。

connectcmd: chat scriptのコマンドラインとなります。USB dialup modemのhotplug in処理中にttyusbから、コピーされます。同じく /tmp/chat_dailerもhotplug in処理中に作成されます。

attached: D02HW, H12HWのような3GUMTS対応のmodemを利用した場合に、/dev/ttyUSB0と/dev/ttyUSB1の2回 hotplug in処理が起動されるためttyUSB0の処理中に設定しれた値がttyUSB1の処理で上書きされるのを防ぐためのflagです。この値が 1 であると、ttyUSB0のhotplug in 処理が完了したことを示します。

 

2. /etc/config/ttyusb

/etc/config/ttyusb - 新規ファイル追加のサンプル。WSIM接続のusername, passwordはdummyの’*’としています。

config 'ttyusb' '12D11003'
    option 'vendor' 'Huawei'
    option 'driver' 'option'
    option 'modemtype' 'dialup'
    option 'username' 'em'
    option 'password' 'em'
    option 'connectcmd' '/tmp/chat_dialer -s -v -T*99#'
    option 'speed' '921600'
    option 'atinit' 'AT'
    option 'vidpid' '12D11003'
    option 'product' 'D02HW(E220)'

config 'ttyusb' '12D11008'
    option 'vendor' 'Huawei'
    option 'product' 'H12HW'
    option 'driver' 'option'
    option 'modemtype' 'dialup'
    option 'username' 'em'
    option 'password' 'em'
    option 'connectcmd' '/tmp/chat_dialer -s -v -T*99#'
    option 'speed' '921600'
    option 'atinit' 'AT'
    option 'vidpid' '12D11008'

config 'ttyusb' '04BB0940'
    option 'product' 'IO Data WSIM'
    option 'driver' 'pl2303'
    option 'modemtype' 'dialup'
    option 'username' '********'
    option 'password' '********'
    option 'connectcmd' '/tmp/chat_dialer -s -v -T0570572744##64'
    option 'speed' '115200'
    option 'atinit' 'AT&D2&C1&K3S0=0'
    option 'vidpid' '04BB0940'
    option 'vendor' 'Willcom INC'

config ‘ttyusb’ VIDPID: VIDPIDによって識別されるUSB dialup modemの設定情報セクションです。

vendor: ベンダー名

product: 製品名

vidpid: dialup modemのvendor idとproduct idを連結した16進8桁の値となります。dailup modemの識別のためにセクション名とこちらの2重に保持しています。

driver: device driverの種類を設定します。IO Data WSIMの場合にはpl2303, Huawei (Emobile)についてはoptionです。他にusbserialも選択できます。この項目は、以前のimplementationにおいて利用していました。現在は利用していません。

modemtype: モデムタイプ。’dialup’ or ‘3gumts’。’dialup’のときには今回のdialup処理とし、3GUMTS処理が起動されないようにします。’3gumts’の場合には、その逆となります。

username: PPP接続のアカウント名です。USB dialup modemのhotplug in処理中、ttyusbの該当情報が/etc/config/networkの’interface’ ‘ppp’セクションのusernameにコピーされます。

password: PPP接続のパスワードです。USB dialup modemのhotplug in処理中、ttyusbの該当情報が/etc/config/networkの’interface’ ‘ppp’セクションのpasswordにコピーされます。

connectcmd: PPP接続のchat script起動用コマンドラインです。-T以降の電話番号のみ変更するようにしてください。Emobileの場合は、-T*99#になります。USB dialup modemのhotplug in処理中、ttyusbの該当情報が/etc/config/networkの’interface’ ‘ppp’セクションのconnectcmdにコピーされます。

speed: PPP接続のインターフェース速度(bps)です。IO Data WSIMの場合は 115200(bps)が上限のようです。Huawei (Emobile)のH12HWの場合には921600(bps)

atinit: USB dialup modemの初期化コマンドです。空でも差し支えはないでしょう。/tmp/chat_dialerの中で “ATZ” は発行しています。3GUMTSの場合は、ATZとATHを発行しているようです。(/App/umtsd.lua)

 

3. /etc/ppp/options

/etc/ppp/options - パラメーターの修正(bold部分)

#debug
#logfile /dev/null
noaccomp
nopcomp
#nocrtscts
crtscts
lock
maxfail 0
lcp-echo-failure 5
lcp-echo-interval 3

Hardware flow controlを有効にするために nocrtsctsをコメントにします。そしてctsctsを追加します。また、lcp-echo-intervalの値を3に変更します。オリジナルの1では、IO Data WSIM接続の場合に LCP Timeoutが発生することがありました。

 

4. /etc/hotplug.d/ttyusb/10-umts

/etc/hotplug.d/ttyusb/10-umts - 修正 (ファイルの先頭に追加)

modemtype=`uci get ttyusb.${VIDPID}.modemtype`
if [ "${modemtype}" != "3gumts" ] ; then
  exit 1
fi

modemtypeが”3gumts”ではないデバイスが装着されたときに3GUMTSが起動されるのを防ぎます。

 

5. /etc/hotplug.d/ttyusb/11-dialup

/etc/hotplug.d/ttyusb/11-dialup - 新規ファイルの追加

DIALER="/tmp/chat_dialer"

modemtype=`uci get ttyusb.${VIDPID}.modemtype`

if [ "${modemtype}" != "dialup" ] ; then
  exit 1
fi

[ "$ACTION" == "add" -a "$SUBSYSTEM" == "ttyusb" ] && {

attached=`uci get network.ppp.attached`
if [ "${attached}" != "1" ] ; then
  speed=`uci get ttyusb.${VIDPID}.speed`
  username=`uci get ttyusb.${VIDPID}.username`
  password=`uci get ttyusb.${VIDPID}.password`
  connectcmd=`uci get ttyusb.${VIDPID}.connectcmd`
  atinit=`uci get ttyusb.${VIDPID}.atinit`

# Write to /etc/config/network ppp section
  uci set network.ppp.speed="${speed}"
  uci set network.ppp.username="${username}"
  uci set network.ppp.password="${password}"
  uci set network.ppp.connectcmd="${connectcmd}"
  uci set network.ppp.device="/dev/""${NODE}"
  uci commit network

echo "\
#!/usr/sbin/chat -f
TIMEOUT 10
ABORT   '\nNO ANSWER\r'
ABORT   '\nNO CARRIER\r'
ABORT   '\nNO DIALTONE\r'
ABORT   '\nBUSY\r'
''      ATZ
OK      AT
OK      ${atinit}
TIMEOUT 30
OK      ATDT\T
CONNECT \d\d" > ${DIALER}

    chmod +x ${DIALER}
uci set network.ppp.attached=1
uci commit network

    ifup ppp
fi
}

[ "$ACTION" == "remove" -a "$SUBSYSTEM" == "ttyusb" ] && {
uci set network.ppp.attached=0
uci commit network
}

modemtypeが”dialup”ではないデバイスが装着されたときにdial up接続が起動されるのを防ぎます。

Hotplug in 処理(環境変数 ACTIONの値が”add”)のときには、

  • ‘attached’ flagが1でない場合、すなわち WSIM接続時、Huawei (Emobile)接続で /dev/ttyUSB0の処理のときには、処理を進めます。 ‘attached’が1の場合には、Huawei(Emboile)接続で /dev/ttyUSB1(Control port)の処理でのすで、以下の処理はttyUSB0 (Data port)と重複するため行いません。
  • VIDPIDが環境変数として引き渡されるので、対応する設定情報を /etc/config/ttyusbより取得し、/etc/config/networkの’interface’ ‘ppp’セクションにコピーします。そして、最後に ‘attached’ を1にします。

unplug処理(環境変数 ACTIONの値が”remove”)のときには、’attached’を0として、次回のhotplug in処理用に初期化します。

 

6. /etc/hotplug.d/usb/10-umts

/etc/hotplug.d/usb/10-umts - 追加(ファイルの先頭に追加します)

fillzero() {
  id=$1
  len=`expr 4 - ${#id}`

  while [ ${len} -ge 1 ];
  do
    id="0"$id
    len=`expr $len - 1`
  done

  echo ${id}
}

# ${PRODUCT} contains vendor and product information, like 04bb/0940/1.
VID=`echo ${PRODUCT} | cut -f1 -d'/'`
PID=`echo ${PRODUCT} | cut -f2 -d'/'`
VID=`fillzero ${VID} | tr '[a-z]' '[A-Z]'`
PID=`fillzero ${PID} | tr '[a-z]' '[A-Z]'`
VIDPID=$VID$PID

# check the modemtype to prevent this script working on 3G/UMTS.
modemtype=`uci get ttyusb.${VIDPID}.modemtype`
if [ "${modemtype}" != "3gumts" ] ; then
  exit 1
fi

modemtypeが”3gumts”ではないデバイスが装着されたときに3GUMTSが起動されるのを防ぎます。

 

7. /etc/hotplug.d/usb/11-dialup

/etc/hotplug.d/usb/11-dialup - 新規ファイルの追加

DIALER="/tmp/chat_dialer"

fillzero() {
  id=$1
  len=`expr 4 - ${#id}`

  while [ ${len} -ge 1 ];
  do
    id="0"$id
    len=`expr $len - 1`
  done

echo ${id}
}

# ${PRODUCT} contains vendor and product information, like 04bb/0940/1.
VID=`echo ${PRODUCT} | cut -f1 -d'/'`
PID=`echo ${PRODUCT} | cut -f2 -d'/'`
VID=`fillzero ${VID} | tr '[a-z]' '[A-Z]'`
PID=`fillzero ${PID} | tr '[a-z]' '[A-Z]'`
VIDPID=$VID$PID

# check the modemtype to prevent this script working on 3G/UMTS.
modemtype=`uci get ttyusb.${VIDPID}.modemtype`
if [ "${modemtype}" != "dialup" ] ; then
  exit 1
fi

[ "$ACTION" == "add" -a "$HOTPLUG_TYPE" == "usb" ] && {
:
}

[ "$ACTION" == "remove" -a "$HOTPLUG_TYPE" == "usb" ] && {
        ifdown ppp
        # Remote dailup chat script
        rm -f ${DIALER}
        # Reset ppp attached flag
        uci set network.ppp.attached=0
        uci commit network
}

modemtypeが”dialup”ではないデバイスが装着されたときにdialup接続が起動されるのを防ぎます。そして、unplug処理(環境変数ACTIONの値が”remove”のときにはppp の接続断、chat script (/tmp/chat_dialer)の削除、’attached’を0にします(重複していますが)。

 

8. /lib/network/ppp.sh

/lib/network/ppp.sh - 修正(太字部分)

start_pppd() {
        local cfg="$1"; shift

        # 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
# -- Start
# 2010/06/14
# Added overwriting "connect" paramter.
# Added linkname and ipparam
        config_get connect "$cfg" connectcmd
        config_get linkname "$cfg" linkname
        config_get ipparam "$cfg" ipparam
# – End

        [ "$defaultroute" -eq 1 ] && defaultroute="defaultroute replacedefaultroute" || de

        interval="${keepalive##*[, ]}"
        [ "$interval" != "$keepalive" ] || interval=5

        config_get_bool peerdns "$cfg" peerdns 1
        [ "$peerdns" -eq 1 ] && peerdns="usepeerdns" || peerdns=""

        config_get demand "$cfg" demand
        [ -n "$demand" ] && echo "nameserver 1.1.1.1" > /tmp/resolv.conf.auto

        config_get_bool ipv6 "$cfg" ipv6 0
        [ "$ipv6" -eq 1 ] && ipv6="+ipv6" || ipv6=""

# 2010/06/14
        /usr/sbin/pppd "$@" \
                ${keepalive:+lcp-echo-interval $interval lcp-echo-failure ${keepalive%%[,
                ${demand:+precompiled-active-filter /etc/ppp/filter demand idle }${demand:
                $peerdns \
                $defaultroute \
                ${username:+user "$username" password "$password"} \
                unit "$unit" \
                linkname "$linkname" \
                ipparam "$ipparam" \
                ${connect:+connect "$connect"} \
                ${disconnect:+disconnect "$disconnect"} \
                ${ipv6} \
                ${pppd_options}

        lock -u "/var/lock/ppp-${cfg}"
}

setup_interface_ppp() {
        local iface="$1"
        local config="$2"

        config_get device "$config" device
# 2010/06/14
        config_get speed "$config" speed

        config_get mtu "$cfg" mtu
        mtu=${mtu:-1492}
        start_pppd "$config" \
                mtu $mtu mru $mtu \
                "$device" "$speed"

  • connectcmd, linkname, ipparamの値を /etc/config/networkの’interface’ ‘ppp’より取得します。connectcmdはconnectを上書きします。
  • linknameとipparamをpppdの引数として追加します。
  • speedの値を取り出し、同じく引数として追加します。

 

9. /lib/uci/schema/defaults/network

/lib/uci/schema/defaults/network - 追加(ファイルの最後)

config variable
        option name     'connectcmd'
        option title    'Connect command"
        option section  'network.interface'
        option datatype 'string'
        option minlength 0
        option maxlength 64
        list   depends  'proto=ppp'

config variable
        option name     'linkname'
        option title    'pppd option linkname"
        option section  'network.interface'
        option datatype 'string'
        option minlength 0
        option maxlength 64
        list   depends  'proto=ppp'

config variable
        option name     'ipparam'
        option title    'pppd option ipparam"
        option section  'network.interface'
        option datatype 'string'
        option minlength 0
        option maxlength 64
        list   depends  'proto=ppp'

config variable
        option name 'speed'
        option title 'Connection bit rate'
        option section 'network.interface'
        option datatype uint

config variable
        option name 'attached'
        opiton title 'Dialup 1st data device attached'
        option datatype 'boolean'

/etc/config/networkに追加した値の定義をします。

 

10. /lib/uci/schema/defaults/ttyusb

/lib/uci/schema/defaults/ttyusb - 新規ファイル

package ttyusb

config section
        option name     'ttyusb'
        option package  'ttyusb'
        option unique   true

config variable
        option name     'driver'
        option section  'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        option maxlength 32

config variable
        option name     'vendor'
        option section  'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        option maxlength 32

config variable
        option name     'product'
        option section  'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        option maxlength 32

config variable
        option name     'modemtype'
        option section  'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        option maxlength 32

config variable
        option name     'device'
        option section  'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        option maxlength 32

config variable
        option name     'connectcmd'
        option title    'Connect command'
        option section  'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        option maxlength 64

config variable
        option name 'speed'
        option title 'Connection bit rate'
        option section 'ttyusb.ttyusb'
        option datatype uint

config variable
        option name 'atinit'
        option title 'AT INIT command line'
        opiton section 'ttyusb.ttyusb'
        option datatype 'string'
        option minlength 0
        opiton maxlength 64

/etc/config/ttyusbの値の定義をします。

 

更新履歴

  • 2010/07/28: Initial release

0 件のコメント:

コメントを投稿