Subject: [PATCH] SDP patch to add support for HDP

This patch tries to simplify the way the SDP records for HDP are created. The
created functions allow adding supported features easily to an sdp record. The
are similar to sdp_set_profile_descs and sdp_get_profile_descs. I've also added
some macros to define new UUID's for HDP.


diff --git a/lib/sdp.c b/lib/sdp.c
index 822ec1a..93490e7 100644
--- a/lib/sdp.c
+++ b/lib/sdp.c
@@ -4621,3 +4621,82 @@ uint16_t sdp_gen_tid(sdp_session_t *session)
{
return session->tid++;
}
+
+/*
+* Set the supported features
+*/
+void sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf)
+{
+ const sdp_list_t *p, *r;
+ sdp_data_t *feat = NULL, *seq_feat = NULL;
+
+ int seqlen = sdp_list_len(sf);
+ void **seqDTDs = (void **)malloc (seqlen * sizeof(void *));
+ void **seqVals = (void **)malloc (seqlen * sizeof(void *));
+ int i = 0;
+
+ for (p = sf; p; p = p->next) {
+ int plen = sdp_list_len(p->data);
+ void **dtds = (void **)malloc (plen * sizeof(void *));
+ void **vals = (void **)malloc (plen * sizeof(void *));
+ int j = 0;
+ for (r=p->data; r; r = r->next) {
+ sdp_data_t *data = (sdp_data_t*)r->data;
+ dtds[j] = &data->dtd;
+ vals[j] = &data->val;
+ j++;
+ }
+ feat = sdp_seq_alloc(dtds, vals, plen);
+ free(dtds);
+ free(vals);
+
+ seqDTDs[i] = &feat->dtd;
+ seqVals[i] = feat;
+ i++;
+ }
+ seq_feat = sdp_seq_alloc(seqDTDs, seqVals, seqlen);
+
+ sdp_attr_replace(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seq_feat);
+}
+
+/*
+ * Get the supported features
+ * If an error occurred -1 is returned and errno is set
+ */
+int sdp_get_supp_feat (const sdp_record_t *rec, sdp_list_t **seqp)
+{
+
+ *seqp = NULL;
+ sdp_data_t * sdpdata = NULL;
+
+ sdpdata = sdp_data_get(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST);
+ if (sdpdata && sdpdata->dtd >= SDP_SEQ8 && sdpdata->dtd <= SDP_SEQ32) {
+ sdp_data_t *d;
+ for (d = sdpdata->val.dataseq; d; d = d->next) {
+ if ( d->dtd >= SDP_SEQ8 && d->dtd <= SDP_SEQ32 ) {
+ sdp_data_t *dd;
+ sdp_list_t *subseq = NULL;
+ for (dd = d->val.dataseq; dd; dd = dd->next) {
+ sdp_data_t *data;
+ if ( dd->dtd != SDP_UINT8 &&
+ dd->dtd != SDP_UINT16 &&
+ dd->dtd != SDP_TEXT_STR8)
+ goto fail;
+ data = sdp_data_alloc(dd->dtd, &dd->val);
+ subseq = sdp_list_append(subseq, data);
+ }
+ *seqp = sdp_list_append (*seqp, subseq);
+ } else
+ goto fail;
+ }
+ return 0;
+ }
+
+
+ return sdp_get_uuidseq_attr(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seqp);
+
+fail:
+ sdp_list_free(*seqp, free);
+ errno = EINVAL;
+ return -1;
+}
diff --git a/lib/sdp.h b/lib/sdp.h
index 375261e..1bb351a 100644
--- a/lib/sdp.h
+++ b/lib/sdp.h
@@ -244,13 +244,16 @@ extern "C" {
#define SDP_ATTR_GROUP_ID 0x0200
#define SDP_ATTR_IP_SUBNET 0x0200
#define SDP_ATTR_VERSION_NUM_LIST 0x0200
+#define SDP_ATTR_SUPPORTED_FEATURES_LIST 0x0200
#define SDP_ATTR_SVCDB_STATE 0x0201

#define SDP_ATTR_SERVICE_VERSION 0x0300
#define SDP_ATTR_EXTERNAL_NETWORK 0x0301
#define SDP_ATTR_SUPPORTED_DATA_STORES_LIST 0x0301
+#define SDP_ATTR_DATA_EXCHANGE_SPEC 0x0301
#define SDP_ATTR_FAX_CLASS1_SUPPORT 0x0302
#define SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL 0x0302
+#define SDP_ATTR_MCAP_SUPPORTED_PROCEDURES 0x0302
#define SDP_ATTR_FAX_CLASS20_SUPPORT 0x0303
#define SDP_ATTR_SUPPORTED_FORMATS_LIST 0x0303
#define SDP_ATTR_FAX_CLASS2_SUPPORT 0x0304
diff --git a/lib/sdp_lib.h b/lib/sdp_lib.h
index ee39df8..41d5786 100644
--- a/lib/sdp_lib.h
+++ b/lib/sdp_lib.h
@@ -585,6 +585,19 @@ static inline int sdp_get_icon_url(const sdp_record_t
*rec, char *str, int len)
return sdp_get_string_attr(rec, SDP_ATTR_ICON_URL, str, len);
}

+/*
+ * Set the supported features
+ * sf should be a list of list with each feature data
+ */
+void sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf);
+
+/*
+ * Get the supported features
+ * seqp is set to a list of list with each feature data
+ * If an error occurred -1 is returned and errno is set
+ */
+int sdp_get_supp_feat (const sdp_record_t *rec, sdp_list_t **seqp);
+
sdp_record_t *sdp_extract_pdu(const uint8_t *pdata, int bufsize, int
*scanned);
sdp_record_t *sdp_copy_record(sdp_record_t *rec);



Attachments:
(No filename) (4.05 kB)
signature.asc (197.00 B)
This is a digitally signed message part.
Download all attachments
Subject: Re: [PATCH] SDP patch to add support for HDP

Hi Claudio,

El Monday 16 November 2009 18:52:46 Claudio Takahasi escribi?:
> Hi Jose',
>
> gpg disabled :-)
>
> On Fri, Nov 13, 2009 at 10:43 AM, Jos? Antonio Santos Cadenas
>
> <[email protected]> wrote:
> > This patch tries to simplify the way the SDP records for HDP are created.
> > The created functions allow adding supported features easily to an sdp
> > record. The are similar to sdp_set_profile_descs and
> > sdp_get_profile_descs. I've also added some macros to define new UUID's
> > for HDP.
> Do you have an application or sdptool's patch to test these functions?

We have an HDP/MCAP implementation that uses this functions. We are going to
release it this week. Sancane and I are solving some problems with this code.
We will announce here when this code is available.

About the patch to sdptool: I didn't do anything but I can do it if you think
that is a good task.

>
> Br,
> Claudio.
>


I made some changes correcting all the problems that you suggested an other
that I found.

Regards,

Jose.

Here's the new pach:

diff --git a/lib/sdp.c b/lib/sdp.c
index 822ec1a..79f1261 100644
--- a/lib/sdp.c
+++ b/lib/sdp.c
@@ -4621,3 +4621,87 @@ uint16_t sdp_gen_tid(sdp_session_t *session)
{
return session->tid++;
}
+
+/*
+ * Set the supported features
+ */
+void sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf)
+{
+ const sdp_list_t *p, *r;
+ sdp_data_t *feat, *seq_feat;
+
+ int seqlen = sdp_list_len(sf);
+ void **seqDTDs = (void **)malloc (seqlen * sizeof(void *));
+ void **seqVals = (void **)malloc (seqlen * sizeof(void *));
+ int i = 0;
+
+ for (p = sf; p; p = p->next) {
+ int plen = sdp_list_len(p->data);
+ void **dtds = (void **)malloc (plen * sizeof(void *));
+ void **vals = (void **)malloc (plen * sizeof(void *));
+ int j = 0;
+ for (r = p->data; r; r = r->next) {
+ sdp_data_t *data = (sdp_data_t*)r->data;
+ dtds[j] = &data->dtd;
+ vals[j] = &data->val;
+ j++;
+ }
+ feat = sdp_seq_alloc(dtds, vals, plen);
+ free(dtds);
+ free(vals);
+
+ seqDTDs[i] = &feat->dtd;
+ seqVals[i] = feat;
+ i++;
+ }
+ seq_feat = sdp_seq_alloc(seqDTDs, seqVals, seqlen);
+
+ sdp_attr_replace(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seq_feat);
+
+ free(seqDTDs);
+ free(seqVals);
+}
+
+/*
+ * Get the supported features
+ * If an error occurred -1 is returned and errno is set
+ */
+int sdp_get_supp_feat (const sdp_record_t *rec, sdp_list_t **seqp)
+{
+ sdp_data_t * sdpdata, *d;
+ sdp_list_t * next;
+ *seqp = NULL;
+
+ sdpdata = sdp_data_get(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST);
+
+ if (!sdpdata || sdpdata->dtd < SDP_SEQ8 || sdpdata->dtd > SDP_SEQ32)
+ return sdp_get_uuidseq_attr(rec,
SDP_ATTR_SUPPORTED_FEATURES_LIST, seqp);
+
+ for (d = sdpdata->val.dataseq; d; d = d->next) {
+ sdp_data_t *dd;
+ sdp_list_t *subseq;
+ subseq = NULL;
+ if ( d->dtd < SDP_SEQ8 || d->dtd > SDP_SEQ32 )
+ goto fail;
+ for (dd = d->val.dataseq; dd; dd = dd->next) {
+ sdp_data_t *data;
+ if ( dd->dtd != SDP_UINT8 && dd->dtd != SDP_UINT16 &&
+ dd->dtd != SDP_TEXT_STR8)
+ goto fail;
+ data = sdp_data_alloc(dd->dtd, &dd->val);
+ subseq = sdp_list_append(subseq, data);
+ }
+ *seqp = sdp_list_append (*seqp, subseq);
+ }
+ return 0;
+
+fail:
+ while (*seqp) {
+ next = (*seqp)->next;
+ sdp_list_free(*seqp, free);
+ *seqp = next;
+ }
+ errno = EINVAL;
+ return -1;
+}
+
diff --git a/lib/sdp.h b/lib/sdp.h
index 375261e..1bb351a 100644
--- a/lib/sdp.h
+++ b/lib/sdp.h
@@ -244,13 +244,16 @@ extern "C" {
#define SDP_ATTR_GROUP_ID 0x0200
#define SDP_ATTR_IP_SUBNET 0x0200
#define SDP_ATTR_VERSION_NUM_LIST 0x0200
+#define SDP_ATTR_SUPPORTED_FEATURES_LIST 0x0200
#define SDP_ATTR_SVCDB_STATE 0x0201

#define SDP_ATTR_SERVICE_VERSION 0x0300
#define SDP_ATTR_EXTERNAL_NETWORK 0x0301
#define SDP_ATTR_SUPPORTED_DATA_STORES_LIST 0x0301
+#define SDP_ATTR_DATA_EXCHANGE_SPEC 0x0301
#define SDP_ATTR_FAX_CLASS1_SUPPORT 0x0302
#define SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL 0x0302
+#define SDP_ATTR_MCAP_SUPPORTED_PROCEDURES 0x0302
#define SDP_ATTR_FAX_CLASS20_SUPPORT 0x0303
#define SDP_ATTR_SUPPORTED_FORMATS_LIST 0x0303
#define SDP_ATTR_FAX_CLASS2_SUPPORT 0x0304
diff --git a/lib/sdp_lib.h b/lib/sdp_lib.h
index ee39df8..41d5786 100644
--- a/lib/sdp_lib.h
+++ b/lib/sdp_lib.h
@@ -585,6 +585,19 @@ static inline int sdp_get_icon_url(const sdp_record_t
*rec, char *str, int len)
return sdp_get_string_attr(rec, SDP_ATTR_ICON_URL, str, len);
}

