#ifndef _NET_NETMSG_H_
#define _NET_NETMSG_H_
#ifndef _SYS_THREAD_H_
#include <sys/thread.h>
#endif
#ifndef _SYS_PROTOSW_H_
#include <sys/protosw.h>
#endif
struct pktinfo;
typedef void (*netisr_fn_t)(netmsg_t);
typedef void (*netisr_ru_t)(void);
typedef void (*netisr_hashfn_t)(struct mbuf **, int);
typedef void (*netisr_hashck_t)(struct mbuf *, const struct pktinfo *);
#if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
#ifndef _KERNEL
#include <stdbool.h>
#endif
struct netmsg_base {
struct lwkt_msg lmsg;
netisr_fn_t nm_dispatch;
struct socket *nm_so;
};
#define MSGF_IGNSOPORT MSGF_USER0
#define MSGF_PROTO1 MSGF_USER1
typedef struct netmsg_base *netmsg_base_t;
TAILQ_HEAD(notifymsglist, netmsg_so_notify);
struct netmsg_packet {
struct netmsg_base base;
struct mbuf *nm_packet;
int nm_nxt;
};
struct netmsg_inarp {
struct netmsg_base base;
struct mbuf *m;
in_addr_t saddr;
in_addr_t taddr;
in_addr_t myaddr;
};
struct netmsg_ctlinput {
struct netmsg_base base;
struct mbuf *m;
int cmd;
int hlen;
int proto;
};
struct netmsg_genpkt {
struct netmsg_base base;
struct mbuf *m;
void *arg1;
u_long arg2;
};
struct netmsg_forward {
struct netmsg_base base;
struct mbuf *nm_packet;
bool using_srcrt;
};
struct netmsg_pr_timeout {
struct netmsg_base base;
};
struct netmsg_so_notify;
typedef bool (*msg_predicate_fn_t)(struct netmsg_so_notify *);
struct netmsg_so_notify {
struct netmsg_base base;
msg_predicate_fn_t nm_predicate;
int nm_fflags;
int nm_etype;
TAILQ_ENTRY(netmsg_so_notify) nm_list;
};
struct netmsg_so_notify_abort {
struct netmsg_base base;
struct netmsg_so_notify *nm_notifymsg;
};
#define NM_REVENT 0x1
#define NM_SEVENT 0x2
struct netmsg_pru_abort {
struct netmsg_base base;
};
struct netmsg_pru_accept {
struct netmsg_base base;
struct sockaddr **nm_nam;
};
struct netmsg_pru_attach {
struct netmsg_base base;
int nm_proto;
struct pru_attach_info *nm_ai;
};
struct netmsg_pru_bind {
struct netmsg_base base;
struct sockaddr *nm_nam;
struct thread *nm_td;
int nm_flags;
};
#define PRUB_RELINK 0x0001
struct netmsg_pru_connect {
struct netmsg_base base;
struct sockaddr *nm_nam;
struct thread *nm_td;
struct mbuf *nm_m;
int nm_sndflags;
int nm_flags;
};
#define PRUC_RECONNECT 0x0001
#define PRUC_PUSH 0x0004
#define PRUC_ASYNC 0x0010
#define PRUC_HELDTD 0x0020
#define PRUC_HASLADDR 0x0040
struct netmsg_pru_connect2 {
struct netmsg_base base;
struct socket *nm_so1;
struct socket *nm_so2;
struct ucred *nm_cred;
};
struct netmsg_pru_control {
struct netmsg_base base;
u_long nm_cmd;
caddr_t nm_data;
struct ifnet *nm_ifp;
struct thread *nm_td;
};
struct netmsg_pru_detach {
struct netmsg_base base;
};
struct netmsg_pru_disconnect {
struct netmsg_base base;
};
struct netmsg_pru_listen {
struct netmsg_base base;
struct thread *nm_td;
int nm_flags;
};
#define PRUL_RELINK 0x1
struct netmsg_pru_peeraddr {
struct netmsg_base base;
struct sockaddr **nm_nam;
};
struct netmsg_pru_rcvd {
struct netmsg_base base;
int nm_flags;
int nm_pru_flags;
};
#define PRUR_ASYNC 0x1
#define PRUR_DEAD 0x2
struct netmsg_pru_rcvoob {
struct netmsg_base base;
struct mbuf *nm_m;
int nm_flags;
};
struct netmsg_pru_send {
struct netmsg_base base;
int nm_flags;
int nm_priv;
struct mbuf *nm_m;
struct sockaddr *nm_addr;
struct mbuf *nm_control;
struct thread *nm_td;
};
#define PRUS_OOB 0x1
#define PRUS_EOF 0x2
#define PRUS_MORETOCOME 0x4
#define PRUS_NAMALLOC 0x8
#define PRUS_NOREPLY 0x10
#define PRUS_DONTROUTE 0x20
#define PRUS_FREEADDR 0x40
#define PRUS_HELDTD 0x80
struct netmsg_pru_sense {
struct netmsg_base base;
struct stat *nm_stat;
};
struct netmsg_pru_shutdown {
struct netmsg_base base;
};
struct netmsg_pru_sockaddr {
struct netmsg_base base;
struct sockaddr **nm_nam;
};
struct netmsg_pru_sosend {
struct netmsg_base base;
struct sockaddr *nm_addr;
struct uio *nm_uio;
struct mbuf *nm_top;
struct mbuf *nm_control;
int nm_flags;
struct thread *nm_td;
};
struct netmsg_pru_soreceive {
struct netmsg_base base;
struct sockaddr *nm_addr;
struct sockaddr **nm_paddr;
struct uio *nm_uio;
struct sockbuf *nm_sio;
struct mbuf **nm_controlp;
int *nm_flagsp;
};
struct netmsg_pr_ctloutput {
struct netmsg_base base;
int nm_flags;
struct sockopt *nm_sopt;
};
#define PRCO_HELDTD 0x1
struct netmsg_pr_ctlinput {
struct netmsg_base base;
int nm_cmd;
int nm_direct;
struct sockaddr *nm_arg;
void *nm_extra;
};
union netmsg {
struct lwkt_msg lmsg;
struct netmsg_base base;
struct netmsg_packet packet;
struct netmsg_forward forward;
struct netmsg_pr_timeout timeout;
struct netmsg_so_notify notify;
struct netmsg_so_notify_abort notify_abort;
struct netmsg_pr_ctloutput ctloutput;
struct netmsg_pr_ctlinput ctlinput;
struct netmsg_pru_abort abort;
struct netmsg_pru_accept accept;
struct netmsg_pru_attach attach;
struct netmsg_pru_bind bind;
struct netmsg_pru_connect connect;
struct netmsg_pru_connect2 connect2;
struct netmsg_pru_control control;
struct netmsg_pru_detach detach;
struct netmsg_pru_disconnect disconnect;
struct netmsg_pru_listen listen;
struct netmsg_pru_peeraddr peeraddr;
struct netmsg_pru_rcvd rcvd;
struct netmsg_pru_rcvoob rcvoob;
struct netmsg_pru_send send;
struct netmsg_pru_sense sense;
struct netmsg_pru_shutdown shutdown;
struct netmsg_pru_sockaddr sockaddr;
struct netmsg_pru_sosend sosend;
struct netmsg_pru_soreceive soreceive;
};
#endif
#endif