日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Linux网络子系统

發布時間:2024/4/11 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux网络子系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


今天分享一篇經典Linux協議棧文章,主要講解Linux網絡子系統,看完相信大家對協議棧又會加深不少,不光可以了解協議棧處理流程,方便定位問題,還可以學習一下怎么去設計一個可擴展的子系統,屏蔽不同層次的差異。

目錄

1.Linux網絡子系統的分層

2.TCP/IP分層模型

3.Linux?網絡協議棧

4.Linux?網卡收包時的中斷處理問題

5.Linux?網絡啟動的準備工作

6.Linux網絡包:中斷到網絡層接收

7.總結

Linux網絡子系統的分層

Linux網絡子系統實現需要:

  • 支持不同的協議族 ( INET, INET6, UNIX, NETLINK...)

  • 支持不同的網絡設備

  • 支持統一的BSD socket API

  • 需要屏蔽協議、硬件、平臺(API)的差異,因而采用分層結構:

?

?

系統調用提供用戶的應用程序訪問內核的唯一途徑。協議無關接口由socket layer來實現的,其提供一組通用功能,以支持各種不同的協議。網絡協議層為socket層提供具體協議接口——proto{},實現具體的協議細節。設備無關接口,提供一組通用函數供底層網絡設備驅動程序使用。設備驅動與特定網卡設備相關,定義了具體的協議細節,會分配一個net_device結構,然后用其必需的例程進行初始化。

TCP/IP分層模型

在TCP/IP網絡分層模型里,整個協議棧被分成了物理層、鏈路層、網絡層,傳輸層和應用層。物理層對應的是網卡和網線,應用層對應的是我們常見的Nginx,FTP等等各種應用。Linux實現的是鏈路層、網絡層和傳輸層這三層。

在Linux內核實現中,鏈路層協議靠網卡驅動來實現,內核協議棧來實現網絡層和傳輸層。內核對更上層的應用層提供socket接口來供用戶進程訪問。我們用Linux的視角來看到的TCP/IP網絡分層模型應該是下面這個樣子的。

?

?

?

首先我們梳理一下每層模型的職責:

鏈路層:對0和1進行分組,定義數據幀,確認主機的物理地址,傳輸數據;

網絡層:定義IP地址,確認主機所在的網絡位置,并通過IP進行MAC尋址,對外網數據包進行路由轉發;

傳輸層:定義端口,確認主機上應用程序的身份,并將數據包交給對應的應用程序;

應用層:定義數據格式,并按照對應的格式解讀數據。

?

然后再把每層模型的職責串聯起來,用一句通俗易懂的話講就是:

當你輸入一個網址并按下回車鍵的時候,首先,應用層協議對該請求包做了格式定義;緊接著傳輸層協議加上了雙方的端口號,確認了雙方通信的應用程序;然后網絡協議加上了雙方的IP地址,確認了雙方的網絡位置;最后鏈路層協議加上了雙方的MAC地址,確認了雙方的物理位置,同時將數據進行分組,形成數據幀,采用廣播方式,通過傳輸介質發送給對方主機。而對于不同網段,該數據包首先會轉發給網關路由器,經過多次轉發后,最終被發送到目標主機。目標機接收到數據包后,采用對應的協議,對幀數據進行組裝,然后再通過一層一層的協議進行解析,最終被應用層的協議解析并交給服務器處理。

Linux 網絡協議棧

基于TCP/IP協議棧的send/recv在應用層,傳輸層,網絡層和鏈路層中具體函數調用過程已經有很多人研究,本文引用一張比較完善的圖如下:

?

?

以上說明基本大致說明了TCP/IP中TCP,UDP協議包在網絡子系統中的實現流程。本文主要在鏈路層中,即關于網卡收報觸發中斷到進入網絡層之間的過程探究。

Linux 網卡收包時的中斷處理問題

中斷,一般指硬件中斷,多由系統自身或與之鏈接的外設(如鍵盤、鼠標、網卡等)產生。中斷首先是處理器提供的一種響應外設請求的機制,是處理器硬件支持的特性。一個外設通過產生一種電信號通知中斷控制器,中斷控制器再向處理器發送相應的信號。處理器檢測到了這個信號后就會打斷自己當前正在做的工作,轉而去處理這次中斷(所以才叫中斷)。當然在轉去處理中斷和中斷返回時都有保護現場和返回現場的操作,這里不贅述。

那軟中斷又是什么呢?我們知道在中斷處理時CPU沒法處理其它事物,對于網卡來說,如果每次網卡收包時中斷的時間都過長,那很可能造成丟包的可能性。當然我們不能完全避免丟包的可能性,以太包的傳輸是沒有100%保證的,所以網絡才有協議棧,通過高層的協議來保證連續數據傳輸的數據完整性(比如在協議發現丟包時要求重傳)。但是即使有協議保證,那我們也不能肆無忌憚的使用中斷,中斷的時間越短越好,盡快放開處理器,讓它可以去響應下次中斷甚至進行調度工作。基于這樣的考慮,我們將中斷分成了上下兩部分,上半部分就是上面說的中斷部分,需要快速及時響應,同時需要越快結束越好。而下半部分就是完成一些可以推后執行的工作。對于網卡收包來說,網卡收到數據包,通知內核數據包到了,中斷處理將數據包存入內存這些都是急切需要完成的工作,放到上半部完成。而解析處理數據包的工作則可以放到下半部去執行。

軟中斷就是下半部使用的一種機制,它通過軟件模仿硬件中斷的處理過程,但是和硬件沒有關系,單純的通過軟件達到一種異步處理的方式。其它下半部的處理機制還包括tasklet,工作隊列等。依據所處理的場合不同,選擇不同的機制,網卡收包一般使用軟中斷。對應NET_RX_SOFTIRQ這個軟中斷,軟中斷的類型如下:

enum {HI_SOFTIRQ=0,TIMER_SOFTIRQ,NET_TX_SOFTIRQ,NET_RX_SOFTIRQ,BLOCK_SOFTIRQ,IRQ_POLL_SOFTIRQ,TASKLET_SOFTIRQ,SCHED_SOFTIRQ,HRTIMER_SOFTIRQ,RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */NR_SOFTIRQS };

通過以上可以了解到,Linux中斷注冊顯然應該包括網卡的硬中斷,包處理的軟中斷兩個步驟。

?

注冊網卡中斷

我們以一個具體的網卡驅動為例,比如e1000。其模塊初始化函數就是:

static int __init e1000_init_module(void) {int ret;pr_info("%s - version %s\n", e1000_driver_string, e1000_driver_version);pr_info("%s\n", e1000_copyright);ret = pci_register_driver(&e1000_driver); ...return ret;}

其中e1000_driver這個結構體是一個關鍵,這個結構體中很主要的一個方法就是.probe方法,也就是e1000_probe():

/** * e1000_probe - Device Initialization Routine * @pdev: PCI device information struct * @ent: entry in e1000_pci_tbl * * Returns 0 on success, negative on failure * * e1000_probe initializes an adapter identified by a pci_dev structure. * The OS initialization, configuring of the adapter private structure, * and a hardware reset occur. **/ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { ... ...netdev->netdev_ops = &e1000_netdev_ops;e1000_set_ethtool_ops(netdev); ... ... }

這個函數很長,我們不都列出來,這是e1000主要的初始化函數,即使從注釋都能看出來。我們留意其注冊了netdev的netdev_ops,用的是e1000_netdev_ops這個結構體:

static const struct net_device_ops e1000_netdev_ops = {.ndo_open = e1000_open,.ndo_stop = e1000_close,.ndo_start_xmit = e1000_xmit_frame,.ndo_set_rx_mode = e1000_set_rx_mode,.ndo_set_mac_address = e1000_set_mac,.ndo_tx_timeout = e1000_tx_timeout, ... ... };

