Transparent ioctls Streams calls

What are transparent ioctls messages and when and why we have to issue copyin or copyout kernel utilities with respect to ioctls calls to a Stream.

This mechanism is needed because user context does not exist in modules and drivers when ioctl processing occurs. This prevents them from using the kernel itself on copyin and copyout functions
consider the following ioctl call:

ioctl (stream_fildes, user_command, &ioctl_struct);

where ioctl_struct is a structure containing the members:
int stringlen; /* string length */
char *string;
struct other_struct *other1;

To read (or write) the elements of ioctl_struct, a module would have to do a series of copyin( ) and copyout( ) calls using pointer information from a prior copyin( ) to transfer additional data. A non-STREAMS character driver could directly execute these copy functions because user context exists during all calls to the driver. However, in STREAMS, user context is only available to modules and drivers in their open( ) and close( ) routines.
The transparent mechanism enables modules and drivers to request that the Stream head do a copyin( ) or copyout( ) operation on their behalf to transfer ioctl data between their kernel space and various user space locations. The related data is sent in message pairs exchanged between the Stream head and the module. A pair of messages is required so that each transfer can be acknowledged.

Thanks a ton for your reply. What I understood that the u area is outside the scope of Stream's module except to its open and close modules.

By stating "The related data is sent in message pairs exchanged between the Stream head and the module. A pair of messages is required so that each transfer can be acknowledged." - did you mean to say that :
*mblk_t->b_cont->b_rptr == *mblk_t->b_rptr ie data buffer content is same(2 Copies of data is there ) or
mblk_t->b_cont = dupb ( mblk_t )
ie mblk_t->b_datap == mblk_t->b_cont->b_datab . Kindly clarify. While transferring data from kernel space to user or vice versa the first message block is responsible for populating the ioctl's request's response as M_COPYIN or M_COPYOUT (mblk_t->b_datap->db_type member = M_COPYIN or M_COPYOUT)
Sir, does it then means that cq_addr and cq_size of copyreq structure identifies the data and its size in the user space.
Sir , kindly also guide me on the fact that if the command type is I_STR for an input / output operation on a Stream - is it that, at the timeout interval specified in ic_timout member of strioctl structure, the stream device itself responds with ETIME error . The Stream knows how to process the internal ioctl command type and loops the message block into the queue of itself.