Sebenarnya ide ini muncul gara-gara di kota saya (Pontianak) belum dijangkau jaringan EVDO — yang dapat sinyal EVDO saja ‘katanya’ lemot, apalagi yang g dapat :=)) — Nah, karena kebetulan istri saya langganan internet dari provider sebelah (Thr**) yang notabene sudah support HSDPA (dan emang kenceng) akhirnya saya share saja ke NSFAT.

Fitur yang sudah ada saat ini adalah wireless tether dari NSFAT, artinya NSFAT yang membuat jaringan Ad-hoc (bertindak seolah-olah master access point) kemudian perangkat-perangkat (nirkabel) lain terhubung ke NSFAT.

Dalam topologi seperti ini, NSFAT berfungsi sebagai router/gateway bagi klien yang terhubung dengannya, ini sangat berguna ketika ingin meng-share konseksi internet NSFAT dengan perangkat lain, atau ingin sekedar transfer data (tanpa kabel) dengan menggunakan aplikasi semacam Airdroid atau adbWireless.

Nah kalo kebalikannya? Maksudnya? Misal ingin meng-share koneksi LAN/Hi Speed Modem di Laptop dengan NSFAT gimana? Pastinya juga bisa pakai Ad-hoc. Secara garis besar ada dua langkah, yaitu konfigurasi PC/laptop dan konfigurasi Tablet Android (NSFAT).

  1. Konfigurasi PC/Laptop:
    Karena saya pakai Linux (Slackware-14.0), saya bagi lagi menjadi beberapa langkah:
  2. konfigurasi DHCP server
  3. konfigurasi wireless device untuk mengaktifkan Ad-hoc
  4. konfigurasi/aktivasi PC/Laptop sebagai router

  5. Konfigurasi NSFAT

  6. konfigurasi wireless device agar mengenali jaringan Ad-hoc

Ok.. mari kita come on
1. Konfigurasi laptop
- Konfigurasi DHCP server;
Pada dasarnya ini berguna untuk memberikan ip kepada device/perangkat yang terhubung (nantinya) melalui jaringan Ad-hoc. Di Linux terdapat beberapa macam pilihan DHCP server, saya biasa menggunakan dnsmasq, karena sudah ada di Slackware dan konfigurasinya tidak seribet dhcpd. Untuk DHCP server, saya hanya isikan 3 baris ini saja di file /etc/dnsmasq.conf :

domain=wibowo.uni.me
dhcp-range=192.168.10.10,192.168.10.150,12h
dhcp-option=3,192.168.10.1

Keterangan:
- domain adalah nama domain yang akan di append ke hostname dhcp klien nantinya, isikan sesuai keinginan alias suka-suka
- dhcp-range adalah range IP yang disediakan oleh DHCP server untuk klien
- dhcp-option=3,xxx.xxx.xxx.xxx , angka tiga berarti memberi tahu dnsmasq bahwa baris ini adalah konfigurasi gateway untuk klien DHCP yaitu ip xxx.xxx.xxx.xxx, dalam contoh diatas berarti gateway dari klien DHCP diset ke 192.168.10.1 yang tidak lain adalah PC/Laptop yang sedang dikonfigurasi.

Setelah tersimpan tinggal jalankan daemon dnsmasq:

root@host# dnsmasq -p0

Note: dnsmasq juga bisa berfungsi untuk DNS server (caching), jika ingin menonaktifkan fitur DNS caching gunakan option -p0 biar tidak bentrok dengan tool DNS caching yang ada di sistem.

- Konfigurasi perangkat wireless;
untuk membuat jaringan ad-hoc, cara yang saya pakai adalah menggunakan net-tools (ifconfig) dan wireless-tools (iwconfig).. alias mode ketak-ketik, menurut saya lebih cepat, cuma tiga baris perintah. Sebenarnya di kebanyakan distro Linux (termasuk Slackware) sudah menyertakan tool seperti NetworkManager yang juga bisa dipakai untuk membuat jaringan Ad-hoc… mode klak klik klak klik — The coiche is yours..

root@host# ifconfig wlan0 down

memastikan wireless radio mati, contoh diatas ifname (interface name) dari perangkat wireless adalah wlan0

root@host# iwconfig wlan0 mode ad-hoc essid "SlackTether"

men-set wireless device wlan0 ke mode ad-hoc dan men-set essid nya SlackTether

root@host# ifconfig wlan0 192.168.10.1 up

mengaktifkan kembali wireless sekaligus men-set IP nya 192.168.10.1

