Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/usr.sbin/bluetooth/sdpd/nap.c
103874 views
1
/*
2
* nap.c
3
*/
4
5
/*-
6
* SPDX-License-Identifier: BSD-2-Clause
7
*
8
* Copyright (c) 2008 Maksim Yevmenkin <[email protected]>
9
* All rights reserved.
10
*
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions
13
* are met:
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in the
18
* documentation and/or other materials provided with the distribution.
19
*
20
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30
* SUCH DAMAGE.
31
*
32
* $Id: nap.c,v 1.1 2008/03/11 00:02:42 max Exp $
33
*/
34
35
#include <sys/queue.h>
36
#define L2CAP_SOCKET_CHECKED
37
#include <bluetooth.h>
38
#include <sdp.h>
39
#include <string.h>
40
#include "profile.h"
41
#include "provider.h"
42
43
static int32_t
44
nap_profile_create_service_class_id_list(
45
uint8_t *buf, uint8_t const * const eob,
46
uint8_t const *data, uint32_t datalen)
47
{
48
static uint16_t service_classes[] = {
49
SDP_SERVICE_CLASS_NAP
50
};
51
52
return (common_profile_create_service_class_id_list(
53
buf, eob,
54
(uint8_t const *) service_classes,
55
sizeof(service_classes)));
56
}
57
58
static int32_t
59
nap_profile_create_bluetooth_profile_descriptor_list(
60
uint8_t *buf, uint8_t const * const eob,
61
uint8_t const *data, uint32_t datalen)
62
{
63
static uint16_t profile_descriptor_list[] = {
64
SDP_SERVICE_CLASS_NAP,
65
0x0100
66
};
67
68
return (common_profile_create_bluetooth_profile_descriptor_list(
69
buf, eob,
70
(uint8_t const *) profile_descriptor_list,
71
sizeof(profile_descriptor_list)));
72
}
73
74
static int32_t
75
nap_profile_create_service_name(
76
uint8_t *buf, uint8_t const * const eob,
77
uint8_t const *data, uint32_t datalen)
78
{
79
static char service_name[] = "Network Access Point";
80
81
return (common_profile_create_string8(
82
buf, eob,
83
(uint8_t const *) service_name, strlen(service_name)));
84
}
85
86
static int32_t
87
nap_profile_create_service_description(
88
uint8_t *buf, uint8_t const * const eob,
89
uint8_t const *data, uint32_t datalen)
90
{
91
static char service_descr[] = "Personal Ad-hoc Network Service";
92
93
return (common_profile_create_string8(
94
buf, eob,
95
(uint8_t const *) service_descr,
96
strlen(service_descr)));
97
}
98
99
static int32_t
100
nap_profile_create_protocol_descriptor_list(
101
uint8_t *buf, uint8_t const * const eob,
102
uint8_t const *data, uint32_t datalen)
103
{
104
provider_p provider = (provider_p) data;
105
sdp_nap_profile_p nap = (sdp_nap_profile_p) provider->data;
106
107
return (bnep_profile_create_protocol_descriptor_list(
108
buf, eob, (uint8_t const *) &nap->psm,
109
sizeof(nap->psm)));
110
}
111
112
static int32_t
113
nap_profile_create_security_description(
114
uint8_t *buf, uint8_t const * const eob,
115
uint8_t const *data, uint32_t datalen)
116
{
117
provider_p provider = (provider_p) data;
118
sdp_nap_profile_p nap = (sdp_nap_profile_p) provider->data;
119
120
return (bnep_profile_create_security_description(buf, eob,
121
(uint8_t const *) &nap->security_description,
122
sizeof(nap->security_description)));
123
}
124
125
static int32_t
126
nap_profile_create_net_access_type(
127
uint8_t *buf, uint8_t const * const eob,
128
uint8_t const *data, uint32_t datalen)
129
{
130
provider_p provider = (provider_p) data;
131
sdp_nap_profile_p nap = (sdp_nap_profile_p) provider->data;
132
133
if (buf + 3 > eob)
134
return (-1);
135
136
SDP_PUT8(SDP_DATA_UINT16, buf);
137
SDP_PUT16(nap->net_access_type, buf);
138
139
return (3);
140
}
141
142
static int32_t
143
nap_profile_create_max_net_access_rate(
144
uint8_t *buf, uint8_t const * const eob,
145
uint8_t const *data, uint32_t datalen)
146
{
147
provider_p provider = (provider_p) data;
148
sdp_nap_profile_p nap = (sdp_nap_profile_p) provider->data;
149
150
if (buf + 3 > eob)
151
return (-1);
152
153
SDP_PUT8(SDP_DATA_UINT16, buf);
154
SDP_PUT16(nap->max_net_access_rate, buf);
155
156
return (3);
157
}
158
159
static int32_t
160
nap_profile_create_service_availability(
161
uint8_t *buf, uint8_t const * const eob,
162
uint8_t const *data, uint32_t datalen)
163
{
164
provider_p provider = (provider_p) data;
165
sdp_nap_profile_p nap = (sdp_nap_profile_p) provider->data;
166
167
return (common_profile_create_service_availability(buf, eob,
168
&nap->load_factor, 1));
169
}
170
171
static int32_t
172
nap_profile_data_valid(uint8_t const *data, uint32_t datalen)
173
{
174
sdp_nap_profile_p nap = (sdp_nap_profile_p) data;
175
176
return ((nap->psm == 0)? 0 : 1);
177
}
178
179
static attr_t nap_profile_attrs[] = {
180
{ SDP_ATTR_SERVICE_RECORD_HANDLE,
181
common_profile_create_service_record_handle },
182
{ SDP_ATTR_SERVICE_CLASS_ID_LIST,
183
nap_profile_create_service_class_id_list },
184
{ SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST,
185
nap_profile_create_protocol_descriptor_list },
186
{ SDP_ATTR_LANGUAGE_BASE_ATTRIBUTE_ID_LIST,
187
common_profile_create_language_base_attribute_id_list },
188
{ SDP_ATTR_SERVICE_AVAILABILITY,
189
nap_profile_create_service_availability },
190
{ SDP_ATTR_BLUETOOTH_PROFILE_DESCRIPTOR_LIST,
191
nap_profile_create_bluetooth_profile_descriptor_list },
192
{ SDP_ATTR_PRIMARY_LANGUAGE_BASE_ID + SDP_ATTR_SERVICE_NAME_OFFSET,
193
nap_profile_create_service_name },
194
{ SDP_ATTR_PRIMARY_LANGUAGE_BASE_ID + SDP_ATTR_SERVICE_DESCRIPTION_OFFSET,
195
nap_profile_create_service_description },
196
{ SDP_ATTR_SECURITY_DESCRIPTION,
197
nap_profile_create_security_description },
198
{ SDP_ATTR_NET_ACCESS_TYPE,
199
nap_profile_create_net_access_type },
200
{ SDP_ATTR_MAX_NET_ACCESS_RATE,
201
nap_profile_create_max_net_access_rate },
202
{ 0, NULL } /* end entry */
203
};
204
205
profile_t nap_profile_descriptor = {
206
SDP_SERVICE_CLASS_NAP,
207
sizeof(sdp_nap_profile_t),
208
nap_profile_data_valid,
209
(attr_t const * const) &nap_profile_attrs
210
};
211
212
213