10986ab12SMaksim Yevmenkin /* 20986ab12SMaksim Yevmenkin * bluetooth.h 3baeef614SMaksim Yevmenkin */ 4baeef614SMaksim Yevmenkin 5baeef614SMaksim Yevmenkin /*- 6baeef614SMaksim Yevmenkin * Copyright (c) 2001-2009 Maksim Yevmenkin <m_evmenkin@yahoo.com> 70986ab12SMaksim Yevmenkin * All rights reserved. 80986ab12SMaksim Yevmenkin * 90986ab12SMaksim Yevmenkin * Redistribution and use in source and binary forms, with or without 100986ab12SMaksim Yevmenkin * modification, are permitted provided that the following conditions 110986ab12SMaksim Yevmenkin * are met: 120986ab12SMaksim Yevmenkin * 1. Redistributions of source code must retain the above copyright 130986ab12SMaksim Yevmenkin * notice, this list of conditions and the following disclaimer. 140986ab12SMaksim Yevmenkin * 2. Redistributions in binary form must reproduce the above copyright 150986ab12SMaksim Yevmenkin * notice, this list of conditions and the following disclaimer in the 160986ab12SMaksim Yevmenkin * documentation and/or other materials provided with the distribution. 170986ab12SMaksim Yevmenkin * 180986ab12SMaksim Yevmenkin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 190986ab12SMaksim Yevmenkin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 200986ab12SMaksim Yevmenkin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 210986ab12SMaksim Yevmenkin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 220986ab12SMaksim Yevmenkin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 230986ab12SMaksim Yevmenkin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 240986ab12SMaksim Yevmenkin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 250986ab12SMaksim Yevmenkin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 260986ab12SMaksim Yevmenkin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 270986ab12SMaksim Yevmenkin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 280986ab12SMaksim Yevmenkin * SUCH DAMAGE. 290986ab12SMaksim Yevmenkin * 300986ab12SMaksim Yevmenkin * $Id: bluetooth.h,v 1.5 2003/09/14 23:28:42 max Exp $ 310986ab12SMaksim Yevmenkin * $FreeBSD$ 320986ab12SMaksim Yevmenkin */ 330986ab12SMaksim Yevmenkin 340986ab12SMaksim Yevmenkin #ifndef _BLUETOOTH_H_ 350986ab12SMaksim Yevmenkin #define _BLUETOOTH_H_ 360986ab12SMaksim Yevmenkin 370986ab12SMaksim Yevmenkin #include <sys/types.h> 380986ab12SMaksim Yevmenkin #include <sys/bitstring.h> 390986ab12SMaksim Yevmenkin #include <sys/endian.h> 40baeef614SMaksim Yevmenkin #include <sys/ioctl.h> 410986ab12SMaksim Yevmenkin #include <sys/socket.h> 4278b96635SMaksim Yevmenkin #include <sys/uio.h> 430986ab12SMaksim Yevmenkin #include <sys/un.h> 44baeef614SMaksim Yevmenkin #include <errno.h> 450986ab12SMaksim Yevmenkin #include <netdb.h> 46baeef614SMaksim Yevmenkin #include <netgraph/ng_message.h> 470986ab12SMaksim Yevmenkin #include <netgraph/bluetooth/include/ng_hci.h> 480986ab12SMaksim Yevmenkin #include <netgraph/bluetooth/include/ng_l2cap.h> 490986ab12SMaksim Yevmenkin #include <netgraph/bluetooth/include/ng_btsocket.h> 5078b96635SMaksim Yevmenkin #include <time.h> 510986ab12SMaksim Yevmenkin 520986ab12SMaksim Yevmenkin __BEGIN_DECLS 530986ab12SMaksim Yevmenkin 540986ab12SMaksim Yevmenkin /* 55738473e4SMaksim Yevmenkin * Linux BlueZ compatibility 560986ab12SMaksim Yevmenkin */ 570986ab12SMaksim Yevmenkin 580986ab12SMaksim Yevmenkin #define bacmp(ba1, ba2) memcmp((ba1), (ba2), sizeof(bdaddr_t)) 590986ab12SMaksim Yevmenkin #define bacpy(dst, src) memcpy((dst), (src), sizeof(bdaddr_t)) 600986ab12SMaksim Yevmenkin #define ba2str(ba, str) bt_ntoa((ba), (str)) 610986ab12SMaksim Yevmenkin #define str2ba(str, ba) (bt_aton((str), (ba)) == 1? 0 : -1) 62*ff7e67acSMaksim Yevmenkin #define htobs(d) htole16(d) 63*ff7e67acSMaksim Yevmenkin #define htobl(d) htole32(d) 64*ff7e67acSMaksim Yevmenkin #define btohs(d) le16toh(d) 65*ff7e67acSMaksim Yevmenkin #define btohl(d) le32toh(d) 660986ab12SMaksim Yevmenkin 670986ab12SMaksim Yevmenkin /* 680986ab12SMaksim Yevmenkin * Interface to the outside world 690986ab12SMaksim Yevmenkin */ 700986ab12SMaksim Yevmenkin 710986ab12SMaksim Yevmenkin struct hostent * bt_gethostbyname (char const *name); 720986ab12SMaksim Yevmenkin struct hostent * bt_gethostbyaddr (char const *addr, int len, int type); 730986ab12SMaksim Yevmenkin struct hostent * bt_gethostent (void); 740986ab12SMaksim Yevmenkin void bt_sethostent (int stayopen); 750986ab12SMaksim Yevmenkin void bt_endhostent (void); 760986ab12SMaksim Yevmenkin 770986ab12SMaksim Yevmenkin struct protoent * bt_getprotobyname (char const *name); 780986ab12SMaksim Yevmenkin struct protoent * bt_getprotobynumber (int proto); 790986ab12SMaksim Yevmenkin struct protoent * bt_getprotoent (void); 800986ab12SMaksim Yevmenkin void bt_setprotoent (int stayopen); 810986ab12SMaksim Yevmenkin void bt_endprotoent (void); 820986ab12SMaksim Yevmenkin 830986ab12SMaksim Yevmenkin char const * bt_ntoa (bdaddr_t const *ba, char *str); 840986ab12SMaksim Yevmenkin int bt_aton (char const *str, bdaddr_t *ba); 850986ab12SMaksim Yevmenkin 86baeef614SMaksim Yevmenkin /* bt_devXXXX() functions (inspired by NetBSD) */ 87baeef614SMaksim Yevmenkin int bt_devaddr (char const *devname, bdaddr_t *addr); 88baeef614SMaksim Yevmenkin int bt_devname (char *devname, bdaddr_t const *addr); 89baeef614SMaksim Yevmenkin 90baeef614SMaksim Yevmenkin /* 91baeef614SMaksim Yevmenkin * Bluetooth HCI functions 92baeef614SMaksim Yevmenkin */ 93baeef614SMaksim Yevmenkin 94baeef614SMaksim Yevmenkin #define HCI_DEVMAX 32 /* arbitrary */ 95baeef614SMaksim Yevmenkin #define HCI_DEVNAME_SIZE NG_NODESIZ 96baeef614SMaksim Yevmenkin #define HCI_DEVFEATURES_SIZE NG_HCI_FEATURES_SIZE 97baeef614SMaksim Yevmenkin 98baeef614SMaksim Yevmenkin struct bt_devinfo 99baeef614SMaksim Yevmenkin { 100baeef614SMaksim Yevmenkin char devname[HCI_DEVNAME_SIZE]; 101baeef614SMaksim Yevmenkin 102baeef614SMaksim Yevmenkin uint32_t state; /* device/implementation specific */ 103baeef614SMaksim Yevmenkin 104baeef614SMaksim Yevmenkin bdaddr_t bdaddr; 105baeef614SMaksim Yevmenkin uint16_t _reserved0; 106baeef614SMaksim Yevmenkin 107baeef614SMaksim Yevmenkin uint8_t features[HCI_DEVFEATURES_SIZE]; 108baeef614SMaksim Yevmenkin 109baeef614SMaksim Yevmenkin /* buffer info */ 110baeef614SMaksim Yevmenkin uint16_t _reserved1; 111baeef614SMaksim Yevmenkin uint16_t cmd_free; 112baeef614SMaksim Yevmenkin uint16_t sco_size; 113baeef614SMaksim Yevmenkin uint16_t sco_pkts; 114baeef614SMaksim Yevmenkin uint16_t sco_free; 115baeef614SMaksim Yevmenkin uint16_t acl_size; 116baeef614SMaksim Yevmenkin uint16_t acl_pkts; 117baeef614SMaksim Yevmenkin uint16_t acl_free; 118baeef614SMaksim Yevmenkin 119baeef614SMaksim Yevmenkin /* stats */ 120baeef614SMaksim Yevmenkin uint32_t cmd_sent; 121baeef614SMaksim Yevmenkin uint32_t evnt_recv; 122baeef614SMaksim Yevmenkin uint32_t acl_recv; 123baeef614SMaksim Yevmenkin uint32_t acl_sent; 124baeef614SMaksim Yevmenkin uint32_t sco_recv; 125baeef614SMaksim Yevmenkin uint32_t sco_sent; 126baeef614SMaksim Yevmenkin uint32_t bytes_recv; 127baeef614SMaksim Yevmenkin uint32_t bytes_sent; 128baeef614SMaksim Yevmenkin 129baeef614SMaksim Yevmenkin /* misc/specific */ 130baeef614SMaksim Yevmenkin uint16_t link_policy_info; 131baeef614SMaksim Yevmenkin uint16_t packet_type_info; 132baeef614SMaksim Yevmenkin uint16_t role_switch_info; 133baeef614SMaksim Yevmenkin uint16_t debug; 134baeef614SMaksim Yevmenkin 135baeef614SMaksim Yevmenkin uint8_t _padding[20]; /* leave space for future additions */ 136baeef614SMaksim Yevmenkin }; 137baeef614SMaksim Yevmenkin 13878b96635SMaksim Yevmenkin struct bt_devreq 13978b96635SMaksim Yevmenkin { 14078b96635SMaksim Yevmenkin uint16_t opcode; 14178b96635SMaksim Yevmenkin uint8_t event; 14278b96635SMaksim Yevmenkin void *cparam; 14378b96635SMaksim Yevmenkin size_t clen; 14478b96635SMaksim Yevmenkin void *rparam; 14578b96635SMaksim Yevmenkin size_t rlen; 14678b96635SMaksim Yevmenkin }; 14778b96635SMaksim Yevmenkin 14878b96635SMaksim Yevmenkin struct bt_devfilter { 14978b96635SMaksim Yevmenkin bitstr_t bit_decl(packet_mask, 8); 15078b96635SMaksim Yevmenkin bitstr_t bit_decl(event_mask, 256); 15178b96635SMaksim Yevmenkin }; 15278b96635SMaksim Yevmenkin 15378b96635SMaksim Yevmenkin struct bt_devinquiry { 15478b96635SMaksim Yevmenkin bdaddr_t bdaddr; 15578b96635SMaksim Yevmenkin uint8_t pscan_rep_mode; 15678b96635SMaksim Yevmenkin uint8_t pscan_period_mode; 15778b96635SMaksim Yevmenkin uint8_t dev_class[3]; 15878b96635SMaksim Yevmenkin uint16_t clock_offset; 15978b96635SMaksim Yevmenkin int8_t rssi; 16078b96635SMaksim Yevmenkin uint8_t data[240]; 16178b96635SMaksim Yevmenkin }; 16278b96635SMaksim Yevmenkin 163baeef614SMaksim Yevmenkin typedef int (bt_devenum_cb_t)(int, struct bt_devinfo const *, void *); 164baeef614SMaksim Yevmenkin 16578b96635SMaksim Yevmenkin int bt_devopen (char const *devname); 16678b96635SMaksim Yevmenkin int bt_devclose(int s); 16778b96635SMaksim Yevmenkin int bt_devsend (int s, uint16_t opcode, void *param, size_t plen); 16878b96635SMaksim Yevmenkin ssize_t bt_devrecv (int s, void *buf, size_t size, time_t to); 16978b96635SMaksim Yevmenkin int bt_devreq (int s, struct bt_devreq *r, time_t to); 170808de0aeSMaksim Yevmenkin int bt_devfilter(int s, struct bt_devfilter const *newp, 171808de0aeSMaksim Yevmenkin struct bt_devfilter *oldp); 17278b96635SMaksim Yevmenkin void bt_devfilter_pkt_set(struct bt_devfilter *filter, uint8_t type); 17378b96635SMaksim Yevmenkin void bt_devfilter_pkt_clr(struct bt_devfilter *filter, uint8_t type); 17478b96635SMaksim Yevmenkin int bt_devfilter_pkt_tst(struct bt_devfilter const *filter, uint8_t type); 17578b96635SMaksim Yevmenkin void bt_devfilter_evt_set(struct bt_devfilter *filter, uint8_t event); 17678b96635SMaksim Yevmenkin void bt_devfilter_evt_clr(struct bt_devfilter *filter, uint8_t event); 17778b96635SMaksim Yevmenkin int bt_devfilter_evt_tst(struct bt_devfilter const *filter, uint8_t event); 17878b96635SMaksim Yevmenkin int bt_devinquiry(char const *devname, time_t length, int num_rsp, 17978b96635SMaksim Yevmenkin struct bt_devinquiry **ii); 180baeef614SMaksim Yevmenkin int bt_devinfo (struct bt_devinfo *di); 181baeef614SMaksim Yevmenkin int bt_devenum (bt_devenum_cb_t *cb, void *arg); 182baeef614SMaksim Yevmenkin 18355034c7dSMaksim Yevmenkin /* 18455034c7dSMaksim Yevmenkin * bdaddr utility functions (from NetBSD) 18555034c7dSMaksim Yevmenkin */ 18655034c7dSMaksim Yevmenkin 18755034c7dSMaksim Yevmenkin static __inline int 18855034c7dSMaksim Yevmenkin bdaddr_same(const bdaddr_t *a, const bdaddr_t *b) 18955034c7dSMaksim Yevmenkin { 19055034c7dSMaksim Yevmenkin return (a->b[0] == b->b[0] && a->b[1] == b->b[1] && 19155034c7dSMaksim Yevmenkin a->b[2] == b->b[2] && a->b[3] == b->b[3] && 19255034c7dSMaksim Yevmenkin a->b[4] == b->b[4] && a->b[5] == b->b[5]); 19355034c7dSMaksim Yevmenkin } 19455034c7dSMaksim Yevmenkin 19555034c7dSMaksim Yevmenkin static __inline int 19655034c7dSMaksim Yevmenkin bdaddr_any(const bdaddr_t *a) 19755034c7dSMaksim Yevmenkin { 19855034c7dSMaksim Yevmenkin return (a->b[0] == 0 && a->b[1] == 0 && a->b[2] == 0 && 19955034c7dSMaksim Yevmenkin a->b[3] == 0 && a->b[4] == 0 && a->b[5] == 0); 20055034c7dSMaksim Yevmenkin } 20155034c7dSMaksim Yevmenkin 20255034c7dSMaksim Yevmenkin static __inline void 20355034c7dSMaksim Yevmenkin bdaddr_copy(bdaddr_t *d, const bdaddr_t *s) 20455034c7dSMaksim Yevmenkin { 20555034c7dSMaksim Yevmenkin d->b[0] = s->b[0]; 20655034c7dSMaksim Yevmenkin d->b[1] = s->b[1]; 20755034c7dSMaksim Yevmenkin d->b[2] = s->b[2]; 20855034c7dSMaksim Yevmenkin d->b[3] = s->b[3]; 20955034c7dSMaksim Yevmenkin d->b[4] = s->b[4]; 21055034c7dSMaksim Yevmenkin d->b[5] = s->b[5]; 21155034c7dSMaksim Yevmenkin } 21255034c7dSMaksim Yevmenkin 2130986ab12SMaksim Yevmenkin __END_DECLS 2140986ab12SMaksim Yevmenkin 2150986ab12SMaksim Yevmenkin #endif /* ndef _BLUETOOTH_H_ */ 2160986ab12SMaksim Yevmenkin 217