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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

NetLink Communication Mechanism And Netlink Sourcecode Analysis

發(fā)布時(shí)間:2025/6/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NetLink Communication Mechanism And Netlink Sourcecode Analysis 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

catalog

1. Netlink簡(jiǎn)介 2. Netlink Function API Howto 3. Generic Netlink HOWTO kernel API 4. RFC 3549 Linux Netlink as an IP Services Protocol 5. sendmsg、recvmsg In User Space 6. kernel_recvmsg、kernel_sendmsg In Kernel Space 7. NetLink Sockets C++ Library 8. Netlink Protocol Library Suite (libnl)

?

1. Netlink簡(jiǎn)介

Netlink is a flexible, robust, wire-format communications channel typically used for kernel to user communication although it can also be used for user to user and kernel to kernel communications. Netlink communication channels are associated with families or "busses", where each bus deals with a specific service; for example

1. 路由daemon(NETLINK_ROUTE) 2. 1-wire子系統(tǒng)(NETLINK_W1) 3. 用戶態(tài)socket協(xié)議(NETLINK_USERSOCK) 4. 防火墻(NETLINK_FIREWALL) 5. socket監(jiān)視(NETLINK_INET_DIAG) 6. netfilter日志(NETLINK_NFLOG) 7. ipsec安全策略(NETLINK_XFRM) 8. SELinux事件通知(NETLINK_SELINUX) 9. iSCSI子系統(tǒng)(NETLINK_ISCSI) 10. 進(jìn)程審計(jì)(NETLINK_AUDIT) 11. 轉(zhuǎn)發(fā)信息表查詢(NETLINK_FIB_LOOKUP) 12. netlink connector(NETLINK_CONNECTOR) 13. netfilter子系統(tǒng)(NETLINK_NETFILTER) 14. IPv6防火墻(NETLINK_IP6_FW) 15. DECnet路由信息(NETLINK_DNRTMSG) 16. 內(nèi)核事件向用戶態(tài)通知(NETLINK_KOBJECT_UEVENT) 17. 通用netlink(NETLINK_GENERIC)

Netlink相對(duì)于系統(tǒng)調(diào)用,ioctl以及/proc文件系統(tǒng)而言具有以下優(yōu)點(diǎn)

1. 為了使用netlink,用戶僅需要在include/linux/netlink.h中增加一個(gè)新類型的netlink協(xié)議定義即可,如 #define NETLINK_MYTEST 17 然后,內(nèi)核和用戶態(tài)應(yīng)用就可以立即通過(guò) socket API 使用該 netlink 協(xié)議類型進(jìn)行數(shù)據(jù)交換。但系統(tǒng)調(diào)用需要增加新的系統(tǒng)調(diào)用,ioctl 則需要增加設(shè)備或文件, 那需要不少代碼,proc 文件系統(tǒng)則需要在 /proc 下添加新的文件或目錄,那將使本來(lái)就混亂的 /proc 更加混亂 2. netlink是一種異步通信機(jī)制,在內(nèi)核與用戶態(tài)應(yīng)用之間傳遞的消息保存在socket緩存隊(duì)列中,發(fā)送消息只是把消息保存在接收者的socket的接 收隊(duì)列,而不需要等待接收者收到消息,但系統(tǒng)調(diào)用與 ioctl 則是同步通信機(jī)制,如果傳遞的數(shù)據(jù)太長(zhǎng),將影響調(diào)度粒度 3.使用 netlink 的內(nèi)核部分可以采用模塊的方式實(shí)現(xiàn),使用 netlink 的應(yīng)用部分和內(nèi)核部分沒(méi)有編譯時(shí)依賴,但系統(tǒng)調(diào)用就有依賴,而且新的系統(tǒng)調(diào)用的實(shí)現(xiàn)必須靜態(tài)地連接到內(nèi)核中,它無(wú)法在模塊中實(shí)現(xiàn),使用新系統(tǒng)調(diào)用的應(yīng)用在編譯時(shí)需要依賴內(nèi)核 4.netlink 支持多播,內(nèi)核模塊或應(yīng)用可以把消息多播給一個(gè)netlink組,屬于該neilink 組的任何內(nèi)核模塊或應(yīng)用都能接收到該消息,內(nèi)核事件向用戶態(tài)的通知機(jī)制就使用了這一特性,任何對(duì)內(nèi)核事件感興趣的應(yīng)用都能收到該子系統(tǒng)發(fā)送的內(nèi)核事件 5.內(nèi)核可以使用 netlink 首先發(fā)起會(huì)話(雙向的),但系統(tǒng)調(diào)用和 ioctl 只能由用戶應(yīng)用發(fā)起調(diào)用 6.netlink 使用標(biāo)準(zhǔn)的 socket API,因此很容易使用,但系統(tǒng)調(diào)用和 ioctl則需要專門的培訓(xùn)才能使用

0x2: Netllink通信流程

從用戶態(tài)-內(nèi)核態(tài)交互的角度來(lái)看,Netlink的通信流程如下

1. 應(yīng)用程序?qū)⒋l(fā)送的數(shù)據(jù)通過(guò)sendmsg()傳給Netlink,Netlink進(jìn)行"組包",這實(shí)際上是一次內(nèi)存拷貝 2. Netlink在buffer滿之后,即組包完成,將消息一次性進(jìn)行"穿透拷貝",即copy_from_user、copy_to_user,這是一次代價(jià)較高的系統(tǒng)調(diào)用 3. 內(nèi)核模塊從Netlink的buffer逐個(gè)取出數(shù)據(jù)包,即拆包,這個(gè)過(guò)程可以串行的實(shí)現(xiàn),也可以異步地實(shí)現(xiàn)

Relevant Link:

http://www.linuxfoundation.org/collaborate/workgroups/networking/netlink

?

2. Netlink Function API Howto

0x1: User Space

用戶態(tài)應(yīng)用使用標(biāo)準(zhǔn)的socket APIs,socket()、bind()、sendmsg()、recvmsg()、close()就能很容易地使用netlink socket

socket(AF_NETLINK, SOCK_RAW, netlink_type) 1. 參數(shù)1: 1) AF_NETLINK2) PF_NETLINK //在 Linux 中,它們倆實(shí)際為一個(gè)東西,它表示要使用netlink2. 參數(shù)2:1) SOCK_RAW2) SOCK_DGRAM3. 參數(shù)3: 指定Netlink協(xié)議類型 #define NETLINK_ROUTE 0 /* Routing/device hook */ #define NETLINK_W1 1 /* 1-wire subsystem */ #define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ #define NETLINK_FIREWALL 3 /* Firewalling hook */ #define NETLINK_INET_DIAG 4 /* INET socket monitoring */ #define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */ #define NETLINK_XFRM 6 /* ipsec */ #define NETLINK_SELINUX 7 /* SELinux event notifications */ #define NETLINK_ISCSI 8 /* Open-iSCSI */ #define NETLINK_AUDIT 9 /* auditing */ #define NETLINK_FIB_LOOKUP 10 #define NETLINK_CONNECTOR 11 #define NETLINK_NETFILTER 12 /* netfilter subsystem */ #define NETLINK_IP6_FW 13 #define NETLINK_DNRTMSG 14 /* DECnet routing messages */ #define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */ #define NETLINK_GENERIC 16 //NETLINK_GENERIC是一個(gè)通用的協(xié)議類型,它是專門為用戶使用的,因此,用戶可以直接使用它,而不必再添加新的協(xié)議類型

對(duì)于每一個(gè)netlink協(xié)議類型,可以有多達(dá) 32多播組,每一個(gè)多播組用一個(gè)位表示,netlink 的多播特性使得發(fā)送消息給同一個(gè)組僅需要一次系統(tǒng)調(diào)用,因而對(duì)于需要多撥消息的應(yīng)用而言,大大地降低了系統(tǒng)調(diào)用的次數(shù)