- Konfigurasi PC/Laptop sebagai router/gateway;
Ini diperlukan kalau ingin meng-share koneksi internet, kalau cuma ingin menghubungkan NSFAT dengan Laptop, terus pindah/transfer data antara kedua device tidak perlu mengaktifkan fitur router ini. Di Linux kita bisa pakai iptables (dan mengaktifkan fitur router di kernel melalui procfs). Yang perlu diketahui adalah ifname perangkat yang terhubung ke internet dan ifname dari perangkat wireless. Misal ifname dari device yang terhubung ke internet adalah eth0 (Ethernet/LAN), dan ifname untuk perangkat wireless misal adalah wlan0, maka perintahnya seperti ini:

root@host# iptables -t nat --flush
root@host# iptables -t filter --flush
root@host# iptables --flus

Keterangan: me-reset/flush konfigurasi iptables yang sudah ada

root@host# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
root@host# iptables --append FORWARD --in-interface wlan0 -j ACCEPT
root@host# echo 1 > /proc/sys/net/ipv4/ip_forward

Keterangan: mengaktifkan fitur router di OS dengan me-nat semua paket data dari wireless device ke ethernet (kabel LAN)

2. Konfigurasi NSFAT / Android
Di NSFAT hanya perlu menyesuaikan isi file /data/misc/wifi/wpa_supplicant.conf menjadi seperti ini:

ctrl_interface=DIR=/data/misc/wifi/wpa_supplicant GROUP=1010
update_config=1
ap_scan=2

network={
    ssid="SlackTether"
    scan_ssid=1
    key_mgmt=NONE
    priority=1
    mode=1
}

Dan tentunya memperbaiki permission & owner file tersebut:

shell@android:/data/misc/wifi # chown system.wifi wpa_supplicant.conf
shell@android:/data/misc/wifi # chmod 644 wpa_supplicant.conf

Note: Backup file wpa_supplicant.conf yang telah diedit tersebut karena file ini “sewaktu-waktu” akan ditimpa oleh wpa_supplicant. Jika ditimpa tinggal di copykan lagi saja, sehingga tidak perlu ketik ulang konfigurasi diatas.

Kalau setup sudah dilakukan semua, terakhir adalah uji coba. Saat uji coba saya biasanya “men-debug” dengan melihat log (/var/log/messages) dari Linux dan dari Android (logcat). Ini cuplikan log pada saat setup berhasil:

Android logcat:

