#ifndef _IP_DIVERT_H_
#define _IP_DIVERT_H_
struct divstat {
u_long divs_ipackets;
u_long divs_noport;
u_long divs_fullsock;
u_long divs_opackets;
u_long divs_errors;
};
#define DIVERTCTL_RECVSPACE 1
#define DIVERTCTL_SENDSPACE 2
#define DIVERTCTL_STATS 3
#define DIVERTCTL_MAXID 4
#define DIVERTCTL_NAMES { \
{ 0, 0 }, \
{ "recvspace", CTLTYPE_INT }, \
{ "sendspace", CTLTYPE_INT }, \
{ "stats", CTLTYPE_STRUCT } \
}
#ifdef _KERNEL
#include <sys/percpu.h>
#define DIVERT_SENDSPACE (65536 + 100)
#define DIVERT_RECVSPACE (65536 + 100)
#define DIVERT_HASHSIZE 128
enum divstat_counters {
divs_ipackets,
divs_noport,
divs_fullsock,
divs_opackets,
divs_errors,
divs_ncounters,
};
extern struct cpumem *divcounters;
static inline void
divstat_inc(enum divstat_counters c)
{
counters_inc(divcounters, c);
}
extern u_int divert_sendspace;
extern u_int divert_recvspace;
extern struct inpcbtable divbtable, divb6table;
extern const struct pr_usrreqs divert_usrreqs, divert6_usrreqs;
void divert_init(void);
void divert_packet(struct mbuf *, int, u_int16_t);
int divert_sysctl(int *, u_int, void *, size_t *, void *, size_t);
int divert_sysctl_divstat(void *, size_t *, void *);
int divert_attach(struct socket *, int, int);
int divert_detach(struct socket *);
int divert_bind(struct socket *, struct mbuf *, struct proc *);
int divert_shutdown(struct socket *);
int divert_send(struct socket *, struct mbuf *, struct mbuf *,
struct mbuf *);
void divert6_init(void);
void divert6_packet(struct mbuf *, int, u_int16_t);
int divert6_attach(struct socket *, int, int);
int divert6_send(struct socket *, struct mbuf *, struct mbuf *,
struct mbuf *);
#endif
#endif