Correctly display interface ip addresses on android

This commit is contained in:
Jeremy Lakeman 2012-07-25 14:53:53 +09:30
parent 5ec739c712
commit 74095e5356
3 changed files with 33 additions and 34 deletions

29
lsif.c
View File

@ -93,7 +93,7 @@ int scrapeProcNetRoute()
if (!(d&(~m))) {
local.sin_addr.s_addr=d;
broadcast.sin_addr.s_addr=d|~m;
overlay_interface_register(name,local,broadcast);
overlay_interface_register(name,&local,&broadcast);
}
}
@ -117,7 +117,7 @@ lsif(void) {
struct ifconf ifc;
int sck, nInterfaces, ofs;
struct ifreq *ifr;
struct sockaddr_in local, broadcast;
struct sockaddr_in local, *broadcast;
if (debug & DEBUG_OVERLAYINTERFACES) DEBUG("called");
@ -139,7 +139,8 @@ lsif(void) {
/* Iterate through the list of interfaces. */
nInterfaces = 0;
ofs = 0;
while (ofs < ifc.ifc_len) {
while (ofs < ifc.ifc_len && ofs < sizeof(buf)) {
ifr = (struct ifreq *)(ifc.ifc_ifcu.ifcu_buf + ofs);
ofs += _SIZEOF_ADDR_IFREQ(*ifr);
@ -149,32 +150,30 @@ lsif(void) {
continue;
}
bcopy(&ifr->ifr_ifru.ifru_addr, &local, sizeof(struct sockaddr_in));
/* Get interface flags */
if (ioctl(sck, SIOCGIFFLAGS, ifr) == -1)
FATAL_perror("ioctl(SIOCGIFFLAGS)");
/* Not broadcast? Not interested.. */
if ((ifr->ifr_ifru.ifru_flags & IFF_BROADCAST) == 0) {
if (debug & DEBUG_OVERLAYINTERFACES) DEBUGF("Skipping non-broadcast address on %s", ifr->ifr_name);
continue;
}
/* Get broadcast address */
if (ioctl(sck, SIOCGIFBRDADDR, ifr, sizeof(*ifr)) == -1)
FATAL_perror("ioctl(SIOCGIFBRDADDR)");
bcopy(&ifr->ifr_ifru.ifru_addr, &local, sizeof(local));
bcopy(&ifr->ifr_ifru.ifru_broadaddr, &broadcast ,sizeof(broadcast));
broadcast = (struct sockaddr_in *)&ifr->ifr_ifru.ifru_broadaddr;
if (debug & DEBUG_OVERLAYINTERFACES) {
char addrtxt[INET_ADDRSTRLEN], bcasttxt[INET_ADDRSTRLEN];
assert(inet_ntop(AF_INET, (const void *)&local.sin_addr, addrtxt, INET_ADDRSTRLEN) != NULL);
assert(inet_ntop(AF_INET, (const void *)&broadcast.sin_addr, bcasttxt, INET_ADDRSTRLEN) != NULL);
DEBUGF("name=%s addr=%s, broad=%s\n",
ifr->ifr_name,
addrtxt, bcasttxt);
// note, inet_ntop doesn't seem to behave on android
DEBUGF("%s address: %s", ifr->ifr_name, inet_ntoa(local.sin_addr));
DEBUGF("%s broadcast address: %s", ifr->ifr_name, inet_ntoa(broadcast->sin_addr));
}
overlay_interface_register(ifr->ifr_name, local, broadcast);
overlay_interface_register(ifr->ifr_name, &local, broadcast);
nInterfaces++;
}
@ -226,7 +225,7 @@ doifaddrs(void) {
DEBUGF("name=%s addr=%s broad=%s", name, addrtxt, bcasttxt);
}
overlay_interface_register(name,local,broadcast);
overlay_interface_register(name,&local,&broadcast);
}
freeifaddrs(ifaddr);

View File

@ -187,11 +187,11 @@ int overlay_interface_args(const char *arg)
}
int
overlay_interface_init_socket(int interface, struct sockaddr_in src_addr, struct sockaddr_in broadcast) {
overlay_interface_init_socket(int interface, struct sockaddr_in *src_addr, struct sockaddr_in *broadcast) {
char srctxt[INET_ADDRSTRLEN];
#define I(X) overlay_interfaces[interface].X
I(broadcast_address) = broadcast;
bcopy(broadcast, &I(broadcast_address), sizeof(struct sockaddr_in));
I(fileP) = 0;
I(alarm.poll.fd) = socket(PF_INET,SOCK_DGRAM,0);
@ -230,15 +230,15 @@ overlay_interface_init_socket(int interface, struct sockaddr_in src_addr, struct
traffic on all platforms. BUT on OSX we really need a non-broadcast socket
to send from, because you cannot send from a broadcast socket on OSX it seems.
*/
broadcast.sin_family = AF_INET;
broadcast.sin_port = htons(I(port));
if (bind(I(alarm.poll.fd), (struct sockaddr *)&broadcast, sizeof(broadcast))) {
I(broadcast_address.sin_family) = AF_INET;
I(broadcast_address.sin_port) = htons(I(port));
if (bind(I(alarm.poll.fd), (const struct sockaddr *)&I(broadcast_address), sizeof(I(broadcast_address)))) {
WHY_perror("bind");
WHY("MP HLR server could not bind to requested UDP port (bind() failed)");
goto error;
}
assert(inet_ntop(AF_INET, (const void *)&broadcast.sin_addr, srctxt, INET_ADDRSTRLEN) != NULL);
if (debug & (DEBUG_PACKETRX | DEBUG_IO)) DEBUGF("Bound to %s:%d", srctxt, ntohs(broadcast.sin_port));
assert(inet_ntop(AF_INET, (const void *)&I(broadcast_address.sin_addr), srctxt, INET_ADDRSTRLEN) != NULL);
if (debug & (DEBUG_PACKETRX | DEBUG_IO)) DEBUGF("Bound to %s:%d", srctxt, ntohs(I(broadcast_address.sin_port)));
I(alarm.poll.events)=POLLIN;
I(alarm.function) = overlay_interface_poll;
@ -261,7 +261,7 @@ overlay_interface_init_socket(int interface, struct sockaddr_in src_addr, struct
#undef I
}
int overlay_interface_init(char *name,struct sockaddr_in src_addr,struct sockaddr_in broadcast,
int overlay_interface_init(char *name,struct sockaddr_in *src_addr,struct sockaddr_in *broadcast,
int speed_in_bits,int port,int type)
{
/* Too many interfaces */
@ -554,8 +554,8 @@ int overlay_sendto(struct sockaddr_in *recipientaddr,unsigned char *bytes,int le
/* Register the interface, or update the existing interface registration */
int
overlay_interface_register(char *name,
struct sockaddr_in local,
struct sockaddr_in broadcast) {
struct sockaddr_in *local,
struct sockaddr_in *broadcast) {
struct interface_rules *r, *me;
int i;
@ -588,7 +588,7 @@ overlay_interface_register(char *name,
DOC 20120608
*/
if ((overlay_interfaces[i].broadcast_address.sin_addr.s_addr & 0xffffffff)
== (broadcast.sin_addr.s_addr & 0xffffffff)) {
== (broadcast->sin_addr.s_addr & 0xffffffff)) {
/* Same address, mark it as being seen */
overlay_interfaces[i].observed = 1;
return 0;
@ -600,8 +600,8 @@ overlay_interface_register(char *name,
INFOF("Interface changed %08llx.%08llx vs %08llx.%08llx",
/* overlay_interfaces[i].local_address.sin_addr.s_addr */0,
overlay_interfaces[i].broadcast_address.sin_addr.s_addr,
local.sin_addr.s_addr,
broadcast.sin_addr.s_addr);
local->sin_addr.s_addr,
broadcast->sin_addr.s_addr);
unwatch(&overlay_interfaces[i].alarm);
close(overlay_interfaces[i].alarm.poll.fd);
overlay_interfaces[i].alarm.poll.fd = -1;
@ -611,7 +611,7 @@ overlay_interface_register(char *name,
}
} else {
/* New interface, so register it */
if (overlay_interface_init(name,local, broadcast, me->speed_in_bits, me->port, me->type))
if (overlay_interface_init(name, local, broadcast, me->speed_in_bits, me->port, me->type))
WHYF("Could not initialise newly seen interface %s", name);
else
if (debug & DEBUG_OVERLAYINTERFACES) DEBUGF("Registered interface %s", name);
@ -643,7 +643,7 @@ void overlay_interface_discover(struct sched_ent *alarm){
overlay_interfaces[i].observed = 1;
else {
/* New interface, so register it */
if (overlay_interface_init(r->namespec,dummyaddr,dummyaddr,
if (overlay_interface_init(r->namespec,&dummyaddr,&dummyaddr,
1000000,PORT_DNA,OVERLAY_INTERFACE_WIFI)) {
if (debug & DEBUG_OVERLAYINTERFACES) DEBUGF("Could not initialise newly seen interface %s", r->namespec);
}

View File

@ -860,9 +860,9 @@ overlay_frame *op_dup(overlay_frame *f);
long long parse_quantity(char *q);
int overlay_interface_init(char *name,struct sockaddr_in src_addr,struct sockaddr_in broadcast,
int overlay_interface_init(char *name,struct sockaddr_in *src_addr,struct sockaddr_in *broadcast,
int speed_in_bits,int port,int type);
int overlay_interface_init_socket(int i,struct sockaddr_in src_addr,struct sockaddr_in broadcast);
int overlay_interface_init_socket(int i,struct sockaddr_in *src_addr,struct sockaddr_in *broadcast);
long long overlay_time_until_next_tick();
int overlay_rx_messages();
@ -1499,8 +1499,8 @@ int overlay_mdp_bind(unsigned char *localaddr,int port);
int overlay_route_node_info(overlay_mdp_frame *mdp,
struct sockaddr_un *addr,int addrlen);
int overlay_interface_register(char *name,
struct sockaddr_in local,
struct sockaddr_in broadcast);
struct sockaddr_in *local,
struct sockaddr_in *broadcast);
int overlay_queue_dump(overlay_txqueue *q);
int overlay_broadcast_ensemble(int interface_number,
struct sockaddr_in *recipientaddr /* NULL == broadcast */,