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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

af_netlink_2、netlink简介

發布時間:2024/7/5 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 af_netlink_2、netlink简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Netlink 是一種特殊的 socket,它是 Linux 所特有的,類似于 BSD 中的AF_ROUTE 但又遠比它的功能強大,目前在最新的 Linux 內核(2.6.14)中使用netlink 進行應用與內核通信的應用很多,包括:路由 daemon(NETLINK_ROUTE),1-wire 子系統(NETLINK_W1),用戶態 socket 協議(NETLINK_USERSOCK),防火墻(NETLINK_FIREWALL),socket 監視(NETLINK_INET_DIAG),netfilter 日志(NETLINK_NFLOG),ipsec 安全策略(NETLINK_XFRM),SELinux 事件通知(NETLINK_SELINUX),iSCSI 子系統(NETLINK_ISCSI),進程審計(NETLINK_AUDIT),轉發信息表查詢(NETLINK_FIB_LOOKUP),netlink connector(NETLINK_CONNECTOR),netfilter 子系統(NETLINK_NETFILTER),IPv6 防火墻(NETLINK_IP6_FW),DECnet 路由信息(NETLINK_DNRTMSG),內核事件向用戶態通知(NETLINK_KOBJECT_UEVENT),通用 netlink(NETLINK_GENERIC)。

Netlink 是一種在內核與用戶應用間進行雙向數據傳輸的非常好的方式,用戶態應用使用標準的 socket API 就可以使用 netlink 提供的強大功能,內核態需要使用專門的內核 API 來使用 netlink。

Netlink 相對于系統調用,ioctl 以及 /proc 文件系統而言具有以下優點:

1,為了使用 netlink,用戶僅需要在 include/linux/netlink.h 中增加一個新類型的 netlink 協議定義即可, 如 #define NETLINK_MYTEST 17 然后,內核和用戶態應用就可以立即通過 socket API 使用該 netlink 協議類型進行數據交換。但系統調用需要增加新的系統調用,ioctl 則需要增加設備或文件, 那需要不少代碼,proc 文件系統則需要在 /proc 下添加新的文件或目錄,那將使本來就混亂的 /proc 更加混亂。

問題:

增加了netlink協議后,需要重新編譯內核嗎?還是僅僅修改了頭文件netlink.h就可以了呢?在后期的實驗中,需要對這一問題進行驗證。

2. netlink是一種異步通信機制,在內核與用戶態應用之間傳遞的消息保存在socket緩存隊列中,發送消息只是把消息保存在接收者的socket的接收隊列,而不需要等待接收者收到消息,但系統調用與 ioctl 則是同步通信機制,如果傳遞的數據太長,將影響調度粒度。

異步通信與同步通信的區別:看接受者的響應方式。異步通訊是不需要接受者立即響應的

3.使用 netlink 的內核部分可以采用模塊的方式實現,使用 netlink 的應用部分和內核部分沒有編譯時依賴,但系統調用就有依賴,而且新的系統調用的實現必須靜態地連接到內核中,它無法在模塊中實現,使用新系統調用的應用在編譯時需要依賴內核。

可以像編寫驅動模塊一樣的實現方式來實現netlink部分。

4.netlink 支持多播,內核模塊或應用可以把消息多播給一個netlink組,屬于該neilink 組的任何內核模塊或應用都能接收到該消息,內核事件向用戶態的通知機制就使用了這一特性,任何對內核事件感興趣的應用都能收到該子系統發送的內核事件,在后面的文章中將介紹這一機制的使用。

5.內核可以使用 netlink 首先發起會話,但系統調用和 ioctl 只能由用戶應用發起調用。

內核主動向用戶應用發起數據

6.netlink 使用標準的 socket API,因此很容易使用,但系統調用和 ioctl則需要專門的培訓才能使用。

用戶態使用 netlink

用戶態應用使用標準的socket APIs, socket(), bind(),sendmsg(), recvmsg() 和 close() 就能很容易地使用 netlink socket,查詢手冊頁可以了解這些函數的使用細節,本文只是講解使用 netlink 的用戶應該如何使用這些函數。注意,使用 netlink 的應用必須包含頭文件 linux/netlink.h。當然 socket 需要的頭文件也必不可少,sys/socket.h。

為了創建一個 netlink socket,用戶需要使用如下參數調用 socket():

socket(AF_NETLINK, SOCK_RAW, netlink_type)

第一個參數必須是 AF_NETLINK 或 PF_NETLINK,在 Linux 中,它們倆實際為一個東西,它表示要使用netlink,第二個參數必須是SOCK_RAW或SOCK_DGRAM, 第三個參數指定netlink協議類型,如前面講的用戶自定義協議類型NETLINK_MYTEST, NETLINK_GENERIC是一個通用的協議類型,它是專門為用戶使用的,因此,用戶可以直接使用它,而不必再添加新的協議類型。內核預定義的協議類型有:

#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協議類型,可以有多達 32多播組,每一個多播組用一個位表示,netlink 的多播特性使得發送消息給同一個組僅需要一次系統調用,因而對于需要多撥消息的應用而言,大大地降低了系統調用的次數。

函數 bind() 用于把一個打開的 netlink socket 與 netlink 源 socket 地址綁定在一起。

補充一下bind()函數的意義:

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

When a socket is created with socket(2), it exists in a name space (address family) but has no address assigned to

it.? bind() assigns the address specified to by addr to the socket referred to? by? the? file? descriptor? sockfd.

addrlen? specifies the size, in bytes, of the address structure pointed to by addr.? Traditionally, this operation

is called “assigning a name to a socket”.

It is normally necessary to assign a local address using bind() before a SOCK_STREAM socket? may? receive? connec‐

tions (see accept(2)).

可見bind()的另一個意思是為所創建的socket分配一個名字(相應與地址的名字)

netlink socket 的地址結構如下:

struct sockaddr_nl

{

sa_family_t nl_family;

unsigned short nl_pad;

__u32 nl_pid;

__u32 nl_groups;

};

字段 nl_family 必須設置為 AF_NETLINK 或著 PF_NETLINK,

字段nl_pad 當前沒有使用,因此要總是設置為 0,

字段nl_pid 為接收或發送消息的進程的 ID,如果希望內核處理消息或多播消息,就把該字段設置為 0,否則設置為處理消息的進程 ID。

字段 nl_groups 用于指定多播組,bind 函數用于把調用進程加入到該字段指定的多播組,如果設置為 0,表示調用者不加入任何多播組。

傳遞給 bind 函數的地址的 nl_pid 字段應當設置為本進程的進程 ID,這相當于 netlink socket 的本地地址。但是,對于一個進程的多個線程使用 netlink socket 的情況,字段 nl_pid 則可以設置為其它的值,如:

pthread_self() << 16 | getpid();

因此字段 nl_pid 實際上未必是進程 ID,它只是用于區分不同的接收者或發送者的一個標識,用戶可以根據自己需要設置該字段。函數 bind 的調用方式如下:

bind(fd, (struct sockaddr*)&nladdr, sizeof(struct sockaddr_nl));

