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 를 따른다. 여기서는 별도의 독립된 바이너리로서 사용할 것이기 때문에 라이센스에 대한 이슈는 없다.

'Busybox Settings → Build Options → Cross Compiler prefix' 에 toolchain 의 path 를 적어준다. 예를 들면, '/opt/toolchains/crosstoos_ht-linux-2.6.18.0_gcc/bin/mipsel-linux-' 를 입력한다.

'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 는 다음과 같은 시퀀스로 실행된다.

  1. GO 가 되면, udhcpd 프로세스가 실행된다.
  2. 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 대역이라면, 문제가 생길 수 있다. 따라서 이에 대한 메뉴얼 대응이 필요하다.

  • computer/lg/dhcp_서버_사용하기.txt
  • Last modified: 3 years ago
  • by likewind