sk_buffer_관련_세미나

Download Report

Transcript sk_buffer_관련_세미나

Socket Buffer
발표자 유
종
욱
발표일 2003년 10월
1. Flow of Packet
Flow of Packet
Device
Input
sk_buff
sk_buff
Skb_dequeue
User
Process
sk_buff
sk_buff
Skb_queue_tail
sk_buff
2. Socket buffer Data Structure
주요 Field
Struct sk_buff *next;
Linked-list 중에 다음 sk buff 에 대한 pointer
Struct sk_buff *prev;
Linked-list 중에 이전 sk buff 에 대한 pointer
Struct sk_buff_head *list;
현재 sk_buff 가 속한 sk_buff_head에 대한 pointer
Struct sock *sk;
Queue 의 owner 인 struct sock 의 pointer
Struct net_device *dev;
받거나 보낼 device pointer
주요 Field
각각의 layer 별 header point
Union mac
<- link layer
Struct ethhdr *ethernet;
Union nh
<- network layer
Struct iphdr *iph;
Struct ipv6hdr *ipv6h;
Struct ipxhdr *ipxh;
Union h
Struct
Struct
Struct
Struct
Struct
Struct
<- transport layer
tcphdr *th;
udphdr *uh;
icmphdr *icmph;
igmphdr *igmph;
iphdr *ipiph;
spxhdr *spxh;
주요 Field
Struct dst_entry *dst;
목적지 주소의 entry에 대한 포인터
Unsigned int len;
실제 데이터의 길이
Unsigned int data_len;
어떨때 어떤 값으로 바뀌는지는 잘모르겠음.
Unsigned int truesize;
버퍼의 실제 길이
volatile char userd;
데이터가 사용자에게 넘어갔음을 나타냄
Unsigned char cloned;
Header 가 복제되었음을 나타냄
주요 Field
Unsigned short portocol;
Device로부터 받은 패킷의 프로토콜
Unsigned char *head;
데이터 버퍼의 headerroom의 pointer
Unsigned char *data;
데이터 버퍼의 data 부분의 pointer
Unsigned char *tail;
데이터 버퍼의 tailroom의 pointer
Unsigned char *end;
데이터 버퍼의 마지막의 pointer
sk_buff 의 구조
Sutuct sk_buff *next
Sutuct sk_buff *prev
Header Room
Sutuct net_device *dev
Link layer header
--Network layer header
Union h
Transport layer header
Union mac
---
Data
Unsigned char *head
Unsigned char *data
Unsigned char *tail
Unsigned char *end
Tail Room
truesize
len
Union nh
3. Socket buffer 관련 함수
주요 함수
struct sk_buff *alloc_skb(unsigned int size,int gfp_mask)
Head
Data
Tail
End
Tail Room
size
주요 함수
static inline struct sk_buff *dev_alloc_skb(unsigned int
length)
Head
Data
Tail
End
Head
Room
Tail Room
16
length
주요 함수
static inline void skb_reserve(struct sk_buff *skb,
unsigned int len)
Head
Data
Tail
Head
Data
Tail
End
Head RoomTail RoomTail Room
len
End
주요 함수
static inline unsigned char *skb_put(struct sk_buff *skb,
unsigned int len)
Head
Head
Data
Data
Tail
Data
Tail
End
Tail RoomTail Room
len
Head
Head
Room
Data
Data
Tail
Data
len
Tail End
Tail Room
Tail Room
End
주요 함수
static inline unsigned char *skb_push(struct sk_buff
*skb, unsigned int len)
Data
Head
Head
Head
Room
Room
Data
Data
Data
len
Tail
Tail
Room
End
주요 함수
static inline void skb_trim(struct sk_buff *skb, unsigned
int len)
Head
Head
Room
Data
DataData
len
Tail
Tail
Tail
Tail Room
Room
End
주요 함수
static inline unsigned char * pskb_pull(struct sk_buff
*skb, unsigned int len)
Head
Data
HeadHead
Room
Room
Data
DataData
len
Tail
Tail
Room
End
주요 함수
Sk_buff_head 의 linked list 관련 함수
static inline void skb_queue_head(struct sk_buff_head *list, struct
sk_buff *newsk)
Static inline void skb_queue_tail(struct sk_buff_head *list, struct sk_buff
*newsk)
static inline struct sk_buff *skb_dequeue(struct sk_buff_head *list)
static inline void skb_insert(struct sk_buff *old, struct sk_buff *newsk)
static inline void skb_append(struct sk_buff *old, struct sk_buff *newsk)
static inline struct sk_buff *skb_dequeue(struct sk_buff_head *list)
static inline struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list)
주요 함수
기타
static inline int skb_headroom(const struct sk_buff *skb)
Headroom size를 반환
static inline int skb_tailroom(const struct sk_buff *skb)
tailroom size를 반환
struct sk_buff *skb_clone(struct sk_buff *skb, int gfp_mask)
duplicate an sk_buff
struct sk_buff *skb_copy(const struct sk_buff *skb, int gfp_mask)
create private copy of an sk_buff
int skb_linearize(struct sk_buff *skb, int gfp_mask)
keep head the same: replace data
static inline void kfree_skb(struct sk_buff *skb)
skb free
4. 끝(질의 & 응답)