Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 7 Mar 2004 17:54:53 +0000
From:      Kiss Tibor <grinder@pro.hu>
To:        freebsd-net@freebsd.org
Cc:        freebsd-hackers@freebsd.org
Subject:   Strange problem with vnodes and sockets
Message-ID:  <20040307175453.GA44645@PSY.tvnetwork.hu>

next in thread | raw e-mail | index | archive | help
I want to create a small kernel module which logs the socket operations. So in my module
I have a socket structure, and i want to know which process (thread) owns that. 
I try to solve this problem by this way:
	...
	struct proc *p;
	struct vnode *vn;
	struct filedesc *fdp;
	...
	
	sx_slock(&allproc_lock);
	LIST_FOREACH(p, &allproc, p_list) {
		PROC_LOCK(p);
		
		if (p->p_fd != NULL) {
			fdp = p->p_fd;
			FILEDESC_LOCK(fdp);
				
			printf("pid: %d\n", p->p_pid);
				
			printf("fdp->fd_nfiles: %d\n", fdp->fd_nfiles);
			printf("fdp->fd_lastfile: %d\n", fdp->fd_lastfile);
			
			for (i=0; i < fdp->fd_nfiles; i++) {
				if (fdp->fd_ofiles[i] == NULL) {
						continue;
					} else {
						vn = (struct vnode *) fdp->fd_ofiles[i]->f_data;

						printf("%d: %d\n", i, vn->v_type);
						if (vn->v_type == VSOCK) {
							if (vn->v_un.vu_socket->so_gencnt == pcb->inp_socket->so_gencnt) {
								printf("found the socket, pid: %d\n", p->p_pid);
							}
						}
					}
				}
				
				FILEDESC_UNLOCK(fdp);
		}
		PROC_UNLOCK(p);
	} /* LIST_FOREACH */
	sx_sunlock(&allproc_lock);

If i compile & insert this module, i found some strange things:
...
pid: 816
fdp->fd_nfiles: 20
fdp->fd_lastfile: 6
0: 4
1: 4
2: 4
3: 2048
4: 1
5: 2048
6: 4
pid: 635
fdp->fd_nfiles: 20
fdp->fd_lastfile: 6
0: 4
1: 4
2: 4
3: 2048
4: 4
5: 4
6: 4
...

So how can the v_type 2048? v_type is an enum (vnode.h) with 10 "options":
enum vtype  { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD };

And the real problem is: why don't find that code any VSOCK type vnode in the
active process list? And how can i find the proc struct for a socket? :)

Thanks,
Tibor Kiss



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040307175453.GA44645>