summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Greenwalt2011-05-24 23:12:51 -0500
committerRobert Greenwalt2011-05-25 23:22:56 -0500
commitb6b48ae47a44cb231d0a16ca618ac28b0024c11c (patch)
treeabb64497dc37999c930e46e050d99a86b831e0ad /libnetutils
parent1ffdb38213d177a83d74e1dc3bf41237dcbe8c9a (diff)
downloadplatform-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.c135
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;
51static int ifc_ctl_sock6 = -1; 51static int ifc_ctl_sock6 = -1;
52void printerr(char *fmt, ...); 52void printerr(char *fmt, ...);
53 53
54#define DBG 0
55
54in_addr_t prefixLengthToIpv4Netmask(int prefix_length) 56in_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
89int ifc_init(void) 91int 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
100int ifc_init6(void) 106int ifc_init6(void)
@@ -110,6 +116,7 @@ int ifc_init6(void)
110 116
111void ifc_close(void) 117void 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
147int ifc_get_ifindex(const char *name, int *if_indexp) 154int 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
170int ifc_up(const char *name) 177int 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
175int ifc_down(const char *name) 184int 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
180static void init_sockaddr_in(struct sockaddr *sa, in_addr_t addr) 191static 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)
188int ifc_set_addr(const char *name, in_addr_t addr) 199int 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
198int ifc_set_hwaddr(const char *name, const void *ptr) 212int ifc_set_hwaddr(const char *name, const void *ptr)
@@ -209,11 +223,14 @@ int ifc_set_hwaddr(const char *name, const void *ptr)
209int ifc_set_mask(const char *name, in_addr_t mask) 223int 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
219int ifc_set_prefixLength(const char *name, int prefixLength) 236int 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 */
326int ifc_create_default_route(const char *name, in_addr_t gw) 344int 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 */
357int 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
336int ifc_enable(const char *ifname) 367int 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 */
490int 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 */
531int 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 */
454int ifc_remove_default_route(const char *ifname) 549int 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 */
728int 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 */
739int 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
630int ifc_add_route(const char *ifname, const char *dst, int prefix_length, const char *gw) 745int 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
635int ifc_remove_route(const char *ifname, const char*dst, int prefix_length, const char *gw) 752int ifc_remove_route(const char *ifname, const char*dst, int prefix_length, const char *gw)