fd為前面的 socket 調用返回的文件描述符,參數 nladdr 為 struct sockaddr_nl 類型的地址。 為了發送一個 netlink 消息給內核或其他用戶態應用,需要填充目標 netlink socket 地址 ,此時,字段 nl_pid 和 nl_groups 分別表示接收消息者的進程 ID 與多播組。如果字段 nl_pid 設置為 0,表示消息接收者為內核或多播組,如果 nl_groups為 0,表示該消息為單播消息,否則表示多播消息。 使用函數 sendmsg 發送 netlink 消息時還需要引用結構 struct msghdr、struct nlmsghdr 和 struct iovec,

這里有兩個消息頭

結構 struct msghdr 需如下設置:

struct msghdr msg;

memset(&msg, 0, sizeof(msg));

msg.msg_name = (void *)&(nladdr);

msg.msg_namelen = sizeof(nladdr);

其中 nladdr 為消息接收者的 netlink 地址。

struct nlmsghdr 為 netlink socket 自己的消息頭,這用于多路復用和多路分解 netlink 定義的所有協議類型以及其它一些控制,netlink 的內核實現將利用這個消息頭來多路復用和多路分解已經其它的一些控制,因此它也被稱為netlink 控制塊。因此,應用在發送 netlink 消息時必須提供該消息頭。

內核會利用nlmsghdr頭路由netlink消息包,

struct nlmsghdr

{

__u32 nlmsg_len; /* Length of message */

__u16 nlmsg_type; /* Message type*/

__u16 nlmsg_flags; /* Additional flags */

__u32 nlmsg_seq; /* Sequence number */

__u32 nlmsg_pid; /* Sending process PID */

};

字段 nlmsg_len 指定消息的總長度,包括緊跟該結構的數據部分長度以及該結構的大小,

字段 nlmsg_type 用于應用內部定義消息的類型,它對 netlink 內核實現是透明的,因此大部分情況下設置為 0,

字段 nlmsg_flags 用于設置消息標志,可用的標志包括:

/* Flags values */

#define NLM_F_REQUEST 1 /* It is request message. */

#define NLM_F_MULTI 2 /* Multipart message, terminated by NLMSG_DONE */

#define NLM_F_ACK 4 /* Reply with ack, with zero or error code */

#define NLM_F_ECHO 8 /* Echo this request */

/* Modifiers to GET request */

#define NLM_F_ROOT 0x100 /* specify tree root */

#define NLM_F_MATCH 0x200 /* return all matching */

#define NLM_F_ATOMIC 0x400 /* atomic GET */

#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH)

/* Modifiers to NEW request */

#define NLM_F_REPLACE 0x100 /* Override existing */

#define NLM_F_EXCL 0x200 /* Do not touch, if it exists */

#define NLM_F_CREATE 0x400 /* Create, if it does not exist */

#define NLM_F_APPEND 0x800 /* Add to end of list */

標志NLM_F_REQUEST用于表示消息是一個請求,所有應用首先發起的消息都應設置該標志。

標志NLM_F_MULTI 用于指示該消息是一個多部分消息的一部分,后續的消息可以通過宏NLMSG_NEXT來獲得。

宏NLM_F_ACK表示該消息是前一個請求消息的響應,順序號與進程ID可以把請求與響應關聯起來。

標志NLM_F_ECHO表示該消息是相關的一個包的回傳。

標志NLM_F_ROOT 被許多 netlink 協議的各種數據獲取操作使用,該標志指示被請求的數據表應當整體返回用戶應用,而不是一個條目一個條目地返回。有該標志的請求通常導致響應消息設置NLM_F_MULTI標志。注意,當設置了該標志時,請求是協議特定的,因此,需要在字段 nlmsg_type 中指定協議類型。

標志 NLM_F_MATCH 表示該協議特定的請求只需要一個數據子集,數據子集由指定的協議特定的過濾器來匹配。

標志 NLM_F_ATOMIC 指示請求返回的數據應當原子地收集,這預防數據在獲取期間被修改。

標志 NLM_F_DUMP 未實現。

標志 NLM_F_REPLACE 用于取代在數據表中的現有條目。

標志 NLM_F_EXCL_ 用于和 CREATE 和 APPEND 配合使用,如果條目已經存在,將失敗。

標志 NLM_F_CREATE 指示應當在指定的表中創建一個條目。

標志 NLM_F_APPEND 指示在表末尾添加新的條目。

內核需要讀取和修改這些標志,對于一般的使用,用戶把它設置為 0 就可以,只是一些高級應用(如 netfilter 和路由 daemon 需要它進行一些復雜的操作),

字段 nlmsg_seq 和 nlmsg_pid 用于應用追蹤消息,前者表示順序號,后者為消息來源進程 ID。下面是一個示例:

#define MAX_MSGSIZE 1024

char buffer[] = "An example message";

struct nlmsghdr nlhdr;

nlhdr = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_MSGSIZE));

strcpy(NLMSG_DATA(nlhdr),buffer);

nlhdr->nlmsg_len = NLMSG_LENGTH(strlen(buffer));

nlhdr->nlmsg_pid = getpid(); /* self pid */

nlhdr->nlmsg_flags = 0;

結構 struct iovec 用于把多個消息通過一次系統調用來發送,下面是該結構使用示例:

struct iovec iov;

iov.iov_base = (void *)nlhdr;

iov.iov_len = nlh->nlmsg_len;

msg.msg_iov = &iov;

msg.msg_iovlen = 1;

在完成以上步驟后,消息就可以通過下面語句直接發送:

sendmsg(fd, &msg, 0);

應用接收消息時需要首先分配一個足夠大的緩存來保存消息頭以及消息的數據部分,然后填充消息頭,添完后就可以直接調用函數 recvmsg() 來接收。

#define MAX_NL_MSG_LEN 1024

struct sockaddr_nl nladdr;

struct msghdr msg;

struct iovec iov;

struct nlmsghdr * nlhdr;

nlhdr = (struct nlmsghdr *)malloc(MAX_NL_MSG_LEN);

iov.iov_base = (void *)nlhdr;

iov.iov_len = MAX_NL_MSG_LEN;

msg.msg_name = (void *)&(nladdr);

msg.msg_namelen = sizeof(nladdr);

msg.msg_iov = &iov;

msg.msg_iovlen = 1;

recvmsg(fd, &msg, 0);

注意:fd為socket調用打開的netlink socket描述符。

在消息接收后,nlhdr指向接收到的消息的消息頭,nladdr保存了接收到的消息的目標地址,宏NLMSG_DATA(nlhdr)返回指向消息的數據部分的指針。

在linux/netlink.h中定義了一些方便對消息進行處理的宏,這些宏包括:

#define NLMSG_ALIGNTO 4

#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )

宏NLMSG_ALIGN(len)用于得到不小于len且字節對齊的最小數值。

#define NLMSG_LENGTH(len) ((len)+

NLMSG_ALIGN(sizeof(struct nlmsghdr)))

宏NLMSG_LENGTH(len)用于計算數據部分長度為len時實際的消息長度。它一般用于分配消息緩存。

#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))

宏NLMSG_SPACE(len)返回不小于NLMSG_LENGTH(len)且字節對齊的最小數值,它也用于分配消息緩存。

#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))

宏NLMSG_DATA(nlh)用于取得消息的數據部分的首地址,設置和讀取消息數據部分時需要使用該宏。

