2016-08-04 2 views
0

리눅스 커널에 맞춤 프로토콜을 작성하고 있습니다. 내가 HDR-의 주소로 synack (다른 패킷) 구조를 매핑, 다음과 같은 구조 받은 네트워크 패킷의 메모리 정렬 문제

struct syn { 
    __be32 id;  
    __be64 cookie; 
}; 

struct ack { 
    __be32 id;  // Right now, setting it to 14 (Just a random choice) 
    __be32 sequence; 
}; 

struct hdr { 
    ............ 
    __be32 type; //last element 
}; 

내가 보내고 패킷을 수신

을 사용하고 있습니다> 입력합니다.

이상적 (SYN과 ACK 구조에서) ID가 hdr->type에 매핑되어야하고, 무엇이든 struct hdr 다음에 내가 hdr->type에 매핑있어하는 구조체에 따라 syn->cookie 또는 ack->sequence 중 하나에 매핑되어야한다는 것을 의미한다 .

그러나 이러한 변수의 메모리 주소를 인쇄에

, 나는
//For struct syn 
hdr->type at ffff880059f55444 
syn->id at ffff880059f55444 
syn->cookie at ffff880059f5544c //See the last two bits 

//For struct ack_frame 
hdr->type at ffff880059f55044 
ack->id at ffff880059f55044 
ack->sequence at ffff880059f55048 //See the last two bits 

다음 얻을 왜 ack->idsyn->id는 같은 크기있을 때 syn->cookie을하고 hdr->type을 기준으로 서로 다른 오프셋에서 ack->sequence 시작?

편집 1 : 64 비트 컴파일러가 채워 일부터 나는

char *ptr = (char *)&hdr->type; 
//For syn 
struct syn *syn1 = (struct syn *)ptr 
//For ack 
struct ack *ack1 = (struct ack *)ptr 
+0

핵심 단어는 * 성향 * ... – Nim

+0

당신은 "나는 HDR-의 주소> 입력에 (다른 패킷) 구조가 SYN과 ACK지도."무슨 뜻입니까? 나는 타입의 lvalue가 객체의 유효한 타입이 아니거나 경계를 벗어나는 것을 접근하는 객체에 접근하기 위해 정의되지 않은 동작을 냄새 맡는다. – EOF

+0

예, 이해합니다. 그러나 다른 구조를 사용하여 패킷을 채웠더라도 매번 같은 방식으로 패킷에 액세스 할 수있는 방법이 필요합니다. –

답변

1

를 사용하여 이러한 구조를 매핑 구조체 다음

struct syn { 
    uint32_t id 
    uint32_t hole -- the compiler must add here cause it mist align 
    uint64_t seq 
} 

I 데이터가 구멍이없는 것 같아요 ,이를 고치려면 seq를 uint32_t로 설정하고 나중에 캐스팅해야합니다. packed에서

+0

의미가 있습니다. 나는 이것을 시도하고보고 할 것이다 : –

+0

나는 이것이 메모리 접근을 느리게 만들 것이라고 믿는다. [read here] (http://www.catb.org/esr/structure-packing/) –

0

다음과 같이 구조를 정의해야합니다. 팩 된 속성은 할당을 1 바이트로해야 함을 의미합니다. 다음 구조는 12 바이트 길이입니다. "attribyte"키워드를 사용하지 않으면 구조가 16 바이트가됩니다. 여기

struct yours{ 
__be32 id;  
__be64 cookie; 
}__attribute__((__packed__)); 
관련 문제