#ifndef _NETINET_UDP_VAR_H_
#define _NETINET_UDP_VAR_H_
#include <sys/types.h>
#include <netinet/ip_var.h>
#include <netinet/udp.h>
struct udpiphdr {
struct ipovly ui_i;
struct udphdr ui_u;
};
#define ui_x1 ui_i.ih_x1
#define ui_v ui_i.ih_x1[0]
#define ui_pr ui_i.ih_pr
#define ui_len ui_i.ih_len
#define ui_src ui_i.ih_src
#define ui_dst ui_i.ih_dst
#define ui_sport ui_u.uh_sport
#define ui_dport ui_u.uh_dport
#define ui_ulen ui_u.uh_ulen
#define ui_sum ui_u.uh_sum
#define UDPCTL_CHECKSUM 1
#define UDPCTL_STATS 2
#define UDPCTL_MAXDGRAM 3
#define UDPCTL_RECVSPACE 4
#define UDPCTL_PCBLIST 5
#define UF_ESPINUDP_NON_IKE 0x00000001
#define UF_ESPINUDP 0x00000002
struct udpstat {
uint64_t udps_ipackets;
uint64_t udps_hdrops;
uint64_t udps_badsum;
uint64_t udps_nosum;
uint64_t udps_badlen;
uint64_t udps_noport;
uint64_t udps_noportbcast;
uint64_t udps_fullsock;
uint64_t udpps_pcbcachemiss;
uint64_t udpps_pcbhashmiss;
uint64_t udps_opackets;
uint64_t udps_fastout;
uint64_t udps_noportmcast;
uint64_t udps_filtermcast;
};
#ifdef _KERNEL
#include <netinet/in_pcb.h>
#include <sys/counter.h>
#include <netinet/in_kdtrace.h>
struct mbuf;
typedef bool udp_tun_func_t(struct mbuf *, int, struct inpcb *,
const struct sockaddr *, void *);
typedef union {
struct icmp *icmp;
struct ip6ctlparam *ip6cp;
} udp_tun_icmp_param_t __attribute__((__transparent_union__));
typedef void udp_tun_icmp_t(udp_tun_icmp_param_t);
struct udpcb {
struct inpcb u_inpcb;
#define u_start_zero u_tun_func
#define u_zero_size (sizeof(struct udpcb) - \
offsetof(struct udpcb, u_start_zero))
udp_tun_func_t *u_tun_func;
udp_tun_icmp_t *u_icmp_func;
u_int u_flags;
uint16_t u_rxcslen;
uint16_t u_txcslen;
void *u_tun_ctx;
};
#define intoudpcb(ip) __containerof((ip), struct udpcb, u_inpcb)
#define sotoudpcb(so) (intoudpcb(sotoinpcb(so)))
VNET_PCPUSTAT_DECLARE(struct udpstat, udpstat);
#define UDPSTAT_ADD(name, val) \
do { \
MIB_SDT_PROBE1(udp, count, name, (val)); \
VNET_PCPUSTAT_ADD(struct udpstat, udpstat, name, (val)); \
} while (0)
#define UDPSTAT_INC(name) UDPSTAT_ADD(name, 1)
void kmod_udpstat_inc(int statnum);
#define KMOD_UDPSTAT_INC(name) \
do { \
MIB_SDT_PROBE1(udp, count, name, 1); \
kmod_udpstat_inc( \
offsetof(struct udpstat, name) / sizeof(uint64_t)); \
} while (0)
SYSCTL_DECL(_net_inet_udp);
SYSCTL_DECL(_net_inet_udplite);
VNET_DECLARE(struct inpcbinfo, udbinfo);
VNET_DECLARE(struct inpcbinfo, ulitecbinfo);
#define V_udbinfo VNET(udbinfo)
#define V_ulitecbinfo VNET(ulitecbinfo)
extern u_long udp_sendspace;
extern u_long udp_recvspace;
VNET_DECLARE(int, udp_bind_all_fibs);
VNET_DECLARE(int, udp_blackhole);
VNET_DECLARE(bool, udp_blackhole_local);
VNET_DECLARE(int, udp_cksum);
VNET_DECLARE(int, udp_log_in_vain);
#define V_udp_bind_all_fibs VNET(udp_bind_all_fibs)
#define V_udp_blackhole VNET(udp_blackhole)
#define V_udp_blackhole_local VNET(udp_blackhole_local)
#define V_udp_cksum VNET(udp_cksum)
#define V_udp_log_in_vain VNET(udp_log_in_vain)
VNET_DECLARE(int, zero_checksum_port);
#define V_zero_checksum_port VNET(zero_checksum_port)
static __inline struct inpcbinfo *
udp_get_inpcbinfo(int protocol)
{
return (protocol == IPPROTO_UDP) ? &V_udbinfo : &V_ulitecbinfo;
}
int udp_ctloutput(struct socket *, struct sockopt *);
void udplite_input(struct mbuf *, int);
struct inpcb *udp_notify(struct inpcb *inp, int errno);
int udp_shutdown(struct socket *, enum shutdown_how);
int udp_set_kernel_tunneling(struct socket *so, udp_tun_func_t f,
udp_tun_icmp_t i, void *ctx);
#ifdef _SYS_PROTOSW_H_
pr_abort_t udp_abort;
pr_disconnect_t udp_disconnect;
pr_send_t udp_send;
#endif
#endif
#endif