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