GNUnet  0.11.x
gnunet-transport.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2011-2014, 2016, 2017 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  GNUnet is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
27 #include "platform.h"
28 #include "gnunet_util_lib.h"
30 #include "gnunet_protocols.h"
32 
36 #define RESOLUTION_TIMEOUT \
37  GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
38 
42 #define OP_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
43 
44 
49 {
54 
59 
64 
69 
74 
79 
84 
88  char *transport;
89 
93  int printed;
94 };
95 
100 {
105 
109  struct GNUNET_TIME_Absolute state_timeout;
110 
115 };
116 
121 {
126 
131 
136 
141 
146 
150  struct GNUNET_TIME_Absolute state_timeout;
151 
155  char *transport;
156 
160  int printed;
161 };
162 
163 
167 #define BLOCKSIZE 4
168 
173 
178 
183 
187 static int benchmark_send;
188 
192 static int benchmark_receive;
193 
197 static int benchmark_receive;
198 
203 
207 static int iterate_all;
208 
212 static int monitor_connects;
213 
218 
222 static int monitor_plugins;
223 
227 static int do_disconnect;
228 
232 static int numeric;
233 
237 static int ret;
238 
243 
247 static unsigned long long traffic_received;
248 
252 static unsigned long long traffic_sent;
253 
258 
263 
268 
273 
278 
283 static struct GNUNET_PeerIdentity pid;
284 
289 
293 static unsigned int verbosity;
294 
299 
303 static unsigned int address_resolutions;
304 
309 
314 
319 
324 
325 
334 static int
335 destroy_it (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
336 {
337  struct MonitoredPeer *m = value;
338 
339  GNUNET_assert (
340  GNUNET_OK ==
341  GNUNET_CONTAINER_multipeermap_remove (monitored_peers, key, value));
343  GNUNET_free (value);
344  return GNUNET_OK;
345 }
346 
347 
354 static void
355 shutdown_task (void *cls)
356 {
357  struct GNUNET_TIME_Relative duration;
358  struct ValidationResolutionContext *cur;
360  struct PeerResolutionContext *rc;
361 
362  if (NULL != op_timeout)
363  {
364  GNUNET_SCHEDULER_cancel (op_timeout);
365  op_timeout = NULL;
366  }
367  if (NULL != pic)
368  {
370  pic = NULL;
371  }
372  if (NULL != pm)
373  {
375  pm = NULL;
376  }
377 
378  next = vc_head;
379  for (cur = next; NULL != cur; cur = next)
380  {
381  next = cur->next;
382 
384  GNUNET_CONTAINER_DLL_remove (vc_head, vc_tail, cur);
385  GNUNET_free (cur->transport);
387  GNUNET_free (cur);
388  }
389  while (NULL != (rc = rc_head))
390  {
391  GNUNET_CONTAINER_DLL_remove (rc_head, rc_tail, rc);
393  GNUNET_free (rc->transport);
394  GNUNET_free (rc->addrcp);
395  GNUNET_free (rc);
396  }
397  if (NULL != handle)
398  {
400  handle = NULL;
401  }
402  if (benchmark_send)
403  {
405  fprintf (stdout,
406  _ ("Transmitted %llu bytes/s (%llu bytes in %s)\n"),
407  1000LL * 1000LL * traffic_sent / (1 + duration.rel_value_us),
408  traffic_sent,
410  }
411  if (benchmark_receive)
412  {
414  fprintf (stdout,
415  _ ("Received %llu bytes/s (%llu bytes in %s)\n"),
416  1000LL * 1000LL * traffic_received / (1 + duration.rel_value_us),
419  }
420 
421  if (NULL != monitored_peers)
422  {
423  GNUNET_CONTAINER_multipeermap_iterate (monitored_peers, &destroy_it, NULL);
424  GNUNET_CONTAINER_multipeermap_destroy (monitored_peers);
425  monitored_peers = NULL;
426  }
427  if (NULL != monitored_plugins)
428  {
429  GNUNET_break (0 == GNUNET_CONTAINER_multipeermap_size (monitored_plugins));
430  GNUNET_CONTAINER_multipeermap_destroy (monitored_plugins);
431  monitored_plugins = NULL;
432  }
433  if (NULL != blacklist)
434  {
436  blacklist = NULL;
437  ret = 0;
438  }
439 }
440 
441 
445 static void
446 operation_timeout (void *cls)
447 {
448  struct PeerResolutionContext *cur;
449  struct PeerResolutionContext *next;
450 
451  op_timeout = NULL;
453  {
454  fprintf (stdout, _ ("Failed to connect to `%s'\n"), GNUNET_i2s_full (&pid));
456  ret = 1;
457  return;
458  }
460  {
461  next = rc_head;
462  while (NULL != (cur = next))
463  {
464  next = cur->next;
465  fprintf (stdout,
466  _ ("Failed to resolve address for peer `%s'\n"),
467  GNUNET_i2s (&cur->addrcp->peer));
468 
469  GNUNET_CONTAINER_DLL_remove (rc_head, rc_tail, cur);
471  GNUNET_free (cur->transport);
472  GNUNET_free (cur->addrcp);
473  GNUNET_free (cur);
474  }
475  fprintf (stdout,
476  "%s",
477  _ ("Failed to list connections, timeout occurred\n"));
479  ret = 1;
480  return;
481  }
482 }
483 
484 
491 static void
492 do_send (void *cls)
493 {
494  struct GNUNET_MQ_Handle *mq = cls;
495  struct GNUNET_MessageHeader *m;
496  struct GNUNET_MQ_Envelope *env;
497 
499  memset (&m[1], 52, BLOCKSIZE * 1024 - sizeof(struct GNUNET_MessageHeader));
500  traffic_sent += BLOCKSIZE * 1024;
501  GNUNET_MQ_notify_sent (env, &do_send, mq);
502  if (verbosity > 0)
503  fprintf (stdout,
504  _ ("Transmitting %u bytes\n"),
505  (unsigned int) BLOCKSIZE * 1024);
506  GNUNET_MQ_send (mq, env);
507 }
508 
509 
518 static void *
519 notify_connect (void *cls,
520  const struct GNUNET_PeerIdentity *peer,
521  struct GNUNET_MQ_Handle *mq)
522 {
523  if (0 != memcmp (&pid, peer, sizeof(struct GNUNET_PeerIdentity)))
524  return NULL;
525  ret = 0;
526  if (! benchmark_send)
527  return NULL;
528  if (NULL != op_timeout)
529  {
530  GNUNET_SCHEDULER_cancel (op_timeout);
531  op_timeout = NULL;
532  }
533  if (verbosity > 0)
534  fprintf (
535  stdout,
536  _ (
537  "Successfully connected to `%s', starting to send benchmark data in %u Kb blocks\n"),
538  GNUNET_i2s (peer),
539  BLOCKSIZE);
541  do_send (mq);
542  return mq;
543 }
544 
545 
554 static void
555 notify_disconnect (void *cls,
556  const struct GNUNET_PeerIdentity *peer,
557  void *internal_cls)
558 {
559  if (0 != memcmp (&pid, peer, sizeof(struct GNUNET_PeerIdentity)))
560  return;
561  if (NULL == internal_cls)
562  return; /* not about target peer */
563  if (! benchmark_send)
564  return; /* not transmitting */
565  fprintf (stdout,
566  _ ("Disconnected from peer `%s' while benchmarking\n"),
567  GNUNET_i2s (&pid));
568 }
569 
570 
580 static void *
582  const struct GNUNET_PeerIdentity *peer,
583  struct GNUNET_MQ_Handle *mq)
584 {
586  const char *now_str = GNUNET_STRINGS_absolute_time_to_string (now);
587 
589  fprintf (stdout,
590  _ ("%24s: %-17s %4s (%u connections in total)\n"),
591  now_str,
592  _ ("Connected to"),
593  GNUNET_i2s (peer),
595  return NULL;
596 }
597 
598 
607 static void
609  const struct GNUNET_PeerIdentity *peer,
610  void *internal_cls)
611 {
613  const char *now_str = GNUNET_STRINGS_absolute_time_to_string (now);
614 
617 
618  fprintf (stdout,
619  _ ("%24s: %-17s %4s (%u connections in total)\n"),
620  now_str,
621  _ ("Disconnected from"),
622  GNUNET_i2s (peer),
624 }
625 
626 
634 static int
635 check_dummy (void *cls, const struct GNUNET_MessageHeader *message)
636 {
637  return GNUNET_OK; /* all messages are fine */
638 }
639 
640 
647 static void
648 handle_dummy (void *cls, const struct GNUNET_MessageHeader *message)
649 {
650  if (! benchmark_receive)
651  return;
652  if (verbosity > 0)
653  fprintf (stdout,
654  _ ("Received %u bytes\n"),
655  (unsigned int) ntohs (message->size));
656  if (0 == traffic_received)
658  traffic_received += ntohs (message->size);
659 }
660 
661 
671 static void
673  int numeric,
675  struct GNUNET_TIME_Absolute state_timeout);
676 
677 
678 static void
679 print_info (const struct GNUNET_PeerIdentity *id,
680  const char *transport,
681  const char *addr,
683  struct GNUNET_TIME_Absolute state_timeout)
684 {
687  {
688  fprintf (stdout,
689  _ ("Peer `%s': %s %s in state `%s' until %s\n"),
690  GNUNET_i2s (id),
691  (NULL == transport) ? "<none>" : transport,
692  (NULL == transport) ? "<none>" : addr,
693  GNUNET_TRANSPORT_ps2s (state),
695  }
696  else if ((GNUNET_YES == iterate_connections) &&
698  {
699  /* Only connected peers, skip state */
700  fprintf (stdout,
701  _ ("Peer `%s': %s %s\n"),
702  GNUNET_i2s (id),
703  transport,
704  addr);
705  }
706 }
707 
708 
725 static void
726 process_peer_string (void *cls, const char *address, int res)
727 {
728  struct PeerResolutionContext *rc = cls;
729 
730  if (NULL != address)
731  {
732  if (GNUNET_SYSERR == res)
733  {
734  fprintf (
735  stderr,
736  "Failed to convert address for peer `%s' plugin `%s' length %u to string \n",
737  GNUNET_i2s (&rc->addrcp->peer),
738  rc->addrcp->transport_name,
739  (unsigned int) rc->addrcp->address_length);
740  print_info (&rc->addrcp->peer,
741  rc->transport,
742  NULL,
743  rc->state,
744  rc->state_timeout);
745  rc->printed = GNUNET_YES;
746  return;
747  }
748  if (GNUNET_OK == res)
749  {
750  print_info (&rc->addrcp->peer,
751  rc->transport,
752  address,
753  rc->state,
754  rc->state_timeout);
755  rc->printed = GNUNET_YES;
756  return; /* Wait for done call */
757  }
758  /* GNUNET_NO == res: ignore, was simply not supported */
759  return;
760  }
761  /* NULL == address, last call, we are done */
762 
763  rc->asc = NULL;
766  if (GNUNET_NO == rc->printed)
767  {
768  if (numeric == GNUNET_NO)
769  {
770  /* Failed to resolve address, try numeric lookup
771  (note: this should not be needed, as transport
772  should fallback to numeric conversion if DNS takes
773  too long) */
775  GNUNET_YES,
776  rc->state,
777  rc->state_timeout);
778  }
779  else
780  {
781  print_info (&rc->addrcp->peer,
782  rc->transport,
783  NULL,
784  rc->state,
785  rc->state_timeout);
786  }
787  }
788  GNUNET_free (rc->transport);
789  GNUNET_free (rc->addrcp);
790  GNUNET_CONTAINER_DLL_remove (rc_head, rc_tail, rc);
791  GNUNET_free (rc);
793  {
794  if (NULL != op_timeout)
795  {
796  GNUNET_SCHEDULER_cancel (op_timeout);
797  op_timeout = NULL;
798  }
799  ret = 0;
801  }
802 }
803 
804 
815 static void
817  int numeric,
819  struct GNUNET_TIME_Absolute state_timeout)
820 {
821  struct PeerResolutionContext *rc;
822 
823  rc = GNUNET_new (struct PeerResolutionContext);
824  GNUNET_CONTAINER_DLL_insert (rc_head, rc_tail, rc);
826  rc->transport = GNUNET_strdup (address->transport_name);
827  rc->addrcp = GNUNET_HELLO_address_copy (address);
828  rc->printed = GNUNET_NO;
829  rc->state = state;
831  /* Resolve address to string */
833  address,
834  numeric,
837  rc);
838 }
839 
840 
851 static void
853  const struct GNUNET_PeerIdentity *peer,
854  const struct GNUNET_HELLO_Address *address,
856  struct GNUNET_TIME_Absolute state_timeout)
857 {
858  if (NULL == peer)
859  {
860  /* done */
861  pic = NULL;
862  return;
863  }
864 
865  if ((GNUNET_NO == iterate_all) &&
867  return; /* Display only connected peers */
868 
869  if (NULL != op_timeout)
870  GNUNET_SCHEDULER_cancel (op_timeout);
871  op_timeout =
873 
875  "Received address for peer `%s': %s\n",
876  GNUNET_i2s (peer),
877  address ? address->transport_name : "");
878 
879  if (NULL != address)
880  resolve_peer_address (address, numeric, state, state_timeout);
881  else
882  print_info (peer, NULL, NULL, state, state_timeout);
883 }
884 
885 
890 {
895 
899  char *str;
900 
906 };
907 
908 
915 static void
917  const struct GNUNET_TRANSPORT_SessionInfo *info)
918 {
919  const char *state;
920 
921  switch (info->state)
922  {
924  state = "INIT";
925  break;
926 
928  state = "HANDSHAKE";
929  break;
930 
932  state = "UP";
933  break;
934 
936  state = "UPDATE";
937  break;
938 
940  state = "DONE";
941  break;
942 
943  default:
944  state = "UNKNOWN";
945  break;
946  }
947  fprintf (stdout,
948  "%s: state %s timeout in %s @ %s%s\n",
949  GNUNET_i2s (&info->address->peer),
950  state,
953  GNUNET_YES),
954  addr->str,
955  (info->is_inbound == GNUNET_YES) ? " (INBOUND)" : "");
956  fprintf (stdout,
957  "%s: queue has %3u messages and %6u bytes\n",
958  GNUNET_i2s (&info->address->peer),
959  info->num_msg_pending,
960  info->num_bytes_pending);
961  if (0 !=
963  fprintf (stdout,
964  "%s: receiving blocked until %s\n",
965  GNUNET_i2s (&info->address->peer),
967 }
968 
969 
986 static void
987 address_cb (void *cls, const char *address, int res)
988 {
989  struct PluginMonitorAddress *addr = cls;
990 
991  if (NULL == address)
992  {
993  addr->asc = NULL;
994  return;
995  }
996  if (NULL != addr->str)
997  return;
998  addr->str = GNUNET_strdup (address);
999  print_plugin_event_info (addr, &addr->si);
1000 }
1001 
1002 
1020 static void
1022  struct GNUNET_TRANSPORT_PluginSession *session,
1023  void **session_ctx,
1024  const struct GNUNET_TRANSPORT_SessionInfo *info)
1025 {
1026  struct PluginMonitorAddress *addr;
1027 
1028  if ((NULL == info) && (NULL == session))
1029  return; /* in sync with transport service */
1030  addr = *session_ctx;
1031  if (NULL == info)
1032  {
1033  if (NULL != addr)
1034  {
1035  if (NULL != addr->asc)
1036  {
1038  addr->asc = NULL;
1039  }
1040  GNUNET_free_non_null (addr->str);
1041  GNUNET_free (addr);
1042  *session_ctx = NULL;
1043  }
1044  return; /* shutdown */
1045  }
1046  if (0 !=
1047  memcmp (&info->address->peer, &pid, sizeof(struct GNUNET_PeerIdentity)))
1048  return; /* filtered */
1049  if (NULL == addr)
1050  {
1051  addr = GNUNET_new (struct PluginMonitorAddress);
1052  addr->asc =
1054  info->address,
1055  numeric,
1057  &address_cb,
1058  addr);
1059  *session_ctx = addr;
1060  }
1061  if (NULL == addr->str)
1062  addr->si = *info;
1063  else
1064  print_plugin_event_info (addr, info);
1065  if (GNUNET_TRANSPORT_SS_DONE == info->state)
1066  {
1067  if (NULL != addr->asc)
1068  {
1070  addr->asc = NULL;
1071  }
1072  GNUNET_free_non_null (addr->str);
1073  GNUNET_free (addr);
1074  *session_ctx = NULL;
1075  }
1076 }
1077 
1078 
1089 static void
1091  const struct GNUNET_PeerIdentity *peer,
1092  const struct GNUNET_HELLO_Address *address,
1094  struct GNUNET_TIME_Absolute state_timeout)
1095 {
1096  struct MonitoredPeer *m;
1097 
1098  if (NULL == peer)
1099  {
1100  fprintf (stdout,
1101  "%s",
1102  _ (
1103  "Monitor disconnected from transport service. Reconnecting.\n"));
1104  return;
1105  }
1106 
1107  if (NULL != op_timeout)
1108  GNUNET_SCHEDULER_cancel (op_timeout);
1109  op_timeout =
1111 
1112  if (NULL == (m = GNUNET_CONTAINER_multipeermap_get (monitored_peers, peer)))
1113  {
1114  m = GNUNET_new (struct MonitoredPeer);
1116  monitored_peers,
1117  peer,
1118  m,
1120  }
1121  else
1122  {
1123  if ((m->state == state) &&
1124  (m->state_timeout.abs_value_us == state_timeout.abs_value_us) &&
1125  (NULL == address) && (NULL == m->address))
1126  {
1127  return; /* No real change */
1128  }
1129  if ((m->state == state) && (NULL != address) && (NULL != m->address) &&
1130  (0 == GNUNET_HELLO_address_cmp (m->address, address)))
1131  return; /* No real change */
1132  }
1133 
1134  if (NULL != m->address)
1135  {
1136  GNUNET_free (m->address);
1137  m->address = NULL;
1138  }
1139  if (NULL != address)
1140  m->address = GNUNET_HELLO_address_copy (address);
1141  m->state = state;
1143 
1144  if (NULL != address)
1146  else
1147  print_info (peer, NULL, NULL, m->state, m->state_timeout);
1148 }
1149 
1150 
1160 static int
1161 blacklist_cb (void *cls, const struct GNUNET_PeerIdentity *cpid)
1162 {
1163  if (0 == memcmp (cpid, &pid, sizeof(struct GNUNET_PeerIdentity)))
1164  return GNUNET_SYSERR;
1165  return GNUNET_OK;
1166 }
1167 
1168 
1177 static void
1178 run (void *cls,
1179  char *const *args,
1180  const char *cfgfile,
1181  const struct GNUNET_CONFIGURATION_Handle *mycfg)
1182 {
1183  static struct GNUNET_PeerIdentity zero_pid;
1184  int counter = 0;
1185 
1186  ret = 1;
1187 
1188  cfg = (struct GNUNET_CONFIGURATION_Handle *) mycfg;
1189 
1192  + monitor_plugins;
1193 
1194  if (1 < counter)
1195  {
1196  fprintf (
1197  stderr,
1198  _ (
1199  "Multiple operations given. Please choose only one operation: %s, %s, %s, %s, %s, %s %s\n"),
1200  "disconnect",
1201  "benchmark send",
1202  "benchmark receive",
1203  "information",
1204  "monitor",
1205  "events",
1206  "plugins");
1207  return;
1208  }
1209  if (0 == counter)
1210  {
1211  fprintf (
1212  stderr,
1213  _ (
1214  "No operation given. Please choose one operation: %s, %s, %s, %s, %s, %s, %s\n"),
1215  "disconnect",
1216  "benchmark send",
1217  "benchmark receive",
1218  "information",
1219  "monitor",
1220  "events",
1221  "plugins");
1222  return;
1223  }
1224 
1225  if (do_disconnect) /* -D: Disconnect from peer */
1226  {
1227  if (0 == memcmp (&zero_pid, &pid, sizeof(pid)))
1228  {
1229  fprintf (stderr,
1230  _ ("Option `%s' makes no sense without option `%s'.\n"),
1231  "-D",
1232  "-p");
1233  ret = 1;
1234  return;
1235  }
1236  blacklist = GNUNET_TRANSPORT_blacklist (cfg, &blacklist_cb, NULL);
1237  if (NULL == blacklist)
1238  {
1239  fprintf (stderr,
1240  "%s",
1241  _ (
1242  "Failed to connect to transport service for disconnection\n"));
1243  ret = 1;
1244  return;
1245  }
1246  fprintf (stdout,
1247  "%s",
1248  _ ("Blacklisting request in place, stop with CTRL-C\n"));
1249  }
1250  else if (benchmark_send) /* -s: Benchmark sending */
1251  {
1252  if (0 == memcmp (&zero_pid, &pid, sizeof(pid)))
1253  {
1254  fprintf (stderr,
1255  _ ("Option `%s' makes no sense without option `%s'.\n"),
1256  "-s",
1257  "-p");
1258  ret = 1;
1259  return;
1260  }
1261  handle = GNUNET_TRANSPORT_core_connect (cfg,
1262  NULL,
1263  NULL,
1264  NULL,
1265  &notify_connect,
1267  NULL);
1268  if (NULL == handle)
1269  {
1270  fprintf (stderr, "%s", _ ("Failed to connect to transport service\n"));
1271  ret = 1;
1272  return;
1273  }
1275  op_timeout =
1277  }
1278  else if (benchmark_receive) /* -b: Benchmark receiving */
1279  {
1280  struct GNUNET_MQ_MessageHandler handlers[] =
1283  struct GNUNET_MessageHeader,
1284  NULL),
1285  GNUNET_MQ_handler_end () };
1286 
1287  handle = GNUNET_TRANSPORT_core_connect (cfg,
1288  NULL,
1289  handlers,
1290  NULL,
1291  NULL,
1292  NULL,
1293  NULL);
1294  if (NULL == handle)
1295  {
1296  fprintf (stderr, "%s", _ ("Failed to connect to transport service\n"));
1297  ret = 1;
1298  return;
1299  }
1300  if (verbosity > 0)
1301  fprintf (stdout, "%s", _ ("Starting to receive benchmark data\n"));
1303  }
1304  else if (iterate_connections) /* -i: List information about peers once */
1305  {
1306  pic = GNUNET_TRANSPORT_monitor_peers (cfg,
1307  &pid,
1308  GNUNET_YES,
1310  (void *) cfg);
1311  op_timeout =
1313  }
1314  else if (monitor_connections) /* -m: List information about peers continuously
1315  */
1316  {
1317  monitored_peers = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO);
1318  pic = GNUNET_TRANSPORT_monitor_peers (cfg,
1319  &pid,
1320  GNUNET_NO,
1322  NULL);
1323  }
1324  else if (monitor_plugins) /* -P: List information about plugins continuously
1325  */
1326  {
1327  monitored_plugins = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO);
1329  }
1330  else if (monitor_connects) /* -e : Monitor (dis)connect events continuously */
1331  {
1333  handle = GNUNET_TRANSPORT_core_connect (cfg,
1334  NULL,
1335  NULL,
1336  NULL,
1339  NULL);
1340  if (NULL == handle)
1341  {
1342  fprintf (stderr, "%s", _ ("Failed to connect to transport service\n"));
1343  ret = 1;
1344  return;
1345  }
1346  ret = 0;
1347  }
1348  else
1349  {
1350  GNUNET_break (0);
1351  return;
1352  }
1353 
1355 }
1356 
1357 
1358 int
1359 main (int argc, char *const *argv)
1360 {
1361  int res;
1362  struct GNUNET_GETOPT_CommandLineOption options[] =
1364  'a',
1365  "all",
1366  gettext_noop (
1367  "print information for all peers (instead of only connected peers)"),
1368  &iterate_all),
1370  'b',
1371  "benchmark",
1372  gettext_noop (
1373  "measure how fast we are receiving data from all peers (until CTRL-C)"),
1376  "disconnect",
1377  gettext_noop ("disconnect from a peer"),
1378  &do_disconnect),
1380  'i',
1381  "information",
1382  gettext_noop (
1383  "provide information about all current connections (once)"),
1386  'm',
1387  "monitor",
1388  gettext_noop (
1389  "provide information about all current connections (continuously)"),
1392  'e',
1393  "events",
1394  gettext_noop (
1395  "provide information about all connects and disconnect events (continuously)"),
1396  &monitor_connects),
1398  "numeric",
1399  gettext_noop ("do not resolve hostnames"),
1400  &numeric),
1402  "peer",
1403  "PEER",
1404  gettext_noop ("peer identity"),
1405  &pid),
1407  "plugins",
1408  gettext_noop ("monitor plugin sessions"),
1409  &monitor_plugins),
1411  's',
1412  "send",
1413  gettext_noop (
1414  "send data for benchmarking to the other peer (until CTRL-C)"),
1415  &benchmark_send),
1418 
1419  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
1420  return 2;
1421 
1422  res =
1423  GNUNET_PROGRAM_run (argc,
1424  argv,
1425  "gnunet-transport",
1426  gettext_noop ("Direct access to transport service."),
1427  options,
1428  &run,
1429  NULL);
1430  GNUNET_free ((void *) argv);
1431  if (GNUNET_OK == res)
1432  return ret;
1433  return 1;
1434 }
1435 
1436 
1437 /* end of gnunet-transport.c */
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
size_t address_length
Number of bytes in address.
Session is being torn down and about to disappear.
static unsigned int address_resolutions
Number of address resolutions pending.
static char * cpid
Which peer should we connect to?
static void print_plugin_event_info(struct PluginMonitorAddress *addr, const struct GNUNET_TRANSPORT_SessionInfo *info)
Print information about a plugin monitoring event.
uint32_t num_bytes_pending
Number of bytes pending transmission for this session.
int printed
was the entry printed
static int iterate_all
Option -a.
struct ValidationResolutionContext * prev
Previous in DLL.
static int benchmark_send
Option -s.
struct GNUNET_TIME_Absolute state_timeout
state timeout
enum GNUNET_TRANSPORT_PeerState state
peer state
GNUNET_TRANSPORT_PeerState
Possible state of a neighbour.
uint64_t rel_value_us
The actual value.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct PeerResolutionContext * prev
Prev in DLL.
static void address_cb(void *cls, const char *address, int res)
Function called with a textual representation of an address.
static struct GNUNET_SCHEDULER_Task * op_timeout
Task for operation timeout.
static struct GNUNET_TRANSPORT_PeerMonitoringContext * pic
Handle if we are monitoring peers at the transport level.
static void * notify_connect(void *cls, const struct GNUNET_PeerIdentity *peer, struct GNUNET_MQ_Handle *mq)
Function called to notify transport users that another peer connected to us.
static struct GNUNET_CONTAINER_MultiPeerMap * monitored_plugins
Map storing information about monitored plugins&#39;s sessions.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received, or when GNUNET_SCHEDULER_shutdown() is being invoked.
Definition: scheduler.c:1300
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_verbose(unsigned int *level)
Define the &#39;-V&#39; verbosity option.
int GNUNET_STRINGS_get_utf8_args(int argc, char *const *argv, int *u8argc, char *const **u8argv)
Returns utf-8 encoded arguments.
Definition: strings.c:1438
int is_inbound
GNUNET_YES if this is an inbound connection, GNUNET_NO if this is an outbound connection, GNUNET_SYSERR if connections of this plugin are so fundamentally bidirectional that they have no &#39;initiator&#39;
char * transport
plugin name
enum GNUNET_TRANSPORT_SessionState state
New state of the session.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
static void handle_dummy(void *cls, const struct GNUNET_MessageHeader *message)
Function called by the transport for each received message.
struct GNUNET_OS_Process * resolver
Resolver process handle.
struct GNUNET_TRANSPORT_AddressToStringContext * asc
Ongoing resolution request.
Context for iterating validation entries.
Context to store name resolutions for valiation.
static int monitor_connect_counter
Current number of connections in monitor mode.
Abstract representation of a plugin&#39;s session.
static int ret
Global return value (0 success).
Initial session handshake is in progress.
#define GNUNET_MESSAGE_TYPE_DUMMY
Dummy messages for testing / benchmarking.
Struct to store information about peers in monitor mode.
static struct GNUNET_CONTAINER_MultiPeerMap * monitored_peers
Map storing information about monitored peers.
static void process_peer_monitoring_cb(void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HELLO_Address *address, enum GNUNET_TRANSPORT_PeerState state, struct GNUNET_TIME_Absolute state_timeout)
Function called with information about a peers.
enum GNUNET_TRANSPORT_PeerState state
State of the peer.
Handle for a plugin session state monitor.
static int benchmark_receive
Option -b.
int GNUNET_CONTAINER_multipeermap_remove(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, const void *value)
Remove the given key-value pair from the map.
#define GNUNET_NO
Definition: gnunet_common.h:78
static int numeric
Option -n.
const char * GNUNET_i2s_full(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
static void * monitor_notify_connect(void *cls, const struct GNUNET_PeerIdentity *peer, struct GNUNET_MQ_Handle *mq)
Function called to notify transport users that another peer connected to us.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
Definition of a command line option.
void GNUNET_TRANSPORT_blacklist_cancel(struct GNUNET_TRANSPORT_Blacklist *br)
Abort the blacklist.
struct GNUNET_TRANSPORT_CoreHandle * GNUNET_TRANSPORT_core_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_PeerIdentity *self, const struct GNUNET_MQ_MessageHandler *handlers, void *cls, GNUNET_TRANSPORT_NotifyConnect nc, GNUNET_TRANSPORT_NotifyDisconnect nd)
Connect to the transport service.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
const struct GNUNET_HELLO_Address * address
Address used by the session.
static void resolve_peer_address(const struct GNUNET_HELLO_Address *address, int numeric, enum GNUNET_TRANSPORT_PeerState state, struct GNUNET_TIME_Absolute state_timeout)
Convert address to a printable format.
static int monitor_connections
Option -m.
struct GNUNET_CONTAINER_MultiPeerMap * GNUNET_CONTAINER_multipeermap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:526
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
struct GNUNET_TRANSPORT_PeerMonitoringContext * GNUNET_TRANSPORT_monitor_peers(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_PeerIdentity *peer, int one_shot, GNUNET_TRANSPORT_PeerIterateCallback peer_callback, void *peer_callback_cls)
Return information about a specific peer or all peers currently known to transport service once or in...
uint64_t abs_value_us
The actual value.
uint32_t num_msg_pending
Number of messages pending transmission for this session.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
static void shutdown_task(void *cls)
Task run in monitor mode when the user presses CTRL-C to abort.
void GNUNET_CONTAINER_multipeermap_destroy(struct GNUNET_CONTAINER_MultiPeerMap *map)
Destroy a hash map.
static struct ValidationResolutionContext * vc_tail
DLL: tail of validation resolution entries.
struct GNUNET_TIME_Absolute receive_delay
Until when does this plugin refuse to receive to manage staying within the inbound quota...
static void monitor_notify_disconnect(void *cls, const struct GNUNET_PeerIdentity *peer, void *internal_cls)
Function called to notify transport users that another peer disconnected from us. ...
void GNUNET_TRANSPORT_monitor_peers_cancel(struct GNUNET_TRANSPORT_PeerMonitoringContext *pic)
Cancel request to monitor peers.
int GNUNET_TRANSPORT_is_connected(enum GNUNET_TRANSPORT_PeerState state)
Check if a state is defined as connected.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
struct ValidationResolutionContext * next
Next in DLL.
static struct GNUNET_ARM_MonitorHandle * m
Monitor connection with ARM.
Definition: gnunet-arm.c:104
struct GNUNET_TRANSPORT_AddressToStringContext * asc
Tranport conversion handle.
static int iterate_connections
Option -i.
#define BLOCKSIZE
Benchmarking block size in KB.
Information about a plugin&#39;s session.
int GNUNET_HELLO_address_cmp(const struct GNUNET_HELLO_Address *a1, const struct GNUNET_HELLO_Address *a2)
Compare two addresses.
Definition: address.c:130
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1253
static struct GNUNET_CONFIGURATION_Handle * cfg
Configuration handle.
char * str
Resolved address as string.
enum State state
current state of profiling
, &#39; bother checking if a value already exists (faster than GNUNET_CONTAINER_MULTIHASHMAPOPTION_...
void GNUNET_MQ_notify_sent(struct GNUNET_MQ_Envelope *ev, GNUNET_SCHEDULER_TaskCallback cb, void *cb_cls)
Call a callback once the envelope has been sent, that is, sending it can not be canceled anymore...
Definition: mq.c:774
static char * value
Value of the record to add/remove.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
void GNUNET_TRANSPORT_address_to_string_cancel(struct GNUNET_TRANSPORT_AddressToStringContext *alc)
Cancel request for address conversion.
struct GNUNET_TRANSPORT_Blacklist * GNUNET_TRANSPORT_blacklist(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_TRANSPORT_BlacklistCallback cb, void *cb_cls)
Install a blacklist callback.
static void print_info(const struct GNUNET_PeerIdentity *id, const char *transport, const char *addr, enum GNUNET_TRANSPORT_PeerState state, struct GNUNET_TIME_Absolute state_timeout)
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition: strings.c:687
int printed
was the entry printed
static int monitor_plugins
Option -P.
static int check_dummy(void *cls, const struct GNUNET_MessageHeader *message)
Function called by the transport for each received message.
const char * transport_name
Name of the transport plugin enabling the communication using this address.
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
static void plugin_monitoring_cb(void *cls, struct GNUNET_TRANSPORT_PluginSession *session, void **session_ctx, const struct GNUNET_TRANSPORT_SessionInfo *info)
Function called by the plugin with information about the current sessions managed by the plugin (for ...
#define RESOLUTION_TIMEOUT
Timeout for a name resolution.
struct GNUNET_TIME_Absolute session_timeout
At what time will this session timeout (unless activity happens)?
Internal representation of the hash map.
struct GNUNET_TRANSPORT_PluginMonitor * GNUNET_TRANSPORT_monitor_plugins(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_TRANSPORT_SessionMonitorCallback cb, void *cb_cls)
Install a plugin session state monitor callback.
struct GNUNET_TIME_Absolute state_timeout
Timeout.
struct GNUNET_TIME_Absolute next_validation
Time of next validation.
static void process_peer_iteration_cb(void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HELLO_Address *address, enum GNUNET_TRANSPORT_PeerState state, struct GNUNET_TIME_Absolute state_timeout)
Function called with information about a peers during a one shot iteration.
Message handler for a specific message type.
static int res
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
static unsigned long long traffic_received
Number of bytes of traffic we received so far.
Handle for blacklisting requests.
static struct GNUNET_TIME_Absolute start_time
Starting time of transmitting/receiving data.
const char * GNUNET_TRANSPORT_ps2s(enum GNUNET_TRANSPORT_PeerState state)
Convert a transport state to a human readable string.
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.
struct GNUNET_HashCode key
The key used in the DHT.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
struct GNUNET_TRANSPORT_AddressToStringContext * GNUNET_TRANSPORT_address_to_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_HELLO_Address *address, int numeric, struct GNUNET_TIME_Relative timeout, GNUNET_TRANSPORT_AddressToStringCallback aluc, void *aluc_cls)
Convert a binary address into a human readable address.
static void operation_timeout(void *cls)
We are done, shut down.
static void run(void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *mycfg)
Main function that will be run by the scheduler.
#define OP_TIMEOUT
Timeout for an operation.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct GNUNET_PeerIdentity peer
For which peer is this an address?
char * transport
transport plugin
struct GNUNET_HELLO_Address * addrcp
Address to resolve.
static void process_peer_string(void *cls, const char *address, int res)
Function called with a textual representation of an address.
static int do_disconnect
Option -D.
static struct in_addr dummy
Target "dummy" address of the packet we pretend to respond to.
struct GNUNET_TIME_Absolute valid_until
Address is valid until.
struct GNUNET_TRANSPORT_SessionInfo si
Last event we got and did not yet print because str was NULL (address not yet resolved).
Handle to a message queue.
Definition: mq.c:85
int GNUNET_CONTAINER_multipeermap_put(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
This is just an update about the session, the state did not change.
int GNUNET_CONTAINER_multipeermap_iterate(struct GNUNET_CONTAINER_MultiPeerMap *map, GNUNET_CONTAINER_PeerMapIterator it, void *it_cls)
Iterate over all entries in the map.
static struct PeerResolutionContext * rc_head
DLL: head of resolution entries.
The identity of the host (wraps the signing key of the peer).
static struct GNUNET_TRANSPORT_CoreHandle * handle
Handle to transport service.
struct GNUNET_TIME_Absolute last_validation
Time of last validation.
configuration data
Definition: configuration.c:85
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_duration(struct GNUNET_TIME_Absolute whence)
Get the duration of an operation as the difference of the current time and the given start time "henc...
Definition: time.c:375
static struct PeerResolutionContext * rc_tail
DLL: head of resolution entries.
struct GNUNET_HELLO_Address * addrcp
address to resolve
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
An address for communicating with a peer.
static void notify_disconnect(void *cls, const struct GNUNET_PeerIdentity *peer, void *internal_cls)
Function called to notify transport users that another peer disconnected from us. ...
void * GNUNET_CONTAINER_multipeermap_get(const struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key)
Given a key find a value in the map matching the key.
void GNUNET_TRANSPORT_core_disconnect(struct GNUNET_TRANSPORT_CoreHandle *handle)
Disconnect from the transport service.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_flag(char shortName, const char *name, const char *description, int *val)
Allow user to specify a flag (which internally means setting an integer to 1/GNUNET_YES/GNUNET_OK.
struct GNUNET_HELLO_Address * GNUNET_HELLO_address_copy(const struct GNUNET_HELLO_Address *address)
Copy an address struct.
Definition: address.c:109
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5
#define GNUNET_log(kind,...)
The session was created (first call for each session object).
Entry in list of pending tasks.
Definition: scheduler.c:134
#define GNUNET_GETOPT_option_base32_auto(shortName, name, argumentHelp, description, val)
Allow user to specify a binary value using Crockford Base32 encoding where the size of the binary val...
struct PeerResolutionContext * next
Next in DLL.
struct GNUNET_TRANSPORT_Blacklist * blacklist
Blacklisting handle.
int main(int argc, char *const *argv)
static struct ValidationResolutionContext * vc_head
DLL: head of validation resolution entries.
static unsigned int verbosity
Selected level of verbosity.
int GNUNET_PROGRAM_run(int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
Run a standard GNUnet command startup sequence (initialize loggers and configuration, parse options).
Definition: program.c:367
void GNUNET_TRANSPORT_monitor_plugins_cancel(struct GNUNET_TRANSPORT_PluginMonitor *pm)
Cancel monitoring the plugin session state.
Context for address resolution by plugin_monitoring_cb().
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining(struct GNUNET_TIME_Absolute future)
Given a timestamp in the future, how much time remains until then?
Definition: time.c:331
Header for all communications.
Time for absolute times used by GNUnet, in microseconds.
#define GNUNET_YES
Definition: gnunet_common.h:77
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:353
unsigned int GNUNET_CONTAINER_multipeermap_size(const struct GNUNET_CONTAINER_MultiPeerMap *map)
Get the number of key-value pairs in the map.
struct GNUNET_TRANSPORT_AddressToStringContext * asc
transport conversiion context
const char * GNUNET_STRINGS_absolute_time_to_string(struct GNUNET_TIME_Absolute t)
Like asctime, except for GNUnet time.
Definition: strings.c:742
Handle for the transport service (includes all of the state for the transport service).
static void do_send(void *cls)
Function called to notify a client about the socket begin ready to queue more data.
struct GNUNET_HELLO_Address * address
The address to convert.
static char * address
GNS address for this phone.
static unsigned long long traffic_sent
Number of bytes of traffic we sent so far.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
static int destroy_it(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Function called to release data stored in the monitored_peers map.
#define GNUNET_HELLO_address_free(addr)
Free an address.
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_free(ptr)
Wrapper around free.
Time for relative time used by GNUnet, in microseconds.
static struct GNUNET_TRANSPORT_PluginMonitor * pm
Handle if we are monitoring plugin session activity.
#define gettext_noop(String)
Definition: gettext.h:69
Context to store name resolutions for valiation.
static int monitor_connects
Option -c.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:966
static int blacklist_cb(void *cls, const struct GNUNET_PeerIdentity *cpid)
Function called with the transport service checking if we want to blacklist a peer.