2013-08-08 19 views
6

Piszę moduł jądra, który powinien odbierać wiadomości z przestrzeni użytkownika i wysłać odpowiedź z powrotem przez gniazdo.Wyślij pakiet z gniazdami z modułu jądra

Gdy program i moduł znajdują się na tym samym urządzeniu i korzystam z IP 127.0.0.1, wszystko działa poprawnie. Ale kiedy próbuję go na różnych maszynach i używam prawdziwego sieciowego adresu IP, działa to tak, jakby to było 192.168.3.146 działa tylko w jeden sposób.

Otrzymuję wiadomość od użytkownika, ale nie mogę jej odebrać z jądra. Używam funkcji sock_sendmsg do wysyłania wiadomości z jądra i nie zwraca ona żadnego błędu. Nie otrzymuję też żadnych wiadomości z zapory, że coś pochodzi z innej maszyny, z modułu jądra.

Tutaj były podobne pytania i przykłady, ale nie były wystarczająco przydatne dla mnie lub przykłady były używane zbyt starą wersję jądra. Do szkieletu użyłem tego, z UDP gniazd: http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-3.html. Jakaś pomoc?

jądra moduł kodu do wysyłania:

void send_data(unsigned char *data) 
{ 
    if(!IS_ERR_OR_NULL(data)) 
    { 
     int ret; 
     mm_segment_t oldfs; 
     struct msghdr message; 
     struct iovec ioVector; 
     struct sockaddr_in sendAddr; 

     sendAddr.sin_family = AF_INET; 
     sendAddr.sin_addr.s_addr = INADDR_ANY; 
     //sendAddr.sin_addr.s_addr = in_aton("192.168.1.75"); 
     //here I get port from sk_buff structure that I received. 
     sendAddr.sin_port = *((unsigned short*)skBuffer->data); 

     memset(&message, 0, sizeof(message)); 
     message.msg_name = &sendAddr; 
     message.msg_namelen = sizeof(sendAddr); 

     /* send the message back */ 
     ioVector.iov_base = data; 
     ioVector.iov_len = strlen(data); 
     message.msg_iov = &ioVector; 
     message.msg_iovlen = 1; 
     message.msg_control = NULL; 
     message.msg_controllen = 0; 

     oldfs = get_fs(); 
     set_fs(KERNEL_DS); 
     ret = sock_sendmsg(sendSocket, &message, strlen(data)); 
     set_fs(oldfs); 
    } 
} 

Odpowiedz

2

mogę znaleźć alternatywne rozwiązanie, za pomocą netpoll gniazd. Jest łatwiejsze niż gniazda, użyłem wcześniej i działa. Odpowiedź i prawidłowy kod to here, na inne pytanie StackOverflow.

Powiązane problemy