#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \

(struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))

宏NLMSG_NEXT(nlh,len)用于得到下一個消息的首地址,同時len也減少為剩余消息的總長度,該宏一般在一個消息被分成幾個部分發送或接收時使用。

#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \

(nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \

(nlh)->nlmsg_len <= (len))

宏NLMSG_OK(nlh,len)用于判斷消息是否有len這么長。

#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))

宏NLMSG_PAYLOAD(nlh,len)用于返回payload的長度。

函數close用于關閉打開的netlink socket。

在發送的時候只使用了nlmsghdr消息頭,但是在接收的時候使用了struct msghdr msg;

1 #include

2 #include

3 #include

4 #include

5 #include

6

7 #define NETLINK_TEST 17

8 #define MSG_LEN 100

9

10 structmsg_to_kernel11 {12 structnlmsghdr hdr;13 chardata[MSG_LEN];14 };15 structu_packet_info16 {17 structnlmsghdr hdr;18 charmsg[MSG_LEN];19 };20

21 int main(int argc, char*argv[])22 {23 char *data = "This message is from eric's space";24 //初始化

25 structsockaddr_nl local;26 structsockaddr_nl kpeer;27 int skfd, ret, kpeerlen = sizeof(structsockaddr_nl);28 struct nlmsghdr *message;29 structu_packet_info info;30 char *retval;31 message = (struct nlmsghdr *)malloc(1);32

33 skfd =socket(PF_NETLINK, SOCK_RAW, NETLINK_TEST);34 if(skfd < 0){35 printf("can not create a netlink socket\n");36 return -1;37 }38 memset(&local, 0, sizeof(local));39 local.nl_family =AF_NETLINK;40 local.nl_pid =getpid();41 local.nl_groups = 0;42 if(bind(skfd, (struct sockaddr *)&local, sizeof(local)) != 0){43 printf("bind() error\n");44 return -1;45 }46 memset(&kpeer, 0, sizeof(kpeer));47 kpeer.nl_family =AF_NETLINK;48 kpeer.nl_pid = 0;49 kpeer.nl_groups = 0;50

51 memset(message, '\0', sizeof(structnlmsghdr));52 message->nlmsg_len =NLMSG_SPACE(strlen(data));53 message->nlmsg_flags = 0;54 message->nlmsg_type = 0;55 message->nlmsg_seq = 0;56 message->nlmsg_pid =local.nl_pid;57

58 retval =memcpy(NLMSG_DATA(message), data, strlen(data));59

60 printf("message sendto kernel are:%s, len:%d\n", (char *)NLMSG_DATA(message), message->nlmsg_len);61 ret = sendto(skfd, message, message->nlmsg_len, 0,(struct sockaddr *)&kpeer, sizeof(kpeer));62 if(!ret){63 perror("send pid:");64 exit(-1);65 }66

67 //接受內核態確認信息

68 ret = recvfrom(skfd, &info, sizeof(struct u_packet_info),0, (struct sockaddr*)&kpeer, &kpeerlen);69 if(!ret){70 perror("recv form kerner:");71 exit(-1);72 }73

74 printf("message receive from kernel:%s\n",(char *)info.msg);75 //內核和用戶進行通信

76

77 close(skfd);78 return 0;79 }

以下是內核中關于netlink的具體實現過程:

1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7

8 #define NETLINK_TEST 17

9 struct{10 __u32 pid;11 }user_process;12

13 static struct sock *netlinkfd =NULL;14

15 int send_to_user(char *info) //發送到用戶空間

16 {17 intsize;18 struct sk_buff *skb;19 unsigned char *old_tail;20 struct nlmsghdr *nlh; //報文頭

21

22 intretval;23

24 size = NLMSG_SPACE(strlen(info)); //報文大小

25 skb = alloc_skb(size, GFP_ATOMIC); //分配一個新的套接字緩存,使用GFP_ATOMIC標志進程不>會被置為睡眠26

27 //初始化一個netlink消息首部

28 nlh = nlmsg_put(skb, 0, 0, 0, NLMSG_SPACE(strlen(info))-sizeof(struct nlmsghdr), 0);29 old_tail = skb->tail;30 memcpy(NLMSG_DATA(nlh), info, strlen(info)); //填充數據區

31 nlh->nlmsg_len = skb->tail - old_tail; //設置消息長度32

33 //設置控制字段

34 NETLINK_CB(skb).pid = 0;35 NETLINK_CB(skb).dst_group = 0;36

37 printk(KERN_DEBUG "[kernel space] skb->data:%s\n", (char *)NLMSG_DATA((struct nlmsghdr *)skb->data));38

39 //發送數據

40 retval =netlink_unicast(netlinkfd, skb, user_process.pid, MSG_DONTWAIT);41 printk(KERN_DEBUG "[kernel space] netlink_unicast return: %d\n", retval);42 return 0;43 }44

45 void kernel_receive(struct sk_buff *__skb) //內核從用戶空間接收數據

46 {47 struct sk_buff *skb;48 struct nlmsghdr *nlh =NULL;49

50 char *data = "This is eric's test message from kernel";51

52 printk(KERN_DEBUG "[kernel space] begin kernel_receive\n");53 skb =skb_get(__skb);54

55 if(skb->len >= sizeof(structnlmsghdr)){56 nlh = (struct nlmsghdr *)skb->data;57 if((nlh->nlmsg_len >= sizeof(structnlmsghdr))58 && (__skb->len >= nlh->nlmsg_len)){59 user_process.pid = nlh->nlmsg_pid;60 printk(KERN_DEBUG "[kernel space] data receive from user are:%s\n", (char *)NLMSG_DATA(nlh));61 printk(KERN_DEBUG "[kernel space] user_pid:%d\n", user_process.pid);62 send_to_user(data);63 }64 }else{65 printk(KERN_DEBUG "[kernel space] data receive from user are:%s\n",(char *)NLMSG_DATA(nlmsg_hdr(__skb)));66 send_to_user(data);67 }68

69 kfree_skb(skb);70 }71

72 int __init test_netlink_init(void)73 {74

75 netlinkfd = netlink_kernel_create(&init_net, NETLINK_TEST, 0, kernel_receive, NULL, THIS_MODULE);76 if(!netlinkfd){77 printk(KERN_ERR "can not create a netlink socket\n");78 return -1;79 }80 return 0;81 }82

83 void __exit test_netlink_exit(void)84 {85 sock_release(netlinkfd->sk_socket);86 printk(KERN_DEBUG "test_netlink_exit!!\n");87 }88

89 module_init(test_netlink_init);90 module_exit(test_netlink_exit);91 MODULE_LICENSE("GPL");92 MODULE_AUTHOR("eric.hu");

netlink內核API

netlink的內核實現在.c文件net/core/af_netlink.c中,內核模塊要想使用netlink,也必須包含頭文件linux/netlink.h。內核使用netlink需要專門的API,這完全不同于用戶態應用對netlink的使用。如果用戶需要增加新的netlink協議類型,必須通過修改linux/netlink.h來實現,當然,目前的netlink實現已經包含了一個通用的協議類型NETLINK_GENERIC以方便用戶使用,用戶可以直接使用它而不必增加新的協議類型。前面講到,為了增加新的netlink協議類型,用戶僅需增加如下定義到linux/netlink.h就可以:

