*/
#define GNUNET_MESSAGE_TYPE_FRAGMENT 18
-
/**
* Message from the core saying that the transport
* server should start giving it messages. This
*/
#define GNUNET_MESSAGE_TYPE_TRANSPORT_UDP_NAT_PROBE_KEEPALIVE 58
+/**
+ * Request to look up addresses of peers.
+ */
+#define GNUNET_MESSAGE_TYPE_TRANSPORT_PEER_ADDRESS_LOOKUP 59
+
/**
* Welcome message between TCP transports.
*/
+/*******************************************************************************
+ * CHAT message types START
+ ******************************************************************************/
+
/**
* Message sent from client to join a chat room.
*/
*/
#define GNUNET_MESSAGE_TYPE_CHAT_P2P_CONFIRMATION_RECEIPT 311
+/*******************************************************************************
+ * CHAT message types END
+ ******************************************************************************/
+
+/*******************************************************************************
+ * NSE (network size estimation) message types START
+ ******************************************************************************/
+
+/**
+ * client->service message indicating start
+ */
+#define GNUNET_MESSAGE_TYPE_NSE_START 321
+
+/**
+ * P2P message sent from nearest peer
+ */
+#define GNUNET_MESSAGE_TYPE_NSE_P2P_FLOOD 322
+
+/**
+ * service->client message indicating
+ */
+#define GNUNET_MESSAGE_TYPE_NSE_ESTIMATE 323
/**
* Type used to match 'all' message types.
libgnunettransportnew_la_SOURCES = \
transport_api_new.c transport.h \
transport_api_blacklist.c \
- transport_api_address_lookup.c
+ transport_api_address_lookup.c \
+ transport_api_peer_address_lookup.c
libgnunettransportnew_la_LIBADD = \
$(top_builddir)/src/hello/libgnunethello.la \
$(top_builddir)/src/util/libgnunetutil.la \
libgnunettransport_la_SOURCES = \
transport_api.c transport.h \
transport_api_blacklist.c \
- transport_api_address_lookup.c
+ transport_api_address_lookup.c \
+ transport_api_peer_address_lookup.c
libgnunettransport_la_LIBADD = \
$(top_builddir)/src/hello/libgnunethello.la \
$(top_builddir)/src/util/libgnunetutil.la \
*/
struct TransportPlugin
{
-
/**
* This is a linked list.
*/
force_address = GNUNET_YES;
if (mq->specific_address == NULL)
{
- /* TODO: ADD ATS */
+ /* TODO: ADD ATS */
mq->specific_address = get_preferred_ats_address(n);
GNUNET_STATISTICS_update (stats,
gettext_noop ("# transport selected peer address freely"),
&transmit_address_to_client, tc);
}
+/**
+ * Handle AddressLookup-message.
+ *
+ * @param cls closure (always NULL)
+ * @param client identification of the client
+ * @param message the actual message
+ */
+static void
+handle_peer_address_lookup (void *cls,
+ struct GNUNET_SERVER_Client *client,
+ const struct GNUNET_MessageHeader *message)
+{
+ const struct PeerAddressLookupMessage *peer_address_lookup;
+ struct NeighbourList *neighbor_iterator;
+ struct ReadyList *ready_iterator;
+ struct ForeignAddressList *foreign_address_iterator;
+ struct TransportPlugin *transport_plugin;
+
+ uint16_t size;
+ struct GNUNET_SERVER_TransmitContext *tc;
+ struct GNUNET_TIME_Absolute timeout;
+ struct GNUNET_TIME_Relative rtimeout;
+ char *addr_buf;
+
+ size = ntohs (message->size);
+ if (size < sizeof (struct PeerAddressLookupMessage))
+ {
+ GNUNET_break_op (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+ peer_address_lookup = (const struct PeerAddressLookupMessage *) message;
+
+ timeout = GNUNET_TIME_absolute_ntoh (peer_address_lookup->timeout);
+ rtimeout = GNUNET_TIME_absolute_get_remaining (timeout);
+
+ neighbor_iterator = neighbours;
+ while (neighbor_iterator != NULL)
+ {
+ if (0 == memcmp(&neighbor_iterator->id, &peer_address_lookup->peer, sizeof(struct GNUNET_PeerIdentity)))
+ break;
+ neighbor_iterator = neighbor_iterator->next;
+ }
+
+ /* Found no neighbor matching this peer id (shouldn't be possible, but...) */
+ if (neighbor_iterator == NULL)
+ {
+ GNUNET_break(0);
+ tc = GNUNET_SERVER_transmit_context_create (client);
+ GNUNET_SERVER_transmit_context_append_data (tc, NULL, 0,
+ GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY);
+ GNUNET_SERVER_transmit_context_run (tc, rtimeout);
+ return;
+ }
+
+ ready_iterator = neighbor_iterator->plugins;
+ GNUNET_SERVER_disable_receive_done_warning (client);
+ tc = GNUNET_SERVER_transmit_context_create (client);
+ while(ready_iterator != NULL)
+ {
+ foreign_address_iterator = ready_iterator->addresses;
+ while (foreign_address_iterator != NULL)
+ {
+ transport_plugin = foreign_address_iterator->ready_list->plugin;
+ if (foreign_address_iterator->addr != NULL)
+ {
+ GNUNET_asprintf (&addr_buf, "%s --- %s",
+ a2s (transport_plugin->short_name,
+ foreign_address_iterator->addr,
+ foreign_address_iterator->addrlen),
+ (foreign_address_iterator->connected
+ == GNUNET_YES) ? "CONNECTED"
+ : "DISCONNECTED");
+ transmit_address_to_client(tc, addr_buf);
+ GNUNET_free(addr_buf);
+ }
+
+ foreign_address_iterator = foreign_address_iterator->next;
+ }
+ ready_iterator = ready_iterator->next;
+ }
+ GNUNET_SERVER_transmit_context_append_data (tc, NULL, 0,
+ GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_REPLY);
+ GNUNET_SERVER_transmit_context_run (tc, GNUNET_TIME_UNIT_FOREVER_REL);
+}
+
/**
* Setup the environment for this plugin.
{&handle_address_lookup, NULL,
GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_LOOKUP,
0},
+ {&handle_peer_address_lookup, NULL,
+ GNUNET_MESSAGE_TYPE_TRANSPORT_PEER_ADDRESS_LOOKUP,
+ 0},
{&handle_blacklist_init, NULL,
GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_INIT, sizeof (struct GNUNET_MessageHeader)},
{&handle_blacklist_reply, NULL,