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/endian.h> 39baeef614SMaksim Yevmenkin #include <sys/ioctl.h> 400986ab12SMaksim Yevmenkin #include <sys/socket.h> 4178b96635SMaksim Yevmenkin #include <sys/uio.h> 420986ab12SMaksim Yevmenkin #include <sys/un.h> 438907f744SAlan Somers 44baeef614SMaksim Yevmenkin #include <errno.h> 450986ab12SMaksim Yevmenkin #include <netdb.h> 468907f744SAlan Somers #include <bitstring.h> 478907f744SAlan Somers 48baeef614SMaksim Yevmenkin #include <netgraph/ng_message.h> 49*4aa92fe2STakanori Watanabe #include <netgraph/bluetooth/include/ng_bluetooth.h> 500986ab12SMaksim Yevmenkin #include <netgraph/bluetooth/include/ng_hci.h> 510986ab12SMaksim Yevmenkin #include <netgraph/bluetooth/include/ng_l2cap.h> 520986ab12SMaksim Yevmenkin #include <netgraph/bluetooth/include/ng_btsocket.h> 5378b96635SMaksim Yevmenkin #include <time.h> 540986ab12SMaksim Yevmenkin 550986ab12SMaksim Yevmenkin __BEGIN_DECLS 560986ab12SMaksim Yevmenkin 570986ab12SMaksim Yevmenkin /* 58738473e4SMaksim Yevmenkin * Linux BlueZ compatibility 590986ab12SMaksim Yevmenkin */ 600986ab12SMaksim Yevmenkin 610986ab12SMaksim Yevmenkin #define bacmp(ba1, ba2) memcmp((ba1), (ba2), sizeof(bdaddr_t)) 620986ab12SMaksim Yevmenkin #define bacpy(dst, src) memcpy((dst), (src), sizeof(bdaddr_t)) 630986ab12SMaksim Yevmenkin #define ba2str(ba, str) bt_ntoa((ba), (str)) 640986ab12SMaksim Yevmenkin #define str2ba(str, ba) (bt_aton((str), (ba)) == 1? 0 : -1) 65ff7e67acSMaksim Yevmenkin #define htobs(d) htole16(d) 66ff7e67acSMaksim Yevmenkin #define htobl(d) htole32(d) 67ff7e67acSMaksim Yevmenkin #define btohs(d) le16toh(d) 68ff7e67acSMaksim Yevmenkin #define btohl(d) le32toh(d) 690986ab12SMaksim Yevmenkin 700986ab12SMaksim Yevmenkin /* 710986ab12SMaksim Yevmenkin * Interface to the outside world 720986ab12SMaksim Yevmenkin */ 730986ab12SMaksim Yevmenkin 740986ab12SMaksim Yevmenkin struct hostent * bt_gethostbyname (char const *name); 750986ab12SMaksim Yevmenkin struct hostent * bt_gethostbyaddr (char const *addr, int len, int type); 760986ab12SMaksim Yevmenkin struct hostent * bt_gethostent (void); 770986ab12SMaksim Yevmenkin void bt_sethostent (int stayopen); 780986ab12SMaksim Yevmenkin void bt_endhostent (void); 790986ab12SMaksim Yevmenkin 800986ab12SMaksim Yevmenkin struct protoent * bt_getprotobyname (char const *name); 810986ab12SMaksim Yevmenkin struct protoent * bt_getprotobynumber (int proto); 820986ab12SMaksim Yevmenkin struct protoent * bt_getprotoent (void); 830986ab12SMaksim Yevmenkin void bt_setprotoent (int stayopen); 840986ab12SMaksim Yevmenkin void bt_endprotoent (void); 850986ab12SMaksim Yevmenkin 860986ab12SMaksim Yevmenkin char const * bt_ntoa (bdaddr_t const *ba, char *str); 870986ab12SMaksim Yevmenkin int bt_aton (char const *str, bdaddr_t *ba); 880986ab12SMaksim Yevmenkin 89baeef614SMaksim Yevmenkin /* bt_devXXXX() functions (inspired by NetBSD) */ 90baeef614SMaksim Yevmenkin int bt_devaddr (char const *devname, bdaddr_t *addr); 91baeef614SMaksim Yevmenkin int bt_devname (char *devname, bdaddr_t const *addr); 92baeef614SMaksim Yevmenkin 93baeef614SMaksim Yevmenkin /* 94baeef614SMaksim Yevmenkin * Bluetooth HCI functions 95baeef614SMaksim Yevmenkin */ 96baeef614SMaksim Yevmenkin 97baeef614SMaksim Yevmenkin #define HCI_DEVMAX 32 /* arbitrary */ 98baeef614SMaksim Yevmenkin #define HCI_DEVNAME_SIZE NG_NODESIZ 99baeef614SMaksim Yevmenkin #define HCI_DEVFEATURES_SIZE NG_HCI_FEATURES_SIZE 100baeef614SMaksim Yevmenkin 101baeef614SMaksim Yevmenkin struct bt_devinfo 102baeef614SMaksim Yevmenkin { 103baeef614SMaksim Yevmenkin char devname[HCI_DEVNAME_SIZE]; 104baeef614SMaksim Yevmenkin 105baeef614SMaksim Yevmenkin uint32_t state; /* device/implementation specific */ 106baeef614SMaksim Yevmenkin 107baeef614SMaksim Yevmenkin bdaddr_t bdaddr; 108baeef614SMaksim Yevmenkin uint16_t _reserved0; 109baeef614SMaksim Yevmenkin 110baeef614SMaksim Yevmenkin uint8_t features[HCI_DEVFEATURES_SIZE]; 111baeef614SMaksim Yevmenkin 112baeef614SMaksim Yevmenkin /* buffer info */ 113baeef614SMaksim Yevmenkin uint16_t _reserved1; 114baeef614SMaksim Yevmenkin uint16_t cmd_free; 115baeef614SMaksim Yevmenkin uint16_t sco_size; 116baeef614SMaksim Yevmenkin uint16_t sco_pkts; 117baeef614SMaksim Yevmenkin uint16_t sco_free; 118baeef614SMaksim Yevmenkin uint16_t acl_size; 119baeef614SMaksim Yevmenkin uint16_t acl_pkts; 120baeef614SMaksim Yevmenkin uint16_t acl_free; 121baeef614SMaksim Yevmenkin 122baeef614SMaksim Yevmenkin /* stats */ 123baeef614SMaksim Yevmenkin uint32_t cmd_sent; 124baeef614SMaksim Yevmenkin uint32_t evnt_recv; 125baeef614SMaksim Yevmenkin uint32_t acl_recv; 126baeef614SMaksim Yevmenkin uint32_t acl_sent; 127baeef614SMaksim Yevmenkin uint32_t sco_recv; 128baeef614SMaksim Yevmenkin uint32_t sco_sent; 129baeef614SMaksim Yevmenkin uint32_t bytes_recv; 130baeef614SMaksim Yevmenkin uint32_t bytes_sent; 131baeef614SMaksim Yevmenkin 132baeef614SMaksim Yevmenkin /* misc/specific */ 133baeef614SMaksim Yevmenkin uint16_t link_policy_info; 134baeef614SMaksim Yevmenkin uint16_t packet_type_info; 135baeef614SMaksim Yevmenkin uint16_t role_switch_info; 136baeef614SMaksim Yevmenkin uint16_t debug; 137baeef614SMaksim Yevmenkin 138baeef614SMaksim Yevmenkin uint8_t _padding[20]; /* leave space for future additions */ 139baeef614SMaksim Yevmenkin }; 140baeef614SMaksim Yevmenkin 14178b96635SMaksim Yevmenkin struct bt_devreq 14278b96635SMaksim Yevmenkin { 14378b96635SMaksim Yevmenkin uint16_t opcode; 14478b96635SMaksim Yevmenkin uint8_t event; 14578b96635SMaksim Yevmenkin void *cparam; 14678b96635SMaksim Yevmenkin size_t clen; 14778b96635SMaksim Yevmenkin void *rparam; 14878b96635SMaksim Yevmenkin size_t rlen; 14978b96635SMaksim Yevmenkin }; 15078b96635SMaksim Yevmenkin 15178b96635SMaksim Yevmenkin struct bt_devfilter { 15278b96635SMaksim Yevmenkin bitstr_t bit_decl(packet_mask, 8); 15378b96635SMaksim Yevmenkin bitstr_t bit_decl(event_mask, 256); 15478b96635SMaksim Yevmenkin }; 15578b96635SMaksim Yevmenkin 15678b96635SMaksim Yevmenkin struct bt_devinquiry { 15778b96635SMaksim Yevmenkin bdaddr_t bdaddr; 15878b96635SMaksim Yevmenkin uint8_t pscan_rep_mode; 15978b96635SMaksim Yevmenkin uint8_t pscan_period_mode; 16078b96635SMaksim Yevmenkin uint8_t dev_class[3]; 16178b96635SMaksim Yevmenkin uint16_t clock_offset; 16278b96635SMaksim Yevmenkin int8_t rssi; 16378b96635SMaksim Yevmenkin uint8_t data[240]; 16478b96635SMaksim Yevmenkin }; 16578b96635SMaksim Yevmenkin 166baeef614SMaksim Yevmenkin typedef int (bt_devenum_cb_t)(int, struct bt_devinfo const *, void *); 167baeef614SMaksim Yevmenkin 16878b96635SMaksim Yevmenkin int bt_devopen (char const *devname); 16978b96635SMaksim Yevmenkin int bt_devclose(int s); 17078b96635SMaksim Yevmenkin int bt_devsend (int s, uint16_t opcode, void *param, size_t plen); 17178b96635SMaksim Yevmenkin ssize_t bt_devrecv (int s, void *buf, size_t size, time_t to); 17278b96635SMaksim Yevmenkin int bt_devreq (int s, struct bt_devreq *r, time_t to); 173808de0aeSMaksim Yevmenkin int bt_devfilter(int s, struct bt_devfilter const *newp, 174808de0aeSMaksim Yevmenkin struct bt_devfilter *oldp); 17578b96635SMaksim Yevmenkin void bt_devfilter_pkt_set(struct bt_devfilter *filter, uint8_t type); 17678b96635SMaksim Yevmenkin void bt_devfilter_pkt_clr(struct bt_devfilter *filter, uint8_t type); 17778b96635SMaksim Yevmenkin int bt_devfilter_pkt_tst(struct bt_devfilter const *filter, uint8_t type); 17878b96635SMaksim Yevmenkin void bt_devfilter_evt_set(struct bt_devfilter *filter, uint8_t event); 17978b96635SMaksim Yevmenkin void bt_devfilter_evt_clr(struct bt_devfilter *filter, uint8_t event); 18078b96635SMaksim Yevmenkin int bt_devfilter_evt_tst(struct bt_devfilter const *filter, uint8_t event); 18178b96635SMaksim Yevmenkin int bt_devinquiry(char const *devname, time_t length, int num_rsp, 18278b96635SMaksim Yevmenkin struct bt_devinquiry **ii); 183baeef614SMaksim Yevmenkin int bt_devinfo (struct bt_devinfo *di); 18434fe534bSBrooks Davis int bt_devenum (bt_devenum_cb_t cb, void *arg); 185baeef614SMaksim Yevmenkin 18655034c7dSMaksim Yevmenkin /* 18755034c7dSMaksim Yevmenkin * bdaddr utility functions (from NetBSD) 18855034c7dSMaksim Yevmenkin */ 18955034c7dSMaksim Yevmenkin 19055034c7dSMaksim Yevmenkin static __inline int 19155034c7dSMaksim Yevmenkin bdaddr_same(const bdaddr_t *a, const bdaddr_t *b) 19255034c7dSMaksim Yevmenkin { 19355034c7dSMaksim Yevmenkin return (a->b[0] == b->b[0] && a->b[1] == b->b[1] && 19455034c7dSMaksim Yevmenkin a->b[2] == b->b[2] && a->b[3] == b->b[3] && 19555034c7dSMaksim Yevmenkin a->b[4] == b->b[4] && a->b[5] == b->b[5]); 19655034c7dSMaksim Yevmenkin } 19755034c7dSMaksim Yevmenkin 19855034c7dSMaksim Yevmenkin static __inline int 19955034c7dSMaksim Yevmenkin bdaddr_any(const bdaddr_t *a) 20055034c7dSMaksim Yevmenkin { 20155034c7dSMaksim Yevmenkin return (a->b[0] == 0 && a->b[1] == 0 && a->b[2] == 0 && 20255034c7dSMaksim Yevmenkin a->b[3] == 0 && a->b[4] == 0 && a->b[5] == 0); 20355034c7dSMaksim Yevmenkin } 20455034c7dSMaksim Yevmenkin 20555034c7dSMaksim Yevmenkin static __inline void 20655034c7dSMaksim Yevmenkin bdaddr_copy(bdaddr_t *d, const bdaddr_t *s) 20755034c7dSMaksim Yevmenkin { 20855034c7dSMaksim Yevmenkin d->b[0] = s->b[0]; 20955034c7dSMaksim Yevmenkin d->b[1] = s->b[1]; 21055034c7dSMaksim Yevmenkin d->b[2] = s->b[2]; 21155034c7dSMaksim Yevmenkin d->b[3] = s->b[3]; 21255034c7dSMaksim Yevmenkin d->b[4] = s->b[4]; 21355034c7dSMaksim Yevmenkin d->b[5] = s->b[5]; 21455034c7dSMaksim Yevmenkin } 21555034c7dSMaksim Yevmenkin 2160986ab12SMaksim Yevmenkin __END_DECLS 2170986ab12SMaksim Yevmenkin 2180986ab12SMaksim Yevmenkin #endif /* ndef _BLUETOOTH_H_ */ 2190986ab12SMaksim Yevmenkin 220