1 / 26

Network Implementation (part II)

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.

kalin
Télécharger la présentation

Network Implementation (part II)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Network Implementation (part II) 숭실대학교 네트워크 연구실 고석갑

  2. Outline • skbuffer details • sk_buff structure • sk_buff utility functions • Network device driver • 3c509 • Packet scheduler

  3. sk_buff example

  4. sk_buff structure

  5. sk_buff structure(cont.)

  6. 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이라는 빈공간을 잡아준다

  7. 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만큼 잘라버린다.

  8. Network Device Driver • 3C509 NIC device driver for Linux • Major functions • el3_interrupt() –패킷 수신시, 패킷 송신 완료시, 에러발생시 인터럽트 발생 • el3_rx() - 패킷수신 처리 루틴 • el3_start_xmit() - 패킷송신 처리 루틴

  9. 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 ……

  10. 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

  11. 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

  12. el3_interrupt

  13. el3_interrupt (cont.) 2 2

  14. el3_rx 1 2 1 2 1

  15. el3_start_xmit

  16. el3_start_xmit (cont.)

  17. Packet receiving/sending

  18. netif_rx

  19. 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 }

  20. 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을 실시 수신 송신

  21. Traffic Control enqueue dequeue • 일반적인 패킷 스케쥴러 (Generic Packet scheduler) • 전송할 패킷은 filter matching에 따라 적절한 class의 Queue(buffer)에 들어간다. • 패킷 스케쥴러는 각 class내의 패킷을 우선순위에 따라 버퍼에서 꺼내어 실제 전송을 하게 된다. • 리눅스커널에서 사용할 수 있는 패킷스케쥴러 • TBF, CBQ, Priority Q, SFQ, CSZ, RED, FIFO, (WF2Q+)

  22. When does TC wake up? • 언제 TC가 동작하는 가? • 패킷을 보낼때 • 타이머에 의해 • 패킷을 수신하였을 때 리눅스는 여러가지 패킷 스케쥴러를 선택하여 사용할 수 있다. 스케쥴러 마다 enqueue, dequeue함수가 틀리다.

  23. 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

  24. 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

  25. 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

  26. 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()

More Related