while (len > 0) {
struct nlmsghdr *hdr = buf;
+ struct nlmsgerr *err;
if (!NLMSG_OK(hdr, len))
break;
- DBG("len %d type %d flags 0x%04x",
- hdr->nlmsg_len, hdr->nlmsg_type, hdr->nlmsg_flags);
+ DBG("len %d type %d flags 0x%04x seq %d",
+ hdr->nlmsg_len, hdr->nlmsg_type,
+ hdr->nlmsg_flags, hdr->nlmsg_seq);
switch (hdr->nlmsg_type) {
- case NLMSG_DONE:
- DBG("done");
- return;
case NLMSG_NOOP:
- DBG("noop");
- return;
- case NLMSG_OVERRUN:
- DBG("overrun");
+ DBG("NOOP");
return;
case NLMSG_ERROR:
- DBG("error");
+ err = NLMSG_DATA(hdr);
+ DBG("ERROR %d (%s)", -err->error,
+ strerror(-err->error));
+ return;
+ case NLMSG_DONE:
+ DBG("DONE");
+ return;
+ case NLMSG_OVERRUN:
+ DBG("OVERRUN");
return;
case RTM_NEWLINK:
+ DBG("NEWLINK");
rtnl_link(hdr);
break;
case RTM_DELLINK:
+ DBG("DELLINK");
rtnl_link(hdr);
break;
case RTM_NEWADDR:
+ DBG("NEWADDR");
rtnl_addr(hdr);
break;
case RTM_DELADDR:
+ DBG("DELADDR");
rtnl_addr(hdr);
break;
case RTM_NEWROUTE:
+ DBG("NEWROUTE");
rtnl_route(hdr);
break;
case RTM_DELROUTE:
+ DBG("DELROUTE");
rtnl_route(hdr);
break;
default:
memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK;
- addr.nl_groups = RTMGRP_LINK;
+ addr.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR;
//addr.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE;
- addr.nl_pid = getpid();
if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
close(sk);