....
D/Modem3g (  332): Interface1 wlan0 link up
D/Tethering(  332): interfaceLinkStateChanged wlan0, true
D/Tethering(  332): interfaceStatusChanged wlan0, true
D/wpa_supplicant( 1885): Associated to a new BSS: BSSID=92:b1:6d:37:56:4b
D/wpa_supplicant( 1885): Select network based on association information
D/wpa_supplicant( 1885): Network configuration found for the current AP
D/wpa_supplicant( 1885): WPA: clearing AP WPA IE
D/wpa_supplicant( 1885): WPA: clearing AP RSN IE
D/wpa_supplicant( 1885): WPA: clearing own WPA/RSN IE
D/wpa_supplicant( 1885): EAPOL: External notification - EAP success=0
D/wpa_supplicant( 1885): EAPOL: External notification - EAP fail=0
D/wpa_supplicant( 1885): EAPOL: External notification - portControl=ForceAuthorized
I/wpa_supplicant( 1885): associated with 92:b1:6d:37:56:4b
D/wpa_supplicant( 1885): WPA: Association event - clear replay counter
D/wpa_supplicant( 1885): WPA: Clear old PTK
D/wpa_supplicant( 1885): EAPOL: External notification - portEnabled=0
D/wpa_supplicant( 1885): EAPOL: External notification - portValid=0
D/wpa_supplicant( 1885): EAPOL: External notification - portEnabled=1
D/wpa_supplicant( 1885): EAPOL: SUPP_PAE entering state S_FORCE_AUTH
D/wpa_supplicant( 1885): EAPOL: SUPP_BE entering state IDLE
D/wpa_supplicant( 1885): Cancelling authentication timeout
D/wpa_supplicant( 1885): State: ASSOCIATED -> COMPLETED
I/wpa_supplicant( 1885): CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=00:00:00:00:00:00
I/wpa_supplicant( 1885): CTRL-EVENT-CONNECTED - Connection to 92:b1:6d:37:56:4b completed (auth) [id=0 id_str=]
D/wpa_supplicant( 1885): wpa_driver_wext_set_operstate: operstate 0->1 (UP)
D/wpa_supplicant( 1885): WEXT: Operstate: linkmode=-1, operstate=6
D/wpa_supplicant( 1885): Cancelling scan request
D/wpa_supplicant( 1885): RTM_NEWLINK: operstate=1 ifi_flags=0x11003 ([UP][LOWER_UP])
D/wpa_supplicant( 1885): WEXT: Operstate: linkmode=-1, operstate=6
D/wpa_supplicant( 1885): RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan0' added
D/wpa_supplicant( 1885): RTM_NEWLINK: operstate=1 ifi_flags=0x11043 ([UP][RUNNING][LOWER_UP])
D/wpa_supplicant( 1885): RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan0' added
D/wpa_supplicant( 1885): CMD = SCAN_INTERVAL 15
D/WifiCommon(  332): [wlan0] evt = "<2>associated with 92:b1:6d:37:56:4b", result = 0, nread = 36
D/WifiCommon(  332): [wlan0] evt = "<2>CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=00:00:00:00:00:00", result = 0, nread = 63
D/WifiCommon(  332): [wlan0] evt = "<2>CTRL-EVENT-CONNECTED - Connection to 92:b1:6d:37:56:4b completed (auth) [id=0 id_str=]", result = 0, nread = 89
D/Modem3g (  332): Interface1 wlan0 link up
D/Tethering(  332): interfaceLinkStateChanged wlan0, true
D/Tethering(  332): interfaceStatusChanged wlan0, true
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER BTCOEXSCAN-STOP'
D/wpa_supplicant( 1885): CMD = DRIVER BTCOEXSCAN-STOP
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd BTCOEXSCAN-STOP
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER RXFILTER-ADD 3'
D/wpa_supplicant( 1885): CMD = DRIVER RXFILTER-ADD 3
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd RXFILTER-ADD 3
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER RXFILTER-START'
D/wpa_supplicant( 1885): CMD = DRIVER RXFILTER-START
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd RXFILTER-START
D/wpa_supplicant( 1885): Unsupported command
D/WifiCommon(  332): [wlan0] cmd = 'DRIVER RXFILTER-START' ==> failed. (supplicant reply 'FAIL').
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER RXFILTER-STOP'
D/wpa_supplicant( 1885): CMD = DRIVER RXFILTER-STOP
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd RXFILTER-STOP
D/wpa_supplicant( 1885): Unsupported command
D/WifiCommon(  332): [wlan0] cmd = 'DRIVER RXFILTER-STOP' ==> failed. (supplicant reply 'FAIL').
D/WifiCommon(  332): [wlan0] Issue cmd = 'AP_SCAN 1'
D/wpa_supplicant( 1885): CMD = AP_SCAN 1
D/wpa_supplicant( 1885): ap_scan = 1
D/WifiCommon(  332): [wlan0] Issue cmd = 'RECONNECT'
D/wpa_supplicant( 1885): CMD = RECONNECT
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER SETSUSPENDOPT 0'
D/wpa_supplicant( 1885): CMD = DRIVER SETSUSPENDOPT 0
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd SETSUSPENDOPT 0
D/wpa_supplicant( 1885): Unsupported command
D/WifiCommon(  332): [wlan0] cmd = 'DRIVER SETSUSPENDOPT 0' ==> failed. (supplicant reply 'FAIL').
E/WifiStateMachine(  332): set suspend optimizations failed!
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER POWERMODE 0'
D/wpa_supplicant( 1885): CMD = DRIVER POWERMODE 0
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd POWERMODE 0
D/wpa_supplicant( 1885): Set Power Mode command = 0
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER SETSUSPENDOPT 0'
D/wpa_supplicant( 1885): CMD = DRIVER SETSUSPENDOPT 0
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd SETSUSPENDOPT 0
D/wpa_supplicant( 1885): Unsupported command
D/WifiCommon(  332): [wlan0] cmd = 'DRIVER SETSUSPENDOPT 0' ==> failed. (supplicant reply 'FAIL').
E/WifiStateMachine(  332): set suspend optimizations failed!
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER POWERMODE 0'
D/wpa_supplicant( 1885): CMD = DRIVER POWERMODE 0
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd POWERMODE 0
D/wpa_supplicant( 1885): Set Power Mode command = 0
D/WifiCommon(  332): [wlan0] Issue cmd = 'STATUS'
D/wpa_supplicant( 1885): CMD = STATUS
D/DhcpStateMachine(  332): StoppedState
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER COUNTRY ID'
D/DhcpStateMachine(  332): StoppedState{ what=196609 when=0 }
D/wpa_supplicant( 1885): CMD = DRIVER COUNTRY ID
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd COUNTRY ID
D/wpa_supplicant( 1885): Unsupported command
D/WifiCommon(  332): [wlan0] cmd = 'DRIVER COUNTRY ID' ==> failed. (supplicant reply 'FAIL').
E/WifiStateMachine(  332): Failed to set country code id
D/DhcpStateMachine(  332): WaitBeforeStartState
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER SETBAND 0'
D/wpa_supplicant( 1885): CMD = DRIVER SETBAND 0
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd SETBAND 0
I/wpa_supplicant( 1885): ioctl[SIOCIWFIRSTPRIV]
D/WifiCommon(  332): [wlan0] cmd = 'DRIVER SETBAND 0' ==> failed. (supplicant reply 'FAIL').
E/WifiStateMachine(  332): Failed to set frequency band 0
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER BTCOEXMODE 1'
D/wpa_supplicant( 1885): CMD = DRIVER BTCOEXMODE 1
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd BTCOEXMODE 1
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER GETPOWER'
D/wpa_supplicant( 1885): CMD = DRIVER GETPOWER
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd GETPOWER
D/wpa_supplicant( 1885): Get Power Mode command = 0
D/wpa_supplicant( 1885): powermode = 0
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER POWERMODE 1'
D/wpa_supplicant( 1885): CMD = DRIVER POWERMODE 1
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd POWERMODE 1
D/wpa_supplicant( 1885): Set Power Mode command = 1
D/DhcpStateMachine(  332): WaitBeforeStartState{ what=196614 when=0 }
D/DhcpStateMachine(  332): DHCP request on wlan0
I//system/bin/dhcpcd( 1889): dhcpcd[1890]: version 5.2.10 starting
I//system/bin/dhcpcd( 1889): dhcpcd[1890]: host does not support a monotonic clock - timing can skew
I//system/bin/dhcpcd( 1889): dhcpcd[1890]: wlan0: rebinding lease of 192.168.10.4
I//system/bin/dhcpcd( 1889): dhcpcd[1890]: wlan0: acknowledged 192.168.10.4 from 192.168.10.1
I//system/bin/dhcpcd( 1889): dhcpcd[1890]: wlan0: leased 192.168.10.4 for 43200 seconds
D/wpa_supplicant( 1885): EAPOL: disable timer tick
D/DhcpStateMachine(  332): DHCP succeeded on wlan0
D/DhcpStateMachine(  332): DHCP_RENEW is temporary ignore by rubbitxiao!!!
D/DhcpStateMachine(  332): RunningState
D/WifiCommon(  332): [wlan0] Issue cmd = 'DRIVER POWERMODE 0'
D/wpa_supplicant( 1885): CMD = DRIVER POWERMODE 0
D/wpa_supplicant( 1885): wpa_driver_wext_driver_cmd POWERMODE 0
D/wpa_supplicant( 1885): Set Power Mode command = 0
....

