Add generic handling for hardware addresses and setup
[connman] / src / rtnl.c
index d678aa7..fd61d0d 100644 (file)
@@ -263,42 +263,52 @@ static void rtnl_message(void *buf, size_t len)
 
        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:
@@ -369,9 +379,8 @@ int __connman_rtnl_init(void)
 
        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);