SW 개발

[Linux Kernel] arm-linux 에서 tc (Traffic Control)사용

. . . 2013. 3. 26. 13:22
반응형

타겟보드에서 TC 를 사용한 내용을 정리한다.

컴파일하기

소스다운로드

다음의 url 에서 소스코드를 다운로드 하자.

크로스컴파일 : Make rule 수정

소스를 다운받아서 configure 를 보면 크로스 컴파일 관련 옵션이 없다;;;

그래서 일단 직접 Makefile 을 수정한다.

Makefile : 크로스툴 설정

Makefile 의 최상단의 내용중... 각 변수들을 아래와 같이 고친다. (크로스 컴파일 환경에 맞게 각자 수정)

DESTDIR=./output
LIBDIR=./output/lib/
SBINDIR=./output/sbin
CONFDIR=./output/iproute2
DOCDIR=./output/doc/iproute2
MANDIR=./output/share/man
# Path to db_185.h include DBM_INCLUDE:=${PWD}/include/linux
CC = arm-linux-gcc
HOSTCC = gcc
CCOPTS = -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall
CFLAGS = $(CCOPTS) -I../include $(DEFINES)
YACCFLAGS = -d -t -v

Makefile : misc 관련 룰 삭제

arm-linux 로 컴파일시에 여러가지문제 (특히 db library) 때문에 컴파일이 안된다.

Makefile 에서 misc 관련 rule 을 삭제한다.

SUBDIRS=lib ip tc netem misc genl
  • misc 를 삭제..

필요한 헤더파일 복사

if_tunnel.h 파일이 없다면서 컴파일이 안되는데.. 사용하려는 커널의 소스에서 해당 파일을 include/linux 파일에 복사해서 넣는다.

이때 iphdr 가 없다고 뜨면서 error 를 발생하면, if_tunnel.hip.h 로 고친다. 만약 ip.h 가 없다면 마찬가지로 타겟 커널소스에서 해당 파일을 include/linux 파일에 복사해서 넣는다.

컴파일

configure 할 필요없이 바로 make 를 해서 컴파일을 한다.

컴파일도중에 각종 툴이 없다면서 에러를 뿜게 되면... 필요한 툴을 다음과 같이 설치한다.

sudo apt-get install flex sudo apt-get install bison

컴파일이 완료된후 make install 은 제대로 되지 않을경우가 있는데 이때는 tc 폴더에 있는 tc 파일을 직접 카피해서 사용한다.

Arm linux 에서의 사용

tc 파일을 타겟 보드에 카피를 한후에 인자를 주고 실행을 다음과 같은 에러가 뜨면서 실행이 안되는 경우가 있다.

RTNETLINK answers operation not supported tc

이때는 커널 feature를 추가해야한다.

TC 를 사용하기위한 kernel feature 추가

TC 를 사용 하기 위한 kernel feature 는 다음과 같다.

CONFIG_NETFILTER_NETLINK=y
CONFIG_NETFILTER_NETLINK_QUEUE=y
CONFIG_NETFILTER_NETLINK_LOG=y
CONFIG_NF_CT_NETLINK=y
CONFIG_SCSI_NETLINK=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_NET_SCH_INGRESS=y
CONFIG_NET_SCHED=y
IP_MULTIPLE_TABLES=y
NETFILTER_XT_TARGET_MARK=y
# # Queueing/Scheduling #
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_HFSC=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_MULTIQ=m
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_SCH_NETEM=m
CONFIG_NET_SCH_DRR=m

특히 net scheduling 관련한 feature 를 module 형태로 빌드한다.

블드시 생성되는 sch_tbf.ko 모듈을 insmod sch_tbf.ko 와같이 커널에 넣는다.

TC 실행

모듈 insert 를 실행한후에.. 다음과 같은 형태로 트래픽을 컨트롤한다.

./tc qdisc add dev eth0 root handle
1: tbf rate 256kbit buffer 1600 limit 3000
반응형