5 * Copyright (C) 2007-2013 Intel Corporation. All rights reserved.
6 * Copyright (C) 2003-2005 Go-Core Project
7 * Copyright (C) 2003-2006 Helsinki University of Technology
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
34 #include <sys/ioctl.h>
35 #include <sys/socket.h>
36 #include <linux/sockios.h>
38 #include <arpa/inet.h>
39 #include <net/route.h>
40 #include <net/ethernet.h>
42 #include <net/if_arp.h>
43 #include <netinet/icmp6.h>
45 #include <linux/if_tun.h>
48 #include <linux/fib_rules.h>
51 #include <gdhcp/gdhcp.h>
53 #define NLMSG_TAIL(nmsg) \
54 ((struct rtattr *) (((uint8_t*) (nmsg)) + \
55 NLMSG_ALIGN((nmsg)->nlmsg_len)))
57 int __connman_inet_rtnl_addattr_l(struct nlmsghdr *n, size_t max_length,
58 int type, const void *data, size_t data_length)
63 length = RTA_LENGTH(data_length);
65 if (NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(length) > max_length)
70 rta->rta_len = length;
71 memcpy(RTA_DATA(rta), data, data_length);
72 n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(length);
77 int __connman_inet_modify_address(int cmd, int flags,
78 int index, int family,
81 unsigned char prefixlen,
82 const char *broadcast,
85 uint8_t request[NLMSG_ALIGN(sizeof(struct nlmsghdr)) +
86 NLMSG_ALIGN(sizeof(struct ifaddrmsg)) +
87 RTA_LENGTH(sizeof(struct in6_addr)) +
88 RTA_LENGTH(sizeof(struct in6_addr))];
90 struct nlmsghdr *header;
91 struct sockaddr_nl nl_addr;
92 struct ifaddrmsg *ifaddrmsg;
93 struct in6_addr ipv6_addr;
94 struct in_addr ipv4_addr, ipv4_dest, ipv4_bcast;
97 DBG("cmd %#x flags %#x index %d family %d address %s peer %s "
98 "prefixlen %hhu broadcast %s p2p %s", cmd, flags, index,
99 family, address, peer, prefixlen, broadcast,
100 is_p2p ? "true" : "false");
105 if (family != AF_INET && family != AF_INET6)
108 memset(&request, 0, sizeof(request));
110 header = (struct nlmsghdr *)request;
111 header->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
112 header->nlmsg_type = cmd;
113 header->nlmsg_flags = NLM_F_REQUEST | flags;
114 header->nlmsg_seq = 1;
116 ifaddrmsg = NLMSG_DATA(header);
117 ifaddrmsg->ifa_family = family;
118 ifaddrmsg->ifa_prefixlen = prefixlen;
119 ifaddrmsg->ifa_flags = IFA_F_PERMANENT;
120 ifaddrmsg->ifa_scope = RT_SCOPE_UNIVERSE;
121 ifaddrmsg->ifa_index = index;
123 if (family == AF_INET) {
124 if (inet_pton(AF_INET, address, &ipv4_addr) != 1)
128 if (inet_pton(AF_INET, peer, &ipv4_dest) != 1)
131 err = __connman_inet_rtnl_addattr_l(header,
140 err = __connman_inet_rtnl_addattr_l(header,
149 * Broadcast address must not be added for P2P / VPN as
150 * getifaddrs() cannot interpret destination address.
154 inet_pton(AF_INET, broadcast, &ipv4_bcast);
156 ipv4_bcast.s_addr = ipv4_addr.s_addr |
157 htonl(0xfffffffflu >> prefixlen);
159 err = __connman_inet_rtnl_addattr_l(header,
167 } else if (family == AF_INET6) {
168 if (inet_pton(AF_INET6, address, &ipv6_addr) != 1)
171 err = __connman_inet_rtnl_addattr_l(header,
180 sk = socket(AF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_ROUTE);
184 memset(&nl_addr, 0, sizeof(nl_addr));
185 nl_addr.nl_family = AF_NETLINK;
187 if ((err = sendto(sk, request, header->nlmsg_len, 0,
188 (struct sockaddr *) &nl_addr, sizeof(nl_addr))) < 0)
199 static bool is_addr_unspec(int family, struct sockaddr *addr)
201 struct sockaddr_in *in4;
202 struct sockaddr_in6 *in6;
206 in4 = (struct sockaddr_in*) addr;
207 return in4->sin_addr.s_addr == INADDR_ANY;
209 in6 = (struct sockaddr_in6*) addr;
210 return IN6_IS_ADDR_UNSPECIFIED(&in6->sin6_addr);
216 static bool is_addr_ll(int family, struct sockaddr *addr)
218 struct sockaddr_in *in4;
219 struct sockaddr_in6 *in6;
223 in4 = (struct sockaddr_in*) addr;
224 return (in4->sin_addr.s_addr & IN_CLASSB_NET) ==
225 ((in_addr_t) htonl(0xa9fe0000));
227 in6 = (struct sockaddr_in6*) addr;
228 return IN6_IS_ADDR_LINKLOCAL(&in6->sin6_addr);
234 bool __connman_inet_is_any_addr(const char *address, int family)
237 struct addrinfo hints;
238 struct addrinfo *result = NULL;
240 if (!address || !*address)
243 memset(&hints, 0, sizeof(struct addrinfo));
245 hints.ai_family = family;
247 if (getaddrinfo(address, NULL, &hints, &result))
251 ret = is_addr_unspec(result->ai_family, result->ai_addr);
252 freeaddrinfo(result);
259 int connman_inet_ifindex(const char *name)
267 sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
271 memset(&ifr, 0, sizeof(ifr));
272 strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name) - 1);
274 err = ioctl(sk, SIOCGIFINDEX, &ifr);
281 return ifr.ifr_ifindex;
284 char *connman_inet_ifname(int index)
292 sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
296 memset(&ifr, 0, sizeof(ifr));
297 ifr.ifr_ifindex = index;
299 err = ioctl(sk, SIOCGIFNAME, &ifr);
306 return g_strdup(ifr.ifr_name);
309 int connman_inet_ifup(int index)
314 sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
318 memset(&ifr, 0, sizeof(ifr));
319 ifr.ifr_ifindex = index;
321 if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
326 if (ioctl(sk, SIOCGIFFLAGS, &ifr) < 0) {
331 if (ifr.ifr_flags & IFF_UP) {
336 ifr.ifr_flags |= (IFF_UP|IFF_DYNAMIC);
338 if (ioctl(sk, SIOCSIFFLAGS, &ifr) < 0) {
351 int connman_inet_ifdown(int index)
353 struct ifreq ifr, addr_ifr;
354 struct sockaddr_in *addr;
357 sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
361 memset(&ifr, 0, sizeof(ifr));
362 ifr.ifr_ifindex = index;
364 if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
369 if (ioctl(sk, SIOCGIFFLAGS, &ifr) < 0) {
374 memset(&addr_ifr, 0, sizeof(addr_ifr));
375 memcpy(&addr_ifr.ifr_name, &ifr.ifr_name, sizeof(ifr.ifr_name) - 1);
376 addr = (struct sockaddr_in *)&addr_ifr.ifr_addr;
377 addr->sin_family = AF_INET;
378 if (ioctl(sk, SIOCSIFADDR, &addr_ifr) < 0)
379 connman_warn("Could not clear IPv4 address index %d", index);
381 if (!(ifr.ifr_flags & IFF_UP)) {
386 ifr.ifr_flags = (ifr.ifr_flags & ~IFF_UP) | IFF_DYNAMIC;
388 if (ioctl(sk, SIOCSIFFLAGS, &ifr) < 0)
399 bool connman_inet_is_ifup(int index)
405 sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
407 connman_warn("Failed to open socket");
411 memset(&ifr, 0, sizeof(ifr));
412 ifr.ifr_ifindex = index;
414 if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
415 connman_warn("Failed to get interface name for interface %d", index);
419 if (ioctl(sk, SIOCGIFFLAGS, &ifr) < 0) {
420 connman_warn("Failed to get interface flags for index %d", index);
424 if (ifr.ifr_flags & IFF_UP)
434 struct in6_addr ifr6_addr;
435 __u32 ifr6_prefixlen;
436 unsigned int ifr6_ifindex;
439 int connman_inet_set_ipv6_address(int index,
440 struct connman_ipaddress *ipaddress)
443 unsigned char prefix_len;
447 if (!ipaddress->local)
450 prefix_len = ipaddress->prefixlen;
451 address = ipaddress->local;
452 is_p2p = ipaddress->is_p2p;
454 DBG("index %d address %s prefix_len %d", index, address, prefix_len);
456 err = __connman_inet_modify_address(RTM_NEWADDR,
457 NLM_F_REPLACE | NLM_F_ACK, index, AF_INET6,
458 address, NULL, prefix_len, NULL, is_p2p);
460 connman_error("%s: %s", __func__, strerror(-err));
467 int connman_inet_set_address(int index, struct connman_ipaddress *ipaddress)
470 unsigned char prefix_len;
471 const char *address, *broadcast, *peer;
474 if (!ipaddress->local)
477 prefix_len = ipaddress->prefixlen;
478 address = ipaddress->local;
479 broadcast = ipaddress->broadcast;
480 peer = ipaddress->peer;
481 is_p2p = ipaddress->is_p2p;
483 DBG("index %d address %s prefix_len %d", index, address, prefix_len);
485 err = __connman_inet_modify_address(RTM_NEWADDR,
486 NLM_F_REPLACE | NLM_F_ACK, index, AF_INET,
487 address, peer, prefix_len, broadcast, is_p2p);
489 connman_error("%s: %s", __func__, strerror(-err));
496 int connman_inet_clear_ipv6_address(int index,
497 struct connman_ipaddress *ipaddress)
504 address = ipaddress->local;
505 prefix_len = ipaddress->prefixlen;
506 is_p2p = ipaddress->is_p2p;
508 DBG("index %d address %s prefix_len %d", index, address, prefix_len);
513 err = __connman_inet_modify_address(RTM_DELADDR, 0, index, AF_INET6,
514 address, NULL, prefix_len, NULL, is_p2p);
516 connman_error("%s: %s", __func__, strerror(-err));
523 int connman_inet_clear_address(int index, struct connman_ipaddress *ipaddress)
526 unsigned char prefix_len;
527 const char *address, *broadcast, *peer;
530 prefix_len = ipaddress->prefixlen;
531 address = ipaddress->local;
532 broadcast = ipaddress->broadcast;
533 peer = ipaddress->peer;
534 is_p2p = ipaddress->is_p2p;
536 DBG("index %d address %s prefix_len %d peer %s broadcast %s", index,
537 address, prefix_len, peer, broadcast);
542 err = __connman_inet_modify_address(RTM_DELADDR, 0, index, AF_INET,
543 address, peer, prefix_len, broadcast, is_p2p);
545 connman_error("%s: %s", __func__, strerror(-err));
552 int connman_inet_add_host_route(int index, const char *host,
555 return connman_inet_add_network_route(index, host, gateway, NULL);
558 int connman_inet_del_host_route(int index, const char *host)
560 return connman_inet_del_network_route(index, host);
563 int connman_inet_add_network_route(int index, const char *host,
569 struct sockaddr_in addr;
572 DBG("index %d host %s gateway %s netmask %s", index,
573 host, gateway, netmask);
575 sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
581 memset(&ifr, 0, sizeof(ifr));
582 ifr.ifr_ifindex = index;
584 if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
590 DBG("ifname %s", ifr.ifr_name);
592 memset(&rt, 0, sizeof(rt));
593 rt.rt_flags = RTF_UP;
596 * Set RTF_GATEWAY only when gateway is set and the gateway IP address
597 * is not IPv4 any address (0.0.0.0). If the given gateway IP address is
598 * any address adding of route will fail when RTF_GATEWAY set. Passing
599 * gateway as NULL or INADDR_ANY should have the same effect. Setting
600 * the gateway address later to the struct is not affected by this,
601 * since given IPv4 any address (0.0.0.0) equals the value set with
604 if (gateway && !__connman_inet_is_any_addr(gateway, AF_INET))
605 rt.rt_flags |= RTF_GATEWAY;
607 rt.rt_flags |= RTF_HOST;
609 memset(&addr, 0, sizeof(addr));
610 addr.sin_family = AF_INET;
611 addr.sin_addr.s_addr = inet_addr(host);
612 memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
614 memset(&addr, 0, sizeof(addr));
615 addr.sin_family = AF_INET;
617 addr.sin_addr.s_addr = inet_addr(gateway);
619 addr.sin_addr.s_addr = INADDR_ANY;
620 memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
622 memset(&addr, 0, sizeof(addr));
623 addr.sin_family = AF_INET;
624 addr.sin_addr.s_addr = INADDR_ANY;
626 addr.sin_addr.s_addr = inet_addr(netmask);
628 addr.sin_addr.s_addr = INADDR_ANY;
629 memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask));
631 rt.rt_dev = ifr.ifr_name;
633 if (ioctl(sk, SIOCADDRT, &rt) < 0 && errno != EEXIST)
640 connman_error("Adding host route failed (%s)",
646 int connman_inet_del_network_route(int index, const char *host)
650 struct sockaddr_in addr;
653 DBG("index %d host %s", index, host);
655 sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
661 memset(&ifr, 0, sizeof(ifr));
662 ifr.ifr_ifindex = index;
664 if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
670 DBG("ifname %s", ifr.ifr_name);
672 memset(&rt, 0, sizeof(rt));
673 rt.rt_flags = RTF_UP | RTF_HOST;
675 memset(&addr, 0, sizeof(addr));
676 addr.sin_family = AF_INET;
677 addr.sin_addr.s_addr = inet_addr(host);
678 memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
680 rt.rt_dev = ifr.ifr_name;
682 if (ioctl(sk, SIOCDELRT, &rt) < 0 && errno != ESRCH)
689 connman_error("Deleting host route failed (%s)",
695 int connman_inet_del_ipv6_network_route(int index, const char *host,
696 unsigned char prefix_len)
701 DBG("index %d host %s", index, host);
706 memset(&rt, 0, sizeof(rt));
708 rt.rtmsg_dst_len = prefix_len;
710 if (inet_pton(AF_INET6, host, &rt.rtmsg_dst) != 1) {
715 rt.rtmsg_flags = RTF_UP | RTF_HOST;
718 rt.rtmsg_ifindex = index;
720 sk = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
726 if (ioctl(sk, SIOCDELRT, &rt) < 0 && errno != ESRCH)
733 connman_error("Del IPv6 host route error (%s)",
739 int connman_inet_del_ipv6_host_route(int index, const char *host)
741 return connman_inet_del_ipv6_network_route(index, host, 128);
744 int connman_inet_add_ipv6_network_route(int index, const char *host,
746 unsigned char prefix_len)
751 DBG("index %d host %s gateway %s", index, host, gateway);
756 memset(&rt, 0, sizeof(rt));
758 rt.rtmsg_dst_len = prefix_len;
760 if (inet_pton(AF_INET6, host, &rt.rtmsg_dst) != 1) {
765 rt.rtmsg_flags = RTF_UP | RTF_HOST;
768 * Set RTF_GATEWAY only when gateway is set, the gateway IP address is
769 * not IPv6 any address (e.g., ::) and the address is valid (conversion
770 * succeeds). If the given gateway IP address is any address then
771 * adding of route will fail when RTF_GATEWAY set. Passing gateway as
772 * NULL or IPv6 any address should have the same effect.
775 if (gateway && !__connman_inet_is_any_addr(gateway, AF_INET6) &&
776 inet_pton(AF_INET6, gateway, &rt.rtmsg_gateway) == 1)
777 rt.rtmsg_flags |= RTF_GATEWAY;
780 rt.rtmsg_ifindex = index;
782 sk = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
788 if (ioctl(sk, SIOCADDRT, &rt) < 0 && errno != EEXIST)
795 connman_error("Set IPv6 host route error (%s)",
801 int connman_inet_add_ipv6_host_route(int index, const char *host,
804 return connman_inet_add_ipv6_network_route(index, host, gateway, 128);
807 int connman_inet_clear_ipv6_gateway_address(int index, const char *gateway)
812 DBG("index %d gateway %s", index, gateway);
817 memset(&rt, 0, sizeof(rt));
819 if (inet_pton(AF_INET6, gateway, &rt.rtmsg_gateway) != 1) {
824 rt.rtmsg_flags = RTF_UP | RTF_GATEWAY;
826 rt.rtmsg_dst_len = 0;
827 rt.rtmsg_ifindex = index;
829 sk = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
835 if (ioctl(sk, SIOCDELRT, &rt) < 0 && errno != ESRCH)
842 connman_error("Clear default IPv6 gateway error (%s)",
848 int connman_inet_set_gateway_interface(int index)
852 struct sockaddr_in addr;
855 DBG("index %d", index);
857 sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
863 memset(&ifr, 0, sizeof(ifr));
864 ifr.ifr_ifindex = index;
866 if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
872 DBG("ifname %s", ifr.ifr_name);
874 memset(&rt, 0, sizeof(rt));
875 rt.rt_flags = RTF_UP;
877 memset(&addr, 0, sizeof(addr));
878 addr.sin_family = AF_INET;
879 addr.sin_addr.s_addr = INADDR_ANY;
881 memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask));
882 memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
883 memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
885 rt.rt_dev = ifr.ifr_name;
887 if (ioctl(sk, SIOCADDRT, &rt) < 0 && errno != EEXIST)
894 connman_error("Setting default interface route failed (%s)",
900 int connman_inet_set_ipv6_gateway_interface(int index)
904 struct sockaddr_in6 addr;
905 const struct in6_addr any = IN6ADDR_ANY_INIT;
908 DBG("index %d", index);
910 sk = socket(PF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
916 memset(&ifr, 0, sizeof(ifr));
917 ifr.ifr_ifindex = index;
919 if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
925 DBG("ifname %s", ifr.ifr_name);
927 memset(&rt, 0, sizeof(rt));
928 rt.rt_flags = RTF_UP;
930 memset(&addr, 0, sizeof(addr));
931 addr.sin6_family = AF_INET6;
932 addr.sin6_addr = any;
934 memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask));
935 memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
936 memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
938 rt.rt_dev = ifr.ifr_name;
940 if (ioctl(sk, SIOCADDRT, &rt) < 0 && errno != EEXIST)
947 connman_error("Setting default interface route failed (%s)",
953 int connman_inet_clear_gateway_address(int index, const char *gateway)
957 struct sockaddr_in addr;
960 DBG("index %d gateway %s", index, gateway);
962 sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
968 memset(&ifr, 0, sizeof(ifr));
969 ifr.ifr_ifindex = index;
971 if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
977 DBG("ifname %s", ifr.ifr_name);
979 memset(&rt, 0, sizeof(rt));
980 rt.rt_flags = RTF_UP | RTF_GATEWAY;
982 memset(&addr, 0, sizeof(addr));
983 addr.sin_family = AF_INET;
984 addr.sin_addr.s_addr = INADDR_ANY;
985 memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
987 memset(&addr, 0, sizeof(addr));
988 addr.sin_family = AF_INET;
989 addr.sin_addr.s_addr = inet_addr(gateway);
990 memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
992 memset(&addr, 0, sizeof(addr));
993 addr.sin_family = AF_INET;
994 addr.sin_addr.s_addr = INADDR_ANY;
995 memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask));
997 if (ioctl(sk, SIOCDELRT, &rt) < 0 && errno != ESRCH)
1004 connman_error("Removing default gateway route failed (%s)",
1010 int connman_inet_clear_gateway_interface(int index)
1014 struct sockaddr_in addr;
1017 DBG("index %d", index);
1019 sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
1025 memset(&ifr, 0, sizeof(ifr));
1026 ifr.ifr_ifindex = index;
1028 if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
1034 DBG("ifname %s", ifr.ifr_name);
1036 memset(&rt, 0, sizeof(rt));
1037 rt.rt_flags = RTF_UP;
1039 memset(&addr, 0, sizeof(addr));
1040 addr.sin_family = AF_INET;
1041 addr.sin_addr.s_addr = INADDR_ANY;
1043 memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask));
1044 memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
1045 memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
1047 rt.rt_dev = ifr.ifr_name;
1049 if (ioctl(sk, SIOCDELRT, &rt) < 0 && errno != ESRCH)
1056 connman_error("Removing default interface route failed (%s)",
1062 int connman_inet_clear_ipv6_gateway_interface(int index)
1066 struct sockaddr_in6 addr;
1067 const struct in6_addr any = IN6ADDR_ANY_INIT;
1070 DBG("index %d", index);
1072 sk = socket(PF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
1078 memset(&ifr, 0, sizeof(ifr));
1079 ifr.ifr_ifindex = index;
1081 if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
1087 DBG("ifname %s", ifr.ifr_name);
1089 memset(&rt, 0, sizeof(rt));
1090 rt.rt_flags = RTF_UP;
1092 memset(&addr, 0, sizeof(addr));
1093 addr.sin6_family = AF_INET6;
1094 addr.sin6_addr = any;
1096 memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask));
1097 memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
1098 memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
1100 rt.rt_dev = ifr.ifr_name;
1102 if (ioctl(sk, SIOCDELRT, &rt) < 0 && errno != ESRCH)
1109 connman_error("Removing default interface route failed (%s)",
1115 #define ADDR_TYPE_MAX 4
1117 struct interface_address {
1121 /* Applies only to ADDR_TYPE_IPADDR in ipaddrs */
1123 /* Real types must be in_addr for AF_INET and in6_addr for AF_INET6 */
1124 void *ipaddrs[ADDR_TYPE_MAX];
1128 ADDR_TYPE_IPADDR = 0,
1134 static int get_interface_addresses(struct interface_address *if_addr)
1136 struct ifaddrs *ifaddr;
1137 struct ifaddrs *ifa;
1138 struct sockaddr *addrs[ADDR_TYPE_MAX] = { 0 };
1139 struct sockaddr_in *addr_in;
1140 struct sockaddr_in6 *addr_in6;
1141 char name[IF_NAMESIZE] = { 0 };
1149 if (!if_indextoname(if_addr->index, name))
1152 DBG("index %d interface %s", if_addr->index, name);
1154 if (getifaddrs(&ifaddr) < 0) {
1155 connman_error("Cannot get addresses err %d/%s", errno,
1160 for (ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
1164 if (g_strcmp0(ifa->ifa_name, name) ||
1165 ifa->ifa_addr->sa_family !=
1170 if (if_addr->ipaddrs[ADDR_TYPE_IPADDR]) {
1171 if (!if_addr->allow_unspec && is_addr_unspec(
1176 if (if_addr->require_ll && !is_addr_ll(if_addr->family,
1180 addrs[ADDR_TYPE_IPADDR] = ifa->ifa_addr;
1183 if (if_addr->ipaddrs[ADDR_TYPE_NETMASK]) {
1184 if (!if_addr->allow_unspec && is_addr_unspec(
1189 addrs[ADDR_TYPE_NETMASK] = ifa->ifa_netmask;
1192 if (if_addr->ipaddrs[ADDR_TYPE_BRDADDR] &&
1193 (ifa->ifa_flags & IFF_BROADCAST)) {
1194 if (!if_addr->allow_unspec && is_addr_unspec(
1196 ifa->ifa_ifu.ifu_broadaddr))
1199 addrs[ADDR_TYPE_BRDADDR] = ifa->ifa_ifu.ifu_broadaddr;
1202 if (if_addr->ipaddrs[ADDR_TYPE_DSTADDR] &&
1203 (ifa->ifa_flags & IFF_POINTOPOINT)) {
1204 if (!if_addr->allow_unspec && is_addr_unspec(
1206 ifa->ifa_ifu.ifu_dstaddr))
1209 addrs[ADDR_TYPE_DSTADDR] = ifa->ifa_ifu.ifu_dstaddr;
1220 for (i = 0; i < ADDR_TYPE_MAX; i++) {
1224 switch (if_addr->family) {
1226 len = sizeof(struct in_addr);
1227 addr_in = (struct sockaddr_in*) addrs[i];
1228 memcpy(if_addr->ipaddrs[i], &addr_in->sin_addr, len);
1231 len = sizeof(struct in6_addr);
1232 addr_in6 = (struct sockaddr_in6*) addrs[i];
1233 memcpy(if_addr->ipaddrs[i], &addr_in6->sin6_addr, len);
1242 freeifaddrs(ifaddr);
1246 bool connman_inet_compare_subnet(int index, const char *host)
1248 struct interface_address if_addr = { 0 };
1249 struct in_addr iaddr = { 0 };
1250 struct in_addr imask = { 0 };
1251 struct in_addr haddr = { 0 };
1253 DBG("host %s", host);
1258 if (inet_pton(AF_INET, host, &haddr) != 1)
1261 if_addr.index = index;
1262 if_addr.family = AF_INET;
1263 if_addr.ipaddrs[ADDR_TYPE_IPADDR] = &iaddr;
1264 if_addr.ipaddrs[ADDR_TYPE_NETMASK] = &imask;
1266 if (get_interface_addresses(&if_addr))
1269 return (iaddr.s_addr & imask.s_addr) == (haddr.s_addr & imask.s_addr);
1272 static bool mem_mask_equal(const void *a, const void *b,
1273 const void *mask, size_t n)
1275 const unsigned char *addr1 = a;
1276 const unsigned char *addr2 = b;
1277 const unsigned char *bitmask = mask;
1280 for (i = 0; i < n; i++) {
1281 if ((addr1[i] ^ addr2[i]) & bitmask[i])
1288 bool connman_inet_compare_ipv6_subnet(int index, const char *host)
1290 struct interface_address addr = { 0 };
1291 struct in6_addr iaddr = { 0 };
1292 struct in6_addr imask = { 0 };
1293 struct in6_addr haddr = { 0 };
1295 if (inet_pton(AF_INET6, host, &haddr) != 1)
1299 addr.family = AF_INET6;
1300 addr.ipaddrs[ADDR_TYPE_IPADDR] = &iaddr;
1301 addr.ipaddrs[ADDR_TYPE_NETMASK] = &imask;
1303 if (get_interface_addresses(&addr))
1306 return mem_mask_equal(&iaddr, &haddr, &imask, sizeof(haddr));
1309 int connman_inet_remove_from_bridge(int index, const char *bridge)
1317 sk = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
1323 memset(&ifr, 0, sizeof(ifr));
1324 strncpy(ifr.ifr_name, bridge, sizeof(ifr.ifr_name) - 1);
1325 ifr.ifr_ifindex = index;
1327 if (ioctl(sk, SIOCBRDELIF, &ifr) < 0)
1334 connman_error("Remove interface from bridge error %s",
1340 int connman_inet_add_to_bridge(int index, const char *bridge)
1348 sk = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
1354 memset(&ifr, 0, sizeof(ifr));
1355 strncpy(ifr.ifr_name, bridge, sizeof(ifr.ifr_name) - 1);
1356 ifr.ifr_ifindex = index;
1358 if (ioctl(sk, SIOCBRADDIF, &ifr) < 0)
1365 connman_error("Add interface to bridge error %s",
1371 int connman_inet_set_mtu(int index, int mtu)
1376 sk = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
1380 memset(&ifr, 0, sizeof(ifr));
1381 ifr.ifr_ifindex = index;
1383 err = ioctl(sk, SIOCGIFNAME, &ifr);
1386 err = ioctl(sk, SIOCSIFMTU, &ifr);
1393 int connman_inet_setup_tunnel(char *tunnel, int mtu)
1403 sk = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
1407 index = if_nametoindex(tunnel);
1409 err = connman_inet_set_mtu(index, mtu);
1413 memset(&ifr, 0, sizeof(ifr));
1414 strncpy(ifr.ifr_name, tunnel, sizeof(ifr.ifr_name) - 1);
1415 err = ioctl(sk, SIOCGIFFLAGS, &ifr);
1422 if ((ifr.ifr_flags ^ flags) & mask) {
1423 ifr.ifr_flags &= ~mask;
1424 ifr.ifr_flags |= mask & flags;
1425 err = ioctl(sk, SIOCSIFFLAGS, &ifr);
1427 connman_error("SIOCSIFFLAGS failed: %s",
1436 int connman_inet_create_tunnel(char **iface)
1441 fd = open("/dev/net/tun", O_RDWR | O_CLOEXEC);
1444 connman_error("Failed to open /dev/net/tun: %s",
1449 memset(&ifr, 0, sizeof(ifr));
1450 ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
1452 for (i = 0; i < 256; i++) {
1453 sprintf(ifr.ifr_name, "tun%d", i);
1455 if (!ioctl(fd, TUNSETIFF, (void *)&ifr))
1460 connman_error("Failed to find available tun device");
1465 *iface = g_strdup(ifr.ifr_name);
1471 * This callback struct is used when sending router and neighbor
1472 * solicitation and advertisement messages.
1475 GIOChannel *channel;
1477 struct sockaddr_in6 addr;
1483 #define CMSG_BUF_LEN 512
1484 #define IN6ADDR_ALL_NODES_MC_INIT \
1485 { { { 0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1 } } } /* ff02::1 */
1486 #define IN6ADDR_ALL_ROUTERS_MC_INIT \
1487 { { { 0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x2 } } } /* ff02::2 */
1489 static const struct in6_addr in6addr_all_nodes_mc = IN6ADDR_ALL_NODES_MC_INIT;
1490 static const struct in6_addr in6addr_all_routers_mc =
1491 IN6ADDR_ALL_ROUTERS_MC_INIT;
1493 static void xs_cleanup(struct xs_cb_data *data)
1495 if (data->channel) {
1496 g_io_channel_shutdown(data->channel, TRUE, NULL);
1497 g_io_channel_unref(data->channel);
1498 data->channel = NULL;
1501 if (data->timeout > 0)
1502 g_source_remove(data->timeout);
1504 if (data->watch_id > 0)
1505 g_source_remove(data->watch_id);
1510 static gboolean rs_timeout_cb(gpointer user_data)
1512 struct xs_cb_data *data = user_data;
1514 DBG("user data %p", user_data);
1519 if (data->callback) {
1520 __connman_inet_rs_cb_t cb = data->callback;
1521 cb(NULL, 0, data->user_data);
1529 static int icmpv6_recv(int fd, struct xs_cb_data *data)
1533 unsigned char chdr[CMSG_BUF_LEN];
1534 unsigned char buf[1540];
1535 struct nd_router_advert *hdr;
1536 struct sockaddr_in6 saddr;
1538 __connman_inet_rs_cb_t cb = data->callback;
1542 iov.iov_len = sizeof(buf);
1545 mhdr.msg_name = (void *)&saddr;
1546 mhdr.msg_namelen = sizeof(struct sockaddr_in6);
1548 mhdr.msg_iov = &iov;
1549 mhdr.msg_iovlen = 1;
1550 mhdr.msg_control = (void *)chdr;
1551 mhdr.msg_controllen = CMSG_BUF_LEN;
1553 len = recvmsg(fd, &mhdr, 0);
1555 cb(NULL, 0, data->user_data);
1559 hdr = (struct nd_router_advert *)buf;
1560 DBG("code %d len %zd hdr %zd", hdr->nd_ra_code, len,
1561 sizeof(struct nd_router_advert));
1562 if (hdr->nd_ra_code != 0)
1565 cb(hdr, len, data->user_data);
1570 static gboolean icmpv6_event(GIOChannel *chan, GIOCondition cond, gpointer data)
1573 struct xs_cb_data *xs_data = data;
1577 if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
1580 fd = g_io_channel_unix_get_fd(chan);
1581 ret = icmpv6_recv(fd, xs_data);
1586 xs_cleanup(xs_data);
1590 /* Adapted from RFC 1071 "C" Implementation Example */
1591 static uint16_t csum(const void *phdr, const void *data, socklen_t datalen,
1592 const void *extra_data, socklen_t extra_datalen)
1594 register unsigned long sum = 0;
1599 /* caller must make sure datalen is even */
1601 addr = (uint16_t *)phdr;
1602 for (i = 0; i < 20; i++)
1606 addr = (uint16_t *)data;
1614 count = extra_datalen;
1615 addr = (uint16_t *)extra_data;
1624 sum = (sum & 0xffff) + (sum >> 16);
1626 return (uint16_t)~sum;
1629 static int ndisc_send_unspec(int type, int oif, const struct in6_addr *dest,
1630 const struct in6_addr *source,
1631 unsigned char *buf, size_t len, uint16_t lifetime)
1634 struct in6_addr src;
1635 struct in6_addr dst;
1637 uint8_t reserved[3];
1644 struct icmp6_hdr icmp;
1645 struct nd_neighbor_solicit ns;
1646 struct nd_router_solicit rs;
1647 struct nd_router_advert ra;
1652 struct cmsghdr *cmsg;
1653 struct in6_pktinfo *pinfo;
1654 struct sockaddr_in6 dst, src;
1655 char cbuf[CMSG_SPACE(sizeof(*pinfo))];
1656 struct iovec iov[2];
1657 int fd, datalen, ret, iovlen = 1;
1661 fd = socket(AF_INET6, SOCK_RAW | SOCK_CLOEXEC, IPPROTO_RAW);
1665 memset(&frame, 0, sizeof(frame));
1666 memset(&dst, 0, sizeof(dst));
1668 if (type == ND_ROUTER_SOLICIT)
1669 datalen = sizeof(frame.i.rs); /* 8, csum() safe */
1670 else if (type == ND_ROUTER_ADVERT) {
1671 datalen = sizeof(frame.i.ra); /* 16, csum() safe */
1672 frame.i.ra.nd_ra_router_lifetime = htons(lifetime);
1673 } else if (type == ND_NEIGHBOR_SOLICIT) {
1674 datalen = sizeof(frame.i.ns); /* 24, csum() safe */
1675 memcpy(&frame.i.ns.nd_ns_target, buf, sizeof(struct in6_addr));
1681 dst.sin6_addr = *dest;
1684 src.sin6_addr = *source;
1686 src.sin6_addr = in6addr_any;
1688 /* Fill in the IPv6 header */
1689 frame.ip.ip6_vfc = 0x60;
1690 frame.ip.ip6_plen = htons(datalen + len);
1691 frame.ip.ip6_nxt = IPPROTO_ICMPV6;
1692 frame.ip.ip6_hlim = 255;
1693 frame.ip.ip6_dst = dst.sin6_addr;
1694 frame.ip.ip6_src = src.sin6_addr;
1695 /* all other fields are already set to zero */
1697 /* Prepare pseudo header for csum */
1698 memset(&phdr, 0, sizeof(phdr));
1699 phdr.dst = dst.sin6_addr;
1700 phdr.src = src.sin6_addr;
1701 phdr.plen = htonl(datalen + len);
1702 phdr.nxt = IPPROTO_ICMPV6;
1704 /* Fill in remaining ICMP header fields */
1705 frame.i.icmp.icmp6_type = type;
1706 frame.i.icmp.icmp6_cksum = csum(&phdr, &frame.i, datalen, buf, len);
1708 iov[0].iov_base = &frame;
1709 iov[0].iov_len = sizeof(frame.ip) + datalen;
1712 iov[1].iov_base = buf;
1713 iov[1].iov_len = len;
1717 dst.sin6_family = AF_INET6;
1718 msgh.msg_name = &dst;
1719 msgh.msg_namelen = sizeof(dst);
1721 msgh.msg_iovlen = iovlen;
1724 memset(cbuf, 0, CMSG_SPACE(sizeof(*pinfo)));
1725 cmsg = (struct cmsghdr *)cbuf;
1726 pinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg);
1727 pinfo->ipi6_ifindex = oif;
1729 cmsg->cmsg_len = CMSG_LEN(sizeof(*pinfo));
1730 cmsg->cmsg_level = IPPROTO_IPV6;
1731 cmsg->cmsg_type = IPV6_PKTINFO;
1732 msgh.msg_control = cmsg;
1733 msgh.msg_controllen = cmsg->cmsg_len;
1735 ret = sendmsg(fd, &msgh, 0);
1741 static inline void ipv6_addr_set(struct in6_addr *addr,
1742 uint32_t w1, uint32_t w2,
1743 uint32_t w3, uint32_t w4)
1745 addr->s6_addr32[0] = w1;
1746 addr->s6_addr32[1] = w2;
1747 addr->s6_addr32[2] = w3;
1748 addr->s6_addr32[3] = w4;
1751 static inline void ipv6_addr_solict_mult(const struct in6_addr *addr,
1752 struct in6_addr *solicited)
1754 ipv6_addr_set(solicited, htonl(0xFF020000), 0, htonl(0x1),
1755 htonl(0xFF000000) | addr->s6_addr32[3]);
1758 static int if_mc_group(int sock, int ifindex, const struct in6_addr *mc_addr,
1761 unsigned int val = 0;
1762 struct ipv6_mreq mreq;
1765 memset(&mreq, 0, sizeof(mreq));
1766 mreq.ipv6mr_interface = ifindex;
1767 mreq.ipv6mr_multiaddr = *mc_addr;
1769 ret = setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
1773 DBG("Cannot set IPV6_MULTICAST_LOOP %d/%s", ret,
1778 ret = setsockopt(sock, IPPROTO_IPV6, cmd, &mreq, sizeof(mreq));
1781 DBG("Cannot set option %d %d/%s", cmd, ret, strerror(-ret));
1788 int __connman_inet_ipv6_send_rs(int index, int timeout,
1789 __connman_inet_rs_cb_t callback, void *user_data)
1791 struct xs_cb_data *data;
1792 struct icmp6_filter filter;
1793 struct in6_addr solicit;
1794 struct in6_addr dst = in6addr_all_routers_mc;
1800 data = g_try_malloc0(sizeof(struct xs_cb_data));
1804 data->callback = callback;
1805 data->user_data = user_data;
1806 data->timeout = g_timeout_add_seconds(timeout, rs_timeout_cb, data);
1808 sk = socket(AF_INET6, SOCK_RAW | SOCK_CLOEXEC, IPPROTO_ICMPV6);
1814 ICMP6_FILTER_SETBLOCKALL(&filter);
1815 ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filter);
1817 setsockopt(sk, IPPROTO_ICMPV6, ICMP6_FILTER, &filter,
1818 sizeof(struct icmp6_filter));
1820 ipv6_addr_solict_mult(&dst, &solicit);
1821 if_mc_group(sk, index, &in6addr_all_nodes_mc, IPV6_JOIN_GROUP);
1822 if_mc_group(sk, index, &solicit, IPV6_JOIN_GROUP);
1824 data->channel = g_io_channel_unix_new(sk);
1825 g_io_channel_set_close_on_unref(data->channel, TRUE);
1827 g_io_channel_set_encoding(data->channel, NULL, NULL);
1828 g_io_channel_set_buffered(data->channel, FALSE);
1830 data->watch_id = g_io_add_watch(data->channel,
1831 G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
1832 icmpv6_event, data);
1834 ndisc_send_unspec(ND_ROUTER_SOLICIT, index, &dst, NULL, NULL, 0, 0);
1839 static inline void ipv6_addr_advert_mult(const struct in6_addr *addr,
1840 struct in6_addr *advert)
1842 ipv6_addr_set(advert, htonl(0xFF020000), 0, htonl(0x2),
1843 htonl(0xFF000000) | addr->s6_addr32[3]);
1846 #define MSG_SIZE_SEND 1452
1848 static int inc_len(int len, int inc)
1850 if (len > MSG_SIZE_SEND)
1857 int __connman_inet_ipv6_send_ra(int index, struct in6_addr *src_addr,
1858 GSList *prefixes, int router_lifetime)
1861 struct in6_addr src, *source;
1862 struct in6_addr dst = in6addr_all_nodes_mc;
1863 GDHCPIAPrefix *prefix;
1864 unsigned char buf[MSG_SIZE_SEND];
1865 char addr_str[INET6_ADDRSTRLEN];
1872 sk = socket(AF_INET6, SOCK_RAW | SOCK_CLOEXEC, IPPROTO_ICMPV6);
1877 __connman_inet_get_interface_ll_address(index, AF_INET6, &src);
1882 DBG("sock %d index %d prefixes %p src %s lifetime %d", sk, index,
1883 prefixes, inet_ntop(AF_INET6, source, addr_str,
1887 memset(buf, 0, MSG_SIZE_SEND);
1890 for (list = prefixes; list; list = list->next) {
1891 struct nd_opt_prefix_info *pinfo;
1893 prefix = list->data;
1894 pinfo = (struct nd_opt_prefix_info *)(buf + len);
1896 len = inc_len(len, sizeof(*pinfo));
1902 pinfo->nd_opt_pi_type = ND_OPT_PREFIX_INFORMATION;
1903 pinfo->nd_opt_pi_len = 4;
1904 pinfo->nd_opt_pi_prefix_len = prefix->prefixlen;
1905 pinfo->nd_opt_pi_flags_reserved = ND_OPT_PI_FLAG_ONLINK;
1906 pinfo->nd_opt_pi_flags_reserved |= ND_OPT_PI_FLAG_AUTO;
1907 if (router_lifetime > 0) {
1908 pinfo->nd_opt_pi_valid_time = htonl(prefix->valid);
1909 pinfo->nd_opt_pi_preferred_time =
1910 htonl(prefix->preferred);
1912 pinfo->nd_opt_pi_reserved2 = 0;
1914 memcpy(&pinfo->nd_opt_pi_prefix, &prefix->prefix,
1915 sizeof(struct in6_addr));
1917 DBG("[%d] index %d prefix %s/%d", count, index,
1918 inet_ntop(AF_INET6, &prefix->prefix, addr_str,
1919 INET6_ADDRSTRLEN), prefix->prefixlen);
1925 err = ndisc_send_unspec(ND_ROUTER_ADVERT, index, &dst, source,
1926 buf, len, router_lifetime);
1928 DBG("cannot send RA %d/%s", err, strerror(-err));
1936 void __connman_inet_ipv6_stop_recv_rs(void *context)
1941 xs_cleanup(context);
1944 static int icmpv6_rs_recv(int fd, struct xs_cb_data *data)
1948 unsigned char chdr[CMSG_BUF_LEN];
1949 unsigned char buf[1540];
1950 struct nd_router_solicit *hdr;
1951 struct sockaddr_in6 saddr;
1953 __connman_inet_recv_rs_cb_t cb = data->callback;
1957 iov.iov_len = sizeof(buf);
1960 mhdr.msg_name = (void *)&saddr;
1961 mhdr.msg_namelen = sizeof(struct sockaddr_in6);
1963 mhdr.msg_iov = &iov;
1964 mhdr.msg_iovlen = 1;
1965 mhdr.msg_control = (void *)chdr;
1966 mhdr.msg_controllen = CMSG_BUF_LEN;
1968 len = recvmsg(fd, &mhdr, 0);
1970 cb(NULL, 0, data->user_data);
1974 hdr = (struct nd_router_solicit *)buf;
1975 DBG("code %d len %zd hdr %zd", hdr->nd_rs_code, len,
1976 sizeof(struct nd_router_solicit));
1977 if (hdr->nd_rs_code != 0)
1980 cb(hdr, len, data->user_data);
1984 static gboolean icmpv6_rs_event(GIOChannel *chan, GIOCondition cond,
1988 struct xs_cb_data *xs_data = data;
1992 if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
1995 fd = g_io_channel_unix_get_fd(chan);
1996 ret = icmpv6_rs_recv(fd, xs_data);
2001 xs_data->watch_id = 0;
2005 int __connman_inet_ipv6_start_recv_rs(int index,
2006 __connman_inet_recv_rs_cb_t callback,
2010 struct xs_cb_data *data;
2011 struct icmp6_filter filter;
2012 char addr_str[INET6_ADDRSTRLEN];
2015 data = g_try_malloc0(sizeof(struct xs_cb_data));
2019 data->callback = callback;
2020 data->user_data = user_data;
2022 sk = socket(AF_INET6, SOCK_RAW | SOCK_CLOEXEC, IPPROTO_ICMPV6);
2030 ICMP6_FILTER_SETBLOCKALL(&filter);
2031 ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &filter);
2033 setsockopt(sk, IPPROTO_ICMPV6, ICMP6_FILTER, &filter,
2034 sizeof(struct icmp6_filter));
2036 err = if_mc_group(sk, index, &in6addr_all_routers_mc, IPV6_JOIN_GROUP);
2038 DBG("Cannot join mc %s %d/%s", inet_ntop(AF_INET6,
2039 &in6addr_all_routers_mc, addr_str, INET6_ADDRSTRLEN),
2040 err, strerror(-err));
2042 data->channel = g_io_channel_unix_new(sk);
2043 g_io_channel_set_close_on_unref(data->channel, TRUE);
2045 g_io_channel_set_encoding(data->channel, NULL, NULL);
2046 g_io_channel_set_buffered(data->channel, FALSE);
2048 data->watch_id = g_io_add_watch(data->channel,
2049 G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
2050 icmpv6_rs_event, data);
2057 static gboolean ns_timeout_cb(gpointer user_data)
2059 struct xs_cb_data *data = user_data;
2061 DBG("user data %p", user_data);
2066 if (data->callback) {
2067 __connman_inet_ns_cb_t cb = data->callback;
2068 cb(NULL, 0, &data->addr.sin6_addr, data->user_data);
2076 static int icmpv6_nd_recv(int fd, struct xs_cb_data *data)
2080 unsigned char chdr[CMSG_BUF_LEN];
2081 unsigned char buf[1540];
2082 struct nd_neighbor_advert *hdr;
2083 struct sockaddr_in6 saddr;
2085 __connman_inet_ns_cb_t cb = data->callback;
2089 iov.iov_len = sizeof(buf);
2092 mhdr.msg_name = (void *)&saddr;
2093 mhdr.msg_namelen = sizeof(struct sockaddr_in6);
2095 mhdr.msg_iov = &iov;
2096 mhdr.msg_iovlen = 1;
2097 mhdr.msg_control = (void *)chdr;
2098 mhdr.msg_controllen = CMSG_BUF_LEN;
2100 len = recvmsg(fd, &mhdr, 0);
2102 cb(NULL, 0, &data->addr.sin6_addr, data->user_data);
2106 hdr = (struct nd_neighbor_advert *)buf;
2107 DBG("code %d len %zd hdr %zd", hdr->nd_na_code, len,
2108 sizeof(struct nd_neighbor_advert));
2109 if (hdr->nd_na_code != 0)
2113 * We can receive any neighbor advertisement so we need to check if the
2114 * packet was meant for us and ignore the packet otherwise.
2116 if (memcmp(&data->addr.sin6_addr, &hdr->nd_na_target,
2117 sizeof(struct in6_addr)))
2120 cb(hdr, len, &data->addr.sin6_addr, data->user_data);
2125 static gboolean icmpv6_nd_event(GIOChannel *chan, GIOCondition cond,
2129 struct xs_cb_data *xs_data = data;
2133 if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
2136 fd = g_io_channel_unix_get_fd(chan);
2137 ret = icmpv6_nd_recv(fd, xs_data);
2142 xs_cleanup(xs_data);
2146 int __connman_inet_ipv6_do_dad(int index, int timeout_ms,
2147 struct in6_addr *addr,
2148 __connman_inet_ns_cb_t callback,
2151 struct xs_cb_data *data;
2152 struct icmp6_filter filter;
2153 struct in6_addr solicit;
2154 int sk, err, val = 1;
2156 if (timeout_ms <= 0)
2159 data = g_try_malloc0(sizeof(struct xs_cb_data));
2163 data->callback = callback;
2164 data->user_data = user_data;
2165 data->timeout = g_timeout_add_full(G_PRIORITY_DEFAULT,
2170 memcpy(&data->addr.sin6_addr, addr, sizeof(struct in6_addr));
2172 sk = socket(AF_INET6, SOCK_RAW | SOCK_CLOEXEC, IPPROTO_ICMPV6);
2178 ICMP6_FILTER_SETBLOCKALL(&filter);
2179 ICMP6_FILTER_SETPASS(ND_NEIGHBOR_ADVERT, &filter);
2181 setsockopt(sk, IPPROTO_ICMPV6, ICMP6_FILTER, &filter,
2182 sizeof(struct icmp6_filter));
2184 if (setsockopt(sk, IPPROTO_IPV6, IPV6_RECVPKTINFO,
2185 &val, sizeof(val)) < 0) {
2187 DBG("Cannot set IPV6_RECVPKTINFO %d/%s", err,
2193 if (setsockopt(sk, IPPROTO_IPV6, IPV6_RECVHOPLIMIT,
2194 &val, sizeof(val)) < 0) {
2196 DBG("Cannot set IPV6_RECVHOPLIMIT %d/%s", err,
2203 setsockopt(sk, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &val, sizeof(val));
2205 ipv6_addr_solict_mult(addr, &solicit);
2206 if_mc_group(sk, index, &in6addr_all_nodes_mc, IPV6_JOIN_GROUP);
2207 if_mc_group(sk, index, &solicit, IPV6_JOIN_GROUP);
2209 data->channel = g_io_channel_unix_new(sk);
2210 g_io_channel_set_close_on_unref(data->channel, TRUE);
2212 g_io_channel_set_encoding(data->channel, NULL, NULL);
2213 g_io_channel_set_buffered(data->channel, FALSE);
2215 data->watch_id = g_io_add_watch(data->channel,
2216 G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
2217 icmpv6_nd_event, data);
2219 err = ndisc_send_unspec(ND_NEIGHBOR_SOLICIT, index, &solicit, NULL,
2220 (unsigned char *)addr, 0, 0);
2222 DBG("Cannot send NS %d/%s", err, strerror(-err));
2229 GSList *__connman_inet_ipv6_get_prefixes(struct nd_router_advert *hdr,
2230 unsigned int length)
2232 GSList *prefixes = NULL;
2236 if (length <= sizeof(struct nd_router_advert))
2239 len = length - sizeof(struct nd_router_advert);
2240 pos = (uint8_t *)hdr + sizeof(struct nd_router_advert);
2243 struct nd_opt_prefix_info *pinfo;
2244 char prefix_str[INET6_ADDRSTRLEN+1], *str;
2251 optlen = pos[1] << 3;
2252 if (optlen == 0 || optlen > len)
2256 case ND_OPT_PREFIX_INFORMATION:
2257 pinfo = (struct nd_opt_prefix_info *)pos;
2258 prefix = inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix,
2259 prefix_str, INET6_ADDRSTRLEN);
2263 str = g_strdup_printf("%s/%d", prefix,
2264 pinfo->nd_opt_pi_prefix_len);
2265 prefixes = g_slist_prepend(prefixes, str);
2267 DBG("prefix %s", str);
2279 int connman_inet_get_dest_addr(int index, char **dest)
2281 struct interface_address if_addr = { 0 };
2282 struct in_addr dstaddr = { 0 };
2283 char buf[INET_ADDRSTRLEN] = { 0 };
2289 if_addr.index = index;
2290 if_addr.family = AF_INET;
2291 if_addr.allow_unspec = true;
2292 if_addr.ipaddrs[ADDR_TYPE_DSTADDR] = &dstaddr;
2294 err = get_interface_addresses(&if_addr);
2298 if (inet_ntop(AF_INET, &dstaddr, buf, INET_ADDRSTRLEN))
2299 *dest = g_strdup(buf);
2301 DBG("destination %s", *dest);
2303 return *dest && **dest ? 0 : -ENOENT;
2306 int connman_inet_ipv6_get_dest_addr(int index, char **dest)
2308 struct interface_address if_addr = { 0 };
2309 struct in_addr dstaddr = { 0 };
2310 char buf[INET6_ADDRSTRLEN] = { 0 };
2316 if_addr.index = index;
2317 if_addr.family = AF_INET6;
2318 if_addr.allow_unspec = true;
2319 if_addr.ipaddrs[ADDR_TYPE_DSTADDR] = &dstaddr;
2321 err = get_interface_addresses(&if_addr);
2325 if (inet_ntop(AF_INET6, &dstaddr, buf, INET6_ADDRSTRLEN))
2326 *dest = g_strdup(buf);
2328 DBG("destination %s", *dest);
2330 return *dest && **dest ? 0 : -ENOENT;
2333 /* destination is optional */
2334 int connman_inet_get_route_addresses(int index, char **network, char **netmask,
2337 struct interface_address if_addr = { 0 };
2338 struct in_addr addr = { 0 };
2339 struct in_addr mask = { 0 };
2340 struct in_addr dest = { 0 };
2341 struct in_addr nw_addr = { 0 };
2342 char buf[INET_ADDRSTRLEN] = { 0 };
2345 if (!network || !netmask)
2348 if_addr.index = index;
2349 if_addr.family = AF_INET;
2350 if_addr.ipaddrs[ADDR_TYPE_IPADDR] = &addr;
2351 if_addr.ipaddrs[ADDR_TYPE_NETMASK] = &mask;
2352 if_addr.ipaddrs[ADDR_TYPE_DSTADDR] = &dest;
2354 err = get_interface_addresses(&if_addr);
2358 nw_addr.s_addr = (addr.s_addr & mask.s_addr);
2360 if (inet_ntop(AF_INET, &nw_addr, buf, INET_ADDRSTRLEN))
2361 *network = g_strdup(buf);
2363 memset(&buf, 0, INET_ADDRSTRLEN);
2365 if (inet_ntop(AF_INET, &mask, buf, INET_ADDRSTRLEN))
2366 *netmask = g_strdup(buf);
2369 memset(&buf, 0, INET_ADDRSTRLEN);
2371 if (inet_ntop(AF_INET, &dest, buf, INET_ADDRSTRLEN))
2372 *destination = g_strdup(buf);
2375 DBG("network %s netmask %s destination %s", *network, *netmask,
2376 destination ? *destination : NULL);
2378 return *network && **network && *netmask && **netmask ? 0 : -ENOENT;
2381 int connman_inet_ipv6_get_route_addresses(int index, char **network,
2382 char **netmask, char **destination)
2384 struct interface_address if_addr = { 0 };
2385 struct in6_addr addr = { 0 };
2386 struct in6_addr mask = { 0 };
2387 struct in6_addr dest = { 0 };
2388 struct in6_addr nw_addr = { 0 };
2389 char buf[INET6_ADDRSTRLEN] = { 0 };
2395 if_addr.index = index;
2396 if_addr.family = AF_INET6;
2397 if_addr.ipaddrs[ADDR_TYPE_IPADDR] = &addr;
2398 if_addr.ipaddrs[ADDR_TYPE_NETMASK] = &mask;
2399 if_addr.ipaddrs[ADDR_TYPE_DSTADDR] = &dest;
2401 err = get_interface_addresses(&if_addr);
2405 ipv6_addr_set(&nw_addr, addr.s6_addr32[0] & mask.s6_addr32[0],
2406 addr.s6_addr32[1] & mask.s6_addr32[1],
2407 addr.s6_addr32[2] & mask.s6_addr32[2],
2408 addr.s6_addr32[3] & mask.s6_addr32[3]);
2410 if (inet_ntop(AF_INET6, &nw_addr, buf, INET6_ADDRSTRLEN))
2411 *network = g_strdup(buf);
2413 memset(&buf, 0, INET6_ADDRSTRLEN);
2415 if (inet_ntop(AF_INET6, &mask, buf, INET6_ADDRSTRLEN))
2416 *netmask = g_strdup(buf);
2419 memset(&buf, 0, INET6_ADDRSTRLEN);
2421 if (inet_ntop(AF_INET6, &dest, buf, INET6_ADDRSTRLEN))
2422 *destination = g_strdup(buf);
2425 DBG("network %s netmask %s destination %s", *network, *netmask,
2426 destination ? *destination : NULL);
2428 return *network && **network && *netmask && **netmask ? 0 : -ENOENT;
2431 int __connman_inet_rtnl_open(struct __connman_inet_rtnl_handle *rth)
2434 int rcvbuf = 1024 * 4;
2436 rth->fd = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE);
2438 connman_error("Can not open netlink socket: %s",
2443 if (setsockopt(rth->fd, SOL_SOCKET, SO_SNDBUF, &sndbuf,
2444 sizeof(sndbuf)) < 0) {
2445 connman_error("SO_SNDBUF: %s", strerror(errno));
2449 if (setsockopt(rth->fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf,
2450 sizeof(rcvbuf)) < 0) {
2451 connman_error("SO_RCVBUF: %s", strerror(errno));
2455 memset(&rth->local, 0, sizeof(rth->local));
2456 rth->local.nl_family = AF_NETLINK;
2457 rth->local.nl_groups = 0;
2459 if (bind(rth->fd, (struct sockaddr *)&rth->local,
2460 sizeof(rth->local)) < 0) {
2461 connman_error("Can not bind netlink socket: %s",
2466 rth->seq = time(NULL);
2468 DBG("fd %d", rth->fd);
2473 struct inet_rtnl_cb_data {
2474 GIOChannel *channel;
2475 __connman_inet_rtnl_cb_t callback;
2478 struct __connman_inet_rtnl_handle *rtnl;
2482 static void inet_rtnl_cleanup(struct inet_rtnl_cb_data *data)
2484 struct __connman_inet_rtnl_handle *rth = data->rtnl;
2486 if (data->channel) {
2487 g_io_channel_shutdown(data->channel, TRUE, NULL);
2488 g_io_channel_unref(data->channel);
2489 data->channel = NULL;
2492 DBG("data %p", data);
2494 if (data->rtnl_timeout > 0)
2495 g_source_remove(data->rtnl_timeout);
2497 if (data->watch_id > 0)
2498 g_source_remove(data->watch_id);
2501 __connman_inet_rtnl_close(rth);
2508 static gboolean inet_rtnl_timeout_cb(gpointer user_data)
2510 struct inet_rtnl_cb_data *data = user_data;
2512 DBG("user data %p", user_data);
2518 data->callback(NULL, data->user_data);
2520 data->rtnl_timeout = 0;
2521 inet_rtnl_cleanup(data);
2525 static int inet_rtnl_recv(GIOChannel *chan, struct inet_rtnl_cb_data *rtnl_data)
2527 struct __connman_inet_rtnl_handle *rth = rtnl_data->rtnl;
2528 struct nlmsghdr *h = NULL;
2529 struct sockaddr_nl nladdr;
2530 socklen_t addr_len = sizeof(nladdr);
2531 unsigned char buf[4096];
2536 memset(buf, 0, sizeof(buf));
2537 memset(&nladdr, 0, sizeof(nladdr));
2539 fd = g_io_channel_unix_get_fd(chan);
2541 status = recvfrom(fd, buf, sizeof(buf), 0,
2542 (struct sockaddr *) &nladdr, &addr_len);
2544 if (errno == EINTR || errno == EAGAIN)
2553 if (nladdr.nl_pid != 0) { /* not sent by kernel, ignore */
2554 DBG("Received msg from %u, ignoring it", nladdr.nl_pid);
2561 struct nlmsgerr *err;
2565 if (!NLMSG_OK(h, len))
2568 if (h->nlmsg_seq != rth->seq) {
2570 DBG("skip %d/%d len %d", rth->seq,
2571 h->nlmsg_seq, h->nlmsg_len);
2573 len -= h->nlmsg_len;
2574 ptr += h->nlmsg_len;
2578 switch (h->nlmsg_type) {
2584 err = (struct nlmsgerr *)NLMSG_DATA(h);
2585 connman_error("RTNETLINK answers %s (%d)",
2586 strerror(-err->error), -err->error);
2593 if (h->nlmsg_seq == rth->seq) {
2594 DBG("received %d seq %d", h->nlmsg_len, h->nlmsg_seq);
2596 rtnl_data->callback(h, rtnl_data->user_data);
2598 inet_rtnl_cleanup(rtnl_data);
2604 static gboolean inet_rtnl_event(GIOChannel *chan, GIOCondition cond,
2608 struct inet_rtnl_cb_data *rtnl_data = user_data;
2612 if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
2615 ret = inet_rtnl_recv(chan, rtnl_data);
2620 rtnl_data->callback(NULL, rtnl_data->user_data);
2621 inet_rtnl_cleanup(rtnl_data);
2625 int __connman_inet_rtnl_talk(struct __connman_inet_rtnl_handle *rtnl,
2626 struct nlmsghdr *n, int timeout,
2627 __connman_inet_rtnl_cb_t callback, void *user_data)
2629 struct sockaddr_nl nladdr;
2630 struct inet_rtnl_cb_data *data;
2633 memset(&nladdr, 0, sizeof(nladdr));
2634 nladdr.nl_family = AF_NETLINK;
2636 n->nlmsg_seq = ++rtnl->seq;
2639 data = g_try_malloc0(sizeof(struct inet_rtnl_cb_data));
2643 data->callback = callback;
2644 data->user_data = user_data;
2646 data->rtnl_timeout = g_timeout_add_seconds(timeout,
2647 inet_rtnl_timeout_cb, data);
2649 data->channel = g_io_channel_unix_new(rtnl->fd);
2651 g_io_channel_set_encoding(data->channel, NULL, NULL);
2652 g_io_channel_set_buffered(data->channel, FALSE);
2654 data->watch_id = g_io_add_watch(data->channel,
2655 G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
2656 inet_rtnl_event, data);
2658 n->nlmsg_flags |= NLM_F_ACK;
2660 err = sendto(rtnl->fd, &rtnl->req.n, rtnl->req.n.nlmsg_len, 0,
2661 (struct sockaddr *) &nladdr, sizeof(nladdr));
2662 DBG("handle %p len %d", rtnl, rtnl->req.n.nlmsg_len);
2664 connman_error("Can not talk to rtnetlink err %d %s",
2665 -errno, strerror(errno));
2669 if ((unsigned int)err != rtnl->req.n.nlmsg_len) {
2670 connman_error("Sent %d bytes, msg truncated", err);
2677 void __connman_inet_rtnl_close(struct __connman_inet_rtnl_handle *rth)
2679 DBG("handle %p", rth);
2687 int __connman_inet_rtnl_addattr32(struct nlmsghdr *n, size_t maxlen, int type,
2690 int len = RTA_LENGTH(4);
2693 if (NLMSG_ALIGN(n->nlmsg_len) + len > maxlen) {
2694 DBG("Error! max allowed bound %zd exceeded", maxlen);
2697 rta = NLMSG_TAIL(n);
2698 rta->rta_type = type;
2700 memcpy(RTA_DATA(rta), &data, 4);
2701 n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + len;
2706 static int parse_rtattr(struct rtattr *tb[], int max,
2707 struct rtattr *rta, int len)
2709 memset(tb, 0, sizeof(struct rtattr *) * (max + 1));
2710 while (RTA_OK(rta, len)) {
2711 if ((rta->rta_type <= max) && (!tb[rta->rta_type]))
2712 tb[rta->rta_type] = rta;
2713 rta = RTA_NEXT(rta, len);
2716 connman_error("Deficit %d, rta_len=%d", len, rta->rta_len);
2721 struct get_route_cb_data {
2722 connman_inet_addr_cb_t callback;
2726 static void get_route_cb(struct nlmsghdr *answer, void *user_data)
2728 struct get_route_cb_data *data = user_data;
2729 struct rtattr *tb[RTA_MAX+1];
2730 struct rtmsg *r = NLMSG_DATA(answer);
2731 int len, index = -1;
2733 const char *addr = NULL;
2735 DBG("answer %p data %p", answer, user_data);
2740 len = answer->nlmsg_len;
2742 if (answer->nlmsg_type != RTM_NEWROUTE &&
2743 answer->nlmsg_type != RTM_DELROUTE) {
2744 connman_error("Not a route: %08x %08x %08x",
2745 answer->nlmsg_len, answer->nlmsg_type,
2746 answer->nlmsg_flags);
2750 len -= NLMSG_LENGTH(sizeof(*r));
2752 connman_error("BUG: wrong nlmsg len %d", len);
2756 parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len);
2759 index = *(int *)RTA_DATA(tb[RTA_OIF]);
2761 if (tb[RTA_GATEWAY])
2762 addr = inet_ntop(r->rtm_family,
2763 RTA_DATA(tb[RTA_GATEWAY]),
2764 abuf, sizeof(abuf));
2766 DBG("addr %s index %d user %p", addr, index, data->user_data);
2769 if (data && data->callback)
2770 data->callback(addr, index, data->user_data);
2776 * Return the interface index that contains route to host.
2778 int __connman_inet_get_route(const char *dest_address,
2779 connman_inet_addr_cb_t callback, void *user_data)
2781 struct get_route_cb_data *data;
2782 struct addrinfo hints, *rp;
2783 struct __connman_inet_rtnl_handle *rth;
2786 DBG("dest %s", dest_address);
2791 memset(&hints, 0, sizeof(hints));
2792 hints.ai_family = AF_UNSPEC;
2793 hints.ai_flags = AI_PASSIVE | AI_NUMERICSERV | AI_NUMERICHOST;
2795 err = getaddrinfo(dest_address, NULL, &hints, &rp);
2799 rth = g_try_malloc0(sizeof(struct __connman_inet_rtnl_handle));
2805 rth->req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
2806 rth->req.n.nlmsg_flags = NLM_F_REQUEST;
2807 rth->req.n.nlmsg_type = RTM_GETROUTE;
2808 rth->req.u.r.rt.rtm_family = rp->ai_family;
2809 rth->req.u.r.rt.rtm_table = 0;
2810 rth->req.u.r.rt.rtm_protocol = 0;
2811 rth->req.u.r.rt.rtm_scope = 0;
2812 rth->req.u.r.rt.rtm_type = 0;
2813 rth->req.u.r.rt.rtm_src_len = 0;
2814 rth->req.u.r.rt.rtm_tos = 0;
2816 if (rp->ai_family == AF_INET) {
2817 struct sockaddr_in *sin = (struct sockaddr_in *)rp->ai_addr;
2819 rth->req.u.r.rt.rtm_dst_len = 32;
2820 __connman_inet_rtnl_addattr_l(&rth->req.n, sizeof(rth->req),
2821 RTA_DST, &sin->sin_addr, sizeof(sin->sin_addr));
2822 } else if (rp->ai_family == AF_INET6) {
2823 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)rp->ai_addr;
2825 rth->req.u.r.rt.rtm_dst_len = 128;
2826 __connman_inet_rtnl_addattr_l(&rth->req.n, sizeof(rth->req),
2827 RTA_DST, &sin6->sin6_addr, sizeof(sin6->sin6_addr));
2832 err = __connman_inet_rtnl_open(rth);
2836 data = g_try_malloc(sizeof(struct get_route_cb_data));
2842 data->callback = callback;
2843 data->user_data = user_data;
2845 #define GET_ROUTE_TIMEOUT 2
2846 err = __connman_inet_rtnl_talk(rth, &rth->req.n, GET_ROUTE_TIMEOUT,
2847 get_route_cb, data);
2856 __connman_inet_rtnl_close(rth);
2863 int connman_inet_check_ipaddress(const char *host)
2865 struct addrinfo hints;
2866 struct addrinfo *addr;
2869 memset(&hints, 0, sizeof(struct addrinfo));
2870 hints.ai_flags = AI_NUMERICHOST;
2873 result = getaddrinfo(host, NULL, &hints, &addr);
2875 result = addr->ai_family;
2882 /* Check routine modified from ics-dhcp 4.2.3-P2 */
2883 bool connman_inet_check_hostname(const char *ptr, size_t len)
2888 * Not empty or complete length not over 255 characters.
2890 if ((len == 0) || (len > 256))
2894 * Consists of [[:alnum:]-]+ labels separated by [.]
2895 * a [_] is against RFC but seems to be "widely used"
2897 for (p = ptr; (*p != 0) && (len-- > 0); p++) {
2899 if ((*p == '-') || (*p == '_')) {
2901 * Not allowed at begin or end of a label.
2903 if (((p - ptr) == 0) || (len == 0) || (p[1] == '.'))
2906 } else if (*p == '.') {
2908 * Each label has to be 1-63 characters;
2909 * we allow [.] at the end ('foo.bar.')
2913 if ((d <= 0) || (d >= 64))
2916 ptr = p + 1; /* Jump to the next label */
2918 } else if (isalnum((unsigned char)*p) == 0) {
2920 * Also numbers at the begin are fine
2929 char **__connman_inet_get_running_interfaces(void)
2933 struct ifreq *ifr = NULL;
2934 int sk, i, numif, count = 0;
2936 memset(&ifc, 0, sizeof(ifc));
2938 sk = socket(AF_INET, SOCK_DGRAM, 0);
2942 if (ioctl(sk, SIOCGIFCONF, &ifc) < 0)
2946 * Allocate some extra bytes just in case there will
2947 * be new interfaces added between two SIOCGIFCONF
2950 ifr = g_try_malloc0(ifc.ifc_len * 2);
2956 if (ioctl(sk, SIOCGIFCONF, &ifc) < 0)
2959 numif = ifc.ifc_len / sizeof(struct ifreq);
2961 result = g_try_malloc0((numif + 1) * sizeof(char *));
2967 for (i = 0; i < numif; i++) {
2968 struct ifreq *r = &ifr[i];
2969 struct in6_addr *addr6;
2973 * Note that we do not return loopback interfaces here as they
2974 * are not needed for our purposes.
2976 switch (r->ifr_addr.sa_family) {
2978 addr4 = ntohl(((struct sockaddr_in *)
2979 &r->ifr_addr)->sin_addr.s_addr);
2980 if (((addr4 & 0xff000000) >> 24) == 127)
2984 addr6 = &((struct sockaddr_in6 *)
2985 &r->ifr_addr)->sin6_addr;
2986 if (IN6_IS_ADDR_LINKLOCAL(addr6))
2991 result[count++] = g_strdup(r->ifr_name);
2996 if (count < numif) {
2997 char **prev_result = result;
2998 result = g_try_realloc(result, (count + 1) * sizeof(char *));
3000 g_free(prev_result);
3013 bool connman_inet_is_ipv6_supported()
3017 sk = socket(PF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
3026 * Omits checking of the gateway matching the actual gateway IP since both
3027 * connmand and vpnd use inet.c, getting the route is via ipconfig and ipconfig
3028 * is different for both. Gateway is left here for possible future use.
3030 * Gateway can be NULL and connection.c then assigns 0.0.0.0 address or ::,
3031 * depending on IP family.
3033 bool connman_inet_is_default_route(int family, const char *host,
3034 const char *gateway, const char *netmask)
3036 return __connman_inet_is_any_addr(host, family) &&
3037 __connman_inet_is_any_addr(netmask, family);
3040 int __connman_inet_get_interface_address(int index, int family, void *address)
3042 struct interface_address if_addr = { 0 };
3044 if_addr.index = index;
3045 if_addr.family = family;
3046 if_addr.ipaddrs[ADDR_TYPE_IPADDR] = address;
3048 return get_interface_addresses(&if_addr);
3051 int __connman_inet_get_interface_mac_address(int index, uint8_t *mac_address)
3057 sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
3059 DBG("Open socket error");
3063 memset(&ifr, 0, sizeof(ifr));
3064 ifr.ifr_ifindex = index;
3066 err = ioctl(sk, SIOCGIFNAME, &ifr);
3068 DBG("Get interface name error");
3072 err = ioctl(sk, SIOCGIFHWADDR, &ifr);
3074 DBG("Get MAC address error");
3078 memcpy(mac_address, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
3086 static int iprule_modify(int cmd, int family, uint32_t table_id,
3089 struct __connman_inet_rtnl_handle rth;
3092 memset(&rth, 0, sizeof(rth));
3094 rth.req.n.nlmsg_type = cmd;
3095 rth.req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
3096 rth.req.n.nlmsg_flags = NLM_F_REQUEST;
3097 rth.req.u.r.rt.rtm_family = family;
3098 rth.req.u.r.rt.rtm_protocol = RTPROT_BOOT;
3099 rth.req.u.r.rt.rtm_scope = RT_SCOPE_UNIVERSE;
3100 rth.req.u.r.rt.rtm_table = table_id;
3101 rth.req.u.r.rt.rtm_type = RTN_UNSPEC;
3102 rth.req.u.r.rt.rtm_flags = 0;
3104 if (cmd == RTM_NEWRULE) {
3105 rth.req.n.nlmsg_flags |= NLM_F_CREATE|NLM_F_EXCL;
3106 rth.req.u.r.rt.rtm_type = RTN_UNICAST;
3109 __connman_inet_rtnl_addattr32(&rth.req.n, sizeof(rth.req),
3110 FRA_FWMARK, fwmark);
3112 if (table_id < 256) {
3113 rth.req.u.r.rt.rtm_table = table_id;
3115 rth.req.u.r.rt.rtm_table = RT_TABLE_UNSPEC;
3116 __connman_inet_rtnl_addattr32(&rth.req.n, sizeof(rth.req),
3117 FRA_TABLE, table_id);
3120 if (rth.req.u.r.rt.rtm_family == AF_UNSPEC)
3121 rth.req.u.r.rt.rtm_family = AF_INET;
3123 ret = __connman_inet_rtnl_open(&rth);
3127 ret = __connman_inet_rtnl_send(&rth, &rth.req.n);
3130 __connman_inet_rtnl_close(&rth);
3135 int __connman_inet_add_fwmark_rule(uint32_t table_id, int family, uint32_t fwmark)
3137 /* ip rule add fwmark 9876 table 1234 */
3139 return iprule_modify(RTM_NEWRULE, family, table_id, fwmark);
3142 int __connman_inet_del_fwmark_rule(uint32_t table_id, int family, uint32_t fwmark)
3144 return iprule_modify(RTM_DELRULE, family, table_id, fwmark);
3147 static int iproute_default_modify(int cmd, uint32_t table_id, int ifindex,
3148 const char *gateway, unsigned char prefixlen)
3150 struct __connman_inet_rtnl_handle rth;
3151 unsigned char buf[sizeof(struct in6_addr)];
3153 int family = connman_inet_check_ipaddress(gateway);
3156 DBG("gateway %s/%u table %u", gateway, prefixlen, table_id);
3170 struct in_addr ipv4_subnet_addr, ipv4_mask;
3172 memset(&ipv4_subnet_addr, 0, sizeof(ipv4_subnet_addr));
3173 ipv4_mask.s_addr = htonl((0xffffffff << (32 - prefixlen)) & 0xffffffff);
3174 ipv4_subnet_addr.s_addr = inet_addr(gateway);
3175 ipv4_subnet_addr.s_addr &= ipv4_mask.s_addr;
3177 dst = g_strdup(inet_ntoa(ipv4_subnet_addr));
3180 ret = inet_pton(family, dst ? dst : gateway, buf);
3185 memset(&rth, 0, sizeof(rth));
3187 rth.req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
3188 rth.req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL;
3189 rth.req.n.nlmsg_type = cmd;
3190 rth.req.u.r.rt.rtm_family = family;
3191 rth.req.u.r.rt.rtm_table = RT_TABLE_MAIN;
3192 rth.req.u.r.rt.rtm_scope = RT_SCOPE_NOWHERE;
3193 rth.req.u.r.rt.rtm_protocol = RTPROT_BOOT;
3194 rth.req.u.r.rt.rtm_scope = RT_SCOPE_UNIVERSE;
3195 rth.req.u.r.rt.rtm_type = RTN_UNICAST;
3196 rth.req.u.r.rt.rtm_dst_len = prefixlen;
3198 __connman_inet_rtnl_addattr_l(&rth.req.n, sizeof(rth.req),
3199 prefixlen > 0 ? RTA_DST : RTA_GATEWAY, buf, len);
3201 if (table_id < 256) {
3202 rth.req.u.r.rt.rtm_table = table_id;
3204 rth.req.u.r.rt.rtm_table = RT_TABLE_UNSPEC;
3205 __connman_inet_rtnl_addattr32(&rth.req.n, sizeof(rth.req),
3206 RTA_TABLE, table_id);
3209 __connman_inet_rtnl_addattr32(&rth.req.n, sizeof(rth.req),
3212 ret = __connman_inet_rtnl_open(&rth);
3216 ret = __connman_inet_rtnl_send(&rth, &rth.req.n);
3219 __connman_inet_rtnl_close(&rth);
3224 int __connman_inet_add_default_to_table(uint32_t table_id, int ifindex,
3225 const char *gateway)
3227 /* ip route add default via 1.2.3.4 dev wlan0 table 1234 */
3229 return iproute_default_modify(RTM_NEWROUTE, table_id, ifindex, gateway, 0);
3232 int __connman_inet_add_subnet_to_table(uint32_t table_id, int ifindex,
3233 const char *gateway, unsigned char prefixlen)
3235 /* ip route add 1.2.3.4/24 dev eth0 table 1234 */
3236 return iproute_default_modify(RTM_NEWROUTE, table_id, ifindex, gateway, prefixlen);
3239 int __connman_inet_del_default_from_table(uint32_t table_id, int ifindex,
3240 const char *gateway)
3242 /* ip route del default via 1.2.3.4 dev wlan0 table 1234 */
3244 return iproute_default_modify(RTM_DELROUTE, table_id, ifindex, gateway, 0);
3247 int __connman_inet_del_subnet_from_table(uint32_t table_id, int ifindex,
3248 const char *gateway, unsigned char prefixlen)
3250 /* ip route del 1.2.3.4/24 dev eth0 table 1234 */
3251 return iproute_default_modify(RTM_DELROUTE, table_id, ifindex, gateway, prefixlen);
3254 int __connman_inet_get_interface_ll_address(int index, int family,
3257 struct interface_address if_addr = { 0 };
3259 if_addr.index = index;
3260 if_addr.family = family;
3261 if_addr.require_ll = true;
3262 if_addr.ipaddrs[ADDR_TYPE_IPADDR] = address;
3264 return get_interface_addresses(&if_addr);
3267 int __connman_inet_get_address_netmask(int ifindex,
3268 struct sockaddr_in *address,
3269 struct sockaddr_in *netmask)
3271 int sk, ret = -EINVAL;
3274 DBG("index %d", ifindex);
3276 sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
3280 memset(&ifr, 0, sizeof(ifr));
3281 ifr.ifr_ifindex = ifindex;
3283 if (ioctl(sk, SIOCGIFNAME, &ifr) < 0)
3286 if (ioctl(sk, SIOCGIFNETMASK, &ifr) < 0)
3289 memcpy(netmask, (struct sockaddr_in *)&ifr.ifr_netmask,
3290 sizeof(struct sockaddr_in));
3292 if (ioctl(sk, SIOCGIFADDR, &ifr) < 0)
3295 memcpy(address, (struct sockaddr_in *)&ifr.ifr_addr,
3296 sizeof(struct sockaddr_in));
3304 static int get_nfs_server_ip(const char *cmdline_file, const char *pnp_file,
3305 struct in_addr *addr)
3309 char addrstr[INET_ADDRSTRLEN];
3310 struct in_addr taddr;
3311 GError *error = NULL;
3312 char *cmdline = NULL;
3315 char **pnpent = NULL;
3320 cmdline_file = "/proc/cmdline";
3322 pnp_file = "/proc/net/pnp";
3325 addr->s_addr = INADDR_NONE;
3327 if (!g_file_get_contents(cmdline_file, &cmdline, NULL, &error)) {
3328 connman_error("%s: Cannot read %s %s\n", __func__,
3329 cmdline_file, error->message);
3333 if (g_file_test(pnp_file, G_FILE_TEST_EXISTS)) {
3334 if (!g_file_get_contents(pnp_file, &pnp, NULL, &error)) {
3335 connman_error("%s: Cannot read %s %s\n", __func__,
3336 pnp_file, error->message);
3342 len = strlen(cmdline);
3347 /* remove newline */
3348 if (cmdline[len - 1] == '\n')
3349 cmdline[--len] = '\0';
3351 /* split in arguments (separated by space) */
3352 args = g_strsplit(cmdline, " ", 0);
3354 connman_error("%s: Cannot split cmdline \"%s\"\n", __func__,
3359 /* split in entries (by newlines) */
3360 pnpent = g_strsplit(pnp, "\n", 0);
3362 connman_error("%s: Cannot split pnp at file \"%s\"\n", __func__,
3367 /* first find root argument */
3368 for (pp = args; *pp; pp++) {
3369 if (!strcmp(*pp, "root=/dev/nfs"))
3372 /* no rootnfs found */
3376 /* locate nfsroot argument */
3377 for (pp = args; *pp; pp++) {
3378 if (!strncmp(*pp, "nfsroot=", strlen("nfsroot=")))
3381 /* no nfsroot argument found */
3385 /* determine if nfsroot server is provided */
3386 nfsargs = strchr(*pp, '=');
3391 /* find whether serverip is present */
3392 s = strchr(nfsargs, ':');
3397 /* no serverip, use bootserver */
3398 for (pp = pnpent; *pp; pp++) {
3399 if (!strncmp(*pp, "bootserver ", strlen("bootserver ")))
3402 /* no bootserver found */
3405 s = *pp + strlen("bootserver ");
3409 /* copy to addr string buffer */
3410 if (len >= sizeof(addrstr)) {
3411 connman_error("%s: Bad server\n", __func__);
3414 memcpy(addrstr, s, len);
3415 addrstr[len] = '\0';
3417 err = inet_pton(AF_INET, addrstr, addr);
3419 connman_error("%s: Cannot convert to numeric addr \"%s\"\n",
3431 g_error_free(error);
3438 /* get interface out of which peer is reachable (IPv4 only) */
3439 static int get_peer_iface(struct in_addr *addr, char *ifname)
3441 struct ifaddrs *ifaddr, *ifa;
3442 struct sockaddr_in saddr, *ifsaddr;
3447 /* Obtain address(es) matching host/port */
3448 err = getifaddrs(&ifaddr);
3450 connman_error("%s: getifaddrs() failed %d (%s)\n",
3451 __func__, errno, strerror(errno));
3455 s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
3457 connman_error("%s: socket() failed %d (%s)\n",
3458 __func__, errno, strerror(errno));
3462 memset(&saddr, 0, sizeof(saddr));
3463 saddr.sin_family = AF_INET;
3464 saddr.sin_port = 0; /* any port */
3465 saddr.sin_addr = *addr;
3467 /* no need to bind, connect will select iface */
3468 err = connect(s, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in));
3470 connman_error("%s: connect() failed: %d (%s)\n",
3471 __func__, errno, strerror(errno));
3475 socklen = sizeof(saddr);
3476 err = getsockname(s, (struct sockaddr *)&saddr, &socklen);
3478 connman_error("%s: getsockname() failed: %d (%s)\n",
3479 __func__, errno, strerror(errno));
3484 for (ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
3488 /* only IPv4 address */
3489 if (ifa->ifa_addr->sa_family != AF_INET)
3492 ifsaddr = (struct sockaddr_in *)ifa->ifa_addr;
3494 /* match address? */
3495 if (ifsaddr->sin_addr.s_addr == saddr.sin_addr.s_addr)
3502 strcpy(ifname, ifa->ifa_name);
3508 freeifaddrs(ifaddr);
3513 bool __connman_inet_isrootnfs_device(const char *devname)
3515 struct in_addr addr;
3516 char ifname[IFNAMSIZ];
3518 return get_nfs_server_ip(NULL, NULL, &addr) == 0 &&
3519 get_peer_iface(&addr, ifname) == 0 &&
3520 strcmp(devname, ifname) == 0;
3523 char **__connman_inet_get_pnp_nameservers(const char *pnp_file)
3528 GError *error = NULL;
3530 char **pnpent = NULL;
3531 char **nameservers = NULL;
3534 pnp_file = "/proc/net/pnp";
3536 if (!g_file_test(pnp_file, G_FILE_TEST_EXISTS))
3539 if (!g_file_get_contents(pnp_file, &pnp, NULL, &error)) {
3540 connman_error("%s: Cannot read %s %s\n", __func__,
3541 pnp_file, error->message);
3545 /* split in entries (by newlines) */
3546 pnpent = g_strsplit(pnp, "\n", 0);
3548 connman_error("%s: Cannot split pnp \"%s\"\n", __func__,
3554 * Perform two passes to retrieve a char ** array of
3555 * nameservers that are not 0.0.0.0
3557 * The first pass counts them, the second fills in the
3562 for (pass = 1; pass <= 2; pass++) {
3564 /* at the start of the second pass allocate */
3566 nameservers = g_new(char *, count + 1);
3569 for (pp = pnpent; *pp; pp++) {
3570 /* match 'nameserver ' at the start of each line */
3571 if (strncmp(*pp, "nameserver ", strlen("nameserver ")))
3574 /* compare it against 0.0.0.0 */
3575 s = *pp + strlen("nameserver ");
3576 if (!strcmp(s, "0.0.0.0"))
3579 /* on second pass fill in array */
3581 nameservers[count] = g_strdup(s);
3585 /* no nameservers? */
3589 /* and terminate char ** array with NULL */
3591 nameservers[count] = NULL;
3599 g_error_free(error);