xref: /freebsd/sbin/ipf/libipf/printactivenat.c (revision 51e16cb8fc536913f490ac6bc9c17e92ebd0411b)
141edb306SCy Schubert 
241edb306SCy Schubert /*
341edb306SCy Schubert  * Copyright (C) 2012 by Darren Reed.
441edb306SCy Schubert  *
541edb306SCy Schubert  * See the IPFILTER.LICENCE file for details on licencing.
641edb306SCy Schubert  *
741edb306SCy Schubert  * Added redirect stuff and a variety of bug fixes. (mcn@EnGarde.com)
841edb306SCy Schubert  */
941edb306SCy Schubert 
1041edb306SCy Schubert #include "ipf.h"
1141edb306SCy Schubert 
1241edb306SCy Schubert 
1341edb306SCy Schubert 
149291d079SCy Schubert static int proto_opened = 0;
1541edb306SCy Schubert 
1641edb306SCy Schubert void
printactivenat(nat_t * nat,int opts,u_long ticks)17efeb8bffSCy Schubert printactivenat(nat_t *nat, int opts, u_long ticks)
1841edb306SCy Schubert {
199291d079SCy Schubert 	struct protoent *pproto;
209291d079SCy Schubert 
219291d079SCy Schubert 	if (proto_opened == 0) {
229291d079SCy Schubert 		proto_opened = 1;
239291d079SCy Schubert 		setprotoent(1);
249291d079SCy Schubert 	}
2541edb306SCy Schubert 
2641edb306SCy Schubert 	PRINTF("%s", getnattype(nat));
2741edb306SCy Schubert 
2841edb306SCy Schubert 	if (nat->nat_flags & SI_CLONE)
2941edb306SCy Schubert 		PRINTF(" CLONE");
3041edb306SCy Schubert 	if (nat->nat_phnext[0] == NULL && nat->nat_phnext[1] == NULL)
3141edb306SCy Schubert 		PRINTF(" ORPHAN");
3241edb306SCy Schubert 
3341edb306SCy Schubert 	putchar(' ');
3441edb306SCy Schubert 	if (nat->nat_redir & NAT_REWRITE) {
3541edb306SCy Schubert 		printactiveaddress(nat->nat_v[0], "%-15s", &nat->nat_osrc6,
3641edb306SCy Schubert 				   nat->nat_ifnames[0]);
3741edb306SCy Schubert 
3841edb306SCy Schubert 		if ((nat->nat_flags & IPN_TCPUDP) != 0)
3941edb306SCy Schubert 			PRINTF(" %-5hu", ntohs(nat->nat_osport));
4041edb306SCy Schubert 
4141edb306SCy Schubert 		putchar(' ');
4241edb306SCy Schubert 		printactiveaddress(nat->nat_v[0], "%-15s", &nat->nat_odst6,
4341edb306SCy Schubert 				   nat->nat_ifnames[0]);
4441edb306SCy Schubert 
4541edb306SCy Schubert 		if ((nat->nat_flags & IPN_TCPUDP) != 0)
4641edb306SCy Schubert 			PRINTF(" %-5hu", ntohs(nat->nat_odport));
4741edb306SCy Schubert 
4841edb306SCy Schubert 		PRINTF("<- -> ");
4941edb306SCy Schubert 		printactiveaddress(nat->nat_v[1], "%-15s", &nat->nat_nsrc6,
5041edb306SCy Schubert 				   nat->nat_ifnames[0]);
5141edb306SCy Schubert 
5241edb306SCy Schubert 		if ((nat->nat_flags & IPN_TCPUDP) != 0)
5341edb306SCy Schubert 			PRINTF(" %-5hu", ntohs(nat->nat_nsport));
5441edb306SCy Schubert 
5541edb306SCy Schubert 		putchar(' ');
5641edb306SCy Schubert 		printactiveaddress(nat->nat_v[1], "%-15s", &nat->nat_ndst6,
5741edb306SCy Schubert 				   nat->nat_ifnames[0]);
5841edb306SCy Schubert 		if ((nat->nat_flags & IPN_TCPUDP) != 0)
5941edb306SCy Schubert 			PRINTF(" %-5hu", ntohs(nat->nat_ndport));
6041edb306SCy Schubert 
619291d079SCy Schubert 		pproto = getprotobynumber(nat->nat_pr[0]);
629291d079SCy Schubert 		PRINTF(" %s", pproto->p_name);
639291d079SCy Schubert 
6441edb306SCy Schubert 	} else if (nat->nat_dir == NAT_OUTBOUND) {
6541edb306SCy Schubert 		printactiveaddress(nat->nat_v[0], "%-15s", &nat->nat_osrc6,
6641edb306SCy Schubert 				   nat->nat_ifnames[0]);
6741edb306SCy Schubert 
6841edb306SCy Schubert 		if ((nat->nat_flags & IPN_TCPUDP) != 0)
6941edb306SCy Schubert 			PRINTF(" %-5hu", ntohs(nat->nat_osport));
7041edb306SCy Schubert 
7141edb306SCy Schubert 		PRINTF(" <- -> ");
7241edb306SCy Schubert 		printactiveaddress(nat->nat_v[1], "%-15s", &nat->nat_nsrc6,
7341edb306SCy Schubert 				   nat->nat_ifnames[0]);
7441edb306SCy Schubert 
7541edb306SCy Schubert 		if ((nat->nat_flags & IPN_TCPUDP) != 0)
7641edb306SCy Schubert 			PRINTF(" %-5hu", ntohs(nat->nat_nsport));
7741edb306SCy Schubert 
7841edb306SCy Schubert 		PRINTF(" [");
7941edb306SCy Schubert 		printactiveaddress(nat->nat_v[0], "%s", &nat->nat_odst6,
8041edb306SCy Schubert 				   nat->nat_ifnames[0]);
8141edb306SCy Schubert 
8241edb306SCy Schubert 		if ((nat->nat_flags & IPN_TCPUDP) != 0)
8341edb306SCy Schubert 			PRINTF(" %hu", ntohs(nat->nat_odport));
8441edb306SCy Schubert 		PRINTF("]");
859291d079SCy Schubert 
869291d079SCy Schubert 		pproto = getprotobynumber(nat->nat_pr[1]);
879291d079SCy Schubert 		PRINTF(" %s", pproto->p_name);
8841edb306SCy Schubert 	} else {
8941edb306SCy Schubert 		printactiveaddress(nat->nat_v[1], "%-15s", &nat->nat_ndst6,
9041edb306SCy Schubert 				   nat->nat_ifnames[0]);
9141edb306SCy Schubert 
9241edb306SCy Schubert 		if ((nat->nat_flags & IPN_TCPUDP) != 0)
9341edb306SCy Schubert 			PRINTF(" %-5hu", ntohs(nat->nat_ndport));
9441edb306SCy Schubert 
9541edb306SCy Schubert 		PRINTF(" <- -> ");
9641edb306SCy Schubert 		printactiveaddress(nat->nat_v[0], "%-15s", &nat->nat_odst6,
9741edb306SCy Schubert 				   nat->nat_ifnames[0]);
9841edb306SCy Schubert 
9941edb306SCy Schubert 		if ((nat->nat_flags & IPN_TCPUDP) != 0)
10041edb306SCy Schubert 			PRINTF(" %-5hu", ntohs(nat->nat_odport));
10141edb306SCy Schubert 
10241edb306SCy Schubert 		PRINTF(" [");
10341edb306SCy Schubert 		printactiveaddress(nat->nat_v[0], "%s", &nat->nat_osrc6,
10441edb306SCy Schubert 				   nat->nat_ifnames[0]);
10541edb306SCy Schubert 
10641edb306SCy Schubert 		if ((nat->nat_flags & IPN_TCPUDP) != 0)
10741edb306SCy Schubert 			PRINTF(" %hu", ntohs(nat->nat_osport));
10841edb306SCy Schubert 		PRINTF("]");
1099291d079SCy Schubert 
1109291d079SCy Schubert 		pproto = getprotobynumber(nat->nat_pr[0]);
1119291d079SCy Schubert 		PRINTF(" %s", pproto->p_name);
11241edb306SCy Schubert 	}
11341edb306SCy Schubert 
1149291d079SCy Schubert 
11541edb306SCy Schubert 	if (opts & OPT_VERBOSE) {
11641edb306SCy Schubert 		PRINTF("\n\tttl %lu use %hu sumd %s/",
11741edb306SCy Schubert 			nat->nat_age - ticks, nat->nat_use,
11841edb306SCy Schubert 			getsumd(nat->nat_sumd[0]));
11941edb306SCy Schubert 		PRINTF("%s pr %u/%u hash %u/%u flags %x\n",
12041edb306SCy Schubert 			getsumd(nat->nat_sumd[1]),
12141edb306SCy Schubert 			nat->nat_pr[0], nat->nat_pr[1],
12241edb306SCy Schubert 			nat->nat_hv[0], nat->nat_hv[1], nat->nat_flags);
123*ec793543SCy Schubert 		PRINTF("\tifp %s,%s ", FORMAT_IF(nat->nat_ifnames[0]),
124*ec793543SCy Schubert 			FORMAT_IF(nat->nat_ifnames[1]));
12541edb306SCy Schubert #ifdef	USE_QUAD_T
12641edb306SCy Schubert 		PRINTF("bytes %"PRIu64"/%"PRIu64" pkts %"PRIu64"/%"PRIu64"",
12741edb306SCy Schubert 			(unsigned long long)nat->nat_bytes[0],
12841edb306SCy Schubert 			(unsigned long long)nat->nat_bytes[1],
12941edb306SCy Schubert 			(unsigned long long)nat->nat_pkts[0],
13041edb306SCy Schubert 			(unsigned long long)nat->nat_pkts[1]);
13141edb306SCy Schubert #else
13241edb306SCy Schubert 		PRINTF("bytes %lu/%lu pkts %lu/%lu", nat->nat_bytes[0],
13341edb306SCy Schubert 			nat->nat_bytes[1], nat->nat_pkts[0], nat->nat_pkts[1]);
13441edb306SCy Schubert #endif
13541edb306SCy Schubert 		PRINTF(" ipsumd %x", nat->nat_ipsumd);
13641edb306SCy Schubert 	}
13741edb306SCy Schubert 
13841edb306SCy Schubert 	if (opts & OPT_DEBUG) {
13941edb306SCy Schubert 		PRINTF("\n\tnat_next %p _pnext %p _hm %p\n",
14041edb306SCy Schubert 			nat->nat_next, nat->nat_pnext, nat->nat_hm);
14141edb306SCy Schubert 		PRINTF("\t_hnext %p/%p _phnext %p/%p\n",
14241edb306SCy Schubert 			nat->nat_hnext[0], nat->nat_hnext[1],
14341edb306SCy Schubert 			nat->nat_phnext[0], nat->nat_phnext[1]);
14441edb306SCy Schubert 		PRINTF("\t_data %p _me %p _state %p _aps %p\n",
14541edb306SCy Schubert 			nat->nat_data, nat->nat_me, nat->nat_state,
14641edb306SCy Schubert 			nat->nat_aps);
14741edb306SCy Schubert 		PRINTF("\tfr %p ptr %p ifps %p/%p sync %p\n",
14841edb306SCy Schubert 			nat->nat_fr, nat->nat_ptr, nat->nat_ifps[0],
14941edb306SCy Schubert 			nat->nat_ifps[1], nat->nat_sync);
15041edb306SCy Schubert 		PRINTF("\ttqe:pnext %p next %p ifq %p parent %p/%p\n",
15141edb306SCy Schubert 			nat->nat_tqe.tqe_pnext, nat->nat_tqe.tqe_next,
15241edb306SCy Schubert 			nat->nat_tqe.tqe_ifq, nat->nat_tqe.tqe_parent, nat);
15341edb306SCy Schubert 		PRINTF("\ttqe:die %d touched %d flags %x state %d/%d\n",
15441edb306SCy Schubert 			nat->nat_tqe.tqe_die, nat->nat_tqe.tqe_touched,
15541edb306SCy Schubert 			nat->nat_tqe.tqe_flags, nat->nat_tqe.tqe_state[0],
15641edb306SCy Schubert 			nat->nat_tqe.tqe_state[1]);
15741edb306SCy Schubert 	}
15841edb306SCy Schubert 	putchar('\n');
15941edb306SCy Schubert }
160