bnep.h 4.42 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
  BNEP protocol definition for Linux Bluetooth stack (BlueZ).
  Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
	
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License, version 2, as
  published by the Free Software Foundation.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
*/

/*
 * $Id: bnep.h,v 1.5 2002/08/04 21:23:58 maxk Exp $
 */

#ifndef _BNEP_H
#define _BNEP_H

#include <linux/types.h>
27
#include <linux/crc32.h>
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
#include <net/bluetooth/bluetooth.h>

// Limits
#define BNEP_MAX_PROTO_FILTERS     5
#define BNEP_MAX_MULTICAST_FILTERS 20

// UUIDs
#define BNEP_BASE_UUID 0x0000000000001000800000805F9B34FB
#define BNEP_UUID16    0x02
#define BNEP_UUID32    0x04
#define BNEP_UUID128   0x16

#define BNEP_SVC_PANU  0x1115
#define BNEP_SVC_NAP   0x1116
#define BNEP_SVC_GN    0x1117

// Packet types
#define BNEP_GENERAL               0x00
#define BNEP_CONTROL               0x01
#define BNEP_COMPRESSED            0x02
#define BNEP_COMPRESSED_SRC_ONLY   0x03
#define BNEP_COMPRESSED_DST_ONLY   0x04

// Control types
#define BNEP_CMD_NOT_UNDERSTOOD    0x00
#define BNEP_SETUP_CONN_REQ        0x01
#define BNEP_SETUP_CONN_RSP        0x02
#define BNEP_FILTER_NET_TYPE_SET   0x03
#define BNEP_FILTER_NET_TYPE_RSP   0x04
#define BNEP_FILTER_MULTI_ADDR_SET 0x05
#define BNEP_FILTER_MULTI_ADDR_RSP 0x06

// Extension types
#define BNEP_EXT_CONTROL           0x00

// Response messages 
#define BNEP_SUCCESS               0x00

#define BNEP_CONN_INVALID_DST      0x01
#define BNEP_CONN_INVALID_SRC      0x02
#define BNEP_CONN_INVALID_SVC      0x03
#define BNEP_CONN_NOT_ALLOWED      0x04

#define BNEP_FILTER_UNSUPPORTED_REQ    0x01
#define BNEP_FILTER_INVALID_RANGE      0x02
#define BNEP_FILTER_INVALID_MCADDR     0x02
#define BNEP_FILTER_LIMIT_REACHED      0x03
#define BNEP_FILTER_DENIED_SECURITY    0x04

// L2CAP settings
#define BNEP_MTU         1691
#define BNEP_PSM	 0x0f
#define BNEP_FLUSH_TO    0xffff
#define BNEP_CONNECT_TO  15
#define BNEP_FILTER_TO   15

// Headers 
#define BNEP_TYPE_MASK	 0x7f
#define BNEP_EXT_HEADER	 0x80

struct bnep_setup_conn_req {
	__u8  type;
	__u8  ctrl;
	__u8  uuid_size;
	__u8  service[0];
} __attribute__((packed));

struct bnep_set_filter_req {
	__u8  type;
	__u8  ctrl;
	__u16 len;
	__u8  list[0];
} __attribute__((packed));

struct bnep_control_rsp {
	__u8  type;
	__u8  ctrl;
	__u16 resp;
} __attribute__((packed));

struct bnep_ext_hdr {
	__u8  type;
	__u8  len;
	__u8  data[0];
} __attribute__((packed));

114 115 116 117 118 119
/* BNEP ioctl defines */
#define BNEPCONNADD	_IOW('B', 200, int)
#define BNEPCONNDEL	_IOW('B', 201, int)
#define BNEPGETCONNLIST	_IOR('B', 210, int)
#define BNEPGETCONNINFO	_IOR('B', 211, int)

120 121 122 123 124 125
// Ioctl interface
#define BNEPCONADD      1
#define BNEPCONDEL      2
#define BNEPGETCONLIST  3
#define BNEPGETCONINFO  4

126
struct bnep_connadd_req {
127 128 129 130 131 132
	int   sock;       // Connected socket
	__u32 flags;
	__u16 role;
	char  device[16]; // Name of the Ethernet device
};

133
struct bnep_conndel_req {
134 135 136 137
	__u32 flags;
	__u8  dst[ETH_ALEN];
};

138
struct bnep_conninfo {
139 140 141 142 143 144 145
	__u32 flags;
	__u16 role;
	__u16 state;	
	__u8  dst[ETH_ALEN];
	char  device[16];
};

146
struct bnep_connlist_req {
147
	__u32  cnum;
148
	struct bnep_conninfo *ci;
149 150 151 152 153 154 155
};

struct bnep_proto_filter {
	__u16 start;
	__u16 end;
};

156 157 158 159
int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock);
int bnep_del_connection(struct bnep_conndel_req *req);
int bnep_get_connlist(struct bnep_connlist_req *req);
int bnep_get_conninfo(struct bnep_conninfo *ci);
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

// BNEP sessions
struct bnep_session {
	struct list_head list;
	
	unsigned int  role;
        unsigned long state;
        unsigned long flags;
	atomic_t      killed;

	struct ethhdr eh;
	struct msghdr msg;

	struct bnep_proto_filter proto_filter[BNEP_MAX_PROTO_FILTERS];
	u64    mc_filter;
	
	struct socket    *sock;
	struct net_device dev;
	struct net_device_stats stats;
};

int bnep_net_init(struct net_device *dev);
int bnep_sock_init(void);
int bnep_sock_cleanup(void);

static inline int bnep_mc_hash(__u8 *addr)
{
187
        return (crc32_be(~0, addr, ETH_ALEN) >> 26);
188 189 190
}

#endif