1 /* $OpenBSD: ip_divert.h,v 1.26 2024/07/12 19:50:35 bluhm 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
22 struct 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
49 enum divstat_counters {
50 divs_ipackets,
51 divs_noport,
52 divs_fullsock,
53 divs_opackets,
54 divs_errors,
55 divs_ncounters,
56 };
57
58 extern struct cpumem *divcounters;
59
60 static inline void
divstat_inc(enum divstat_counters c)61 divstat_inc(enum divstat_counters c)
62 {
63 counters_inc(divcounters, c);
64 }
65
66 extern struct inpcbtable divbtable;
67
68 extern const struct pr_usrreqs divert_usrreqs;
69
70 void divert_init(void);
71 void divert_packet(struct mbuf *, int, u_int16_t);
72 int divert_sysctl(int *, u_int, void *, size_t *, void *, size_t);
73 int divert_attach(struct socket *, int, int);
74 int divert_detach(struct socket *);
75 int divert_bind(struct socket *, struct mbuf *, struct proc *);
76 int divert_shutdown(struct socket *);
77 int divert_send(struct socket *, struct mbuf *, struct mbuf *,
78 struct mbuf *);
79 #endif /* _KERNEL */
80 #endif /* _IP_DIVERT_H_ */
81