static struct ssmpingd_sock *ssmpingd_new(struct in_addr source_addr) { struct ssmpingd_sock *ss; int sock_fd; if (!qpim_ssmpingd_list) { qpim_ssmpingd_list = list_new(); if (!qpim_ssmpingd_list) { zlog_err("%s %s: failure: qpim_ssmpingd_list=list_new()", __FILE__, __PRETTY_FUNCTION__); return 0; } qpim_ssmpingd_list->del = (void (*)(void *)) ssmpingd_free; } sock_fd = ssmpingd_socket(source_addr, /* port: */ 4321, /* mTTL: */ 64); if (sock_fd < 0) { char source_str[100]; pim_inet4_dump("<src?>", source_addr, source_str, sizeof(source_str)); zlog_warn("%s: ssmpingd_socket() failure for source %s", __PRETTY_FUNCTION__, source_str); return 0; } ss = XMALLOC(MTYPE_PIM_SSMPINGD, sizeof(*ss)); if (!ss) { char source_str[100]; pim_inet4_dump("<src?>", source_addr, source_str, sizeof(source_str)); zlog_err("%s: XMALLOC(%zu) failure for ssmpingd source %s", __PRETTY_FUNCTION__, sizeof(*ss), source_str); close(sock_fd); return 0; } ss->sock_fd = sock_fd; ss->t_sock_read = 0; ss->source_addr = source_addr; ss->creation = pim_time_monotonic_sec(); ss->requests = 0; listnode_add(qpim_ssmpingd_list, ss); ssmpingd_read_on(ss); return ss; }
static struct ssmpingd_sock *ssmpingd_new(struct pim_instance *pim, struct in_addr source_addr) { struct ssmpingd_sock *ss; int sock_fd; if (!pim->ssmpingd_list) { pim->ssmpingd_list = list_new(); pim->ssmpingd_list->del = (void (*)(void *))ssmpingd_free; } sock_fd = ssmpingd_socket(source_addr, /* port: */ 4321, /* mTTL: */ 64); if (sock_fd < 0) { char source_str[INET_ADDRSTRLEN]; pim_inet4_dump("<src?>", source_addr, source_str, sizeof(source_str)); zlog_warn("%s: ssmpingd_socket() failure for source %s", __PRETTY_FUNCTION__, source_str); return 0; } ss = XCALLOC(MTYPE_PIM_SSMPINGD, sizeof(*ss)); ss->pim = pim; ss->sock_fd = sock_fd; ss->t_sock_read = NULL; ss->source_addr = source_addr; ss->creation = pim_time_monotonic_sec(); ss->requests = 0; listnode_add(pim->ssmpingd_list, ss); ssmpingd_read_on(ss); return ss; }