bind(fd, (struct sockaddr*)&nladdr, sizeof(struct sockaddr_nl)); 函數(shù)bind()用于把一個(gè)打開(kāi)的netlink socket與netlink源socket地址綁定在一起。netlink socket的地址結(jié)構(gòu)如下struct sockaddr_nl {//字段 nl_family 必須設(shè)置為 AF_NETLINK 或著 PF_NETLINK sa_family_t nl_family;//字段 nl_pad 當(dāng)前沒(méi)有使用,因此要總是設(shè)置為 0unsigned short nl_pad;/*字段 nl_pid 為接收或發(fā)送消息的進(jìn)程的 ID1. nl_pid = 0: 消息接收者為內(nèi)核或多播組2. nl_pid != 0: nl_pid 實(shí)際上未必是進(jìn)程 ID,它只是用于區(qū)分不同的接收者或發(fā)送者的一個(gè)標(biāo)識(shí),用戶可以根據(jù)自己需要設(shè)置該字段 */__u32 nl_pid;/*nl_groups 用于指定多播組,bind 函數(shù)用于把調(diào)用進(jìn)程加入到該字段指定的多播組1. nl_groups = 0: 該消息為單播消息,調(diào)用者不加入任何多播組2. nl_groups != 0: 多播消息*/__u32 nl_groups; };

值得注意的是,傳遞給 bind 函數(shù)的地址的 nl_pid 字段應(yīng)當(dāng)設(shè)置為本進(jìn)程的進(jìn)程 ID,這相當(dāng)于 netlink socket 的本地地址。但是,對(duì)于一個(gè)進(jìn)程的多個(gè)線程使用 netlink socket 的情況,字段 nl_pid 則可以設(shè)置為其它的值,如

pthread_self() << 16 | getpid();

字段 nl_pid 實(shí)際上未必是進(jìn)程 ID,它只是用于區(qū)分不同的接收者或發(fā)送者的一個(gè)標(biāo)識(shí),用戶可以根據(jù)自己需要設(shè)置該字段

關(guān)于使用netlink api及其相關(guān)參數(shù),請(qǐng)參閱另一篇文章 http://www.cnblogs.com/LittleHann/p/3867214.html //搜索:user_client.c(用戶態(tài)程序)

從netlink發(fā)送消息相關(guān)的數(shù)據(jù)結(jié)構(gòu)中我們可以看出netlink發(fā)送消息的邏輯

1. 對(duì)于程序員來(lái)說(shuō),發(fā)送消息的系統(tǒng)調(diào)用接口只有sendmsg,每次調(diào)用sendmsg只需要傳入struct msghdr結(jié)構(gòu)體的實(shí)例即可 2. 對(duì)于每個(gè)struct msghdr結(jié)構(gòu)的實(shí)例來(lái)說(shuō),都必須指定struct iovec成員,即所有單個(gè)的消息都會(huì)被"掛入"一個(gè)"隊(duì)列"中,用于緩存集中發(fā)送 3. 每個(gè)代表"消息隊(duì)列"的struct iovec結(jié)構(gòu)體實(shí)例,都必須指定struct nlmsghdr成員,即消息頭,用于實(shí)現(xiàn)"多路復(fù)用""多路分解"

0x2: Kernel Space

內(nèi)核使用netlink需要專門的API,這完全不同于用戶態(tài)應(yīng)用對(duì)netlink的使用。如果用戶需要增加新的netlink協(xié) 議類型,必須通過(guò)修改linux/netlink.h來(lái)實(shí)現(xiàn),當(dāng)然,目前的netlink實(shí)現(xiàn)已經(jīng)包含了一個(gè)通用的協(xié)議類型 NETLINK_GENERIC以方便用戶使用,用戶可以直接使用它而不必增加新的協(xié)議類型

在內(nèi)核中,為了創(chuàng)建一個(gè)netlink socket用戶需要調(diào)用如下函數(shù) struct sock *netlink_kernel_create(int unit, void (*input)(struct sock *sk, int len));

當(dāng)內(nèi)核中發(fā)送netlink消息時(shí),也需要設(shè)置目標(biāo)地址與源地址,linux/netlink.h中定義了一個(gè)宏

struct netlink_skb_parms {/*Skb credentials struct scm_creds {//pid表示消息發(fā)送者進(jìn)程ID,也即源地址,對(duì)于內(nèi)核,它為 0u32 pid;kuid_t uid;kgid_t gid;};struct scm_creds creds; /*字段portid表示消息接收者進(jìn)程 ID,也即目標(biāo)地址,如果目標(biāo)為組或內(nèi)核,它設(shè)置為 0,否則 dst_group 表示目標(biāo)組地址,如果它目標(biāo)為某一進(jìn)程或內(nèi)核,dst_group 應(yīng)當(dāng)設(shè)置為 0 */__u32 portid;__u32 dst_group;__u32 flags;struct sock *sk; }; #define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb))

在內(nèi)核中,模塊調(diào)用函數(shù) netlink_unicast 來(lái)發(fā)送單播消息

int netlink_unicast(struct sock *sk, struct sk_buff *skb, u32 pid, int nonblock);

Relevant Link:

http://www.cnblogs.com/iceocean/articles/1594195.html http://blog.csdn.net/zcabcd123/article/details/8272423

?

3. Generic Netlink HOWTO kernel API

Relevant Link:

http://www.linuxfoundation.org/collaborate/workgroups/networking/generic_netlink_howto

?

4. RFC 3549 Linux Netlink as an IP Services Protocol

A Control Plane (CP) is an execution environment that may have several sub-components, which we refer to as CPCs.? Each CPC provides control for a different IP service being executed by a Forwarding Engine (FE) component.? This relationship means that there might be several CPCs on a physical CP, if it is controlling several IP services. ?
In essence, the cohesion between a CP component and an FE component is the service abstraction.

0x1: Control Plane Components (CPCs)

Control Plane Components encompass signalling protocols, with diversity ranging from dynamic routing protocols, such as OSPF to tag distribution protocols, such as CR-LDP. Classical management protocols and activities also fall under this category.
These include SNMP、COPS、and proprietary CLI/GUI configuration mechanisms.? The purpose of the control plane is to provide an execution environment for the above-mentioned activities with the ultimate goal being to configure and manage the second Network Element (NE) component: the FE.? The result of the configuration defines the way that packets traversing the FE are treated.

0x2: Forwarding Engine Components (FECs)

The FE is the entity of the NE that incoming packets (from the network into the NE) first encounter.
The FE's service-specific component massages the packet to provide it with a treatment to achieve an IP service, as defined by the Control Plane Components for that IP service.? Different services will utilize different FECs.? Service modules may be chained to achieve a more complex service ?
When built for providing a specific service, the FE service component will adhere to a forwarding model.

1. Linux IP Forwarding Engine Model

?

____ +---------------++->-| FW |---> | TCP, UDP, ... || +----+ +---------------+| |^ v| _|_+----<----+ | FW || +----+^ || YTo host From hoststack stack^ ||_____ | Ingress ^ Y device ____ +-------+ +|---|--+ ____ +--------+ Egress ->----->| FW |-->|Ingress|-->---->| Forw- |->| FW |->| Egress | device+----+ | TC | | ard | +----+ | TC |-->+-------+ +-------+ +--------+

The figure above shows the Linux FE model per device.? The only mandatory part of the datapath is the Forwarding module, which is RFC 1812 conformant.? The different Firewall (FW), Ingress Traffic Control, and Egress Traffic Control building blocks are not mandatory in the datapath and may even be used to bypass the RFC 1812 module.
These modules are shown as simple blocks in the datapath but, in fact, could be multiple cascaded, independent submodules within the indicated blocks.

2. IP Services

In the diagram below, we show a simple FE<->CP setup to provide an example of the classical IPv4 service with an extension to do some basic QoS egress scheduling and illustrate how the setup fits in this described model.

Control Plane (CP).------------------------------------| /^^^^^^\ /^^^^^^\ || | | | COPS |-\ || | ospfd | | PEP | \ || \ / \_____/ | |/------\_____/ | / || | | | / || |_________\__________|____|_________|| | | |******************************************Forwarding ************* Netlink layer ************Engine (FE) *****************************************.-------------|-----------|----------|---|-------------| IPv4 forwarding | | || FE Service / / || Component / / || ---------------/---------------/--------- || | | / | |packet | | --------|-- ----|----- | packetin | | | IPv4 | | Egress | | out-->--->|------>|---->|Forwarding|----->| QoS |--->| ---->|->| | | | | Scheduler| | || | ----------- ---------- | || | | || --------------------------------------- || |-------------------------------------------------------

0x3: Netlink Logical Model

In the diagram below we show a simple FEC<->CPC logical relationship. We use the IPv4 forwarding FEC (NETLINK_ROUTE, which is discussed further below) as an example.

Control Plane (CP).------------------------------------| /^^^^^\ /^^^^^\ || | | / CPC-2 \ || | CPC-1 | | COPS | || | ospfd | | PEP | || | / \____ _/ || \____/ | || | | |****************************************|************* BROADCAST WIRE ************FE---------- *****************************************.| IPv4 forwarding | | | || FEC | | | || --------------/ ----|-----------|-------- || | / | | | || | .-------. .-------. .------. | || | |Ingress| | IPv4 | |Egress| | || | |police | |Forward| | QoS | | || | |_______| |_______| |Sched | | || | ------ | || --------------------------------------- || |-----------------------------------------------------

Netlink logically models FECs and CPCs in the form of nodes interconnected to each other via a broadcast wire.
The wire is specific to a service.? The example above shows the broadcast wire belonging to the extended IPv4 forwarding service.
Nodes (CPCs or FECs as illustrated above) connect to the wire and register to receive specific messages.? CPCs may connect to multiple wires if it helps them to control the service better.? All nodes(CPCs and FECs) dump packets on the broadcast wire.? Packets can be discarded by the wire if they are malformed or not specifically formatted for the wire.? Dropped packets are not seen by any of the nodes.? The Netlink service may signal an error to the sender if it detects a malformatted Netlink packet.

0x4: Message Format

There are three levels to a Netlink message: The general Netlink message header, the IP service specific template, and the IP service specific data.
從網(wǎng)絡(luò)的角度來(lái)看,Netlink是一種傳輸層通信協(xié)議

0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| || Netlink message header || |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| || IP Service Template || |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| || IP Service specific data in TLVs || |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

The Netlink message is used to communicate between the FEC and CPC for parameterization of the FECs, asynchronous event notification of FEC events to the CPCs, and statistics querying/gathering (typically by a CPC).

0x5: Protocol Model

1. Service Addressing

Access is provided by first connecting to the service on the FE.? The connection is achieved by making a socket() system call to the PF_NETLINK domain.? Each FEC is identified by a protocol number.? One may open either SOCK_RAW or SOCK_DGRAM type sockets, although Netlink does not distinguish between the two.? The socket connection provides the basis for the FE<->CP addressing.
Connecting to a service is followed (at any point during the life of the connection) by either issuing a service-specific command (from the CPC to the FEC, mostly for configuration purposes), issuing a statistics-collection command, or subscribing/unsubscribing to service events.? Closing the socket terminates the transaction.

2. Netlink Message Header

Netlink messages consist of a byte stream with one or multiple Netlink headers and an associated payload.? If the payload is too big to fit into a single message it, can be split over multiple Netlink messages, collectively called a multipart message.? For multipart messages, the first and all following headers have the NLM_F_MULTI Netlink header flag set, except for the last header which has the Netlink header type NLMSG_DONE.

0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Length |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Type | Flags |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Sequence Number |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Process ID (PID) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

3. The ACK Netlink Message

This message is actually used to denote both an ACK and a NACK. Typically, the direction is from FEC to CPC (in response to an ACK request message).? However, the CPC should be able to send ACKs back to FEC when requested.? The semantics for this are IP service specific.

0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Netlink message header || type = NLMSG_ERROR |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Error code |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| OLD Netlink message header |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Relevant Link:

https://tools.ietf.org/html/rfc3549

?

5. sendmsg、recvmsg In User Space

0x1: sendmsg

/source/net/socket.c

/** BSD sendmsg interface*/ SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags) {struct compat_msghdr __user *msg_compat = (struct compat_msghdr __user *)msg;struct socket *sock;struct sockaddr_storage address;struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;unsigned char ctl[sizeof(struct cmsghdr) + 20] __attribute__ ((aligned(sizeof(__kernel_size_t))));/* 20 is size of ipv6_pktinfo */unsigned char *ctl_buf = ctl;struct msghdr msg_sys;int err, ctl_len, iov_size, total_len;int fput_needed;err = -EFAULT;if (MSG_CMSG_COMPAT & flags) {if (get_compat_msghdr(&msg_sys, msg_compat))return -EFAULT;}else {err = copy_msghdr_from_user(&msg_sys, msg);if (err)return err;}sock = sockfd_lookup_light(fd, &err, &fput_needed);if (!sock)goto out;/* do not move before msg_sys is valid */err = -EMSGSIZE;if (msg_sys.msg_iovlen > UIO_MAXIOV)goto out_put;/* Check whether to allocate the iovec area */err = -ENOMEM;iov_size = msg_sys.msg_iovlen * sizeof(struct iovec);if (msg_sys.msg_iovlen > UIO_FASTIOV) {iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);if (!iov)goto out_put;}/* This will also move the address data into kernel space */if (MSG_CMSG_COMPAT & flags) {err = verify_compat_iovec(&msg_sys, iov, (struct sockaddr *)&address, VERIFY_READ);} elseerr = verify_iovec(&msg_sys, iov, (struct sockaddr *)&address, VERIFY_READ);if (err < 0)goto out_freeiov;total_len = err;err = -ENOBUFS;if (msg_sys.msg_controllen > INT_MAX)goto out_freeiov;ctl_len = msg_sys.msg_controllen;if ((MSG_CMSG_COMPAT & flags) && ctl_len) {err = cmsghdr_from_user_compat_to_kern(&msg_sys, sock->sk, ctl, sizeof(ctl));if (err)goto out_freeiov;ctl_buf = msg_sys.msg_control;ctl_len = msg_sys.msg_controllen;} else if (ctl_len) {if (ctl_len > sizeof(ctl)) {ctl_buf = sock_kmalloc(sock->sk, ctl_len, GFP_KERNEL);if (ctl_buf == NULL)goto out_freeiov;}err = -EFAULT;/** Careful! Before this, msg_sys.msg_control contains a user pointer.* Afterwards, it will be a kernel pointer. Thus the compiler-assisted* checking falls down on this.*/if (copy_from_user(ctl_buf, (void __user *)msg_sys.msg_control, ctl_len))goto out_freectl;msg_sys.msg_control = ctl_buf;}msg_sys.msg_flags = flags;if (sock->file->f_flags & O_NONBLOCK)msg_sys.msg_flags |= MSG_DONTWAIT;err = sock_sendmsg(sock, &msg_sys, total_len);out_freectl:if (ctl_buf != ctl)sock_kfree_s(sock->sk, ctl_buf, ctl_len); out_freeiov:if (iov != iovstack)sock_kfree_s(sock->sk, iov, iov_size); out_put:fput_light(sock->file, fput_needed); out:return err; }

