2017-11-22 28 views
0

난 그냥 컴파일 한 BPF 예제를 연결하는 데 실패하고 http://cilium.readthedocs.io/en/v0.10/bpf/ 설명로드하려했던 :커널 <code>tools/testing/selftests/bpf</code>에서 eBPF의 덩어리

이 커널 4.4.0-98와 우분투 16.04.3 LTS에서 발생
% tc filter add dev enp0s1 ingress bpf \ 
    object-file ./net-next.git/tools/testing/selftests/bpf/sockmap_parse_prog.o \ 
    section sk_skb1 verbose 
Program section 'sk_skb1' not found in ELF file! 
Error fetching program/map! 

, 패키지에서 설치된 llvmclang 버전 3.8은 iproute2이 github의 최신 패키지입니다.

일부 툴체인/커널 버전/기능이 일치하지 않습니다.

내가 뭘 잘못하고 있니?

답변

1

나는 왜 tc가 불평하는지 모른다. 내 설치시 비슷한 명령으로 프로그램이로드됩니다.

  • 난 당신이 제안으로이 문제가 커널 헤더 버전과 iproute2를 사이에 호환성에서, 올 거라고 생각 , 일부 재배치는 있지만 빠른 조사에 발생하는 실패 : 아직도, 여기에 몇 가지 힌트는있다 왜 섹션로드를 거부하는지 정확히 알지 못했습니다. 내 편에서는 clang-3.8, 최신 iproute2뿐만 아니라 최신 커널 (4.14에 가까운 커밋)을 사용하고 있습니다.

  • 어떻게 든 섹션을로드 할 수 있다면 커널에 프로그램을 첨부 할 때 여전히 문제가 발생한다고 생각합니다. "direct packet access"이라는 기능은 kernels 4.7 and higher에만 있습니다. 이것은 귀하의 프로그램에서 skb->dataskb->data_end을 사용할 수있게 해주는 것입니다.

  • 다음 보조 노트로이 프로그램 sockmap_parse_prog.c은 tc와 함께 사용되지 않습니다. 소켓에 직접 연결되어 있다고 가정합니다 (같은 디렉토리에있는 test_maps.c 파일의 SOCKMAP_PARSE_PROG을 검색하여 거기에로드 된 내용을 확인하십시오). 기술적으로 이것은 tc 필터로 프로그램을 첨부하는 것을 막지는 못하지만 예상대로 작동하지 않을 것입니다. 특히, 프로그램에서 리턴 된 값은 tc 분류 자 ​​훅이 이해할 수있는 의미가 없을 것입니다.

따라서 최근 커널을 사용해보고 더 많은 성공을 거둘 수 있는지 알아 보시기 바랍니다. 또는 자신의 커널 소스에서 찾을 수있는 예제를 컴파일하고 실행 해보십시오. 행운을 빕니다!

+0

의견에 감사드립니다. 최신 커널을 빌드하고 설치해야 할 것입니다.// TC-friendly bpf 예제를'sockmap_parse_prog.c' 대신 시도해야한다고 조언 해 주시겠습니까? – Mark

+0

또는 최근 배포판이있는 VM을 설치할 수 있습니다. 예를 들어 우분투 17.04에 커널 4.8이 있다고 생각합니까? 샘플의 경우,'samples/bpf/parse_simple.c'을 실행함으로써 시작할 수 있습니다. 이것은 주어진 목적지 포트 번호로 UDP 패킷을 드롭하는 것처럼 보이는 아주 기본적인 프로그램입니다. 'tools/testing/selftests/bpf'에도 다른 샘플이 있습니다. 'TC_ACT_' 리턴 코드를 grep하여 tc 용으로 작성된 프로그램을 찾을 수 있습니다. – Qeole