290 likes | 554 Views
Network Implementation (part II). 숭실대학교 네트워크 연구실 고석갑. Outline. skbuffer details sk_buff structure sk_buff utility functions Network device driver 3c509 Packet scheduler. sk_buff example. sk_buff structure. sk_buff structure (cont.). sk_buff related functions.
E N D
Network Implementation (part II) 숭실대학교 네트워크 연구실 고석갑
Outline • skbuffer details • sk_buff structure • sk_buff utility functions • Network device driver • 3c509 • Packet scheduler
sk_buff related functions alloc_skb (size)새로운 skb할당, 데이터영역 끝부분에 reference counter를 위한 공간을 확보. skb_clone (skb)구조체만 복사하여 2개의 데이터가 있는 것처럼 되게 한다. (데이터부분은 복사하지 않는다) skb_copy (skb)실제 데이터부분도 복사한다 skb_headerinit (p) skb_buff의 멤버변수들을 초기화 kfree_skbmem (skb) skb_buffer를 해제한다.(use검사를 하지 않음) skb_realloc_headroom(skb,headroom)데이터공간 앞에 headroom이라는 빈공간을 잡아준다
skb_buff MACRO functions skb_datarefp(skb) 데이터 영역의 reference count의 포인터를 반환 skb_queue_empty(list)리스트가 비어 있으면 1 반환 kfree_skb(skb) user를 감소시키고 0이 되면, 메모리를 해제한다. skb_peek(list)리스트의 처음 skb를 반환 skb_peek_tail(list)리스트의 마지막 skb를 반환 skb_queue_head(list,skb)리스트의 head에 skb삽입 skb_queue_tail(list,skb)리스트의 tail에 skb삽입 skb_dequeue(list)리스트의 head에서 skb꺼냄 skb_dequeue_tail(list)리스트의 tail에서 skb꺼냄 skb_put(skb,len)실제 데이터 크기를 len만큼 늘린다 skb_push(skb,len)데이터공간의 앞부분을 len만큼 늘린다. skb_pull(skb,len)데이터공간 앞부분을 len만큼 잘라버린다.
Network Device Driver • 3C509 NIC device driver for Linux • Major functions • el3_interrupt() –패킷 수신시, 패킷 송신 완료시, 에러발생시 인터럽트 발생 • el3_rx() - 패킷수신 처리 루틴 • el3_start_xmit() - 패킷송신 처리 루틴
device structure struct device{ } *name base_addr, irq, dma, *device ifindex, iflink broadcast[ ] dev_addr[ ] mc_list[ ] struct sk_buff { } *next, *prev qdisc buffer management *sk qdisc_sleeping qdisc_list *dev tx_queue_len Function pointers ……
device structure for 3c509 card el3 selected by routing informaiton start_kernel() struct device{ } eth0 init_modules() *name init_module() of el3 open() el3_open() stop() el3_close() hard_start_xmit() el3_start_xmit() el3_probe() set_multicast_list() set_multicast_list() get_stats() el3_get_stats() 나머지 function pointer들은 NULL IP packet
device structure for 3c509 card (cont.) ip_rcv() ip_packet_type ETH_P_IP type *dev NULL (*func)( ) ip_rcv() *data NULL *next NULL el3_rx( ) el3_interrupt( ) interrupt Ethernet frame that contains IP Packet
el3_rx 1 2 1 2 1
mark_bh 32bit bh_active • include/asm-i386/softirq.h • 100 extern inline void mark_bh(int nr) • 101 { • set_bit(nr, &bh_active); • } • (NET_BH=9, include/linux/interrupt.h) • kernel/softirq.c • 23 atomic_t bh_mask_count[32]; • 24 unsigned long bh_active = 0; • 25 unsigned long bh_mask = 0; • 26 void (*bh_base[32])(void); NET_BH • 1893 __initfunc(int net_dev_init(void)) • 1894 { • 1895 structdevice *dev, **dp; • 1905 skb_queue_head_init(&backlog); • 2027 init_bh(NET_BH, net_bh); • 2031 dev_mcast_init(); • 2044 return 0; • 2045 }
net_bh • 835 void net_bh(void) • 836 { • qdisc_run_queues(); • skb= skb_dequeue(&backlog); • type = skb->protocol; • t_prev->func(skb2, skb->dev, pt_prev); • qdisc_run_queues(); • 1026 return; • 1032 } 송신 * 같은 type의 수신함수들이 여러 개일 경우 clone을 실시 수신 송신
Traffic Control enqueue dequeue • 일반적인 패킷 스케쥴러 (Generic Packet scheduler) • 전송할 패킷은 filter matching에 따라 적절한 class의 Queue(buffer)에 들어간다. • 패킷 스케쥴러는 각 class내의 패킷을 우선순위에 따라 버퍼에서 꺼내어 실제 전송을 하게 된다. • 리눅스커널에서 사용할 수 있는 패킷스케쥴러 • TBF, CBQ, Priority Q, SFQ, CSZ, RED, FIFO, (WF2Q+)
When does TC wake up? • 언제 TC가 동작하는 가? • 패킷을 보낼때 • 타이머에 의해 • 패킷을 수신하였을 때 리눅스는 여러가지 패킷 스케쥴러를 선택하여 사용할 수 있다. 스케쥴러 마다 enqueue, dequeue함수가 틀리다.
Linux Traffic Control Functions • Queue discipline functions • enqueue, dequeue, requeue, drop, init, reset, destroy,dump • Class functions • graft, get, put, change, delete, walk, tcf_chain, bind_tcf, unbind_tcf, dump_class • Filter functions • classify, init, destroy, get, put, change, delete, walk
Interface to TC (rtnetlick socket) User Space TC nlmsghdr, tcmsg netlink, rtnetlink socket Kernel Space rtnetlink_rcv tc_get_qdisc tc_ctl_tfilter tc_modify_qdisc Queue discipline functions Class functions Filter functions
Additional References • Linux Traffic Control – Implementation Overview • Werner Almesberger, EPFL ICA. Nov. 30, 1998 • Summer Project Report (Oct. 1999) • Michael Feng, Roy Leung, Andrew Do-Sung Jun. Univ. of Toronto • Linux – Advanced Networking Overview • Saravanan Radhakrishnan. Univ. of Kansas. August 22, 1999
About next presentation (part III) • UDP • udpdeliver(), udp_rcv(), udp_sendmsg() • TCP • tcp_rcv(), tcp_transmit_skb() • IP • ip_rcv(), ip_forward(), ip_send(), ip_output(), ip_queue_xmit() • ARP • arp_find(), arp_rcv(), arp_send()