Module Name: src Committed By: plunky Date: Tue May 12 21:08:30 UTC 2009
Modified Files: src/usr.sbin/btpand: bnep.c btpand.c btpand.h channel.c client.c server.c tap.c Log Message: rework the channel shutdown code path, each channel now has its own action to process which separates the server and client code. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/btpand/bnep.c cvs rdiff -u -r1.2 -r1.3 src/usr.sbin/btpand/btpand.c \ src/usr.sbin/btpand/channel.c src/usr.sbin/btpand/client.c \ src/usr.sbin/btpand/server.c cvs rdiff -u -r1.1 -r1.2 src/usr.sbin/btpand/btpand.h cvs rdiff -u -r1.3 -r1.4 src/usr.sbin/btpand/tap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/btpand/bnep.c diff -u src/usr.sbin/btpand/bnep.c:1.7 src/usr.sbin/btpand/bnep.c:1.8 --- src/usr.sbin/btpand/bnep.c:1.7 Tue May 12 19:57:59 2009 +++ src/usr.sbin/btpand/bnep.c Tue May 12 21:08:30 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: bnep.c,v 1.7 2009/05/12 19:57:59 plunky Exp $ */ +/* $NetBSD: bnep.c,v 1.8 2009/05/12 21:08:30 plunky Exp $ */ /*- * Copyright (c) 2008 Iain Hibbert @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: bnep.c,v 1.7 2009/05/12 19:57:59 plunky Exp $"); +__RCSID("$NetBSD: bnep.c,v 1.8 2009/05/12 21:08:30 plunky Exp $"); #include <bluetooth.h> #include <sdp.h> @@ -293,8 +293,8 @@ type = *ptr++; log_err("received Control Command Not Understood (0x%2.2x)", type); - /* we didn't send any reserved commands, just cut them off */ - channel_close(chan); + /* we didn't send any reserved commands, just shut them down */ + chan->down(chan); return 1; } @@ -395,7 +395,7 @@ chan->state = CHANNEL_OPEN; channel_timeout(chan, 0); } else { - channel_close(chan); + chan->down(chan); } return 2; Index: src/usr.sbin/btpand/btpand.c diff -u src/usr.sbin/btpand/btpand.c:1.2 src/usr.sbin/btpand/btpand.c:1.3 --- src/usr.sbin/btpand/btpand.c:1.2 Wed Apr 15 00:38:07 2009 +++ src/usr.sbin/btpand/btpand.c Tue May 12 21:08:30 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: btpand.c,v 1.2 2009/04/15 00:38:07 lukem Exp $ */ +/* $NetBSD: btpand.c,v 1.3 2009/05/12 21:08:30 plunky Exp $ */ /*- * Copyright (c) 2008 Iain Hibbert @@ -27,7 +27,7 @@ #include <sys/cdefs.h> __COPYRIGHT("@(#) Copyright (c) 2008 Iain Hibbert. All rights reserved."); -__RCSID("$NetBSD: btpand.c,v 1.2 2009/04/15 00:38:07 lukem Exp $"); +__RCSID("$NetBSD: btpand.c,v 1.3 2009/05/12 21:08:30 plunky Exp $"); #include <sys/wait.h> @@ -204,8 +204,8 @@ openlog(getprogname(), LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_DAEMON); channel_init(); - server_init(); event_init(); + server_init(); client_init(); tap_init(); Index: src/usr.sbin/btpand/channel.c diff -u src/usr.sbin/btpand/channel.c:1.2 src/usr.sbin/btpand/channel.c:1.3 --- src/usr.sbin/btpand/channel.c:1.2 Sat May 2 20:07:51 2009 +++ src/usr.sbin/btpand/channel.c Tue May 12 21:08:30 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: channel.c,v 1.2 2009/05/02 20:07:51 plunky Exp $ */ +/* $NetBSD: channel.c,v 1.3 2009/05/12 21:08:30 plunky Exp $ */ /*- * Copyright (c) 2008 Iain Hibbert @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: channel.c,v 1.2 2009/05/02 20:07:51 plunky Exp $"); +__RCSID("$NetBSD: channel.c,v 1.3 2009/05/12 21:08:30 plunky Exp $"); #include <sys/ioctl.h> @@ -35,7 +35,6 @@ #include "btpand.h" static struct chlist channel_list; -static int channel_count; static int channel_tick; static void channel_start(int, short, void *); @@ -66,8 +65,6 @@ chan->state = CHANNEL_CLOSED; LIST_INSERT_HEAD(&channel_list, chan, next); - server_update(++channel_count); - return chan; } @@ -78,6 +75,9 @@ assert(chan->refcnt == 0); assert(chan->state != CHANNEL_CLOSED); + assert(chan->send != NULL); + assert(chan->recv != NULL); + assert(chan->down != NULL); if (chan->mtu > 0) { chan->sendbuf = malloc(chan->mtu); @@ -149,13 +149,6 @@ free(chan->mfilter); free(chan->sendbuf); free(chan); - - server_update(--channel_count); - - if (server_limit == 0) { - log_info("connection closed, exiting"); - exit(EXIT_SUCCESS); - } } static void @@ -173,7 +166,7 @@ if (chan->send(chan, ph->data) == false) { if (event_add(&chan->wr_ev, NULL) == -1) { log_err("Could not add channel write event: %m"); - channel_close(chan); + chan->down(chan); } return; } @@ -196,7 +189,7 @@ pkt = packet_alloc(chan); if (pkt == NULL) { - channel_close(chan); + chan->down(chan); return; } @@ -204,13 +197,13 @@ if (nr == -1) { log_err("channel read error: %m"); packet_free(pkt); - channel_close(chan); + chan->down(chan); return; } if (nr == 0) { /* EOF */ log_debug("(fd#%d) EOF", fd); packet_free(pkt); - channel_close(chan); + chan->down(chan); return; } pkt->len = nr; @@ -314,7 +307,7 @@ next = LIST_NEXT(chan, next); if (chan->tick == tick) - channel_close(chan); + chan->down(chan); else if (chan->tick != 0) channel_tick = tick; } Index: src/usr.sbin/btpand/client.c diff -u src/usr.sbin/btpand/client.c:1.2 src/usr.sbin/btpand/client.c:1.3 --- src/usr.sbin/btpand/client.c:1.2 Sat Dec 6 20:01:14 2008 +++ src/usr.sbin/btpand/client.c Tue May 12 21:08:30 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: client.c,v 1.2 2008/12/06 20:01:14 plunky Exp $ */ +/* $NetBSD: client.c,v 1.3 2009/05/12 21:08:30 plunky Exp $ */ /*- * Copyright (c) 2008 Iain Hibbert @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: client.c,v 1.2 2008/12/06 20:01:14 plunky Exp $"); +__RCSID("$NetBSD: client.c,v 1.3 2009/05/12 21:08:30 plunky Exp $"); #include <bluetooth.h> #include <errno.h> @@ -37,6 +37,7 @@ #include "bnep.h" #include "sdp.h" +static void client_down(channel_t *); static void client_query(void); void @@ -118,6 +119,7 @@ chan->send = bnep_send; chan->recv = bnep_recv; + chan->down = client_down; chan->mru = mru; chan->mtu = mtu; b2eaddr(chan->raddr, &remote_bdaddr); @@ -132,6 +134,14 @@ } static void +client_down(channel_t *chan) +{ + + log_err("Client connection shut down, exiting"); + exit(EXIT_FAILURE); +} + +static void client_query(void) { uint8_t buffer[512]; Index: src/usr.sbin/btpand/server.c diff -u src/usr.sbin/btpand/server.c:1.2 src/usr.sbin/btpand/server.c:1.3 --- src/usr.sbin/btpand/server.c:1.2 Sat Jan 24 17:29:28 2009 +++ src/usr.sbin/btpand/server.c Tue May 12 21:08:30 2009 @@ -1,7 +1,7 @@ -/* $NetBSD: server.c,v 1.2 2009/01/24 17:29:28 plunky Exp $ */ +/* $NetBSD: server.c,v 1.3 2009/05/12 21:08:30 plunky Exp $ */ /*- - * Copyright (c) 2008 Iain Hibbert + * Copyright (c) 2008-2009 Iain Hibbert * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: server.c,v 1.2 2009/01/24 17:29:28 plunky Exp $"); +__RCSID("$NetBSD: server.c,v 1.3 2009/05/12 21:08:30 plunky Exp $"); #include <sys/ioctl.h> @@ -39,59 +39,39 @@ #include "bnep.h" static struct event server_ev; -static int server_fd; -static int server_avail; +static int server_count; static void * server_ss; static uint32_t server_handle; static void server_open(void); -static void server_close(void); static void server_read(int, short, void *); -static void server_register(void); +static void server_down(channel_t *); +static void server_update(void); void server_init(void) { - server_fd = -1; -} - -/* - * The server_update() function is called whenever the channel count is - * changed. We maintain the SDP record and open or close the server socket - * as required. - */ -void -server_update(int count) -{ - if (server_limit == 0) return; - log_debug("count %d", count); - - server_avail = UINT8_MAX - (count - 1) * UINT8_MAX / server_limit; - log_info("Service Availability: %d/%d", server_avail, UINT8_MAX); - - if (server_avail == 0 && server_fd != -1) - server_close(); - - if (server_avail > 0 && server_fd == -1) - server_open(); - - if (service_name) - server_register(); + server_open(); + server_update(); } +/* + * Start listening on server socket + */ static void server_open(void) { struct sockaddr_bt sa; uint16_t mru; + int fd; - server_fd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); - if (server_fd == -1) { + fd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); + if (fd == -1) { log_err("Could not open L2CAP socket: %m"); exit(EXIT_FAILURE); } @@ -101,30 +81,30 @@ sa.bt_len = sizeof(sa); sa.bt_psm = l2cap_psm; bdaddr_copy(&sa.bt_bdaddr, &local_bdaddr); - if (bind(server_fd, (struct sockaddr *)&sa, sizeof(sa)) == -1) { + if (bind(fd, (struct sockaddr *)&sa, sizeof(sa)) == -1) { log_err("Could not bind server socket: %m"); exit(EXIT_FAILURE); } - if (setsockopt(server_fd, BTPROTO_L2CAP, + if (setsockopt(fd, BTPROTO_L2CAP, SO_L2CAP_LM, &l2cap_mode, sizeof(l2cap_mode)) == -1) { log_err("Could not set link mode (0x%4.4x): %m", l2cap_mode); exit(EXIT_FAILURE); } mru = BNEP_MTU_MIN; - if (setsockopt(server_fd, BTPROTO_L2CAP, + if (setsockopt(fd, BTPROTO_L2CAP, SO_L2CAP_IMTU, &mru, sizeof(mru)) == -1) { log_err("Could not set L2CAP IMTU (%d): %m", mru); exit(EXIT_FAILURE); } - if (listen(server_fd, 0) == -1) { + if (listen(fd, 0) == -1) { log_err("Could not listen on server socket: %m"); exit(EXIT_FAILURE); } - event_set(&server_ev, server_fd, EV_READ | EV_PERSIST, server_read, NULL); + event_set(&server_ev, fd, EV_READ | EV_PERSIST, server_read, NULL); if (event_add(&server_ev, NULL) == -1) { log_err("Could not add server event: %m"); exit(EXIT_FAILURE); @@ -133,17 +113,6 @@ log_info("server socket open"); } -static void -server_close(void) -{ - - event_del(&server_ev); - close(server_fd); - server_fd = -1; - - log_info("server socket closed"); -} - /* * handle connection request */ @@ -156,6 +125,8 @@ int fd, n; uint16_t mru, mtu; + assert(server_count < server_limit); + len = sizeof(ra); fd = accept(s, (struct sockaddr *)&ra, &len); if (fd == -1) @@ -232,6 +203,7 @@ chan->send = bnep_send; chan->recv = bnep_recv; + chan->down = server_down; chan->mru = mru; chan->mtu = mtu; b2eaddr(chan->raddr, &ra.bt_bdaddr); @@ -244,14 +216,43 @@ close(fd); return; } + + if (++server_count == server_limit) { + log_info("Server limit reached, closing server socket"); + event_del(&server_ev); + close(s); + } + + server_update(); +} + +/* + * Shut down a server channel, we need to update the service record and + * may want to restart accepting connections on the server socket + */ +static void +server_down(channel_t *chan) +{ + + assert(server_count > 0); + + channel_close(chan); + + if (server_count-- == server_limit) + server_open(); + + server_update(); } static void -server_register(void) +server_update(void) { sdp_nap_profile_t p; int rv; + if (service_name == NULL) + return; + if (server_ss == NULL) { server_ss = sdp_open_local(control_path); if (server_ss == NULL || sdp_error(server_ss) != 0) { @@ -262,7 +263,7 @@ memset(&p, 0, sizeof(p)); p.psm = l2cap_psm; - p.load_factor = server_avail; + p.load_factor = (UINT8_MAX - server_count * UINT8_MAX / server_limit); p.security_description = (l2cap_mode == 0 ? 0x0000 : 0x0001); if (server_handle) Index: src/usr.sbin/btpand/btpand.h diff -u src/usr.sbin/btpand/btpand.h:1.1 src/usr.sbin/btpand/btpand.h:1.2 --- src/usr.sbin/btpand/btpand.h:1.1 Sun Aug 17 13:20:57 2008 +++ src/usr.sbin/btpand/btpand.h Tue May 12 21:08:30 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: btpand.h,v 1.1 2008/08/17 13:20:57 plunky Exp $ */ +/* $NetBSD: btpand.h,v 1.2 2009/05/12 21:08:30 plunky Exp $ */ /*- * Copyright (c) 2008 Iain Hibbert @@ -32,8 +32,8 @@ #include <net/if_ether.h> #include <assert.h> -#include <event.h> #include <bluetooth.h> +#include <event.h> #include <stdbool.h> #include <stdlib.h> #include <string.h> @@ -87,6 +87,7 @@ bool (*send)(channel_t *, packet_t *); bool (*recv)(packet_t *); + void (*down)(channel_t *); int tick; @@ -188,7 +189,6 @@ /* server.c */ void server_init(void); -void server_update(int); /* tap.c */ void tap_init(void); Index: src/usr.sbin/btpand/tap.c diff -u src/usr.sbin/btpand/tap.c:1.3 src/usr.sbin/btpand/tap.c:1.4 --- src/usr.sbin/btpand/tap.c:1.3 Sat May 2 20:07:51 2009 +++ src/usr.sbin/btpand/tap.c Tue May 12 21:08:30 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: tap.c,v 1.3 2009/05/02 20:07:51 plunky Exp $ */ +/* $NetBSD: tap.c,v 1.4 2009/05/12 21:08:30 plunky Exp $ */ /*- * Copyright (c) 2008 Iain Hibbert @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: tap.c,v 1.3 2009/05/02 20:07:51 plunky Exp $"); +__RCSID("$NetBSD: tap.c,v 1.4 2009/05/12 21:08:30 plunky Exp $"); #include <sys/ioctl.h> #include <sys/uio.h> @@ -42,6 +42,7 @@ static bool tap_send(channel_t *, packet_t *); static bool tap_recv(packet_t *); +static void tap_down(channel_t *); void tap_init(void) @@ -110,6 +111,7 @@ chan->send = tap_send; chan->recv = tap_recv; + chan->down = tap_down; chan->mru = ETHER_HDR_LEN + ETHER_MAX_LEN; memcpy(chan->raddr, LLADDR(sdl), ETHER_ADDR_LEN); memcpy(chan->laddr, LLADDR(sdl), ETHER_ADDR_LEN); @@ -159,3 +161,10 @@ return true; } + +static void +tap_down(channel_t *chan) +{ + + /* we never close the tap channel */ +}