WIFI Direct 가 기존의 접속 방식과 다른 점이 많이 있지만, 그 중에 눈에 띄는 것이 바로 GO(Group Owner) 시에 DHCP 서버 기능이 지원되어야 한다는 점이다.
기존의 Ad-hoc 모드에서는 서로의 IP 주소를 수동으로 설정해줘야 했기 때문에 여간 불편한 것이 아니었는데, Direct 에서는 이점이 보완 수정 되었다. Direct 의 컨셉은 Peer-to-Peer 즉, 1:1 대로 접속된다는 것이다. 한 쪽은 GO 가 되고, 다른 한 쪽은 Client(=Device) 가 된다.
GO 는 Client 에게 IP 주소를 할당해준다. Client 는 GO 에게 IP 주소 할당을 요청한다. GO 와 Client 는 WIFI 접속을 할 때만, 구분하여 IP 할당 후에는 동등하게 서로 통신한다.
Busybox
NM 의 경우, DHCP Client 기능은 있지만, Server 기능은 없다. 사용할 DHCP 서버를 찾던 중에 임베디드 환경에 맞는 Busybox 에 built-in 된 udhcpd 를 사용하기로 했다. Busybox 는 GPLv2 를 따른다. 여기서는 별도의 독립된 바이너리로서 사용할 것이기 때문에 라이센스에 대한 이슈는 없다.
빌드 및 설치
cross compiler 지정
'Busybox Settings → Build Options → Cross Compiler prefix' 에 toolchain 의 path 를 적어준다. 예를 들면, '/opt/toolchains/crosstoos_ht-linux-2.6.18.0_gcc/bin/mipsel-linux-' 를 입력한다.
dhcpd 지정
'Networking Utilities → udhcp server(udhcpd)' 를 선택한다.
설정파일 생성 및 설정
udhcpd 를 실행할 때, 필요한 파일들이 있다. 이 파일들은 설정 정보를 저장하고 있다(udhcpd.conf/udhcpd.leases).
udhcpd.conf 파일은 다음과 같이 수정한다.
... start 192.168.16.20 # 할당 IP 주소 대역 end 192.168.16.254 ... interface wl0.1 # 할당 인터페이스 ... opt dns 192.168.16.1 option subnet 255.255.255.0 opt router 192.168.16.1 option domain local option lease 864000 ...
udhcpd.leases 파일은 아무런 내용없이 파일만 생성하면 된다.
udhcpd 수정
udhcpd 는 다음과 같은 시퀀스로 실행된다.
- GO 가 되면, udhcpd 프로세스가 실행된다.
- Client 에게 IP 주소를 할당해주면, 해당 IP 주소를 /tmp/iplist.txt 라는 파일에 저장한다.
networking/udhcp/serverpacket.c 파일을 아래와 같이 수정한다.
// L.214 int writeLOG(struct in_addr addr) // 추가 { char buf[30]; int same = 0; FILE* file = fopen("/tmp/iplist.txt", "a+t"); while(!feof(file)) { fscanf(file, "%s", &buf); if(strcmp(buf, inet_ntoa(addr)) == 0) { same = 0; printf("\n same!! \n"); break; } else { same++; printf("\n diff!! \n"); } memset(buf, 0, sizeof(buf)); } if(same != 0) fprintf(file, "%s\n", inet_ntoa(addr)); fclose(file); return 0; } ... // L.249 int sendACK(struct dhcpMessage *oldpacket, uint32_t yiaddr) { ... LOG(LOG_INFO, "sending ACK to %s", inet_ntoa(addr)); writeLOG(addr); // 추가 if(send_packet(&packet, 0) < 0) return -1; ... }
설정 파일 경로 수정을 위해 networking/udhcp/dhcpd.h 파일을 아래와 같이 수정한다.
... #define LEASES_FILE "/mnt/lg/res/lglib/udhcpd.leases" #define DHCPD_CONF_FILE "/mnt/lg/res/lglib/udhcpd.conf" ...
마지막으로 최종 생성되는 파일을 busybox 가 아닌 dhcpd 로 수정하기 위해, applets/applets.c 파일을 아래와 같이 수정한다.
... // L. 477 void run_applet_by_name (const char *name, int argc, char **argv) { if(ENABLE_FEATURE_SUID_CONFIG) parse_config_file(); if(!strncmp(name, "dhcpd", 5)) busybox_main(argc, argv); // busybox -> dhcpd 로 수정 ... }
NM
2개 이상의 네트워크 인터페이스가 활성화되었을 때, 발생할 수 있는 라우팅 문제를 해결하기 위해 Direct 로 접속하는 경우, GO 로 부터 DNS 와
유의사항
GO 가 되었을 때, 기본적으로 192.168.16.1 로 설정된다. 만일 기존의 유선 또는 무선 연결이 같은 IP 대역이라면, 문제가 생길 수 있다. 따라서 이에 대한 메뉴얼 대응이 필요하다.