PPPOE API 명세서
PPPOE API 와 동작 방식에 대해 상세히 서술했다.
About This Document
Revision History
| Version | Date | Comment | Author |
| 1.0 | 2013-9-26 | 최초 작성 | 시스템 소프트웨어3팀 김우종 선임연구원 |
| 1.1 | 2013-10-30 | 업데이트 | 시스템 소프트웨어3팀 김우종 선임연구원 |
Purpose
본 문서는 IP 카메라 상에서 PPPOE 기능을 사용하기 위해서 알아야 할 PPPOE 동작과 이 때 실행되는 API 에 대한 설명을 기술하고 있다. 이 문서를 통해 PPPOE 의 동작을 좀더 쉽게 이해할 수 있고 나아가서는 디버깅 및 기능 개선 하는데 소요되는 시간을 줄일 수 있을 것이라 기대한다.
Conventions and Acronyms
Codes
소스코드와 API 함수 표기는 굴림 글꼴로 표시한다.
Notes & Cautions
내용 중 알아두면 편리한 참고 사항과 반드시 알아야 하는 중요 사항을 다음과 같이 표시한다.
| <Note> | 내용 중 알아두면 편리한 각종 참고 사항 |
| <Caution> | 내용 중 반드시 알아야 하는 중요한 사항 |
Acronyms
본 문서는 다음과 같은 약어를 사용한다.
| Acronym | Description |
| PPPOE | The Point-to-Point Protocol over Ethernet (PPPoE) is a network protocol for encapsulating PPP frames inside Ethernet frames. It is used mainly either |
| ISP | Internet Service Provider |
Overview
PPPOE 를 사용하기 위해서는 pppoe 를 지원하는 커널과 rp-pppoe 라는 프로그램이 있어야 한다. 이에 대한 자세한 내용은 PPPOE 문서를 참고한다.
전체적인 동작 시나리오는 다음과 같다.
- ISP 에 가입된 ID 와 패스워드를 입력한다.
- 입력된 데이터는 특정 파일에 저장되고, 이 파일을 참조하여 ppp 를 실행한다.
- 접속 시, ppp0 라는 인터페이스가 생성되며 연결이 성공하면 이를 통해 통신하게 된다.
- 이후 인증이 실패하면, ppp0 인터페이스가 삭제된다.
참고로 PPPOE 의 경우, ISP 마다 설정 및 접속 방법이 상이할 수 있다.
PPPOE Operation
Initialization
부팅 시에 pppoe 관련 커널 모듈이 로딩(insmod) 된다.
Connection
접속 API 가 호출되면, 암호가 입력된 파일을 이용하여 pppd 를 실행한다. 이후 dhcp client 를 실행하여 IP 주소를 받아온다. 접속되었는지 여부는 주기적으로 PPP0 인터페이스의 존재유무로 판단한다.
Disconnection
접속을 끊는다. 현재 접속된 상태에서 강제로 접속을 끊는다. wpa_supplication 에 접속 끊음 명령을 내린다.
API Reference Guide
API 와 그에 사용되는 Structure 에 대한 설명을 하고 있다.
Structures
PPPOE_STATUS_T
PPPOE API 를 실행한 후 결과값을 저장하는 구조체. 이 값을 통해 원하는 대로 API 가 실행되었는지 여부를 판단한다.
typedef enum
{
PPPOE_OK = 0, // 성공
PPPOE_FAIL = -1 // 실패
}PPPOE_STATUS_T;
PPPOE_STATUS_INFO_T
접속 상태 여부를 저장하는 구조체. 현재 접속 상태 정보를 알 수 있다.
typedef struct
{
int status; // 접속 상태 여부 (1 = 접속, 0 = 비접속)
}PPPOE_STATUS_INFO_T;
Common API Functions
PPPOE_Connection
| Description | ID 와 패스워드를 인자로 받아 접속을 시도한다 |
| Syntax | PPPOE_STATUS_T PPPOE_Connection(char* id, char* password) |
| Parameters | id(IN) - ISP 에 등록된 ID |
| password(IN) - ISP 에 등록된 패스워드 | |
| Return Value | If the function succeeds, the return value is PPPOE_OK. |
| If the function fails, the return is PPPOE_FAIL. | |
| Remarks | PPPOE 가 Initialization 된 이후에 호출가능하다. 입력된 인자와 함께 쉘 스크립트가 실행되면, pppd 가 실행된다 |
| See Also | pppoe api 명세서 |
| Details | 호출되면, /srv/wifi/pppoe.sh 가 실행되며, 이는 pppd 를 실행한다 |
pppoe.sh 파일은 아래와 같다.
#!/bin/sh cp /etc/ppp/pap-secrets /tmp/ cp /etc/ppp/peers/dsl-provider /tmp/ cp /etc/ppp/chap-secrets /tmp echo \"$1\" \* \"$2\" >> /tmp/chap-secrets echo \"$1\" \* \"$2\" >> /tmp/pap-secrets echo user \"$1\" >> /tmp/dsl-provider /srv/wifi/pppd call dsl-provider
Code
PPPOE_STATUS_T PPPOE_Connection(char* id, char* password)
{
char tmp[256] = {0,};
int ret;
sprintf(tmp, "/srv/wifi/pppoe.sh %s %s", id, password);
ret = proxy_시스템(tmp, PROXY_TYPE_SYSTEM, 10); // 한글 주의
if(ret != 0)
{
printf("\nPPPOE_Disconnection error code : %d\n", WEXITSTATUS(ret));
return PPPOE_FAIL;
}
return PPPOE_OK;
}
Example
sleep(3);
char* id = "test";
char* password = "test";
PPPOE_Connection(id, password);
PPPOE_GetStatus
| Description | PPPOE 가 접속되었는지 여부를 확인한다. |
| Syntax | PPPOE_STATUS_T PPPOE_GetStatus(int *status) |
| Parameters | status(IN) - 접속 상태 정보(1 = 접속, 0 = 접속안됨) |
| Return Value | If the function succeeds, the return value is PPPOE_OK. |
| If the function fails, the return is PPPOE_FAIL. | |
| Remarks | PPPOE 가 Initialization 된 이후에 호출가능하다. /proc/sys/net/ipv4/conf/ppp0 파일 생성 여부로 판단한다 |
| See Also | pppoe api 명세서 |
| Details | None |
Code
#define PPPOE_STATUS_FILE "/proc/sys/net/ipv4/conf/ppp0"
PPPOE_STATUS_T PPPOE_GetStatus(int *status)
{
FILE *file;
*status = 0;
file = fopen(PPPOE_STATUS_FILE, "r");
if(file == NULL)
{
printf("Not connect PPPOE!\n");
*status = 0;
}
else
{
printf("Connect PPPOE!\n");
fclose(file);
*status = 1;
}
return PPPOE_OK;
}
Example
int status = 0;
PPPOE_GetStatus(&status);
if(status == 1)
printf("connect");
else
printf("not connect");
PPPOE_Disconnection
| Description | PPPOE 접속을 끊는다 |
| Syntax | PPPOE_STATUS_T PPPOE_Disconnection(void) |
| Parameters | None |
| Return Value | If the function succeeds, the return value is PPPOE_OK. |
| If the function fails, the return is PPPOE_FAIL. | |
| Remarks | PPPOE 가 Initialization 된 이후에 호출가능하다. killall 로 해당 pppd 프로세스를 종료시킨다 |
| See Also | pppoe api 명세서 |
| Details | None |
Code
PPPOE_STATUS_T PPPOE_Disconnection(void)
{
char tmp[256] = {0,};
int ret;
sprintf(tmp, "killall pppd");
ret = proxy_시스템(tmp, PROXY_TYPE_SYSTEM, 10); // 한글 주의
if(ret != 0)
{
printf("\nPPPOE_Disconnection error code : %d\n", WEXITSTATUS(ret));
return PPPOE_FAIL;
}
return PPPOE_OK;
}
Example
PPPOE_Disconnection();