+/*
+ * Set the supported features
+ * sf should be a list of list with each feature data
+ */
+void sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf);
+
+/*
+ * Get the supported features
+ * seqp is set to a list of list with each feature data
+ * If an error occurred -1 is returned and errno is set
+ */
+int sdp_get_supp_feat (const sdp_record_t *rec, sdp_list_t **seqp);
+
sdp_record_t *sdp_extract_pdu(const uint8_t *pdata, int bufsize, int
*scanned);
sdp_record_t *sdp_copy_record(sdp_record_t *rec);





2009-11-16 17:52:46

by Claudio Takahasi

[permalink] [raw]
Subject: Re: [PATCH] SDP patch to add support for HDP

SGkgSm9zZScsCgpncGcgZGlzYWJsZWQgOi0pCgpPbiBGcmksIE5vdiAxMywgMjAwOSBhdCAxMDo0
MyBBTSwgSm9zw6kgQW50b25pbyBTYW50b3MgQ2FkZW5hcwo8amNhZGVuQGxpYnJlc29mdC5lcz4g
d3JvdGU6Cj4gVGhpcyBwYXRjaCB0cmllcyB0byBzaW1wbGlmeSB0aGUgd2F5IHRoZSBTRFAgcmVj
b3JkcyBmb3IgSERQIGFyZSBjcmVhdGVkLiBUaGUKPiBjcmVhdGVkIGZ1bmN0aW9ucyBhbGxvdyBh
ZGRpbmcgc3VwcG9ydGVkIGZlYXR1cmVzIGVhc2lseSB0byBhbiBzZHAgcmVjb3JkLiBUaGUKPiBh
cmUgc2ltaWxhciB0byBzZHBfc2V0X3Byb2ZpbGVfZGVzY3MgYW5kIHNkcF9nZXRfcHJvZmlsZV9k
ZXNjcy4gwqBJJ3ZlIGFsc28gYWRkZWQKPiBzb21lIG1hY3JvcyB0byBkZWZpbmUgbmV3IFVVSUQn
cyBmb3IgSERQLgo+Cj4KPiBkaWZmIC0tZ2l0IGEvbGliL3NkcC5jIGIvbGliL3NkcC5jCj4gaW5k
ZXggODIyZWMxYS4uOTM0OTBlNyAxMDA2NDQKPiAtLS0gYS9saWIvc2RwLmMKPiArKysgYi9saWIv
c2RwLmMKPiBAQCAtNDYyMSwzICs0NjIxLDgyIEBAIHVpbnQxNl90IHNkcF9nZW5fdGlkKHNkcF9z
ZXNzaW9uX3QgKnNlc3Npb24pCj4gwqB7Cj4gwqAgwqAgwqAgwqByZXR1cm4gc2Vzc2lvbi0+dGlk
Kys7Cj4gwqB9Cj4gKwo+ICsvKgo+ICsqIFNldCB0aGUgc3VwcG9ydGVkIGZlYXR1cmVzCj4gKyov
Cj4gK3ZvaWQgc2RwX3NldF9zdXBwX2ZlYXQoc2RwX3JlY29yZF90ICpyZWMsIGNvbnN0IHNkcF9s
aXN0X3QgKnNmKQo+ICt7Cj4gKyDCoCDCoCDCoCBjb25zdCBzZHBfbGlzdF90ICpwLCAqcjsKPiAr
IMKgIMKgIMKgIHNkcF9kYXRhX3QgKmZlYXQgPSBOVUxMLCAqc2VxX2ZlYXQgPSBOVUxMOwpBdm9p
ZCBkZWNsYXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24uCgo+ICsKPiArIMKgIMKgIMKgIGludCBz
ZXFsZW4gPSBzZHBfbGlzdF9sZW4oc2YpOwo+ICsgwqAgwqAgwqAgdm9pZCAqKnNlcURURHMgPSAo
dm9pZCAqKiltYWxsb2MgKHNlcWxlbiAqIMKgc2l6ZW9mKHZvaWQgKikpOwo+ICsgwqAgwqAgwqAg
dm9pZCAqKnNlcVZhbHMgPSAodm9pZCAqKiltYWxsb2MgKHNlcWxlbiAqIMKgc2l6ZW9mKHZvaWQg
KikpOwo+ICsgwqAgwqAgwqAgaW50IGkgPSAwOwo+ICsKPiArIMKgIMKgIMKgIGZvciAocCA9IHNm
OyBwOyBwID0gcC0+bmV4dCkgewo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaW50IHBsZW4gPSBz
ZHBfbGlzdF9sZW4ocC0+ZGF0YSk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCB2b2lkICoqZHRk
cyA9ICh2b2lkICoqKW1hbGxvYyAocGxlbiAqIMKgc2l6ZW9mKHZvaWQgKikpOwo+ICsgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgdm9pZCAqKnZhbHMgPSAodm9pZCAqKiltYWxsb2MgKHBsZW4gKiDCoHNp
emVvZih2b2lkICopKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGludCBqID0gMDsKPiArIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIGZvciAocj1wLT5kYXRhOyByOyByID0gci0+bmV4dCkgewpjb2Rp
bmcgc3R5bGU6IG1pc3Npbmcgc3BhY2UgInI9cC0+ZGF0YSIKCj4gKyDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCBzZHBfZGF0YV90ICpkYXRhID0gKHNkcF9kYXRhX3QqKXItPmRhdGE7
Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBkdGRzW2pdID0gJmRhdGEtPmR0
ZDsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZhbHNbal0gPSAmZGF0YS0+
dmFsOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaisrOwo+ICsgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgfQo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZmVhdCA9IHNkcF9zZXFf
YWxsb2MoZHRkcywgdmFscywgcGxlbik7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmcmVlKGR0
ZHMpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZnJlZSh2YWxzKTsKPiArCj4gKyDCoCDCoCDC
oCDCoCDCoCDCoCDCoCBzZXFEVERzW2ldID0gJmZlYXQtPmR0ZDsKPiArIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIHNlcVZhbHNbaV0gPSBmZWF0Owo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaSsrOwo+
ICsgwqAgwqAgwqAgfQo+ICsgwqAgwqAgwqAgc2VxX2ZlYXQgPSBzZHBfc2VxX2FsbG9jKHNlcURU
RHMsIHNlcVZhbHMsIHNlcWxlbik7Cj4gKwo+ICsgwqAgwqAgwqAgc2RwX2F0dHJfcmVwbGFjZShy
ZWMsIFNEUF9BVFRSX1NVUFBPUlRFRF9GRUFUVVJFU19MSVNULCBzZXFfZmVhdCk7CkNoZWNrIGlm
IHNlcURURHMgYW5kIHNlcVZhbHMgbmVlZCB0byBiZSBmcmVlZC4KCj4gK30KPiArCj4gKy8qCj4g
KyAqIEdldCB0aGUgc3VwcG9ydGVkIGZlYXR1cmVzCj4gKyAqIElmIGFuIGVycm9yIG9jY3VycmVk
IC0xIGlzIHJldHVybmVkIGFuZCBlcnJubyBpcyBzZXQKPiArICovCj4gK2ludCBzZHBfZ2V0X3N1
cHBfZmVhdCAoY29uc3Qgc2RwX3JlY29yZF90ICpyZWMsIHNkcF9saXN0X3QgKipzZXFwKQo+ICt7
Cj4gKwo+ICsgwqAgwqAgwqAgKnNlcXAgPSBOVUxMOwo+ICsgwqAgwqAgwqAgc2RwX2RhdGFfdCAq
IHNkcGRhdGEgPSBOVUxMOwpDb21waWxlciB3YXJuaW5nOiBJU08gQzkwIGZvcmJpZHMgbWl4ZWQg
ZGVjbGFyYXRpb25zIGFuZCBjb2RlLiBSZW1vdmUKZXh0cmEgc3BhY2UgYW5kICJzZHBkYXRhIiBp
bml0aWFsaXphdGlvbi4KCkF2b2lkIG5lc3RlZCBpZi9lbHNlL2ZvcjoKCj4gKwo+ICsgwqAgwqAg
wqAgc2RwZGF0YSA9IHNkcF9kYXRhX2dldChyZWMsIFNEUF9BVFRSX1NVUFBPUlRFRF9GRUFUVVJF
U19MSVNUKTsKPiArIMKgIMKgIMKgIGlmIChzZHBkYXRhICYmIHNkcGRhdGEtPmR0ZCA+PSBTRFBf
U0VROCAmJiBzZHBkYXRhLT5kdGQgPD0gU0RQX1NFUTMyKSB7Cj4gKyDCoCDCoCDCoCDCoCDCoCDC
oCDCoCBzZHBfZGF0YV90ICpkOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZm9yIChkID0gc2Rw
ZGF0YS0+dmFsLmRhdGFzZXE7IGQ7IGQgPSBkLT5uZXh0KSB7Cj4gKyDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCBpZiAoIGQtPmR0ZCA+PSBTRFBfU0VROCAmJiBkLT5kdGQgPD0gU0RQ
X1NFUTMyICkgewo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgc2RwX2RhdGFfdCAqZGQ7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCBzZHBfbGlzdF90ICpzdWJzZXEgPSBOVUxMOwo+ICsgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZm9yIChkZCA9IGQtPnZhbC5kYXRhc2VxOyBk
ZDsgZGQgPSBkZC0+bmV4dCkgewo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2RwX2RhdGFfdCAqZGF0YTsKPiArIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmICggZGQtPmR0
ZCAhPSBTRFBfVUlOVDggJiYKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGRkLT5kdGQgIT0gU0RQX1VJTlQxNiAm
Jgo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgZGQtPmR0ZCAhPSBTRFBfVEVYVF9TVFI4KQo+ICsgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgZ290byBmYWlsOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgZGF0YSA9IHNkcF9kYXRhX2FsbG9jKGRkLT5kdGQsICZkZC0+dmFs
KTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIHN1YnNlcSA9IHNkcF9saXN0X2FwcGVuZChzdWJzZXEsIGRhdGEpOwo+ICsgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfQo+ICsgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKnNlcXAgPSBzZHBfbGlzdF9hcHBlbmQg
KCpzZXFwLCBzdWJzZXEpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfSBl
bHNlCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBnb3Rv
IGZhaWw7CklmIHlvdSBpbnZlcnQgdGhlIGxvZ2ljIHlvdSBkb24ndCBuZWVkIHRoaXMgImdvdG8i
Cgo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfQo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0
dXJuIDA7Cj4gKyDCoCDCoCDCoCB9Cj4gKwo+ICsKUmVtb3ZlIGV4dHJhIGxpbmUuCkRvIHlvdSBo
YXZlIGFuIGFwcGxpY2F0aW9uIG9yIHNkcHRvb2wncyBwYXRjaCB0byB0ZXN0IHRoZXNlIGZ1bmN0
aW9ucz8KCkJyLApDbGF1ZGlvLgo+ICsgwqAgwqAgwqAgcmV0dXJuIHNkcF9nZXRfdXVpZHNlcV9h
dHRyKHJlYywgU0RQX0FUVFJfU1VQUE9SVEVEX0ZFQVRVUkVTX0xJU1QsIHNlcXApOwo+ICsKPiAr
ZmFpbDoKPiArIMKgIMKgIMKgIHNkcF9saXN0X2ZyZWUoKnNlcXAsIGZyZWUpOwo+ICsgwqAgwqAg
wqAgZXJybm8gPSBFSU5WQUw7Cj4gKyDCoCDCoCDCoCByZXR1cm4gLTE7Cj4gK30KPiBkaWZmIC0t
Z2l0IGEvbGliL3NkcC5oIGIvbGliL3NkcC5oCj4gaW5kZXggMzc1MjYxZS4uMWJiMzUxYSAxMDA2
NDQKPiAtLS0gYS9saWIvc2RwLmgKPiArKysgYi9saWIvc2RwLmgKPiBAQCAtMjQ0LDEzICsyNDQs
MTYgQEAgZXh0ZXJuICJDIiB7Cj4gwqAjZGVmaW5lIFNEUF9BVFRSX0dST1VQX0lEIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHgwMjAwCj4gwqAjZGVmaW5lIFNEUF9BVFRSX0lQX1NV
Qk5FVCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAweDAyMDAKPiDCoCNkZWZpbmUgU0RQ
X0FUVFJfVkVSU0lPTl9OVU1fTElTVCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4MDIwMAo+ICsjZGVm
aW5lIFNEUF9BVFRSX1NVUFBPUlRFRF9GRUFUVVJFU19MSVNUIDB4MDIwMAo+IMKgI2RlZmluZSBT
RFBfQVRUUl9TVkNEQl9TVEFURSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAweDAyMDEKPgo+
IMKgI2RlZmluZSBTRFBfQVRUUl9TRVJWSUNFX1ZFUlNJT04gwqAgwqAgwqAgwqAgwqAgwqAgwqAg
MHgwMzAwCj4gwqAjZGVmaW5lIFNEUF9BVFRSX0VYVEVSTkFMX05FVFdPUksgwqAgwqAgwqAgwqAg
wqAgwqAgwqAweDAzMDEKPiDCoCNkZWZpbmUgU0RQX0FUVFJfU1VQUE9SVEVEX0RBVEFfU1RPUkVT
X0xJU1QgwqAgwqAweDAzMDEKPiArI2RlZmluZSBTRFBfQVRUUl9EQVRBX0VYQ0hBTkdFX1NQRUMg
wqAgwqAgwqAgwqAgwqAgwqAweDAzMDEKPiDCoCNkZWZpbmUgU0RQX0FUVFJfRkFYX0NMQVNTMV9T
VVBQT1JUIMKgIMKgIMKgIMKgIMKgIMKgMHgwMzAyCj4gwqAjZGVmaW5lIFNEUF9BVFRSX1JFTU9U
RV9BVURJT19WT0xVTUVfQ09OVFJPTCDCoCAweDAzMDIKPiArI2RlZmluZSBTRFBfQVRUUl9NQ0FQ
X1NVUFBPUlRFRF9QUk9DRURVUkVTIMKgIMKgIDB4MDMwMgo+IMKgI2RlZmluZSBTRFBfQVRUUl9G
QVhfQ0xBU1MyMF9TVVBQT1JUIMKgIMKgIMKgIMKgIMKgIDB4MDMwMwo+IMKgI2RlZmluZSBTRFBf
QVRUUl9TVVBQT1JURURfRk9STUFUU19MSVNUIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHgwMzAz
Cj4gwqAjZGVmaW5lIFNEUF9BVFRSX0ZBWF9DTEFTUzJfU1VQUE9SVCDCoCDCoCDCoCDCoCDCoCDC
oDB4MDMwNAo+IGRpZmYgLS1naXQgYS9saWIvc2RwX2xpYi5oIGIvbGliL3NkcF9saWIuaAo+IGlu
ZGV4IGVlMzlkZjguLjQxZDU3ODYgMTAwNjQ0Cj4gLS0tIGEvbGliL3NkcF9saWIuaAo+ICsrKyBi
L2xpYi9zZHBfbGliLmgKPiBAQCAtNTg1LDYgKzU4NSwxOSBAQCBzdGF0aWMgaW5saW5lIGludCBz
ZHBfZ2V0X2ljb25fdXJsKGNvbnN0IHNkcF9yZWNvcmRfdAo+ICpyZWMsIGNoYXIgKnN0ciwgaW50
IGxlbikKPiDCoCDCoCDCoCDCoHJldHVybiBzZHBfZ2V0X3N0cmluZ19hdHRyKHJlYywgU0RQX0FU
VFJfSUNPTl9VUkwsIHN0ciwgbGVuKTsKPiDCoH0KPgo+ICsvKgo+ICsgKiBTZXQgdGhlIHN1cHBv
cnRlZCBmZWF0dXJlcwo+ICsgKiBzZiBzaG91bGQgYmUgYSBsaXN0IG9mIGxpc3Qgd2l0aCBlYWNo
IGZlYXR1cmUgZGF0YQo+ICsgKi8KPiArdm9pZCBzZHBfc2V0X3N1cHBfZmVhdChzZHBfcmVjb3Jk
X3QgKnJlYywgY29uc3Qgc2RwX2xpc3RfdCAqc2YpOwo+ICsKPiArLyoKPiArICogR2V0IHRoZSBz
dXBwb3J0ZWQgZmVhdHVyZXMKPiArICogc2VxcCBpcyBzZXQgdG8gYSBsaXN0IG9mIGxpc3Qgd2l0
aCBlYWNoIGZlYXR1cmUgZGF0YQo+ICsgKiBJZiBhbiBlcnJvciBvY2N1cnJlZCAtMSBpcyByZXR1
cm5lZCBhbmQgZXJybm8gaXMgc2V0Cj4gKyAqLwo+ICtpbnQgc2RwX2dldF9zdXBwX2ZlYXQgKGNv
bnN0IHNkcF9yZWNvcmRfdCAqcmVjLCBzZHBfbGlzdF90ICoqc2VxcCk7Cj4gKwo+IMKgc2RwX3Jl
Y29yZF90ICpzZHBfZXh0cmFjdF9wZHUoY29uc3QgdWludDhfdCAqcGRhdGEsIGludCBidWZzaXpl
LCBpbnQKPiAqc2Nhbm5lZCk7Cj4gwqBzZHBfcmVjb3JkX3QgKnNkcF9jb3B5X3JlY29yZChzZHBf
cmVjb3JkX3QgKnJlYyk7Cj4KPgo=

