1/*      $OpenBSD: ip_divert.h,v 1.25 2024/02/03 22:50:09 mvs Exp $ */
2
3/*
4 * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#ifndef _IP_DIVERT_H_
20#define _IP_DIVERT_H_
21
22struct divstat {
23	u_long	divs_ipackets;	/* total input packets */
24	u_long	divs_noport;	/* no socket on port */
25	u_long	divs_fullsock;	/* not delivered, input socket full */
26	u_long	divs_opackets;	/* total output packets */
27	u_long	divs_errors;	/* generic errors */
28};
29
30/*
31 * Names for divert sysctl objects
32 */
33#define	DIVERTCTL_RECVSPACE	1	/* receive buffer space */
34#define	DIVERTCTL_SENDSPACE	2	/* send buffer space */
35#define	DIVERTCTL_STATS		3	/* divert statistics */
36#define	DIVERTCTL_MAXID		4
37
38#define	DIVERTCTL_NAMES { \
39	{ 0, 0 }, \
40	{ "recvspace",	CTLTYPE_INT }, \
41	{ "sendspace",	CTLTYPE_INT }, \
42	{ "stats",	CTLTYPE_STRUCT } \
43}
44
45#ifdef _KERNEL
46
47#include <sys/percpu.h>
48
49enum divstat_counters {
50	divs_ipackets,
51	divs_noport,
52	divs_fullsock,
53	divs_opackets,
54	divs_errors,
55	divs_ncounters,
56};
57
58extern struct cpumem *divcounters;
59
60static inline void
61divstat_inc(enum divstat_counters c)
62{
63	counters_inc(divcounters, c);
64}
65
66extern struct	inpcbtable	divbtable;
67
68extern const struct pr_usrreqs divert_usrreqs;
69
70void	 divert_init(void);
71void	 divert_packet(struct mbuf *, int, u_int16_t);
72int	 divert_sysctl(int *, u_int, void *, size_t *, void *, size_t);
73int	 divert_attach(struct socket *, int, int);
74int	 divert_detach(struct socket *);
75void	 divert_lock(struct socket *);
76void	 divert_unlock(struct socket *);
77int	 divert_locked(struct socket *);
78int	 divert_bind(struct socket *, struct mbuf *, struct proc *);
79int	 divert_shutdown(struct socket *);
80int	 divert_send(struct socket *, struct mbuf *, struct mbuf *,
81	     struct mbuf *);
82#endif /* _KERNEL */
83#endif /* _IP_DIVERT_H_ */
84