On Fri, Nov 27, 2020 at 09:34:59PM +0100, Florian Obser wrote:
>
> Handle the case of an autoconf interface changing its rdomain.
>
> To avoide code duplication have get_icmp6ev_by_rdomain() either return
> an existing icmp6ev in the correct rdomain or allocate one.
>
> OK?
ok tb.
>
> diff --git frontend.c frontend.c
> index 3bf418ba31e..624ff5562f3 100644
> --- frontend.c
> +++ frontend.c
> @@ -502,7 +502,6 @@ void
> update_iface(uint32_t if_index, char* if_name)
> {
> struct iface *iface;
> - struct icmp6_ev *icmp6ev;
> struct imsg_ifinfo imsg_ifinfo;
> int flags, xflags, ifrdomain;
>
> @@ -516,32 +515,29 @@ update_iface(uint32_t if_index, char* if_name)
> if((ifrdomain = get_ifrdomain(if_name)) == -1)
> return;
>
> - if ((iface = get_iface_by_id(if_index)) == NULL) {
> + iface = get_iface_by_id(if_index);
> +
> + if (iface != NULL) {
> + if (iface->rdomain != ifrdomain) {
> + if (iface->icmp6ev != NULL) {
> + iface->icmp6ev->refcnt--;
> + if (iface->icmp6ev->refcnt == 0) {
> + event_del(&iface->icmp6ev->ev);
> + close(EVENT_FD(&iface->icmp6ev->ev));
> + free(iface->icmp6ev);
> + }
> + iface->icmp6ev = NULL;
> + }
> + iface->rdomain = ifrdomain;
> + iface->icmp6ev = get_icmp6ev_by_rdomain(ifrdomain);
> + }
> + } else {
> if ((iface = calloc(1, sizeof(*iface))) == NULL)
> fatal("calloc");
> iface->if_index = if_index;
> iface->rdomain = ifrdomain;
> + iface->icmp6ev = get_icmp6ev_by_rdomain(ifrdomain);
>
> - if ((icmp6ev = get_icmp6ev_by_rdomain(ifrdomain)) == NULL) {
> - if ((icmp6ev = calloc(1, sizeof(*icmp6ev))) == NULL)
> - fatal("calloc");
> - icmp6ev->rcviov[0].iov_base = (caddr_t)icmp6ev->answer;
> - icmp6ev->rcviov[0].iov_len = sizeof(icmp6ev->answer);
> - icmp6ev->rcvmhdr.msg_name = (caddr_t)&icmp6ev->from;
> - icmp6ev->rcvmhdr.msg_namelen = sizeof(icmp6ev->from);
> - icmp6ev->rcvmhdr.msg_iov = icmp6ev->rcviov;
> - icmp6ev->rcvmhdr.msg_iovlen = 1;
> - icmp6ev->rcvmhdr.msg_controllen =
> - CMSG_SPACE(sizeof(struct in6_pktinfo)) +
> - CMSG_SPACE(sizeof(int));
> - if ((icmp6ev->rcvmhdr.msg_control = malloc(icmp6ev->
> - rcvmhdr.msg_controllen)) == NULL)
> - fatal("malloc");
> - frontend_imsg_compose_main(IMSG_OPEN_ICMP6SOCK, 0,
> - &ifrdomain, sizeof(ifrdomain));
> - }
> - iface->icmp6ev = icmp6ev;
> - iface->icmp6ev->refcnt++;
> LIST_INSERT_HEAD(&interfaces, iface, entries);
> }
>
> @@ -1121,13 +1117,35 @@ struct icmp6_ev*
> get_icmp6ev_by_rdomain(int rdomain)
> {
> struct iface *iface;
> + struct icmp6_ev *icmp6ev = NULL;
>
> LIST_FOREACH (iface, &interfaces, entries) {
> - if (iface->rdomain == rdomain)
> - return (iface->icmp6ev);
> + if (iface->rdomain == rdomain) {
> + icmp6ev = iface->icmp6ev;
> + break;
> + }
> }
>
> - return (NULL);
> + if (icmp6ev == NULL) {
> + if ((icmp6ev = calloc(1, sizeof(*icmp6ev))) == NULL)
> + fatal("calloc");
> + icmp6ev->rcviov[0].iov_base = (caddr_t)icmp6ev->answer;
> + icmp6ev->rcviov[0].iov_len = sizeof(icmp6ev->answer);
> + icmp6ev->rcvmhdr.msg_name = (caddr_t)&icmp6ev->from;
> + icmp6ev->rcvmhdr.msg_namelen = sizeof(icmp6ev->from);
> + icmp6ev->rcvmhdr.msg_iov = icmp6ev->rcviov;
> + icmp6ev->rcvmhdr.msg_iovlen = 1;
> + icmp6ev->rcvmhdr.msg_controllen =
> + CMSG_SPACE(sizeof(struct in6_pktinfo)) +
> + CMSG_SPACE(sizeof(int));
> + if ((icmp6ev->rcvmhdr.msg_control = malloc(icmp6ev->
> + rcvmhdr.msg_controllen)) == NULL)
> + fatal("malloc");
> + frontend_imsg_compose_main(IMSG_OPEN_ICMP6SOCK, 0,
> + &rdomain, sizeof(rdomain));
> + }
> + icmp6ev->refcnt++;
> + return (icmp6ev);
> }
>
> void
> --
> 2.29.2
>
>
>
> --
> I'm not entirely sure you are real.
>