Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Apr 2009 12:58:43 -0800
From:      Maksim Yevmenkin <emax@freebsd.org>
To:        Bruce Simpson <bms@incunabulum.net>
Cc:        "freebsd-bluetooth@freebsd.org" <freebsd-bluetooth@freebsd.org>, "alexei@raylab.com" <alexei@raylab.com>
Subject:   Re: libhci update
Message-ID:  <bb4a86c70904061358l3983ed51m11265859a833f202@mail.gmail.com>
In-Reply-To: <49D92E26.2030508@incunabulum.net>
References:  <49D92E26.2030508@incunabulum.net>

next in thread | previous in thread | raw e-mail | index | archive | help
--00163630f4a9f0c9e20466e929c3
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

Hi Bruce,

> So I decided to just go ahead and reimplement Markus Brueffer's libhci.
> I've attached a tarball of the Hg repository.

thanks!

> It would be great to have feedback from you about this.

right, a few things.

- dev_id is kinda gross, imo. Iain and i discussed this and agreed
that devname is the way to go. mapping between dev_id and devname can
be (has to be) done and i have no objection to this, however, all the
native api probably should use devname and not dev_id;

- all the hci_xxx functions (with possible exception of inquiry)
should probably be left out of the library. there is really not enough
consumers for them;

- i not sure i like, hci_xxx names; Iain and i have been discussing
this before and agreed that, bt_XXX and bt_devXXXX are better names;

i'm attaching the diffs that was sitting in my queue (still need to
update man pages). please take a look at it and let me know what you
think.

> The API is now compatible with the current BlueZ SVN code. One of the
> trade-offs involved was choosing an identifier which would fit in an 'int'
> type, as BlueZ identifies its devices using uint16_t.
>
> As a compromise, I wrote code which emulates BlueZ device enumeration
> using the Netgraph node ID (32 bits wide). Unfortunately this introduces
> a dependency on -lnetgraph, unless the Bluetooth stack is itself taught to
> produce such an identifier (and supply it via an ioctl()).

i actually went this route before :) but i opted for much simpler scheme:

#define hci_devid2type(id)      (((id) >> 12) & 0x0f)
#define hci_devid2unit(id)      ((id) & 0x0fff)
#define hci_mkdevid(type, unit) ((((type) & 0x0f) << 12) | (unit & 0x0fff))

struct hci_type2prefix {
        int             type;
        char const      *prefix;
};

static struct hci_type2prefix const     type2prefix[] =
{
        { .type = HCI_VIRTUAL,  .prefix = NULL,    },
        { .type = HCI_USB,      .prefix = "ubt",   },
        { .type = HCI_PCCARD,   .prefix = "btccc", },
        { .type = HCI_UART,     .prefix = "h4",    },
        { .type = HCI_RS232,    .prefix = NULL,    },
        { .type = HCI_PCI,      .prefix = NULL,    },
        { .type = HCI_SDIO,     .prefix = NULL,    },
        { .type = -1,           .prefix = NULL,    },   /* should be last */
};

static int
hci_name2devid(char const *name)
{
        struct hci_type2prefix const    *t;
        int                             plen, unit;
        char                            *ep;

        for (t = &type2prefix[0]; t->type != -1; t ++) {
                if (t->prefix == NULL)
                        continue;

                plen = strlen(t->prefix);
                if (strncmp(name, t->prefix, plen) != 0)
                        continue;

                unit = strtoul(name + plen, &ep, 10);
                if (*ep != '\0' &&
                    strcmp(ep, "hci") != 0 &&
                    strcmp(ep, "l2cap") != 0) {
                        errno = ENODEV;
                        return (-1);
                }

                return (hci_mkdevid(t->type, unit));
        }

        errno = ENODEV;

        return (-1);
}

static char *
hci_devid2name(int dev_id, char *name, int namelen)
{
        struct hci_type2prefix const    *t;
        int                             type, unit;

        if (dev_id >= 0) {
                type = hci_devid2type(dev_id);
                unit = hci_devid2unit(dev_id);

                for (t = &type2prefix[0]; t->type != -1; t ++) {
                        if (t->type == type && t->prefix != NULL) {
                                snprintf(name, namelen, "%s%uhci",
                                        t->prefix, unit);
                                return (name);
                        }
                }
        }

        errno = EINVAL;

        return (NULL);
}

this code is left out for now. not sure if i like it :)

> I noticed during the port that periodic inquiry doesn't actually buy us
> anything
> at all. With a CSR BlueCore4-ROM dongle, the microcontroller will not
> raise any other events *at all* at the HCI layer during inquiry.
>
> Mind you, I haven't tried any of the Bluetooth HCI 2.0/EDR commands,
> many of these are not yet implemented in the FreeBSD stack, am I right?

well, most of 2.0 commands do not need any implementation. just need
to add defines and typedefs. some events might need handling, i.e.
inquiry with rssi. but generally it should just work.

