ip6_cantforward(const struct ip6_hdr *ip6, const struct ifnet *srcifp, const struct ifnet *dstifp, const char *fmt, ...) { char sbuf[INET6_ADDRSTRLEN], dbuf[INET6_ADDRSTRLEN]; char reason[256]; va_list ap; uint64_t *ip6s; /* update statistics */ ip6s = IP6_STAT_GETREF(); ip6s[IP6_STAT_CANTFORWARD]++; if (dstifp) ip6s[IP6_STAT_BADSCOPE]++; IP6_STAT_PUTREF(); if (dstifp) in6_ifstat_inc(dstifp, ifs6_in_discard); if (ip6_log_time + ip6_log_interval >= time_uptime) return; ip6_log_time = time_uptime; va_start(ap, fmt); vsnprintf(reason, sizeof(reason), fmt, ap); va_end(ap); log(LOG_DEBUG, "Cannot forward from %s@%s to %s@%s nxt %d (%s)\n", IN6_PRINT(sbuf, &ip6->ip6_src), srcifp ? if_name(srcifp) : "?", IN6_PRINT(dbuf, &ip6->ip6_dst), dstifp ? if_name(dstifp) : "?", ip6->ip6_nxt, reason); }
/* The generic function called in order to pick a port. */ int portalgo_randport(uint16_t *port, struct inpcb_hdr *inp_hdr, kauth_cred_t cred) { int algo, error; uint16_t lport; int default_algo; DPRINTF("%s called\n", __func__); if (inp_hdr->inph_portalgo == PORTALGO_DEFAULT) { switch (inp_hdr->inph_af) { #ifdef INET case AF_INET: default_algo = inet4_portalgo; break; #endif #ifdef INET6 case AF_INET6: default_algo = inet6_portalgo; break; #endif default: return EINVAL; } if (default_algo == PORTALGO_DEFAULT) algo = PORTALGO_BSD; else algo = default_algo; } else /* socket specifies the algorithm */ algo = inp_hdr->inph_portalgo; KASSERT(algo >= 0); KASSERT(algo < NALGOS); switch (inp_hdr->inph_af) { #ifdef INET case AF_INET: { char buf[INET_ADDRSTRLEN]; struct inpcb *inp = (struct inpcb *)(void *)inp_hdr; DPRINTF("local addr: %s\n", IN_PRINT(buf, &inp->inp_laddr)); DPRINTF("local port: %d\n", inp->inp_lport); DPRINTF("foreign addr: %s\n", IN_PRINT(buf, &inp->inp_faddr)); DPRINTF("foreign port: %d\n", inp->inp_fport); break; } #endif #ifdef INET6 case AF_INET6: { char buf[INET6_ADDRSTRLEN]; struct in6pcb *in6p = (struct in6pcb *)(void *)inp_hdr; DPRINTF("local addr: %s\n", IN6_PRINT(buf, &in6p->in6p_laddr)); DPRINTF("local port: %d\n", in6p->in6p_lport); DPRINTF("foreign addr: %s\n", IN6_PRINT(buf, &in6p->in6p_laddr)); DPRINTF("foreign port: %d\n", in6p->in6p_fport); break; } #endif default: break; } DPRINTF("%s portalgo = %d\n", __func__, algo); error = (*algos[algo].func)(algo, &lport, inp_hdr, cred); if (error == 0) { *port = lport; } else if (error != EAGAIN) { uint16_t lastport, mymin, mymax, *pnext_ephemeral; error = pcb_getports(inp_hdr, &lastport, &mymin, &mymax, &pnext_ephemeral, algo); if (error) return error; *port = lastport - 1; } return error; }