On Tue, Jun 13, 2023 at 10:57:06AM +0200, Theo Buehler wrote:
> There are a lot of print_host() calls that have an explicit cast and
> pass NULL, 0 as second and third arguments. This is responsible for a
> lot of awkward line wrapping. The exlicit casts can be avoided by
> using a function with a void * argument. This is no less typesafe than
> having explicit casts.
ok tobhe@
>
> Index: iked.h
> ===================================================================
> RCS file: /cvs/src/sbin/iked/iked.h,v
> retrieving revision 1.215
> diff -u -p -r1.215 iked.h
> --- iked.h 12 Jun 2023 09:02:31 -0000 1.215
> +++ iked.h 13 Jun 2023 08:47:59 -0000
> @@ -1252,6 +1252,8 @@ uint32_t
> prefixlen2mask(uint8_t);
> const char *
> print_host(struct sockaddr *, char *, size_t);
> +const char *
> + print_addr(void *);
> char *get_string(uint8_t *, size_t);
> const char *
> print_proto(uint8_t);
> Index: ikev2.c
> ===================================================================
> RCS file: /cvs/src/sbin/iked/ikev2.c,v
> retrieving revision 1.369
> diff -u -p -r1.369 ikev2.c
> --- ikev2.c 13 Jun 2023 08:45:41 -0000 1.369
> +++ ikev2.c 13 Jun 2023 08:48:00 -0000
> @@ -669,8 +669,8 @@ ikev2_recv(struct iked *env, struct iked
> print_map(hdr->ike_exchange, ikev2_exchange_map),
> msg->msg_response ? "res" : "req",
> msg->msg_msgid,
> - print_host((struct sockaddr *)&msg->msg_peer, NULL, 0),
> - print_host((struct sockaddr *)&msg->msg_local, NULL, 0),
> + print_addr(&msg->msg_peer),
> + print_addr(&msg->msg_local),
> ibuf_length(msg->msg_data),
> msg->msg_policy->pol_name);
> log_debug("%s: ispi %s rspi %s", __func__,
> @@ -783,8 +783,7 @@ ikev2_recv(struct iked *env, struct iked
> sa->sa_fd = msg->msg_fd;
>
> log_debug("%s: updated SA to peer %s local %s", __func__,
> - print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0),
> - print_host((struct sockaddr *)&sa->sa_local.addr, NULL, 0));
> + print_addr(&sa->sa_peer.addr), print_addr(&sa->sa_local.addr));
>
> done:
> if (initiator)
> @@ -1101,16 +1100,13 @@ ikev2_ike_auth_recv(struct iked *env, st
> if (sa->sa_cp == IKEV2_CP_REPLY) {
> if (sa->sa_cp_addr)
> log_info("%s: obtained lease: %s", SPI_SA(sa, __func__),
> - print_host((struct sockaddr *)&sa->sa_cp_addr->addr,
> - NULL, 0));
> + print_addr(&sa->sa_cp_addr->addr));
> if (sa->sa_cp_addr6)
> log_info("%s: obtained lease: %s", SPI_SA(sa, __func__),
> - print_host((struct sockaddr
> *)&sa->sa_cp_addr6->addr,
> - NULL, 0));
> + print_addr(&sa->sa_cp_addr6->addr));
> if (sa->sa_cp_dns)
> log_info("%s: obtained DNS: %s", SPI_SA(sa, __func__),
> - print_host((struct sockaddr *)&sa->sa_cp_dns->addr,
> - NULL, 0));
> + print_addr(&sa->sa_cp_dns->addr));
> }
>
> return ikev2_ike_auth(env, sa);
> @@ -1296,8 +1292,7 @@ ikev2_enable_natt(struct iked *env, stru
>
> log_debug("%s: detected NAT, enabling UDP encapsulation,"
> " updated SA to peer %s local %s", __func__,
> - print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0),
> - print_host((struct sockaddr *)&sa->sa_local.addr, NULL, 0));
> + print_addr(&sa->sa_peer.addr), print_addr(&sa->sa_local.addr));
> }
>
> void
> @@ -1318,9 +1313,7 @@ ikev2_init_ike_sa(struct iked *env, void
>
> if (ikev2_init_ike_sa_peer(env, pol, &pol->pol_peer, NULL))
> log_debug("%s: failed to initiate with peer %s",
> - __func__,
> - print_host((struct sockaddr *)&pol->pol_peer.addr,
> - NULL, 0));
> + __func__, print_addr(&pol->pol_peer.addr));
> }
>
> timer_set(env, &env->sc_inittmr, ikev2_init_ike_sa, NULL);
> @@ -2326,7 +2319,7 @@ ikev2_nat_detection(struct iked *env, st
> frompeer ? "peer" : "local",
> print_spi(betoh64(ispi), 8),
> print_spi(betoh64(rspi), 8),
> - print_host(src, NULL, 0));
> + print_addr(src));
> ss = src;
> break;
> case IKEV2_N_NAT_DETECTION_DESTINATION_IP:
> @@ -2334,7 +2327,7 @@ ikev2_nat_detection(struct iked *env, st
> frompeer ? "peer" : "local",
> print_spi(betoh64(ispi), 8),
> print_spi(betoh64(rspi), 8),
> - print_host(dst, NULL, 0));
> + print_addr(dst));
> ss = dst;
> break;
> default:
> @@ -5225,12 +5218,12 @@ ikev2_ike_sa_keepalive(struct iked *env,
> (struct sockaddr *)&sa->sa_local.addr, sa->sa_local.addr.ss_len)
> == -1)
> log_warn("%s: sendtofrom: peer %s local %s", __func__,
> - print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0),
> - print_host((struct sockaddr *)&sa->sa_local.addr, NULL, 0));
> + print_addr(&sa->sa_peer.addr),
> + print_addr(&sa->sa_local.addr));
> else
> log_debug("%s: peer %s local %s", __func__,
> - print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0),
> - print_host((struct sockaddr *)&sa->sa_local.addr, NULL, 0));
> + print_addr(&sa->sa_peer.addr),
> + print_addr(&sa->sa_local.addr));
> ikestat_inc(env, ikes_keepalive_sent);
> timer_add(env, &sa->sa_keepalive, IKED_IKE_SA_KEEPALIVE_TIMEOUT);
> }
> @@ -6557,18 +6550,15 @@ ikev2_childsa_enable(struct iked *env, s
> fputs(", ", flowf);
> fprintf(flowf, "%s-%s/%d%s%s%s%s%s=%s/%d(%u)%s",
> print_map(flow->flow_saproto, ikev2_saproto_map),
> - print_host((struct sockaddr *)&flow->flow_src.addr,
> - NULL, 0),
> + print_addr(&flow->flow_src.addr),
> flow->flow_src.addr_mask,
> flow->flow_prenat.addr_af != 0 ? "[": "",
> flow->flow_prenat.addr_af != 0 ?
> - print_host((struct sockaddr *)
> - &flow->flow_prenat.addr, NULL, 0) : "",
> + print_addr(&flow->flow_prenat.addr) : "",
> flow->flow_prenat.addr_af != 0 ? "/" : "",
> flow->flow_prenat.addr_af != 0 ? prenat_mask : "",
> flow->flow_prenat.addr_af != 0 ? "]": "",
> - print_host((struct sockaddr *)&flow->flow_dst.addr,
> - NULL, 0),
> + print_addr(&flow->flow_dst.addr),
> flow->flow_dst.addr_mask,
> flow->flow_ipproto,
> reload ? "-R" : "");
> @@ -6580,8 +6570,7 @@ ikev2_childsa_enable(struct iked *env, s
> memcpy(&sa->sa_peer_loaded, &sa->sa_peer,
> sizeof(sa->sa_peer_loaded));
> log_debug("%s: remember SA peer %s", __func__,
> - print_host((struct sockaddr *)&sa->sa_peer_loaded.addr,
> - NULL, 0));
> + print_addr(&sa->sa_peer_loaded.addr));
> }
>
> fflush(spif);
> @@ -7129,8 +7118,7 @@ ikev2_cp_setaddr_pool(struct iked *env,
> log_info(
> "%s: giving up assigned address %s to IKESA %s",
> SPI_SA(osa, __func__),
> - print_host((struct sockaddr *)
> - &sa->sa_addrpool->addr, NULL, 0),
> + print_addr(&sa->sa_addrpool->addr),
> print_spi(sa->sa_hdr.sh_ispi, 8));
> }
> if (sa->sa_addrpool6) {
> @@ -7138,8 +7126,7 @@ ikev2_cp_setaddr_pool(struct iked *env,
> log_info(
> "%s: giving up assigned v6 address %s to IKESA %s",
> SPI_SA(osa, __func__),
> - print_host((struct sockaddr *)
> - &sa->sa_addrpool6->addr, NULL, 0),
> + print_addr(&sa->sa_addrpool6->addr),
> print_spi(sa->sa_hdr.sh_ispi, 8));
> }
> if (family == AF_INET && sa->sa_addrpool != NULL)
> @@ -7268,7 +7255,7 @@ ikev2_cp_setaddr_pool(struct iked *env,
> if (ikev2_print_id(IKESA_DSTID(sa), idstr, sizeof(idstr)) == -1)
> bzero(idstr, sizeof(idstr));
> log_info("%sassigned address %s to %s%s", SPI_SA(sa, NULL),
> - print_host((struct sockaddr *)&addr.addr, NULL, 0),
> + print_addr(&addr.addr),
> idstr, requested ? " (requested by peer)" : "");
> return (0);
> }
> @@ -7374,8 +7361,8 @@ ikev2_update_sa_addresses(struct iked *e
> return -1;
>
> log_info("%s: old %s new %s", SPI_SA(sa, __func__),
> - print_host((struct sockaddr *)&sa->sa_peer_loaded.addr, NULL, 0),
> - print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0));
> + print_addr(&sa->sa_peer_loaded.addr),
> + print_addr(&sa->sa_peer.addr));
>
> TAILQ_FOREACH(csa, &sa->sa_childsas, csa_entry) {
> if (!csa->csa_loaded)
> @@ -7449,11 +7436,10 @@ ikev2_info_sa(struct iked *env, int dolo
> msg, sa,
> print_spi(sa->sa_hdr.sh_rspi, 8),
> print_spi(sa->sa_hdr.sh_ispi, 8),
> - print_host((struct sockaddr *)&sa->sa_local.addr, NULL, 0),
> - print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0),
> + print_addr(&sa->sa_local.addr),
> + print_addr(&sa->sa_peer.addr),
> idstr,
> - sa->sa_addrpool ?
> - print_host((struct sockaddr *)&sa->sa_addrpool->addr, NULL, 0) : "",
> + sa->sa_addrpool ? print_addr(&sa->sa_addrpool->addr) : "",
> print_map(sa->sa_state, ikev2_state_map),
> sa->sa_hdr.sh_initiator ? 'i' : 'r',
> sa->sa_natt ? " natt" : "",
> @@ -7484,8 +7470,8 @@ ikev2_info_csa(struct iked *env, int dol
> print_map(csa->csa_saproto, ikev2_saproto_map),
> print_spi(csa->csa_spi.spi, csa->csa_spi.spi_size),
> csa->csa_dir == IPSP_DIRECTION_IN ? "in" : "out",
> - print_host((struct sockaddr *)&csa->csa_local->addr, NULL, 0),
> - print_host((struct sockaddr *)&csa->csa_peer->addr, NULL, 0),
> + print_addr(&csa->csa_local->addr),
> + print_addr(&csa->csa_peer->addr),
> csa->csa_loaded ? "L" : "",
> csa->csa_rekey ? "R" : "",
> csa->csa_allocated ? "A" : "",
> @@ -7524,13 +7510,13 @@ ikev2_info_flow(struct iked *env, int do
> "%s: %p %s %s %s/%d -> %s/%d %s%s%s%s%s[%u]@%d (%s) @%p\n", msg,
> flow,
> print_map(flow->flow_saproto, ikev2_saproto_map),
> flow->flow_dir == IPSP_DIRECTION_IN ? "in" : "out",
> - print_host((struct sockaddr *)&flow->flow_src.addr, NULL, 0),
> + print_addr(&flow->flow_src.addr),
> flow->flow_src.addr_mask,
> - print_host((struct sockaddr *)&flow->flow_dst.addr, NULL, 0),
> + print_addr(&flow->flow_dst.addr),
> flow->flow_dst.addr_mask,
> flow->flow_prenat.addr_af != 0 ? "[": "",
> - flow->flow_prenat.addr_af != 0 ? print_host((struct sockaddr *)
> - &flow->flow_prenat.addr, NULL, 0) : "",
> + flow->flow_prenat.addr_af != 0 ?
> + print_addr(&flow->flow_prenat.addr) : "",
> flow->flow_prenat.addr_af != 0 ? "/" : "",
> flow->flow_prenat.addr_af != 0 ? prenat_mask : "",
> flow->flow_prenat.addr_af != 0 ? "] ": "",
> @@ -7616,14 +7602,12 @@ ikev2_log_established(struct iked_sa *sa
> log_info(
> "%sestablished peer %s[%s] local %s[%s]%s%s%s%s policy '%s'%s"
> " (enc %s%s%s group %s prf %s)", SPI_SA(sa, NULL),
> - print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0), dstid,
> - print_host((struct sockaddr *)&sa->sa_local.addr, NULL, 0), srcid,
> + print_addr(&sa->sa_peer.addr), dstid,
> + print_addr(&sa->sa_local.addr), srcid,
> sa->sa_addrpool ? " assigned " : "",
> - sa->sa_addrpool ?
> - print_host((struct sockaddr *)&sa->sa_addrpool->addr, NULL, 0) : "",
> + sa->sa_addrpool ? print_addr(&sa->sa_addrpool->addr) : "",
> sa->sa_addrpool6 ? " assigned " : "",
> - sa->sa_addrpool6 ?
> - print_host((struct sockaddr *)&sa->sa_addrpool6->addr, NULL, 0) :
> "",
> + sa->sa_addrpool6 ? print_addr(&sa->sa_addrpool6->addr) : "",
> sa->sa_policy ? sa->sa_policy->pol_name : "",
> sa->sa_hdr.sh_initiator ? " as initiator" : " as responder",
> print_xf(sa->sa_encr->encr_id, cipher_keylength(sa->sa_encr) -
> Index: ikev2_msg.c
> ===================================================================
> RCS file: /cvs/src/sbin/iked/ikev2_msg.c,v
> retrieving revision 1.94
> diff -u -p -r1.94 ikev2_msg.c
> --- ikev2_msg.c 6 Jun 2023 13:27:49 -0000 1.94
> +++ ikev2_msg.c 13 Jun 2023 08:48:00 -0000
> @@ -285,8 +285,8 @@ ikev2_msg_send(struct iked *env, struct
> print_map(exchange, ikev2_exchange_map),
> (flags & IKEV2_FLAG_RESPONSE) ? "res" : "req",
> betoh32(hdr->ike_msgid),
> - print_host((struct sockaddr *)&msg->msg_peer, NULL, 0),
> - print_host((struct sockaddr *)&msg->msg_local, NULL, 0),
> + print_addr(&msg->msg_peer),
> + print_addr(&msg->msg_local),
> ibuf_length(buf), isnatt ? ", NAT-T" : "");
>
> if (isnatt) {
> @@ -1290,8 +1290,8 @@ ikev2_msg_retransmit_response(struct ike
> SPI_SA(sa, NULL),
> print_map(exchange, ikev2_exchange_map),
> m->msg_msgid,
> - print_host((struct sockaddr *)&m->msg_local, NULL, 0),
> - print_host((struct sockaddr *)&m->msg_peer, NULL, 0));
> + print_addr(&m->msg_local),
> + print_addr(&m->msg_peer));
> }
>
> timer_add(env, &mr->mrt_timer, IKED_RESPONSE_TIMEOUT);
> @@ -1333,8 +1333,8 @@ ikev2_msg_retransmit_timeout(struct iked
> "local %s", SPI_SA(sa, NULL), mr->mrt_tries + 1,
> print_map(msg->msg_exchange, ikev2_exchange_map),
> msg->msg_msgid,
> - print_host((struct sockaddr *)&msg->msg_peer, NULL,
> 0),
> - print_host((struct sockaddr *)&msg->msg_local,
> NULL, 0));
> + print_addr(&msg->msg_peer),
> + print_addr(&msg->msg_local));
> }
> /* Exponential timeout */
> timer_add(env, &mr->mrt_timer,
> Index: pfkey.c
> ===================================================================
> RCS file: /cvs/src/sbin/iked/pfkey.c,v
> retrieving revision 1.81
> diff -u -p -r1.81 pfkey.c
> --- pfkey.c 22 Jul 2022 15:33:53 -0000 1.81
> +++ pfkey.c 13 Jun 2023 08:48:00 -0000
> @@ -1853,7 +1853,7 @@ pfkey_process(struct iked *env, struct p
> flow.flow_peer = &peer;
>
> log_debug("%s: acquire request (peer %s)", __func__,
> - print_host(speer, NULL, 0));
> + print_addr(speer));
>
> /* get the matching flow */
> bzero(&smsg, sizeof(smsg));
> @@ -1992,9 +1992,9 @@ pfkey_process(struct iked *env, struct p
>
> log_debug("%s: flow %s from %s/%s to %s/%s via %s", __func__,
> flow.flow_dir == IPSP_DIRECTION_IN ? "in" : "out",
> - print_host(ssrc, NULL, 0), print_host(smask, NULL, 0),
> - print_host(sdst, NULL, 0), print_host(dmask, NULL, 0),
> - print_host(speer, NULL, 0));
> + print_addr(ssrc), print_addr(smask),
> + print_addr(sdst), print_addr(dmask),
> + print_addr(speer));
>
> ret = ikev2_child_sa_acquire(env, &flow);
>
> Index: policy.c
> ===================================================================
> RCS file: /cvs/src/sbin/iked/policy.c,v
> retrieving revision 1.94
> diff -u -p -r1.94 policy.c
> --- policy.c 23 May 2023 13:12:19 -0000 1.94
> +++ policy.c 13 Jun 2023 08:48:00 -0000
> @@ -398,10 +398,8 @@ sa_state(struct iked *env, struct iked_s
> case IKEV2_STATE_CLOSED:
> log_debug("%s: %s -> %s from %s to %s policy '%s'",
> SPI_SA(sa, __func__), a, b,
> - print_host((struct sockaddr *)&sa->sa_peer.addr,
> - NULL, 0),
> - print_host((struct sockaddr *)&sa->sa_local.addr,
> - NULL, 0),
> + print_addr(&sa->sa_peer.addr),
> + print_addr(&sa->sa_local.addr),
> sa->sa_policy ? sa->sa_policy->pol_name :
> "<unknown>");
> break;
> Index: print.c
> ===================================================================
> RCS file: /cvs/src/sbin/iked/print.c,v
> retrieving revision 1.3
> diff -u -p -r1.3 print.c
> --- print.c 26 Oct 2021 17:31:22 -0000 1.3
> +++ print.c 13 Jun 2023 08:48:00 -0000
> @@ -112,9 +112,7 @@ print_policy(struct iked_policy *pol)
> print_verbose(" rdomain %d", pol->pol_rdomain);
>
> RB_FOREACH(flow, iked_flows, &pol->pol_flows) {
> - print_verbose(" from %s",
> - print_host((struct sockaddr *)&flow->flow_src.addr, NULL,
> - 0));
> + print_verbose(" from %s", print_addr(&flow->flow_src.addr));
> if (flow->flow_src.addr_af != AF_UNSPEC &&
> flow->flow_src.addr_net)
> print_verbose("/%d", flow->flow_src.addr_mask);
> @@ -122,9 +120,7 @@ print_policy(struct iked_policy *pol)
> print_verbose(" port %d",
> ntohs(flow->flow_src.addr_port));
>
> - print_verbose(" to %s",
> - print_host((struct sockaddr *)&flow->flow_dst.addr, NULL,
> - 0));
> + print_verbose(" to %s", print_addr(&flow->flow_dst.addr));
> if (flow->flow_dst.addr_af != AF_UNSPEC &&
> flow->flow_dst.addr_net)
> print_verbose("/%d", flow->flow_dst.addr_mask);
> @@ -134,16 +130,12 @@ print_policy(struct iked_policy *pol)
> }
>
> if ((pol->pol_flags & IKED_POLICY_DEFAULT) == 0) {
> - print_verbose(" local %s",
> - print_host((struct sockaddr *)&pol->pol_local.addr, NULL,
> - 0));
> + print_verbose(" local %s", print_addr(&pol->pol_local.addr));
> if (pol->pol_local.addr.ss_family != AF_UNSPEC &&
> pol->pol_local.addr_net)
> print_verbose("/%d", pol->pol_local.addr_mask);
>
> - print_verbose(" peer %s",
> - print_host((struct sockaddr *)&pol->pol_peer.addr, NULL,
> - 0));
> + print_verbose(" peer %s", print_addr(&pol->pol_peer.addr));
> if (pol->pol_peer.addr.ss_family != AF_UNSPEC &&
> pol->pol_peer.addr_net)
> print_verbose("/%d", pol->pol_peer.addr_mask);
> @@ -235,8 +227,7 @@ print_policy(struct iked_policy *pol)
> cfg = &pol->pol_cfg[i];
> print_verbose(" config %s %s", print_xf(cfg->cfg_type,
> cfg->cfg.address.addr_af, cpxfs),
> - print_host((struct sockaddr *)&cfg->cfg.address.addr, NULL,
> - 0));
> + print_addr(&cfg->cfg.address.addr));
> }
>
> if (pol->pol_iface != 0 && if_indextoname(pol->pol_iface, iface) !=
> NULL)
> Index: util.c
> ===================================================================
> RCS file: /cvs/src/sbin/iked/util.c,v
> retrieving revision 1.40
> diff -u -p -r1.40 util.c
> --- util.c 15 Aug 2020 11:31:17 -0000 1.40
> +++ util.c 13 Jun 2023 08:48:00 -0000
> @@ -669,6 +669,12 @@ print_host(struct sockaddr *sa, char *bu
> return (buf);
> }
>
> +const char *
> +print_addr(void *addr)
> +{
> + return print_host(addr, NULL, 0);
> +}
> +
> char *
> get_string(uint8_t *ptr, size_t len)
> {
> Index: vroute.c
> ===================================================================
> RCS file: /cvs/src/sbin/iked/vroute.c,v
> retrieving revision 1.18
> diff -u -p -r1.18 vroute.c
> --- vroute.c 10 Feb 2023 19:51:08 -0000 1.18
> +++ vroute.c 13 Jun 2023 08:48:00 -0000
> @@ -840,9 +840,9 @@ vroute_doroute(struct iked *env, int fla
> flags & RTF_HOST ? "H" : "",
> flags & RTF_GATEWAY ? "G" : "",
> addrs,
> - addrs & RTA_DST ? print_host(dest, NULL, 0) : "<>",
> - addrs & RTA_NETMASK ? print_host(mask, NULL, 0) : "<>",
> - addrs & RTA_GATEWAY ? print_host(addr, NULL, 0) : "<>");
> + addrs & RTA_DST ? print_addr(dest) : "<>",
> + addrs & RTA_NETMASK ? print_addr(mask) : "<>",
> + addrs & RTA_GATEWAY ? print_addr(addr) : "<>");
>
> if (writev(ivr->ivr_rtsock, iov, iovcnt) == -1) {
> if ((type == RTM_ADD && errno != EEXIST) ||
> @@ -933,9 +933,7 @@ vroute_doaddr(struct iked *env, char *if
> memcpy(&req.ifra_mask, mask, sizeof(req.ifra_addr));
>
> log_debug("%s: %s inet %s netmask %s", __func__,
> - add ? "add" : "del",
> - print_host((struct sockaddr *)addr, NULL, 0),
> - print_host((struct sockaddr *)mask, NULL, 0));
> + add ? "add" : "del", print_addr(addr), print_addr(mask));
>
> ioreq = add ? SIOCAIFADDR : SIOCDIFADDR;
> if (ioctl(ivr->ivr_iosock, ioreq, &req) == -1) {
> @@ -955,9 +953,7 @@ vroute_doaddr(struct iked *env, char *if
> sizeof(req6.ifra_prefixmask));
>
> log_debug("%s: %s inet6 %s netmask %s", __func__,
> - add ? "add" : "del",
> - print_host((struct sockaddr *)addr, NULL, 0),
> - print_host((struct sockaddr *)mask, NULL, 0));
> + add ? "add" : "del", print_addr(addr), print_addr(mask));
>
> ioreq = add ? SIOCAIFADDR_IN6 : SIOCDIFADDR_IN6;
> if (ioctl(ivr->ivr_iosock6, ioreq, &req6) == -1) {
>