mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-04-08 03:24:13 +00:00
Correctly display interface ip addresses on android
This commit is contained in:
parent
5ec739c712
commit
74095e5356
29
lsif.c
29
lsif.c
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
8
serval.h
8
serval.h
@ -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 */,
|
||||
|
Loading…
x
Reference in New Issue
Block a user