#ifndef _NETGRAPH_BTSOCKET_RFCOMM_H_
#define _NETGRAPH_BTSOCKET_RFCOMM_H_
#define RFCOMM_DEFAULT_MTU 667
#define RFCOMM_MAX_MTU 1024
#define RFCOMM_DEFAULT_CREDITS 7
#define RFCOMM_MAX_CREDITS 40
#define RFCOMM_FRAME_SABM 0x2f
#define RFCOMM_FRAME_DISC 0x43
#define RFCOMM_FRAME_UA 0x63
#define RFCOMM_FRAME_DM 0x0f
#define RFCOMM_FRAME_UIH 0xef
#define RFCOMM_MCC_TEST 0x08
#define RFCOMM_MCC_FCON 0x28
#define RFCOMM_MCC_FCOFF 0x18
#define RFCOMM_MCC_MSC 0x38
#define RFCOMM_MCC_RPN 0x24
#define RFCOMM_MCC_RLS 0x14
#define RFCOMM_MCC_PN 0x20
#define RFCOMM_MCC_NSC 0x04
#define RFCOMM_MODEM_FC 0x02
#define RFCOMM_MODEM_RTC 0x04
#define RFCOMM_MODEM_RTR 0x08
#define RFCOMM_MODEM_IC 0x40
#define RFCOMM_MODEM_DV 0x80
#define RFCOMM_RPN_BR_2400 0x0
#define RFCOMM_RPN_BR_4800 0x1
#define RFCOMM_RPN_BR_7200 0x2
#define RFCOMM_RPN_BR_9600 0x3
#define RFCOMM_RPN_BR_19200 0x4
#define RFCOMM_RPN_BR_38400 0x5
#define RFCOMM_RPN_BR_57600 0x6
#define RFCOMM_RPN_BR_115200 0x7
#define RFCOMM_RPN_BR_230400 0x8
#define RFCOMM_RPN_DATA_5 0x0
#define RFCOMM_RPN_DATA_6 0x2
#define RFCOMM_RPN_DATA_7 0x1
#define RFCOMM_RPN_DATA_8 0x3
#define RFCOMM_RPN_STOP_1 0
#define RFCOMM_RPN_STOP_15 1
#define RFCOMM_RPN_PARITY_NONE 0x0
#define RFCOMM_RPN_PARITY_ODD 0x4
#define RFCOMM_RPN_PARITY_EVEN 0x5
#define RFCOMM_RPN_PARITY_MARK 0x6
#define RFCOMM_RPN_PARITY_SPACE 0x7
#define RFCOMM_RPN_FLOW_NONE 0x00
#define RFCOMM_RPN_XON_CHAR 0x11
#define RFCOMM_RPN_XOFF_CHAR 0x13
#define RFCOMM_RPN_PM_BITRATE 0x0001
#define RFCOMM_RPN_PM_DATA 0x0002
#define RFCOMM_RPN_PM_STOP 0x0004
#define RFCOMM_RPN_PM_PARITY 0x0008
#define RFCOMM_RPN_PM_PARITY_TYPE 0x0010
#define RFCOMM_RPN_PM_XON 0x0020
#define RFCOMM_RPN_PM_XOFF 0x0040
#define RFCOMM_RPN_PM_FLOW 0x3F00
#define RFCOMM_RPN_PM_ALL 0x3F7F
struct rfcomm_frame_hdr
{
u_int8_t address;
u_int8_t control;
u_int8_t length;
} __attribute__ ((packed));
struct rfcomm_cmd_hdr
{
u_int8_t address;
u_int8_t control;
u_int8_t length;
u_int8_t fcs;
} __attribute__ ((packed));
struct rfcomm_mcc_hdr
{
u_int8_t type;
u_int8_t length;
} __attribute__ ((packed));
struct rfcomm_mcc_msc
{
u_int8_t address;
u_int8_t modem;
} __attribute__ ((packed));
struct rfcomm_mcc_rpn
{
u_int8_t dlci;
u_int8_t bit_rate;
u_int8_t line_settings;
u_int8_t flow_control;
u_int8_t xon_char;
u_int8_t xoff_char;
u_int16_t param_mask;
} __attribute__ ((packed));
struct rfcomm_mcc_rls
{
u_int8_t address;
u_int8_t status;
} __attribute__ ((packed));
struct rfcomm_mcc_pn
{
u_int8_t dlci;
u_int8_t flow_control;
u_int8_t priority;
u_int8_t ack_timer;
u_int16_t mtu;
u_int8_t max_retrans;
u_int8_t credits;
} __attribute__ ((packed));
#define RFCOMM_DLCI(b) (((b) & 0xfc) >> 2)
#define RFCOMM_CHANNEL(b) (((b) & 0xf8) >> 3)
#define RFCOMM_DIRECTION(b) (((b) & 0x04) >> 2)
#define RFCOMM_TYPE(b) (((b) & 0xef))
#define RFCOMM_EA(b) (((b) & 0x01))
#define RFCOMM_CR(b) (((b) & 0x02) >> 1)
#define RFCOMM_PF(b) (((b) & 0x10) >> 4)
#define RFCOMM_SRVCHANNEL(dlci) ((dlci) >> 1)
#define RFCOMM_MKADDRESS(cr, dlci) \
((((dlci) & 0x3f) << 2) | ((cr) << 1) | 0x01)
#define RFCOMM_MKCONTROL(type, pf) ((((type) & 0xef) | ((pf) << 4)))
#define RFCOMM_MKDLCI(dir, channel) ((((channel) & 0x1f) << 1) | (dir))
#define RFCOMM_MKLEN8(len) (((len) << 1) | 1)
#define RFCOMM_MKLEN16(len) ((len) << 1)
#define RFCOMM_MCC_TYPE(b) (((b) & 0xfc) >> 2)
#define RFCOMM_MCC_LENGTH(b) (((b) & 0xfe) >> 1)
#define RFCOMM_MKMCC_TYPE(cr, type) ((((type) << 2) | ((cr) << 1) | 0x01))
#define RFCOMM_RPN_DATA_BITS(line) ((line) & 0x3)
#define RFCOMM_RPN_STOP_BITS(line) (((line) >> 2) & 0x1)
#define RFCOMM_RPN_PARITY(line) (((line) >> 3) & 0x3)
#define RFCOMM_MKRPN_LINE_SETTINGS(data, stop, parity) \
(((data) & 0x3) | (((stop) & 0x1) << 2) | (((parity) & 0x3) << 3))
#define NG_BTSOCKET_RFCOMM_SENDSPACE \
(RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 2)
#define NG_BTSOCKET_RFCOMM_RECVSPACE \
(RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 2)
struct ng_btsocket_rfcomm_pcb;
struct ng_btsocket_rfcomm_session;
struct ng_btsocket_rfcomm_session {
struct socket *l2so;
u_int16_t state;
#define NG_BTSOCKET_RFCOMM_SESSION_CLOSED 0
#define NG_BTSOCKET_RFCOMM_SESSION_LISTENING 1
#define NG_BTSOCKET_RFCOMM_SESSION_CONNECTING 2
#define NG_BTSOCKET_RFCOMM_SESSION_CONNECTED 3
#define NG_BTSOCKET_RFCOMM_SESSION_OPEN 4
#define NG_BTSOCKET_RFCOMM_SESSION_DISCONNECTING 5
u_int16_t flags;
#define NG_BTSOCKET_RFCOMM_SESSION_INITIATOR (1 << 0)
#define NG_BTSOCKET_RFCOMM_SESSION_LFC (1 << 1)
#define NG_BTSOCKET_RFCOMM_SESSION_RFC (1 << 2)
#define INITIATOR(s) \
(((s)->flags & NG_BTSOCKET_RFCOMM_SESSION_INITIATOR)? 1 : 0)
u_int16_t mtu;
struct ng_bt_mbufq outq;
struct mtx session_mtx;
LIST_HEAD(, ng_btsocket_rfcomm_pcb) dlcs;
LIST_ENTRY(ng_btsocket_rfcomm_session) next;
};
typedef struct ng_btsocket_rfcomm_session ng_btsocket_rfcomm_session_t;
typedef struct ng_btsocket_rfcomm_session * ng_btsocket_rfcomm_session_p;
struct ng_btsocket_rfcomm_pcb {
struct socket *so;
struct ng_btsocket_rfcomm_session *session;
u_int16_t flags;
#define NG_BTSOCKET_RFCOMM_DLC_TIMO (1 << 0)
#define NG_BTSOCKET_RFCOMM_DLC_CFC (1 << 1)
#define NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT (1 << 2)
#define NG_BTSOCKET_RFCOMM_DLC_DETACHED (1 << 3)
#define NG_BTSOCKET_RFCOMM_DLC_SENDING (1 << 4)
u_int16_t state;
#define NG_BTSOCKET_RFCOMM_DLC_CLOSED 0
#define NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT 1
#define NG_BTSOCKET_RFCOMM_DLC_CONFIGURING 2
#define NG_BTSOCKET_RFCOMM_DLC_CONNECTING 3
#define NG_BTSOCKET_RFCOMM_DLC_CONNECTED 4
#define NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING 5
bdaddr_t src;
bdaddr_t dst;
u_int8_t channel;
u_int8_t dlci;
u_int8_t lmodem;
u_int8_t rmodem;
u_int16_t mtu;
int16_t rx_cred;
int16_t tx_cred;
struct mtx pcb_mtx;
struct callout timo;
LIST_ENTRY(ng_btsocket_rfcomm_pcb) session_next;
LIST_ENTRY(ng_btsocket_rfcomm_pcb) next;
};
typedef struct ng_btsocket_rfcomm_pcb ng_btsocket_rfcomm_pcb_t;
typedef struct ng_btsocket_rfcomm_pcb * ng_btsocket_rfcomm_pcb_p;
#define so2rfcomm_pcb(so) \
((struct ng_btsocket_rfcomm_pcb *)((so)->so_pcb))
#ifdef _KERNEL
void ng_btsocket_rfcomm_abort (struct socket *);
void ng_btsocket_rfcomm_close (struct socket *);
int ng_btsocket_rfcomm_accept (struct socket *, struct sockaddr *);
int ng_btsocket_rfcomm_attach (struct socket *, int, struct thread *);
int ng_btsocket_rfcomm_bind (struct socket *, struct sockaddr *,
struct thread *);
int ng_btsocket_rfcomm_connect (struct socket *, struct sockaddr *,
struct thread *);
int ng_btsocket_rfcomm_control (struct socket *, u_long, void *,
struct ifnet *, struct thread *);
int ng_btsocket_rfcomm_ctloutput (struct socket *, struct sockopt *);
void ng_btsocket_rfcomm_detach (struct socket *);
int ng_btsocket_rfcomm_disconnect (struct socket *);
int ng_btsocket_rfcomm_listen (struct socket *, int, struct thread *);
int ng_btsocket_rfcomm_peeraddr (struct socket *, struct sockaddr *);
int ng_btsocket_rfcomm_send (struct socket *, int, struct mbuf *,
struct sockaddr *, struct mbuf *,
struct thread *);
int ng_btsocket_rfcomm_sockaddr (struct socket *, struct sockaddr *);
#endif
#endif