일상 메모장

struct sk_buff 관련 함수 본문

Kernel TCP IP

struct sk_buff 관련 함수

핸드오버 2019. 12. 20. 21:28

struct sk_buff

 

sk_buff 는 Linux TCP/IP stack에서 사용하는 네트워크 패킷을 나타냅니다.

sk_buff는 3가지 구성요소를 가지고 있다. sk_buff 와 linear-data 버퍼 그리고 paged-data(struct skb_shared_info)를 가지고 있습니다.

sk_buff를 alloc 하고 sk_buff structure 에는 버퍼의 특정 포인터를

가르키는 4개의 변수 head, data, tail, end 가 존재합니다.

네트워크 layer 의 특성상 버퍼의 앞부분, 또는 뒷부분에 데이터들이(network header 또는 userdata)

추가 또는 삭제될 경우가 빈번하기 때문에 4개의 변수가 존재합니다.

 

쉽게 설명하면 버퍼의 중앙부분에 실제 데이터가 존재하고

head ~ data , tail ~ end 포인터의 위치를 비워두면서 데이터가 추가될 경우

버퍼를 늘릴 필요 없이 버퍼 앞, 뒤에 데이터를 쉽고, 빠르게

추가하기 위해서라고 생각하면 쉽습니다.

 

왼쪽은 sk_buff 변수들이고 각 변수들이 실제 sk_buff memory의 어떤 위치를 가르키고 있는지 나타냅니다.

 

sk_buff 관련 함수

  • alloc_skb(size)

    • 이 함수는 새로운 sk_buff를 할당합니다. Headroom 과 Data length 는 0 입니다. tailroom 은 length와 같아집니다.

    • head = data = tail; end = tail + size; len = 0

  • skb_reserve(len)

    • 이 함수는 대부분 protocol header 저장을 위해 버퍼를 예약할때 사용된다.

    • data += len; tail += len

 

  • skb_put(len)

    • 이 함수는 sk_buff 의 linear data 영역을 조작하는데 사용됩니다. tail pointer를 밑으로 확장합니다.(Data 영역 확장). user data 를 넣거나 TCP/UDP payload 를 copy하는데 쓰입니다. 사용 예는 tcp_sendmsg() 함수의 skb_add_data() 부분을 참고하시기 바랍니다.

    • tail += len; len += len

  • skb_push(len)

    • 이 함수는 주로 데이터를 송신할 때 쓰이는데 각 프로토콜 에이어에서 헤더가 추가될때 사용됩니다.
    • headroom을 len 만큼 줄이고 data length를 증가시킵니다.

    • data -= len; len += len

  • skb_pull(len)

    • data pointer를 len 만큼 내리고 변경된 data pointer를 리턴합니다.

    • 요청한 len 만큼 data가 줄고 headroom이 늘어나고, 이 함수는 주로 패킷을 수신했을때 사용됩니다.

 

 

혹시 잘못된점 있으면 알려주세요~