FreeBSD + vodafone HSPA

szukeseges dolgok:

* FreeBSD 9
* vodafone K3772-Z usb-s HSPA modem
* es a lejjebb talalhato config fileok
* u3g, umodem es umass kernelben vagy modulkent

/etc/devd/k3772z.conf


#
# vodafone K3772Z
#

attach 100 {
        device-name "umodem[0-9]+";
        match "vendor" "0x19d2";
        match "product" "0x1181";
        action "/root/vodafone/umts_stick.perl -a";
};

/etc/ppp/ppp.conf


default:
 set log Phase Chat LCP IPCP CCP tun command +connect

vodafone:
 set device /dev/cuaU0
 set speed 460800
 set phone *99***1\#
 set authname vodafone
 set authkey
 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
  \"\" \
  AT OK-AT-OK \
  AT+CFUN=1 OK-AT-OK \
  AT+CSQ OK \
  AT+CGDCONT=1,\\\"IP\\\",\\\"vitamax.snet.vodafone.net\\\" OK \
  AT+CGACT? OK-AT-OK \
  AT+CGATT? OK \
  AT+COPS? OK \
  ATD*99***1# CONNECT"
 set timeout 180 # 3 minute idle timer (the default)
 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
 set vj slotcomp off
 set crtscts on
 add default HISADDR
# enable dns         # request DNS info (for resolv.conf) ## vodafone eseteben nalam nem mukodik
# resolv rewrite     # igy workaround lesz ;)

/root/vodafone/umts_stick.perl


#!/usr/bin/perl
#
# Copyright (C) 2009 Lars Engels <lars@0x20.net>
# All rights reserved. Standard 2-clause BSD license and disclaimer applies.

# umts_stick


use strict;
use warnings;

use Getopt::Std;

my $VERSION = 0.1;

my $modem = "/dev/cuaU0";     # Change to your device name
my $pin = "0000";               # Insert your device's PIN

my $rc = 0;
my %options=();

$SIG{ALRM} = sub {
        die("Timeout: no response from modem $modem\n");
};

sub query_pin_status;
sub query_provider;
sub query_signal;
sub send_pin;
sub usage;

usage if ((@ARGV <= 0) || (@ARGV >= 2));

getopts("ahsp", \%options) or usage;
usage if defined $options{h};

open(MODEM, "+<", $modem) or die("can't open modem $modem: $!");
alarm(10);

send_pin if defined $options{a};
if (defined $options{s}) {
        query_provider;
        sleep(1);
        query_signal;
}
query_pin_status if defined $options{p};


close(MODEM) or die "Cannot close modem: $!";
exit $rc;



#### SUBS ####
sub query_pin_status {
        my $query_pin_cmd = "AT+CPIN?\n\r";
        print MODEM  $query_pin_cmd;
        while (<MODEM>) {
                if (/READY/) {
                        print "Ready: PIN already accepted or no PIN needed.\n";
                        last;
                } elsif (/SIM\ PIN/) {
                        print "Waiting for PIN.\n";
                        last;
                } elsif (/SIM\ PUK/) {
                        print "Waiting for PUK.\n";
                        last;
                } elsif (/^(OK)|$/) {
                        next;
                } else {
                        print "Unknown PIN status!\n";
                        $rc = 1;
                }
        }
        $rc = 0;
}

sub query_provider {
        my $query_prov_cmd = "AT+COPS?\n\r";
        my @conn_types = ('GSM', 'Compact GSM', 'UMTS', 'EDGE', 'UMTS with HSDPA', 'UMTS with HSUPA', 'UMTS with HSDPA and HSUPA');
        print MODEM $query_prov_cmd;
        while (<MODEM>) {
                if (/^\+COPS/) {
                        my (undef, undef, $provider, $conn_type) = split /,/;
                        printf "Provider: %s\nConnection type: %s\n", $provider, $conn_types[$conn_type];
                        $rc = 0;
                        last;
                }
        }
}

sub query_signal {
        my $query_signal_cmd = "AT+CSQ\n\r";
        print MODEM $query_signal_cmd;
        while (<MODEM>) {
                if (/^\+CSQ:\ (\d+),\d+/) {
                        my $rssi = $1;
                        printf "Signal strength: %d dBm\n", ($rssi * 2) - 113;
                        $rc = 0;
                        last;
                }
        }
}