2009-11-16 17:30:00

by Claudio Takahasi

[permalink] [raw]
Subject: Re: [PATCH] SDP patch to add support for HDP

SGkgSm9zZScsCgpPbiBGcmksIE5vdiAxMywgMjAwOSBhdCAxMDo0MyBBTSwgSm9zw6kgQW50b25p
byBTYW50b3MgQ2FkZW5hcwo8amNhZGVuQGxpYnJlc29mdC5lcz4gd3JvdGU6Cj4gVGhpcyBwYXRj
aCB0cmllcyB0byBzaW1wbGlmeSB0aGUgd2F5IHRoZSBTRFAgcmVjb3JkcyBmb3IgSERQIGFyZSBj
cmVhdGVkLiBUaGUKPiBjcmVhdGVkIGZ1bmN0aW9ucyBhbGxvdyBhZGRpbmcgc3VwcG9ydGVkIGZl
YXR1cmVzIGVhc2lseSB0byBhbiBzZHAgcmVjb3JkLiBUaGUKPiBhcmUgc2ltaWxhciB0byBzZHBf
c2V0X3Byb2ZpbGVfZGVzY3MgYW5kIHNkcF9nZXRfcHJvZmlsZV9kZXNjcy4gwqBJJ3ZlIGFsc28g
YWRkZWQKPiBzb21lIG1hY3JvcyB0byBkZWZpbmUgbmV3IFVVSUQncyBmb3IgSERQLgo+Cj4KPiBk
aWZmIC0tZ2l0IGEvbGliL3NkcC5jIGIvbGliL3NkcC5jCj4gaW5kZXggODIyZWMxYS4uOTM0OTBl
NyAxMDA2NDQKPiAtLS0gYS9saWIvc2RwLmMKPiArKysgYi9saWIvc2RwLmMKPiBAQCAtNDYyMSwz
ICs0NjIxLDgyIEBAIHVpbnQxNl90IHNkcF9nZW5fdGlkKHNkcF9zZXNzaW9uX3QgKnNlc3Npb24p
Cj4gwqB7Cj4gwqAgwqAgwqAgwqByZXR1cm4gc2Vzc2lvbi0+dGlkKys7Cj4gwqB9Cj4gKwo+ICsv
Kgo+ICsqIFNldCB0aGUgc3VwcG9ydGVkIGZlYXR1cmVzCj4gKyovCj4gK3ZvaWQgc2RwX3NldF9z
dXBwX2ZlYXQoc2RwX3JlY29yZF90ICpyZWMsIGNvbnN0IHNkcF9saXN0X3QgKnNmKQo+ICt7Cj4g
KyDCoCDCoCDCoCBjb25zdCBzZHBfbGlzdF90ICpwLCAqcjsKPiArIMKgIMKgIMKgIHNkcF9kYXRh
X3QgKmZlYXQgPSBOVUxMLCAqc2VxX2ZlYXQgPSBOVUxMOwpBdm9pZCBkZWNsYXJhdGlvbiBhbmQg
aW5pdGlhbGl6YXRpb24uCgo+ICsKPiArIMKgIMKgIMKgIGludCBzZXFsZW4gPSBzZHBfbGlzdF9s
ZW4oc2YpOwo+ICsgwqAgwqAgwqAgdm9pZCAqKnNlcURURHMgPSAodm9pZCAqKiltYWxsb2MgKHNl
cWxlbiAqIMKgc2l6ZW9mKHZvaWQgKikpOwo+ICsgwqAgwqAgwqAgdm9pZCAqKnNlcVZhbHMgPSAo
dm9pZCAqKiltYWxsb2MgKHNlcWxlbiAqIMKgc2l6ZW9mKHZvaWQgKikpOwo+ICsgwqAgwqAgwqAg
aW50IGkgPSAwOwo+ICsKPiArIMKgIMKgIMKgIGZvciAocCA9IHNmOyBwOyBwID0gcC0+bmV4dCkg
ewo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaW50IHBsZW4gPSBzZHBfbGlzdF9sZW4ocC0+ZGF0
YSk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCB2b2lkICoqZHRkcyA9ICh2b2lkICoqKW1hbGxv
YyAocGxlbiAqIMKgc2l6ZW9mKHZvaWQgKikpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdm9p
ZCAqKnZhbHMgPSAodm9pZCAqKiltYWxsb2MgKHBsZW4gKiDCoHNpemVvZih2b2lkICopKTsKPiAr
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIGludCBqID0gMDsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IGZvciAocj1wLT5kYXRhOyByOyByID0gci0+bmV4dCkgewpjb2Rpbmcgc3R5bGU6IG1pc3Npbmcg
c3BhY2UgInI9cC0+ZGF0YSIKCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBz
ZHBfZGF0YV90ICpkYXRhID0gKHNkcF9kYXRhX3QqKXItPmRhdGE7Cj4gKyDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCBkdGRzW2pdID0gJmRhdGEtPmR0ZDsKPiArIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZhbHNbal0gPSAmZGF0YS0+dmFsOwo+ICsgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaisrOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfQo+
ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZmVhdCA9IHNkcF9zZXFfYWxsb2MoZHRkcywgdmFscywg
cGxlbik7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmcmVlKGR0ZHMpOwo+ICsgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgZnJlZSh2YWxzKTsKPiArCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzZXFE
VERzW2ldID0gJmZlYXQtPmR0ZDsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNlcVZhbHNbaV0g
PSBmZWF0Owo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaSsrOwo+ICsgwqAgwqAgwqAgfQo+ICsg
wqAgwqAgwqAgc2VxX2ZlYXQgPSBzZHBfc2VxX2FsbG9jKHNlcURURHMsIHNlcVZhbHMsIHNlcWxl
bik7Cj4gKwo+ICsgwqAgwqAgwqAgc2RwX2F0dHJfcmVwbGFjZShyZWMsIFNEUF9BVFRSX1NVUFBP
UlRFRF9GRUFUVVJFU19MSVNULCBzZXFfZmVhdCk7CkNoZWNrIGlmIHNlcURURHMgYW5kIHNlcVZh
bHMgbmVlZCB0byBiZSBmcmVlZC4KCj4gK30KPiArCj4gKy8qCj4gKyAqIEdldCB0aGUgc3VwcG9y
dGVkIGZlYXR1cmVzCj4gKyAqIElmIGFuIGVycm9yIG9jY3VycmVkIC0xIGlzIHJldHVybmVkIGFu
ZCBlcnJubyBpcyBzZXQKPiArICovCj4gK2ludCBzZHBfZ2V0X3N1cHBfZmVhdCAoY29uc3Qgc2Rw
X3JlY29yZF90ICpyZWMsIHNkcF9saXN0X3QgKipzZXFwKQo+ICt7Cj4gKwo+ICsgwqAgwqAgwqAg
KnNlcXAgPSBOVUxMOwo+ICsgwqAgwqAgwqAgc2RwX2RhdGFfdCAqIHNkcGRhdGEgPSBOVUxMOwpD
b21waWxlciB3YXJuaW5nOiBJU08gQzkwIGZvcmJpZHMgbWl4ZWQgZGVjbGFyYXRpb25zIGFuZCBj
b2RlLiBSZW1vdmUKZXh0cmEgc3BhY2UgYW5kICJzZHBkYXRhIiBpbml0aWFsaXphdGlvbi4KCkF2
b2lkIG5lc3RlZCBpZi9lbHNlL2ZvcjoKPiArCj4gKyDCoCDCoCDCoCBzZHBkYXRhID0gc2RwX2Rh
dGFfZ2V0KHJlYywgU0RQX0FUVFJfU1VQUE9SVEVEX0ZFQVRVUkVTX0xJU1QpOwo+ICsgwqAgwqAg
wqAgaWYgKHNkcGRhdGEgJiYgc2RwZGF0YS0+ZHRkID49IFNEUF9TRVE4ICYmIHNkcGRhdGEtPmR0
ZCA8PSBTRFBfU0VRMzIpIHsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNkcF9kYXRhX3QgKmQ7
Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmb3IgKGQgPSBzZHBkYXRhLT52YWwuZGF0YXNlcTsg
ZDsgZCA9IGQtPm5leHQpIHsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlm
ICggZC0+ZHRkID49IFNEUF9TRVE4ICYmIGQtPmR0ZCA8PSBTRFBfU0VRMzIgKSB7Cj4gKyDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzZHBfZGF0YV90ICpkZDsK
PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNkcF9saXN0
X3QgKnN1YnNlcSA9IE5VTEw7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCBmb3IgKGRkID0gZC0+dmFsLmRhdGFzZXE7IGRkOyBkZCA9IGRkLT5uZXh0KSB7
Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCBzZHBfZGF0YV90ICpkYXRhOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKCBkZC0+ZHRkICE9IFNEUF9VSU5UOCAmJgo+
ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgZGQtPmR0ZCAhPSBTRFBfVUlOVDE2ICYmCj4gKyDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBk
ZC0+ZHRkICE9IFNEUF9URVhUX1NUUjgpCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBnb3RvIGZhaWw7Cj4gKyDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBk
YXRhID0gc2RwX2RhdGFfYWxsb2MoZGQtPmR0ZCwgJmRkLT52YWwpOwo+ICsgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc3Vic2VxID0gc2Rw
X2xpc3RfYXBwZW5kKHN1YnNlcSwgZGF0YSk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCB9Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCAqc2VxcCA9IHNkcF9saXN0X2FwcGVuZCAoKnNlcXAsIHN1YnNlcSk7Cj4g
KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9IGVsc2UKPiArIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGdvdG8gZmFpbDsKSWYgeW91IGludmVy
dCB0aGUgbG9naWMgeW91IGRvbid0IG5lZWQgdGhpcyAiZ290byIKCj4gKyDCoCDCoCDCoCDCoCDC
oCDCoCDCoCB9Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4gMDsKPiArIMKgIMKgIMKg
IH0KPiArClJlbW92ZSBleHRyYSBsaW5lLgpEbyB5b3UgaGF2ZSBhbiBhcHBsaWNhdGlvbiBvciBz
ZHB0b29sJ3MgcGF0Y2ggdG8gdGVzdCB0aGVzZSBmdW5jdGlvbnM/CgpCciwKQ2xhdWRpby4KCj4g
KyDCoCDCoCDCoCByZXR1cm4gc2RwX2dldF91dWlkc2VxX2F0dHIocmVjLCBTRFBfQVRUUl9TVVBQ
T1JURURfRkVBVFVSRVNfTElTVCwgc2VxcCk7Cj4gKwo+ICtmYWlsOgo+ICsgwqAgwqAgwqAgc2Rw
X2xpc3RfZnJlZSgqc2VxcCwgZnJlZSk7Cj4gKyDCoCDCoCDCoCBlcnJubyA9IEVJTlZBTDsKPiAr
IMKgIMKgIMKgIHJldHVybiAtMTsKPiArfQo+IGRpZmYgLS1naXQgYS9saWIvc2RwLmggYi9saWIv
c2RwLmgKPiBpbmRleCAzNzUyNjFlLi4xYmIzNTFhIDEwMDY0NAo+IC0tLSBhL2xpYi9zZHAuaAo+
ICsrKyBiL2xpYi9zZHAuaAo+IEBAIC0yNDQsMTMgKzI0NCwxNiBAQCBleHRlcm4gIkMiIHsKPiDC
oCNkZWZpbmUgU0RQX0FUVFJfR1JPVVBfSUQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAweDAyMDAKPiDCoCNkZWZpbmUgU0RQX0FUVFJfSVBfU1VCTkVUIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIDB4MDIwMAo+IMKgI2RlZmluZSBTRFBfQVRUUl9WRVJTSU9OX05VTV9MSVNU
IMKgIMKgIMKgIMKgIMKgIMKgIMKgMHgwMjAwCj4gKyNkZWZpbmUgU0RQX0FUVFJfU1VQUE9SVEVE
X0ZFQVRVUkVTX0xJU1QgMHgwMjAwCj4gwqAjZGVmaW5lIFNEUF9BVFRSX1NWQ0RCX1NUQVRFIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDB4MDIwMQo+Cj4gwqAjZGVmaW5lIFNEUF9BVFRSX1NF
UlZJQ0VfVkVSU0lPTiDCoCDCoCDCoCDCoCDCoCDCoCDCoCAweDAzMDAKPiDCoCNkZWZpbmUgU0RQ
X0FUVFJfRVhURVJOQUxfTkVUV09SSyDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4MDMwMQo+IMKgI2Rl
ZmluZSBTRFBfQVRUUl9TVVBQT1JURURfREFUQV9TVE9SRVNfTElTVCDCoCDCoDB4MDMwMQo+ICsj
ZGVmaW5lIFNEUF9BVFRSX0RBVEFfRVhDSEFOR0VfU1BFQyDCoCDCoCDCoCDCoCDCoCDCoDB4MDMw
MQo+IMKgI2RlZmluZSBTRFBfQVRUUl9GQVhfQ0xBU1MxX1NVUFBPUlQgwqAgwqAgwqAgwqAgwqAg
wqAweDAzMDIKPiDCoCNkZWZpbmUgU0RQX0FUVFJfUkVNT1RFX0FVRElPX1ZPTFVNRV9DT05UUk9M
IMKgIDB4MDMwMgo+ICsjZGVmaW5lIFNEUF9BVFRSX01DQVBfU1VQUE9SVEVEX1BST0NFRFVSRVMg
wqAgwqAgMHgwMzAyCj4gwqAjZGVmaW5lIFNEUF9BVFRSX0ZBWF9DTEFTUzIwX1NVUFBPUlQgwqAg
wqAgwqAgwqAgwqAgMHgwMzAzCj4gwqAjZGVmaW5lIFNEUF9BVFRSX1NVUFBPUlRFRF9GT1JNQVRT
X0xJU1QgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweDAzMDMKPiDCoCNkZWZpbmUgU0RQX0FUVFJf
RkFYX0NMQVNTMl9TVVBQT1JUIMKgIMKgIMKgIMKgIMKgIMKgMHgwMzA0Cj4gZGlmZiAtLWdpdCBh
L2xpYi9zZHBfbGliLmggYi9saWIvc2RwX2xpYi5oCj4gaW5kZXggZWUzOWRmOC4uNDFkNTc4NiAx
MDA2NDQKPiAtLS0gYS9saWIvc2RwX2xpYi5oCj4gKysrIGIvbGliL3NkcF9saWIuaAo+IEBAIC01
ODUsNiArNTg1LDE5IEBAIHN0YXRpYyBpbmxpbmUgaW50IHNkcF9nZXRfaWNvbl91cmwoY29uc3Qg
c2RwX3JlY29yZF90Cj4gKnJlYywgY2hhciAqc3RyLCBpbnQgbGVuKQo+IMKgIMKgIMKgIMKgcmV0
dXJuIHNkcF9nZXRfc3RyaW5nX2F0dHIocmVjLCBTRFBfQVRUUl9JQ09OX1VSTCwgc3RyLCBsZW4p
Owo+IMKgfQo+Cj4gKy8qCj4gKyAqIFNldCB0aGUgc3VwcG9ydGVkIGZlYXR1cmVzCj4gKyAqIHNm
IHNob3VsZCBiZSBhIGxpc3Qgb2YgbGlzdCB3aXRoIGVhY2ggZmVhdHVyZSBkYXRhCj4gKyAqLwo+
ICt2b2lkIHNkcF9zZXRfc3VwcF9mZWF0KHNkcF9yZWNvcmRfdCAqcmVjLCBjb25zdCBzZHBfbGlz
dF90ICpzZik7Cj4gKwo+ICsvKgo+ICsgKiBHZXQgdGhlIHN1cHBvcnRlZCBmZWF0dXJlcwo+ICsg
KiBzZXFwIGlzIHNldCB0byBhIGxpc3Qgb2YgbGlzdCB3aXRoIGVhY2ggZmVhdHVyZSBkYXRhCj4g
KyAqIElmIGFuIGVycm9yIG9jY3VycmVkIC0xIGlzIHJldHVybmVkIGFuZCBlcnJubyBpcyBzZXQK
PiArICovCj4gK2ludCBzZHBfZ2V0X3N1cHBfZmVhdCAoY29uc3Qgc2RwX3JlY29yZF90ICpyZWMs
IHNkcF9saXN0X3QgKipzZXFwKTsKPiArCj4gwqBzZHBfcmVjb3JkX3QgKnNkcF9leHRyYWN0X3Bk
dShjb25zdCB1aW50OF90ICpwZGF0YSwgaW50IGJ1ZnNpemUsIGludAo+ICpzY2FubmVkKTsKPiDC
oHNkcF9yZWNvcmRfdCAqc2RwX2NvcHlfcmVjb3JkKHNkcF9yZWNvcmRfdCAqcmVjKTsKPgo+Cj4K

