/* Serval Distributed Numbering Architecture (DNA) Copyright (C) 2010 Paul Gardner-Stephen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mphlr.h" char *batman_socket=NULL; char *batman_peerfile="/data/data/org.servalproject/var/batmand.peers"; int peer_count=0; in_addr_t peers[MAX_PEERS]; unsigned char peer_replied[MAX_PEERS]; in_addr_t nominated_peers[256]; int nom_peer_count=0; int additionalPeer(char *peer) { in_addr_t pa; if (nom_peer_count>255) return setReason("Too many peers. You can only nominate 255 peers in this version."); pa=inet_addr(peer); if (pa==INADDR_NONE) return setReason("Invalid peer address specified."); nominated_peers[nom_peer_count++]=pa; return 0; } int getPeerList() { /* Generate the list of known peers. If using BATMAN layer 3, this needs to be the list of exact IP addresses of the peers, as we cannot reliably broadcast. Once BATMAN Advanced is available, we will be able to do that. In the mean time, we need to query BATMANd to find the known list of peers. This is not quite as easy as we might wish. Also, while using layer 3 routing we should keep note of which nodes have repied so that we can not waste bandwidth by resending to them. For this purpose we maintain a set of flags, peer_replied[], which is set to zero by us, and then set non-zero if that peer solicits a reply, letting us know that we can suppress resends to that address. Broadcasting to interfaces is a special problem for managing replies, as we should never mark those peers as replied. We will do this by setting their peer_replied[] flag to 2 instead of zero. */ int i; peer_count=0; /* Add user specified peers */ for(i=0;i1) fprintf(stderr,"Sending packet to peer #%d\n",i); int r=sendto(sock,packet,packet_len,0,(struct sockaddr *)&peer_addr,sizeof(peer_addr)); if (r1) fprintf(stderr,"Sent request to peer %s\n",inet_ntoa(peer_addr.sin_addr)); n++; /* If sending to only one peer, return now */ if (method==i) break; } } else if (debug>1) fprintf(stderr,"Peer %s has already replied, so not sending again.\n", inet_ntoa(peer_addr.sin_addr)); if (debug) fprintf(stderr,"Sent request to %d peers.\n",n); return 0; }