티스토리 뷰

개발/Linux

Kernel ipt_get_entries struct .. size

Jaeyeon Baek 2011. 12. 4. 16:56



아... 일주일째다..

iptables에서 참조하는 이녀석의 size를 결정하는 곳이 도무지 어딘지 알 수가 없다. iptables compile시에 mips 환경의 경우에 40bye가 출력되는데, 이는 분명 8bytes Align되는것이다. 절대 다른 struct를 참조해서 나오는 결과가 아니다, 그런데 왜 ? 내가 작성한 main 파일에 동일한 struct(이름만 다른)는 36bytes가 출력되는지................. (일단, 실제 ipt_get_entries가 선언되어 있는곳에 동일하게 유사 struct를 생성하면 그 struct도 동일한 size가 나온다. 그렇다는 것은 특정 .c 파일에 선언되어 있는 struct를 8bytes로 Align한다는 얘기인데....) 실제로 iptables에서 참조하는 ipt_get_entries에 padding용으로 unsigned int 형태의 변수를 추가해도 sizeof값은 40bytes다, 왜냐면, 이미 32bytes+4bytes였지만, padding 4bytes가 포함되어 40bytes였기 때문에 임의의 4bytes 변수를 추가해도 결국 padding 자리에 들어가기 때문에 ...

아 답답하다, compiler를 공부해야되나...compiler가 내가 만든 구조체를 차별하나.....별 생각이 다드네.. (뭐 엄밀히 말하면 파일별로 Align을 다르게 한다는 말인데.. )

해결하면 포스팅 걸어야겠다... 빨리 해결해야지,

참조

struct ipt_get_entries
{
    /* Which table: user fills this in. */
    char name[IPT_TABLE_MAXNAMELEN];  // IPT_TABLE_MAXNAMELEN : 32 

    /* User fills this in: total entry size. */
    unsigned int size;

    /* The entries. */
    struct ipt_entry entrytable[0];
};

첨부 #1 (2011.12.05)
구조체의 ALIGN은 구조체 내의 멤버중 가장 큰 size로 지정되는데, ipt_entry의 영향을 받는다. 어떤 원리인지 아직 정확하지는 않지만, ipt_entry 대신 struct ipt_entry_tmp를 생성 후, 멤버로 unsigned int를 갖을 경우 ipt_get_entries의 size는 36bytes ALIGN되고, long long 으로 갖을 경우
40bytes ALIGN된다, (64bit Kernel 기준)

첨부 #2 (2011.12.12)
간단하게 될 문제가 아닌것으로 결정 되서 관련된 업무를 접었다. 알아본 바로는 본디 intel x86 CPU는 real 16bit로 올라오고 32bit로 align되는 과정을 겪는단다. 반대로 mips의 경우 64bit로 align되기 때문에.. cpu의 영향을 어찌 하기는 애매하고 iptables가 compile될 당시에 참조할 Kernel이 대폭 수정되거나, 본 Kernel이 소폭 수정되거나.. 어떤것이 되었든.. 간단한 것은 아니란다.

첨부 #3 (2012.01.02) - 해결
Kernel version 2.6.20 version 당시에는 IPv6에 대한 과도기였고, 그로 인해 정식 버전이 지원하지 않았다. 그리고 시간이 흘러 약 2.6.25 version에 IPv4와 마찬가지의 compat 관련 함수들이 commit되기 시작하였으며 해당 변수들을 정상적으로 포팅하여 사용하면, 64bit Kernel에서 32bit iptables(application)을 정상적으로 동작시킬 수 있다. 참 그간의 모든 행위가 허탈해지는 순간이 아닐 수 없구나 .. 쩝


'개발 > Linux' 카테고리의 다른 글

function kernel_thread()  (0) 2011.12.15
offsetof 매크로  (0) 2011.12.05
__alignof__, aligned 매크로  (0) 2011.12.02
Kernel Netfilter socket option (getsockopt, setsockopt)  (2) 2011.12.02
64bit kernel + 32bit iptables (Application)  (0) 2011.11.30
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday