I have a module that receives data in two parts. First an unsigned integer indicating the length of data that will be followed next. Then the data itself. I do this as follows in an infinite loop
unsigned int z;
struct kvec vec;
struct msghdr msg;
while(1) {
memset(&vec, 0, sizeof(vec));
memset(&msg, 0, sizeof(msg));
vec.iov_base = &z;
vec.iov_len = sizeof(unsigned int);
ret = kernel_recvmsg(client_socket, &msg, &vec, 1, vec.iov_len, 0);
if(!z)
break;
data = kmalloc(z, GFP_KERNEL);
if(!data)
break;
memset(&vec, 0, sizeof(vec));
memset(&msg, 0, sizeof(msg));
vec.iov_base = data;
vec.iov_len = z;
ret = kernel_recvmsg(client_socket, &msg, &vec, 1, vec.iov_len, 0);
...
...
kfree(data);
}
Edit : I am getting wrong data because of incomplete receives. My ret < vec.iov_len. Is there a way to workaround this?
Thank you.