On Fri, Nov 11, 2011 at 4:03 PM, Vimal <j.vimal@gmail.com> wrote:
Hi all,
Hey,
I am trying to understand more about kernel data structures and I would like to know how to obtain a list of TCP/UDP sockets, starting from a "struct task_struct" variable "task".
So far, I have understood the following: Please correct me if I am wrong! :)
- An open file descriptor is represented by a "struct file *" in the tasks's file table: task->files.fdt.fd - The file tables are organised as a linked list - The file table contains a structure fd_array, that is an array of "struct file *", each representing an open file
But, almost all operations in the TCP code start from a "struct sock". Are the "struct file" and "struct sock" somehow connected?
If you are sure that that file descriptor is a socket then you can cast to struct socket, the field "void * private_data" in struct file [1] . But not all file descriptors are sockets so you have a way to be sure that you are dealing with a socket, you have a macro #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) that macro is in [2] . [1] http://lxr.linux.no/#linux+v3.1/include/linux/fs.h#L983 [2] http://lxr.linux.no/#liinux+v3.1/include/linux/stat.h#L30 And the struct socket has a field that is of type struct sock, so its direct. The trick is that the private_data field is the socket structure, that knows all about the network part.
Thanks, -- Vimal
Glad to help, i have searched all that because i had a project that i needed to know which file descriptors were sockets, so i had to search this information, i hope it's now a little be clear to you.
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-- Nuno Martins