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);
}
}