/source/net/socket.c

int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) {struct kiocb iocb;struct sock_iocb siocb;int ret;init_sync_kiocb(&iocb, NULL);iocb.private = &siocb;/*調(diào)用__sock_sendmsg進(jìn)行UDP數(shù)據(jù)報(bào)的發(fā)送*/ret = __sock_sendmsg(&iocb, sock, msg, size);if (-EIOCBQUEUED == ret)ret = wait_on_sync_kiocb(&iocb);return ret; }static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t size) {struct sock_iocb *si = kiocb_to_siocb(iocb);int err;si->sock = sock;si->scm = NULL;si->msg = msg;si->size = size;err = security_socket_sendmsg(sock, msg, size);if (err)return err;/*const struct proto_ops inet_dgram_ops = {.family = PF_INET,.owner = THIS_MODULE,.release = inet_release,.bind = inet_bind,.connect = inet_dgram_connect,.socketpair = sock_no_socketpair,.accept = sock_no_accept,.getname = inet_getname,.poll = udp_poll,.ioctl = inet_ioctl,.listen = sock_no_listen,.shutdown = inet_shutdown,.setsockopt = sock_common_setsockopt,.getsockopt = sock_common_getsockopt,.sendmsg = inet_sendmsg,.recvmsg = sock_common_recvmsg,.mmap = sock_no_mmap,.sendpage = inet_sendpage,#ifdef CONFIG_COMPAT.compat_setsockopt = compat_sock_common_setsockopt,.compat_getsockopt = compat_sock_common_getsockopt,#endif};EXPORT_SYMBOL(inet_dgram_ops);從結(jié)構(gòu)體中可以看出,sendmsg()對(duì)應(yīng)的系統(tǒng)調(diào)用是inet_sendmsg()我們繼續(xù)跟進(jìn)分析inet_sendmsg()\linux-2.6.32.63\net\ipv4\af_inet.c*/return sock->ops->sendmsg(iocb, sock, msg, size); }

