- udp_real_send(plugin, sockinfo->desc, NULL,
- (char *)outgoing_probe_reply,
- ntohs(outgoing_probe_reply->header.size), 0,
- GNUNET_TIME_relative_get_unit(),
- sender_addr, fromlen,
- NULL, NULL);
-
-#if DEBUG_UDP
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Sent PROBE REPLY to port %d on outgoing port %d\n"),
- incoming_port, sockinfo->port);
-#endif
- GNUNET_free(outgoing_probe_reply);
- break;
- case GNUNET_MESSAGE_TYPE_TRANSPORT_UDP_NAT_PROBE_REPLY:
- /* Check for existing probe, check ports returned, send confirmation if all is well */
-#if DEBUG_UDP
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Received PROBE REPLY from port %d on incoming port %d\n"), incoming_port, sockinfo->port);
-#endif
- if (fromlen == sizeof(struct IPv4UdpAddress))
- {
- memset(&addr_buf, 0, sizeof(addr_buf));
- if (NULL == inet_ntop (AF_INET,
- &((struct IPv4UdpAddress *) sender_addr)->ipv4_addr, addr_buf,
- INET_ADDRSTRLEN))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "inet_ntop");
- return;
- }
- outgoing_probe = find_probe(plugin, &addr_buf[0]);
- if (outgoing_probe != NULL)
- {
-#if DEBUG_UDP
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Sending confirmation that we were reached!\n"));
-#endif
- outgoing_probe_confirmation = GNUNET_malloc(sizeof(struct UDP_NAT_ProbeMessageConfirmation));
- outgoing_probe_confirmation->header.size = htons(sizeof(struct UDP_NAT_ProbeMessageConfirmation));
- outgoing_probe_confirmation->header.type = htons(GNUNET_MESSAGE_TYPE_TRANSPORT_UDP_NAT_PROBE_CONFIRM);
- udp_real_send(plugin, sockinfo->desc, NULL,
- (char *)outgoing_probe_confirmation,
- ntohs(outgoing_probe_confirmation->header.size), 0,
- GNUNET_TIME_relative_get_unit(),
- sender_addr, fromlen, NULL, NULL);
-
- if (outgoing_probe->task != GNUNET_SCHEDULER_NO_TASK)
- {
- GNUNET_SCHEDULER_cancel(plugin->env->sched, outgoing_probe->task);
- outgoing_probe->task = GNUNET_SCHEDULER_NO_TASK;
- /* Schedule task to timeout and remove probe if confirmation not received */
- }
- GNUNET_free(outgoing_probe_confirmation);
- }
- else
- {
-#if DEBUG_UDP
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Received a probe reply, but have no record of a sent probe!\n"));
-#endif
- }
- }
- else
- {
-#if DEBUG_UDP
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Received a probe reply, but sender address size is WRONG (should be %d, is %d)!\n"), sizeof(struct IPv4UdpAddress), fromlen);
-#endif
- }
- break;
- case GNUNET_MESSAGE_TYPE_TRANSPORT_UDP_NAT_PROBE_CONFIRM:
- peer_session = find_session(plugin, sender);
-#if DEBUG_UDP
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Looking up peer session for peer %s\n"), GNUNET_i2s(sender));
-#endif
- if (peer_session == NULL) /* Shouldn't this NOT happen? */
- {
-#if DEBUG_UDP
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Peer not in list, adding (THIS MAY BE A MISTAKE) %s\n"), GNUNET_i2s(sender));
-#endif
- peer_session = GNUNET_malloc(sizeof(struct PeerSession));
- peer_session->connect_addr = GNUNET_malloc(fromlen);
- memcpy(peer_session->connect_addr, sender_addr, fromlen);
- peer_session->connect_alen = fromlen;
- peer_session->plugin = plugin;
- peer_session->sock = sockinfo->desc;
- memcpy(&peer_session->target, sender, sizeof(struct GNUNET_PeerIdentity));
- peer_session->expecting_welcome = GNUNET_NO;
-
- peer_session->next = plugin->sessions;
- plugin->sessions = peer_session;
-
- peer_session->messages = NULL;
- }
- else if (peer_session->expecting_welcome == GNUNET_YES)
- {
- peer_session->expecting_welcome = GNUNET_NO;
- peer_session->sock = sockinfo->desc;
- if (peer_session->connect_alen == sizeof(struct IPv4UdpAddress))
- {
- ((struct IPv4UdpAddress *)peer_session->connect_addr)->u_port = htons(incoming_port);
- }
- else if (peer_session->connect_alen == sizeof(struct IPv4UdpAddress))
- {
- ((struct IPv6UdpAddress *)peer_session->connect_addr)->u6_port = htons(incoming_port);
- }
-
-#if DEBUG_UDP
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Received a probe confirmation, will send to peer on port %d\n"), incoming_port);
-#endif
- if (peer_session->messages != NULL)
- {
-#if DEBUG_UDP
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Received a probe confirmation, sending queued messages.\n"));
-#endif
- pending_message = peer_session->messages;
- int count = 0;
- while (pending_message != NULL)
- {
-#if DEBUG_UDP
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("sending queued message %d\n"), count);
-#endif
- udp_real_send(plugin,
- peer_session->sock,
- &peer_session->target,
- pending_message->msgbuf,
- pending_message->msgbuf_size, 0,
- GNUNET_TIME_relative_get_unit(),
- peer_session->connect_addr,
- peer_session->connect_alen,
- pending_message->cont,
- pending_message->cont_cls);
-
- pending_message_temp = pending_message;
- pending_message = pending_message->next;
- GNUNET_free(pending_message_temp->msgbuf);
- GNUNET_free(pending_message_temp);
-#if DEBUG_UDP
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("finished sending queued message %d\n"), count);
-#endif
- count++;
- }
- }