a) NLMSG_NOOP-空消息,什么也不做; b) NLMSG_ERROR-指明该消息中包含一个错误; c) NLMSG_DONE-如果内核通过Netlink队列返回了多个消息,那么队列的最后一条消息的类型为NLMSG_DONE,其余所有消息的nlmsg_flags属性都被设置NLM_F_MULTI位有效。 d) NLMSG_OVERRUN-暂时没用到。 (3) nlmsg_flags:附加在消息上的...
消息头 = nlmsg_hdr(skb); 消息数据 = NLMSG_DATA(nlh); 四:内核向应用层发送消息 (一)内核发送netlink单播消息 内核可以通过nlmsg_unicast()函数向应用层发送单播消息,由各个netlink协议负责调用,也有的协议是直接调用netlink_unicast()函数,其实nlmsg_unicast()也仅是netlink_unicast()的一个封装而已: /** ...
iov.iov_len = nlh->nlmsg_len; //解析Netlink消息头 nlh = (struct nlmsghdr *)msg.msg_iov->iov_base; printf("Received message: %s\n", (char *)NLMSG_DATA(nlh)); //释放资源 free(nlh); close(sockfd); return 0; } ``` 在这个例子中,我们创建了一个Netlink socket,并设置了源地址和目...
{/*获取数据中的nlmsghdr 结构的报头*/nlh= (struct nlmsghdr *)skb->data;if((nlh->nlmsg_len >= sizeof(struct nlmsghdr)) && (skb->len>= nlh->nlmsg_len)) {/*长度的全法性校验完成后,处理应用程序自定义消息类型,主要是对用户PID的保存,即为内核保存“把消息发送给谁”*/if(nlh->nlmsg_type ...
当消息被正确的接收之后,nlh应该指向刚刚接收到的netlink消息的头。nladdr应该包含接收消息的目的地址,其中包括了消息发送者的pid和多播组。同时,宏NLMSG_DATA(nlh),定义在netlink.h中,返回一个指向netlink消息负载的指针。调用close(fd)关闭fd描述符所标识的socket;recvmsg(fd, &, msg, 0); ...
* nlmsg_attrdata(nlh, hdrlen)---^ * 首先最上层,一个netlink消息有netlink消息头和netlink消息载荷组成,它们之间存在内存对齐的pad留空空间;然后往下一级消息的实际载荷又可分为family头级具体的消息属性,其中family头针对不同协议种类的netlink定义各部相同;到最底层消息属性又分为消息属性头和实际的消息载荷...
puts("nh->nlmsg_type == NLMSG_DONE"); return; } if (nh->nlmsg_type == NLMSG_ERROR) { // Do some error handling. puts("nh->nlmsg_type == NLMSG_ERROR"); return; } #if 1 puts("Data received from kernel:"); hex_dump((u8*)NLMSG_DATA(nh), NLMSG_PAYLOAD(nh, 0)); ...
if (nh->nlmsg_type == NLMSG_DONE) break; else if (nh->nlmsg_type == NLMSG_ERROR) return; else if (nh->nlmsg_type != RTM_NEWLINK) continue; ifinfo = NLMSG_DATA(nh); printf("%u: %s", ifinfo->ifi_index, (ifinfo->ifi_flags & IFF_LOWER_UP) ? "up" : "down"); ...
47 printf("%s: ", (nlh->nlmsg_type==RTM_NEWROUTE)?"NEWROUT":"DELROUT"); 48 if (tb[RTA_DST] != NULL) { 49 inet_ntop(rt->rtm_family, RTA_DATA(tb[RTA_DST]), tmp, sizeof(tmp)); 50 printf("DST: %s ", tmp); 51 } ...
获取struct nlmsghdr数据结构nlmsg_hdr:从sk_buff->data获取struct nlmsghdr数据结构staticinline struct nlmsghdr *nlmsg_hdr(const struct sk_buff *skb){return (struct nlmsghdr *)skb->data;}参数:skb:socket 缓冲区的指针获取对应的payloadnlmsg_data:根据nlmsghdr指针获取对应的payloadstaticinlinevoid *nlmsg_...