Ich schreibe ein Kernel-Modul, das Nachrichten von User-Space empfangen und Antwort über Socket senden soll.Paket mit Sockets vom Kernel-Modul senden
Wenn Programm und Modul auf der gleichen Maschine sind und ich IP 127.0.0.1
verwende, funktioniert alles gut. Aber wenn ich es auf verschiedenen Rechnern versuche und echte Netzwerk-IP nutze, funktioniert sowas wie 192.168.3.146
nur auf eine Art.
Ich erhalte eine Nachricht von User-Space, aber ich kann es nicht vom Kernel erhalten. Ich benutze sock_sendmsg
Funktion für das Senden von Nachrichten vom Kernel und es gibt keinen Fehler zurück. Auch bekomme ich keine Meldungen von der Firewall, dass etwas von einem anderen Rechner kommt, vom Kernelmodul.
Hier waren ähnliche Fragen und Beispiele, aber sie waren nicht nützlich genug für mich oder Beispiele wurden zu alt Kernel-Version verwendet.Für Skelett habe ich dieses verwendet, von UDP-Sockets: http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-3.html. Irgendeine Hilfe?
Kernel-Modul-Code für das Senden:
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);
}
}