> I also had a crack at porting NetBSD's 'btconfig'. I haven't included it in
> this drop, however, it does depend on the libhci functions I have written.

how about just fixing hcicontrol(8) do to that you want? is this too much work?

> I see that NetBSD's libsdp does support 128 bit UUIDs. Whilst this is
> highly desirable, it is also a prerequisite for any of the high level
> language
> wrappers (e.g. PyBlueZ, BlueCove) which make use of SDP.

ok, i will take a look at the diffs to see what is different.

> Anyway, let me know what you think. I am eager to get the SDP issues
> knocked on the head ASAP.

right, that would likely be complete replacement of libsdp and sdpd.

thanks,
max

--00163630f4a9f0c9e20466e929c3
Content-Type: text/plain; charset=US-ASCII; name="bluetooth.hci.diff.txt"
Content-Disposition: attachment; filename="bluetooth.hci.diff.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_ft7myoeu1

SW5kZXg6IGhjaS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGhjaS5jCShyZXZpc2lvbiAxOTA1OTQpCisrKyBo
Y2kuYwkod29ya2luZyBjb3B5KQpAQCAtMzAsMTUgKzMwLDQyMSBAQAogICogJEZyZWVCU0QkCiAg
Ki8KIAorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGJsdWV0b290aC5oPgogI2luY2x1
ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAj
aW5jbHVkZSA8dW5pc3RkLmg+CiAKK3N0YXRpYyBpbnQgICAgYnRfZGV2YW55X2NiKGludCBzLCBz
dHJ1Y3QgYnRfZGV2aW5mbyBjb25zdCAqZGksIHZvaWQgKnhkZXZuYW1lKTsKIHN0YXRpYyBjaGFy
ICogYnRfZGV2Mm5vZGUgKGNoYXIgY29uc3QgKmRldm5hbWUsIGNoYXIgKm5vZGVuYW1lLCBpbnQg
bm5sZW4pOwogCiBpbnQKK2J0X2Rldm9wZW4oY2hhciBjb25zdCAqZGV2bmFtZSkKK3sKKwlzdHJ1
Y3Qgc29ja2FkZHJfaGNpCWhhOworCWJkYWRkcl90CQliYTsKKwlpbnQJCQlzOworCisJaWYgKGRl
dm5hbWUgPT0gTlVMTCkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuICgtMSk7CisJfQor
CisJbWVtc2V0KCZoYSwgMCwgc2l6ZW9mKGhhKSk7CisJaGEuaGNpX2xlbiA9IHNpemVvZihoYSk7
CisJaGEuaGNpX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKKworCWlmIChidF9hdG9uKGRldm5hbWUs
ICZiYSkpIHsKKwkJaWYgKCFidF9kZXZuYW1lKGhhLmhjaV9ub2RlLCAmYmEpKQorCQkJcmV0dXJu
ICgtMSk7CisJfSBlbHNlIGlmIChidF9kZXYybm9kZShkZXZuYW1lLCBoYS5oY2lfbm9kZSwKKwkJ
CQkJc2l6ZW9mKGhhLmhjaV9ub2RlKSkgPT0gTlVMTCkgeworCQllcnJubyA9IEVOWElPOworCQly
ZXR1cm4gKC0xKTsKKwl9CisKKwlzID0gc29ja2V0KFBGX0JMVUVUT09USCwgU09DS19SQVcsIEJM
VUVUT09USF9QUk9UT19IQ0kpOworCWlmIChzIDwgMCkKKwkJcmV0dXJuICgtMSk7CisKKwlpZiAo
YmluZChzLCAoc3RydWN0IHNvY2thZGRyICopICZoYSwgc2l6ZW9mKGhhKSkgPCAwIHx8CisJICAg
IGNvbm5lY3QocywgKHN0cnVjdCBzb2NrYWRkciAqKSAmaGEsIHNpemVvZihoYSkpIDwgMCkgewor
CQljbG9zZShzKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJcmV0dXJuIChzKTsKK30KKworaW50
CitidF9kZXZjbG9zZShpbnQgcykKK3sKKwlyZXR1cm4gKGNsb3NlKHMpKTsKK30KKworaW50Citi
dF9kZXZzZW5kKGludCBzLCB1aW50MTZfdCBvZ2YsIHVpbnQxNl90IG9jZiwgaW50IHBsZW4sIHZv
aWQgKnBhcmFtKQoreworCW5nX2hjaV9jbWRfcGt0X3QJaDsKKwlzdHJ1Y3QgaW92ZWMJCWl2WzJd
OworCWludAkJCWl2bjsKKworCWlmIChwbGVuIDwgMCB8fCAocGxlbiA+IDAgJiYgcGFyYW0gPT0g
TlVMTCkpIHsgCisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlpdlsw
XS5pb3ZfYmFzZSA9ICZoOworCWl2WzBdLmlvdl9sZW4gPSBzaXplb2YoaCk7CisJaXZuID0gMTsK
KworCWgudHlwZSA9IE5HX0hDSV9DTURfUEtUOworCWgub3Bjb2RlID0gaHRvbGUxNihOR19IQ0lf
T1BDT0RFKG9nZiwgb2NmKSk7CisJaWYgKHBsZW4gPiAwKSB7CisJCWgubGVuZ3RoID0gcGxlbjsK
KworCQlpdlsxXS5pb3ZfYmFzZSA9IHBhcmFtOworCQlpdlsxXS5pb3ZfbGVuID0gcGxlbjsKKwkJ
aXZuID0gMjsKKwl9IGVsc2UKKwkJaC5sZW5ndGggPSAwOworCisJd2hpbGUgKHdyaXRldihzLCBp
diwgaXZuKSA8IDApIHsKKwkJaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikK
KwkJCWNvbnRpbnVlOworCisJCXJldHVybiAoLTEpOworCX0KKworCXJldHVybiAoMCk7Cit9CisK
K2ludAorYnRfZGV2cmVjdihpbnQgcywgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSwgdGltZV90IHRv
KQoreworCWZkX3NldAkJcmZkOworCXN0cnVjdCB0aW1ldmFsCXR2OworCWludAkJbjsKKworCWlm
IChidWYgPT0gTlVMTCB8fCBzaXplIDw9IDAgfHwgdG8gPCAwKSB7CisJCWVycm5vID0gRUlOVkFM
OworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlGRF9aRVJPKCZyZmQpOworCUZEX1NFVChzLCAmcmZk
KTsKKworCXR2LnR2X3NlYyA9IHRvOworCXR2LnR2X3VzZWMgPSAwOworCisJd2hpbGUgKChuID0g
c2VsZWN0KHMgKyAxLCAmcmZkLCBOVUxMLCBOVUxMLCAmdHYpKSA8IDApIHsKKwkJaWYgKGVycm5v
ID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikKKwkJCWNvbnRpbnVlOworCisJCXJldHVybiAo
LTEpOworCX0KKworCWlmIChuID09IDApIHsKKwkJZXJybm8gPSBFVElNRURPVVQ7CisJCXJldHVy
biAoLTEpOworCX0KKworCWFzc2VydChGRF9JU1NFVChzLCAmcmZkKSk7CisKKwl3aGlsZSAoKG4g
PSByZWFkKHMsIGJ1Ziwgc2l6ZSkpIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVy
cm5vID09IEVJTlRSKQorCQkJY29udGludWU7CisKKwkJcmV0dXJuICgtMSk7CisJfQorCisJcmV0
dXJuIChuKTsKK30KKworaW50CitidF9kZXZyZXEoaW50IHMsIHN0cnVjdCBidF9kZXZyZXEgKnIs
IHRpbWVfdCB0bykKK3sKKwl1aW50OF90CQkJCWJ1ZlszMjBdOyAvKiBtb3JlIHRoYW4gZW5vdWdo
ICovCisJbmdfaGNpX2V2ZW50X3BrdF90CQkqZSA9IChuZ19oY2lfZXZlbnRfcGt0X3QgKikgYnVm
OworCW5nX2hjaV9jb21tYW5kX2NvbXBsX2VwCQkqY2MgPSAobmdfaGNpX2NvbW1hbmRfY29tcGxf
ZXAgKikoZSsxKTsKKwluZ19oY2lfY29tbWFuZF9zdGF0dXNfZXAJKmNzID0gKG5nX2hjaV9jb21t
YW5kX3N0YXR1c19lcCopKGUrMSk7CisJdWludDE2X3QJCQlvcGNvZGU7CisJdGltZV90CQkJCXRf
ZW5kOworCWludAkJCQluOworCisJaWYgKHMgPCAwIHx8IHIgPT0gTlVMTCB8fCB0byA8IDApIHsK
KwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAoLTEpOworCX0KKworCWlmIChyLT5ybGVuIDwg
MCB8fCAoci0+cmxlbiA+IDAgJiYgci0+cnBhcmFtID09IE5VTEwpKSB7CisJCWVycm5vID0gRUlO
VkFMOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwluID0gYnRfZGV2c2VuZChzLCByLT5vZ2YsIHIt
Pm9jZiwgci0+Y2xlbiwgci0+Y3BhcmFtKTsKKwlpZiAobiA8IDApCisJCXJldHVybiAoLTEpOwor
CisJb3Bjb2RlID0gaHRvbGUxNihOR19IQ0lfT1BDT0RFKHItPm9nZiwgci0+b2NmKSk7CisKKwl0
X2VuZCA9IHRpbWUoTlVMTCkgKyB0bzsKKworCWRvIHsKKwkJdG8gPSB0X2VuZCAtIHRpbWUoTlVM
TCk7CisJCWlmICh0byA8IDApCisJCQl0byA9IDA7CisKKwkJbiA9IGJ0X2RldnJlY3YocywgYnVm
LCBzaXplb2YoYnVmKSwgdG8pOworCQlpZiAobiA8IDApCisJCQlyZXR1cm4gKC0xKTsKKworCQlp
ZiAobiA8IHNpemVvZigqZSkpIHsKKwkJCWVycm5vID0gRU1TR1NJWkU7CisJCQlyZXR1cm4gKC0x
KTsKKwkJfQorCisJCWlmIChlLT50eXBlICE9IE5HX0hDSV9FVkVOVF9QS1QpIHsKKwkJCWVycm5v
ID0gRUlPOworCQkJcmV0dXJuICgtMSk7CisJCX0KKworCQluIC09IHNpemVvZigqZSk7CisKKwkJ
c3dpdGNoIChlLT5ldmVudCkgeworCQljYXNlIE5HX0hDSV9FVkVOVF9DT01NQU5EX0NPTVBMOgor
CQkJaWYgKGNjLT5vcGNvZGUgPT0gb3Bjb2RlKSB7CisJCQkJbiAtPSBzaXplb2YoKmNjKTsKKwor
CQkJCWlmIChyLT5ybGVuID49IG4pIHsKKwkJCQkJci0+cmxlbiA9IG47CisJCQkJCW1lbWNweShy
LT5ycGFyYW0sIGNjICsgMSwgci0+cmxlbik7CisJCQkJfQorCisJCQkJcmV0dXJuICgwKTsKKwkJ
CX0KKwkJCWJyZWFrOworCisJCWNhc2UgTkdfSENJX0VWRU5UX0NPTU1BTkRfU1RBVFVTOgorCQkJ
aWYgKGNzLT5vcGNvZGUgPT0gb3Bjb2RlKSB7CisJCQkJaWYgKHItPmV2ZW50ICE9IE5HX0hDSV9F
VkVOVF9DT01NQU5EX1NUQVRVUykgeworCQkJCQlpZiAoY3MtPnN0YXR1cyAhPSAwKSB7CisJCQkJ
CQllcnJubyA9IEVJTzsKKwkJCQkJCXJldHVybiAoLTEpOworCQkJCQl9CisJCQkJfSBlbHNlIHsK
KwkJCQkJaWYgKHItPnJsZW4gPj0gbikgeworCQkJCQkJci0+cmxlbiA9IG47CisJCQkJCQltZW1j
cHkoci0+cnBhcmFtLCBjcywgci0+cmxlbik7CisJCQkJCX0KKworCQkJCQlyZXR1cm4gKDApOwor
CQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoZS0+ZXZlbnQgPT0g
ci0+ZXZlbnQpIHsKKwkJCQlpZiAoci0+cmxlbiA+PSBuKSB7CisJCQkJCXItPnJsZW4gPSBuOwor
CQkJCQltZW1jcHkoci0+cnBhcmFtLCBlICsgMSwgci0+cmxlbik7CisJCQkJfQorCisJCQkJcmV0
dXJuICgwKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAodG8gPiAwKTsKKworCWVy
cm5vID0gRVRJTUVET1VUOworCisJcmV0dXJuICgtMSk7Cit9CisKK2ludAorYnRfZGV2ZmlsdGVy
KGludCBzLCBzdHJ1Y3QgYnRfZGV2ZmlsdGVyIGNvbnN0ICpuZXcsIHN0cnVjdCBidF9kZXZmaWx0
ZXIgKm9sZCkKK3sKKwlzdHJ1Y3QgbmdfYnRzb2NrZXRfaGNpX3Jhd19maWx0ZXIJZjsKKwlzb2Nr
bGVuX3QJCQkJbGVuOworCWludAkJCQkJYml0OworCisJaWYgKG5ldyA9PSBOVUxMICYmIG9sZCA9
PSBOVUxMKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlpZiAo
b2xkICE9IE5VTEwpIHsKKwkJbGVuID0gc2l6ZW9mKGYpOworCQlpZiAoZ2V0c29ja29wdChzLCBT
T0xfSENJX1JBVywgU09fSENJX1JBV19GSUxURVIsICZmLCAmbGVuKSA8IDApCisJCQlyZXR1cm4g
KC0xKTsKKworCQltZW1zZXQob2xkLCAwLCBzaXplb2YoKm9sZCkpOworCisJCWZvciAoYml0ID0g
MDsgYml0IDwgTkdfSENJX0VWRU5UX1BLVDsgYml0ICsrKQorCQkJaWYgKGJpdF90ZXN0KGYucGFj
a2V0X21hc2ssIGJpdCkpCisJCQkJb2xkLT5wYWNrZXRfbWFzayB8PSAoMSA8PCBiaXQpOworCisJ
CWZvciAoYml0ID0gMDsgYml0IDwgTkdfSENJX0VWRU5UX01BU0tfU0laRSAqIDg7IGJpdCArKykK
KwkJCWlmIChiaXRfdGVzdChmLmV2ZW50X21hc2ssIGJpdCkpCisJCQkJb2xkLT5ldmVudF9tYXNr
IHw9ICgxIDw8IGJpdCk7CisJfQorCisJaWYgKG5ldyAhPSBOVUxMKSB7CisJCW1lbXNldCgmZiwg
MCwgc2l6ZW9mKGYpKTsKKworCQlmb3IgKGJpdCA9IDA7IGJpdCA8IE5HX0hDSV9FVkVOVF9QS1Q7
IGJpdCArKykKKwkJCWlmIChuZXctPnBhY2tldF9tYXNrICYgKDEgPDwgYml0KSkKKwkJCQliaXRf
c2V0KGYucGFja2V0X21hc2ssIGJpdCk7CisKKwkJZm9yIChiaXQgPSAwOyBiaXQgPCAoTkdfSENJ
X0VWRU5UX01BU0tfU0laRSAqIDgpOyBiaXQgKyspCisJCQlpZiAobmV3LT5ldmVudF9tYXNrICYg
KDEgPDwgYml0KSkKKwkJCQliaXRfc2V0KGYuZXZlbnRfbWFzaywgYml0KTsKKworCQlsZW4gPSBz
aXplb2YoZik7CisJCWlmIChzZXRzb2Nrb3B0KHMsIFNPTF9IQ0lfUkFXLCBTT19IQ0lfUkFXX0ZJ
TFRFUiwgJmYsIGxlbikgPCAwKQorCQkJcmV0dXJuICgtMSk7CisJfQorCisJcmV0dXJuICgwKTsK
K30KKworaW50CitidF9kZXZpbnF1aXJ5KGNoYXIgY29uc3QgKmRldm5hbWUsIGludCBsZW5ndGgs
IGludCBudW1fcnNwLAorCQl1aW50OF90IGNvbnN0ICpsYXAsIHN0cnVjdCBidF9kZXZpbnF1aXJ5
ICoqaWkpCit7CisJdWludDhfdAkJCQlidWZbMzIwXTsKKwljaGFyCQkJCV9kZXZuYW1lW0hDSV9E
RVZOQU1FX1NJWkVdOworCXN0cnVjdCBidF9kZXZmaWx0ZXIJCWY7CisJbmdfaGNpX2lucXVpcnlf
Y3AJCSpjcCA9IChuZ19oY2lfaW5xdWlyeV9jcCAqKSBidWY7CisJbmdfaGNpX2V2ZW50X3BrdF90
CQkqZSA9IChuZ19oY2lfZXZlbnRfcGt0X3QgKikgYnVmOworCW5nX2hjaV9pbnF1aXJ5X3Jlc3Vs
dF9lcAkqZXAgPSAobmdfaGNpX2lucXVpcnlfcmVzdWx0X2VwICopKGUrMSk7CisJbmdfaGNpX2lu
cXVpcnlfcmVzcG9uc2UJCSppcjsKKwlzdHJ1Y3QgYnRfZGV2aW5xdWlyeQkJKmk7CisJaW50CQkJ
CXMsIG47CisJdGltZV90CQkJCXRvOworCisJaWYgKGlpID09IE5VTEwpIHsKKwkJZXJybm8gPSBF
SU5WQUw7CisJCXJldHVybiAoLTEpOworCX0KKworCWlmIChkZXZuYW1lID09IE5VTEwpIHsKKwkJ
bWVtc2V0KF9kZXZuYW1lLCAwLCBzaXplb2YoX2Rldm5hbWUpKTsKKwkJZGV2bmFtZSA9IF9kZXZu
YW1lOworCisJCW4gPSBidF9kZXZlbnVtKGJ0X2RldmFueV9jYiwgX2Rldm5hbWUpOworCQlpZiAo
biA8PSAwKSB7CisJCQlpZiAobiA9PSAwKQorCQkJCSppaSA9IE5VTEw7CisKKwkJCXJldHVybiAo
bik7CisJCX0KKwl9CisKKwlzID0gYnRfZGV2b3BlbihkZXZuYW1lKTsKKwlpZiAocyA8IDApCisJ
CXJldHVybiAoLTEpOworCisJaWYgKGJ0X2RldmZpbHRlcihzLCBOVUxMLCAmZikgPCAwKSB7CisJ
CWJ0X2RldmNsb3NlKHMpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlmLmV2ZW50X21hc2sgfD0g
KDEgPDwgKE5HX0hDSV9FVkVOVF9JTlFVSVJZX0NPTVBMIC0gMSkpOworCWYuZXZlbnRfbWFzayB8
PSAoMSA8PCAoTkdfSENJX0VWRU5UX0lOUVVJUllfUkVTVUxUIC0gMSkpOworCisJaWYgKGJ0X2Rl
dmZpbHRlcihzLCAmZiwgTlVMTCkgPCAwKSB7CisJCWJ0X2RldmNsb3NlKHMpOworCQlyZXR1cm4g
KC0xKTsKKwl9CisKKwlpZiAobGFwID09IE5VTEwpIHsKKwkJY3AtPmxhcFswXSA9IDB4MzM7CisJ
CWNwLT5sYXBbMV0gPSAweDhiOworCQljcC0+bGFwWzJdID0gMHg5ZTsKKwl9IGVsc2UgeworCQlj
cC0+bGFwWzBdID0gbGFwWzBdOworCQljcC0+bGFwWzFdID0gbGFwWzFdOworCQljcC0+bGFwWzJd
ID0gbGFwWzJdOworCX0KKworCWlmIChsZW5ndGggPD0gMCB8fCBsZW5ndGggPiAyNTUpCisJCWxl
bmd0aCA9IDQ7CS8qIDUuMTIgc2Vjb25kcyAqLworCWNwLT5pbnF1aXJ5X2xlbmd0aCA9ICh1aW50
OF90KSBsZW5ndGg7CisKKwl0byA9ICh0aW1lX3QpKChkb3VibGUpIGxlbmd0aCAqIDEuMjgpICsg
MTsKKworCWlmIChudW1fcnNwIDw9IDAgfHwgbnVtX3JzcCA+IDI1NSkKKwkJbnVtX3JzcCA9IDg7
CisJY3AtPm51bV9yZXNwb25zZXMgPSAodWludDhfdCkgbnVtX3JzcDsKKworCWkgPSAqaWkgPSBj
YWxsb2MobnVtX3JzcCwgc2l6ZW9mKHN0cnVjdCBidF9kZXZpbnF1aXJ5KSk7CisJaWYgKGkgPT0g
TlVMTCkgeworCQlidF9kZXZjbG9zZShzKTsKKwkJZXJybm8gPSBFTk9NRU07CisJCXJldHVybiAo
LTEpOworCX0KKworCWlmIChidF9kZXZzZW5kKHMsIE5HX0hDSV9PR0ZfTElOS19DT05UUk9MLCBO
R19IQ0lfT0NGX0lOUVVJUlksCisJCQlzaXplb2YoKmNwKSwgY3ApIDwgMCkgeworCQlmcmVlKGkp
OworCQlidF9kZXZjbG9zZShzKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCit3YWl0X2Zvcl9tb3Jl
OgorCisJbiA9IGJ0X2RldnJlY3YocywgYnVmLCBzaXplb2YoYnVmKSwgdG8pOworCWlmIChuIDwg
MCkgeworCQlmcmVlKGkpOworCQlidF9kZXZjbG9zZShzKTsKKwkJcmV0dXJuICgtMSk7CisJfQor
CisJaWYgKG4gPCBzaXplb2YobmdfaGNpX2V2ZW50X3BrdF90KSkgeworCQlmcmVlKGkpOworCQli
dF9kZXZjbG9zZShzKTsKKwkJZXJybm8gPSBFSU87CisJCXJldHVybiAoLTEpOworCX0KKworCXN3
aXRjaCAoZS0+ZXZlbnQpIHsKKwljYXNlIE5HX0hDSV9FVkVOVF9JTlFVSVJZX0NPTVBMOgorCQli
cmVhazsKKworCWNhc2UgTkdfSENJX0VWRU5UX0lOUVVJUllfUkVTVUxUOgorCQlpciA9IChuZ19o
Y2lfaW5xdWlyeV9yZXNwb25zZSAqKShlcCArIDEpOworCisjdW5kZWYJTUlOCisjZGVmaW5lCU1J
TihhLCBiKQkoKChhKSA8IChiKSk/IChhKSA6IChiKSkKKworCQlmb3IgKG4gPSAwOyBuIDwgTUlO
KGVwLT5udW1fcmVzcG9uc2VzLCBudW1fcnNwKTsgbiArKykgeworCQkJYmRhZGRyX2NvcHkoJmkt
PmJkYWRkciwgJmlyLT5iZGFkZHIpOworCQkJaS0+cHNjYW5fcmVwX21vZGUgPSBpci0+cGFnZV9z
Y2FuX3JlcF9tb2RlOworCQkJaS0+cHNjYW5fcGVyaW9kX21vZGUgPSBpci0+cGFnZV9zY2FuX3Bl
cmlvZF9tb2RlOworCQkJaS0+cHNjYW5fbW9kZSA9IGlyLT5wYWdlX3NjYW5fbW9kZTsKKwkJCW1l
bWNweShpLT5kZXZfY2xhc3MsIGlyLT51Y2xhc3MsIHNpemVvZihpLT5kZXZfY2xhc3MpKTsKKwkJ
CWktPmNsb2NrX29mZnNldCA9IGxlMTZ0b2goaXItPmNsb2NrX29mZnNldCk7CisKKwkJCWlyICsr
OworCQkJaSArKzsKKwkJCW51bV9yc3AgLS07CisJCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KKwor
CWRlZmF1bHQ6CisJCWdvdG8gd2FpdF9mb3JfbW9yZTsKKwkJLyogTk9UIFJFQUNIRUQgKi8KKwl9
CisKKwlidF9kZXZjbG9zZShzKTsKKwkJCisJcmV0dXJuIChpIC0gKmlpKTsKK30KKworaW50CiBi
dF9kZXZpbmZvKHN0cnVjdCBidF9kZXZpbmZvICpkaSkKIHsKIAl1bmlvbiB7CkBAIC01Myw2ICs0
NTksNyBAQAogCQlzdHJ1Y3QgbmdfYnRzb2NrZXRfaGNpX3Jhd19ub2RlX2RlYnVnCQlyODsKIAl9
CQkJCQkJcnA7CiAJc3RydWN0IHNvY2thZGRyX2hjaQkJCQloYTsKKwlzb2NrbGVuX3QJCQkJCWhh
bGVuOwogCWludAkJCQkJCXMsIHJ2YWw7CiAKIAlpZiAoZGkgPT0gTlVMTCkgewpAQCAtNjAsMjcg
KzQ2NywxNCBAQAogCQlyZXR1cm4gKC0xKTsKIAl9CiAKLQltZW1zZXQoJmhhLCAwLCBzaXplb2Yo
aGEpKTsKLQloYS5oY2lfbGVuID0gc2l6ZW9mKGhhKTsKLQloYS5oY2lfZmFtaWx5ID0gQUZfQkxV
RVRPT1RIOwotCi0JaWYgKGJ0X2F0b24oZGktPmRldm5hbWUsICZycC5yMS5iZGFkZHIpKSB7Ci0J
CWlmICghYnRfZGV2bmFtZShoYS5oY2lfbm9kZSwgJnJwLnIxLmJkYWRkcikpCi0JCQlyZXR1cm4g
KC0xKTsKLQl9IGVsc2UgaWYgKGJ0X2RldjJub2RlKGRpLT5kZXZuYW1lLCBoYS5oY2lfbm9kZSwK
LQkJCQkJc2l6ZW9mKGhhLmhjaV9ub2RlKSkgPT0gTlVMTCkgewotCQllcnJubyA9IEVOWElPOwot
CQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQlzID0gc29ja2V0KFBGX0JMVUVUT09USCwgU09DS19SQVcs
IEJMVUVUT09USF9QUk9UT19IQ0kpOworCXMgPSBidF9kZXZvcGVuKGRpLT5kZXZuYW1lKTsKIAlp
ZiAocyA8IDApCiAJCXJldHVybiAoLTEpOwogCiAJcnZhbCA9IC0xOwogCi0JaWYgKGJpbmQocywg
KHN0cnVjdCBzb2NrYWRkciAqKSAmaGEsIHNpemVvZihoYSkpIDwgMCB8fAotCSAgICBjb25uZWN0
KHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmhhLCBzaXplb2YoaGEpKSA8IDApCisJaGFsZW4gPSBz
aXplb2YoaGEpOworCWlmIChnZXRzb2NrbmFtZShzLCAoc3RydWN0IHNvY2thZGRyICopICZoYSwg
JmhhbGVuKSA8IDApCiAJCWdvdG8gYmFkOwogCXN0cmxjcHkoZGktPmRldm5hbWUsIGhhLmhjaV9u
b2RlLCBzaXplb2YoZGktPmRldm5hbWUpKTsKIApAQCAtMTM4LDcgKzUzMiw3IEBACiAKIAlydmFs
ID0gMDsKIGJhZDoKLQljbG9zZShzKTsKKwlidF9kZXZjbG9zZShzKTsKIAogCXJldHVybiAocnZh
bCk7CiB9CkBAIC0yMDUsNiArNTk5LDEzIEBACiAJcmV0dXJuIChjb3VudCk7CiB9CiAKK3N0YXRp
YyBpbnQKK2J0X2RldmFueV9jYihpbnQgcywgc3RydWN0IGJ0X2RldmluZm8gY29uc3QgKmRpLCB2
b2lkICp4ZGV2bmFtZSkKK3sKKwlzdHJsY3B5KChjaGFyICopIHhkZXZuYW1lLCBkaS0+ZGV2bmFt
ZSwgSENJX0RFVk5BTUVfU0laRSk7CisJcmV0dXJuICgxKTsKK30KKwogc3RhdGljIGNoYXIgKgog
YnRfZGV2Mm5vZGUoY2hhciBjb25zdCAqZGV2bmFtZSwgY2hhciAqbm9kZW5hbWUsIGludCBubmxl
bikKIHsKSW5kZXg6IGJsdWV0b290aC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGJsdWV0b290aC5oCShyZXZp
c2lvbiAxOTA1OTQpCisrKyBibHVldG9vdGguaAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzks
NyBAQAogI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNp
bmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgogI2luY2x1ZGUgPHN5
cy91bi5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KQEAgLTQ2LDYg
KzQ3LDcgQEAKICNpbmNsdWRlIDxuZXRncmFwaC9ibHVldG9vdGgvaW5jbHVkZS9uZ19oY2kuaD4K
ICNpbmNsdWRlIDxuZXRncmFwaC9ibHVldG9vdGgvaW5jbHVkZS9uZ19sMmNhcC5oPgogI2luY2x1
ZGUgPG5ldGdyYXBoL2JsdWV0b290aC9pbmNsdWRlL25nX2J0c29ja2V0Lmg+CisjaW5jbHVkZSA8
dGltZS5oPgogCiBfX0JFR0lOX0RFQ0xTCiAKQEAgLTEyOSwxMSArMTMxLDQ2IEBACiAJdWludDhf
dAkJX3BhZGRpbmdbMjBdOwkvKiBsZWF2ZSBzcGFjZSBmb3IgZnV0dXJlIGFkZGl0aW9ucyAqLwog
fTsKIAorc3RydWN0IGJ0X2RldnJlcQoreworCXVpbnQxNl90CW9nZjsKKwl1aW50MTZfdAlvY2Y7
CisJaW50CQlldmVudDsKKwl2b2lkCQkqY3BhcmFtOworCWludAkJY2xlbjsKKwl2b2lkCQkqcnBh
cmFtOworCWludAkJcmxlbjsKK307CisKK3N0cnVjdCBidF9kZXZmaWx0ZXIgeworCXVpbnQ2NF90
CWV2ZW50X21hc2s7CisJdWludDhfdAkJcGFja2V0X21hc2s7Cit9OworCitzdHJ1Y3QgYnRfZGV2
aW5xdWlyeSB7CisJYmRhZGRyX3QJYmRhZGRyOworCXVpbnQ4X3QJCXBzY2FuX3JlcF9tb2RlOwor
CXVpbnQ4X3QJCXBzY2FuX3BlcmlvZF9tb2RlOworCXVpbnQ4X3QJCXBzY2FuX21vZGU7CisJdWlu
dDhfdAkJZGV2X2NsYXNzWzNdOworCXVpbnQxNl90CWNsb2NrX29mZnNldDsKK307CisKIHR5cGVk
ZWYgaW50CShidF9kZXZlbnVtX2NiX3QpKGludCwgc3RydWN0IGJ0X2RldmluZm8gY29uc3QgKiwg
dm9pZCAqKTsKIAoraW50CQlidF9kZXZvcGVuIChjaGFyIGNvbnN0ICpkZXZuYW1lKTsKK2ludAkJ
YnRfZGV2Y2xvc2UoaW50IHMpOworaW50CQlidF9kZXZzZW5kIChpbnQgcywgdWludDE2X3Qgb2dm
LCB1aW50MTZfdCBvY2YsIGludCBwbGVuLCB2b2lkICpwYXJhbSk7CitpbnQJCWJ0X2RldnJlY3Yg
KGludCBzLCB1aW50OF90ICpidWYsIGludCBzaXplLCB0aW1lX3QgdG8pOworaW50CQlidF9kZXZy
ZXEgIChpbnQgcywgc3RydWN0IGJ0X2RldnJlcSAqciwgdGltZV90IHRvKTsKK2ludAkJYnRfZGV2
ZmlsdGVyKGludCBzLCBzdHJ1Y3QgYnRfZGV2ZmlsdGVyIGNvbnN0ICpuZXcsCisJCQkgICAgIHN0
cnVjdCBidF9kZXZmaWx0ZXIgKm9sZCk7CitpbnQJCWJ0X2RldmlucXVpcnkoY2hhciBjb25zdCAq
ZGV2bmFtZSwgaW50IGxlbmd0aCwgaW50IG51bV9yc3AsCisJCQkgICAgICB1aW50OF90IGNvbnN0
ICpsYXAsIHN0cnVjdCBidF9kZXZpbnF1aXJ5ICoqaWkpOwogaW50CQlidF9kZXZpbmZvIChzdHJ1
Y3QgYnRfZGV2aW5mbyAqZGkpOwogaW50CQlidF9kZXZlbnVtIChidF9kZXZlbnVtX2NiX3QgKmNi
LCB2b2lkICphcmcpOwogCisKIC8qCiAgKiBiZGFkZHIgdXRpbGl0eSBmdW5jdGlvbnMgKGZyb20g
TmV0QlNEKQogICovCg==
--00163630f4a9f0c9e20466e929c3--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bb4a86c70904061358l3983ed51m11265859a833f202>