sub send_pin {
        my $send_pin_cmd = "AT+CPIN=\"$pin\"\n\r";
        print MODEM $send_pin_cmd;
        while (<MODEM>) {
                if (/OK/) {
                        print "PIN accepted\n" ;
                        $rc = 0;
                        last;
                }
                if (/ERROR/) {
                        print "PIN rejected\n" ;
                        $rc = 1;
                        last;
                }
        }
}

sub usage {
        print "Usage: $0 [-a] [-h] [-s] [-p]\n";
        print "Options:\n";
        print "    -a     send PIN to device\n";
        print "    -s     print current provider, connection type and signal quality\n";
        print "    -p     get current PIN status\n";
        print "    -h     this help message\n";
        exit -1;
}

~/bin/vodafone-3g.sh


#!/bin/sh

#/root/vodafone/umts_stick.perl -a
/usr/sbin/ppp -ddial vodafone

/bin/echo "nameserver 80.244.97.30" > /etc/resolv.conf
/bin/echo "nameserver 80.244.98.166" >> /etc/resolv.conf

A kernelmodulokat egy alapbol szallitott devd szabaly behuzza, igy ezzel a resszel nem kell torodni.
Elso lepesben a /etc/devd/k3772z.conf file kell a helyere rakni, es ezt kovetoen kiadni a service devd restart parancsot. Ha ez megvan, johet a ppp config, ami a /etc/ppp/ppp.conf file szerkesztesevel tortenik meg. Kovetkezo lepes az umts_stick.perl beszerzese, amit fentrol ki lehet masolni, vagy innen: http://wiki.bsdforen.de/howto/umts_mit_huawei .Utolso lepesben meg az egeszre egy wrapper scriptet letrehozni, mivel a DNS infokat nem kaptam a vodafone-tol, igy a DNS beallitasokat kezzel allitjuk be.

A network-managert es mas monstrumot nem kivanok hasznalni, ahogy lathato, par sorral elintezheto az egesz.

Hozzászólások

Es a GENERIC (nem tudom a FBSD hogy hivja az alapbol szallitottat) kernel tartalmazza is a felsorolt modulokat?
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Jol irtad, GENERIC-nek hivjak. Az en 9.1-es gepemen a kovetkezo a felallas:

gyari kernelbe beleforditva ott van az umass es az u3g, es mind a 3 elerheto modulbol. Mint szerepel is, ha nem herelte ki az ember a /etc/devd/usb.conf fajlt, akkor a modulok automatikusan betoltodnek. Mondjuk annyi furcsasagot latok, hogy nalam a vendorID=0x19d2 mellett szep hosszu lista szerepel, de abban a listaban a productID=0x1181 eppen pont nem szerepel. (Es amugy is csak az u3g/t toltene be, az umodemet nem.)

Azaz vagy kezzel kiadod, hogy kldload umodem, vagy automatizalod, pl. bele lehet tenni valamelyikbe:

a) /boot/loader.conf -ba
umodem_load="YES"

b) /etc/rc.config -ba
kld_list="umodem"

es innentol minden tovabbi boot-nal is betoltodik.

Valamint akar a fentebb emlitett devd-vel is lehet jatszani, hogy berantsa az ember. Ha megteheto, en szemely szerint ez utobbit tartom jonak, minek legyen bent egy modul ha amugy nem kell. Ehhez pedig csinalsz egy devd konfig fajlt. *Elvben* a helye: /etc/devd.conf (gyarilag keszen van, szerintem nem jo piszkalni), /etc/devd/*.conf (itt van pl. az usb.conf, szinten nem jo piszkalni), iletve /usr/local/etc/devd/*.conf - no ide kene egy uj szabaly:

c) pl. /usr/local/etc/devd/umodem.conf
nomatch 32 {
match "bus" "uhub[0-9]+";
match "mode" "host";
match "vendor" "0x19d2";
match "product" "0x1181";
action "kldload -n umodem";
};

Nekem a leirasbol az nem derult ki, hogy Pinyonal mitol van umodem. De termeszetesen a ket devd.conf -os reszt (amit Piny irt, es amit en irtam) ossze is lehet vonni egy fajlba. A "nomatch" resz (amit en irtam) a megfelelo stick eseten (ha nem ismerte volna fel a rendszer) betolti az umodemet, az "attach" resz (amit Pinyo), az pedig a konkret umodem eszkoznel lefuttatja az inicializalo parancsot.