2009-12-14 20:25:20

by Marcel Holtmann

[permalink] [raw]
Subject: Re: [PATCH] SDP patch to add support for HDP

Hi Jose,

> Here's the corrected patch

patch has been applied. Thanks.

Regards

Marcel



Subject: Re: [PATCH] SDP patch to add support for HDP

Hi all,

Here's the corrected patch

Regards.


diff --git a/lib/sdp.c b/lib/sdp.c
index 822ec1a..89505f9 100644
--- a/lib/sdp.c
+++ b/lib/sdp.c
@@ -4621,3 +4621,114 @@ uint16_t sdp_gen_tid(sdp_session_t *session)
{
return session->tid++;
}
+
+/*
+ * Set the supported features
+ */
+int sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf)
+{
+ const sdp_list_t *p, *r;
+ sdp_data_t *feat, *seq_feat;
+ int seqlen, i;
+ void **seqDTDs, **seqVals;
+
+ seqlen = sdp_list_len(sf);
+ seqDTDs = malloc(seqlen * sizeof(void *));
+ if (!seqDTDs)
+ return -1;
+ seqVals = malloc(seqlen * sizeof(void *));
+ if (!seqVals) {
+ free(seqDTDs);
+ return -1;
+ }
+
+ for (p = sf, i = 0; p; p = p->next, i++) {
+ int plen, j;
+ void **dtds, **vals;
+
+ plen = sdp_list_len(p->data);
+ dtds = malloc(plen * sizeof(void *));
+ if (!dtds)
+ goto fail;
+ vals = malloc(plen * sizeof(void *));
+ if (!vals) {
+ free(dtds);
+ goto fail;
+ }
+ for (r = p->data, j = 0; r; r = r->next, j++) {
+ sdp_data_t *data = (sdp_data_t*)r->data;
+ dtds[j] = &data->dtd;
+ vals[j] = &data->val;
+ }
+ feat = sdp_seq_alloc(dtds, vals, plen);
+ free(dtds);
+ free(vals);
+ if (!feat)
+ goto fail;
+ seqDTDs[i] = &feat->dtd;
+ seqVals[i] = feat;
+ }
+ seq_feat = sdp_seq_alloc(seqDTDs, seqVals, seqlen);
+ if (!seq_feat)
+ goto fail;
+ sdp_attr_replace(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seq_feat);
+
+ free(seqVals);
+ free(seqDTDs);
+ return 0;
+
+fail:
+ free(seqVals);
+ free(seqDTDs);
+ return -1;
+}
+
+/*
+ * Get the supported features
+ * If an error occurred -1 is returned and errno is set
+ */
+int sdp_get_supp_feat(const sdp_record_t *rec, sdp_list_t **seqp)
+{
+ sdp_data_t *sdpdata, *d;
+ sdp_list_t *tseq;
+ tseq = NULL;
+
+ sdpdata = sdp_data_get(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST);
+
+ if (!sdpdata || sdpdata->dtd < SDP_SEQ8 || sdpdata->dtd > SDP_SEQ32)
+ return sdp_get_uuidseq_attr(rec,
+ SDP_ATTR_SUPPORTED_FEATURES_LIST, seqp);
+
+ for (d = sdpdata->val.dataseq; d; d = d->next) {
+ sdp_data_t *dd;
+ sdp_list_t *subseq;
+
+ if (d->dtd < SDP_SEQ8 || d->dtd > SDP_SEQ32)
+ goto fail;
+ subseq = NULL;
+ for (dd = d->val.dataseq; dd; dd = dd->next) {
+ sdp_data_t *data;
+ if (dd->dtd != SDP_UINT8 && dd->dtd != SDP_UINT16 &&
+ dd->dtd != SDP_TEXT_STR8)
+ goto fail;
+ data = sdp_data_alloc(dd->dtd, &dd->val);
+ if (data)
+ subseq = sdp_list_append(subseq, data);
+ }
+ tseq = sdp_list_append(tseq, subseq);
+ }
+ *seqp = tseq;
+ return 0;
+
+fail:
+ while (tseq) {
+ sdp_list_t * next;
+
+ next = tseq->next;
+ sdp_list_free(tseq, free);
+ tseq = next;
+ }
+ errno = EINVAL;
+ return -1;
+}
+
diff --git a/lib/sdp.h b/lib/sdp.h
index 375261e..b493985 100644
--- a/lib/sdp.h
+++ b/lib/sdp.h
@@ -244,13 +244,16 @@ extern "C" {
#define SDP_ATTR_GROUP_ID 0x0200
#define SDP_ATTR_IP_SUBNET 0x0200
#define SDP_ATTR_VERSION_NUM_LIST 0x0200
+#define SDP_ATTR_SUPPORTED_FEATURES_LIST 0x0200
#define SDP_ATTR_SVCDB_STATE 0x0201

#define SDP_ATTR_SERVICE_VERSION 0x0300
#define SDP_ATTR_EXTERNAL_NETWORK 0x0301
#define SDP_ATTR_SUPPORTED_DATA_STORES_LIST 0x0301
+#define SDP_ATTR_DATA_EXCHANGE_SPEC 0x0301
#define SDP_ATTR_FAX_CLASS1_SUPPORT 0x0302
#define SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL 0x0302
+#define SDP_ATTR_MCAP_SUPPORTED_PROCEDURES 0x0302
#define SDP_ATTR_FAX_CLASS20_SUPPORT 0x0303
#define SDP_ATTR_SUPPORTED_FORMATS_LIST 0x0303
#define SDP_ATTR_FAX_CLASS2_SUPPORT 0x0304
diff --git a/lib/sdp_lib.h b/lib/sdp_lib.h
index ee39df8..bebb745 100644
--- a/lib/sdp_lib.h
+++ b/lib/sdp_lib.h
@@ -585,6 +585,20 @@ static inline int sdp_get_icon_url(const sdp_record_t *rec, char *str, int len)
return sdp_get_string_attr(rec, SDP_ATTR_ICON_URL, str, len);
}

