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

_______________________________________________
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to