WIFI 드라이버에서 사용되는 DDI 에 대한 모든 설명을 기술하고 있다. WIFI DDI 구조화를 진행하던 중에 만든 'WIFI DDI Implementation Guide' 를 근본으로 한다.
About This Document
Revision History
Version | Date | Comment | Author |
1.0 | 2010-6-29 | 최초 작성 | 연구5실 AP 그룹 김우종 주임연구원 |
Purpose
본 문서는 DTV 상에서 WIFI 기능을 사용하기 위해서 알아야 할 WIFI 동작과 이 때 실행되는 DDI 에 대한 설명을 기술하고 있다. 이 문서를 통해 WIFI 의 동작을 좀더 쉽게 이해할 수 있고 나아가서는 디버깅 및 기능 개선 하는데 소요되는 시간을 줄일 수 있을 것이라 기대한다.
Conventions and Acronyms
Codes
소스코드와 API 함수 표기는 굴림 글꼴로 표시한다.
Notes & Cautions
내용 중 알아두면 편리한 참고 사항과 반드시 알아야 하는 중요 사항을 다음과 같이 표시한다.
<Note> | 내용 중 알아두면 편리한 각종 참고 사항 |
<Caution> | 내용 중 반드시 알아야 하는 중요한 사항 |
Acronyms
본 문서는 다음과 같은 약어를 사용한다.
Acronym | Description |
WIFI | Wi-Fi (Wireless Fidelity) is a trademark of the Wi-Fi Alliance that manufacturers may use to brand certified products that belong to a class of wireless local area network (WLAN) devices based on the IEEE 802.11 standards, which is by far the most widespread WLAN class today. |
SSID | Service Set Identifier. 무선랜을 통해 전송되는 패킷들의 각 헤더에 덧붙여지는 32 바이트 길이의 고유 식별자로서, 무선 장치들이 BSS(basic service set)에 접속할 때 인증키로 사용된다. SSID는 하나의 무선 랜을 다른 무선랜으로부터 구분해 주므로, 특정 무선랜에 접속하려는 모든 AP나 무선 장치들은 반드시 동일한 SSID를 사용해야만 한다. 특정 BSS의 고유한 SSID를 알지 못하는 그 어떠한 장치도 그 BSS 에 접속할 수 없다. SSID는 패킷 상에 포함된 평범한 텍스트 데이터이고, 충분히 스니핑 당할 가능성이 있기 때문에, 네트워크에 대해 어떠한 보증도 하지 않는다. |
RSSI | Received Signal Strength Indication. AP 에서부터 WIFI 칩셋까지의 라디오 주파수 신호세기를 의미한다. |
BSS | The basic service set (BSS) is a set of all stations that can communicate with each other. There are two types of BSS: Independent BSS (also referred to as IBSS), and infrastructure BSS. Every BSS has an identification (ID) called the BSSID, which is the MAC address of the access point servicing the BSS. An independent BSS (IBSS) is an ad-hoc network that contains no access points, which means they can not connect to any other basic service set. An infrastructure can communicate with other stations not in the same basic service set by communicating through access points. |
WEP | Wired Equivalent Privacy. 개인적인 데이터 프레임을 암호화하기 위한 표준이며, 최소한의 정보 보호를 제공하기 위해 만들어졌고 어느 정도 성공하고 있다. 하지만, 2001년 8월 공개적으로 해킹되어 더 이상 안전하지 않다. |
WPA | WIFI Protected Access. WIFI Alliance 의 감독하에 수행하는 인증 프로그램으로, WIFI Alliance 가 책정한 보안 프로토콜 네트워크 장비가 준수하고 있음을 나타내는 보안 프로토콜이다. WEP 의 취약점 때문에 대안으로 나왔다. |
WPA2 | 2세대 WPA 로서 보안 기능이 개선되었으며 AES 암호화, 사전 인증 및 PMKID 캐시로 구성된다. |
BBTV | Broadband TV. 네트워크를 통해 컨텐츠를 실시간으로 재생 가능하다. |
VID | Vendor ID. 제조 회사를 나타내며, 동일한 회사에서 나오는 디바이스들은 모두 동일한 VID 를 가진다. |
PID | Product ID. 각 제품별로 다른 PID 를 가진다. 다른 제품들과 겹치면 안되기 때문에 별도의 관리가 필요하다. 따라서 벤더마다 PID 규칙을 지정해서 사용한다. |
NM | Network Manager. GP 기반의 DTV Application 과 WIFI Driver 사이에서 데이터 및 이벤트를 전달하는 Middleware. |
AP | Access Point. 흔히 유무선 공유기라도 불리며, 요즘에는 공유기 기능 외에 라우터, 방화벽 등의 기능도 함께 제공한다. 일반적으로 WIFI 는 하나의 AP 에 접속하여 외부와의 통신을 할 수 있다. |
TKIP | Temporal Key Integrity Protocol. 해싱 알고리즘을 사용하여 데이터 암호화 성능을 개선하고 키 재설정 방법을 포함하여 데이터 암호화 방법이 크게 개선되었다. |
AES | Advanced Encryption Standard. WPA, WPA2 의 필수 프로토콜인 TKIP 을 대체하기 위해 만들어진 IEEE 802.11i 암호화 프로토콜. WPA2 표준의 필수요소이며, WPA 표준의 선택적 요소이고, RSN 을 따르는 네트워크에 대해 요구되는 옵션이다. |
PSK | Pre Shared Key. 인증을 위해 서버를 사용하는 방식이 아닌, 클라이언트와 AP 간에 인증하는 방식이다. |
WPS | WIFI Protected Setup. 사용자가 일일이 비밀번호를 입력하는 번거로움 없이 AP에 접속할 수 있는 방법으로 AP의 버튼을 누르는 PBC 모드와 WIFI Dongle 의 PIN 숫자를 입력하는 PIN 모드가 있다. |
PBC | Push Button Configuration. WPS 접속 방식의 하나로, AP 에 붙어있는 버튼과 WIFI Dongle 에 달린 버튼을 누름으로써 이들 기기끼리 자동으로 접속되는 방법이다. |
PIN | Personal Information Number. WIFI Dongle 에 입력되어 있는 PIN Number(8자리의 숫자)를 AP 에 등록하면, 자동으로 해당 PIN Number 를 갖는 WIFI Dongle 과 접속된다. |
Overview
WIFI 는 무선 대역을 통해 상대방과 상호간에 통신을 할 수 있게 해준다. 현재(GP2 기준) WIFI 기능에 요구되는 Spec 은 다음과 같다.
- 802.11 a/b/g/n (Dual Band)
- Infrastructure/Ad-hoc Mode
- WEP64/128bit, WPA/WPA2(TKIP/AES), WPS(PBC/PIN) 지원
BB 서비스(YouTube, Picasa등)와 DLNA 기능에서 WIFI 를 사용하고 있다. WIFI 를 동작하기 위해서는 WIFI 드라이버 프로그램이 필요하다. WIFI Driver 는 Linux Kernel 에서 기본적으로 지원되기도 하지만, 대체로 WIFI 칩 벤더에서 따로 제공된다.
이를 커널과 함께 빌드하면, 커널 오브젝트 파일 형태(.ko), 즉 WIFI 모듈이 생성된다. 빌드시, WIFI 관련 커널 옵션을 활성화(Enable)해야 한다. 부팅 시에 WIFI 모듈은 커널 메모리에 로딩됨으로써, 해당 WIFI 칩을 동작시킬 수 있는 준비가 끝나게 된다. WIFI 동작은 드라이버 독립적으로 할 수 없고, NM 을 통해서 명령을 받아 동작한다.
현재(GP2 기준) USB 타입의 WIFI Dongle 을 지원하고 있다. 초기 동작 순서를 살펴보면 다음과 같다.
- DTV 부팅하면서, WIFI 커널 오브젝트 파일을 로딩한다.
- WIFI Dongle 을 꼽는다.
- VID 와 PID 를 확인하고, 드라이버의 초기화(Initial) 루틴을 수행한다.
- 이후 Middleware 및 UI 와의 통신을 통해 ioctl 함수로 WIFI 칩셋을 동작시킨다.
다음은 AP 연결 시의 과정을 살펴보면 아래 그림과 같다.
Scan
주변의 WIFI 디바이스를 검색한다. 이때, AP 로부터 주기적으로 발생하는 Beacon 또는 Probe 메시지를 통해 해당 AP 의 정보를 얻는다. 이때 얻는 정보들은 다음과 같다.
- SSID
- BSSID
- RSSI
- Channel(2.4GHz/5GHz)
- Mode(Infrastructure/Ad-hoc)
- Authentication(OPEN/WEP/WPA/WPA2)
위의 정보를 저장하여 NM 에 전달하면, 이를 다시 UI 로 보내 스캔한 AP 들의 목록을 화면에 표시해준다.
Authentication
사용자가 접속하려는 AP 를 선택하고, 이때 인증(Authentication)을 요구하면, 해당 비밀번호를 입력하여 인증을 요청한다.
Combine
비밀번호가 일치하면, AP 에 연결된다(Association).
Data Transfer
이후 외부로 나가는 모든 데이터를 AP를 통해 전송한다.
WIFI Operation
각 주요 동작에 따른 방식을 DDI 시퀀스를 통해 알아보도록 한다.
WIFI Initial
WIFI 커널 모듈이 로딩되면, 위 그림의 순서로 초기화가 이루어진다. 이는 로딩 시에 수행되는 Module_init() 함수로 인해 수행된다. 이때, WIFI Dongle 에 대한 정보(VID, PID)와 꼽혔을 때와 빠졌을 때의 함수를 등록한다. 또한 통신을 위한 정보(Buffer, Mtu 등)를 설정한다. 이후 Middleware 로부터 명령을 받아 동작하게 된다.
AP Scan
주변의 AP 를 Scan 하고, 검색된 AP 를 대상으로 연결을 요청하고 기타 기능을 수행할 수 있다.
실제로 Scan 이후에 결과를 요청하기까지 물리적인 시간이 필요하다. 참고로 현재 BCM WIFI Chip 기반에서는 최소 Scan 시간을 2초로 하고 있으며, 이 값은 Chip 벤더에 따라서 달라질 수 있다. 이후 DDI_WIFI_GetScanResult() 를 호출하여, Scan 결과를 WIFI_INFO_T 구조체에 복사하여 리턴한다.
AP Connection
접속하려는 AP 가 WEP, WPA, WPA2 등의 인증방식을 요구하고 있다면, 접속에 필요한 정보(SSID, Passwd 등)를 이용하여 접속을 시도한다(DDI_WIFI_StartConnection() 호출).
이후 DDI_WIFI_GETBSSID() 와 DDI_WIFI_SSID() 를 이용하여 접속이 되었는지 확인한다. AP 에 따라 BSSID 또는 SSID 하나의 정보만으로 접속 상태를 확인할 수 없는 경우가 있어 두 정보를 모두 확인하여 접속여부를 확인한다. 두 함수 모두, 수행 결과를 리턴 한다. 이후 인자에 들어있는 값을 확인하여 접속이 되었는지 여부를 판단한다. 예를 들어 SSID 가 가질 수 있는 문자(32)를 넘으면, 유효한 값으로 인정하지 않는다. 실제로 접속이 되면, 접속된 AP 의 BSSID 나 SSID 를 반환해준다.
API Reference Guide
Middleware 와 통신하기 위해 사용되는 DDI 와 그에 사용되는 Structure 에 대한 설명을 하고 있다.
Structures
WIFI_BSS_INFO_T
AP 정보를 저장하는 구조체. AP Scan 결과를 저장할 때 사용한다.
typedef struct _WIFI_BSS_INFO_T { INT ssid[IW_ESSID_MAX_SIZE + 1]; // SSID UINT8 bssid[6]; // BSSID WIFI_MODE_T mode; // WIFI connection mode (infra/adhoc) INT32 channel; // Channel INT32 authenc; // Security type (open/wep/wpa/wpa2) INT32 rssi; // RSSI WIFI_STD_TYPE_T type; // 802.11 a/b/g/n } WIFI_BSS_INFO_T;
WIFI_BSS_CFG_T
AP별 Profile 데이터를 저장하는 구조체. Profile 정보를 저장하거나, 읽을 때 사용한다.
typedef struct _WIFI_BSS_CFG_T { INT32 valid; // Validation of profile INT8 real_ssid[IW_ESSID_MAX_SIZE + 1]; // SSID UINT8 bssid[6]; // BSSID INT32 mode; // WIFI connection mode (infra/adhoc) UINT8 key[NM_KEY_BUFFER_LEN]; // Key value INT32 key_len; // Length of key INT32 pass_phrase; // Password phrase WIFI_PROF_CONFIG prof; // Profile structure INT32 prof_num; // Number of profile } WIFI_BSS_CFG_T;
WIFI_PROF_CONFIG
AP 별 Profile 에 대한 설정을 저장하는 구조체.
typedef struct { INT8 name[WL_PROF_MAX_NAME_LEN + 1]; // Profile name INT8 ssid[IW_ESSID_MAX_SIZE + 1]; // SSID WIFI_PROF_WLMODE mode; // Connect mode(infra/adhoc) WIFI_PROF_AUTHENC suite; // Security type(open/wep/wpa/wpa2) INT8 key[WL_PROF_MAX_KEY_LEN + 1]; // Network key INT32 key_index; // Index of key in key table INT32 channel; // Radio channel INT32 dhcp; // Dhcp enable flag UINT32 ip_address; // IP address UINT32 ip_netmask; // Net mask UINT32 ip_gateway; // Gateway WIFI_PROF_IPLIST dns; // DNS server address }WIFI_PROF_CONFIG
WIFI_COUNTRY_CODE_T
각각 다른 규격을 갖는 국가목록을 정의.
typedef enum _WIFI_COUNTRY_CODE_T { WIFI_COUNTRY_NOT_SET = 0, WIFI_COUNTRY_RU, // Russia WIFI_COUNTRY_DE, // Germany WIFI_COUNTRY_TR, // Turkey WIFI_COUNTRY_KR, // Korea WIFI_COUNTRY_TW, // Taiwan WIFI_COUNTRY_US, // USA WIFI_COUNTRY_CN, // China WIFI_COUNTRY_BR, // Brazil WIFI_COUNTRY_AU, // Australia WIFI_COUNTRY_PH, // Philippine WIFI_COUNTRY_AR, // Argentina WIFI_COUNTRY_IN, // India WIFI_COUNTRY_SA, // Saudi Arabia WIFI_COUNTRY_TN, // Tunisia WIFI_COUNTRY_PK, // Pakistan WIFI_COUNTRY_ID, // Indonesia WIFI_COUNTRY_MY, // Malaysia WIFI_COUNTRY_ZA, // South Africa WIFI_COUNTRY_VN, // Vietnam WIFI_COUNTRY_IL, // Israel WIFI_COUNTRY_SG, // Singapore WIFI_COUNTRY_KZ, // Kazakhstan WIFI_COUNTRY_KW, // Kuwait WIFI_COUNTRY_LAST, // DO NOT re-arrange or remove. WIFI_COUNTRY_NUM = WIFI_COUNTRY_LAST -1, }
WIFI_LED_STATUS_T
WIFI Dongle 의 LED 의 상태를 정의.
typedef enum _WIFI_LED_STATUS_T { WIFI_LED_OFF = 0, // LED OFF WIFI_LED_ON = 1. // LED ON WIFI_LED_BLINK = 18, // LED BLINK }
WIFI_SECURITY_TYPE_T
지원하는 보안 및 암호화 방식을 정의.
typedef enum WIFI_SECURITY_TYPE_T { AUTHENC_OPEN = 0, // OPEN AUTHENC_WEP, // WEP AUTHENC_WPA_PSK_TKIP, // WPA & TKIP AUTHENC_WPA_PSK_AES, // WPA & AES AUTHENC_WPA2_PSK_TKIP, // WPA2 & TKIP AUTHENC_WPA2_PSK_AES, // WPA2 & AES AUTHENC_WPA12_PSK_TKIPAES, // (WPA or WPA2) & (TKIP or AES) AUTHENC_UNKNOWN // UNKNOWN TYPE }
WIFI_STATUS_T
실행 결과 리턴 타입을 정의.
typedef enum { WIFI_OK = 0, // 정상적으로 실행했을 경우 WIFI_FAIL = -1 // 실행 도중, 에러가 발생했을 경우 } WIFI_STATUS_T
WIFI_PROF_WLMODE
접속 시에 Connection mode 를 정의.
typedef enum { MODE_INFRA = 0, // Infrastructure 모드 MODE_ADHOC, // Ad-hoc 모드 MODE_ETHERNET // Ethernet(유선) 모드 MODE_ALL // Infrastructure, Ad-hoc 모두 } WIFI_PROF_WLMODE
Common DDI Functions
DDI_WIFI_StartScan
Description | Scan 동작을 수행함. 스캔 시에 WIFI_PROF_WLMODE mode 의 값에 따라 스캔 방식이 달라진다. mode가 MODE_INFRA 일 경우 Infrastructure 로 설정 되어있는 AP 정보를 스캔하고 MODE_ADHOC 일 경우 Ad-hoc 으로 설정된 AP정보를 스캔 하여 리턴 한다. 만약 모드가 MODE_ALL 일 경우 Infrastructure 와 Ad-hoc 모두를 스캔 하여 리턴 한다. |
Syntax | WIFI_STATUS_T DDI_WIFI_StartScan(INT8 *pSsid, WIFI_PROF_WLMODE mode) |
Parameters | pSsid(IN) - Name of AP |
mode(IN) - WIFI connection of type(MODE_INFRA or MODE_ADHOC or MODE_ALL) | |
Return Value | If the function succeeds, the return value is WIFI_OK. |
If the function fails, the return is WIFI_FAIL. | |
Remarks | WIFI Driver 가 Initial 된 이후에 호출가능하며, Scan 한 결과값을 받아오기까지 시간이 소요된다. 정확한 결과를 받아오기 위해서는 이 시간을 확보해주어야 한다. 각 Chip 마다 이 시간은 다를 수 있다. 결과값을 받아오기 위해서는 DDI_WIFI_GetScanResult 를 호출하면 된다. pSsid 가 NULL 이면, 무작위로 AP 를 Scan 한다. 또한 NULL 이 아니면, 인자로 받아온 SSID 를 갖는 AP 를 Scan 한다. |
See Also | None. |
Pseudo Code
WIFI_STATUS_T DDI_WIFI_StartScan(INT8 *pSsid, WIFI_PROF_WLMODE mode) { IF (mode == MODE_INFRA) THEN /* Only scan infrastructure mode */ ELSE IF (mode == MODE_ADHOC) THEN /* Only scan adhoc mode */ ELSE /* Both of them mode */ END IF /* With ssid, scan mode */ Write IOCTL to WIFI with data IF any error THEN RETURN WIFI_FAIL ELSE RETURN WIFI_OK END IF }
Example
WIFI_STATUS_T rc; rc = DDI_WIFI_StartScan(NULL, MODE_ADHOC); // Any SSID, Any mode(Infrastructure & Adhoc) if (rc < WIFI_OK) { // Do something for error handling }
DDI_WIFI_GetScanResult
Description | Scan 결과를 얻는다. 앞서 DDI_WIFI_StartScan() 을 호출하여 얻은 Scan 결과를 인자에 저장한다. 이때 저장되는 것들은 SSID, BSSID, Connect mode, Channel, Security type, RSSI 등이다. |
Syntax | WIFI_STATUS_T DDI_WIFI_GetScanResult(WIFI_BSS_INFO_T *pScanResult, INT32 *pApNum) |
Parameters | pScanResult(OUT) - AP information of scan result |
pApNum(OUT) - Number of AP scan result | |
Return Value | If the function succeeds, the return value is WIFI_OK. |
If the function fails, the return is WIFI_FAIL. | |
Remarks | Scan 동작 이후에 호출되어야 한다. Scan 된 AP 의 정보와 개수를 반환한다. 만일 Scan 수행없이 호출할 경우, 검색 결과를 NULL 로 리턴한다. 또한 실제 검색 결과, 찾은 AP 가 없을 때도 NULL 을 리턴한다. |
See Also | DDI_WIFI_GetSSID, DDI_WIFI_StartConnection |
Pseudo Code
WIFI_STATUS_T DDI_WIFI_GetScanResult(WIFI_BSS_INFO_T *pScanResult, INT32 *pApNum) { /* Command to get scan result */ Write IOCTL to WIFI with data Save NM_BSS_INFO_T about scan result IF any error THEN RETURN WIFI_FAIL ELSE RETURN WIFI_OK END IF }
Example
NM_BSS_INFO_T scanResult; INT32 ap_number; WIFI_STATUS_T rc; DDI_WIFI_StartScan(NULL, MODE_ADHOC); // Scan AP rc = DDI_WIFI_GetScanResult (scanResult, &ap_number); if (rc < WIFI_OK) { // Do something for error handling }
DDI_WIFI_GetBSSID
Description | BSSID 를 얻어온다. AP 와 접속이 되었는지 여부를 확인할 때 호출한다. |
Syntax | WIFI_STATUS_T DDI_WIFI_GetBSSID(INT8* pBssid) |
Parameters | pBssid(OUT) - Variable to save BSSID |
Return Value | If the function succeeds, the return value is WIFI_OK. |
If the function fails, the return is WIFI_FAIL. | |
Remarks | AP 또는 다른 디바이스와 연결이 되었는지 여부를 판단할 때 호출한다. 연결되어 있으면, WIFI_OK 을 반환, 그렇지 않으면 WIFI_FAIL 을 반환한다. pBssid는 64자 이내이어야 하고 특수문자로 시작하면 안 된다. 유효하지 않은 pBssid에 대해 WIFI_FAIL을 리턴 해야 한다. |
See Also | DDI_WIFI_GetSSID, DDI_WIFI_StartConnection |
Pseudo Code
WIFI_STATUS_T INT32 DDI_WIFI_GetBSSID(INT8* pBssid) { /* Get bssid command */ Write IOCTL to WIFI with data IF any error THEN RETURN WIFI_FAIL ELSE RETURN WIFI_OK END IF }
Example
INT8 bssid[6]; INT32 status; If(DDI_WIFI_GetBSSID(bssid) != WIFI_OK) // Check connection to AP { // Do something for error handling } status = (bssid[0] || bssid[1] || bssid[2] || bssid[3] || bssid[4] || bssid[5]); if(status == WIFI_FAIL) printf(“Disconnect to AP\n”);
DDI_WIFI_GetSSID
Description | SSID 를 얻는다. AP 와 접속이 되었는지 여부를 확인할 때 호출한다. |
Syntax | WIFI_STATUS_T DDI_WIFI_GetSSID(INT8 *pSsid, INT32 *pLength) |
Parameters | pSsid(OUT) - Name of AP |
pLength(OUT) - Length of SSID | |
Return Value | If the function succeeds, the return value is WIFI_OK. |
If the function fails, the return is WIFI_FAIL. | |
Remarks | AP 또는 다른 디바이스와 연결이 되었는지 여부를 판단할 때 호출한다. 연결되어 있으면, 연결된 AP 의 SSID 를 얻어온다. SSID 는 64자 이내이어야 하고 특수문자로 시작하면 안된다. 만일 유효하지 않은 SSID 값을 가져오면, 접속이 안된 것으로 처리한다. |
See Also | None |
Pseudo Code
WIFI_STATUS_T DDI_WIFI_GetSSID(INT8 *pSsid, INT32 *pLenth) { /* Get ssid command */ Write IOCTL to WIFI with data IF any error THEN RETURN WIFI_FAIL ELSE RETURN WIFI_OK END IF }
Example
If(DDI_WIFI_GetSSID(ssid, &ssid_len) != WIFI_OK) { // Do something for error handling }
DDI_WIFI_GetRSSI
Description | 접속된 AP 로부터 라디오 신호세기 값을 얻어온다. AP 에 접속되면, 주기적으로 데이터를 주고 받는 데, 이때 RSSI 값을 가지고 있게 된다. 이 함수를 호출하면 이 값을 정수 형태로 리턴 한다. |
Syntax | INT32 DDI_WIFI_GetRSSI(void) |
Parameters | None |
Return Value | The return is RSSI value. |
Remarks | AP 또는 다른 디바이스 접속된 후에 호출한다. 접속된 AP 가 없을 경우에는 NULL 을 리턴 한다. |
See Also | None |
Pseudo Code
INT32 DDI_WIFI_GetRSSI(void) { /* Get rssi command */ Write IOCTL to WIFI with data }
Example
INT32 rssi; rssi = DDI_WIFI_GetRSSI(); if(rssi == 0) { // Do something for error handling } else printf(“RSSI is %d\n”, rssi);
DDI_WIFI_Disassociation
Description | 연결된 접속을 끊는다. |
Syntax | WIFI_STATUS_T DDI_WIFI_Disassociation(void) |
Parameters | None |
Return Value | If the function succeeds, the return value is WIFI_OK. |
If the function fails, the return is WIFI_FAIL. | |
Remarks | 새로운 네트워크 인터페이스(유/무선) 또는 네트워크 설정을 다시 할 때 기존의 연결을 끊기 위해 호출한다. |
See Also | None |
Pseudo Code
WIFI_STATUS_T DDI_WIFI_Disassociation(void) { /* Set disassoc command */ Write IOCTL to WIFI with data IF any error THEN RETURN WIFI_FAIL ELSE RETURN WIFI_OK END IF }
Example
If(DDI_WIFI_ Disassociation() != WIFI_OK) { // Do something for error handling }
DDI_WIFI_StartConnection
Description | 접속정보를 가지고 접속 시도를 시작한다. |
Syntax | WIFI_STATUS_T DDI_WIFI_StartConnection(WIFI_BSS_CFG_T *pCfg) |
Parameters | pCfg(IN) - Structure to store a profile data |
Return Value | If the function succeeds, the return value is WIFI_OK. |
If the function fails, the return is WIFI_FAIL. | |
Remarks | 스캔하여 접속하려는 디바이스에 대한 정보를 저장한 후, 이를 이용하여 접속을 시도한다. 이때 미리 저장되어 있는 Profile 을 사용할 수도 있고, 사용자가 지정한 정보(SSID, 비밀 번호등)를 가지고 접속할 수도 있다. pCfg 가 NULL 인 경우 WIFI_FAIL 을 리턴 한다. |
See Also | DDI_WIFI_Disassociation |
Pseudo Code
WIFI_STATUS_T DDI_WIFI_StartConnection(WIFI_BSS_CFG_T *pCfg) { IF (Security Mode is WEP) then { /* Connect wep connection */ Write IOCTL to WIFI with data } ELSE IF (Security Mode is WPA) then { /* Connect wpa connection */ Write IOCTL to WIFI with data } IF any error THEN RETURN WIFI_FAIL ELSE RETURN WIFI_OK END IF }
Example
INT32 ap_number; STATUS_T rc; NM_BSS_INFO_T scanResult; WIFI_BSS_CFG_T * cfg; rc = DDI_WIFI_StartScan(NULL, MODE_ADHOC); if(rc != WIFI_OK) { // Do something for error handling } rc = DDI_WIFI_GetScanResult(scanResult, &ap_number); if(rc != WIFI_OK) { // Do something for error handling } If(DDI_WIFI_StartConnection(cfg) != WIFI_OK) { // Do something for error handling }
DDI_WIFI_IsAdhocConnected
Description | Adhoc 모드로 접속되어 있는지 여부를 확인한다. |
Syntax | BOOL DDI_WIFI_IsAdhocConnected(void) |
Parameters | None |
Return Value | If WIFI connects with adhoc, the return value is TRUE. |
If WIFI not connects with adhoc, the return value is FALSE. | |
Remarks | Adhoc 으로 접속이 안되어 있으면, FALSE 을 반환하고, 접속되어 있으면, TRUE 을 반환한다. |
See Also | None |
Pseudo Code
BOOL DDI_WIFI_IsAdhocConnected() { /* Get adhoc connection status */ Write IOCTL to WIFI with data IF any error THEN RETURN FLASE ELSE RETURN TRUE END IF }
Example
If(DDI_WIFI_IsAdhocConnected() == FALSE) { printf(“Not connect with Adhoc\n”); }
DDI_WIFI_IsAPConnected
Description | AP 접속이 되어있는지 여부를 확인한다. |
Syntax | BOOL DDI_WIFI_IsAPConnected(void) |
Parameters | None |
Return Value | If WIFI connect with AP, the return value is TRUE. |
If WIFI not connect with AP, the return value is FALSE. | |
Remarks | AP 접속이 되어있는지 여부를 확인할 때 호출한다. |
See Also | DDI_WIFI_GetSSID, DDI_WIFI_StartConnection |
Pseudo Code
BOOL DDI_WIFI_IsAPConnected() { /* Get ap connection command */ Write IOCTL to WIFI with data IF any error THEN RETURN FALSE ELSE RETURN TRUE END IF }
Example
If(DDI_WIFI_IsAPConnected() == FALSE) { printf(“Not connect with AP\n”); }
DDI_WIFI_WPS_PBCStart
Description | WPS 의 PBC 모드로 동작한다. |
Syntax | WIFI_STATUS_T DDI_WIFI_WPS_PBCStart(void) |
Parameters | None |
Return Value | If the function succeeds, the return value is WIFI_OK. |
If the function fails, the return is WIFI_FAIL. | |
Remarks | 함수를 호출하면 내부 Thread 를 생성하여 PBC 모드 접속에 대한 모든 과정을 처리한다. 처리가 끝나면, 해당 Thread 는 종료되고 사용했던 자원들을 해제한다. |
See Also | None |
Pseudo Code
WIFI_STATUS_T DDI_WIFI_WPS_PBCStart(void) { CREATE THREAD for WPS PBC MODE THREAD_DETACH for WPS PBC MODE IF any error THEN RETURN WIFI_FAIL ELSE RETURN WIFI_OK END IF }
Example
If(DDI_WIFI_WPS_PBCStart() != WIFI_OK) { // Do something for error handling }
DDI_WIFI_WPS_PINStart
Description | WPS 의 PIN 모드로 동작한다. |
Syntax | WIFI_STATUS_T DDI_WIFI_WPS_PINStart(INT8* pSsid) |
Parameters | pSsid(IN) - Name of connect to AP with PIN mode |
Return Value | If the function succeeds, the return value is WIFI_OK. |
If the function fails, the return is WIFI_FAIL. | |
Remarks | 함수를 호출하면 내부 Thread 를 생성하여 PIN 모드 접속에 대한 모든 과정을 처리한다. 처리가 끝나면, 해당 Thread 는 종료되고 사용했던 자원들을 해제한다. |
See Also | None |
Pseudo Code
WIFI_STATUS_T DDI_WIFI_WPS_PINStart(INT8* pSsid) { CREATE THREAD for WPS PIN MODE THREAD_DETACH for WPS PIN MODE }
Example
INT8 ssid[33]; DDI_WIFI_GetSSID(ssid, &ssid_len); If(DDI_WIFI_WPS_PINStart(ssid) != WIFI_OK) { //Do something for error handling }
DDI_WIFI_WPS_IsConnected
Description | WPS 모드로 접속했을 때, AP 에 접속이 되어있는지 확인한다. |
Syntax | BOOL DDI_WIFI_WPS_IsConnected(void) |
Parameters | None |
Return Value | If WIFI connect with WPS, the return value is TRUE. |
If WIFI not connect with WPS, the return is FALSE. | |
Remarks | WPS 모드로 접속이 되어 있는지 여부를 판단할 때, 호출한다. |
See Also | None |
Pseudo Code
BOOL DDI_WIFI_WPS_IsConnected() { IF (isConnect == 0) THEN /* isConnect(=WPS connection status global variable) */ /* Not connect with WPS */ ELSE /* Connect with WPS */ }
Example
If(DDI_WIFI_WPS_IsConnected() == FALSE) { printf(“WIFI not connect with WPS\n”); }
DDI_WIFI_WPS_Stop
Description | WPS 의 PBC 또는 PIN 모드를 중지하여 빠져 나오다. |
Syntax | WIFI_STATUS_T DDI_WIFI_WPS_Stop(void) |
Parameters | None |
Return Value | Always, the return value is 0. |
Remarks | WPS 의 PBC 또는 PIN 모드로 동작 시, 해당 Thread 가 실행되는데 이때 사용자에 의해 접속 시도가 취소될 수 있다. 취소 명령이 NM 으로부터 내려오면, 실행하던 Thread 를 종료하고 빠져 나와야 한다. 이때 전역변수(ex: IsStopval)를 이용하여 취소 명령여부를 확인할 수 있는데, WIFI_OK 이면 Stop 명령이 들어온 것이고, WIFI_FAIL 이면 들어오지 않은 것이다. |
See Also | None |
Pseudo Code
WIFI_STATUS_T DDI_WIFI_WPS_Stop() { IsStopval == 1 /* IsStopval(=Check global variable) */ }
Example
DDI_WIFI_WPS_Stop();
DDI_WIFI_WPS_GetPincode
Description | PIN Number 코드를 얻는다. |
Syntax | void DDI_WIFI_WPS_GetPincode(INT8* pPinCode) |
Parameters | pPinCode(OUT) - Save to pin code |
Return Value | None |
Remarks | WIFI 가 초기화된 이후에 호출하여야 한다. PIN code 는 정해진 스펙에 따라 이루어진 8자리의 숫자다. 이는 WPS 의 PIN mode 로 접속 시에 사용하게 되며, 스펙의 적합여부를 판단하여 만족하지 못하면, PIN mode 접속이 실패하게 된다. |
See Also | None |
Pseudo Code
void DDI_WIFI_WPS_GetPincode(INT8* pPinCode) { /* Get pin code command */ Write IOCTL to WIFI with data /* Store to PINcode */ pPinCode = Pincode; }
Example
INT8 pinCode[32]; DDI_WIFI_WPS_GetPincode(pinCode);
DDI_WIFI_GetConfig
Description | WPS 를 통한 AP 접속 후에 연결 설정 정보를 얻는다. |
Syntax | WIFI_STATUS_T DDI_WIFI_GetConfig(INT8* pKey, wl_prof_authenc* pSecType, INT32* pKeyIndex) |
Parameters | pKey(IN) - Name of AP with WPS mode |
pSecType(OUT) - Type of security | |
pKeyIndex(OUT) - Only use WEP | |
Return Value | Always, the return value is 0. |
Remarks | WPS 로 AP 연결 접속이 되었는지 확인 시에 호출된다. |
See Also | None |
Pseudo Code
WIFI_STATUS_T DDI_WIFI_GetConfig(INT8* pKey, wl_prof_authenc* pSecType, INT32* pKeyIndex) { GET DATA /* all configuration for connection after connect to AP with WPS mode */ }
Example
NM_BSS_CFG_T *cfg; wl_prof_authenc tSuite; INT32 tKeyIndex; DDI_WIFI_GetConfig (cfg->prof.key, &tSuite, &tKeyIndex); printf(“ssid = %s\n”, cfg->ssid); printf(“mode = %d\n”, cfg->mode);
DDI_WIFI_IsRadioOn
Description | 신호를 받을 수 있는 상태인지 확인한다. Radio 가 켜져(Enable)있으면, 신호를 주고 받을 수 있으며, 꺼져(Disable)있으면, 서로 통신할 수 없다. |
Syntax | BOOL DDI_WIFI_IsRadioOn(void) |
Parameters | None |
Return Value | If the Radio disable, the return value is FALSE. |
If the Radio enable, the return is TRUE. | |
Remarks | Radio 가 Disable 되어 있으면, FALSE 를 반환하고, Enable 되어 있으면, TRUE 를 반환한다. |
See Also | None |
Pseudo Code
BOOL DDI_WIFI_IsRadioOn() { /* Get radio status command */ Write IOCTL to WIFI with data }
Example
If(DDI_WIFI_IsRadioOn() == FALSE) { printf(“Radio Disable\n”); }
DDI_WIFI_SetRadioOn
Description | Radio 상태를 설정한다. |
Syntax | WIFI_STATUS_T DDI_WIFI_SetRadioOn(BOOL radioOn) |
Parameters | radioOn(IN) - Set radio on or off |
Return Value | If the function succeeds, the return value is WIFI_OK. |
If the function fails, the return is WIFI_FAIL. | |
Remarks | 인자가 TRUE 이면, Radio 를 Enable 하고, FALSE 이면 Disable 한다. |
See Also | None |
Pseudo Code
WIFI_STATUS_T DDI_WIFI_SetRadioOn(BOOL radioOn) { /* Set radio on command */ Write IOCTL to WIFI with data IF any error THEN RETURN WIFI_FAIL ELSE RETURN WIFI_OK END IF }
Example
If(DDI_WIFI_SetRadioOn(TRUE) != WIFI_OK) { // Do something for error handling }
DDI_WIFI_GetChannel
Description | 현재 접속된 AP 의 Radio Channel Number 를 리턴한다. |
Syntax | INT32 DDI_WIFI_GetChannel(void) |
Parameters | None |
Return Value | If the function fails, the return is 0. |
If the return is not 0, it is channel number. | |
Remarks | AP 접속이 된 이후에 호출해야 한다. |
See Also | None |
Pseudo Code
INT32 DDI_WIFI_GetChannel(void) { /* Get channel number */ Write IOCTL to WIFI with data IF any error THEN RETURN 0 ELSE RETURN CHANNEL NUMBER END IF }
Example
INT32 retChannel; retChannel = DDI_WIFI_GetChannel(); If(retChannel <= 0) { // Do something for error handling }
DDI_WIFI_SetCountry
Description | 국가코드를 설정한다. 국가마다 WIFI 규격이 다르기 때문에, 해당 국가마다 국가코드를 설정해주어야 한다. |
Syntax | WIFI_STATUS_T DDI_WIFI_SetCountry(WIFI_COUNTRY_CODE_T ccode, INT32 rev) |
Parameters | ccode(IN) - Name of wifi country list |
rev(IN) - Revision wifi spec | |
Return Value | If the function succeeds, the return value is WIFI_OK. |
If the function fails, the return is WIFI_FAIL. | |
Remarks | WIFI 가 초기화된 후에 호출한다. 국가코드 Default 값은 US 이며 설정 하지 않으면 US로 동작한다. |
See Also | DDI_WIFI_GetSSID, DDI_WIFI_StartConnection |
Pseudo Code
WIFI_STATUS_T DDI_WIFI_SetCountry(WIFI_COUNTRY_CODE_T ccode, INT32 rev) { /* Set country command */ Write IOCTL to WIFI with data IF any error THEN RETURN WIFI_FAIL ELSE RETURN WIFI_OK END IF }
Example
WIFI_COUNTRY_CODE_T ccode = WIFI_COUNTRY_KR; INT32 rev = 1; If(DDI_WIFI_SetCountry(ccode, rev) != WIFI_OK) { // Do something for error handling }
DDI_WIFI_GetCountry
Description | 현재 설정되어 있는 국가 코드 설정을 얻는다. |
Syntax | WIFI_COUNTRY_CODE_T DDI_WIFI_GetCountry(void) |
Parameters | None |
Return Value | Wifi country list(0~25) |
Remarks | WIFI 가 초기화된 후에 호출한다. |
See Also | None |
Pseudo Code
WIFI_COUNTRY_CODE_T DDI_WIFI_GetCountry(void) { /* Get country command */ Write IOCTL to WIFI with data IF any error THEN RETURN WIFI_COUNTRY_NOT_SET ELSE RETURN WIFI_COUNTRY_CODE END IF }
Example
WIFI_COUNTRY_CODE_T con; con = DDI_WIFI_GetCountry(); if(con == WIFI_COUNTRY_NOT_SET) { // Do something for error handling }
DDI_WIFI_SetLEDStatus
Description | WIFI Dongle 의 LED 의 상태를 설정한다. |
Syntax | WIFI_STATUS_T DDI_WIFI_SetLEDStatus(WIFI_LED_STATUS_T status) |
Parameters | status(IN) - Enumeration type for led status of WIFI dongle |
Return Value | If the function succeeds, the return value is WIFI_OK. |
If the function fails, the return is WIFI_FAIL. | |
Remarks | WIFI Radio 의 상태를 표현할 때 호출한다. |
See Also | DDI_WIFI_GetSSID, DDI_WIFI_StartConnection |
Pseudo Code
WIFI_STATUS_T DDI_WIFI_SetLEDStatus(WIFI_LED_STATUS_T status) { /* Set led status */ Write IOCTL to WIFI with data IF any error THEN RETURN WIFI_FAIL ELSE RETURN WIFI_OK END IF }
Example
DDI_WIFI_SetLEDStatus(FLASE); // LED OFF DDI_WIFI_SetLEDStatus(TRUE); // LED ON