[Android] UPnP IGD 올리기 (upnp igd porting, cross compile)

 

UPnP 기능은 어떤 장치를 연결할 때, 사용자가 설정을 해 주지 않아도 알아서 편리하게 연결이 되도록 하는 자동 연결 지원 프로토콜이다.

UPnP 기능은 하위 여러 기능들을 포함하고 있는데, 그 중 IGD(Internet Gateway Device)는 장치들 간의 UPnP 연결에 있어서 중간다리 역활을 하는 기능이다.

아래는 Wikipedia의 내용이다.


유니버설 플러그 앤 플레이

유니버설 플러그 앤 플레이는 UPnP 포럼이 공표한 컴퓨터 네트워크 프로토콜의 집합이다. UPnP의 목표는 장치들을 부드럽게 연결하고 가정 네트워크와 회사 환경의 기능(데이터 공유, 통신, 엔터테인먼트)을 단순화하는 것이다. UPnP는 개방된 인터넷 기반의 통신 표준 기반의 UPnP 장치 제어 프로토콜을 정의하고 출판함으로써 이를 달성한다.

UPnP라는 용어는 컴퓨터에 직접 장치를 유동적으로 부착하는 기술인 플러그 앤 플레이에서 비롯한 것이다.


Internet Gateway Device Protocol

 

Internet Gateway Device (IGDStandardized Device Control Protocol[1] is a protocol for mapping ports in network address translation (NAT) setups, supported by a certain number of NAT-enabled routers.[2] It is a common communications protocol of automatically configuring port forwarding, and is part of an ISO/IEC Standard [3] rather than an Internet Engineering Task Force standard.


 

 

Linux에서 활용 가능한 Opensource로는 UPnP SDK, upnp igd daemon 등이 있다.

Android 에는 Java/Android로 구성된 cling Opensource가 github에 올라가 있다.

 

본 글에서는 libupnp 및 upnp igd를 android에 porting 하는 과정에 대해 기록한다.

여기서 필자는 AOSP 기반 rooting이 가능한 상태에서 작업함을 주의하기 바란다.

 

 

 

환경 (Environment)

  • toolchain: arm-linux-androideabi
  • libupnp version: 1.6.22 (download site)
  • upnp igd version: 1.0 (download site)
  • android version: 7.0 Nougat

 

 

 

Cross Compile

1. libupnp

> export CC="arm-linux-androideabi-gcc --sysroot=[android path]/prebuilts/ndk/current/platforms/android-24/arch-arm"
> export CXX="arm-linux-androideabi-g++ --sysroot=[android path]/prebuilts/ndk/current/platforms/android-24/arch-arm"
> export RANLIB="arm-linux-androideabi-ranlib --sysroot=[android path]/prebuilts/ndk/current/platforms/android-24/arch-arm"
> export CFLAGS="-O3 --sysroot=[android path]/prebuilts/ndk/current/platforms/android-24/arch-arm -D__DragonFly__"
> export CXXFLAGS="-O3 --sysroot=[android path]/prebuilts/ndk/current/platforms/android-24/arch-arm -fvisibility=default -fPIE"
> export LDFLAGS="-Wl,-rpath-link=[android path]/prebuilts/ndk/current/platforms/android-24/arch-arm/usr/lib/ -L[android path]/prebuilts/ndk/current/platforms/android-24/arch-arm/usr/lib/ -fPIE -pie"
> export LDFLAGS="-Wl,-rpath=/system/lib -L[android path]/prebuilts/ndk/current/platforms/android-24/arch-arm/usr/lib/ -fPIE -pie"


> ./configure --prefix=[libupnp output folder] --host=arm-linux-androideabi


> make
> make install

 

2. upnp igd

Makefile 수정

PREFIX=[upnp igd output folder]
LIBUPNP_PREFIX=[libupnp output folder]
CC=arm-linux-androideabi-gcc
INCLUDES= -I$(LIBUPNP_PREFIX)/include -I../include -I[android path]/prebuilts/ndk/current/platforms/android-24/arch-arm/usr/include

CFLAGS += -Wall -g -O2 -fPIE
LDFLAGS += -fPIE -pie

Build

> make

 

Trouble Shooting

1. position independent executables (PIE)

upnpd 실행시: “upnpd: error: only position independent executables (PIE) are supported.”

Build Flag에 아래 내용 추가

CFLAGS += -fPIE
LDFLAGS += -fPIE -pie

ref. http://hyunmini.tistory.com/78

 

2. unused DT entry: type 0xf arg 0x1149

upnpd 실행시: “WARNING: linker: /system/lib/libupnp.so.6: unused DT entry: type 0xf arg 0x1149”

정석은, Build Flag의 설정을 바꾸어서 해결해야 함.

다른 방법으로, android-elf-cleaner를 사용하여 해결.

ref. https://stackoverflow.com/questions/33206409/unused-dt-entry-type-0x1d-arg

ref. https://github.com/kost/android-elf-cleaner

 

3. Error registering the root device

upnpd 실행시 “Error registering the root device” 에러

logcat 내용은 다음과 같다.

upnpd : Error registering the root device with descDocUrl: http://127.0.0.1:49152/gatedesc.xml
upnpd : UpnpRegisterRootDevice returned -108

 

 

해결중…