summaryrefslogtreecommitdiff
path: root/src/mesh
diff options
context:
space:
mode:
authorBart Polot <bart@net.in.tum.de>2011-10-20 18:20:49 +0000
committerBart Polot <bart@net.in.tum.de>2011-10-20 18:20:49 +0000
commitbd6d53b9caba0093c535988463cdf4f726f6c7f8 (patch)
tree29b740dd60e03f2dfda509c2c502dbf3e911fcb5 /src/mesh
parente15048219fadfb1f05c3c7771f256c01cef057f0 (diff)
Changed testcase to include real multicast tests
Diffstat (limited to 'src/mesh')
-rw-r--r--src/mesh/gnunet-service-mesh.c4
-rw-r--r--src/mesh/mesh_api_new.c1
-rw-r--r--src/mesh/test_mesh_small.c240
-rw-r--r--src/mesh/test_mesh_small.conf4
4 files changed, 168 insertions, 81 deletions
diff --git a/src/mesh/gnunet-service-mesh.c b/src/mesh/gnunet-service-mesh.c
index 0f2bbe3cf..8d37ae7ab 100644
--- a/src/mesh/gnunet-service-mesh.c
+++ b/src/mesh/gnunet-service-mesh.c
@@ -1238,6 +1238,9 @@ peer_info_connect (struct MeshPeerInfo *peer, struct MeshTunnel *t)
path_info = GNUNET_malloc(sizeof(struct MeshPathInfo));
path_info->peer = peer;
path_info->t = t;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "MESH: Starting DHT GET for peer %s\n",
+ GNUNET_i2s (&id));
peer->dhtget =
GNUNET_DHT_get_start(dht_handle, /* handle */
GNUNET_TIME_UNIT_FOREVER_REL, /* timeout */
@@ -1297,6 +1300,7 @@ tunnel_notify_connection_broken (struct MeshTunnel *t,
struct MeshPeerInfo *peer, GNUNET_PEER_Id p1,
GNUNET_PEER_Id p2);
+
/**
* Remove all paths that rely on a direct connection between p1 and p2
* from the peer itself and notify all tunnels about it.
diff --git a/src/mesh/mesh_api_new.c b/src/mesh/mesh_api_new.c
index 81933e858..7c45cd7b8 100644
--- a/src/mesh/mesh_api_new.c
+++ b/src/mesh/mesh_api_new.c
@@ -1347,6 +1347,7 @@ GNUNET_MESH_peer_request_connect_add (struct GNUNET_MESH_Tunnel *tunnel,
{
if (tunnel->peers[i]->id == peer_id)
{
+ /* Peer already exists in tunnel */
GNUNET_PEER_change_rc (peer_id, -1);
GNUNET_break (0);
return;
diff --git a/src/mesh/test_mesh_small.c b/src/mesh/test_mesh_small.c
index 9fe2c1292..1cb9d6181 100644
--- a/src/mesh/test_mesh_small.c
+++ b/src/mesh/test_mesh_small.c
@@ -55,7 +55,7 @@ struct StatsContext
/**
* Time to wait for stuff that should be rather fast
*/
-#define SHORT_TIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
+#define SHORT_TIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
/**
* DIFFERENT TESTS TO RUN
@@ -74,6 +74,10 @@ static int test;
*/
static int ok;
+static int peers_in_tunnel;
+
+static int peers_responded;
+
/**
* Be verbose
*/
@@ -144,14 +148,20 @@ static GNUNET_PEER_Id pid1;
static struct GNUNET_TESTING_Daemon *d2;
+static struct GNUNET_TESTING_Daemon *d3;
+
static struct GNUNET_MESH_Handle *h1;
static struct GNUNET_MESH_Handle *h2;
+static struct GNUNET_MESH_Handle *h3;
+
static struct GNUNET_MESH_Tunnel *t;
static struct GNUNET_MESH_Tunnel *incoming_t;
+static struct GNUNET_MESH_Tunnel *incoming_t2;
+
static uint16_t *mesh_peers;
/**
@@ -163,14 +173,14 @@ shutdown_callback (void *cls, const char *emsg)
if (emsg != NULL)
{
#if VERBOSE
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Shutdown of peers failed!\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: Shutdown of peers failed!\n");
#endif
ok--;
}
else
{
#if VERBOSE
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: All peers successfully shut down!\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: All peers successfully shut down!\n");
#endif
}
}
@@ -180,7 +190,7 @@ static void
shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
#if VERBOSE
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Ending test.\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: Ending test.\n");
#endif
if (disconnect_task != GNUNET_SCHEDULER_NO_TASK)
@@ -200,12 +210,17 @@ static void
disconnect_mesh_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: disconnecting mesh service of peers\n");
+ "***************** test: disconnecting mesh service of peers\n");
disconnect_task = GNUNET_SCHEDULER_NO_TASK;
GNUNET_MESH_disconnect(h1);
GNUNET_MESH_disconnect(h2);
- GNUNET_SCHEDULER_cancel (shutdown_handle);
- shutdown_handle = GNUNET_SCHEDULER_add_now(&shutdown_task, NULL);
+ if (test == MULTICAST)
+ GNUNET_MESH_disconnect(h3);
+ if (GNUNET_SCHEDULER_NO_TASK != shutdown_handle)
+ {
+ GNUNET_SCHEDULER_cancel (shutdown_handle);
+ shutdown_handle = GNUNET_SCHEDULER_add_now(&shutdown_task, NULL);
+ }
}
@@ -217,7 +232,7 @@ tmt_rdy (void *cls, size_t size, void *buf)
{
struct GNUNET_MessageHeader *msg = buf;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: tmt_rdy called\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: tmt_rdy called\n");
if (size < sizeof(struct GNUNET_MessageHeader) || NULL == buf)
return 0;
msg->size = htons (sizeof(struct GNUNET_MessageHeader));
@@ -252,19 +267,27 @@ data_callback (void *cls,
{
case 1L:
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: Origin client got a response!\n");
+ "***************** test: Origin client got a response!\n");
ok++;
- GNUNET_MESH_tunnel_destroy (tunnel);
- GNUNET_SCHEDULER_cancel (disconnect_task);
- disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME,
+ peers_responded++;
+ if (GNUNET_SCHEDULER_NO_TASK != disconnect_task)
+ {
+ GNUNET_SCHEDULER_cancel (disconnect_task);
+ disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME,
&disconnect_mesh_peers,
NULL);
+ }
+ if (test == MULTICAST && peers_responded < 2)
+ return GNUNET_OK;
+ GNUNET_MESH_tunnel_destroy (tunnel);
break;
case 2L:
+ case 3L:
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: Destination client got a message \n");
+ "***************** test: Destination client %u got a message.\n",
+ client);
ok++;
- GNUNET_MESH_notify_transmit_ready(incoming_t,
+ GNUNET_MESH_notify_transmit_ready(tunnel,
GNUNET_NO,
0,
GNUNET_TIME_UNIT_FOREVER_REL,
@@ -272,10 +295,13 @@ data_callback (void *cls,
sizeof(struct GNUNET_MessageHeader),
&tmt_rdy,
(void *) 1L);
- GNUNET_SCHEDULER_cancel (disconnect_task);
- disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME,
- &disconnect_mesh_peers,
- NULL);
+ if (GNUNET_SCHEDULER_NO_TASK != disconnect_task)
+ {
+ GNUNET_SCHEDULER_cancel (disconnect_task);
+ disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME,
+ &disconnect_mesh_peers,
+ NULL);
+ }
break;
default:
break;
@@ -311,14 +337,21 @@ incoming_tunnel (void *cls,
const struct GNUNET_ATS_Information * atsi)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: Incoming tunnel from %s\n",
- GNUNET_i2s(initiator));
+ "***************** test: Incoming tunnel from %s to peer %d\n",
+ GNUNET_i2s(initiator),
+ (long) cls);
ok++;
- incoming_t = tunnel;
- GNUNET_SCHEDULER_cancel (disconnect_task);
- disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME,
- &disconnect_mesh_peers,
- NULL);
+ if ((long) cls == 1L)
+ incoming_t = tunnel;
+ else
+ incoming_t2 = tunnel;
+ if (GNUNET_SCHEDULER_NO_TASK != disconnect_task)
+ {
+ GNUNET_SCHEDULER_cancel (disconnect_task);
+ disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME,
+ &disconnect_mesh_peers,
+ NULL);
+ }
return NULL;
}
@@ -338,14 +371,26 @@ tunnel_cleaner (void *cls, const struct GNUNET_MESH_Tunnel *tunnel,
long i = (long) cls;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: Incoming tunnel disconnected at peer %d\n",
+ "***************** test: Incoming tunnel disconnected at peer %d\n",
i);
if (2L == i)
ok++;
-
- GNUNET_SCHEDULER_cancel (disconnect_task);
- disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_mesh_peers, NULL);
-
+ else if (3L == i)
+ ok++;
+ else
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "***************** test: Unknown peer! %d\n",
+ i);
+ peers_in_tunnel--;
+ if (peers_in_tunnel > 0)
+ return;
+
+ if (GNUNET_SCHEDULER_NO_TASK != disconnect_task)
+ {
+ GNUNET_SCHEDULER_cancel (disconnect_task);
+ disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_mesh_peers, NULL);
+ }
+
return;
}
@@ -360,7 +405,7 @@ static void
dh (void *cls, const struct GNUNET_PeerIdentity *peer)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: peer %s disconnected\n",
+ "***************** test: peer %s disconnected\n",
GNUNET_i2s(peer));
return;
}
@@ -379,30 +424,39 @@ ch (void *cls, const struct GNUNET_PeerIdentity *peer,
{
struct GNUNET_PeerIdentity *dest;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "***************** test: peer %s connected\n",
+ GNUNET_i2s(peer));
+
+ if (0 == memcmp(&d2->id, peer, sizeof(d2->id)) && (long) cls == 1L)
+ ok++;
+ if (test == MULTICAST &&
+ 0 == memcmp(&d3->id, peer, sizeof(d3->id)) &&
+ (long) cls == 1L)
+ ok++;
switch (test)
{
case UNICAST:
dest = &d2->id;
break;
case MULTICAST:
+ peers_in_tunnel++;
+ if (peers_in_tunnel < 2)
+ return;
dest = NULL;
break;
default:
return;
}
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: peer %s connected\n",
- GNUNET_i2s(peer));
- if (0 == memcmp(&d2->id, peer, sizeof(d2->id)) && (long) cls == 1L)
- ok++;
if (GNUNET_SCHEDULER_NO_TASK != disconnect_task)
{
GNUNET_SCHEDULER_cancel (disconnect_task);
disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME,
&disconnect_mesh_peers,
NULL);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Sending data...\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "***************** test: Sending data...\n");
+ peers_responded = 0;
GNUNET_MESH_notify_transmit_ready(t,
GNUNET_NO,
0,
@@ -414,8 +468,8 @@ ch (void *cls, const struct GNUNET_PeerIdentity *peer,
}
else
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Disconnect already run?\n");
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Aborting...\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: Disconnect already run?\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: Aborting...\n");
}
return;
}
@@ -424,12 +478,20 @@ ch (void *cls, const struct GNUNET_PeerIdentity *peer,
static void
do_test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: test_task\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: test_task\n");
GNUNET_MESH_peer_request_connect_add(t, &d2->id);
- GNUNET_SCHEDULER_cancel (disconnect_task);
- disconnect_task = GNUNET_SCHEDULER_add_delayed(
- GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 30),
- &disconnect_mesh_peers, NULL);
+ if (test == MULTICAST)
+ {
+ GNUNET_MESH_peer_request_connect_add(t, &d3->id);
+ }
+ if (GNUNET_SCHEDULER_NO_TASK != disconnect_task)
+ {
+ GNUNET_SCHEDULER_cancel (disconnect_task);
+ disconnect_task = GNUNET_SCHEDULER_add_delayed(
+ GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 30),
+ &disconnect_mesh_peers,
+ NULL);
+ }
}
@@ -462,7 +524,7 @@ topo_cb (void *cls,
GNUNET_assert(p2 > 0);
mesh_peers[p2]++;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: %s IS a neighbor\n",
+ "***************** test: %s IS a neighbor\n",
GNUNET_i2s(second));
return;
}
@@ -474,7 +536,7 @@ topo_cb (void *cls,
GNUNET_assert(p2 > 0);
mesh_peers[p2]++;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: %s IS a neighbor\n",
+ "***************** test: %s IS a neighbor\n",
GNUNET_i2s(first));
return;
}
@@ -491,13 +553,13 @@ connect_mesh_service (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
unsigned int i;
struct GNUNET_PeerIdentity id;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: connect_mesh_service\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: connect_mesh_service\n");
for (i = 1; i <= num_peers; i++)
{
GNUNET_PEER_resolve(i, &id);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: peer %s has %u conns to d1\n",
+ "***************** test: peer %s has %u conns to d1\n",
GNUNET_i2s (&id),
mesh_peers[i]);
if (mesh_peers[i] == 0)
@@ -505,20 +567,39 @@ connect_mesh_service (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
}
GNUNET_assert (i < num_peers);
d2 = GNUNET_TESTING_daemon_get_by_id (pg, &id);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: Peer searched: %s\n",
- GNUNET_i2s (&d2->id));
+ if (test == MULTICAST)
+ {
+ for (i++; i <= num_peers; i++)
+ {
+ GNUNET_PEER_resolve(i, &id);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "***************** test: peer %s has %u conns to d1\n",
+ GNUNET_i2s (&id),
+ mesh_peers[i]);
+ if (mesh_peers[i] == 0)
+ break;
+ }
+ GNUNET_assert (i < num_peers);
+ d3 = GNUNET_TESTING_daemon_get_by_id (pg, &id);
+ }
app = (GNUNET_MESH_ApplicationType) 0;
#if VERBOSE
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: connecting to mesh service of peer %s (%u)\n",
+ "***************** test: connecting to mesh service of peer %s (%u)\n",
GNUNET_i2s (&d1->id),
mesh_peers[0]);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: connecting to mesh service of peer %s (%u)\n",
+ "***************** test: connecting to mesh service of peer %s (%u)\n",
GNUNET_i2s (&d2->id),
i);
+ if (test == MULTICAST)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "***************** test: connecting to mesh service of peer %s (%u)\n",
+ GNUNET_i2s (&d3->id),
+ i);
+ }
#endif
h1 = GNUNET_MESH_connect (d1->cfg,
10,
@@ -534,15 +615,18 @@ connect_mesh_service (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
&tunnel_cleaner,
handlers,
&app);
-#if VERBOSE
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: connected to mesh service of peer %s\n",
- GNUNET_i2s (&d1->id));
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: connected to mesh service of peer %s\n",
- GNUNET_i2s (&d2->id));
-#endif
+ if (test == MULTICAST)
+ {
+ h3 = GNUNET_MESH_connect (d3->cfg,
+ 10,
+ (void *) 3L,
+ &incoming_tunnel,
+ &tunnel_cleaner,
+ handlers,
+ &app);
+ }
t = GNUNET_MESH_tunnel_create (h1, NULL, &ch, &dh, (void *) 1L);
+ peers_in_tunnel = 0;
test_task =
GNUNET_SCHEDULER_add_delayed(
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 6),
@@ -566,9 +650,9 @@ peergroup_ready (void *cls, const char *emsg)
if (emsg != NULL)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: Peergroup callback called with error, aborting test!\n");
+ "***************** test: Peergroup callback called with error, aborting test!\n");
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: Error from testing: `%s'\n", emsg);
+ "***************** test: Error from testing: `%s'\n", emsg);
ok--;
GNUNET_TESTING_daemons_stop (pg, TIMEOUT, &shutdown_callback, NULL);
return;
@@ -577,9 +661,9 @@ peergroup_ready (void *cls, const char *emsg)
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"************************************************************\n");
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: Peer Group started successfully!\n");
+ "***************** test: Peer Group started successfully!\n");
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: Have %u connections\n",
+ "***************** test: Have %u connections\n",
total_connections);
#endif
@@ -596,13 +680,13 @@ peergroup_ready (void *cls, const char *emsg)
{
d1 = GNUNET_TESTING_daemon_get (pg, i);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: %u: %s\n",
+ "***************** test: %u: %s\n",
GNUNET_PEER_intern(&d1->id),
GNUNET_i2s (&d1->id));
}
d1 = GNUNET_TESTING_daemon_get (pg, 0);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: Peer looking: %s\n",
+ "***************** test: Peer looking: %s\n",
GNUNET_i2s (&d1->id));
pid1 = GNUNET_PEER_intern(&d1->id);
mesh_peers[pid1] = 100;
@@ -648,7 +732,7 @@ connect_cb (void *cls, const struct GNUNET_PeerIdentity *first,
else
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: Problem with new connection (%s)\n",
+ "***************** test: Problem with new connection (%s)\n",
emsg);
}
@@ -682,7 +766,7 @@ run (void *cls, char *const *args, const char *cfgfile,
NULL);
#if VERBOSE
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Starting daemons.\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: Starting daemons.\n");
GNUNET_CONFIGURATION_set_value_string (testing_cfg, "testing",
"use_progressbars", "YES");
#endif
@@ -801,22 +885,22 @@ main (int argc, char *argv[])
};
int ok_goal;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Start\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: Start\n");
if (strstr (argv[0], "test_mesh_small_unicast") != NULL)
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: UNICAST\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: UNICAST\n");
test = UNICAST;
ok_goal = 5;
}
else if (strstr (argv[0], "test_mesh_small_multicast") != NULL)
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: MULTICAST\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: MULTICAST\n");
test = MULTICAST;
- ok_goal = 5;
+ ok_goal = 10;
}
else
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: UNKNOWN\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: UNKNOWN\n");
test = SETUP;
ok_goal = 0;
}
@@ -831,13 +915,11 @@ main (int argc, char *argv[])
if (ok_goal != ok)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "test: %s FAILED! (%d/%d)\n",
- argv[0], ok, ok_goal);
+ "***************** test: FAILED! (%d/%d)\n", ok, ok_goal);
return 1;
}
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "test: %s success\n",
- argv[0]);
+ "***************** test: success\n");
return 0;
}
diff --git a/src/mesh/test_mesh_small.conf b/src/mesh/test_mesh_small.conf
index d3cd98429..90bae9ab2 100644
--- a/src/mesh/test_mesh_small.conf
+++ b/src/mesh/test_mesh_small.conf
@@ -40,8 +40,8 @@ INTERNAL_ADDRESS = 127.0.0.1
EXTERNAL_ADDRESS = 127.0.0.1
[core]
-TOTAL_QUOTA_IN = 1024000
-TOTAL_QUOTA_OUT = 1024000
+TOTAL_QUOTA_IN = 4000000
+TOTAL_QUOTA_OUT = 4000000
AUTOSTART = YES
PORT = 10003