Esempio n. 1
0
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);
}
Esempio n. 2
0
/* 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;
}