server.c (7718ced0ea98ea5d1ece76c36a955eec9d97dc52) server.c (905033dc11714a0471d8fd790720304f6937613a)
1/* $NetBSD: server.c,v 1.1 2008/08/17 13:20:57 plunky Exp $ */
1/* $NetBSD: server.c,v 1.2 2009/01/24 17:29:28 plunky Exp $ */
2
3/*-
4 * Copyright (c) 2008 Iain Hibbert
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:

--- 13 unchanged lines hidden (view full) ---

23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28/* $FreeBSD$ */
29
30#include <sys/cdefs.h>
2
3/*-
4 * Copyright (c) 2008 Iain Hibbert
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:

--- 13 unchanged lines hidden (view full) ---

23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28/* $FreeBSD$ */
29
30#include <sys/cdefs.h>
31__RCSID("$NetBSD: server.c,v 1.1 2008/08/17 13:20:57 plunky Exp $");
31__RCSID("$NetBSD: server.c,v 1.2 2009/01/24 17:29:28 plunky Exp $");
32
33#include <sys/ioctl.h>
34
35#include <bluetooth.h>
32
33#include <sys/ioctl.h>
34
35#include <bluetooth.h>
36#include <inttypes.h>
36#include <errno.h>
37#include <sdp.h>
38#include <unistd.h>
39
40#include "btpand.h"
41#include "bnep.h"
42
43static struct event server_ev;
44static int server_fd;
37#include <errno.h>
38#include <sdp.h>
39#include <unistd.h>
40
41#include "btpand.h"
42#include "bnep.h"
43
44static struct event server_ev;
45static int server_fd;
45static int server_load;
46static int server_avail;
46
47static void * server_ss;
48static uint32_t server_handle;
49
50static void server_open(void);
51static void server_close(void);
52static void server_read(int, short, void *);
53static void server_register(void);

--- 14 unchanged lines hidden (view full) ---

68server_update(int count)
69{
70
71 if (server_limit == 0)
72 return;
73
74 log_debug("count %d", count);
75
47
48static void * server_ss;
49static uint32_t server_handle;
50
51static void server_open(void);
52static void server_close(void);
53static void server_read(int, short, void *);
54static void server_register(void);

--- 14 unchanged lines hidden (view full) ---

69server_update(int count)
70{
71
72 if (server_limit == 0)
73 return;
74
75 log_debug("count %d", count);
76
76 server_load = (count - 1) * 100 / server_limit;
77 log_info("server_load: %d%%", server_load);
77 server_avail = UINT8_MAX - (count - 1) * UINT8_MAX / server_limit;
78 log_info("Service Availability: %d/%d", server_avail, UINT8_MAX);
78
79
79 if (server_load > 99 && server_fd != -1)
80 if (server_avail == 0 && server_fd != -1)
80 server_close();
81
81 server_close();
82
82 if (server_load < 100 && server_fd == -1)
83 if (server_avail > 0 && server_fd == -1)
83 server_open();
84
85 if (service_name)
86 server_register();
87}
88
89static void
90server_open(void)

--- 161 unchanged lines hidden (view full) ---

252 server_ss = sdp_open_local(control_path);
253 if (server_ss == NULL || sdp_error(server_ss) != 0) {
254 log_err("failed to contact SDP server");
255 return;
256 }
257 }
258
259 memset(&p, 0, sizeof(p));
84 server_open();
85
86 if (service_name)
87 server_register();
88}
89
90static void
91server_open(void)

--- 161 unchanged lines hidden (view full) ---

253 server_ss = sdp_open_local(control_path);
254 if (server_ss == NULL || sdp_error(server_ss) != 0) {
255 log_err("failed to contact SDP server");
256 return;
257 }
258 }
259
260 memset(&p, 0, sizeof(p));
260
261 p.psm = l2cap_psm;
261 p.psm = l2cap_psm;
262 p.load_factor = server_avail;
263 p.security_description = (l2cap_mode == 0 ? 0x0000 : 0x0001);
262
264
263 if (server_load < 1) p.load_factor = 0;
264 else if (server_load <= 17) p.load_factor = 1;
265 else if (server_load <= 33) p.load_factor = 2;
266 else if (server_load <= 50) p.load_factor = 3;
267 else if (server_load <= 67) p.load_factor = 4;
268 else if (server_load <= 83) p.load_factor = 5;
269 else if (server_load <= 99) p.load_factor = 6;
270 else p.load_factor = 7;
271
272 if (l2cap_mode != 0) p.security_description = 0x0001;
273
274 if (server_handle)
275 rv = sdp_change_service(server_ss, server_handle,
276 (uint8_t *)&p, sizeof(p));
277 else
278 rv = sdp_register_service(server_ss, service_class,
279 &local_bdaddr, (uint8_t *)&p, sizeof(p), &server_handle);
280
281 if (rv != 0) {
282 errno = sdp_error(server_ss);
283 log_err("%s: %m", service_name);
284 exit(EXIT_FAILURE);
285 }
286}
265 if (server_handle)
266 rv = sdp_change_service(server_ss, server_handle,
267 (uint8_t *)&p, sizeof(p));
268 else
269 rv = sdp_register_service(server_ss, service_class,
270 &local_bdaddr, (uint8_t *)&p, sizeof(p), &server_handle);
271
272 if (rv != 0) {
273 errno = sdp_error(server_ss);
274 log_err("%s: %m", service_name);
275 exit(EXIT_FAILURE);
276 }
277}