+/*
+ * Set the supported features
+ * sf should be a list of list with each feature data
+ * Returns 0 on success -1 on fail
+ */
+int sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf);
+
+/*
+ * Get the supported features
+ * seqp is set to a list of list with each feature data
+ * Returns 0 on success, if an error occurred -1 is returned and errno is set
+ */
+int sdp_get_supp_feat(const sdp_record_t *rec, sdp_list_t **seqp);
+
sdp_record_t *sdp_extract_pdu(const uint8_t *pdata, int bufsize, int *scanned);
sdp_record_t *sdp_copy_record(sdp_record_t *rec);


2009-12-11 18:32:30

by Marcel Holtmann

[permalink] [raw]
Subject: Re: [PATCH] SDP patch to add support for HDP

Hi Jose,

> > > diff --git a/lib/sdp.c b/lib/sdp.c
> > > index 822ec1a..ddf2d1a 100644
> > > --- a/lib/sdp.c
> > > +++ b/lib/sdp.c
> > > @@ -4621,3 +4621,113 @@ uint16_t sdp_gen_tid(sdp_session_t *session)
> > > {
> > > return session->tid++;
> > > }
> > > +
> > > +/*
> > > + * Set the supported features
> > > + */
> > > +int sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf)
> > > +{
> > > + const sdp_list_t *p, *r;
> > > + sdp_data_t *feat, *seq_feat;
> > > + int seqlen, i, err;
> > > + void **seqDTDs, **seqVals;
> > > +
> > > + err = -1;
> >
> > what is this err = -1 business. That is pointless. See below.
>
> I use this err variable because i need to distinguish between the error and no
> error cases. I explained better below.
>
> >
> > > + i = 0;
> >
> > Move this to the place where it is actually used.
> >
> > > + seqlen = sdp_list_len(sf);
> > > + seqDTDs = malloc(seqlen * sizeof(void *));
> > > + if (!seqDTDs)
> > > + return err;
> >
> > This is return -1;
> >
> > > + seqVals = malloc(seqlen * sizeof(void *));
> > > + if (!seqVals) {
> > > + free(seqDTDs);
> > > + return err;
> >
> > And this, too. Just use return -1;
> >
> > > + }
> > > +
> > > + for (p = sf; p; p = p->next) {
> > > + int plen, j;
> > > + void **dtds, **vals;
> > > +
> > > + plen = sdp_list_len(p->data);
> > > + dtds = malloc(plen * sizeof(void *));
> > > + if (!dtds)
> > > + goto set_sup_feat_exit;
> > > + vals = malloc(plen * sizeof(void *));
> > > + if (!vals) {
> > > + free(dtds);
> > > + goto set_sup_feat_exit;
> > > + }
> > > + j = 0;
> > > + for (r = p->data; r; r = r->next) {
> > > + sdp_data_t *data = (sdp_data_t*)r->data;
> > > + dtds[j] = &data->dtd;
> > > + vals[j] = &data->val;
> > > + j++;
> > > + }
> > > + feat = sdp_seq_alloc(dtds, vals, plen);
> > > + free(dtds);
> > > + free(vals);
> > > + if (!feat)
> > > + goto set_sup_feat_exit;
> > > + seqDTDs[i] = &feat->dtd;
> > > + seqVals[i] = feat;
> > > + i++;
> > > + }
> > > + seq_feat = sdp_seq_alloc(seqDTDs, seqVals, seqlen);
> > > + if (!seq_feat)
> > > + goto set_sup_feat_exit;
> > > + sdp_attr_replace(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seq_feat);
> > > +
> > > + err = 0;
> >
> > Replace this with return 0;
> >
> > > +
> > > +set_sup_feat_exit:
> >
> > Call this label "fail" to be consistent across the code.
>
> This part should be executed on error and on no error, because seqVals and
> seqDTDs must be freed in all the cases. Because of that I called it exit:
> instead of fail. May be it is better to repeat this two statements (I mean
> free statements) in order to keep readability and use return as you suggested,
> without any variable.

I see your point here. However this doesn't make the code more readable.
It actually does complicates the flow through it. A simple goto fail and
return -1 is easier to understand then trying to remember the err value
across such a complex function.

So just after sdp_attr_replace duplicated the two free calls and then
return 0. And the label as a pure failure case. While you have two extra
free calls, you have on less variable and a lot simple code path here.

Remember that if the code makes my brain hurt, it is too complex ;)

