38#include <sys/bitstring.h>
39#include <sys/domain.h>
40#include <sys/endian.h>
42#include <sys/filedesc.h>
43#include <sys/ioccom.h>
44#include <sys/kernel.h>
46#include <sys/malloc.h>
50#include <sys/protosw.h>
52#include <sys/socket.h>
53#include <sys/socketvar.h>
54#include <sys/sysctl.h>
55#include <sys/taskqueue.h>
68#ifdef NG_SEPARATE_MALLOC
70 "Netgraph Bluetooth raw HCI sockets");
72#define M_NETGRAPH_BTSOCKET_HCI_RAW M_NETGRAPH
92#define ng_btsocket_hci_raw_wakeup_input_task() \
93 taskqueue_enqueue(taskqueue_swi, &ng_btsocket_hci_raw_task)
122static struct mtx ng_btsocket_hci_raw_sockets_mtx;
123static u_int32_t ng_btsocket_hci_raw_token;
124static struct mtx ng_btsocket_hci_raw_token_mtx;
126static struct timeval ng_btsocket_hci_raw_lasttime;
127static int ng_btsocket_hci_raw_curpps;
130SYSCTL_DECL(_net_bluetooth_hci_sockets);
131static SYSCTL_NODE(_net_bluetooth_hci_sockets, OID_AUTO, raw,
132 CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
133 "Bluetooth raw HCI sockets family");
134SYSCTL_UINT(_net_bluetooth_hci_sockets_raw, OID_AUTO, debug_level, CTLFLAG_RW,
136 "Bluetooth raw HCI sockets debug level");
137SYSCTL_UINT(_net_bluetooth_hci_sockets_raw, OID_AUTO, ioctl_timeout, CTLFLAG_RW,
139 "Bluetooth raw HCI sockets ioctl timeout");
140SYSCTL_UINT(_net_bluetooth_hci_sockets_raw, OID_AUTO, queue_len, CTLFLAG_RD,
142 "Bluetooth raw HCI sockets input queue length");
143SYSCTL_UINT(_net_bluetooth_hci_sockets_raw, OID_AUTO, queue_maxlen, CTLFLAG_RD,
145 "Bluetooth raw HCI sockets input queue max. length");
146SYSCTL_UINT(_net_bluetooth_hci_sockets_raw, OID_AUTO, queue_drops, CTLFLAG_RD,
148 "Bluetooth raw HCI sockets input queue drops");
151#define NG_BTSOCKET_HCI_RAW_INFO \
152 if (ng_btsocket_hci_raw_debug_level >= NG_BTSOCKET_INFO_LEVEL && \
153 ppsratecheck(&ng_btsocket_hci_raw_lasttime, &ng_btsocket_hci_raw_curpps, 1)) \
156#define NG_BTSOCKET_HCI_RAW_WARN \
157 if (ng_btsocket_hci_raw_debug_level >= NG_BTSOCKET_WARN_LEVEL && \
158 ppsratecheck(&ng_btsocket_hci_raw_lasttime, &ng_btsocket_hci_raw_curpps, 1)) \
161#define NG_BTSOCKET_HCI_RAW_ERR \
162 if (ng_btsocket_hci_raw_debug_level >= NG_BTSOCKET_ERR_LEVEL && \
163 ppsratecheck(&ng_btsocket_hci_raw_lasttime, &ng_btsocket_hci_raw_curpps, 1)) \
166#define NG_BTSOCKET_HCI_RAW_ALERT \
167 if (ng_btsocket_hci_raw_debug_level >= NG_BTSOCKET_ALERT_LEVEL && \
168 ppsratecheck(&ng_btsocket_hci_raw_lasttime, &ng_btsocket_hci_raw_curpps, 1)) \
201"%s: Could not create Netgraph node, error=%d\n", __func__, error);
212"%s: Could not name Netgraph node, error=%d\n", __func__, error);
283"%s: Input queue is full\n", __func__);
310 struct mbuf *nam = NULL;
319 MGET(nam, M_NOWAIT, MT_SONAME);
336"%s: Input queue is full\n", __func__);
348"%s: Failed to allocate address mbuf\n", __func__);
372 mtx_lock(&ng_btsocket_hci_raw_token_mtx);
374 if (++ ng_btsocket_hci_raw_token == 0)
375 ng_btsocket_hci_raw_token = 1;
377 *token = ng_btsocket_hci_raw_token;
379 mtx_unlock(&ng_btsocket_hci_raw_token_mtx);
396 if (arg != NULL && arglen > 0)
397 bcopy(arg, msg->
data, arglen);
410 int cmd,
void *rsp,
int rsplen)
415 mtx_assert(&pcb->
pcb_mtx, MA_OWNED);
431 error = msleep(&pcb->
msg, &pcb->
pcb_mtx, PZERO|PCATCH,
"hcictl",
439 bcopy(pcb->
msg->
data, rsp, rsplen);
459 mtx_assert(&pcb->
pcb_mtx, MA_OWNED);
462 dir = (m->m_flags & M_PROTO1)? 1 : 0;
463 *ctl = sbcreatecontrol((caddr_t) &dir,
sizeof(dir),
466 ctl = &((*ctl)->m_next);
469 if (pcb->
so->so_options & SO_TIMESTAMP) {
471 *ctl = sbcreatecontrol((caddr_t) &tv,
sizeof(tv),
472 SCM_TIMESTAMP, SOL_SOCKET);
474 ctl = &((*ctl)->m_next);
486 struct mbuf *m0 = NULL, *m = NULL;
492 KASSERT((nam->m_type == MT_SONAME),
493 (
"%s: m_type=%d\n", __func__, nam->m_type));
494 KASSERT((m0->m_flags & M_PKTHDR),
495 (
"%s: m_flags=%#x\n", __func__, m0->m_flags));
499 mtx_lock(&ng_btsocket_hci_raw_sockets_mtx);
501 LIST_FOREACH(pcb, &ng_btsocket_hci_raw_sockets, next) {
527 m = m_dup(m0, M_NOWAIT);
529 struct mbuf *ctl = NULL;
533 if (sbappendaddr(&pcb->
so->so_rcv,
534 (
struct sockaddr *) sa, m, ctl))
538"%s: sbappendaddr() failed\n", __func__);
542 soroverflow(pcb->
so);
549 mtx_unlock(&ng_btsocket_hci_raw_sockets_mtx);
564 mtx_lock(&ng_btsocket_hci_raw_sockets_mtx);
566 LIST_FOREACH(pcb, &ng_btsocket_hci_raw_sockets, next) {
574 mtx_unlock(&ng_btsocket_hci_raw_sockets_mtx);
582 mtx_unlock(&ng_btsocket_hci_raw_sockets_mtx);
606 struct mbuf *m = NULL;
636 struct mbuf *nam = (
struct mbuf *) arg1, *m = NULL;
643 KASSERT((nam->m_type == MT_SONAME),
644 (
"%s: m_type=%d\n", __func__, nam->m_type));
645 KASSERT((m->m_flags & M_PKTHDR),
646 (
"%s: m_flags=%#x\n", __func__, m->m_flags));
656 LIST_FOREACH(hook, &node->nd_hooks, hk_hooks) {
681 mtx_assert(&pcb->
pcb_mtx, MA_OWNED);
683 switch ((
type = *mtod(m, u_int8_t *))) {
701 !bit_test(pcb->
filter.packet_mask,
type - 1) ||
710 event = mtod(m, ng_hci_event_pkt_t *)->event - 1;
745"%s: Could not register Netgraph node type, error=%d\n", __func__, error);
754"%s: Could not create Netgraph node, error=%d\n", __func__, error);
765"%s: Could not name Netgraph node, error=%d\n", __func__, error);
776 "btsocks_hci_raw_queue_mtx", NULL, MTX_DEF);
781 LIST_INIT(&ng_btsocket_hci_raw_sockets);
782 mtx_init(&ng_btsocket_hci_raw_sockets_mtx,
783 "btsocks_hci_raw_sockets_mtx", NULL, MTX_DEF);
786 ng_btsocket_hci_raw_token = 0;
787 mtx_init(&ng_btsocket_hci_raw_token_mtx,
788 "btsocks_hci_raw_token_mtx", NULL, MTX_DEF);
798 printf(
"%s: Could not allocate security filter!\n", __func__);
919 return (EPROTONOSUPPORT);
921 return (EPROTONOSUPPORT);
922 if (so->so_type != SOCK_RAW)
923 return (ESOCKTNOSUPPORT);
930 pcb = malloc(
sizeof(*pcb),
935 so->so_pcb = (caddr_t) pcb;
938 if (priv_check(td, PRIV_NETBLUETOOTH_RAW) == 0)
949 mtx_init(&pcb->
pcb_mtx,
"btsocks_hci_raw_pcb_mtx", NULL, MTX_DEF);
951 mtx_lock(&ng_btsocket_hci_raw_sockets_mtx);
952 LIST_INSERT_HEAD(&ng_btsocket_hci_raw_sockets, pcb, next);
953 mtx_unlock(&ng_btsocket_hci_raw_sockets_mtx);
977 return (EAFNOSUPPORT);
978 if (sa->
hci_len !=
sizeof(*sa))
984 bcopy(sa, &pcb->
addr,
sizeof(pcb->
addr));
1009 return (EAFNOSUPPORT);
1010 if (sa->
hci_len !=
sizeof(*sa))
1013 return (EDESTADDRREQ);
1017 if (bcmp(sa, &pcb->
addr,
sizeof(pcb->
addr)) != 0) {
1019 return (EADDRNOTAVAIL);
1035 struct ifnet *ifp,
struct thread *td)
1052 return (EHOSTUNREACH);
1056 if (pcb->
token != 0) {
1061 snprintf(path,
sizeof(path),
"%s:", pcb->
addr.
hci_node);
1186 PZERO|PCATCH,
"hcictl",
1208 error = copyout((caddr_t) p2,
1249 PZERO|PCATCH,
"hcictl",
1272 error = copyout((caddr_t) p2,
1378 PZERO|PCATCH,
"hcictl",
1399 error = copyout((caddr_t) ni1,
1452 switch (sopt->sopt_dir) {
1454 switch (sopt->sopt_name) {
1456 error = sooptcopyout(sopt, &pcb->
filter,
1462 error = sooptcopyout(sopt, &dir,
sizeof(dir));
1472 switch (sopt->sopt_name) {
1482 error = sooptcopyin(sopt, &dir,
sizeof(dir),
1490 pcb->
flags &= ~NG_BTSOCKET_HCI_RAW_DIRECTION;
1518 KASSERT(pcb != NULL, (
"ng_btsocket_hci_raw_detach: pcb == NULL"));
1523 mtx_lock(&ng_btsocket_hci_raw_sockets_mtx);
1526 LIST_REMOVE(pcb, next);
1529 mtx_unlock(&ng_btsocket_hci_raw_sockets_mtx);
1533 bzero(pcb,
sizeof(*pcb));
1554 soisdisconnected(so);
1576 struct sockaddr *sa,
struct mbuf *
control,
struct thread *td)
1579 struct mbuf *nam = NULL;
1595 if (m->m_pkthdr.len <
sizeof(ng_hci_cmd_pkt_t) ||
1601 if (m->m_len <
sizeof(ng_hci_cmd_pkt_t)) {
1602 if ((m = m_pullup(m,
sizeof(ng_hci_cmd_pkt_t))) == NULL) {
1623 error = EDESTADDRREQ;
1627 sa = (
struct sockaddr *) &pcb->
addr;
1630 MGET(nam, M_NOWAIT, MT_SONAME);
1670 bzero(&sa,
sizeof(sa));
1678 *nam = sodupsockaddr((
struct sockaddr *) &sa, M_NOWAIT);
1680 return ((*nam == NULL)? ENOMEM : 0);
int ng_connect_t(hook_p hook)
#define NG_PEER_NODE(hook)
#define NG_HOOK_NOT_VALID(hook)
#define NG_NODE_NOT_VALID(node)
int ng_rcvmsg_t(node_p node, item_p item, hook_p lasthook)
int ng_disconnect_t(hook_p hook)
int ng_newtype(struct ng_type *tp)
#define NG_NODE_UNREF(node)
#define NG_SEND_MSG_PATH(error, here, msg, path, retaddr)
#define NG_PEER_NODE_NAME(hook)
#define NG_SEND_DATA_ONLY(error, hook, m)
int ng_rcvdata_t(hook_p hook, item_p item)
int ng_shutdown_t(node_p node)
#define NG_FREE_ITEM(item)
int ng_make_node_common(struct ng_type *typep, node_p *nodep)
int ng_name_node(node_p node, const char *name)
int ng_constructor_t(node_p node)
int ng_send_fn(node_p node, hook_p hook, ng_item_fn *fn, void *arg1, int arg2)
#define NGI_GET_MSG(i, m)
int ng_newhook_t(node_p node, hook_p hook, const char *name)
SYSCTL_NODE(_net, OID_AUTO, bluetooth, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "Bluetooth family")
SYSCTL_UINT(_net_bluetooth_hci, OID_AUTO, max_neighbor_age, CTLFLAG_RW, &bluetooth_hci_max_neighbor_age_value, 600, "Maximal HCI neighbor cache entry age (sec)")
#define NG_BT_ITEMQ_ENQUEUE(q, i)
#define NG_BT_ITEMQ_FULL(q)
#define NG_BT_ITEMQ_INIT(q, _maxlen)
#define NG_BT_ITEMQ_DEQUEUE(q, i)
#define NG_BT_ITEMQ_DROP(q)
#define SIOC_HCI_RAW_NODE_GET_BDADDR
#define SIOC_HCI_RAW_NODE_SET_PACKET_MASK
#define SO_HCI_RAW_FILTER
#define SIOC_HCI_RAW_NODE_RESET_STAT
#define SIOC_HCI_RAW_NODE_GET_PACKET_MASK
#define SIOC_HCI_RAW_NODE_INIT
#define NG_BTSOCKET_HCI_RAW_NODE_TYPE
#define BLUETOOTH_PROTO_HCI
#define SIOC_HCI_RAW_NODE_SET_LINK_POLICY_MASK
#define SCM_HCI_RAW_DIRECTION
#define SIOC_HCI_RAW_NODE_GET_NEIGHBOR_CACHE
#define SIOC_HCI_RAW_NODE_GET_STAT
#define SIOC_HCI_RAW_NODE_SET_ROLE_SWITCH
#define SIOC_HCI_RAW_NODE_GET_CON_LIST
#define SIOC_HCI_RAW_NODE_GET_ROLE_SWITCH
#define SIOC_HCI_RAW_NODE_GET_DEBUG
#define SIOC_HCI_RAW_NODE_SET_DEBUG
#define SIOC_HCI_RAW_NODE_GET_BUFFER
#define NG_BTSOCKET_WARN_LEVEL
#define SO_HCI_RAW_DIRECTION
#define SIOC_HCI_RAW_NODE_FLUSH_NEIGHBOR_CACHE
#define SIOC_HCI_RAW_NODE_LIST_NAMES
#define SIOC_HCI_RAW_NODE_GET_FEATURES
#define SIOC_HCI_RAW_NODE_GET_LINK_POLICY_MASK
#define SIOC_HCI_RAW_NODE_GET_STATE
static LIST_HEAD(ng_btsocket_hci_raw_pcb)
int ng_btsocket_hci_raw_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
static void ng_btsocket_hci_raw_savctl(ng_btsocket_hci_raw_pcb_p, struct mbuf **, struct mbuf *)
static ng_rcvdata_t ng_btsocket_hci_raw_node_rcvdata
static void ng_btsocket_hci_raw_output(node_p, hook_p, void *, int)
#define NG_BTSOCKET_HCI_RAW_ERR
static int ng_btsocket_hci_raw_send_ngmsg(char *path, int cmd, void *arg, int arglen)
int ng_btsocket_hci_raw_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *sa, struct mbuf *control, struct thread *td)
static ng_disconnect_t ng_btsocket_hci_raw_node_disconnect
static ng_constructor_t ng_btsocket_hci_raw_node_constructor
static ng_connect_t ng_btsocket_hci_raw_node_connect
int ng_btsocket_hci_raw_ctloutput(struct socket *so, struct sockopt *sopt)
static void ng_btsocket_hci_raw_msg_input(struct ng_mesg *msg)
static int ng_btsocket_hci_raw_send_sync_ngmsg(ng_btsocket_hci_raw_pcb_p pcb, char *path, int cmd, void *rsp, int rsplen)
int ng_btsocket_hci_raw_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td)
static void ng_btsocket_hci_raw_get_token(u_int32_t *token)
void ng_btsocket_hci_raw_abort(struct socket *so)
int ng_btsocket_hci_raw_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
#define ng_btsocket_hci_raw_wakeup_input_task()
static void ng_btsocket_hci_raw_data_input(struct mbuf *nam)
void ng_btsocket_hci_raw_detach(struct socket *so)
#define NG_BTSOCKET_HCI_RAW_INFO
static node_p ng_btsocket_hci_raw_node
static struct mtx ng_btsocket_hci_raw_queue_mtx
static struct task ng_btsocket_hci_raw_task
int ng_btsocket_hci_raw_peeraddr(struct socket *so, struct sockaddr **nam)
int ng_btsocket_hci_raw_attach(struct socket *so, int proto, struct thread *td)
static struct ng_type typestruct
static struct ng_bt_itemq ng_btsocket_hci_raw_queue
static u_int32_t ng_btsocket_hci_raw_debug_level
static ng_shutdown_t ng_btsocket_hci_raw_node_shutdown
static ng_newhook_t ng_btsocket_hci_raw_node_newhook
SYSINIT(ng_btsocket_hci_raw_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, ng_btsocket_hci_raw_init, NULL)
int ng_btsocket_hci_raw_sockaddr(struct socket *so, struct sockaddr **nam)
#define M_NETGRAPH_BTSOCKET_HCI_RAW
static int ng_btsocket_hci_raw_filter(ng_btsocket_hci_raw_pcb_p, struct mbuf *, int)
static u_int32_t ng_btsocket_hci_raw_ioctl_timeout
#define NG_BTSOCKET_HCI_RAW_ALERT
static void ng_btsocket_hci_raw_input(void *, int)
void ng_btsocket_hci_raw_close(struct socket *so)
static ng_rcvmsg_t ng_btsocket_hci_raw_node_rcvmsg
static void ng_btsocket_hci_raw_init(void *arg __unused)
int ng_btsocket_hci_raw_disconnect(struct socket *so)
#define NG_BTSOCKET_HCI_RAW_RECVSPACE
#define NG_BTSOCKET_HCI_RAW_SENDSPACE
#define NG_BTSOCKET_HCI_RAW_PRIVILEGED
#define so2hci_raw_pcb(so)
#define NG_BTSOCKET_HCI_RAW_DIRECTION
MALLOC_DEFINE(M_NG_CCATM, "ng_ccatm", "netgraph uni api node")
#define NG_HCI_OCF_LE_READ_WHITE_LIST_SIZE
#define NG_HCI_OCF_EXIT_PERIODIC_INQUIRY
#define NG_HCI_OCF_READ_SUPPORTED_IAC_NUM
#define NG_HCI_OCF_READ_PAGE_TIMO
#define NG_HCI_EVENT_COMMAND_STATUS
#define NG_HCI_OCF_PERIODIC_INQUIRY
#define NG_HCI_OCF_LE_READ_LOCAL_SUPPORTED_FEATURES
#define NG_HCI_OGF_TESTING
#define NG_HCI_OCF_READ_HOLD_MODE_ACTIVITY
#define NG_HCI_OCF_READ_NUM_BROADCAST_RETRANS
#define NG_HCI_OCF_READ_COUNTRY_CODE
#define NG_HCI_OCF_READ_AUTH_ENABLE
#define NGM_HCI_NODE_GET_LINK_POLICY_SETTINGS_MASK
#define NG_HCI_OCF_READ_LOCAL_NAME
#define NG_HCI_OCF_READ_CLOCK_OFFSET
#define NG_HCI_OCF_READ_AUTO_FLUSH_TIMO
#define NGM_HCI_NODE_SET_DEBUG
#define NGM_HCI_NODE_GET_BUFFER
#define NG_HCI_OCF_READ_PAGE_SCAN_ACTIVITY
#define NG_HCI_MAX_NEIGHBOR_NUM
#define NG_HCI_OCF_READ_BUFFER_SIZE
#define NG_HCI_OCF_REMOTE_NAME_REQ
#define NG_HCI_OCF_READ_LINK_POLICY_SETTINGS
#define NGM_HCI_NODE_GET_STAT
#define NG_HCI_OGF_STATUS
#define NGM_HCI_NODE_INIT
#define NG_HCI_OCF_READ_LE_HOST_SUPPORTED
#define NG_HCI_EVENT_COMMAND_COMPL
#define NG_HCI_OCF_LE_SET_SCAN_PARAMETERS
#define NG_HCI_OCF_LE_READ_BUFFER_SIZE
#define NG_HCI_OGF_LINK_POLICY
#define NG_HCI_OCF_READ_PAGE_SCAN_PERIOD
#define NG_HCI_OCF_INQUIRY_CANCEL
#define NG_HCI_OCF_GET_LINK_QUALITY
#define NG_HCI_OCF_READ_UNIT_CLASS
#define NG_HCI_OCF_READ_INQUIRY_SCAN_ACTIVITY
#define NG_HCI_OCF_READ_LOOPBACK_MODE
#define NGM_HCI_NODE_RESET_STAT
#define NGM_HCI_NODE_SET_PACKET_MASK
#define NG_HCI_EVENT_VENDOR
#define NG_HCI_ACL_DATA_PKT
#define NG_HCI_OCF_READ_FAILED_CONTACT_CNTR
#define NG_HCI_OCF_READ_REMOTE_VER_INFO
#define NGM_HCI_NODE_GET_ROLE_SWITCH
#define NGM_HCI_NODE_GET_CON_LIST
#define NG_HCI_OCF_LE_SET_SCAN_ENABLE
#define NGM_HCI_NODE_GET_NEIGHBOR_CACHE
#define NG_HCI_OCF_ROLE_DISCOVERY
#define NG_HCI_OCF_READ_IAC_LAP
#define NG_HCI_CMD_PKT_SIZE
#define NG_HCI_OCF_READ_LOCAL_FEATURES
#define NGM_HCI_NODE_SET_ROLE_SWITCH
#define NGM_HCI_NODE_GET_STATE
#define NG_HCI_OCF_READ_ENCRYPTION_MODE
#define NGM_HCI_NODE_SET_LINK_POLICY_SETTINGS_MASK
#define NG_HCI_OCF_READ_REMOTE_FEATURES
#define NGM_HCI_NODE_GET_DEBUG
#define NG_HCI_OCF_READ_SCAN_ENABLE
#define NG_HCI_OGF_LINK_CONTROL
#define NGM_HCI_NODE_FLUSH_NEIGHBOR_CACHE
#define NG_HCI_OCF_READ_LINK_SUPERVISION_TIMO
#define NG_HCI_OCF_READ_XMIT_LEVEL
#define NGM_HCI_NODE_GET_PACKET_MASK
#define NG_HCI_MAX_CON_NUM
#define NG_HCI_OCF_READ_CON_ACCEPT_TIMO
#define NG_HCI_OCF_READ_PAGE_SCAN
#define NGM_HCI_NODE_GET_FEATURES
#define NG_HCI_OCF_READ_SCO_FLOW_CONTROL
#define NG_HCI_EVENT_RETURN_LINK_KEYS
#define NG_HCI_OCF_READ_PIN_TYPE
#define NG_HCI_SCO_DATA_PKT
#define NG_HCI_EVENT_LINK_KEY_NOTIFICATION
#define NG_HCI_OCF_READ_VOICE_SETTINGS
#define NG_HCI_OCF_READ_BDADDR
#define NGM_HCI_NODE_GET_BDADDR
#define NG_HCI_OCF_READ_LOCAL_VER
#define NG_HCI_OCF_INQUIRY
#define NG_HCI_OCF_READ_RSSI
#define NG_HCI_OGF_HC_BASEBAND
#define NGM_GENERIC_COOKIE
#define NG_MKMESSAGE(msg, cookie, cmdid, len, how)
struct nodeinfo nodeinfo[]
ng_hci_node_con_ep * connections
u_int32_t num_connections
ng_hci_node_buffer_ep buffer
ng_hci_node_debug_ep debug
u_int8_t features[NG_HCI_FEATURES_SIZE]
ng_hci_node_link_policy_mask_ep policy_mask
ng_hci_node_neighbor_cache_entry_ep * entries
ng_hci_node_packet_mask_ep packet_mask
ng_hci_node_role_switch_ep role_switch
ng_hci_node_state_ep state
struct ng_btsocket_hci_raw_filter filter
bitstr_t bit_decl(events, 0xff)
bitstr_t bit_decl(commands[0x3f], 0x3ff)
u_int32_t num_connections
struct ng_mesg::ng_msghdr header