WIFI 드라이버에서 사용되는 DDI 에 대한 모든 설명을 기술하고 있다. WIFI DDI 구조화를 진행하던 중에 만든 'WIFI DDI Implementation Guide' 를 근본으로 한다.

About This Document

Version Date Comment Author
1.0 2010-6-29 최초 작성 연구5실 AP 그룹 김우종 주임연구원

본 문서는 DTV 상에서 WIFI 기능을 사용하기 위해서 알아야 할 WIFI 동작과 이 때 실행되는 DDI 에 대한 설명을 기술하고 있다. 이 문서를 통해 WIFI 의 동작을 좀더 쉽게 이해할 수 있고 나아가서는 디버깅 및 기능 개선 하는데 소요되는 시간을 줄일 수 있을 것이라 기대한다.

소스코드와 API 함수 표기는 굴림 글꼴로 표시한다.

내용 중 알아두면 편리한 참고 사항과 반드시 알아야 하는 중요 사항을 다음과 같이 표시한다.

<Note> 내용 중 알아두면 편리한 각종 참고 사항
<Caution> 내용 중 반드시 알아야 하는 중요한 사항

본 문서는 다음과 같은 약어를 사용한다.

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 은 다음과 같다.

  1. 802.11 a/b/g/n (Dual Band)
  2. Infrastructure/Ad-hoc Mode
  3. 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 을 지원하고 있다. 초기 동작 순서를 살펴보면 다음과 같다.

  1. DTV 부팅하면서, WIFI 커널 오브젝트 파일을 로딩한다.
  2. WIFI Dongle 을 꼽는다.
  3. VID 와 PID 를 확인하고, 드라이버의 초기화(Initial) 루틴을 수행한다.
  4. 이후 Middleware 및 UI 와의 통신을 통해 ioctl 함수로 WIFI 칩셋을 동작시킨다.

다음은 AP 연결 시의 과정을 살펴보면 아래 그림과 같다.

주변의 WIFI 디바이스를 검색한다. 이때, AP 로부터 주기적으로 발생하는 Beacon 또는 Probe 메시지를 통해 해당 AP 의 정보를 얻는다. 이때 얻는 정보들은 다음과 같다.

  1. SSID
  2. BSSID
  3. RSSI
  4. Channel(2.4GHz/5GHz)
  5. Mode(Infrastructure/Ad-hoc)
  6. Authentication(OPEN/WEP/WPA/WPA2)

위의 정보를 저장하여 NM 에 전달하면, 이를 다시 UI 로 보내 스캔한 AP 들의 목록을 화면에 표시해준다.

사용자가 접속하려는 AP 를 선택하고, 이때 인증(Authentication)을 요구하면, 해당 비밀번호를 입력하여 인증을 요청한다.

비밀번호가 일치하면, AP 에 연결된다(Association).

이후 외부로 나가는 모든 데이터를 AP를 통해 전송한다.

WIFI Operation

각 주요 동작에 따른 방식을 DDI 시퀀스를 통해 알아보도록 한다.

WIFI 커널 모듈이 로딩되면, 위 그림의 순서로 초기화가 이루어진다. 이는 로딩 시에 수행되는 Module_init() 함수로 인해 수행된다. 이때, WIFI Dongle 에 대한 정보(VID, PID)와 꼽혔을 때와 빠졌을 때의 함수를 등록한다. 또한 통신을 위한 정보(Buffer, Mtu 등)를 설정한다. 이후 Middleware 로부터 명령을 받아 동작하게 된다.

주변의 AP 를 Scan 하고, 검색된 AP 를 대상으로 연결을 요청하고 기타 기능을 수행할 수 있다.
실제로 Scan 이후에 결과를 요청하기까지 물리적인 시간이 필요하다. 참고로 현재 BCM WIFI Chip 기반에서는 최소 Scan 시간을 2초로 하고 있으며, 이 값은 Chip 벤더에 따라서 달라질 수 있다. 이후 DDI_WIFI_GetScanResult() 를 호출하여, Scan 결과를 WIFI_INFO_T 구조체에 복사하여 리턴한다.

접속하려는 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 에 대한 설명을 하고 있다.

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;

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;

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

각각 다른 규격을 갖는 국가목록을 정의.

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 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
}

지원하는 보안 및 암호화 방식을 정의.

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
}

실행 결과 리턴 타입을 정의.

typedef enum
{
	WIFI_OK 		= 0,	// 정상적으로 실행했을 경우
	WIFI_FAIL	= -1	// 실행 도중, 에러가 발생했을 경우
} WIFI_STATUS_T

접속 시에 Connection mode 를 정의.

typedef enum
{
	MODE_INFRA	= 0,	// Infrastructure 모드
	MODE_ADHOC,		// Ad-hoc 모드 
	MODE_ETHERNET		// Ethernet(유선) 모드
	MODE_ALL		// Infrastructure, Ad-hoc 모두
} WIFI_PROF_WLMODE
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.
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
}
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
}
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
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
}
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
}
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
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
}
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”);
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
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
}
If(DDI_WIFI_GetSSID(ssid, &ssid_len) != WIFI_OK)
{
	// Do something for error handling
}
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
INT32 DDI_WIFI_GetRSSI(void)
{
	/* Get rssi command */
	Write IOCTL to WIFI with data
}	
INT32 rssi;
rssi = DDI_WIFI_GetRSSI();
if(rssi == 0)
{
	// Do something for error handling
}
else
	printf(“RSSI is %d\n”, rssi);
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
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
}
If(DDI_WIFI_ Disassociation() != WIFI_OK)
{
	// Do something for error handling
}
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
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
}
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
}
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
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
}
If(DDI_WIFI_IsAdhocConnected() == FALSE)
{
	printf(“Not connect with Adhoc\n”);
}
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
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
}
If(DDI_WIFI_IsAPConnected() == FALSE)
{
	printf(“Not connect with AP\n”);
}
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
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
}
If(DDI_WIFI_WPS_PBCStart() != WIFI_OK)
{
	// Do something for error handling
}
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
WIFI_STATUS_T DDI_WIFI_WPS_PINStart(INT8* pSsid)
{
	CREATE THREAD for WPS PIN MODE
	THREAD_DETACH for WPS PIN MODE
}
INT8 ssid[33];
DDI_WIFI_GetSSID(ssid, &ssid_len);
If(DDI_WIFI_WPS_PINStart(ssid) != WIFI_OK)
{
	//Do something for error handling
}
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
BOOL DDI_WIFI_WPS_IsConnected()
{
	IF (isConnect == 0) THEN	/* isConnect(=WPS connection status global variable) */
		/* Not connect with WPS */
	ELSE
		/* Connect with WPS */
}
If(DDI_WIFI_WPS_IsConnected() == FALSE)
{
	printf(“WIFI not connect with WPS\n”);
}
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
WIFI_STATUS_T DDI_WIFI_WPS_Stop()
{
	IsStopval == 1	/* IsStopval(=Check global variable) */
}
DDI_WIFI_WPS_Stop();
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
void DDI_WIFI_WPS_GetPincode(INT8* pPinCode)
{
	/* Get pin code command */
	Write IOCTL to WIFI with data
	/* Store to PINcode */
	pPinCode = Pincode;
}
INT8 pinCode[32];
DDI_WIFI_WPS_GetPincode(pinCode);
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
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 */
}
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);
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
BOOL DDI_WIFI_IsRadioOn()
{
	/* Get radio status command */
	Write IOCTL to WIFI with data
}
If(DDI_WIFI_IsRadioOn() == FALSE)
{
	printf(“Radio Disable\n”);
}
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
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
}
If(DDI_WIFI_SetRadioOn(TRUE) != WIFI_OK)
{
	// Do something for error handling
}
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
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
}
INT32 retChannel;
retChannel = DDI_WIFI_GetChannel();
If(retChannel <= 0)
{
	// Do something for error handling
}
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
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
}
WIFI_COUNTRY_CODE_T ccode = WIFI_COUNTRY_KR;
INT32 rev = 1;
If(DDI_WIFI_SetCountry(ccode, rev) != WIFI_OK)
{
	// Do something for error handling
}
Description 현재 설정되어 있는 국가 코드 설정을 얻는다.
Syntax WIFI_COUNTRY_CODE_T DDI_WIFI_GetCountry(void)
Parameters None
Return Value Wifi country list(0~25)
Remarks WIFI 가 초기화된 후에 호출한다.
See Also None
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
}
WIFI_COUNTRY_CODE_T con;
con = DDI_WIFI_GetCountry();
if(con == WIFI_COUNTRY_NOT_SET)
{
	// Do something for error handling
}
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
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
}
DDI_WIFI_SetLEDStatus(FLASE);   // LED OFF
DDI_WIFI_SetLEDStatus(TRUE);   // LED ON
  • computer/lg/wifi_ddi_핵심가이드.txt
  • Last modified: 3 years ago
  • by likewind