| 1 | /*- |
| 2 | * SPDX-License-Identifier: BSD-3-Clause |
| 3 | * |
| 4 | * Copyright (c) 1982, 1986, 1989, 1993 |
| 5 | *	The Regents of the University of California. |
| 6 | * All rights reserved. |
| 7 | * |
| 8 | * Redistribution and use in source and binary forms, with or without |
| 9 | * modification, are permitted provided that the following conditions |
| 10 | * are met: |
| 11 | * 1. Redistributions of source code must retain the above copyright |
| 12 | * notice, this list of conditions and the following disclaimer. |
| 13 | * 2. Redistributions in binary form must reproduce the above copyright |
| 14 | * notice, this list of conditions and the following disclaimer in the |
| 15 | * documentation and/or other materials provided with the distribution. |
| 16 | * 3. Neither the name of the University nor the names of its contributors |
| 17 | * may be used to endorse or promote products derived from this software |
| 18 | * without specific prior written permission. |
| 19 | * |
| 20 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
| 21 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 22 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 23 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
| 24 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 25 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| 26 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 27 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| 28 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 29 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 30 | * SUCH DAMAGE. |
| 31 | */ |
| 32 | |
| 33 | #ifndef _NETINET_UDP_VAR_H_ |
| 34 | #define	_NETINET_UDP_VAR_H_ |
| 35 | |
| 36 | #include <sys/types.h> |
| 37 | #include <netinet/ip_var.h> |
| 38 | #include <netinet/udp.h> |
| 39 | |
| 40 | /* |
| 41 | * UDP kernel structures and variables. |
| 42 | */ |
| 43 | struct udpiphdr { |
| 44 | 	struct ipovly	ui_i;		/* overlaid ip structure */ |
| 45 | 	struct udphdr	ui_u;		/* udp header */ |
| 46 | }; |
| 47 | #define	ui_x1		ui_i.ih_x1 |
| 48 | #define	ui_v		ui_i.ih_x1[0] |
| 49 | #define	ui_pr		ui_i.ih_pr |
| 50 | #define	ui_len		ui_i.ih_len |
| 51 | #define	ui_src		ui_i.ih_src |
| 52 | #define	ui_dst		ui_i.ih_dst |
| 53 | #define	ui_sport	ui_u.uh_sport |
| 54 | #define	ui_dport	ui_u.uh_dport |
| 55 | #define	ui_ulen		ui_u.uh_ulen |
| 56 | #define	ui_sum		ui_u.uh_sum |
| 57 | |
| 58 | /* |
| 59 | * Identifiers for UDP sysctl nodes. |
| 60 | */ |
| 61 | #define	UDPCTL_CHECKSUM		1	/* checksum UDP packets */ |
| 62 | #define	UDPCTL_STATS		2	/* statistics (read-only) */ |
| 63 | #define	UDPCTL_MAXDGRAM		3	/* max datagram size */ |
| 64 | #define	UDPCTL_RECVSPACE	4	/* default receive buffer space */ |
| 65 | #define	UDPCTL_PCBLIST		5	/* list of PCBs for UDP sockets */ |
| 66 | |
| 67 | 				/* IPsec: ESP in UDP tunneling: */ |
| 68 | #define	UF_ESPINUDP_NON_IKE	0x00000001	/* w/ non-IKE marker .. */ |
| 69 | 	/* .. per draft-ietf-ipsec-nat-t-ike-0[01], |
| 70 | 	 * and draft-ietf-ipsec-udp-encaps-(00/)01.txt */ |
| 71 | #define	UF_ESPINUDP		0x00000002	/* w/ non-ESP marker. */ |
| 72 | |
| 73 | struct udpstat { |
| 74 | 				/* input statistics: */ |
| 75 | 	uint64_t udps_ipackets;		/* total input packets */ |
| 76 | 	uint64_t udps_hdrops;		/* packet shorter than header */ |
| 77 | 	uint64_t udps_badsum;		/* checksum error */ |
| 78 | 	uint64_t udps_nosum;		/* no checksum */ |
| 79 | 	uint64_t udps_badlen;		/* data length larger than packet */ |
| 80 | 	uint64_t udps_noport;		/* no socket on port */ |
| 81 | 	uint64_t udps_noportbcast;	/* of above, arrived as broadcast */ |
| 82 | 	uint64_t udps_fullsock;		/* not delivered, input socket full */ |
| 83 | 	uint64_t udpps_pcbcachemiss;	/* input packets missing pcb cache */ |
| 84 | 	uint64_t udpps_pcbhashmiss;	/* input packets not for hashed pcb */ |
| 85 | 				/* output statistics: */ |
| 86 | 	uint64_t udps_opackets;		/* total output packets */ |
| 87 | 	uint64_t udps_fastout;		/* output packets on fast path */ |
| 88 | 	/* of no socket on port, arrived as multicast */ |
| 89 | 	uint64_t udps_noportmcast; |
| 90 | 	uint64_t udps_filtermcast;	/* blocked by multicast filter */ |
| 91 | }; |
| 92 | |
| 93 | #ifdef _KERNEL |
| 94 | #include <netinet/in_pcb.h> |
| 95 | #include <sys/counter.h> |
| 96 | #include <netinet/in_kdtrace.h> |
| 97 | struct mbuf; |
| 98 | |
| 99 | typedef bool	udp_tun_func_t(struct mbuf *, int, struct inpcb *, |
| 100 | 		 const struct sockaddr *, void *); |
| 101 | typedef union { |
| 102 | 	struct icmp *icmp; |
| 103 | 	struct ip6ctlparam *ip6cp; |
| 104 | } udp_tun_icmp_param_t __attribute__((__transparent_union__)); |
| 105 | typedef void	udp_tun_icmp_t(udp_tun_icmp_param_t); |
| 106 | |
| 107 | /* |
| 108 | * UDP control block; one per udp. |
| 109 | */ |
| 110 | struct udpcb { |
| 111 | 	struct inpcb	u_inpcb; |
| 112 | #define	u_start_zero	u_tun_func |
| 113 | #define	u_zero_size	(sizeof(struct udpcb) - \ |
| 114 | 			 offsetof(struct udpcb, u_start_zero)) |
| 115 | 	udp_tun_func_t	*u_tun_func;	/* UDP kernel tunneling callback. */ |
| 116 | 	udp_tun_icmp_t *u_icmp_func;	/* UDP kernel tunneling icmp callback */ |
| 117 | 	u_int		u_flags;	/* Generic UDP flags. */ |
| 118 | 	uint16_t	u_rxcslen;	/* Coverage for incoming datagrams. */ |
| 119 | 	uint16_t	u_txcslen;	/* Coverage for outgoing datagrams. */ |
| 120 | 	void 		*u_tun_ctx;	/* Tunneling callback context. */ |
| 121 | }; |
| 122 | |
| 123 | #define	intoudpcb(ip)	__containerof((ip), struct udpcb, u_inpcb) |
| 124 | #define	sotoudpcb(so)	(intoudpcb(sotoinpcb(so))) |
| 125 | |
| 126 | VNET_PCPUSTAT_DECLARE(struct udpstat, udpstat); |
| 127 | /* |
| 128 | * In-kernel consumers can use these accessor macros directly to update |
| 129 | * stats. |
| 130 | */ |
| 131 | #define UDPSTAT_ADD(name, val) \ |
| 132 | 	do { \ |
| 133 | 		MIB_SDT_PROBE1(udp, count, name, (val)); \ |
| 134 | 		VNET_PCPUSTAT_ADD(struct udpstat, udpstat, name, (val)); \ |
| 135 | 	} while (0) |
| 136 | #define UDPSTAT_INC(name) UDPSTAT_ADD(name, 1) |
| 137 | |
| 138 | /* |
| 139 | * Kernel module consumers must use this accessor macro. |
| 140 | */ |
| 141 | void	kmod_udpstat_inc(int statnum); |
| 142 | #define KMOD_UDPSTAT_INC(name) \ |
| 143 | 	do { \ |
| 144 | 		MIB_SDT_PROBE1(udp, count, name, 1); \ |
| 145 | 		kmod_udpstat_inc( \ |
| 146 | 		 offsetof(struct udpstat, name) / sizeof(uint64_t)); \ |
| 147 | 	} while (0) |
| 148 | |
| 149 | SYSCTL_DECL(_net_inet_udp); |
| 150 | SYSCTL_DECL(_net_inet_udplite); |
| 151 | |
| 152 | VNET_DECLARE(struct inpcbinfo, udbinfo); |
| 153 | VNET_DECLARE(struct inpcbinfo, ulitecbinfo); |
| 154 | #define	V_udbinfo		VNET(udbinfo) |
| 155 | #define	V_ulitecbinfo		VNET(ulitecbinfo) |
| 156 | |
| 157 | extern u_long			udp_sendspace; |
| 158 | extern u_long			udp_recvspace; |
| 159 | VNET_DECLARE(int, udp_bind_all_fibs); |
| 160 | VNET_DECLARE(int, udp_blackhole); |
| 161 | VNET_DECLARE(bool, udp_blackhole_local); |
| 162 | VNET_DECLARE(int, udp_cksum); |
| 163 | VNET_DECLARE(int, udp_log_in_vain); |
| 164 | #define	V_udp_bind_all_fibs	VNET(udp_bind_all_fibs) |
| 165 | #define	V_udp_blackhole		VNET(udp_blackhole) |
| 166 | #define	V_udp_blackhole_local	VNET(udp_blackhole_local) |
| 167 | #define	V_udp_cksum		VNET(udp_cksum) |
| 168 | #define	V_udp_log_in_vain	VNET(udp_log_in_vain) |
| 169 | |
| 170 | VNET_DECLARE(int, zero_checksum_port); |
| 171 | #define	V_zero_checksum_port	VNET(zero_checksum_port) |
| 172 | |
| 173 | static __inline struct inpcbinfo * |
| 174 | udp_get_inpcbinfo(int protocol) |
| 175 | { |
| 176 | 	return (protocol == IPPROTO_UDP) ? &V_udbinfo : &V_ulitecbinfo; |
| 177 | } |
| 178 | |
| 179 | int		udp_ctloutput(struct socket *, struct sockopt *); |
| 180 | void		udplite_input(struct mbuf *, int); |
| 181 | struct inpcb	*udp_notify(struct inpcb *inp, int errno); |
| 182 | int		udp_shutdown(struct socket *, enum shutdown_how); |
| 183 | |
| 184 | int		udp_set_kernel_tunneling(struct socket *so, udp_tun_func_t f, |
| 185 | 		 udp_tun_icmp_t i, void *ctx); |
| 186 | |
| 187 | #ifdef _SYS_PROTOSW_H_ |
| 188 | pr_abort_t	udp_abort; |
| 189 | pr_disconnect_t	udp_disconnect; |
| 190 | pr_send_t	udp_send; |
| 191 | #endif |
| 192 | |
| 193 | #endif /* _KERNEL */ |
| 194 | |
| 195 | #endif /* _NETINET_UDP_VAR_H_ */ |