드라이버 레벨에서 Wi-Fi Direct 동작을 검증할 수 있는 방법에 대해 설명한다.
빌드하기(x86)
P2P 의 경우, 최소 2 대 이상이 필요하기 때문에 TV Set 를 제외한 다른 Wi-Fi 디바이스가 필요하다. 여기서는 PC 를 예로 들겠다.
사양은 다음과 같다.
OS | Fedora 11(Leonidas) |
Kernel | 2.6.29.4-167.fc11 |
Model | XNOTE LB50 |
Driver | kirin_rel_5_100_68_31_GP3.tar.gz |
처음에 우분투를 설치하였다가, 몇 번의 삽질 끝에 Fedora 를 선택했다. 별도의 커널 빌드가 필요하지 않기 때문에, 빠른 시간에 원하는 결과물을 얻을 수 있다.
바로 빌드를 할 수 있을 것 같지만, 몇 가지 수정사항이 필요했다.
build.sh
L.21 ... elif [ "$1" == direct ] ; then source setenv-x86.sh 4323 ./build-drv-embed-p2p.sh ./build-app-p2p.sh
build-drv-embed-p2p.sh
#!/bin/bash if [ "${TARGETARCH}" == x86 ] ; then export BUILDCFG= export STBLINUX=0 else export BUILDCFG=mipsel-mips- export STBLINUX=1 fi export BUILDCFG=${BUILDCFG}apdef-stadef-high-dnglimage-media-p2p export BRAND=linux-external-wl export WLTEST=0 export FIRMWARE=${CHIPVER}-bmac/roml-ag-nodis-media-p2p echo "" echo "************************************************" echo " FIRMWARE = ${FIRMWARE} " echo "************************************************" echo "" sleep 3 mkdir ${TARGETDIR} make -C ./src/linuxdev LINUXVER=${LINUXVER} TARGETARCH=${TARGETARCH} V=1 cp -v ./src/linuxdev/obj-bcm_usbshim-${LINUXVER}-${TARGETARCH}/bcm_usbshim.ko ${TARGETDIR} make -C ./src/wl/linux ${BUILDCFG} WLTEST=${WLTEST} FIRMWARE="${FIRMWARE}" WLLXIW=${WLLXIW} LINUXVER=${LINUXVER} USBSHIM=${USBSHIM} V=1 $1 cp -v ./src/wl/linux/obj-${BUILDCFG}-${LINUXVER}/wl.ko ${TARGETDIR} cp -v ./src/wl/linux/obj-${BUILDCFG}-${LINUXVER}/wl.ko ${TARGETDIR}/${CHIPVER}-${BUILDCFG}-wl.ko make -C ./src/wl/exe // 추가 cp -v ./src/wl/exe/wl ${TARGETDIR} // 추가 cp -v ./src/wl/exe/led ${TARGETDIR} // 추가 cp -v ./src/wl/exe/ibss_status ${TARGETDIR} // 추가
build-app-p2p.sh
cp -v src/p2p/p2plib/linux/sampleapp/obj-intsec-${LINUXVER}-debug-x86/bcmp2papp ${TARGETDIR} // 수정
빌드하기(mips)
bcmp2papp 를 사용시, 여러가지 명령어들을 함께 사용한다. 이때 Path 를 맞춰주기 위해 src/p2p/p2plib/linux/sampleapp/Makefile 파일을 수정한다.
ifneq ($(findstring mipsel, $(CC)),) CFLAGS += -DTARGETENV_BCMSTB = 1 // 주석 처리 endif
마찬가지로 src/p2p/p2plib/linux/Makefile 파일을 수정한다.
ifneq ($(findstring mipsel, $(CC)),) CFLAGS += -DTARGETENV_BCMSTB = 1 // 주석 처리 endif
준비운동 하기
드라이버 레벨에서 동작 확인을 해야하기 때문에, 불가피하게 NM 을 실행하지 않도록 한다. root.c 파일을 아래와 같이 해당 루틴을 주석처리 한다.
L.684 #ifdef INCLUDE_NM /* if(OSA_MD_IsSupportNetworkSpec()) { MAIN_DoPostInitTaskDebug("CheckNM Start"); checkNMTaskID = OSA_CreateTask("CheckNM", NULL, NULL, 1); } */ #endif
또한 'NetworkManager, NetworkManager.basic' 파일을 삭제하고 빈파일을 생성한다.
# touch NetworkManager.basic
이후 NM 이 실행되지 않을 것이다. 'bcmp2papp, wlmips' 파일을 추가한다.
bcmp2papp 사용하기
Wi-Fi Direct 를 테스트하기 위해서는 아래와 같이 실행한다.
#./wlmips down #./wlmips apsta 1 #./wlmips up #./bcmp2papp -d --pif wlan0 **************************************************** Broadcom Wi-Fi Direct Host Support Library Test App Version: P2P_REL_1_132_0 **************************************************** --> Friendly name : 'BcmDevice3' --> Discovery timeout: 3600 seconds --> Listen channel : 11 --> Operating channel: 11 --> WPS mode : PBC 00000.000 **************************************************** 00000.000 Broadcom Wi-Fi Direct Host Support Library Test App 00000.000 Version: P2P_REL_1_132_0 00000.000 **************************************************** 00000.000 Compile options: 00000.000 P2PAPI_ENABLE_WPS=1 00000.000 P2PAPI_ENABLE_GO_NEGOTIATION=1 00000.000 P2PAPI_ENABLE_MULTI_CHANNEL=1 00000.000 P2PAPI_ENABLE_BLIND_CHANNEL_SYNC=0 00000.000 P2PAPI_ENABLE_DHCPD=0 00000.000 P2PAPI_ENABLE_DRIVER_EVENTS=1 00000.000 P2PAPI_USE_IDAUTH=1 00000.000 P2PAPI_USE_IDSUP=1 00000.000 P2PAPI_ENABLE_SERVICE_DISCOVERY=1 00000.000 p2papi_open: if_name=wlan0, primary_if_name=wlan0, sz=390428 00000.003 p2papi_reset_state 00000.003 p2papi_open: gon_dialog_token = 215 00000.003 p2posl_open: pri_ifname=wlan0 00000.003 p2papi_osl_init_go_neg 00000.003 p2posl_open: hdl=0x2ab75008 osl_hdl=0x52a068 wl=0x52a0f8 00000.003 osl->app_hdl=0x2ab75008 ->magic=0xa2d2 ->wl->wl_magic=0xe1c1 00000.003 p2pwl_iovar_getbuf_bss: iovar=cur_etheraddr, bssidx=0 00000.003 ---wl -i wlan0 cur_etheraddr ==> 00:e0:91:d0:be:c0 00000.003 p2papi_osl_open: P2P Device addr=02:e0:91:d0:be:c0 00000.003 P2P Interface addr=02:e0:91:d0:3e:c0 00000.003 ---wl p2p_if 02:e0:91:d0:3e:c0 00000.004 p2pwl_iovar_getbuf_bss: iovar=p2p_if, bssidx=0 00000.004 wl_ioctl: ioctl error -1 00000.004 p2pwl_iovar_getbuf_bss: iovar=bcmerrorstr, bssidx=0 00000.004 wl: Not Found 00000.004 s=5 cmd=262 buf=0x7fd36574 len=64 set=0 wl=0x52a0f8, ret=-1 00000.004 pri/dis/con ifidx=0/0/0 ifnames=wlan0//, ioctl ifname=wlan0 00000.004 WLC_GET_VAR p2p_if 00000.004 An ioctl error here is normal - it means no leftover BSS was found 00000.004 p2papi_fsm_reset 00000.004 ---wl WLC_GET_MAGIC 00000.004 ---wl WLC_GET_VERSION 00000.004 p2pwlu_p2p_apsta_setup: disc-bssidx=0 conn-bssidx=0 00000.004 p2pwl_iovar_getbuf_bss: iovar=apsta, bssidx=0 00000.004 ---wl -i wlan0 apsta ==> 1 00000.004 p2pwlu_enable_apsta: APSTA already on 00000.004 ---wl -i wlan0 p2p_disc 0 00000.005 p2pwlu_p2p_apsta_setup: done 00000.005 ---wl isup ==> 0 00000.005 ---wl up 00000.105 ---wl isup ==> 0 00000.105 ---wl -i wlan0 event_msgs 00000.105 ==> 0x0000000000000000 00000.105 p2papi_init_driver_event_masks: enab WLC_E_PROBREQ_MSG 00000.105 p2pwl_iovar_getbuf_bss: iovar=cur_etheraddr, bssidx=0 00000.106 ---wl -i wlan0 cur_etheraddr ==> 00:e0:91:d0:be:c0 00000.106 p2papi_open: my MAC=00:e0:91:d0:be:c0 00000.106 initialize_channel_list: country code=US 00000.106 ---wl p2p 00000.106 p2pwl_iovar_getbuf_bss: iovar=p2p, bssidx=0 00000.106 p2pwl_get_p2p_supported=1 00000.106 p2posl_start_raw_rx_mgr 00000.106 p2papi_linux_brcm_open: socket 9 opened 00000.106 p2papi_enable_driver_events: enab_prob_req=0 00000.106 p2papi_linux_rx_thread: begin 00000.107 ---wl -i wlan0 event_msgs 0x1050501002011be9 00000.107 ---wl isup ==> 0 00000.107 ---wl up 00000.107 p2papp_get_link_config: p2papp_go_intent=8 override=1 00000.107 p2papi_save_link_config: pConfig=0x4c3170 ssid=BcmDevice3 di=0 cg=0 cd=0 00000.107 p2papi_enable_p2p: 1 00000.107 p2papi_generate_go_ssid: fname=BcmDevice3 ssid=DIRECT-2K-BcmDevice3 00000.107 p2papi_save_link_config: generated ssid=DIRECT-2K-BcmDevice3 00000.107 config_to_credentials 00000.108 p2papi_save_link_config: changing passphrase 00000.108 passphrase_to_pmk: pp=22ndStStation 00001.345 p2pwl_iovar_getbuf_bss: iovar=cur_etheraddr, bssidx=0 00001.345 ---wl -i wlan0 cur_etheraddr ==> 00:e0:91:d0:be:c0 00001.345 p2papi_save_link_config: ch=11 rnd=0 auth=3 enc=3 ix=0 cm=392,0 00001.345 key=C9B3B0E2BC7D3B7185B7A85DCAD7FFA2E36D16539F2EB7D26016D4D02606CBDE wpsPin=12345670 00001.345 we_want_persist_grp=0 00001.345 ssid=DIRECT-2K-BcmDevice3 hide=0 wpsEn=1 p2pEn=1 intent=8 pg=392 00001.345 DHCP: enab=1 subnet=0xc0a81000 range=0xab,b4 p2papp: disabling PBC overlap detection. 00001.346 p2papi_enable_pbc_overlap: disable_pbc_overlap=1 00001.346 p2papi_enable_driver_events: enab_prob_req=0 00001.346 ---wl -i wlan0 event_msgs 0x1050401002011be9 00001.346 p2pwl_iovar_getbuf_bss: iovar=cur_etheraddr, bssidx=0 00001.346 ---wl -i wlan0 cur_etheraddr ==> 00:e0:91:d0:be:c0 --> Our MAC address : 00:e0:91:d0:be:c0 00001.346 p2papp_redraw: (null) 00001.346 +------------------------------------------------------------- 00001.346 | Status: 00001.347 | 00001.347 | P2P Discovery: Off 00001.347 | Connected : No, Pushbutton 00001.347 +------------------------------------------------------------- +-----------------------------------------------------------------------------+ | Status: | IntAddr=02:e0:91:d0:3e:c0 | P2P Discovery: Off DevAddr=02:e0:91:d0:be:c0 | Connected : No Pushbutton | _____________________ P2P Commands _______________ | e) Enable discovery l) Enter Listen state | d) Disable discovery pbc) Activate pushbutton | g) Create P2P Group Owner | <num>) Initiate connection to discovered peer <num> | P <num>) Send provision discovery request to peer <num> | Pi) Send provision discovery request on invite | I <num>) Active GO/GC send InviteReq to P2P device <num> | J) +A...H - Inactive GC send InviteReq to inactive GO | K) +A...H, +1...9 - Inactive GO send InviteReq to inactive GC | B) Enable extended listen timing | S <num>) Send service discovery to peer <num> | W) Join with WPS (after invite) | Ycda <num> <client#>) Send dev discoverability to GO <num> | ___________________ SoftAP Commands _____________ | s) Soft AP Create t) Soft AP Teardown | ___________________ Common Commands _____________ | r) Redraw screen q) Quit +-----------------------------------------------------------------------------+ >
'e' 를 입력하여 'Enable discovery' 를 선택한다.
> e > 00268.381 p2papp_redraw: ........Discovery already on...... 00268.381 +------------------------------------------------------------- 00268.381 | Status: ........Discovery already on...... 00268.382 | 00268.382 | P2P Discovery: On 00268.382 | Connected : No, Pushbutton 00268.382 | Discovered peers: 00268.382 | 1) BcmDevice3 02:e0:91:d0:54:fb Ch.11 display 00268.382 +------------------------------------------------------------- +-----------------------------------------------------------------------------+ | Status: ........Discovery already on...... | IntAddr=02:e0:91:d0:3e:c0 | P2P Discovery: On DevAddr=02:e0:91:d0:be:c0 | Connected : No Pushbutton | Discovered peers: | 1) BcmDevice3 02:e0:91:d0:54:fb Ch.11 display // 찾은 디바이스 정보 | _____________________ P2P Commands _______________ | e) Enable discovery l) Enter Listen state | d) Disable discovery pbc) Activate pushbutton | g) Create P2P Group Owner | <num>) Initiate connection to discovered peer <num> | P <num>) Send provision discovery request to peer <num> | Pi) Send provision discovery request on invite | I <num>) Active GO/GC send InviteReq to P2P device <num> | J) +A...H - Inactive GC send InviteReq to inactive GO | K) +A...H, +1...9 - Inactive GO send InviteReq to inactive GC | B) Enable extended listen timing | S <num>) Send service discovery to peer <num> | W) Join with WPS (after invite) | Ycda <num> <client#>) Send dev discoverability to GO <num> | ___________________ SoftAP Commands _____________ | s) Soft AP Create t) Soft AP Teardown | ___________________ Common Commands _____________ | r) Redraw screen q) Quit +-----------------------------------------------------------------------------+
기본 접속 설정은 'PBC' 이다. 'PIN' 으로 접속 시에는 다음과 같이 명령한다.
#./bcmp2papp -d --pif wlan0 --pin 12345670
intent 값 조정하기
bcmp2papp 는 기본적으로 intent 값이 8 로 설정되어 있다. 이 값을 수정할 수 있는데, 값이 높을 수록 GO 가 된다.
src/p2p/p2plib/linux/sampleapp/p2p_app.c 파일을 아래와 같이 수정한다.
... static BCMP2P_UINT8 p2papp_go_intent = 8; # intent value ...