diff --git a/src/client.c b/src/client.c index 5d71adf..d679850 100644 --- a/src/client.c +++ b/src/client.c @@ -97,8 +97,10 @@ int client_init(struct client *client, int ifindex) return -errno; client->mld_fd = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0); - if (client->mld_fd < 0) + if (client->mld_fd < 0) { + close(client->igmp_fd); return -errno; + } client->ifindex = ifindex; return 0; diff --git a/src/igmp.c b/src/igmp.c index aa03466..2747c2e 100644 --- a/src/igmp.c +++ b/src/igmp.c @@ -192,7 +192,7 @@ int igmp_send_query(struct querier_iface *q, break; } - query.q.srcs[cnt] = querier_unmap(&s->addr); + query.q.srcs[cnt++] = querier_unmap(&s->addr); } } query.q.nsrcs = htons(cnt); diff --git a/src/mld.c b/src/mld.c index c6734b1..09f72cc 100644 --- a/src/mld.c +++ b/src/mld.c @@ -77,7 +77,7 @@ static ssize_t mld_handle_record(struct groups *groups, const uint8_t *data, siz void mld_handle(struct mrib_querier *mrib, const struct mld_hdr *hdr, size_t len, const struct sockaddr_in6 *from) { - char addrbuf[INET_ADDRSTRLEN]; + char addrbuf[INET6_ADDRSTRLEN]; omgp_time_t now = omgp_time(); inet_ntop(AF_INET6, &hdr->mld_addr, addrbuf, sizeof(addrbuf)); diff --git a/src/mrib.c b/src/mrib.c index 4b84fa5..9971368 100644 --- a/src/mrib.c +++ b/src/mrib.c @@ -604,24 +604,25 @@ static struct mrib_iface* mrib_get_iface(int ifindex) static void mrib_clean_iface(struct mrib_iface *iface) { if (list_empty(&iface->users) && list_empty(&iface->queriers)) { + const int ifindex = iface->ifindex; iface->ifindex = 0; mrib_clean(&iface->timer); size_t mifid = iface - mifs; struct vifctl ctl = {mifid, VIFF_USE_IFINDEX, 1, 0, - { .vifc_lcl_ifindex = iface->ifindex }, {INADDR_ANY}}; + { .vifc_lcl_ifindex = ifindex }, {INADDR_ANY}}; setsockopt(mrt_fd.fd, IPPROTO_IP, MRT_DEL_VIF, &ctl, sizeof(ctl)); - struct mif6ctl ctl6 = {mifid, 0, 1, iface->ifindex, 0}; + struct mif6ctl ctl6 = {mifid, 0, 1, ifindex, 0}; setsockopt(mrt6_fd.fd, IPPROTO_IPV6, MRT6_DEL_MIF, &ctl6, sizeof(ctl6)); - struct ip_mreqn mreq = {{INADDR_ALLIGMPV3RTRS_GROUP}, {INADDR_ANY}, iface->ifindex}; + struct ip_mreqn mreq = {{INADDR_ALLIGMPV3RTRS_GROUP}, {INADDR_ANY}, ifindex}; setsockopt(mrt_fd.fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)); mreq.imr_multiaddr.s_addr = cpu_to_be32(INADDR_ALLRTRS_GROUP); setsockopt(mrt_fd.fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)); - struct ipv6_mreq mreq6 = {MLD2_ALL_MCR_INIT, iface->ifindex}; + struct ipv6_mreq mreq6 = {MLD2_ALL_MCR_INIT, ifindex}; setsockopt(mrt6_fd.fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, &mreq6, sizeof(mreq6)); mreq6.ipv6mr_multiaddr.s6_addr[15] = 0x02;