\linux-2.6.32.63\net\ipv4\af_inet.c

int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t size) {struct sock *sk = sock->sk;/* We may need to bind the socket. */if (!inet_sk(sk)->num && inet_autobind(sk))return -EAGAIN; /*INET SOCKET調(diào)用協(xié)議特有sendmsg操作符 對(duì)于INET socket中的udp發(fā)送,協(xié)議特有操作符集為udp_protlinux-2.6.32.63\net\ipv4\udp.cstruct proto udp_prot = {.name = "UDP",.owner = THIS_MODULE,.close = udp_lib_close,.connect = ip4_datagram_connect,.disconnect = udp_disconnect,.ioctl = udp_ioctl,.destroy = udp_destroy_sock,.setsockopt = udp_setsockopt,.getsockopt = udp_getsockopt,.sendmsg = udp_sendmsg,.recvmsg = udp_recvmsg,.sendpage = udp_sendpage,.backlog_rcv = __udp_queue_rcv_skb,.hash = udp_lib_hash,.unhash = udp_lib_unhash,.get_port = udp_v4_get_port,.memory_allocated = &udp_memory_allocated,.sysctl_mem = sysctl_udp_mem,.sysctl_wmem = &sysctl_udp_wmem_min,.sysctl_rmem = &sysctl_udp_rmem_min,.obj_size = sizeof(struct udp_sock),.slab_flags = SLAB_DESTROY_BY_RCU,.h.udp_table = &udp_table,#ifdef CONFIG_COMPAT.compat_setsockopt = compat_udp_setsockopt,.compat_getsockopt = compat_udp_getsockopt,#endif};EXPORT_SYMBOL(udp_prot);可以看出,對(duì)于UDP,流程進(jìn)入udp_sendmsg函數(shù)(.sendmsg對(duì)應(yīng)的是udp_sendmsg()函數(shù)),我們繼續(xù)跟進(jìn)udp_sendmsg()\linux-2.6.32.63\net\ipv4\udp.c*/return sk->sk_prot->sendmsg(iocb, sk, msg, size); } EXPORT_SYMBOL(inet_sendmsg);

0x2: recvmsg

/source/net/socket.c

/** BSD recvmsg interface*/ SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg, unsigned int, flags) {struct compat_msghdr __user *msg_compat = (struct compat_msghdr __user *)msg;struct socket *sock;struct iovec iovstack[UIO_FASTIOV];struct iovec *iov = iovstack;struct msghdr msg_sys;unsigned long cmsg_ptr;int err, iov_size, total_len, len;int fput_needed;/* kernel mode address */struct sockaddr_storage addr;/* user mode address pointers */struct sockaddr __user *uaddr;int __user *uaddr_len;if (MSG_CMSG_COMPAT & flags) {if (get_compat_msghdr(&msg_sys, msg_compat))return -EFAULT;}else {err = copy_msghdr_from_user(&msg_sys, msg);if (err)return err;}sock = sockfd_lookup_light(fd, &err, &fput_needed);if (!sock)goto out;err = -EMSGSIZE;if (msg_sys.msg_iovlen > UIO_MAXIOV)goto out_put;/* Check whether to allocate the iovec area */err = -ENOMEM;iov_size = msg_sys.msg_iovlen * sizeof(struct iovec);if (msg_sys.msg_iovlen > UIO_FASTIOV) {iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);if (!iov)goto out_put;}/* Save the user-mode address (verify_iovec will change the* kernel msghdr to use the kernel address space)*/uaddr = (__force void __user *)msg_sys.msg_name;uaddr_len = COMPAT_NAMELEN(msg);if (MSG_CMSG_COMPAT & flags)err = verify_compat_iovec(&msg_sys, iov, (struct sockaddr *)&addr, VERIFY_WRITE);elseerr = verify_iovec(&msg_sys, iov, (struct sockaddr *)&addr, VERIFY_WRITE);if (err < 0)goto out_freeiov;total_len = err;cmsg_ptr = (unsigned long)msg_sys.msg_control;msg_sys.msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT);/* We assume all kernel code knows the size of sockaddr_storage */msg_sys.msg_namelen = 0;if (sock->file->f_flags & O_NONBLOCK)flags |= MSG_DONTWAIT;err = sock_recvmsg(sock, &msg_sys, total_len, flags);if (err < 0)goto out_freeiov;len = err;if (uaddr != NULL) {err = move_addr_to_user((struct sockaddr *)&addr, msg_sys.msg_namelen, uaddr, uaddr_len);if (err < 0)goto out_freeiov;}err = __put_user((msg_sys.msg_flags & ~MSG_CMSG_COMPAT), COMPAT_FLAGS(msg));if (err)goto out_freeiov;if (MSG_CMSG_COMPAT & flags)err = __put_user((unsigned long)msg_sys.msg_control - cmsg_ptr, &msg_compat->msg_controllen);elseerr = __put_user((unsigned long)msg_sys.msg_control - cmsg_ptr, &msg->msg_controllen);if (err)goto out_freeiov;err = len;out_freeiov:if (iov != iovstack)sock_kfree_s(sock->sk, iov, iov_size); out_put:fput_light(sock->file, fput_needed); out:return err; }

?

6. kernel_recvmsg、kernel_sendmsg In Kernel Space

0x1: kernel_recvmsg

/source/net/socket.c

int kernel_recvmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, size_t num, size_t size, int flags) {mm_segment_t oldfs = get_fs();int result;set_fs(KERNEL_DS);/** the following is safe, since for compiler definitions of kvec and* iovec are identical, yielding the same in-core layout and alignment*/msg->msg_iov = (struct iovec *)vec, msg->msg_iovlen = num;result = sock_recvmsg(sock, msg, size, flags);set_fs(oldfs);return result; }

對(duì)于內(nèi)核態(tài)來(lái)說(shuō),數(shù)據(jù)包此時(shí)已經(jīng)copy到了Netlink的KERNEL態(tài)緩存了

0x2: kernel_sendmsg

/source/net/socket.c

int kernel_sendmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, size_t num, size_t size) {mm_segment_t oldfs = get_fs();int result;set_fs(KERNEL_DS);/** the following is safe, since for compiler definitions of kvec and* iovec are identical, yielding the same in-core layout and alignment*/msg->msg_iov = (struct iovec *)vec;msg->msg_iovlen = num;result = sock_sendmsg(sock, msg, size);set_fs(oldfs);return result; }

Relevant Link:

http://www.opensource.apple.com/source/Heimdal/Heimdal-247.9/lib/roken/sendmsg.c https://fossies.org/dox/glibc-2.21/sysdeps_2mach_2hurd_2sendmsg_8c_source.html http://lxr.free-electrons.com/source/net/socket.c

?

7. NetLink Sockets C++ Library

0x1: Features