#define NETLINK_MYTEST 17

只要增加這個定義之后,用戶就可以在內核的任何地方引用該協議。

在內核中,為了創建一個netlink socket用戶需要調用如下函數:

struct sock *netlink_kernel_create(int unit, void (*input)(struct sock *sk, int len));

參數unit表示netlink協議類型,如NETLINK_MYTEST,

參數input則為內核模塊定義的netlink消息處理函數,當有消息到達這個netlink socket時,該input函數指針就會被引用。函數指針input的參數sk實際上就是函數netlink_kernel_create返回的struct sock指針,sock實際是socket的一個內核表示數據結構,用戶態應用創建的socket在內核中也會有一個struct sock結構來表示。下面是一個input函數的示例:

void input (struct sock *sk, int len)

{

struct sk_buff *skb;

struct nlmsghdr *nlh = NULL;

u8 *data = NULL;

while ((skb = skb_dequeue(&sk->receive_queue))

!= NULL) {

/* process netlink message pointed by skb->data */

nlh = (struct nlmsghdr *)skb->data;

data = NLMSG_DATA(nlh);

/* process netlink message with header pointed by

* nlh and data pointed by data

*/

}

}

函數input()會在發送進程執行sendmsg()時被調用,這樣處理消息比較及時,但是,如果消息特別長時,這樣處理將增加系統調用sendmsg()的執行時間,對于這種情況,可以定義一個內核線程專門負責消息接收,而函數input的工作只是喚醒該內核線程,這樣sendmsg將很快返回。

函數skb = skb_dequeue(&sk->receive_queue)用于取得socket sk的接收隊列上的消息,返回為一個struct sk_buff的結構,skb->data指向實際的netlink消息。

函數skb_recv_datagram(nl_sk)也用于在netlink socket nl_sk上接收消息,與skb_dequeue的不同指出是,如果socket的接收隊列上沒有消息,它將導致調用進程睡眠在等待隊列nl_sk->sk_sleep,因此它必須在進程上下文使用,剛才講的內核線程就可以采用這種方式來接收消息。

下面的函數input就是這種使用的示例:

void input (struct sock *sk, int len)

{

wake_up_interruptible(sk->sk_sleep);

}

當內核中發送netlink消息時,也需要設置目標地址與源地址,而且內核中消息是通過struct sk_buff來管理的, linux/netlink.h中定義了一個宏:

#define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb))

來方便消息的地址設置。下面是一個消息地址設置的例子:

NETLINK_CB(skb).pid = 0;

NETLINK_CB(skb).dst_pid = 0;

NETLINK_CB(skb).dst_group = 1;

字段pid表示消息發送者進程ID,也即源地址,對于內核,它為 0, dst_pid 表示消息接收者進程 ID,也即目標地址,如果目標為組或內核,它設置為 0,否則 dst_group 表示目標組地址,如果它目標為某一進程或內核,dst_group 應當設置為 0。

在內核中,模塊調用函數 netlink_unicast 來發送單播消息:

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

參數sk為函數netlink_kernel_create()返回的socket,參數skb存放消息,它的data字段指向要發送的netlink消息結構,而skb的控制塊保存了消息的地址信息,前面的宏NETLINK_CB(skb)就用于方便設置該控制塊, 參數pid為接收消息進程的pid,參數nonblock表示該函數是否為非阻塞,如果為1,該函數將在沒有接收緩存可利用時立即返回,而如果為0,該函數在沒有接收緩存可利用時睡眠。

內核模塊或子系統也可以使用函數netlink_broadcast來發送廣播消息:

void netlink_broadcast(struct sock *sk, struct sk_buff *skb,

u32 pid, u32 group, int allocation);

前面的三個參數與netlink_unicast相同,參數group為接收消息的多播組,該參數的每一個代表一個多播組,因此如果發送給多個多播組,就把該參數設置為多個多播組組ID的位或。參數allocation為內核內存分配類型,一般地為GFP_ATOMIC或GFP_KERNEL,GFP_ATOMIC用于原子的上下文(即不可以睡眠),而GFP_KERNEL用于非原子上下文。

在內核中使用函數sock_release來釋放函數netlink_kernel_create()創建的netlink socket:

void sock_release(struct socket * sock);

注意函數netlink_kernel_create()返回的類型為struct sock,因此函數sock_release應該這種調用:

sock_release(sk->sk_socket);

sk為函數netlink_kernel_create()的返回值。

在源代碼包中給出了一個使用 netlink 的示例,它包括一個內核模塊 netlink-exam-kern.c 和兩個應用程序 netlink-exam-user-recv.c, netlink-exam-user-send.c。內核模塊必須先插入到內核,然后在一個終端上運行用戶態接收程序,在另一個終端上運行用戶態發送程序,發送程序讀取參數指定的文本文件并把它作為 netlink 消息的內容發送給內核模塊,內核模塊接受該消息保存到內核緩存中,它也通過proc接口出口到 procfs,因此用戶也能夠通過 /proc/netlink_exam_buffer 看到全部的內容,同時內核也把該消息發送給用戶態接收程序,用戶態接收程序將把接收到的內容輸出到屏幕上。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的af_netlink_2、netlink简介的全部內容,希望文章能夠幫你解決所遇到的問題。

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

