OS: Ubuntu 계열 (11.04 32bit, 12.04 64bit 에서 테스트)
무선랜카드: IPTIME N150UA (Ralink RT2870/RT3070 칩셋)
<문제의 배경>
- Ubuntu 시스템에서 실험을 목적으로 무선랜(Wi-Fi) 디바이스 드라이버(device driver) 코드를 수정하고 재설치하기 위해 compat-wireless-3.6.8-1 의 소스코드를 수정하였다.
- 개발의 대상이 되는 디바이스 드라이버는 Atheros 계열의 ath9k와 ath9k-htc였고, 이에 따라 compat-wireless 소스코드에서 컴파일 대상을 ath9k로 한정지었다.
( $ ./scripts/driver-select ath9k ) - 저렇게 설정하고 나서 compat-wireless를 컴파일하면($ sudo make install), 원래 Ubuntu에 들어 있던 네트워크 관련 커널모듈을 전부 교체해 버리게 된다. 즉, mac80211, cfg80211과 같이 리눅스에서 무선랜 제어에 사용하는 공통 커널 모듈까지 교체된다는 얘기.
- 문제는 컴파일 대상 디바이스가 ath9k로 한정되는 바람에 Atheros ath9k 칩셋이 아닌 다른 USB 무선랜카드 (e.g. Ralink 계열, Broadcom 계열 등)는 인식을 못하는 경우가 생긴다.
<문제 상황>
ath9k 디바이스 드라이버를 개발하기 전에 쓰던 USB 무선랜카드는 IPTIME N150UA였다. compat-wireless 개발환경을 사용하고 나서 해당 무선랜카드를 PC에 꽂으니 커널 출력 메세지(dmesg 또는 /var/log/kern.log)에서 아래와 같이 수많은 기능들을 이해할 수 없다는 에러를 뿌린다.
$ dmesg
[338283.992800] usb 1-1.1: new high-speed USB device number 11 using ehci_hcd
[338284.102160] usb 1-1.1: New USB device found, idVendor=148f, idProduct=3070
[338284.102165] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[338284.102168] usb 1-1.1: Product: 802.11 n WLAN
[338284.102171] usb 1-1.1: Manufacturer: Ralink
[338284.102173] usb 1-1.1: SerialNumber: 1.0
[338284.122269] Compat-wireless backport release: compat-wireless-v3.6.8-1
[338284.122273] Backport based on linux-stable.git v3.6.8
[338284.122274] compat.git: linux-stable.git
[338284.124318] cfg80211: Calling CRDA to update world regulatory domain
[338284.129011] rt2x00lib: disagrees about version of symbol ieee80211_register_hw
[338284.129016] rt2x00lib: Unknown symbol ieee80211_register_hw (err -22)
[338284.129022] rt2x00lib: disagrees about version of symbol ieee80211_get_hdrlen_from_skb
[338284.129024] rt2x00lib: Unknown symbol ieee80211_get_hdrlen_from_skb (err -22)
[338284.129031] rt2x00lib: disagrees about version of symbol ieee80211_wake_queue
[338284.129033] rt2x00lib: Unknown symbol ieee80211_wake_queue (err -22)
[338284.129039] rt2x00lib: disagrees about version of symbol ieee80211_get_buffered_bc
[338284.129041] rt2x00lib: Unknown symbol ieee80211_get_buffered_bc (err -22)
[338284.129048] rt2x00lib: disagrees about version of symbol wiphy_rfkill_set_hw_state
[338284.129050] rt2x00lib: Unknown symbol wiphy_rfkill_set_hw_state (err -22)
[338284.129060] rt2x00lib: disagrees about version of symbol ieee80211_queue_delayed_work
[338284.129061] rt2x00lib: Unknown symbol ieee80211_queue_delayed_work (err -22)
[338284.129065] rt2x00lib: disagrees about version of symbol wiphy_rfkill_stop_polling
[338284.129066] rt2x00lib: Unknown symbol wiphy_rfkill_stop_polling (err -22)
[338284.129069] rt2x00lib: disagrees about version of symbol ieee80211_ctstoself_get
[338284.129071] rt2x00lib: Unknown symbol ieee80211_ctstoself_get (err -22)
[338284.129081] rt2x00lib: disagrees about version of symbol ieee80211_rx
[338284.129083] rt2x00lib: Unknown symbol ieee80211_rx (err -22)
[338284.129088] rt2x00lib: disagrees about version of symbol ieee80211_iterate_active_interfaces
[338284.129090] rt2x00lib: Unknown symbol ieee80211_iterate_active_interfaces (err -22)
[338284.129093] rt2x00lib: disagrees about version of symbol ieee80211_free_txskb
[338284.129095] rt2x00lib: Unknown symbol ieee80211_free_txskb (err -22)
[338284.129102] rt2x00lib: disagrees about version of symbol ieee80211_tx_status
[338284.129104] rt2x00lib: Unknown symbol ieee80211_tx_status (err -22)
[338284.129107] rt2x00lib: disagrees about version of symbol ieee80211_stop_queue
[338284.129109] rt2x00lib: Unknown symbol ieee80211_stop_queue (err -22)
[338284.129112] rt2x00lib: disagrees about version of symbol ieee80211_stop_queues
[338284.129114] rt2x00lib: Unknown symbol ieee80211_stop_queues (err -22)
[338284.129119] rt2x00lib: disagrees about version of symbol wiphy_rfkill_start_polling
[338284.129121] rt2x00lib: Unknown symbol wiphy_rfkill_start_polling (err -22)
[338284.129124] rt2x00lib: disagrees about version of symbol ieee80211_iterate_active_interfaces_atomic
[338284.129126] rt2x00lib: Unknown symbol ieee80211_iterate_active_interfaces_atomic (err -22)
[338284.129134] rt2x00lib: disagrees about version of symbol ieee80211_channel_to_frequency
[338284.129136] rt2x00lib: Unknown symbol ieee80211_channel_to_frequency (err -22)
[338284.129139] rt2x00lib: disagrees about version of symbol ieee80211_unregister_hw
[338284.129140] rt2x00lib: Unknown symbol ieee80211_unregister_hw (err -22)
[338284.129146] rt2x00lib: disagrees about version of symbol ieee80211_beacon_get_tim
[338284.129148] rt2x00lib: Unknown symbol ieee80211_beacon_get_tim (err -22)
[338284.129150] rt2x00lib: disagrees about version of symbol ieee80211_rts_get
[338284.129152] rt2x00lib: Unknown symbol ieee80211_rts_get (err -22)
[338284.129159] rt2x00lib: disagrees about version of symbol ieee80211_queue_work
[338284.129161] rt2x00lib: Unknown symbol ieee80211_queue_work (err -22)
[338284.130166] cfg80211: World regulatory domain updated:
[338284.130170] cfg80211: (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[338284.130173] cfg80211: (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[338284.130175] cfg80211: (2457000 KHz - 2482000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
[338284.130177] cfg80211: (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
[338284.130179] cfg80211: (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[338284.130180] cfg80211: (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
$
USB 연결에는 이상이 없는지 확인해 보니 USB 장치 수준에서는 제대로 인식을 하고 있다.
$ lsusb
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 012: ID 148f:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter
$
<해결 방법>
원인이 명확하게 Compat-wireless 개발환경이기 때문에 해결 방법은 간단하다.
Ralink 계열도 이해할 수 있도록 ath9k 뿐만 아니라 다른 모든 칩셋의 소스코드를 다 컴파일하면 된다. 그러면 다른 칩셋 계열의 기능을 이해할 수 있는 mac80211, cfg80211 커널 모듈이 새로 생성되고, 이들이 자동으로 시스템의 /lib/modules/ 에 복사된다.
(먼저 compat-wireless 개발환경의 최상위 디렉토리로 이동한다.)
$ ./scripts/driver-select restore <-- 소스코드 전체를 컴파일하도록 기본 설정으로 되돌림
$ sudo make install
(모든 칩셋을 다 컴파일하기 때문에 성능이 안좋은 PC에서는 꽤 긴 시간이 걸린다.)
$ sudo make wlunload <-- 기존에 로드된 무선네트워크 관련 모듈을 unload 시킨다.
위와 같이 하고 나서 USB 디바이스 드라이버에 해당하는 모듈을 sudo modprobe를 이용해서 load한다. (예: $ sudo modprobe rt2800usb) 콘솔 화면에서 무슨 모듈이 unload되었는지 확인하고 그것들을 다시 load하면 되는데, 무엇을 load해야 할 지 잘 모르는 경우가 있을 수도 있다.
그럴 때는 USB 무선랜카드를 뽑았다가 다시 PC에 꽂으면 된다. 또는 깔끔하게 재부팅하는 것도 좋은 방법이다.
'IT > Linux' 카테고리의 다른 글
Ubuntu에서 KVM(virt-manager) 활용시 NAT 해제 및 재설정 (Disable and enable NAT settings) (0) | 2014.10.06 |
---|---|
우분투(Ubuntu) 머신에 VNC 연결시 Login Keyring을 묻는 현상 해결방법 (0) | 2014.07.24 |
프로그램 코드에서 얻는 IP주소와 실제 IP주소가 다른 경우 (0) | 2014.06.02 |
우분투(Ubuntu)에서 vim에 Taglist가 작동하지 않는 경우 (0) | 2014.05.12 |
Ctags를 활용해서 키워드로 소스코드 탐색하기 (0) | 2014.05.10 |