1. Cross Platform Library 2. Easy to use 3. Powerful and Reliable 4. Supports both Ip4 and Ip6 5. SocketGroup class to manage the connections 6. OnAcceptReady, OnReadReady, OnDisconnect callback model 7. Fully documented library API 8. Enables to Develop socket functionality extremely Fast 9. Fits single threaded and multi-threaded designs

Relevant Link:

http://sourceforge.net/projects/netlinksockets/

?

8. Netlink Protocol Library Suite (libnl)

The libnl suite is a collection of libraries providing APIs to netlink protocol based Linux kernel interfaces.
Netlink is a IPC mechanism primarly between the kernel and user space processes. It was designed to be a more flexible successor to ioctl to provide mainly networking related kernel configuration and monitoring interfaces.

?

The interfaces are split into several small libraries to not force applications to link against a single, bloated library.

0x1: libnl

Core library implementing the fundamentals required to use the netlink protocol such as socket handling, message construction and parsing, and sending and receiving of data. This library is kept small and minimalistic. Other libraries of the suite depend on this library.

0x2:?libnl-route

API to the configuration interfaces of the NETLINK_ROUTE family including network interfaces, routes, addresses, neighbours, and traffic control.

0x3: libnl-genl

API to the generic netlink protocol, an extended version of the netlink protocol.

0x4: libnl-nf

API to netlink based netfilter configuration and monitoring interfaces (conntrack, log, queue)

Relevant Link:

http://www.carisma.slowglass.com/~tgr/libnl/ http://www.carisma.slowglass.com/~tgr/libnl/doc/core.html

?

Copyright (c) 2015 LittleHann All rights reserved

?

轉(zhuǎn)載于:https://www.cnblogs.com/LittleHann/p/4418754.html

總結(jié)

以上是生活随笔為你收集整理的NetLink Communication Mechanism And Netlink Sourcecode Analysis的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

