/** Describes one entry in the list of targets for the udp sender. */
struct udp_target {
- /** The hostname (DNS name or IPv4/v6 address string). */
- char host[MAX_HOSTLEN];
- /** The UDP port. */
- int port;
/** Track time (seconds) of last ICMP Port Unreachable error */
time_t last_unreachable;
/** Common sender client data */
if (sc->cq != NULL) {
del_close_on_fork_list(sc->fd);
cq_destroy(sc->cq);
- free(sc->name);
- sc->name = NULL;
sc->cq = NULL;
-
}
}
static void udp_delete_target(struct udp_target *ut, const char *msg)
{
-
- PARA_NOTICE_LOG("deleting %s#%d (%s) from list\n", ut->host,
- ut->port, msg);
+ PARA_NOTICE_LOG("deleting %s (%s) from list\n", ut->sc->name, msg);
udp_close_target(ut->sc);
vss_del_fec_client(ut->fc);
list_del(&ut->sc->node);
+ free(ut->sc->name);
free(ut->sc);
free(ut);
}
static void udp_init_session(struct sender_client *sc)
{
if (sc->cq == NULL) {
+ sc->cq = cq_new(UDP_CQ_BYTES);
add_close_on_fork_list(sc->fd);
- sc->cq = cq_new(UDP_CQ_BYTES);
- sc->name = para_strdup(remote_name(sc->fd));
PARA_NOTICE_LOG("sending to udp %s\n", sc->name);
}
}
static int udp_com_delete(struct sender_command_data *scd)
{
struct sender_client *sc, *tmp;
+ char host[MAX_HOSTLEN];
+ int32_t port;
list_for_each_entry_safe(sc, tmp, &targets, node) {
struct udp_target *ut = sc->private_data;
+ parse_url(sc->name, host, sizeof(host), &port);
/* Unspecified port means wildcard port match */
- if (scd->port > 0 && scd->port != ut->port)
+ if (scd->port > 0 && scd->port != port)
continue;
- if (strcmp(ut->host, scd->host))
+ if (strcmp(host, scd->host))
continue;
udp_delete_target(ut, "com_delete");
}
* unreachable_time < dist <= 2 * unreachable_time
* No errors are allowed during this time window.
*/
- PARA_NOTICE_LOG("Evicting %s#%d after %d seconds "
+ PARA_NOTICE_LOG("Evicting %s after %d seconds "
"of connection errors.\n",
- ut->host, ut->port, (int)dist);
+ ut->sc->name, (int)dist);
}
}
return -ERRNO_TO_PARA_ERROR(ret);
ret = mark_fd_nonblocking(ut->sc->fd);
if (ret < 0)
goto err;
- PARA_INFO_LOG("adding to target list (%s#%d)\n", ut->host, ut->port);
+ ut->sc->name = para_strdup(remote_name(ut->sc->fd));
+ PARA_INFO_LOG("adding to target list (%s)\n", ut->sc->name);
ut->fc = vss_add_fec_client(ut->sc, &ut->fcp);
para_list_add(&ut->sc->node, &targets);
return;
list_for_each_entry(sc, &targets, node) {
struct udp_target *ut = sc->private_data;
- bool is_v6 = strchr(ut->host, ':') != NULL;
- char *tmp = make_message("%s%s%s%s:%d/%u:%u:%u ", tgts ? : "",
- is_v6 ? "[" : "", ut->host,
- is_v6 ? "]" : "", ut->port,
+ char *tmp = make_message("%s%s/%u:%u:%u ", tgts ? : "",
+ ut->sc->name,
ut->fcp.max_slice_bytes,
ut->fcp.data_slices_per_group,
ut->fcp.slices_per_group