roblem related to sockets in FreeBSD Kernel

aditya eipl adityaeipl at hotmail.com
Mon Dec 20 09:26:06 PST 2004


Hi,
I am writing a socket server in the kernel mode in FreeBSD 4.6.2. This 
program accepts connection and receives data on the socket. But we are not 
getting the data.In the code: We come to know that the we are connected we 
also get the notification for receipt of data but are unable to fetch the 
data. Can anybody please let me know what is wrong in my code? Here are the 
code snippets:

After calling soaccept()
I have:
so->so_upcallarg = (caddr_t)upcallargs;
so->so_upcall = socket_incoming;
so->so_rcv.sb_flags |= SB_UPCALL;
so->so_snd.sb_flags |= SB_UPCALL;

I dont know whether this is required. But as I saw this in the FreeBSD 
source I put it.

I have written socket_incoming as follows:
void socket_incoming(struct socket *so, void *arg, int waitflag)
{
	log(LOG_ALERT, "hello: socket_incoming%x \n",so->so_state);
	if(so->so_state & SS_ISCONNECTED)
		server_receive(so);
	return;
}
I have written server receiveas follows:
int server_receive(struct socket *so)
{
	struct uio uio;
	struct iovec uiovec[2];
	struct mbuf *mp;
	int err,i;
	int flags, s;
	struct socket *head = so;
	struct sockaddr *sa = NULL;
	char buff[MAX_BYTES_TO_PROCESS];
	log(LOG_ALERT, "hello: connected  now try to read data (%x %x) \n", so, 
socket_server);
	flags = MSG_DONTWAIT ;

	uiovec[0].iov_base = buff;
	uiovec[0].iov_len = MAX_BYTES_TO_PROCESS;
	uiovec[1].iov_base = NULL;
	uiovec[1].iov_len = 0;

	uio.uio_iov = &uiovec[0];
	uio.uio_iovcnt = 1;
	uio.uio_offset = -1;
	uio.uio_resid = MAX_BYTES_TO_PROCESS;
	uio.uio_segflg = UIO_SYSSPACE;
	uio.uio_rw = UIO_READ;
	uio.uio_procp = p;
	err = -1;
	{
		log(LOG_ALERT, "hello: Calling soreceive\n");
		err = soreceive(so, (so->so_state & SS_ISCONNECTED) ? NULL : &sa, &uio, 
&mp, NULL, &flags);
/*		err = so->so_proto->pr_usrreqs->pru_soreceive(so, (so->so_state & 
SS_ISCONNECTED) ? NULL : &sa,
				&uio, NULL, 0, &flags); */
        /* one of the above should work but both of them do not work :( */
		if (err < 0) {
			log(LOG_ALERT, "hello: socket receive  err \n");
			goto sock_server_exit;
		}
		log(LOG_ALERT, "hello: socket receive err = %d \n", err);

	}
	log(LOG_ALERT, "hello: iolen  = %d \n data : ",uio.uio_iov[0].iov_len);
	for(i=0;i< uio.uio_resid;i++) {
		log(LOG_ALERT, "%c ",uio.uio_iov[0].iov_base[MAX_BYTES_TO_PROCESS - i]);
	}
    /* we see garbage here :( */
	log(LOG_ALERT, "hello: data   = %c 
\n",uio.uio_iov[0].iov_base[uio.uio_resid-3]);
	log(LOG_ALERT, "hello: iovcnt = %d \n",uio.uio_iovcnt);
	log(LOG_ALERT, "hello: offset = %d \n",uio.uio_offset);
	log(LOG_ALERT, "hello: resid  = %d \n",uio.uio_resid);
	log(LOG_ALERT, "hello: rw     = %d \n",uio.uio_rw);

	log(LOG_ALERT, "hello: msg header iovcnt = %s \n",(char *)mp->m_dat);
sock_server_exit:
	return 0;
}

Any help will be much appreciated.

_________________________________________________________________
Searching for your soulmate? Zero in on the perfect choice. 
http://www.astroyogi.com/newmsn/astrodate/ Try MSN Astrodate now!



More information about the freebsd-hackers mailing list