1/* $OpenBSD: ip_divert.h,v 1.30 2025/06/23 12:05:46 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
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
49#define DIVERT_SENDSPACE (65536 + 100)
50#define DIVERT_RECVSPACE (65536 + 100)
51#define DIVERT_HASHSIZE 128
52
53enum divstat_counters {
54 divs_ipackets,
55 divs_noport,
56 divs_fullsock,
57 divs_opackets,
58 divs_errors,
59 divs_ncounters,
60};
61
62extern struct cpumem *divcounters;
63
64static inline void
65divstat_inc(enum divstat_counters c)
66{
67 counters_inc(divcounters, c);
68}
69
70extern u_int divert_sendspace;
71extern u_int divert_recvspace;
72extern struct inpcbtable divbtable, divb6table;
73extern const struct pr_usrreqs divert_usrreqs, divert6_usrreqs;
74
75void divert_init(void);
76void divert_packet(struct mbuf *, int, u_int16_t);
77int divert_sysctl(int *, u_int, void *, size_t *, void *, size_t);
78int divert_sysctl_divstat(void *, size_t *, void *);
79int divert_attach(struct socket *, int, int);
80int divert_detach(struct socket *);
81int divert_bind(struct socket *, struct mbuf *, struct proc *);
82int divert_shutdown(struct socket *);
83int divert_send(struct socket *, struct mbuf *, struct mbuf *,
84 struct mbuf *);
85
86void divert6_init(void);
87void divert6_packet(struct mbuf *, int, u_int16_t);
88int divert6_attach(struct socket *, int, int);
89int divert6_send(struct socket *, struct mbuf *, struct mbuf *,
90 struct mbuf *);
91
92#endif /* _KERNEL */
93#endif /* _IP_DIVERT_H_ */