GNUnet  0.10.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 
53 
58 
63 
68 
73 
78 
83 
87  char *transport;
88 
92  int printed;
93 };
94 
98 struct MonitoredPeer {
103 
107  struct GNUNET_TIME_Absolute state_timeout;
108 
113 };
114 
123 
128 
133 
138 
143 
147  struct GNUNET_TIME_Absolute state_timeout;
148 
152  char *transport;
153 
157  int printed;
158 };
159 
160 
164 #define BLOCKSIZE 4
165 
170 
175 
180 
184 static int benchmark_send;
185 
189 static int benchmark_receive;
190 
194 static int benchmark_receive;
195 
200 
204 static int iterate_all;
205 
209 static int monitor_connects;
210 
215 
219 static int monitor_plugins;
220 
224 static int do_disconnect;
225 
229 static int numeric;
230 
234 static int ret;
235 
240 
244 static unsigned long long traffic_received;
245 
249 static unsigned long long traffic_sent;
250 
255 
260 
265 
270 
275 
280 static struct GNUNET_PeerIdentity pid;
281 
286 
290 static unsigned int verbosity;
291 
296 
300 static unsigned int address_resolutions;
301 
306 
311 
316 
321 
322 
331 static int
332 destroy_it(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
333 {
334  struct MonitoredPeer *m = value;
335 
337  GNUNET_OK ==
338  GNUNET_CONTAINER_multipeermap_remove(monitored_peers, key, value));
340  GNUNET_free(value);
341  return GNUNET_OK;
342 }
343 
344 
351 static void
352 shutdown_task(void *cls)
353 {
354  struct GNUNET_TIME_Relative duration;
355  struct ValidationResolutionContext *cur;
357  struct PeerResolutionContext *rc;
358 
359  if (NULL != op_timeout)
360  {
361  GNUNET_SCHEDULER_cancel(op_timeout);
362  op_timeout = NULL;
363  }
364  if (NULL != pic)
365  {
367  pic = NULL;
368  }
369  if (NULL != pm)
370  {
372  pm = NULL;
373  }
374 
375  next = vc_head;
376  for (cur = next; NULL != cur; cur = next)
377  {
378  next = cur->next;
379 
381  GNUNET_CONTAINER_DLL_remove(vc_head, vc_tail, cur);
382  GNUNET_free(cur->transport);
384  GNUNET_free(cur);
385  }
386  while (NULL != (rc = rc_head))
387  {
388  GNUNET_CONTAINER_DLL_remove(rc_head, rc_tail, rc);
390  GNUNET_free(rc->transport);
391  GNUNET_free(rc->addrcp);
392  GNUNET_free(rc);
393  }
394  if (NULL != handle)
395  {
397  handle = NULL;
398  }
399  if (benchmark_send)
400  {
402  fprintf(stdout,
403  _("Transmitted %llu bytes/s (%llu bytes in %s)\n"),
404  1000LL * 1000LL * traffic_sent / (1 + duration.rel_value_us),
405  traffic_sent,
407  }
408  if (benchmark_receive)
409  {
411  fprintf(stdout,
412  _("Received %llu bytes/s (%llu bytes in %s)\n"),
413  1000LL * 1000LL * traffic_received / (1 + duration.rel_value_us),
416  }
417 
418  if (NULL != monitored_peers)
419  {
420  GNUNET_CONTAINER_multipeermap_iterate(monitored_peers, &destroy_it, NULL);
421  GNUNET_CONTAINER_multipeermap_destroy(monitored_peers);
422  monitored_peers = NULL;
423  }
424  if (NULL != monitored_plugins)
425  {
426  GNUNET_break(0 == GNUNET_CONTAINER_multipeermap_size(monitored_plugins));
427  GNUNET_CONTAINER_multipeermap_destroy(monitored_plugins);
428  monitored_plugins = NULL;
429  }
430  if (NULL != blacklist)
431  {
433  blacklist = NULL;
434  ret = 0;
435  }
436 }
437 
438 
442 static void
444 {
445  struct PeerResolutionContext *cur;
446  struct PeerResolutionContext *next;
447 
448  op_timeout = NULL;
450  {
451  fprintf(stdout, _("Failed to connect to `%s'\n"), GNUNET_i2s_full(&pid));
453  ret = 1;
454  return;
455  }
457  {
458  next = rc_head;
459  while (NULL != (cur = next))
460  {
461  next = cur->next;
462  fprintf(stdout,
463  _("Failed to resolve address for peer `%s'\n"),
464  GNUNET_i2s(&cur->addrcp->peer));
465 
466  GNUNET_CONTAINER_DLL_remove(rc_head, rc_tail, cur);
468  GNUNET_free(cur->transport);
469  GNUNET_free(cur->addrcp);
470  GNUNET_free(cur);
471  }
472  fprintf(stdout,
473  "%s",
474  _("Failed to list connections, timeout occurred\n"));
476  ret = 1;
477  return;
478  }
479 }
480 
481 
488 static void
489 do_send(void *cls)
490 {
491  struct GNUNET_MQ_Handle *mq = cls;
492  struct GNUNET_MessageHeader *m;
493  struct GNUNET_MQ_Envelope *env;
494 
496  memset(&m[1], 52, BLOCKSIZE * 1024 - sizeof(struct GNUNET_MessageHeader));
497  traffic_sent += BLOCKSIZE * 1024;
498  GNUNET_MQ_notify_sent(env, &do_send, mq);
499  if (verbosity > 0)
500  fprintf(stdout,
501  _("Transmitting %u bytes\n"),
502  (unsigned int)BLOCKSIZE * 1024);
503  GNUNET_MQ_send(mq, env);
504 }
505 
506 
515 static void *
516 notify_connect(void *cls,
517  const struct GNUNET_PeerIdentity *peer,
518  struct GNUNET_MQ_Handle *mq)
519 {
520  if (0 != memcmp(&pid, peer, sizeof(struct GNUNET_PeerIdentity)))
521  return NULL;
522  ret = 0;
523  if (!benchmark_send)
524  return NULL;
525  if (NULL != op_timeout)
526  {
527  GNUNET_SCHEDULER_cancel(op_timeout);
528  op_timeout = NULL;
529  }
530  if (verbosity > 0)
531  fprintf(
532  stdout,
533  _(
534  "Successfully connected to `%s', starting to send benchmark data in %u Kb blocks\n"),
535  GNUNET_i2s(peer),
536  BLOCKSIZE);
538  do_send(mq);
539  return mq;
540 }
541 
542 
551 static void
553  const struct GNUNET_PeerIdentity *peer,
554  void *internal_cls)
555 {
556  if (0 != memcmp(&pid, peer, sizeof(struct GNUNET_PeerIdentity)))
557  return;
558  if (NULL == internal_cls)
559  return; /* not about target peer */
560  if (!benchmark_send)
561  return; /* not transmitting */
562  fprintf(stdout,
563  _("Disconnected from peer `%s' while benchmarking\n"),
564  GNUNET_i2s(&pid));
565 }
566 
567 
577 static void *
579  const struct GNUNET_PeerIdentity *peer,
580  struct GNUNET_MQ_Handle *mq)
581 {
583  const char *now_str = GNUNET_STRINGS_absolute_time_to_string(now);
584 
586  fprintf(stdout,
587  _("%24s: %-17s %4s (%u connections in total)\n"),
588  now_str,
589  _("Connected to"),
590  GNUNET_i2s(peer),
592  return NULL;
593 }
594 
595 
604 static void
606  const struct GNUNET_PeerIdentity *peer,
607  void *internal_cls)
608 {
610  const char *now_str = GNUNET_STRINGS_absolute_time_to_string(now);
611 
614 
615  fprintf(stdout,
616  _("%24s: %-17s %4s (%u connections in total)\n"),
617  now_str,
618  _("Disconnected from"),
619  GNUNET_i2s(peer),
621 }
622 
623 
631 static int
632 check_dummy(void *cls, const struct GNUNET_MessageHeader *message)
633 {
634  return GNUNET_OK; /* all messages are fine */
635 }
636 
637 
644 static void
645 handle_dummy(void *cls, const struct GNUNET_MessageHeader *message)
646 {
647  if (!benchmark_receive)
648  return;
649  if (verbosity > 0)
650  fprintf(stdout,
651  _("Received %u bytes\n"),
652  (unsigned int)ntohs(message->size));
653  if (0 == traffic_received)
655  traffic_received += ntohs(message->size);
656 }
657 
658 
668 static void
670  int numeric,
672  struct GNUNET_TIME_Absolute state_timeout);
673 
674 
675 static void
677  const char *transport,
678  const char *addr,
680  struct GNUNET_TIME_Absolute state_timeout)
681 {
684  {
685  fprintf(stdout,
686  _("Peer `%s': %s %s in state `%s' until %s\n"),
687  GNUNET_i2s(id),
688  (NULL == transport) ? "<none>" : transport,
689  (NULL == transport) ? "<none>" : addr,
690  GNUNET_TRANSPORT_ps2s(state),
692  }
693  else if ((GNUNET_YES == iterate_connections) &&
695  {
696  /* Only connected peers, skip state */
697  fprintf(stdout,
698  _("Peer `%s': %s %s\n"),
699  GNUNET_i2s(id),
700  transport,
701  addr);
702  }
703 }
704 
705 
722 static void
723 process_peer_string(void *cls, const char *address, int res)
724 {
725  struct PeerResolutionContext *rc = cls;
726 
727  if (NULL != address)
728  {
729  if (GNUNET_SYSERR == res)
730  {
731  fprintf(
732  stderr,
733  "Failed to convert address for peer `%s' plugin `%s' length %u to string \n",
734  GNUNET_i2s(&rc->addrcp->peer),
735  rc->addrcp->transport_name,
736  (unsigned int)rc->addrcp->address_length);
737  print_info(&rc->addrcp->peer,
738  rc->transport,
739  NULL,
740  rc->state,
741  rc->state_timeout);
742  rc->printed = GNUNET_YES;
743  return;
744  }
745  if (GNUNET_OK == res)
746  {
747  print_info(&rc->addrcp->peer,
748  rc->transport,
749  address,
750  rc->state,
751  rc->state_timeout);
752  rc->printed = GNUNET_YES;
753  return; /* Wait for done call */
754  }
755  /* GNUNET_NO == res: ignore, was simply not supported */
756  return;
757  }
758  /* NULL == address, last call, we are done */
759 
760  rc->asc = NULL;
763  if (GNUNET_NO == rc->printed)
764  {
765  if (numeric == GNUNET_NO)
766  {
767  /* Failed to resolve address, try numeric lookup
768  (note: this should not be needed, as transport
769  should fallback to numeric conversion if DNS takes
770  too long) */
772  GNUNET_YES,
773  rc->state,
774  rc->state_timeout);
775  }
776  else
777  {
778  print_info(&rc->addrcp->peer,
779  rc->transport,
780  NULL,
781  rc->state,
782  rc->state_timeout);
783  }
784  }
785  GNUNET_free(rc->transport);
786  GNUNET_free(rc->addrcp);
787  GNUNET_CONTAINER_DLL_remove(rc_head, rc_tail, rc);
788  GNUNET_free(rc);
790  {
791  if (NULL != op_timeout)
792  {
793  GNUNET_SCHEDULER_cancel(op_timeout);
794  op_timeout = NULL;
795  }
796  ret = 0;
798  }
799 }
800 
801 
812 static void
814  int numeric,
816  struct GNUNET_TIME_Absolute state_timeout)
817 {
818  struct PeerResolutionContext *rc;
819 
820  rc = GNUNET_new(struct PeerResolutionContext);
821  GNUNET_CONTAINER_DLL_insert(rc_head, rc_tail, rc);
823  rc->transport = GNUNET_strdup(address->transport_name);
824  rc->addrcp = GNUNET_HELLO_address_copy(address);
825  rc->printed = GNUNET_NO;
826  rc->state = state;
828  /* Resolve address to string */
830  address,
831  numeric,
834  rc);
835 }
836 
837 
848 static void
850  const struct GNUNET_PeerIdentity *peer,
851  const struct GNUNET_HELLO_Address *address,
853  struct GNUNET_TIME_Absolute state_timeout)
854 {
855  if (NULL == peer)
856  {
857  /* done */
858  pic = NULL;
859  return;
860  }
861 
862  if ((GNUNET_NO == iterate_all) &&
864  return; /* Display only connected peers */
865 
866  if (NULL != op_timeout)
867  GNUNET_SCHEDULER_cancel(op_timeout);
868  op_timeout =
870 
872  "Received address for peer `%s': %s\n",
873  GNUNET_i2s(peer),
874  address ? address->transport_name : "");
875 
876  if (NULL != address)
877  resolve_peer_address(address, numeric, state, state_timeout);
878  else
879  print_info(peer, NULL, NULL, state, state_timeout);
880 }
881 
882 
891 
895  char *str;
896 
902 };
903 
904 
911 static void
913  const struct GNUNET_TRANSPORT_SessionInfo *info)
914 {
915  const char *state;
916 
917  switch (info->state)
918  {
920  state = "INIT";
921  break;
922 
924  state = "HANDSHAKE";
925  break;
926 
928  state = "UP";
929  break;
930 
932  state = "UPDATE";
933  break;
934 
936  state = "DONE";
937  break;
938 
939  default:
940  state = "UNKNOWN";
941  break;
942  }
943  fprintf(stdout,
944  "%s: state %s timeout in %s @ %s%s\n",
945  GNUNET_i2s(&info->address->peer),
946  state,
949  GNUNET_YES),
950  addr->str,
951  (info->is_inbound == GNUNET_YES) ? " (INBOUND)" : "");
952  fprintf(stdout,
953  "%s: queue has %3u messages and %6u bytes\n",
954  GNUNET_i2s(&info->address->peer),
955  info->num_msg_pending,
956  info->num_bytes_pending);
957  if (0 !=
959  fprintf(stdout,
960  "%s: receiving blocked until %s\n",
961  GNUNET_i2s(&info->address->peer),
963 }
964 
965 
982 static void
983 address_cb(void *cls, const char *address, int res)
984 {
985  struct PluginMonitorAddress *addr = cls;
986 
987  if (NULL == address)
988  {
989  addr->asc = NULL;
990  return;
991  }
992  if (NULL != addr->str)
993  return;
994  addr->str = GNUNET_strdup(address);
995  print_plugin_event_info(addr, &addr->si);
996 }
997 
998 
1016 static void
1018  struct GNUNET_TRANSPORT_PluginSession *session,
1019  void **session_ctx,
1020  const struct GNUNET_TRANSPORT_SessionInfo *info)
1021 {
1022  struct PluginMonitorAddress *addr;
1023 
1024  if ((NULL == info) && (NULL == session))
1025  return; /* in sync with transport service */
1026  addr = *session_ctx;
1027  if (NULL == info)
1028  {
1029  if (NULL != addr)
1030  {
1031  if (NULL != addr->asc)
1032  {
1034  addr->asc = NULL;
1035  }
1036  GNUNET_free_non_null(addr->str);
1037  GNUNET_free(addr);
1038  *session_ctx = NULL;
1039  }
1040  return; /* shutdown */
1041  }
1042  if (0 !=
1043  memcmp(&info->address->peer, &pid, sizeof(struct GNUNET_PeerIdentity)))
1044  return; /* filtered */
1045  if (NULL == addr)
1046  {
1047  addr = GNUNET_new(struct PluginMonitorAddress);
1048  addr->asc =
1050  info->address,
1051  numeric,
1053  &address_cb,
1054  addr);
1055  *session_ctx = addr;
1056  }
1057  if (NULL == addr->str)
1058  addr->si = *info;
1059  else
1060  print_plugin_event_info(addr, info);
1061  if (GNUNET_TRANSPORT_SS_DONE == info->state)
1062  {
1063  if (NULL != addr->asc)
1064  {
1066  addr->asc = NULL;
1067  }
1068  GNUNET_free_non_null(addr->str);
1069  GNUNET_free(addr);
1070  *session_ctx = NULL;
1071  }
1072 }
1073 
1074 
1085 static void
1087  const struct GNUNET_PeerIdentity *peer,
1088  const struct GNUNET_HELLO_Address *address,
1090  struct GNUNET_TIME_Absolute state_timeout)
1091 {
1092  struct MonitoredPeer *m;
1093 
1094  if (NULL == peer)
1095  {
1096  fprintf(stdout,
1097  "%s",
1098  _(
1099  "Monitor disconnected from transport service. Reconnecting.\n"));
1100  return;
1101  }
1102 
1103  if (NULL != op_timeout)
1104  GNUNET_SCHEDULER_cancel(op_timeout);
1105  op_timeout =
1107 
1108  if (NULL == (m = GNUNET_CONTAINER_multipeermap_get(monitored_peers, peer)))
1109  {
1110  m = GNUNET_new(struct MonitoredPeer);
1112  monitored_peers,
1113  peer,
1114  m,
1116  }
1117  else
1118  {
1119  if ((m->state == state) &&
1120  (m->state_timeout.abs_value_us == state_timeout.abs_value_us) &&
1121  (NULL == address) && (NULL == m->address))
1122  {
1123  return; /* No real change */
1124  }
1125  if ((m->state == state) && (NULL != address) && (NULL != m->address) &&
1126  (0 == GNUNET_HELLO_address_cmp(m->address, address)))
1127  return; /* No real change */
1128  }
1129 
1130  if (NULL != m->address)
1131  {
1132  GNUNET_free(m->address);
1133  m->address = NULL;
1134  }
1135  if (NULL != address)
1136  m->address = GNUNET_HELLO_address_copy(address);
1137  m->state = state;
1139 
1140  if (NULL != address)
1142  else
1143  print_info(peer, NULL, NULL, m->state, m->state_timeout);
1144 }
1145 
1146 
1156 static int
1157 blacklist_cb(void *cls, const struct GNUNET_PeerIdentity *cpid)
1158 {
1159  if (0 == memcmp(cpid, &pid, sizeof(struct GNUNET_PeerIdentity)))
1160  return GNUNET_SYSERR;
1161  return GNUNET_OK;
1162 }
1163 
1164 
1173 static void
1174 run(void *cls,
1175  char *const *args,
1176  const char *cfgfile,
1177  const struct GNUNET_CONFIGURATION_Handle *mycfg)
1178 {
1179  static struct GNUNET_PeerIdentity zero_pid;
1180  int counter = 0;
1181 
1182  ret = 1;
1183 
1184  cfg = (struct GNUNET_CONFIGURATION_Handle *)mycfg;
1185 
1189 
1190  if (1 < counter)
1191  {
1192  fprintf(
1193  stderr,
1194  _(
1195  "Multiple operations given. Please choose only one operation: %s, %s, %s, %s, %s, %s %s\n"),
1196  "disconnect",
1197  "benchmark send",
1198  "benchmark receive",
1199  "information",
1200  "monitor",
1201  "events",
1202  "plugins");
1203  return;
1204  }
1205  if (0 == counter)
1206  {
1207  fprintf(
1208  stderr,
1209  _(
1210  "No operation given. Please choose one operation: %s, %s, %s, %s, %s, %s, %s\n"),
1211  "disconnect",
1212  "benchmark send",
1213  "benchmark receive",
1214  "information",
1215  "monitor",
1216  "events",
1217  "plugins");
1218  return;
1219  }
1220 
1221  if (do_disconnect) /* -D: Disconnect from peer */
1222  {
1223  if (0 == memcmp(&zero_pid, &pid, sizeof(pid)))
1224  {
1225  fprintf(stderr,
1226  _("Option `%s' makes no sense without option `%s'.\n"),
1227  "-D",
1228  "-p");
1229  ret = 1;
1230  return;
1231  }
1232  blacklist = GNUNET_TRANSPORT_blacklist(cfg, &blacklist_cb, NULL);
1233  if (NULL == blacklist)
1234  {
1235  fprintf(stderr,
1236  "%s",
1237  _(
1238  "Failed to connect to transport service for disconnection\n"));
1239  ret = 1;
1240  return;
1241  }
1242  fprintf(stdout,
1243  "%s",
1244  _("Blacklisting request in place, stop with CTRL-C\n"));
1245  }
1246  else if (benchmark_send) /* -s: Benchmark sending */
1247  {
1248  if (0 == memcmp(&zero_pid, &pid, sizeof(pid)))
1249  {
1250  fprintf(stderr,
1251  _("Option `%s' makes no sense without option `%s'.\n"),
1252  "-s",
1253  "-p");
1254  ret = 1;
1255  return;
1256  }
1257  handle = GNUNET_TRANSPORT_core_connect(cfg,
1258  NULL,
1259  NULL,
1260  NULL,
1261  &notify_connect,
1263  NULL);
1264  if (NULL == handle)
1265  {
1266  fprintf(stderr, "%s", _("Failed to connect to transport service\n"));
1267  ret = 1;
1268  return;
1269  }
1271  op_timeout =
1273  }
1274  else if (benchmark_receive) /* -b: Benchmark receiving */
1275  {
1276  struct GNUNET_MQ_MessageHandler handlers[] =
1279  struct GNUNET_MessageHeader,
1280  NULL),
1282 
1283  handle = GNUNET_TRANSPORT_core_connect(cfg,
1284  NULL,
1285  handlers,
1286  NULL,
1287  NULL,
1288  NULL,
1289  NULL);
1290  if (NULL == handle)
1291  {
1292  fprintf(stderr, "%s", _("Failed to connect to transport service\n"));
1293  ret = 1;
1294  return;
1295  }
1296  if (verbosity > 0)
1297  fprintf(stdout, "%s", _("Starting to receive benchmark data\n"));
1299  }
1300  else if (iterate_connections) /* -i: List information about peers once */
1301  {
1303  &pid,
1304  GNUNET_YES,
1306  (void *)cfg);
1307  op_timeout =
1309  }
1310  else if (monitor_connections) /* -m: List information about peers continuously
1311  */
1312  {
1313  monitored_peers = GNUNET_CONTAINER_multipeermap_create(10, GNUNET_NO);
1315  &pid,
1316  GNUNET_NO,
1318  NULL);
1319  }
1320  else if (monitor_plugins) /* -P: List information about plugins continuously
1321  */
1322  {
1323  monitored_plugins = GNUNET_CONTAINER_multipeermap_create(10, GNUNET_NO);
1325  }
1326  else if (monitor_connects) /* -e : Monitor (dis)connect events continuously */
1327  {
1329  handle = GNUNET_TRANSPORT_core_connect(cfg,
1330  NULL,
1331  NULL,
1332  NULL,
1335  NULL);
1336  if (NULL == handle)
1337  {
1338  fprintf(stderr, "%s", _("Failed to connect to transport service\n"));
1339  ret = 1;
1340  return;
1341  }
1342  ret = 0;
1343  }
1344  else
1345  {
1346  GNUNET_break(0);
1347  return;
1348  }
1349 
1351 }
1352 
1353 
1354 int
1355 main(int argc, char *const *argv)
1356 {
1357  int res;
1358  struct GNUNET_GETOPT_CommandLineOption options[] =
1360  'a',
1361  "all",
1362  gettext_noop(
1363  "print information for all peers (instead of only connected peers)"),
1364  &iterate_all),
1366  'b',
1367  "benchmark",
1368  gettext_noop(
1369  "measure how fast we are receiving data from all peers (until CTRL-C)"),
1372  "disconnect",
1373  gettext_noop("disconnect from a peer"),
1374  &do_disconnect),
1376  'i',
1377  "information",
1378  gettext_noop(
1379  "provide information about all current connections (once)"),
1382  'm',
1383  "monitor",
1384  gettext_noop(
1385  "provide information about all current connections (continuously)"),
1388  'e',
1389  "events",
1390  gettext_noop(
1391  "provide information about all connects and disconnect events (continuously)"),
1392  &monitor_connects),
1394  "numeric",
1395  gettext_noop("do not resolve hostnames"),
1396  &numeric),
1398  "peer",
1399  "PEER",
1400  gettext_noop("peer identity"),
1401  &pid),
1403  "plugins",
1404  gettext_noop("monitor plugin sessions"),
1405  &monitor_plugins),
1407  's',
1408  "send",
1409  gettext_noop(
1410  "send data for benchmarking to the other peer (until CTRL-C)"),
1411  &benchmark_send),
1414 
1415  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args(argc, argv, &argc, &argv))
1416  return 2;
1417 
1418  res =
1419  GNUNET_PROGRAM_run(argc,
1420  argv,
1421  "gnunet-transport",
1422  gettext_noop("Direct access to transport service."),
1423  options,
1424  &run,
1425  NULL);
1426  GNUNET_free((void *)argv);
1427  if (GNUNET_OK == res)
1428  return ret;
1429  return 1;
1430 }
1431 
1432 /* 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:1284
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:1439
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:517
#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:99
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:1237
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:772
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:686
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:84
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:83
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:373
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:131
#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:351
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:741
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:956
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.