diff options
| author | Marcel Holtmann <marcel@holtmann.org> | 2008-08-04 20:58:34 +0200 | 
|---|---|---|
| committer | Marcel Holtmann <marcel@holtmann.org> | 2008-08-04 20:58:34 +0200 | 
| commit | 40372f9dc3ab115870a10343124216a041e55d17 (patch) | |
| tree | ef5bfa80e3f560cf6856fd7a0d5c27c75c2cefe0 /pand/bnep.c | |
| parent | 295eb0c879802eacff46cf3c962646363d81f6d3 (diff) | |
Move hidd pand and dund into compat directory
Diffstat (limited to 'pand/bnep.c')
| -rw-r--r-- | pand/bnep.c | 311 | 
1 files changed, 0 insertions, 311 deletions
diff --git a/pand/bnep.c b/pand/bnep.c deleted file mode 100644 index 604ed552..00000000 --- a/pand/bnep.c +++ /dev/null @@ -1,311 +0,0 @@ -/* - * - *  BlueZ - Bluetooth protocol stack for Linux - * - *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com> - *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org> - * - * - *  This program is free software; you can redistribute it and/or modify - *  it under the terms of the GNU General Public License as published by - *  the Free Software Foundation; either version 2 of the License, or - *  (at your option) any later version. - * - *  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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <errno.h> -#include <unistd.h> -#include <stdlib.h> -#include <sys/socket.h> -#include <sys/ioctl.h> - -#include <bluetooth/bluetooth.h> -#include <bluetooth/l2cap.h> -#include <bluetooth/bnep.h> - -#include <netinet/in.h> - -#include "pand.h" - -static int ctl; - -/* Compatibility with old ioctls */ -#define OLD_BNEPCONADD      1 -#define OLD_BNEPCONDEL      2 -#define OLD_BNEPGETCONLIST  3 -#define OLD_BNEPGETCONINFO  4 - -static unsigned long bnepconnadd; -static unsigned long bnepconndel; -static unsigned long bnepgetconnlist; -static unsigned long bnepgetconninfo; - -static struct { -	char     *str; -	uint16_t uuid; -} __svc[] = { -	{ "PANU", BNEP_SVC_PANU }, -	{ "NAP",  BNEP_SVC_NAP  }, -	{ "GN",   BNEP_SVC_GN   }, -	{ NULL } -}; - -int bnep_str2svc(char *svc, uint16_t *uuid) -{ -	int i; -	for (i = 0; __svc[i].str; i++) -		if (!strcasecmp(svc, __svc[i].str)) { -			*uuid = __svc[i].uuid; -			return 0; -		} -	return -1; -} - -char *bnep_svc2str(uint16_t uuid) -{ -	int i; -	for (i = 0; __svc[i].str; i++) -		if (__svc[i].uuid == uuid) -			return __svc[i].str; -	return NULL; -} - -int bnep_init(void) -{ -	ctl = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_BNEP); -	if (ctl < 0) { -		perror("Failed to open control socket"); -		return 1; -	} - -	/* Temporary ioctl compatibility hack */ -	{  -		struct bnep_connlist_req req; -		struct bnep_conninfo ci[1]; - -		req.cnum = 1; -		req.ci   = ci; - -		if (!ioctl(ctl, BNEPGETCONNLIST, &req)) { -			/* New ioctls */ -			bnepconnadd     = BNEPCONNADD; -			bnepconndel     = BNEPCONNDEL; -			bnepgetconnlist = BNEPGETCONNLIST; -			bnepgetconninfo = BNEPGETCONNINFO; -		} else { -			/* Old ioctls */ -			bnepconnadd     = OLD_BNEPCONADD; -			bnepconndel     = OLD_BNEPCONDEL; -			bnepgetconnlist = OLD_BNEPGETCONLIST; -			bnepgetconninfo = OLD_BNEPGETCONINFO; -		} -	} - -	return 0; -} - -int bnep_cleanup(void) -{ -	close(ctl); -	return 0; -} - -int bnep_show_connections(void) -{ -	struct bnep_connlist_req req; -	struct bnep_conninfo ci[48]; -	int i; - -	req.cnum = 48; -	req.ci   = ci; -	if (ioctl(ctl, bnepgetconnlist, &req)) { -		perror("Failed to get connection list"); -		return -1; -	} - -	for (i=0; i < req.cnum; i++) { -		printf("%s %s %s\n", ci[i].device, -			batostr((bdaddr_t *) ci[i].dst), -			bnep_svc2str(ci[i].role)); -	} -	return 0; -} - -int bnep_kill_connection(uint8_t *dst) -{ -	struct bnep_conndel_req req; - -	memcpy(req.dst, dst, ETH_ALEN); -	req.flags = 0; -	if (ioctl(ctl, bnepconndel, &req)) { -		perror("Failed to kill connection"); -		return -1; -	} -	return 0; -} - -int bnep_kill_all_connections(void) -{ -	struct bnep_connlist_req req; -	struct bnep_conninfo ci[48]; -	int i; - -	req.cnum = 48; -	req.ci   = ci; -	if (ioctl(ctl, bnepgetconnlist, &req)) { -		perror("Failed to get connection list"); -		return -1; -	} - -	for (i=0; i < req.cnum; i++) { -		struct bnep_conndel_req req; -		memcpy(req.dst, ci[i].dst, ETH_ALEN); -		req.flags = 0; -		ioctl(ctl, bnepconndel, &req); -	} -	return 0; -} - -static int bnep_connadd(int sk, uint16_t role, char *dev) -{ -	struct bnep_connadd_req req; - -	strncpy(req.device, dev, 16); -	req.device[15] = '\0'; -	req.sock = sk; -	req.role = role; -	if (ioctl(ctl, bnepconnadd, &req)) -		return -1; -	strncpy(dev, req.device, 16); -	return 0; -} - -struct __service_16 {  -	uint16_t dst; -	uint16_t src; -} __attribute__ ((packed)); - -struct __service_32 {  -	uint16_t unused1; -	uint16_t dst; -	uint16_t unused2; -	uint16_t src; -} __attribute__ ((packed)); - -struct __service_128 {  -	uint16_t unused1; -	uint16_t dst; -	uint16_t unused2[8]; -	uint16_t src; -	uint16_t unused3[7]; -} __attribute__ ((packed)); - -int bnep_accept_connection(int sk, uint16_t role, char *dev) -{ -	struct bnep_setup_conn_req *req; -	struct bnep_control_rsp *rsp; -	unsigned char pkt[BNEP_MTU]; -	int r; - -	r = recv(sk, pkt, BNEP_MTU, 0); -	if (r <= 0) -		return -1; - -	errno = EPROTO; - -	if (r < sizeof(*req)) -		return -1; - -	req = (void *) pkt; -	if (req->type != BNEP_CONTROL || req->ctrl != BNEP_SETUP_CONN_REQ) -		return -1; - -	/* FIXME: Check role UUIDs */ - -	rsp = (void *) pkt; -	rsp->type = BNEP_CONTROL; -	rsp->ctrl = BNEP_SETUP_CONN_RSP; -	rsp->resp = htons(BNEP_SUCCESS); -	if (send(sk, rsp, sizeof(*rsp), 0) < 0) -		return -1; - -	return bnep_connadd(sk, role, dev); -} - -/* Create BNEP connection  - * sk      - Connect L2CAP socket - * role    - Local role - * service - Remote service - * dev     - Network device (contains actual dev name on return) - */ -int bnep_create_connection(int sk, uint16_t role, uint16_t svc, char *dev) -{ -	struct bnep_setup_conn_req *req; -	struct bnep_control_rsp *rsp; -	struct __service_16 *s; -	unsigned char pkt[BNEP_MTU]; -	int r; - -	/* Send request */ -	req = (void *) pkt; -	req->type = BNEP_CONTROL; -	req->ctrl = BNEP_SETUP_CONN_REQ; -	req->uuid_size = 2;	/* 16bit UUID */ -	s = (void *) req->service; -	s->dst = htons(svc); -	s->src = htons(role); - -	if (send(sk, pkt, sizeof(*req) + sizeof(*s), 0) < 0) -		return -1; - -receive: -	/* Get response */ -	r = recv(sk, pkt, BNEP_MTU, 0); -	if (r <= 0) -		return -1; - -	errno = EPROTO; - -	if (r < sizeof(*rsp)) -		return -1; -	 -	rsp = (void *) pkt; -	if (rsp->type != BNEP_CONTROL) -		return -1; - -	if (rsp->ctrl != BNEP_SETUP_CONN_RSP) -		goto receive; - -	r = ntohs(rsp->resp); - -	switch (r) { -	case BNEP_SUCCESS: -		break; - -	case BNEP_CONN_INVALID_DST: -	case BNEP_CONN_INVALID_SRC: -	case BNEP_CONN_INVALID_SVC: -		errno = EPROTO; -		return -1; - -	case BNEP_CONN_NOT_ALLOWED: -		errno = EACCES; -		return -1; -	} - -	return bnep_connadd(sk, role, dev); -}  | 