Regards

Marcel



Subject: Re: [PATCH] SDP patch to add support for HDP

Hi Marcel,

El Thursday 10 December 2009 22:59:15 Marcel Holtmann escribi=F3:
> Hi Jose,
>
> > diff --git a/lib/sdp.c b/lib/sdp.c
> > index 822ec1a..ddf2d1a 100644
> > --- a/lib/sdp.c
> > +++ b/lib/sdp.c
> > @@ -4621,3 +4621,113 @@ uint16_t sdp_gen_tid(sdp_session_t *session)
> > {
> > return session->tid++;
> > }
> > +
> > +/*
> > + * Set the supported features
> > + */
> > +int sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf)
> > +{
> > + const sdp_list_t *p, *r;
> > + sdp_data_t *feat, *seq_feat;
> > + int seqlen, i, err;
> > + void **seqDTDs, **seqVals;
> > +
> > + err =3D -1;
>
> what is this err =3D -1 business. That is pointless. See below.

I use this err variable because i need to distinguish between the error and=
no=20
error cases. I explained better below.

>
> > + i =3D 0;
>
> Move this to the place where it is actually used.
>
> > + seqlen =3D sdp_list_len(sf);
> > + seqDTDs =3D malloc(seqlen * sizeof(void *));
> > + if (!seqDTDs)
> > + return err;
>
> This is return -1;
>
> > + seqVals =3D malloc(seqlen * sizeof(void *));
> > + if (!seqVals) {
> > + free(seqDTDs);
> > + return err;
>
> And this, too. Just use return -1;
>
> > + }
> > +
> > + for (p =3D sf; p; p =3D p->next) {
> > + int plen, j;
> > + void **dtds, **vals;
> > +
> > + plen =3D sdp_list_len(p->data);
> > + dtds =3D malloc(plen * sizeof(void *));
> > + if (!dtds)
> > + goto set_sup_feat_exit;
> > + vals =3D malloc(plen * sizeof(void *));
> > + if (!vals) {
> > + free(dtds);
> > + goto set_sup_feat_exit;
> > + }
> > + j =3D 0;
> > + for (r =3D p->data; r; r =3D r->next) {
> > + sdp_data_t *data =3D (sdp_data_t*)r->data;
> > + dtds[j] =3D &data->dtd;
> > + vals[j] =3D &data->val;
> > + j++;
> > + }
> > + feat =3D sdp_seq_alloc(dtds, vals, plen);
> > + free(dtds);
> > + free(vals);
> > + if (!feat)
> > + goto set_sup_feat_exit;
> > + seqDTDs[i] =3D &feat->dtd;
> > + seqVals[i] =3D feat;
> > + i++;
> > + }
> > + seq_feat =3D sdp_seq_alloc(seqDTDs, seqVals, seqlen);
> > + if (!seq_feat)
> > + goto set_sup_feat_exit;
> > + sdp_attr_replace(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seq_feat);
> > +
> > + err =3D 0;
>
> Replace this with return 0;
>
> > +
> > +set_sup_feat_exit:
>
> Call this label "fail" to be consistent across the code.

This part should be executed on error and on no error, because seqVals and=
=20
seqDTDs must be freed in all the cases. Because of that I called it exit:=20
instead of fail. May be it is better to repeat this two statements (I mean=
=20
free statements) in order to keep readability and use return as you suggest=
ed,=20
without any variable.

>
> > + free(seqVals);
> > + free(seqDTDs);
> > + return err;
>
> This needs to be return -1;
>
> And then remove the whole err variable since I don't see it used
> anywhere.
>
> > +}
> > +
> > +/*
> > + * Get the supported features
> > + * If an error occurred -1 is returned and errno is set
> > + */
> > +int sdp_get_supp_feat(const sdp_record_t *rec, sdp_list_t **seqp)
> > +{
> > + sdp_data_t * sdpdata, *d;
> > + sdp_list_t * next;
>
> Who said we declare variable like this. It is sdp_list_t *next. No extra
> space between * and the variable name.
>
> > + *seqp =3D NULL;
>
> This is pretty much a bad idea. So in case this functions fails you
> should not touch *seqp at all. It is not your pointer in the end.
>
> I would prefer if you use a temporary pointer and only assign it on
> success.
>
> > + sdpdata =3D sdp_data_get(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST);
> > +
> > + if (!sdpdata || sdpdata->dtd < SDP_SEQ8 || sdpdata->dtd > SDP_SEQ32)
> > + return sdp_get_uuidseq_attr(rec,
> > + SDP_ATTR_SUPPORTED_FEATURES_LIST, seqp);
> > +
> > + for (d =3D sdpdata->val.dataseq; d; d =3D d->next) {
> > + sdp_data_t *dd;
> > + sdp_list_t *subseq;
> > + subseq =3D NULL;
> > + if (d->dtd < SDP_SEQ8 || d->dtd > SDP_SEQ32)
> > + goto fail;
>
> Move the subseq after the if check.
>
> > + for (dd =3D d->val.dataseq; dd; dd =3D dd->next) {
> > + sdp_data_t *data;
> > + if (dd->dtd !=3D SDP_UINT8 && dd->dtd !=3D SDP_UINT16 &&
> > + dd->dtd !=3D SDP_TEXT_STR8)
> > + goto fail;
> > + data =3D sdp_data_alloc(dd->dtd, &dd->val);
> > + if (data)
> > + subseq =3D sdp_list_append(subseq, data);
> > + }
> > + *seqp =3D sdp_list_append(*seqp, subseq);
> > + }
> > + return 0;
> > +
> > +fail:
> > + while (*seqp) {
> > + next =3D (*seqp)->next;
>
> The next variable could be declared inside the while loop actually.
>
> > + sdp_list_free(*seqp, free);
> > + *seqp =3D next;
> > + }
> > + errno =3D EINVAL;
> > + return -1;
> > +}
>
> Regards
>
> Marcel
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth"
> in the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

2009-12-10 21:59:15

by Marcel Holtmann

[permalink] [raw]
Subject: Re: [PATCH] SDP patch to add support for HDP

Hi Jose,

> diff --git a/lib/sdp.c b/lib/sdp.c
> index 822ec1a..ddf2d1a 100644
> --- a/lib/sdp.c
> +++ b/lib/sdp.c
> @@ -4621,3 +4621,113 @@ uint16_t sdp_gen_tid(sdp_session_t *session)
> {
> return session->tid++;
> }
> +
> +/*
> + * Set the supported features
> + */
> +int sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf)
> +{
> + const sdp_list_t *p, *r;
> + sdp_data_t *feat, *seq_feat;
> + int seqlen, i, err;
> + void **seqDTDs, **seqVals;
> +
> + err = -1;

what is this err = -1 business. That is pointless. See below.

> + i = 0;

Move this to the place where it is actually used.

> + seqlen = sdp_list_len(sf);
> + seqDTDs = malloc(seqlen * sizeof(void *));
> + if (!seqDTDs)
> + return err;

This is return -1;

> + seqVals = malloc(seqlen * sizeof(void *));
> + if (!seqVals) {
> + free(seqDTDs);
> + return err;

And this, too. Just use return -1;

> + }
> +
> + for (p = sf; p; p = p->next) {
> + int plen, j;
> + void **dtds, **vals;
> +
> + plen = sdp_list_len(p->data);
> + dtds = malloc(plen * sizeof(void *));
> + if (!dtds)
> + goto set_sup_feat_exit;
> + vals = malloc(plen * sizeof(void *));
> + if (!vals) {
> + free(dtds);
> + goto set_sup_feat_exit;
> + }
> + j = 0;
> + for (r = p->data; r; r = r->next) {
> + sdp_data_t *data = (sdp_data_t*)r->data;
> + dtds[j] = &data->dtd;
> + vals[j] = &data->val;
> + j++;
> + }
> + feat = sdp_seq_alloc(dtds, vals, plen);
> + free(dtds);
> + free(vals);
> + if (!feat)
> + goto set_sup_feat_exit;
> + seqDTDs[i] = &feat->dtd;
> + seqVals[i] = feat;
> + i++;
> + }
> + seq_feat = sdp_seq_alloc(seqDTDs, seqVals, seqlen);
> + if (!seq_feat)
> + goto set_sup_feat_exit;
> + sdp_attr_replace(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seq_feat);
> +
> + err = 0;

Replace this with return 0;

> +
> +set_sup_feat_exit:

Call this label "fail" to be consistent across the code.

> + free(seqVals);
> + free(seqDTDs);
> + return err;

This needs to be return -1;

And then remove the whole err variable since I don't see it used
anywhere.

> +}
> +
> +/*
> + * Get the supported features
> + * If an error occurred -1 is returned and errno is set
> + */
> +int sdp_get_supp_feat(const sdp_record_t *rec, sdp_list_t **seqp)
> +{
> + sdp_data_t * sdpdata, *d;
> + sdp_list_t * next;

Who said we declare variable like this. It is sdp_list_t *next. No extra
space between * and the variable name.

> + *seqp = NULL;

This is pretty much a bad idea. So in case this functions fails you
should not touch *seqp at all. It is not your pointer in the end.

I would prefer if you use a temporary pointer and only assign it on
success.

> + sdpdata = sdp_data_get(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST);
> +
> + if (!sdpdata || sdpdata->dtd < SDP_SEQ8 || sdpdata->dtd > SDP_SEQ32)
> + return sdp_get_uuidseq_attr(rec,
> + SDP_ATTR_SUPPORTED_FEATURES_LIST, seqp);
> +
> + for (d = sdpdata->val.dataseq; d; d = d->next) {
> + sdp_data_t *dd;
> + sdp_list_t *subseq;
> + subseq = NULL;
> + if (d->dtd < SDP_SEQ8 || d->dtd > SDP_SEQ32)
> + goto fail;

Move the subseq after the if check.

> + for (dd = d->val.dataseq; dd; dd = dd->next) {
> + sdp_data_t *data;
> + if (dd->dtd != SDP_UINT8 && dd->dtd != SDP_UINT16 &&
> + dd->dtd != SDP_TEXT_STR8)
> + goto fail;
> + data = sdp_data_alloc(dd->dtd, &dd->val);
> + if (data)
> + subseq = sdp_list_append(subseq, data);
> + }
> + *seqp = sdp_list_append(*seqp, subseq);
> + }
> + return 0;
> +
> +fail:
> + while (*seqp) {
> + next = (*seqp)->next;

The next variable could be declared inside the while loop actually.

> + sdp_list_free(*seqp, free);
> + *seqp = next;
> + }
> + errno = EINVAL;
> + return -1;
> +}

