10986ab12SMaksim Yevmenkin /* 20986ab12SMaksim Yevmenkin * bluetooth.h 3baeef614SMaksim Yevmenkin */ 4baeef614SMaksim Yevmenkin 5baeef614SMaksim Yevmenkin /*- 65e53a4f9SPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 75e53a4f9SPedro F. Giffuni * 8baeef614SMaksim Yevmenkin * Copyright (c) 2001-2009 Maksim Yevmenkin <m_evmenkin@yahoo.com> 90986ab12SMaksim Yevmenkin * All rights reserved. 100986ab12SMaksim Yevmenkin * 110986ab12SMaksim Yevmenkin * Redistribution and use in source and binary forms, with or without 120986ab12SMaksim Yevmenkin * modification, are permitted provided that the following conditions 130986ab12SMaksim Yevmenkin * are met: 140986ab12SMaksim Yevmenkin * 1. Redistributions of source code must retain the above copyright 150986ab12SMaksim Yevmenkin * notice, this list of conditions and the following disclaimer. 160986ab12SMaksim Yevmenkin * 2. Redistributions in binary form must reproduce the above copyright 170986ab12SMaksim Yevmenkin * notice, this list of conditions and the following disclaimer in the 180986ab12SMaksim Yevmenkin * documentation and/or other materials provided with the distribution. 190986ab12SMaksim Yevmenkin * 200986ab12SMaksim Yevmenkin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 210986ab12SMaksim Yevmenkin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 220986ab12SMaksim Yevmenkin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 230986ab12SMaksim Yevmenkin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 240986ab12SMaksim Yevmenkin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 250986ab12SMaksim Yevmenkin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 260986ab12SMaksim Yevmenkin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 270986ab12SMaksim Yevmenkin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 280986ab12SMaksim Yevmenkin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 290986ab12SMaksim Yevmenkin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 300986ab12SMaksim Yevmenkin * SUCH DAMAGE. 310986ab12SMaksim Yevmenkin * 320986ab12SMaksim Yevmenkin * $Id: bluetooth.h,v 1.5 2003/09/14 23:28:42 max Exp $ 330986ab12SMaksim Yevmenkin * $FreeBSD$ 340986ab12SMaksim Yevmenkin */ 350986ab12SMaksim Yevmenkin 360986ab12SMaksim Yevmenkin #ifndef _BLUETOOTH_H_ 370986ab12SMaksim Yevmenkin #define _BLUETOOTH_H_ 380986ab12SMaksim Yevmenkin 390986ab12SMaksim Yevmenkin #include <sys/types.h> 400986ab12SMaksim Yevmenkin #include <sys/endian.h> 41baeef614SMaksim Yevmenkin #include <sys/ioctl.h> 420986ab12SMaksim Yevmenkin #include <sys/socket.h> 4378b96635SMaksim Yevmenkin #include <sys/uio.h> 440986ab12SMaksim Yevmenkin #include <sys/un.h> 458907f744SAlan Somers 46baeef614SMaksim Yevmenkin #include <errno.h> 470986ab12SMaksim Yevmenkin #include <netdb.h> 488907f744SAlan Somers #include <bitstring.h> 498907f744SAlan Somers 50baeef614SMaksim Yevmenkin #include <netgraph/ng_message.h> 514aa92fe2STakanori Watanabe #include <netgraph/bluetooth/include/ng_bluetooth.h> 520986ab12SMaksim Yevmenkin #include <netgraph/bluetooth/include/ng_hci.h> 530986ab12SMaksim Yevmenkin #include <netgraph/bluetooth/include/ng_l2cap.h> 540986ab12SMaksim Yevmenkin #include <netgraph/bluetooth/include/ng_btsocket.h> 5578b96635SMaksim Yevmenkin #include <time.h> 560986ab12SMaksim Yevmenkin 570986ab12SMaksim Yevmenkin __BEGIN_DECLS 580986ab12SMaksim Yevmenkin 590986ab12SMaksim Yevmenkin /* 60738473e4SMaksim Yevmenkin * Linux BlueZ compatibility 610986ab12SMaksim Yevmenkin */ 620986ab12SMaksim Yevmenkin 630986ab12SMaksim Yevmenkin #define bacmp(ba1, ba2) memcmp((ba1), (ba2), sizeof(bdaddr_t)) 640986ab12SMaksim Yevmenkin #define bacpy(dst, src) memcpy((dst), (src), sizeof(bdaddr_t)) 650986ab12SMaksim Yevmenkin #define ba2str(ba, str) bt_ntoa((ba), (str)) 660986ab12SMaksim Yevmenkin #define str2ba(str, ba) (bt_aton((str), (ba)) == 1? 0 : -1) 67ff7e67acSMaksim Yevmenkin #define htobs(d) htole16(d) 68ff7e67acSMaksim Yevmenkin #define htobl(d) htole32(d) 69ff7e67acSMaksim Yevmenkin #define btohs(d) le16toh(d) 70ff7e67acSMaksim Yevmenkin #define btohl(d) le32toh(d) 710986ab12SMaksim Yevmenkin 720986ab12SMaksim Yevmenkin /* 730986ab12SMaksim Yevmenkin * Interface to the outside world 740986ab12SMaksim Yevmenkin */ 750986ab12SMaksim Yevmenkin 760986ab12SMaksim Yevmenkin struct hostent * bt_gethostbyname (char const *name); 770986ab12SMaksim Yevmenkin struct hostent * bt_gethostbyaddr (char const *addr, int len, int type); 780986ab12SMaksim Yevmenkin struct hostent * bt_gethostent (void); 790986ab12SMaksim Yevmenkin void bt_sethostent (int stayopen); 800986ab12SMaksim Yevmenkin void bt_endhostent (void); 810986ab12SMaksim Yevmenkin 820986ab12SMaksim Yevmenkin struct protoent * bt_getprotobyname (char const *name); 830986ab12SMaksim Yevmenkin struct protoent * bt_getprotobynumber (int proto); 840986ab12SMaksim Yevmenkin struct protoent * bt_getprotoent (void); 850986ab12SMaksim Yevmenkin void bt_setprotoent (int stayopen); 860986ab12SMaksim Yevmenkin void bt_endprotoent (void); 870986ab12SMaksim Yevmenkin 880986ab12SMaksim Yevmenkin char const * bt_ntoa (bdaddr_t const *ba, char *str); 890986ab12SMaksim Yevmenkin int bt_aton (char const *str, bdaddr_t *ba); 900986ab12SMaksim Yevmenkin 91baeef614SMaksim Yevmenkin /* bt_devXXXX() functions (inspired by NetBSD) */ 92baeef614SMaksim Yevmenkin int bt_devaddr (char const *devname, bdaddr_t *addr); 93baeef614SMaksim Yevmenkin int bt_devname (char *devname, bdaddr_t const *addr); 94baeef614SMaksim Yevmenkin 95baeef614SMaksim Yevmenkin /* 96baeef614SMaksim Yevmenkin * Bluetooth HCI functions 97baeef614SMaksim Yevmenkin */ 98baeef614SMaksim Yevmenkin 99baeef614SMaksim Yevmenkin #define HCI_DEVMAX 32 /* arbitrary */ 100baeef614SMaksim Yevmenkin #define HCI_DEVNAME_SIZE NG_NODESIZ 101baeef614SMaksim Yevmenkin #define HCI_DEVFEATURES_SIZE NG_HCI_FEATURES_SIZE 102baeef614SMaksim Yevmenkin 103baeef614SMaksim Yevmenkin struct bt_devinfo 104baeef614SMaksim Yevmenkin { 105baeef614SMaksim Yevmenkin char devname[HCI_DEVNAME_SIZE]; 106baeef614SMaksim Yevmenkin 107baeef614SMaksim Yevmenkin uint32_t state; /* device/implementation specific */ 108baeef614SMaksim Yevmenkin 109baeef614SMaksim Yevmenkin bdaddr_t bdaddr; 110baeef614SMaksim Yevmenkin uint16_t _reserved0; 111baeef614SMaksim Yevmenkin 112baeef614SMaksim Yevmenkin uint8_t features[HCI_DEVFEATURES_SIZE]; 113baeef614SMaksim Yevmenkin 114baeef614SMaksim Yevmenkin /* buffer info */ 115baeef614SMaksim Yevmenkin uint16_t _reserved1; 116baeef614SMaksim Yevmenkin uint16_t cmd_free; 117baeef614SMaksim Yevmenkin uint16_t sco_size; 118baeef614SMaksim Yevmenkin uint16_t sco_pkts; 119baeef614SMaksim Yevmenkin uint16_t sco_free; 120baeef614SMaksim Yevmenkin uint16_t acl_size; 121baeef614SMaksim Yevmenkin uint16_t acl_pkts; 122baeef614SMaksim Yevmenkin uint16_t acl_free; 123baeef614SMaksim Yevmenkin 124baeef614SMaksim Yevmenkin /* stats */ 125baeef614SMaksim Yevmenkin uint32_t cmd_sent; 126baeef614SMaksim Yevmenkin uint32_t evnt_recv; 127baeef614SMaksim Yevmenkin uint32_t acl_recv; 128baeef614SMaksim Yevmenkin uint32_t acl_sent; 129baeef614SMaksim Yevmenkin uint32_t sco_recv; 130baeef614SMaksim Yevmenkin uint32_t sco_sent; 131baeef614SMaksim Yevmenkin uint32_t bytes_recv; 132baeef614SMaksim Yevmenkin uint32_t bytes_sent; 133baeef614SMaksim Yevmenkin 134baeef614SMaksim Yevmenkin /* misc/specific */ 135baeef614SMaksim Yevmenkin uint16_t link_policy_info; 136baeef614SMaksim Yevmenkin uint16_t packet_type_info; 137baeef614SMaksim Yevmenkin uint16_t role_switch_info; 138baeef614SMaksim Yevmenkin uint16_t debug; 139baeef614SMaksim Yevmenkin 140baeef614SMaksim Yevmenkin uint8_t _padding[20]; /* leave space for future additions */ 141baeef614SMaksim Yevmenkin }; 142baeef614SMaksim Yevmenkin 14378b96635SMaksim Yevmenkin struct bt_devreq 14478b96635SMaksim Yevmenkin { 14578b96635SMaksim Yevmenkin uint16_t opcode; 14678b96635SMaksim Yevmenkin uint8_t event; 14778b96635SMaksim Yevmenkin void *cparam; 14878b96635SMaksim Yevmenkin size_t clen; 14978b96635SMaksim Yevmenkin void *rparam; 15078b96635SMaksim Yevmenkin size_t rlen; 15178b96635SMaksim Yevmenkin }; 15278b96635SMaksim Yevmenkin 15378b96635SMaksim Yevmenkin struct bt_devfilter { 15478b96635SMaksim Yevmenkin bitstr_t bit_decl(packet_mask, 8); 15578b96635SMaksim Yevmenkin bitstr_t bit_decl(event_mask, 256); 15678b96635SMaksim Yevmenkin }; 15778b96635SMaksim Yevmenkin 15878b96635SMaksim Yevmenkin struct bt_devinquiry { 15978b96635SMaksim Yevmenkin bdaddr_t bdaddr; 16078b96635SMaksim Yevmenkin uint8_t pscan_rep_mode; 16178b96635SMaksim Yevmenkin uint8_t pscan_period_mode; 16278b96635SMaksim Yevmenkin uint8_t dev_class[3]; 16378b96635SMaksim Yevmenkin uint16_t clock_offset; 16478b96635SMaksim Yevmenkin int8_t rssi; 16578b96635SMaksim Yevmenkin uint8_t data[240]; 16678b96635SMaksim Yevmenkin }; 16778b96635SMaksim Yevmenkin 168baeef614SMaksim Yevmenkin typedef int (bt_devenum_cb_t)(int, struct bt_devinfo const *, void *); 169baeef614SMaksim Yevmenkin 17078b96635SMaksim Yevmenkin int bt_devopen (char const *devname); 17178b96635SMaksim Yevmenkin int bt_devclose(int s); 17278b96635SMaksim Yevmenkin int bt_devsend (int s, uint16_t opcode, void *param, size_t plen); 17378b96635SMaksim Yevmenkin ssize_t bt_devrecv (int s, void *buf, size_t size, time_t to); 17478b96635SMaksim Yevmenkin int bt_devreq (int s, struct bt_devreq *r, time_t to); 175808de0aeSMaksim Yevmenkin int bt_devfilter(int s, struct bt_devfilter const *newp, 176808de0aeSMaksim Yevmenkin struct bt_devfilter *oldp); 17778b96635SMaksim Yevmenkin void bt_devfilter_pkt_set(struct bt_devfilter *filter, uint8_t type); 17878b96635SMaksim Yevmenkin void bt_devfilter_pkt_clr(struct bt_devfilter *filter, uint8_t type); 17978b96635SMaksim Yevmenkin int bt_devfilter_pkt_tst(struct bt_devfilter const *filter, uint8_t type); 18078b96635SMaksim Yevmenkin void bt_devfilter_evt_set(struct bt_devfilter *filter, uint8_t event); 18178b96635SMaksim Yevmenkin void bt_devfilter_evt_clr(struct bt_devfilter *filter, uint8_t event); 18278b96635SMaksim Yevmenkin int bt_devfilter_evt_tst(struct bt_devfilter const *filter, uint8_t event); 18378b96635SMaksim Yevmenkin int bt_devinquiry(char const *devname, time_t length, int num_rsp, 18478b96635SMaksim Yevmenkin struct bt_devinquiry **ii); 185*3ee5c554SVladimir Kondratyev char * bt_devremote_name(char const *devname, const bdaddr_t *remote, 186*3ee5c554SVladimir Kondratyev time_t to, uint16_t clk_off, 187*3ee5c554SVladimir Kondratyev uint8_t ps_rep_mode, uint8_t ps_mode); 188baeef614SMaksim Yevmenkin int bt_devinfo (struct bt_devinfo *di); 18934fe534bSBrooks Davis int bt_devenum (bt_devenum_cb_t cb, void *arg); 190baeef614SMaksim Yevmenkin 191*3ee5c554SVladimir Kondratyev static __inline char * 192*3ee5c554SVladimir Kondratyev bt_devremote_name_gen(char const *devname, const bdaddr_t *remote) 193*3ee5c554SVladimir Kondratyev { 194*3ee5c554SVladimir Kondratyev return (bt_devremote_name(devname, remote, 0, 0x0000, 195*3ee5c554SVladimir Kondratyev NG_HCI_SCAN_REP_MODE0, NG_HCI_MANDATORY_PAGE_SCAN_MODE)); 196*3ee5c554SVladimir Kondratyev } 197*3ee5c554SVladimir Kondratyev 19855034c7dSMaksim Yevmenkin /* 19955034c7dSMaksim Yevmenkin * bdaddr utility functions (from NetBSD) 20055034c7dSMaksim Yevmenkin */ 20155034c7dSMaksim Yevmenkin 20255034c7dSMaksim Yevmenkin static __inline int 20355034c7dSMaksim Yevmenkin bdaddr_same(const bdaddr_t *a, const bdaddr_t *b) 20455034c7dSMaksim Yevmenkin { 20555034c7dSMaksim Yevmenkin return (a->b[0] == b->b[0] && a->b[1] == b->b[1] && 20655034c7dSMaksim Yevmenkin a->b[2] == b->b[2] && a->b[3] == b->b[3] && 20755034c7dSMaksim Yevmenkin a->b[4] == b->b[4] && a->b[5] == b->b[5]); 20855034c7dSMaksim Yevmenkin } 20955034c7dSMaksim Yevmenkin 21055034c7dSMaksim Yevmenkin static __inline int 21155034c7dSMaksim Yevmenkin bdaddr_any(const bdaddr_t *a) 21255034c7dSMaksim Yevmenkin { 21355034c7dSMaksim Yevmenkin return (a->b[0] == 0 && a->b[1] == 0 && a->b[2] == 0 && 21455034c7dSMaksim Yevmenkin a->b[3] == 0 && a->b[4] == 0 && a->b[5] == 0); 21555034c7dSMaksim Yevmenkin } 21655034c7dSMaksim Yevmenkin 21755034c7dSMaksim Yevmenkin static __inline void 21855034c7dSMaksim Yevmenkin bdaddr_copy(bdaddr_t *d, const bdaddr_t *s) 21955034c7dSMaksim Yevmenkin { 22055034c7dSMaksim Yevmenkin d->b[0] = s->b[0]; 22155034c7dSMaksim Yevmenkin d->b[1] = s->b[1]; 22255034c7dSMaksim Yevmenkin d->b[2] = s->b[2]; 22355034c7dSMaksim Yevmenkin d->b[3] = s->b[3]; 22455034c7dSMaksim Yevmenkin d->b[4] = s->b[4]; 22555034c7dSMaksim Yevmenkin d->b[5] = s->b[5]; 22655034c7dSMaksim Yevmenkin } 22755034c7dSMaksim Yevmenkin 2280986ab12SMaksim Yevmenkin __END_DECLS 2290986ab12SMaksim Yevmenkin 2300986ab12SMaksim Yevmenkin #endif /* ndef _BLUETOOTH_H_ */ 2310986ab12SMaksim Yevmenkin 232