/** * Send a message to target node. * * @param n the G2 node to which message should be sent * @param mb the message to sent (ownership taken, will be freed later) */ void g2_node_send(const gnutella_node_t *n, pmsg_t *mb) { node_check(n); g_assert(NODE_TALKS_G2(n)); if (NODE_IS_UDP(n)) mq_udp_node_putq(n->outq, mb, n); else if (NODE_IS_WRITABLE(n)) mq_tcp_putq(n->outq, mb, NULL); else goto drop; if (GNET_PROPERTY(log_sending_g2)) { g_debug("%s(): sending %s to %s", G_STRFUNC, g2_msg_infostr_mb(mb), node_infostr(n)); } return; drop: if (GNET_PROPERTY(log_sending_g2)) { g_debug("%s(): aborting sending %s to %s", G_STRFUNC, g2_msg_infostr_mb(mb), node_infostr(n)); } pmsg_free(mb); /* Cannot send it, free it now */ }
/** * Send a message to the DHT node through UDP. * * It is up to the caller to clone the message if needed, otherwise the * node's queue becomes the sole owner of the message and will pmsg_free() it. */ void udp_dht_send_mb(const gnutella_node_t *n, pmsg_t *mb) { if (NULL == n || NULL == n->outq) { pmsg_free(mb); /* emit warnings */ g_return_if_fail(n); g_return_if_fail(n->outq); g_assert_not_reached(); } g_assert(NODE_IS_DHT(n)); mq_udp_node_putq(n->outq, mb, n); }
/** * Send a datagram to the specified node, made of `len' bytes from `buf', * forming a valid Gnutella message, with a "control" priority. */ void udp_ctrl_send_msg(const gnutella_node_t *n, const void *buf, int len) { pmsg_t *mb; g_assert(NODE_IS_UDP(n)); g_return_if_fail(n->outq); mb = gmsg_to_ctrl_pmsg(buf, len); if (NODE_CAN_SR_UDP(n)) pmsg_mark_reliable(mb); /* Send reliably if node supports it */ mq_udp_node_putq(n->outq, mb, n); }
/** * Send a message to specified UDP node. * * It is up to the caller to clone the message if needed, otherwise the * node's queue becomes the sole owner of the message and will pmsg_free() it. */ void udp_send_mb(const gnutella_node_t *n, pmsg_t *mb) { if (NULL == n || NULL == n->outq) { pmsg_free(mb); /* emit warnings */ g_return_if_fail(n); g_return_if_fail(n->outq); g_assert_not_reached(); } g_assert(NODE_IS_UDP(n)); if (NODE_CAN_SR_UDP(n)) pmsg_mark_reliable(mb); /* Send reliably if node supports it */ mq_udp_node_putq(n->outq, mb, n); }
/** * Send a datagram to the specified node, made of `len' bytes from `buf', * forming a valid Gnutella message. */ void udp_send_msg(const gnutella_node_t *n, const void *buf, int len) { pmsg_t *mb; g_assert(NODE_IS_UDP(n)); g_return_if_fail(n->outq); /* * If message is directed to a UDP node that can do semi-reliable UDP, * then turn on reliability on the message. */ mb = gmsg_to_pmsg(buf, len); if (NODE_CAN_SR_UDP(n)) pmsg_mark_reliable(mb); mq_udp_node_putq(n->outq, mb, n); }