ioctl(RFCOMMCREATEDEV) failed: File descriptor in bad state

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dear all,

I am calling ioctl(RFCOMMCREATEDEV) to create tty device from a rfcomm fd 
using hands-free profile. If the HF send connection request to AG and make
rfcomm connect, the tty could be made successfully. However, if the 
AG(mobile) side make request to create rfcomm connection, the rfcomm could
be created but fail to create the tty device. The kernel returns error 
because socket is not connected, see below code. Any idea? Thanks much!
 
     if (req.flags & (1 << RFCOMM_REUSE_DLC)) {
               /* Socket must be connected */
               if (sk->sk_state != BT_CONNECTED)
                        return -EBADFD;
               

The pseudo code logic looks like this:

void rfcomm_connect_cb(GIOChannel *rfcomm, GError *err,
				gpointer user_data)
{
	...
	ba2str(&dev->src, src);
	ba2str(&dev->dst, dst);	
	
	/* make /dev/rfcomm serial port from rfcomm */
	memset(&req, 0, sizeof(req));
	req.dev_id = -1;
	req.flags = (1 << RFCOMM_REUSE_DLC);        <---set RFCOMM_REUSE_DLC flag
	bacpy(&req.src, &dev->src);
	bacpy(&req.dst, &dev->dst);
	req.channel = gw->channel;
	sk = g_io_channel_unix_get_fd(rfcomm);
	id = ioctl(sk, RFCOMMCREATEDEV, &req);
	if (id < 0) {
	    int err = errno;                   <---return errno 77
	    error("ioctl(RFCOMMCREATEDEV) failed: %s (%d)", strerror(err), err);
	    g_io_channel_shutdown(rfcomm, TRUE, NULL);
		g_io_channel_unref(rfcomm);
		gw->rfcomm = NULL;
		goto fail;
	}
	gw->rfcomm = g_io_channel_ref(rfcomm);

	gw->rfcomm_id = id;
	gw->tty = g_strdup_printf("/dev/rfcomm%d", id);

failed:
	return;
}

static void hf_io_cb(...)
{
	bt_io_get(chan, BT_IO_RFCOMM, &err,
			BT_IO_OPT_SOURCE_BDADDR, &src,
			BT_IO_OPT_DEST_BDADDR, &dst,
			BT_IO_OPT_CHANNEL, &ch,
			BT_IO_OPT_INVALID);
	
	//request authorization
	if (!bt_io_accept(gw->rfcomm, rfcomm_connect_cb, dev, NULL,
							&err)) {
		error("bt_io_accept: %s", err->message);
		g_error_free(err);		
	}

}

Regards,
Zhenhua
 
?韬{.n?????%??檩??w?{.n???{饼?z????n?■???h?璀?{?夸z罐?+€?zf"?????i?????_璁?:+v??撸?


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux