[asterisk-dev] Implementation using libpri and socketpair()

Christian crich-ml at beronet.com
Thu Feb 8 01:29:53 MST 2007


yeah my approach works only if you can modify the "write" as well.

the only way i know which would definitely work is: you need to write a 
kernel module which creates a char device, there each write results in a 
single "copy_from_user" and you won't have intermixing of packets.  then 
you could send the packet either directly to your hardware or you use 
another character device to send it up to your process which will also 
send the exact amount of data, like:

/dev/packetloopIN + /dev/packetloopOUT


but that's probably as much work as interpreting the q.921 header ;-)






Paulo Garcia wrote:
> Hi Christian,
>
> I think I understand what you are saying but the data read comes 
> directly from libpri and I cannot realize how can I put some data 
> before the package, because I saw that into libpri there are two 
> writes to my socket file descriptor but in the read part (inside my 
> program thread) there are only one read with both packets togheter.
>
> After I receive the packet from libpri, I can send it directly to my 
> card and the packet arrives at other side perfectly since my hardware 
> already prepared to do it. The only problem is when I get two packets 
> joint togheter.
>
> I´m thinking if using another kind of interprocess communication I can 
> avoid this socketpair behaviour.
>
> Thanks in advance!
>
>
> Paulo
>
>
>
>
> On 2/7/07, * Christian* <crich-ml at beronet.com 
> <mailto:crich-ml at beronet.com>> wrote:
>
>     Hi Paulo,
>
>     i have had similar issues with a quite different use-case ;-) the
>     problem is that you need to frame your messages and transmit these
>     frames instead of the transparent data. you can use hdlc for
>     example, i
>     believe there are some simple implementations out there, but that is
>     sort of overkill. The most simple thing would be to just put the
>     length
>     of the frame before each packet, the length could be of maximum 4
>     bytes,
>     then do a read of just as much bytes which you know from this
>     length, like:
>
>     uint32 len;
>     char buf[1024];
>     read(fd, &len, 4);
>     read(fd,buf,len);
>
>     then you can be sure that you've got only this single frame in buf,
>     (well if read returns less then len you need to reread of course).
>
>     Besides that i have somewhere read that you can set a HDLC
>     Property via
>     fcntl to terminals, but i haven't had ever the time to test that out.
>
>
>     cheers,
>
>     christian
>
>
>     Paulo Garcia wrote:
>     > Hi,
>     >
>     > in my own channel, I'm implementing ISDN support using Libpri. The
>     > implementation is completely independent from zaptel then I'm
>     trying
>     > to do all communications between my hardware and libpri using
>     > socketpair function.
>     >
>     > The idea is to create a socketpair, passing fd[0] to pri_new
>     function
>     > and writing to fd[1] to pass data to libpri. So far so good...
>     >
>     > To receive data from libpri, I have a thread checking for all file
>     > descriptors fd[1] using select() function and when I receive
>     > something, I pass it to my card. This approach also works well but
>     > sometimes I receive two messages (from libpri) in only one read()
>     > call. I think this is because of libpri writes two messages so fast
>     > then when the read is called, there are already two messages in
>     socket
>     > buffer...
>     >
>     > How can I avoid this behavior? Maybe using another way different of
>     > socketpair ? This communication will be used only inside the same
>     > process, between different threads.
>     >
>     > Any path or idea will be appreciated.
>     >
>     >
>     > Regards
>     >
>     >
>     > Paulo Garcia
>     >
>     ------------------------------------------------------------------------
>     >
>     > _______________________________________________
>     > --Bandwidth and Colocation provided by Easynews.com
>     <http://Easynews.com> --
>     >
>     > asterisk-dev mailing list
>     > To UNSUBSCRIBE or update options visit:
>     >     http://lists.digium.com/mailman/listinfo/asterisk-dev
>     >
>
>     _______________________________________________
>     --Bandwidth and Colocation provided by Easynews.com
>     <http://Easynews.com> --
>
>     asterisk-dev mailing list
>     To UNSUBSCRIBE or update options visit:
>        http://lists.digium.com/mailman/listinfo/asterisk-dev
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> --Bandwidth and Colocation provided by Easynews.com --
>
> asterisk-dev mailing list
> To UNSUBSCRIBE or update options visit:
>    http://lists.digium.com/mailman/listinfo/asterisk-dev
>   



More information about the asterisk-dev mailing list