久久久国内精品 | 成人三级网址 | 探花视频免费在线观看 | 欧美大片大全 | 国产精品一区二区久久 | 日韩在线二区 | 欧美一二三专区 | 国产精品二区在线观看 | 国产一区二区视频在线播放 | 亚洲欧美日韩不卡 | 久草.com| 特黄特黄的视频 | 国产精品久久久久久久久久久久 | 日本不卡一区二区 | 999久久久免费视频 午夜国产在线观看 | 国产精品久久久久免费 | 特级毛片网 | av片在线看| 99久久er热在这里只有精品66 | 欧美男男激情videos | 亚洲黄色免费网站 | 色婷婷综合久久久中文字幕 | 97免费公开视频 | 中文不卡视频在线 | 久久精品—区二区三区 | 国产传媒一区在线 | 久久深夜 | 国产精品视频app | 99视频在线播放 | 久操免费视频 | 欧美一区成人 | 色久av | 中文字幕在线国产 | 国产日韩欧美视频在线观看 | 最近2019年日本中文免费字幕 | 91精品国产综合久久婷婷香蕉 | 久久久999| 精品久久一区二区三区 | 国产韩国精品一区二区三区 | 国产精品久久久久久久久久久免费看 | 亚洲美女在线国产 | 97在线播放 | 麻豆成人小视频 | 婷婷激情综合 | 特级xxxxx欧美 | 在线免费观看视频一区 | 天堂视频中文在线 | 精品影院一区二区久久久 | 日日夜夜天天射 | 亚洲精品在线看 | 国产精品成人久久 | 成年性视频 | 久久久久久蜜av免费网站 | 国产精品久久三 | 精品久久久久久综合 | 人人精品久久 | 欧亚日韩精品一区二区在线 | 色在线高清| 日批视频国产 | 精品一区 在线 | 一级α片免费看 | 日日婷婷夜日日天干 | 狠狠操在线 | 亚洲成人资源在线观看 | 色中色综合 | 激情婷婷av | 日韩网 | 成年人免费观看国产 | 91看片网址 | 在线观看亚洲国产 | 国产精品入口麻豆www | 波多野结衣在线中文字幕 | 四虎国产精品免费观看视频优播 | www.com黄| 麻豆一区在线观看 | 91九色蝌蚪视频 | 亚洲免费在线播放视频 | 天天操夜夜操国产精品 | 在线观看日韩一区 | 免费观看日韩av | 国产精品综合久久久久久 | 久久国产影视 | 中文字幕在线国产 | 国产不卡视频在线 | 国产99re| 骄小bbw搡bbbb揉bbbb | 国产乱视频| av资源网在线播放 | 中文字幕乱偷在线 | 亚洲日本欧美在线 | av一区二区三区在线 | 久草精品视频在线看网站免费 | 欧美精品少妇xxxxx喷水 | 国产色资源 | 日韩欧美在线观看 | 国产精品视频app | 国产精美视频 | 夜夜夜夜夜夜操 | 六月色丁香 | 色中文字幕在线观看 | 综合网婷婷 | av一区二区三区在线 | 一区二区三区日韩在线观看 | 成人天堂网 | av免费看av | 色黄久久久久久 | 一区二区三区日韩视频在线观看 | 操高跟美女| 久久官网 | 大荫蒂欧美视频另类xxxx | 深爱激情久久 | 欧美一区在线观看视频 | 91麻豆国产福利在线观看 | 精品视频999 | 色999精品 | 网址你懂的在线观看 | 99精品视频免费全部在线 | 在线直播av | 偷拍区另类综合在线 | 亚洲国产成人久久综合 | 激情丁香| 日本视频精品 | 91一区在线观看 | 亚洲欧美激情精品一区二区 | 激情综合网五月婷婷 | 亚洲黄色免费观看 | 日韩毛片精品 | 五月激情亚洲 | 九热精品 | 欧美成人视 | 久久久国产成人 | 国产黄色免费观看 | 久久艹在线 | 一区二区三区日韩视频在线观看 | 看av在线| 欧美不卡视频在线 | 亚洲欧美视频在线播放 | 91视频免费观看 | 国产视 | a级片韩国| 中文在线字幕免 | 国产麻豆电影在线观看 | 色妞色视频一区二区三区四区 | 国产精品成人久久 | 亚洲黄色在线播放 | 中文av在线天堂 | 一区二区三区在线观看免费 | 97超碰资源 | a极黄色片| 日韩色爱| 99久久国产免费看 | 丁香五香天综合情 | 久草免费在线视频观看 | 97超碰在| 奇米网网址 | 91av免费看 | 黄色在线网站噜噜噜 | 在线免费观看成人 | 天天操操操操操操 | 中文字幕成人一区 | 久久成人毛片 | 在线观看一区二区视频 | av三级av | 天天翘av| 啪啪肉肉污av国网站 | 久久国产一区 | 久久精品99北条麻妃 | 在线直播av | 在线观看国产日韩 | 五月婷婷中文 | 国产精品色 | 99视频久久 | 久久96 | 国产精品剧情 | 日日爱视频 | 国产自偷自拍 | 久久成人国产精品免费软件 | 欧美天天干 | 欧美激情视频一二三区 | 免费观看完整版无人区 | 国产免费国产 | 在线 影视 一区 | 91av欧美 | 国产日韩欧美精品在线观看 | 国产这里只有精品 | 国产一区免费在线 | 中文字幕中文字幕中文字幕 | 国产精品不卡在线播放 | 亚洲综合在线观看视频 | 亚洲国产三级 | 免费福利视频网 | 免费午夜av | 午夜三级理论 | 国产在线精品一区 | 九九欧美| 在线亚洲人成电影网站色www | 六月激情| 在线看一区 | 国产精品久久久久久久久久久杏吧 | 亚洲精品日韩av | 美女网站视频久久 | 欧美日韩一区二区免费在线观看 | 亚洲欧美视频一区二区三区 | av五月婷婷 | 91看片在线 | www.夜色.com| 免费情趣视频 | 日韩18p| 日韩av美女| 不卡的av片 | 韩日色视频 | 免费情缘| 免费男女网站 | 国产资源在线免费观看 | 免费在线成人av | 日韩精品免费一区二区在线观看 | 999精品| 91麻豆看国产在线紧急地址 | 黄色在线免费观看网站 | 99久久国产免费看 | 麻豆观看 | 国产一区二区在线精品 | 91av亚洲| 综合天堂av久久久久久久 | 久久久精品欧美一区二区免费 | 久久久久免费 | 欧美午夜精品久久久久 | 国产理论影院 | 国产高清av免费在线观看 | 亚洲精品黄 | a级国产乱理论片在线观看 特级毛片在线观看 | 最近中文字幕大全 | 奇米网网址 | 色爽网站 | 999久久久免费视频 午夜国产在线观看 | 成人永久视频 | 免费看的黄网站 | 成人欧美一区二区三区在线观看 | 中文字幕电影一区 | 国产69久久精品成人看 | 在线天堂中文www视软件 | 天天干天天操天天做 | 亚洲精品视频在线观看免费视频 | 亚洲精品毛片一级91精品 | 丁香花中文在线免费观看 | 国产精品黄色影片导航在线观看 | 久99久中文字幕在线 | 国产97在线观看 | 国产激情小视频在线观看 | 99精品视频在线观看播放 | 国产在线2020 | 激情婷婷色 | 国产一区二区三区黄 | 香蕉视频导航 | 小草av在线播放 | 成人久久久电影 | 美国av大片 | www.夜夜| 天天插狠狠插 | 精品国产一区二区三区日日嗨 | 天天色天天搞 | 久久精品网址 | 免费毛片aaaaaa | 99热99热| 日本少妇久久久 | 成人一区二区三区在线观看 | 欧美精品在线视频观看 | 欧美在线视频二区 | 久久久亚洲麻豆日韩精品一区三区 | 在线免费视频你懂的 | 日韩精品一区二区久久 | 国产精品久久久久久久久免费看 | 热九九精品| 插综合网 | 在线免费观看黄网站 | 亚洲91在线| 久视频在线 | 日日碰狠狠躁久久躁综合网 | 久久99精品久久久久久 | 国产一区二区免费 | 99热最新| 91精品在线观看视频 | 少妇搡bbbb搡bbb搡69 | 国产精品久久久久久久久久三级 | 亚洲黄色在线观看 | 免费看黄电影 | 免费韩国av | 亚洲三级在线 | 久久亚洲精品电影 | 国内精品久久久精品电影院 | 成人av电影免费观看 | 亚洲精品一区二区三区在线观看 | 在线观看福利网站 | 午夜91视频 | 99精品视频在线观看播放 | 国产成人333kkk | 国产精品久久av | 国产一级精品视频 | 婷婷久久综合网 | 国产一级视频免费看 | 去看片| 中文字幕在线字幕中文 | 九草在线视频 | 在线观看的av网站 | 中文日韩在线视频 | 免费下载高清毛片 | 天天看天天干 | 91av资源在线 | 国内精品在线看 | 久久精品婷婷 | 麻豆免费在线视频 | 日本公妇色中文字幕 | 久久综合国产伦精品免费 | 99精品视频免费看 | 亚洲伊人成综合网 | 色永久免费视频 | 97夜夜澡人人双人人人喊 | 操高跟美女 | 国产1区2区3区精品美女 | 91丨九色丨丝袜 | 免费黄色在线网站 | 国产精品v欧美精品v日韩 | 婷婷在线精品视频 | 久久精彩视频 | 91精品在线观看入口 | 97超碰福利久久精品 | 2018好看的中文在线观看 | 蜜臀一区二区三区精品免费视频 | 五月天激情视频 | 天天干天天操天天操 | 国产又粗又猛又色又黄视频 | 亚洲专区免费观看 | 天天操天天干天天爱 | 久操综合| 亚洲黄色在线观看 | 国产人成一区二区三区影院 | 日韩精品不卡在线 | 亚洲永久av | 色噜噜在线观看视频 | 97在线精品视频 | 夜夜操狠狠干 | 亚洲夜夜网 | 在线国产99 | 亚洲aⅴ在线观看 | 欧美久久久久久久久中文字幕 | 日韩精品中文字幕一区二区 | 亚洲免费高清视频 | 国产不卡视频在线播放 | 天天爱天天操天天射 | 亚洲 欧美 另类人妖 | 手机成人在线 | 青草草在线视频 | 五月激情亚洲 | 精品国产一区二区久久 | a在线视频v视频 | 精品国产一区二区三区久久久蜜臀 | 日韩三级视频在线观看 | 开心激情网五月天 | 成人影片在线播放 | 欧美十八| 亚洲v精品 | 亚洲精品影院在线观看 | 国产精品永久久久久久久久久 | 国产精品成人一区二区三区吃奶 | 91免费视频网站在线观看 | 久久精品久久精品久久精品 | 天天做天天爱夜夜爽 | 97色婷婷人人爽人人 | 国产成人黄色 | 国产精品久久久久婷婷二区次 | 播五月婷婷 | 欧美性黄网官网 | 亚洲精品在线一区二区 | 亚洲精品视频网站在线观看 | 岛国av在线不卡 | 四虎国产视频 | 欧美日韩xx | 高潮久久久| 久久艹人人| 国产精品丝袜久久久久久久不卡 | 欧美成人亚洲成人 | 成人免费看视频 | 精品国产福利在线 | 国产亚洲精品久久久久久无几年桃 | www.看片网站 | 91精品一区国产高清在线gif | 国内精品久久久久影院一蜜桃 | 免费大片黄在线 | 911精品视频 | 亚洲女欲精品久久久久久久18 | 91免费高清视频 | 婷婷六月久久 | 在线观看免费一级片 | 婷婷在线观看视频 | 日韩xxxxxxxxx | 91免费网址| 色国产精品| 欧美色精品天天在线观看视频 | 国产精品不卡一区 | 国产伦精品一区二区三区在线 | 91九色porny蝌蚪主页 | 不卡av在线播放 | 久久精品999| 黄色国产在线观看 | 97精品国产91久久久久久久 | 成人免费大片黄在线播放 | www.成人精品 | 首页中文字幕 | 97视频久久久 | 521色香蕉网站在线观看 | 91精品啪 | 黄色小说免费观看 | 免费一级片在线 | 韩国一区二区在线观看 | 天天操狠狠操夜夜操 | 国产香蕉视频在线播放 | 五月婷婷操| 色综合久久久久综合 | 久久精品99国产精品日本 | 成人av一区二区兰花在线播放 | 99热国产在线中文 | 韩日精品在线 | 日本久久免费电影 | 久久综合九色99 | 日本久久影视 | 天天干夜夜夜操天 | 国产免费久久精品 | 国产精品观看视频 | 久久久噜噜噜久久久 | 国内精品久久久精品电影院 | 久久久午夜精品福利内容 | 免费看污在线观看 | 麻豆精品视频在线观看免费 | 天天曰夜夜爽 | 深爱五月激情网 | 色综合网在线 | 国产成人在线观看 | 中文av网| 国产精品视频免费观看 | 久碰视频在线观看 | 久久五月婷婷综合 | 在线黄色免费av | 伊人婷婷| 免费日韩电影 | 91久久人澡人人添人人爽欧美 | 中文字幕视频三区 | 日韩激情视频在线观看 | 99精品国产aⅴ | 中文字幕在线视频免费播放 | 亚洲黄在线观看 | 日韩激情视频在线 | 久久手机免费视频 | 国产精品欧美激情在线观看 | 日韩精品久久久久久久电影竹菊 | 天天碰天天操 | 婷婷色网 | 亚洲va欧美 | 日韩精品一区二区三区免费观看视频 | 天天综合在线观看 | 国产精品 日韩精品 | 欧美精品乱码久久久久久按摩 | 91在线精品一区二区 | 国产精品99久久久久人中文网介绍 | 亚洲另类视频 | 五月激情六月丁香 | 91在线视频一区 | 国产精品免费人成网站 | 婷婷丁香久久五月婷婷 | 日日夜夜综合网 | 午夜视频在线观看一区二区三区 | 免费观看日韩 | 精品国产一区二区三区日日嗨 | 亚洲精品视频网站在线观看 | 视频 天天草 | 久久av电影 | 九九久久影院 | 国产精品aⅴ | 色噜噜日韩精品一区二区三区视频 | 国产伦理精品一区二区 | 在线中文字幕观看 | 91在线网址 | 日韩av三区 | 欧美黑人猛交 | 懂色av一区二区在线播放 | 五月天色婷婷丁香 | 亚洲男男gaygay无套同网址 | 国内精自线一二区永久 | 国产亚洲欧美日韩高清 | 欧美日韩在线电影 | www.国产高清 | 久草精品视频 | 久久久国产影视 | 亚洲最大av在线播放 | 亚洲影院国产 | 最近日本中文字幕 | 91精品国产99久久久久久红楼 | 五月婷婷在线视频 | 国产精选在线观看 | 免费高清男女打扑克视频 | 日韩在观看线 | 日韩精品在线观看视频 | av日韩不卡| 丁香激情五月婷婷 | 奇米影视8888在线观看大全免费 | 欧美动漫一区二区三区 | 四虎国产精| av在线h | 国产视频亚洲精品 | 免费亚洲婷婷 | 美女国内精品自产拍在线播放 | 日韩久久精品一区二区三区下载 | 日本在线视频一区二区三区 | 二区三区毛片 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 久久99网站 | 久久精品成人热国产成 | 韩日电影在线免费看 | 高清美女视频 | 成人资源网 | 久久伊人国产精品 | 日韩视频欧美视频 | 黄色软件在线观看视频 | 色婷婷av一区二 | 中文字幕一区二区三区四区久久 | 久久天堂精品视频 | 成年人三级网站 | www.色国产| 免费a视频| 色老板在线视频 | 五月花婷婷 | 又污又黄网站 | 九九久久精品 | 国产精品一区二区免费在线观看 | 成人中文字幕+乱码+中文字幕 | 午夜精品久久久久久久99无限制 | 国产成在线观看免费视频 | 99精品视频免费在线观看 | 一本色道久久综合亚洲二区三区 | 99精品视频一区 | 人人澡人人澡人人 | 99av国产精品欲麻豆 | 狠狠久久| 最近日本韩国中文字幕 | 亚洲精品国产自产拍在线观看 | 国产在线美女 | 西西www4444大胆视频 | 亚洲视频 中文字幕 | 久久呀 | av免费在线网站 | 在线观看亚洲免费视频 | 久久综合狠狠综合久久激情 | 久久久久中文 | 精品久久久久久久久久 | 天天操天天艹 | 又黄又刺激视频 | 国产99久久久久久免费看 | 久久精品网站视频 | 国产九色视频在线观看 | 久久福利国产 | 国产涩涩网站 | 999国产| 日韩激情精品 | 亚洲综合精品视频 | 黄色大片视频网站 | 亚洲精品乱码久久久久久 | 亚洲欧洲av在线 | 一区二区三区精品在线视频 | 最新日本中文字幕 | 四虎www. | 免费看片网址 | 久久久久五月天 | 国产成人三级三级三级97 | 九九热在线视频免费观看 | 日本一区二区三区免费看 | 91丨九色丨高潮丰满 | 美女黄久久 | 一级片免费视频 | 亚洲影视资源 | 国产中文字幕第一页 | 国产精品一区二区在线看 | 免费麻豆 | 久久久久久免费视频 | 福利电影久久 | 韩日av在线 | 欧美在线a视频 | 中文字幕亚洲欧美 | 欧美视频日韩视频 | 91桃色免费观看 | 日韩在线电影观看 | 中文字幕在线观看完整版 | 亚洲国产精品成人综合 | 在线 高清 中文字幕 | 国产黑丝一区二区 | 亚洲精品国产品国语在线 | 亚洲 精品在线视频 | 免费三及片 | 丁香 婷婷 激情 | 91激情在线视频 | 成 人 黄 色 视频播放1 | 成人小视频免费在线观看 | 黄网站大全 | 综合激情| 国内一区二区视频 | 中文字幕在线观看不卡 | 不卡在线一区 | 国产亚洲婷婷免费 | 国产亚洲精品精品精品 | 99久久精品免费视频 | 欧美一级裸体视频 | 日韩三级久久 | 亚洲日本黄色 | 不卡电影免费在线播放一区 | 夜夜躁日日躁狠狠久久av | 久久精品视 | 国产精品入口传媒 | 精品国产美女在线 | 久久午夜鲁丝片 | 亚洲最新合集 | 国产精品密入口果冻 | 最近在线中文字幕 | 97超碰资源总站 | 一区二区 精品 | 久久久综合九色合综国产精品 | 国产精品男女视频 | 国产淫片免费看 | 中文字幕免费高清 | 久久免费一级片 | 久久综合色一综合色88 | 久久久久久影视 | 亚洲电影影音先锋 | 欧美另类视频 | 久草免费看| 国产精品视频99 | 亚洲国产精彩中文乱码av | 超碰97网站 | 二区视频在线 | 五月婷婷深开心 | 成年人免费看片网站 | 在线 精品 国产 | 狠狠久久综合 | 日韩高清在线一区二区 | 亚洲精品美女在线 | 免费黄色特级片 | 91色欧美 | 激情综合五月网 | 久久老司机精品视频 | 日韩精品一区二区免费视频 | 91免费视频网站在线观看 | 在线视频99| 国产精品午夜在线观看 | 国产精品毛片一区 | 久久精品女人毛片国产 | 色综合五月 | 在线观看视频你懂 | 国产无区一区二区三麻豆 | 99视频精品视频高清免费 | 深爱开心激情网 | 国产亚洲欧美在线视频 | 免费毛片aaaaaa | 2021国产在线| 区一区二区三区中文字幕 | 日韩电影在线观看一区二区三区 | 国产一区二区在线免费播放 | 一性一交视频 | 美女一级毛片视频 | 啪一啪在线 | 中文字幕有码在线播放 | 国产99久久99热这里精品5 | 视频91| 日韩精品亚洲专区在线观看 | 日韩免费电影网站 | 探花视频在线观看+在线播放 | 337p日本大胆噜噜噜噜 | 国产一区二区不卡在线 | 狠狠操狠狠干天天操 | 成年美女黄网站色大片免费看 | 亚洲精品色婷婷 | 97自拍超碰| 国产高清久久久久 | 国产精品美女久久久久久2018 | 久久久精品电影 | 人人爱人人射 | 一区三区视频在线观看 | 91黄视频在线 | 97av影院| 五月丁色| 中文字幕精品三区 | 丁香婷婷综合激情五月色 | 久久综合网色—综合色88 | 国产精品一区专区欧美日韩 | 日本精品视频在线观看 | 国产日韩中文在线 | 成人中文字幕在线观看 | 免费色网站 | 久久久精品高清 | 免费激情在线电影 | 四虎影视成人精品 | 激情视频一区二区三区 | 天堂在线一区二区三区 | 国产黄色在线观看 | 国产精品永久免费在线 | av电影免费在线 | 伊人伊成久久人综合网小说 | 国产精品爽爽爽 | 日韩成人xxxx | 特级西西人体444是什么意思 | 成人免费大片黄在线播放 | 中文字幕中文 | 日韩欧美69 | 中文字幕在线观看2018 | 香蕉视频4aa | 久国产在线播放 | 91精品久久久久久久99蜜桃 | 2022久久国产露脸精品国产 | 超碰精品在线 | 中文字幕日韩伦理 | 人人狠| 久久精品国产免费看久久精品 | 青青河边草观看完整版高清 | 天天综合天天综合 | 日日日日 | 深夜免费福利 | 福利片视频区 | 五月婷婷丁香六月 | 91av小视频| 国产手机在线观看视频 | 欧美a在线看 | 黄色特级片 | 91精品视频免费在线观看 | 久久久久久美女 | 久久永久视频 | 欧美日韩xx| 国内三级在线 | 91网页版免费观看 | 久久成年人| 亚洲人视频在线 | 欧美经典久久 | 91香蕉国产在线观看软件 | 国产精品爽爽久久久久久蜜臀 | 亚洲视频观看 | 国产日本亚洲高清 | 91最新国产 | 久久成人国产精品免费软件 | 五月婷婷av | 成人毛片一区 | 日日夜夜添| 色六月婷婷 | 欧美了一区在线观看 | 国产一区免费观看 | 亚洲免费国产 | 久久精品视频网 | 成人永久视频 | 欧洲精品一区二区 | 国产在线观看91 | 国产永久免费观看 | 国产在线观看地址 | 久久久久区 | 成人一级黄色片 | 五月婷婷六月丁香 | 国产特级毛片aaaaaa毛片 | 日韩特级黄色片 | 久久99影院| 日韩精品第1页 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 日韩视频在线不卡 | 日韩精品中文字幕在线播放 | 91插插插免费视频 | 国产精品一区二区久久精品爱微奶 | 黄色片网站 | 久久影院中文字幕 | 国产美女主播精品一区二区三区 | 99视频在线精品 | 色停停五月天 | 欧美日韩免费一区 | 三级视频片 | 亚洲免费av电影 | 日批网站在线观看 | 亚洲成熟女人毛片在线 | 国产亚洲视频系列 | 免费一级黄色 | 国产精品一区二区精品视频免费看 | 亚洲精品欧美成人 | 2019中文| 久久国产精品久久国产精品 | 五月天亚洲精品 | 91精品久久久久久久91蜜桃 | 国产最新视频在线观看 | 91av观看| 亚洲国产午夜精品 | 成人午夜影院在线观看 | 久久精品久久精品久久39 | 久久久久久久久久久久久久免费看 | 在线观看亚洲精品视频 | 国产剧在线观看片 | 成人免费一级 | 99在线观看免费视频精品观看 | 国产精品入口传媒 | 美女视频永久黄网站免费观看国产 | 久久视频99 | 成人午夜电影在线观看 | 最近中文字幕在线中文高清版 | 99精品99 | 三级黄色欧美 | av片子在线观看 | 伊人中文字幕在线 | 香蕉视频免费在线播放 | 少妇性bbb搡bbb爽爽爽欧美 | 一区二区三区免费播放 | 99热99re6国产在线播放 | 91成人免费在线 | 天操夜夜操| 久久久久久国产一区二区三区 | 日韩网站免费观看 | 五月情婷婷 | 久久久久综合精品福利啪啪 | 丁香婷婷综合色啪 | 四虎影视成人 | 韩国精品在线观看 | 青青河边草免费视频 | 国产精品美女久久久网av | 午夜精品av | 免费在线色 | 五月婷婷.com | 女人高潮特级毛片 | 国产成人av综合色 | 制服丝袜在线 | 亚洲资源在线 | 日b视频国产 | 亚洲黄色免费网站 | 综合成人在线 | 日韩免费看片 | 欧美性猛片, | 毛片99 | 国产亚洲精品v | 国产中文欧美日韩在线 | av一本久道久久波多野结衣 | 不卡电影一区二区三区 | 亚洲天天在线日亚洲洲精 | 超碰免费97 | 黄色三级在线观看 | av播放在线| 国产精品99免视看9 国产精品毛片一区视频 | 激情影院在线观看 | 日韩在线观看你懂的 | 久久精品欧美一区二区三区麻豆 | 中文字幕在线观看视频一区 | 亚洲精品免费在线观看视频 | 久久综合精品国产一区二区三区 | 婷婷av综合 | 亚洲综合欧美激情 | 午夜精品一区二区三区在线播放 | 日日爽 | 国内少妇自拍视频一区 | 欧美在线视频一区二区 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 亚洲国产成人在线观看 | 国产精品大全 | 国产中出在线观看 | 五月婷视频 | 精品国产乱码久久久久久三级人 | 成人av电影在线播放 | 激情影院在线 | 伊人看片 | 免费视频成人 | 日韩精品一区二区三区在线视频 | 在线免费黄色av | 粉嫩av一区二区三区四区 | 久久久国产精品一区二区中文 | 国产婷婷vvvv激情久 | 国产福利一区在线观看 | 一级性生活片 | 亚洲国产资源 | 久久久久久国产一区二区三区 | 欧美一区二区视频97 | 九九热精品视频在线观看 | 国产精品白丝jk白祙 | 91成年人在线观看 | 国产不卡片 | 亚洲国产日韩av | 九九色综合 | 亚洲激情视频在线观看 | 91香蕉视频 | 97精品国产91久久久久久久 | 日韩欧美视频在线播放 | 天天色综合久久 | 国产成人99久久亚洲综合精品 | 天天爽天天爽天天爽 | www.伊人网 | 国产免费视频在线 | 在线国产片| 久久免费久久 | 欧美专区亚洲专区 | 日本久久久久久久久久久 | 伊人手机在线 | av看片在线观看 | www免费| 美女免费黄网站 | 中文字幕乱码亚洲精品一区 | 国产视频一 | 免费看久久 | 草久热| 99热这里精品 | 欧美性久久久久久 | 精品国产成人av | 天天激情| 日韩欧美在线不卡 | 国产精品九九久久久久久久 | 久久久毛片 | 久久五月婷婷综合 | 国内成人综合 | 亚洲欧美色婷婷 | 五月综合在线观看 | 国产黄色资源 | 日韩免费看视频 | 少妇性色午夜淫片aaaze | 黄色影院在线免费观看 | 日韩欧美高清一区二区三区 | 欧美在线一级片 | 黄色特级片 | 五月婷婷激情综合 | 中日韩在线视频 | 国产精品网址在线观看 | 亚洲另类人人澡 | 欧美性脚交 | 久久久久亚洲精品中文字幕 | 日韩r级在线| 麻豆免费看片 | 日韩视频一区二区三区在线播放免费观看 | 九九热精品在线 | 超碰97在线资源站 | 亚洲三级黄色 | 久艹视频免费观看 | 免费在线观看视频a | 中文字幕资源站 | 免费观看av | 久久精品视频播放 | 日韩黄色在线观看 | 黄色小说视频网站 | 五月天九九 | 2024国产精品视频 | 久久久久久久久毛片精品 | 96国产在线| 最近2019好看的中文字幕免费 | 久久伊人精品一区二区三区 | 国产视频久久久久 | 国产美女视频网站 | 狠狠躁日日躁狂躁夜夜躁 | 久久成人亚洲欧美电影 | 欧美日韩高清不卡 | 999在线视频| 在线播放日韩av | 免费成人在线电影 | 精品亚洲视频在线观看 | 中午字幕在线 | 一级免费黄色 | 中文字幕av专区 | 六月丁香在线视频 | 国产精品入口传媒 | 日韩高清在线一区二区三区 | 亚洲六月丁香色婷婷综合久久 | 激情av一区二区 | 日韩中文字幕免费看 | 日日干美女 | www.com久久久| 精品久久久久久久久久久久久久久久久久 | 亚洲午夜剧场 | 成人免费观看在线视频 | 国产婷婷久久 | 激情欧美一区二区三区 | 日韩av电影网站在线观看 | 人人添人人澡人人澡人人人爽 | 最新国产在线观看 | 午夜精品电影一区二区在线 | 国产大陆亚洲精品国产 | 91亚洲综合 | 精品视频免费久久久看 | 在线免费视频 你懂得 | 人人爽人人爽人人片 | 黄色一级大片在线免费看产 | 91精品综合在线观看 | 在线播放亚洲激情 | 中文字幕av免费 | 日韩中文字幕免费视频 | 色婷婷综合成人av | 亚洲伦理电影在线 | 美女视频黄,久久 | 久久一区国产 | 国产精品欧美久久久久天天影视 | 久一久久 | 一区二区精品视频 | 手机av资源 | 免费黄色在线网址 | 夜夜爽夜夜操 | 丰满少妇高潮在线观看 | 国产一级视频在线观看 | 麻豆一区在线观看 | 国产精品18久久久久vr手机版特色 | 久久天堂精品视频 |