#include "peer_comm.h"
#include "logging.h"
+/* Artifically makes a network partition. */
+int do_partition = 0;
+int partition_set = 0xfffffff;
+
extern limiter_t limiter;
static const uint32_t MAGIC_MSG = 0x123123;
}
#endif
+#define ALLOW_PARTITION
+
int send_udp_mesh(comm_t *comm, uint32_t id, int sock) {
int result = 0;
remote_limiter_t *remote;
message_t msg;
struct sockaddr_in toaddr;
+ int i;
+
+#ifdef ALLOW_PARTITION
+
+ int partition_count = 0;
+ struct in_addr dest;
+ char dest_ip[22];
+
+#endif
memset(&toaddr, 0, sizeof(struct sockaddr_in));
toaddr.sin_family = AF_INET;
message_to_nbo(&msg);
/* Iterate though and send update to all remote limiters in our identity. */
- map_reset_iterate(comm->remote_node_map);
- while ((remote = map_next(comm->remote_node_map))) {
+ for (i = 0; i < comm->remote_node_count; ++i) {
+ remote = &comm->remote_limiters[i];
+
+#ifdef ALLOW_PARTITION
+
+ if (do_partition) {
+ printlog(LOG_DEBUG, "Testing partition, partition set is %x, count is %d, test is %d.\n",
+ partition_set, partition_count, partition_set & (1 << partition_count));
+ /* If the partition count bit isn't high in the set, don't actually send anything. */
+ if ((partition_set & (1 << partition_count)) == 0) {
+ dest.s_addr = ntohl(remote->addr);
+ strcpy(dest_ip, inet_ntoa(dest));
+
+ printlog(LOG_DEBUG, "Partition: ignoring host %s\n", dest_ip);
+
+ partition_count += 1;
+ continue;
+ }
+ }
+
+#endif
+
toaddr.sin_addr.s_addr = remote->addr; /* Already in network byte order. */
toaddr.sin_port = remote->port;
if (sendto(sock, &msg, sizeof(msg), 0, (struct sockaddr *) &toaddr, sizeof(struct sockaddr_in)) < 0) {
printlog(LOG_WARN, " - The error was |%d|\n", strerror(result));
break;
}
+ partition_count += 1;
}
return result;
for (i = 0; i < comm->gossip.gossip_branch; ++i) {
message_t msg;
+ printlog(LOG_DEBUG, "Gossip loop iteration, i=%d, branch=%d\n", i, comm->gossip.gossip_branch);
+
if (comm->retrys[i] >= 0) {
remote = &comm->remote_limiters[comm->retrys[i]];
targetid = comm->retrys[i];