Regards

Marcel



Subject: Re: [PATCH] SDP patch to add support for HDP

Hi all,

here is the corrected patch, without gpg :)


diff --git a/lib/sdp.c b/lib/sdp.c
index 822ec1a..ddf2d1a 100644
--- a/lib/sdp.c
+++ b/lib/sdp.c
@@ -4621,3 +4621,113 @@ uint16_t sdp_gen_tid(sdp_session_t *session)
{
return session->tid++;
}
+
+/*
+ * Set the supported features
+ */
+int sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf)
+{
+ const sdp_list_t *p, *r;
+ sdp_data_t *feat, *seq_feat;
+ int seqlen, i, err;
+ void **seqDTDs, **seqVals;
+
+ err = -1;
+ i = 0;
+ seqlen = sdp_list_len(sf);
+ seqDTDs = malloc(seqlen * sizeof(void *));
+ if (!seqDTDs)
+ return err;
+ seqVals = malloc(seqlen * sizeof(void *));
+ if (!seqVals) {
+ free(seqDTDs);
+ return err;
+ }
+
+ for (p = sf; p; p = p->next) {
+ int plen, j;
+ void **dtds, **vals;
+
+ plen = sdp_list_len(p->data);
+ dtds = malloc(plen * sizeof(void *));
+ if (!dtds)
+ goto set_sup_feat_exit;
+ vals = malloc(plen * sizeof(void *));
+ if (!vals) {
+ free(dtds);
+ goto set_sup_feat_exit;
+ }
+ j = 0;
+ for (r = p->data; r; r = r->next) {
+ sdp_data_t *data = (sdp_data_t*)r->data;
+ dtds[j] = &data->dtd;
+ vals[j] = &data->val;
+ j++;
+ }
+ feat = sdp_seq_alloc(dtds, vals, plen);
+ free(dtds);
+ free(vals);
+ if (!feat)
+ goto set_sup_feat_exit;
+ seqDTDs[i] = &feat->dtd;
+ seqVals[i] = feat;
+ i++;
+ }
+ seq_feat = sdp_seq_alloc(seqDTDs, seqVals, seqlen);
+ if (!seq_feat)
+ goto set_sup_feat_exit;
+ sdp_attr_replace(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seq_feat);
+
+ err = 0;
+
+set_sup_feat_exit:
+ free(seqVals);
+ free(seqDTDs);
+ return err;
+}
+
+/*
+ * Get the supported features
+ * If an error occurred -1 is returned and errno is set
+ */
+int sdp_get_supp_feat(const sdp_record_t *rec, sdp_list_t **seqp)
+{
+ sdp_data_t * sdpdata, *d;
+ sdp_list_t * next;
+ *seqp = NULL;
+
+ sdpdata = sdp_data_get(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST);
+
+ if (!sdpdata || sdpdata->dtd < SDP_SEQ8 || sdpdata->dtd > SDP_SEQ32)
+ return sdp_get_uuidseq_attr(rec,
+ SDP_ATTR_SUPPORTED_FEATURES_LIST, seqp);
+
+ for (d = sdpdata->val.dataseq; d; d = d->next) {
+ sdp_data_t *dd;
+ sdp_list_t *subseq;
+ subseq = NULL;
+ if (d->dtd < SDP_SEQ8 || d->dtd > SDP_SEQ32)
+ goto fail;
+ for (dd = d->val.dataseq; dd; dd = dd->next) {
+ sdp_data_t *data;
+ if (dd->dtd != SDP_UINT8 && dd->dtd != SDP_UINT16 &&
+ dd->dtd != SDP_TEXT_STR8)
+ goto fail;
+ data = sdp_data_alloc(dd->dtd, &dd->val);
+ if (data)
+ subseq = sdp_list_append(subseq, data);
+ }
+ *seqp = sdp_list_append(*seqp, subseq);
+ }
+ return 0;
+
+fail:
+ while (*seqp) {
+ next = (*seqp)->next;
+ sdp_list_free(*seqp, free);
+ *seqp = next;
+ }
+ errno = EINVAL;
+ return -1;
+}
+
diff --git a/lib/sdp.h b/lib/sdp.h
index 375261e..b493985 100644
--- a/lib/sdp.h
+++ b/lib/sdp.h
@@ -244,13 +244,16 @@ extern "C" {
#define SDP_ATTR_GROUP_ID 0x0200
#define SDP_ATTR_IP_SUBNET 0x0200
#define SDP_ATTR_VERSION_NUM_LIST 0x0200
+#define SDP_ATTR_SUPPORTED_FEATURES_LIST 0x0200
#define SDP_ATTR_SVCDB_STATE 0x0201

#define SDP_ATTR_SERVICE_VERSION 0x0300
#define SDP_ATTR_EXTERNAL_NETWORK 0x0301
#define SDP_ATTR_SUPPORTED_DATA_STORES_LIST 0x0301
+#define SDP_ATTR_DATA_EXCHANGE_SPEC 0x0301
#define SDP_ATTR_FAX_CLASS1_SUPPORT 0x0302
#define SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL 0x0302
+#define SDP_ATTR_MCAP_SUPPORTED_PROCEDURES 0x0302
#define SDP_ATTR_FAX_CLASS20_SUPPORT 0x0303
#define SDP_ATTR_SUPPORTED_FORMATS_LIST 0x0303
#define SDP_ATTR_FAX_CLASS2_SUPPORT 0x0304
diff --git a/lib/sdp_lib.h b/lib/sdp_lib.h
index ee39df8..bebb745 100644
--- a/lib/sdp_lib.h
+++ b/lib/sdp_lib.h
@@ -585,6 +585,20 @@ static inline int sdp_get_icon_url(const sdp_record_t *rec, char *str, int len)
return sdp_get_string_attr(rec, SDP_ATTR_ICON_URL, str, len);
}

+/*
+ * Set the supported features
+ * sf should be a list of list with each feature data
+ * Returns 0 on success -1 on fail
+ */
+int sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf);
+
+/*
+ * Get the supported features
+ * seqp is set to a list of list with each feature data
+ * Returns 0 on success, if an error occurred -1 is returned and errno is set
+ */
+int sdp_get_supp_feat(const sdp_record_t *rec, sdp_list_t **seqp);
+
sdp_record_t *sdp_extract_pdu(const uint8_t *pdata, int bufsize, int *scanned);
sdp_record_t *sdp_copy_record(sdp_record_t *rec);


Subject: Re: [PATCH] SDP patch to add support for HDP

Hi all,

here is the corrected patch.

