38#include <sys/kernel.h>
39#include <sys/endian.h>
40#include <sys/malloc.h>
62#ifdef NG_SEPARATE_MALLOC
65#define M_NETGRAPH_HCI M_NETGRAPH
155 LIST_INIT(&unit->con_list);
156 LIST_INIT(&unit->neighbors);
186 bzero(unit,
sizeof(*unit));
232 if (hook != unit->
drv) {
233 if (hook == unit->
acl) {
236 }
else if (hook == unit->
sco) {
243 if (hook != unit->
raw)
260 if (hook == unit->
acl)
262 else if (hook == unit->
sco)
264 else if (hook == unit->
raw)
266 else if (hook == unit->
drv) {
295 struct ng_mesg *msg = NULL, *rsp = NULL;
305 acl_total, acl_avail, acl_size,
306 sco_total, sco_avail, sco_size;
325 "bdaddr %x:%x:%x:%x:%x:%x\n" \
326 "Hooks %s %s %s %s\n" \
329 "Buffer cmd:%d,acl:%d,%d,%d,sco:%d,%d,%d",
340 acl_avail, acl_total, acl_size,
341 sco_avail, sco_total, sco_size);
366 sizeof(bdaddr_t)) == 0) {
428 bcopy(&unit->
bdaddr, rsp->data,
sizeof(bdaddr_t));
450 bcopy(&unit->
stat, rsp->data,
sizeof(unit->
stat));
471 for (n = LIST_FIRST(&unit->neighbors); n != NULL; ) {
497 LIST_FOREACH(n, &unit->neighbors, next) {
524 LIST_FOREACH(c, &unit->con_list, next)
542 LIST_FOREACH(c, &unit->con_list, next) {
668 switch (
NGI_MSG(item)->header.typecookie) {
670 switch (
NGI_MSG(item)->header.cmd) {
710 struct mbuf *m = NULL;
715 m->m_flags |= M_PROTO1;
728 switch (*mtod(m, u_int8_t *)) {
735"%s: %s - could not forward HCI ACL data packet, state=%#x, hook=%p\n",
750"%s: %s - could not forward HCI SCO data packet, state=%#x, hook=%p\n",
771"%s: %s - got unknown HCI packet type=%#x\n",
773 *mtod(m, u_int8_t *));
793 struct mbuf *m = NULL;
795 u_int16_t con_handle;
804"%s: %s - invalid HCI data packet type=%#x\n",
806 *mtod(m, u_int8_t *));
811 if (m->m_pkthdr.len <
sizeof(ng_hci_acldata_pkt_t) ||
812 m->m_pkthdr.len >
sizeof(ng_hci_acldata_pkt_t) + size) {
814"%s: %s - invalid HCI ACL data packet, len=%d, mtu=%d\n",
816 m->m_pkthdr.len, size);
829 mtod(m, ng_hci_acldata_pkt_t *)->con_handle));
830 size = le16toh(mtod(m, ng_hci_acldata_pkt_t *)->
length);
832 if (m->m_pkthdr.len !=
sizeof(ng_hci_acldata_pkt_t) + size) {
834"%s: %s - invalid HCI ACL data packet size, len=%d, length=%d\n",
836 m->m_pkthdr.len, size);
846"%s: %s - unexpected HCI ACL data packet. Connection does not exists, " \
855"%s: %s - unexpected HCI ACL data packet. Not ACL link, con_handle=%d, " \
865"%s: %s - unexpected HCI ACL data packet. Invalid connection state=%d, " \
867 con->
state, con_handle);
875"%s: %s - dropping HCI ACL data packet, con_handle=%d, len=%d, queue_len=%d\n",
910 struct mbuf *m = NULL;
912 u_int16_t con_handle;
922"%s: %s - invalid HCI data packet type=%#x\n",
924 *mtod(m, u_int8_t *));
930 if (m->m_pkthdr.len <
sizeof(ng_hci_scodata_pkt_t) ||
931 m->m_pkthdr.len >
sizeof(ng_hci_scodata_pkt_t) + size) {
933"%s: %s - invalid HCI SCO data packet, len=%d, mtu=%d\n",
935 m->m_pkthdr.len, size);
948 mtod(m, ng_hci_scodata_pkt_t *)->con_handle));
949 size = mtod(m, ng_hci_scodata_pkt_t *)->length;
951 if (m->m_pkthdr.len !=
sizeof(ng_hci_scodata_pkt_t) + size) {
953"%s: %s - invalid HCI SCO data packet size, len=%d, length=%d\n",
955 m->m_pkthdr.len, size);
965"%s: %s - unexpected HCI SCO data packet. Connection does not exists, " \
974"%s: %s - unexpected HCI SCO data packet. Not SCO link, con_handle=%d, " \
984"%s: %s - unexpected HCI SCO data packet. Invalid connection state=%d, " \
986 con->
state, con_handle);
994"%s: %s - dropping HCI SCO data packet, con_handle=%d, len=%d, queue_len=%d\n",
1029 struct mbuf *m = NULL;
1038"%s: %s - invalid HCI command packet type=%#x\n",
1040 *mtod(m, u_int8_t *));
1046 if (m->m_pkthdr.len <
sizeof(ng_hci_cmd_pkt_t)) {
1048"%s: %s - invalid HCI command packet len=%d\n",
1061 if (m->m_pkthdr.len !=
1062 mtod(m, ng_hci_cmd_pkt_t *)->
length +
sizeof(ng_hci_cmd_pkt_t)) {
1064"%s: %s - invalid HCI command packet size, len=%d, length=%d\n",
1066 mtod(m, ng_hci_cmd_pkt_t *)->
length);
1072 if (mtod(m, ng_hci_cmd_pkt_t *)->
opcode == 0) {
1074"%s: %s - invalid HCI command opcode\n",
1083"%s: %s - dropping HCI command packet, len=%d, queue_len=%d\n",
int ng_connect_t(hook_p hook)
#define NG_HOOK_NODE(hook)
#define NG_HOOK_NOT_VALID(hook)
int ng_rcvmsg_t(node_p node, item_p item, hook_p lasthook)
#define NG_FWD_ITEM_HOOK(error, item, hook)
int ng_disconnect_t(hook_p hook)
#define NG_NODE_SET_PRIVATE(node, val)
#define NG_RESPOND_MSG(error, here, item, resp)
#define NG_NODE_IS_VALID(node)
#define NG_NODE_FORCE_WRITER(node)
#define NG_HOOK_SET_RCVMSG(hook, val)
#define NG_NODE_UNREF(node)
#define NG_NODE_NAME(node)
int ng_rmnode_self(node_p here)
#define ng_callout_init(c)
int ng_rcvdata_t(hook_p hook, item_p item)
int ng_shutdown_t(node_p node)
#define NG_FREE_ITEM(item)
#define NG_HOOK_SET_RCVDATA(hook, val)
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 NG_NODE_NUMHOOKS(node)
#define NGI_GET_MSG(i, m)
#define NG_NODE_PRIVATE(node)
int ng_newhook_t(node_p node, hook_p hook, const char *name)
#define NG_BT_ITEMQ_ENQUEUE(q, i)
#define NG_BT_ITEMQ_FULL(q)
#define NG_BT_MBUFQ_DROP(q)
#define NG_BT_MBUFQ_INIT(q, _maxlen)
#define NG_BT_MBUFQ_ENQUEUE(q, i)
#define NG_BT_MBUFQ_DESTROY(q)
#define NG_BT_MBUFQ_LEN(q)
#define NG_BLUETOOTH_VERSION
#define NG_BT_ITEMQ_LEN(q)
#define NG_BT_ITEMQ_DROP(q)
#define NG_BT_MBUFQ_FULL(q)
MALLOC_DEFINE(M_NG_CCATM, "ng_ccatm", "netgraph uni api node")
#define NGM_HCI_LP_QOS_REQ
u_int16_t ng_hci_node_packet_mask_ep
u_int16_t ng_hci_node_debug_ep
#define NGM_HCI_NODE_GET_LINK_POLICY_SETTINGS_MASK
#define NGM_HCI_NODE_SET_DEBUG
#define NGM_HCI_NODE_GET_BUFFER
#define NG_HCI_MAX_NEIGHBOR_NUM
#define NGM_HCI_NODE_GET_STAT
#define NG_HCI_UNIT_CONNECTED
#define NGM_HCI_NODE_INIT
#define NG_HCI_WARN_LEVEL
#define NG_HCI_BDADDR_ANY
#define NG_HCI_LINK_LE_RANDOM
#define NGM_HCI_LP_CON_RSP
#define NGM_HCI_NODE_RESET_STAT
#define NGM_HCI_NODE_SET_PACKET_MASK
#define NG_HCI_ACL_DATA_PKT
#define NGM_HCI_NODE_GET_ROLE_SWITCH
#define NGM_HCI_NODE_GET_CON_LIST
#define NGM_HCI_NODE_GET_NEIGHBOR_CACHE
u_int16_t ng_hci_node_role_switch_ep
#define NGM_HCI_NODE_SET_ROLE_SWITCH
#define NGM_HCI_NODE_GET_STATE
#define NG_HCI_UNIT_READY
#define NGM_HCI_NODE_SET_LINK_POLICY_SETTINGS_MASK
#define NGM_HCI_LP_DISCON_REQ
#define NGM_HCI_NODE_GET_DEBUG
#define NGM_HCI_NODE_FLUSH_NEIGHBOR_CACHE
#define NG_HCI_UNIT_INITED
#define NG_HCI_UNIT_COMMAND_PENDING
#define NGM_HCI_NODE_GET_PACKET_MASK
#define NG_HCI_MAX_CON_NUM
#define NGM_HCI_NODE_GET_FEATURES
#define NG_HCI_SCO_DATA_PKT
u_int16_t ng_hci_node_state_ep
u_int16_t ng_hci_node_link_policy_mask_ep
#define NGM_HCI_LP_CON_REQ
#define NG_HCI_CON_HANDLE(h)
#define NGM_HCI_NODE_GET_BDADDR
#define NG_HCI_LINK_LE_PUBLIC
int ng_hci_send_command(ng_hci_unit_p unit)
void ng_hci_send_data(ng_hci_unit_p unit)
int ng_hci_process_event(ng_hci_unit_p unit, struct mbuf *event)
static ng_disconnect_t ng_hci_disconnect
MODULE_DEPEND(ng_hci, ng_bluetooth, NG_BLUETOOTH_VERSION, NG_BLUETOOTH_VERSION, NG_BLUETOOTH_VERSION)
static int ng_hci_linktype_to_addrtype(int linktype)
static ng_rcvmsg_t ng_hci_upper_rcvmsg
static ng_rcvmsg_t ng_hci_default_rcvmsg
static ng_shutdown_t ng_hci_shutdown
static struct ng_type typestruct
static ng_rcvdata_t ng_hci_sco_rcvdata
static ng_rcvdata_t ng_hci_acl_rcvdata
static ng_connect_t ng_hci_connect
NETGRAPH_INIT(hci, &typestruct)
MODULE_VERSION(ng_hci, NG_BLUETOOTH_VERSION)
static ng_rcvdata_t ng_hci_drv_rcvdata
static ng_newhook_t ng_hci_newhook
static ng_constructor_t ng_hci_constructor
static ng_rcvdata_t ng_hci_raw_rcvdata
ng_hci_unit_con_p ng_hci_con_by_handle(ng_hci_unit_p unit, int con_handle)
void ng_hci_free_neighbor(ng_hci_neighbor_p n)
void ng_hci_unit_clean(ng_hci_unit_p unit, int reason)
void ng_hci_node_is_up(node_p node, hook_p hook, void *arg1, int arg2)
int ng_hci_neighbor_stale(ng_hci_neighbor_p n)
void ng_hci_flush_neighbor_cache(ng_hci_unit_p unit)
void ng_hci_mtap(ng_hci_unit_p unit, struct mbuf *m0)
static const struct ng_cmdlist ng_hci_cmdlist[]
int ng_hci_lp_qos_req(ng_hci_unit_p unit, item_p item, hook_p hook)
int ng_hci_lp_con_rsp(ng_hci_unit_p unit, item_p item, hook_p hook)
int ng_hci_lp_discon_req(ng_hci_unit_p unit, item_p item, hook_p hook)
int ng_hci_lp_con_req(ng_hci_unit_p unit, item_p item, hook_p hook)
#define NG_HCI_BUFF_SCO_SET(b, n, s, f)
#define NG_HCI_BUFF_ACL_TOTAL(b, v)
#define NG_HCI_STAT_RESET(s)
#define NG_HCI_CMD_QUEUE_LEN
#define NG_HCI_STAT_EVNT_RECV(s)
#define NG_HCI_BUFF_SCO_TOTAL(b, v)
#define NG_HCI_M_PULLUP(m, s)
#define NG_HCI_STAT_BYTES_RECV(s, b)
#define NG_HCI_BUFF_CMD_SET(b, v)
#define NG_HCI_BUFF_ACL_SET(b, n, s, f)
#define NG_HCI_STAT_SCO_RECV(s)
#define NG_HCI_BUFF_CMD_GET(b, v)
#define NG_HCI_BUFF_SCO_AVAIL(b, v)
#define NG_HCI_BUFF_ACL_AVAIL(b, v)
#define NG_HCI_BUFF_ACL_SIZE(b, v)
#define NG_HCI_STAT_ACL_RECV(s)
ng_hci_unit_t * ng_hci_unit_p
#define NG_HCI_BUFF_SCO_SIZE(b, v)
#define NG_MKRESPONSE(rsp, msg, len, how)
#define NGM_GENERIC_COOKIE
uint8_t extinq_data[NG_HCI_EXTINQ_MAX]
u_int8_t features[NG_HCI_FEATURES_SIZE]
u_int8_t page_scan_rep_mode
u_int32_t num_connections
u_int16_t page_scan_rep_mode
u_int8_t features[NG_HCI_FEATURES_SIZE]
uint8_t extinq_data[NG_HCI_EXTINQ_MAX]
ng_hci_node_role_switch_ep role_switch
ng_hci_node_state_ep state
ng_hci_node_debug_ep debug
ng_hci_node_packet_mask_ep packet_mask
u_int8_t features[NG_HCI_FEATURES_SIZE]
ng_hci_node_link_policy_mask_ep link_policy_mask
ng_hci_unit_buff_t buffer
struct ng_mesg::ng_msghdr header