這個e1000的方法集里有一個重要的方法,e1000_open,我們要說的中斷的注冊就從這里開始:

/** * e1000_open - Called when a network interface is made active * @netdev: network interface device structure * * Returns 0 on success, negative value on failure * * The open entry point is called when a network interface is made * active by the system (IFF_UP). At this point all resources needed * for transmit and receive operations are allocated, the interrupt * handler is registered with the OS, the watchdog task is started, * and the stack is notified that the interface is ready. **/ int e1000_open(struct net_device *netdev) {struct e1000_adapter *adapter = netdev_priv(netdev);struct e1000_hw *hw = &adapter->hw; ... ...err = e1000_request_irq(adapter); ... }

e1000在這里注冊了中斷:

static int e1000_request_irq(struct e1000_adapter *adapter) {struct net_device *netdev = adapter->netdev;irq_handler_t handler = e1000_intr;int irq_flags = IRQF_SHARED;int err;err = request_irq(adapter->pdev->irq, handler, irq_flags, netdev->name, ... ... }

如上所示,這個被注冊的中斷處理函數,也就是handler,就是e1000_intr()。我們不展開這個中斷處理函數看了,我們知道中斷處理函數在這里被注冊了,在網絡包來的時候會觸發這個中斷函數。

注冊軟中斷

內核初始化期間,softirq_init會注冊TASKLET_SOFTIRQ以及HI_SOFTIRQ相關聯的處理函數。

void __init softirq_init(void) {......open_softirq(TASKLET_SOFTIRQ, tasklet_action);open_softirq(HI_SOFTIRQ, tasklet_hi_action);} 網絡子系統分兩種soft IRQ。NET_TX_SOFTIRQ和NET_RX_SOFTIRQ,分別處理發送數據包和接收數據包。這兩個soft IQ在net_dev_init函數(net/core/dev.c)中注冊: open_softirq(NET_TX_SOFTIRQ, net_tx_action);open_softirq(NET_RX_SOFTIRQ,?net_rx_action);

收發數據包的軟中斷處理函數被注冊為net_rx_action和net_tx_action。其中open_softirq實現為:

void open_softirq(int nr, void (*action)(struct softirq_action *)) {softirq_vec[nr].action = action;}

?

?

  • 從硬中斷到軟中斷

?

?

?

Linux 網絡啟動的準備工作

首先在開始收包之前,Linux要做許多的準備工作:

1. 創建ksoftirqd線程,為它設置好它自己的線程函數,后面就指望著它來處理軟中斷呢。

2. 協議棧注冊,linux要實現許多協議,比如arp,icmp,ip,udp,tcp,每一個協議都會將自己的處理函數注冊一下,方便包來了迅速找到對應的處理函數

3. 網卡驅動初始化,每個驅動都有一個初始化函數,內核會讓驅動也初始化一下。在這個初始化過程中,把自己的DMA準備好,把NAPI的poll函數地址告訴內核

4. 啟動網卡,分配RX,TX隊列,注冊中斷對應的處理函數

?

創建ksoftirqd內核線程

Linux的軟中斷都是在專門的內核線程(ksoftirqd)中進行的,因此我們非常有必要看一下這些進程是怎么初始化的,這樣我們才能在后面更準確地了解收包過程。該進程數量不是1個,而是N個,其中N等于你的機器的核數。

系統初始化的時候在kernel/smpboot.c中調用了smpboot_register_percpu_thread, 該函數進一步會執行到spawn_ksoftirqd(位于kernel/softirq.c)來創建出softirqd進程。

?

相關代碼如下:

//file: kernel/softirq.c static struct smp_hotplug_thread softirq_threads = {.store = &ksoftirqd,.thread_should_run = ksoftirqd_should_run,.thread_fn = run_ksoftirqd,.thread_comm = "ksoftirqd/%u", };

當ksoftirqd被創建出來以后,它就會進入自己的線程循環函數ksoftirqd_should_run和run_ksoftirqd了。不停地判斷有沒有軟中斷需要被處理。這里需要注意的一點是,軟中斷不僅僅只有網絡軟中斷,還有其它類型。

?

創建ksoftirqd內核線程

?

linux內核通過調用subsys_initcall來初始化各個子系統,在源代碼目錄里你可以grep出許多對這個函數的調用。這里我們要說的是網絡子系統的初始化,會執行到net_dev_init函數。

?

在這個函數里,會為每個CPU都申請一個softnet_data數據結構,在這個數據結構里的poll_list是等待驅動程序將其poll函數注冊進來,稍后網卡驅動初始化的時候我們可以看到這一過程。

另外open_softirq注冊了每一種軟中斷都注冊一個處理函數。NET_TX_SOFTIRQ的處理函數為net_tx_action,NET_RX_SOFTIRQ的為net_rx_action。繼續跟蹤open_softirq后發現這個注冊的方式是記錄在softirq_vec變量里的。后面ksoftirqd線程收到軟中斷的時候,也會使用這個變量來找到每一種軟中斷對應的處理函數。

?

協議棧注冊

內核實現了網絡層的ip協議,也實現了傳輸層的tcp協議和udp協議。這些協議對應的實現函數分別是ip_rcv(),tcp_v4_rcv()和udp_rcv()。和我們平時寫代碼的方式不一樣的是,內核是通過注冊的方式來實現的。Linux內核中的fs_initcall和subsys_initcall類似,也是初始化模塊的入口。fs_initcall調用inet_init后開始網絡協議棧注冊。通過inet_init,將這些函數注冊到了inet_protos和ptype_base數據結構中

相關代碼如下

//file: net/ipv4/af_inet.cstatic struct packet_type ip_packet_type __read_mostly = {.type = cpu_to_be16(ETH_P_IP),.func = ip_rcv, };static const struct net_protocol udp_protocol = {.handler = udp_rcv,.err_handler = udp_err,.no_policy = 1,.netns_ok = 1, };static const struct net_protocol tcp_protocol = {.early_demux = tcp_v4_early_demux,.handler = tcp_v4_rcv,.err_handler = tcp_v4_err,.no_policy = 1,.netns_ok = 1, };

擴展一下,如果看一下ip_rcv和udp_rcv等函數的代碼能看到很多協議的處理過程。例如,ip_rcv中會處理netfilter和iptable過濾,如果你有很多或者很復雜的 netfilter 或 iptables 規則,這些規則都是在軟中斷的上下文中執行的,會加大網絡延遲。再例如,udp_rcv中會判斷socket接收隊列是否滿了。對應的相關內核參數是net.core.rmem_max和net.core.rmem_default。如果有興趣,建議大家好好讀一下inet_init這個函數的代碼。

網卡驅動初始化

每一個驅動程序(不僅僅只是網卡驅動)會使用 module_init 向內核注冊一個初始化函數,當驅動被加載時,內核會調用這個函數。比如igb網卡驅動的代碼位于drivers/net/ethernet/intel/igb/igb_main.c

驅動的pci_register_driver調用完成后,Linux內核就知道了該驅動的相關信息,比如igb網卡驅動的igb_driver_name和igb_probe函數地址等等。當網卡設備被識別以后,內核會調用其驅動的probe方法(igb_driver的probe方法是igb_probe)。驅動probe方法執行的目的就是讓設備ready,對于igb網卡,其igb_probe位于drivers/net/ethernet/intel/igb/igb_main.c下。主要執行的操作如下:

?

第5步中我們看到,網卡驅動實現了ethtool所需要的接口,也在這里注冊完成函數地址的注冊。當 ethtool 發起一個系統調用之后,內核會找到對應操作的回調函數。對于igb網卡來說,其實現函數都在drivers/net/ethernet/intel/igb/igb_ethtool.c下。相信你這次能徹底理解ethtool的工作原理了吧?這個命令之所以能查看網卡收發包統計、能修改網卡自適應模式、能調整RX 隊列的數量和大小,是因為ethtool命令最終調用到了網卡驅動的相應方法,而不是ethtool本身有這個超能力。

第6步注冊的igb_netdev_ops中包含的是igb_open等函數,該函數在網卡被啟動的時候會被調用。

//file: drivers/net/ethernet/intel/igb/igb_main. ...... static const struct net_device_ops igb_netdev_ops = {.ndo_open = igb_open,.ndo_stop = igb_close,.ndo_start_xmit = igb_xmit_frame,.ndo_get_stats64 = igb_get_stats64,.ndo_set_rx_mode = igb_set_rx_mode,.ndo_set_mac_address = igb_set_mac,.ndo_change_mtu = igb_change_mtu,.ndo_do_ioctl = igb_ioctl,...... }

第7步中,在igb_probe初始化過程中,還調用到了igb_alloc_q_vector。他注冊了一個NAPI機制所必須的poll函數,對于igb網卡驅動來說,這個函數就是igb_poll,如下代碼所示。

static int igb_alloc_q_vector(struct igb_adapter *adapter,int v_count, int v_idx,int txr_count, int txr_idx,int rxr_count, int rxr_idx) {....../* initialize NAPI */netif_napi_add(adapter->netdev, &q_vector->napi,igb_poll, 64);} 啟動網卡

當上面的初始化都完成以后,就可以啟動網卡了。回憶前面網卡驅動初始化時,我們提到了驅動向內核注冊了 structure net_device_ops 變量,它包含著網卡啟用、發包、設置mac 地址等回調函數(函數指針)。當啟用一個網卡時(例如,通過 ifconfig eth0 up),net_device_ops 中的 igb_open方法會被調用。它通常會做以下事情:

?

//file: drivers/net/ethernet/intel/igb/igb_main.c static int __igb_open(struct net_device *netdev, bool resuming) {/* allocate transmit descriptors */err = igb_setup_all_tx_resources(adapter);/* allocate receive descriptors */err = igb_setup_all_rx_resources(adapter);/* 注冊中斷處理函數 */err = igb_request_irq(adapter);if (err)goto err_req_irq;/* 啟用NAPI */for (i = 0; i < adapter->num_q_vectors; i++)napi_enable(&(adapter->q_vector[i]->napi));...... }

在上面__igb_open函數調用了igb_setup_all_tx_resources,和igb_setup_all_rx_resources。在igb_setup_all_rx_resources這一步操作中,分配了RingBuffer,并建立內存和Rx隊列的映射關系。(Rx Tx 隊列的數量和大小可以通過 ethtool 進行配置)。我們再接著看中斷函數注冊igb_request_irq:

static int igb_request_irq(struct igb_adapter *adapter) {if (adapter->msix_entries) {err = igb_request_msix(adapter);if (!err)goto request_done;......} }static int igb_request_msix(struct igb_adapter *adapter) {......for (i = 0; i < adapter->num_q_vectors; i++) {...err = request_irq(adapter->msix_entries[vector].vector,igb_msix_ring, 0, q_vector->name,}

在上面的代碼中跟蹤函數調用, __igb_open => igb_request_irq => igb_request_msix, 在igb_request_msix中我們看到了,對于多隊列的網卡,為每一個隊列都注冊了中斷,其對應的中斷處理函數是igb_msix_ring(該函數也在drivers/net/ethernet/intel/igb/igb_main.c下)。我們也可以看到,msix方式下,每個 RX 隊列有獨立的MSI-X 中斷,從網卡硬件中斷的層面就可以設置讓收到的包被不同的 CPU處理。(可以通過 irqbalance ,或者修改 /proc/irq/IRQ_NUMBER/smp_affinity能夠修改和CPU的綁定行為)。

到此準備工作完成。

Linux網絡包:中斷到網絡層接收

網卡收包從整體上是網線中的高低電平轉換到網卡FIFO存儲再拷貝到系統主內存(DDR3)的過程,其中涉及到網卡控制器,CPU,DMA,驅動程序,在OSI模型中屬于物理層和鏈路層,如下圖所示。


中斷處理

物理網卡收到數據包的處理流程如上圖左半部分所示,詳細步驟如下:

1. 網卡收到數據包,先將高低電平轉換到網卡fifo存儲,網卡申請ring buffer的描述,根據描述找到具體的物理地址,從fifo隊列物理網卡會使用DMA將數據包寫到了該物理地址,,其實就是skb_buffer中.

2. 這個時候數據包已經被轉移到skb_buffer中,因為是DMA寫入,內核并沒有監控數據包寫入情況,這時候NIC觸發一個硬中斷,每一個硬件中斷會對應一個中斷號,且指定一個vCPU來處理,如上圖vcpu2收到了該硬件中斷.

3. 硬件中斷的中斷處理程序,調用驅動程序完成,a.啟動軟中斷

4. 硬中斷觸發的驅動程序會禁用網卡硬中斷,其實這時候意思是告訴NIC,再來數據不用觸發硬中斷了,把數據DMA拷入系統內存即可

5. 硬中斷觸發的驅動程序會啟動軟中斷,啟用軟中斷目的是將數據包后續處理流程交給軟中斷慢慢處理,這個時候退出硬件中斷了,但是注意和網絡有關的硬中斷,要等到后續開啟硬中斷后,才有機會再次被觸發

6. NAPI觸發軟中斷,觸發napi系統

7. 消耗ringbuffer指向的skb_buffer

8. NAPI循環處理ringbuffer數據,處理完成

9. 啟動網絡硬件中斷,有數據來時候就可以繼續觸發硬件中斷,繼續通知CPU來消耗數據包.

其實上述過程過程簡單描述為:網卡收到數據包,DMA到內核內存,中斷通知內核數據有了,內核按輪次處理消耗數據包,一輪處理完成后,開啟硬中斷。其核心就是網卡和內核其實是生產和消費模型,網卡生產,內核負責消費,生產者需要通知消費者消費;如果生產過快會產生丟包,如果消費過慢也會產生問題。也就說在高流量壓力情況下,只有生產消費優化后,消費能力夠快,此生產消費關系才可以正常維持,所以如果物理接口有丟包計數時候,未必是網卡存在問題,也可能是內核消費的太慢。

關于CPU與ksoftirqd的關系可以描述如下:

?

?

?

網卡收到的數據寫入到內核內存

NIC在接收到數據包之后,首先需要將數據同步到內核中,這中間的橋梁是rx ring buffer。它是由NIC和驅動程序共享的一片區域,事實上,rx ring buffer存儲的并不是實際的packet數據,而是一個描述符,這個描述符指向了它真正的存儲地址,具體流程如下:

1. 驅動在內存中分配一片緩沖區用來接收數據包,叫做sk_buffer;

2. 將上述緩沖區的地址和大小(即接收描述符),加入到rx ring buffer。描述符中的緩沖區地址是DMA使用的物理地址;

3. 驅動通知網卡有一個新的描述符;

4. 網卡從rx ring buffer中取出描述符,從而獲知緩沖區的地址和大小;

5. 網卡收到新的數據包;

6. 網卡將新數據包通過DMA直接寫到sk_buffer中。

當驅動處理速度跟不上網卡收包速度時,驅動來不及分配緩沖區,NIC接收到的數據包無法及時寫到sk_buffer,就會產生堆積,當NIC內部緩沖區寫滿后,就會丟棄部分數據,引起丟包。這部分丟包為rx_fifo_errors,在 /proc/net/dev中體現為fifo字段增長,在ifconfig中體現為overruns指標增長。

中斷下半部分

ksoftirqd內核線程處理軟中斷,即中斷下半部分軟中斷處理過程:

1.NAPI(以e1000網卡為例):net_rx_action() -> e1000_clean() -> e1000_clean_rx_irq() -> e1000_receive_skb() -> netif_receive_skb()

2.非NAPI(以dm9000網卡為例):net_rx_action() -> process_backlog() -> netif_receive_skb()

最后網卡驅動通過netif_receive_skb()將sk_buff上送協議棧。

?

內核線程初始化的時候,我們介紹了ksoftirqd中兩個線程函數ksoftirqd_should_run和run_ksoftirqd。其中ksoftirqd_should_run代碼如下:

?

#define local_softirq_pending() \ __IRQ_STAT(smp_processor_id(), __softirq_pending)

這里看到和硬中斷中調用了同一個函數local_softirq_pending。使用方式不同的是硬中斷位置是為了寫入標記,這里僅僅只是讀取。如果硬中斷中設置了NET_RX_SOFTIRQ,這里自然能讀取的到。接下來會真正進入線程函數中run_ksoftirqd處理:

static void run_ksoftirqd(unsigned int cpu) {local_irq_disable();if (local_softirq_pending()) {__do_softirq();rcu_note_context_switch(cpu);local_irq_enable();cond_resched();return;}local_irq_enable(); }

在__do_softirq中,判斷根據當前CPU的軟中斷類型,調用其注冊的action方法。

asmlinkage void __do_softirq(void)

?

在網絡子系統初始化小節,我們看到我們為NET_RX_SOFTIRQ注冊了處理函數net_rx_action。所以net_rx_action函數就會被執行到了。

這里需要注意一個細節,硬中斷中設置軟中斷標記,和ksoftirq的判斷是否有軟中斷到達,都是基于smp_processor_id()的。這意味著只要硬中斷在哪個CPU上被響應,那么軟中斷也是在這個CPU上處理的。所以說,如果你發現你的Linux軟中斷CPU消耗都集中在一個核上的話,做法是要把調整硬中斷的CPU親和性,來將硬中斷打散到不通的CPU核上去。

我們再來把精力集中到這個核心函數net_rx_action上來。

static void net_rx_action(struct softirq_action *h) {struct softnet_data *sd = &__get_cpu_var(softnet_data);unsigned long time_limit = jiffies + 2;int budget = netdev_budget;void *have;local_irq_disable();while (!list_empty(&sd->poll_list)) {......n = list_first_entry(&sd->poll_list, struct napi_struct, poll_list);work = 0;if (test_bit(NAPI_STATE_SCHED, &n->state)) {work = n->poll(n, weight);trace_napi_poll(n);}budget -= work;} }

函數開頭的time_limit和budget是用來控制net_rx_action函數主動退出的,目的是保證網絡包的接收不霸占CPU不放。等下次網卡再有硬中斷過來的時候再處理剩下的接收數據包。其中budget可以通過內核參數調整。這個函數中剩下的核心邏輯是獲取到當前CPU變量softnet_data,對其poll_list進行遍歷, 然后執行到網卡驅動注冊到的poll函數。對于igb網卡來說,就是igb驅動力的igb_poll函數了。

/*** igb_poll - NAPI Rx polling callback* @napi: napi polling structure* @budget: count of how many packets we should handle**/ static int igb_poll(struct napi_struct *napi, int budget) {... if (q_vector->tx.ring)clean_complete = igb_clean_tx_irq(q_vector); if (q_vector->rx.ring)clean_complete &= igb_clean_rx_irq(q_vector, budget);... }

在讀取操作中,igb_poll的重點工作是對igb_clean_rx_irq的調用。

static bool igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget) {... do { /* retrieve a buffer from the ring */skb = igb_fetch_rx_buffer(rx_ring, rx_desc, skb); /* fetch next buffer in frame if non-eop */ if (igb_is_non_eop(rx_ring, rx_desc)) continue;} /* verify the packet layout is correct */ if (igb_cleanup_headers(rx_ring, rx_desc, skb)) {skb = NULL; continue;} /* populate checksum, timestamp, VLAN, and protocol */igb_process_skb_fields(rx_ring, rx_desc, skb);napi_gro_receive(&q_vector->napi, skb); }

igb_fetch_rx_buffer和igb_is_non_eop的作用就是把數據幀從RingBuffer上取下來。為什么需要兩個函數呢?因為有可能幀要占多多個RingBuffer,所以是在一個循環中獲取的,直到幀尾部。獲取下來的一個數據幀用一個sk_buff來表示。收取完數據以后,對其進行一些校驗,然后開始設置sbk變量的timestamp, VLAN id, protocol等字段。接下來進入到napi_gro_receive中:

//file: net/core/dev.c gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) {skb_gro_reset_offset(skb); return napi_skb_finish(dev_gro_receive(napi, skb), skb); }

dev_gro_receive這個函數代表的是網卡GRO特性,可以簡單理解成把相關的小包合并成一個大包就行,目的是減少傳送給網絡棧的包數,這有助于減少 CPU 的使用量。我們暫且忽略,直接看napi_skb_finish, 這個函數主要就是調用了netif_receive_skb。

//file: net/core/dev.c static gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb) { switch (ret) { case GRO_NORMAL: if (netif_receive_skb(skb))ret = GRO_DROP; break;...... }

在netif_receive_skb中,數據包將被送到協議棧中,接下來在網絡層協議層的處理流程便不再贅述。

總結

send發包過程

1、網卡驅動創建tx descriptor ring(一致性DMA內存),將tx descriptor ring的總線地址寫入網卡寄存器TDBA

2、協議棧通過dev_queue_xmit()將sk_buff下送網卡驅動

3、網卡驅動將sk_buff放入tx descriptor ring,更新TDT

4、DMA感知到TDT的改變后,找到tx descriptor ring中下一個將要使用的descriptor

5、DMA通過PCI總線將descriptor的數據緩存區復制到Tx FIFO

6、復制完后,通過MAC芯片將數據包發送出去

7、發送完后,網卡更新TDH,啟動硬中斷通知CPU釋放數據緩存區中的數據包

recv收包過程

1、網卡驅動創建rx descriptor ring(一致性DMA內存),將rx descriptor ring的總線地址寫入網卡寄存器RDBA

2、網卡驅動為每個descriptor分配sk_buff和數據緩存區,流式DMA映射數據緩存區,將數據緩存區的總線地址保存到descriptor

3、網卡接收數據包,將數據包寫入Rx FIFO

4、DMA找到rx descriptor ring中下一個將要使用的descriptor

5、整個數據包寫入Rx FIFO后,DMA通過PCI總線將Rx FIFO中的數據包復制到descriptor的數據緩存區

6、復制完后,網卡啟動硬中斷通知CPU數據緩存區中已經有新的數據包了,CPU執行硬中斷函數:

NAPI(以e1000網卡為例):e1000_intr() -> __napi_schedule() -> __raise_softirq_irqoff(NET_RX_SOFTIRQ)

非NAPI(以dm9000網卡為例):dm9000_interrupt() -> dm9000_rx() -> netif_rx() -> napi_schedule() -> __napi_schedule() -> __raise_softirq_irqoff(NET_RX_SOFTIRQ)

7、ksoftirqd執行軟中斷函數net_rx_action():

NAPI(以e1000網卡為例):net_rx_action() -> e1000_clean() -> e1000_clean_rx_irq() -> e1000_receive_skb() -> netif_receive_skb()

非NAPI(以dm9000網卡為例):net_rx_action() -> process_backlog() -> netif_receive_skb()

8、網卡驅動通過netif_receive_skb()將sk_buff上送協議棧

?

?

Linux網絡子系統的分層

Linux網絡子系統實現需要:

  • 支持不同的協議族 ( INET, INET6, UNIX, NETLINK...)

  • 支持不同的網絡設備

  • 支持統一的BSD socket API

  • 需要屏蔽協議、硬件、平臺(API)的差異,因而采用分層結構

系統調用

系統調用提供用戶的應用程序訪問內核的唯一途徑。協議無關接口由socket layer來實現的,其提供一組通用功能,以支持各種不同的協議。網絡協議層為socket層提供具體協議接口——proto{},實現具體的協議細節。設備無關接口,提供一組通用函數供底層網絡設備驅動程序使用。設備驅動與特定網卡設備相關,定義了具體的協議細節,會分配一個net_device結構,然后用其必需的例程進行初始化。

?

來源:https://www.cnblogs.com/ypholic/p/14337328.html

- END -


看完一鍵三連在看轉發,點贊

是對文章最大的贊賞,極客重生感謝你

推薦閱讀

圖解Linux 內核TCP/IP 協議棧實現|Linux網絡硬核系列

網絡排障全景指南手冊v1.0精簡版pdf

一個奇葩的網絡問題

總結

以上是生活随笔為你收集整理的Linux网络子系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产美女免费 | 日韩欧美视频 | 视色网站 | 欧美资源在线观看 | a视频免费在线观看 | av中文电影 | 天天色综合三 | 中文字幕二区在线观看 | 精品亚洲欧美一区 | 国产精品你懂的在线观看 | 久久国产免费看 | 日韩美女黄色片 | 五月天国产 | 国产精品网在线观看 | 五月天综合激情网 | 中文在线a在线 | 久久精品香蕉视频 | 天天搞夜夜骑 | 久久不卡免费视频 | 伊人久久在线观看 | 日韩精品在线一区 | 日韩精品一区在线观看 | 久久久久女教师免费一区 | 一区二区三区免费播放 | 国产精品第52页 | 日韩精品一区二区免费 | 国产精品自产拍在线观看 | 91av在线视频免费观看 | 日韩在线播放av | 精品久久久久国产免费第一页 | 免费在线电影网址大全 | 91麻豆国产福利在线观看 | av色一区 | 人人干人人做 | www.人人草 | 色综合咪咪久久网 | 亚洲经典视频 | 久久精品久久99 | 久久久久国产一区二区三区 | 欧美日韩国产二区三区 | 精品国产福利在线 | 日日干日日色 | 久久艹在线观看 | 成人黄色片免费看 | 国产精品va视频 | 久久久久成人精品亚洲国产 | 久久99久久99精品 | 色婷婷综合久色 | 波多野结衣电影一区二区三区 | 天天色天天 | 四虎国产精品永久在线国在线 | 五月婷在线 | 精品一区二区在线观看 | 国内久久久 | 中文字幕在线精品 | 天天色天天射综合网 | 久久成人在线 | 成人av播放| 亚洲国产综合在线 | 99爱精品在线 | 福利视频 | 97香蕉超级碰碰久久免费软件 | 人人狠狠综合久久亚洲 | 涩涩爱夜夜爱 | 97在线观看免费高清完整版在线观看 | 精品国产一区二区在线 | 最近中文字幕国语免费av | 一本一道波多野毛片中文在线 | 成年性视频| 中文字幕色综合网 | 天天天天天天干 | 成片免费观看视频 | 亚洲色图22p | 久久精品导航 | 91av在线国产 | 992tv在线观看网站 | 91中文字幕网 | 2021av在线| 久久久久在线观看 | 操操爽 | 国产免费区 | wwxxxx日本 | 欧美少妇xx | 人人爽人人爽人人片av | 亚洲精品国产视频 | 欧美大码xxxx | 国产精品午夜在线观看 | 久久免费毛片 | 亚洲精品在线观看网站 | 国产精彩视频一区二区 | 99精品视频在线观看免费 | 日韩欧美在线观看一区二区三区 | 亚洲欧美日韩国产 | 91成人亚洲| 久久久久久久久久久久久久av | 国产精品刺激对白麻豆99 | 久久久亚洲国产精品麻豆综合天堂 | 色在线观看网站 | 青青草国产精品 | 国产黄色精品在线观看 | 成人四虎影院 | 午夜影视一区 | 99精品在线视频观看 | 国产96av | 最近高清中文字幕在线国语5 | 手机在线看片日韩 | 日韩精品在线免费播放 | www日韩| 夜夜爽88888免费视频4848 | 婷婷丁香七月 | 色婷婷亚洲精品 | 亚洲欧美国产精品va在线观看 | 最新av免费 | 天天干夜夜擦 | 亚洲欧美国产精品18p | 久久99精品国产麻豆婷婷 | 中文字幕在线观看免费高清完整版 | 国产视频69 | 欧美二区三区91 | 日韩在线视频免费播放 | 久久少妇av | 成人免费中文字幕 | 在线视频你懂得 | 久久免费99精品久久久久久 | 日韩最新在线 | 九九色在线观看 | 精品久久久久久久 | 97天天综合网 | 最近中文字幕免费 | 成人蜜桃网 | 久久综合中文字幕 | 在线免费高清 | 国产午夜三级一区二区三 | 欧美淫aaa免费观看 日韩激情免费视频 | 日韩三级成人 | 最近免费中文字幕mv在线视频3 | 91试看 | 亚洲免费av片 | 97视频在线观看免费 | 国产福利精品一区二区 | 在线亚洲小视频 | 中文理论片 | 国产精品嫩草影视久久久 | 久久精品国产精品亚洲精品 | 国产四虎在线 | 日韩毛片久久久 | 国产精品美女久久久 | 蜜臀久久99静品久久久久久 | 婷婷国产在线 | 草久久精品 | 久久久精品久久日韩一区综合 | 亚洲精品久久久蜜臀下载官网 | 97精品久久 | 成片免费观看视频999 | 97视频精品 | 亚洲精品在线资源 | 免费视频久久久久久久 | 美女久久久久久久久久 | 中文字幕在线看 | 亚洲一区二区麻豆 | 91女子私密保健养生少妇 | 99视频导航 | 三级av在线播放 | 又紧又大又爽精品一区二区 | 久久免费毛片视频 | 99精品视频在线观看 | 四虎影院在线观看av | 在线91网| 91日韩在线专区 | 狠狠狠干狠狠 | 欧美激情va永久在线播放 | 成人福利av | 欧美中文字幕久久 | 日韩在线电影一区 | 国产成人精品久 | 免费视频xnxx com | 久久免费精彩视频 | 日日草天天草 | ,午夜性刺激免费看视频 | 日韩精品一区二区在线观看 | 国产精品一区二区在线看 | 一级黄色在线免费观看 | 丁香六月婷婷开心婷婷网 | 国产一区二区久久久久 | 成人国产在线 | 91黄色在线观看 | 青草视频在线看 | 国产精品久久久久一区二区国产 | 91夫妻视频 | 狠狠狠狠狠狠狠狠 | 91精品国产综合久久福利不卡 | 二区精品视频 | 国产视频在线免费观看 | 免费a视频 | 五月天激情视频在线观看 | 亚洲精品黄色片 | 亚洲国产午夜精品 | 99久久久久国产精品免费 | 欧美日韩视频在线观看一区二区 | 国产美女在线免费观看 | 国产馆在线播放 | 一区二区三区电影在线播 | 欧美国产不卡 | 婷婷射五月 | 免费国产在线精品 | 香蕉在线播放 | 去干成人网 | 色99导航| 美女视频黄的免费的 | 日韩videos | 中文字幕在线播出 | 亚州天堂| 中文字幕第一 | 日本不卡一区二区三区在线观看 | 欧美久久久 | 亚洲视频在线观看网站 | 91福利小视频| 亚洲国产精选 | 激情网五月| 国产99免费| 99在线精品视频 | 在线观看成人一级片 | 亚洲人久久 | 久久久网页 | 在线电影日韩 | 天天天色综合 | 91专区在线观看 | 成年人视频在线免费播放 | 麻豆视频网址 | 欧美性超爽 | 日韩免费三区 | 日韩视频免费在线观看 | 激情av五月婷婷 | 日日久视频 | 五月婷婷,六月丁香 | 欧美激情综合网 | 狠狠狠狠干 | 婷婷色5月 | a v在线观看 | 久久国产精品一区二区三区四区 | 亚洲激精日韩激精欧美精品 | 99日精品 | 色综合久久久久综合体 | 国产一区二区视频在线 | 麻豆91精品视频 | 888av| 久久一区二区三区超碰国产精品 | 久久理论影院 | 国产小视频在线 | 国产成人a亚洲精品 | 久久专区 | 国产剧情在线一区 | 国产亚洲久一区二区 | 欧美精品xxx| 国产精品久久久久久久久久尿 | 久久99久久99精品中文字幕 | 国产午夜av | 日本黄色免费电影网站 | www久久精品| 一区二区中文字幕在线播放 | 69国产盗摄一区二区三区五区 | 色综合www | 午夜视频色 | 又黄又刺激 | 久久综合中文字幕 | 18国产精品福利片久久婷 | 欧美a视频在线观看 | 亚洲国产福利视频 | 免费视频二区 | 69亚洲视频 | 欧美人交a欧美精品 | 亚洲电影影音先锋 | 国产成人精品一区二区三区免费 | 国产在线观看h | 91在线精品秘密一区二区 | 成人免费一区二区三区在线观看 | 久久日本视频 | 91人人人 | 国产美女被啪进深处喷白浆视频 | 亚洲一区二区三区在线看 | 亚洲精品麻豆 | 日韩午夜在线 | 中文字幕免费高清在线观看 | 日本视频不卡 | 欧美激情在线网站 | 我要看黄色一级片 | 亚洲狠狠操 | 久久久久99精品国产片 | 亚洲丁香久久久 | 99国产精品一区二区 | 欧美激情h| 欧美在线a视频 | 久久五月婷婷丁香社区 | 久久久精华网 | 精品99视频| 一区二区伦理 | 91精品在线视频 | 精品免费观看视频 | 九九九九热精品免费视频点播观看 | 久久在线免费视频 | 国产视频亚洲 | 97天堂网 | 精品在线播放视频 | 欧美性一级观看 | 99精品黄色片免费大全 | 国产a视频免费观看 | 69国产精品视频免费观看 | 成人a视频片观看免费 | 在线观看蜜桃视频 | 97碰在线 | 色网av| 一级α片免费看 | 在线观看91网站 | 成人黄色av网站 | 99精品乱码国产在线观看 | 狠狠色噜噜狠狠 | 97热久久免费频精品99 | 日韩精品中文字幕在线观看 | 精品久久久久久久久久国产 | 午夜久久影视 | 国产精品久久久久av福利动漫 | 久久久久久久久久久久久久av | www激情网 | 久久一本综合 | 午夜影院一级片 | 成人免费一区二区三区在线观看 | 国产91精品在线观看 | 97视频播放 | 在线只有精品 | 亚洲精品自拍视频在线观看 | 91看片淫黄大片在线播放 | 视频精品一区二区三区 | 91夫妻视频 | 精品免费 | 婷婷在线网 | 91精品国产成人观看 | 超碰97中文 | 久久er99热精品一区二区三区 | 亚洲一级电影视频 | www.久久精品视频 | 日韩精品一区二区三区在线播放 | 亚洲国产中文字幕 | 欧美性成人 | 久久经典国产 | 欧美国产大片 | 日韩精品视频在线免费观看 | 在线观看亚洲成人 | 中文字幕观看视频 | 国产小视频免费在线网址 | 日韩xxxxxxxxx | 在线免费国产 | 欧美激情精品久久久 | 久久久黄视频 | 91禁看片 | 狠狠狠色丁香婷婷综合久久五月 | 亚洲精品国精品久久99热 | 亚洲午夜久久久久久久久久久 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 欧美一区免费观看 | 免费av在线网 | 欧美粗又大 | 亚洲国产视频在线 | 天天搞天天干天天色 | 欧美激情综合五月色丁香 | 国产 成人 久久 | 视频在线观看一区 | 国产麻豆视频在线观看 | 久久国内免费视频 | 在线观看蜜桃视频 | 国产美女精品视频免费观看 | 久99视频 | 色中色亚洲 | 91人人插 | 91探花视频 | av日韩在线网站 | av在线播放不卡 | 天天摸天天弄 | 亚洲精品字幕 | 在线超碰av | 国产91小视频 | 成人免费观看网址 | 国产精品欧美久久久久无广告 | 天天综合狠狠精品 | 免费观看久久 | 欧美精品做受xxx性少妇 | 91免费日韩| 亚洲资源| 一区二区成人国产精品 | 91精品天码美女少妇 | 成人app在线播放 | 又粗又长又大又爽又黄少妇毛片 | 免费看色视频 | 欧美久久成人 | 亚洲电影在线看 | 伊人久久影视 | 日韩精品一区二区三区视频播放 | 日本视频精品 | 国产经典三级 | 97超碰超碰久久福利超碰 | 国产精品一区二区三区四 | 999久久久久 | 婷婷爱五月天 | 高潮久久久久久 | 99视频精品在线 | 久久你懂得 | 四虎影视4hu4虎成人 | 亚洲无线视频 | 在线视频婷婷 | 99r国产精品 | 亚洲综合网 | 免费视频成人 | 久草在线手机视频 | 久久久久激情视频 | 最近2019中文免费高清视频观看www99 | 久久99日韩 | 久久免费久久 | 正在播放国产一区二区 | 久久9999久久免费精品国产 | 国产中文字幕网 | 五月花丁香婷婷 | 日韩av看片 | 成人精品一区二区三区中文字幕 | 99999精品视频| 日韩性xxxx| 中文字幕在线影院 | 亚洲国产视频直播 | 午夜色场| 日韩在线视频网址 | 最近中文字幕视频网 | 中文字幕在线观看一区二区三区 | 深夜免费小视频 | 开心激情五月网 | 日韩欧美精品一区二区 | a级一a一级在线观看 | 亚洲一区美女视频在线观看免费 | 欧美黄色软件 | 最新av电影网址 | 在线看免费 | 免费黄在线看 | 粉嫩av一区二区三区四区五区 | 综合网天天 | 三级av网| 成人在线视 | 成年人看片网站 | 波多野结衣电影久久 | 亚洲精品视频观看 | 精品一区二区6 | 国产免费作爱视频 | 久久成人免费电影 | 国产日韩视频在线 | 欧美日韩三级在线观看 | 久久久精品视频成人 | 国产一区二区在线视频观看 | 欧美吞精 | 91av视频 | 中文乱幕日产无线码1区 | 国内精品久久久精品电影院 | 久久视频在线 | 成人aⅴ视频 | 男女拍拍免费视频 | 亚洲欧美日韩精品久久奇米一区 | 久久国产露脸精品国产 | 97超碰在线久草超碰在线观看 | 蜜臀av.com| 91免费国产在线观看 | 五月天综合网站 | 顶级bbw搡bbbb搡bbbb | 在线观看国产区 | 欧美日韩在线电影 | a精品视频 | 69国产精品视频 | 91视频在线观看大全 | 2019中文字幕第一页 | 国产精品久久久亚洲 | 国产综合小视频 | 国产精品第72页 | 最新黄色av网址 | 天堂av在线网址 | 亚洲国产97在线精品一区 | 久久精品国产精品亚洲精品 | 亚洲a色 | 999超碰| 成人免费看视频 | 玖玖色在线观看 | 中文字幕91在线 | 久久久久欠精品国产毛片国产毛生 | 国产精品成人久久久久久久 | 99精品视频免费全部在线 | 狠狠狠狠狠狠 | 亚洲成人av在线电影 | 中文在线a天堂 | 免费激情网 | 在线视频app| 毛片网站在线观看 | 亚洲精品在线视频 | 在线观看香蕉视频 | 91高清免费在线观看 | 97av色 | 国产精品专区h在线观看 | 国产精品久久久久久久久婷婷 | 久草久热 | 亚洲国产精品第一区二区 | 91在线精品秘密一区二区 | 日韩成人精品 | 亚洲一区网 | 精品亚洲视频在线 | 久久久香蕉视频 | 婷婷九月激情 | 欧美日在线观看 | 国产高清区 | 2019精品手机国产品在线 | 久草精品视频在线观看 | 天天爽天天射 | 日韩三级.com | 8x成人在线 | 特级aaa毛片 | 免费看片黄色 | 国产录像在线观看 | 日韩av免费一区二区 | 黄色软件在线观看免费 | 国产区久久 | 最新av网址在线观看 | 麻豆91网站 | 亚洲激情视频 | 日韩成人免费在线电影 | 色插综合| 免费在线看v | 蜜臀av一区| 天天干天天想 | 久久精品免费电影 | 午夜色大片在线观看 | 色成人亚洲网 | 久久成熟| 开心激情网五月天 | 色婷婷激情电影 | 午夜精品电影 | 2023年中文无字幕文字 | 亚洲一区欧美精品 | av爱干 | 成人一区影院 | 日韩欧美高清一区二区 | 在线中文字幕一区二区 | 欧美日韩精品影院 | 天天插视频 | 国产色网| 精品久久九九 | 亚洲欧美日韩国产精品一区午夜 | 91 在线视频播放 | 亚洲精选视频在线 | 99国产免费网址 | 另类五月激情 | 99精品色| av电影在线观看完整版一区二区 | 91在线视频免费观看 | 中文字幕永久免费 | 青青五月天 | 人人爽人人爽人人爽 | 免费观看性生活大片3 | 黄毛片在线观看 | 日韩视频一 | 亚洲视频中文 | 国产精品久久久99 | 久久视频网址 | 丁香资源影视免费观看 | а天堂中文最新一区二区三区 | 一级黄色在线视频 | 久久精品国产精品亚洲精品 | 久久乐九色婷婷综合色狠狠182 | 四虎在线视频免费观看 | h文在线观看免费 | 99精品国产高清在线观看 | 99电影456麻豆| 久久国产经典视频 | 亚洲精品一区二区三区新线路 | 伊人伊成久久人综合网站 | 色综合久久中文字幕综合网 | 久久免费视频一区 | 天天插天天操天天干 | 久久综合九色综合欧美就去吻 | 国产一区欧美日韩 | 永久免费在线 | 欧美一区二区三区在线看 | 日韩特黄av | 成人在线免费看视频 | 国产一级精品视频 | 久久伊人操 | 国产明星视频三级a三级点| 婷婷中文字幕综合 | 在线视频18在线视频4k | 97在线看片 | 国产露脸91国语对白 | 手机av电影在线观看 | 国产免费一区二区三区网站免费 | 91中文视频| 97超碰人| 久久99久久99精品免费看小说 | 狠狠色香婷婷久久亚洲精品 | www.888av| 伊人久久在线观看 | 国外av在线 | 国产小视频在线播放 | 久久九九九九 | 国产精品国产亚洲精品看不卡15 | 人人爱人人舔 | 色播激情五月 | 精品久久久久久亚洲综合网 | 久久伦理 | 91在线看黄| 去看片 | 国产精品网红直播 | 91最新视频 | 久草网首页 | 一区中文字幕电影 | 六月色丁| 麻豆免费在线播放 | 午夜视频免费 | 免费在线观看中文字幕 | 草久在线观看 | 六月婷婷色 | 久久婷亚洲五月一区天天躁 | 国产亚洲精品精品精品 | 日韩四虎 | 国产精品一区二区果冻传媒 | 国产精品久久久久久久av电影 | 久久成人国产精品一区二区 | 久久99精品久久久久久秒播蜜臀 | 91精品网站 | 在线一二三区 | 黄色小网站在线 | 国产一级一级国产 | 中午字幕在线观看 | 久久天天躁狠狠躁夜夜不卡公司 | 婷婷去俺也去六月色 | 99视频99 | 日韩欧美一区视频 | 欧美日韩久久久 | 亚洲午夜久久久久久久久 | 永久黄网站色视频免费观看w | 久久精品91久久久久久再现 | 正在播放国产一区 | 69国产在线观看 | 亚洲欧美乱综合图片区小说区 | 黄色av成人在线观看 | 欧美精品在线观看免费 | 久久精品国产免费看久久精品 | av一本久道久久波多野结衣 | 91亚洲国产 | 91chinese在线 | 亚洲第一成网站 | 国产精品久久一区二区三区不卡 | 最近字幕在线观看第一季 | 久久精品亚洲精品国产欧美 | 波多野结衣综合网 | 日本中文乱码卡一卡二新区 | 久草在线视频国产 | 夜夜澡人模人人添人人看 | 婷婷激情五月综合 | 天堂av免费 | 九九久久影视 | 国产麻豆精品久久一二三 | 麻豆传媒一区二区 | wwwwww国产| 成人91在线 | 中文字幕在线观看免费高清电影 | 欧美日韩aa | 在线观看完整版免费 | 97超碰人人澡人人 | 黄色avwww| 天天色欧美 | 国产精品福利午夜在线观看 | www.黄色| 狠狠操导航 | 国产一区二区精 | 伊人五月天综合 | 欧美一级黄大片 | 狠狠做深爱婷婷综合一区 | 久久久国产精品电影 | 在线免费91 | 日韩免费观看av | 国产原创av在线 | 日韩欧美高清视频在线观看 | 国外成人在线视频网站 | 18女毛片 | 91亚洲精品国偷拍自产在线观看 | 久久成人午夜 | 97视频资源 | 免费三级a | 天天操网 | 亚洲va欧美va人人爽春色影视 | 五月天久久久 | 久久精品最新 | 国产精品欧美在线 | 99久久精品国产观看 | 国产一级电影免费观看 | 97碰碰精品嫩模在线播放 | 亚洲码国产日韩欧美高潮在线播放 | 91亚洲国产成人久久精品网站 | av中文字幕网站 | av资源在线看 | 丁香婷五月 | 亚洲国产网址 | 三级在线视频观看 | 成人影视免费看 | 成人免费视频网站 | 国内成人精品2018免费看 | 久草在线在线 | 色综合久久88色综合天天 | 国产操在线 | 91黄色在线观看 | av福利在线 | 欧美91成人网 | 欧美一级免费高清 | 亚洲另类交 | 免费观看91视频大全 | 色视频网站免费观看 | 久久国产一二区 | 日韩精品一区二区在线视频 | 国产亚洲激情视频在线 | 久久久国产影视 | 99精品区 | 天天综合操 | 97在线超碰 | 免费看黄视频 | 日韩欧美一区二区三区视频 | 国产色爽 | 久久精品香蕉 | 五月婷婷丁香网 | 久久草网| 色九九视频 | 黄色网址在线播放 | 久久综合九色综合97_ 久久久 | 人人干人人模 | 韩国av一区二区三区在线观看 | 久久99精品一区二区三区三区 | 超碰官网 | 99久免费精品视频在线观看 | 2019中文最近的2019中文在线 | 国产精品一二三 | 成人app在线播放 | 激情欧美xxxx | 黄色在线观看免费 | 色久天| 成人免费一区二区三区在线观看 | 日韩一区二区三区免费视频 | 成人免费视频播放 | 国精产品999国精产品视频 | www日日| 天天综合操 | 91人人爱| 中文资源在线官网 | 国产精品一区在线播放 | 激情校园亚洲 | 日本久久综合网 | 国产99久久久国产精品免费二区 | 亚洲精品乱码久久久久久久久久 | av中文字幕在线看 | 久久久久综合视频 | 黄色软件视频大全免费下载 | 超碰97久久 | 国产中文字幕亚洲 | 日韩成人精品一区二区 | 美女免费视频观看网站 | sesese图片| 中日韩欧美精彩视频 | 九九精品久久久 | 麻豆va一区二区三区久久浪 | 亚洲国产成人高清精品 | 亚洲蜜桃av | 久久伊人国产精品 | 99久久精品国产免费看不卡 | 国产精品免费视频观看 | 免费91麻豆精品国产自产在线观看 | 久久不卡av| 久久神马影院 | 毛片激情永久免费 | 国产精品久久久久久久久免费 | 手机成人在线电影 | 91av电影在线观看 | 五月婷婷丁香色 | 亚洲aⅴ乱码精品成人区 | 2021国产视频 | 日韩视频一区二区 | 免费的黄色的网站 | 天天干天天干天天干天天干天天干天天干 | 在线国产视频 | 国产成人久久精品一区二区三区 | 久视频在线 | 婷婷视频在线 | 天天干人人 | 9在线观看免费高清完整 | 久久国产高清视频 | 成年人视频免费在线播放 | 日日爽日日操 | 黄色大全免费观看 | 国产精品va在线观看入 | 最新真实国产在线视频 | 久久草av | 午夜精品一区二区三区可下载 | 亚洲黄在线观看 | 在线观看亚洲国产精品 | 久久综合毛片 | 欧美日韩精品在线 | 91精品国产92久久久久 | 欧美午夜久久久 | 深夜福利视频一区二区 | 午夜视频在线瓜伦 | 日韩av综合网站 | 激情视频在线观看网址 | 91精品久久久久久久久 | 在线导航av | 精品久久久久一区二区国产 | 成人网页在线免费观看 | 国产精品亚州 | 中文字幕av免费在线观看 | 国产在线欧美在线 | 亚洲精品乱码久久 | 中文国产成人精品久久一 | 国产精品自产拍在线观看中文 | 一区av在线播放 | 久二影院 | 五月婷婷中文 | 97精品超碰一区二区三区 | 午夜av剧场 | 日日躁天天躁 | 亚洲精品高清一区二区三区四区 | 国产成人久久av | 激情综合网五月激情 | 夜夜躁日日躁狠狠久久88av | av电影在线免费观看 | 成人av在线影视 | 国产成人精品久久亚洲高清不卡 | 天天操天天干天天操天天干 | 最近日本中文字幕a | 999成人网 | 亚洲乱码精品久久久 | 国产69久久久 | 日韩在线中文字幕 | 伊人久久影视 | 日韩电影在线一区二区 | 国产免费一区二区三区网站免费 | 就要干b| 久久久久久久久久久久久9999 | 四虎成人精品在永久免费 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 高清国产在线一区 | 国内成人综合 | 五月婷婷开心中文字幕 | 国产精品免费麻豆入口 | 国产成人福利在线 | 日日夜夜操操操操 | 精品亚洲午夜久久久久91 | 久章操 | 免费观看一级特黄欧美大片 | 在线观看精品 | 欧美激情综合色综合啪啪五月 | 日韩免费一二三区 | 色99导航 | 人人精久 | 久久免费精彩视频 | 青青草视频精品 | 久久69av| 日韩精品久久一区二区三区 | 成人av免费在线观看 | 免费成人黄色av | 亚洲精品网页 | 亚洲视频www | 不卡视频在线 | 啪啪免费试看 | 欧美另类sm图片 | 激情视频国产 | 国产视频高清 | 精品久久久精品 | 狠狠操影视 | 成人av一二三区 | 91在线免费视频 | 免费在线观看一级片 | 九草在线观看 | 91亚洲网站 | 久草在| 99性视频 | 国产视频日韩视频欧美视频 | 中文字幕在线视频国产 | 国产黄大片 | 天堂av在线中文在线 | 中文字幕第一页在线播放 | 国产精品女人久久久久久 | 亚洲成年人在线播放 | 国产高清 不卡 | 国产福利a | 欧美高清成人 | 777奇米四色 | 国产色女 | 国产精品一区二区久久精品爱涩 | 天天操天天射天天操 | 中文视频在线播放 | 国产精品第二页 | 狠狠狠狠狠狠 | 亚洲精品网站 | 国内精品久久久久久中文字幕 | 在线观看中文字幕av | 视频高清| 免费观看十分钟 | 91亚州| 一级a毛片高清视频 | 精品视频网站 | 欧美色操 | 美女在线国产 | 日韩在线网址 | 国产日韩欧美自拍 | 六月激情婷婷 | 99亚洲天堂 | 亚洲专区欧美 | 亚洲极色 | 欧美一级视频在线观看 | 国内视频 | 一区二区视| 国产96在线视频 | www国产精品com | 日韩久久精品一区二区 | 日韩在线观看中文字幕 | 日本激情视频中文字幕 | 亚洲黄色在线免费观看 | 久久成年人 | 欧美在线一二 | 亚洲精品在线免费 | 色综合天天综合 | 免费看片成年人 | 国产一级电影网 | 在线观看不卡视频 | 在线观看小视频 | 欧美色一色 | 精品一区二区在线免费观看 | 麻豆果冻剧传媒在线播放 | 热久久国产 | 国产在线观看二区 | 天天干天天操天天搞 | 国产精品自在线 | 色婷婷88av视频一二三区 | 国产99久久久国产精品成人免费 | 午夜精品久久久久久久99无限制 | 中文字幕 婷婷 | 久久电影色 | 成人黄色片在线播放 | av免费试看 | 国产成人精品午夜在线播放 | 日韩一区二区三区免费视频 | 性色av一区二区三区在线观看 | 成人午夜精品福利免费 | 久久神马影院 | 精品产品国产在线不卡 | 国产一区二区三区 在线 | 精品美女在线视频 | 免费av福利 | 伊色综合久久之综合久久 | 久久乐九色婷婷综合色狠狠182 | 成人四虎 | 91看片淫黄大片一级在线观看 | 五月综合激情婷婷 | 三级av网站 | 国产精品久久久久久久久久久久午夜 | 日韩欧美在线综合网 | 天天干天天操av | 久草视频在线免费看 | 中文国产成人精品久久一 | 911精品视频 | 国产成人精品久久亚洲高清不卡 | 91系列在线观看 | 国产美女网 | 久久最新| 日日夜夜天天久久 | 亚洲精品国产精品国自产在线 | av在线h | 国产一二三区在线观看 | 中文字幕一区二区三区久久 | 最新高清无码专区 | 99久久er热在这里只有精品66 | 亚洲永久精品在线观看 | wwwav视频| 免费在线观看一级片 | 国产亚洲欧美精品久久久久久 | 天天操操 | 午夜美女福利直播 | 中文字幕乱码在线播放 | 国产精彩在线视频 | 特级西西444www高清大视频 | 久久露脸国产精品 | 久久久久高清毛片一级 | av在线看片 | 这里只有精彩视频 | 亚洲草视频 | 亚洲jizzjizz日本少妇 | 欧美午夜一区二区福利视频 | 日韩欧美在线视频一区二区三区 | 日韩欧美精品一区二区 | 超碰在线公开 | 在线观看视频97 | 天天操天天干天天摸 | 日韩在线视频观看 |