diff --git a/lib/sdp.c b/lib/sdp.c
index 822ec1a..ddf2d1a 100644
--- a/lib/sdp.c
+++ b/lib/sdp.c
@@ -4621,3 +4621,113 @@ uint16_t sdp_gen_tid(sdp_session_t *session)
{
return session->tid++;
}
+
+/*
+ * Set the supported features
+ */
+int sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf)
+{
+ const sdp_list_t *p, *r;
+ sdp_data_t *feat, *seq_feat;
+ int seqlen, i, err;
+ void **seqDTDs, **seqVals;
+
+ err = -1;
+ i = 0;
+ seqlen = sdp_list_len(sf);
+ seqDTDs = malloc(seqlen * sizeof(void *));
+ if (!seqDTDs)
+ return err;
+ seqVals = malloc(seqlen * sizeof(void *));
+ if (!seqVals) {
+ free(seqDTDs);
+ return err;
+ }
+
+ for (p = sf; p; p = p->next) {
+ int plen, j;
+ void **dtds, **vals;
+
+ plen = sdp_list_len(p->data);
+ dtds = malloc(plen * sizeof(void *));
+ if (!dtds)
+ goto set_sup_feat_exit;
+ vals = malloc(plen * sizeof(void *));
+ if (!vals) {
+ free(dtds);
+ goto set_sup_feat_exit;
+ }
+ j = 0;
+ for (r = p->data; r; r = r->next) {
+ sdp_data_t *data = (sdp_data_t*)r->data;
+ dtds[j] = &data->dtd;
+ vals[j] = &data->val;
+ j++;
+ }
+ feat = sdp_seq_alloc(dtds, vals, plen);
+ free(dtds);
+ free(vals);
+ if (!feat)
+ goto set_sup_feat_exit;
+ seqDTDs[i] = &feat->dtd;
+ seqVals[i] = feat;
+ i++;
+ }
+ seq_feat = sdp_seq_alloc(seqDTDs, seqVals, seqlen);
+ if (!seq_feat)
+ goto set_sup_feat_exit;
+ sdp_attr_replace(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seq_feat);
+
+ err = 0;
+
+set_sup_feat_exit:
+ free(seqVals);
+ free(seqDTDs);
+ return err;
+}
+
+/*
+ * Get the supported features
+ * If an error occurred -1 is returned and errno is set
+ */
+int sdp_get_supp_feat(const sdp_record_t *rec, sdp_list_t **seqp)
+{
+ sdp_data_t * sdpdata, *d;
+ sdp_list_t * next;
+ *seqp = NULL;
+
+ sdpdata = sdp_data_get(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST);
+
+ if (!sdpdata || sdpdata->dtd < SDP_SEQ8 || sdpdata->dtd > SDP_SEQ32)
+ return sdp_get_uuidseq_attr(rec,
+ SDP_ATTR_SUPPORTED_FEATURES_LIST, seqp);
+
+ for (d = sdpdata->val.dataseq; d; d = d->next) {
+ sdp_data_t *dd;
+ sdp_list_t *subseq;
+ subseq = NULL;
+ if (d->dtd < SDP_SEQ8 || d->dtd > SDP_SEQ32)
+ goto fail;
+ for (dd = d->val.dataseq; dd; dd = dd->next) {
+ sdp_data_t *data;
+ if (dd->dtd != SDP_UINT8 && dd->dtd != SDP_UINT16 &&
+ dd->dtd != SDP_TEXT_STR8)
+ goto fail;
+ data = sdp_data_alloc(dd->dtd, &dd->val);
+ if (data)
+ subseq = sdp_list_append(subseq, data);
+ }
+ *seqp = sdp_list_append(*seqp, subseq);
+ }
+ return 0;
+
+fail:
+ while (*seqp) {
+ next = (*seqp)->next;
+ sdp_list_free(*seqp, free);
+ *seqp = next;
+ }
+ errno = EINVAL;
+ return -1;
+}
+
diff --git a/lib/sdp.h b/lib/sdp.h
index 375261e..b493985 100644
--- a/lib/sdp.h
+++ b/lib/sdp.h
@@ -244,13 +244,16 @@ extern "C" {
#define SDP_ATTR_GROUP_ID 0x0200
#define SDP_ATTR_IP_SUBNET 0x0200
#define SDP_ATTR_VERSION_NUM_LIST 0x0200
+#define SDP_ATTR_SUPPORTED_FEATURES_LIST 0x0200
#define SDP_ATTR_SVCDB_STATE 0x0201

#define SDP_ATTR_SERVICE_VERSION 0x0300
#define SDP_ATTR_EXTERNAL_NETWORK 0x0301
#define SDP_ATTR_SUPPORTED_DATA_STORES_LIST 0x0301
+#define SDP_ATTR_DATA_EXCHANGE_SPEC 0x0301
#define SDP_ATTR_FAX_CLASS1_SUPPORT 0x0302
#define SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL 0x0302
+#define SDP_ATTR_MCAP_SUPPORTED_PROCEDURES 0x0302
#define SDP_ATTR_FAX_CLASS20_SUPPORT 0x0303
#define SDP_ATTR_SUPPORTED_FORMATS_LIST 0x0303
#define SDP_ATTR_FAX_CLASS2_SUPPORT 0x0304
diff --git a/lib/sdp_lib.h b/lib/sdp_lib.h
index ee39df8..bebb745 100644
--- a/lib/sdp_lib.h
+++ b/lib/sdp_lib.h
@@ -585,6 +585,20 @@ static inline int sdp_get_icon_url(const sdp_record_t *rec, char *str, int len)
return sdp_get_string_attr(rec, SDP_ATTR_ICON_URL, str, len);
}

+/*
+ * Set the supported features
+ * sf should be a list of list with each feature data
+ * Returns 0 on success -1 on fail
+ */
+int sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf);
+
+/*
+ * Get the supported features
+ * seqp is set to a list of list with each feature data
+ * Returns 0 on success, if an error occurred -1 is returned and errno is set
+ */
+int sdp_get_supp_feat(const sdp_record_t *rec, sdp_list_t **seqp);
+
sdp_record_t *sdp_extract_pdu(const uint8_t *pdata, int bufsize, int *scanned);
sdp_record_t *sdp_copy_record(sdp_record_t *rec);



Attachments:
(No filename) (4.26 kB)
signature.asc (197.00 B)
This is a digitally signed message part.
Download all attachments

2009-12-05 16:25:50

by Marcel Holtmann

[permalink] [raw]
Subject: Re: [PATCH] SDP patch to add support for HDP

Hi Jose,

> > > This patch tries to simplify the way the SDP records for HDP are created.
> > > The created functions allow adding supported features easily to an sdp
> > > record. The are similar to sdp_set_profile_descs and
> > > sdp_get_profile_descs. I've also added some macros to define new UUID's
> > > for HDP.
> > Do you have an application or sdptool's patch to test these functions?
>
> We have an HDP/MCAP implementation that uses this functions. We are going to
> release it this week. Sancane and I are solving some problems with this code.
> We will announce here when this code is available.
>
> About the patch to sdptool: I didn't do anything but I can do it if you think
> that is a good task.

> I made some changes correcting all the problems that you suggested an other
> that I found.

> Here's the new pach:

so first of all, fix your mail client to submit this patch properly. If
it messes with it I can't apply it.

patch: **** malformed patch at line 161: SDP_ATTR_SUPPORTED_FEATURES_LIST, seqp);

>
> diff --git a/lib/sdp.c b/lib/sdp.c
> index 822ec1a..79f1261 100644
> --- a/lib/sdp.c
> +++ b/lib/sdp.c
> @@ -4621,3 +4621,87 @@ uint16_t sdp_gen_tid(sdp_session_t *session)
> {
> return session->tid++;
> }
> +
> +/*
> + * Set the supported features
> + */
> +void sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf)
> +{
> + const sdp_list_t *p, *r;
> + sdp_data_t *feat, *seq_feat;
> +
> + int seqlen = sdp_list_len(sf);
> + void **seqDTDs = (void **)malloc (seqlen * sizeof(void *));
> + void **seqVals = (void **)malloc (seqlen * sizeof(void *));

This is a coding style violation in so many ways. Did you place the
whitespace in a random order.

So first of all. The casting should not be needed. And if, then after
that case you do space (void **) malloc.

Then malloc is a function and it is malloc( and not malloc (.

And also it is one space after an operator. So * sizeof.

Since you are accessing the allocated memory you need to check if malloc
succeeded or not.

> + int i = 0;
> +
> + for (p = sf; p; p = p->next) {
> + int plen = sdp_list_len(p->data);
> + void **dtds = (void **)malloc (plen * sizeof(void *));
> + void **vals = (void **)malloc (plen * sizeof(void *));

Same as above.

> + int j = 0;
> + for (r = p->data; r; r = r->next) {
> + sdp_data_t *data = (sdp_data_t*)r->data;
> + dtds[j] = &data->dtd;
> + vals[j] = &data->val;
> + j++;
> + }
> + feat = sdp_seq_alloc(dtds, vals, plen);

You need to check feat if the alloc succeeded.

> + free(dtds);
> + free(vals);
> +
> + seqDTDs[i] = &feat->dtd;
> + seqVals[i] = feat;
> + i++;
> + }
> + seq_feat = sdp_seq_alloc(seqDTDs, seqVals, seqlen);

Same as above.

> +
> + sdp_attr_replace(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seq_feat);
> +
> + free(seqDTDs);
> + free(seqVals);
> +}
> +
> +/*
> + * Get the supported features
> + * If an error occurred -1 is returned and errno is set
> + */
> +int sdp_get_supp_feat (const sdp_record_t *rec, sdp_list_t **seqp)
> +{
> + sdp_data_t * sdpdata, *d;
> + sdp_list_t * next;
> + *seqp = NULL;
> +
> + sdpdata = sdp_data_get(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST);
> +
> + if (!sdpdata || sdpdata->dtd < SDP_SEQ8 || sdpdata->dtd > SDP_SEQ32)
> + return sdp_get_uuidseq_attr(rec,
> SDP_ATTR_SUPPORTED_FEATURES_LIST, seqp);

Here is where your mailer fully screwed it up ;)

> +
> + for (d = sdpdata->val.dataseq; d; d = d->next) {
> + sdp_data_t *dd;
> + sdp_list_t *subseq;
> + subseq = NULL;
> + if ( d->dtd < SDP_SEQ8 || d->dtd > SDP_SEQ32 )
> + goto fail;

What are these extra whitespace after ( and before ) about. Remove them.

> + for (dd = d->val.dataseq; dd; dd = dd->next) {
> + sdp_data_t *data;
> + if ( dd->dtd != SDP_UINT8 && dd->dtd != SDP_UINT16 &&
> + dd->dtd != SDP_TEXT_STR8)

Smae as above.

>
> + goto fail;
> + data = sdp_data_alloc(dd->dtd, &dd->val);

We might wanna check that alloc succeeded.

>
> + subseq = sdp_list_append(subseq, data);
> + }
> + *seqp = sdp_list_append (*seqp, subseq);

Where does this whitespace come from? It is _append(.

>
> + }
> + return 0;
> +
> +fail:
> + while (*seqp) {
> + next = (*seqp)->next;
> + sdp_list_free(*seqp, free);
> + *seqp = next;
> + }
> + errno = EINVAL;
> + return -1;
> +}
> +
> diff --git a/lib/sdp.h b/lib/sdp.h
> index 375261e..1bb351a 100644
> --- a/lib/sdp.h
> +++ b/lib/sdp.h
> @@ -244,13 +244,16 @@ extern "C" {
> #define SDP_ATTR_GROUP_ID 0x0200
> #define SDP_ATTR_IP_SUBNET 0x0200
> #define SDP_ATTR_VERSION_NUM_LIST 0x0200
> +#define SDP_ATTR_SUPPORTED_FEATURES_LIST 0x0200
> #define SDP_ATTR_SVCDB_STATE 0x0201

Why does this look to shitty now?

> #define SDP_ATTR_SERVICE_VERSION 0x0300
> #define SDP_ATTR_EXTERNAL_NETWORK 0x0301
> #define SDP_ATTR_SUPPORTED_DATA_STORES_LIST 0x0301
> +#define SDP_ATTR_DATA_EXCHANGE_SPEC 0x0301
> #define SDP_ATTR_FAX_CLASS1_SUPPORT 0x0302
> #define SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL 0x0302
> +#define SDP_ATTR_MCAP_SUPPORTED_PROCEDURES 0x0302
> #define SDP_ATTR_FAX_CLASS20_SUPPORT 0x0303
> #define SDP_ATTR_SUPPORTED_FORMATS_LIST 0x0303
> #define SDP_ATTR_FAX_CLASS2_SUPPORT 0x0304

Same here.

> diff --git a/lib/sdp_lib.h b/lib/sdp_lib.h
> index ee39df8..41d5786 100644
> --- a/lib/sdp_lib.h
> +++ b/lib/sdp_lib.h
> @@ -585,6 +585,19 @@ static inline int sdp_get_icon_url(const sdp_record_t
> *rec, char *str, int len)
> return sdp_get_string_attr(rec, SDP_ATTR_ICON_URL, str, len);
> }
>
> +/*
> + * Set the supported features
> + * sf should be a list of list with each feature data
> + */
> +void sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf);
> +
> +/*
> + * Get the supported features
> + * seqp is set to a list of list with each feature data
> + * If an error occurred -1 is returned and errno is set
> + */
> +int sdp_get_supp_feat (const sdp_record_t *rec, sdp_list_t **seqp);

And what is this whitespace doing here?

Regards

Marcel