国产麻豆果冻传媒在线观看 | 中文字幕在线一二 | 久久久久久久久艹 | 久久亚洲综合色 | 国产黑丝袜在线 | 国产成人精品av在线观 | 欧美大码xxxx | 色视频在线观看 | 久久在线免费 | 手机av电影在线观看 | 天天操狠狠干 | 久久少妇免费视频 | 亚洲v欧美v国产v在线观看 | 欧美日韩精品电影 | 五月天堂色 | 久久精品女人毛片国产 | 五月天综合色激情 | 国产视频日韩 | 天天综合网国产 | 国产美女主播精品一区二区三区 | 午夜a区| 国产一区在线看 | 国产精品久久久区三区天天噜 | 亚洲一区天堂 | 国产不卡在线看 | 国产精品久久久久久久久久久久冷 | 欧美综合国产 | 欧美一级小视频 | 婷婷中文字幕在线观看 | 日韩在线网址 | 久久久久久久免费 | 91av视频网站 | 天天色官网 | av网站在线观看播放 | av片一区二区 | 91av电影| 六月丁香激情综合 | 国产成人av在线影院 | 97综合在线 | 人人爽人人爽人人片av | 国产精品福利午夜在线观看 | 成人黄色在线 | 亚洲精品男人的天堂 | 国产精品免费一区二区三区在线观看 | www.888av| 黄色资源网站 | 97香蕉久久超级碰碰高清版 | 91精品国产91久久久久 | 国产91粉嫩白浆在线观看 | 黄色a在线 | 日韩中文字幕在线不卡 | 午夜少妇| 黄色av一区二区三区 | 免费情趣视频 | 韩国av电影网| 奇米影视999| 91.dizhi永久地址最新 | 国产精品区免费视频 | 中文字幕xxxx| 青青草久草在线 | 99热九九这里只有精品10 | 午夜精品一区二区三区视频免费看 | 456免费视频 | 精品久久久久久国产91 | 国产亚洲午夜高清国产拍精品 | 一区二区三区中文字幕在线观看 | 日韩理论视频 | 久久精品视频日本 | 福利视频网站 | 精品一区二区精品 | 亚洲精品在线观看的 | 欧美色图亚洲图片 | 国产成人久久av | 九九热久久免费视频 | 日韩在线观看视频一区二区三区 | 欧美日韩视频在线播放 | 美女视频黄在线观看 | 免费视频黄色 | 免费日韩 精品中文字幕视频在线 | 国产福利免费在线观看 | 久久综合九色综合欧美狠狠 | 国产精品片 | 欧美一级免费黄色片 | 日韩精品免费一区二区在线观看 | 天天在线操 | 日韩婷婷 | 国产二区视频在线观看 | 99免费在线视频 | 一区二区三区视频网站 | 国产在线观看免费av | www中文在线 | 久久精品视频一 | 日韩电影一区二区在线观看 | 婷婷五天天在线视频 | 国产成人亚洲在线电影 | 久久成人欧美 | 日韩高清在线一区二区三区 | 黄色av电影在线观看 | 久久99九九99精品 | 777奇米四色 | 成 人 黄 色 视频播放1 | 349k.cc看片app | 青青草国产免费 | 91人人视频在线观看 | 日韩欧美在线视频一区二区 | 伊人色综合网 | 天天操天天干天天摸 | 欧美激情综合网 | 日韩精品视频网站 | 欧美日韩免费观看一区=区三区 | 免费视频 三区 | 91视频麻豆 | 国产视频2021| 欧洲亚洲激情 | 国产一区二区免费在线观看 | 国产色影院 | 在线观看亚洲免费视频 | 亚洲人成人在线 | 一级片免费观看 | 五月激情久久久 | 狠狠色狠狠综合久久 | 一区二区三区中文字幕在线观看 | 亚洲精区二区三区四区麻豆 | 成人免费电影 | 免费成人在线观看视频 | 久久爽久久爽久久av东京爽 | 九九热av | 国产69久久| 久久精品视频4 | 日本一区二区三区视频在线播放 | 色网站在线免费 | 日韩有码第一页 | 免费看三级黄色片 | 亚洲国产精品小视频 | 超碰精品在线观看 | 鲁一鲁影院 | 精品产品国产在线不卡 | 国产一卡在线 | 国产做a爱一级久久 | 中文电影网 | 亚洲国产精品一区二区尤物区 | 国产一区在线观看免费 | 九草视频在线观看 | 精品久久久久久久 | 天天操福利视频 | 中文字幕精品一区二区三区电影 | 一本一本久久a久久精品综合小说 | 亚洲精品国产综合99久久夜夜嗨 | 在线 视频 亚洲 | 日韩精品中文字幕一区二区 | 欧美日韩在线视频一区 | 中文字幕字幕中文 | 亚洲黄色高清 | 少妇资源站 | 超碰在线天天 | 成年人在线播放视频 | 亚洲欧美日本一区二区三区 | 91热视频在线观看 | 国产精品美女毛片真酒店 | 日韩在线一区二区免费 | 99爱这里只有精品 | 欧美在线你懂的 | 久久精品亚洲一区二区三区观看模式 | 欧美日韩精品久久久 | 福利视频导航网址 | 日日操网| 韩国av一区二区三区在线观看 | 国产精品夜夜夜一区二区三区尤 | 国产精品久久久久久久久久久久午夜 | 国产99精品在线观看 | 人人要人人澡人人爽人人dvd | 国产精品对白一区二区三区 | 五月激情亚洲 | 亚洲小视频在线 | 黄色av高清 | 99久久久国产精品 | 亚洲天堂社区 | 日本mv大片欧洲mv大片 | av在线播放观看 | 91成人久久 | 亚洲精品在线视频 | 亚洲综合精品视频 | 99久久久久久国产精品 | 国产福利一区在线观看 | 亚洲成av人片在线观看无 | 欧美精品国产综合久久 | 91精品视频免费看 | 深夜免费小视频 | 久久久久麻豆v国产 | 国产中文字幕大全 | 色婷婷综合五月 | 91麻豆精品国产91久久久更新时间 | 国产午夜精品一区 | 国产精品成 | 狠狠狠狠干 | zzijzzij亚洲日本少妇熟睡 | 操操爽 | 99性视频 | 天天艹天天干天天 | 久久国产经典视频 | 欧美成年人在线视频 | 99精品免费网 | 夜夜夜| 在线观看中文av | 在线免费性生活片 | 91av99| 亚洲 中文 欧美 日韩vr 在线 | 91手机在线看片 | 成人欧美一区二区三区在线观看 | 亚色视频在线观看 | 超碰国产97 | 2018好看的中文在线观看 | 亚洲最新av在线网站 | 怡春院av | 五月丁婷婷 | 欧美极品久久 | 99在线热播精品免费 | 国产一级精品在线观看 | 在线观看小视频 | 天天干,天天草 | 久久免费视频99 | 欧美色图一区 | 色综久久 | 欧美精品天堂 | 黄色成人影院 | 免费在线电影网址大全 | 深爱婷婷激情 | 亚洲精品国产精品乱码不99热 | 在线探花| 91久久国产自产拍夜夜嗨 | av官网| av电影中文字幕在线观看 | 欧美另类交人妖 | 69久久99精品久久久久婷婷 | 久久av中文字幕片 | 亚洲黄网站 | 国产91av视频在线观看 | 国产精品亚洲精品 | 久久伊人色综合 | 国产不卡在线看 | 国产小视频在线播放 | 午夜视频99 | 日韩精品免费一区 | 91九色在线观看 | 日日夜夜天天人人 | 麻豆免费视频网站 | 精品国产成人av | 中文字幕免费观看全部电影 | 色综合天天在线 | 最近高清中文字幕在线国语5 | 在线久热| 国产精品永久免费在线 | 一区三区在线欧 | 国产免费成人 | 国产精品综合久久久久久 | 久草香蕉在线视频 | 国产在线精品播放 | www国产亚洲精品久久麻豆 | 天天色天天射天天综合网 | 99久久久久久久久 | 国产99久久久国产精品成人免费 | 人人舔人人射 | 日韩电影久久 | 色婷婷88av视频一二三区 | 国产专区精品视频 | 四虎影视国产精品免费久久 | 久久 精品一区 | 免费午夜视频在线观看 | 在线观看mv的中文字幕网站 | 国产免费视频在线 | 欧美激情精品久久久久久免费 | 国产又粗又猛又黄又爽 | 日本在线成人 | 欧美视频日韩 | 四虎精品成人免费网站 | 久久精品国亚洲 | 欧美日韩国产mv | 国产97视频| 99精品国产一区二区三区不卡 | 五月婷婷中文字幕 | 国产免费又爽又刺激在线观看 | 奇米影视8888 | 天天操天天爱天天干 | 97香蕉超级碰碰久久免费软件 | 国产亚洲精品久久久久久大师 | 久久99国产综合精品 | a级国产乱理论片在线观看 伊人宗合网 | 中文字幕精品三区 | 久久毛片视频 | 国产一区二区高清视频 | 97超碰在线久草超碰在线观看 | 久久免费电影 | 国产成人综合在线观看 | 69精品人人人人 | 日韩免费在线播放 | 99久久综合狠狠综合久久 | 成人午夜精品 | 麻豆传媒视频观看 | 99视频免费观看 | 人人舔人人射 | 九九色综合 | 中文字幕在线网 | 91mv.cool在线观看 | 精品亚洲一区二区 | 国产综合在线视频 | 中文字幕在线免费观看 | 国产精品入口66mio女同 | 亚洲激情国产精品 | 五月综合色婷婷 | 丁香色综合 | 亚洲男女精品 | 欧美在线91 | 中文字幕你懂的 | av先锋中文字幕 | 国产精品麻豆果冻传媒在线播放 | 99999精品| 日本激情动作片免费看 | 婷婷色在线| 日韩免费一区二区在线观看 | 国产 精品 资源 | 韩日色视频 | 娇妻呻吟一区二区三区 | 免费在线观看毛片网站 | 人人添人人澡人人澡人人人爽 | 精品中文字幕在线观看 | 精品一区二区在线看 | 久久久精品一区二区 | 亚洲乱码中文字幕综合 | 国产综合激情 | 久久久久久国产精品 | 国产又粗又猛又色 | 人人干在线观看 | 丁香六月av | 日本一区二区三区免费看 | 久久论理 | 久久综合九色综合网站 | www.久久免费视频 | 97色在线视频 | 91免费观看 | 特级毛片在线免费观看 | 97成人精品视频在线播放 | 中文日韩在线视频 | av免费观看高清 | 麻豆免费在线视频 | 人人澡超碰碰97碰碰碰软件 | 国产一区在线观看免费 | 人人插人人爱 | 97视频在线看 | 天天干天天插 | 久久的色 | 91精品视频免费在线观看 | 99中文在线 | 久久久久福利视频 | 97在线免费观看视频 | 狠狠躁夜夜av | 中文字幕国产精品 | 四虎精品成人免费网站 | 欧美日韩国产xxx | 欧美极品久久 | 91精品在线免费观看 | 五月婷香 | 中文字幕一区二区三区四区 | www.人人干 | 韩国精品在线观看 | 色婷婷国产精品一区在线观看 | 91精品久久久久久综合五月天 | 日韩爱爱网站 | 国产第页| 日韩欧美一区二区在线播放 | 久久黄色精品视频 | 久久久人 | 国产精品免费久久久久久 | 亚洲视频大全 | 久久久久久久久久久久久久电影 | 国产涩涩网站 | av国产网站| 五月婷婷影院 | 欧美在线视频一区二区三区 | 中文字幕免费在线 | 免费久久久 | 免费三级黄 | 亚洲成人精品久久 | 少妇按摩av| 国产精品免费久久久久久久久久中文 | 在线免费高清视频 | 中文字幕精品在线 | 在线日韩亚洲 | 国产成人一区二区精品非洲 | 午夜视频久久久 | 久久久久久国产精品免费 | 91中文字幕在线 | 性色av香蕉一区二区 | 成人av在线直播 | 日韩在线高清免费视频 | 精品国偷自产国产一区 | 97超碰人人澡人人爱学生 | 中文av影院 | 精品中文字幕在线 | 开心激情婷婷 | 久久久久网址 | 国产96av | 午夜av色 | 国内一区二区视频 | 亚洲高清国产视频 | 亚洲成年人在线播放 | 久久九九国产视频 | 丁香婷婷色月天 | 午夜私人影院久久久久 | 欧美亚洲精品在线观看 | 久久人人爽人人爽人人片 | 激情网站五月天 | 精品99久久久久久 | 香蕉视频在线播放 | 欧美嫩草影院 | 欧美a性| 麻豆一二| 中文字幕一区二区三区在线视频 | 一区二区三区电影在线播 | 江苏妇搡bbbb搡bbbb | 99视频免费在线观看 | 日本精品免费看 | 国产一区二区在线免费视频 | 在线激情电影 | 日本精品久久久久影院 | 亚洲一级二级三级 | 免费视频你懂得 | 在线色视频小说 | 亚洲精品国产自产拍在线观看 | av亚洲产国偷v产偷v自拍小说 | 国产特级毛片aaaaaa毛片 | 婷婷国产v亚洲v欧美久久 | av福利电影 | 精品国产自 | 二区在线播放 | 免费日韩电影 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 91在线精品秘密一区二区 | 96亚洲精品久久久蜜桃 | 9999在线视频 | 久久精品亚洲精品国产欧美 | 最近中文字幕国语免费高清6 | 99在线热播精品免费 | 免费观看完整版无人区 | 欧美不卡视频在线 | 中文字幕久久精品亚洲乱码 | 91麻豆精品国产91久久久无限制版 | 日韩首页 | 国产精品视频永久免费播放 | 国产色爽| 欧美性极品xxxx做受 | 欧美日韩一区久久 | 999久久久免费精品国产 | 国产精品av久久久久久无 | 国产福利小视频在线 | 国产五月 | 国产麻豆剧传媒免费观看 | 日韩中文字幕网站 | 成人亚洲精品久久久久 | 91视频免费看| 日韩理论电影在线观看 | 精品久久国产一区 | 国产99区 | 久久久性| 精品久久久久久久久久久院品网 | 天堂网在线视频 | 日本中文一级片 | 日日综合 | 亚洲欧美在线视频免费 | 九九99| av在线一 | 99久久久国产精品免费观看 | 精品久久久网 | 五月天天色 | 亚洲精品久久久久久国 | 国产又粗又硬又爽的视频 | 久久成人一区二区 | 免费在线激情电影 | 91丨九色丨蝌蚪丰满 | 99久久久久成人国产免费 | 亚洲成a人片综合在线 | 外国av网 | 国产亚洲精品成人av久久ww | 亚洲人成在| 六月婷婷网 | 日韩精品免费一线在线观看 | 最近更新好看的中文字幕 | 国产精品久久久影视 | 国内一区二区视频 | 日本丶国产丶欧美色综合 | 天天色天天上天天操 | 久久久久草 | 亚洲一级特黄 | 亚洲成av人电影 | 日躁夜躁狠狠躁2001 | 在线激情小视频 | 91av久久| 国产香蕉久久精品综合网 | 国产精品理论片在线播放 | 久草在线一免费新视频 | 成人丝袜| 成人午夜剧场在线观看 | 在线视频 91| 91精品久久久久久久久久久久久 | av中文在线观看 | 色综合综合 | 成人片在线播放 | 免费国产黄线在线观看视频 | 免费美女久久99 | 不卡的av在线播放 | 婷婷色吧| 亚洲黄色免费观看 | 天天做天天射 | 在线观看日韩精品 | 亚洲在线不卡 | 天天色天天爱天天射综合 | 久久久久久久久爱 | 免费观看成人av | 麻豆传媒视频在线播放 | www.狠狠操 | 99免费在线 | 久久久久久福利 | 天天操天天射天天爽 | 国产日本亚洲高清 | 国产精品专区在线观看 | 日日干网址 | 99热精品免费观看 | 日韩欧美区| 欧美在线久久 | 天天搞天天干 | 黄色网址国产 | 亚洲国产精品人久久电影 | 在线观看国产区 | www.av免费 | 911在线 | 国产精品18久久久久久首页狼 | 久久久精品二区 | 国产麻豆精品免费视频 | 综合五月婷婷 | 超碰电影在线观看 | 97国产小视频 | 日韩欧美精品在线视频 | 精品亚洲视频在线 | 成人av一级片 | 久久免费视频这里只有精品 | 久久dvd | 久久精品国产成人精品 | 九九九视频在线 | 国产精品一区二区三区在线 | 四虎精品成人免费网站 | 狠狠躁夜夜躁人人爽超碰91 | 日韩毛片久久久 | 日韩 精品 一区 国产 麻豆 | 大胆欧美gogo免费视频一二区 | 精品国产一区二区三区免费 | 天堂av免费 | 亚洲国产精品资源 | 亚洲日本一区二区在线 | 国产精品99久久久精品免费观看 | 九九九视频在线 | 国产亚洲资源 | 在线99 | 国产一区精品在线观看 | 9ⅰ精品久久久久久久久中文字幕 | 91精品欧美一区二区三区 | 天天拍天天干 | 91在线观看欧美日韩 | www色 | 91手机视频| 五月婷婷视频在线观看 | 亚洲小视频在线 | 国产拍揄自揄精品视频麻豆 | 探花视频免费在线观看 | 91精品视频免费观看 | 91精品视频播放 | 成人网在线免费视频 | 久久精品亚洲综合专区 | 91精品成人久久 | 国产精品一区二区免费看 | 成人免费看电影 | 色欧美成人精品a∨在线观看 | 精品国产观看 | 激情视频综合网 | 欧美亚洲国产精品久久高清浪潮 | 夜夜躁日日躁狠狠久久av | 免费看污黄网站 | 午夜国产一区二区三区四区 | 久久国产精品99久久久久 | 日韩国产精品久久久久久亚洲 | 西西www4444大胆视频 | 日韩精品免费一区二区三区 | 日日夜夜综合网 | 韩日av一区二区 | 日本黄色免费看 | 人人看97 | 国产精品久久久久影院日本 | 日本女人b| 久久综合久久综合九色 | 狠狠色狠狠综合久久 | 国产一级在线看 | 日韩在线观看高清 | 91亚洲综合 | 激情五月播播久久久精品 | 国产va精品免费观看 | 国产专区日韩专区 | 久久免费黄色 | 91九色国产视频 | 中文字幕乱码亚洲精品一区 | 中文国产字幕在线观看 | 色综合久久综合中文综合网 | 精品96久久久久久中文字幕无 | 国产麻豆精品久久一二三 | 中文字幕在线观 | 亚洲精品在线国产 | 91香蕉视频色版 | 91视频三区 | 久草在线视频免费资源观看 | 欧美大片在线看免费观看 | 久久无码精品一区二区三区 | 国产精品国产三级国产aⅴ无密码 | 欧美日韩国产一区二区在线观看 | 国产精品久久久久久五月尺 | 久久久久久免费毛片精品 | 国产区在线看 | 97视频在线看 | 免费网站观看www在线观看 | 久久精品99国产精品 | 97网| 一区二区三区视频在线 | 91精品国产自产在线观看永久 | 99久久精品日本一区二区免费 | 亚洲成人资源网 | 久久久久国产成人免费精品免费 | 99视频在线观看免费 | 国产一区二区在线免费 | 久久国产精品一国产精品 | 91麻豆精品国产91久久久使用方法 | 午夜精品中文字幕 | 丁香婷婷综合五月 | 伊人天天狠天天添日日拍 | 九九免费观看全部免费视频 | 亚洲国产网址 | 成人在线网站观看 | 黄色美女免费网站 | 久久国产成人午夜av影院潦草 | 亚洲国产合集 | 91在线产啪 | 国内精品久久久久久久久久久 | 免费看的黄色小视频 | 麻豆精品国产传媒 | 国外调教视频网站 | 国产涩涩在线观看 | 美女视频黄免费的久久 | 97人人超| 久久精品综合一区 | 日本三级在线观看中文字 | 99精品国产免费久久久久久下载 | 91精品入口 | 国产精品第二页 | 国产精品一二三 | 日韩深夜在线观看 | 国产天天综合 | 91传媒在线 | www.黄色片网站 | 欧美日韩有码 | 天天操天天操天天操天天 | 国产日韩欧美自拍 | 久久久国产一区二区 | 激情九九 | 在线精品视频免费播放 | 久久亚洲电影 | 亚洲精品五月 | 成人免费网视频 | 日韩美女av在线 | 在线观看日韩国产 | 天天干天天操 | 欧美久久精品 | 黄色a级片在线观看 | 在线观看国产日韩欧美 | 成人av.com | 精品天堂av | 亚洲精品在线二区 | 欧美 日韩 久久 | 欧美乱熟臀69xxxxxx | 日韩免费三级 | 夜夜视频资源 | 亚洲视频综合 | 在线观看亚洲精品 | 亚洲爱视频 | 开心激情综合网 | 日韩mv欧美mv国产精品 | 精品国产伦一区二区三区观看方式 | 欧美日韩性视频在线 | 亚洲高清激情 | 久久成人在线视频 | 天天射天天干 | 亚洲人成人天堂h久久 | 韩国av电影网| 激情在线网站 | 国产视频 亚洲视频 | 久久综合桃花 | 国产精品成人久久久久 | 国产伦精品一区二区三区四区视频 | 亚洲精品美女 | 国产三级精品在线 | 福利片免费看 | 久久精品国产第一区二区三区 | 久久草视频 | 久在线观看视频 | 在线观看久久久久久 | 1024手机在线看 | 免费视频一二三区 | 欧美日韩视频一区二区 | 欧美日韩二区三区 | 超碰在线资源 | 亚洲精品国产品国语在线 | 欧美va电影 | 亚洲精品乱码久久久久久按摩 | 就要色综合 | 天天干天天干 | 麻豆精品国产传媒 | 最近中文字幕久久 | 涩五月婷婷 | 91亚洲精品乱码久久久久久蜜桃 | 国产一级二级三级视频 | 国产精品毛片一区二区 | 免费裸体视频网 | 在线观看av中文字幕 | 日韩av在线免费播放 | 国产 成人 久久 | 中文亚洲欧美日韩 | 亚洲 欧美 国产 va在线影院 | 久久露脸国产精品 | av中文字幕日韩 | 一级黄色免费 | 激情av网址 | 欧美一区,二区 | 又黄又爽的视频在线观看网站 | 日韩高清不卡一区二区三区 | 成人毛片网 | 在线电影日韩 | 国产在线精品一区二区 | a视频免费 | av大片免费在线观看 | 91精品色 | 国语精品久久 | 日韩精品免费一区 | 欧美福利视频一区 | 久久影视一区 | 久久精品一区二区国产 | 久久亚洲免费 | 日本最新一区二区三区 | 色窝资源| 欧美激情综合五月色丁香 | 丝袜+亚洲+另类+欧美+变态 | 国产午夜麻豆影院在线观看 | 亚洲欧美日韩在线看 | 欧美日韩另类在线观看 | 国产永久网站 | 精品国产99国产精品 | aaa亚洲精品一二三区 | 伊人五月天综合 | 天天操天天射天天插 | 在线播放 日韩专区 | 欧美日韩中文字幕综合视频 | 日本性生活一级片 | 欧美婷婷色 | 免费在线电影网址大全 | 999久久久久久 | 在线观看免费视频你懂的 | 黄色免费av | 久久a级片 | 伊人亚洲综合网 | 美女网站免费福利视频 | 亚洲小视频在线观看 | 久热久草在线 | 成年人在线免费看片 | 久草在线在线 | 黄污在线看| 欧美 日韩 久久 | 综合网久久 | 成人三级黄色 | 怡红院av久久久久久久 | www.天天操| 夜色.com | www免费 | 国产精品久久久久永久免费观看 | 91免费高清在线观看 | www久久精品 | 亚洲第一伊人 | 丁香婷婷综合色啪 | 一区二区精品在线 | 欧美一区三区四区 | 麻豆影视在线免费观看 | 99久久爱| 一本—道久久a久久精品蜜桃 | 成人午夜性影院 | 日韩成人免费在线 | 久久视频免费观看 | 成人三级av | 黄色成人在线观看 | 成人在线视频观看 | 日韩精品一区二区三区三炮视频 | 中国一级片视频 | 精精国产xxxx视频在线播放 | 亚洲第一中文字幕 | www免费黄色| 黄色片免费在线 | 国产日韩欧美在线 | 欧美成人黄色片 | 日韩一级精品 | 国产精品美女久久久久久 | 国产999精品久久久久久 | 欧美日韩a视频 | 欧美专区国产专区 | 麻豆 91 在线| 国产精成人品免费观看 | 欧美性粗大hdvideo | 久久九九精品 | 中文字幕在线观看第一页 | 视频一区二区免费 | 91视频黄色 | 成片视频免费观看 | 97成人在线观看 | 91亚洲精品久久久蜜桃借种 | 日本韩国精品一区二区在线观看 | 久久久久久久av | 又黄又爽免费视频 | 黄色三级免费观看 | 国产精品欧美激情在线观看 | 欧美日韩在线观看不卡 | 91精品视频在线播放 | 激情婷婷av| 国产免费又爽又刺激在线观看 | 亚洲精品欧洲精品 | 午夜在线免费观看视频 | 亚洲欧洲一级 | 久久精品一二区 | 免费一级片在线观看 | 欧美日韩久久久 | 月下香电影 | 毛片网在线播放 | 欧美精品亚洲精品 | 婷婷久久综合网 | 久章草在线 | 日本不卡视频 | 亚洲国产经典视频 | 日韩激情久久 | 伊人国产在线播放 | 久草在线一免费新视频 | 91传媒视频在线观看 | 国产黄色特级片 | 丁香婷婷激情啪啪 | 在线视频 区 | 久久久久久麻豆 | 高清免费在线视频 | 免费看成人片 | 亚洲精品成人av在线 | 亚洲欧美精品一区二区 | 国产日韩欧美精品在线观看 | av一级片网站 | 97人人看| 色综合久久88色综合天天免费 | 激情小说网站亚洲综合网 | 日本精品一区二区在线观看 | 国产1区在线观看 | 夜色.com| 国产高清在线精品 | 国产精品国产三级国产 | 91天天操 | 久久国产欧美日韩精品 | 亚洲资源视频 | 人人爽人人舔 | 亚洲精品国产自产拍在线观看 | av片在线观看 | 国产精品av电影 | 亚洲精品国产精品国 | 不卡av在线免费观看 | 中文字幕在线观看亚洲 | 久久黄色小说视频 | 国产日韩欧美在线 | 国产精品久久久久毛片大屁完整版 | 在线观看的a站 | 人人干天天射 | 中文字幕免费国产精品 | 成人久久免费 | 久久久天堂 | 国语对白少妇爽91 | 天天拍夜夜拍 | 波多野结衣在线播放一区 | 亚州精品在线视频 | 日本在线观看视频一区 | 国产精选在线 | 日韩电影在线看 | 日韩欧美视频一区二区三区 | 国产精品igao视频网网址 | 青青草国产精品视频 | 亚洲国产精品日韩 | 五月婷婷欧美视频 | 在线岛国av| 欧美不卡视频在线 | 五月婷婷av | 精品国产一区二区三区免费 | 免费观看www小视频的软件 | 亚洲国产理论片 | 91九色丨porny丨丰满6 | 91精品国产一区 | 少妇bbw撒尿 | 在线免费色视频 | 国产精品久久久久影院 | 91精品国产欧美一区二区成人 | 欧美一二三区在线播放 | 人人添人人澡人人澡人人人爽 | 人人射人人射 | av先锋影音少妇 | 免费观看的黄色片 | 免费麻豆视频 | 日韩免费av片 | 免费电影播放 | 国产精品入口a级 | 在线观看视频黄色 | 中文字幕一区二区三区四区在线视频 | 国产精品久久久久久av | av观看免费在线 | 久久精品一区二区三 | 91精品啪啪 | 亚洲理论视频 | 色婷婷综合久久久中文字幕 | 婷婷在线免费观看 | 在线观看视频福利 | 日韩a欧美 | 97精品国产97久久久久久久久久久久 | 看国产黄色大片 | 国产午夜一区二区 | 黄色av免费电影 | 久久免费黄色 | 丝袜制服天堂 | 日韩一区二区三区高清在线观看 | 欧美一级特黄高清视频 | 国产精品va | 在线观看亚洲免费视频 | 制服丝袜一区二区 | 日韩精品一区二区不卡 | 国产特级毛片aaaaaa高清 | 亚洲黄色一级视频 | 欧美日韩视频免费 | 亚洲欧美日韩精品久久奇米一区 | 欧美精品首页 | 最新国产在线视频 | 国产美女黄网站免费 | 亚洲有 在线 | 色婷婷狠狠五月综合天色拍 | 欧美日本中文字幕 | 天天插天天操天天干 | www.com黄| 97av视频| 国产亚洲精品久久久久动 | 久久影视中文字幕 | 不卡中文字幕av | av在线8| 国产麻豆果冻传媒在线观看 | 天天射网站| 欧美一级在线 | 日韩久久久久久久久久 | 欧美视频不卡 | 色婷婷久久一区二区 | av免费高清观看 | 免费涩涩网站 | 久久精品综合一区 | 久久亚洲视频 | 亚洲男人天堂2018 | 国产精品视频一二三 | 久久久在线观看 | 免费看的毛片 | 日韩理论 | 成人免费网站在线观看 | 最近中文字幕高清字幕在线视频 | 久久视屏网 | 99国产在线观看 | 久久精品电影网 | 免费高清在线视频一区· | 日韩av资源站 | 中文字幕国语官网在线视频 | 日本中文在线播放 | 色先锋av资源中文字幕 | 国产色综合 | 91精品久久香蕉国产线看观看 | 中文字幕日本在线观看 | 国产一区二区在线观看免费 | 人人超在线公开视频 | av大全在线观看 | 99九九热只有国产精品 | 久久99网| 久久久久久久久久久综合 | 视频国产在线观看18 | 激情影音 | 国产伦精品一区二区三区高清 | 日韩av电影免费在线观看 | 黄色成年片 |