Hi, Luiz -----Original Message----- From: Luiz Augusto von Dentz [mailto:luiz.dentz@xxxxxxxxx] Sent: 2011年7月1日 14:52 To: Li, Nami Cc: Slawomir Bochenski; linux-bluetooth@xxxxxxxxxxxxxxx Subject: Re: [PATCH obexd] Return correct obex service driver in obex_session_start Hi, On Fri, Jul 1, 2011 at 5:50 AM, Li, Nami <nami@xxxxxxxxxxxxxxxx> wrote: > > > -----Original Message----- > From: Slawomir Bochenski [mailto:lkslawek@xxxxxxxxx] > Sent: 2011年6月30日 18:26 > To: Li, Nami > Cc: Luiz Augusto von Dentz; linux-bluetooth@xxxxxxxxxxxxxxx > Subject: Re: [PATCH obexd] Return correct obex service driver in > obex_session_start > > On Thu, Jun 30, 2011 at 12:01 PM, Li, Nami <nami@xxxxxxxxxxxxxxxx> wrote: >> Well, if the profile is OPP, then you can get correct service driver. But if the profile is FTP, because in ftp.c: >> >> static struct obex_service_driver ftp = { >> .name = "File Transfer server", >> .service = OBEX_FTP, >> .channel = FTP_CHANNEL, >> .psm = FTP_PSM, >> .record = FTP_RECORD, >> .target = FTP_TARGET, >> .target_size = TARGET_SIZE, >> .connect = ftp_connect, >> .get = ftp_get, >> .put = ftp_put, >> .chkput = ftp_chkput, >> .setpath = ftp_setpath, >> .disconnect = ftp_disconnect >> }; >> It`s target is not null, target_size is 16, so " obex_service_driver_find(server->drivers, NULL,0, NULL, 0)" will return null. >> >> And I`m not picking up the first driver in the list, actually it is the only one in the list. > > In case of other profiles, there is OBEX connect command required, and then the appropriate driver will be selected in callback for OBEX connect event (see cmd_connect()). > > -- > Slawomir Bochenski > > > Yep, you can get right diver after cmd_connect(). But I think user should get correct driver once obex session start, not after connect cmd. What if user want to use driver in obex_session_start() ? I need to use it when add OBEX over L2CAP. > For OPP, it doesn`t register target and target size in opp.c. So when you call "obex_service_driver_find(server->drivers, NULL, 0, NULL, 0); ", it also returns on first and only list member: > > if (memncmp0(target, > target_size, driver->target,driver->target_size) == 0) > return driver; which is actually ===> if (memncmp0(NULL,0, NULL,0) > == 0) return driver; > > > So I think my patch is OK. There is no guarantee that the opp will be the first in the list, nor that the first driver will have no target which is consider the default, so Im not sure why you are needing this for OBEX over L2CAP since you still need to figure out what is the real driver on connect_cmd. Also the sentence about the obex_session_start having to get the correct driver makes no sense to me, we only know the target on connect_cmd so we can only guess on obex_session_start that it is an OPP session, or do you have a better default? Btw, if you are planning to match the psm/channel with service driver, I believe that is not a good idea since on some transports there could be no such separation e.g. usb. -- Luiz Augusto von Dentz I did some tests and I didn`t find which case the list member large than one. Can you tell me which case the list member will large than one? If OBEX over L2CAP use SEQPACKET, then I need to tell openobex the data format is SEQPACKET to receive data correctly including connect cmd. So I need to know OBEX over L2CAP or RFCOMM in obex_session_start. Now, I have a doubt, why we get driver by target and who? Can we get driver directly by channel since obex profiles using different channels? Regards, Nami ��.n��������+%������w��{.n�����{����^n�r������&��z�ޗ�zf���h���~����������_��+v���)ߣ