====== WiFi 관련 파일시스템 파일 ======
IP 카메라에서 WiFi 기능을 위해 필요한 파일 시스템에 포함된 파일들을 정리하여 기술한다.
'현재(2013/6/28) 시점을 기준으로 한다.'
====== 그것들은 어디에 있나? ======
크게 두 군데로 나뉘어 있다.
===== /opt/ipnc =====
WiFi 관련 커널 모듈 파일(.ko)과 WiFi 인터페이스 전용 DHCP client application 이 있다.
| 파일명 | 설명 |
| cfg80211.ko | WiFi 관련 커널 모듈 파일 |
| lib80211_crypt_ccmp.ko | WiFi 관련 커널 모듈 파일 |
| lib80211_crypt_tkip.ko | WiFi 관련 커널 모듈 파일 |
| lib80211_crypt_wep.ko | WiFi 관련 커널 모듈 파일 |
| mac80211.ko | WiFi 관련 커널 모듈 파일 |
| wifi-dhcpcd | --WiFi 전용 DHCP 클라이언트 프로그램으로서, 이런식으로 실행한다(./wifi-dhcpcd -d eth1 &)-- |
| load_module.sh | 부팅 시, 자동으로 커널 모듈을 로딩하는 파일 |
===== /sbin =====
| 파일명 | 설명 |
| udhcpc | 기존의 wifi-dhcpcd 버그(killall 할 때, 해당 인터페이스가 down 됨)로 인해 대체하여 사용함(udhcpc -i eth0) |
===== /usr/share/udhcpc =====
| 파일명 | 설명 |
| default.script | udhcpc 를 실행했을 때, 자동으로 읽어들이는 스크립트 파일. 실제로 sample.bound 파일을 실행한다 |
| sample.bound | IP 및 DNS 를 설정하는 역할을 하는 스크립트 파일 |
===== /srv/wifi =====
WiFi API 와 관련한 모든 파일들이 있다.
| 파일명 | 설명 |
| bcm | 무선카메라 WiFi 관련 파일들 |
| realtek | 지능형 카메라 WiFi 관련 파일들 |
| dns-va.conf | 지능형 카메라에서 soft ap 모드로 동작시, DHCP server 가 실행하기 위해 참조하는 설정 파일 |
| dns.conf | 무선 카메라에서 soft ap 모드로 동작시, DHCP server 가 실행하기 위해 참조하는 설정 파일 |
| dnsmasq | DHCP server 로 만들어주는 프로그램으로서, 이런식으로 실행한다(./dnsmasq -C ../dns.conf -d &) |
==== /srv/wifi/bcm ====
무선 카메라(BCM43362)와 관련한 파일들이 있다.
| 파일명 | 설명 |
| NVRAM_20130221.txt | WiFi 드라이버 세팅값으로서, NVRAM 과 마찬가지 역할을 한다 |
| bcm43362_softap.bin | WiFi SOC 에 실제로 올라가는 펌웨어로서 성능에 영향을 주는 요인 중 하나다 |
| dhd.ko | WiFi 드라이버 커널 모듈 파일 |
| factory_mode.sh | Factory 모드(즉, soft ap 모드로 동작할 때)에서 실행되는 스크립트 파일 |
| insmod.sh | 드라이버 모듈 및 펌웨어, 설정 파일을 로딩하는 스크립트 파일 |
| normal_mode.sh | 일반 모드(즉, station 모드로 동작할 때)에서 실행되는 스크립트 파일 |
| softap-open | soft ap 동작시, 인증을 암호없음으로 설정하는 스크립트 파일 |
| softap-wpa2 | soft ap 동작시, 인증을 wpa2(암호 : 87654321) 로 설정하는 스크립트 파일 |
| supplicant | wpa_supplicant 관련 파일들이 들어있는 디렉토리 |
| wlarm | wl 실행파일과 동일. 소스코드가 없어 BCM 으로부터 바이너리만 받아 사용 |
| wps-none.sh | WPS 연결 시, AP 의 인증이 암호없음 일때, 실행되는 스크립트 파일 |
| wps-wpa.sh | WPS 연결 시, AP 의 인증의 WPA/WPA2 일때, 실행되는 스크립트 파일 |
=== /srv/wifi/bcm/supplicant ===
wpa_supplicant 관련 파일들이 들어있다.
| 파일명 | 설명 |
| ap_scan | --AP 에 접속된 이후에도, 일정시간 마다 스캔을 하기위해 실행되는 스크립트, AP 접속 후 10 초후에 AP 스캔을 한다(삭제 예정)-- |
| disconn | 강제로 접속된 AP 연결을 끊을 때, 실행되는 스크립트. (./wpa_cli -i eth1 -p /var/run/wpa_supplicant disable_network 0) |
| open | --인증이 암호없음 인 AP 에 접속할 때, 실행되는 스크립트. SSID 를 인자로 받아 사용한다(삭제 예정)-- |
| w-none | 인증이 암호없음 인 AP 에 접속할 때, 실행되는 스크립트. SSID 를 인자로 받아 사용한다 |
| open-wps | WPS 로 접속시, AP 의 인증이 암호없음 일때, 실행되는 스크립트. SSID 를 인자로 받아 사용한다. wpsenr 에 의해 실행된다 |
| pbc | wpa_supplicant 로 WPS PBC 로 접속할 때, 실행되는 스크립트. 현재 구동되지 않아 사용안함 |
| pin | wpa_supplicant 로 WPS PIN 로 접속할 때, 실행되는 스크립트. 현재 구동되지 않아 사용안함 |
| save | wpa_supplicant 에서 현재 접속 정도를 저장할 때, 실행하는 스크립트. 현재 사용하지 않음 |
| --scan_parse-- | --scan 결과를 parsing 하는 테스트 프로그램. 삭제예정-- |
| status | --wpa_supplicant 에서 현재 상태를 확인할 때 사용하는 스크립트 파일. 삭제예정-- |
| supplicant_bcm.sh | wpa_supplicant 를 실행하는 스크립트. 주기적으로 스캔을 실행하기 위해 wpa_supplicant 실행 후, 1초 후에 스캔 실행함 |
| wpa.conf | wpa_supplicant 가 실행될 때, 참조하는 환경 설정 파일 |
| wpa_cli | wpa_supplicant 에 명령을 내리기 위해 사용하는 프로그램 |
| wpa_passphrase | wpa_supplicant 에서 접속시 암호화를 위해 사용하는 프로그램. 평소에 사용할 일 없음 |
| wpa_supplicant | wpa_supplicant 실행 파일 |
| wpa_tkip_aes | --wpa_supplicant 에서 AP 의 인증이 WPA/WPA2 일 때 사용하는 스크립트 파일(삭제예정)-- |
| wpa_tkip_aes-wps | WPS 사용시, AP 의 인증이 WPA/WPA2 일 때 사용하는 스크립트 파일 |
| w-wep-open-hex | OPEN(개방) 모드에서 비밀번호가 숫자일 때 사용하는 스크립트 파일 |
| w-wep-open-string | OPEN(개방) 모드에서 비밀번호가 문자일 때 사용하는 스크립트 파일 |
| w-wep-shared-hex | SHARED(공유) 모드에서 비밀번호가 숫자일 때 사용하는 스크립트 파일 |
| w-wep-shared-string | SHARED(공유) 모드에서 비밀번호가 문자일 때 사용하는 스크립트 파일 |
| w-wpa | WPA/WPA2 모드 일때 사용하는 스크립트 파일 |
==== /srv/wifi/realtek ====
지능형 카메라(Realtek8189)와 관련한 파일들이 있다.
| 파일명 | 설명 |
| 8192cu.ko | WiFi 드라이버 커널 모듈 파일 |
| factory_mode.sh | soft ap 모드로 동작 할때, 실행되는 스트립트 파일 |
| hostapd | soft ap 모드로 실행하게 만들어주는 프로그램. 이렇게 사용한다(/hostapd ./hostapd.conf.bak) |
| hostapd.conf | hostapd 가 실행할 때, 참조하는 설정 파일. 인증은 암호없음으로 설정 |
| hostapd.conf.bak | hostapd 가 실행할 때, 참조하는 설정 파일. 인증은 WPA2 로 설정 |
| hostapd_rtl | hostapd 를 실제 실행하게 하는 스크립트 파일. WiFi 인터페이스의 MAC 주소를 이용해서 SSID 를 설정하도록 설정 파일에 추가함 |
| insmod.sh | WiFi 드라이버를 로딩하는 스크립트 |
====== 어떻게 생성하나? ======
파일시스템에 들어있는 파일 가운데, 바이너리 파일을 사용하는 경우가 몇 있다. 이 문서에서 설명할 프로그램들의 소스코드는 /home/wjkim/wifi 디렉토리 아래에 있다.
===== --wifi-dhcpcd-- =====
--DHCP client 로 만들어주는 프로그램이다. 기존에 유선 네트워크 인터페이스용으로 사용되고 있었으며, 무선 네트워크 인터페이스용으로 복사하여 이름만 바꿨다. 따라서 이름이 다른 두개의 바이너리 파일은 동일하다고 봐도 무방하다.--
--이 프로그램은 데몬의 형태로 실행되며, 백그라운드로 dhcp request 를 계속 보내다가, IP 를 할당받으면 IP 를 설정한다. 그 이후로도 프로세스는 실행되면서, dhcp request 를 보낸다.--
# ./dhcpcd -h
DHCP Client Daemon v.1.3.22-pl4
Copyright (C) 1996 - 1997 Yoichi Hariguchi
Copyright (C) January, 1998 Sergei Viznyuk
Location: http://www.phystech.com/download/
Usage: dhcpcd [-dknrBCDHNRSTY] [-l leasetime] [-h hostname] [-t timeout]
[-i vendorClassID] [-I ClientID] [-c filename] [-s [ipaddr]]
[-w windowsize] [-G [gateway]] [interface]
root@IPCAM:/opt/ipnc#
===== udhcpc =====
busybox 에 기본적으로 포함되어 있는 dhcp client 프로그램으로서, 실행방법은 다음과 같다.
#udhcpc -i eth1
===== dnsmasq =====
타겟을 DHCP server 로 만들어주는 프로그램이다. 오픈소스이며, dnsmasq-2.65.tar.gz 을 사용했다. Makefile 파일을 수정하여 크로스컴파일하면, dnsmasq 바이너리 파일을 얻을 수 있다.
수정사항을 반영하여 dnsmasq-2.65-wjkim.tar 을 만들었다. 차후에는 이 파일을 사용하면 된다.
이것 말고도 설정 파일이 필요한데, 다음과 같이 작성하면 된다. 여기서는 파일명을 dns.conf 로 했다.
dhcp-authoritative
dhcp-range=10.10.10.11,10.10.10.100,12h
dhcp-leasefile=/var/lib/misc/dnsmasq.leases
pid-file=/var/lib/misc/dnsmasq.pid
dhcp-option=3,10.10.10.1
user=root // 실행 권한
interface=wl0.1 // DHCP 서버로 동작시킬 인터페이스 명을 적어준다
이외 자세한 설명은 다른 문서를 참조한다.
===== wpsenr =====
BCM 드라이버에서 wpa_supplicant 상의 WPS 가 제대로 동작되지 않는 문제로 인해, BCM 전용 WPS 프로그램을 빌드해서 사용해야 한다. 파일은 falcon_rel_5_90_188_59_0507-real-final.tar.gz 을 사용한다. 빌드 방법은 다음과 같다.
#/home/wjkim/wifi/falcon_rel_5_90_188_59_0507/falcon_rel_5_90_188_59
#./bfd-app-wps.sh
에러없이 빌드가 완료되면, 2.6.37 디렉토리 아래에 wpsenr 바이너리가 생성되어 있다. 사용방법은 다음과 같다.
#./wpsenr -if eth1 -pb &
원래 릴리즈 받은 소스코드에서 내가 추가한 파일은 'falcon_rel_5_90_188_59_0507/falcon_rel_5_90_188_59/src/wps/linux/enr/wps_enr.c' 파일이다.
===== wpa_supplicant =====
AP 스캔 및 접속 등의 거의 모든 WIFI 동작을 관리하는 프로그램으로 오픈소스다. v2.0 을 사용한다. wpa_supplicant-2.0-wjkim.tar 파일을 사용했다. 빌드 방법은 다음과 같다.
#cd wpa_supplicant-2.0/wpa_supplicant
#make
성공적으로 빌드되면 wpa_supplicant, wpa_cli, wpa_passphrase 가 생성된다. 원래 소스코드에서 수정한 부분은 'wpa_supplicant/ctrl_iface.c' 파일이다.
==== 수정 사항(2013/6/28) ====
본래의 오픈소스 코드에서 몇가지 이슈들로 인해 코드를 수정했다.
=== Auto Scan 옵션 활성화 ===
주기적으로 Scan 을 하기 위해 빌드시 해당 옵션을 활성화한다. 아래는 .config 파일이다.
# Autoscan
# This can be used to enable automatic scan support in wpa_supplicant.
# See wpa_supplicant.conf for more information on autoscan usage.
#
# Enabling directly a module will enable autoscan support.
# For exponential module:
CONFIG_AUTOSCAN_EXPONENTIAL=y
# For periodic module:
#CONFIG_AUTOSCAN_PERIODIC=y
=== AP 접속 후에도 주기적으로 Auto Scan 하도록 수정 ===
scan.c 파일을 다음과 같이 수정한다.
void wpa_supplicant_cancel_scan(struct wpa_supplicant *wpa_s)
{
wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling scan request");
// eloop_cancel_timeout(wpa_supplicant_scan, wpa_s, NULL); 주석 처리
}
=== 특정 SSID 스캔 안되게 수정 ===
wpa_supplicant 는 일부 Hide SSID 까지도 스캔하여 결과를 보여준다. 이때 SSID 는 '\x00' 으로 시작한다. 이를 필터링 하기 위해 ctrl_iface.c 파일을 다음과 같이 수정했다.
#define HIDE_WILDCARD_SSID "\x00" // 추가
#define HIDE_WILDCARD_SSID_LEN 4 // 추가
...
/* Format one result on one text line into a buffer. */
static int wpa_supplicant_ctrl_iface_scan_result(
struct wpa_supplicant *wpa_s,
const struct wpa_bss *bss, char *buf, size_t buflen)
{
char *pos, *end;
int ret;
const u8 *ie, *ie2, *p2p;
p2p = wpa_bss_get_vendor_ie(bss, P2P_IE_VENDOR_TYPE);
if (p2p && bss->ssid_len == P2P_WILDCARD_SSID_LEN &&
os_memcmp(bss->ssid, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN) ==
0)
return 0; /* Do not show P2P listen discovery results here */
if (os_memcmp(bss->ssid, HIDE_WILDCARD_SSID, HIDE_WILDCARD_SSID_LEN) == 0) // 추가
return 0; /* Do not show P2P listen discovery results here */ // 추가
pos = buf;
end = buf + buflen;
ret = os_snprintf(pos, end - pos, "%s",
wpa_ssid_txt(bss->ssid, bss->ssid_len));
if (ret < 0 || ret >= end - pos)
return -1;
pos += ret;
ret = os_snprintf(pos, end - pos, "\t%d\t",
bss->level);
if (ret < 0 || ret >= end - pos)
return -1;
pos += ret;
ie = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
if (ie)
pos = wpa_supplicant_ie_txt(pos, end, "WPA", ie, 2 + ie[1]);
ie2 = wpa_bss_get_ie(bss, WLAN_EID_RSN);
if (ie2)
pos = wpa_supplicant_ie_txt(pos, end, "WPA2", ie2, 2 + ie2[1]);
pos = wpa_supplicant_wps_ie_txt(wpa_s, pos, end, bss);
if (!ie && !ie2 && bss->caps & IEEE80211_CAP_PRIVACY) {
ret = os_snprintf(pos, end - pos, "[WEP]");
if (ret < 0 || ret >= end - pos)
return -1;
pos += ret;
}
if (bss->caps & IEEE80211_CAP_IBSS) {
ret = os_snprintf(pos, end - pos, "[IBSS]");
if (ret < 0 || ret >= end - pos)
return -1;
pos += ret;
}
if (bss->caps & IEEE80211_CAP_ESS) {
ret = os_snprintf(pos, end - pos, "[ESS]");
if (ret < 0 || ret >= end - pos)
return -1;
pos += ret;
}
if (p2p) {
ret = os_snprintf(pos, end - pos, "[P2P]");
if (ret < 0 || ret >= end - pos)
return -1;
pos += ret;
}
#ifdef CONFIG_HS20
if (wpa_bss_get_vendor_ie(bss, HS20_IE_VENDOR_TYPE) && ie2) {
ret = os_snprintf(pos, end - pos, "[HS20]");
if (ret < 0 || ret >= end - pos)
return -1;
pos += ret;
}
#endif /* CONFIG_HS20 */
/*
ret = os_snprintf(pos, end - pos, "\t%s",
wpa_ssid_txt(bss->ssid, bss->ssid_len));
if (ret < 0 || ret >= end - pos)
return -1;
pos += ret;
*/
ret = os_snprintf(pos, end - pos, "\n");
if (ret < 0 || ret >= end - pos)
return -1;
pos += ret;
return pos - buf;
}
=== 스캔 결과값 포맷 수정 ===
Application 쪽에 스캔 결과를 보내주기 위해 데이터 포맷을 수정했다. ctrl_iface.c 파일이다.
static int wpa_supplicant_ctrl_iface_status(struct wpa_supplicant *wpa_s,
const char *params,
char *buf, size_t buflen) // - wjkim
{
char *pos, *end, tmp[30];
int res, verbose, wps, ret;
verbose = os_strcmp(params, "-VERBOSE") == 0;
wps = os_strcmp(params, "-WPS") == 0;
pos = buf;
end = buf + buflen;
ret = os_snprintf(pos, end - pos, "%s\n",
wpa_supplicant_state_txt(wpa_s->wpa_state)); // - wjkim
if (ret < 0 || ret >= end - pos)
return pos - buf;
pos += ret;
if (wpa_s->wpa_state >= WPA_ASSOCIATED) {
struct wpa_ssid *ssid = wpa_s->current_ssid;
/* ret = os_snprintf(pos, end - pos, "bssid=" MACSTR "\n",
MAC2STR(wpa_s->bssid));
if (ret < 0 || ret >= end - pos)
return pos - buf;
pos += ret;
*/
if (ssid) {
u8 *_ssid = ssid->ssid;
size_t ssid_len = ssid->ssid_len;
u8 ssid_buf[MAX_SSID_LEN];
if (ssid_len == 0) {
int _res = wpa_drv_get_ssid(wpa_s, ssid_buf);
if (_res < 0)
ssid_len = 0;
else
ssid_len = _res;
_ssid = ssid_buf;
}
ret = os_snprintf(pos, end - pos, "%s\n", // - wjkim
wpa_ssid_txt(_ssid, ssid_len));
if (ret < 0 || ret >= end - pos)
return pos - buf;
pos += ret;
if (ret < 0 || ret >= end - pos)
return pos - buf;
pos += ret;
}
#ifdef CONFIG_AP
if (wpa_s->ap_iface) {
pos += ap_ctrl_iface_wpa_get_status(wpa_s, pos,
end - pos,
verbose);
} else
#endif /* CONFIG_AP */
pos += wpa_sm_get_status(wpa_s->wpa, pos, end - pos, verbose);
}
/*
ret = os_snprintf(pos, end - pos, "%s\n",
wpa_supplicant_state_txt(wpa_s->wpa_state));
if (ret < 0 || ret >= end - pos)
return pos - buf;
pos += ret;
*/
/*
if (wpa_s->l2 &&
l2_packet_get_ip_addr(wpa_s->l2, tmp, sizeof(tmp)) >= 0) {
ret = os_snprintf(pos, end - pos, "ip_address=%s\n", tmp);
if (ret < 0 || ret >= end - pos)
return pos - buf;
pos += ret;
}
*/
#ifdef CONFIG_P2P
if (wpa_s->global->p2p) {
ret = os_snprintf(pos, end - pos, "p2p_device_address=" MACSTR
"\n", MAC2STR(wpa_s->global->p2p_dev_addr));
if (ret < 0 || ret >= end - pos)
return pos - buf;
pos += ret;
}
#endif /* CONFIG_P2P */
/*
ret = os_snprintf(pos, end - pos, "address=" MACSTR "\n",
MAC2STR(wpa_s->own_addr));
if (ret < 0 || ret >= end - pos)
return pos - buf;
pos += ret;
*/
#ifdef CONFIG_HS20
if (wpa_s->current_bss &&
wpa_bss_get_vendor_ie(wpa_s->current_bss, HS20_IE_VENDOR_TYPE) &&
wpa_s->wpa_proto == WPA_PROTO_RSN &&
wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
ret = os_snprintf(pos, end - pos, "hs20=1\n");
if (ret < 0 || ret >= end - pos)
return pos - buf;
pos += ret;
}
if (wpa_s->current_ssid) {
struct wpa_cred *cred;
char *type;
for (cred = wpa_s->conf->cred; cred; cred = cred->next) {
if (wpa_s->current_ssid->parent_cred != cred)
continue;
if (!cred->domain)
continue;
ret = os_snprintf(pos, end - pos, "home_sp=%s\n",
cred->domain);
if (ret < 0 || ret >= end - pos)
return pos - buf;
pos += ret;
if (wpa_s->current_bss == NULL ||
wpa_s->current_bss->anqp == NULL)
res = -1;
else
res = interworking_home_sp_cred(
wpa_s, cred,
wpa_s->current_bss->anqp->domain_name);
if (res > 0)
type = "home";
else if (res == 0)
type = "roaming";
else
type = "unknown";
ret = os_snprintf(pos, end - pos, "sp_type=%s\n", type);
if (ret < 0 || ret >= end - pos)
return pos - buf;
pos += ret;
break;
}
}
#endif /* CONFIG_HS20 */
if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
res = eapol_sm_get_status(wpa_s->eapol, pos, end - pos,
verbose);
if (res >= 0)
pos += res;
}
res = rsn_preauth_get_status(wpa_s->wpa, pos, end - pos, verbose);
if (res >= 0)
pos += res;
return pos - buf;
}
...
...
...
static int wpa_supplicant_ctrl_iface_scan_results(
struct wpa_supplicant *wpa_s, char *buf, size_t buflen)
{
char *pos, *end;
struct wpa_bss *bss;
int ret;
pos = buf;
end = buf + buflen;
// ret = os_snprintf(pos, end - pos, "bssid / frequency / signal level / "
// "flags / ssid\n"); - wjkim
// if (ret < 0 || ret >= end - pos)
// return pos - buf;
// pos += ret;
dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) {
ret = wpa_supplicant_ctrl_iface_scan_result(wpa_s, bss, pos,
end - pos);
if (ret < 0 || ret >= end - pos)
return pos - buf;
pos += ret;
}
return pos - buf;
}
===== hostapd =====
soft ap 모드로 동작하게 해주는 프로그램으로서, 오픈소스다. 최신 버전이 v2.0 이지만, realtek 에서 가이드 했던, v0.8.x 를 사용했다. 파일은 wpa_supplicant_hostapd-0.8-wjkim.tar 이다.
빌드방법은 아래와 같다.
#cd wpa_supplicant_hostapd-0.8/hostapd
#make
참고로 최신버전 역시 사용할 수 있다. hostapd-2.0-wjkim.tar 파일을 사용하면 된다. 필드 방법은 다음과 같다.
#cd hostapd-2.0/src
#make
#cd ../..
#cd hostapd-2.0/hostapd
#make
===== 8021X 관련 =====
==== 유선(Wired) ====
=== Basic 파일 ===
ctrl_interface=/var/run/wpa_supplicant
update_config=1
ap_scan=0
eapol_version=1
=== TLS ===
먼저 wpa_supplicant 시작 시 접속하도록 conf 파일을 이용한 방법이다.
ctrl_interface=/var/run/wpa_supplicant
update_config=1
ap_scan=0
eapol_version=1
network={
eapol_flags=0
key_mgmt=IEEE8021X
eap=TLS
identity="testing"
ca_cert="/home/fat81/certs/ca.pem"
client_cert="/home/fat81/certs/client.pem"
private_key="/home/fat81/certs/client.p12"
private_key_passwd="whatever"
}
다음은 wpa_cli 를 이용한 방법이다.
#!/bin/sh
wpa_cli -p /var/run/wpa_supplicant remove_network 0
wpa_cli -p /var/run/wpa_supplicant ap_scan 0
wpa_cli -p /var/run/wpa_supplicant add_network
wpa_cli -p /var/run/wpa_supplicant set_network 0 eapol_flags 0
wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt IEEE8021X
wpa_cli -p /var/run/wpa_supplicant set_network 0 eap TLS
wpa_cli -p /var/run/wpa_supplicant set_network 0 identity '"testing"'
wpa_cli -p /var/run/wpa_supplicant set_network 0 ca_cert '"/home/fat81/certs/ca.pem"'
wpa_cli -p /var/run/wpa_supplicant set_network 0 client_cert '"/home/fat81/certs/client.pem"'
wpa_cli -p /var/run/wpa_supplicant set_network 0 private_key '"/home/fat81/certs/client.p12"'
wpa_cli -p /var/run/wpa_supplicant set_network 0 private_key_passwd '"whatever"'
wpa_cli -p /var/run/wpa_supplicant select_network 0
아래는 인자값을 입력받도록 수정한 것이다.
#!/bin/sh
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant remove_network 0
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant ap_scan 0
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant add_network
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 eapol_flags 0
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt IEEE8021X
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 eap TLS
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 identity \"$1\"
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 ca_cert \"$2\"
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 client_cert \"$3\"
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 private_key \"$4\"
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 private_key_passwd \"$5\"
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant select_network 0
실행방법은 아래와 같다.
#./xxx testing /srv/wifi/bcm/supplicant/ca.pem /srv/wifi/bcm/supplicant/client.pem /srv/wifi/bcm/supplicant/client.p12 whatever
==== 무선(WiFi) ====
=== Basic 파일 ===
ctrl_interface=/var/run/wpa_supplicant
=== EAP ===
먼저 wpa_supplicant 가 시작할 때 자동으로 접속하도록 conf 파일의 예제다.
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="WIFI_DEV3"
scan_ssid=1
key_mgmt=WPA-EAP
eap=PEAP
identity="testing"
password="password"
phase1="peaplabel=0"
phase2="auth=MSCHAPV2"
}
아래는 wpa_cli 명령어를 사용한 경우다.
wpa_cli -p /var/run/wpa_supplicant remove_network 0
wpa_cli -p /var/run/wpa_supplicant ap_scan 1
wpa_cli -p /var/run/wpa_supplicant add_network
wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid '"WIFI_DEV3"'
wpa_cli -p /var/run/wpa_supplicant set_network 0 scan_ssid 1
wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt WPA-EAP
wpa_cli -p /var/run/wpa_supplicant set_network 0 eap PEAP
wpa_cli -p /var/run/wpa_supplicant set_network 0 identity '"testing"'
wpa_cli -p /var/run/wpa_supplicant set_network 0 password '"password"'
wpa_cli -p /var/run/wpa_supplicant set_network 0 phase1 '"peaplabel=0"'
wpa_cli -p /var/run/wpa_supplicant set_network 0 phase2 '"auth=MSCHAPV2"'
wpa_cli -p /var/run/wpa_supplicant select_network 0
다음은 인자를 입력받도록 수정한 것이다.
#!/bin/sh
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant remove_network 0
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant ap_scan 1
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant add_network
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid \"$1\"
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 scan_ssid 1
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt $2
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 eap PEAP
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 identity \"$3\"
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 password \"$4\"
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 phase1 '"peaplabel=0"'
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant set_network 0 phase2 \"auth=$5\"
/root/wpa_supplicant-2.0/wpa_supplicant/wpa_cli -p /var/run/wpa_supplicant select_network 0
실행방법은 다음과 같다.
#./zzz WIFI_DEV3 WPA-EAP testing password MSCHAPV2
----
{{indexmenu>:#1|skipns=/^(wiki|etc|diary|playground)$/ skipfile=/^(todays|about|guestbook)$/ nsort rsort}}
----