1/**2* nlmsg_data : 报文有效载荷头3* @nlh: netlink message header4*/5staticinlinevoid*nlmsg_data(conststructnlmsghdr *nlh)6{7return(unsignedchar*) nlh +NLMSG_HDRLEN;8}910//取得struct nlmsghdr结构体消息的数据部分的首地址,设置和读取消息数据部分时需要使用该宏11#defineNLMSG_DATA(nlh) ((voi...
nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD); nlh->nlmsg_pid = 100; nlh->nlmsg_flags = 0; strcpy(NLMSG_DATA(nlh),"Hello you!"); //send message printf("state_smg\n"); sendto(sock_fd,nlh,NLMSG_LENGTH(MAX_PAYLOAD),0,(struct sockaddr*)(&dest_addr),sizeof(dest_addr)); if(state_...
nlh = nlmsg_put(nl_skb, 0, 0, NETLINK_TEST, len, 0); // 填充nlmsg报文头,并最终将报文填充到sk_buff发送出去 if(nlh == NULL) { printk("nlmsg_put failaure \n"); nlmsg_free(nl_skb); return -1; } /* 拷贝数据发送 */ memcpy(nlmsg_data(nlh), pbuf, len); ret = netlink_unic...
用于得到netlink头部长度#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN) 用于得到计算消息数据len的真实消息长度,消息体+消息头#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len)) 返回不小于NLMSG_LENGTH(len)且字节对齐的最小数值#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_...
nlh = NLMSG_PUT(skb, 0, 0, IMP2_K_MSG, size-sizeof(*nlh)); /跳过消息首部,指向数据区/ packet = NLMSG_DATA(nlh); /初始化数据区/ memset(packet, 0, sizeof(struct packet_info)); /填充待发送的数据/ packet->src =https:info->src; ...
mymsg->nlmsg_type = NETLINK_MYCTRL; mymsg->nlmsg_pid = src_addr.nl_pid; strcpy(NLMSG_DATA(mymsg), "Hello you!"); memset(&msg,0,sizeof(msg)); //send to kernel sendto(fd,mymsg,mymsg->nlmsg_len,0,(struct sockaddr *) &dst_addr,sizeof(dst_addr)); ...
(4)nlmsg_seq:消息序列号,用以将消息排队,有些类似TCP协议中的序号(不完全一样),但是netlink的这个字段是可选的,不强制使用; (5)nlmsg_pid:发送端口的ID号,对于内核来说该值就是0,对于用户进程来说就是其socket所绑定的ID号。 那消息体怎么设置呢?可以使用NLMSG_DATA,具体见后面例子。
sk_buff *skb) {struct nlmsghdr *nlh = nlmsg_hdr(skb); // 获取消息头指针char *msg = "Hello from kernel"; // 内核响应消息内容int msg_size = strlen(msg); // 计算消息长度int res; // 用于保存操作结果printk(KERN_INFO "Kernel module received message: %s\n", (char *)nlmsg_data(nlh)...
#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) 1. 用于取得消息的数据部分的首地址,设置和读取消息数据部分时需要使用该宏 #define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \ (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_...
Bottom-Up方面,内核使用nlmsg_unicast或nlmsg_multicast函数向用户空间主动发送组建好的Netlink传输消息。Classic Netlink全双工编程模型Classic Netlink缺陷Classic Netlink主要有两个小瑕疵:有限的Netlink协议ID:netlink_kernel_create函数的第二个参数unit为协议ID。如果想要自定义使用Classic Netlink,需要增加1个协议...