Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Aug 2007 14:21:51 -0700
From:      "Maksim Yevmenkin" <maksim.yevmenkin@gmail.com>
To:        "Iain Hibbert" <plunky@rya-online.net>
Cc:        "freebsd-bluetooth@freebsd.org" <freebsd-bluetooth@freebsd.org>
Subject:   Re: Binding RFCOMM sockets
Message-ID:  <bb4a86c70708221421o71b25ee4pda816bef8c925f06@mail.gmail.com>
In-Reply-To: <1187726992.986273.1438.nullmailer@galant.ukfsn.org>
References:  <200708211228.02044.wundram@beenic.net> <bb4a86c70708210951x7c8c9605wa31d8994965801a8@mail.gmail.com> <1187726992.986273.1438.nullmailer@galant.ukfsn.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 8/21/07, Iain Hibbert <plunky@rya-online.net> wrote:
> On Tue, 21 Aug 2007, Maksim Yevmenkin wrote:
>
> > > I'm currently trying to implement a server over the RFCOMM layer, and at least
> > > my imagination told me that connecting to channel 0 should select "any" free
> > > RFCOMM channel (at least that's what I gathered from the BlueZ documentation,
> > > which of course has nothing to do with the FreeBSD bluetooth stack, but
> > > anyway ;-)).
> >
> > this is not currently implemented in freebsd
>
> nor in NetBSD - out of interest though, what is this server trying to
> achieve? It does not seem especially useful to listen on 'any' channel,
> given the way that bluetooth service discovery works..

well, the idea, imo, is when a server binds to 'any' channel (or psm),
the kernel will automatically assign first available one. next, the
application calls getsockname(2) to obtain the actual channel (or psm)
that was assigned by the kernel and registers that channel (or psm)
with sdp.

this simplifies resource (i.e. channel or psm) management when
multiple applications are trying to provide multiple services at the
same time. basically you do not have to worry about assigning channels
(or psm's) by hand.

> btw where is this API documentation for BlueZ that you mention? I never
> managed to find anything like that as I recall..

its part of the standard socket api, i.e. for tcp sockets it would
look something like

        bzero(&sin, sizeof(sin));
        sin.sin_len = sizeof(sin);
        sin.sin_family = AF_INET;
        sin.sin_addr.s_addr = htonl(INADDR_ANY);
        sin.sin_port = 0;

        s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

        bind(s, (struct sockaddr *) &sin, sizeof(sin);

        listen(s, 10);

        len = sizeof(sin);
        getsockname(s, (struct sockaddr *) &sin, &len);

> > > Anyway, binding to the 0 channel succeeds (with getsockname getting back the 0
> > > channel afterwards even though the socket is [supposedly] bound), but calling
> > > listen() then gives me a EDESTADDRREQ, which I can't really sort into the
> > > problem, as it isn't documented in man 2 listen either.
> >
> > basically it is trying to tell you that local address is invalid.
>
> (Max, maybe EADDRNOTAVAIL is better for that?)

yes, i suppose it is.

thanks,
max



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