LINUX.ORG.RU

Кажется мне, что нужно прогуляться по таблице файловых дескрипторов процесса.

post-factum ★★★★★ ()
Ответ на: комментарий от post-factum

хз. пока ТС не скажет расскажет за что идет борьба.

в procfs/pid/fdinfo используется (struct file *)

в fs/proc/fd.c есть код который ходит по всем дескрипторам процесса.

Нафига в ядре знать десткриптор если есть (struct sock)->sk_socket ?

vel ★★★★★ ()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

Мне необходимо выяснить кому принадлежит сокет в той части RX path кода, которая отрабатывается до передачи пакета стеку и пр. Я не уверен, как мне получить указатель на экземпляр «struct file*» или «struct task_struct *» если это не process context?

cruz7 ()
Ответ на: комментарий от cruz7

т.е. хочется получить pid-процесса владельца сокета?

А ты готов получить список процессов?

Это будет долго и дорого. Нужно перебрать все дескрипторы всех процессов :(

vel ★★★★★ ()
Ответ на: комментарий от vel

т.е. хочется получить pid-процесса владельца сокета?
А ты готов получить список процессов?
Это будет долго и дорого. Нужно перебрать все дескрипторы всех процессов :(

Поясню подробнее, мне нужно выяснить кому принадлежит сокет находясь в ветке кода

__netif_receive_skb_core() -> sch_handle_ingress()
, в этой точке доступен только skb. Пока я вижу что можно добраться до 'struct file *' через skb->sk->sk_socket->file ?

cruz7 ()
Ответ на: комментарий от cruz7

кому принадлежит

тебе нужен PID или UID ?

vel ★★★★★ ()
Ответ на: комментарий от cruz7

Ну тогда вперед по таблице процессов проверять ссылки на file

Это долго и дорого.

Только учти, что ссылок может быть много.

vel ★★★★★ ()
Ответ на: комментарий от vel

в fs/proc/fd.c есть код который ходит по всем дескрипторам процесса.

Не подскажете где именно в fs/proc/fd.c, я ничего не нашел. Однако нашел iterate_fd в fs/file.c но данный API требует 'struct files_struct *files' — то есть это тоже не совсем то.

cruz7 ()
Ответ на: комментарий от cruz7

хороший пример

proc_readfd_common(struct file *file,... ) {

struct task_struct *p = get_proc_task(file_inode(file));
struct files_struct *files;
...
files = get_files_struct(p);

A «struct file *» ты из skb получить можешь. Но так ты получишь только 1 процесс, а сокет может случать много процессов/тредов.

vel ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.