service: Validate the IP addresses before use
[platform/upstream/connman.git] / src / rtnl.c
1 /*
2  *
3  *  Connection Manager
4  *
5  *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License version 2 as
9  *  published by the Free Software Foundation.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <errno.h>
27 #include <stdio.h>
28 #include <unistd.h>
29 #include <string.h>
30 #include <sys/socket.h>
31 #include <sys/ioctl.h>
32 #include <arpa/inet.h>
33 #include <netinet/ether.h>
34 #include <netinet/icmp6.h>
35 #include <net/if_arp.h>
36 #include <linux/if.h>
37 #include <linux/netlink.h>
38 #include <linux/rtnetlink.h>
39 #include <linux/wireless.h>
40
41 #include <glib.h>
42
43 #include "connman.h"
44
45 #ifndef ARPHDR_PHONET_PIPE
46 #define ARPHDR_PHONET_PIPE (821)
47 #endif
48
49 #define print(arg...) do { if (0) connman_info(arg); } while (0)
50 //#define print(arg...) connman_info(arg)
51
52 struct watch_data {
53         unsigned int id;
54         int index;
55         connman_rtnl_link_cb_t newlink;
56         void *user_data;
57 };
58
59 static GSList *watch_list = NULL;
60 static unsigned int watch_id = 0;
61
62 static GSList *update_list = NULL;
63 static guint update_interval = G_MAXUINT;
64 static guint update_timeout = 0;
65
66 struct interface_data {
67         int index;
68         char *name;
69         char *ident;
70         enum connman_service_type service_type;
71         enum connman_device_type device_type;
72 };
73
74 static GHashTable *interface_list = NULL;
75
76 static void free_interface(gpointer data)
77 {
78         struct interface_data *interface = data;
79
80         __connman_technology_remove_interface(interface->service_type,
81                         interface->index, interface->name, interface->ident);
82
83         g_free(interface->ident);
84         g_free(interface->name);
85         g_free(interface);
86 }
87
88 static connman_bool_t ether_blacklisted(const char *name)
89 {
90         if (name == NULL)
91                 return TRUE;
92
93         if (__connman_device_isfiltered(name) == TRUE)
94                 return TRUE;
95
96         return FALSE;
97 }
98
99 static connman_bool_t wext_interface(char *ifname)
100 {
101         struct iwreq wrq;
102         int fd, err;
103
104         fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
105         if (fd < 0)
106                 return FALSE;
107
108         memset(&wrq, 0, sizeof(wrq));
109         strncpy(wrq.ifr_name, ifname, IFNAMSIZ);
110
111         err = ioctl(fd, SIOCGIWNAME, &wrq);
112
113         close(fd);
114
115         if (err < 0)
116                 return FALSE;
117
118         return TRUE;
119 }
120
121 static void read_uevent(struct interface_data *interface)
122 {
123         char *filename, line[128];
124         connman_bool_t found_devtype;
125         FILE *f;
126
127         if (ether_blacklisted(interface->name) == TRUE) {
128                 interface->service_type = CONNMAN_SERVICE_TYPE_UNKNOWN;
129                 interface->device_type = CONNMAN_DEVICE_TYPE_UNKNOWN;
130         } else {
131                 interface->service_type = CONNMAN_SERVICE_TYPE_ETHERNET;
132                 interface->device_type = CONNMAN_DEVICE_TYPE_ETHERNET;
133         }
134
135         filename = g_strdup_printf("/sys/class/net/%s/uevent",
136                                                 interface->name);
137
138         f = fopen(filename, "re");
139
140         g_free(filename);
141
142         if (f == NULL)
143                 return;
144
145         found_devtype = FALSE;
146         while (fgets(line, sizeof(line), f)) {
147                 char *pos;
148
149                 pos = strchr(line, '\n');
150                 if (pos == NULL)
151                         continue;
152                 pos[0] = '\0';
153
154                 if (strncmp(line, "DEVTYPE=", 8) != 0)
155                         continue;
156
157                 found_devtype = TRUE;
158
159                 if (strcmp(line + 8, "wlan") == 0) {
160                         interface->service_type = CONNMAN_SERVICE_TYPE_WIFI;
161                         interface->device_type = CONNMAN_DEVICE_TYPE_WIFI;
162                 } else if (strcmp(line + 8, "wwan") == 0) {
163                         interface->service_type = CONNMAN_SERVICE_TYPE_CELLULAR;
164                         interface->device_type = CONNMAN_DEVICE_TYPE_CELLULAR;
165                 } else if (strcmp(line + 8, "bluetooth") == 0) {
166                         interface->service_type = CONNMAN_SERVICE_TYPE_BLUETOOTH;
167                         interface->device_type = CONNMAN_DEVICE_TYPE_BLUETOOTH;
168                 } else if (strcmp(line + 8, "gadget") == 0) {
169                         interface->service_type = CONNMAN_SERVICE_TYPE_GADGET;
170                         interface->device_type = CONNMAN_DEVICE_TYPE_GADGET;
171
172                 } else {
173                         interface->service_type = CONNMAN_SERVICE_TYPE_UNKNOWN;
174                         interface->device_type = CONNMAN_DEVICE_TYPE_UNKNOWN;
175                 }
176         }
177
178         fclose(f);
179
180         if (found_devtype)
181                 return;
182
183         /* We haven't got a DEVTYPE, let's check if it's a wireless device */
184         if (wext_interface(interface->name)) {
185                 interface->service_type = CONNMAN_SERVICE_TYPE_WIFI;
186                 interface->device_type = CONNMAN_DEVICE_TYPE_WIFI;
187
188                 connman_error("%s runs an unsupported 802.11 driver",
189                                 interface->name);
190         }
191 }
192
193 enum connman_device_type __connman_rtnl_get_device_type(int index)
194 {
195         struct interface_data *interface;
196
197         interface = g_hash_table_lookup(interface_list,
198                                         GINT_TO_POINTER(index));
199         if (interface == NULL)
200                 return CONNMAN_DEVICE_TYPE_UNKNOWN;
201
202         return interface->device_type;
203 }
204
205 /**
206  * connman_rtnl_add_newlink_watch:
207  * @index: network device index
208  * @callback: callback function
209  * @user_data: callback data;
210  *
211  * Add a new RTNL watch for newlink events
212  *
213  * Returns: %0 on failure and a unique id on success
214  */
215 unsigned int connman_rtnl_add_newlink_watch(int index,
216                         connman_rtnl_link_cb_t callback, void *user_data)
217 {
218         struct watch_data *watch;
219
220         watch = g_try_new0(struct watch_data, 1);
221         if (watch == NULL)
222                 return 0;
223
224         watch->id = ++watch_id;
225         watch->index = index;
226
227         watch->newlink = callback;
228         watch->user_data = user_data;
229
230         watch_list = g_slist_prepend(watch_list, watch);
231
232         DBG("id %d", watch->id);
233
234         if (callback) {
235                 unsigned int flags = __connman_ipconfig_get_flags_from_index(index);
236
237                 if (flags > 0)
238                         callback(flags, 0, user_data);
239         }
240
241         return watch->id;
242 }
243
244 /**
245  * connman_rtnl_remove_watch:
246  * @id: watch identifier
247  *
248  * Remove the RTNL watch for the identifier
249  */
250 void connman_rtnl_remove_watch(unsigned int id)
251 {
252         GSList *list;
253
254         DBG("id %d", id);
255
256         if (id == 0)
257                 return;
258
259         for (list = watch_list; list; list = list->next) {
260                 struct watch_data *watch = list->data;
261
262                 if (watch->id  == id) {
263                         watch_list = g_slist_remove(watch_list, watch);
264                         g_free(watch);
265                         break;
266                 }
267         }
268 }
269
270 static void trigger_rtnl(int index, void *user_data)
271 {
272         struct connman_rtnl *rtnl = user_data;
273
274         if (rtnl->newlink) {
275                 unsigned short type = __connman_ipconfig_get_type_from_index(index);
276                 unsigned int flags = __connman_ipconfig_get_flags_from_index(index);
277
278                 rtnl->newlink(type, index, flags, 0);
279         }
280
281         if (rtnl->newgateway) {
282                 const char *gateway =
283                         __connman_ipconfig_get_gateway_from_index(index,
284                                         CONNMAN_IPCONFIG_TYPE_ALL);
285
286                 if (gateway != NULL)
287                         rtnl->newgateway(index, gateway);
288         }
289 }
290
291 static GSList *rtnl_list = NULL;
292
293 static gint compare_priority(gconstpointer a, gconstpointer b)
294 {
295         const struct connman_rtnl *rtnl1 = a;
296         const struct connman_rtnl *rtnl2 = b;
297
298         return rtnl2->priority - rtnl1->priority;
299 }
300
301 /**
302  * connman_rtnl_register:
303  * @rtnl: RTNL module
304  *
305  * Register a new RTNL module
306  *
307  * Returns: %0 on success
308  */
309 int connman_rtnl_register(struct connman_rtnl *rtnl)
310 {
311         DBG("rtnl %p name %s", rtnl, rtnl->name);
312
313         rtnl_list = g_slist_insert_sorted(rtnl_list, rtnl,
314                                                         compare_priority);
315
316         __connman_ipconfig_foreach(trigger_rtnl, rtnl);
317
318         return 0;
319 }
320
321 /**
322  * connman_rtnl_unregister:
323  * @rtnl: RTNL module
324  *
325  * Remove a previously registered RTNL module
326  */
327 void connman_rtnl_unregister(struct connman_rtnl *rtnl)
328 {
329         DBG("rtnl %p name %s", rtnl, rtnl->name);
330
331         rtnl_list = g_slist_remove(rtnl_list, rtnl);
332 }
333
334 static const char *operstate2str(unsigned char operstate)
335 {
336         switch (operstate) {
337         case IF_OPER_UNKNOWN:
338                 return "UNKNOWN";
339         case IF_OPER_NOTPRESENT:
340                 return "NOT-PRESENT";
341         case IF_OPER_DOWN:
342                 return "DOWN";
343         case IF_OPER_LOWERLAYERDOWN:
344                 return "LOWER-LAYER-DOWN";
345         case IF_OPER_TESTING:
346                 return "TESTING";
347         case IF_OPER_DORMANT:
348                 return "DORMANT";
349         case IF_OPER_UP:
350                 return "UP";
351         }
352
353         return "";
354 }
355
356 static connman_bool_t extract_link(struct ifinfomsg *msg, int bytes,
357                                 struct ether_addr *address, const char **ifname,
358                                 unsigned int *mtu, unsigned char *operstate,
359                                 struct rtnl_link_stats *stats)
360 {
361         struct rtattr *attr;
362
363         for (attr = IFLA_RTA(msg); RTA_OK(attr, bytes);
364                                         attr = RTA_NEXT(attr, bytes)) {
365                 switch (attr->rta_type) {
366                 case IFLA_ADDRESS:
367                         if (address != NULL)
368                                 memcpy(address, RTA_DATA(attr), ETH_ALEN);
369                         break;
370                 case IFLA_IFNAME:
371                         if (ifname != NULL)
372                                 *ifname = RTA_DATA(attr);
373                         break;
374                 case IFLA_MTU:
375                         if (mtu != NULL)
376                                 *mtu = *((unsigned int *) RTA_DATA(attr));
377                         break;
378                 case IFLA_STATS:
379                         if (stats != NULL)
380                                 memcpy(stats, RTA_DATA(attr),
381                                         sizeof(struct rtnl_link_stats));
382                         break;
383                 case IFLA_OPERSTATE:
384                         if (operstate != NULL)
385                                 *operstate = *((unsigned char *) RTA_DATA(attr));
386                         break;
387                 case IFLA_LINKMODE:
388                         break;
389                 case IFLA_WIRELESS:
390                         return FALSE;
391                 }
392         }
393
394         return TRUE;
395 }
396
397 static void process_newlink(unsigned short type, int index, unsigned flags,
398                         unsigned change, struct ifinfomsg *msg, int bytes)
399 {
400         struct ether_addr address = {{ 0, 0, 0, 0, 0, 0 }};
401         struct ether_addr compare = {{ 0, 0, 0, 0, 0, 0 }};
402         struct rtnl_link_stats stats;
403         unsigned char operstate = 0xff;
404         struct interface_data *interface;
405         const char *ifname = NULL;
406         unsigned int mtu = 0;
407         char ident[13], str[18];
408         GSList *list;
409
410         memset(&stats, 0, sizeof(stats));
411         if (extract_link(msg, bytes, &address, &ifname, &mtu, &operstate,
412                                         &stats) == FALSE)
413                 return;
414
415         snprintf(ident, 13, "%02x%02x%02x%02x%02x%02x",
416                                                 address.ether_addr_octet[0],
417                                                 address.ether_addr_octet[1],
418                                                 address.ether_addr_octet[2],
419                                                 address.ether_addr_octet[3],
420                                                 address.ether_addr_octet[4],
421                                                 address.ether_addr_octet[5]);
422
423         snprintf(str, 18, "%02X:%02X:%02X:%02X:%02X:%02X",
424                                                 address.ether_addr_octet[0],
425                                                 address.ether_addr_octet[1],
426                                                 address.ether_addr_octet[2],
427                                                 address.ether_addr_octet[3],
428                                                 address.ether_addr_octet[4],
429                                                 address.ether_addr_octet[5]);
430
431         switch (type) {
432         case ARPHRD_ETHER:
433         case ARPHRD_LOOPBACK:
434         case ARPHDR_PHONET_PIPE:
435         case ARPHRD_PPP:
436         case ARPHRD_NONE:
437                 __connman_ipconfig_newlink(index, type, flags,
438                                                         str, mtu, &stats);
439                 break;
440         }
441
442         if (memcmp(&address, &compare, ETH_ALEN) != 0)
443                 connman_info("%s {newlink} index %d address %s mtu %u",
444                                                 ifname, index, str, mtu);
445
446         if (operstate != 0xff)
447                 connman_info("%s {newlink} index %d operstate %u <%s>",
448                                                 ifname, index, operstate,
449                                                 operstate2str(operstate));
450
451         interface = g_hash_table_lookup(interface_list, GINT_TO_POINTER(index));
452         if (interface == NULL) {
453                 interface = g_new0(struct interface_data, 1);
454                 interface->index = index;
455                 interface->name = g_strdup(ifname);
456                 interface->ident = g_strdup(ident);
457
458                 g_hash_table_insert(interface_list,
459                                         GINT_TO_POINTER(index), interface);
460
461                 if (type == ARPHRD_ETHER)
462                         read_uevent(interface);
463
464                 __connman_technology_add_interface(interface->service_type,
465                         interface->index, interface->name, interface->ident);
466         }
467
468         for (list = rtnl_list; list; list = list->next) {
469                 struct connman_rtnl *rtnl = list->data;
470
471                 if (rtnl->newlink)
472                         rtnl->newlink(type, index, flags, change);
473         }
474
475         for (list = watch_list; list; list = list->next) {
476                 struct watch_data *watch = list->data;
477
478                 if (watch->index != index)
479                         continue;
480
481                 if (watch->newlink)
482                         watch->newlink(flags, change, watch->user_data);
483         }
484 }
485
486 static void process_dellink(unsigned short type, int index, unsigned flags,
487                         unsigned change, struct ifinfomsg *msg, int bytes)
488 {
489         struct rtnl_link_stats stats;
490         unsigned char operstate = 0xff;
491         const char *ifname = NULL;
492         GSList *list;
493
494         memset(&stats, 0, sizeof(stats));
495         if (extract_link(msg, bytes, NULL, &ifname, NULL, &operstate,
496                                         &stats) == FALSE)
497                 return;
498
499         if (operstate != 0xff)
500                 connman_info("%s {dellink} index %d operstate %u <%s>",
501                                                 ifname, index, operstate,
502                                                 operstate2str(operstate));
503
504         for (list = rtnl_list; list; list = list->next) {
505                 struct connman_rtnl *rtnl = list->data;
506
507                 if (rtnl->dellink)
508                         rtnl->dellink(type, index, flags, change);
509         }
510
511         switch (type) {
512         case ARPHRD_ETHER:
513         case ARPHRD_LOOPBACK:
514         case ARPHRD_NONE:
515                 __connman_ipconfig_dellink(index, &stats);
516                 break;
517         }
518
519         g_hash_table_remove(interface_list, GINT_TO_POINTER(index));
520 }
521
522 static void extract_ipv4_addr(struct ifaddrmsg *msg, int bytes,
523                                                 const char **label,
524                                                 struct in_addr *local,
525                                                 struct in_addr *address,
526                                                 struct in_addr *broadcast)
527 {
528         struct rtattr *attr;
529
530         for (attr = IFA_RTA(msg); RTA_OK(attr, bytes);
531                                         attr = RTA_NEXT(attr, bytes)) {
532                 switch (attr->rta_type) {
533                 case IFA_ADDRESS:
534                         if (address != NULL)
535                                 *address = *((struct in_addr *) RTA_DATA(attr));
536                         break;
537                 case IFA_LOCAL:
538                         if (local != NULL)
539                                 *local = *((struct in_addr *) RTA_DATA(attr));
540                         break;
541                 case IFA_BROADCAST:
542                         if (broadcast != NULL)
543                                 *broadcast = *((struct in_addr *) RTA_DATA(attr));
544                         break;
545                 case IFA_LABEL:
546                         if (label != NULL)
547                                 *label = RTA_DATA(attr);
548                         break;
549                 }
550         }
551 }
552
553 static void extract_ipv6_addr(struct ifaddrmsg *msg, int bytes,
554                                                 struct in6_addr *addr,
555                                                 struct in6_addr *local)
556 {
557         struct rtattr *attr;
558
559         for (attr = IFA_RTA(msg); RTA_OK(attr, bytes);
560                                         attr = RTA_NEXT(attr, bytes)) {
561                 switch (attr->rta_type) {
562                 case IFA_ADDRESS:
563                         if (addr != NULL)
564                                 *addr = *((struct in6_addr *) RTA_DATA(attr));
565                         break;
566                 case IFA_LOCAL:
567                         if (local != NULL)
568                                 *local = *((struct in6_addr *) RTA_DATA(attr));
569                         break;
570                 }
571         }
572 }
573
574 static void process_newaddr(unsigned char family, unsigned char prefixlen,
575                                 int index, struct ifaddrmsg *msg, int bytes)
576 {
577         const char *label = NULL;
578         void *src;
579         char ip_string[INET6_ADDRSTRLEN];
580
581         if (family == AF_INET) {
582                 struct in_addr ipv4_addr = { INADDR_ANY };
583
584                 extract_ipv4_addr(msg, bytes, &label, &ipv4_addr, NULL, NULL);
585                 src = &ipv4_addr;
586         } else if (family == AF_INET6) {
587                 struct in6_addr ipv6_address, ipv6_local;
588
589                 extract_ipv6_addr(msg, bytes, &ipv6_address, &ipv6_local);
590                 if (IN6_IS_ADDR_LINKLOCAL(&ipv6_address))
591                         return;
592
593                 src = &ipv6_address;
594         } else {
595                 return;
596         }
597
598         if (inet_ntop(family, src, ip_string, INET6_ADDRSTRLEN) == NULL)
599                 return;
600
601         __connman_ipconfig_newaddr(index, family, label,
602                                         prefixlen, ip_string);
603
604         if (family == AF_INET6) {
605                 /*
606                  * Re-create RDNSS configured servers if there are any
607                  * for this interface. This is done because we might
608                  * have now properly configured interface with proper
609                  * autoconfigured address.
610                  */
611                 __connman_resolver_redo_servers(index);
612         }
613 }
614
615 static void process_deladdr(unsigned char family, unsigned char prefixlen,
616                                 int index, struct ifaddrmsg *msg, int bytes)
617 {
618         const char *label = NULL;
619         void *src;
620         char ip_string[INET6_ADDRSTRLEN];
621
622         if (family == AF_INET) {
623                 struct in_addr ipv4_addr = { INADDR_ANY };
624
625                 extract_ipv4_addr(msg, bytes, &label, &ipv4_addr, NULL, NULL);
626                 src = &ipv4_addr;
627         } else if (family == AF_INET6) {
628                 struct in6_addr ipv6_address, ipv6_local;
629
630                 extract_ipv6_addr(msg, bytes, &ipv6_address, &ipv6_local);
631                 if (IN6_IS_ADDR_LINKLOCAL(&ipv6_address))
632                         return;
633
634                 src = &ipv6_address;
635         } else {
636                 return;
637         }
638
639         if (inet_ntop(family, src, ip_string, INET6_ADDRSTRLEN) == NULL)
640                 return;
641
642         __connman_ipconfig_deladdr(index, family, label,
643                                         prefixlen, ip_string);
644 }
645
646 static void extract_ipv4_route(struct rtmsg *msg, int bytes, int *index,
647                                                 struct in_addr *dst,
648                                                 struct in_addr *gateway)
649 {
650         struct rtattr *attr;
651
652         for (attr = RTM_RTA(msg); RTA_OK(attr, bytes);
653                                         attr = RTA_NEXT(attr, bytes)) {
654                 switch (attr->rta_type) {
655                 case RTA_DST:
656                         if (dst != NULL)
657                                 *dst = *((struct in_addr *) RTA_DATA(attr));
658                         break;
659                 case RTA_GATEWAY:
660                         if (gateway != NULL)
661                                 *gateway = *((struct in_addr *) RTA_DATA(attr));
662                         break;
663                 case RTA_OIF:
664                         if (index != NULL)
665                                 *index = *((int *) RTA_DATA(attr));
666                         break;
667                 }
668         }
669 }
670
671 static void extract_ipv6_route(struct rtmsg *msg, int bytes, int *index,
672                                                 struct in6_addr *dst,
673                                                 struct in6_addr *gateway)
674 {
675         struct rtattr *attr;
676
677         for (attr = RTM_RTA(msg); RTA_OK(attr, bytes);
678                                         attr = RTA_NEXT(attr, bytes)) {
679                 switch (attr->rta_type) {
680                 case RTA_DST:
681                         if (dst != NULL)
682                                 *dst = *((struct in6_addr *) RTA_DATA(attr));
683                         break;
684                 case RTA_GATEWAY:
685                         if (gateway != NULL)
686                                 *gateway =
687                                         *((struct in6_addr *) RTA_DATA(attr));
688                         break;
689                 case RTA_OIF:
690                         if (index != NULL)
691                                 *index = *((int *) RTA_DATA(attr));
692                         break;
693                 }
694         }
695 }
696
697 static void process_newroute(unsigned char family, unsigned char scope,
698                                                 struct rtmsg *msg, int bytes)
699 {
700         GSList *list;
701         char dststr[INET6_ADDRSTRLEN], gatewaystr[INET6_ADDRSTRLEN];
702         int index = -1;
703
704         if (family == AF_INET) {
705                 struct in_addr dst = { INADDR_ANY }, gateway = { INADDR_ANY };
706
707                 extract_ipv4_route(msg, bytes, &index, &dst, &gateway);
708
709                 inet_ntop(family, &dst, dststr, sizeof(dststr));
710                 inet_ntop(family, &gateway, gatewaystr, sizeof(gatewaystr));
711
712                 __connman_ipconfig_newroute(index, family, scope, dststr,
713                                                                 gatewaystr);
714
715                 /* skip host specific routes */
716                 if (scope != RT_SCOPE_UNIVERSE &&
717                         !(scope == RT_SCOPE_LINK && dst.s_addr == INADDR_ANY))
718                         return;
719
720                 if (dst.s_addr != INADDR_ANY)
721                         return;
722
723         } else if (family == AF_INET6) {
724                 struct in6_addr dst = IN6ADDR_ANY_INIT,
725                                 gateway = IN6ADDR_ANY_INIT;
726
727                 extract_ipv6_route(msg, bytes, &index, &dst, &gateway);
728
729                 inet_ntop(family, &dst, dststr, sizeof(dststr));
730                 inet_ntop(family, &gateway, gatewaystr, sizeof(gatewaystr));
731
732                 __connman_ipconfig_newroute(index, family, scope, dststr,
733                                                                 gatewaystr);
734
735                 /* skip host specific routes */
736                 if (scope != RT_SCOPE_UNIVERSE &&
737                         !(scope == RT_SCOPE_LINK &&
738                                 IN6_IS_ADDR_UNSPECIFIED(&dst)))
739                         return;
740
741                 if (!IN6_IS_ADDR_UNSPECIFIED(&dst))
742                         return;
743         } else
744                 return;
745
746         for (list = rtnl_list; list; list = list->next) {
747                 struct connman_rtnl *rtnl = list->data;
748
749                 if (rtnl->newgateway)
750                         rtnl->newgateway(index, gatewaystr);
751         }
752 }
753
754 static void process_delroute(unsigned char family, unsigned char scope,
755                                                 struct rtmsg *msg, int bytes)
756 {
757         GSList *list;
758         char dststr[INET6_ADDRSTRLEN], gatewaystr[INET6_ADDRSTRLEN];
759         int index = -1;
760
761         if (family == AF_INET) {
762                 struct in_addr dst = { INADDR_ANY }, gateway = { INADDR_ANY };
763
764                 extract_ipv4_route(msg, bytes, &index, &dst, &gateway);
765
766                 inet_ntop(family, &dst, dststr, sizeof(dststr));
767                 inet_ntop(family, &gateway, gatewaystr, sizeof(gatewaystr));
768
769                 __connman_ipconfig_delroute(index, family, scope, dststr,
770                                                                 gatewaystr);
771
772                 /* skip host specific routes */
773                 if (scope != RT_SCOPE_UNIVERSE &&
774                         !(scope == RT_SCOPE_LINK && dst.s_addr == INADDR_ANY))
775                         return;
776
777                 if (dst.s_addr != INADDR_ANY)
778                         return;
779
780         }  else if (family == AF_INET6) {
781                 struct in6_addr dst = IN6ADDR_ANY_INIT,
782                                 gateway = IN6ADDR_ANY_INIT;
783
784                 extract_ipv6_route(msg, bytes, &index, &dst, &gateway);
785
786                 inet_ntop(family, &dst, dststr, sizeof(dststr));
787                 inet_ntop(family, &gateway, gatewaystr, sizeof(gatewaystr));
788
789                 __connman_ipconfig_delroute(index, family, scope, dststr,
790                                                 gatewaystr);
791
792                 /* skip host specific routes */
793                 if (scope != RT_SCOPE_UNIVERSE &&
794                         !(scope == RT_SCOPE_LINK &&
795                                 IN6_IS_ADDR_UNSPECIFIED(&dst)))
796                         return;
797
798                 if (!IN6_IS_ADDR_UNSPECIFIED(&dst))
799                         return;
800         } else
801                 return;
802
803         for (list = rtnl_list; list; list = list->next) {
804                 struct connman_rtnl *rtnl = list->data;
805
806                 if (rtnl->delgateway)
807                         rtnl->delgateway(index, gatewaystr);
808         }
809 }
810
811 static inline void print_ether(struct rtattr *attr, const char *name)
812 {
813         int len = (int) RTA_PAYLOAD(attr);
814
815         if (len == ETH_ALEN) {
816                 struct ether_addr eth;
817                 memcpy(&eth, RTA_DATA(attr), ETH_ALEN);
818                 print("  attr %s (len %d) %s\n", name, len, ether_ntoa(&eth));
819         } else
820                 print("  attr %s (len %d)\n", name, len);
821 }
822
823 static inline void print_inet(struct rtattr *attr, const char *name,
824                                                         unsigned char family)
825 {
826         int len = (int) RTA_PAYLOAD(attr);
827
828         if (family == AF_INET && len == sizeof(struct in_addr)) {
829                 struct in_addr addr;
830                 addr = *((struct in_addr *) RTA_DATA(attr));
831                 print("  attr %s (len %d) %s\n", name, len, inet_ntoa(addr));
832         } else
833                 print("  attr %s (len %d)\n", name, len);
834 }
835
836 static inline void print_string(struct rtattr *attr, const char *name)
837 {
838         print("  attr %s (len %d) %s\n", name, (int) RTA_PAYLOAD(attr),
839                                                 (char *) RTA_DATA(attr));
840 }
841
842 static inline void print_byte(struct rtattr *attr, const char *name)
843 {
844         print("  attr %s (len %d) 0x%02x\n", name, (int) RTA_PAYLOAD(attr),
845                                         *((unsigned char *) RTA_DATA(attr)));
846 }
847
848 static inline void print_integer(struct rtattr *attr, const char *name)
849 {
850         print("  attr %s (len %d) %d\n", name, (int) RTA_PAYLOAD(attr),
851                                                 *((int *) RTA_DATA(attr)));
852 }
853
854 static inline void print_attr(struct rtattr *attr, const char *name)
855 {
856         int len = (int) RTA_PAYLOAD(attr);
857
858         if (name && len > 0)
859                 print("  attr %s (len %d)\n", name, len);
860         else
861                 print("  attr %d (len %d)\n", attr->rta_type, len);
862 }
863
864 static void rtnl_link(struct nlmsghdr *hdr)
865 {
866         struct ifinfomsg *msg;
867         struct rtattr *attr;
868         int bytes;
869
870         msg = (struct ifinfomsg *) NLMSG_DATA(hdr);
871         bytes = IFLA_PAYLOAD(hdr);
872
873         print("ifi_index %d ifi_flags 0x%04x", msg->ifi_index, msg->ifi_flags);
874
875         for (attr = IFLA_RTA(msg); RTA_OK(attr, bytes);
876                                         attr = RTA_NEXT(attr, bytes)) {
877                 switch (attr->rta_type) {
878                 case IFLA_ADDRESS:
879                         print_ether(attr, "address");
880                         break;
881                 case IFLA_BROADCAST:
882                         print_ether(attr, "broadcast");
883                         break;
884                 case IFLA_IFNAME:
885                         print_string(attr, "ifname");
886                         break;
887                 case IFLA_MTU:
888                         print_integer(attr, "mtu");
889                         break;
890                 case IFLA_LINK:
891                         print_attr(attr, "link");
892                         break;
893                 case IFLA_QDISC:
894                         print_attr(attr, "qdisc");
895                         break;
896                 case IFLA_STATS:
897                         print_attr(attr, "stats");
898                         break;
899                 case IFLA_COST:
900                         print_attr(attr, "cost");
901                         break;
902                 case IFLA_PRIORITY:
903                         print_attr(attr, "priority");
904                         break;
905                 case IFLA_MASTER:
906                         print_attr(attr, "master");
907                         break;
908                 case IFLA_WIRELESS:
909                         print_attr(attr, "wireless");
910                         break;
911                 case IFLA_PROTINFO:
912                         print_attr(attr, "protinfo");
913                         break;
914                 case IFLA_TXQLEN:
915                         print_integer(attr, "txqlen");
916                         break;
917                 case IFLA_MAP:
918                         print_attr(attr, "map");
919                         break;
920                 case IFLA_WEIGHT:
921                         print_attr(attr, "weight");
922                         break;
923                 case IFLA_OPERSTATE:
924                         print_byte(attr, "operstate");
925                         break;
926                 case IFLA_LINKMODE:
927                         print_byte(attr, "linkmode");
928                         break;
929                 default:
930                         print_attr(attr, NULL);
931                         break;
932                 }
933         }
934 }
935
936 static void rtnl_newlink(struct nlmsghdr *hdr)
937 {
938         struct ifinfomsg *msg = (struct ifinfomsg *) NLMSG_DATA(hdr);
939
940         rtnl_link(hdr);
941
942         process_newlink(msg->ifi_type, msg->ifi_index, msg->ifi_flags,
943                                 msg->ifi_change, msg, IFA_PAYLOAD(hdr));
944 }
945
946 static void rtnl_dellink(struct nlmsghdr *hdr)
947 {
948         struct ifinfomsg *msg = (struct ifinfomsg *) NLMSG_DATA(hdr);
949
950         rtnl_link(hdr);
951
952         process_dellink(msg->ifi_type, msg->ifi_index, msg->ifi_flags,
953                                 msg->ifi_change, msg, IFA_PAYLOAD(hdr));
954 }
955
956 static void rtnl_addr(struct nlmsghdr *hdr)
957 {
958         struct ifaddrmsg *msg;
959         struct rtattr *attr;
960         int bytes;
961
962         msg = (struct ifaddrmsg *) NLMSG_DATA(hdr);
963         bytes = IFA_PAYLOAD(hdr);
964
965         print("ifa_family %d ifa_index %d", msg->ifa_family, msg->ifa_index);
966
967         for (attr = IFA_RTA(msg); RTA_OK(attr, bytes);
968                                         attr = RTA_NEXT(attr, bytes)) {
969                 switch (attr->rta_type) {
970                 case IFA_ADDRESS:
971                         print_inet(attr, "address", msg->ifa_family);
972                         break;
973                 case IFA_LOCAL:
974                         print_inet(attr, "local", msg->ifa_family);
975                         break;
976                 case IFA_LABEL:
977                         print_string(attr, "label");
978                         break;
979                 case IFA_BROADCAST:
980                         print_inet(attr, "broadcast", msg->ifa_family);
981                         break;
982                 case IFA_ANYCAST:
983                         print_attr(attr, "anycast");
984                         break;
985                 case IFA_CACHEINFO:
986                         print_attr(attr, "cacheinfo");
987                         break;
988                 case IFA_MULTICAST:
989                         print_attr(attr, "multicast");
990                         break;
991                 default:
992                         print_attr(attr, NULL);
993                         break;
994                 }
995         }
996 }
997
998 static void rtnl_newaddr(struct nlmsghdr *hdr)
999 {
1000         struct ifaddrmsg *msg = (struct ifaddrmsg *) NLMSG_DATA(hdr);
1001
1002         rtnl_addr(hdr);
1003
1004         process_newaddr(msg->ifa_family, msg->ifa_prefixlen, msg->ifa_index,
1005                                                 msg, IFA_PAYLOAD(hdr));
1006 }
1007
1008 static void rtnl_deladdr(struct nlmsghdr *hdr)
1009 {
1010         struct ifaddrmsg *msg = (struct ifaddrmsg *) NLMSG_DATA(hdr);
1011
1012         rtnl_addr(hdr);
1013
1014         process_deladdr(msg->ifa_family, msg->ifa_prefixlen, msg->ifa_index,
1015                                                 msg, IFA_PAYLOAD(hdr));
1016 }
1017
1018 static void rtnl_route(struct nlmsghdr *hdr)
1019 {
1020         struct rtmsg *msg;
1021         struct rtattr *attr;
1022         int bytes;
1023
1024         msg = (struct rtmsg *) NLMSG_DATA(hdr);
1025         bytes = RTM_PAYLOAD(hdr);
1026
1027         print("rtm_family %d rtm_table %d rtm_protocol %d",
1028                         msg->rtm_family, msg->rtm_table, msg->rtm_protocol);
1029         print("rtm_scope %d rtm_type %d rtm_flags 0x%04x",
1030                                 msg->rtm_scope, msg->rtm_type, msg->rtm_flags);
1031
1032         for (attr = RTM_RTA(msg); RTA_OK(attr, bytes);
1033                                         attr = RTA_NEXT(attr, bytes)) {
1034                 switch (attr->rta_type) {
1035                 case RTA_DST:
1036                         print_inet(attr, "dst", msg->rtm_family);
1037                         break;
1038                 case RTA_SRC:
1039                         print_inet(attr, "src", msg->rtm_family);
1040                         break;
1041                 case RTA_IIF:
1042                         print_string(attr, "iif");
1043                         break;
1044                 case RTA_OIF:
1045                         print_integer(attr, "oif");
1046                         break;
1047                 case RTA_GATEWAY:
1048                         print_inet(attr, "gateway", msg->rtm_family);
1049                         break;
1050                 case RTA_PRIORITY:
1051                         print_attr(attr, "priority");
1052                         break;
1053                 case RTA_PREFSRC:
1054                         print_inet(attr, "prefsrc", msg->rtm_family);
1055                         break;
1056                 case RTA_METRICS:
1057                         print_attr(attr, "metrics");
1058                         break;
1059                 case RTA_TABLE:
1060                         print_integer(attr, "table");
1061                         break;
1062                 default:
1063                         print_attr(attr, NULL);
1064                         break;
1065                 }
1066         }
1067 }
1068
1069 static connman_bool_t is_route_rtmsg(struct rtmsg *msg)
1070 {
1071
1072         if (msg->rtm_table != RT_TABLE_MAIN)
1073                 return FALSE;
1074
1075         if (msg->rtm_protocol != RTPROT_BOOT &&
1076                         msg->rtm_protocol != RTPROT_KERNEL)
1077                 return FALSE;
1078
1079         if (msg->rtm_type != RTN_UNICAST)
1080                 return FALSE;
1081
1082         return TRUE;
1083 }
1084
1085 static void rtnl_newroute(struct nlmsghdr *hdr)
1086 {
1087         struct rtmsg *msg = (struct rtmsg *) NLMSG_DATA(hdr);
1088
1089         rtnl_route(hdr);
1090
1091         if (is_route_rtmsg(msg))
1092                 process_newroute(msg->rtm_family, msg->rtm_scope,
1093                                                 msg, RTM_PAYLOAD(hdr));
1094 }
1095
1096 static void rtnl_delroute(struct nlmsghdr *hdr)
1097 {
1098         struct rtmsg *msg = (struct rtmsg *) NLMSG_DATA(hdr);
1099
1100         rtnl_route(hdr);
1101
1102         if (is_route_rtmsg(msg))
1103                 process_delroute(msg->rtm_family, msg->rtm_scope,
1104                                                 msg, RTM_PAYLOAD(hdr));
1105 }
1106
1107 static void *rtnl_nd_opt_rdnss(struct nd_opt_hdr *opt, guint32 *lifetime,
1108                                int *nr_servers)
1109 {
1110         guint32 *optint = (void *)opt;
1111
1112         if (opt->nd_opt_len < 3)
1113                 return NULL;
1114
1115         if (*lifetime > ntohl(optint[1]))
1116                 *lifetime = ntohl(optint[1]);
1117
1118         /* nd_opt_len is in units of 8 bytes. The header is 1 unit (8 bytes)
1119            and each address is another 2 units (16 bytes).
1120            So the number of addresses (given rounding) is nd_opt_len/2 */
1121         *nr_servers = opt->nd_opt_len / 2;
1122
1123         /* And they start 8 bytes into the packet, or two guint32s in. */
1124         return optint + 2;
1125 }
1126
1127 static const char **rtnl_nd_opt_dnssl(struct nd_opt_hdr *opt, guint32 *lifetime)
1128 {
1129         const char **domains = NULL;
1130         guint32 *optint = (void *)opt;
1131         unsigned char *optc = (void *)&optint[2];
1132         int data_len = (opt->nd_opt_len * 8) - 8;
1133         int nr_domains = 0;
1134         int i, tmp;
1135
1136         if (*lifetime > ntohl(optint[1]))
1137                 *lifetime = ntohl(optint[1]);
1138
1139         /* Turn it into normal strings by converting the length bytes into '.',
1140            and count how many search domains there are while we're at it. */
1141         i = 0;
1142         while (i < data_len) {
1143                 if (optc[i] > 0x3f) {
1144                         DBG("DNSSL contains compressed elements in violation of RFC6106");
1145                         return NULL;
1146                 }
1147
1148                 if (optc[i] == 0) {
1149                         nr_domains++;
1150                         i++;
1151                         /* Check for double zero */
1152                         if (i < data_len && optc[i] == 0)
1153                                 break;
1154                         continue;
1155                 }
1156
1157                 tmp = i;
1158                 i += optc[i] + 1;
1159
1160                 if (i >= data_len) {
1161                         DBG("DNSSL data overflows option length");
1162                         return NULL;
1163                 }
1164
1165                 optc[tmp] = '.';
1166         }
1167
1168         domains = g_try_new0(const char *, nr_domains + 1);
1169         if (!domains)
1170                 return NULL;
1171
1172         /* Now point to the normal strings, missing out the leading '.' that
1173            each of them will have now. */
1174         for (i = 0; i < nr_domains; i++) {
1175                 domains[i] = (char *)optc + 1;
1176                 optc += strlen((char *)optc) + 1;
1177         }
1178
1179         return domains;
1180 }
1181
1182 static void rtnl_newnduseropt(struct nlmsghdr *hdr)
1183 {
1184         struct nduseroptmsg *msg = (struct nduseroptmsg *) NLMSG_DATA(hdr);
1185         struct nd_opt_hdr *opt;
1186         guint32 lifetime = -1;
1187         const char **domains = NULL;
1188         struct in6_addr *servers = NULL;
1189         int i, nr_servers = 0;
1190         int msglen = msg->nduseropt_opts_len;
1191         int index;
1192
1193         DBG("family %d index %d len %d type %d code %d",
1194                 msg->nduseropt_family, msg->nduseropt_ifindex,
1195                 msg->nduseropt_opts_len, msg->nduseropt_icmp_type,
1196                 msg->nduseropt_icmp_code);
1197
1198         if (msg->nduseropt_family != AF_INET6 ||
1199                         msg->nduseropt_icmp_type != ND_ROUTER_ADVERT ||
1200                         msg->nduseropt_icmp_code != 0)
1201                 return;
1202
1203         index = msg->nduseropt_ifindex;
1204         if (index < 0)
1205                 return;
1206
1207         for (opt = (void *)&msg[1];
1208                         msglen > 0;
1209                         msglen -= opt->nd_opt_len * 8,
1210                         opt = ((void *)opt) + opt->nd_opt_len*8) {
1211
1212                 DBG("remaining %d nd opt type %d len %d\n",
1213                         msglen, opt->nd_opt_type, opt->nd_opt_len);
1214
1215                 if (opt->nd_opt_type == 25) { /* ND_OPT_RDNSS */
1216                         char buf[40];
1217
1218                         servers = rtnl_nd_opt_rdnss(opt, &lifetime,
1219                                                                 &nr_servers);
1220                         for (i = 0; i < nr_servers; i++) {
1221                                 if (!inet_ntop(AF_INET6, servers + i, buf,
1222                                                                 sizeof(buf)))
1223                                         continue;
1224
1225                                 connman_resolver_append_lifetime(index,
1226                                                         NULL, buf, lifetime);
1227                         }
1228
1229                 } else if (opt->nd_opt_type == 31) { /* ND_OPT_DNSSL */
1230                         g_free(domains);
1231
1232                         domains = rtnl_nd_opt_dnssl(opt, &lifetime);
1233                         for (i = 0; domains != NULL && domains[i] != NULL; i++)
1234                                 connman_resolver_append_lifetime(index,
1235                                                 domains[i], NULL, lifetime);
1236                 }
1237         }
1238
1239         g_free(domains);
1240 }
1241
1242 static const char *type2string(uint16_t type)
1243 {
1244         switch (type) {
1245         case NLMSG_NOOP:
1246                 return "NOOP";
1247         case NLMSG_ERROR:
1248                 return "ERROR";
1249         case NLMSG_DONE:
1250                 return "DONE";
1251         case NLMSG_OVERRUN:
1252                 return "OVERRUN";
1253         case RTM_GETLINK:
1254                 return "GETLINK";
1255         case RTM_NEWLINK:
1256                 return "NEWLINK";
1257         case RTM_DELLINK:
1258                 return "DELLINK";
1259         case RTM_GETADDR:
1260                 return "GETADDR";
1261         case RTM_NEWADDR:
1262                 return "NEWADDR";
1263         case RTM_DELADDR:
1264                 return "DELADDR";
1265         case RTM_GETROUTE:
1266                 return "GETROUTE";
1267         case RTM_NEWROUTE:
1268                 return "NEWROUTE";
1269         case RTM_DELROUTE:
1270                 return "DELROUTE";
1271         case RTM_NEWNDUSEROPT:
1272                 return "NEWNDUSEROPT";
1273         default:
1274                 return "UNKNOWN";
1275         }
1276 }
1277
1278 static GIOChannel *channel = NULL;
1279
1280 struct rtnl_request {
1281         struct nlmsghdr hdr;
1282         struct rtgenmsg msg;
1283 };
1284 #define RTNL_REQUEST_SIZE  (sizeof(struct nlmsghdr) + sizeof(struct rtgenmsg))
1285
1286 static GSList *request_list = NULL;
1287 static guint32 request_seq = 0;
1288
1289 static struct rtnl_request *find_request(guint32 seq)
1290 {
1291         GSList *list;
1292
1293         for (list = request_list; list; list = list->next) {
1294                 struct rtnl_request *req = list->data;
1295
1296                 if (req->hdr.nlmsg_seq == seq)
1297                         return req;
1298         }
1299
1300         return NULL;
1301 }
1302
1303 static int send_request(struct rtnl_request *req)
1304 {
1305         struct sockaddr_nl addr;
1306         int sk;
1307
1308         DBG("%s len %d type %d flags 0x%04x seq %d",
1309                                 type2string(req->hdr.nlmsg_type),
1310                                 req->hdr.nlmsg_len, req->hdr.nlmsg_type,
1311                                 req->hdr.nlmsg_flags, req->hdr.nlmsg_seq);
1312
1313         sk = g_io_channel_unix_get_fd(channel);
1314
1315         memset(&addr, 0, sizeof(addr));
1316         addr.nl_family = AF_NETLINK;
1317
1318         return sendto(sk, req, req->hdr.nlmsg_len, 0,
1319                                 (struct sockaddr *) &addr, sizeof(addr));
1320 }
1321
1322 static int queue_request(struct rtnl_request *req)
1323 {
1324         request_list = g_slist_append(request_list, req);
1325
1326         if (g_slist_length(request_list) > 1)
1327                 return 0;
1328
1329         return send_request(req);
1330 }
1331
1332 static int process_response(guint32 seq)
1333 {
1334         struct rtnl_request *req;
1335
1336         DBG("seq %d", seq);
1337
1338         req = find_request(seq);
1339         if (req != NULL) {
1340                 request_list = g_slist_remove(request_list, req);
1341                 g_free(req);
1342         }
1343
1344         req = g_slist_nth_data(request_list, 0);
1345         if (req == NULL)
1346                 return 0;
1347
1348         return send_request(req);
1349 }
1350
1351 static void rtnl_message(void *buf, size_t len)
1352 {
1353         DBG("buf %p len %zd", buf, len);
1354
1355         while (len > 0) {
1356                 struct nlmsghdr *hdr = buf;
1357                 struct nlmsgerr *err;
1358
1359                 if (!NLMSG_OK(hdr, len))
1360                         break;
1361
1362                 DBG("%s len %d type %d flags 0x%04x seq %d pid %d",
1363                                         type2string(hdr->nlmsg_type),
1364                                         hdr->nlmsg_len, hdr->nlmsg_type,
1365                                         hdr->nlmsg_flags, hdr->nlmsg_seq,
1366                                         hdr->nlmsg_pid);
1367
1368                 switch (hdr->nlmsg_type) {
1369                 case NLMSG_NOOP:
1370                 case NLMSG_OVERRUN:
1371                         return;
1372                 case NLMSG_DONE:
1373                         process_response(hdr->nlmsg_seq);
1374                         return;
1375                 case NLMSG_ERROR:
1376                         err = NLMSG_DATA(hdr);
1377                         DBG("error %d (%s)", -err->error,
1378                                                 strerror(-err->error));
1379                         return;
1380                 case RTM_NEWLINK:
1381                         rtnl_newlink(hdr);
1382                         break;
1383                 case RTM_DELLINK:
1384                         rtnl_dellink(hdr);
1385                         break;
1386                 case RTM_NEWADDR:
1387                         rtnl_newaddr(hdr);
1388                         break;
1389                 case RTM_DELADDR:
1390                         rtnl_deladdr(hdr);
1391                         break;
1392                 case RTM_NEWROUTE:
1393                         rtnl_newroute(hdr);
1394                         break;
1395                 case RTM_DELROUTE:
1396                         rtnl_delroute(hdr);
1397                         break;
1398                 case RTM_NEWNDUSEROPT:
1399                         rtnl_newnduseropt(hdr);
1400                         break;
1401                 }
1402
1403                 len -= hdr->nlmsg_len;
1404                 buf += hdr->nlmsg_len;
1405         }
1406 }
1407
1408 static gboolean netlink_event(GIOChannel *chan,
1409                                 GIOCondition cond, gpointer data)
1410 {
1411         unsigned char buf[4096];
1412         struct sockaddr_nl nladdr;
1413         socklen_t addr_len = sizeof(nladdr);
1414         ssize_t status;
1415         int fd;
1416
1417         if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
1418                 return FALSE;
1419
1420         memset(buf, 0, sizeof(buf));
1421         memset(&nladdr, 0, sizeof(nladdr));
1422
1423         fd = g_io_channel_unix_get_fd(chan);
1424
1425         status = recvfrom(fd, buf, sizeof(buf), 0,
1426                        (struct sockaddr *) &nladdr, &addr_len);
1427         if (status < 0) {
1428                 if (errno == EINTR || errno == EAGAIN)
1429                         return TRUE;
1430
1431                 return FALSE;
1432         }
1433
1434         if (status == 0)
1435                 return FALSE;
1436
1437         if (nladdr.nl_pid != 0) { /* not sent by kernel, ignore */
1438                 DBG("Received msg from %u, ignoring it", nladdr.nl_pid);
1439                 return TRUE;
1440         }
1441
1442         rtnl_message(buf, status);
1443
1444         return TRUE;
1445 }
1446
1447 static int send_getlink(void)
1448 {
1449         struct rtnl_request *req;
1450
1451         DBG("");
1452
1453         req = g_try_malloc0(RTNL_REQUEST_SIZE);
1454         if (req == NULL)
1455                 return -ENOMEM;
1456
1457         req->hdr.nlmsg_len = RTNL_REQUEST_SIZE;
1458         req->hdr.nlmsg_type = RTM_GETLINK;
1459         req->hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
1460         req->hdr.nlmsg_pid = 0;
1461         req->hdr.nlmsg_seq = request_seq++;
1462         req->msg.rtgen_family = AF_INET;
1463
1464         return queue_request(req);
1465 }
1466
1467 static int send_getaddr(void)
1468 {
1469         struct rtnl_request *req;
1470
1471         DBG("");
1472
1473         req = g_try_malloc0(RTNL_REQUEST_SIZE);
1474         if (req == NULL)
1475                 return -ENOMEM;
1476
1477         req->hdr.nlmsg_len = RTNL_REQUEST_SIZE;
1478         req->hdr.nlmsg_type = RTM_GETADDR;
1479         req->hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
1480         req->hdr.nlmsg_pid = 0;
1481         req->hdr.nlmsg_seq = request_seq++;
1482         req->msg.rtgen_family = AF_INET;
1483
1484         return queue_request(req);
1485 }
1486
1487 static int send_getroute(void)
1488 {
1489         struct rtnl_request *req;
1490
1491         DBG("");
1492
1493         req = g_try_malloc0(RTNL_REQUEST_SIZE);
1494         if (req == NULL)
1495                 return -ENOMEM;
1496
1497         req->hdr.nlmsg_len = RTNL_REQUEST_SIZE;
1498         req->hdr.nlmsg_type = RTM_GETROUTE;
1499         req->hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
1500         req->hdr.nlmsg_pid = 0;
1501         req->hdr.nlmsg_seq = request_seq++;
1502         req->msg.rtgen_family = AF_INET;
1503
1504         return queue_request(req);
1505 }
1506
1507 static gboolean update_timeout_cb(gpointer user_data)
1508 {
1509         __connman_rtnl_request_update();
1510
1511         return TRUE;
1512 }
1513
1514 static void update_interval_callback(guint min)
1515 {
1516         if (update_timeout > 0)
1517                 g_source_remove(update_timeout);
1518
1519         if (min < G_MAXUINT) {
1520                 update_interval = min;
1521                 update_timeout = g_timeout_add_seconds(update_interval,
1522                                                 update_timeout_cb, NULL);
1523         } else {
1524                 update_timeout = 0;
1525                 update_interval = G_MAXUINT;
1526         }
1527 }
1528
1529 static gint compare_interval(gconstpointer a, gconstpointer b)
1530 {
1531         guint val_a = GPOINTER_TO_UINT(a);
1532         guint val_b = GPOINTER_TO_UINT(b);
1533
1534         return val_a - val_b;
1535 }
1536
1537 unsigned int __connman_rtnl_update_interval_add(unsigned int interval)
1538 {
1539         guint min;
1540
1541         if (interval == 0)
1542                 return 0;
1543
1544         update_list = g_slist_insert_sorted(update_list,
1545                         GUINT_TO_POINTER(interval), compare_interval);
1546
1547         min = GPOINTER_TO_UINT(g_slist_nth_data(update_list, 0));
1548         if (min < update_interval) {
1549                 update_interval_callback(min);
1550                 __connman_rtnl_request_update();
1551         }
1552
1553         return update_interval;
1554 }
1555
1556 unsigned int __connman_rtnl_update_interval_remove(unsigned int interval)
1557 {
1558         guint min = G_MAXUINT;
1559
1560         if (interval == 0)
1561                 return 0;
1562
1563         update_list = g_slist_remove(update_list, GINT_TO_POINTER(interval));
1564
1565         if (update_list != NULL)
1566                 min = GPOINTER_TO_UINT(g_slist_nth_data(update_list, 0));
1567
1568         if (min > update_interval)
1569                 update_interval_callback(min);
1570
1571         return min;
1572 }
1573
1574 int __connman_rtnl_request_update(void)
1575 {
1576         return send_getlink();
1577 }
1578
1579 int __connman_rtnl_init(void)
1580 {
1581         struct sockaddr_nl addr;
1582         int sk;
1583
1584         DBG("");
1585
1586         interface_list = g_hash_table_new_full(g_direct_hash, g_direct_equal,
1587                                                         NULL, free_interface);
1588
1589         sk = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_ROUTE);
1590         if (sk < 0)
1591                 return -1;
1592
1593         memset(&addr, 0, sizeof(addr));
1594         addr.nl_family = AF_NETLINK;
1595         addr.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE |
1596                                 RTMGRP_IPV6_IFADDR | RTMGRP_IPV6_ROUTE |
1597                                 (1<<(RTNLGRP_ND_USEROPT-1));
1598
1599         if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
1600                 close(sk);
1601                 return -1;
1602         }
1603
1604         channel = g_io_channel_unix_new(sk);
1605         g_io_channel_set_close_on_unref(channel, TRUE);
1606
1607         g_io_channel_set_encoding(channel, NULL, NULL);
1608         g_io_channel_set_buffered(channel, FALSE);
1609
1610         g_io_add_watch(channel, G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
1611                                                         netlink_event, NULL);
1612
1613         return 0;
1614 }
1615
1616 void __connman_rtnl_start(void)
1617 {
1618         DBG("");
1619
1620         send_getlink();
1621         send_getaddr();
1622         send_getroute();
1623 }
1624
1625 void __connman_rtnl_cleanup(void)
1626 {
1627         GSList *list;
1628
1629         DBG("");
1630
1631         for (list = watch_list; list; list = list->next) {
1632                 struct watch_data *watch = list->data;
1633
1634                 DBG("removing watch %d", watch->id);
1635
1636                 g_free(watch);
1637                 list->data = NULL;
1638         }
1639
1640         g_slist_free(watch_list);
1641         watch_list = NULL;
1642
1643         g_slist_free(update_list);
1644         update_list = NULL;
1645
1646         for (list = request_list; list; list = list->next) {
1647                 struct rtnl_request *req = list->data;
1648
1649                 DBG("%s len %d type %d flags 0x%04x seq %d",
1650                                 type2string(req->hdr.nlmsg_type),
1651                                 req->hdr.nlmsg_len, req->hdr.nlmsg_type,
1652                                 req->hdr.nlmsg_flags, req->hdr.nlmsg_seq);
1653
1654                 g_free(req);
1655                 list->data = NULL;
1656         }
1657
1658         g_slist_free(request_list);
1659         request_list = NULL;
1660
1661         g_io_channel_shutdown(channel, TRUE, NULL);
1662         g_io_channel_unref(channel);
1663
1664         channel = NULL;
1665
1666         g_hash_table_destroy(interface_list);
1667 }