diff options
author | Robert Greenwalt | 2011-05-24 23:12:51 -0500 |
---|---|---|
committer | Robert Greenwalt | 2011-05-25 23:22:56 -0500 |
commit | b6b48ae47a44cb231d0a16ca618ac28b0024c11c (patch) | |
tree | abb64497dc37999c930e46e050d99a86b831e0ad /libnetutils | |
parent | 1ffdb38213d177a83d74e1dc3bf41237dcbe8c9a (diff) | |
download | platform-system-core-b6b48ae47a44cb231d0a16ca618ac28b0024c11c.tar.gz platform-system-core-b6b48ae47a44cb231d0a16ca618ac28b0024c11c.tar.xz platform-system-core-b6b48ae47a44cb231d0a16ca618ac28b0024c11c.zip |
Revert some of change 109925 to fix connectivity
bug:4476009
Change-Id: I93c492eebe24d9744b8ef79378c73301d167f5a3
Diffstat (limited to 'libnetutils')
-rw-r--r-- | libnetutils/ifc_utils.c | 135 |
1 files changed, 126 insertions, 9 deletions
diff --git a/libnetutils/ifc_utils.c b/libnetutils/ifc_utils.c index 2e3df0003..208402c99 100644 --- a/libnetutils/ifc_utils.c +++ b/libnetutils/ifc_utils.c | |||
@@ -51,6 +51,8 @@ static int ifc_ctl_sock = -1; | |||
51 | static int ifc_ctl_sock6 = -1; | 51 | static int ifc_ctl_sock6 = -1; |
52 | void printerr(char *fmt, ...); | 52 | void printerr(char *fmt, ...); |
53 | 53 | ||
54 | #define DBG 0 | ||
55 | |||
54 | in_addr_t prefixLengthToIpv4Netmask(int prefix_length) | 56 | in_addr_t prefixLengthToIpv4Netmask(int prefix_length) |
55 | { | 57 | { |
56 | in_addr_t mask = 0; | 58 | in_addr_t mask = 0; |
@@ -88,13 +90,17 @@ static const char *ipaddr_to_string(in_addr_t addr) | |||
88 | 90 | ||
89 | int ifc_init(void) | 91 | int ifc_init(void) |
90 | { | 92 | { |
93 | int ret; | ||
91 | if (ifc_ctl_sock == -1) { | 94 | if (ifc_ctl_sock == -1) { |
92 | ifc_ctl_sock = socket(AF_INET, SOCK_DGRAM, 0); | 95 | ifc_ctl_sock = socket(AF_INET, SOCK_DGRAM, 0); |
93 | if (ifc_ctl_sock < 0) { | 96 | if (ifc_ctl_sock < 0) { |
94 | printerr("socket() failed: %s\n", strerror(errno)); | 97 | printerr("socket() failed: %s\n", strerror(errno)); |
95 | } | 98 | } |
96 | } | 99 | } |
97 | return ifc_ctl_sock < 0 ? -1 : 0; | 100 | |
101 | ret = ifc_ctl_sock < 0 ? -1 : 0; | ||
102 | if (DBG) printerr("ifc_init_returning %d", ret); | ||
103 | return ret; | ||
98 | } | 104 | } |
99 | 105 | ||
100 | int ifc_init6(void) | 106 | int ifc_init6(void) |
@@ -110,6 +116,7 @@ int ifc_init6(void) | |||
110 | 116 | ||
111 | void ifc_close(void) | 117 | void ifc_close(void) |
112 | { | 118 | { |
119 | if (DBG) printerr("ifc_close"); | ||
113 | if (ifc_ctl_sock != -1) { | 120 | if (ifc_ctl_sock != -1) { |
114 | (void)close(ifc_ctl_sock); | 121 | (void)close(ifc_ctl_sock); |
115 | ifc_ctl_sock = -1; | 122 | ifc_ctl_sock = -1; |
@@ -141,7 +148,7 @@ int ifc_get_hwaddr(const char *name, void *ptr) | |||
141 | if(r < 0) return -1; | 148 | if(r < 0) return -1; |
142 | 149 | ||
143 | memcpy(ptr, &ifr.ifr_hwaddr.sa_data, ETH_ALEN); | 150 | memcpy(ptr, &ifr.ifr_hwaddr.sa_data, ETH_ALEN); |
144 | return 0; | 151 | return 0; |
145 | } | 152 | } |
146 | 153 | ||
147 | int ifc_get_ifindex(const char *name, int *if_indexp) | 154 | int ifc_get_ifindex(const char *name, int *if_indexp) |
@@ -169,12 +176,16 @@ static int ifc_set_flags(const char *name, unsigned set, unsigned clr) | |||
169 | 176 | ||
170 | int ifc_up(const char *name) | 177 | int ifc_up(const char *name) |
171 | { | 178 | { |
172 | return ifc_set_flags(name, IFF_UP, 0); | 179 | int ret = ifc_set_flags(name, IFF_UP, 0); |
180 | if (DBG) printerr("ifc_up(%s) = %d", name, ret); | ||
181 | return ret; | ||
173 | } | 182 | } |
174 | 183 | ||
175 | int ifc_down(const char *name) | 184 | int ifc_down(const char *name) |
176 | { | 185 | { |
177 | return ifc_set_flags(name, 0, IFF_UP); | 186 | int ret = ifc_set_flags(name, 0, IFF_UP); |
187 | if (DBG) printerr("ifc_down(%s) = %d", name, ret); | ||
188 | return ret; | ||
178 | } | 189 | } |
179 | 190 | ||
180 | static void init_sockaddr_in(struct sockaddr *sa, in_addr_t addr) | 191 | static void init_sockaddr_in(struct sockaddr *sa, in_addr_t addr) |
@@ -188,11 +199,14 @@ static void init_sockaddr_in(struct sockaddr *sa, in_addr_t addr) | |||
188 | int ifc_set_addr(const char *name, in_addr_t addr) | 199 | int ifc_set_addr(const char *name, in_addr_t addr) |
189 | { | 200 | { |
190 | struct ifreq ifr; | 201 | struct ifreq ifr; |
202 | int ret; | ||
191 | 203 | ||
192 | ifc_init_ifr(name, &ifr); | 204 | ifc_init_ifr(name, &ifr); |
193 | init_sockaddr_in(&ifr.ifr_addr, addr); | 205 | init_sockaddr_in(&ifr.ifr_addr, addr); |
194 | 206 | ||
195 | return ioctl(ifc_ctl_sock, SIOCSIFADDR, &ifr); | 207 | ret = ioctl(ifc_ctl_sock, SIOCSIFADDR, &ifr); |
208 | if (DBG) printerr("ifc_set_addr(%s, xx) = %d", name, ret); | ||
209 | return ret; | ||
196 | } | 210 | } |
197 | 211 | ||
198 | int ifc_set_hwaddr(const char *name, const void *ptr) | 212 | int ifc_set_hwaddr(const char *name, const void *ptr) |
@@ -209,11 +223,14 @@ int ifc_set_hwaddr(const char *name, const void *ptr) | |||
209 | int ifc_set_mask(const char *name, in_addr_t mask) | 223 | int ifc_set_mask(const char *name, in_addr_t mask) |
210 | { | 224 | { |
211 | struct ifreq ifr; | 225 | struct ifreq ifr; |
226 | int ret; | ||
212 | 227 | ||
213 | ifc_init_ifr(name, &ifr); | 228 | ifc_init_ifr(name, &ifr); |
214 | init_sockaddr_in(&ifr.ifr_addr, mask); | 229 | init_sockaddr_in(&ifr.ifr_addr, mask); |
215 | 230 | ||
216 | return ioctl(ifc_ctl_sock, SIOCSIFNETMASK, &ifr); | 231 | ret = ioctl(ifc_ctl_sock, SIOCSIFNETMASK, &ifr); |
232 | if (DBG) printerr("ifc_set_mask(%s, xx) = %d", name, ret); | ||
233 | return ret; | ||
217 | } | 234 | } |
218 | 235 | ||
219 | int ifc_set_prefixLength(const char *name, int prefixLength) | 236 | int ifc_set_prefixLength(const char *name, int prefixLength) |
@@ -323,6 +340,7 @@ int ifc_act_on_ipv4_route(int action, const char *ifname, struct in_addr dst, in | |||
323 | return result; | 340 | return result; |
324 | } | 341 | } |
325 | 342 | ||
343 | /* deprecated - v4 only */ | ||
326 | int ifc_create_default_route(const char *name, in_addr_t gw) | 344 | int ifc_create_default_route(const char *name, in_addr_t gw) |
327 | { | 345 | { |
328 | struct in_addr in_dst, in_gw; | 346 | struct in_addr in_dst, in_gw; |
@@ -330,7 +348,20 @@ int ifc_create_default_route(const char *name, in_addr_t gw) | |||
330 | in_dst.s_addr = 0; | 348 | in_dst.s_addr = 0; |
331 | in_gw.s_addr = gw; | 349 | in_gw.s_addr = gw; |
332 | 350 | ||
333 | return ifc_act_on_route(SIOCADDRT, name, in_dst, 0, in_gw); | 351 | int ret = ifc_act_on_ipv4_route(SIOCADDRT, name, in_dst, 0, in_gw); |
352 | if (DBG) printerr("ifc_create_default_route(%s, %d) = %d", name, gw, ret); | ||
353 | return ret; | ||
354 | } | ||
355 | |||
356 | /* deprecated v4-only */ | ||
357 | int ifc_add_host_route(const char *name, in_addr_t dst) | ||
358 | { | ||
359 | struct in_addr in_dst, in_gw; | ||
360 | |||
361 | in_dst.s_addr = dst; | ||
362 | in_gw.s_addr = 0; | ||
363 | |||
364 | return ifc_act_on_ipv4_route(SIOCADDRT, name, in_dst, 32, in_gw); | ||
334 | } | 365 | } |
335 | 366 | ||
336 | int ifc_enable(const char *ifname) | 367 | int ifc_enable(const char *ifname) |
@@ -449,6 +480,70 @@ int ifc_remove_host_routes(const char *name) | |||
449 | } | 480 | } |
450 | 481 | ||
451 | /* | 482 | /* |
483 | * Return the address of the default gateway | ||
484 | * | ||
485 | * TODO: factor out common code from this and remove_host_routes() | ||
486 | * so that we only scan /proc/net/route in one place. | ||
487 | * | ||
488 | * DEPRECATED | ||
489 | */ | ||
490 | int ifc_get_default_route(const char *ifname) | ||
491 | { | ||
492 | char name[64]; | ||
493 | in_addr_t dest, gway, mask; | ||
494 | int flags, refcnt, use, metric, mtu, win, irtt; | ||
495 | int result; | ||
496 | FILE *fp; | ||
497 | |||
498 | fp = fopen("/proc/net/route", "r"); | ||
499 | if (fp == NULL) | ||
500 | return 0; | ||
501 | /* Skip the header line */ | ||
502 | if (fscanf(fp, "%*[^\n]\n") < 0) { | ||
503 | fclose(fp); | ||
504 | return 0; | ||
505 | } | ||
506 | ifc_init(); | ||
507 | result = 0; | ||
508 | for (;;) { | ||
509 | int nread = fscanf(fp, "%63s%X%X%X%d%d%d%X%d%d%d\n", | ||
510 | name, &dest, &gway, &flags, &refcnt, &use, &metric, &mask, | ||
511 | &mtu, &win, &irtt); | ||
512 | if (nread != 11) { | ||
513 | break; | ||
514 | } | ||
515 | if ((flags & (RTF_UP|RTF_GATEWAY)) == (RTF_UP|RTF_GATEWAY) | ||
516 | && dest == 0 | ||
517 | && strcmp(ifname, name) == 0) { | ||
518 | result = gway; | ||
519 | break; | ||
520 | } | ||
521 | } | ||
522 | fclose(fp); | ||
523 | ifc_close(); | ||
524 | return result; | ||
525 | } | ||
526 | |||
527 | /* | ||
528 | * Sets the specified gateway as the default route for the named interface. | ||
529 | * DEPRECATED | ||
530 | */ | ||
531 | int ifc_set_default_route(const char *ifname, in_addr_t gateway) | ||
532 | { | ||
533 | struct in_addr addr; | ||
534 | int result; | ||
535 | |||
536 | ifc_init(); | ||
537 | addr.s_addr = gateway; | ||
538 | if ((result = ifc_create_default_route(ifname, gateway)) < 0) { | ||
539 | LOGD("failed to add %s as default route for %s: %s", | ||
540 | inet_ntoa(addr), ifname, strerror(errno)); | ||
541 | } | ||
542 | ifc_close(); | ||
543 | return result; | ||
544 | } | ||
545 | |||
546 | /* | ||
452 | * Removes the default route for the named interface. | 547 | * Removes the default route for the named interface. |
453 | */ | 548 | */ |
454 | int ifc_remove_default_route(const char *ifname) | 549 | int ifc_remove_default_route(const char *ifname) |
@@ -627,9 +722,31 @@ int ifc_act_on_route(int action, const char *ifname, const char *dst, int prefix | |||
627 | return ret; | 722 | return ret; |
628 | } | 723 | } |
629 | 724 | ||
725 | /* | ||
726 | * DEPRECATED | ||
727 | */ | ||
728 | int ifc_add_ipv4_route(const char *ifname, struct in_addr dst, int prefix_length, | ||
729 | struct in_addr gw) | ||
730 | { | ||
731 | int i =ifc_act_on_ipv4_route(SIOCADDRT, ifname, dst, prefix_length, gw); | ||
732 | printerr("ifc_add_ipv4_route(%s, xx, %d, xx) = %d", ifname, prefix_length, i); | ||
733 | return i; | ||
734 | } | ||
735 | |||
736 | /* | ||
737 | * DEPRECATED | ||
738 | */ | ||
739 | int ifc_add_ipv6_route(const char *ifname, struct in6_addr dst, int prefix_length, | ||
740 | struct in6_addr gw) | ||
741 | { | ||
742 | return ifc_act_on_ipv6_route(SIOCADDRT, ifname, dst, prefix_length, gw); | ||
743 | } | ||
744 | |||
630 | int ifc_add_route(const char *ifname, const char *dst, int prefix_length, const char *gw) | 745 | int ifc_add_route(const char *ifname, const char *dst, int prefix_length, const char *gw) |
631 | { | 746 | { |
632 | return ifc_act_on_route(SIOCADDRT, ifname, dst, prefix_length, gw); | 747 | int i = ifc_act_on_route(SIOCADDRT, ifname, dst, prefix_length, gw); |
748 | printerr("ifc_add_route(%s, %s, %d, %s) = %d", ifname, dst, prefix_length, gw, i); | ||
749 | return i; | ||
633 | } | 750 | } |
634 | 751 | ||
635 | int ifc_remove_route(const char *ifname, const char*dst, int prefix_length, const char *gw) | 752 | int ifc_remove_route(const char *ifname, const char*dst, int prefix_length, const char *gw) |