Imported Upstream version 1.37
[platform/upstream/connman.git] / vpn / plugins / vpn.c
1 /*
2  *
3  *  ConnMan VPN daemon
4  *
5  *  Copyright (C) 2007-2013  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 <string.h>
27 #include <fcntl.h>
28 #include <unistd.h>
29 #include <sys/stat.h>
30 #include <stdio.h>
31 #include <errno.h>
32 #include <sys/ioctl.h>
33 #include <sys/types.h>
34 #include <linux/if_tun.h>
35 #include <net/if.h>
36
37 #include <dbus/dbus.h>
38
39 #include <glib/gprintf.h>
40
41 #include <connman/log.h>
42 #include <connman/rtnl.h>
43 #include <connman/task.h>
44 #include <connman/inet.h>
45
46 #include "../vpn-rtnl.h"
47 #include "../vpn-provider.h"
48
49 #include "vpn.h"
50
51 struct vpn_data {
52         struct vpn_provider *provider;
53         char *if_name;
54         unsigned flags;
55         unsigned int watch;
56         enum vpn_state state;
57         struct connman_task *task;
58         int tun_flags;
59 };
60
61 struct vpn_driver_data {
62         const char *name;
63         const char *program;
64         struct vpn_driver *vpn_driver;
65         struct vpn_provider_driver provider_driver;
66 };
67
68 GHashTable *driver_hash = NULL;
69
70 static int stop_vpn(struct vpn_provider *provider)
71 {
72         struct vpn_data *data = vpn_provider_get_data(provider);
73         struct vpn_driver_data *vpn_driver_data;
74         const char *name;
75         struct ifreq ifr;
76         int fd, err;
77
78         if (!data)
79                 return -EINVAL;
80
81         name = vpn_provider_get_driver_name(provider);
82         if (!name)
83                 return -EINVAL;
84
85         vpn_driver_data = g_hash_table_lookup(driver_hash, name);
86
87         if (vpn_driver_data && vpn_driver_data->vpn_driver &&
88                         vpn_driver_data->vpn_driver->flags == VPN_FLAG_NO_TUN)
89                 return 0;
90
91         memset(&ifr, 0, sizeof(ifr));
92         ifr.ifr_flags = data->tun_flags | IFF_NO_PI;
93         sprintf(ifr.ifr_name, "%s", data->if_name);
94
95         fd = open("/dev/net/tun", O_RDWR | O_CLOEXEC);
96         if (fd < 0) {
97                 err = -errno;
98                 connman_error("Failed to open /dev/net/tun to device %s: %s",
99                               data->if_name, strerror(errno));
100                 return err;
101         }
102
103         if (ioctl(fd, TUNSETIFF, (void *)&ifr)) {
104                 err = -errno;
105                 connman_error("Failed to TUNSETIFF for device %s to it: %s",
106                               data->if_name, strerror(errno));
107                 close(fd);
108                 return err;
109         }
110
111         if (ioctl(fd, TUNSETPERSIST, 0)) {
112                 err = -errno;
113                 connman_error("Failed to set tun device %s nonpersistent: %s",
114                               data->if_name, strerror(errno));
115                 close(fd);
116                 return err;
117         }
118         close(fd);
119         DBG("Killed tun device %s", data->if_name);
120         return 0;
121 }
122
123 void vpn_died(struct connman_task *task, int exit_code, void *user_data)
124 {
125         struct vpn_provider *provider = user_data;
126         struct vpn_data *data = vpn_provider_get_data(provider);
127         int state = VPN_STATE_FAILURE;
128         enum vpn_provider_error ret;
129
130         DBG("provider %p data %p", provider, data);
131
132         if (!data)
133                 goto vpn_exit;
134
135         /* The task may die after we have already started the new one */
136         if (data->task != task)
137                 goto done;
138
139         state = data->state;
140
141         stop_vpn(provider);
142         vpn_provider_set_data(provider, NULL);
143
144         if (data->watch != 0) {
145                 vpn_rtnl_remove_watch(data->watch);
146                 data->watch = 0;
147                 vpn_provider_unref(provider);
148         }
149
150 vpn_exit:
151         if (state != VPN_STATE_READY && state != VPN_STATE_DISCONNECT) {
152                 const char *name;
153                 struct vpn_driver_data *vpn_data = NULL;
154
155                 name = vpn_provider_get_driver_name(provider);
156                 if (name)
157                         vpn_data = g_hash_table_lookup(driver_hash, name);
158
159                 if (vpn_data &&
160                                 vpn_data->vpn_driver->error_code)
161                         ret = vpn_data->vpn_driver->error_code(provider,
162                                         exit_code);
163                 else
164                         ret = VPN_PROVIDER_ERROR_UNKNOWN;
165
166                 vpn_provider_indicate_error(provider, ret);
167         } else
168                 vpn_provider_set_state(provider, VPN_PROVIDER_STATE_IDLE);
169
170         vpn_provider_set_index(provider, -1);
171
172         if (data) {
173                 vpn_provider_unref(data->provider);
174                 g_free(data->if_name);
175                 g_free(data);
176         }
177
178 done:
179         connman_task_destroy(task);
180 }
181
182 int vpn_set_ifname(struct vpn_provider *provider, const char *ifname)
183 {
184         struct vpn_data *data = vpn_provider_get_data(provider);
185         int index;
186
187         if (!ifname || !data)
188                 return  -EIO;
189
190         index = connman_inet_ifindex(ifname);
191         if (index < 0)
192                 return  -EIO;
193
194         if (data->if_name)
195                 g_free(data->if_name);
196
197         data->if_name = (char *)g_strdup(ifname);
198         vpn_provider_set_index(provider, index);
199
200         return 0;
201 }
202
203 static int vpn_set_state(struct vpn_provider *provider,
204                                                 enum vpn_provider_state state)
205 {
206         struct vpn_data *data = vpn_provider_get_data(provider);
207         if (!data)
208                 return -EINVAL;
209
210         switch (state) {
211         case VPN_PROVIDER_STATE_UNKNOWN:
212                 return -EINVAL;
213         case VPN_PROVIDER_STATE_IDLE:
214                 data->state = VPN_STATE_IDLE;
215                 break;
216         case VPN_PROVIDER_STATE_CONNECT:
217         case VPN_PROVIDER_STATE_READY:
218                 data->state = VPN_STATE_CONNECT;
219                 break;
220         case VPN_PROVIDER_STATE_DISCONNECT:
221                 data->state = VPN_STATE_DISCONNECT;
222                 break;
223         case VPN_PROVIDER_STATE_FAILURE:
224                 data->state = VPN_STATE_FAILURE;
225                 break;
226         }
227
228         return 0;
229 }
230
231 static void vpn_newlink(unsigned flags, unsigned change, void *user_data)
232 {
233         struct vpn_provider *provider = user_data;
234         struct vpn_data *data = vpn_provider_get_data(provider);
235
236         if ((data->flags & IFF_UP) != (flags & IFF_UP)) {
237                 if (flags & IFF_UP) {
238                         data->state = VPN_STATE_READY;
239                         vpn_provider_set_state(provider,
240                                         VPN_PROVIDER_STATE_READY);
241                 }
242         }
243         data->flags = flags;
244 }
245
246 static DBusMessage *vpn_notify(struct connman_task *task,
247                         DBusMessage *msg, void *user_data)
248 {
249         struct vpn_provider *provider = user_data;
250         struct vpn_data *data;
251         struct vpn_driver_data *vpn_driver_data;
252         const char *name;
253         int state, index, err;
254
255         data = vpn_provider_get_data(provider);
256
257         name = vpn_provider_get_driver_name(provider);
258
259         if (!name) {
260                 DBG("Cannot find VPN driver for provider %p", provider);
261                 vpn_provider_set_state(provider, VPN_PROVIDER_STATE_FAILURE);
262                 return NULL;
263         }
264
265         vpn_driver_data = g_hash_table_lookup(driver_hash, name);
266         if (!vpn_driver_data) {
267                 DBG("Cannot find VPN driver data for name %s", name);
268                 vpn_provider_set_state(provider, VPN_PROVIDER_STATE_FAILURE);
269                 return NULL;
270         }
271
272         state = vpn_driver_data->vpn_driver->notify(msg, provider);
273
274         DBG("provider %p driver %s state %d", provider, name, state);
275
276         switch (state) {
277         case VPN_STATE_CONNECT:
278         case VPN_STATE_READY:
279                 if (data->state == VPN_STATE_READY) {
280                         /*
281                          * This is the restart case, in which case we must
282                          * just set the IP address.
283                          *
284                          * We need to remove first the old address, just
285                          * replacing the old address will not work as expected
286                          * because the old address will linger in the interface
287                          * and not disapper so the clearing is needed here.
288                          *
289                          * Also the state must change, otherwise the routes
290                          * will not be set properly.
291                          */
292                         vpn_provider_set_state(provider,
293                                                 VPN_PROVIDER_STATE_CONNECT);
294
295                         vpn_provider_clear_address(provider, AF_INET);
296                         vpn_provider_clear_address(provider, AF_INET6);
297
298                         vpn_provider_change_address(provider);
299                         vpn_provider_set_state(provider,
300                                                 VPN_PROVIDER_STATE_READY);
301                         break;
302                 }
303
304                 index = vpn_provider_get_index(provider);
305                 vpn_provider_ref(provider);
306                 data->watch = vpn_rtnl_add_newlink_watch(index,
307                                                      vpn_newlink, provider);
308                 err = connman_inet_ifup(index);
309                 if (err < 0) {
310                         if (err == -EALREADY) {
311                                 /*
312                                  * So the interface is up already, that is just
313                                  * great. Unfortunately in this case the
314                                  * newlink watch might not have been called at
315                                  * all. We must manually call it here so that
316                                  * the provider can go to ready state and the
317                                  * routes are setup properly. Also reset flags
318                                  * so vpn_newlink() can handle the change.
319                                  */
320                                 data->flags = 0;
321                                 vpn_newlink(IFF_UP, 0, provider);
322                         } else {
323                                 DBG("Cannot take interface %d up err %d/%s",
324                                         index, -err, strerror(-err));
325                         }
326                 }
327                 break;
328
329         case VPN_STATE_UNKNOWN:
330         case VPN_STATE_IDLE:
331         case VPN_STATE_DISCONNECT:
332         case VPN_STATE_FAILURE:
333                 vpn_provider_set_state(provider,
334                                         VPN_PROVIDER_STATE_DISCONNECT);
335                 break;
336
337         case VPN_STATE_AUTH_FAILURE:
338                 vpn_provider_indicate_error(provider,
339                                         VPN_PROVIDER_ERROR_AUTH_FAILED);
340                 break;
341         }
342
343         return NULL;
344 }
345
346 #if defined TIZEN_EXT
347 static void vpn_event(struct vpn_provider *provider, int state)
348 {
349         struct vpn_driver_data *vpn_driver_data;
350         const char *name;
351
352         name = vpn_provider_get_driver_name(provider);
353         if (!name) {
354                 DBG("Cannot find VPN driver for provider %p", provider);
355                 vpn_provider_set_state(provider, VPN_PROVIDER_STATE_FAILURE);
356                 return;
357         }
358
359         vpn_driver_data = g_hash_table_lookup(driver_hash, name);
360         if (!vpn_driver_data) {
361                 DBG("Cannot find VPN driver data for name %s", name);
362                 vpn_provider_set_state(provider, VPN_PROVIDER_STATE_FAILURE);
363                 return;
364         }
365
366         DBG("provider %p driver %s state %d", provider, name, state);
367
368         switch (state) {
369         case VPN_STATE_CONNECT:
370                 vpn_provider_set_state(provider,
371                                 VPN_PROVIDER_STATE_CONNECT);
372                 break;
373         case VPN_STATE_READY:
374                 vpn_provider_set_state(provider,
375                                 VPN_PROVIDER_STATE_READY);
376                 break;
377
378         case VPN_STATE_UNKNOWN:
379         case VPN_STATE_IDLE:
380         case VPN_STATE_DISCONNECT:
381         case VPN_STATE_FAILURE:
382                 vpn_provider_set_state(provider,
383                                         VPN_PROVIDER_STATE_DISCONNECT);
384                 break;
385
386         case VPN_STATE_AUTH_FAILURE:
387                 vpn_provider_indicate_error(provider,
388                                         VPN_PROVIDER_ERROR_AUTH_FAILED);
389                 break;
390         }
391
392         return;
393 }
394 #endif
395
396 static int vpn_create_tun(struct vpn_provider *provider, int flags)
397 {
398         struct vpn_data *data = vpn_provider_get_data(provider);
399         struct ifreq ifr;
400         int i, fd, index;
401         int ret = 0;
402
403         if (!data)
404                 return -EISCONN;
405
406         fd = open("/dev/net/tun", O_RDWR | O_CLOEXEC);
407         if (fd < 0) {
408                 i = -errno;
409                 connman_error("Failed to open /dev/net/tun: %s",
410                               strerror(errno));
411                 ret = i;
412                 goto exist_err;
413         }
414
415         memset(&ifr, 0, sizeof(ifr));
416         ifr.ifr_flags = flags | IFF_NO_PI;
417
418         for (i = 0; i < 256; i++) {
419                 sprintf(ifr.ifr_name, "vpn%d", i);
420
421                 if (!ioctl(fd, TUNSETIFF, (void *)&ifr))
422                         break;
423         }
424
425         if (i == 256) {
426                 connman_error("Failed to find available tun device");
427                 close(fd);
428                 ret = -ENODEV;
429                 goto exist_err;
430         }
431
432         data->tun_flags = flags;
433         g_free(data->if_name);
434         data->if_name = (char *)g_strdup(ifr.ifr_name);
435         if (!data->if_name) {
436                 connman_error("Failed to allocate memory");
437                 close(fd);
438                 ret = -ENOMEM;
439                 goto exist_err;
440         }
441
442         if (ioctl(fd, TUNSETPERSIST, 1)) {
443                 i = -errno;
444                 connman_error("Failed to set tun persistent: %s",
445                               strerror(errno));
446                 close(fd);
447                 ret = i;
448                 goto exist_err;
449         }
450
451         close(fd);
452
453         index = connman_inet_ifindex(data->if_name);
454         if (index < 0) {
455                 connman_error("Failed to get tun ifindex");
456                 stop_vpn(provider);
457                 ret = -EIO;
458                 goto exist_err;
459         }
460         vpn_provider_set_index(provider, index);
461
462         return 0;
463
464 exist_err:
465         return ret;
466 }
467
468 static int vpn_connect(struct vpn_provider *provider,
469                         vpn_provider_connect_cb_t cb,
470                         const char *dbus_sender, void *user_data)
471 {
472         struct vpn_data *data = vpn_provider_get_data(provider);
473         struct vpn_driver_data *vpn_driver_data;
474         const char *name;
475         int ret = 0, tun_flags = IFF_TUN;
476         enum vpn_state state = VPN_STATE_UNKNOWN;
477
478         if (data)
479                 state = data->state;
480
481         DBG("data %p state %d", data, state);
482
483         switch (state) {
484         case VPN_STATE_UNKNOWN:
485                 data = g_try_new0(struct vpn_data, 1);
486                 if (!data)
487                         return -ENOMEM;
488
489                 data->provider = vpn_provider_ref(provider);
490                 data->watch = 0;
491                 data->flags = 0;
492                 data->task = NULL;
493
494                 vpn_provider_set_data(provider, data);
495                 /* fall through */
496
497         case VPN_STATE_DISCONNECT:
498         case VPN_STATE_IDLE:
499         case VPN_STATE_FAILURE:
500         case VPN_STATE_AUTH_FAILURE:
501                 data->state = VPN_STATE_IDLE;
502                 break;
503
504         case VPN_STATE_CONNECT:
505                 return -EINPROGRESS;
506
507         case VPN_STATE_READY:
508                 return -EISCONN;
509         }
510
511         name = vpn_provider_get_driver_name(provider);
512         if (!name)
513                 return -EINVAL;
514
515         vpn_driver_data = g_hash_table_lookup(driver_hash, name);
516
517         if (!vpn_driver_data || !vpn_driver_data->vpn_driver) {
518                 ret = -EINVAL;
519                 goto exist_err;
520         }
521
522         if (vpn_driver_data->vpn_driver->flags != VPN_FLAG_NO_TUN) {
523                 if (vpn_driver_data->vpn_driver->device_flags) {
524                         tun_flags = vpn_driver_data->vpn_driver->device_flags(provider);
525                 }
526                 ret = vpn_create_tun(provider, tun_flags);
527                 if (ret < 0)
528                         goto exist_err;
529         }
530
531         data->task = connman_task_create(vpn_driver_data->program);
532
533         if (!data->task) {
534                 ret = -ENOMEM;
535                 stop_vpn(provider);
536                 goto exist_err;
537         }
538
539         if (connman_task_set_notify(data->task, "notify",
540                                         vpn_notify, provider)) {
541                 ret = -ENOMEM;
542                 stop_vpn(provider);
543                 connman_task_destroy(data->task);
544                 data->task = NULL;
545                 goto exist_err;
546         }
547
548
549 #if defined TIZEN_EXT
550         if(vpn_driver_data->vpn_driver->set_event_cb)
551                 vpn_driver_data->vpn_driver->set_event_cb(vpn_event, provider);
552 #endif
553
554         ret = vpn_driver_data->vpn_driver->connect(provider, data->task,
555                                                 data->if_name, cb, dbus_sender,
556                                                 user_data);
557         if (ret < 0 && ret != -EINPROGRESS) {
558                 stop_vpn(provider);
559                 connman_task_destroy(data->task);
560                 data->task = NULL;
561                 goto exist_err;
562         }
563
564         DBG("%s started with dev %s",
565                 vpn_driver_data->provider_driver.name, data->if_name);
566
567         data->state = VPN_STATE_CONNECT;
568
569         return -EINPROGRESS;
570
571 exist_err:
572         vpn_provider_set_index(provider, -1);
573         vpn_provider_set_data(provider, NULL);
574         vpn_provider_unref(data->provider);
575         g_free(data->if_name);
576         g_free(data);
577
578         return ret;
579 }
580
581 static int vpn_probe(struct vpn_provider *provider)
582 {
583         return 0;
584 }
585
586 static int vpn_disconnect(struct vpn_provider *provider)
587 {
588         struct vpn_data *data = vpn_provider_get_data(provider);
589         struct vpn_driver_data *vpn_driver_data;
590         const char *name;
591
592         DBG("disconnect provider %p:", provider);
593
594         if (!data)
595                 return 0;
596
597         name = vpn_provider_get_driver_name(provider);
598         if (!name)
599                 return 0;
600
601         vpn_driver_data = g_hash_table_lookup(driver_hash, name);
602         if (vpn_driver_data->vpn_driver->disconnect)
603                 vpn_driver_data->vpn_driver->disconnect(provider);
604
605         if (data->watch != 0) {
606                 vpn_provider_unref(provider);
607                 vpn_rtnl_remove_watch(data->watch);
608                 data->watch = 0;
609         }
610
611         data->state = VPN_STATE_DISCONNECT;
612         connman_task_stop(data->task);
613
614         return 0;
615 }
616
617 static int vpn_remove(struct vpn_provider *provider)
618 {
619         struct vpn_data *data;
620         struct vpn_driver_data *driver_data;
621         const char *name;
622         int err = 0;
623
624         data = vpn_provider_get_data(provider);
625         name = vpn_provider_get_driver_name(provider);
626
627         if (!data)
628                 goto call_remove;
629
630         if (data->watch != 0) {
631                 vpn_provider_unref(provider);
632                 vpn_rtnl_remove_watch(data->watch);
633                 data->watch = 0;
634         }
635
636         connman_task_stop(data->task);
637
638         g_usleep(G_USEC_PER_SEC);
639         stop_vpn(provider);
640
641 call_remove:
642         if (!name)
643                 return 0;
644
645         driver_data = g_hash_table_lookup(driver_hash, name);
646
647         if (driver_data && driver_data->vpn_driver->remove)
648                 err = driver_data->vpn_driver->remove(provider);
649
650         if (err)
651                 DBG("%p vpn_driver->remove() returned %d", provider, err);
652
653         return err;
654 }
655
656 static int vpn_save(struct vpn_provider *provider, GKeyFile *keyfile)
657 {
658         struct vpn_driver_data *vpn_driver_data;
659         const char *name;
660
661         name = vpn_provider_get_driver_name(provider);
662         vpn_driver_data = g_hash_table_lookup(driver_hash, name);
663         if (vpn_driver_data &&
664                         vpn_driver_data->vpn_driver->save)
665                 return vpn_driver_data->vpn_driver->save(provider, keyfile);
666
667         return 0;
668 }
669
670 static int vpn_route_env_parse(struct vpn_provider *provider, const char *key,
671                         int *family, unsigned long *idx,
672                         enum vpn_provider_route_type *type)
673 {
674         struct vpn_driver_data *vpn_driver_data = NULL;
675         const char *name = NULL;
676
677         if (!provider)
678                 return -EINVAL;
679
680         name = vpn_provider_get_driver_name(provider);
681         vpn_driver_data = g_hash_table_lookup(driver_hash, name);
682
683         if (vpn_driver_data && vpn_driver_data->vpn_driver->route_env_parse)
684                 return vpn_driver_data->vpn_driver->route_env_parse(provider, key,
685                         family, idx, type);
686
687         return 0;
688 }
689
690 int vpn_register(const char *name, struct vpn_driver *vpn_driver,
691                         const char *program)
692 {
693         struct vpn_driver_data *data;
694
695         data = g_try_new0(struct vpn_driver_data, 1);
696         if (!data)
697                 return -ENOMEM;
698
699         data->name = name;
700         data->program = program;
701
702         data->vpn_driver = vpn_driver;
703
704         data->provider_driver.name = name;
705         data->provider_driver.disconnect = vpn_disconnect;
706         data->provider_driver.connect = vpn_connect;
707         data->provider_driver.probe = vpn_probe;
708         data->provider_driver.remove = vpn_remove;
709         data->provider_driver.save = vpn_save;
710         data->provider_driver.set_state = vpn_set_state;
711         data->provider_driver.route_env_parse = vpn_route_env_parse;
712
713         if (!driver_hash)
714                 driver_hash = g_hash_table_new_full(g_str_hash,
715                                                         g_str_equal,
716                                                         NULL, g_free);
717
718         if (!driver_hash) {
719                 connman_error("driver_hash not initialized for %s", name);
720                 g_free(data);
721                 return -ENOMEM;
722         }
723
724         g_hash_table_replace(driver_hash, (char *)name, data);
725
726         vpn_provider_driver_register(&data->provider_driver);
727
728         return 0;
729 }
730
731 void vpn_unregister(const char *name)
732 {
733         struct vpn_driver_data *data;
734
735         data = g_hash_table_lookup(driver_hash, name);
736         if (!data)
737                 return;
738
739         vpn_provider_driver_unregister(&data->provider_driver);
740
741         g_hash_table_remove(driver_hash, name);
742
743         if (g_hash_table_size(driver_hash) == 0)
744                 g_hash_table_destroy(driver_hash);
745 }