Linux’s /var/log/messages:

...
Mar 25 17:13:41 pcxthinkslack kernel: [105703.920025] wlan0: No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)
Mar 25 17:14:11 pcxthinkslack kernel: [105734.221418] wlan0: No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)
Mar 25 17:14:42 pcxthinkslack kernel: [105764.510633] wlan0: No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)
Mar 25 17:15:01 pcxthinkslack kernel: [105783.420250] usb 2-1.2: USB disconnect, device number 38
Mar 25 17:15:41 pcxthinkslack kernel: [105823.774633] wlan0: No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)
Mar 25 17:16:11 pcxthinkslack kernel: [105853.977737] wlan0: No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)
Mar 25 17:16:42 pcxthinkslack kernel: [105884.266854] wlan0: No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)
Mar 25 17:16:42 pcxthinkslack kernel: [105885.195727] usb 2-1.2: new high-speed USB device number 39 using ehci_hcd
Mar 25 17:16:43 pcxthinkslack kernel: [105885.280770] usb 2-1.2: New USB device found, idVendor=18d1, idProduct=4e11
Mar 25 17:16:43 pcxthinkslack kernel: [105885.280782] usb 2-1.2: New USB device strings: Mfr=2, Product=3, SerialNumber=4
Mar 25 17:16:43 pcxthinkslack kernel: [105885.280789] usb 2-1.2: Product: Android
Mar 25 17:16:43 pcxthinkslack kernel: [105885.280795] usb 2-1.2: Manufacturer: Android
Mar 25 17:16:43 pcxthinkslack kernel: [105885.280800] usb 2-1.2: SerialNumber: 0123456789ABCDEF
Mar 25 17:16:43 pcxthinkslack mtp-probe: checking bus 2, device 39: "/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2"
Mar 25 17:16:43 pcxthinkslack mtp-probe: bus: 2, device: 39 was not an MTP device
Mar 25 17:17:41 pcxthinkslack kernel: [105943.837807] wlan0: No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)
Mar 25 17:18:03 pcxthinkslack dnsmasq-dhcp[28104]: DHCPREQUEST(wlan0) 192.168.10.4 b0:ee:45:8b:fa:cd
Mar 25 17:18:03 pcxthinkslack dnsmasq-dhcp[28104]: DHCPACK(wlan0) 192.168.10.4 b0:ee:45:8b:fa:cd android-6db4aa2ac2ed4040
...

Screenshot:

nsfat ad-hoc 1

nsfat ad-hoc 2

nsfat adhoc result

Known problems: